diff --git a/Neon-gh/dashboard.js b/Neon-gh/dashboard.js index 31fa4eb0..dfba65c5 100644 --- a/Neon-gh/dashboard.js +++ b/Neon-gh/dashboard.js @@ -1,4 +1,4 @@ -!function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=88)}([function(e,t,n){"use strict";var i,r="object"==typeof Reflect?Reflect:null,o=r&&"function"==typeof r.apply?r.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};i=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function a(){a.init.call(this)}e.exports=a,e.exports.once=function(e,t){return new Promise((function(n,i){function r(n){e.removeListener(t,o),i(n)}function o(){"function"==typeof e.removeListener&&e.removeListener("error",r),n([].slice.call(arguments))}v(e,t,o,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&v(e,"error",t,n)}(e,r,{once:!0})}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var c=10;function l(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function d(e){return void 0===e._maxListeners?a.defaultMaxListeners:e._maxListeners}function u(e,t,n,i){var r,o,s,a;if(l(n),void 0===(o=e._events)?(o=e._events=Object.create(null),e._eventsCount=0):(void 0!==o.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),o=e._events),s=o[t]),void 0===s)s=o[t]=n,++e._eventsCount;else if("function"==typeof s?s=o[t]=i?[n,s]:[s,n]:i?s.unshift(n):s.push(n),(r=d(e))>0&&s.length>r&&!s.warned){s.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=s.length,a=c,console&&console.warn&&console.warn(a)}return e}function f(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function m(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=f.bind(i);return r.listener=n,i.wrapFn=r,r}function p(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(s=t[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var c=r[e];if(void 0===c)return!1;if("function"==typeof c)o(c,this,t);else{var l=c.length,d=g(c,l);for(n=0;n=0;o--)if(n[o]===t||n[o].listener===t){s=n[o].listener,r=o;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},a.prototype.listeners=function(e){return p(this,e,!0)},a.prototype.rawListeners=function(e){return p(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):h.call(e,t)},a.prototype.listenerCount=h,a.prototype.eventNames=function(){return this._eventsCount>0?i(this._events):[]}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){"use strict";var i,r,o,s=[n(37),n(38),n(39),n(40),n(41),n(42)],a=-1,c=[],l=!1;function d(){i&&r&&(i=!1,r.length?c=r.concat(c):a=-1,c.length&&u())}function u(){if(!i){l=!1,i=!0;for(var e=c.length,t=setTimeout(d);e;){for(r=c,c=[];r&&++a1)for(var n=1;ne.classList.remove("no-moving")),document.querySelectorAll(".selected").forEach(e=>{e.classList.remove("selected"),e.classList.contains("staff")?(e.removeAttribute("style"),i.unhighlight(e)):(e.removeAttribute("style"),e.style.fill=""),Array.from(e.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""}),Array.from(e.querySelectorAll(".sylTextRect-display")).forEach(e=>{e.style.fill="blue"}),e.parentElement.classList.contains("syllable-highlighted")&&(e.parentElement.style.fill="",e.parentElement.classList.add("syllable"),e.parentElement.classList.remove("syllable-highlighted"),Array.from(e.parentElement.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.parentElement.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""})),c.selectAll("#resizeRect").remove(),c.selectAll(".resizePoint").remove(),c.selectAll(".rotatePoint").remove()}),Array.from(document.querySelectorAll(".text-select")).forEach(e=>{e.style.color="",e.style.fontWeight="",e.classList.remove("text-select")}),document.getElementById("selByStaff").classList.contains("is-active")?a.endOptionsSelection():o.endGroupingSelection(),document.getElementById("extraEdit").innerHTML="",document.getElementById("extraEdit").parentElement.classList.add("hidden"),(0,r.updateHighlight)()}function u(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),a.triggerSingleStaffActions(),o.initGroupingListeners(),t.dragInit())}function f(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),t.dragInit())}function m(e,t,n=!0){if(e){if(e.classList.contains("staff"))return u(e,t);if(e.classList.contains("layer"))return f(e,t);if(!e.classList.contains("selected")&&!e.classList.contains("sylTextRect")&&!e.classList.contains("sylTextRect-display")){let t;if(e.classList.add("selected"),e.style.fill="#d00",e.style.stroke=e.classList.contains("divLine")?"#d00":"black",e.querySelectorAll(".sylTextRect-display").length&&e.querySelectorAll(".sylTextRect-display").forEach(e=>{e.style.fill="#d00"}),e.querySelectorAll(".divLine").length&&e.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"}),e.classList.contains("syllable")&&e.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),e.classList.contains("syllable")?t=e.id:null!==e.closest(".syllable")&&(t=e.closest(".syllable").id),void 0!==t){document.querySelectorAll("span."+t).forEach(e=>{e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select")})}}n&&(0,r.updateHighlight)()}}async function p(e,t){const n=await t.getElementAttr(e.id,t.view.getCurrentPageURI());return Boolean(n.ligated)}function h(e,t){if(t.length<2)return!1;switch(e){case"selBySyllable":t.forEach(e=>{if(!e.classList.contains("syllable"))return!1});break;case"selByNeume":t.forEach(e=>{if(!e.classList.contains("neume"))return!1});break;case"selByStaff":t.forEach(e=>{if(!e.classList.contains("staff"))return!1});break;default:return!1}return!0}function g(e){const t=Array.from(e),n=t.pop().parentElement.parentElement;for(const e of t){if(e.parentElement.parentElement.id!==n.id)return!1}return!0}function v(e,t,n){const i=e,r=i.closest(".syl");if(!r.classList.contains("selected")){r.classList.add("selected"),i.style.fill="#d00";const o=e.closest(".syllable");o.style.fill="#d00",o.classList.add("syllable-highlighted"),o.querySelectorAll(".divLine").length&&(o.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),o.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"})),void 0!==n&&(0,s.resize)(r,n,t),void 0!==t&&t.dragInit();const a=e.closest(".syllable").id;if(void 0!==a){const e=document.querySelector("span."+a);e&&(e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select"))}}a.triggerBBoxActions()}t.getSelectionType=l,t.unselect=d,t.selectStaff=u,t.selectLayerElement=f,t.select=m,t.selectNcs=async function(e,t,n){if(!e.parentElement.classList.contains("selected")){const i=e.parentElement;if(d(),m(i),await p(i,t)){const e=i.previousSibling;if(await p(e,t))m(e);else{const e=i.nextSibling;await p(e,t)?m(e):console.warn("Error: Neither prev or next nc are ligatures")}o.triggerGrouping("ligature")}else i.classList.contains("nc")?a.triggerNcActions(i):console.warn("No action triggered!");n.dragInit()}},t.isLigature=p,t.areAdjacent=function(e,t){if(t.length<2)return!1;let n;switch(e){case"selBySyllable":n=Array.from(document.querySelectorAll(".syllable"));break;case"selByNeume":return!0;case"selByNc":n=Array.from(document.querySelectorAll(".nc"));break;case"selByStaff":n=Array.from(document.querySelectorAll(".staff"));break;default:return!1}const i=[];for(let e=0;e!(e.classList.contains("divLine")||e.classList.contains("accid")||e.classList.contains("clef")))))return!1;switch(e){case"selBySyllable":const e=t[0].closest(".staff");for(let n=0;n{const s=e.getAttribute("d").match(/\d+/g).map(e=>Number(e));void 0===o&&(o=Math.atan((s[3]-s[1])/(s[2]-s[0]))),(void 0===n||Math.min(s[1],s[3])r)&&(r=Math.max(s[1],s[3])),(void 0===i||s[2]>i)&&(i=s[2])}),{id:e.id,ulx:t,uly:n,lrx:i,lry:r,rotate:o}},t.selectBBox=v,t.selectNn=function(e){return!(e.length>0)||(e.forEach(e=>{m(e)}),!1)},t.selectAll=async function(e,t,n){const i=l();if(d(),0===e.length)return;let r,c=!1,u=!1;switch(i){case"selBySyllable":r=".syllable";break;case"selByNeume":r=".neume";break;case"selByNc":r=".nc";break;case"selByStaff":r=".staff";break;case"selByBBox":r=".sylTextRect-display";break;case"selByLayerElement":r=".clef, .custos, .accid, .divLine";break;default:return void console.error("Unknown selection type "+i)}const f=new Set;for(const t of e){let e=t.closest(r);if(null===e){if(e=t.closest(".clef, .custos, .accid, .divLine"),null===e){console.warn("Element "+t.id+" is not part of specified group and is not a clef or custos or accid or divLine.");continue}c=c||!0}else u=u||!0;f.add(e);let n=e,i=n.getAttribute("mei:follows"),o=n.getAttribute("mei:precedes");for(;i||o;){if(i){if(n=document.querySelector("#"+i.slice(1)),f.has(n))break;n.classList.add("no-moving"),f.add(n),i=n.getAttribute("mei:follows")}if(o){if(n=document.querySelector("#"+o.slice(1)),f.has(n))break;n.classList.add("no-moving"),f.add(n),o=n.getAttribute("mei:precedes")}}}f.forEach(e=>m(e,n,!1));const p=Array.from(f.values());if(!c||u)switch(i){case"selByStaff":switch(p.length){case 1:a.triggerSingleStaffActions(),o.initGroupingListeners(),(0,s.resize)(p[0],t,n);break;default:a.triggerMultiStaffActions(),o.initGroupingListeners()}break;case"selByLayerElement":1===f.size?a.triggerLayerElementActions(p[0]):a.triggerDefaultActions();break;case"selBySyllable":switch(p.length){case 1:a.triggerSyllableActions("singleSelect");break;default:o.isLinkable("selBySyllable",p)?a.triggerSyllableActions("linkableSelect"):o.isGroupable("selBySyllable",p)?a.triggerSyllableActions("multiSelect"):a.triggerSyllableActions("default")}break;case"selByNeume":switch(p.length){case 1:a.triggerNeumeActions(),o.initGroupingListeners();break;default:o.isGroupable("selByNeume",p)?o.triggerGrouping("neume"):a.triggerDefaultActions()}break;case"selByNc":switch(p.length){case 1:a.triggerNcActions(p[0]);break;case 2:if(g(p)){if(p[0].parentElement===p[1].parentElement){const e=Array.from(p[0].parentElement.children);if(1===Math.abs(e.indexOf(p[0])-e.indexOf(p[1]))){let e=p[0].children[0],t=p[1].children[0],n=e.x.baseVal.value,i=t.x.baseVal.value,r=e.y.baseVal.value,s=t.y.baseVal.value;if((n>i||n===i&&rv(e,n,void 0))}break;default:console.error("Unknown selection type. This should not have occurred.")}else 1===f.size?a.triggerLayerElementActions(p[0]):"selBySyllable"==i?a.triggerDefaultSylActions():a.triggerDefaultActions()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.queueNotification=t.Notification=void 0;const i=n(26),r=n(17),o=new Array(0);let s=null;const a={default:"",warning:"⚠️ ",error:"🔴 ",success:"✅ "};class c{constructor(e,t,n=null){this.message=a[t]+e,this.displayed=!1,this.id=(0,r.uuidv4)(),this.isModeMessage=-1!==e.search("Mode"),this.logInfo=n,this.timeoutID=-1,this.type=t}setTimeoutId(e){this.timeoutID=Math.max(e,-1)}display(){this.displayed=!0}getId(){return this.id}}function l(e){document.getElementById(e)&&document.getElementById(e).remove()}function d(e){!function(e){if(e.isModeMessage){if(null!==s)return void window.clearTimeout(s.timeoutID);s=e}if(o.push(e),o.length>3){l(o.shift().getId())}const t=document.getElementById("notification-content"),n=document.createElement("div");n.classList.add("neon-notification"),n.classList.add("neon-notification-"+e.type),n.id=e.getId(),n.innerHTML=e.message,t.append(n),t.style.display="",e.display()}(e),e.setTimeoutId(window.setTimeout(l,5e3,e.getId())),document.getElementById(e.getId()).addEventListener("click",()=>{window.clearTimeout(e.timeoutID),l(e.getId())})}function u(e,t="default",n=null){const r=new c(e,t,n);"error"!=r.type&&"warning"!=r.type||(0,i.recordNotification)(r),d(r)}t.Notification=c,t.queueNotification=u,t.default={queueNotification:u}},function(e,t,n){"use strict";e.exports=function(e){return function(){var t=arguments.length;if(t){for(var n=[],i=-1;++i\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',groupingTab:'

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',systemTab:'

\n \n

\n

Click upper left and lower right corners of new staff.

'},t.insertControlsPanel='
\n
INSERT
\n \n \n \n
\n\t
\n \n
',t.editControlsPanel='
\n
EDIT
\n \n \n \n
\n
\n
\n
\n
Selection Mode:
\n
\n\n \n \n \n \n \n\n
\n
\n
\n\n
\n \n \n \x3c!--\n * The extraEdit panel is added for edit options that have dropdown menus\n * Like the Neume and Clef menus\n * This is done because the moreEdit menu needs to have overflow for cases where it has lots of buttons\n * But overflow ruins dropdown menus\n --\x3e\n \n
\n
\n
\n
\n
',t.ncActionContents='\n ',t.defaultNeumeActionContents='
\n \n \n
',t.neumeActionContents='\n
\n \n ',t.defaultActionContents='
\n \n
',t.defaultSylActionContents='\n ',t.custosActionContents='
\n \n \n
',t.layerElementOutActionContents='
\n \n \n \n
',t.layerElementInActionContents='
\n \n \n \n
',t.accidActionContents='\n ',t.staffSplitActionContents='
Split System:
\n
\n \n \n \n
',t.staffMergeActionContents='\n
\n \n \n
',t.columnActionContents='
\n Edit Column Information:\n
\n \n \n \n \n
\n
\n
',t.clefActionContents='\n
\n \n \n
\n ',t.divLineActionContents='\n',t.bboxActionContents='
\n \n \n
',t.groupingMenu={nc:'
\n
\n \n \n
\n
',neume:'
\n
\n \n \n
\n
',syl:'
\n
\n \n \n \n
\n\t\t
',ligatureNc:'
\n
\n \n \n \n
\n
',ligature:'
\n
\n \n \n
\n
',splitSyllable:'
\n
\n \n \n
\n
'},t.editTextModal='
\n \n \n
\n
Cancel
\n
Save
\n
\n
',t.hotkeysModal='\n
\n \x3c!-- "Display" hotkeys --\x3e\n
\n
Display
\n
\n
\n
Shift
\n
+
\n
+
\n
\n
Zoom In
\n
\n
\n
\n
Shift
\n
+
\n
-
\n
\n
Zoom Out
\n
\n
\n
\n
0
\n
\n
Zoom Reset
\n
\n
\n
\n
h
\n
\n
Hide Glyph
\n
\n
\n
\n
Shift
\n
+
\n
T
\n
\n
Scroll To Syllable Text
\n
\n
\n\n \x3c!-- "Edit" hotkeys --\x3e\n
\n
Edit
\n
\n
\n
Ctrl
\n
+
\n
z
\n
or
\n
\n
+
\n
z
\n
\n
Undo
\n
\n
\n
\n
Ctrl
\n
+
\n
Shift
\n
+
\n
z
\n
or
\n
\n
+
\n
Shift
\n
+
\n
z
\n
\n
Redo
\n
\n
\n
\n
q/w/e/r/t/y
\n
\n
\n Highlight by Staff/Syllable/Neume/LayerElement/Selection/Off\n
\n
\n
\n
\n
1/2/3/4/5/6
\n
\n
\n Select by Syllable/Neume/Neume Component/Staff/Layer Element/BBox\n
\n
\n
\n
\n
Shift
\n
+
\n
Number
\n
\n
\n Begin Insert for the nth Option in the Selected Tab\n
\n
\n
\n
\n
g
\n
\n
\n Group/Ungroup Selected Element(s)\n
\n
\n
\n\n \x3c!-- "Other" hotkeys --\x3e\n
\n
Other
\n
\n
\n
s
\n
\n
Save File
\n
\n
\n
\n
Esc
\n
\n
Return to Edit Mode
\n
\n
\n
',t.syllableActionsContent='\n
\n \n \n \n \n
\n',t.errorLogsPanelContents='
\n
Error Log
\n \n \n \n
\n
'},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";for(var i=n(11),r=[],o=0;o<256;++o)r.push((o+256).toString(16).substr(1));t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!Object(i.a)(n))throw TypeError("Stringified UUID is invalid");return n}},function(e,t,n){"use strict";var i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.a=function(e){return"string"==typeof e&&i.test(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initDisplayControls=t.loadHighlightSettings=t.updateDisplayAllBtn=t.updateHighlight=t.setHighlightSelectionControls=t.setHighlightControls=t.setHighlightOption=t.getHighlightType=t.setCircleSizeControls=t.setBgOpacityFromSlider=t.setGlyphOpacityFromSlider=t.setZoomControls=void 0;const i=n(18),r=n(3),o=n(7);let s,a,c;function l(e){const t=document.getElementById("opacityOutput");document.getElementById("opacitySlider").value=t.value,(0,r.setSettings)({glyphOpacity:Number(t.value)});const n=document.querySelector("#toggle-glyph-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show glyph")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide glyph"));try{document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=(Number(t.value)/100).toString()})}catch(e){console.warn("Unable to properly set opacity to pages")}}function d(e){const t=document.querySelector("#bgOpacityOutput");(0,r.setSettings)({imageOpacity:Number(t.value)});const n=document.querySelector("#toggle-bg-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show background image")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide background image"));const i=document.querySelector("."+e);i&&(i.style.opacity=String(Number(t.value)/100))}function u(e){const t=document.getElementById("highlight-"+e),n=document.getElementById("highlight-dropdown"),o=document.getElementById("highlight-type");if((0,r.setSettings)({highlightMode:e}),n.classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),"none"===e)return o.textContent=" - Off",void i.unsetGroupingHighlight();t.classList.add("highlight-selected"),o.textContent=" - "+(e[0].toUpperCase()+e.slice(1)),i.setGroupingHighlight(e)}function f(e){document.getElementById("highlight-"+e).addEventListener("click",()=>{u(e)})}function m(){document.body.removeEventListener("click",m),document.getElementById("highlight-dropdown").classList.remove("is-active")}function p(){const e=document.getElementById("highlight-dropdown");document.getElementById("highlight-button").addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("is-active"),e.classList.contains("is-active")?(document.body.addEventListener("click",m),f("column"),f("staff"),f("syllable"),f("neume"),f("layerElement"),f("none")):document.body.removeEventListener("click",m)})}function h(){const{highlightMode:e}=(0,r.getSettings)();u(e)}t.setZoomControls=function(e){if(void 0===e)return;const t=document.getElementById("zoomSlider"),n=document.getElementById("zoomOutput"),{zoom:i}=(0,r.getSettings)();t.value=String(i),n.value=String(i),e.zoomTo(i/100),document.getElementById("reset-zoom").addEventListener("click",()=>{n.value="100",t.value="100",e.resetZoomAndPan()}),document.querySelector("#set-zoom-easy-edit").addEventListener("click",()=>{n.value="180",t.value="180",e.zoomTo(1.8)}),t.addEventListener("mouseup",(function(){n.value=t.value,e.zoomTo(Number(n.value)/100)})),t.disabled=!1,document.body.addEventListener("keydown",i=>{const r=parseInt(n.value);if("ArrowUp"===i.key||"ArrowDown"===i.key||"ArrowRight"===i.key||"ArrowLeft"===i.key)i.preventDefault();else if("+"===i.key){const i=Math.min(r+20,parseInt(t.getAttribute("max")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else if("_"===i.key){const i=Math.max(r-20,parseInt(t.getAttribute("min")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else"0"===i.key&&(n.value="100",t.value="100",e.resetZoomAndPan())})},t.setGlyphOpacityFromSlider=l,t.setBgOpacityFromSlider=d,t.setCircleSizeControls=function(){const e=document.getElementById("circleSlider"),t=document.getElementById("circleOutput"),{circleSize:n}=(0,r.getSettings)();function i(){t.value=e.value,c=Number(e.value),(0,r.setSettings)({circleSize:Number(c)});const n=o.selectAll(".resizePoint");n.empty()||n.attr("r",c)}c=n,e.value=String(n),t.value=String(n),document.getElementById("reset-circle-size").addEventListener("click",()=>{const n=o.selectAll(".resizePoint");n.empty()||n.attr("r",25),c=Number(25),e.value=String(25),t.value=String(25),(0,r.setSettings)({circleSize:Number(25)}),i()}),e.addEventListener("input",i),e.addEventListener("change",i),e.disabled=!1},t.getHighlightType=function(){return document.getElementById("highlight-type").textContent.slice(3).toLowerCase()},t.setHighlightOption=f,t.setHighlightControls=p,t.setHighlightSelectionControls=function(){const e=document.getElementById("highlight-selection");e.addEventListener("click",()=>{document.getElementById("highlight-dropdown").classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),e.classList.add("highlight-selected"),document.getElementById("highlight-type").textContent=" - Selection",i.setGroupingHighlight("selection")})},t.updateHighlight=function(){let e;try{e=document.querySelector(".highlight-selected").id}catch(t){e=""}switch(e){case"highlight-column":i.setGroupingHighlight("column");break;case"highlight-staff":i.setGroupingHighlight("staff");break;case"highlight-syllable":i.setGroupingHighlight("syllable");break;case"highlight-neume":i.setGroupingHighlight("neume");break;case"highlight-layerElement":i.setGroupingHighlight("layerElement");break;case"highlight-selection":i.setGroupingHighlight("selection");break;default:i.unsetGroupingHighlight()}},t.updateDisplayAllBtn=function(){const e=document.getElementById("display-all-btn"),t=document.getElementById("displayInfo"),n=document.getElementById("displayBBox"),i=document.getElementById("displayText"),r=document.getElementById("display-errors");(null==t?void 0:t.checked)&&(null==n?void 0:n.checked)&&(null==i?void 0:i.checked)&&(null==r?void 0:r.checked)?(e.classList.add("selected"),e.innerHTML="Hide All"):e.classList.contains("selected")&&(e.classList.remove("selected"),e.innerHTML="Display All")},t.loadHighlightSettings=h,t.initDisplayControls=function(e,t){!function(e){const t=document.getElementById("opacitySlider"),n=document.getElementById("opacityOutput"),{glyphOpacity:i}=(0,r.getSettings)();function o(){n.value=t.value,s=Number(t.value),l(e)}s=i,t.value=String(i),n.value=String(i);const a=document.getElementById("toggle-glyph-opacity");100==i&&a.classList.add("hide-icon"),null==a||a.addEventListener("click",()=>{let i;a.classList.contains("hide-icon")?(a.classList.remove("hide-icon"),i=0):(a.classList.add("hide-icon"),i=1),document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=i.toString()}),s=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({glyphOpacity:100*i}),o()}),t.addEventListener("input",o),t.addEventListener("change",o),t.disabled=!1}(e),function(e){const t=document.getElementById("bgOpacitySlider"),n=document.getElementById("bgOpacityOutput"),{imageOpacity:i}=(0,r.getSettings)();function o(){n.value=t.value,a=Number(t.value),d(e)}a=i,t.value=String(i),n.value=String(i);const s=document.getElementById("toggle-bg-opacity");100==i&&s.classList.add("hide-icon"),s.addEventListener("click",()=>{let i;s.classList.contains("hide-icon")?(s.classList.remove("hide-icon"),i=0):(s.classList.add("hide-icon"),i=1),document.getElementsByClassName(e)[0].style.opacity=i.toString(),a=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({imageOpacity:100*i}),o()}),t.addEventListener("input",o),t.addEventListener("change",o),t.disabled=!1}(t),p(),document.getElementById("burgerMenu").addEventListener("click",()=>{document.getElementById("burgerMenu").classList.toggle("is-active"),document.getElementById("navMenu").classList.toggle("is-active")}),document.body.addEventListener("keydown",e=>{if(!e.metaKey)switch(e.key){case"q":u("staff");break;case"w":u("syllable");break;case"e":u("neume");break;case"r":u("layerElement");break;case"t":u("selection");break;case"y":u("none")}}),function(){const e=document.querySelector("#display-all-btn");e.addEventListener("click",()=>{if(e.classList.contains("selected")){e.classList.remove("selected"),e.innerHTML="Display All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked&&e.click()})}else{e.classList.add("selected"),e.innerHTML="Hide All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked||e.click()})}})}(),h();const n=document.getElementById("displayContents"),i=document.getElementById("toggleDisplay");document.getElementById("displayHeader").addEventListener("click",e=>{e.stopPropagation(),n.classList.contains("closed")?(n.classList.remove("closed"),n.style.padding="0.5em 0.75em",setTimeout(()=>{n.style.overflow="visible"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(n.classList.add("closed"),n.style.overflow="hidden",setTimeout(()=>{n.style.padding="0px"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalWindow=t.ModalWindowView=void 0;const i=n(8),r=n(33),o=n(4);var s,a;!function(e){e[e.EDIT_TEXT=0]="EDIT_TEXT",e[e.HOTKEYS=1]="HOTKEYS",e[e.ERROR_LOG=2]="ERROR_LOG",e[e.DOCUMENT_UPLOAD=3]="DOCUMENT_UPLOAD",e[e.MOVE_TO=4]="MOVE_TO",e[e.NEW_FOLDER=5]="NEW_FOLDER",e[e.RENAME=6]="RENAME"}(s=t.ModalWindowView||(t.ModalWindowView={})),function(e){e[e.OPEN=0]="OPEN",e[e.CLOSED=1]="CLOSED"}(a||(a={}));t.ModalWindow=class{constructor(e){this.openEditSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-save").removeEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-save").addEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.updateSylText=function(){const e=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0],t=e.textContent.replace(/\u{25CA}/u,"").trim(),n=document.getElementById("neon-modal-window-edit-text-input").value;if(null!==n&&n!==t){const t={action:"setText",param:{elementId:[...e.classList.entries()].filter(e=>"text-select"!==e[1]&&"selected-to-edit"!==e[1])[0][1],text:n}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(t=>{t&&this.neonView.updateForCurrentPage().then(()=>{this.updateSelectedBBox(e,this.dragHandler,this.neonView)})})}else this.updateSelectedBBox(e,this.dragHandler,this.neonView);this.hideModalWindow()},this.keydownListener=function(e){switch(e.stopImmediatePropagation(),this.modalWindowView){case s.EDIT_TEXT:"Enter"===e.key&&this.updateSylText();default:"Escape"===e.key&&this.hideModalWindow()}},this.focusModalWindow=function(){switch(this.modalWindowView){case s.EDIT_TEXT:document.getElementById("neon-modal-window-edit-text-input").select();break;case s.DOCUMENT_UPLOAD:case s.NEW_FOLDER:case s.RENAME:break;default:document.getElementById("neon-modal-window").focus()}},this.neonView=e,this.modalWindowState=a.CLOSED,this.setupEventListeners()}setupEventListeners(){document.getElementById("neon-modal-window-header-close").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").addEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").addEventListener("click",this.focusModalWindow.bind(this))}removeEventListeners(){document.getElementById("neon-modal-window-header-close").removeEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").removeEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").removeEventListener("click",this.focusModalWindow.bind(this))}setModalWindowView(e,t){this.modalWindowView=e,this.setModalWindowContent(t)}getModalWindowView(){return this.modalWindowView.toString()}openModalWindow(){switch(Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),this.modalWindowView){case s.EDIT_TEXT:this.openEditSylTextModalWindow();break;case s.HOTKEYS:document.getElementById("neon-modal-window-content-hotkeys").classList.add("visible");case s.DOCUMENT_UPLOAD:case s.MOVE_TO:case s.NEW_FOLDER:case s.RENAME:default:document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()}document.body.style.overflowX="hidden",document.body.style.overflowY="hidden",this.modalWindowState=a.OPEN}hideModalWindow(){switch(this.modalWindowView){case s.EDIT_TEXT:document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].classList.remove("selected-to-edit");break;case s.DOCUMENT_UPLOAD:case s.MOVE_TO:case s.NEW_FOLDER:case s.RENAME:document.getElementById("neon-modal-window-content-container").innerHTML=""}document.getElementById("neon-modal-window-container").style.display="none",document.body.style.overflowX="hidden",document.body.style.overflowY="scroll",this.modalWindowState=a.CLOSED,this.removeEventListeners()}setModalWindowContent(e){const t=document.getElementById("neon-modal-window-content-container"),n=document.getElementById("neon-modal-window-header-title");switch(this.modalWindowView){case s.EDIT_TEXT:t.innerHTML=i.editTextModal,n.innerText="EDIT SYLLABLE TEXT";const o=/\u{25CA}/u,a=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].textContent.replace(o,"").trim();document.getElementById("neon-modal-window-edit-text-input").value=a;break;case s.HOTKEYS:t.innerHTML=i.hotkeysModal,n.innerText="HOTKEYS";break;case s.ERROR_LOG:t.innerHTML=`
${e}
\n `,n.innerText="ERROR LOG";break;case s.DOCUMENT_UPLOAD:n.innerText="DOCUMENT UPLOAD",t.innerHTML=r.uploadAreaHTML;break;case s.MOVE_TO:n.innerText="MOVE TO";break;case s.NEW_FOLDER:n.innerText="NEW FOLDER",t.innerHTML=r.newFolderHTML;break;case s.RENAME:n.innerText="RENAME",t.innerHTML=r.renameHTML;break;default:console.error("Unknown selection type. This should not have occurred.")}}updateSelectedBBox(e,t,n){(0,o.unselect)();const i=Array.from(e.classList).find(e=>"text-select"!==e&&"selected-to-edit"!==e);if(document.getElementById("displayBBox").checked&&document.getElementById(i)){const e=document.getElementById(i).querySelector(".sylTextRect-display");(0,o.selectBBox)(e,t,n)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.triggerDefaultActions=t.triggerDefaultSylActions=t.triggerBBoxActions=t.triggerSingleStaffActions=t.triggerStaffSplitMode=t.triggerMultiStaffActions=t.triggerLayerElementActions=t.triggerSyllableActions=t.triggerNeumeActions=t.triggerNcActions=t.addChangeStaffListener=t.matchHeightHandler=t.moveOutsideSyllableHandler=t.insertToSyllableHandler=t.changeStaffHandler=t.removeHandler=t.endOptionsSelection=t.deleteButtonHandler=t.unsetLiquescentAnticlockwiseAction=t.unsetLiquescentClockwiseAction=t.unsetVirgaReversedAction=t.unsetVirgaAction=t.unsetInclinatumAction=t.initNeonView=void 0;const i=n(8),r=n(24),o=n(5),s=n(35),a=n(36),c=n(4);let l;function d(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function u(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function f(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function m(e){return{action:"set",param:{elementId:e,attrType:"curve",attrValue:""}}}function p(e){return{action:"setLiquescent",param:{elementId:e,curve:""}}}function h(e){"d"!==e.key&&"Backspace"!==e.key||(v(),e.preventDefault())}function g(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden")),document.body.removeEventListener("keydown",h)}function v(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{t.classList.contains("syl")&&(t=t.closest(".syllable")),t.classList.contains("accid")&&(t=t.closest(".accid")),t.classList.contains("divLine")&&(t=t.closest(".divLine")),e.push({action:"remove",param:{elementId:t.id}})});const t={action:"chain",param:e};g(),l.edit(t,l.view.getCurrentPageURI()).then(()=>{l.updateForCurrentPage()})}function y(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"changeStaff",param:{elementId:t.id}})});const t={action:"chain",param:e};g(),l.edit(t,l.view.getCurrentPageURI()).then(()=>{l.updateForCurrentPage()})}function b(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"insertToSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Insert Success","success"):o.default.queueNotification("Insert Failed XoX","error"),g(),l.updateForCurrentPage()})}function _(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"moveOutsideSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Move Success","success"):o.default.queueNotification("Move Failed XoX","error"),g(),l.updateForCurrentPage()})}function w(){const e=Array.from(document.getElementsByClassName("selected"));e.length>1&&o.default.queueNotification("Cannot match height to multiple bbox","error");const t={action:"matchHeight",param:{elementId:e[0].id}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Height Match Success","success"):o.default.queueNotification("Height Match Failed XoX","error"),g(),l.updateForCurrentPage()})}function E(){const e=document.getElementById("delete");e&&(e.removeEventListener("click",v),e.addEventListener("click",v),document.body.addEventListener("keydown",h))}function S(){const e=document.getElementById("changeStaff");null==e||e.removeEventListener("click",y),null==e||e.addEventListener("click",y)}function k(){const e=document.getElementById("col-input"),t=document.querySelectorAll(".staff.selected");let n;for(const e of t){const t=Array.from(e.classList).join(" ").match(/\bcolumn(\d+)\b/);if(t){const e=parseInt(t[1],10);if(n&&n!=e){document.getElementById("col-warning").innerText="The selected staves are not of the same column!",n=0;break}n=e}}n&&(e.value=n.toString())}function L(){const e=document.getElementById("col-decrement"),t=document.getElementById("col-increment"),n=document.getElementById("col-confirm"),i=document.getElementById("col-input");function r(e){let t=parseInt(i.value,10)||0;t+=e,t=Math.min(Math.max(t,1),5),t.toString()!=i.value&&(n.style.display=""),i.value=t.toString()}e.addEventListener("click",(function(){r(-1)})),t.addEventListener("click",(function(){r(1)})),n.addEventListener("click",(function(){const e=[];document.querySelectorAll(".staff.selected").forEach(t=>{e.push({action:"set",param:{elementId:t.id,attrType:"type",attrValue:"column"+i.value}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Column Value Update Success","success"):o.default.queueNotification("Column Value Update Failed XoX","error"),g(),l.updateForCurrentPage()})}))}function A(e,t,n=!0){const i=document.getElementById(e);i&&(i.parentElement.classList.remove("hidden"),n?i.innerHTML=t:i.innerHTML+=t)}function x(e){l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),g(),l.updateForCurrentPage()})}function C(){const e=document.querySelector(".staff.selected");if(null!==e){new s.SplitStaffHandler(l,e).startSplit(),g()}else console.error("No staff was selected!"),g()}function N(){document.querySelectorAll(".drop_select").forEach(e=>{const t=()=>{document.body.removeEventListener("click",t),e.classList.remove("is-active")};e.addEventListener("click",n=>{e.classList.toggle("is-active"),Array.from(document.querySelectorAll(".drop_select")).filter(t=>t!==e).forEach(e=>e.classList.remove("is-active")),n.stopPropagation(),e.classList.contains("is-active")?document.body.addEventListener("click",t):document.body.removeEventListener("click",t)})})}t.initNeonView=function(e){l=e,r.initNeonView(e)},t.unsetInclinatumAction=d,t.unsetVirgaAction=u,t.unsetVirgaReversedAction=f,t.unsetLiquescentClockwiseAction=m,t.unsetLiquescentAnticlockwiseAction=p,t.deleteButtonHandler=h,t.endOptionsSelection=g,t.removeHandler=v,t.changeStaffHandler=y,t.insertToSyllableHandler=b,t.moveOutsideSyllableHandler=_,t.matchHeightHandler=w,t.addChangeStaffListener=S,t.triggerNcActions=function(e){g(),A("moreEdit",i.defaultActionContents),A("extraEdit",i.ncActionContents),E(),document.querySelector("#Punctum.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=u(e.id),i=f(e.id),r=m(e.id),s=p(e.id);l.edit({action:"chain",param:[t,n,i,r,s]},l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),g(),l.updateForCurrentPage()})}),document.querySelector("#Inclinatum.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=m(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"se"}};l.edit({action:"chain",param:[t,n,i,r,s]},l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),g(),l.updateForCurrentPage()})}),document.querySelector("#Virga.dropdown-item").addEventListener("click",()=>{const t=f(e.id),n=d(e.id),i=m(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"s"}};l.edit({action:"chain",param:[t,n,i,r,s]},l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),g(),l.updateForCurrentPage()})}),document.querySelector("#VirgaReversed.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=u(e.id),i=m(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"n"}};l.edit({action:"chain",param:[t,n,i,r,s]},l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),g(),l.updateForCurrentPage()})}),document.querySelector("#LiquescentClockwise.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=u(e.id),i=f(e.id),r=p(e.id),s={action:"setLiquescent",param:{elementId:e.id,curve:"c"}};l.edit({action:"chain",param:[t,n,i,r,s]},l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),g(),l.updateForCurrentPage()})}),document.querySelector("#LiquescentAnticlockwise.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=u(e.id),i=f(e.id),r=m(e.id),s={action:"setLiquescent",param:{elementId:e.id,curve:"a"}};l.edit({action:"chain",param:[t,n,i,r,s]},l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),g(),l.updateForCurrentPage()})}),N()},t.triggerNeumeActions=function(){g(),A("moreEdit",i.defaultNeumeActionContents),A("extraEdit",i.neumeActionContents),E();const e=document.querySelectorAll(".selected");function t(t){const n={action:"changeGroup",param:{elementId:e[0].id,contour:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Grouping Changed","success"):o.default.queueNotification("Grouping Failed","error"),g(),l.updateForCurrentPage()})}1===e.length?(document.getElementById("split-neume").addEventListener("click",()=>{const e=document.querySelector(".neume.selected");if(null!==e){new a.SplitNeumeHandler(l,e).startSplit(),g()}else console.error("No staff was selected!"),g()}),document.querySelector("#Pes.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PesSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Clivis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Scandicus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusFlexus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Climacus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ClimacusResupinus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Torculus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#TorculusResupinus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Porrectus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusFlexus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Pressus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),N()):console.warn("More than one neume selected! Cannot trigger Neume ClickSelect actions.")},t.triggerSyllableActions=function(e){g(),A("moreEdit",i.syllableActionsContent);let t="";switch(e){case"singleSelect":t+='
\n \n \n \n
';break;case"linkableSelect":t+='
\n \n \n \n
';break;case"multiSelect":t+='
\n \n \n \n
';break;case"default":t+='
\n \n \n
'}A("moreEdit",t,!0),S(),E(),r.initGroupingListeners()},t.triggerLayerElementActions=function(e){var t,n,r,s;if(g(),e.classList.contains("custos"))return A("moreEdit",i.custosActionContents),S(),void E();A("moreEdit",e.parentElement.classList.contains("syllable")?i.layerElementInActionContents:i.layerElementOutActionContents,!1),e.classList.contains("accid")?(A("extraEdit",i.accidActionContents),function(e){document.querySelector("#ChangeToFlat.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"f"}})}),document.querySelector("#ChangeToNatural.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"n"}})}),N()}(e)):e.classList.contains("clef")?(A("extraEdit",i.clefActionContents),function(e){document.querySelector("#increment-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"above"}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Clef octave incremented.","success"):o.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),g(),l.updateForCurrentPage()})}),document.querySelector("#decrement-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"below"}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Clef octave decremented.","success"):o.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),g(),l.updateForCurrentPage()})}),document.querySelector("#CClef.dropdown-item").addEventListener("click",()=>{x({action:"setClef",param:{elementId:e.id,shape:"C"}})}),document.querySelector("#FClef.dropdown-item").addEventListener("click",()=>{x({action:"setClef",param:{elementId:e.id,shape:"F"}})}),N()}(e)):e.classList.contains("divLine")&&(A("extraEdit",i.divLineActionContents),function(e){document.querySelector("#ChangeToMinima.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"minima"}})}),document.querySelector("#ChangeToMaior.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maior"}})}),document.querySelector("#ChangeToMaxima.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maxima"}})}),document.querySelector("#ChangeToFinalis.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"finalis"}})}),document.querySelector("#ChangeToCaesura.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"caesura"}})}),document.querySelector("#ChangeToVirgula.dropdown-item").addEventListener("click",()=>{x({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"virgula"}})}),N()}(e)),S(),null===(t=document.getElementById("insertToSyllable"))||void 0===t||t.addEventListener("click",b),null===(n=document.getElementById("moveOutsideSyllable"))||void 0===n||n.addEventListener("click",_),E(),S(),null===(r=document.getElementById("insertToSyllable"))||void 0===r||r.addEventListener("click",b),null===(s=document.getElementById("moveOutsideSyllable"))||void 0===s||s.addEventListener("click",_)},t.triggerMultiStaffActions=function(){g(),A("moreEdit",i.staffMergeActionContents),A("extraEdit",i.columnActionContents),E(),k(),L(),document.getElementById("merge-systems").addEventListener("click",()=>{r.mergeStaves()})},t.triggerStaffSplitMode=C,t.triggerSingleStaffActions=function(){g(),A("moreEdit",i.staffSplitActionContents),A("extraEdit",i.columnActionContents),E(),k(),L(),document.getElementById("split-system").addEventListener("click",()=>{C()}),document.getElementById("reset-rotate").addEventListener("click",()=>{const e=document.querySelector(".staff.selected"),t=(0,c.getStaffBBox)(e),n=Math.tan(t.rotate)*(t.lrx-t.ulx);if(null!==e){const i={action:"resizeRotate",param:{elementId:e.id,ulx:t.ulx,uly:t.rotate>0?t.uly+n/2:t.uly-n/2,lrx:t.lrx,lry:t.rotate>0?t.lry-n/2:t.lry+n/2,rotate:0}};l.edit(i,l.view.getCurrentPageURI()).then(async e=>{e&&await l.updateForCurrentPage()}),g()}else console.error("No staff was selected"),g()})},t.triggerBBoxActions=function(){g(),A("moreEdit",i.bboxActionContents),E(),document.getElementById("matchHeight").addEventListener("click",()=>{w()})},t.triggerDefaultSylActions=function(){g(),A("moreEdit",i.defaultSylActionContents),E(),S()},t.triggerDefaultActions=function(){g(),A("moreEdit",i.defaultActionContents),E()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getGlyphBBox=t.isOutOfSVGBounds=t.getStaffByCoords=t.getStaffIdByCoords=t.getSVGRelCoords=void 0;const i=n(4);function r(e,t){const n=new DOMPoint(e,t),i=document.querySelector(".active-page > .definition-scale").querySelector(".page-margin"),{x:r,y:o}=n.matrixTransform(i.getScreenCTM().inverse());return{x:r,y:o}}function o(e,t){const n=Array.from(document.querySelectorAll(".staff")).map(e=>(0,i.getStaffBBox)(e)),{x:o,y:s}=r(e,t),a=n.find(e=>o<=e.lrx&&o>=e.ulx&&s<=e.lry&&s>=e.uly);return a?a.id:null}t.getSVGRelCoords=r,t.getStaffIdByCoords=o,t.getStaffByCoords=function(e,t){const n=o(e,t);return document.querySelector("#"+n)},t.isOutOfSVGBounds=function(e,t){const n=document.querySelector("#bgimg");return e<=0||e>=Number(n.getAttribute("width"))||t<=0||t>=Number(n.getAttribute("height"))},t.getGlyphBBox=function(e){const t="rect"==e.tagName?e.getBBox():e.parentNode.getBBox();return{ulx:t.x,uly:t.y,lrx:t.x+t.width,lry:t.y+t.height}}},function(e,t,n){e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function n(e,t){var n=e[0],i=e[1],r=e[2],o=e[3];i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[0]-680876936|0)<<7|n>>>25)+i|0)&i|~n&r)+t[1]-389564586|0)<<12|o>>>20)+n|0)&n|~o&i)+t[2]+606105819|0)<<17|r>>>15)+o|0)&o|~r&n)+t[3]-1044525330|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[4]-176418897|0)<<7|n>>>25)+i|0)&i|~n&r)+t[5]+1200080426|0)<<12|o>>>20)+n|0)&n|~o&i)+t[6]-1473231341|0)<<17|r>>>15)+o|0)&o|~r&n)+t[7]-45705983|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[8]+1770035416|0)<<7|n>>>25)+i|0)&i|~n&r)+t[9]-1958414417|0)<<12|o>>>20)+n|0)&n|~o&i)+t[10]-42063|0)<<17|r>>>15)+o|0)&o|~r&n)+t[11]-1990404162|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[12]+1804603682|0)<<7|n>>>25)+i|0)&i|~n&r)+t[13]-40341101|0)<<12|o>>>20)+n|0)&n|~o&i)+t[14]-1502002290|0)<<17|r>>>15)+o|0)&o|~r&n)+t[15]+1236535329|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[1]-165796510|0)<<5|n>>>27)+i|0)&r|i&~r)+t[6]-1069501632|0)<<9|o>>>23)+n|0)&i|n&~i)+t[11]+643717713|0)<<14|r>>>18)+o|0)&n|o&~n)+t[0]-373897302|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[5]-701558691|0)<<5|n>>>27)+i|0)&r|i&~r)+t[10]+38016083|0)<<9|o>>>23)+n|0)&i|n&~i)+t[15]-660478335|0)<<14|r>>>18)+o|0)&n|o&~n)+t[4]-405537848|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[9]+568446438|0)<<5|n>>>27)+i|0)&r|i&~r)+t[14]-1019803690|0)<<9|o>>>23)+n|0)&i|n&~i)+t[3]-187363961|0)<<14|r>>>18)+o|0)&n|o&~n)+t[8]+1163531501|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[13]-1444681467|0)<<5|n>>>27)+i|0)&r|i&~r)+t[2]-51403784|0)<<9|o>>>23)+n|0)&i|n&~i)+t[7]+1735328473|0)<<14|r>>>18)+o|0)&n|o&~n)+t[12]-1926607734|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[5]-378558|0)<<4|n>>>28)+i|0)^i^r)+t[8]-2022574463|0)<<11|o>>>21)+n|0)^n^i)+t[11]+1839030562|0)<<16|r>>>16)+o|0)^o^n)+t[14]-35309556|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[1]-1530992060|0)<<4|n>>>28)+i|0)^i^r)+t[4]+1272893353|0)<<11|o>>>21)+n|0)^n^i)+t[7]-155497632|0)<<16|r>>>16)+o|0)^o^n)+t[10]-1094730640|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[13]+681279174|0)<<4|n>>>28)+i|0)^i^r)+t[0]-358537222|0)<<11|o>>>21)+n|0)^n^i)+t[3]-722521979|0)<<16|r>>>16)+o|0)^o^n)+t[6]+76029189|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[9]-640364487|0)<<4|n>>>28)+i|0)^i^r)+t[12]-421815835|0)<<11|o>>>21)+n|0)^n^i)+t[15]+530742520|0)<<16|r>>>16)+o|0)^o^n)+t[2]-995338651|0)<<23|i>>>9)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[0]-198630844|0)<<6|n>>>26)+i|0)|~r))+t[7]+1126891415|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[14]-1416354905|0)<<15|r>>>17)+o|0)|~n))+t[5]-57434055|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[12]+1700485571|0)<<6|n>>>26)+i|0)|~r))+t[3]-1894986606|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[10]-1051523|0)<<15|r>>>17)+o|0)|~n))+t[1]-2054922799|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[8]+1873313359|0)<<6|n>>>26)+i|0)|~r))+t[15]-30611744|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[6]-1560198380|0)<<15|r>>>17)+o|0)|~n))+t[13]+1309151649|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[4]-145523070|0)<<6|n>>>26)+i|0)|~r))+t[11]-1120210379|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[2]+718787259|0)<<15|r>>>17)+o|0)|~n))+t[9]-343485551|0)<<21|i>>>11)+r|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=r+e[2]|0,e[3]=o+e[3]|0}function i(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function r(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function o(e){var t,r,o,s,a,c,l=e.length,d=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=l;t+=64)n(d,i(e.substring(t-64,t)));for(r=(e=e.substring(t-64)).length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t>2]|=e.charCodeAt(t)<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(n(d,o),t=0;t<16;t+=1)o[t]=0;return s=(s=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(s[2],16),c=parseInt(s[1],16)||0,o[14]=a,o[15]=c,n(d,o),d}function s(e){var n,i="";for(n=0;n<4;n+=1)i+=t[e>>8*n+4&15]+t[e>>8*n&15];return i}function a(e){var t;for(t=0;td?new ArrayBuffer(0):(r=d-l,o=new ArrayBuffer(r),s=new Uint8Array(o),a=new Uint8Array(this,l,r),s.set(a),o)}}(),d.prototype.append=function(e){return this.appendBinary(c(e)),this},d.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,r=this._buff.length;for(t=64;t<=r;t+=64)n(this._hash,i(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},d.prototype.end=function(e){var t,n,i=this._buff,r=i.length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);return this._finish(o,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},d.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},d.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},d.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},d.prototype._finish=function(e,t){var i,r,o,s=t;if(e[s>>2]|=128<<(s%4<<3),s>55)for(n(this._hash,e),s=0;s<16;s+=1)e[s]=0;i=(i=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(i[2],16),o=parseInt(i[1],16)||0,e[14]=r,e[15]=o,n(this._hash,e)},d.hash=function(e,t){return d.hashBinary(c(e),t)},d.hashBinary=function(e,t){var n=a(o(e));return t?l(n):n},d.ArrayBuffer=function(){this.reset()},d.ArrayBuffer.prototype.append=function(e){var t,i,o,s,a,c=(i=this._buff.buffer,o=e,s=!0,(a=new Uint8Array(i.byteLength+o.byteLength)).set(new Uint8Array(i)),a.set(new Uint8Array(o),i.byteLength),s?a:a.buffer),l=c.length;for(this._length+=e.byteLength,t=64;t<=l;t+=64)n(this._hash,r(c.subarray(t-64,t)));return this._buff=t-64>2]|=i[t]<<(t%4<<3);return this._finish(o,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},d.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.ArrayBuffer.prototype.getState=function(){var e,t=d.prototype.getState.call(this);return t.buff=(e=t.buff,String.fromCharCode.apply(null,new Uint8Array(e))),t},d.ArrayBuffer.prototype.setState=function(e){return e.buff=function(e,t){var n,i=e.length,r=new ArrayBuffer(i),o=new Uint8Array(r);for(n=0;n>2]|=e[t]<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(n(d,o),t=0;t<16;t+=1)o[t]=0;return s=(s=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(s[2],16),c=parseInt(s[1],16)||0,o[14]=a,o[15]=c,n(d,o),d}(new Uint8Array(e)));return t?l(i):i},d}()},function(e,t,n){"use strict";function i(e){if(16!==e.length)return"";function t(e,t){return e+t.toString(16).padStart(2,"0")}return e.slice(0,4).reduce(t,"")+"-"+e.slice(4,6).reduce(t,"")+"-"+e.slice(6,8).reduce(t,"")+"-"+e.slice(8,10).reduce(t,"")+"-"+e.slice(10).reduce(t,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.uuidv4=void 0,t.uuidv4=function(){if(void 0===window.crypto)return i(new Uint8Array(16));const e=new Uint8Array(16),t=Uint8Array.from([parseInt("01000000",2),parseInt("10000000",2),parseInt("00001111",2),parseInt("00111111",2)]);return window.crypto.getRandomValues(e),e[6]=e[6]&t[2]|t[0],e[8]=e[8]&t[3]|t[1],i(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setGroupingHighlight=t.setStaffHighlight=t.highlight=t.unsetGroupingHighlight=t.unsetStaffHighlight=t.unhighlight=void 0;const i=["rgb(230, 159, 0)","rgb(86, 180, 233)","rgb(0, 158, 115)","rgb(240, 228, 66)","rgb(0, 114, 178)","rgb(213, 94, 0)","rgb(204, 121, 167)"];function r(e){let t;t=e?e.querySelectorAll(":not(.selected) .highlighted"):document.querySelectorAll(":not(.selected) .highlighted"),t.forEach(e=>{if("path"!==e.tagName||e.closest(".staff").classList.contains("selected"))if(e.classList.contains("divLine")&&!e.closest(".staff").classList.contains("selected"))e.setAttribute("stroke","#000000");else{e.removeAttribute("fill");let t=e.querySelectorAll(".sylTextRect-display");if(!t.length)try{t=e.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(e){t=[]}t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")}))}else e.setAttribute("stroke","#000000");e.classList.remove("highlighted")})}function o(){r()}function s(){o();Array.from(document.getElementsByClassName("highlighted")).filter(e=>!e.parentElement.classList.contains("selected")).forEach(e=>{e.setAttribute("#d00",null);let t=e.querySelectorAll(".sylTextRect-display");t.length||null!==e.closest(".syllable")&&(t=e.closest(".syllable").querySelectorAll("sylTextRect-display")),t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")})),e.classList.remove("highlighted"),e.querySelectorAll("sylTextRect-display").forEach(e=>{e.classList.remove("highlighted")})}),Array.from(document.getElementsByClassName("selected")).forEach(e=>{e.setAttribute("fill","")})}function a(e,t){const n=Array.from(e.children);for(let e=0;ee.querySelectorAll(".divLine")).forEach(e=>{n.push(e)});else{if(i.classList.contains("resizePoint")||"resizeRect"===i.id||i.classList.contains("rotatePoint"))return;if(i.classList.contains("layer"))Array.from(i.children).forEach(e=>{n.push(e)});else if(document.getElementsByClassName("highlight-selected").length&&"highlight-neume"===document.getElementsByClassName("highlight-selected")[0].id&&i.classList.contains("syllable"))Array.from(i.children).filter(e=>e.classList.contains("neume")).forEach(e=>{n.push(e)});else{i.setAttribute("fill",t);let e=i.querySelectorAll(".sylTextRect-display");if(!e.length)try{e=i.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(t){e=[]}e.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||(e.style.fill=t,e.classList.add("highlighted"))}))}}i.classList.add("highlighted")}let i;i="30px",e.querySelectorAll(".nc, .custos, .clef, .accid").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width",i)})}function c(){const e=Array.from(document.getElementsByClassName("staff"));for(let t=0;t{const n=Array.from(t.classList).join(" ").match(/\bcolumn(\d+)\b/);let i=0;n&&(i=parseInt(n[1],10)-1),e[i]||(e[i]=[]),e[i].push(t)});for(const[t,n]of Object.entries(e)){const e=i[Number(t)%i.length];for(const t of n)a(t,e)}}();if("selection"===t){switch(document.querySelector(".sel-by.is-active").id){case"selBySyllable":case"selByBBox":t="syllable";break;case"selByColumn":t="column";break;case"selByStaff":t="staff";break;case"selByLayerElement":t="layerElement";break;case"selByNeume":default:t="neume"}return void e(t)}let n;n="layerElement"==t?document.querySelectorAll(".accid, .clef, .custos, .divLine"):document.getElementsByClassName(t),document.querySelectorAll(".nc, .custos, .clef, .accid, .divLine").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width","30px")});for(let e=0;e{e.classList.add("highlighted")})}const r=n[e].querySelectorAll(".divLine");if(r)for(let e=0;e=0;o--)s=0===o?"":",",t.push({obj:i[o],prefix:s});t.push({val:"["})}else{for(c in a=[],i)i.hasOwnProperty(c)&&a.push(c);for(t.push({val:"}"}),o=a.length-1;o>=0;o--)d=i[l=a[o]],u=o>0?",":"",u+=JSON.stringify(l)+":",t.push({obj:d,prefix:u});t.push({val:"{"})}return f},t.parse=function(e){for(var t,n,r,o,s,a,c,l,d,u=[],f=[],m=0;;)if("}"!==(t=e[m++])&&"]"!==t&&void 0!==t)switch(t){case" ":case"\t":case"\n":case":":case",":break;case"n":m+=3,i(null,u,f);break;case"t":m+=3,i(!0,u,f);break;case"f":m+=4,i(!1,u,f);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",m--;;){if(r=e[m++],!/[\d\.\-e\+]/.test(r)){m--;break}n+=r}i(parseFloat(n),u,f);break;case'"':for(o="",s=void 0,a=0;'"'!==(c=e[m++])||"\\"===s&&a%2==1;)o+=c,"\\"===(s=c)?a++:a=0;i(JSON.parse('"'+o+'"'),u,f);break;case"[":l={element:[],index:u.length},u.push(l.element),f.push(l);break;case"{":d={element:{},index:u.length},u.push(d.element),f.push(d);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===u.length)return u.pop();i(u.pop(),u,f)}}},function(e,t,n){"use strict";var i=n(20),r=n(10);t.a=function(e,t,n){var o=(e=e||{}).random||(e.rng||i.a)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){n=n||0;for(var s=0;s<16;++s)t[n+s]=o[s];return t}return Object(r.a)(o)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),o=n(5),s=n(4);t.default=class{constructor(e,t){this.dragStartCoords=[-1,-1],this.neonView=e,this.selector=t}dragInit(){const e=i.drag().on("start",function(){this.dragStartCoords=[i.event.x,i.event.y],this.dx=0,this.dy=0,i.event.sourceEvent.target.classList.contains("staff")&&i.select(this.selector).call(e)}.bind(this)).on("drag",this.dragging.bind(this)).on("end",this.dragEnded.bind(this));i.selectAll(".selected").call(e);let t=Array.from(document.querySelectorAll(".selected"));this.noMovePrecedes=t.filter(e=>e.classList.contains("no-moving")&&e.hasAttribute("mei:precedes")),t=t.filter(e=>!e.classList.contains("no-moving")),this.selection=t.concat(Array.from(document.querySelectorAll(".resizePoint")))}dragging(){this.dx=i.event.x-this.dragStartCoords[0],this.dy=i.event.y-this.dragStartCoords[1],this.moveElements(this.selection,this.dx,this.dy);if(0===this.selection.filter(e=>e.classList.contains("syl")).length&&0===this.noMovePrecedes.length){const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));this.moveElements(e,-this.dx,-this.dy)}}dragEnded(){const e=Math.abs(this.dx),t=Math.abs(this.dy);if(e<=5&&t<=5)return this.reset(),void this.dragInit();const n=this.selection.filter(e=>!e.classList.contains("resizePoint"));if(this.isCursorOutOfBounds()||this.isDragOutOfBounds(n)){this.returnElements(this.selection);const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));return this.returnElements(e),this.reset(),this.dragInit(),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Drag action failed.","error")}const i=[];n.forEach(e=>{const t={action:"drag",param:{elementId:"rect"===e.tagName?e.closest(".syl").id:e.id,x:this.dx,y:-this.dy}};i.push(t)});const r={action:"chain",param:i};this.neonView.edit(r,this.neonView.view.getCurrentPageURI()).then(async()=>{const e=Array.from(document.querySelectorAll(".selected")).filter(e=>!e.classList.contains("no-moving")).map(e=>e.id);await this.neonView.updateForCurrentPage(),this.endOptionsSelection(),this.reset(),await this.reselect(e),this.dragInit()})}async reselect(e){const t=e.map(e=>document.querySelector("#"+e));t.filter(e=>!e.classList.contains("syl")).forEach(async()=>await(0,s.selectAll)(t,this.neonView,this)),t.filter(e=>e.classList.contains("syl")).forEach(e=>(0,s.selectBBox)(e.querySelector(".sylTextRect-display"),this,this.neonView)),t.filter(e=>e.classList.contains("staff")).forEach(e=>(0,s.selectStaff)(e,this))}resetTo(e){this.resetToAction=e}reset(){void 0!==this.resetToAction&&i.select(this.selector).call(this.resetToAction)}endOptionsSelection(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden"))}moveElements(e,t,n){e.filter(e=>null!==e).forEach(e=>{e.setAttribute("transform",`translate(${t},${n})`)})}returnElements(e){e.filter(e=>null!==e).forEach(e=>{e.removeAttribute("transform")})}isCursorOutOfBounds(){const e=this.dragStartCoords[0]+this.dx,t=this.dragStartCoords[1]+this.dy;return(0,r.isOutOfSVGBounds)(e,t)}isDragOutOfBounds(e){let t=document.querySelector("#displayBBox").checked?"use, rect":"use";e[0].classList.contains("staff")&&(t="path");const n=e.reduce((e,n)=>e.concat(...n.querySelectorAll(t)),[]).map(r.getGlyphBBox).reduce((e,t)=>({ulx:Math.min(e.ulx,t.ulx),uly:Math.min(e.uly,t.uly),lrx:Math.max(e.lrx,t.lrx),lry:Math.max(e.lry,t.lry)}),{ulx:Number.MAX_VALUE,uly:Number.MAX_VALUE,lrx:Number.MIN_VALUE,lry:Number.MIN_VALUE}),{ulx:i,uly:o,lrx:s,lry:a}=n;return(0,r.isOutOfSVGBounds)(i+this.dx,o+this.dy)||(0,r.isOutOfSVGBounds)(s+this.dx,a+this.dy)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initGroupingListeners=t.endGroupingSelection=t.triggerGrouping=t.mergeStaves=t.isLinkable=t.canBeLinked=t.isLinked=t.isGroupable=t.initNeonView=void 0;const i=n(8),r=n(34),o=n(5),s=n(4),a=n(14),c=n(14);let l;function d(e,t){if(Array.from(t.values()).length<2)return!1;switch(e){case"selByNeume":if(s.sharedLogicalParent(e,t))return!1;default:return!!s.areAdjacent(e,t)}}function u(e,t){switch(t||(t=Array.from(document.querySelectorAll(".selected"))),e){case"selBySyllable":for(const e of t)if(e.hasAttribute("mei:follows")||e.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNeume":for(const e of t)if(e.parentElement.hasAttribute("mei:follows")||e.parentElement.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNc":for(const e of t)if(e.parentElement.parentElement.hasAttribute("mei:follows")||e.parentElement.parentElement.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1}}function f(e){for(const t of e)if(!t.hasAttribute("mei:precedes")&&!t.hasAttribute("mei:follows"))return!1;return!0}function m(e){e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1});const t=Array.from(document.querySelectorAll(".staff")),n=Array.from(document.querySelectorAll(".syllable"));for(let i=0;i!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));const i=e.filter(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(1!==i.length)return!1;const r=i[0];return 0===e.indexOf(r)||e.indexOf(r)===e.length-1}function p(e,t){return!(t.length<2)&&("selBySyllable"===e&&(function(e){e.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING?1:0);for(let t=0;te.id===i&&(r=t,!0));if(!o)return!0;if(!o.hasAttribute("mei:follows"))return!0;if(o.getAttribute("mei:follows")!="#"+n.id)return!0;if(r!==t+1)return!0}if(n.hasAttribute("mei:follows")){const t=n.getAttribute("mei:follows").replace("#",""),i=e.find(e=>e.id===t);if(!i)return!0;if(!i.hasAttribute("mei:precedes"))return!0;if(i.getAttribute("mei:precedes")!="#"+n.id)return!0}return!1}}(t)?(o.queueNotification("The selected syllables include invalid linked syllable(s)!","warning"),!1):!!f(t)||!!m(t)))}function h(){const e=document.querySelectorAll(".staff.selected"),t=[];e.forEach(e=>{t.push(e.id)});const n={action:"merge",param:{elementIds:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?(o.queueNotification("Staff Merged","success"),a.endOptionsSelection(),l.updateForCurrentPage()):o.queueNotification("Merge Failed","error")})}function g(){const e=document.getElementById("moreEdit");e.innerHTML="",e.parentElement.classList.add("hidden"),document.body.removeEventListener("keydown",c.deleteButtonHandler),document.body.removeEventListener("keydown",y)}function v(){const e=document.getElementById("delete");e.removeEventListener("click",c.removeHandler),e.addEventListener("click",c.removeHandler),document.body.addEventListener("keydown",c.deleteButtonHandler),document.body.addEventListener("keydown",y);try{document.getElementById("mergeSyls").addEventListener("click",()=>{if(u(s.getSelectionType()))return;b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNeumes").addEventListener("click",()=>{if(u(s.getSelectionType()))return;b("group","neume",E().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNcs").addEventListener("click",()=>{b("group","nc",E().filter(e=>document.getElementById(e).classList.contains("nc")))})}catch(e){}try{document.getElementById("ungroupNeumes").addEventListener("click",()=>{b("ungroup","neume",S())})}catch(e){}try{document.getElementById("ungroupNcs").addEventListener("click",()=>{b("ungroup","nc",S())})}catch(e){}try{document.getElementById("toggle-ligature").addEventListener("click",async()=>{const e={action:"toggleLigature",param:{elementIds:E()}};l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?o.queueNotification("Ligature Toggled","success"):o.queueNotification("Ligature Toggle Failed","error"),g(),l.updateForCurrentPage()})})}catch(e){}try{document.getElementById("toggle-link").addEventListener("click",()=>{w()})}catch(e){}}t.initNeonView=function(e){l=e},t.isGroupable=d,t.isLinked=f,t.canBeLinked=m,t.isLinkable=p,t.mergeStaves=h,t.triggerGrouping=function(e){const t=document.getElementById("moreEdit");t.parentElement.classList.remove("hidden"),t.innerHTML+=i.groupingMenu[e],v()},t.endGroupingSelection=g,t.initGroupingListeners=v;const y=function(e){if("g"===e.key){const e=Array.from(document.querySelectorAll(".selected"));if(0==e.length)return;const t=s.getSelectionType();if(u(t,e))return;switch(t){case"selBySyllable":if(p(t,e))w();else if(d(t,e)){b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))}else if(1===e.length){b("ungroup","neume",S())}break;case"selByNeume":if(d(t,e)){b("group","neume",E())}else{b("ungroup","nc",S())}break;case"selByNc":if(d(t,e)){b("group","nc",E())}else{b("ungroup","nc",S())}break;case"selByStaff":d(t,e)?h():a.triggerStaffSplitMode();break;default:return void console.error(`Can't perform grouping/ungrouping action on selection type ${t}.`)}}};function b(e,t,n){const i={action:e,param:{groupType:t,elementIds:n}};l.edit(i,l.view.getCurrentPageURI()).then(i=>{if(i?"group"===e?o.queueNotification("Grouping Success","success"):o.queueNotification("Ungrouping Success","success"):"group"===e?o.queueNotification("Grouping Failed","error"):o.queueNotification("Ungrouping Failed","error"),l.updateForCurrentPage(),"nc"===t){const e=document.getElementById(n[0]).parentElement,t=Array.from(e.children);void 0===l.info.getContour(t)&&r.groupingNotRecognized()}g()})}function _(e){const t=document.getElementById(e);return t instanceof SVGGraphicsElement?t:null}function w(){const e=E(),t={action:"chain",param:[]},n=new Array,i=e.map(_).filter(e=>null!==e);if(f(i))n.push(...function(e){const t=new Array;for(const n of e){const e=document.getElementById(n);e.getAttribute("mei:precedes")&&t.push({action:"set",param:{elementId:n,attrType:"precedes",attrValue:""}}),e.getAttribute("mei:follows")&&(t.push({action:"set",param:{elementId:n,attrType:"follows",attrValue:""}}),t.push({action:"setText",param:{elementId:n,text:""}}))}return t}(e));else{const[e,t]=function(e){if(e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}),2===e.length)return[e[0],e[1]];const t=e.find(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(t){const n=e.indexOf(t);if(0===n)return[e[n],e[n+1]];if(n===e.length-1)return[e[n-1],e[n]]}}(i);console.log(e.id,t.id),n.push({action:"set",param:{elementId:e.id,attrType:"precedes",attrValue:"#"+t.id}}),n.push({action:"set",param:{elementId:t.id,attrType:"follows",attrValue:"#"+e.id}});const r=t.querySelector(".syl");null!==r&&n.push({action:"remove",param:{elementId:r.id}})}t.param=n,l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.queueNotification("Toggled Syllable Link","success"):o.queueNotification("Failed to Toggle Syllable Link","error"),g(),l.updateForCurrentPage()})}function E(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push(t.id)}),e}function S(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{if(t.classList.contains("divLine")||t.classList.contains("accid")||t.classList.contains("clef"))return;Array.from(t.children).forEach(t=>{e.push(t.id)})}),e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemManager=t.FileSystemTools=t.EntryType=void 0;var i=n(89);Object.defineProperty(t,"EntryType",{enumerable:!0,get:function(){return i.EntryType}});var r=n(90);Object.defineProperty(t,"FileSystemTools",{enumerable:!0,get:function(){return r.FileSystemTools}});var o=n(91);Object.defineProperty(t,"FileSystemManager",{enumerable:!0,get:function(){return o.FileSystemManager}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateErrorLogVisibility=t.initDisplayListener=t.initErrorLogControls=t.initErrorLog=t.recordNotification=void 0;const i=n(8),r=n(3),o=n(13);function s(e){const t=document.createElement("div");t.classList.add("notification-container"),t.innerHTML=`\n
\n
${e.message}
\n
\n
\n\n
\n
\n \n
\n\n
\n \n
\n
\n `;const n=t.querySelector(".log-remove");if(n.onclick=()=>t.remove(),n.addEventListener("mouseover",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-open.svg")}),n.addEventListener("mouseout",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-closed.svg")}),e.logInfo){const i=t.querySelector(".notif-log-info-icon");i.style.display="",n.style.height="20px",i.addEventListener("mouseover",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-dark.svg")}),i.addEventListener("mouseout",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-light.svg")}),i.addEventListener("click",()=>function(e){const t=new o.ModalWindow;t.setModalWindowView(o.ModalWindowView.ERROR_LOG,e),t.openModalWindow()}(e.logInfo))}return t}function a(){const e=document.querySelector("#error_log"),t=document.querySelector("#errorLogHeading"),n=t.querySelector("svg > use"),i=document.querySelector("#errorLogContents"),{displayErrLog:o}=(0,r.getSettings)();o&&e.classList.add("visible"),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),c()}function c(){const e=document.querySelector("#display-single-container"),t=document.createElement("label"),n=document.createElement("input");n.classList.add("checkbox"),t.classList.add("checkbox-container","side-panel-btn"),t.textContent="Errors",n.id="display-errors",n.type="checkbox",n.checked=!1,t.appendChild(n),e.append(t);const{displayErrLog:i}=(0,r.getSettings)();n.checked=i,n.addEventListener("click",()=>{(0,r.setSettings)({displayErrLog:n.checked}),l()})}function l(){const e=document.querySelector("#error_log"),{debugMode:t,displayErrLog:n,displayInfo:i,displayBBox:o,displayText:s}=(0,r.getSettings)(),a=document.getElementById("display-all-btn");t?n?(e.classList.add("visible"),i&&o&&s&&n&&(a.classList.add("selected"),a.innerHTML="Hide All")):(e.classList.remove("visible"),a.classList.contains("selected")&&(a.classList.remove("selected"),a.innerHTML="Display All")):(e.classList.remove("visible"),i&&o&&s?(a.classList.add("selected"),a.innerHTML="Hide All"):(a.classList.remove("selected"),a.innerHTML="Display All"))}t.recordNotification=function(e){document.querySelector("#errorLogContents").prepend(s(e))},t.initErrorLog=function(){document.querySelector("#error_log").innerHTML=i.errorLogsPanelContents,a()},t.initErrorLogControls=a,t.initDisplayListener=c,t.updateErrorLogVisibility=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resize=void 0;const i=n(4),r=n(7),o=n(15),s=n(5),a=n(3),c={TopLeft:0,Top:1,TopRight:2,Right:3,BottomRight:4,Bottom:5,BottomLeft:6,Left:7};function l(e,t,n,i,r){let o;if(r>=0)o=[{x:e,y:t,name:c.TopLeft},{x:(e+n)/2,y:t+(n-e)/2*Math.sin(r),name:c.Top},{x:n,y:t+(n-e)*Math.sin(r),name:c.TopRight},{x:n,y:(t+i+(n-e)*Math.sin(r))/2,name:c.Right},{x:n,y:i,name:c.BottomRight},{x:(e+n)/2,y:i-(n-e)/2*Math.sin(r),name:c.Bottom},{x:e,y:i-(n-e)*Math.sin(r),name:c.BottomLeft},{x:e,y:(t+i-(n-e)*Math.sin(r))/2,name:c.Left}];else{const s=(n-e)*Math.tan(Math.abs(r)),a=i-t-s;o=[{x:e,y:t+s,name:c.TopLeft},{x:(e+n)/2,y:t+s/2,name:c.Top},{x:n,y:t,name:c.TopRight},{x:n,y:t+a/2,name:c.Right},{x:n,y:t+a,name:c.BottomRight},{x:(e+n)/2,y:i-s/2,name:c.Bottom},{x:e,y:i,name:c.BottomLeft},{x:e,y:i-a/2,name:c.Left}]}return o}t.resize=function(e,t,n){let d,u,f,m,p,h,g,v,y,b,_,w,E,S,k;function L(){const e=l(d,u,f,m,p),t=e.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");document.querySelector("#resizeRect").setAttribute("points",t);const n=document.querySelector(".syl.selected > .sylTextRect-display");n&&(n.setAttribute("x",String(Math.min(d,f))),n.setAttribute("y",String(Math.min(u,m))),n.setAttribute("width",String(Math.abs(f-d))),n.setAttribute("height",String(Math.abs(m-u))));for(const t in c){const n=e[c[t]];r.select("#p-"+t).filter(".resizePoint").attr("cx",n.x).attr("cy",n.y)}let i=e[3].x,o=e[3].y;const s=i+100+","+(o+85)+" "+(i+70)+","+(o+50)+" "+(i+100)+","+(o+15)+" "+(i+130)+","+(o+50);i=e[7].x,o=e[7].y;const a=i-100+","+(o-15)+" "+(i-130)+","+(o-50)+" "+(i-100)+","+(o-85)+" "+(i-70)+","+(o-50);r.select("#rotateLeft").attr("points",a),r.select("#rotateRight").attr("points",s)}!function A(){if(null===e)return;if(r.selectAll(".resizePoint").remove(),r.selectAll("#resizeRect").remove(),r.selectAll(".rotatePoint").remove(),e.classList.contains("syl")){const t=e.querySelector(".sylTextRect-display");if(null===t)return void console.warn("Tried to draw resize rect for a sylTextRect that doesn't exist (or isn't displaying)");d=Number(t.getAttribute("x")),u=Number(t.getAttribute("y")),f=+d+ +t.getAttribute("width"),m=+u+ +t.getAttribute("height"),p=0}if(e.classList.contains("staff")){const t=(0,i.getStaffBBox)(e);d=t.ulx,u=t.uly,f=t.lrx,m=t.lry;const n=e.querySelector("path").getAttribute("d").match(/\d+/g).map(e=>Number(e));p=Math.atan((n[3]-n[1])/(n[2]-n[0]))}let x;h=d,y=u,g=f,b=m;const C=l(d,u,f,m,p);E=C[2].x-C[0].x;const N=C.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");r.select("#"+e.id).append("polygon").attr("points",N).attr("id","resizeRect").attr("stroke","black").attr("stroke-width",10).attr("fill","none").style("cursor","move").style("stroke-dasharray","20 10");const{circleSize:O}=(0,a.getSettings)();for(const t in c){const n=C[c[t]];r.select(e.viewportElement).append("circle").attr("cx",n.x).attr("cy",n.y).attr("r",O).attr("stroke","black").attr("stroke-width",4).attr("fill","#0099ff").attr("class","resizePoint").attr("id","p-"+t)}for(const e in c)r.select("#p-"+e).filter(".resizePoint").call(r.drag().on("start",()=>{T(e)}).on("drag",q).on("end",I.bind(this)));if(e.classList.contains("staff")){let t=C[3].x,n=C[3].y;const i=t+100+","+(n+85)+" "+(t+70)+","+(n+50)+" "+(t+100)+","+(n+15)+" "+(t+130)+","+(n+50);t=C[7].x,n=C[7].y;const o=t-100+","+(n-15)+" "+(t-130)+","+(n-50)+" "+(t-100)+","+(n-85)+" "+(t-70)+","+(n-50);r.select("#"+e.id).append("polygon").attr("points",i).attr("id","rotateRight").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#"+e.id).append("polygon").attr("points",o).attr("id","rotateLeft").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#rotateLeft").call(r.drag().on("start",B).on("drag",(function(){const e=r.mouse(this)[1]-_,t=k-Math.atan(e/E);t>-.2&&t<.2&&(S=e,u=w+S,p=t,p>=0?(u=S+C.filter(e=>e.name===c.TopLeft)[0].y,m=C.filter(e=>e.name===c.BottomRight)[0].y):(u=C.filter(e=>e.name===c.TopRight)[0].y,m=S+C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M)),r.select("#rotateRight").call(r.drag().on("start",B).on("drag",(function(){const e=r.mouse(this)[1]-_,t=k+Math.atan(e/E);t>-.2&&t<.2&&(S=e,p=t,p>=0?(m=S+C.filter(e=>e.name===c.BottomRight)[0].y,u=C.filter(e=>e.name===c.TopLeft)[0].y):(u=S+C.filter(e=>e.name===c.TopRight)[0].y,m=C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M))}function T(e){x=e;const t=C.find(t=>t.name===c[e]);v=[t.x,t.y],y=u,b=m}function q(){const e=r.mouse(this);switch(c[x]){case c.TopLeft:d=e[0],u=e[1];break;case c.Top:u=e[1]-(f-d)*Math.tan(p)/2;break;case c.TopRight:f=e[0],u=e[1]-(f-d)*Math.tan(p);break;case c.Right:f=e[0],m=b+(e[0]-v[0])*Math.tan(p);break;case c.BottomRight:f=e[0],m=e[1];break;case c.Bottom:m=e[1]+(f-d)*Math.tan(p)/2;break;case c.BottomLeft:d=e[0],m=e[1]+(f-d)*Math.tan(p);break;case c.Left:d=e[0],u=y+(e[0]-v[0])*Math.tan(p);break;default:console.error("Something that wasn't a side of the rectangle was dragged. This shouldn't happen.")}L()}function I(){if((0,o.isOutOfSVGBounds)(d,u)||(0,o.isOutOfSVGBounds)(f,m))return d=h,u=y,f=g,m=b,L(),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Resize action failed.","error");const r={action:"resize",param:{elementId:e.id,ulx:d,uly:u,lrx:f,lry:m}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{if(r&&await t.updateForCurrentPage(),e=document.querySelector("#"+e.id),d=void 0,u=void 0,f=void 0,m=void 0,A(),e.classList.contains("syl"))(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this);else{(0,i.selectAll)([document.querySelector("#"+e.id)],t,n);const r=document.querySelector("moreEdit");r&&(r.innerHTML="",r.parentElement.classList.add("hidden"))}})}function B(){const e=r.event.sourceEvent.target.id;_=r.mouse(this)[1],b=m,y=u,w="rotateRight"===e?m:u,k=p}function M(){if(void 0===S&&(S=0),(0,o.isOutOfSVGBounds)(d,u)||(0,o.isOutOfSVGBounds)(f,m))return document.querySelectorAll(".resizePoint").forEach(e=>e.remove()),document.querySelectorAll("#resizeRect").forEach(e=>e.remove()),document.querySelectorAll(".rotatePoint").forEach(e=>e.remove()),e=document.getElementById(e.id),d=void 0,u=void 0,f=void 0,m=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Rotate action failed.","error");const r={action:"resizeRotate",param:{elementId:e.id,ulx:d,uly:u,lrx:f,lry:m,rotate:180*p/Math.PI}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{r&&await t.updateForCurrentPage(),e=document.getElementById(e.id),d=void 0,u=void 0,f=void 0,m=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n)})}}()}},function(e,t,n){"use strict";n.r(t),function(e){var i,r,o=n(2),s=n.n(o),a=n(22),c=n(16),l=n.n(c),d=n(21),u=n.n(d),f=n(6),m=n.n(f),p=n(1),h=n.n(p),g=n(0),v=n.n(g);function y(e){return"$"+e}function b(e){return e.substring(1)}function _(){this._store={}}function w(e){if(this._store=new _,e&&Array.isArray(e))for(var t=0,n=e.length;tb(e))},_.prototype.delete=function(e){var t=y(e),n=t in this._store;return delete this._store[t],n},_.prototype.forEach=function(e){for(var t=Object.keys(this._store),n=0,i=t.length;n=d.length)){var n=Math.min(u+6,d.length),i=d.slice(u,n);!function(n,i){n.forEach((function(n,r){var s=i+r,a=o.get(n),d=N(a[0],["atts_since","attachments"]);d.open_revs=a.map((function(e){return e.rev})),d.open_revs=d.open_revs.filter(T);var u=T;0===d.open_revs.length&&(delete d.open_revs,u=q),["revs","attachments","binary","ajax","latest"].forEach((function(e){e in t&&(d[e]=t[e])})),e.get(n,d,(function(e,t){var i,r,o;i=e?[{error:e}]:u(t),r=n,o=i,c[s]={id:r,docs:o},l(),f()}))}))}(i,u),u+=i.length}}f()}try{localStorage.setItem("_pouch_check_localstorage",1),O=!!localStorage.getItem("_pouch_check_localstorage")}catch(e){O=!1}function B(){return O}function M(){v.a.call(this),this._listeners={},function(e){B()&&addEventListener("storage",(function(t){e.emit(t.key)}))}(this)}function P(e){if("undefined"!=typeof console&&"function"==typeof console[e]){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function F(e){var t=0;return e||(t=2e3),function(e,t){return e=parseInt(e,10)||0,(t=parseInt(t,10))!=t||t<=e?t=(e||1)<<1:t+=1,t>6e5&&(e=3e5,t=6e5),~~((t-e)*Math.random()+e)}(e,t)}function j(e,t){P("info","The above "+e+" is totally normal. "+t)}h()(M,v.a),M.prototype.addListener=function(e,t,n,i){if(!this._listeners[t]){var r=this,o=!1;this._listeners[t]=a,this.on(e,a)}function a(){if(r._listeners[t])if(o)o="waiting";else{o=!0;var e=N(i,["style","include_docs","attachments","conflicts","filter","doc_ids","view","since","query_params","binary","return_docs"]);n.changes(e).on("change",(function(e){e.seq>i.since&&!i.cancelled&&(i.since=e.seq,i.onChange(e))})).on("complete",(function(){"waiting"===o&&s()(a),o=!1})).on("error",(function(){o=!1}))}}},M.prototype.removeListener=function(e,t){t in this._listeners&&(v.a.prototype.removeListener.call(this,e,this._listeners[t]),delete this._listeners[t])},M.prototype.notifyLocalWindows=function(e){B()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},M.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)};var D="function"==typeof Object.assign?Object.assign:function(e){for(var t=Object(e),n=1;n0||i0||i>>1],t)<0?r=i+1:o=i;return r}(e,t,n);e.splice(i,0,t)}function Re(e,t){for(var n,i,r=t,o=e.length;r0;){var r=n.pop(),o=r.tree1,s=r.tree2;(o[1].status||s[1].status)&&(o[1].status="available"===o[1].status||"available"===s[1].status?"available":"missing");for(var a=0;a0;){var h=p.pop();if(0!==h.diff)for(var g=h.ids[2],v=0,y=g.length;vt){n||(n={});var d=l.length-t;a={pos:c.pos+d,ids:Re(l,d)};for(var u=0;u0&&i.emit("error",t)):i.emit("complete",n),i.removeAllListeners(),e.removeListener("destroyed",o)}));function o(){i.cancel()}n&&(i.on("complete",(function(e){n(null,e)})),i.on("error",n)),e.once("destroyed",o),t.onChange=function(e,t,n){i.isCancelled||function(e,t,n,i){try{e.emit("change",t,n,i)}catch(e){P("error",'Error in .on("change", function):',e)}}(i,e,t,n)};var s=new Promise((function(e,n){t.complete=function(t,i){t?n(t):e(i)}}));i.once("cancel",(function(){e.removeListener("destroyed",o),t.complete(null,{status:"cancelled"})})),this.then=s.then.bind(s),this.catch=s.catch.bind(s),this.then((function(e){r(null,e)}),r),e.taskqueue.isReady?i.validateChanges(t):e.taskqueue.addTask((function(e){e?t.complete(e):i.isCancelled?i.emit("cancel"):i.validateChanges(t)}))}function Ke(e,t,n){var i=[{rev:e._rev}];"all_docs"===n.style&&(i=Me(t.rev_tree).map((function(e){return{rev:e.rev}})));var r={id:t.id,changes:i,doc:e};return We(t,e._rev)&&(r.deleted=!0),n.conflicts&&(r.doc._conflicts=Pe(t),r.doc._conflicts.length||delete r.doc._conflicts),r}function Xe(e,t){return et?1:0}function Ye(e,t){return function(n,i){n||i[0]&&i[0].error?((n=n||i[0]).docId=t,e(n)):e(null,i.length?i[0]:i)}}function Qe(e,t){var n=Xe(e._id,t._id);return 0!==n?n:Xe(e._revisions?e._revisions.start:0,t._revisions?t._revisions.start:0)}function Ze(){for(var e in v.a.call(this),Ze.prototype)"function"==typeof this[e]&&(this[e]=this[e].bind(this))}function et(){this.isReady=!1,this.failed=!1,this.queue=[]}function tt(e,t){if(!(this instanceof tt))return new tt(e,t);var n=this;if(t=t||{},e&&"object"==typeof e&&(e=(t=e).name,delete t.name),void 0===t.deterministic_revs&&(t.deterministic_revs=!0),this.__opts=t=L(t),n.auto_compaction=t.auto_compaction,n.prefix=tt.prefix,"string"!=typeof e)throw new Error("Missing/invalid DB name");var i=function(e,t){var n=e.match(/([a-z-]*):\/\/(.*)/);if(n)return{name:/https?/.test(n[1])?n[1]+"://"+n[2]:n[2],adapter:n[1]};var i=tt.adapters,r=tt.preferredAdapters,o=tt.prefix,s=t.adapter;if(!s)for(var a=0;at&&a.push(e)})),Ie(o,(function(e,t,n,i,r){var o=t+"-"+n;"available"===r.status&&-1!==a.indexOf(o)&&c.push(o)})),i._doCompaction(e,c,n)}))})),Ze.prototype.compact=C("compact",(function(e,t){"function"==typeof e&&(t=e,e={});e=e||{},this._compactionQueue=this._compactionQueue||[],this._compactionQueue.push({opts:e,callback:t}),1===this._compactionQueue.length&&function e(t){var n=t._compactionQueue[0],i=n.opts,r=n.callback;t.get("_local/compaction").catch((function(){return!1})).then((function(n){n&&n.last_seq&&(i.last_seq=n.last_seq),t._compact(i,(function(n,i){n?r(n):r(null,i),s()((function(){t._compactionQueue.shift(),t._compactionQueue.length&&e(t)}))}))}))}(this)})),Ze.prototype._compact=function(e,t){var n=this,i={return_docs:!1,last_seq:e.last_seq||0},r=[];n.changes(i).on("change",(function(e){r.push(n.compactDocument(e.id,0))})).on("complete",(function(e){var i=e.last_seq;Promise.all(r).then((function(){return he(n,"_local/compaction",(function(e){return(!e.last_seq||e.last_seq0?e.keys.slice(e.skip):e.keys;e.keys=t,e.skip=0,delete e.limit,e.descending&&(t.reverse(),e.descending=!1)}(e),0===e.keys.length))return this._allDocs({limit:0},t)}return this._allDocs(e,t)})),Ze.prototype.changes=function(e,t){return"function"==typeof e&&(t=e,e={}),(e=e||{}).return_docs="return_docs"in e?e.return_docs:!e.live,new Je(this,e,t)},Ze.prototype.close=C("close",(function(e){return this._closed=!0,this.emit("closed"),this._close(e)})),Ze.prototype.info=C("info",(function(e){var t=this;this._info((function(n,i){if(n)return e(n);i.db_name=i.db_name||t.name,i.auto_compaction=!(!t.auto_compaction||ae(t)),i.adapter=t.adapter,e(null,i)}))})),Ze.prototype.id=C("id",(function(e){return this._id(e)})),Ze.prototype.type=function(){return"function"==typeof this._type?this._type():this.adapter},Ze.prototype.bulkDocs=C("bulkDocs",(function(e,t,n){if("function"==typeof t&&(n=t,t={}),t=t||{},Array.isArray(e)&&(e={docs:e}),!e||!e.docs||!Array.isArray(e.docs))return n(ne(H));for(var i=0;i1?t.set(e.name,n):t.delete(e.name))}})),e.on("destroyed",(function(e){if(t.has(e)){var n=t.get(e);t.delete(e),n.forEach((function(e){e.emit("destroyed",!0)}))}}))}(tt),tt.adapter=function(e,t,n){t.valid()&&(tt.adapters[e]=t,n&&tt.preferredAdapters.push(e))},tt.plugin=function(e){if("function"==typeof e)e(tt);else{if("object"!=typeof e||0===Object.keys(e).length)throw new Error('Invalid plugin: got "'+e+'", expected an object or a function');Object.keys(e).forEach((function(t){tt.prototype[t]=e[t]}))}return this.__defaults&&(tt.__defaults=D({},this.__defaults)),tt},tt.defaults=function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);n=n||{},e&&"object"==typeof e&&(e=(n=e).name,delete n.name),n=D({},t.__defaults,n),tt.call(this,e,n)}return h()(t,tt),t.preferredAdapters=tt.preferredAdapters.slice(),Object.keys(tt).forEach((function(e){e in t||(t[e]=tt[e])})),t.__defaults=D({},this.__defaults,e),t},tt.fetch=function(e,t){return it(e,t)};function st(e,t){for(var n=e,i=0,r=t.length;i0&&"\\"===e[i-1]&&("$"===o||"."===o)?n=n.substring(0,n.length-1)+o:"."===o?(t.push(n),n=""):n+=o}return t.push(n),t}var ct=["$or","$nor","$not"];function lt(e){return ct.indexOf(e)>-1}function dt(e){return Object.keys(e)[0]}function ut(e){var t={},n={$or:!0,$nor:!0};return e.forEach((function(e){Object.keys(e).forEach((function(i){var r=e[i];if("object"!=typeof r&&(r={$eq:r}),lt(i))if(r instanceof Array){if(n[i])return n[i]=!1,void(t[i]=r);var o=[];t[i].forEach((function(e){Object.keys(r).forEach((function(t){var n=r[t],i=Math.max(Object.keys(e).length,Object.keys(n).length),s=ut([e,n]);Object.keys(s).length<=i||o.push(s)}))})),t[i]=o}else t[i]=ut([r]);else{var s=t[i]=t[i]||{};Object.keys(r).forEach((function(e){var t=r[e];return"$gt"===e||"$gte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$gte?"$gte"===e?t>n.$gte&&(n.$gte=t):t>=n.$gte&&(delete n.$gte,n.$gt=t):void 0!==n.$gt?"$gte"===e?t>n.$gt&&(delete n.$gt,n.$gte=t):t>n.$gt&&(n.$gt=t):n[e]=t}(e,t,s):"$lt"===e||"$lte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$lte?"$lte"===e?tt?1:-1}(e,t)}return Array.isArray(e)?function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:-1}(e,t):function(e,t){for(var n=Object.keys(e),i=Object.keys(t),r=Math.min(n.length,i.length),o=0;oi.length?1:-1}(e,t)}function pt(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-1/0||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var n=e.length;e=new Array(n);for(var i=0;ir?1:0)}}(t.sort);e=e.sort(i),"string"!=typeof t.sort[0]&&"desc"===(r=t.sort[0])[dt(r)]&&(e=e.reverse())}var r;if("limit"in t||"skip"in t){var o=t.skip||0,s=("limit"in t?t.limit:e.length)+o;e=e.slice(o,s)}return e}function wt(e,t,n){return n.every((function(n){var i=t[n],r=at(n),o=st(e,r);return lt(n)?function(e,t,n){if("$or"===e)return t.some((function(e){return wt(n,e,Object.keys(e))}));if("$not"===e)return!wt(n,t,Object.keys(t));return!t.find((function(e){return wt(n,e,Object.keys(e))}))}(n,i,e):Et(i,e,r,o)}))}function Et(e,t,n,i){return!e||("object"==typeof e?Object.keys(e).every((function(r){var o=e[r];if(0===r.indexOf("$"))return St(r,t,o,n,i);var s=at(r);if(void 0===i&&"object"!=typeof o&&s.length>0)return!1;var a=st(i,s);return"object"==typeof o?Et(o,t,n,a):St("$eq",t,o,s,a)})):e===i)}function St(e,t,n,i,r){if(!xt[e])throw new Error('unknown operator "'+e+'" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, $nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');return xt[e](t,n,i,r)}function kt(e){return null!=e}function Lt(e){return void 0!==e}function At(e,t){return t.some((function(t){return e instanceof Array?e.some((function(e){return 0===mt(t,e)})):0===mt(t,e)}))}var xt={$elemMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.some((function(e){return wt(e,t,Object.keys(t))})):i.some((function(i){return Et(t,e,n,i)}))))},$allMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.every((function(e){return wt(e,t,Object.keys(t))})):i.every((function(i){return Et(t,e,n,i)}))))},$eq:function(e,t,n,i){return Lt(i)&&0===mt(i,t)},$gte:function(e,t,n,i){return Lt(i)&&mt(i,t)>=0},$gt:function(e,t,n,i){return Lt(i)&&mt(i,t)>0},$lte:function(e,t,n,i){return Lt(i)&&mt(i,t)<=0},$lt:function(e,t,n,i){return Lt(i)&&mt(i,t)<0},$exists:function(e,t,n,i){return t?Lt(i):!Lt(i)},$mod:function(e,t,n,i){return kt(i)&&function(e,t){return"number"==typeof e&&parseInt(e,10)===e&&e%t[0]===t[1]}(i,t)},$ne:function(e,t,n,i){return t.every((function(e){return 0!==mt(i,e)}))},$in:function(e,t,n,i){return kt(i)&&At(i,t)},$nin:function(e,t,n,i){return kt(i)&&!At(i,t)},$size:function(e,t,n,i){return kt(i)&&Array.isArray(i)&&function(e,t){return e.length===t}(i,t)},$all:function(e,t,n,i){return Array.isArray(i)&&function(e,t){return t.every((function(t){return e.some((function(e){return 0===mt(t,e)}))}))}(i,t)},$regex:function(e,t,n,i){return kt(i)&&"string"==typeof i&&t.every((function(e){return function(e,t){return new RegExp(t).test(e)}(i,e)}))},$type:function(e,t,n,i){return function(e,t){switch(t){case"null":return null===e;case"boolean":return"boolean"==typeof e;case"number":return"number"==typeof e;case"string":return"string"==typeof e;case"array":return e instanceof Array;case"object":return"[object Object]"==={}.toString.call(e)}}(i,t)}};function Ct(e,t){if(e.selector&&e.filter&&"_selector"!==e.filter){var n="string"==typeof e.filter?e.filter:"function";return t(new Error('selector invalid for filter "'+n+'"'))}t()}function Nt(e){e.view&&!e.filter&&(e.filter="_view"),e.selector&&!e.filter&&(e.filter="_selector"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=le(e.view):e.filter=le(e.filter))}function Ot(e,t){return t.filter&&"string"==typeof t.filter&&!t.doc_ids&&!ae(e.db)}function Tt(e,t){var n=t.complete;if("_view"===t.filter){if(!t.view||"string"!=typeof t.view){var i=ne(Y,"`view` filter parameter not found or invalid.");return n(i)}var r=ce(t.view);e.db.get("_design/"+r[0],(function(i,o){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var s=o&&o.views&&o.views[r[1]]&&o.views[r[1]].map;if(!s)return n(ne($,o.views?"missing json key: "+r[1]:"missing json key: views"));t.filter=pe(["return function(doc) {",' "use strict";'," var emitted = false;"," var emit = function (a, b) {"," emitted = true;"," };"," var view = "+s+";"," view(doc);"," if (emitted) {"," return true;"," }","};"].join("\n"),{}),e.doChanges(t)}))}else if(t.selector)t.filter=function(e){return function(e,t){if("object"!=typeof t)throw new Error("Selector error: expected a JSON object");var n=_t([{doc:e}],{selector:t=ft(t)},Object.keys(t));return n&&1===n.length}(e,t.selector)},e.doChanges(t);else{var o=ce(t.filter);e.db.get("_design/"+o[0],(function(i,r){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var s=r&&r.filters&&r.filters[o[1]];if(!s)return n(ne($,r&&r.filters?"missing json key: "+o[1]:"missing json key: filters"));t.filter=pe('"use strict";\nreturn '+s+";",{}),e.doChanges(t)}))}}function qt(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})}tt.plugin((function(e){e._changesFilterPlugin={validate:Ct,normalize:Nt,shouldFilter:Ot,filter:Tt}})),tt.version="7.3.0";var It=qt(["_id","_rev","_access","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),Bt=qt(["_access","_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);function Mt(e){if(!/^\d+-/.test(e))return ne(ee);var t=e.indexOf("-"),n=e.substring(0,t),i=e.substring(t+1);return{prefix:parseInt(n,10),id:i}}function Pt(e,t,n){var i,r,o;n||(n={deterministic_revs:!0});var s={status:"available"};if(e._deleted&&(s.deleted=!0),t)if(e._id||(e._id=Te()),r=Oe(e,n.deterministic_revs),e._rev){if((o=Mt(e._rev)).error)return o;e._rev_tree=[{pos:o.prefix,ids:[o.id,{status:"missing"},[[r,s,[]]]]}],i=o.prefix+1}else e._rev_tree=[{pos:1,ids:[r,s,[]]}],i=1;else if(e._revisions&&(e._rev_tree=function(e,t){for(var n=e.start-e.ids.length+1,i=e.ids,r=[i[0],t,[]],o=1,s=i.length;o1&&!n?(a={continue:function(){if(!o.length)return r();var n,a=o[o.length-1];if(t&&t.upper)try{n=IDBKeyRange.bound(a,t.upper,!0,t.upperOpen)}catch(e){if("DataError"===e.name&&0===e.code)return r()}else n=IDBKeyRange.lowerBound(a,!0);t=n,o=null,s=null,e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l}},e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l):n?e.openCursor(t,"prev").onsuccess=d:e.openCursor(t).onsuccess=d}function nn(e,t,n){var i,r,o="startkey"in e&&e.startkey,s="endkey"in e&&e.endkey,a="key"in e&&e.key,c="keys"in e&&e.keys,l=e.skip||0,d="number"==typeof e.limit?e.limit:-1,u=!1!==e.inclusive_end;if(!c&&(r=(i=function(e,t,n,i,r){try{if(e&&t)return r?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return r?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return r?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(i)return IDBKeyRange.only(i)}catch(e){return{error:e}}return null}(o,s,u,a,e.descending))&&i.error)&&("DataError"!==r.name||0!==r.code))return n(ne(Z,r.name,r.message));var f=[Ht,"by-sequence",$t];e.attachments&&f.push("attach-store");var m=Qt(t,f,"readonly");if(m.error)return n(m.error);var p=m.txn;p.oncomplete=function(){e.attachments?Xt(E,e.binary).then(A):A()},p.onabort=Vt(n);var h,g,v,y=p.objectStore(Ht),b=p.objectStore("by-sequence"),_=p.objectStore($t),w=b.index("_doc_id_rev"),E=[];function S(t,n){var i={id:n.id,key:n.id,value:{rev:t}};n.deleted?c&&(E.push(i),i.value.deleted=!0,i.doc=null):l--<=0&&(E.push(i),e.include_docs&&function(t,n,i){var r=t.id+"::"+i;w.get(r).onsuccess=function(i){if(n.doc=zt(i.target.result)||{},e.conflicts){var r=Pe(t);r.length&&(n.doc._conflicts=r)}Kt(n.doc,e,p)}}(n,i,t))}function k(e){for(var t=0,n=e.length;t0&&(g=e.target.result[0])},b.openCursor(null,"prev").onsuccess=function(e){var t=e.target.result,n=void 0;return t&&t.key&&(n=t.key),v({target:{result:[n]}})}),r||0===d?void 0:c?function(e,t,n){var i=new Array(e.length),r=0;e.forEach((function(o,s){t.get(o).onsuccess=function(t){t.target.result?i[s]=t.target.result:i[s]={key:o,error:"not_found"},++r===e.length&&n(e,i,{})}}))}(e.keys,y,L):-1===d?function(e,t,n){if("function"!=typeof e.getAll){var i=[];e.openCursor(t).onsuccess=function(e){var t=e.target.result;t?(i.push(t.value),t.continue()):n({target:{result:i}})}}else e.getAll(t).onsuccess=n}(y,i,(function(t){var n=t.target.result;e.descending&&(n=n.reverse()),k(n)})):void tn(y,i,e.descending,d+l,L)}var rn=!1,on=[];function sn(){!rn&&on.length&&(rn=!0,on.shift()())}function an(e,t,n,o){if((e=L(e)).continuous){var s=n+":"+Te();return Zt.addListener(n,s,t,e),Zt.notify(n),{cancel:function(){Zt.removeListener(n,s)}}}var a=e.doc_ids&&new i(e.doc_ids);e.since=e.since||0;var c=e.since,l="limit"in e?e.limit:-1;0===l&&(l=1);var d,u,f,m,p=[],h=0,g=re(e),v=new r;function y(e,t,n,i){if(n.seq!==t)return i();if(n.winningRev===e._rev)return i(n,e);var r=e._id+"::"+n.winningRev;m.get(r).onsuccess=function(e){i(n,zt(e.target.result))}}function b(){e.complete(null,{results:p,last_seq:c})}var _=[Ht,"by-sequence"];e.attachments&&_.push("attach-store");var w=Qt(o,_,"readonly");if(w.error)return e.complete(w.error);(d=w.txn).onabort=Vt(e.complete),d.oncomplete=function(){!e.continuous&&e.attachments?Xt(p).then(b):b()},u=d.objectStore("by-sequence"),f=d.objectStore(Ht),m=u.index("_doc_id_rev"),tn(u,e.since&&!e.descending?IDBKeyRange.lowerBound(e.since,!0):null,e.descending,l,(function(t,n,i){if(i&&t.length){var r=new Array(t.length),o=new Array(t.length),s=0;n.forEach((function(n,c){!function(e,t,n){if(a&&!a.has(e._id))return n();var i=v.get(e._id);if(i)return y(e,t,i,n);f.get(e._id).onsuccess=function(r){i=Wt(r.target.result),v.set(e._id,i),y(e,t,i,n)}}(zt(n),t[c],(function(n,a){o[c]=n,r[c]=a,++s===t.length&&function(){for(var t=[],n=0,s=r.length;nr&&(r=n),t.continue()}}()}function s(){var e=Gt(o,o.winningRev,o.deleted);n.put(e).onsuccess=function(){i.continue()}}}}e._meta=null,e._remote=!1,e.type=function(){return"idb"},e._id=x((function(t){t(null,e._meta.instanceId)})),e._bulkDocs=function(n,i,o){en(t,n,i,e,r,a(o))},e._get=function(e,t,n){var i,o,s,a=t.ctx;if(!a){var c=Qt(r,[Ht,"by-sequence","attach-store"],"readonly");if(c.error)return n(c.error);a=c.txn}function l(){n(s,{doc:i,metadata:o,ctx:a})}a.objectStore(Ht).get(e).onsuccess=function(e){if(!(o=Wt(e.target.result)))return s=ne($,"missing"),l();var n;if(t.rev)n=t.latest?function(e,t){for(var n,i=t.rev_tree.slice();n=i.pop();){var r=n.pos,o=n.ids,s=o[0],a=o[1],c=o[2],l=0===c.length,d=n.history?n.history.slice():[];if(d.push({id:s,pos:r,opts:a}),l)for(var u=0,f=d.length;u=43)},i.onerror=e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)}})).catch((function(){return!1}))}(d)),cn.then((function(e){c=e,f()})),d.oncomplete=function(){u=!0,f()},d.onabort=Vt(n)},m.onerror=function(e){var t=e.target.error&&e.target.error.message;t?-1!==t.indexOf("stored database is a higher version")&&(t=new Error('This DB was created with the newer "indexeddb" adapter, but you are trying to open it with the older "idb" adapter')):t="Failed to open indexedDB, are you in private browsing mode?",P("error",t),n(ne(Z,t))}}(n,e,t)}),t,n.constructor)}un.valid=function(){try{return"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}};var fn={};function mn(e){var t=e.doc||e.ok,n=t&&t._attachments;n&&Object.keys(n).forEach((function(e){var t=n[e];t.data=we(t.data,t.content_type)}))}function pn(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function hn(e){return e._attachments&&Object.keys(e._attachments)?Promise.all(Object.keys(e._attachments).map((function(t){var n=e._attachments[t];if(n.data&&"string"!=typeof n.data)return new Promise((function(e){ke(n.data,e)})).then((function(e){n.data=e}))}))):Promise.resolve()}function gn(e,t){if(function(e){if(!e.prefix)return!1;var t=me(e.prefix).protocol;return"http"===t||"https"===t}(t)){var n=t.name.substr(t.prefix.length);e=t.prefix.replace(/\/?$/,"/")+encodeURIComponent(n)}var i=me(e);(i.user||i.password)&&(i.auth={username:i.user,password:i.password});var r=i.path.replace(/(^\/|\/$)/g,"").split("/");return i.db=r.pop(),-1===i.db.indexOf("%")&&(i.db=encodeURIComponent(i.db)),i.path=r.join("/"),i}function vn(e,t){return yn(e,e.db+"/"+t)}function yn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function bn(e){return"?"+Object.keys(e).map((function(t){return t+"="+encodeURIComponent(e[t])})).join("&")}function _n(t,n){var i=this,r=gn(t.name,t),o=vn(r,"");t=L(t);var a,c=function(e,n){if((n=n||{}).headers=n.headers||new rt,n.credentials="include",t.auth||r.auth){var i=t.auth||r.auth,o=i.username+":"+i.password,s=ve(unescape(encodeURIComponent(o)));n.headers.set("Authorization","Basic "+s)}var a=t.headers||{};return Object.keys(a).forEach((function(e){n.headers.append(e,a[e])})),function(e){var t="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",n=-1!==t.indexOf("msie"),i=-1!==t.indexOf("trident"),r=-1!==t.indexOf("edge"),o=!("method"in e)||"GET"===e.method;return(n||i||r)&&o}(n)&&(e+=(-1===e.indexOf("?")?"?":"&")+"_nonce="+Date.now()),(t.fetch||it)(e,n)};function l(e,t){return C(e,m()((function(e){u().then((function(){return t.apply(this,e)})).catch((function(t){e.pop()(t)}))}))).bind(i)}function d(e,t,n){var i={};return(t=t||{}).headers=t.headers||new rt,t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json"),t.headers.get("Accept")||t.headers.set("Accept","application/json"),c(e,t).then((function(e){return i.ok=e.ok,i.status=e.status,e.json()})).then((function(e){if(i.data=e,!i.ok){i.data.status=i.status;var t=ie(i.data);if(n)return n(t);throw t}if(Array.isArray(i.data)&&(i.data=i.data.map((function(e){return e.error||e.missing?ie(e):e}))),!n)return i;n(null,i.data)}))}function u(){return t.skip_setup?Promise.resolve():a||((a=d(o).catch((function(e){return e&&e.status&&404===e.status?(j(404,"PouchDB is just detecting if the remote exists."),d(o,{method:"PUT"})):Promise.reject(e)})).catch((function(e){return!(!e||!e.status||412!==e.status)||Promise.reject(e)}))).catch((function(){a=null})),a)}function f(e){return e.split("/").map(encodeURIComponent).join("/")}s()((function(){n(null,i)})),i._remote=!0,i.type=function(){return"http"},i.id=l("id",(function(e){c(yn(r,"")).then((function(e){return e.json()})).catch((function(){return{}})).then((function(t){var n=t&&t.uuid?t.uuid+r.db:vn(r,"");e(null,n)}))})),i.compact=l("compact",(function(e,t){"function"==typeof e&&(t=e,e={}),e=L(e),d(vn(r,"_compact"),{method:"POST"}).then((function(){!function n(){i.info((function(i,r){r&&!r.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)}))}()}))})),i.bulkGet=C("bulkGet",(function(e,t){var n=this;function i(t){var n={};e.revs&&(n.revs=!0),e.attachments&&(n.attachments=!0),e.latest&&(n.latest=!0),d(vn(r,"_bulk_get"+bn(n)),{method:"POST",body:JSON.stringify({docs:e.docs})}).then((function(n){e.attachments&&e.binary&&n.data.results.forEach((function(e){e.docs.forEach(mn)})),t(null,n.data)})).catch(t)}function o(){var i=Math.ceil(e.docs.length/50),r=0,o=new Array(i);function s(e){return function(n,s){o[e]=s.results,++r===i&&t(null,{results:oe(o)})}}for(var a=0;at?t:a;var c=vn(r,"_changes"+bn(i)),h={signal:p.signal,method:f,body:JSON.stringify(l)};m=n,e.aborted||u().then((function(){return d(c,h,s)})).catch(s)}},g={results:[]},v=function(n,i){if(!e.aborted){var r=0;if(i&&i.results){r=i.results.length,g.last_seq=i.last_seq;var c=null,l=null;"number"==typeof i.pending&&(c=i.pending),"string"!=typeof g.last_seq&&"number"!=typeof g.last_seq||(l=g.last_seq);e.query_params,i.results=i.results.filter((function(t){a--;var n=re(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&mn(t),e.return_docs&&g.results.push(t),e.onChange(t,c,l)),n}))}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(m=i.last_seq);var d=o&&a<=0||i&&r0?e.slice(n):e}function u(e){var t=e.value;return t&&"object"==typeof t&&t._id||e.id}function f(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&function(e){e.rows.forEach((function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach((function(e){var n=t[e];t[e].data=we(n.data,n.content_type)}))}))}(t),t}}function p(e,t,n,i){var r=t[e];void 0!==r&&(i&&(r=encodeURIComponent(JSON.stringify(r))),n.push(e+"="+r))}function h(e){if(void 0!==e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function g(e,t){var n=e.descending?"endkey":"startkey",i=e.descending?"startkey":"endkey";if(void 0!==e[n]&&void 0!==e[i]&&mt(e[n],e[i])>0)throw new wn("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&!1!==e.reduce){if(e.include_docs)throw new wn("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new wn("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach((function(t){var n=function(e){if(e){if("number"!=typeof e)return new wn('Invalid value for integer: "'+e+'"');if(e<0)return new wn('Invalid value for positive integer: "'+e+'"')}}(e[t]);if(n)throw n}))}function v(e){return function(t){if(404===t.status)return e;throw t}}function y(e,t,n){var r="_local/doc_"+e,o={_id:r,keys:[]},s=n.get(e),a=s[0];return(function(e){return 1===e.length&&/^1-/.test(e[0].rev)}(s[1])?Promise.resolve(o):t.db.get(r).catch(v(o))).then((function(e){return function(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):Promise.resolve({rows:[]})}(e).then((function(t){return function(e,t){for(var n=[],r=new i,o=0,s=t.rows.length;o0&&0===mt(s.key,t)&&a.push(i),n.set(gt(a),s),t=s.key}return n}return p().then((function(){return m.finish()})).then((function(){e.seq=c}))}(e,n)}))()}function w(e,t){return Ln(b(e),(function(){return function(e,t){var i,o=e.reduceFun&&!1!==t.reduce,s=t.skip||0;void 0===t.keys||t.keys.length||(t.limit=0,delete t.keys);function a(t){return t.include_docs=!0,e.db.allDocs(t).then((function(e){return i=e.total_rows,e.rows.map((function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(tn))return e.doc.value}var i=function(e){for(var t=[],n=[],i=0;;){var r=e[i++];if("\0"!==r)switch(r){case"1":t.push(null);break;case"2":t.push("1"===e[i]),i++;break;case"3":var o=vt(e,i);t.push(o.num),i+=o.length;break;case"4":for(var s="";;){var a=e[i];if("\0"===a)break;s+=a,i++}s=s.replace(/\u0001\u0001/g,"\0").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(s);break;case"5":var c={element:[],index:t.length};t.push(c.element),n.push(c);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+r)}else{if(1===t.length)return t.pop();yt(t,n)}}}(e.doc._id);return{key:i[0],id:i[1],value:"value"in e.doc?e.doc.value:null}}))}))}function l(a){var l;if(l=o?function(e,t,i){0===i.group_level&&delete i.group_level;var r=i.group||i.group_level,o=n(e.reduceFun),s=[],a=isNaN(i.group_level)?Number.POSITIVE_INFINITY:i.group_level;t.forEach((function(e){var t=s[s.length-1],n=r?e.key:null;if(r&&Array.isArray(n)&&(n=n.slice(0,a)),t&&0===mt(t.groupKey,n))return t.keys.push([e.key,e.id]),void t.values.push(e.value);s.push({keys:[[e.key,e.id]],values:[e.value],groupKey:n})})),t=[];for(var l=0,u=s.length;l0)||function(e){return e._conflicts&&e._conflicts.length>0}(e.doc)||(e.doc._conflicts&&delete e.doc._conflicts,r.push(e.doc),delete n[e.id])}))}))}return Promise.resolve().then((function(){var e=Object.keys(n).filter((function(e){var t=n[e].missing;return 1===t.length&&Wn(t[0])}));if(e.length>0)return s(e)})).then((function(){var s=function(e){var t=[];return Object.keys(e).forEach((function(n){e[n].missing.forEach((function(e){t.push({id:n,rev:e})}))})),{docs:t,revs:!0,latest:!0}}(n);if(s.docs.length)return e.bulkGet(s).then((function(n){if(i.cancelled)throw new Error("cancelled");return Promise.all(n.results.map((function(n){return Promise.all(n.docs.map((function(n){var i=n.ok;return n.error&&(o=!1),i&&i._attachments?function(e,t,n){var i=ae(t)&&!ae(e),r=Object.keys(n._attachments);return i?e.get(n._id).then((function(i){return Promise.all(r.map((function(r){return function(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}(i,n,r)?t.getAttachment(n._id,r):e.getAttachment(i._id,r)})))})).catch((function(e){if(404!==e.status)throw e;return zn(t,n)})):zn(t,n)}(t,e,i).then((function(e){var t=Object.keys(i._attachments);return e.forEach((function(e,n){var r=i._attachments[t[n]];delete r.stub,delete r.length,r.data=e})),i})):i})))}))).then((function(e){r=r.concat(oe(e).filter(Boolean))}))}))})).then((function(){return{ok:o,docs:r}}))}function Kn(e,t,n,i,r){return e.get(t).catch((function(n){if(404===n.status)return"http"!==e.adapter&&"https"!==e.adapter||j(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:i,_id:t,history:[],replicator:"pouchdb",version:1};throw n})).then((function(o){if(!r.cancelled&&o.last_seq!==n)return o.history=(o.history||[]).filter((function(e){return e.session_id!==i})),o.history.unshift({last_seq:n,session_id:i}),o.history=o.history.slice(0,5),o.version=1,o.replicator="pouchdb",o.session_id=i,o.last_seq=n,e.put(o).catch((function(o){if(409===o.status)return Kn(e,t,n,i,r);throw o}))}))}function Xn(e,t,n,i,r){this.src=e,this.target=t,this.id=n,this.returnValue=i,this.opts=r||{}}Xn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then((function(){return n.updateSource(e,t)}))},Xn.prototype.updateTarget=function(e,t){return this.opts.writeTargetCheckpoint?Kn(this.target,this.id,e,t,this.returnValue):Promise.resolve(!0)},Xn.prototype.updateSource=function(e,t){if(this.opts.writeSourceCheckpoint){var n=this;return Kn(this.src,this.id,e,t,this.returnValue).catch((function(e){if(Zn(e))return n.opts.writeSourceCheckpoint=!1,!0;throw e}))}return Promise.resolve(!0)};var Yn={undefined:function(e,t){return 0===mt(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return function(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history};return function e(t,n){var i=t[0],r=t.slice(1),o=n[0],s=n.slice(1);if(!i||0===n.length)return{last_seq:0,history:[]};if(Qn(i.session_id,n))return{last_seq:i.last_seq,history:t};if(Qn(o.session_id,r))return{last_seq:o.last_seq,history:s};return e(r,s)}(e.history,t.history)}(t,e).last_seq}};function Qn(e,t){var n=t[0],i=t.slice(1);return!(!e||0===t.length)&&(e===n.session_id||Qn(e,i))}function Zn(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}Xn.prototype.getCheckpoint=function(){var e=this;return e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then((function(e){return e.last_seq||0})).catch((function(e){if(404!==e.status)throw e;return 0})):e.target.get(e.id).then((function(t){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?t.last_seq||0:e.src.get(e.id).then((function(e){return t.version!==e.version?0:(n=t.version?t.version.toString():"undefined")in Yn?Yn[n](t,e):0;var n}),(function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:0}).then((function(){return 0}),(function(n){return Zn(n)?(e.opts.writeSourceCheckpoint=!1,t.last_seq):0}));throw n}))})).catch((function(e){if(404!==e.status)throw e;return 0}))};function ei(e,t,n){var i=n.doc_ids?n.doc_ids.sort(mt):"",r=n.filter?n.filter.toString():"",o="",s="",a="";return n.selector&&(a=JSON.stringify(n.selector)),n.filter&&n.query_params&&(o=JSON.stringify(function(e){return Object.keys(e).sort(mt).reduce((function(t,n){return t[n]=e[n],t}),{})}(n.query_params))),n.filter&&"_view"===n.filter&&(s=n.view.toString()),Promise.all([e.id(),t.id()]).then((function(e){var t=e[0]+e[1]+r+s+o+i+a;return new Promise((function(e){Ce(t,e)}))})).then((function(e){return"_local/"+(e=e.replace(/\//g,".").replace(/\+/g,"_"))}))}function ti(e,t,n,i,r){var o,a,c,l=[],d={seq:0,changes:[],docs:[]},u=!1,f=!1,m=!1,p=0,h=n.continuous||n.live||!1,g=n.batch_size||100,v=n.batches_limit||10,y=n.style||"all_docs",b=!1,_=n.doc_ids,w=n.selector,E=[],S=Te();r=r||{ok:!0,start_time:(new Date).toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var k={};function A(){return c?Promise.resolve():ei(e,t,n).then((function(r){a=r;var o={};o=!1===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:"source"===n.checkpoint?{writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:"target"===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:{writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},c=new Xn(e,t,a,i,o)}))}function x(){if(E=[],0!==o.docs.length){var e=o.docs,s={timeout:n.timeout};return t.bulkDocs({docs:e,new_edits:!1},s).then((function(t){if(i.cancelled)throw I(),new Error("cancelled");var n=Object.create(null);t.forEach((function(e){e.error&&(n[e.id]=e)}));var o=Object.keys(n).length;r.doc_write_failures+=o,r.docs_written+=e.length-o,e.forEach((function(e){var t=n[e._id];if(t){r.errors.push(t);var o=(t.name||"").toLowerCase();if("unauthorized"!==o&&"forbidden"!==o)throw t;i.emit("denied",L(t))}else E.push(e)}))}),(function(t){throw r.doc_write_failures+=e.length,t}))}}function C(){if(o.error)throw new Error("There was a problem getting docs.");r.last_seq=p=o.seq;var e=L(r);return E.length&&(e.docs=E,"number"==typeof o.pending&&(e.pending=o.pending,delete o.pending),i.emit("change",e)),u=!0,c.writeCheckpoint(o.seq,S).then((function(){if(i.emit("checkpoint",{checkpoint:o.seq}),u=!1,i.cancelled)throw I(),new Error("cancelled");o=void 0,j()})).catch((function(e){throw R(e),e}))}function N(){return Jn(e,t,o.diffs,i).then((function(e){o.error=!e.ok,e.docs.forEach((function(e){delete o.diffs[e._id],r.docs_read++,o.docs.push(e)}))}))}function O(){var e;i.cancelled||o||(0!==l.length?(o=l.shift(),i.emit("checkpoint",{start_next_batch:o.seq}),(e={},o.changes.forEach((function(t){i.emit("checkpoint",{revs_diff:t}),"_user/"!==t.id&&(e[t.id]=t.changes.map((function(e){return e.rev})))})),t.revsDiff(e).then((function(e){if(i.cancelled)throw I(),new Error("cancelled");o.diffs=e}))).then(N).then(x).then(C).then(O).catch((function(e){q("batch processing terminated with error",e)}))):T(!0))}function T(e){0!==d.changes.length?(e||f||d.changes.length>=g)&&(l.push(d),d={seq:0,changes:[],docs:[]},"pending"!==i.state&&"stopped"!==i.state||(i.state="active",i.emit("active")),O()):0!==l.length||o||((h&&k.live||f)&&(i.state="pending",i.emit("paused")),f&&I())}function q(e,t){m||(t.message||(t.message=e),r.ok=!1,r.status="aborting",l=[],d={seq:0,changes:[],docs:[]},I(t))}function I(o){if(!(m||i.cancelled&&(r.status="cancelled",u)))if(r.status=r.status||"complete",r.end_time=(new Date).toISOString(),r.last_seq=p,m=!0,o){(o=ne(o)).result=r;var s=(o.name||"").toLowerCase();"unauthorized"===s||"forbidden"===s?(i.emit("error",o),i.removeAllListeners()):function(e,t,n,i){if(!1===e.retry)return t.emit("error",n),void t.removeAllListeners();if("function"!=typeof e.back_off_function&&(e.back_off_function=F),t.emit("requestError",n),"active"===t.state||"pending"===t.state){t.emit("paused",n),t.state="stopped";var r=function(){e.current_back_off=0};t.once("paused",(function(){t.removeListener("active",r)})),t.once("active",r)}e.current_back_off=e.current_back_off||0,e.current_back_off=e.back_off_function(e.current_back_off),setTimeout(i,e.current_back_off)}(n,i,o,(function(){ti(e,t,n,i)}))}else i.emit("complete",r),i.removeAllListeners()}function B(e,t,r){if(i.cancelled)return I();"number"==typeof t&&(d.pending=t),re(n)(e)&&(d.seq=e.seq||r,d.changes.push(e),i.emit("checkpoint",{pending_batch:d.seq}),s()((function(){T(0===l.length&&k.live)})))}function M(e){if(b=!1,i.cancelled)return I();if(e.results.length>0)k.since=e.results[e.results.length-1].seq,j(),T(!0);else{var t=function(){h?(k.live=!0,j()):f=!0,T(!0)};o||0!==e.results.length?t():(u=!0,c.writeCheckpoint(e.last_seq,S).then((function(){u=!1,r.last_seq=p=e.last_seq,t()})).catch(R))}}function P(e){if(b=!1,i.cancelled)return I();q("changes rejected",e)}function j(){if(!b&&!f&&l.length1)for(var n=1;na)&&void 0===e.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,c=h,r=f;var v=(1e4*(268435455&(p+=122192928e5))+h)%4294967296;d[l++]=v>>>24&255,d[l++]=v>>>16&255,d[l++]=v>>>8&255,d[l++]=255&v;var y=p/4294967296*1e4&268435455;d[l++]=y>>>8&255,d[l++]=255&y,d[l++]=y>>>24&15|16,d[l++]=y>>>16&255,d[l++]=f>>>8|128,d[l++]=255&f;for(var b=0;b<6;++b)d[l+b]=u[b];return t||Object(s.a)(d)},d=n(11);var u=function(e){if(!Object(d.a)(e))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(e.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(e.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(e.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(e.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n};var f=function(e,t,n){function i(e,i,r,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],n=0;n>>9<<4)+1}function p(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function h(e,t,n,i,r,o){return p((s=p(p(t,e),p(i,o)))<<(a=r)|s>>>32-a,n);var s,a}function g(e,t,n,i,r,o,s){return h(t&n|~t&i,e,t,r,o,s)}function v(e,t,n,i,r,o,s){return h(t&i|n&~i,e,t,r,o,s)}function y(e,t,n,i,r,o,s){return h(t^n^i,e,t,r,o,s)}function b(e,t,n,i,r,o,s){return h(n^(t|~i),e,t,r,o,s)}var _=f("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var n=0;n>5]>>>i%32&255,o=parseInt("0123456789abcdef".charAt(r>>>4&15)+"0123456789abcdef".charAt(15&r),16);t.push(o)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[i/8])<>>32-t}var k=f("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var i=unescape(encodeURIComponent(e));e=[];for(var r=0;r>>0;b=y,y=v,v=S(g,30)>>>0,g=h,h=k}n[0]=n[0]+h>>>0,n[1]=n[1]+g>>>0,n[2]=n[2]+v>>>0,n[3]=n[3]+y>>>0,n[4]=n[4]+b>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),L="00000000-0000-0000-0000-000000000000";var A=function(e){if(!Object(d.a)(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},,function(e,t){ +!function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=88)}([function(e,t,n){"use strict";var i,r="object"==typeof Reflect?Reflect:null,o=r&&"function"==typeof r.apply?r.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};i=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function a(){a.init.call(this)}e.exports=a,e.exports.once=function(e,t){return new Promise((function(n,i){function r(n){e.removeListener(t,o),i(n)}function o(){"function"==typeof e.removeListener&&e.removeListener("error",r),n([].slice.call(arguments))}v(e,t,o,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&v(e,"error",t,n)}(e,r,{once:!0})}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var c=10;function l(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function d(e){return void 0===e._maxListeners?a.defaultMaxListeners:e._maxListeners}function u(e,t,n,i){var r,o,s,a;if(l(n),void 0===(o=e._events)?(o=e._events=Object.create(null),e._eventsCount=0):(void 0!==o.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),o=e._events),s=o[t]),void 0===s)s=o[t]=n,++e._eventsCount;else if("function"==typeof s?s=o[t]=i?[n,s]:[s,n]:i?s.unshift(n):s.push(n),(r=d(e))>0&&s.length>r&&!s.warned){s.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=s.length,a=c,console&&console.warn&&console.warn(a)}return e}function f(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function m(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=f.bind(i);return r.listener=n,i.wrapFn=r,r}function h(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(s=t[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var c=r[e];if(void 0===c)return!1;if("function"==typeof c)o(c,this,t);else{var l=c.length,d=g(c,l);for(n=0;n=0;o--)if(n[o]===t||n[o].listener===t){s=n[o].listener,r=o;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},a.prototype.listeners=function(e){return h(this,e,!0)},a.prototype.rawListeners=function(e){return h(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?i(this._events):[]}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){"use strict";var i,r,o,s=[n(37),n(38),n(39),n(40),n(41),n(42)],a=-1,c=[],l=!1;function d(){i&&r&&(i=!1,r.length?c=r.concat(c):a=-1,c.length&&u())}function u(){if(!i){l=!1,i=!0;for(var e=c.length,t=setTimeout(d);e;){for(r=c,c=[];r&&++a1)for(var n=1;n3){l(o.shift().getId())}const t=document.getElementById("notification-content"),n=document.createElement("div");n.classList.add("neon-notification"),n.classList.add("neon-notification-"+e.type),n.id=e.getId(),n.innerHTML=e.message,t.append(n),t.style.display="",e.display()}(e),e.setTimeoutId(window.setTimeout(l,5e3,e.getId())),document.getElementById(e.getId()).addEventListener("click",()=>{window.clearTimeout(e.timeoutID),l(e.getId())})}function u(e,t="default",n=null){const r=new c(e,t,n);"error"!=r.type&&"warning"!=r.type||(0,i.recordNotification)(r),d(r)}t.Notification=c,t.queueNotification=u,t.default={queueNotification:u}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setSettings=t.getSettings=void 0;let i=null;const r={zoom:100,glyphOpacity:100,imageOpacity:100,circleSize:25,highlightMode:"none",userMode:"edit",insertMode:"punctum",insertTab:"primitiveTab",selectionMode:"selBySyllable",debugMode:!1,displayBBox:!1,displayText:!1,displayInfo:!1,displayErrLog:!1,viewBox:null};t.getSettings=function(){return i.settings},t.setSettings=function(e){i.set(e)},t.default=class{constructor(e){i=this,this.id=e,this.load()}load(){try{const e=JSON.parse(window.localStorage.getItem(this.id));this.sync(e)}catch(e){this.sync({})}}set(e){this.settings=Object.assign(Object.assign({},this.settings),e),window.localStorage.setItem(this.id,JSON.stringify(this.settings))}sync(e){this.settings=Object.assign(Object.assign({},r),e),window.localStorage.setItem(this.id,JSON.stringify(this.settings))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.selectAll=t.selectNn=t.selectBBox=t.getStaffBBox=t.isMultiStaveSelection=t.sharedSecondLevelParent=t.elementsHaveCorrectType=t.sharedLogicalParent=t.areAdjacent=t.isLigature=t.selectNcs=t.select=t.selectLayerElement=t.selectStaff=t.unselect=t.getSelectionType=void 0;const i=n(18),r=n(13),o=n(24),s=n(27),a=n(14),c=n(3),l=n(7);function d(){const e=document.getElementsByClassName("sel-by is-active");return 0!==e.length?e[0].id:null}function u(){document.querySelectorAll(".no-moving").forEach(e=>e.classList.remove("no-moving")),document.querySelectorAll(".selected").forEach(e=>{e.classList.remove("selected"),e.classList.contains("staff")?(e.removeAttribute("style"),i.unhighlight(e)):(e.removeAttribute("style"),e.style.fill=""),Array.from(e.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""}),Array.from(e.querySelectorAll(".sylTextRect-display")).forEach(e=>{e.style.fill="blue"}),e.parentElement.classList.contains("syllable-highlighted")&&(e.parentElement.style.fill="",e.parentElement.classList.add("syllable"),e.parentElement.classList.remove("syllable-highlighted"),Array.from(e.parentElement.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.parentElement.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""})),l.selectAll("#resizeRect").remove(),l.selectAll(".resizePoint").remove(),l.selectAll(".rotatePoint").remove()}),Array.from(document.querySelectorAll(".text-select")).forEach(e=>{e.style.color="",e.style.fontWeight="",e.classList.remove("text-select")}),document.getElementById("selByStaff").classList.contains("is-active")?a.endOptionsSelection():o.endGroupingSelection(),document.getElementById("extraEdit").innerHTML="",document.getElementById("extraEdit").parentElement.classList.add("hidden"),(0,r.updateHighlight)()}function f(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),a.triggerSingleStaffActions(),o.initGroupingListeners(),t.dragInit())}function m(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),t.dragInit())}function h(e,t,n=!0){if(e){if(e.classList.contains("staff"))return f(e,t);if(e.classList.contains("layer"))return m(e,t);if(!e.classList.contains("selected")&&!e.classList.contains("sylTextRect")&&!e.classList.contains("sylTextRect-display")){let t;if(e.classList.add("selected"),e.style.fill="#d00",e.style.stroke=e.classList.contains("divLine")?"#d00":"black",e.querySelectorAll(".sylTextRect-display").length&&e.querySelectorAll(".sylTextRect-display").forEach(e=>{e.style.fill="#d00"}),e.querySelectorAll(".divLine").length&&e.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"}),e.classList.contains("syllable")&&e.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),e.classList.contains("syllable")?t=e.id:null!==e.closest(".syllable")&&(t=e.closest(".syllable").id),void 0!==t){document.querySelectorAll("span."+t).forEach(e=>{e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select")})}}n&&(0,r.updateHighlight)()}}async function p(e,t){const n=await t.getElementAttr(e.id,t.view.getCurrentPageURI());return Boolean(n.ligated)}function g(e,t){if(t.length<2)return!1;switch(e){case"selBySyllable":t.forEach(e=>{if(!e.classList.contains("syllable"))return!1});break;case"selByNeume":t.forEach(e=>{if(!e.classList.contains("neume"))return!1});break;case"selByStaff":t.forEach(e=>{if(!e.classList.contains("staff"))return!1});break;default:return!1}return!0}function v(e){const t=Array.from(e),n=t.pop().parentElement.parentElement;for(const e of t){if(e.parentElement.parentElement.id!==n.id)return!1}return!0}function y(e,t,n){const i=e,r=i.closest(".syl");if(!r.classList.contains("selected")){r.classList.add("selected"),i.style.fill="#d00";const o=e.closest(".syllable");o.style.fill="#d00",o.classList.add("syllable-highlighted"),o.querySelectorAll(".divLine").length&&(o.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),o.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"})),void 0!==n&&(0,s.resize)(r,n,t),void 0!==t&&t.dragInit();const a=e.closest(".syllable").id;if(void 0!==a){const e=document.querySelector("span."+a);e&&(e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select"))}}a.triggerBBoxActions()}t.getSelectionType=d,t.unselect=u,t.selectStaff=f,t.selectLayerElement=m,t.select=h,t.selectNcs=async function(e,t,n){if(!e.parentElement.classList.contains("selected")){const i=e.parentElement;if(u(),h(i),await p(i,t)){const e=i.previousSibling;if(await p(e,t))h(e);else{const e=i.nextSibling;await p(e,t)?h(e):console.warn("Error: Neither prev or next nc are ligatures")}o.triggerGrouping("ligature")}else i.classList.contains("nc")?a.triggerNcActions(i):console.warn("No action triggered!");n.dragInit()}},t.isLigature=p,t.areAdjacent=function(e,t){if(t.length<2)return!1;let n;switch(e){case"selBySyllable":n=Array.from(document.querySelectorAll(".syllable"));break;case"selByNeume":return!0;case"selByNc":n=Array.from(document.querySelectorAll(".nc"));break;case"selByStaff":n=Array.from(document.querySelectorAll(".staff"));break;default:return!1}const i=[];for(let e=0;e!(e.classList.contains("divLine")||e.classList.contains("accid")||e.classList.contains("clef")))))return!1;switch(e){case"selBySyllable":const e=t[0].closest(".staff");for(let n=0;n{const s=e.getAttribute("d").match(/\d+/g).map(e=>Number(e));void 0===o&&(o=Math.atan((s[3]-s[1])/(s[2]-s[0]))),(void 0===n||Math.min(s[1],s[3])r)&&(r=Math.max(s[1],s[3])),(void 0===i||s[2]>i)&&(i=s[2])}),{id:e.id,ulx:t,uly:n,lrx:i,lry:r,rotate:o}},t.selectBBox=y,t.selectNn=function(e){return!(e.length>0)||(e.forEach(e=>{h(e)}),!1)},t.selectAll=async function(e,t,n){const i=d();if(u(),0===e.length)return;let r,l=!1,f=!1;switch(i){case"selBySyllable":r=".syllable";break;case"selByNeume":r=".neume";break;case"selByNc":r=".nc";break;case"selByStaff":r=".staff";break;case"selByBBox":r=".sylTextRect-display";break;case"selByLayerElement":r=".clef, .custos, .accid, .divLine";break;default:return void console.error("Unknown selection type "+i)}const m=new Set;for(const t of e){let e=t.closest(r);if(null===e){if(e=t.closest(".clef, .custos, .accid, .divLine"),null===e){console.warn("Element "+t.id+" is not part of specified group and is not a clef or custos or accid or divLine.");continue}l=l||!0}else f=f||!0;m.add(e);let n=e,i=n.getAttribute("mei:follows"),o=n.getAttribute("mei:precedes");for(;i||o;){if(i){if(n=document.querySelector("#"+i.slice(1)),m.has(n))break;n.classList.add("no-moving"),m.add(n),i=n.getAttribute("mei:follows")}if(o){if(n=document.querySelector("#"+o.slice(1)),m.has(n))break;n.classList.add("no-moving"),m.add(n),o=n.getAttribute("mei:precedes")}}}m.forEach(e=>h(e,n,!1));const p=Array.from(m.values());if(!l||f)switch(i){case"selByStaff":switch(p.length){case 1:a.triggerSingleStaffActions(),o.initGroupingListeners(),(0,s.resize)(p[0],t,n);break;default:a.triggerMultiStaffActions(),o.initGroupingListeners()}break;case"selByLayerElement":1===m.size?a.triggerLayerElementActions(p[0]):a.triggerDefaultActions();break;case"selBySyllable":switch(p.length){case 1:null===p[0].querySelector(".syl > rect")?(c.queueNotification('The selected syllable does not contain a <syl> element, please insert one using button "Add Syllable Text".',"warning"),a.triggerSyllableActions("noSyl"),a.addAddSylListener()):a.triggerSyllableActions("singleSelect");break;default:o.isLinkable("selBySyllable",p)?a.triggerSyllableActions("linkableSelect"):o.isGroupable("selBySyllable",p)?a.triggerSyllableActions("multiSelect"):a.triggerSyllableActions("default")}break;case"selByNeume":switch(p.length){case 1:a.triggerNeumeActions(),o.initGroupingListeners();break;default:o.isGroupable("selByNeume",p)?o.triggerGrouping("neume"):a.triggerDefaultActions()}break;case"selByNc":switch(p.length){case 1:a.triggerNcActions(p[0]);break;case 2:if(v(p)){if(p[0].parentElement===p[1].parentElement){const e=Array.from(p[0].parentElement.children);if(1===Math.abs(e.indexOf(p[0])-e.indexOf(p[1]))){let e=p[0].children[0],t=p[1].children[0],n=e.x.baseVal.value,i=t.x.baseVal.value,r=e.y.baseVal.value,s=t.y.baseVal.value;if((n>i||n===i&&ry(e,n,void 0))}break;default:console.error("Unknown selection type. This should not have occurred.")}else 1===m.size?a.triggerLayerElementActions(p[0]):"selBySyllable"==i?a.triggerDefaultSylActions():a.triggerDefaultActions()}},function(e,t,n){"use strict";e.exports=function(e){return function(){var t=arguments.length;if(t){for(var n=[],i=-1;++i\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',groupingTab:'

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',systemTab:'

\n \n

\n

Click upper left and lower right corners of new staff.

'},t.insertControlsPanel='
\n
INSERT
\n \n \n \n
\n\t
\n \n
',t.editControlsPanel='
\n
EDIT
\n \n \n \n
\n
\n
\n
\n
Selection Mode:
\n
\n\n \n \n \n \n \n\n
\n
\n
\n\n
\n \n \n \x3c!--\n * The extraEdit panel is added for edit options that have dropdown menus\n * Like the Neume and Clef menus\n * This is done because the moreEdit menu needs to have overflow for cases where it has lots of buttons\n * But overflow ruins dropdown menus\n --\x3e\n \n
\n
\n
\n
\n
',t.ncActionContents='\n ',t.defaultNeumeActionContents='
\n \n \n
',t.neumeActionContents='\n
\n \n ',t.defaultActionContents='
\n \n
',t.defaultSylActionContents='\n ',t.custosActionContents='
\n \n \n
',t.layerElementOutActionContents='
\n \n \n \n
',t.layerElementInActionContents='
\n \n \n \n
',t.accidActionContents='\n ',t.staffSplitActionContents='
Split System:
\n
\n \n \n \n
',t.staffMergeActionContents='\n
\n \n \n
',t.columnActionContents='
\n Edit Column Information:\n
\n \n \n \n \n
\n
\n
',t.clefActionContents='\n
\n \n \n
\n ',t.divLineActionContents='\n',t.bboxActionContents='
\n \n \n
',t.groupingMenu={nc:'
\n
\n \n \n
\n
',neume:'
\n
\n \n \n
\n
',syl:'
\n
\n \n \n \n
\n\t\t
',ligatureNc:'
\n
\n \n \n \n
\n
',ligature:'
\n
\n \n \n
\n
',splitSyllable:'
\n
\n \n \n
\n
'},t.addTextModal='
\n \n \n
\n
Cancel
\n
Add
\n
\n
',t.editTextModal='
\n \n \n
\n
Cancel
\n
Save
\n
\n
',t.hotkeysModal='\n
\n \x3c!-- "Display" hotkeys --\x3e\n
\n
Display
\n
\n
\n
Shift
\n
+
\n
+
\n
\n
Zoom In
\n
\n
\n
\n
Shift
\n
+
\n
-
\n
\n
Zoom Out
\n
\n
\n
\n
0
\n
\n
Zoom Reset
\n
\n
\n
\n
h
\n
\n
Hide Glyph
\n
\n
\n
\n
Shift
\n
+
\n
T
\n
\n
Scroll To Syllable Text
\n
\n
\n\n \x3c!-- "Edit" hotkeys --\x3e\n
\n
Edit
\n
\n
\n
Ctrl
\n
+
\n
z
\n
or
\n
\n
+
\n
z
\n
\n
Undo
\n
\n
\n
\n
Ctrl
\n
+
\n
Shift
\n
+
\n
z
\n
or
\n
\n
+
\n
Shift
\n
+
\n
z
\n
\n
Redo
\n
\n
\n
\n
q/w/e/r/t/y
\n
\n
\n Highlight by Staff/Syllable/Neume/LayerElement/Selection/Off\n
\n
\n
\n
\n
1/2/3/4/5/6
\n
\n
\n Select by Syllable/Neume/Neume Component/Staff/Layer Element/BBox\n
\n
\n
\n
\n
Shift
\n
+
\n
Number
\n
\n
\n Begin Insert for the nth Option in the Selected Tab\n
\n
\n
\n
\n
g
\n
\n
\n Group/Ungroup Selected Element(s)\n
\n
\n
\n\n \x3c!-- "Other" hotkeys --\x3e\n
\n
Other
\n
\n
\n
s
\n
\n
Save File
\n
\n
\n
\n
Esc
\n
\n
Return to Edit Mode
\n
\n
\n
',t.syllableActionsContent='\n
\n \n \n \n \n
\n',t.errorLogsPanelContents='
\n
Error Log
\n \n \n \n
\n
'},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalWindow=t.ModalWindowView=void 0;const i=n(8),r=n(33),o=n(5);var s,a;!function(e){e[e.ADD_TEXT=0]="ADD_TEXT",e[e.EDIT_TEXT=1]="EDIT_TEXT",e[e.HOTKEYS=2]="HOTKEYS",e[e.ERROR_LOG=3]="ERROR_LOG",e[e.DOCUMENT_UPLOAD=4]="DOCUMENT_UPLOAD",e[e.MOVE_TO=5]="MOVE_TO",e[e.NEW_FOLDER=6]="NEW_FOLDER",e[e.RENAME=7]="RENAME"}(s=t.ModalWindowView||(t.ModalWindowView={})),function(e){e[e.OPEN=0]="OPEN",e[e.CLOSED=1]="CLOSED"}(a||(a={}));t.ModalWindow=class{constructor(e){this.openAddSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-add").removeEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-add").addEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.openEditSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-save").removeEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-save").addEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.addSylText=function(){const e={action:"addSyl",param:{elementId:document.getElementsByClassName("syllable selected")[0].id,sylText:document.getElementById("neon-modal-window-edit-text-input").value}};this.neonView.edit(e,this.neonView.view.getCurrentPageURI()).then(e=>{e&&this.neonView.updateForCurrentPage().then(()=>{})}),this.hideModalWindow()},this.updateSylText=function(){const e=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0],t=e.textContent.replace(/\u{25CA}/u,"").trim(),n=document.getElementById("neon-modal-window-edit-text-input").value;if(null!==n&&n!==t){const t={action:"setText",param:{elementId:[...e.classList.entries()].filter(e=>"text-select"!==e[1]&&"selected-to-edit"!==e[1])[0][1],text:n}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(t=>{t&&this.neonView.updateForCurrentPage().then(()=>{this.updateSelectedBBox(e,this.dragHandler,this.neonView)})})}else this.updateSelectedBBox(e,this.dragHandler,this.neonView);this.hideModalWindow()},this.keydownListener=function(e){switch(e.stopImmediatePropagation(),this.modalWindowView){case s.ADD_TEXT:"Enter"===e.key&&this.addSylText(),"Escape"===e.key&&this.hideModalWindow();break;case s.EDIT_TEXT:"Enter"===e.key&&this.updateSylText(),"Escape"===e.key&&this.hideModalWindow();break;default:"Escape"===e.key&&this.hideModalWindow()}},this.focusModalWindow=function(){switch(this.modalWindowView){case s.ADD_TEXT:case s.EDIT_TEXT:document.getElementById("neon-modal-window-edit-text-input").select();break;case s.DOCUMENT_UPLOAD:case s.NEW_FOLDER:case s.RENAME:break;default:document.getElementById("neon-modal-window").focus()}},this.neonView=e,this.modalWindowState=a.CLOSED,this.setupEventListeners()}setupEventListeners(){document.getElementById("neon-modal-window-header-close").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").addEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").addEventListener("click",this.focusModalWindow.bind(this))}removeEventListeners(){document.getElementById("neon-modal-window-header-close").removeEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").removeEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").removeEventListener("click",this.focusModalWindow.bind(this))}setModalWindowView(e,t){this.modalWindowView=e,this.setModalWindowContent(t)}getModalWindowView(){return this.modalWindowView.toString()}openModalWindow(){switch(Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),this.modalWindowView){case s.ADD_TEXT:this.openAddSylTextModalWindow();break;case s.EDIT_TEXT:this.openEditSylTextModalWindow();break;case s.HOTKEYS:document.getElementById("neon-modal-window-content-hotkeys").classList.add("visible");case s.DOCUMENT_UPLOAD:case s.MOVE_TO:case s.NEW_FOLDER:case s.RENAME:default:document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()}document.body.style.overflowX="hidden",document.body.style.overflowY="hidden",this.modalWindowState=a.OPEN}hideModalWindow(){switch(this.modalWindowView){case s.EDIT_TEXT:document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].classList.remove("selected-to-edit");break;case s.DOCUMENT_UPLOAD:case s.MOVE_TO:case s.NEW_FOLDER:case s.RENAME:document.getElementById("neon-modal-window-content-container").innerHTML=""}document.getElementById("neon-modal-window-container").style.display="none",document.body.style.overflowX="hidden",document.body.style.overflowY="scroll",this.modalWindowState=a.CLOSED,this.removeEventListeners()}setModalWindowContent(e){const t=document.getElementById("neon-modal-window-content-container"),n=document.getElementById("neon-modal-window-header-title");switch(this.modalWindowView){case s.ADD_TEXT:t.innerHTML=i.addTextModal,n.innerText="ENTER SYLLABLE TEXT";break;case s.EDIT_TEXT:t.innerHTML=i.editTextModal,n.innerText="EDIT SYLLABLE TEXT";const o=/\u{25CA}/u,a=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].textContent.replace(o,"").trim();document.getElementById("neon-modal-window-edit-text-input").value=a;break;case s.HOTKEYS:t.innerHTML=i.hotkeysModal,n.innerText="HOTKEYS";break;case s.ERROR_LOG:t.innerHTML=`
${e}
\n `,n.innerText="ERROR LOG";break;case s.DOCUMENT_UPLOAD:n.innerText="DOCUMENT UPLOAD",t.innerHTML=r.uploadAreaHTML;break;case s.MOVE_TO:n.innerText="MOVE TO";break;case s.NEW_FOLDER:n.innerText="NEW FOLDER",t.innerHTML=r.newFolderHTML;break;case s.RENAME:n.innerText="RENAME",t.innerHTML=r.renameHTML;break;default:console.error("Unknown selection type. This should not have occurred.")}}updateSelectedBBox(e,t,n){(0,o.unselect)();const i=Array.from(e.classList).find(e=>"text-select"!==e&&"selected-to-edit"!==e);if(document.getElementById("displayBBox").checked&&document.getElementById(i)){const e=document.getElementById(i).querySelector(".sylTextRect-display");(0,o.selectBBox)(e,t,n)}}}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";for(var i=n(12),r=[],o=0;o<256;++o)r.push((o+256).toString(16).substr(1));t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!Object(i.a)(n))throw TypeError("Stringified UUID is invalid");return n}},function(e,t,n){"use strict";var i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.a=function(e){return"string"==typeof e&&i.test(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initDisplayControls=t.loadHighlightSettings=t.updateDisplayAllBtn=t.updateHighlight=t.setHighlightSelectionControls=t.setHighlightControls=t.setHighlightOption=t.getHighlightType=t.setCircleSizeControls=t.setBgOpacityFromSlider=t.setGlyphOpacityFromSlider=t.setZoomControls=void 0;const i=n(18),r=n(4),o=n(7);let s,a,c;function l(e){const t=document.getElementById("opacityOutput");document.getElementById("opacitySlider").value=t.value,(0,r.setSettings)({glyphOpacity:Number(t.value)});const n=document.querySelector("#toggle-glyph-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show glyph")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide glyph"));try{document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=(Number(t.value)/100).toString()})}catch(e){console.warn("Unable to properly set opacity to pages")}}function d(e){const t=document.querySelector("#bgOpacityOutput");(0,r.setSettings)({imageOpacity:Number(t.value)});const n=document.querySelector("#toggle-bg-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show background image")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide background image"));const i=document.querySelector("."+e);i&&(i.style.opacity=String(Number(t.value)/100))}function u(e){const t=document.getElementById("highlight-"+e),n=document.getElementById("highlight-dropdown"),o=document.getElementById("highlight-type");if((0,r.setSettings)({highlightMode:e}),n.classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),"none"===e)return o.textContent=" - Off",void i.unsetGroupingHighlight();t.classList.add("highlight-selected"),o.textContent=" - "+(e[0].toUpperCase()+e.slice(1)),i.setGroupingHighlight(e)}function f(e){document.getElementById("highlight-"+e).addEventListener("click",()=>{u(e)})}function m(){document.body.removeEventListener("click",m),document.getElementById("highlight-dropdown").classList.remove("is-active")}function h(){const e=document.getElementById("highlight-dropdown");document.getElementById("highlight-button").addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("is-active"),e.classList.contains("is-active")?(document.body.addEventListener("click",m),f("column"),f("staff"),f("syllable"),f("neume"),f("layerElement"),f("none")):document.body.removeEventListener("click",m)})}function p(){const{highlightMode:e}=(0,r.getSettings)();u(e)}t.setZoomControls=function(e){if(void 0===e)return;const t=document.getElementById("zoomSlider"),n=document.getElementById("zoomOutput"),{zoom:i}=(0,r.getSettings)();t.value=String(i),n.value=String(i),e.zoomTo(i/100),document.getElementById("reset-zoom").addEventListener("click",()=>{n.value="100",t.value="100",e.resetZoomAndPan()}),document.querySelector("#set-zoom-easy-edit").addEventListener("click",()=>{n.value="180",t.value="180",e.zoomTo(1.8)}),t.addEventListener("mouseup",(function(){n.value=t.value,e.zoomTo(Number(n.value)/100)})),t.disabled=!1,document.body.addEventListener("keydown",i=>{const r=parseInt(n.value);if("ArrowUp"===i.key||"ArrowDown"===i.key||"ArrowRight"===i.key||"ArrowLeft"===i.key)i.preventDefault();else if("+"===i.key){const i=Math.min(r+20,parseInt(t.getAttribute("max")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else if("_"===i.key){const i=Math.max(r-20,parseInt(t.getAttribute("min")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else"0"===i.key&&(n.value="100",t.value="100",e.resetZoomAndPan())})},t.setGlyphOpacityFromSlider=l,t.setBgOpacityFromSlider=d,t.setCircleSizeControls=function(){const e=document.getElementById("circleSlider"),t=document.getElementById("circleOutput"),{circleSize:n}=(0,r.getSettings)();function i(){t.value=e.value,c=Number(e.value),(0,r.setSettings)({circleSize:Number(c)});const n=o.selectAll(".resizePoint");n.empty()||n.attr("r",c)}c=n,e.value=String(n),t.value=String(n),document.getElementById("reset-circle-size").addEventListener("click",()=>{const n=o.selectAll(".resizePoint");n.empty()||n.attr("r",25),c=Number(25),e.value=String(25),t.value=String(25),(0,r.setSettings)({circleSize:Number(25)}),i()}),e.addEventListener("input",i),e.addEventListener("change",i),e.disabled=!1},t.getHighlightType=function(){return document.getElementById("highlight-type").textContent.slice(3).toLowerCase()},t.setHighlightOption=f,t.setHighlightControls=h,t.setHighlightSelectionControls=function(){const e=document.getElementById("highlight-selection");e.addEventListener("click",()=>{document.getElementById("highlight-dropdown").classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),e.classList.add("highlight-selected"),document.getElementById("highlight-type").textContent=" - Selection",i.setGroupingHighlight("selection")})},t.updateHighlight=function(){let e;try{e=document.querySelector(".highlight-selected").id}catch(t){e=""}switch(e){case"highlight-column":i.setGroupingHighlight("column");break;case"highlight-staff":i.setGroupingHighlight("staff");break;case"highlight-syllable":i.setGroupingHighlight("syllable");break;case"highlight-neume":i.setGroupingHighlight("neume");break;case"highlight-layerElement":i.setGroupingHighlight("layerElement");break;case"highlight-selection":i.setGroupingHighlight("selection");break;default:i.unsetGroupingHighlight()}},t.updateDisplayAllBtn=function(){const e=document.getElementById("display-all-btn"),t=document.getElementById("displayInfo"),n=document.getElementById("displayBBox"),i=document.getElementById("displayText"),r=document.getElementById("display-errors");(null==t?void 0:t.checked)&&(null==n?void 0:n.checked)&&(null==i?void 0:i.checked)&&(null==r?void 0:r.checked)?(e.classList.add("selected"),e.innerHTML="Hide All"):e.classList.contains("selected")&&(e.classList.remove("selected"),e.innerHTML="Display All")},t.loadHighlightSettings=p,t.initDisplayControls=function(e,t){!function(e){const t=document.getElementById("opacitySlider"),n=document.getElementById("opacityOutput"),{glyphOpacity:i}=(0,r.getSettings)();function o(){n.value=t.value,s=Number(t.value),l(e)}s=i,t.value=String(i),n.value=String(i);const a=document.getElementById("toggle-glyph-opacity");100==i&&a.classList.add("hide-icon"),null==a||a.addEventListener("click",()=>{let i;a.classList.contains("hide-icon")?(a.classList.remove("hide-icon"),i=0):(a.classList.add("hide-icon"),i=1),document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=i.toString()}),s=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({glyphOpacity:100*i}),o()}),t.addEventListener("input",o),t.addEventListener("change",o),t.disabled=!1}(e),function(e){const t=document.getElementById("bgOpacitySlider"),n=document.getElementById("bgOpacityOutput"),{imageOpacity:i}=(0,r.getSettings)();function o(){n.value=t.value,a=Number(t.value),d(e)}a=i,t.value=String(i),n.value=String(i);const s=document.getElementById("toggle-bg-opacity");100==i&&s.classList.add("hide-icon"),s.addEventListener("click",()=>{let i;s.classList.contains("hide-icon")?(s.classList.remove("hide-icon"),i=0):(s.classList.add("hide-icon"),i=1),document.getElementsByClassName(e)[0].style.opacity=i.toString(),a=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({imageOpacity:100*i}),o()}),t.addEventListener("input",o),t.addEventListener("change",o),t.disabled=!1}(t),h(),document.getElementById("burgerMenu").addEventListener("click",()=>{document.getElementById("burgerMenu").classList.toggle("is-active"),document.getElementById("navMenu").classList.toggle("is-active")}),document.body.addEventListener("keydown",e=>{if(!e.metaKey)switch(e.key){case"q":u("staff");break;case"w":u("syllable");break;case"e":u("neume");break;case"r":u("layerElement");break;case"t":u("selection");break;case"y":u("none")}}),function(){const e=document.querySelector("#display-all-btn");e.addEventListener("click",()=>{if(e.classList.contains("selected")){e.classList.remove("selected"),e.innerHTML="Display All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked&&e.click()})}else{e.classList.add("selected"),e.innerHTML="Hide All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked||e.click()})}})}(),p();const n=document.getElementById("displayContents"),i=document.getElementById("toggleDisplay");document.getElementById("displayHeader").addEventListener("click",e=>{e.stopPropagation(),n.classList.contains("closed")?(n.classList.remove("closed"),n.style.padding="0.5em 0.75em",setTimeout(()=>{n.style.overflow="visible"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(n.classList.add("closed"),n.style.overflow="hidden",setTimeout(()=>{n.style.padding="0px"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.triggerDefaultActions=t.triggerDefaultSylActions=t.triggerBBoxActions=t.triggerSingleStaffActions=t.triggerStaffSplitMode=t.triggerMultiStaffActions=t.triggerLayerElementActions=t.triggerSyllableActions=t.triggerNeumeActions=t.triggerNcActions=t.addChangeStaffListener=t.addAddSylListener=t.matchHeightHandler=t.moveOutsideSyllableHandler=t.insertToSyllableHandler=t.changeStaffHandler=t.removeHandler=t.endOptionsSelection=t.deleteButtonHandler=t.unsetLiquescentAnticlockwiseAction=t.unsetLiquescentClockwiseAction=t.unsetVirgaReversedAction=t.unsetVirgaAction=t.unsetInclinatumAction=t.initNeonView=void 0;const i=n(8),r=n(24),o=n(3),s=n(35),a=n(36),c=n(5),l=n(9);let d;function u(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function f(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function m(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function h(e){return{action:"set",param:{elementId:e,attrType:"curve",attrValue:""}}}function p(e){return{action:"setLiquescent",param:{elementId:e,curve:""}}}function g(e){"d"!==e.key&&"Backspace"!==e.key||(y(),e.preventDefault())}function v(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden")),document.body.removeEventListener("keydown",g)}function y(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{t.classList.contains("syl")&&(t=t.closest(".syllable")),t.classList.contains("accid")&&(t=t.closest(".accid")),t.classList.contains("divLine")&&(t=t.closest(".divLine")),e.push({action:"remove",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),d.edit(t,d.view.getCurrentPageURI()).then(()=>{d.updateForCurrentPage()})}function b(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"changeStaff",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),d.edit(t,d.view.getCurrentPageURI()).then(()=>{d.updateForCurrentPage()})}function w(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"insertToSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Insert Success","success"):o.default.queueNotification("Insert Failed XoX","error"),v(),d.updateForCurrentPage()})}function _(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"moveOutsideSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Move Success","success"):o.default.queueNotification("Move Failed XoX","error"),v(),d.updateForCurrentPage()})}function E(){const e=Array.from(document.getElementsByClassName("selected"));e.length>1&&o.default.queueNotification("Cannot match height to multiple bbox","error");const t={action:"matchHeight",param:{elementId:e[0].id}};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Height Match Success","success"):o.default.queueNotification("Height Match Failed XoX","error"),v(),d.updateForCurrentPage()})}function S(){const e=d.modal;e.setModalWindowView(l.ModalWindowView.ADD_TEXT),e.openModalWindow()}function k(){const e=document.getElementById("delete");e&&(e.removeEventListener("click",y),e.addEventListener("click",y),document.body.addEventListener("keydown",g))}function L(){const e=document.getElementById("changeStaff");null==e||e.removeEventListener("click",b),null==e||e.addEventListener("click",b)}function A(){const e=document.getElementById("col-input"),t=document.querySelectorAll(".staff.selected");let n;for(const e of t){const t=Array.from(e.classList).join(" ").match(/\bcolumn(\d+)\b/);if(t){const e=parseInt(t[1],10);if(n&&n!=e){document.getElementById("col-warning").innerText="The selected staves are not of the same column!",n=0;break}n=e}}n&&(e.value=n.toString())}function x(){const e=document.getElementById("col-decrement"),t=document.getElementById("col-increment"),n=document.getElementById("col-confirm"),i=document.getElementById("col-input");function r(e){let t=parseInt(i.value,10)||0;t+=e,t=Math.min(Math.max(t,1),5),t.toString()!=i.value&&(n.style.display=""),i.value=t.toString()}e.addEventListener("click",(function(){r(-1)})),t.addEventListener("click",(function(){r(1)})),n.addEventListener("click",(function(){const e=[];document.querySelectorAll(".staff.selected").forEach(t=>{e.push({action:"set",param:{elementId:t.id,attrType:"type",attrValue:"column"+i.value}})});const t={action:"chain",param:e};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Column Value Update Success","success"):o.default.queueNotification("Column Value Update Failed XoX","error"),v(),d.updateForCurrentPage()})}))}function C(e,t,n=!0){const i=document.getElementById(e);i&&(i.parentElement.classList.remove("hidden"),n?i.innerHTML=t:i.innerHTML+=t)}function T(e){d.edit(e,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}function N(){const e=document.querySelector(".staff.selected");if(null!==e){new s.SplitStaffHandler(d,e).startSplit(),v()}else console.error("No staff was selected!"),v()}function O(){document.querySelectorAll(".drop_select").forEach(e=>{const t=()=>{document.body.removeEventListener("click",t),e.classList.remove("is-active")};e.addEventListener("click",n=>{e.classList.toggle("is-active"),Array.from(document.querySelectorAll(".drop_select")).filter(t=>t!==e).forEach(e=>e.classList.remove("is-active")),n.stopPropagation(),e.classList.contains("is-active")?document.body.addEventListener("click",t):document.body.removeEventListener("click",t)})})}t.initNeonView=function(e){d=e,r.initNeonView(e)},t.unsetInclinatumAction=u,t.unsetVirgaAction=f,t.unsetVirgaReversedAction=m,t.unsetLiquescentClockwiseAction=h,t.unsetLiquescentAnticlockwiseAction=p,t.deleteButtonHandler=g,t.endOptionsSelection=v,t.removeHandler=y,t.changeStaffHandler=b,t.insertToSyllableHandler=w,t.moveOutsideSyllableHandler=_,t.matchHeightHandler=E,t.addAddSylListener=function(){const e=document.getElementById("addSyl");null==e||e.removeEventListener("click",S),null==e||e.addEventListener("click",S)},t.addChangeStaffListener=L,t.triggerNcActions=function(e){v(),C("moreEdit",i.defaultActionContents),C("extraEdit",i.ncActionContents),k(),document.querySelector("#Punctum.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=m(e.id),r=h(e.id),s=p(e.id);d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#Inclinatum.dropdown-item").addEventListener("click",()=>{const t=f(e.id),n=m(e.id),i=h(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"se"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#Virga.dropdown-item").addEventListener("click",()=>{const t=m(e.id),n=u(e.id),i=h(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"s"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#VirgaReversed.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=h(e.id),r=p(e.id),s={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"n"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#LiquescentClockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=m(e.id),r=p(e.id),s={action:"setLiquescent",param:{elementId:e.id,curve:"c"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#LiquescentAnticlockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=f(e.id),i=m(e.id),r=h(e.id),s={action:"setLiquescent",param:{elementId:e.id,curve:"a"}};d.edit({action:"chain",param:[t,n,i,r,s]},d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Shape Changed","success"):o.default.queueNotification("Shape Change Failed","error"),v(),d.updateForCurrentPage()})}),O()},t.triggerNeumeActions=function(){v(),C("moreEdit",i.defaultNeumeActionContents),C("extraEdit",i.neumeActionContents),k();const e=document.querySelectorAll(".selected");function t(t){const n={action:"changeGroup",param:{elementId:e[0].id,contour:t}};d.edit(n,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Grouping Changed","success"):o.default.queueNotification("Grouping Failed","error"),v(),d.updateForCurrentPage()})}1===e.length?(document.getElementById("split-neume").addEventListener("click",()=>{const e=document.querySelector(".neume.selected");if(null!==e){new a.SplitNeumeHandler(d,e).startSplit(),v()}else console.error("No staff was selected!"),v()}),document.querySelector("#Pes.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#PesSubpunctis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Clivis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Scandicus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusFlexus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusSubpunctis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Climacus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#ClimacusResupinus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Torculus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#TorculusResupinus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Porrectus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusFlexus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusSubpunctis.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),document.querySelector("#Pressus.dropdown-item").addEventListener("click",e=>{t(d.info.getContourByValue(e.target.id))}),O()):console.warn("More than one neume selected! Cannot trigger Neume ClickSelect actions.")},t.triggerSyllableActions=function(e){v(),C("moreEdit",i.syllableActionsContent);let t="";switch(e){case"noSyl":t+='
\n \n \n
';break;case"singleSelect":t+='
\n \n \n \n
';break;case"linkableSelect":t+='
\n \n \n \n
';break;case"multiSelect":t+='
\n \n \n \n
';break;case"default":t+='
\n \n \n
'}C("moreEdit",t,!0),L(),k(),r.initGroupingListeners()},t.triggerLayerElementActions=function(e){var t,n,r,s;if(v(),e.classList.contains("custos"))return C("moreEdit",i.custosActionContents),L(),void k();C("moreEdit",e.parentElement.classList.contains("syllable")?i.layerElementInActionContents:i.layerElementOutActionContents,!1),e.classList.contains("accid")?(C("extraEdit",i.accidActionContents),function(e){document.querySelector("#ChangeToFlat.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"f"}})}),document.querySelector("#ChangeToNatural.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"n"}})}),O()}(e)):e.classList.contains("clef")?(C("extraEdit",i.clefActionContents),function(e){document.querySelector("#increment-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"above"}};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Clef octave incremented.","success"):o.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#decrement-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"below"}};d.edit(t,d.view.getCurrentPageURI()).then(e=>{e?o.default.queueNotification("Clef octave decremented.","success"):o.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),d.updateForCurrentPage()})}),document.querySelector("#CClef.dropdown-item").addEventListener("click",()=>{T({action:"setClef",param:{elementId:e.id,shape:"C"}})}),document.querySelector("#FClef.dropdown-item").addEventListener("click",()=>{T({action:"setClef",param:{elementId:e.id,shape:"F"}})}),O()}(e)):e.classList.contains("divLine")&&(C("extraEdit",i.divLineActionContents),function(e){document.querySelector("#ChangeToMinima.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"minima"}})}),document.querySelector("#ChangeToMaior.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maior"}})}),document.querySelector("#ChangeToMaxima.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maxima"}})}),document.querySelector("#ChangeToFinalis.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"finalis"}})}),document.querySelector("#ChangeToCaesura.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"caesura"}})}),document.querySelector("#ChangeToVirgula.dropdown-item").addEventListener("click",()=>{T({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"virgula"}})}),O()}(e)),L(),null===(t=document.getElementById("insertToSyllable"))||void 0===t||t.addEventListener("click",w),null===(n=document.getElementById("moveOutsideSyllable"))||void 0===n||n.addEventListener("click",_),k(),L(),null===(r=document.getElementById("insertToSyllable"))||void 0===r||r.addEventListener("click",w),null===(s=document.getElementById("moveOutsideSyllable"))||void 0===s||s.addEventListener("click",_)},t.triggerMultiStaffActions=function(){v(),C("moreEdit",i.staffMergeActionContents),C("extraEdit",i.columnActionContents),k(),A(),x(),document.getElementById("merge-systems").addEventListener("click",()=>{r.mergeStaves()})},t.triggerStaffSplitMode=N,t.triggerSingleStaffActions=function(){v(),C("moreEdit",i.staffSplitActionContents),C("extraEdit",i.columnActionContents),k(),A(),x(),document.getElementById("split-system").addEventListener("click",()=>{N()}),document.getElementById("reset-rotate").addEventListener("click",()=>{const e=document.querySelector(".staff.selected"),t=(0,c.getStaffBBox)(e),n=Math.tan(t.rotate)*(t.lrx-t.ulx);if(null!==e){const i={action:"resizeRotate",param:{elementId:e.id,ulx:t.ulx,uly:t.rotate>0?t.uly+n/2:t.uly-n/2,lrx:t.lrx,lry:t.rotate>0?t.lry-n/2:t.lry+n/2,rotate:0}};d.edit(i,d.view.getCurrentPageURI()).then(async e=>{e&&await d.updateForCurrentPage()}),v()}else console.error("No staff was selected"),v()})},t.triggerBBoxActions=function(){v(),C("moreEdit",i.bboxActionContents),k(),document.getElementById("matchHeight").addEventListener("click",()=>{E()})},t.triggerDefaultSylActions=function(){v(),C("moreEdit",i.defaultSylActionContents),k(),L()},t.triggerDefaultActions=function(){v(),C("moreEdit",i.defaultActionContents),k()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getGlyphBBox=t.isOutOfSVGBounds=t.getStaffByCoords=t.getStaffIdByCoords=t.getSVGRelCoords=void 0;const i=n(5);function r(e,t){const n=new DOMPoint(e,t),i=document.querySelector(".active-page > .definition-scale").querySelector(".page-margin"),{x:r,y:o}=n.matrixTransform(i.getScreenCTM().inverse());return{x:r,y:o}}function o(e,t){const n=Array.from(document.querySelectorAll(".staff")).map(e=>(0,i.getStaffBBox)(e)),{x:o,y:s}=r(e,t),a=n.find(e=>o<=e.lrx&&o>=e.ulx&&s<=e.lry&&s>=e.uly);return a?a.id:null}t.getSVGRelCoords=r,t.getStaffIdByCoords=o,t.getStaffByCoords=function(e,t){const n=o(e,t);return document.querySelector("#"+n)},t.isOutOfSVGBounds=function(e,t){const n=document.querySelector("#bgimg");return e<=0||e>=Number(n.getAttribute("width"))||t<=0||t>=Number(n.getAttribute("height"))},t.getGlyphBBox=function(e){const t="rect"==e.tagName?e.getBBox():e.parentNode.getBBox();return{ulx:t.x,uly:t.y,lrx:t.x+t.width,lry:t.y+t.height}}},function(e,t,n){e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function n(e,t){var n=e[0],i=e[1],r=e[2],o=e[3];i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[0]-680876936|0)<<7|n>>>25)+i|0)&i|~n&r)+t[1]-389564586|0)<<12|o>>>20)+n|0)&n|~o&i)+t[2]+606105819|0)<<17|r>>>15)+o|0)&o|~r&n)+t[3]-1044525330|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[4]-176418897|0)<<7|n>>>25)+i|0)&i|~n&r)+t[5]+1200080426|0)<<12|o>>>20)+n|0)&n|~o&i)+t[6]-1473231341|0)<<17|r>>>15)+o|0)&o|~r&n)+t[7]-45705983|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[8]+1770035416|0)<<7|n>>>25)+i|0)&i|~n&r)+t[9]-1958414417|0)<<12|o>>>20)+n|0)&n|~o&i)+t[10]-42063|0)<<17|r>>>15)+o|0)&o|~r&n)+t[11]-1990404162|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&r|~i&o)+t[12]+1804603682|0)<<7|n>>>25)+i|0)&i|~n&r)+t[13]-40341101|0)<<12|o>>>20)+n|0)&n|~o&i)+t[14]-1502002290|0)<<17|r>>>15)+o|0)&o|~r&n)+t[15]+1236535329|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[1]-165796510|0)<<5|n>>>27)+i|0)&r|i&~r)+t[6]-1069501632|0)<<9|o>>>23)+n|0)&i|n&~i)+t[11]+643717713|0)<<14|r>>>18)+o|0)&n|o&~n)+t[0]-373897302|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[5]-701558691|0)<<5|n>>>27)+i|0)&r|i&~r)+t[10]+38016083|0)<<9|o>>>23)+n|0)&i|n&~i)+t[15]-660478335|0)<<14|r>>>18)+o|0)&n|o&~n)+t[4]-405537848|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[9]+568446438|0)<<5|n>>>27)+i|0)&r|i&~r)+t[14]-1019803690|0)<<9|o>>>23)+n|0)&i|n&~i)+t[3]-187363961|0)<<14|r>>>18)+o|0)&n|o&~n)+t[8]+1163531501|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i&o|r&~o)+t[13]-1444681467|0)<<5|n>>>27)+i|0)&r|i&~r)+t[2]-51403784|0)<<9|o>>>23)+n|0)&i|n&~i)+t[7]+1735328473|0)<<14|r>>>18)+o|0)&n|o&~n)+t[12]-1926607734|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[5]-378558|0)<<4|n>>>28)+i|0)^i^r)+t[8]-2022574463|0)<<11|o>>>21)+n|0)^n^i)+t[11]+1839030562|0)<<16|r>>>16)+o|0)^o^n)+t[14]-35309556|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[1]-1530992060|0)<<4|n>>>28)+i|0)^i^r)+t[4]+1272893353|0)<<11|o>>>21)+n|0)^n^i)+t[7]-155497632|0)<<16|r>>>16)+o|0)^o^n)+t[10]-1094730640|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[13]+681279174|0)<<4|n>>>28)+i|0)^i^r)+t[0]-358537222|0)<<11|o>>>21)+n|0)^n^i)+t[3]-722521979|0)<<16|r>>>16)+o|0)^o^n)+t[6]+76029189|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((o=((o+=((n=((n+=(i^r^o)+t[9]-640364487|0)<<4|n>>>28)+i|0)^i^r)+t[12]-421815835|0)<<11|o>>>21)+n|0)^n^i)+t[15]+530742520|0)<<16|r>>>16)+o|0)^o^n)+t[2]-995338651|0)<<23|i>>>9)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[0]-198630844|0)<<6|n>>>26)+i|0)|~r))+t[7]+1126891415|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[14]-1416354905|0)<<15|r>>>17)+o|0)|~n))+t[5]-57434055|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[12]+1700485571|0)<<6|n>>>26)+i|0)|~r))+t[3]-1894986606|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[10]-1051523|0)<<15|r>>>17)+o|0)|~n))+t[1]-2054922799|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[8]+1873313359|0)<<6|n>>>26)+i|0)|~r))+t[15]-30611744|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[6]-1560198380|0)<<15|r>>>17)+o|0)|~n))+t[13]+1309151649|0)<<21|i>>>11)+r|0,i=((i+=((o=((o+=(i^((n=((n+=(r^(i|~o))+t[4]-145523070|0)<<6|n>>>26)+i|0)|~r))+t[11]-1120210379|0)<<10|o>>>22)+n|0)^((r=((r+=(n^(o|~i))+t[2]+718787259|0)<<15|r>>>17)+o|0)|~n))+t[9]-343485551|0)<<21|i>>>11)+r|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=r+e[2]|0,e[3]=o+e[3]|0}function i(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function r(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function o(e){var t,r,o,s,a,c,l=e.length,d=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=l;t+=64)n(d,i(e.substring(t-64,t)));for(r=(e=e.substring(t-64)).length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t>2]|=e.charCodeAt(t)<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(n(d,o),t=0;t<16;t+=1)o[t]=0;return s=(s=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(s[2],16),c=parseInt(s[1],16)||0,o[14]=a,o[15]=c,n(d,o),d}function s(e){var n,i="";for(n=0;n<4;n+=1)i+=t[e>>8*n+4&15]+t[e>>8*n&15];return i}function a(e){var t;for(t=0;td?new ArrayBuffer(0):(r=d-l,o=new ArrayBuffer(r),s=new Uint8Array(o),a=new Uint8Array(this,l,r),s.set(a),o)}}(),d.prototype.append=function(e){return this.appendBinary(c(e)),this},d.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,r=this._buff.length;for(t=64;t<=r;t+=64)n(this._hash,i(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},d.prototype.end=function(e){var t,n,i=this._buff,r=i.length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);return this._finish(o,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},d.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},d.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},d.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},d.prototype._finish=function(e,t){var i,r,o,s=t;if(e[s>>2]|=128<<(s%4<<3),s>55)for(n(this._hash,e),s=0;s<16;s+=1)e[s]=0;i=(i=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(i[2],16),o=parseInt(i[1],16)||0,e[14]=r,e[15]=o,n(this._hash,e)},d.hash=function(e,t){return d.hashBinary(c(e),t)},d.hashBinary=function(e,t){var n=a(o(e));return t?l(n):n},d.ArrayBuffer=function(){this.reset()},d.ArrayBuffer.prototype.append=function(e){var t,i,o,s,a,c=(i=this._buff.buffer,o=e,s=!0,(a=new Uint8Array(i.byteLength+o.byteLength)).set(new Uint8Array(i)),a.set(new Uint8Array(o),i.byteLength),s?a:a.buffer),l=c.length;for(this._length+=e.byteLength,t=64;t<=l;t+=64)n(this._hash,r(c.subarray(t-64,t)));return this._buff=t-64>2]|=i[t]<<(t%4<<3);return this._finish(o,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},d.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.ArrayBuffer.prototype.getState=function(){var e,t=d.prototype.getState.call(this);return t.buff=(e=t.buff,String.fromCharCode.apply(null,new Uint8Array(e))),t},d.ArrayBuffer.prototype.setState=function(e){return e.buff=function(e,t){var n,i=e.length,r=new ArrayBuffer(i),o=new Uint8Array(r);for(n=0;n>2]|=e[t]<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(n(d,o),t=0;t<16;t+=1)o[t]=0;return s=(s=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(s[2],16),c=parseInt(s[1],16)||0,o[14]=a,o[15]=c,n(d,o),d}(new Uint8Array(e)));return t?l(i):i},d}()},function(e,t,n){"use strict";function i(e){if(16!==e.length)return"";function t(e,t){return e+t.toString(16).padStart(2,"0")}return e.slice(0,4).reduce(t,"")+"-"+e.slice(4,6).reduce(t,"")+"-"+e.slice(6,8).reduce(t,"")+"-"+e.slice(8,10).reduce(t,"")+"-"+e.slice(10).reduce(t,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.uuidv4=void 0,t.uuidv4=function(){if(void 0===window.crypto)return i(new Uint8Array(16));const e=new Uint8Array(16),t=Uint8Array.from([parseInt("01000000",2),parseInt("10000000",2),parseInt("00001111",2),parseInt("00111111",2)]);return window.crypto.getRandomValues(e),e[6]=e[6]&t[2]|t[0],e[8]=e[8]&t[3]|t[1],i(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setGroupingHighlight=t.setStaffHighlight=t.highlight=t.unsetGroupingHighlight=t.unsetStaffHighlight=t.unhighlight=void 0;const i=["rgb(230, 159, 0)","rgb(86, 180, 233)","rgb(0, 158, 115)","rgb(240, 228, 66)","rgb(0, 114, 178)","rgb(213, 94, 0)","rgb(204, 121, 167)"];function r(e){let t;t=e?e.querySelectorAll(":not(.selected) .highlighted"):document.querySelectorAll(":not(.selected) .highlighted"),t.forEach(e=>{if("path"!==e.tagName||e.closest(".staff").classList.contains("selected"))if(e.classList.contains("divLine")&&!e.closest(".staff").classList.contains("selected"))e.setAttribute("stroke","#000000");else{e.removeAttribute("fill");let t=e.querySelectorAll(".sylTextRect-display");if(!t.length)try{t=e.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(e){t=[]}t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")}))}else e.setAttribute("stroke","#000000");e.classList.remove("highlighted")})}function o(){r()}function s(){o();Array.from(document.getElementsByClassName("highlighted")).filter(e=>!e.parentElement.classList.contains("selected")).forEach(e=>{e.setAttribute("#d00",null);let t=e.querySelectorAll(".sylTextRect-display");t.length||null!==e.closest(".syllable")&&(t=e.closest(".syllable").querySelectorAll("sylTextRect-display")),t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")})),e.classList.remove("highlighted"),e.querySelectorAll("sylTextRect-display").forEach(e=>{e.classList.remove("highlighted")})}),Array.from(document.getElementsByClassName("selected")).forEach(e=>{e.setAttribute("fill","")})}function a(e,t){const n=Array.from(e.children);for(let e=0;ee.querySelectorAll(".divLine")).forEach(e=>{n.push(e)});else{if(i.classList.contains("resizePoint")||"resizeRect"===i.id||i.classList.contains("rotatePoint"))return;if(i.classList.contains("layer"))Array.from(i.children).forEach(e=>{n.push(e)});else if(document.getElementsByClassName("highlight-selected").length&&"highlight-neume"===document.getElementsByClassName("highlight-selected")[0].id&&i.classList.contains("syllable"))Array.from(i.children).filter(e=>e.classList.contains("neume")).forEach(e=>{n.push(e)});else{i.setAttribute("fill",t);let e=i.querySelectorAll(".sylTextRect-display");if(!e.length)try{e=i.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(t){e=[]}e.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||(e.style.fill=t,e.classList.add("highlighted"))}))}}i.classList.add("highlighted")}let i;i="30px",e.querySelectorAll(".nc, .custos, .clef, .accid").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width",i)})}function c(){const e=Array.from(document.getElementsByClassName("staff"));for(let t=0;t{const n=Array.from(t.classList).join(" ").match(/\bcolumn(\d+)\b/);let i=0;n&&(i=parseInt(n[1],10)-1),e[i]||(e[i]=[]),e[i].push(t)});for(const[t,n]of Object.entries(e)){const e=i[Number(t)%i.length];for(const t of n)a(t,e)}}();if("selection"===t){switch(document.querySelector(".sel-by.is-active").id){case"selBySyllable":case"selByBBox":t="syllable";break;case"selByColumn":t="column";break;case"selByStaff":t="staff";break;case"selByLayerElement":t="layerElement";break;case"selByNeume":default:t="neume"}return void e(t)}let n;n="layerElement"==t?document.querySelectorAll(".accid, .clef, .custos, .divLine"):document.getElementsByClassName(t),document.querySelectorAll(".nc, .custos, .clef, .accid, .divLine").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width","30px")});for(let e=0;e{e.classList.add("highlighted")})}const r=n[e].querySelectorAll(".divLine");if(r)for(let e=0;e=0;o--)s=0===o?"":",",t.push({obj:i[o],prefix:s});t.push({val:"["})}else{for(c in a=[],i)i.hasOwnProperty(c)&&a.push(c);for(t.push({val:"}"}),o=a.length-1;o>=0;o--)d=i[l=a[o]],u=o>0?",":"",u+=JSON.stringify(l)+":",t.push({obj:d,prefix:u});t.push({val:"{"})}return f},t.parse=function(e){for(var t,n,r,o,s,a,c,l,d,u=[],f=[],m=0;;)if("}"!==(t=e[m++])&&"]"!==t&&void 0!==t)switch(t){case" ":case"\t":case"\n":case":":case",":break;case"n":m+=3,i(null,u,f);break;case"t":m+=3,i(!0,u,f);break;case"f":m+=4,i(!1,u,f);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",m--;;){if(r=e[m++],!/[\d\.\-e\+]/.test(r)){m--;break}n+=r}i(parseFloat(n),u,f);break;case'"':for(o="",s=void 0,a=0;'"'!==(c=e[m++])||"\\"===s&&a%2==1;)o+=c,"\\"===(s=c)?a++:a=0;i(JSON.parse('"'+o+'"'),u,f);break;case"[":l={element:[],index:u.length},u.push(l.element),f.push(l);break;case"{":d={element:{},index:u.length},u.push(d.element),f.push(d);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===u.length)return u.pop();i(u.pop(),u,f)}}},function(e,t,n){"use strict";var i=n(20),r=n(11);t.a=function(e,t,n){var o=(e=e||{}).random||(e.rng||i.a)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){n=n||0;for(var s=0;s<16;++s)t[n+s]=o[s];return t}return Object(r.a)(o)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),o=n(3),s=n(5);t.default=class{constructor(e,t){this.dragStartCoords=[-1,-1],this.neonView=e,this.selector=t}dragInit(){const e=i.drag().on("start",function(){this.dragStartCoords=[i.event.x,i.event.y],this.dx=0,this.dy=0,i.event.sourceEvent.target.classList.contains("staff")&&i.select(this.selector).call(e)}.bind(this)).on("drag",this.dragging.bind(this)).on("end",this.dragEnded.bind(this));i.selectAll(".selected").call(e);let t=Array.from(document.querySelectorAll(".selected"));this.noMovePrecedes=t.filter(e=>e.classList.contains("no-moving")&&e.hasAttribute("mei:precedes")),t=t.filter(e=>!e.classList.contains("no-moving")),this.selection=t.concat(Array.from(document.querySelectorAll(".resizePoint")))}dragging(){this.dx=i.event.x-this.dragStartCoords[0],this.dy=i.event.y-this.dragStartCoords[1],this.moveElements(this.selection,this.dx,this.dy);if(0===this.selection.filter(e=>e.classList.contains("syl")).length&&0===this.noMovePrecedes.length){const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));this.moveElements(e,-this.dx,-this.dy)}}dragEnded(){const e=Math.abs(this.dx),t=Math.abs(this.dy);if(e<=5&&t<=5)return this.reset(),void this.dragInit();const n=this.selection.filter(e=>!e.classList.contains("resizePoint"));if(this.isCursorOutOfBounds()||this.isDragOutOfBounds(n)){this.returnElements(this.selection);const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));return this.returnElements(e),this.reset(),this.dragInit(),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Drag action failed.","error")}const i=[];n.forEach(e=>{const t={action:"drag",param:{elementId:"rect"===e.tagName?e.closest(".syl").id:e.id,x:this.dx,y:-this.dy}};i.push(t)});const r={action:"chain",param:i};this.neonView.edit(r,this.neonView.view.getCurrentPageURI()).then(async()=>{const e=Array.from(document.querySelectorAll(".selected")).filter(e=>!e.classList.contains("no-moving")).map(e=>e.id);await this.neonView.updateForCurrentPage(),this.endOptionsSelection(),this.reset(),await this.reselect(e),this.dragInit()})}async reselect(e){const t=e.map(e=>document.querySelector("#"+e));t.filter(e=>!e.classList.contains("syl")).forEach(async()=>await(0,s.selectAll)(t,this.neonView,this)),t.filter(e=>e.classList.contains("syl")).forEach(e=>(0,s.selectBBox)(e.querySelector(".sylTextRect-display"),this,this.neonView)),t.filter(e=>e.classList.contains("staff")).forEach(e=>(0,s.selectStaff)(e,this))}resetTo(e){this.resetToAction=e}reset(){void 0!==this.resetToAction&&i.select(this.selector).call(this.resetToAction)}endOptionsSelection(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden"))}moveElements(e,t,n){e.filter(e=>null!==e).forEach(e=>{e.setAttribute("transform",`translate(${t},${n})`)})}returnElements(e){e.filter(e=>null!==e).forEach(e=>{e.removeAttribute("transform")})}isCursorOutOfBounds(){const e=this.dragStartCoords[0]+this.dx,t=this.dragStartCoords[1]+this.dy;return(0,r.isOutOfSVGBounds)(e,t)}isDragOutOfBounds(e){let t=document.querySelector("#displayBBox").checked?"use, rect":"use";e[0].classList.contains("staff")&&(t="path");const n=e.reduce((e,n)=>e.concat(...n.querySelectorAll(t)),[]).map(r.getGlyphBBox).reduce((e,t)=>({ulx:Math.min(e.ulx,t.ulx),uly:Math.min(e.uly,t.uly),lrx:Math.max(e.lrx,t.lrx),lry:Math.max(e.lry,t.lry)}),{ulx:Number.MAX_VALUE,uly:Number.MAX_VALUE,lrx:Number.MIN_VALUE,lry:Number.MIN_VALUE}),{ulx:i,uly:o,lrx:s,lry:a}=n;return(0,r.isOutOfSVGBounds)(i+this.dx,o+this.dy)||(0,r.isOutOfSVGBounds)(s+this.dx,a+this.dy)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initGroupingListeners=t.endGroupingSelection=t.triggerGrouping=t.mergeStaves=t.isLinkable=t.canBeLinked=t.isLinked=t.isGroupable=t.initNeonView=void 0;const i=n(8),r=n(34),o=n(3),s=n(5),a=n(14),c=n(14);let l;function d(e,t){if(Array.from(t.values()).length<2)return!1;switch(e){case"selByNeume":if(s.sharedLogicalParent(e,t))return!1;default:return!!s.areAdjacent(e,t)}}function u(e,t){switch(t||(t=Array.from(document.querySelectorAll(".selected"))),e){case"selBySyllable":for(const e of t)if(e.hasAttribute("mei:follows")||e.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNeume":for(const e of t)if(e.parentElement.hasAttribute("mei:follows")||e.parentElement.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNc":for(const e of t)if(e.parentElement.parentElement.hasAttribute("mei:follows")||e.parentElement.parentElement.hasAttribute("mei:precedes"))return o.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1}}function f(e){for(const t of e)if(!t.hasAttribute("mei:precedes")&&!t.hasAttribute("mei:follows"))return!1;return!0}function m(e){e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1});const t=Array.from(document.querySelectorAll(".staff")),n=Array.from(document.querySelectorAll(".syllable"));for(let i=0;i!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));const i=e.filter(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(1!==i.length)return!1;const r=i[0];return 0===e.indexOf(r)||e.indexOf(r)===e.length-1}function h(e,t){return!(t.length<2)&&("selBySyllable"===e&&(function(e){e.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING?1:0);for(let t=0;te.id===i&&(r=t,!0));if(!o)return!0;if(!o.hasAttribute("mei:follows"))return!0;if(o.getAttribute("mei:follows")!="#"+n.id)return!0;if(r!==t+1)return!0}if(n.hasAttribute("mei:follows")){const t=n.getAttribute("mei:follows").replace("#",""),i=e.find(e=>e.id===t);if(!i)return!0;if(!i.hasAttribute("mei:precedes"))return!0;if(i.getAttribute("mei:precedes")!="#"+n.id)return!0}return!1}}(t)?(o.queueNotification("The selected syllables include invalid linked syllable(s)!","warning"),!1):!!f(t)||!!m(t)))}function p(){const e=document.querySelectorAll(".staff.selected"),t=[];e.forEach(e=>{t.push(e.id)});const n={action:"merge",param:{elementIds:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?(o.queueNotification("Staff Merged","success"),a.endOptionsSelection(),l.updateForCurrentPage()):o.queueNotification("Merge Failed","error")})}function g(){const e=document.getElementById("moreEdit");e.innerHTML="",e.parentElement.classList.add("hidden"),document.body.removeEventListener("keydown",c.deleteButtonHandler),document.body.removeEventListener("keydown",y)}function v(){const e=document.getElementById("delete");e.removeEventListener("click",c.removeHandler),e.addEventListener("click",c.removeHandler),document.body.addEventListener("keydown",c.deleteButtonHandler),document.body.addEventListener("keydown",y);try{document.getElementById("mergeSyls").addEventListener("click",()=>{if(u(s.getSelectionType()))return;b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNeumes").addEventListener("click",()=>{if(u(s.getSelectionType()))return;b("group","neume",E().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNcs").addEventListener("click",()=>{b("group","nc",E().filter(e=>document.getElementById(e).classList.contains("nc")))})}catch(e){}try{document.getElementById("ungroupNeumes").addEventListener("click",()=>{b("ungroup","neume",S())})}catch(e){}try{document.getElementById("ungroupNcs").addEventListener("click",()=>{b("ungroup","nc",S())})}catch(e){}try{document.getElementById("toggle-ligature").addEventListener("click",async()=>{const e={action:"toggleLigature",param:{elementIds:E()}};l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?o.queueNotification("Ligature Toggled","success"):o.queueNotification("Ligature Toggle Failed","error"),g(),l.updateForCurrentPage()})})}catch(e){}try{document.getElementById("toggle-link").addEventListener("click",()=>{_()})}catch(e){}}t.initNeonView=function(e){l=e},t.isGroupable=d,t.isLinked=f,t.canBeLinked=m,t.isLinkable=h,t.mergeStaves=p,t.triggerGrouping=function(e){const t=document.getElementById("moreEdit");t.parentElement.classList.remove("hidden"),t.innerHTML+=i.groupingMenu[e],v()},t.endGroupingSelection=g,t.initGroupingListeners=v;const y=function(e){if("g"===e.key){const e=Array.from(document.querySelectorAll(".selected"));if(0==e.length)return;const t=s.getSelectionType();if(u(t,e))return;switch(t){case"selBySyllable":if(h(t,e))_();else if(d(t,e)){b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))}else if(1===e.length){b("ungroup","neume",S())}break;case"selByNeume":if(d(t,e)){b("group","neume",E())}else{b("ungroup","nc",S())}break;case"selByNc":if(d(t,e)){b("group","nc",E())}else{b("ungroup","nc",S())}break;case"selByStaff":d(t,e)?p():a.triggerStaffSplitMode();break;default:return void console.error(`Can't perform grouping/ungrouping action on selection type ${t}.`)}}};function b(e,t,n){const i={action:e,param:{groupType:t,elementIds:n}};l.edit(i,l.view.getCurrentPageURI()).then(i=>{if(i?"group"===e?o.queueNotification("Grouping Success","success"):o.queueNotification("Ungrouping Success","success"):"group"===e?o.queueNotification("Grouping Failed","error"):o.queueNotification("Ungrouping Failed","error"),l.updateForCurrentPage(),"nc"===t){const e=document.getElementById(n[0]).parentElement,t=Array.from(e.children);void 0===l.info.getContour(t)&&r.groupingNotRecognized()}g()})}function w(e){const t=document.getElementById(e);return t instanceof SVGGraphicsElement?t:null}function _(){const e=E(),t={action:"chain",param:[]},n=new Array,i=e.map(w).filter(e=>null!==e);if(f(i))n.push(...function(e){const t=new Array;for(const n of e){const e=document.getElementById(n);e.getAttribute("mei:precedes")&&t.push({action:"set",param:{elementId:n,attrType:"precedes",attrValue:""}}),e.getAttribute("mei:follows")&&(t.push({action:"set",param:{elementId:n,attrType:"follows",attrValue:""}}),t.push({action:"setText",param:{elementId:n,text:""}}))}return t}(e));else{const[e,t]=function(e){if(e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}),2===e.length)return[e[0],e[1]];const t=e.find(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(t){const n=e.indexOf(t);if(0===n)return[e[n],e[n+1]];if(n===e.length-1)return[e[n-1],e[n]]}}(i);console.log(e.id,t.id),n.push({action:"set",param:{elementId:e.id,attrType:"precedes",attrValue:"#"+t.id}}),n.push({action:"set",param:{elementId:t.id,attrType:"follows",attrValue:"#"+e.id}});const r=t.querySelector(".syl");null!==r&&n.push({action:"remove",param:{elementId:r.id}})}t.param=n,l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?o.queueNotification("Toggled Syllable Link","success"):o.queueNotification("Failed to Toggle Syllable Link","error"),g(),l.updateForCurrentPage()})}function E(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push(t.id)}),e}function S(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{if(t.classList.contains("divLine")||t.classList.contains("accid")||t.classList.contains("clef"))return;Array.from(t.children).forEach(t=>{e.push(t.id)})}),e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemManager=t.FileSystemTools=t.EntryType=void 0;var i=n(89);Object.defineProperty(t,"EntryType",{enumerable:!0,get:function(){return i.EntryType}});var r=n(90);Object.defineProperty(t,"FileSystemTools",{enumerable:!0,get:function(){return r.FileSystemTools}});var o=n(91);Object.defineProperty(t,"FileSystemManager",{enumerable:!0,get:function(){return o.FileSystemManager}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateErrorLogVisibility=t.initDisplayListener=t.initErrorLogControls=t.initErrorLog=t.recordNotification=void 0;const i=n(8),r=n(4),o=n(9);function s(e){const t=document.createElement("div");t.classList.add("notification-container"),t.innerHTML=`\n
\n
${e.message}
\n
\n
\n\n
\n
\n \n
\n\n
\n \n
\n
\n `;const n=t.querySelector(".log-remove");if(n.onclick=()=>t.remove(),n.addEventListener("mouseover",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-open.svg")}),n.addEventListener("mouseout",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-closed.svg")}),e.logInfo){const i=t.querySelector(".notif-log-info-icon");i.style.display="",n.style.height="20px",i.addEventListener("mouseover",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-dark.svg")}),i.addEventListener("mouseout",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-light.svg")}),i.addEventListener("click",()=>function(e){const t=new o.ModalWindow;t.setModalWindowView(o.ModalWindowView.ERROR_LOG,e),t.openModalWindow()}(e.logInfo))}return t}function a(){const e=document.querySelector("#error_log"),t=document.querySelector("#errorLogHeading"),n=t.querySelector("svg > use"),i=document.querySelector("#errorLogContents"),{displayErrLog:o}=(0,r.getSettings)();o&&e.classList.add("visible"),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),c()}function c(){const e=document.querySelector("#display-single-container"),t=document.createElement("label"),n=document.createElement("input");n.classList.add("checkbox"),t.classList.add("checkbox-container","side-panel-btn"),t.textContent="Errors",n.id="display-errors",n.type="checkbox",n.checked=!1,t.appendChild(n),e.append(t);const{displayErrLog:i}=(0,r.getSettings)();n.checked=i,n.addEventListener("click",()=>{(0,r.setSettings)({displayErrLog:n.checked}),l()})}function l(){const e=document.querySelector("#error_log"),{debugMode:t,displayErrLog:n,displayInfo:i,displayBBox:o,displayText:s}=(0,r.getSettings)(),a=document.getElementById("display-all-btn");t?n?(e.classList.add("visible"),i&&o&&s&&n&&(a.classList.add("selected"),a.innerHTML="Hide All")):(e.classList.remove("visible"),a.classList.contains("selected")&&(a.classList.remove("selected"),a.innerHTML="Display All")):(e.classList.remove("visible"),i&&o&&s?(a.classList.add("selected"),a.innerHTML="Hide All"):(a.classList.remove("selected"),a.innerHTML="Display All"))}t.recordNotification=function(e){document.querySelector("#errorLogContents").prepend(s(e))},t.initErrorLog=function(){document.querySelector("#error_log").innerHTML=i.errorLogsPanelContents,a()},t.initErrorLogControls=a,t.initDisplayListener=c,t.updateErrorLogVisibility=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resize=void 0;const i=n(5),r=n(7),o=n(15),s=n(3),a=n(4),c={TopLeft:0,Top:1,TopRight:2,Right:3,BottomRight:4,Bottom:5,BottomLeft:6,Left:7};function l(e,t,n,i,r){let o;if(r>=0)o=[{x:e,y:t,name:c.TopLeft},{x:(e+n)/2,y:t+(n-e)/2*Math.sin(r),name:c.Top},{x:n,y:t+(n-e)*Math.sin(r),name:c.TopRight},{x:n,y:(t+i+(n-e)*Math.sin(r))/2,name:c.Right},{x:n,y:i,name:c.BottomRight},{x:(e+n)/2,y:i-(n-e)/2*Math.sin(r),name:c.Bottom},{x:e,y:i-(n-e)*Math.sin(r),name:c.BottomLeft},{x:e,y:(t+i-(n-e)*Math.sin(r))/2,name:c.Left}];else{const s=(n-e)*Math.tan(Math.abs(r)),a=i-t-s;o=[{x:e,y:t+s,name:c.TopLeft},{x:(e+n)/2,y:t+s/2,name:c.Top},{x:n,y:t,name:c.TopRight},{x:n,y:t+a/2,name:c.Right},{x:n,y:t+a,name:c.BottomRight},{x:(e+n)/2,y:i-s/2,name:c.Bottom},{x:e,y:i,name:c.BottomLeft},{x:e,y:i-a/2,name:c.Left}]}return o}t.resize=function(e,t,n){let d,u,f,m,h,p,g,v,y,b,w,_,E,S,k;function L(){const e=l(d,u,f,m,h),t=e.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");document.querySelector("#resizeRect").setAttribute("points",t);const n=document.querySelector(".syl.selected > .sylTextRect-display");n&&(n.setAttribute("x",String(Math.min(d,f))),n.setAttribute("y",String(Math.min(u,m))),n.setAttribute("width",String(Math.abs(f-d))),n.setAttribute("height",String(Math.abs(m-u))));for(const t in c){const n=e[c[t]];r.select("#p-"+t).filter(".resizePoint").attr("cx",n.x).attr("cy",n.y)}let i=e[3].x,o=e[3].y;const s=i+100+","+(o+85)+" "+(i+70)+","+(o+50)+" "+(i+100)+","+(o+15)+" "+(i+130)+","+(o+50);i=e[7].x,o=e[7].y;const a=i-100+","+(o-15)+" "+(i-130)+","+(o-50)+" "+(i-100)+","+(o-85)+" "+(i-70)+","+(o-50);r.select("#rotateLeft").attr("points",a),r.select("#rotateRight").attr("points",s)}!function A(){if(null===e)return;if(r.selectAll(".resizePoint").remove(),r.selectAll("#resizeRect").remove(),r.selectAll(".rotatePoint").remove(),e.classList.contains("syl")){const t=e.querySelector(".sylTextRect-display");if(null===t)return void console.warn("Tried to draw resize rect for a sylTextRect that doesn't exist (or isn't displaying)");d=Number(t.getAttribute("x")),u=Number(t.getAttribute("y")),f=+d+ +t.getAttribute("width"),m=+u+ +t.getAttribute("height"),h=0}if(e.classList.contains("staff")){const t=(0,i.getStaffBBox)(e);d=t.ulx,u=t.uly,f=t.lrx,m=t.lry;const n=e.querySelector("path").getAttribute("d").match(/\d+/g).map(e=>Number(e));h=Math.atan((n[3]-n[1])/(n[2]-n[0]))}let x;p=d,y=u,g=f,b=m;const C=l(d,u,f,m,h);E=C[2].x-C[0].x;const T=C.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");r.select("#"+e.id).append("polygon").attr("points",T).attr("id","resizeRect").attr("stroke","black").attr("stroke-width",10).attr("fill","none").style("cursor","move").style("stroke-dasharray","20 10");const{circleSize:N}=(0,a.getSettings)();for(const t in c){const n=C[c[t]];r.select(e.viewportElement).append("circle").attr("cx",n.x).attr("cy",n.y).attr("r",N).attr("stroke","black").attr("stroke-width",4).attr("fill","#0099ff").attr("class","resizePoint").attr("id","p-"+t)}for(const e in c)r.select("#p-"+e).filter(".resizePoint").call(r.drag().on("start",()=>{O(e)}).on("drag",q).on("end",I.bind(this)));if(e.classList.contains("staff")){let t=C[3].x,n=C[3].y;const i=t+100+","+(n+85)+" "+(t+70)+","+(n+50)+" "+(t+100)+","+(n+15)+" "+(t+130)+","+(n+50);t=C[7].x,n=C[7].y;const o=t-100+","+(n-15)+" "+(t-130)+","+(n-50)+" "+(t-100)+","+(n-85)+" "+(t-70)+","+(n-50);r.select("#"+e.id).append("polygon").attr("points",i).attr("id","rotateRight").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#"+e.id).append("polygon").attr("points",o).attr("id","rotateLeft").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#rotateLeft").call(r.drag().on("start",B).on("drag",(function(){const e=r.mouse(this)[1]-w,t=k-Math.atan(e/E);t>-.2&&t<.2&&(S=e,u=_+S,h=t,h>=0?(u=S+C.filter(e=>e.name===c.TopLeft)[0].y,m=C.filter(e=>e.name===c.BottomRight)[0].y):(u=C.filter(e=>e.name===c.TopRight)[0].y,m=S+C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M)),r.select("#rotateRight").call(r.drag().on("start",B).on("drag",(function(){const e=r.mouse(this)[1]-w,t=k+Math.atan(e/E);t>-.2&&t<.2&&(S=e,h=t,h>=0?(m=S+C.filter(e=>e.name===c.BottomRight)[0].y,u=C.filter(e=>e.name===c.TopLeft)[0].y):(u=S+C.filter(e=>e.name===c.TopRight)[0].y,m=C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M))}function O(e){x=e;const t=C.find(t=>t.name===c[e]);v=[t.x,t.y],y=u,b=m}function q(){const e=r.mouse(this);switch(c[x]){case c.TopLeft:d=e[0],u=e[1];break;case c.Top:u=e[1]-(f-d)*Math.tan(h)/2;break;case c.TopRight:f=e[0],u=e[1]-(f-d)*Math.tan(h);break;case c.Right:f=e[0],m=b+(e[0]-v[0])*Math.tan(h);break;case c.BottomRight:f=e[0],m=e[1];break;case c.Bottom:m=e[1]+(f-d)*Math.tan(h)/2;break;case c.BottomLeft:d=e[0],m=e[1]+(f-d)*Math.tan(h);break;case c.Left:d=e[0],u=y+(e[0]-v[0])*Math.tan(h);break;default:console.error("Something that wasn't a side of the rectangle was dragged. This shouldn't happen.")}L()}function I(){if((0,o.isOutOfSVGBounds)(d,u)||(0,o.isOutOfSVGBounds)(f,m))return d=p,u=y,f=g,m=b,L(),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Resize action failed.","error");const r={action:"resize",param:{elementId:e.id,ulx:d,uly:u,lrx:f,lry:m}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{if(r&&await t.updateForCurrentPage(),e=document.querySelector("#"+e.id),d=void 0,u=void 0,f=void 0,m=void 0,A(),e.classList.contains("syl"))(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this);else{(0,i.selectAll)([document.querySelector("#"+e.id)],t,n);const r=document.querySelector("moreEdit");r&&(r.innerHTML="",r.parentElement.classList.add("hidden"))}})}function B(){const e=r.event.sourceEvent.target.id;w=r.mouse(this)[1],b=m,y=u,_="rotateRight"===e?m:u,k=h}function M(){if(void 0===S&&(S=0),(0,o.isOutOfSVGBounds)(d,u)||(0,o.isOutOfSVGBounds)(f,m))return document.querySelectorAll(".resizePoint").forEach(e=>e.remove()),document.querySelectorAll("#resizeRect").forEach(e=>e.remove()),document.querySelectorAll(".rotatePoint").forEach(e=>e.remove()),e=document.getElementById(e.id),d=void 0,u=void 0,f=void 0,m=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Rotate action failed.","error");const r={action:"resizeRotate",param:{elementId:e.id,ulx:d,uly:u,lrx:f,lry:m,rotate:180*h/Math.PI}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{r&&await t.updateForCurrentPage(),e=document.getElementById(e.id),d=void 0,u=void 0,f=void 0,m=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n)})}}()}},function(e,t,n){"use strict";n.r(t),function(e){var i,r,o=n(2),s=n.n(o),a=n(22),c=n(16),l=n.n(c),d=n(21),u=n.n(d),f=n(6),m=n.n(f),h=n(1),p=n.n(h),g=n(0),v=n.n(g);function y(e){return"$"+e}function b(e){return e.substring(1)}function w(){this._store={}}function _(e){if(this._store=new w,e&&Array.isArray(e))for(var t=0,n=e.length;tb(e))},w.prototype.delete=function(e){var t=y(e),n=t in this._store;return delete this._store[t],n},w.prototype.forEach=function(e){for(var t=Object.keys(this._store),n=0,i=t.length;n=d.length)){var n=Math.min(u+6,d.length),i=d.slice(u,n);!function(n,i){n.forEach((function(n,r){var s=i+r,a=o.get(n),d=T(a[0],["atts_since","attachments"]);d.open_revs=a.map((function(e){return e.rev})),d.open_revs=d.open_revs.filter(O);var u=O;0===d.open_revs.length&&(delete d.open_revs,u=q),["revs","attachments","binary","ajax","latest"].forEach((function(e){e in t&&(d[e]=t[e])})),e.get(n,d,(function(e,t){var i,r,o;i=e?[{error:e}]:u(t),r=n,o=i,c[s]={id:r,docs:o},l(),f()}))}))}(i,u),u+=i.length}}f()}try{localStorage.setItem("_pouch_check_localstorage",1),N=!!localStorage.getItem("_pouch_check_localstorage")}catch(e){N=!1}function B(){return N}function M(){v.a.call(this),this._listeners={},function(e){B()&&addEventListener("storage",(function(t){e.emit(t.key)}))}(this)}function P(e){if("undefined"!=typeof console&&"function"==typeof console[e]){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function F(e){var t=0;return e||(t=2e3),function(e,t){return e=parseInt(e,10)||0,(t=parseInt(t,10))!=t||t<=e?t=(e||1)<<1:t+=1,t>6e5&&(e=3e5,t=6e5),~~((t-e)*Math.random()+e)}(e,t)}function D(e,t){P("info","The above "+e+" is totally normal. "+t)}p()(M,v.a),M.prototype.addListener=function(e,t,n,i){if(!this._listeners[t]){var r=this,o=!1;this._listeners[t]=a,this.on(e,a)}function a(){if(r._listeners[t])if(o)o="waiting";else{o=!0;var e=T(i,["style","include_docs","attachments","conflicts","filter","doc_ids","view","since","query_params","binary","return_docs"]);n.changes(e).on("change",(function(e){e.seq>i.since&&!i.cancelled&&(i.since=e.seq,i.onChange(e))})).on("complete",(function(){"waiting"===o&&s()(a),o=!1})).on("error",(function(){o=!1}))}}},M.prototype.removeListener=function(e,t){t in this._listeners&&(v.a.prototype.removeListener.call(this,e,this._listeners[t]),delete this._listeners[t])},M.prototype.notifyLocalWindows=function(e){B()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},M.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)};var j="function"==typeof Object.assign?Object.assign:function(e){for(var t=Object(e),n=1;n0||i0||i>>1],t)<0?r=i+1:o=i;return r}(e,t,n);e.splice(i,0,t)}function Re(e,t){for(var n,i,r=t,o=e.length;r0;){var r=n.pop(),o=r.tree1,s=r.tree2;(o[1].status||s[1].status)&&(o[1].status="available"===o[1].status||"available"===s[1].status?"available":"missing");for(var a=0;a0;){var p=h.pop();if(0!==p.diff)for(var g=p.ids[2],v=0,y=g.length;vt){n||(n={});var d=l.length-t;a={pos:c.pos+d,ids:Re(l,d)};for(var u=0;u0&&i.emit("error",t)):i.emit("complete",n),i.removeAllListeners(),e.removeListener("destroyed",o)}));function o(){i.cancel()}n&&(i.on("complete",(function(e){n(null,e)})),i.on("error",n)),e.once("destroyed",o),t.onChange=function(e,t,n){i.isCancelled||function(e,t,n,i){try{e.emit("change",t,n,i)}catch(e){P("error",'Error in .on("change", function):',e)}}(i,e,t,n)};var s=new Promise((function(e,n){t.complete=function(t,i){t?n(t):e(i)}}));i.once("cancel",(function(){e.removeListener("destroyed",o),t.complete(null,{status:"cancelled"})})),this.then=s.then.bind(s),this.catch=s.catch.bind(s),this.then((function(e){r(null,e)}),r),e.taskqueue.isReady?i.validateChanges(t):e.taskqueue.addTask((function(e){e?t.complete(e):i.isCancelled?i.emit("cancel"):i.validateChanges(t)}))}function Ke(e,t,n){var i=[{rev:e._rev}];"all_docs"===n.style&&(i=Me(t.rev_tree).map((function(e){return{rev:e.rev}})));var r={id:t.id,changes:i,doc:e};return Ge(t,e._rev)&&(r.deleted=!0),n.conflicts&&(r.doc._conflicts=Pe(t),r.doc._conflicts.length||delete r.doc._conflicts),r}function Xe(e,t){return et?1:0}function Ye(e,t){return function(n,i){n||i[0]&&i[0].error?((n=n||i[0]).docId=t,e(n)):e(null,i.length?i[0]:i)}}function Qe(e,t){var n=Xe(e._id,t._id);return 0!==n?n:Xe(e._revisions?e._revisions.start:0,t._revisions?t._revisions.start:0)}function Ze(){for(var e in v.a.call(this),Ze.prototype)"function"==typeof this[e]&&(this[e]=this[e].bind(this))}function et(){this.isReady=!1,this.failed=!1,this.queue=[]}function tt(e,t){if(!(this instanceof tt))return new tt(e,t);var n=this;if(t=t||{},e&&"object"==typeof e&&(e=(t=e).name,delete t.name),void 0===t.deterministic_revs&&(t.deterministic_revs=!0),this.__opts=t=L(t),n.auto_compaction=t.auto_compaction,n.prefix=tt.prefix,"string"!=typeof e)throw new Error("Missing/invalid DB name");var i=function(e,t){var n=e.match(/([a-z-]*):\/\/(.*)/);if(n)return{name:/https?/.test(n[1])?n[1]+"://"+n[2]:n[2],adapter:n[1]};var i=tt.adapters,r=tt.preferredAdapters,o=tt.prefix,s=t.adapter;if(!s)for(var a=0;at&&a.push(e)})),Ie(o,(function(e,t,n,i,r){var o=t+"-"+n;"available"===r.status&&-1!==a.indexOf(o)&&c.push(o)})),i._doCompaction(e,c,n)}))})),Ze.prototype.compact=C("compact",(function(e,t){"function"==typeof e&&(t=e,e={});e=e||{},this._compactionQueue=this._compactionQueue||[],this._compactionQueue.push({opts:e,callback:t}),1===this._compactionQueue.length&&function e(t){var n=t._compactionQueue[0],i=n.opts,r=n.callback;t.get("_local/compaction").catch((function(){return!1})).then((function(n){n&&n.last_seq&&(i.last_seq=n.last_seq),t._compact(i,(function(n,i){n?r(n):r(null,i),s()((function(){t._compactionQueue.shift(),t._compactionQueue.length&&e(t)}))}))}))}(this)})),Ze.prototype._compact=function(e,t){var n=this,i={return_docs:!1,last_seq:e.last_seq||0},r=[];n.changes(i).on("change",(function(e){r.push(n.compactDocument(e.id,0))})).on("complete",(function(e){var i=e.last_seq;Promise.all(r).then((function(){return pe(n,"_local/compaction",(function(e){return(!e.last_seq||e.last_seq0?e.keys.slice(e.skip):e.keys;e.keys=t,e.skip=0,delete e.limit,e.descending&&(t.reverse(),e.descending=!1)}(e),0===e.keys.length))return this._allDocs({limit:0},t)}return this._allDocs(e,t)})),Ze.prototype.changes=function(e,t){return"function"==typeof e&&(t=e,e={}),(e=e||{}).return_docs="return_docs"in e?e.return_docs:!e.live,new Je(this,e,t)},Ze.prototype.close=C("close",(function(e){return this._closed=!0,this.emit("closed"),this._close(e)})),Ze.prototype.info=C("info",(function(e){var t=this;this._info((function(n,i){if(n)return e(n);i.db_name=i.db_name||t.name,i.auto_compaction=!(!t.auto_compaction||ae(t)),i.adapter=t.adapter,e(null,i)}))})),Ze.prototype.id=C("id",(function(e){return this._id(e)})),Ze.prototype.type=function(){return"function"==typeof this._type?this._type():this.adapter},Ze.prototype.bulkDocs=C("bulkDocs",(function(e,t,n){if("function"==typeof t&&(n=t,t={}),t=t||{},Array.isArray(e)&&(e={docs:e}),!e||!e.docs||!Array.isArray(e.docs))return n(ne(H));for(var i=0;i1?t.set(e.name,n):t.delete(e.name))}})),e.on("destroyed",(function(e){if(t.has(e)){var n=t.get(e);t.delete(e),n.forEach((function(e){e.emit("destroyed",!0)}))}}))}(tt),tt.adapter=function(e,t,n){t.valid()&&(tt.adapters[e]=t,n&&tt.preferredAdapters.push(e))},tt.plugin=function(e){if("function"==typeof e)e(tt);else{if("object"!=typeof e||0===Object.keys(e).length)throw new Error('Invalid plugin: got "'+e+'", expected an object or a function');Object.keys(e).forEach((function(t){tt.prototype[t]=e[t]}))}return this.__defaults&&(tt.__defaults=j({},this.__defaults)),tt},tt.defaults=function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);n=n||{},e&&"object"==typeof e&&(e=(n=e).name,delete n.name),n=j({},t.__defaults,n),tt.call(this,e,n)}return p()(t,tt),t.preferredAdapters=tt.preferredAdapters.slice(),Object.keys(tt).forEach((function(e){e in t||(t[e]=tt[e])})),t.__defaults=j({},this.__defaults,e),t},tt.fetch=function(e,t){return it(e,t)};function st(e,t){for(var n=e,i=0,r=t.length;i0&&"\\"===e[i-1]&&("$"===o||"."===o)?n=n.substring(0,n.length-1)+o:"."===o?(t.push(n),n=""):n+=o}return t.push(n),t}var ct=["$or","$nor","$not"];function lt(e){return ct.indexOf(e)>-1}function dt(e){return Object.keys(e)[0]}function ut(e){var t={},n={$or:!0,$nor:!0};return e.forEach((function(e){Object.keys(e).forEach((function(i){var r=e[i];if("object"!=typeof r&&(r={$eq:r}),lt(i))if(r instanceof Array){if(n[i])return n[i]=!1,void(t[i]=r);var o=[];t[i].forEach((function(e){Object.keys(r).forEach((function(t){var n=r[t],i=Math.max(Object.keys(e).length,Object.keys(n).length),s=ut([e,n]);Object.keys(s).length<=i||o.push(s)}))})),t[i]=o}else t[i]=ut([r]);else{var s=t[i]=t[i]||{};Object.keys(r).forEach((function(e){var t=r[e];return"$gt"===e||"$gte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$gte?"$gte"===e?t>n.$gte&&(n.$gte=t):t>=n.$gte&&(delete n.$gte,n.$gt=t):void 0!==n.$gt?"$gte"===e?t>n.$gt&&(delete n.$gt,n.$gte=t):t>n.$gt&&(n.$gt=t):n[e]=t}(e,t,s):"$lt"===e||"$lte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$lte?"$lte"===e?tt?1:-1}(e,t)}return Array.isArray(e)?function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:-1}(e,t):function(e,t){for(var n=Object.keys(e),i=Object.keys(t),r=Math.min(n.length,i.length),o=0;oi.length?1:-1}(e,t)}function ht(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-1/0||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var n=e.length;e=new Array(n);for(var i=0;ir?1:0)}}(t.sort);e=e.sort(i),"string"!=typeof t.sort[0]&&"desc"===(r=t.sort[0])[dt(r)]&&(e=e.reverse())}var r;if("limit"in t||"skip"in t){var o=t.skip||0,s=("limit"in t?t.limit:e.length)+o;e=e.slice(o,s)}return e}function _t(e,t,n){return n.every((function(n){var i=t[n],r=at(n),o=st(e,r);return lt(n)?function(e,t,n){if("$or"===e)return t.some((function(e){return _t(n,e,Object.keys(e))}));if("$not"===e)return!_t(n,t,Object.keys(t));return!t.find((function(e){return _t(n,e,Object.keys(e))}))}(n,i,e):Et(i,e,r,o)}))}function Et(e,t,n,i){return!e||("object"==typeof e?Object.keys(e).every((function(r){var o=e[r];if(0===r.indexOf("$"))return St(r,t,o,n,i);var s=at(r);if(void 0===i&&"object"!=typeof o&&s.length>0)return!1;var a=st(i,s);return"object"==typeof o?Et(o,t,n,a):St("$eq",t,o,s,a)})):e===i)}function St(e,t,n,i,r){if(!xt[e])throw new Error('unknown operator "'+e+'" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, $nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');return xt[e](t,n,i,r)}function kt(e){return null!=e}function Lt(e){return void 0!==e}function At(e,t){return t.some((function(t){return e instanceof Array?e.some((function(e){return 0===mt(t,e)})):0===mt(t,e)}))}var xt={$elemMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.some((function(e){return _t(e,t,Object.keys(t))})):i.some((function(i){return Et(t,e,n,i)}))))},$allMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.every((function(e){return _t(e,t,Object.keys(t))})):i.every((function(i){return Et(t,e,n,i)}))))},$eq:function(e,t,n,i){return Lt(i)&&0===mt(i,t)},$gte:function(e,t,n,i){return Lt(i)&&mt(i,t)>=0},$gt:function(e,t,n,i){return Lt(i)&&mt(i,t)>0},$lte:function(e,t,n,i){return Lt(i)&&mt(i,t)<=0},$lt:function(e,t,n,i){return Lt(i)&&mt(i,t)<0},$exists:function(e,t,n,i){return t?Lt(i):!Lt(i)},$mod:function(e,t,n,i){return kt(i)&&function(e,t){return"number"==typeof e&&parseInt(e,10)===e&&e%t[0]===t[1]}(i,t)},$ne:function(e,t,n,i){return t.every((function(e){return 0!==mt(i,e)}))},$in:function(e,t,n,i){return kt(i)&&At(i,t)},$nin:function(e,t,n,i){return kt(i)&&!At(i,t)},$size:function(e,t,n,i){return kt(i)&&Array.isArray(i)&&function(e,t){return e.length===t}(i,t)},$all:function(e,t,n,i){return Array.isArray(i)&&function(e,t){return t.every((function(t){return e.some((function(e){return 0===mt(t,e)}))}))}(i,t)},$regex:function(e,t,n,i){return kt(i)&&"string"==typeof i&&t.every((function(e){return function(e,t){return new RegExp(t).test(e)}(i,e)}))},$type:function(e,t,n,i){return function(e,t){switch(t){case"null":return null===e;case"boolean":return"boolean"==typeof e;case"number":return"number"==typeof e;case"string":return"string"==typeof e;case"array":return e instanceof Array;case"object":return"[object Object]"==={}.toString.call(e)}}(i,t)}};function Ct(e,t){if(e.selector&&e.filter&&"_selector"!==e.filter){var n="string"==typeof e.filter?e.filter:"function";return t(new Error('selector invalid for filter "'+n+'"'))}t()}function Tt(e){e.view&&!e.filter&&(e.filter="_view"),e.selector&&!e.filter&&(e.filter="_selector"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=le(e.view):e.filter=le(e.filter))}function Nt(e,t){return t.filter&&"string"==typeof t.filter&&!t.doc_ids&&!ae(e.db)}function Ot(e,t){var n=t.complete;if("_view"===t.filter){if(!t.view||"string"!=typeof t.view){var i=ne(Y,"`view` filter parameter not found or invalid.");return n(i)}var r=ce(t.view);e.db.get("_design/"+r[0],(function(i,o){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var s=o&&o.views&&o.views[r[1]]&&o.views[r[1]].map;if(!s)return n(ne($,o.views?"missing json key: "+r[1]:"missing json key: views"));t.filter=he(["return function(doc) {",' "use strict";'," var emitted = false;"," var emit = function (a, b) {"," emitted = true;"," };"," var view = "+s+";"," view(doc);"," if (emitted) {"," return true;"," }","};"].join("\n"),{}),e.doChanges(t)}))}else if(t.selector)t.filter=function(e){return function(e,t){if("object"!=typeof t)throw new Error("Selector error: expected a JSON object");var n=wt([{doc:e}],{selector:t=ft(t)},Object.keys(t));return n&&1===n.length}(e,t.selector)},e.doChanges(t);else{var o=ce(t.filter);e.db.get("_design/"+o[0],(function(i,r){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var s=r&&r.filters&&r.filters[o[1]];if(!s)return n(ne($,r&&r.filters?"missing json key: "+o[1]:"missing json key: filters"));t.filter=he('"use strict";\nreturn '+s+";",{}),e.doChanges(t)}))}}function qt(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})}tt.plugin((function(e){e._changesFilterPlugin={validate:Ct,normalize:Tt,shouldFilter:Nt,filter:Ot}})),tt.version="7.3.0";var It=qt(["_id","_rev","_access","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),Bt=qt(["_access","_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);function Mt(e){if(!/^\d+-/.test(e))return ne(ee);var t=e.indexOf("-"),n=e.substring(0,t),i=e.substring(t+1);return{prefix:parseInt(n,10),id:i}}function Pt(e,t,n){var i,r,o;n||(n={deterministic_revs:!0});var s={status:"available"};if(e._deleted&&(s.deleted=!0),t)if(e._id||(e._id=Oe()),r=Ne(e,n.deterministic_revs),e._rev){if((o=Mt(e._rev)).error)return o;e._rev_tree=[{pos:o.prefix,ids:[o.id,{status:"missing"},[[r,s,[]]]]}],i=o.prefix+1}else e._rev_tree=[{pos:1,ids:[r,s,[]]}],i=1;else if(e._revisions&&(e._rev_tree=function(e,t){for(var n=e.start-e.ids.length+1,i=e.ids,r=[i[0],t,[]],o=1,s=i.length;o1&&!n?(a={continue:function(){if(!o.length)return r();var n,a=o[o.length-1];if(t&&t.upper)try{n=IDBKeyRange.bound(a,t.upper,!0,t.upperOpen)}catch(e){if("DataError"===e.name&&0===e.code)return r()}else n=IDBKeyRange.lowerBound(a,!0);t=n,o=null,s=null,e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l}},e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l):n?e.openCursor(t,"prev").onsuccess=d:e.openCursor(t).onsuccess=d}function nn(e,t,n){var i,r,o="startkey"in e&&e.startkey,s="endkey"in e&&e.endkey,a="key"in e&&e.key,c="keys"in e&&e.keys,l=e.skip||0,d="number"==typeof e.limit?e.limit:-1,u=!1!==e.inclusive_end;if(!c&&(r=(i=function(e,t,n,i,r){try{if(e&&t)return r?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return r?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return r?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(i)return IDBKeyRange.only(i)}catch(e){return{error:e}}return null}(o,s,u,a,e.descending))&&i.error)&&("DataError"!==r.name||0!==r.code))return n(ne(Z,r.name,r.message));var f=[Ht,"by-sequence",$t];e.attachments&&f.push("attach-store");var m=Qt(t,f,"readonly");if(m.error)return n(m.error);var h=m.txn;h.oncomplete=function(){e.attachments?Xt(E,e.binary).then(A):A()},h.onabort=Vt(n);var p,g,v,y=h.objectStore(Ht),b=h.objectStore("by-sequence"),w=h.objectStore($t),_=b.index("_doc_id_rev"),E=[];function S(t,n){var i={id:n.id,key:n.id,value:{rev:t}};n.deleted?c&&(E.push(i),i.value.deleted=!0,i.doc=null):l--<=0&&(E.push(i),e.include_docs&&function(t,n,i){var r=t.id+"::"+i;_.get(r).onsuccess=function(i){if(n.doc=zt(i.target.result)||{},e.conflicts){var r=Pe(t);r.length&&(n.doc._conflicts=r)}Kt(n.doc,e,h)}}(n,i,t))}function k(e){for(var t=0,n=e.length;t0&&(g=e.target.result[0])},b.openCursor(null,"prev").onsuccess=function(e){var t=e.target.result,n=void 0;return t&&t.key&&(n=t.key),v({target:{result:[n]}})}),r||0===d?void 0:c?function(e,t,n){var i=new Array(e.length),r=0;e.forEach((function(o,s){t.get(o).onsuccess=function(t){t.target.result?i[s]=t.target.result:i[s]={key:o,error:"not_found"},++r===e.length&&n(e,i,{})}}))}(e.keys,y,L):-1===d?function(e,t,n){if("function"!=typeof e.getAll){var i=[];e.openCursor(t).onsuccess=function(e){var t=e.target.result;t?(i.push(t.value),t.continue()):n({target:{result:i}})}}else e.getAll(t).onsuccess=n}(y,i,(function(t){var n=t.target.result;e.descending&&(n=n.reverse()),k(n)})):void tn(y,i,e.descending,d+l,L)}var rn=!1,on=[];function sn(){!rn&&on.length&&(rn=!0,on.shift()())}function an(e,t,n,o){if((e=L(e)).continuous){var s=n+":"+Oe();return Zt.addListener(n,s,t,e),Zt.notify(n),{cancel:function(){Zt.removeListener(n,s)}}}var a=e.doc_ids&&new i(e.doc_ids);e.since=e.since||0;var c=e.since,l="limit"in e?e.limit:-1;0===l&&(l=1);var d,u,f,m,h=[],p=0,g=re(e),v=new r;function y(e,t,n,i){if(n.seq!==t)return i();if(n.winningRev===e._rev)return i(n,e);var r=e._id+"::"+n.winningRev;m.get(r).onsuccess=function(e){i(n,zt(e.target.result))}}function b(){e.complete(null,{results:h,last_seq:c})}var w=[Ht,"by-sequence"];e.attachments&&w.push("attach-store");var _=Qt(o,w,"readonly");if(_.error)return e.complete(_.error);(d=_.txn).onabort=Vt(e.complete),d.oncomplete=function(){!e.continuous&&e.attachments?Xt(h).then(b):b()},u=d.objectStore("by-sequence"),f=d.objectStore(Ht),m=u.index("_doc_id_rev"),tn(u,e.since&&!e.descending?IDBKeyRange.lowerBound(e.since,!0):null,e.descending,l,(function(t,n,i){if(i&&t.length){var r=new Array(t.length),o=new Array(t.length),s=0;n.forEach((function(n,c){!function(e,t,n){if(a&&!a.has(e._id))return n();var i=v.get(e._id);if(i)return y(e,t,i,n);f.get(e._id).onsuccess=function(r){i=Gt(r.target.result),v.set(e._id,i),y(e,t,i,n)}}(zt(n),t[c],(function(n,a){o[c]=n,r[c]=a,++s===t.length&&function(){for(var t=[],n=0,s=r.length;nr&&(r=n),t.continue()}}()}function s(){var e=Wt(o,o.winningRev,o.deleted);n.put(e).onsuccess=function(){i.continue()}}}}e._meta=null,e._remote=!1,e.type=function(){return"idb"},e._id=x((function(t){t(null,e._meta.instanceId)})),e._bulkDocs=function(n,i,o){en(t,n,i,e,r,a(o))},e._get=function(e,t,n){var i,o,s,a=t.ctx;if(!a){var c=Qt(r,[Ht,"by-sequence","attach-store"],"readonly");if(c.error)return n(c.error);a=c.txn}function l(){n(s,{doc:i,metadata:o,ctx:a})}a.objectStore(Ht).get(e).onsuccess=function(e){if(!(o=Gt(e.target.result)))return s=ne($,"missing"),l();var n;if(t.rev)n=t.latest?function(e,t){for(var n,i=t.rev_tree.slice();n=i.pop();){var r=n.pos,o=n.ids,s=o[0],a=o[1],c=o[2],l=0===c.length,d=n.history?n.history.slice():[];if(d.push({id:s,pos:r,opts:a}),l)for(var u=0,f=d.length;u=43)},i.onerror=e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)}})).catch((function(){return!1}))}(d)),cn.then((function(e){c=e,f()})),d.oncomplete=function(){u=!0,f()},d.onabort=Vt(n)},m.onerror=function(e){var t=e.target.error&&e.target.error.message;t?-1!==t.indexOf("stored database is a higher version")&&(t=new Error('This DB was created with the newer "indexeddb" adapter, but you are trying to open it with the older "idb" adapter')):t="Failed to open indexedDB, are you in private browsing mode?",P("error",t),n(ne(Z,t))}}(n,e,t)}),t,n.constructor)}un.valid=function(){try{return"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}};var fn={};function mn(e){var t=e.doc||e.ok,n=t&&t._attachments;n&&Object.keys(n).forEach((function(e){var t=n[e];t.data=_e(t.data,t.content_type)}))}function hn(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function pn(e){return e._attachments&&Object.keys(e._attachments)?Promise.all(Object.keys(e._attachments).map((function(t){var n=e._attachments[t];if(n.data&&"string"!=typeof n.data)return new Promise((function(e){ke(n.data,e)})).then((function(e){n.data=e}))}))):Promise.resolve()}function gn(e,t){if(function(e){if(!e.prefix)return!1;var t=me(e.prefix).protocol;return"http"===t||"https"===t}(t)){var n=t.name.substr(t.prefix.length);e=t.prefix.replace(/\/?$/,"/")+encodeURIComponent(n)}var i=me(e);(i.user||i.password)&&(i.auth={username:i.user,password:i.password});var r=i.path.replace(/(^\/|\/$)/g,"").split("/");return i.db=r.pop(),-1===i.db.indexOf("%")&&(i.db=encodeURIComponent(i.db)),i.path=r.join("/"),i}function vn(e,t){return yn(e,e.db+"/"+t)}function yn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function bn(e){return"?"+Object.keys(e).map((function(t){return t+"="+encodeURIComponent(e[t])})).join("&")}function wn(t,n){var i=this,r=gn(t.name,t),o=vn(r,"");t=L(t);var a,c=function(e,n){if((n=n||{}).headers=n.headers||new rt,n.credentials="include",t.auth||r.auth){var i=t.auth||r.auth,o=i.username+":"+i.password,s=ve(unescape(encodeURIComponent(o)));n.headers.set("Authorization","Basic "+s)}var a=t.headers||{};return Object.keys(a).forEach((function(e){n.headers.append(e,a[e])})),function(e){var t="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",n=-1!==t.indexOf("msie"),i=-1!==t.indexOf("trident"),r=-1!==t.indexOf("edge"),o=!("method"in e)||"GET"===e.method;return(n||i||r)&&o}(n)&&(e+=(-1===e.indexOf("?")?"?":"&")+"_nonce="+Date.now()),(t.fetch||it)(e,n)};function l(e,t){return C(e,m()((function(e){u().then((function(){return t.apply(this,e)})).catch((function(t){e.pop()(t)}))}))).bind(i)}function d(e,t,n){var i={};return(t=t||{}).headers=t.headers||new rt,t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json"),t.headers.get("Accept")||t.headers.set("Accept","application/json"),c(e,t).then((function(e){return i.ok=e.ok,i.status=e.status,e.json()})).then((function(e){if(i.data=e,!i.ok){i.data.status=i.status;var t=ie(i.data);if(n)return n(t);throw t}if(Array.isArray(i.data)&&(i.data=i.data.map((function(e){return e.error||e.missing?ie(e):e}))),!n)return i;n(null,i.data)}))}function u(){return t.skip_setup?Promise.resolve():a||((a=d(o).catch((function(e){return e&&e.status&&404===e.status?(D(404,"PouchDB is just detecting if the remote exists."),d(o,{method:"PUT"})):Promise.reject(e)})).catch((function(e){return!(!e||!e.status||412!==e.status)||Promise.reject(e)}))).catch((function(){a=null})),a)}function f(e){return e.split("/").map(encodeURIComponent).join("/")}s()((function(){n(null,i)})),i._remote=!0,i.type=function(){return"http"},i.id=l("id",(function(e){c(yn(r,"")).then((function(e){return e.json()})).catch((function(){return{}})).then((function(t){var n=t&&t.uuid?t.uuid+r.db:vn(r,"");e(null,n)}))})),i.compact=l("compact",(function(e,t){"function"==typeof e&&(t=e,e={}),e=L(e),d(vn(r,"_compact"),{method:"POST"}).then((function(){!function n(){i.info((function(i,r){r&&!r.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)}))}()}))})),i.bulkGet=C("bulkGet",(function(e,t){var n=this;function i(t){var n={};e.revs&&(n.revs=!0),e.attachments&&(n.attachments=!0),e.latest&&(n.latest=!0),d(vn(r,"_bulk_get"+bn(n)),{method:"POST",body:JSON.stringify({docs:e.docs})}).then((function(n){e.attachments&&e.binary&&n.data.results.forEach((function(e){e.docs.forEach(mn)})),t(null,n.data)})).catch(t)}function o(){var i=Math.ceil(e.docs.length/50),r=0,o=new Array(i);function s(e){return function(n,s){o[e]=s.results,++r===i&&t(null,{results:oe(o)})}}for(var a=0;at?t:a;var c=vn(r,"_changes"+bn(i)),p={signal:h.signal,method:f,body:JSON.stringify(l)};m=n,e.aborted||u().then((function(){return d(c,p,s)})).catch(s)}},g={results:[]},v=function(n,i){if(!e.aborted){var r=0;if(i&&i.results){r=i.results.length,g.last_seq=i.last_seq;var c=null,l=null;"number"==typeof i.pending&&(c=i.pending),"string"!=typeof g.last_seq&&"number"!=typeof g.last_seq||(l=g.last_seq);e.query_params,i.results=i.results.filter((function(t){a--;var n=re(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&mn(t),e.return_docs&&g.results.push(t),e.onChange(t,c,l)),n}))}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(m=i.last_seq);var d=o&&a<=0||i&&r0?e.slice(n):e}function u(e){var t=e.value;return t&&"object"==typeof t&&t._id||e.id}function f(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&function(e){e.rows.forEach((function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach((function(e){var n=t[e];t[e].data=_e(n.data,n.content_type)}))}))}(t),t}}function h(e,t,n,i){var r=t[e];void 0!==r&&(i&&(r=encodeURIComponent(JSON.stringify(r))),n.push(e+"="+r))}function p(e){if(void 0!==e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function g(e,t){var n=e.descending?"endkey":"startkey",i=e.descending?"startkey":"endkey";if(void 0!==e[n]&&void 0!==e[i]&&mt(e[n],e[i])>0)throw new _n("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&!1!==e.reduce){if(e.include_docs)throw new _n("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new _n("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach((function(t){var n=function(e){if(e){if("number"!=typeof e)return new _n('Invalid value for integer: "'+e+'"');if(e<0)return new _n('Invalid value for positive integer: "'+e+'"')}}(e[t]);if(n)throw n}))}function v(e){return function(t){if(404===t.status)return e;throw t}}function y(e,t,n){var r="_local/doc_"+e,o={_id:r,keys:[]},s=n.get(e),a=s[0];return(function(e){return 1===e.length&&/^1-/.test(e[0].rev)}(s[1])?Promise.resolve(o):t.db.get(r).catch(v(o))).then((function(e){return function(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):Promise.resolve({rows:[]})}(e).then((function(t){return function(e,t){for(var n=[],r=new i,o=0,s=t.rows.length;o0&&0===mt(s.key,t)&&a.push(i),n.set(gt(a),s),t=s.key}return n}return h().then((function(){return m.finish()})).then((function(){e.seq=c}))}(e,n)}))()}function _(e,t){return Ln(b(e),(function(){return function(e,t){var i,o=e.reduceFun&&!1!==t.reduce,s=t.skip||0;void 0===t.keys||t.keys.length||(t.limit=0,delete t.keys);function a(t){return t.include_docs=!0,e.db.allDocs(t).then((function(e){return i=e.total_rows,e.rows.map((function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(tn))return e.doc.value}var i=function(e){for(var t=[],n=[],i=0;;){var r=e[i++];if("\0"!==r)switch(r){case"1":t.push(null);break;case"2":t.push("1"===e[i]),i++;break;case"3":var o=vt(e,i);t.push(o.num),i+=o.length;break;case"4":for(var s="";;){var a=e[i];if("\0"===a)break;s+=a,i++}s=s.replace(/\u0001\u0001/g,"\0").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(s);break;case"5":var c={element:[],index:t.length};t.push(c.element),n.push(c);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+r)}else{if(1===t.length)return t.pop();yt(t,n)}}}(e.doc._id);return{key:i[0],id:i[1],value:"value"in e.doc?e.doc.value:null}}))}))}function l(a){var l;if(l=o?function(e,t,i){0===i.group_level&&delete i.group_level;var r=i.group||i.group_level,o=n(e.reduceFun),s=[],a=isNaN(i.group_level)?Number.POSITIVE_INFINITY:i.group_level;t.forEach((function(e){var t=s[s.length-1],n=r?e.key:null;if(r&&Array.isArray(n)&&(n=n.slice(0,a)),t&&0===mt(t.groupKey,n))return t.keys.push([e.key,e.id]),void t.values.push(e.value);s.push({keys:[[e.key,e.id]],values:[e.value],groupKey:n})})),t=[];for(var l=0,u=s.length;l0)||function(e){return e._conflicts&&e._conflicts.length>0}(e.doc)||(e.doc._conflicts&&delete e.doc._conflicts,r.push(e.doc),delete n[e.id])}))}))}return Promise.resolve().then((function(){var e=Object.keys(n).filter((function(e){var t=n[e].missing;return 1===t.length&&Gn(t[0])}));if(e.length>0)return s(e)})).then((function(){var s=function(e){var t=[];return Object.keys(e).forEach((function(n){e[n].missing.forEach((function(e){t.push({id:n,rev:e})}))})),{docs:t,revs:!0,latest:!0}}(n);if(s.docs.length)return e.bulkGet(s).then((function(n){if(i.cancelled)throw new Error("cancelled");return Promise.all(n.results.map((function(n){return Promise.all(n.docs.map((function(n){var i=n.ok;return n.error&&(o=!1),i&&i._attachments?function(e,t,n){var i=ae(t)&&!ae(e),r=Object.keys(n._attachments);return i?e.get(n._id).then((function(i){return Promise.all(r.map((function(r){return function(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}(i,n,r)?t.getAttachment(n._id,r):e.getAttachment(i._id,r)})))})).catch((function(e){if(404!==e.status)throw e;return zn(t,n)})):zn(t,n)}(t,e,i).then((function(e){var t=Object.keys(i._attachments);return e.forEach((function(e,n){var r=i._attachments[t[n]];delete r.stub,delete r.length,r.data=e})),i})):i})))}))).then((function(e){r=r.concat(oe(e).filter(Boolean))}))}))})).then((function(){return{ok:o,docs:r}}))}function Kn(e,t,n,i,r){return e.get(t).catch((function(n){if(404===n.status)return"http"!==e.adapter&&"https"!==e.adapter||D(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:i,_id:t,history:[],replicator:"pouchdb",version:1};throw n})).then((function(o){if(!r.cancelled&&o.last_seq!==n)return o.history=(o.history||[]).filter((function(e){return e.session_id!==i})),o.history.unshift({last_seq:n,session_id:i}),o.history=o.history.slice(0,5),o.version=1,o.replicator="pouchdb",o.session_id=i,o.last_seq=n,e.put(o).catch((function(o){if(409===o.status)return Kn(e,t,n,i,r);throw o}))}))}function Xn(e,t,n,i,r){this.src=e,this.target=t,this.id=n,this.returnValue=i,this.opts=r||{}}Xn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then((function(){return n.updateSource(e,t)}))},Xn.prototype.updateTarget=function(e,t){return this.opts.writeTargetCheckpoint?Kn(this.target,this.id,e,t,this.returnValue):Promise.resolve(!0)},Xn.prototype.updateSource=function(e,t){if(this.opts.writeSourceCheckpoint){var n=this;return Kn(this.src,this.id,e,t,this.returnValue).catch((function(e){if(Zn(e))return n.opts.writeSourceCheckpoint=!1,!0;throw e}))}return Promise.resolve(!0)};var Yn={undefined:function(e,t){return 0===mt(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return function(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history};return function e(t,n){var i=t[0],r=t.slice(1),o=n[0],s=n.slice(1);if(!i||0===n.length)return{last_seq:0,history:[]};if(Qn(i.session_id,n))return{last_seq:i.last_seq,history:t};if(Qn(o.session_id,r))return{last_seq:o.last_seq,history:s};return e(r,s)}(e.history,t.history)}(t,e).last_seq}};function Qn(e,t){var n=t[0],i=t.slice(1);return!(!e||0===t.length)&&(e===n.session_id||Qn(e,i))}function Zn(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}Xn.prototype.getCheckpoint=function(){var e=this;return e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then((function(e){return e.last_seq||0})).catch((function(e){if(404!==e.status)throw e;return 0})):e.target.get(e.id).then((function(t){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?t.last_seq||0:e.src.get(e.id).then((function(e){return t.version!==e.version?0:(n=t.version?t.version.toString():"undefined")in Yn?Yn[n](t,e):0;var n}),(function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:0}).then((function(){return 0}),(function(n){return Zn(n)?(e.opts.writeSourceCheckpoint=!1,t.last_seq):0}));throw n}))})).catch((function(e){if(404!==e.status)throw e;return 0}))};function ei(e,t,n){var i=n.doc_ids?n.doc_ids.sort(mt):"",r=n.filter?n.filter.toString():"",o="",s="",a="";return n.selector&&(a=JSON.stringify(n.selector)),n.filter&&n.query_params&&(o=JSON.stringify(function(e){return Object.keys(e).sort(mt).reduce((function(t,n){return t[n]=e[n],t}),{})}(n.query_params))),n.filter&&"_view"===n.filter&&(s=n.view.toString()),Promise.all([e.id(),t.id()]).then((function(e){var t=e[0]+e[1]+r+s+o+i+a;return new Promise((function(e){Ce(t,e)}))})).then((function(e){return"_local/"+(e=e.replace(/\//g,".").replace(/\+/g,"_"))}))}function ti(e,t,n,i,r){var o,a,c,l=[],d={seq:0,changes:[],docs:[]},u=!1,f=!1,m=!1,h=0,p=n.continuous||n.live||!1,g=n.batch_size||100,v=n.batches_limit||10,y=n.style||"all_docs",b=!1,w=n.doc_ids,_=n.selector,E=[],S=Oe();r=r||{ok:!0,start_time:(new Date).toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var k={};function A(){return c?Promise.resolve():ei(e,t,n).then((function(r){a=r;var o={};o=!1===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:"source"===n.checkpoint?{writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:"target"===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:{writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},c=new Xn(e,t,a,i,o)}))}function x(){if(E=[],0!==o.docs.length){var e=o.docs,s={timeout:n.timeout};return t.bulkDocs({docs:e,new_edits:!1},s).then((function(t){if(i.cancelled)throw I(),new Error("cancelled");var n=Object.create(null);t.forEach((function(e){e.error&&(n[e.id]=e)}));var o=Object.keys(n).length;r.doc_write_failures+=o,r.docs_written+=e.length-o,e.forEach((function(e){var t=n[e._id];if(t){r.errors.push(t);var o=(t.name||"").toLowerCase();if("unauthorized"!==o&&"forbidden"!==o)throw t;i.emit("denied",L(t))}else E.push(e)}))}),(function(t){throw r.doc_write_failures+=e.length,t}))}}function C(){if(o.error)throw new Error("There was a problem getting docs.");r.last_seq=h=o.seq;var e=L(r);return E.length&&(e.docs=E,"number"==typeof o.pending&&(e.pending=o.pending,delete o.pending),i.emit("change",e)),u=!0,c.writeCheckpoint(o.seq,S).then((function(){if(i.emit("checkpoint",{checkpoint:o.seq}),u=!1,i.cancelled)throw I(),new Error("cancelled");o=void 0,D()})).catch((function(e){throw R(e),e}))}function T(){return Jn(e,t,o.diffs,i).then((function(e){o.error=!e.ok,e.docs.forEach((function(e){delete o.diffs[e._id],r.docs_read++,o.docs.push(e)}))}))}function N(){var e;i.cancelled||o||(0!==l.length?(o=l.shift(),i.emit("checkpoint",{start_next_batch:o.seq}),(e={},o.changes.forEach((function(t){i.emit("checkpoint",{revs_diff:t}),"_user/"!==t.id&&(e[t.id]=t.changes.map((function(e){return e.rev})))})),t.revsDiff(e).then((function(e){if(i.cancelled)throw I(),new Error("cancelled");o.diffs=e}))).then(T).then(x).then(C).then(N).catch((function(e){q("batch processing terminated with error",e)}))):O(!0))}function O(e){0!==d.changes.length?(e||f||d.changes.length>=g)&&(l.push(d),d={seq:0,changes:[],docs:[]},"pending"!==i.state&&"stopped"!==i.state||(i.state="active",i.emit("active")),N()):0!==l.length||o||((p&&k.live||f)&&(i.state="pending",i.emit("paused")),f&&I())}function q(e,t){m||(t.message||(t.message=e),r.ok=!1,r.status="aborting",l=[],d={seq:0,changes:[],docs:[]},I(t))}function I(o){if(!(m||i.cancelled&&(r.status="cancelled",u)))if(r.status=r.status||"complete",r.end_time=(new Date).toISOString(),r.last_seq=h,m=!0,o){(o=ne(o)).result=r;var s=(o.name||"").toLowerCase();"unauthorized"===s||"forbidden"===s?(i.emit("error",o),i.removeAllListeners()):function(e,t,n,i){if(!1===e.retry)return t.emit("error",n),void t.removeAllListeners();if("function"!=typeof e.back_off_function&&(e.back_off_function=F),t.emit("requestError",n),"active"===t.state||"pending"===t.state){t.emit("paused",n),t.state="stopped";var r=function(){e.current_back_off=0};t.once("paused",(function(){t.removeListener("active",r)})),t.once("active",r)}e.current_back_off=e.current_back_off||0,e.current_back_off=e.back_off_function(e.current_back_off),setTimeout(i,e.current_back_off)}(n,i,o,(function(){ti(e,t,n,i)}))}else i.emit("complete",r),i.removeAllListeners()}function B(e,t,r){if(i.cancelled)return I();"number"==typeof t&&(d.pending=t),re(n)(e)&&(d.seq=e.seq||r,d.changes.push(e),i.emit("checkpoint",{pending_batch:d.seq}),s()((function(){O(0===l.length&&k.live)})))}function M(e){if(b=!1,i.cancelled)return I();if(e.results.length>0)k.since=e.results[e.results.length-1].seq,D(),O(!0);else{var t=function(){p?(k.live=!0,D()):f=!0,O(!0)};o||0!==e.results.length?t():(u=!0,c.writeCheckpoint(e.last_seq,S).then((function(){u=!1,r.last_seq=h=e.last_seq,t()})).catch(R))}}function P(e){if(b=!1,i.cancelled)return I();q("changes rejected",e)}function D(){if(!b&&!f&&l.length1)for(var n=1;na)&&void 0===e.nsecs&&(p=0),p>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=h,c=p,r=f;var v=(1e4*(268435455&(h+=122192928e5))+p)%4294967296;d[l++]=v>>>24&255,d[l++]=v>>>16&255,d[l++]=v>>>8&255,d[l++]=255&v;var y=h/4294967296*1e4&268435455;d[l++]=y>>>8&255,d[l++]=255&y,d[l++]=y>>>24&15|16,d[l++]=y>>>16&255,d[l++]=f>>>8|128,d[l++]=255&f;for(var b=0;b<6;++b)d[l+b]=u[b];return t||Object(s.a)(d)},d=n(12);var u=function(e){if(!Object(d.a)(e))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(e.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(e.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(e.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(e.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n};var f=function(e,t,n){function i(e,i,r,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],n=0;n>>9<<4)+1}function h(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function p(e,t,n,i,r,o){return h((s=h(h(t,e),h(i,o)))<<(a=r)|s>>>32-a,n);var s,a}function g(e,t,n,i,r,o,s){return p(t&n|~t&i,e,t,r,o,s)}function v(e,t,n,i,r,o,s){return p(t&i|n&~i,e,t,r,o,s)}function y(e,t,n,i,r,o,s){return p(t^n^i,e,t,r,o,s)}function b(e,t,n,i,r,o,s){return p(n^(t|~i),e,t,r,o,s)}var w=f("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var n=0;n>5]>>>i%32&255,o=parseInt("0123456789abcdef".charAt(r>>>4&15)+"0123456789abcdef".charAt(15&r),16);t.push(o)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[i/8])<>>32-t}var k=f("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var i=unescape(encodeURIComponent(e));e=[];for(var r=0;r>>0;b=y,y=v,v=S(g,30)>>>0,g=p,p=k}n[0]=n[0]+p>>>0,n[1]=n[1]+g>>>0,n[2]=n[2]+v>>>0,n[3]=n[3]+y>>>0,n[4]=n[4]+b>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),L="00000000-0000-0000-0000-000000000000";var A=function(e){if(!Object(d.a)(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},,function(e,t){ /** * vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. * @@ -44,5 +44,5 @@ * vkbeautify.sqlmin(text);// minify SQL * */ -function n(e){var t=" ";if(isNaN(parseInt(e)))t=e;else switch(e){case 1:t=" ";break;case 2:t=" ";break;case 3:t=" ";break;case 4:t=" ";break;case 5:t=" ";break;case 6:t=" ";break;case 7:t=" ";break;case 8:t=" ";break;case 9:t=" ";break;case 10:t=" ";break;case 11:t=" ";break;case 12:t=" "}for(var n=["\n"],i=0;i<100;i++)n.push(n[i]+t);return n}function i(){this.step=" ",this.shift=n(this.step)}function r(e,t){return t-(e.replace(/\(/g,"").length-e.replace(/\)/g,"").length)}function o(e,t){return e.replace(/\s{1,}/g," ").replace(/ AND /gi,"~::~"+t+t+"AND ").replace(/ BETWEEN /gi,"~::~"+t+"BETWEEN ").replace(/ CASE /gi,"~::~"+t+"CASE ").replace(/ ELSE /gi,"~::~"+t+"ELSE ").replace(/ END /gi,"~::~"+t+"END ").replace(/ FROM /gi,"~::~FROM ").replace(/ GROUP\s{1,}BY/gi,"~::~GROUP BY ").replace(/ HAVING /gi,"~::~HAVING ").replace(/ IN /gi," IN ").replace(/ JOIN /gi,"~::~JOIN ").replace(/ CROSS~::~{1,}JOIN /gi,"~::~CROSS JOIN ").replace(/ INNER~::~{1,}JOIN /gi,"~::~INNER JOIN ").replace(/ LEFT~::~{1,}JOIN /gi,"~::~LEFT JOIN ").replace(/ RIGHT~::~{1,}JOIN /gi,"~::~RIGHT JOIN ").replace(/ ON /gi,"~::~"+t+"ON ").replace(/ OR /gi,"~::~"+t+t+"OR ").replace(/ ORDER\s{1,}BY/gi,"~::~ORDER BY ").replace(/ OVER /gi,"~::~"+t+"OVER ").replace(/\(\s{0,}SELECT /gi,"~::~(SELECT ").replace(/\)\s{0,}SELECT /gi,")~::~SELECT ").replace(/ THEN /gi," THEN~::~"+t).replace(/ UNION /gi,"~::~UNION~::~").replace(/ USING /gi,"~::~USING ").replace(/ WHEN /gi,"~::~"+t+"WHEN ").replace(/ WHERE /gi,"~::~WHERE ").replace(/ WITH /gi,"~::~WITH ").replace(/ ALL /gi," ALL ").replace(/ AS /gi," AS ").replace(/ ASC /gi," ASC ").replace(/ DESC /gi," DESC ").replace(/ DISTINCT /gi," DISTINCT ").replace(/ EXISTS /gi," EXISTS ").replace(/ NOT /gi," NOT ").replace(/ NULL /gi," NULL ").replace(/ LIKE /gi," LIKE ").replace(/\s{0,}SELECT /gi,"SELECT ").replace(/\s{0,}UPDATE /gi,"UPDATE ").replace(/ SET /gi," SET ").replace(/~::~{1,}/g,"~::~").split("~::~")}i.prototype.xml=function(e,t){var i=e.replace(/>\s{0,}<").replace(/-1?(a+=l[s]+i[c],o=!0,(i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1||i[c].search(/!DOCTYPE/)>-1)&&(o=!1)):i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1?(a+=i[c],o=!1):/^<\w/.exec(i[c-1])&&/^<\/\w/.exec(i[c])&&/^<[\w:\-\.\,]+/.exec(i[c-1])==/^<\/[\w:\-\.\,]+/.exec(i[c])[0].replace("/","")?(a+=i[c],o||s--):i[c].search(/<\w/)>-1&&-1==i[c].search(/<\//)&&-1==i[c].search(/\/>/)?a=a+=o?i[c]:l[s++]+i[c]:i[c].search(/<\w/)>-1&&i[c].search(/<\//)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\//)>-1?a=a+=o?i[c]:l[--s]+i[c]:i[c].search(/\/>/)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\?/)>-1||i[c].search(/xmlns\:/)>-1||i[c].search(/xmlns\=/)>-1?a+=l[s]+i[c]:a+=i[c];return"\n"==a[0]?a.slice(1):a},i.prototype.json=function(e,t){t=t||this.step;return"undefined"==typeof JSON?e:"string"==typeof e?JSON.stringify(JSON.parse(e),null,t):"object"==typeof e?JSON.stringify(e,null,t):e},i.prototype.css=function(e,t){var i=e.replace(/\s{1,}/g," ").replace(/\{/g,"{~::~").replace(/\}/g,"~::~}~::~").replace(/\;/g,";~::~").replace(/\/\*/g,"~::~/*").replace(/\*\//g,"*/~::~").replace(/~::~\s{0,}~::~/g,"~::~").split("~::~"),r=i.length,o=0,s="",a=0,c=t?n(t):this.shift;for(a=0;a/g,"").replace(/[ \r\n\t]{1,}xmlns/g," xmlns")).replace(/>\s{0,}<")},i.prototype.jsonmin=function(e){return"undefined"==typeof JSON?e:JSON.stringify(JSON.parse(e),null,0)},i.prototype.cssmin=function(e,t){return(t?e:e.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"")).replace(/\s{1,}/g," ").replace(/\{\s{1,}/g,"{").replace(/\}\s{1,}/g,"}").replace(/\;\s{1,}/g,";").replace(/\/\*\s{1,}/g,"/*").replace(/\*\/\s{1,}/g,"*/")},i.prototype.sqlmin=function(e){return e.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")")},e.exports=new i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renameHTML=t.newFolderHTML=t.uploadAreaHTML=void 0,t.uploadAreaHTML='
\n\n
\n
\n
Upload Files
\n
\n
\n \n
\n
\n\n
Unpaired Documents
\n\n
\n\n
\n
MEI
\n
\n
Name
\n
\n
\n
\n
\n \n
\n
\n
\n\n
\n
Images
\n
\n
Name
\n
\n
\n
\n
\n\n
\n\n
\n
Make Pair
\n
\n
\n\n
\n\n
Paired Folios
\n
\n
Name
\n
\n
\n
\n\n
\n
\n Upload\n
\n
\n
\n\n
\n\n \x3c!--\n
\n

Manuscripts

\n
\n
\n --\x3e\n\n
\n
',t.newFolderHTML='\n
\n
\n
\n
\n \n \n
\n
\n ',t.renameHTML='\n
\n
\n
\n
\n \n \n
\n
\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.groupingNotRecognized=void 0,t.groupingNotRecognized=function(){window.confirm("Neon does not recognize this neume grouping. Would you like to create a compound neume?")||document.getElementById("undo").click()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitStaffHandler=void 0;const i=n(5),r=n(4),o=n(23),s=n(15);t.SplitStaffHandler=class{constructor(e,t){this.handler=(e=>{const t=this.staff.id,n=(0,s.getSVGRelCoords)(e.clientX,e.clientY),a={action:"split",param:{elementId:t,x:n.x}};this.neonView.edit(a,this.neonView.view.getCurrentPageURI()).then(async e=>{e&&(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success"));const n=new o.default(this.neonView,".staff");this.splitDisable(),(0,r.selectAll)([document.querySelector("#"+t)],this.neonView,n);const s=document.getElementById("moreEdit");s&&(s.innerHTML="",s.parentElement.classList.add("hidden"))})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.staff=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click Where to Split")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitNeumeHandler=void 0;const i=n(5);t.SplitNeumeHandler=class{constructor(e,t){this.handler=(e=>{const t={action:"splitNeume",param:{elementId:this.neume.id,ncId:e.target.parentElement.id}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(async e=>{e?(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success")):(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action failed","error")),this.splitDisable()})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.neume=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click The Beginning of The Second Neume")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t){},function(e,t,n){"use strict";(function(e){t.test=function(){return"function"==typeof e.queueMicrotask},t.install=function(t){return function(){e.queueMicrotask(t)}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){var n=e.MutationObserver||e.WebKitMutationObserver;t.test=function(){return n},t.install=function(t){var i=0,r=new n(t),o=e.document.createTextNode("");return r.observe(o,{characterData:!0}),function(){o.data=i=++i%2}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){t.test=function(){return!e.setImmediate&&void 0!==e.MessageChannel},t.install=function(t){var n=new e.MessageChannel;return n.port1.onmessage=t,function(){n.port2.postMessage(0)}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){t.test=function(){return"document"in e&&"onreadystatechange"in e.document.createElement("script")},t.install=function(t){return function(){var n=e.document.createElement("script");return n.onreadystatechange=function(){t(),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},e.document.documentElement.appendChild(n),t}}}).call(this,n(9))},function(e,t,n){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateDocName=t.deleteDocument=t.addDocument=t.createManifest=t.fetchUploads=t.db=void 0;const i=n(30),r=n(28),o=n(92);t.db=new r.default("Neon-User-Storage"),t.fetchUploads=async function(){try{return(await new Promise((e,n)=>{t.db.allDocs({include_docs:!0}).then(t=>e(t)).catch(e=>n(e))})).rows.map(e=>({id:e.id,name:e.doc?e.doc.name:"undefined"}))}catch(e){return console.log("Couldn't fetch uploaded documents",e.message),[]}},t.createManifest=function(e,t,n,r){return new Promise(async s=>{const a=JSON.parse(JSON.stringify(o));a["@id"]=e,a.title=t,a.timestamp=(new Date).toISOString();const c=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(n)}),l=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(r)}),d=await c,u=await l;a.image=u,a.mei_annotations=[{id:(0,i.v4)(),type:"Annotation",body:d,target:u}],s(a)})},t.addDocument=function(e,n,i,r){return new Promise((o,s)=>{t.db.put({_id:e,name:n,type:r?"page":"manuscript",_attachments:{manifest:{content_type:"application/ld+json",data:i}}}).then(()=>{o(!0)}).catch(t=>{window.alert(`Error Uploading Document: ${t.message}, title: ${n}, id: ${e}.`),s(!1)})})},t.deleteDocument=function(e){return new Promise((n,i)=>{t.db.get(e).then(e=>{t.db.remove(e).then(e=>{n(!0)}).catch(e=>{console.log(e),i(e)})}).catch(e=>{console.log(e),i(e)})})},t.updateDocName=function(e,n){return new Promise((i,r)=>{t.db.get(e).then(o=>{t.db.getAttachment(e,"manifest").then(e=>{e.text().then(e=>{const s=JSON.parse(e);o.name=n,s.title=n;const a=new Blob([JSON.stringify(s,null,2)],{type:"application/ld+json"});o._attachments.manifest={content_type:"application/ld+json",data:a},t.db.put(o).then(()=>i(!0)).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))})}},,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loadDashboard=t.updateDashboard=void 0;const i=n(25),r=n(46),o=n(25),s=n(94),a=n(95),c=n(98),l=n(13),d=document.querySelector("#fs-content-container"),u=document.querySelector("#main-section-content"),f=document.querySelector("#open-doc"),m=document.querySelector("#remove-doc"),p=document.querySelector("#nav-path-container");let h=document.querySelector("#fs-back-btn"),g=document.querySelector("#fs-empty-btn"),v=document.querySelector("#fs-delete-btn");const y=document.querySelector("#upload-new-doc-button"),b=document.querySelector("#add-folder-button"),_=new s.ShiftSelectionManager,w=(0,o.FileSystemManager)(),E=(0,s.dashboardState)(),S=document.querySelector(".main-section-content"),k=document.querySelector(".right-click-file-menu"),L=document.querySelector(".context-menu-items-wrapper");let A=!1,x=!1,C=null,N=!1;function O(){y.classList.contains("active")&&(0,a.InitUploadArea)(E.getParentFolder())}function T(e,t){const n=(i=t?{manifest:e}:{storage:e},Object.keys(i).map(e=>encodeURIComponent(e)+"="+encodeURIComponent(i[e])).join("&"));var i;window.open("./editor.html?"+n,"_blank")}function q(e){const t=E.getEntries().at(e);E.setSelection(e,!0);document.getElementById(t.id).classList.add("selected")}function I(e){const t=E.getEntries().at(e).id;E.setSelection(e,!1);document.getElementById(t).classList.remove("selected")}function B(){Array.from(document.querySelectorAll(".document-entry.selected")).forEach(e=>e.classList.remove("selected")),E.resetSelection()}async function M(e,t,n){if("folder"===t.type){n.addEventListener("dblclick",(async function(){return await z([...E.getFolderPath(),t])}),!1)}else n.addEventListener("dblclick",F,!1);!function(e,t){e.addEventListener("click",(function(e){P(t)}),!1)}(n,e),function(e,t){e.addEventListener("contextmenu",e=>{e.stopPropagation(),e.preventDefault(),(N||1===E.getSelectedEntries().length)&&B(),q(t),ne("selection-options",e.clientX,e.clientY),k.classList.remove("hidden"),N=!0}),S.addEventListener("click",e=>{if(N){let t=e.target;if(t.parentElement.classList.contains("document-entry")&&(t=t.parentElement),k.classList.add("hidden"),N=!1,t.classList.contains("document-entry")){const e=W(t.id);P(E.getIndexByEntryName(e.name))}else B()}})}(n,e)}function P(e){A||x?A?E.getSelection()[e]?(I(e),_.setStart(E.getSelection().lastIndexOf(!0))):(q(e),_.setStart(e)):x&&(_.getPrevSelection().forEach(e=>{I(e)}),_.setEnd(e),_.getSelection(E.getSelection()).forEach(e=>{q(e)})):(B(),q(e),_.setStart(e)),U(),V()}function F(){if(f.classList.contains("active"))if(1!==E.getSelectedFolders().length&&1!==E.getSelectedTrash().length)E.getSelectedFiles().forEach(e=>function(e){const t=e.metadata.document;if(void 0!==typeof t){const n="sample"===t;T(e.id,n)}}(e)),_.reset(),B(),U();else{z([...E.getFolderPath(),E.getSelectedEntries()[0]])}}function j(){if(!m.classList.contains("active"))return;const e=E.getSelectedEntries(),t=E.getParentFolder(),n=E.getTrashFolder(),r=(new Date).toLocaleString();for(let t of e)t=i.FileSystemTools.addMetadata(t,{removed_on:r,recover_folder:E.getFolderPathNames()});K(e,t,n)}function D(e,t){return new Promise((n,o)=>{(0,r.deleteDocument)(e.id).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>o(!1))})}function R(e,t){return new Promise(n=>{const r=e.children.map(t=>"file"===t.type?D(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(r).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>n(!1))})}function H(){const e=E.getSelectedEntries(),t=`Are you sure you want to delete:\n${n=e,n.map(e=>`- ${e.name} (${e.type})`).join("\n")}\nThis action is irreversible.`;var n;if(window.confirm(t)){const t=e.map(e=>"file"===e.type?D(e,E.getParentFolder()):"folder"===e.type?R(e,E.getParentFolder()):void 0);Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function $(){const e=E.getTrashFolder();if(!e)return void console.error("Trash folder not found.");if(window.confirm("Are you sure you want to delete all the files in Trash Folder?\nThis action is irreversible.")){const t=e.children.map(t=>"file"===t.type?D(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function U(){E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),E.getSelectedEntries().length?f.classList.add("active"):f.classList.remove("active")):E.isInTrash()?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),f.classList.remove("active")):E.getSelectedTrash().length?(f.classList.add("active"),m.classList.remove("active"),y.classList.remove("active"),b.classList.remove("active")):E.getSelectedEntries().length?(f.classList.add("active"),m.classList.add("active"),y.classList.remove("active"),b.classList.remove("active")):(f.classList.remove("active"),m.classList.remove("active"),y.classList.add("active"),b.classList.add("active"))}function V(){!function(){const e=h.cloneNode(!0);h.parentNode.replaceChild(e,h),1===E.getFolderPath().length?(e.classList.remove("active"),e.setAttribute("disabled","true")):(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",G),e.addEventListener("ondragenter",()=>e.classList.add("active")),e.addEventListener("ondragleave",()=>e.classList.remove("active")),J(e,E.getParentFolder(),E.getFolderPath().at(-2))),h=e}(),function(){const e=g.cloneNode(!0);g.parentNode.replaceChild(e,g);const t=E.getParentFolder();"trash"===t.type||E.isInTrash()?(e.style.display="",t.children.length&&!E.getSelectedEntries().length&&"trash"===t.type?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",$)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",g=e}(),function(){const e=v.cloneNode(!0);v.parentNode.replaceChild(e,v),"trash"===E.getParentFolder().type||E.isInTrash()?(e.style.display="",E.getSelectedEntries().length?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",H)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",v=e}()}async function G(){const e=E.getFolderPath().slice(0,-1);await z(e)}function W(e){return E.getEntries().find(t=>t.id===e)}async function z(e){e||(e=E.getFolderPath()),E.setFolderPath(e);const t=E.getParentFolder();d.innerHTML="",_.reset(),E.setEntries(t.children),t.children.forEach(async(e,t)=>{const n=function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.setAttribute("draggable","true");const n=document.createElement("img");n.classList.add("document-icon");const i=document.createElement("div");switch(i.innerText=e.name,e.type){case"folder":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/folder-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"trash":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/trash-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"file":t.classList.add("file-entry"),t.setAttribute("id",e.id),"manuscript"===e.metadata.type?(t.classList.add("manuscript-entry"),n.src="./Neon-gh/assets/img/manuscript-icon.svg"):"folio"===e.metadata.type?(t.classList.add("folio-entry"),n.src="./Neon-gh/assets/img/folio-icon.svg"):n.src="./Neon-gh/assets/img/folio-icon.svg"}return t.appendChild(n),t.appendChild(i),t}(e);d.appendChild(n),await M(t,e,n)}),U(),function(){p.innerHTML="";const e=E.getFolderPath().map((e,t)=>{const n=document.createElement("div");n.classList.add("nav-path-section"),n.innerHTML=e.name;const i=E.getFolderPath().slice(0,t+1);return n.addEventListener("click",async()=>await z(i)),J(n,E.getParentFolder(),i.at(-1)),n});e.forEach((t,n)=>{if(p.appendChild(t),n!==e.length-1){const e=document.createElement("div");e.classList.add("nav-path-seperator"),e.innerHTML=" / ",p.appendChild(e)}})}(),V();const n=document.getElementById("info-badge");E.isInTrash()?(n.textContent="Files will be deleted after 30 days",n.style.background="#9DB2BF"):(n.textContent="",n.style.background=""),t.children.forEach(e=>{const n=document.getElementById(e.id);n.addEventListener("dragstart",e=>{e.dataTransfer.effectAllowed="move",C=e.target}),"folder"!==e.type&&"trash"!==e.type||J(n,t,e)}),w.setFileSystem(E.getFolderPath().at(0))}function J(e,t,n){e.addEventListener("dragenter",t=>{t.preventDefault(),e.classList.add("dragenter")}),e.addEventListener("dragleave",t=>{t.preventDefault(),e.classList.remove("dragenter")}),e.addEventListener("dragover",e=>e.preventDefault()),e.addEventListener("drop",function(e,t){return n=>{n.preventDefault();const i=W(C.getAttribute("id"));i&&i!==t&&K([i],e,t)}}(t,n))}function K(e,t,n){const r=[];e.forEach(e=>{"trash"===n.type&&n.children.some(t=>t.name===e.name)&&(e.name=function(e){const t=(new Date).toLocaleString();return e+" - "+t}(e.name));const o=i.FileSystemTools.canMoveEntry(e,t,n);o.succeeded?i.FileSystemTools.moveEntry(e,t,n):r.push(o.error)}),r.filter((e,t,n)=>n.indexOf(e)===t),r.length>0&&window.alert(r.join("\n")),z()}function X(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.MOVE_TO),e.openModalWindow();const t=E.getSelectedEntries(),n=E.getParentFolder(),i=function(e){const t=document.createElement("ul");return t.id="tree-root",t.appendChild(function e(t,n,i){const r=document.createElement("li"),o=document.createElement("div");o.classList.add("tree-li-container");const s=document.createElement("div");s.classList.add("tree-name"),s.innerHTML=t.name,s.addEventListener("click",()=>{document.querySelectorAll(".tree-name").forEach(e=>e.classList.remove("selected")),s.classList.add("selected")}),s.addEventListener("dblclick",()=>{n(t)});if(t.children.every(e=>"folder"!==e.type))return r.appendChild(o),o.appendChild(s),r;const a=document.createElement("ul"),c=document.createElement("div");c.classList.add("tree-arrow"),c.innerHTML="▶",i<2&&a.classList.add("active");i<2&&c.classList.add("active");return c.addEventListener("click",()=>{c.classList.toggle("active"),a.classList.toggle("active")}),r.appendChild(o),o.appendChild(c),o.appendChild(s),r.appendChild(a),t.children.forEach(t=>{if("folder"===t.type){const r=e(t,n,i+1);a.appendChild(r)}}),r}(E.root(),e,0)),t}(i=>{e.hideModalWindow(),K(t,n,i)}),r=document.createElement("div");r.classList.add("tree-container"),r.appendChild(i);const o=document.getElementById("neon-modal-window-content-container");o.innerHTML='Double-click the folder you want to move your items to!',o.appendChild(r)}function Y(){if(!b.classList.contains("active"))return;const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.NEW_FOLDER),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text",r.placeholder="Untitled Folder",r.value="Untitled Folder",t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>Q(e,r.value)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&Q(e,r.value)})}function Q(e,t){te(t)?(window.alert("The folder name already exists in the current folder!"),Y()):(e.hideModalWindow(),function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.classList.add("folder-entry"),t.setAttribute("id","new-folder");const n=i.FileSystemTools.createFolder(e);i.FileSystemTools.addEntry(n,E.getParentFolder())?(t.setAttribute("id",e),z()):t.remove()}(t))}function Z(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.RENAME),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text";const o=E.getSelectedEntries()[0].name;r.placeholder=o,r.value=o,t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>ee(e,r.value,o)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&ee(e,r.value,o)})}function ee(e,t,n){if(t===n)e.hideModalWindow();else if(te(t))window.alert("The filename already exists in the current folder!"),Z();else{e.hideModalWindow();!function(e,t){if(i.FileSystemTools.renameEntry(e,E.getParentFolder(),t))if("file"===e.type){const n=e;(0,r.updateDocName)(n.id,t).then(()=>{z()})}else z()}(E.getSelectedEntries()[0],t)}}function te(e){return E.getParentFolder().children.some(t=>t.name===e)}function ne(e,t,n){switch(e){case"selection-options":const e=E.getSelectedFiles().length,t=E.getSelectedFolders().length,n=E.getSelectedTrash().length;e||t||!n?E.getFolderPath().length>1&&"Trash"==E.getFolderPath().at(1).name?(L.innerHTML=c.trashEntryOptions,ie("trash-entry-options")):1!==e||t||n?e>1&&!t&&!n?(L.innerHTML=c.multiFileOptions,ie("multi-file-options")):e>=1&&t>=1&&!n?(L.innerHTML=c.folderAndFileOptions,ie("folder-and-file-options")):e||1!==t||n?!e&&t>1&&!n&&(L.innerHTML=c.multiFolderOptions,ie("multi-folder-options")):(L.innerHTML=c.singleFolderOptions,ie("single-folder-options")):(L.innerHTML=c.singleFileOptions,ie("single-file-options")):(L.innerHTML=c.trashFolderOptions,ie("trash-folder-options"));break;default:L.innerHTML=c.defaultOptions,ie("default")}if(E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable||E.isInTrash()){const e=document.getElementById("cm-remove-btn"),t=document.getElementById("cm-rename-btn"),n=document.getElementById("cm-move-btn"),i=document.getElementById("cm-upload-doc-btn"),r=document.getElementById("cm-new-folder-btn");e&&e.classList.add("disabled"),t&&t.classList.add("disabled"),n&&n.classList.add("disabled"),i&&i.classList.add("disabled"),r&&r.classList.add("disabled")}k.style.left=t+"px",k.style.top=n+"px",k.classList.remove("hidden")}function ie(e){const t="context-menu-item-wrapper";switch(e){case"single-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"folder-and-file-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"single-folder-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-folder-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),j()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"trash-folder-options":document.querySelector(`.${t}#cm-empty-trash-btn`).addEventListener("click",e=>{k.classList.add("hidden"),$()});break;case"trash-entry-options":document.querySelector(`.${t}#cm-recover-btn`).addEventListener("click",e=>{k.classList.add("hidden"),function(){const e=E.getSelectedEntries(),t=E.getParentFolder();for(let n of e){const e=n.metadata.recover_folder,r=E.getFolderPathByNames(e);if(r){n=i.FileSystemTools.removeMetadata(n,["removed_on","recover_folder"]);const e=/ - \d{1,2}\/\d{1,2}\/\d{4}, \d{1,2}:\d{2}:\d{2} [APMapm]{2}$/;e.test(n.name)&&(n.name=n.name.replace(e,"")),K([n],t,r)}}}()}),document.querySelector(`.${t}#cm-delete-btn`).addEventListener("click",e=>{k.classList.add("hidden"),H()});break;default:document.querySelector(`.${t}#cm-upload-doc-btn`).addEventListener("click",e=>{k.classList.add("hidden"),O()}),document.querySelector(`.${t}#cm-new-folder-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Y()})}}function re(e){E.getTrashFolder()||w.newTrash(e);const t=E.getTrashFolder(),n=new Date,i=new Date(n.getTime()-2592e6);t.children.forEach(e=>{(e=>{if(e.metadata&&e.metadata.removed_on){return new Date(e.metadata.removed_on)<=i}return!1})(e)&&("file"===e.type?D(e,t):"folder"===e.type&&R(e,t))})}null==f||f.addEventListener("click",F),null==m||m.addEventListener("click",j),null==y||y.addEventListener("click",O),null==b||b.addEventListener("click",Y),window.addEventListener("keydown",e=>{e.metaKey&&(A=!0),e.shiftKey&&(x=!0),"Escape"===e.key&&(B(),_.reset(),U(),V())}),window.addEventListener("keyup",e=>{e.metaKey||(A=!1),e.shiftKey||(x=!1)}),null==u||u.addEventListener("click",e=>{const t=e.target;Boolean(t.closest(".document-entry"))||(B(),_.reset(),U(),V())}),t.updateDashboard=z;t.loadDashboard=async()=>{const e=await w.getRoot();E.root(e),re(e),z([e]),document.querySelector(".main-section").addEventListener("contextmenu",e=>{e.preventDefault(),B(),ne("default",e.clientX,e.clientY)}),document.querySelector(".main-section").addEventListener("click",e=>{k.classList.add("hidden")})}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0});(0,n(56).loadDashboard)(),null===(i=document.querySelector("#home-link"))||void 0===i||i.setAttribute("href","https://ddmal.music.mcgill.ca/Neon")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EntryType=void 0,function(e){e.Folder="folder",e.Trash="trash",e.File="file"}(t.EntryType||(t.EntryType={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemTools=void 0;const i=n(25),r=n(17),o=(e,t,n,r)=>{const o={};return t===i.EntryType.File?{name:e,type:t,id:n,metadata:o}:{name:e,type:t,id:n,children:r,metadata:o}};const s=(e,t)=>{const n=t.children.some(t=>t.name===e.name),i=t.metadata.immutable,r={succeeded:!1,error:""};return n?r.error=`Duplicate name: ${e.name} already exists in ${t.name}.`:i?r.error=t.name+" is immutable.":r.succeeded=!0,r},a=(e,t)=>{const n=-1!==t.children.findIndex(t=>t.id===e.id),i=t.metadata.immutable,r=e.metadata.immutable,o={succeeded:!1,error:""};return n?i?o.error=t.name+" is immutable.":r?o.error=e.name+" is immutable.":o.succeeded=!0:o.error=`${e.name} does not exist in ${t.name}.`,o},c=(e,t,n)=>{const r=e===n,o=n.children.some(t=>t.name===e.name),s=t.metadata.immutable,a=n.metadata.immutable,c=-1!==t.children.findIndex(t=>t.id===e.id),l=e.type==i.EntryType.Folder&&function e(t,n){return n.children.filter(e=>e.type===i.EntryType.Folder).map(n=>n===t||e(t,n)).some(e=>!0===e)}(n,e),d={succeeded:!1,error:""};return r?d.error=`Cannot move ${e.name} to itself.`:o?d.error=`Duplicate name: ${e.name} already exists in ${n.name}.`:s?d.error=t.name+" is immutable.":a?d.error=n.name+" is immutable.":c?l?d.error=`Cannot move ${e.name} into a its own subfolder, ${n.name}.`:d.succeeded=!0:d.error=`${e.name} does not exist in ${t.name}.`,d},l=(e,t,n)=>{const i={succeeded:!1,error:""};return t.children.some((t,n,i)=>t.name===e.name&&n!==i.indexOf(t))?i.error=`Duplicate name: ${n} already exists in ${t.name}.`:i.succeeded=!0,i},d=(e,t)=>{const{succeeded:n,error:r}=s(e,t);return n?(t.children.push(e),(o=t).children.sort((e,t)=>e.name.localeCompare(t.name)),o.children.sort((e,t)=>e.type===i.EntryType.File&&t.type===i.EntryType.Folder?1:e.type===i.EntryType.Folder&&t.type===i.EntryType.File?-1:0),!0):(console.error(r),!1);var o},u=(e,t,n=!1)=>{const{succeeded:i,error:r}=a(e,t);if(i||n){const n=t.children.indexOf(e);return t.children.splice(n,1),!0}return console.error(r),!1};t.FileSystemTools={createFolder:e=>o(e,i.EntryType.Folder,(0,r.uuidv4)(),[]),createTrash:e=>o(e,i.EntryType.Trash,(0,r.uuidv4)(),[]),createFile:(e,t)=>o(e,i.EntryType.File,t),moveEntry:function(e,t,n){const i=c(e,t,n);if(i.succeeded){if(u(e,t,!0)){if(d(e,n))return!0;console.error(`Moving: failed to add ${e.name} to ${n.name}`)}else console.error(`Moving: failed to remove ${e.name} from ${t.name}`)}else console.error(i.error);return!1},canAddEntry:s,canRemoveEntry:a,canMoveEntry:c,canRenameEntry:l,addEntry:d,removeEntry:u,addMetadata:function(e,t){return Object.entries(t).forEach(([t,n])=>{e.metadata[t]=n}),e},removeMetadata:function(e,t){return t.forEach(t=>{delete e.metadata[t]}),e},getAllNames:e=>e.children.map(e=>e.name),renameEntry:(e,t,n)=>{const{succeeded:i,error:r}=l(e,t,n);return i?(e.name=n,!0):(console.error(r),!1)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemManager=void 0;const i=n(25),r=n(46),o=n(93);t.FileSystemManager=()=>{function e(e){try{window.localStorage.setItem("neon-fs",JSON.stringify(e))}catch(e){return console.error(e),window.alert("Error saving file system"),!1}return!0}async function t(){try{const t=window.localStorage.getItem("neon-fs");if(t){return JSON.parse(t)}{const t=i.FileSystemTools.createFolder("Home");return function(e){const t=o.samples.map(([e,t])=>{const n=i.FileSystemTools.createFile(e,e);return"folio"===t?i.FileSystemTools.addMetadata(n,{type:"folio",document:"sample",immutable:!0}):"manuscript"===t&&i.FileSystemTools.addMetadata(n,{type:"manuscript",document:"sample",immutable:!0}),n}),n=i.FileSystemTools.createFolder("Samples");t.forEach(e=>{i.FileSystemTools.addEntry(e,n)}),i.FileSystemTools.addEntry(n,e),i.FileSystemTools.addMetadata(n,{immutable:!0})}(t),n(t),await async function(e){const t=await(0,r.fetchUploads)();return t.map(e=>i.FileSystemTools.createFile(e.name,e.id)).forEach(t=>{i.FileSystemTools.addEntry(t,e)}),e}(t),e(t),t}}catch(e){console.error(e),window.alert("Error loading file system")}}function n(e){const t=i.FileSystemTools.createTrash("Trash");i.FileSystemTools.addEntry(t,e)}return{getRoot:async function(){return await t()},setFileSystem:e,getFileSystem:t,newTrash:n}}},function(e){e.exports=JSON.parse('{"@context":["http://www.w3.org/ns/anno.jsonld",{"schema":"http://schema.org/","title":"schema:name","timestamp":"schema:dateModified","image":{"@id":"schema:image","@type":"@id"},"mei_annotations":{"@id":"Annotation","@type":"@id","@container":"@list"}}]}')},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.samples=void 0,t.samples=[["CDN-Hsmu_M2149.L4_001r","folio"],["CDN-Hsmu_M2149.L4_002r","folio"],["CH-E_611_024r","folio"],["CH-E_611_026r","folio"],["CH-E_611_028r","folio"],["Salzinnes","manuscript"]]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dashboardState=t.ShiftSelectionManager=void 0;t.ShiftSelectionManager=class{constructor(){this.prevSelection=[],this.reset()}setStart(e){this.reset(),this.start=Math.max(e,0)}setEnd(e){this.end=e}reset(){this.start=0,this.end=-1,this.prevSelection.splice(0)}getPrevSelection(){return this.prevSelection}getSelection(e){let t,n;if(-1===this.end)return[];this.endn+t).filter(t=>!e[t]);return this.prevSelection=i,i}},t.dashboardState=function(){let e=[],t=[],n=[],i=null;function r(e){return e&&(i=e),i}function o(){return e.filter((e,n)=>t[n])}return{root:r,setEntries:function(n){e=n,t=Array(n.length).fill(!1)},getEntries:function(){return e},getIndexByEntryName:function(t){return e.findIndex(e=>e.name===t)},setSelection:function(e,n){t[e]=n},getSelection:function(){return t},resetSelection:function(){t.fill(!1)},setFolderPath:function(e){n=e},getFolderPath:function(){return n},getFolderPathNames:function(){return n.map(e=>e.name)},getFolderPathByNames:function(e){let t=r();e=e.slice(1);for(const n of e){const e=t.children.find(e=>e.name===n);if(!e||"folder"!==e.type)return void console.debug("failed to find folder: ",n);t=e}return t},getParentFolder:function(){return n.at(-1)},getTrashFolder:function(){return r().children.filter(e=>"trash"===e.type)[0]},getSelectedEntries:o,getSelectedFolders:function(){return o().filter(e=>"folder"===e.type)},getSelectedTrash:function(){return o().filter(e=>"trash"===e.type)},getSelectedFiles:function(){return o().filter(e=>"file"===e.type)},isInTrash:function(){return n.some(e=>"trash"===e.type)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InitUploadArea=void 0;const i=n(13),r=n(96),o=n(56);t.InitUploadArea=function(e){const t=new i.ModalWindow;t.setModalWindowView(i.ModalWindowView.DOCUMENT_UPLOAD),t.openModalWindow();const n=document.querySelector("#make_pair"),s=document.querySelector("#upload_button");n.addEventListener("click",r.handleMakePair),s.addEventListener("click",()=>async function(e,t){const n=document.querySelector("#uploading_spinner");n.classList.add("visible"),(0,r.handleUploadAllDocuments)(t).then(t=>{setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow();const i=t.filter(e=>"fulfilled"===e.status&&e.value).map(e=>e.value);if(i.length>0){const e=document.getElementById("info-badge");e.textContent="Uploaded files: "+i.join(", "),e.style.display="block",e.style.background="#9DB2BF"}},2e3)}).catch(t=>{console.log("One or more uploads rejected: ",t),setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow()},2e3)})}(t,e));const a=document.createElement("input");a.type="file",a.multiple=!0,a.addEventListener("change",(function(){const e=a.files,t=Array.from(e),n=(0,r.addNewFiles)(t);if(0!==n.length){const e=n.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}a.value=null}));const c=document.querySelector("#initial_upload_area");c.onclick=()=>a.click(),c.ondragleave=()=>c.classList.remove("over"),c.ondragover=e=>{e.stopPropagation(),e.preventDefault(),c.classList.add("over"),e.dataTransfer.dropEffect="copy"},c.ondrop=e=>{e.stopPropagation(),e.preventDefault(),c.classList.remove("over");const t=e.dataTransfer.files,n=Array.from(t),i=(0,r.addNewFiles)(n);if(0!==i.length){const e=i.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}},document.querySelectorAll(".sort_name").forEach(e=>{e.addEventListener("click",()=>(0,r.sortFileByName)(e))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.fnConflictHandler=t.formatFilename=t.sortFileByName=t.handleUploadAllDocuments=t.handleMakePair=t.addNewFiles=void 0;const i=n(30),r=n(97),o=n(46),s=n(25),a=r.default.getInstance();function c(e,t){if("mei"!==t&&"image"!==t)return;const n="mei"===t?"mei_radio_group":"image_radio_group",r=(0,i.v4)(),o=document.createElement("div");o.className="unpaired_item_container";const s=document.createElement("input");s.type="radio",s.className="unpaired_item_radio",s.name=n,s.value=e,s.id=r;const a=document.createElement("label");a.className="unpaired_item_label",a.setAttribute("for",r);const c=document.createElement("span");c.innerText=l(e,50),c.setAttribute("style","margin-top: auto; margin-left: 3px;");const d=document.createElement("img");return d.className="unpaired_del_btn",d.src="/Neon/Neon-gh/assets/img/unpaired-remove-doc.svg",d.title="delete",a.appendChild(s),a.appendChild(c),o.appendChild(a),o.appendChild(d),d.addEventListener("click",(function(){o.remove()})),o}function l(e,t){const n=Math.floor(t/2),i=e.length;return i<=t?e:`${e.substring(0,n-1)}...${e.substring(i-n+2,i)}`}function d(e,t){let n=e,i=1;for(;t.includes(n);)n=`${e}(${i})`,i++;return n}a.setMeiTemplate("samples/mei/mei_template.mei"),t.addNewFiles=function(e){const t=document.querySelector("#mei_list"),n=document.querySelector("#image_list"),i=[];return e.forEach(e=>{const r=e.name.split(".").pop();if("mei"===r){const n=c(e.name,"mei");t.appendChild(n),a.addFile(e)}else if(["png","jpg","jpeg"].includes(r)){const t=c(e.name,"image");n.appendChild(t),a.addFile(e)}else"jsonld"===r||i.push(e)}),i},t.handleMakePair=function(){const e=document.querySelector("#paired_list"),t=document.querySelector('input[name="mei_radio_group"]:checked'),n=document.querySelector('input[name="image_radio_group"]:checked');if(null===t||null===n)return;let i=t.value;const r=n.value;let o=!1;if("create_mei"===t.value){o=!0;const e=r.split(".");e.length>1&&e.pop(),e.push("mei"),i=e.join("."),a.getImgDimension(r).then(e=>{const{width:t,height:n,staffSpace:r}=e,o=a.createMeiFile(i,t,n,r);a.addFile(o)}).catch(e=>{console.error(e.message)})}const s=i.substring(0,i.length-4),d=function(e,t,n){const i=document.querySelector("#mei_list"),r=document.querySelector("#image_list"),o=document.createElement("div");o.className="folio_item",o.setAttribute("mei",t),o.setAttribute("image",n);const s=document.createElement("div");function d(){o.remove();const s=a.isCreatedFolio(e);if(a.removeFolio(e),!s){const e=c(t,"mei");i.appendChild(e)}const l=c(n,"image");r.appendChild(l)}s.classList.add("folio-filename"),s.innerHTML=l(e,50),o.appendChild(s);const u=document.createElement("img");return u.className="unpair_btn",u.src="/Neon/Neon-gh/assets/img/unpair-doc.svg",u.title="unpair",u.addEventListener("click",d),o.appendChild(u),o}(s,i,r);e.appendChild(d),a.addFolio(s,i,r,o),o||t.parentElement.parentElement.remove(),n.parentElement.parentElement.remove()},t.handleUploadAllDocuments=async function(e){const t=[...a.getFolios().map(async([t,n,r])=>{const a=(0,i.v4)();return await async function(e,t,n,i,r){const a=d(t,s.FileSystemTools.getAllNames(r));return(0,o.createManifest)(e,a,n,i).then(t=>{const n=new Blob([JSON.stringify(t,null,2)],{type:"application/ld+json"});return(0,o.addDocument)(e,a,n,!0)}).then(n=>{if(n){const t=(new Date).toLocaleString(),n=s.FileSystemTools.createFile(a,e),i=s.FileSystemTools.addMetadata(n,{type:"folio",created_on:t});return s.FileSystemTools.addEntry(i,r)?a:null}return console.log("failed to uploadFolio: "+t),null})}(a,t,n,r,e)})].map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e})));return a.clear(),Promise.all(t)},t.sortFileByName=async function(e){const t=e.parentElement.nextElementSibling,n=Array.from(t.children);let i=e.classList.contains("arrow-up");i?(e.classList.remove("arrow-up"),e.classList.add("arrow-down"),e.innerHTML="⋁"):(e.classList.remove("arrow-down"),e.classList.add("arrow-up"),e.innerHTML="⋀"),i=!i,n.sort((e,t)=>{const n=e.textContent.trim(),r=t.textContent.trim();return i?n.localeCompare(r):r.localeCompare(n)}),n.forEach(e=>{t.appendChild(e)}),e.setAttribute("style","color: black")},t.formatFilename=l,t.fnConflictHandler=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(17),r=n(32);class o{constructor(){this.allFiles=new Map,this.folios=new Array}static getInstance(){return o.instance||(o.instance=new o),o.instance}addFile(e){if(this.allFiles.has(e.name)){const t={file:e,count:this.getFileCount(e.name)+1};this.allFiles.set(e.name,t)}else{const t={file:e,count:1};this.allFiles.set(e.name,t)}}async setMeiTemplate(e){try{const t=await fetch(e);if(!t.ok)throw new Error("Failed to load MEI template from "+e);this.meiTemplate=await t.text()}catch(e){console.error(e)}}createMeiFile(e,t,n,o){try{if(!this.meiTemplate)throw new Error("Cannot find MEI template");const s=new DOMParser,a=new XMLSerializer,c=s.parseFromString(this.meiTemplate,"text/xml"),l=c.documentElement;l.querySelector("meiHead").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("fileDesc").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("titleStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("title").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("pubStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("facsimile").setAttribute("xml:id","m-"+(0,i.uuidv4)());const d=l.querySelector("surface"),u="m-"+(0,i.uuidv4)();d.setAttribute("xml:id",u),d.setAttribute("lrx",t.toString()),d.setAttribute("lry",n.toString());const f=l.querySelector("zone"),m="m-"+(0,i.uuidv4)();f.setAttribute("xml:id",m);const p=.1,h=.15,g=Math.round(p*t),v=Math.round(h*t);f.setAttribute("ulx",v.toString()),f.setAttribute("uly",g.toString()),f.setAttribute("lrx",(t-v).toString()),f.setAttribute("lry",(g+3*o).toString());l.querySelector("mdiv").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("score").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("scoreDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffGrp").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("section").setAttribute("xml:id","m-"+(0,i.uuidv4)());const y=l.querySelector("pb");y.setAttribute("xml:id","m-"+(0,i.uuidv4)()),y.setAttribute("facs","#"+u);const b=l.querySelector("sb");b.setAttribute("xml:id","m-"+(0,i.uuidv4)()),b.setAttribute("facs","#"+m);const _=r.xml(a.serializeToString(c)),w=new Blob([_],{type:"text/xml"});return new File([w],e,{type:"text/xml"})}catch(e){console.error(e)}}getImgDimension(e){return new Promise((t,n)=>{const i=this.getFile(e);if(!i)return void n(new Error("File not found: "+e));const r=new FileReader;r.onload=i=>{const r=new Image;r.onload=()=>{const e=document.createElement("canvas"),i=e.getContext("2d",{willReadFrequently:!0});if(!i)return void n(new Error("Could not get 2D context"));e.width=r.width,e.height=r.height,i.drawImage(r,0,0);const o=i.getImageData(0,0,e.width,e.height),s=o.data;for(let e=0;e0?(a.push(c),c=0):c++}const l=a.length>0?this.findSecondMode(a):0;t({width:r.width,height:r.height,staffSpace:l})},r.onerror=()=>{n(new Error("Failed to load image: "+e))},r.src=i.target.result},r.readAsDataURL(i)})}findSecondMode(e){const t=new Map;e.forEach(e=>{const n=(t.get(e)||0)+1;t.set(e,n)});return Array.from(t.entries()).sort((e,t)=>t[1]-e[1])[1][0]}getFile(e){if(this.allFiles.has(e))return this.allFiles.get(e).file}removeFile(e){const t=this.getFileCount(e);if(0!==t)if(1===t)this.allFiles.delete(e);else{const n={file:this.allFiles.get(e).file,count:t-1};this.allFiles.set(e,n)}}getFileCount(e){return this.allFiles.has(e)?this.allFiles.get(e).count:0}addFolio(e,t,n,i){const r={filename:e,mei_filename:t,image_filename:n,isCreated:i};this.folios.push(r)}isCreatedFolio(e){const t=this.folios.find(t=>t.filename===e);return!!t&&t.isCreated}removeFolio(e){const t=this.folios.findIndex(t=>t.filename===e);this.folios.splice(t,1)}getFolios(){return this.folios.map(e=>{const t=e.filename,n=e.mei_filename,i=e.image_filename;return[t,this.getFile(n),this.getFile(i)]})}clear(){this.allFiles.clear(),this.folios.splice(0)}print(){console.log(this.allFiles),console.log(this.folios)}}t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.trashEntryOptions=t.trashFolderOptions=t.multiFolderOptions=t.singleFolderOptions=t.folderAndFileOptions=t.multiFileOptions=t.singleFileOptions=t.defaultOptions=void 0,t.defaultOptions='
\n
Upload document
\n \n
\n
\n
New folder
\n \n
',t.singleFileOptions='
\n
Open
\n \n
\n
\n
Move to Trash
\n \n
\n
\n
Rename
\n \n
\n
\n
Move
\n \n
',t.multiFileOptions='
\n
Open
\n \n
\n
\n
Move to Trash
\n \n
\n
\n
Move
\n \n
',t.folderAndFileOptions='
\n
Delete
\n \n
\n
\n
Move
\n \n
',t.singleFolderOptions='
\n
Open
\n \n
\n
\n
Move to Trash
\n \n
\n
\n
Rename
\n \n
\n
\n
Move
\n \n
',t.multiFolderOptions='
\n
Move to Trash
\n \n
\n
\n
Move
\n \n
',t.trashFolderOptions='
\n
Empty Trash
\n \n
',t.trashEntryOptions='
\n
Put Back
\n \n
\n
\n
Delete
\n \n
'}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ltbWVkaWF0ZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0xvY2FsU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL1NlbGVjdFRvb2xzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Ob3RpZmljYXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FyZ3NhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJkM1wiIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L0NvbnRlbnRzLnRzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Nb2RhbFdpbmRvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db29yZGluYXRlcy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3BhcmstbWQ1L3NwYXJrLW1kNS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvcmFuZG9tLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db2xvci50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnV2dXplbGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRHJhZ0hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvR3JvdXBpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9FcnJvckxvZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvUmVzaXplLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wb3VjaGRiL2xpYi9pbmRleC1icm93c2VyLmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92a2JlYXV0aWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvV2FybmluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvU3RhZmZUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9OZXVtZVRvb2xzLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3F1ZXVlTWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL211dGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL21lc3NhZ2VDaGFubmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3N0YXRlQ2hhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9TdG9yYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkLnRzIiwid2VicGFjazovLy8uL2RlcGxveW1lbnQvc2NyaXB0cy9kYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1JbnRlcmZhY2VzLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRmlsZVN5c3RlbS9GaWxlU3lzdGVtVG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1NYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvc2FtcGxlc19maWxlbmFtZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9EYXNoYm9hcmRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEFyZWEudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9VcGxvYWRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEZpbGVNYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvQ29udGV4dE1lbnVDb250ZW50LnRzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiUmVmbGVjdE93bktleXMiLCJSIiwiUmVmbGVjdCIsIlJlZmxlY3RBcHBseSIsImFwcGx5IiwidGFyZ2V0IiwicmVjZWl2ZXIiLCJhcmdzIiwiRnVuY3Rpb24iLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImNvbmNhdCIsIk51bWJlcklzTmFOIiwiTnVtYmVyIiwiaXNOYU4iLCJFdmVudEVtaXR0ZXIiLCJpbml0IiwidGhpcyIsIm9uY2UiLCJlbWl0dGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJlcnJvckxpc3RlbmVyIiwiZXJyIiwicmVtb3ZlTGlzdGVuZXIiLCJyZXNvbHZlciIsInNsaWNlIiwiYXJndW1lbnRzIiwiZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyIiwiaGFuZGxlciIsImZsYWdzIiwib24iLCJhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlciIsIl9ldmVudHMiLCJ1bmRlZmluZWQiLCJfZXZlbnRzQ291bnQiLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsImNoZWNrTGlzdGVuZXIiLCJsaXN0ZW5lciIsIlR5cGVFcnJvciIsIl9nZXRNYXhMaXN0ZW5lcnMiLCJ0aGF0IiwiX2FkZExpc3RlbmVyIiwidHlwZSIsInByZXBlbmQiLCJldmVudHMiLCJleGlzdGluZyIsIndhcm5pbmciLCJuZXdMaXN0ZW5lciIsImVtaXQiLCJ1bnNoaWZ0IiwicHVzaCIsImxlbmd0aCIsIndhcm5lZCIsInciLCJFcnJvciIsIlN0cmluZyIsImNvdW50IiwiY29uc29sZSIsIndhcm4iLCJvbmNlV3JhcHBlciIsImZpcmVkIiwid3JhcEZuIiwiX29uY2VXcmFwIiwic3RhdGUiLCJ3cmFwcGVkIiwiX2xpc3RlbmVycyIsInVud3JhcCIsImV2bGlzdGVuZXIiLCJhcnIiLCJyZXQiLCJBcnJheSIsInVud3JhcExpc3RlbmVycyIsImFycmF5Q2xvbmUiLCJsaXN0ZW5lckNvdW50IiwiY29weSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ3cmFwTGlzdGVuZXIiLCJhcmciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0IiwiUmFuZ2VFcnJvciIsImdldFByb3RvdHlwZU9mIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwiZG9FcnJvciIsImVycm9yIiwiZXIiLCJtZXNzYWdlIiwiY29udGV4dCIsImxlbiIsImxpc3RlbmVycyIsImFkZExpc3RlbmVyIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3QiLCJwb3NpdGlvbiIsIm9yaWdpbmFsTGlzdGVuZXIiLCJzaGlmdCIsImluZGV4IiwicG9wIiwic3BsaWNlT25lIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwia2V5cyIsInJhd0xpc3RlbmVycyIsImV2ZW50TmFtZXMiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIlRlbXBDdG9yIiwiZHJhaW5pbmciLCJjdXJyZW50UXVldWUiLCJzY2hlZHVsZURyYWluIiwidHlwZXMiLCJxdWV1ZUluZGV4IiwicXVldWUiLCJzY2hlZHVsZWQiLCJjbGVhblVwTmV4dFRpY2siLCJuZXh0VGljayIsInRpbWVvdXQiLCJzZXRUaW1lb3V0IiwicnVuIiwiY2xlYXJUaW1lb3V0IiwidGVzdCIsImluc3RhbGwiLCJJdGVtIiwiZnVuIiwiYXJyYXkiLCJ0YXNrIiwibG9jYWxTZXR0aW5ncyIsIkRFRkFVTFRfU0VUVElOR1MiLCJ6b29tIiwiZ2x5cGhPcGFjaXR5IiwiaW1hZ2VPcGFjaXR5IiwiY2lyY2xlU2l6ZSIsImhpZ2hsaWdodE1vZGUiLCJ1c2VyTW9kZSIsImluc2VydE1vZGUiLCJpbnNlcnRUYWIiLCJzZWxlY3Rpb25Nb2RlIiwiZGVidWdNb2RlIiwiZGlzcGxheUJCb3giLCJkaXNwbGF5VGV4dCIsImRpc3BsYXlJbmZvIiwiZGlzcGxheUVyckxvZyIsInZpZXdCb3giLCJzZXR0aW5ncyIsInBhcmFtcyIsImZvbGlvSWQiLCJpZCIsImxvYWQiLCJzdG9yZWQiLCJKU09OIiwicGFyc2UiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic3luYyIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJnZXRTZWxlY3Rpb25UeXBlIiwiZWxlbWVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInVuc2VsZWN0IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJzZWxlY3RlZCIsImNsYXNzTGlzdCIsInJlbW92ZSIsImNvbnRhaW5zIiwicmVtb3ZlQXR0cmlidXRlIiwiQ29sb3IiLCJ1bmhpZ2hsaWdodCIsInN0eWxlIiwiZmlsbCIsImZyb20iLCJkaXZMaW5lIiwic3Ryb2tlIiwic2V0QXR0cmlidXRlIiwibmV1bWUiLCJzeWxSZWN0IiwicGFyZW50RWxlbWVudCIsImFkZCIsImQzIiwic2VsZWN0QWxsIiwiZWwiLCJjb2xvciIsImZvbnRXZWlnaHQiLCJnZXRFbGVtZW50QnlJZCIsIlNlbGVjdE9wdGlvbnMiLCJlbmRPcHRpb25zU2VsZWN0aW9uIiwiR3JvdXBpbmciLCJlbmRHcm91cGluZ1NlbGVjdGlvbiIsImlubmVySFRNTCIsInVwZGF0ZUhpZ2hsaWdodCIsInNlbGVjdFN0YWZmIiwic3RhZmYiLCJkcmFnSGFuZGxlciIsImhpZ2hsaWdodCIsInRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMiLCJpbml0R3JvdXBpbmdMaXN0ZW5lcnMiLCJkcmFnSW5pdCIsInNlbGVjdExheWVyRWxlbWVudCIsImxheWVyRWxlbWVudCIsInNlbGVjdCIsIm5lZWRzSGlnaGxpZ2h0VXBkYXRlIiwic3lsSWQiLCJlbGVtIiwiY2xvc2VzdCIsInNwYW4iLCJhc3luYyIsImlzTGlnYXR1cmUiLCJuYyIsIm5lb25WaWV3IiwiYXR0cmlidXRlcyIsImdldEVsZW1lbnRBdHRyIiwidmlldyIsImdldEN1cnJlbnRQYWdlVVJJIiwiQm9vbGVhbiIsImxpZ2F0ZWQiLCJlbGVtZW50c0hhdmVDb3JyZWN0VHlwZSIsInNlbGVjdGlvblR5cGUiLCJlbGVtZW50cyIsInNoYXJlZFNlY29uZExldmVsUGFyZW50IiwidGVtcEVsZW1lbnRzIiwic2Vjb25kUGFyZW50Iiwic2VsZWN0QkJveCIsImJib3giLCJzeWwiLCJyZXNpemUiLCJxdWVyeVNlbGVjdG9yIiwidHJpZ2dlckJCb3hBY3Rpb25zIiwicGFyZW50IiwicHJldk5jIiwicHJldmlvdXNTaWJsaW5nIiwibmV4dE5jIiwibmV4dFNpYmxpbmciLCJ0cmlnZ2VyR3JvdXBpbmciLCJ0cmlnZ2VyTmNBY3Rpb25zIiwiYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUiLCJzb3J0ZWRFbGVtZW50cyIsImoiLCJpc1NhbWVOb2RlIiwiZmlyc3RFbGVtIiwic2Vjb25kRWxlbSIsImluZGV4MSIsImluZGV4T2YiLCJpbmRleDIiLCJNYXRoIiwiYWJzIiwiZmlsdGVyIiwicmVmZXJlbmNlUGFyZW50U3RhZmYiLCJyZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSIsImVsZW1lbnRzQXJyYXkiLCJhbm90aGVyU3RhZmYiLCJ1bHgiLCJ1bHkiLCJscngiLCJscnkiLCJyb3RhdGUiLCJwYXRoIiwiY29vcmRpbmF0ZXMiLCJnZXRBdHRyaWJ1dGUiLCJtYXRjaCIsIm1hcCIsImF0YW4iLCJtaW4iLCJtYXgiLCJub3ROZXVtZXMiLCJubiIsInNlbGVjdGlvbkNsYXNzIiwiY29udGFpbnNMYXllckVsZW1lbnRzIiwiY29udGFpbnNOYyIsImdyb3Vwc1RvU2VsZWN0IiwiU2V0IiwiZ3JvdXBpbmciLCJmb2xsb3dzIiwicHJlY2VkZXMiLCJoYXMiLCJncm91cCIsImdyb3VwcyIsInZhbHVlcyIsInRyaWdnZXJNdWx0aVN0YWZmQWN0aW9ucyIsInNpemUiLCJ0cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyIsInRyaWdnZXJEZWZhdWx0QWN0aW9ucyIsInRyaWdnZXJTeWxsYWJsZUFjdGlvbnMiLCJpc0xpbmthYmxlIiwiaXNHcm91cGFibGUiLCJ0cmlnZ2VyTmV1bWVBY3Rpb25zIiwiY2hpbGRyZW4iLCJmaXJzdE5DIiwic2Vjb25kTkMiLCJmaXJzdE5DWCIsIngiLCJiYXNlVmFsIiwic2Vjb25kTkNYIiwiZmlyc3ROQ1kiLCJ5Iiwic2Vjb25kTkNZIiwiZyIsInRyaWdnZXJEZWZhdWx0U3lsQWN0aW9ucyIsIm5vdGlmaWNhdGlvbnMiLCJjdXJyZW50TW9kZU1lc3NhZ2UiLCJub3RpZmljYXRpb25JY29uIiwiZGVmYXVsdCIsInN1Y2Nlc3MiLCJOb3RpZmljYXRpb24iLCJsb2dJbmZvIiwiZGlzcGxheWVkIiwidXVpZHY0IiwiaXNNb2RlTWVzc2FnZSIsInNlYXJjaCIsInRpbWVvdXRJRCIsImNsZWFyTm90aWZpY2F0aW9uIiwiY3VycmVudElkIiwic3RhcnROb3RpZmljYXRpb24iLCJub3RpZmljYXRpb24iLCJnZXRJZCIsIm5vdGlmaWNhdGlvbkNvbnRlbnQiLCJuZXdOb3RpZmljYXRpb24iLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kIiwiZGlzcGxheSIsImRpc3BsYXlOb3RpZmljYXRpb24iLCJzZXRUaW1lb3V0SWQiLCJxdWV1ZU5vdGlmaWNhdGlvbiIsInJlY29yZE5vdGlmaWNhdGlvbiIsImluc2VydFRhYkh0bWwiLCJwcmltaXRpdmVUYWIiLCJncm91cGluZ1RhYiIsInN5c3RlbVRhYiIsImluc2VydENvbnRyb2xzUGFuZWwiLCJlZGl0Q29udHJvbHNQYW5lbCIsIm5jQWN0aW9uQ29udGVudHMiLCJkZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyIsIm5ldW1lQWN0aW9uQ29udGVudHMiLCJkZWZhdWx0QWN0aW9uQ29udGVudHMiLCJkZWZhdWx0U3lsQWN0aW9uQ29udGVudHMiLCJjdXN0b3NBY3Rpb25Db250ZW50cyIsImxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzIiwibGF5ZXJFbGVtZW50SW5BY3Rpb25Db250ZW50cyIsImFjY2lkQWN0aW9uQ29udGVudHMiLCJzdGFmZlNwbGl0QWN0aW9uQ29udGVudHMiLCJzdGFmZk1lcmdlQWN0aW9uQ29udGVudHMiLCJjb2x1bW5BY3Rpb25Db250ZW50cyIsImNsZWZBY3Rpb25Db250ZW50cyIsImRpdkxpbmVBY3Rpb25Db250ZW50cyIsImJib3hBY3Rpb25Db250ZW50cyIsImdyb3VwaW5nTWVudSIsImxpZ2F0dXJlTmMiLCJsaWdhdHVyZSIsInNwbGl0U3lsbGFibGUiLCJlZGl0VGV4dE1vZGFsIiwiaG90a2V5c01vZGFsIiwic3lsbGFibGVBY3Rpb25zQ29udGVudCIsImVycm9yTG9nc1BhbmVsQ29udGVudHMiLCJlIiwiYnl0ZVRvSGV4IiwidG9TdHJpbmciLCJzdWJzdHIiLCJvZmZzZXQiLCJ1dWlkIiwidG9Mb3dlckNhc2UiLCJsYXN0R2x5cGhPcGFjaXR5IiwibGFzdEltYWdlT3BhY2l0eSIsImxhc3RDaXJjbGVTaXplIiwic2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciIsIm1laUNsYXNzTmFtZSIsIm9wYWNpdHlPdXRwdXQiLCJzZXRTZXR0aW5ncyIsImhpZGVHbHlwaEltZyIsIm9wYWNpdHkiLCJzZXRCZ09wYWNpdHlGcm9tU2xpZGVyIiwiYmFja2dyb3VuZCIsImJnT3BhY2l0eU91dHB1dCIsImhpZGVCZ0ltZyIsImJnIiwidXBkYXRlSGlnaGxpZ2h0T3B0aW9uIiwib3B0aW9uIiwiZHJvcGRvd24iLCJoaWdobGlnaHRUeXBlIiwidGV4dENvbnRlbnQiLCJ1bnNldEdyb3VwaW5nSGlnaGxpZ2h0IiwidG9VcHBlckNhc2UiLCJzZXRHcm91cGluZ0hpZ2hsaWdodCIsInNldEhpZ2hsaWdodE9wdGlvbiIsImhpZ2hsaWdodENsaWNrYXdheSIsImJvZHkiLCJzZXRIaWdobGlnaHRDb250cm9scyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInRvZ2dsZSIsImxvYWRIaWdobGlnaHRTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiem9vbUhhbmRsZXIiLCJ6b29tU2xpZGVyIiwiem9vbU91dHB1dCIsInpvb21UbyIsInJlc2V0Wm9vbUFuZFBhbiIsImRpc2FibGVkIiwiY3VycmVudFpvb20iLCJwYXJzZUludCIsInByZXZlbnREZWZhdWx0IiwibmV3Wm9vbSIsImNpcmNsZVNsaWRlciIsImNpcmNsZU91dHB1dCIsImNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIiLCJyZXNpemVQb2ludHMiLCJlbXB0eSIsImF0dHIiLCJoaWdobGlnaHRTZWxlY3Rpb24iLCJoaWdobGlnaHRJZCIsImRpc3BsYXlBbGxCdG4iLCJkaXNwbGF5QkJveGVzIiwiY2hlY2tlZCIsIm9wYWNpdHlTbGlkZXIiLCJpbnB1dENoYW5nZU9wYWNpdHkiLCJ0b2dnbGVPcGFjaXR5QnRuIiwibmV3T3BhY2l0eSIsInJvdW5kIiwic2V0R2x5cGhPcGFjaXR5Q29udHJvbHMiLCJiZ09wYWNpdHlTbGlkZXIiLCJiZ0lucHV0Q2hhbmdlSGFuZGxlciIsInRvZ2dsZUJnT3BhY2l0eUJ0biIsInNldEJnT3BhY2l0eUNvbnRyb2xzIiwibWV0YUtleSIsInNlbGVjdEFsbEJ0biIsIm9wdGlvbnMiLCJjbGljayIsInNldERpc3BsYXlBbGxMaXN0ZW5lciIsImRpc3BsYXlDb250ZW50cyIsInRvZ2dsZURpc3BsYXkiLCJwYWRkaW5nIiwib3ZlcmZsb3ciLCJNb2RhbFdpbmRvd1ZpZXciLCJNb2RhbFdpbmRvd1N0YXRlIiwib3BlbkVkaXRTeWxUZXh0TW9kYWxXaW5kb3ciLCJoaWRlTW9kYWxXaW5kb3ciLCJ1cGRhdGVTeWxUZXh0IiwiZm9jdXNNb2RhbFdpbmRvdyIsIm9yaWciLCJyZXBsYWNlIiwidHJpbSIsInVwZGF0ZWRTeWxUZXh0IiwiZWRpdG9yQWN0aW9uIiwiYWN0aW9uIiwicGFyYW0iLCJlbGVtZW50SWQiLCJlbnRyaWVzIiwiY2xhc3NOYW1lIiwidGV4dCIsImVkaXQiLCJ0aGVuIiwicmVzcG9uc2UiLCJ1cGRhdGVGb3JDdXJyZW50UGFnZSIsInVwZGF0ZVNlbGVjdGVkQkJveCIsImtleWRvd25MaXN0ZW5lciIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsIm1vZGFsV2luZG93VmlldyIsIkVESVRfVEVYVCIsIkRPQ1VNRU5UX1VQTE9BRCIsIk5FV19GT0xERVIiLCJSRU5BTUUiLCJmb2N1cyIsIm1vZGFsV2luZG93U3RhdGUiLCJDTE9TRUQiLCJzZXR1cEV2ZW50TGlzdGVuZXJzIiwiY29udGVudCIsInNldE1vZGFsV2luZG93Q29udGVudCIsIkhPVEtFWVMiLCJNT1ZFX1RPIiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwiT1BFTiIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwiY29udGFpbmVyIiwidGl0bGUiLCJpbm5lclRleHQiLCJyZW1vdmVTeW1ib2wiLCJFUlJPUl9MT0ciLCJlbmNvZGVVUkkiLCJ1cGxvYWRBcmVhSFRNTCIsIm5ld0ZvbGRlckhUTUwiLCJyZW5hbWVIVE1MIiwiYmJveElkIiwiZmluZCIsImRpc3BsYXlSZWN0IiwidW5zZXRJbmNsaW5hdHVtQWN0aW9uIiwiYXR0clR5cGUiLCJhdHRyVmFsdWUiLCJ1bnNldFZpcmdhQWN0aW9uIiwidW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uIiwidW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uIiwidW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbiIsImN1cnZlIiwiZGVsZXRlQnV0dG9uSGFuZGxlciIsInJlbW92ZUhhbmRsZXIiLCJtb3JlRWRpdCIsImV4dHJhRWRpdCIsInRvUmVtb3ZlIiwiY2hhaW5BY3Rpb24iLCJjaGFuZ2VTdGFmZkhhbmRsZXIiLCJ0b0NoYW5nZSIsImluc2VydFRvU3lsbGFibGVIYW5kbGVyIiwidG9JbnNlcnQiLCJyZXN1bHQiLCJtb3ZlT3V0c2lkZVN5bGxhYmxlSGFuZGxlciIsInRvTW92ZSIsIm1hdGNoSGVpZ2h0SGFuZGxlciIsImFkZERlbGV0ZUxpc3RlbmVyIiwiZGVsIiwiYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lciIsImNoYW5nZVN0YWZmIiwidXBkYXRlQ29sdW1uSW5mbyIsImNvbElucHV0Iiwic3RhdmVzIiwiY29sSW5mbyIsImhhc0NvbHVtbiIsImpvaW4iLCJzdGFmZkNvbCIsImFkZENvbHVtbkluZm9TdGVwSGFuZGxlciIsImRlY3JlbWVudEJ1dHRvbiIsImluY3JlbWVudEJ1dHRvbiIsImNvbmZpcm1CdXR0b24iLCJ1cGRhdGVOdW1iZXIiLCJjaGFuZ2UiLCJjdXJyZW50VmFsdWUiLCJ0b1NldENvbHVtbiIsInNldEVkaXRDb250cm9scyIsImVkaXRUeXBlIiwiY29udGVudHMiLCJwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uIiwidHJpZ2dlclN0YWZmU3BsaXRNb2RlIiwiU3BsaXRTdGFmZkhhbmRsZXIiLCJzdGFydFNwbGl0IiwiaW5pdE9wdGlvbnNMaXN0ZW5lcnMiLCJkcm9wIiwib3B0aW9uc0NsaWNrYXdheSIsIm90aGVyIiwiaW5pdE5lb25WaWV3IiwiQ29udGVudHMiLCJ1bnNldEluY2xpbmF0dW0iLCJ1bnNldFZpcmdhIiwidW5zZXRWaXJnYVJldmVyc2VkIiwidW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwidW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSIsInNldEluY2xpbmF0dW0iLCJzZXRWaXJnYSIsInNldFZpcmdhUmV2ZXJzZWQiLCJzZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwic2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UiLCJ0cmlnZ2VyQ2hhbmdlR3JvdXAiLCJjb250b3VyIiwiY2hhbmdlR3JvdXBpbmdBY3Rpb24iLCJTcGxpdE5ldW1lSGFuZGxlciIsImluZm8iLCJnZXRDb250b3VyQnlWYWx1ZSIsImV4dHJhQWN0aW9uc0hUTUwiLCJhY2NpZE9wdGlvbnNMaXN0ZW5lciIsImluY3JlbWVudE9jdGF2ZSIsImRpcmVjdGlvbiIsInNoYXBlIiwiY2xlZk9wdGlvbnNMaXN0ZW5lciIsImRpdkxpbmVPcHRpb25zTGlzdGVuZXIiLCJtZXJnZVN0YXZlcyIsInBvaW50cyIsImdldFN0YWZmQkJveCIsInlfY2hhbmdlIiwidGFuIiwiZ2V0U1ZHUmVsQ29vcmRzIiwiY2xpZW50WCIsImNsaWVudFkiLCJwdCIsIkRPTVBvaW50IiwicGFnZU1hcmdpbiIsIm1hdHJpeFRyYW5zZm9ybSIsImdldFNjcmVlbkNUTSIsImludmVyc2UiLCJnZXRTdGFmZklkQnlDb29yZHMiLCJzdGFmZkJCb3hlcyIsInN0YWZmSWQiLCJiZ0ltZyIsInJlY3QiLCJ0YWdOYW1lIiwiZ2V0QkJveCIsInBhcmVudE5vZGUiLCJ3aWR0aCIsImhlaWdodCIsImhleF9jaHIiLCJtZDVjeWNsZSIsImsiLCJhIiwiYiIsIm1kNWJsayIsIm1kNWJsa3MiLCJjaGFyQ29kZUF0IiwibWQ1YmxrX2FycmF5IiwibWQ1MSIsInRhaWwiLCJ0bXAiLCJsbyIsImhpIiwic3Vic3RyaW5nIiwicmhleCIsImhleCIsInRvVXRmOCIsInN0ciIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaGV4VG9CaW5hcnlTdHJpbmciLCJieXRlcyIsImZyb21DaGFyQ29kZSIsIlNwYXJrTUQ1IiwicmVzZXQiLCJBcnJheUJ1ZmZlciIsImNsYW1wIiwidmFsIiwidG8iLCJudW0iLCJ0YXJnZXRBcnJheSIsInNvdXJjZUFycmF5IiwiYnl0ZUxlbmd0aCIsImJlZ2luIiwiZW5kIiwiVWludDhBcnJheSIsImFwcGVuZEJpbmFyeSIsIl9idWZmIiwiX2xlbmd0aCIsIl9oYXNoIiwicmF3IiwiYnVmZiIsIl9maW5pc2giLCJnZXRTdGF0ZSIsImhhc2giLCJzZXRTdGF0ZSIsImRlc3Ryb3kiLCJoYXNoQmluYXJ5IiwiZmlyc3QiLCJzZWNvbmQiLCJyZXR1cm5VSW50OEFycmF5IiwiYnVmZmVyIiwic3ViYXJyYXkiLCJ1dGY4U3RyMkFycmF5QnVmZmVyIiwibWQ1MV9hcnJheSIsImZhY3RvcnkiLCJ1aW50OFRvVXVpZCIsImRhdGEiLCJjYiIsInByZXZpb3VzIiwiY3VycmVudCIsInBhZFN0YXJ0IiwicmVkdWNlIiwiY3J5cHRvIiwib2N0ZXRzIiwibW9kaWZpZXJzIiwiZ2V0UmFuZG9tVmFsdWVzIiwiQ29sb3JQYWxldHRlIiwicmVjdHMiLCJ1bnNldFN0YWZmSGlnaGxpZ2h0IiwiY2hpbGQiLCJjY2hpbGQiLCJzZXRTdGFmZkhpZ2hsaWdodCIsInN0YWZmQ29sb3IiLCJjb2x1bW5OdW0iLCJjb2x1bW4iLCJzZXRDb2x1bW5IaWdobGlnaHQiLCJncm91cENvbG9yIiwiZGl2TGluZUNoaWxkcmVuIiwicm5kczgiLCJybmciLCJtc0NyeXB0byIsIm9iaiIsInN0YWNrIiwibWV0YVN0YWNrIiwibGFzdE1ldGFFbGVtZW50IiwibGFzdEVsZW1lbnRJbmRleCIsImlzQXJyYXkiLCJpbnB1dCIsIm5leHQiLCJhcnJheVByZWZpeCIsIm9ialByZWZpeCIsInJlcyIsInByZWZpeCIsImNvbGxhdGlvbkluZGV4IiwicGFyc2VkTnVtIiwibnVtQ2hhciIsInBhcnNlZFN0cmluZyIsImxhc3RDaCIsIm51bUNvbnNlY3V0aXZlU2xhc2hlcyIsImNoIiwiYXJyYXlFbGVtZW50Iiwib2JqRWxlbWVudCIsInBhcnNlRmxvYXQiLCJidWYiLCJybmRzIiwicmFuZG9tIiwic2VsZWN0b3IiLCJkcmFnU3RhcnRDb29yZHMiLCJkcmFnQmVoYXZpb3VyIiwiZHJhZyIsImV2ZW50IiwiZHgiLCJkeSIsInNvdXJjZUV2ZW50IiwiZHJhZ2dpbmciLCJkcmFnRW5kZWQiLCJzZWxlY3Rpb24iLCJub01vdmVQcmVjZWRlcyIsImhhc0F0dHJpYnV0ZSIsIm1vdmVFbGVtZW50cyIsImJib3hlcyIsInhEaWZmIiwieURpZmYiLCJpc0N1cnNvck91dE9mQm91bmRzIiwiaXNEcmFnT3V0T2ZCb3VuZHMiLCJyZXR1cm5FbGVtZW50cyIsInBhcmFtQXJyYXkiLCJkcmFnQWN0aW9uIiwidG9SZXNlbGVjdCIsInJlc2VsZWN0IiwicmVzZWxlY3RlZCIsInJlc2V0VG9BY3Rpb24iLCJlbmRYIiwiZW5kWSIsImlzT3V0T2ZTVkdCb3VuZHMiLCJnbHlwaFNlbGVjdG9yIiwic2VsZWN0aW9uQkJveCIsImFjYyIsImdldEdseXBoQkJveCIsImN1cnIiLCJNQVhfVkFMVUUiLCJNSU5fVkFMVUUiLCJTZWxlY3RUb29scyIsInNoYXJlZExvZ2ljYWxQYXJlbnQiLCJhcmVBZGphY2VudCIsImNvbnRhaW5zTGlua2VkIiwiaXNMaW5rZWQiLCJjYW5CZUxpbmtlZCIsInNvcnQiLCJzdGFmZkEiLCJzdGFmZkIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzeWxsYWJsZXMiLCJjdXJyZW50U3lsbGFibGVJbmRleCIsImN1cnJlbnRTdGFmZiIsIm5leHRTdGFmZiIsImN1cnJlbnRTdGFmZkluZGV4IiwiZXZlcnkiLCJ1bmxpbmtlZEVsZW1lbnRzIiwiZmlyc3RVbmxpbmtlZCIsIkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyIsImlkeCIsInN5bGxhYmxlIiwiYXQiLCJuZXh0U3lsbGFibGVJZCIsIm5leHRTeWxsYWJsZUlkeCIsIm5leHRTeWxsYWJsZSIsInByZXZTeWxsYWJsZUlkIiwicHJldlN5bGxhYmxlIiwiaGFzSW52YWxpZExpbmtlZFN5bGxhYmxlIiwic3lzdGVtcyIsImVsZW1lbnRJZHMiLCJncm91cGluZ0FjdGlvbiIsImdldENoaWxkcmVuSWRzIiwiZ2V0SWRzIiwidG9nZ2xlTGlua2VkU3lsbGFibGVzIiwiZ3JvdXBUeXBlIiwibmV1bWVQYXJlbnQiLCJuY3MiLCJnZXRDb250b3VyIiwiV2FybmluZ3MiLCJncm91cGluZ05vdFJlY29nbml6ZWQiLCJnZXRTVkdHcmFwaGljc0VsZW1lbnRCeUlkIiwiU1ZHR3JhcGhpY3NFbGVtZW50IiwidW5saW5rIiwiZmlyc3RTeWxsYWJsZSIsInNlY29uZFN5bGxhYmxlIiwidW5saW5rZWRFbGVtZW50IiwiZ2V0VG9nZ2xlU3lsbGFibGVJZHMiLCJsb2ciLCJpZHMiLCJjaGlsZHJlbklkcyIsIkVudHJ5VHlwZSIsIkZpbGVTeXN0ZW1Ub29scyIsIkZpbGVTeXN0ZW1NYW5hZ2VyIiwiY3JlYXRlTG9nTWVzc2FnZSIsIm5vdGlmIiwibm90aWZEaXYiLCJyZW1vdmVCdG4iLCJvbmNsaWNrIiwiaW5mb0J0biIsIm1vZGFsV2luZG93IiwiTW9kYWxXaW5kb3ciLCJzZXRNb2RhbFdpbmRvd1ZpZXciLCJvcGVuTW9kYWxXaW5kb3ciLCJvcGVuRXJyb3JMb2dXaW5kb3ciLCJpbml0RXJyb3JMb2dDb250cm9scyIsImVycm9yUGFuZWwiLCJoZWFkaW5nIiwiZHJvcGRvd25JY29uIiwiaW5pdERpc3BsYXlMaXN0ZW5lciIsImNoZWNrYm94ZXNDb250YWluZXIiLCJlcnJvcnNMYWJlbCIsImVyb3Jyc0J0biIsImFwcGVuZENoaWxkIiwidXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5Iiwibm90aWZQYW5lbCIsIlBvaW50TmFtZXMiLCJUb3BMZWZ0IiwiVG9wIiwiVG9wUmlnaHQiLCJSaWdodCIsIkJvdHRvbVJpZ2h0IiwiQm90dG9tIiwiQm90dG9tTGVmdCIsIkxlZnQiLCJnZXRQb2ludHMiLCJzaW4iLCJpbml0aWFsVWx4IiwiaW5pdGlhbExyeCIsImluaXRpYWxQb2ludCIsImluaXRpYWxVbHkiLCJpbml0aWFsTHJ5IiwiaW5pdGlhbFkiLCJpbml0aWFsUmVjdFkiLCJwb2x5TGVuIiwiaW5pdGlhbFJvdGF0ZSIsInJlZHJhdyIsInBvaW50U3RyaW5nIiwiX2VsZW0iLCJ0ZXh0UmVjdCIsInBvaW50TmFtZSIsInBvaW50IiwicG9pbnRTdHJpbmdSaWdodCIsInBvaW50U3RyaW5nTGVmdCIsImRyYXdJbml0aWFsUmVjdCIsIndoaWNoUG9pbnQiLCJfIiwidmlld3BvcnRFbGVtZW50IiwicmVzaXplU3RhcnQiLCJyZXNpemVEcmFnIiwicmVzaXplRW5kIiwicm90YXRlU3RhcnQiLCJ0ZW1wIiwibW91c2UiLCJ0ZW1wUm90YXRlIiwicm90YXRlRW5kIiwiY3VycmVudFBvaW50Iiwid2hpY2giLCJQSSIsIkV4cG9ydGVkU2V0IiwiRXhwb3J0ZWRNYXAiLCJtYW5nbGUiLCJ1bm1hbmdsZSIsIk1hcCQxIiwiX3N0b3JlIiwiU2V0JDEiLCJjbG9uZUJpbmFyeU9iamVjdCIsImNsb25lQXJyYXlCdWZmZXIiLCJ3ZWJraXRTbGljZSIsIm1hbmdsZWQiLCJkZWxldGUiLCJNYXAiLCJwcm9wIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic3BlY2llcyIsInN1cHBvcnRzTWFwQW5kU2V0IiwiZnVuY1RvU3RyaW5nIiwib2JqZWN0Q3RvclN0cmluZyIsImNsb25lIiwibmV3T2JqZWN0IiwiRGF0ZSIsImlzRmluaXRlIiwidG9JU09TdHJpbmciLCJCbG9iIiwiaXNCaW5hcnlPYmplY3QiLCJwcm90byIsIkN0b3IiLCJpc1BsYWluT2JqZWN0IiwiY2FsbGVkIiwidG9Qcm9taXNlIiwiZnVuYyIsInNlbGYiLCJ1c2VkQ0IiLCJwcm9taXNlIiwiZnVsZmlsbCIsInJlc3AiLCJjYWxsYmFjayIsIm1lc2ciLCJhZGFwdGVyRnVuIiwiX2Nsb3NlZCIsIl9kZXN0cm95ZWQiLCJsb2dBcmdzIiwib3JpZ0NhbGxiYWNrIiwicmVzcG9uc2VBcmdzIiwibG9nQXBpQ2FsbCIsInRhc2txdWV1ZSIsImlzUmVhZHkiLCJhZGRUYXNrIiwiZmFpbGVkIiwicGljayIsImhhc0xvY2FsIiwiaWRlbnRpdHlGdW5jdGlvbiIsImZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0Iiwib2siLCJidWxrR2V0IiwiZGIiLCJvcHRzIiwicmVxdWVzdHMiLCJkb2NzIiwicmVxdWVzdHNCeUlkIiwicmVxdWVzdCIsIm51bURvY3MiLCJudW1Eb25lIiwicGVyRG9jUmVzdWx0cyIsImNoZWNrRG9uZSIsInJlc3VsdHMiLCJhbGxSZXF1ZXN0cyIsIm5leHRCYXRjaCIsInVwVG8iLCJiYXRjaCIsImRvY0lkIiwiZG9jSWR4IiwiZG9jUmVxdWVzdHMiLCJkb2NPcHRzIiwib3Blbl9yZXZzIiwicmV2IiwiZm9ybWF0UmVzdWx0IiwicHJvY2Vzc0JhdGNoIiwiaGFzTG9jYWxTdG9yYWdlIiwiQ2hhbmdlcyIsImF0dGFjaEJyb3dzZXJFdmVudHMiLCJndWFyZGVkQ29uc29sZSIsIm1ldGhvZCIsImRlZmF1bHRCYWNrT2ZmIiwibWF4VGltZW91dCIsInJhbmRvbU51bWJlciIsImV4cGxhaW5FcnJvciIsInN0YXR1cyIsImRiTmFtZSIsImlucHJvZ3Jlc3MiLCJldmVudEZ1bmN0aW9uIiwiY2hhbmdlc09wdHMiLCJjaGFuZ2VzIiwic2VxIiwic2luY2UiLCJjYW5jZWxsZWQiLCJvbkNoYW5nZSIsIm5vdGlmeUxvY2FsV2luZG93cyIsIm5vdGlmeSIsIiRpbmplY3RfT2JqZWN0X2Fzc2lnbiIsImFzc2lnbiIsIm5leHRTb3VyY2UiLCJuZXh0S2V5IiwiUG91Y2hFcnJvciIsInJlYXNvbiIsIk1JU1NJTkdfQlVMS19ET0NTIiwiTUlTU0lOR19ET0MiLCJSRVZfQ09ORkxJQ1QiLCJJTlZBTElEX0lEIiwiTUlTU0lOR19JRCIsIlJFU0VSVkVEX0lEIiwiVU5LTk9XTl9FUlJPUiIsIkJBRF9BUkciLCJRVUVSWV9QQVJTRV9FUlJPUiIsIkRPQ19WQUxJREFUSU9OIiwiQkFEX1JFUVVFU1QiLCJOT1RfQU5fT0JKRUNUIiwiSURCX0VSUk9SIiwiSU5WQUxJRF9SRVYiLCJNSVNTSU5HX1NUVUIiLCJjcmVhdGVFcnJvciIsIkN1c3RvbVBvdWNoRXJyb3IiLCJuYW1lcyIsImdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UiLCJmaWx0ZXJDaGFuZ2UiLCJyZXEiLCJoYXNGaWx0ZXIiLCJxdWVyeSIsInF1ZXJ5X3BhcmFtcyIsImRvYyIsImZpbHRlclJldHVybiIsIm1zZyIsInRyeUZpbHRlciIsImluY2x1ZGVfZG9jcyIsImF0dGFjaG1lbnRzIiwiYXR0IiwiX2F0dGFjaG1lbnRzIiwic3R1YiIsImZsYXR0ZW4iLCJhcnJzIiwiaW52YWxpZElkRXJyb3IiLCJpc1JlbW90ZSIsIl9yZW1vdGUiLCJwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZSIsInBhcnRzIiwic3BsaXQiLCJub3JtYWxpemVEZXNpZ25Eb2NGdW5jdGlvbk5hbWUiLCJub3JtYWxpemVkIiwicVBhcnNlciIsInBhcnNlciIsInBhcnNlVXJpIiwiZXhlYyIsInVyaSIsImVuY29kZWQiLCJkZWNvZGVVUklDb21wb25lbnQiLCIkMCIsIiQxIiwiJDIiLCJzY29wZUV2YWwiLCJzb3VyY2UiLCJzY29wZSIsInVwc2VydCIsImRpZmZGdW4iLCJjYXRjaCIsImRvY1JldiIsIl9yZXYiLCJuZXdEb2MiLCJfaWQiLCJwdXQiLCJ1cGRhdGVkIiwidHJ5QW5kUHV0IiwidGhpc0F0b2IiLCJhdG9iIiwidGhpc0J0b2EiLCJidG9hIiwiY3JlYXRlQmxvYiIsInByb3BlcnRpZXMiLCJidWlsZGVyIiwiQmxvYkJ1aWxkZXIiLCJNU0Jsb2JCdWlsZGVyIiwiTW96QmxvYkJ1aWxkZXIiLCJXZWJLaXRCbG9iQnVpbGRlciIsImdldEJsb2IiLCJiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyIiwiYmluIiwiYmluU3RyaW5nVG9CbHVmZmVyIiwiYmluU3RyaW5nIiwiYjY0VG9CbHVmZmVyIiwiYjY0IiwicmVhZEFzQmluYXJ5U3RyaW5nIiwiYmxvYiIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJoYXNCaW5hcnlTdHJpbmciLCJvbmxvYWRlbmQiLCJiaW5hcnkiLCJhcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJibG9iVG9CaW5hcnlTdHJpbmciLCJibG9iT3JCdWZmZXIiLCJibG9iVG9CYXNlNjQiLCJiYXNlNjQiLCJzZXRJbW1lZGlhdGVTaGltIiwic2V0SW1tZWRpYXRlIiwiYXBwZW5kQmxvYiIsInN0YXJ0Iiwic2xpY2VCbG9iIiwiYXJyYXlCdWZmZXIiLCJhcHBlbmRTdHJpbmciLCJzdHJpbmciLCJiaW5hcnlNZDUiLCJpbnB1dElzU3RyaW5nIiwiY2h1bmtTaXplIiwiY2h1bmtzIiwiY2VpbCIsImN1cnJlbnRDaHVuayIsImxvYWROZXh0Q2h1bmsiLCJkb25lIiwicmF3VG9CYXNlNjQiLCJzdHJpbmdNZDUiLCJyZXYkJDEiLCJkZXRlcm1pbmlzdGljX3JldnMiLCJtdXRhdGVhYmxlRG9jIiwiX3Jldl90cmVlIiwid2lubmluZ1JldiIsIm1ldGFkYXRhIiwid2lubmluZ0lkIiwid2lubmluZ1BvcyIsIndpbm5pbmdEZWxldGVkIiwibm9kZSIsInRvVmlzaXQiLCJyZXZfdHJlZSIsInRyZWUiLCJicmFuY2hlcyIsInBvcyIsImRlbGV0ZWQiLCJ0cmF2ZXJzZVJldlRyZWUiLCJyZXZzIiwibmV3Q3R4IiwiY3R4Iiwic29ydEJ5UG9zIiwiY29sbGVjdExlYXZlcyIsImxlYXZlcyIsImlzTGVhZiIsInJldmVyc2UiLCJjb2xsZWN0Q29uZmxpY3RzIiwid2luIiwiY29uZmxpY3RzIiwibGVhZiIsInJvb3RUb0xlYWYiLCJwYXRocyIsImhpc3RvcnkiLCJzb3J0QnlQb3MkMSIsImluc2VydFNvcnRlZCIsIml0ZW0iLCJjb21wYXJhdG9yIiwibWlkIiwibG93IiwiaGlnaCIsImJpbmFyeVNlYXJjaCIsInNwbGljZSIsInBhdGhUb1RyZWUiLCJudW1TdGVtbWVkIiwicm9vdCIsImN1cnJlbnRMZWFmIiwiY29tcGFyZVRyZWUiLCJtZXJnZVRyZWUiLCJpbl90cmVlMSIsImluX3RyZWUyIiwidHJlZTEiLCJ0cmVlMiIsIm1lcmdlZCIsImRvTWVyZ2UiLCJkb250RXhwYW5kIiwicmVzdHJlZSIsImJyYW5jaCIsInQxIiwidDIiLCJkaWZmIiwiY2FuZGlkYXRlUGFyZW50cyIsInRyZWVzIiwicGFyZW50SWR4IiwiZWxlbWVudHNMZW4iLCJtZXJnZSIsImRlcHRoIiwibmV3VHJlZSIsInN0ZW1tZWQiLCJzdGVtbWVkUmV2cyIsInJldkhhc2giLCJzdGVtIiwiZ2V0VHJlZXMiLCJpc0RlbGV0ZWQiLCJpc0xvY2FsSWQiLCJDaGFuZ2VzJDEiLCJjb21wbGV0ZSIsImVlIiwib25EZXN0cm95IiwiY2FuY2VsIiwicGVuZGluZyIsImxhc3RTZXEiLCJpc0NhbmNlbGxlZCIsInRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lciIsInZhbGlkYXRlQ2hhbmdlcyIsInByb2Nlc3NDaGFuZ2UiLCJjaGFuZ2VMaXN0IiwiX2NvbmZsaWN0cyIsImNvbXBhcmUiLCJsZWZ0IiwicmlnaHQiLCJ5YW5rRXJyb3IiLCJjb21wYXJlQnlJZFRoZW5SZXYiLCJpZENvbXBhcmUiLCJfcmV2aXNpb25zIiwiQWJzdHJhY3RQb3VjaERCIiwiVGFza1F1ZXVlIiwiUG91Y2hEQiIsIl9fb3B0cyIsImF1dG9fY29tcGFjdGlvbiIsImJhY2tlbmQiLCJhZGFwdGVyIiwiYWRhcHRlcnMiLCJwcmVmZXJyZWRBZGFwdGVycyIsImFkYXB0ZXJOYW1lIiwidXNlX3ByZWZpeCIsInBhcnNlQWRhcHRlciIsIl9hZGFwdGVyIiwidmFsaWQiLCJ2aWV3X2FkYXB0ZXIiLCJmYWlsIiwib25EZXN0cm95ZWQiLCJmcm9tX2NvbnN0cnVjdG9yIiwib25DbG9zZWQiLCJwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24iLCJyZWFkeSIsIl9jaGFuZ2VzRmlsdGVyUGx1Z2luIiwidmFsaWRhdGUiLCJkb0NoYW5nZXMiLCJjb250aW51b3VzIiwibGl2ZSIsIm5vcm1hbGl6ZSIsInNob3VsZEZpbHRlciIsImRlc2NlbmRpbmciLCJsaW1pdCIsIm5ld1Byb21pc2UiLCJfY2hhbmdlcyIsInVwZGF0ZV9zZXEiLCJwb3N0IiwiYnVsa0RvY3MiLCJfcHV0TG9jYWwiLCJfZGVsZXRlZCIsIl9yZW1vdmVMb2NhbCIsIm9sZFJldklkIiwibmV3UmV2TnVtIiwibmV3UmV2SWQiLCJwdXREb2MiLCJfcHV0IiwibmV3X2VkaXRzIiwiZm9yY2UiLCJwdXRBdHRhY2htZW50IiwiYXR0YWNobWVudElkIiwiYXBpIiwiY3JlYXRlQXR0YWNobWVudCIsInByZXZyZXZwb3MiLCJjb250ZW50X3R5cGUiLCJyZXZwb3MiLCJyZW1vdmVBdHRhY2htZW50IiwiZG9jT3JJZCIsIm9wdHNPclJldiIsIndhc19kZWxldGUiLCJyZXZzRGlmZiIsIm1pc3NpbmciLCJhZGRUb01pc3NpbmciLCJyZXZJZCIsIl9nZXRSZXZpc2lvblRyZWUiLCJtaXNzaW5nRm9ySWQiLCJwcm9jZXNzRG9jIiwibWlzc2luZ09iaiIsImNvbXBhY3REb2N1bWVudCIsIm1heEhlaWdodCIsInJldlRyZWUiLCJlZGdlcyIsInBybnQiLCJlZGdlIiwiY29tcHV0ZUhlaWdodCIsImNhbmRpZGF0ZXMiLCJfZG9Db21wYWN0aW9uIiwiY29tcGFjdCIsIl9jb21wYWN0aW9uUXVldWUiLCJkb05leHRDb21wYWN0aW9uIiwibGFzdF9zZXEiLCJfY29tcGFjdCIsInJldHVybl9kb2NzIiwicHJvbWlzZXMiLCJyb3ciLCJhbGwiLCJfZ2V0TG9jYWwiLCJmaW5pc2hPcGVuUmV2cyIsImxhdGVzdCIsIl9nZXQiLCJyZXZzX2luZm8iLCJzcGxpdHRlZFJldiIsInJldk5vIiwiY3VycmVudFBhdGgiLCJoYXNoSW5kZXgiLCJpbmRleE9mUmV2IiwiaG93TWFueSIsIl9yZXZzX2luZm8iLCJfZ2V0QXR0YWNobWVudCIsImdldEF0dGFjaG1lbnQiLCJhbGxEb2NzIiwic2tpcCIsInN0YXJ0X2tleSIsInN0YXJ0a2V5IiwiZW5kX2tleSIsImVuZGtleSIsImluY29tcGF0aWJsZU9wdCIsImFsbERvY3NLZXlzUGFyc2UiLCJfYWxsRG9jcyIsImNsb3NlIiwiX2Nsb3NlIiwiX2luZm8iLCJkYl9uYW1lIiwiX3R5cGUiLCJhdHRhY2htZW50RXJyb3IiLCJjaGFyQXQiLCJhdHRhY2htZW50TmFtZUVycm9yIiwiYXR0cyIsImNsZWFuRG9jcyIsIl9idWxrRG9jcyIsInJlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UiLCJkZXBlbmRlbnREYiIsImRiT3B0aW9ucyIsImRlcERCIiwiZGVwZW5kZW50RGJzIiwidXNlUHJlZml4IiwiZGVzdHJveURiIiwiX2Rlc3Ryb3kiLCJsb2NhbERvYyIsImRlbGV0ZWRNYXAiLCJ0cnVlTmFtZSIsIlJlZ0V4cCIsImV4ZWN1dGUiLCJBYm9ydENvbnRyb2xsZXIiLCJhYm9ydCIsImYkMSIsImZldGNoIiwiaCIsIkhlYWRlcnMiLCJldmVudEVtaXR0ZXIiLCJQb3VjaCIsImRlc3RydWN0TGlzdGVuZXJzIiwiX2Rlc3RydWN0aW9uTGlzdGVuZXJzIiwiZGJMaXN0Iiwic2V0VXBFdmVudEVtaXR0ZXIiLCJhZGRUb1ByZWZlcnJlZEFkYXB0ZXJzIiwicGx1Z2luIiwiX19kZWZhdWx0cyIsImRlZmF1bHRzIiwiZGVmYXVsdE9wdHMiLCJQb3VjaEFsdCIsInVybCIsImdldEZpZWxkRnJvbURvYyIsInBhcnNlZEZpZWxkIiwicGFyc2VGaWVsZCIsImZpZWxkTmFtZSIsImZpZWxkcyIsImNvbWJpbmF0aW9uRmllbGRzIiwiaXNDb21iaW5hdGlvbmFsRmllbGQiLCJmaWVsZCIsImdldEtleSIsIm1lcmdlQW5kZWRTZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCIkb3IiLCIkbm9yIiwibWF0Y2hlciIsIiRlcSIsImxvbmdlc3QiLCJmaWVsZE1hdGNoZXJzIiwib3BlcmF0b3IiLCIkZ3RlIiwiJGd0IiwibWVyZ2VHdEd0ZSIsIiRsdGUiLCIkbHQiLCJtZXJnZUx0THRlIiwiJG5lIiwibWVyZ2VOZSIsIm1lcmdlRXEiLCIkcmVnZXgiLCJtZXJnZVJlZ2V4IiwibWFzc2FnZVNlbGVjdG9yIiwid2FzQW5kZWQiLCJpc0FuZEluU2VsZWN0b3IiLCJpc0FuZCIsIm1lcmdlQW5kZWRTZWxlY3RvcnNOZXN0ZWQiLCJvck9yTm9yIiwic3ViU2VsZWN0b3IiLCJjb2xsYXRlIiwibm9ybWFsaXplS2V5IiwiYWkiLCJiaSIsInN0cmluZ0NvbGxhdGUiLCJhcnJheUNvbGxhdGUiLCJhayIsImJrIiwib2JqZWN0Q29sbGF0ZSIsIkluZmluaXR5Iiwib3JpZ0tleSIsInRvSlNPTiIsImluZGV4aWZ5IiwiZXhwRm9ybWF0IiwidG9FeHBvbmVudGlhbCIsIm1hZ25pdHVkZSIsIm5lZyIsIm1hZ1N0cmluZyIsInBhZFdpdGgiLCJ1cFRvTGVuZ3RoIiwidGFyZ2V0TGVuZ3RoIiwicGFkIiwiZmFjdG9yIiwiZmFjdG9yU3RyIiwidG9GaXhlZCIsIm51bVRvSW5kZXhhYmxlU3RyaW5nIiwidG9JbmRleGFibGVTdHJpbmciLCJvYmpLZXkiLCJwYXJzZU51bWJlciIsIm9yaWdpbmFsSWR4IiwibnVtQXNTdHJpbmciLCJtYWdBc1N0cmluZyIsImZpbHRlckluTWVtb3J5RmllbGRzIiwicm93cyIsInJlcXVlc3REZWYiLCJpbk1lbW9yeUZpZWxkcyIsInJvd0ZpbHRlciIsImZpZWxkU29ydGVyIiwiZ2V0RmllbGRWYWx1ZXNBc0FycmF5Iiwic29ydGluZyIsImFSb3ciLCJiUm93IiwiY29sbGF0aW9uIiwiY3JlYXRlRmllbGRTb3J0ZXIiLCJkb2NGaWVsZFZhbHVlIiwic29tZSIsIm9yTWF0Y2hlcnMiLCJtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yIiwibWF0Y2hTZWxlY3RvciIsIm1heWJlVXNlck9wZXJhdG9yIiwidXNlclZhbHVlIiwic3ViUGFyc2VkRmllbGQiLCJzdWJEb2NGaWVsZFZhbHVlIiwidXNlck9wZXJhdG9yIiwibWF0Y2hlcnMiLCJmaWVsZEV4aXN0cyIsImZpZWxkSXNOb3RVbmRlZmluZWQiLCJhcnJheUNvbnRhaW5zVmFsdWUiLCJkb2NGaWVsZFZhbHVlSXRlbSIsIm1vZEZpZWxkIiwibmVWYWx1ZSIsImFycmF5U2l6ZSIsImFycmF5Q29udGFpbnNBbGxWYWx1ZXMiLCJyZWdleFZhbHVlIiwicmVnZXhNYXRjaCIsInR5cGVNYXRjaCIsImZpbHRlck5hbWUiLCJjaGFuZ2VzSGFuZGxlciIsImRvY19pZHMiLCJ2aWV3TmFtZSIsImRkb2MiLCJtYXBGdW4iLCJ2aWV3cyIsInJvd3NNYXRjaGVkIiwibWF0Y2hlc1NlbGVjdG9yIiwiZmlsdGVyRnVuIiwiZmlsdGVycyIsInRvT2JqZWN0IiwidmVyc2lvbiIsInJlc2VydmVkV29yZHMiLCJkYXRhV29yZHMiLCJwYXJzZVJldmlzaW9uSW5mbyIsInBhcnNlRG9jIiwibmV3RWRpdHMiLCJkYk9wdHMiLCJuUmV2TnVtIiwicmV2SW5mbyIsInJldmlzaW9ucyIsInJldmlzaW9uSWRzIiwibWFrZVJldlRyZWVGcm9tUmV2aXNpb25zIiwic3BlY2lhbEtleSIsInByZXByb2Nlc3NTdHJpbmciLCJibG9iVHlwZSIsImFzQmluYXJ5IiwicGFyc2VCYXNlNjQiLCJkaWdlc3QiLCJwcmVwcm9jZXNzQXR0YWNobWVudCIsIm1kNSIsInByZXByb2Nlc3NCbG9iIiwidXBkYXRlRG9jIiwicmV2TGltaXQiLCJwcmV2IiwiZG9jSW5mbyIsIndyaXRlRG9jIiwic3BsaXRSZXYiLCJ0YXJnZXRQb3MiLCJ0YXJnZXRJZCIsInJldkV4aXN0cyIsInByZXZpb3VzV2lubmluZ1JldiIsInByZXZpb3VzbHlEZWxldGVkIiwiaXNSb290IiwibmV3UmV2IiwicmV2X21hcCIsIndpbm5pbmdSZXYkJDEiLCJ3aW5uaW5nUmV2SXNEZWxldGVkIiwiZGVsdGEiLCJwcm9jZXNzRG9jcyIsImRvY0luZm9zIiwiZmV0Y2hlZERvY3MiLCJ0eCIsIm92ZXJhbGxDYWxsYmFjayIsImlkc1RvRG9jcyIsImRvY3NEb25lIiwiZG9jc1RvRG8iLCJjaGVja0FsbERvY3NEb25lIiwiY3VycmVudERvYyIsInJlc3VsdHNJZHgiLCJkb2NXcml0dGVuIiwibmV4dERvYyIsInJvb3RJc01pc3NpbmciLCJpbnNlcnREb2MiLCJET0NfU1RPUkUiLCJNRVRBX1NUT1JFIiwic2FmZUpzb25TdHJpbmdpZnkiLCJqc29uIiwiaWRiRXJyb3IiLCJlbmNvZGVNZXRhZGF0YSIsImRlbGV0ZWRPckxvY2FsIiwiZGVjb2RlTWV0YWRhdGEiLCJzdG9yZWRPYmplY3QiLCJzYWZlSnNvblBhcnNlIiwiZGVjb2RlRG9jIiwiX2RvY19pZF9yZXYiLCJsYXN0SW5kZXhPZiIsInJlYWRCbG9iRGF0YSIsImFzQmxvYiIsImZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeSIsInR4biIsImF0dE9iaiIsIm9iamVjdFN0b3JlIiwib25zdWNjZXNzIiwiZmV0Y2hBdHRhY2htZW50IiwicG9zdFByb2Nlc3NBdHRhY2htZW50cyIsImF0dE5hbWVzIiwiY29tcGFjdFJldnMiLCJwb3NzaWJseU9ycGhhbmVkRGlnZXN0cyIsInNlcVN0b3JlIiwiYXR0U3RvcmUiLCJhdHRBbmRTZXFTdG9yZSIsIklEQktleVJhbmdlIiwiYm91bmQiLCJkZWxldGVPcnBoYW5lZEF0dGFjaG1lbnRzIiwib3BlbkN1cnNvciIsIm9ubHkiLCJjdXJzb3IiLCJkaWdlc3RTZXEiLCJwcmltYXJ5S2V5IiwiY29udGludWUiLCJvcGVuVHJhbnNhY3Rpb25TYWZlbHkiLCJpZGIiLCJzdG9yZXMiLCJ0cmFuc2FjdGlvbiIsImlkYkJ1bGtEb2NzIiwiZG9jU3RvcmUiLCJieVNlcVN0b3JlIiwiYXR0YWNoU3RvcmUiLCJhdHRhY2hBbmRTZXFTdG9yZSIsIm1ldGFTdG9yZSIsImRvY0luZm9FcnJvciIsIm1ldGFEb2MiLCJhbGxEb2NzUHJvY2Vzc2VkIiwiZG9jQ291bnREZWx0YSIsInByZWNvbmRpdGlvbkVycm9yZWQiLCJfbWV0YSIsImJsb2JTdXBwb3J0Iiwib25BbGxEb2NzUHJvY2Vzc2VkIiwidXBkYXRlRG9jQ291bnRJZlJlYWR5IiwiZG9jQ291bnQiLCJuZXdSZXZJc0RlbGV0ZWQiLCJpc1VwZGF0ZSIsImNvbGxlY3RSZXN1bHRzIiwiZmluaXNoRG9jIiwiYXR0YWNobWVudFNhdmVkIiwibmV3QXR0Iiwic2F2ZUF0dGFjaG1lbnQiLCJ3cml0ZUF0dGFjaG1lbnRzIiwiYWZ0ZXJQdXREb2MiLCJyZXZzVG9EZWxldGUiLCJjb21wYWN0VHJlZSIsIm1ldGFkYXRhVG9TdG9yZSIsImFmdGVyUHV0TWV0YWRhdGEiLCJhdHRzQWRkZWQiLCJhdHRzVG9BZGQiLCJvbmVycm9yIiwiaW5zZXJ0QXR0YWNobWVudE1hcHBpbmdzIiwicHV0UmVxIiwib3ZlcmFsbEVyciIsImRvY3YiLCJyZWN2IiwicHJvY2Vzc2VkQXR0YWNobWVudCIsInByZXByb2Nlc3NBdHRhY2htZW50cyIsInR4blJlc3VsdCIsIm9uYWJvcnQiLCJvbnRpbWVvdXQiLCJvbmNvbXBsZXRlIiwiZmluaXNoIiwiZGlnZXN0cyIsImZpbGVuYW1lIiwidmVyaWZ5QXR0YWNobWVudCIsImF0dEVyciIsInZlcmlmeUF0dGFjaG1lbnRzIiwibnVtRmV0Y2hlZCIsInJldnNfbGltaXQiLCJyZWFkTWV0YWRhdGEiLCJmZXRjaEV4aXN0aW5nRG9jcyIsInN0YXJ0VHJhbnNhY3Rpb24iLCJydW5CYXRjaGVkQ3Vyc29yIiwia2V5UmFuZ2UiLCJiYXRjaFNpemUiLCJvbkJhdGNoIiwia2V5c0JhdGNoIiwidmFsdWVzQmF0Y2giLCJwc2V1ZG9DdXJzb3IiLCJvbkdldEFsbCIsIm9uR2V0QWxsS2V5cyIsIm9uQ3Vyc29yIiwiZ2V0QWxsIiwiZ2V0QWxsS2V5cyIsIm5ld0tleVJhbmdlIiwibGFzdEtleSIsInVwcGVyIiwidXBwZXJPcGVuIiwiY29kZSIsImxvd2VyQm91bmQiLCJpZGJBbGxEb2NzIiwia2V5UmFuZ2VFcnJvciIsImluY2x1c2l2ZUVuZCIsImluY2x1c2l2ZV9lbmQiLCJ1cHBlckJvdW5kIiwiY3JlYXRlS2V5UmFuZ2UiLCJvblJlc3VsdHNSZWFkeSIsInVwZGF0ZVNlcSIsIm9uU3VjY2VzcyIsImRvY0lkUmV2SW5kZXgiLCJhbGxEb2NzSW5uZXIiLCJmZXRjaERvY0FzeW5jaHJvbm91c2x5IiwiYmF0Y2hWYWx1ZXMiLCJiYXRjaFZhbHVlIiwiYmF0Y2hLZXlzIiwicmV0dXJuVmFsIiwidG90YWxfcm93cyIsIm1heEtleSIsImFsbERvY3NLZXlzIiwicnVubmluZyIsImFwcGx5TmV4dCIsImRvY0lkcyIsIm51bVJlc3VsdHMiLCJkb2NJZHNUb01ldGFkYXRhIiwib25HZXRNZXRhZGF0YSIsImRvY0lkUmV2Iiwib2JqZWN0U3RvcmVzIiwid2lubmluZ0RvY3MiLCJtZXRhZGF0YXMiLCJmZXRjaFdpbm5pbmdEb2NBbmRNZXRhZGF0YSIsIndpbm5pbmdEb2MiLCJwcm9jZXNzTWV0YWRhdGFBbmRXaW5uaW5nRG9jIiwib25CYXRjaERvbmUiLCJmaWx0ZXJlZCIsImJsb2JTdXBwb3J0UHJvbWlzZSIsImNhY2hlZERCcyIsIm9wZW5SZXFMaXN0IiwiSWRiUG91Y2giLCJ0cnlDb2RlIiwiZW5xdWV1ZVRhc2siLCJ0aGlzQ2FsbGJhY2siLCJpZGJHbG9iYWxGYWlsdXJlRXJyb3IiLCJlbnJpY2hDYWxsYmFja0Vycm9yIiwiYWRkRGVsZXRlZE9yTG9jYWxJbmRleCIsImNyZWF0ZUluZGV4IiwidW5pcXVlIiwibWlncmF0ZUxvY2FsU3RvcmUiLCJsb2NhbFN0b3JlIiwibG9jYWwiLCJyYW5nZSIsInNlcUN1cnNvciIsIm1pZ3JhdGVBdHRzQW5kU2VxcyIsImRpZ2VzdE1hcCIsIm1pZ3JhdGVNZXRhZGF0YSIsIm9uR2V0TWV0YWRhdGFTZXEiLCJtZXRhZGF0YVNlcSIsImZldGNoTWV0YWRhdGFTZXEiLCJpbnN0YW5jZUlkIiwicmVxT3B0cyIsImhpc3RvcnlOb2RlIiwiYXR0YWNoSWQiLCJhdHRhY2htZW50IiwiYmxvYkRhdGEiLCJkb2NfY291bnQiLCJpZGJfYXR0YWNobWVudF9mb3JtYXQiLCJvbGRSZXYiLCJvU3RvcmUiLCJvbGREb2MiLCJvcGVuUmVxIiwiaW5kZXhlZERCIiwiZGVsZXRlRGF0YWJhc2UiLCJjYWNoZWQiLCJnbG9iYWwiLCJvcGVuIiwib251cGdyYWRlbmVlZGVkIiwib2xkVmVyc2lvbiIsImNyZWF0ZU9iamVjdFN0b3JlIiwia2V5UGF0aCIsImF1dG9JbmNyZW1lbnQiLCJjcmVhdGVTY2hlbWEiLCJjdXJyZW50VGFyZ2V0IiwiY3JlYXRlTG9jYWxTdG9yZVNjaGVtYSIsImFkZEF0dGFjaEFuZFNlcVN0b3JlIiwibWlncmF0aW9ucyIsIm1pZ3JhdGlvbiIsIm9udmVyc2lvbmNoYW5nZSIsInN0b3JlZE1ldGFEb2MiLCJjb21wbGV0ZVNldHVwIiwic3RvcmVNZXRhRG9jSWZSZWFkeSIsImluc3RhbmNlS2V5IiwiY291bnREb2NzIiwiYmxvYiQkMSIsIm1hdGNoZWRDaHJvbWUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJtYXRjaGVkRWRnZSIsImNoZWNrQmxvYlN1cHBvcnQiLCJzdXBwb3J0c0J1bGtHZXRNYXAiLCJyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlciIsImVuY29kZURvY0lkIiwicHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEiLCJnZXRIb3N0IiwicHJvdG9jb2wiLCJoYXNVcmxQcmVmaXgiLCJ1c2VyIiwicGFzc3dvcmQiLCJhdXRoIiwidXNlcm5hbWUiLCJnZW5EQlVybCIsImdlblVybCIsInBhdGhEZWwiLCJob3N0IiwicG9ydCIsInBhcmFtc1RvU3RyIiwiSHR0cFBvdWNoIiwiZGJVcmwiLCJzZXR1cFByb21pc2UiLCJvdXJGZXRjaCIsImhlYWRlcnMiLCJjcmVkZW50aWFscyIsIm5BdXRoIiwidG9rZW4iLCJ1YSIsImlzSUUiLCJpc1RyaWRlbnQiLCJpc0VkZ2UiLCJpc0dFVCIsInNob3VsZENhY2hlQnVzdCIsIm5vdyIsImFkYXB0ZXJGdW4kJDEiLCJzZXR1cCIsImZldGNoSlNPTiIsInYiLCJza2lwX3NldHVwIiwiZW5jb2RlQXR0YWNobWVudElkIiwidXVpZCQkMSIsInBpbmciLCJjb21wYWN0X3J1bm5pbmciLCJpbnRlcnZhbCIsImRvQnVsa0dldCIsImRvQnVsa0dldFNoaW0iLCJudW1CYXRjaGVzIiwib25SZXN1bHQiLCJiYXRjaE51bSIsInN1Yk9wdHMiLCJzdXBwb3J0c0J1bGtHZXQiLCJmZXRjaEF0dGFjaG1lbnRzIiwiZmlsZW5hbWVzIiwicHJvbWlzZUZhY3RvcmllcyIsImRvTmV4dCIsInJ1bk5leHRCYXRjaCIsIm9uRXJyb3IiLCJ0aGlzRXJyIiwicG9vbCIsInR5cGVGaWVsZERlc2NyaXB0b3IiLCJfX3Byb3RvX18iLCJmZXRjaERhdGEiLCJkb2NPckRvY3MiLCJjb250ZW50VHlwZSIsInByb2Nlc3MiLCJicm93c2VyIiwicGFyYW1TdHIiLCJiYXRjaF9zaXplIiwiaGVhcnRiZWF0IiwicmVxdWVzdFRpbWVvdXQiLCJsZWZ0VG9GZXRjaCIsImZlZWQiLCJzZXFfaW50ZXJ2YWwiLCJwYXJhbV9uYW1lIiwibGFzdEZldGNoZWRTZXEiLCJjb250cm9sbGVyIiwiYWJvcnRlZCIsImZldGNoT3B0cyIsInNpZ25hbCIsImZldGNoZWQiLCJyYXdfcmVzdWx0c19sZW5ndGgiLCJmaW5pc2hlZCIsIlF1ZXJ5UGFyc2VFcnJvciIsImNhcHR1cmVTdGFja1RyYWNlIiwiTm90Rm91bmRFcnJvciIsIkJ1aWx0SW5FcnJvciIsInByb21pc2VkQ2FsbGJhY2siLCJzZXF1ZW50aWFsaXplIiwicHJvbWlzZUZhY3RvcnkiLCJ1bmlxIiwidGhlU2V0IiwibWFwVG9LZXlzQXJyYXkiLCJjcmVhdGVCdWlsdEluRXJyb3IiLCJzdW0iLCJqTGVuIiwiak51bSIsImV2YWxGdW5jdGlvbldpdGhFdmFsIiwiVGFza1F1ZXVlJDEiLCJjcmVhdGVWaWV3Iiwic291cmNlREIiLCJyZWR1Y2VGdW4iLCJ0ZW1wb3JhcnkiLCJsb2NhbERvY05hbWUiLCJjYWNoZWRWaWV3cyIsInZpZXdTaWduYXR1cmUiLCJjcmVhdGVWaWV3U2lnbmF0dXJlIiwiX2NhY2hlZFZpZXdzIiwicHJvbWlzZUZvclZpZXciLCJkZXBEYk5hbWUiLCJmdWxsVmlld05hbWUiLCJkZXBEYnMiLCJsYXN0U2VxRG9jIiwicGVyc2lzdGVudFF1ZXVlcyIsInRlbXBWaWV3UXVldWUiLCJwYXJzZVZpZXdOYW1lIiwiZW1pdEVycm9yIiwiYnVpbHRJblJlZHVjZSIsInN1bXNxciIsIl9zdW1zcXIiLCJhYnN0cmFjdCIsIm1hcHBlciIsInJlZHVjZXIiLCJkZG9jVmFsaWRhdG9yIiwidHJ5TWFwIiwidHJ5UmVkdWNlIiwicmVyZWR1Y2UiLCJvdXRwdXQiLCJzb3J0QnlLZXlUaGVuVmFsdWUiLCJrZXlDb21wYXJlIiwic2xpY2VSZXN1bHRzIiwicm93VG9Eb2NJZCIsInBvc3Rwcm9jZXNzQXR0YWNobWVudHMiLCJhZGRIdHRwUGFyYW0iLCJwYXJhbU5hbWUiLCJhc0pzb24iLCJjb2VyY2VJbnRlZ2VyIiwiaW50ZWdlckNhbmRpZGF0ZSIsImFzTnVtYmVyIiwiY2hlY2tRdWVyeVBhcnNlRXJyb3IiLCJzdGFydGtleU5hbWUiLCJlbmRrZXlOYW1lIiwiZ3JvdXBfbGV2ZWwiLCJvcHRpb25OYW1lIiwibnVtYmVyIiwiY2hlY2tQb3NpdGl2ZUludGVnZXIiLCJkZWZhdWx0c1RvIiwiZ2V0RG9jc1RvUGVyc2lzdCIsImRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzIiwibWV0YURvY0lkIiwiZGVmYXVsdE1ldGFEb2MiLCJkb2NEYXRhIiwiaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzIiwiaXNHZW5PbmUiLCJnZXRLZXlWYWx1ZURvY3MiLCJrdkRvY3NSZXMiLCJrdkRvY3MiLCJvbGRLZXlzIiwia2V5VmFsdWUiLCJuZXdLZXlzIiwia3ZEb2MiLCJwcm9jZXNzS2V5VmFsdWVEb2NzIiwiZ2V0UXVldWUiLCJ1cGRhdGVWaWV3IiwibWFwUmVzdWx0cyIsImN1cnJlbnRTZXEiLCJsaXN0T2ZEb2NzVG9QZXJzaXN0IiwiZG9jc1RvUGVyc2lzdCIsInNhdmVLZXlWYWx1ZXMiLCJpbmRleGVkX2RvY3MiLCJwcm9ncmVzcyIsInByb2Nlc3NOZXh0QmF0Y2giLCJjaGFuZ2VzX2JhdGNoX3NpemUiLCJjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMiLCJjcmVhdGVEb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyIsInJlc3VsdHNfY291bnQiLCJlbWl0dGVkS2V5VmFsdWUiLCJjb21wbGV4S2V5IiwidXBkYXRlVmlld0luUXVldWUiLCJxdWVyeVZpZXciLCJ0b3RhbFJvd3MiLCJzaG91bGRSZWR1Y2UiLCJmZXRjaEZyb21WaWV3Iiwidmlld09wdHMiLCJleHBlY3RlZEtleXMiLCJwYXJzZWRLZXlBbmREb2NJZCIsInBhcnNlZFN0ciIsInBhcnNlSW5kZXhhYmxlU3RyaW5nIiwib25NYXBSZXN1bHRzUmVhZHkiLCJmaW5hbFJlc3VsdHMiLCJzaG91bGRHcm91cCIsImx2bCIsIlBPU0lUSVZFX0lORklOSVRZIiwibGFzdCIsImdyb3VwS2V5IiwicmVkdWNlVHJ5IiwicmVkdWNlVmlldyIsImFsbERvY3NSZXMiLCJkb2NJZHNUb0RvY3MiLCJmZXRjaFByb21pc2VzIiwia2V5U3RhcnQiLCJrZXlFbmQiLCJxdWVyeVZpZXdJblF1ZXVlIiwicXVlcnlQcm9taXNlZCIsIl9xdWVyeSIsImN1c3RvbVF1ZXJ5Iiwia2V5c0FzU3RyaW5nIiwiaHR0cFF1ZXJ5IiwidXBkYXRlVmlld09wdHMiLCJ2aWV3X3VwZGF0ZV9jaGFuZ2VzX2JhdGNoX3NpemUiLCJmaW5hbFByb21pc2VGYWN0b3J5IiwiZGVzaWduRG9jTmFtZSIsInN0YWxlIiwiY29lcmNlT3B0aW9ucyIsInZpZXdDbGVhbnVwIiwiX3ZpZXdDbGVhbnVwIiwiY3VzdG9tVmlld0NsZWFudXAiLCJodHRwVmlld0NsZWFudXAiLCJkb2NzVG9WaWV3cyIsInZpZXdzVG9TdGF0dXMiLCJkZG9jTmFtZSIsInZpZXdEQk5hbWVzIiwic3RhdHVzSXNHb29kIiwidmlld0RCTmFtZSIsImRlc3Ryb3lQcm9taXNlcyIsImxvY2FsVmlld0NsZWFudXAiLCJjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZSIsIm9yaWdNYXAiLCJyZWR1Y2VGdW5TdHJpbmciLCJidWlsdEluIiwiZ2V0QnVpbHRJbiIsIm1hcHJlZHVjZSIsImlzR2VuT25lJDEiLCJnZXREb2NBdHRhY2htZW50cyIsImdldERvY3MiLCJzcmMiLCJkaWZmcyIsInJlc3VsdERvY3MiLCJmZXRjaFJldmlzaW9uT25lRG9jcyIsImhhc0NvbmZsaWN0cyIsImJ1bGtHZXRPcHRzIiwibWlzc2luZ1JldiIsImNyZWF0ZUJ1bGtHZXRPcHRzIiwiYnVsa0dldFJlc3BvbnNlIiwiYnVsa0dldEluZm8iLCJyZW1vdGVEb2MiLCJkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cyIsImZpbGVIYXNDaGFuZ2VkIiwiZ2V0RG9jQXR0YWNobWVudHNGcm9tVGFyZ2V0T3JTb3VyY2UiLCJ1cGRhdGVDaGVja3BvaW50IiwiY2hlY2twb2ludCIsInNlc3Npb24iLCJyZXR1cm5WYWx1ZSIsInNlc3Npb25faWQiLCJyZXBsaWNhdG9yIiwiQ2hlY2twb2ludGVyIiwid3JpdGVDaGVja3BvaW50IiwidXBkYXRlVGFyZ2V0IiwidXBkYXRlU291cmNlIiwid3JpdGVUYXJnZXRDaGVja3BvaW50Iiwid3JpdGVTb3VyY2VDaGVja3BvaW50IiwiaXNGb3JiaWRkZW5FcnJvciIsImNvbXBhcmlzb25zIiwidGFyZ2V0RG9jIiwic291cmNlRG9jIiwic3JjRG9jIiwidGd0RG9jIiwiY29tcGFyZVJlcGxpY2F0aW9uSGlzdG9yeSIsInNvdXJjZUhpc3RvcnkiLCJ0YXJnZXRIaXN0b3J5IiwiUyIsInNvdXJjZVJlc3QiLCJUIiwidGFyZ2V0UmVzdCIsImhhc1Nlc3Npb25JZCIsImNvbXBhcmVSZXBsaWNhdGlvbkxvZ3MiLCJzZXNzaW9uSWQiLCJwcm9wcyIsInJlc3QiLCJmbG9vciIsImdldENoZWNrcG9pbnQiLCJnZW5lcmF0ZVJlcGxpY2F0aW9uSWQiLCJxdWVyeVBhcmFtcyIsImZpbHRlclZpZXdOYW1lIiwic29ydE9iamVjdFByb3BlcnRpZXNCeUtleSIsInF1ZXJ5RGF0YSIsIm1kNXN1bSIsInJlcGxpY2F0ZSIsImN1cnJlbnRCYXRjaCIsInJlcElkIiwiY2hlY2twb2ludGVyIiwiYmF0Y2hlcyIsInBlbmRpbmdCYXRjaCIsIndyaXRpbmdDaGVja3BvaW50IiwiY2hhbmdlc0NvbXBsZXRlZCIsInJlcGxpY2F0aW9uQ29tcGxldGVkIiwiYmF0Y2hlc19saW1pdCIsImNoYW5nZXNQZW5kaW5nIiwiY2hhbmdlZERvY3MiLCJzdGFydF90aW1lIiwiZG9jc19yZWFkIiwiZG9jc193cml0dGVuIiwiZG9jX3dyaXRlX2ZhaWx1cmVzIiwiZXJyb3JzIiwiaW5pdENoZWNrcG9pbnRlciIsImNoZWNrcG9pbnRPcHRzIiwid3JpdGVEb2NzIiwiYnVsa09wdHMiLCJjb21wbGV0ZVJlcGxpY2F0aW9uIiwiZXJyb3JzQnlJZCIsImVycm9yc05vIiwiZXJyb3JOYW1lIiwiZmluaXNoQmF0Y2giLCJvdXRSZXN1bHQiLCJnZXRDaGFuZ2VzIiwib25DaGVja3BvaW50RXJyb3IiLCJnZXRCYXRjaERvY3MiLCJnb3QiLCJzdGFydE5leHRCYXRjaCIsImFib3J0UmVwbGljYXRpb24iLCJwcm9jZXNzUGVuZGluZ0JhdGNoIiwiaW1tZWRpYXRlJCQxIiwiZmF0YWxFcnJvciIsImVuZF90aW1lIiwicmV0cnkiLCJiYWNrX29mZl9mdW5jdGlvbiIsImJhY2tPZmZTZXQiLCJjdXJyZW50X2JhY2tfb2ZmIiwiYmFja09mZiIsIm9uQ2hhbmdlc0NvbXBsZXRlIiwib25DaGFuZ2VzRXJyb3IiLCJfYWJvcnRDaGFuZ2VzIiwiYWJvcnRDaGFuZ2VzIiwic3RhcnRDaGFuZ2VzIiwiX2FkZGVkTGlzdGVuZXJzIiwiUmVwbGljYXRpb24iLCJ0b1BvdWNoIiwiUG91Y2hDb25zdHJ1Y3RvciIsInJlcGxpY2F0ZVdyYXBwZXIiLCJyZXBsaWNhdGVSZXQiLCJTeW5jIiwiY2FuY2VsZWQiLCJvcHRzUHVzaCIsIm9wdHNQdWxsIiwicHVsbCIsInB1bGxDaGFuZ2UiLCJwdXNoQ2hhbmdlIiwicHVzaERlbmllZCIsInB1bGxEZW5pZWQiLCJwdXNoUGF1c2VkIiwicHVsbFBhdXNlZCIsInB1c2hBY3RpdmUiLCJwdWxsQWN0aXZlIiwicmVtb3ZlZCIsInJlbW92ZUFsbCIsImFkZE9uZUxpc3RlbmVyIiwib3V0IiwiY2xlYW51cCIsIl9yZWFkeUNhbGxlZCIsInJlcGxpY2F0ZU1ldGhvZHMiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwiZGVmYXVsdFNldFRpbW91dCIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJydW5UaW1lb3V0IiwiZHJhaW5RdWV1ZSIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIm5vb3AiLCJlbnYiLCJhcmd2IiwidmVyc2lvbnMiLCJiaW5kaW5nIiwiY3dkIiwiY2hkaXIiLCJkaXIiLCJ1bWFzayIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJfbGFzdE1TZWNzIiwiX2xhc3ROU2VjcyIsImNsb2Nrc2VxIiwic2VlZEJ5dGVzIiwibXNlY3MiLCJuc2VjcyIsImR0IiwidGwiLCJ0bWgiLCJnZW5lcmF0ZVVVSUQiLCJuYW1lc3BhY2UiLCJzdHJpbmdUb0J5dGVzIiwiaGFzaGZ1bmMiLCJETlMiLCJVUkwiLCJnZXRPdXRwdXRMZW5ndGgiLCJpbnB1dExlbmd0aDgiLCJzYWZlQWRkIiwibHN3IiwibWQ1Y21uIiwicSIsImNudCIsIm1kNWZmIiwibWQ1Z2ciLCJtZDVoaCIsIm1kNWlpIiwidjM1IiwibGVuZ3RoMzIiLCJtZDVUb0hleEVuY29kZWRBcnJheSIsIm9sZGEiLCJvbGRiIiwib2xkYyIsIm9sZGQiLCJ3b3Jkc1RvTWQ1IiwibGVuZ3RoOCIsIlVpbnQzMkFycmF5IiwiYnl0ZXNUb1dvcmRzIiwiZiIsInoiLCJST1RMIiwiSyIsIkgiLCJOIiwiTSIsIl9pIiwicG93IiwiX2kyIiwiVyIsIl90IiwiX3QyIiwiY3JlYXRlU2hpZnRBcnIiLCJzdGVwIiwic3BhY2UiLCJpeCIsInZrYmVhdXRpZnkiLCJpc1N1YnF1ZXJ5IiwicGFyZW50aGVzaXNMZXZlbCIsInNwbGl0X3NxbCIsInRhYiIsInhtbCIsImFyIiwiaW5Db21tZW50IiwiZGVlcCIsImNzcyIsInNxbCIsImFyX2J5X3F1b3RlIiwieG1sbWluIiwicHJlc2VydmVDb21tZW50cyIsImpzb25taW4iLCJjc3NtaW4iLCJzcWxtaW4iLCJjb25maXJtIiwic3BsaXREaXNhYmxlIiwiY2FwdHVyZSIsImNsaWNrYXdheUhhbmRsZXIiLCJyZXNldEhhbmRsZXIiLCJuY0lkIiwicXVldWVNaWNyb3Rhc2siLCJNdXRhdGlvbiIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwiaGFuZGxlIiwib2JzZXJ2ZXIiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJjaGFyYWN0ZXJEYXRhIiwiTWVzc2FnZUNoYW5uZWwiLCJjaGFubmVsIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJwb3J0MiIsInBvc3RNZXNzYWdlIiwic2NyaXB0RWwiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVDaGlsZCIsImRvY3VtZW50RWxlbWVudCIsIm1laSIsIm1hbmlmZXN0IiwibG9jYWxNYW5pZmVzdCIsIm1laVByb21pc2UiLCJtZWlSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwiYmdQcm9taXNlIiwiYmdSZWFkZXIiLCJtZWlVcmkiLCJiZ1VyaSIsInNpbmdsZSIsImFsZXJ0IiwibmV3TmFtZSIsIm1hbmlmZXN0QmxvYiIsIm1hbmlmZXN0VGV4dCIsIm5ld01hbmlmZXN0QmxvYiIsImRvY3VtZW50c0NvbnRhaW5lciIsImJhY2tncm91bmRBcmVhIiwib3BlbkJ1dHRvbiIsInJlbW92ZUJ1dHRvbiIsIm5hdlBhdGhDb250YWluZXIiLCJiYWNrQnV0dG9uIiwiZW1wdHlCdXR0b24iLCJkZWxldGVCdXR0b24iLCJ1cGxvYWREb2N1bWVudHNCdXR0b24iLCJuZXdGb2xkZXJCdXR0b24iLCJzaGlmdFNlbGVjdGlvbiIsIlNoaWZ0U2VsZWN0aW9uTWFuYWdlciIsImZzbSIsImRhc2hib2FyZFN0YXRlIiwibWFpblNlY3Rpb24iLCJjb250ZXh0TWVudSIsImNvbnRleHRNZW51Q29udGVudFdyYXBwZXIiLCJtZXRhS2V5SXNQcmVzc2VkIiwic2hpZnRLZXlJc1ByZXNzZWQiLCJjdXJyZW50RHJhZ1RhcmdldCIsInJpZ2h0Q2xpY2tlZCIsIm9wZW5VcGxvYWRBcmVhSGFuZGxlciIsIkluaXRVcGxvYWRBcmVhIiwiZ2V0UGFyZW50Rm9sZGVyIiwib3BlbkVkaXRvclRhYiIsImlzU2FtcGxlIiwic3RvcmFnZSIsImVudHJ5IiwiZ2V0RW50cmllcyIsInNldFNlbGVjdGlvbiIsInVuc2VsZWN0QWxsIiwidGlsZSIsInJlc2V0U2VsZWN0aW9uIiwiYWRkVGlsZUV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVEYXNoYm9hcmQiLCJnZXRGb2xkZXJQYXRoIiwib3BlbkRvY3NIYW5kbGVyIiwiX2UiLCJzaGlmdFNlbGVjdGlvbkhhbmRsZXIiLCJhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyIiwiZ2V0U2VsZWN0ZWRFbnRyaWVzIiwic2hvd0NvbnRleHRNZW51IiwiY2xpY2tlZEVsZW1lbnQiLCJjbGlja2VkRW50cnkiLCJnZXRFbnRyeUJ5SWQiLCJnZXRJbmRleEJ5RW50cnlOYW1lIiwiYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyIsImdldFNlbGVjdGlvbiIsInNldFN0YXJ0IiwiZ2V0UHJldlNlbGVjdGlvbiIsInNldEVuZCIsInVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMiLCJ1cGRhdGVGU0J1dHRvbnMiLCJnZXRTZWxlY3RlZEZvbGRlcnMiLCJnZXRTZWxlY3RlZFRyYXNoIiwiZ2V0U2VsZWN0ZWRGaWxlcyIsImRvY3VtZW50VHlwZSIsIm9wZW5GaWxlIiwicmVtb3ZlRG9jc0hhbmRsZXIiLCJzZWxlY3RlZEVudHJpZXMiLCJwYXJlbnRGb2xkZXIiLCJ0cmFzaEZvbGRlciIsImdldFRyYXNoRm9sZGVyIiwiZGF0ZXRpbWUiLCJ0b0xvY2FsZVN0cmluZyIsImFkZE1ldGFkYXRhIiwicmVtb3ZlZF9vbiIsInJlY292ZXJfZm9sZGVyIiwiZ2V0Rm9sZGVyUGF0aE5hbWVzIiwibW92ZVRvRm9sZGVyIiwiZGVsZXRlRmlsZUVudHJ5IiwiZmlsZSIsImRlbGV0ZURvY3VtZW50IiwicmVtb3ZlRW50cnkiLCJkZWxldGVGb2xkZXJFbnRyeSIsImZvbGRlciIsImRlbGV0ZVByb21pc2VzIiwiZGVsZXRlRG9jc0hhbmRsZXIiLCJhbGxFbnRyaWVzIiwiYWxlcnRNZXNzYWdlIiwiZW50cnlBcnJheSIsImRlYnVnIiwiZW1wdHlUcmFzaEhhbmRsZXIiLCJpc0luVHJhc2giLCJidXR0b25DbG9uZSIsImNsb25lTm9kZSIsInJlcGxhY2VDaGlsZCIsImhhbmRsZU5hdmlnYXRlQmFjayIsImFkZERyb3BUYXJnZXRMaXN0ZW5lcnMiLCJ1cGRhdGVCYWNrQnV0dG9uIiwidXBkYXRlRW1wdHlCdXR0b24iLCJ1cGRhdGVEZWxldGVCdXR0b24iLCJuZXdQYXRoIiwic2V0Rm9sZGVyUGF0aCIsImN1cnJlbnRGb2xkZXIiLCJzZXRFbnRyaWVzIiwiaWNvbiIsImNyZWF0ZVRpbGUiLCJuYXZFbGVtZW50cyIsIm5hdlNlY3Rpb24iLCJ0YXJnZXRQYXRoIiwibmF2RWxlbWVudCIsInNlcGVyYXRvciIsInVwZGF0ZU5hdlBhdGgiLCJpbmZvQmFkZ2UiLCJkYXRhVHJhbnNmZXIiLCJlZmZlY3RBbGxvd2VkIiwic2V0RmlsZVN5c3RlbSIsImRlc3RpbmF0aW9uRm9sZGVyIiwiZHJhZ0VudHJ5IiwiY3JlYXRlSGFuZGxlRHJvcCIsIm5ld0ZvbGRlciIsImVycm9yTWVzc2FnZXMiLCJ0cmFzaEZOQ29uZmxpY3RIYW5kbGVyIiwiY2FuTW92ZUVudHJ5Iiwic3VjY2VlZGVkIiwibW92ZUVudHJ5Iiwib3Blbk1vdmVUb1dpbmRvdyIsInJvb3RUcmVlIiwibW92ZVRvQ2FsbGJhY2siLCJnZW5lcmF0ZUZvbGRlclRyZWUiLCJkZWdyZWUiLCJsaUNvbnRhaW5lciIsImZvbGRlck5hbWUiLCJ1bCIsImFycm93IiwiZm9sZGVyVHJlZSIsImdlbmVyYXRlUm9vdFRyZWUiLCJuZXdQYXJlbnRGb2xkZXIiLCJ0cmVlQ29udGFpbmVyIiwibW9kYWxDb250YWluZXIiLCJvcGVuTmV3Rm9sZGVyV2luZG93IiwiaW5wdXRDb250YWluZXIiLCJjYW5jZWxCdXR0b24iLCJwbGFjZWhvbGRlciIsImNvbmZpcm1OZXdGb2xkZXJBY3Rpb24iLCJuYW1lRXhpc3RzIiwibmV3Rm9sZGVyVGlsZSIsImNyZWF0ZUZvbGRlciIsImFkZEVudHJ5IiwiaGFuZGxlQWRkRm9sZGVyIiwib3BlblJlbmFtZVdpbmRvdyIsInByZXZOYW1lIiwiY29uZmlybVJlbmFtZUFjdGlvbiIsInJlbmFtZUVudHJ5IiwidXBkYXRlRG9jTmFtZSIsIm51bWJlck9mU2VsZWN0ZWRGaWxlcyIsIm51bWJlck9mU2VsZWN0ZWRGb2xkZXJzIiwic2VsZWN0ZWRUcmFzaCIsImNvbnRleHRNZW51Q29udGVudCIsInRyYXNoRW50cnlPcHRpb25zIiwic2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzIiwibXVsdGlGaWxlT3B0aW9ucyIsImZvbGRlckFuZEZpbGVPcHRpb25zIiwibXVsdGlGb2xkZXJPcHRpb25zIiwic2luZ2xlRm9sZGVyT3B0aW9ucyIsInNpbmdsZUZpbGVPcHRpb25zIiwidHJhc2hGb2xkZXJPcHRpb25zIiwiZGVmYXVsdE9wdGlvbnMiLCJkZWxldGVCdG4iLCJyZW5hbWVCdG4iLCJtb3ZlQnRuIiwidXBkYXRlRG9jQnRuIiwibmV3Rm9sZGVyQnRuIiwidG9wIiwiYnRuQ2xhc3NuYW1lIiwiZm9sZGVyUGF0aE5hbWVzIiwidGFyZ2V0Rm9sZGVyIiwiZ2V0Rm9sZGVyUGF0aEJ5TmFtZXMiLCJyZW1vdmVNZXRhZGF0YSIsImRhdGVUaW1lUGF0dGVybiIsInB1dEJhY2tEb2NzSGFuZGxlciIsInVwZGF0ZVRyYXNoIiwibmV3VHJhc2giLCJjdXJyZW50RGF0ZSIsInRoaXJ0eURheXNBZ28iLCJnZXRUaW1lIiwidG9EZWxldGUiLCJzaGlmdEtleSIsImxvYWREYXNoYm9hcmQiLCJnZXRSb290IiwiY3JlYXRlRW50cnkiLCJGaWxlIiwiY2FuQWRkRW50cnkiLCJpc0ltbXV0YWJsZSIsInJldHVybk9iaiIsImNhblJlbW92ZUVudHJ5IiwiZXhpc3RzSW5QYXJlbnQiLCJmaW5kSW5kZXgiLCJpc0ltbXV0YWJsZVBhcmVudCIsImlzSW1tdXRhYmxlRW50cnkiLCJuZXdQYXJlbnQiLCJpc1NhbWUiLCJpc0ltbXV0YWJsZU5ld1BhcmVudCIsIm5ld1BhcmVudElzQ2hpbGRPZkVudHJ5IiwiRm9sZGVyIiwiaXNDaGlsZE9mIiwiY2FuUmVuYW1lRW50cnkiLCJsb2NhbGVDb21wYXJlIiwiY3JlYXRlVHJhc2giLCJUcmFzaCIsImNyZWF0ZUZpbGUiLCJtb3ZlUmVzcG9uc2UiLCJnZXRBbGxOYW1lcyIsImdldEZpbGVTeXN0ZW0iLCJmcyIsInNhbXBsZUVudHJpZXMiLCJzYW1wbGVzIiwiaW1tdXRhYmxlIiwic2FtcGxlc0ZvbGRlciIsInNhbXBsZSIsImxvYWRTYW1wbGVzIiwidXBsb2FkcyIsImZldGNoVXBsb2FkcyIsInVwbG9hZCIsImxvYWRQcmV2aW91c1VwbG9hZHMiLCJwcmV2U2VsZWN0aW9uIiwib3JkZXJlZFNlbGVjdGlvbiIsInNwZWNpZmljU2VsZWN0aW9uIiwib3JkZXJlZEVudHJpZXMiLCJmb2xkZXJQYXRoIiwiX3Jvb3QiLCJyb290Rm9sZGVyIiwiYm9vbCIsImZvbGRlck5hbWVzIiwicGFpckJ1dHRvbiIsInVwbG9hZEJ1dHRvbiIsImhhbmRsZU1ha2VQYWlyIiwic3Bpbm5lciIsImhhbmRsZVVwbG9hZEFsbERvY3VtZW50cyIsInN1Y2Nlc3NmdWxGaWxlcyIsImhhbmRsZVVwbG9hZFVwZGF0ZSIsImZpbGVTZWxlY3RvciIsIm11bHRpcGxlIiwiZmlsZUxpc3QiLCJmaWxlcyIsInJlamVjdEZpbGVzIiwiYWRkTmV3RmlsZXMiLCJ1cGxvYWRfYXJlYSIsIm9uZHJhZ2xlYXZlIiwib25kcmFnb3ZlciIsImRyb3BFZmZlY3QiLCJvbmRyb3AiLCJzb3J0QnlOYW1lQnRuIiwic29ydEZpbGVCeU5hbWUiLCJmbSIsImdldEluc3RhbmNlIiwiY3JlYXRlVW5wYWlyZWRJdGVtIiwicmFkaW9OYW1lIiwicmFkaW8iLCJsYWJlbCIsImZvcm1hdEZpbGVuYW1lIiwiZGVsQnRuIiwibWF4TGVuIiwiY2h1bmtMZW4iLCJmbkNvbmZsaWN0SGFuZGxlciIsImV4aXN0aW5nTmFtZXMiLCJuZXdGaWxlbmFtZSIsImNvdW50ZXIiLCJpbmNsdWRlcyIsInNldE1laVRlbXBsYXRlIiwibWVpX2NvbnRhaW5lciIsImltYWdlX2NvbnRhaW5lciIsImV4dCIsInVucGFpcmVkSXRlbSIsImFkZEZpbGUiLCJwYWlyZWRfY29udGFpbmVyIiwic2VsZWN0ZWRNZWlFbGVtZW50Iiwic2VsZWN0ZWRJbWFnZUVsZW1lbnQiLCJtZWlfZmlsZW5hbWUiLCJpbWFnZV9maWxlbmFtZSIsImlzQ3JlYXRlZCIsImZuIiwiZ2V0SW1nRGltZW5zaW9uIiwiZGltZW5zaW9ucyIsInN0YWZmU3BhY2UiLCJuZXdNZWlGaWxlIiwiY3JlYXRlTWVpRmlsZSIsInBhaXJlZF9lbCIsImZvbGlvIiwiZm9saW9fZmlsZW5hbWUiLCJoYW5kbGVVbnBhaXIiLCJpc0NyZWF0ZWRGb2xpbyIsInJlbW92ZUZvbGlvIiwibWVpSXRlbSIsImltYWdlSXRlbSIsInVucGFpckJ0biIsImNyZWF0ZVBhaXJlZEZvbGlvIiwiYWRkRm9saW8iLCJnZXRGb2xpb3MiLCJpbWFnZSIsImNyZWF0ZU1hbmlmZXN0IiwiYWRkRG9jdW1lbnQiLCJmaWxlRW50cnkiLCJmb2xpb0VudHJ5IiwiY3JlYXRlZF9vbiIsInVwbG9hZEZvbGlvIiwiY2xlYXIiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJmaWxlRWxlbWVudHMiLCJpc0FzY2VuZGluZyIsIm5hbWVBIiwibmFtZUIiLCJVcGxvYWRGaWxlTWFuYWdlciIsImFsbEZpbGVzIiwiZm9saW9zIiwiaW5zdGFuY2UiLCJ1cGRhdGVkRW50cnkiLCJnZXRGaWxlQ291bnQiLCJuZXdFbnRyeSIsInRlbXBsYXRlUGF0aCIsIm1laVRlbXBsYXRlIiwiRE9NUGFyc2VyIiwic2VyaWFsaXplciIsIlhNTFNlcmlhbGl6ZXIiLCJtZWlEb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzdXJmYWNlIiwic3VyZmFjZUlkIiwiem9uZSIsInpvbmVJZCIsIm1hcmdpblJhdGVWIiwibWFyZ2luUmF0ZUgiLCJtYXJnaW5WIiwibWFyZ2luSCIsInBiIiwic2IiLCJtZWlGaWxlQ29udGVudCIsInNlcmlhbGl6ZVRvU3RyaW5nIiwibWVpQmxvYiIsImltZ0ZpbGUiLCJnZXRGaWxlIiwib25sb2FkIiwiaW1nIiwiSW1hZ2UiLCJjYW52YXMiLCJnZXRDb250ZXh0Iiwid2lsbFJlYWRGcmVxdWVudGx5IiwiZHJhd0ltYWdlIiwiaW1hZ2VEYXRhIiwiZ2V0SW1hZ2VEYXRhIiwiYmluYXJ5VmFsdWUiLCJwdXRJbWFnZURhdGEiLCJ3aGl0ZVJ1bkxlbmd0aHMiLCJjdXJyU3BhY2VDb3VudCIsImZpbmRTZWNvbmRNb2RlIiwiY291bnRNYXAiLCJuZXdGb2xpbyJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBS2ZGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZWIsRUFBU2lCLE9BQU9DLFlBQWEsQ0FBRUMsTUFBTyxXQUU3RFAsT0FBT0MsZUFB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d0IsS0FBSzA2RSxVQUNqQi8zRSxRQUFReXRCLElBQUlwd0IsS0FBSzI2RSxTQUtyQixVQUFlRixHLHdQQ2pTRixFQUFBakosZUFDVCx5Y0FVUyxFQUFBRixrQkFDVCxpM0JBa0JTLEVBQUFKLGlCQUNULG9wQkFjUyxFQUFBQyxxQkFDVCxzYkFVUyxFQUFBRSxvQkFDVCxpM0JBa0JTLEVBQUFELG1CQUNULDZiQVVTLEVBQUFHLG1CQUNULG9PQU1TLEVBQUFQLGtCQUNUIiwiZmlsZSI6ImRhc2hib2FyZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA4OCk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHR5cGVzID0gW1xuICByZXF1aXJlKCcuL25leHRUaWNrJyksXG4gIHJlcXVpcmUoJy4vcXVldWVNaWNyb3Rhc2snKSxcbiAgcmVxdWlyZSgnLi9tdXRhdGlvbi5qcycpLFxuICByZXF1aXJlKCcuL21lc3NhZ2VDaGFubmVsJyksXG4gIHJlcXVpcmUoJy4vc3RhdGVDaGFuZ2UnKSxcbiAgcmVxdWlyZSgnLi90aW1lb3V0Jylcbl07XG52YXIgZHJhaW5pbmc7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIHNjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgfVxuICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgbmV4dFRpY2soKTtcbiAgfVxufVxuXG4vL25hbWVkIG5leHRUaWNrIGZvciBsZXNzIGNvbmZ1c2luZyBzdGFjayB0cmFjZXNcbmZ1bmN0aW9uIG5leHRUaWNrKCkge1xuICBpZiAoZHJhaW5pbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2NoZWR1bGVkID0gZmFsc2U7XG4gIGRyYWluaW5nID0gdHJ1ZTtcbiAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gIHdoaWxlIChsZW4pIHtcbiAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICBxdWV1ZSA9IFtdO1xuICAgIHdoaWxlIChjdXJyZW50UXVldWUgJiYgKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgfVxuICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gIH1cbiAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgcXVldWVJbmRleCA9IC0xO1xuICBkcmFpbmluZyA9IGZhbHNlO1xuICBjbGVhclRpbWVvdXQodGltZW91dCk7XG59XG52YXIgc2NoZWR1bGVEcmFpbjtcbnZhciBpID0gLTE7XG52YXIgbGVuID0gdHlwZXMubGVuZ3RoO1xud2hpbGUgKCsraSA8IGxlbikge1xuICBpZiAodHlwZXNbaV0gJiYgdHlwZXNbaV0udGVzdCAmJiB0eXBlc1tpXS50ZXN0KCkpIHtcbiAgICBzY2hlZHVsZURyYWluID0gdHlwZXNbaV0uaW5zdGFsbChuZXh0VGljayk7XG4gICAgYnJlYWs7XG4gIH1cbn1cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICB0aGlzLmZ1biA9IGZ1bjtcbiAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZnVuID0gdGhpcy5mdW47XG4gIHZhciBhcnJheSA9IHRoaXMuYXJyYXk7XG4gIHN3aXRjaCAoYXJyYXkubGVuZ3RoKSB7XG4gIGNhc2UgMDpcbiAgICByZXR1cm4gZnVuKCk7XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBmdW4oYXJyYXlbMF0sIGFycmF5WzFdKTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBmdW4oYXJyYXlbMF0sIGFycmF5WzFdLCBhcnJheVsyXSk7XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuIGZ1bi5hcHBseShudWxsLCBhcnJheSk7XG4gIH1cblxufTtcbm1vZHVsZS5leHBvcnRzID0gaW1tZWRpYXRlO1xuZnVuY3Rpb24gaW1tZWRpYXRlKHRhc2spIHtcbiAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICB9XG4gIHF1ZXVlLnB1c2gobmV3IEl0ZW0odGFzaywgYXJncykpO1xuICBpZiAoIXNjaGVkdWxlZCAmJiAhZHJhaW5pbmcpIHtcbiAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgIHNjaGVkdWxlRHJhaW4oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgR3JvdXBpbmdUeXBlLCBTZWxlY3Rpb25UeXBlLCBVc2VyVHlwZSwgSW5zZXJ0VHlwZSwgSW5zZXJ0VGFiVHlwZSB9IGZyb20gJy4uL1R5cGVzJztcblxuLyoqXG4gKiBUaGUgb25lIGluc3RhbmNlIG9mIExvY2FsU2V0dGluZ3MgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYW5kXG4gKiB1c2VkIGJ5IHRoZSBlZGl0b3IuXG4gKiBcbiAqIFVzZSB0aGUgZnVuY3Rpb25zIGBnZXRTZXR0aW5ncygpYCBhbmQgYHNldFNldHRpbmdzKClgXG4gKiB0byBhY2Nlc3MgdGhpcyBpbnN0YW5jZS5cbiAqL1xubGV0IGxvY2FsU2V0dGluZ3M6IExvY2FsU2V0dGluZ3MgPSBudWxsO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdGhlIHNldHRpbmdzIGZvciBlYWNoIGZvbGlvXG4gKiBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLlxuICpcbiAqIEV2ZXJ5IGtleSBpcyBvcHRpb25hbCBzbyB0aGF0IHRoaXMgc2FtZSB0eXBpbmdcbiAqIGNhbiBiZSB1c2VkIGZvciBgc2V0U2V0dGluZ3MoKWAgLyBgTG9jYWxTZXR0aW5ncy5zZXQoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xuICB6b29tOiBudW1iZXI7XG4gIGdseXBoT3BhY2l0eTogbnVtYmVyO1xuICBpbWFnZU9wYWNpdHk6IG51bWJlcjtcbiAgY2lyY2xlU2l6ZTogbnVtYmVyO1xuICBoaWdobGlnaHRNb2RlOiBHcm91cGluZ1R5cGU7XG4gIHVzZXJNb2RlOiBVc2VyVHlwZTtcbiAgaW5zZXJ0TW9kZTogSW5zZXJ0VHlwZTtcbiAgaW5zZXJ0VGFiOiBJbnNlcnRUYWJUeXBlO1xuICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25UeXBlO1xuICBkZWJ1Z01vZGU6IGJvb2xlYW47XG4gIGRpc3BsYXlCQm94OiBib29sZWFuO1xuICBkaXNwbGF5VGV4dDogYm9vbGVhbjtcbiAgZGlzcGxheUluZm86IGJvb2xlYW47XG4gIGRpc3BsYXlFcnJMb2c6IGJvb2xlYW47XG4gIHZpZXdCb3g6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNldHRpbmdzLCB3aGljaCBzaG91bGQgYmUgc2V0IGZvciBhIGZvbGlvIHdpdGggbm9cbiAqIGxvY2FsU3RvcmFnZSB2YWx1ZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSB1cGRhdGVkIGFsb25nc2lkZSB0aGUgaW50ZXJmYWNlIGBTZXR0aW5nc2BcbiAqIGFueSB0aW1lIHdlIHdhbnQgdG8gYWRkIGEgbmV3IHNldHRpbmcgdG8gc3RvcmUgaW4gbG9jYWxTdG9yYWdlLlxuICovXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBTZXR0aW5ncyA9IHtcbiAgem9vbTogMTAwLFxuICBnbHlwaE9wYWNpdHk6IDEwMCxcbiAgaW1hZ2VPcGFjaXR5OiAxMDAsXG4gIGNpcmNsZVNpemU6IDI1LFxuICBoaWdobGlnaHRNb2RlOiAnbm9uZScsXG4gIHVzZXJNb2RlOiAnZWRpdCcsXG4gIGluc2VydE1vZGU6ICdwdW5jdHVtJyxcbiAgaW5zZXJ0VGFiOiAncHJpbWl0aXZlVGFiJyxcbiAgc2VsZWN0aW9uTW9kZTogJ3NlbEJ5U3lsbGFibGUnLFxuICBkZWJ1Z01vZGU6IGZhbHNlLFxuICBkaXNwbGF5QkJveDogZmFsc2UsXG4gIGRpc3BsYXlUZXh0OiBmYWxzZSxcbiAgZGlzcGxheUluZm86IGZhbHNlLFxuICBkaXNwbGF5RXJyTG9nOiBmYWxzZSxcbiAgdmlld0JveDogbnVsbFxufTtcblxuY2xhc3MgTG9jYWxTZXR0aW5ncyB7XG4gIGlkOiBzdHJpbmc7XG4gIHNldHRpbmdzOiBTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvciAoZm9saW9JZDogc3RyaW5nKSB7XG4gICAgbG9jYWxTZXR0aW5ncyA9IHRoaXM7XG4gICAgdGhpcy5pZCA9IGZvbGlvSWQ7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBzZXR0aW5ncyBmcm9tIGxvY2FsU3RvcmFnZSwgYW5kIHN5bmMgbG9hZGVkIHNldHRpbmdzIHdpdGhcbiAgICogbmV3IGZpZWxkcyB0aGF0IG1heSBub3QgYmUgaW4gbG9jYWxTdG9yYWdlLlxuICAgKi9cbiAgbG9hZCAoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZDogUGFydGlhbDxTZXR0aW5ncz4gPSBKU09OLnBhcnNlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmlkKSk7XG4gICAgICB0aGlzLnN5bmMoc3RvcmVkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIHZhbHVlIGlzIG5vdCBhIEpTT04gb2JqZWN0IChmb3IgaW5zdGFuY2UsIGFuIGVtcHR5IHN0cmluZyksXG4gICAgICAvLyBhIFN5bnRheEVycm9yIHdpbGwgYmUgdGhyb3duLiBXZSBtdXN0IGhhbmRsZSBpdCBieSBjYWxsaW5nIHN5bmMoKVxuICAgICAgLy8gd2l0aCBhbiBlbXB0eSBKU09OIG9iamVjdC5cbiAgICAgIHRoaXMuc3luYyh7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBuZXcgZmllbGRzIGluIGxvY2FsU3RvcmFnZSwgYXMgYSBcInVuaW9uXCIgb2Ygb2xkIGFuZCBuZXcgc2V0dGluZ3MuXG4gICAqL1xuICBzZXQgKHBhcmFtczogUGFydGlhbDxTZXR0aW5ncz4pOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi50aGlzLnNldHRpbmdzLCAuLi5wYXJhbXMgfTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXR0aW5ncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgc2V0dGluZ3MgdGhhdCBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHVzZXIncyBsb2NhbFN0b3JhZ2UsXG4gICAqIHN1Y2ggYXMgZmllbGRzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIGxvY2FsU3RvcmFnZSBpbiBhIG5ld1xuICAgKiB1cGRhdGUgb2YgTmVvbi5cbiAgICovXG4gIHN5bmMgKHN0b3JlZDogUGFydGlhbDxTZXR0aW5ncz4pOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi5ERUZBVUxUX1NFVFRJTkdTLCAuLi5zdG9yZWQgfTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXR0aW5ncykpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGxvY2FsU3RvcmFnZSBzZXR0aW5ncyBmb3IgdGhlIGZvbGlvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MgKCk6IFNldHRpbmdzIHtcbiAgcmV0dXJuIGxvY2FsU2V0dGluZ3Muc2V0dGluZ3M7XG59XG5cbi8qKlxuICogU2V0IHNwZWNpZmljIGxvY2FsU3RvcmFnZSBzZXR0aW5ncyBmb3IgdGhlIGZvbGlvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2V0dGluZ3MgKHBhcmFtczogUGFydGlhbDxTZXR0aW5ncz4pOiB2b2lkIHtcbiAgbG9jYWxTZXR0aW5ncy5zZXQocGFyYW1zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9jYWxTZXR0aW5ncztcbiIsImltcG9ydCAqIGFzIENvbG9yIGZyb20gJy4vQ29sb3InO1xuaW1wb3J0IHsgdXBkYXRlSGlnaGxpZ2h0IH0gZnJvbSAnLi4vRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scyc7XG5pbXBvcnQgKiBhcyBHcm91cGluZyBmcm9tICcuLi9TcXVhcmVFZGl0L0dyb3VwaW5nJztcbmltcG9ydCB7IHJlc2l6ZSB9IGZyb20gJy4vUmVzaXplJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIFNlbGVjdGlvblR5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuaW1wb3J0ICogYXMgU2VsZWN0T3B0aW9ucyBmcm9tICcuLi9TcXVhcmVFZGl0L1NlbGVjdE9wdGlvbnMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBzZWxlY3Rpb24gbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25UeXBlKCk6IFNlbGVjdGlvblR5cGUge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsLWJ5IGlzLWFjdGl2ZScpO1xuICBpZiAoZWxlbWVudC5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gZWxlbWVudFswXS5pZCBhcyBTZWxlY3Rpb25UeXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVW5zZWxlY3QgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGFuZCBydW4gdW5kbyBhbnkgZXh0cmFcbiAqIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNlbGVjdCgpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvckFsbCgnLm5vLW1vdmluZycpXG4gICAgLmZvckVhY2goKHNlbGVjdGVkOiBTVkdHRWxlbWVudCkgPT4gc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnbm8tbW92aW5nJykpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKS5mb3JFYWNoKChzZWxlY3RlZDogU1ZHR0VsZW1lbnQpID0+IHtcbiAgICBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIGlmIChzZWxlY3RlZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIHNlbGVjdGVkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIENvbG9yLnVuaGlnaGxpZ2h0KHNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgc2VsZWN0ZWQuc3R5bGUuZmlsbCA9ICcnO1xuICAgIH1cblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgIChkaXZMaW5lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBkaXZMaW5lLnN0eWxlLnN0cm9rZSA9ICcnO1xuICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykpLmZvckVhY2goXG4gICAgICAobmV1bWU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKSkuZm9yRWFjaChcbiAgICAgIChzeWxSZWN0OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBzeWxSZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJykpIHtcbiAgICAgIHNlbGVjdGVkLnBhcmVudEVsZW1lbnQuc3R5bGUuZmlsbCA9ICcnO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzeWxsYWJsZScpO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzeWxsYWJsZS1oaWdobGlnaHRlZCcpO1xuXG4gICAgICBBcnJheS5mcm9tKHNlbGVjdGVkLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgICAgKGRpdkxpbmU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgZGl2TGluZS5zdHlsZS5zdHJva2UgPSAnJztcbiAgICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKSkuZm9yRWFjaChcbiAgICAgICAgKG5ldW1lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcucm90YXRlUG9pbnQnKS5yZW1vdmUoKTtcbiAgfSk7XG5cbiAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGV4dC1zZWxlY3QnKSkuZm9yRWFjaChcbiAgICAoZWw6IFNWR0VsZW1lbnQpID0+IHtcbiAgICAgIGVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gJyc7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0ZXh0LXNlbGVjdCcpO1xuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICBHcm91cGluZy5lbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICB9XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIHVwZGF0ZUhpZ2hsaWdodCgpO1xufVxuXG4vKipcbiAqIFNlbGVjdCBhIHN0YWZmIGVsZW1lbnQuXG4gKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgZWxlbWVudCBpbiB0aGUgRE9NLlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gVGhlIGRyYWcgaGFuZGxlciBpbiB1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTdGFmZihcbiAgc3RhZmY6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGFmZi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzdGFmZi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIENvbG9yLnVuaGlnaGxpZ2h0KHN0YWZmKTtcbiAgICBDb2xvci5oaWdobGlnaHQoc3RhZmYsICcjZDAwJyk7XG4gICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk7XG4gICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCBhIGxheWVyIGVsZW1lbnQuXG4gKiBAcGFyYW0gbGF5ZXJFbGVtZW50IC0gVGhlIGxheWVyIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIFRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0TGF5ZXJFbGVtZW50KFxuICBsYXllckVsZW1lbnQ6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFsYXllckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgbGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgQ29sb3IudW5oaWdobGlnaHQobGF5ZXJFbGVtZW50KTtcbiAgICBDb2xvci5oaWdobGlnaHQobGF5ZXJFbGVtZW50LCAnI2QwMCcpO1xuICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmljIHNlbGVjdCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBlbCAtIEVsZW1lbnQgdG8gc2VsZWN0LlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gT25seSB1c2VkIGZvciBzdGF2ZXMuXG4gKiBAcGFyYW0gbmVlZHNIaWdobGlnaHRVcGRhdGUgLSBXaGV0aGVyIGFsbCB0aGUgZ3JvdXAncyBoaWdobGlnaHRzIHNob3VsZCBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoXG4gIGVsOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyPzogRHJhZ0hhbmRsZXIsXG4gIG5lZWRzSGlnaGxpZ2h0VXBkYXRlID0gdHJ1ZSxcbik6IHZvaWQge1xuICAvLyBJZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBleGl0XG4gIGlmICghZWwpIHJldHVybjtcblxuICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSB7XG4gICAgcmV0dXJuIHNlbGVjdFN0YWZmKGVsLCBkcmFnSGFuZGxlcik7XG4gIH1cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbGF5ZXInKSkge1xuICAgIHJldHVybiBzZWxlY3RMYXllckVsZW1lbnQoZWwsIGRyYWdIYW5kbGVyKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpICYmXG4gICAgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsVGV4dFJlY3QnKSAmJlxuICAgICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bFRleHRSZWN0LWRpc3BsYXknKVxuICApIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIC8vIHNldCBmaWxsIHRvIHJlZFxuICAgIC8vIHNldCBzdHJva2UgdG8gcmVkIG9ubHkgaWYgc2VsZWN0ZWQgZWxlbSBpcyBhIGRpdkxpbmVcbiAgICBlbC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgIGVsLnN0eWxlLnN0cm9rZSA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpID8gJyNkMDAnIDogJ2JsYWNrJztcblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKFxuICAgICAgICAoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtLnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtLnN0eWxlLnN0cm9rZSA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW0uc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNldCBjb2xvciBvZiB0aGUgY29ycmVzcG9uZGluZyB0ZXh0IGluIHRoZSB0ZXh0IHBhbmVsIHRvIHJlZFxuICAgIGxldCBzeWxJZDtcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSB7XG4gICAgICBzeWxJZCA9IGVsLmlkO1xuICAgIH0gZWxzZSBpZiAoZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykgIT09IG51bGwpIHtcbiAgICAgIHN5bElkID0gZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykuaWQ7XG4gICAgfVxuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uJyArIHN5bElkKTtcbiAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnI2QwMCc7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LXNlbGVjdCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChuZWVkc0hpZ2hsaWdodFVwZGF0ZSkge1xuICAgIHVwZGF0ZUhpZ2hsaWdodCgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGFuIG5jLlxuICogQHBhcmFtIGVsIC0gVGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE5jcyhcbiAgZWw6IFNWR0dyYXBoaWNzRWxlbWVudCxcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFlbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgdW5zZWxlY3QoKTtcbiAgICBzZWxlY3QocGFyZW50KTtcbiAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShwYXJlbnQsIG5lb25WaWV3KSkge1xuICAgICAgY29uc3QgcHJldk5jID0gcGFyZW50LnByZXZpb3VzU2libGluZyBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgIGlmIChhd2FpdCBpc0xpZ2F0dXJlKHByZXZOYywgbmVvblZpZXcpKSB7XG4gICAgICAgIHNlbGVjdChwcmV2TmMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dE5jID0gcGFyZW50Lm5leHRTaWJsaW5nIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShuZXh0TmMsIG5lb25WaWV3KSkge1xuICAgICAgICAgIHNlbGVjdChuZXh0TmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3I6IE5laXRoZXIgcHJldiBvciBuZXh0IG5jIGFyZSBsaWdhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCdsaWdhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnbmMnKSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmNBY3Rpb25zKHBhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gYWN0aW9uIHRyaWdnZXJlZCEnKTtcbiAgICB9XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBuYyAtIFRoZSBuZXVtZSBjb21wb25lbnQuXG4gKiBAcGFyYW0gbmVvblZpZXcgLSBUaGUgW1tOZW9uVmlld11dIGZvciB0aGlzIGluc3RhbmNlLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbmV1bWUgY29tcG9uZW50IGlzIHBhcnQgb2YgYSBsaWdhdHVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTGlnYXR1cmUoXG4gIG5jOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzID0gYXdhaXQgbmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoXG4gICAgbmMuaWQsXG4gICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICApO1xuICByZXR1cm4gQm9vbGVhbihhdHRyaWJ1dGVzLmxpZ2F0ZWQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGxpc3Qgb2YgZWxlbWVudHMgb2YgYSBjZXJ0YWluIHR5cGUgYXJlIGxvZ2ljYWxseSBhZGphY2VudCB0byBlYWNoIG90aGVyLlxuICogSW5jbHVkZXMgZWxlbWVudHMgdGhhdCBhcmUgb24gc2VwYXJhdGUgc3RhdmVzIGJ1dCB3b3VsZCBvdGhlcndpc2UgYmUgbmV4dCB0byBlYWNoIG90aGVyLlxuICogQ2FuIG5vdCBhcHBseSB0byBlbGVtZW50cyBvZiB0eXBlIG5ldW1lIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB1c2VyIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIG9mIGludGVyZXN0XG4gKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnRzIGFyZSBhZGphY2VudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBZGphY2VudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgLy8gMiBlbGVtZW50cyBjYW5ub3QgYmUgYWRqYWNlbnQgaWYgdGhlcmUgaXMgb25seSAxIGVsZW1lbnRcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcblxuICAvLyBnZXQgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgc2VsZWN0aW9uVHlwZVxuICBsZXQgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGU6IEhUTUxFbGVtZW50W107XG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUnKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgLy8gV2UgYXV0b21hdGljYWxseSByZXR1cm4gJ3RydWUnIGZvciBuZXVtZXMgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyIHRvIGJlXG4gICAgICAvLyBhbGxvd2VkIHRvIGdyb3VwIHR3byBuZXVtZXMgaW4gc2VwYXJhdGUgc3lsbGFiZXMgd2l0aG91dCBoYXZpbmcgdG8gcGFyZm9ybSBvdGhlclxuICAgICAgLy8gc3RlcHMgZmlyc3QuIFllcywgdGhlcmUgaXMgYSB0cmFkZS1vZmYgLSB0aGlzIGFsbG93cyB1c2VycyB0byB0cnkgYW5kIGdyb3VwIGFueVxuICAgICAgLy8gdHdvIG5vbi1hZGphY2VudCBuZXVtZXMsIGJ1dCBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBiZW5lZml0cyAoc3BlZWQgYW5kIGVmZmljaWVuY3kpXG4gICAgICAvLyBvdXR3ZWlnaCB0aGUgY29zdHMgKHVzZXIgdHJ5aW5nIGFuIGlsbGVnYWwgZWRpdCkuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYycpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gU29ydCBTRUxFQ1RFRCBlbGVtZW50cyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGJ5XG4gIC8vIG1hdGNoaW5nIHRvIG9yZGVyIG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBjb25zdCBzb3J0ZWRFbGVtZW50cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlW2ldLmlzU2FtZU5vZGUoZWxlbWVudHNbal0pKSB7XG4gICAgICAgIHNvcnRlZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyBjaGVjayBpZiBTRUxFQ1RFRCBlbGVtZW50cyBhcmUgYWxsIGFkamFjZW50IChpbiBhIHJvdykgYnlcbiAgLy8gZmluZGluZyBhbmQgY29tcGFyaW5nIHRoZWlyIGluZGVjZXMgaW4gdGhlIGFycmF5IG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGZpcnN0RWxlbSA9IHNvcnRlZEVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IHNlY29uZEVsZW0gPSBzb3J0ZWRFbGVtZW50c1tpICsgMV07XG5cbiAgICBjb25zdCBpbmRleDEgPSBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZS5pbmRleE9mKGZpcnN0RWxlbSk7XG4gICAgY29uc3QgaW5kZXgyID0gYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUuaW5kZXhPZihzZWNvbmRFbGVtKTtcblxuICAgIGlmIChNYXRoLmFicyhpbmRleDEgLSBpbmRleDIpICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgdGhlIGFycmF5IG9mIGVsZW1lbnRzIGFsbCBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudC5cbiAqIEZvciBleGFtcGxlOiBJZiBhbGwgbmV1bWVzIGFyZSBpbiB0aGUgc2FtZSBzeWxsYWJsZS5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgY3VycmVudGx5IG5vIGxvZ2ljIGZvciB0cmVhdGluZyBsYXllciBlbGVtZW50cyBhbmQgYmJveGVzIVxuICogTm90ZSEhIEZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlIGZvciBzdGF2ZSBlbGVtZW50cy4gKFNob3VsZCBpdD8/PylcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB0aGUgY3VycmVudCBOZW9uIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIGluIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBlbGVtZW50cyBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkTG9naWNhbFBhcmVudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW0pID0+XG4gICAgICAhKFxuICAgICAgICBlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGVmJylcbiAgICAgICksXG4gICk7XG5cbiAgaWYgKCFlbGVtZW50c0hhdmVDb3JyZWN0VHlwZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIGNvbnN0IHJlZmVyZW5jZVBhcmVudFN0YWZmID0gZWxlbWVudHNbMF0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmlzU2FtZU5vZGUocmVmZXJlbmNlUGFyZW50U3RhZmYpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBjb25zdCByZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSA9IGVsZW1lbnRzWzBdLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbGVtID0gZWxlbWVudHNbaV07XG4gICAgICAgIGlmICghZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKS5pc1NhbWVOb2RlKHJlZmVyZW5jZVBhcmVudFN5bGxhYmxlKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjdXJyZW50IHNlbGVjdGlvbiBtb2RlLlxuICogRm9yIGV4YW1wbGUsIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgb2YgdHlwZSBuZXVtZSwgb3Igc3lsbGFibGUsIGV0Yy5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgbm8gbG9naWMgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBsYXllciBlbGVtZW50cyBvciBiYm94ZXMuXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvblR5cGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1vZGVcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcgY2hlY2tlZFxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZWxlbWVudHMgbWF0Y2ggc2VsZWN0aW9uIG1vZGUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRzSGF2ZUNvcnJlY3RUeXBlKFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBpZiAoIWVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGlmICghZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeVN0YWZmJzpcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZWxlbWVudHMgLSBUaGUgZWxlbWVudHMgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgcGFyZW50IHVwIHR3byBsZXZlbHMsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFNlY29uZExldmVsUGFyZW50KFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGVtcEVsZW1lbnRzID0gQXJyYXkuZnJvbShlbGVtZW50cyk7XG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBFbGVtZW50cy5wb3AoKTtcbiAgY29uc3Qgc2Vjb25kUGFyZW50ID0gZmlyc3RFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRlbXBFbGVtZW50cykge1xuICAgIGNvbnN0IHNlY1BhciA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChzZWNQYXIuaWQgIT09IHNlY29uZFBhcmVudC5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB1c2VyIHNlbGVjdGVkIGVsZW1lbnRzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIHVzZXItc2VsZWN0ZWQgZWxlbWVudHNcbiAqIEByZXR1cm5zIHRydWUgaWYgc2VsZWN0aW9uIGlzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlTdGF2ZVNlbGVjdGlvbihlbGVtZW50czogU1ZHRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IGVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZiA9IGVsZW1lbnRzQXJyYXlbaV0uY2xvc2VzdCgnLnN0YWZmJyk7XG5cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGFub3RoZXJTdGFmZiA9IGVsZW1lbnRzQXJyYXlbal0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICAvLyBjb21wYXJlIHdpdGggb3RoZXIgc3RhdmVzXG4gICAgICBpZiAoIXN0YWZmLmlzU2FtZU5vZGUoYW5vdGhlclN0YWZmKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJvdW5kaW5nIGJveCBvYmplY3QgaW50ZXJmYWNlIGZvciBnZXRTdGFmZkJCb3goKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWZmQkJveCB7XG4gIGlkOiBzdHJpbmc7XG4gIHVseDogbnVtYmVyO1xuICB1bHk6IG51bWJlcjtcbiAgbHJ4OiBudW1iZXI7XG4gIGxyeTogbnVtYmVyO1xuICByb3RhdGU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJvdW5kaW5nIGJveCBvZiBhIHN0YWZmIGJhc2VkIG9uIGl0cyBzdGFmZiBsaW5lcy5cbiAqIFJvdGF0ZSBpcyBpbmNsdWRlZCBpbiByYWRpYW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhZmZCQm94KHN0YWZmOiBTVkdHRWxlbWVudCk6IFN0YWZmQkJveCB7XG4gIGxldCB1bHgsIHVseSwgbHJ4LCBscnksIHJvdGF0ZTtcbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgncGF0aCcpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb29yZGluYXRlczogbnVtYmVyW10gPSBwYXRoXG4gICAgICAuZ2V0QXR0cmlidXRlKCdkJylcbiAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgLm1hcCgoZWxlbWVudCkgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICBpZiAocm90YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbihcbiAgICAgICAgKGNvb3JkaW5hdGVzWzNdIC0gY29vcmRpbmF0ZXNbMV0pIC8gKGNvb3JkaW5hdGVzWzJdIC0gY29vcmRpbmF0ZXNbMF0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodWx5ID09PSB1bmRlZmluZWQgfHwgTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKSA8IHVseSkge1xuICAgICAgdWx5ID0gTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKTtcbiAgICB9XG4gICAgaWYgKHVseCA9PT0gdW5kZWZpbmVkIHx8IGNvb3JkaW5hdGVzWzBdIDwgdWx4KSB7XG4gICAgICB1bHggPSBjb29yZGluYXRlc1swXTtcbiAgICB9XG4gICAgaWYgKGxyeSA9PT0gdW5kZWZpbmVkIHx8IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSkgPiBscnkpIHtcbiAgICAgIGxyeSA9IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSk7XG4gICAgfVxuICAgIGlmIChscnggPT09IHVuZGVmaW5lZCB8fCBjb29yZGluYXRlc1syXSA+IGxyeCkge1xuICAgICAgbHJ4ID0gY29vcmRpbmF0ZXNbMl07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBpZDogc3RhZmYuaWQsIHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlIH07XG59XG5cbi8qKlxuICogc2VsZWN0IGEgYm91bmRpbmdib3ggZWxlbWVudFxuICogQHBhcmFtIGVsIC0gdGhlIGJib3ggKHN5bFRleHRSZWN0KSBlbGVtZW50IGluIHRoZSBET01cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIHRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCQm94KFxuICBlbDogU1ZHR3JhcGhpY3NFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IHZvaWQge1xuICBjb25zdCBiYm94ID0gZWw7XG4gIGNvbnN0IHN5bCA9IGJib3guY2xvc2VzdCgnLnN5bCcpO1xuICBpZiAoIXN5bC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzeWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBiYm94LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgY29uc3QgY2xvc2VzdCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNsb3Nlc3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICBjbG9zZXN0LmNsYXNzTGlzdC5hZGQoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG4gICAgaWYgKGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5sZW5ndGgpIHtcbiAgICAgIGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgfSk7XG4gICAgICBjbG9zZXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5zdHJva2UgPSAnI2QwMCc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmVvblZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzaXplKHN5bCBhcyBTVkdHcmFwaGljc0VsZW1lbnQsIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChkcmFnSGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgIH1cbiAgICBjb25zdCBzeWxJZCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpLmlkO1xuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzcGFuLicgKyBzeWxJZCk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNkMDAnO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgndGV4dC1zZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyQkJveEFjdGlvbnMoKTtcbn1cblxuLyoqXG4gKiBTZWxlY3Qgbm90IG5ldW1lIGVsZW1lbnRzLlxuICogQHBhcmFtIG5vdE5ldW1lcyAtIEFuIGFycmF5IG9mIG5vdCBuZXVtZXMgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RObihub3ROZXVtZXM6IFNWR0dyYXBoaWNzRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGlmIChub3ROZXVtZXMubGVuZ3RoID4gMCkge1xuICAgIG5vdE5ldW1lcy5mb3JFYWNoKChubikgPT4ge1xuICAgICAgc2VsZWN0KG5uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgc2VsZWN0aW5nIGFuIGFycmF5IG9mIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gdHlwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdEFsbChcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbiAgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNlbGVjdGlvblR5cGUgPSBnZXRTZWxlY3Rpb25UeXBlKCk7XG4gIHVuc2VsZWN0KCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHNlbGVjdGlvbkNsYXNzO1xuICBsZXQgY29udGFpbnNMYXllckVsZW1lbnRzID0gZmFsc2U7XG4gIGxldCBjb250YWluc05jID0gZmFsc2U7XG5cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3lsbGFibGUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmV1bWUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmMnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3RhZmYnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlCQm94JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5zeWxUZXh0UmVjdC1kaXNwbGF5JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5jbGVmLCAuY3VzdG9zLCAuYWNjaWQsIC5kaXZMaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlICcgKyBzZWxlY3Rpb25UeXBlKTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZ3JvdXBpbmdzIHNwZWNpZmllZCBieSBzZWxlY3Rpb25DbGFzc1xuICAvLyB0aGF0IGNvbnRhaW4gdGhlIHByb3ZpZGVkIGVsZW1lbnRzIHRvIHNlbGVjdC5cbiAgY29uc3QgZ3JvdXBzVG9TZWxlY3QgPSBuZXcgU2V0PFNWR0dFbGVtZW50PigpO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBsZXQgZ3JvdXBpbmcgPSBlbGVtZW50LmNsb3Nlc3Q8U1ZHR0VsZW1lbnQ+KHNlbGVjdGlvbkNsYXNzKTtcbiAgICBpZiAoZ3JvdXBpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGNsaWNrLXNlbGVjdGVkIGEgY2xlZiBvciBhIGN1c3RvcyBvciBhbiBhY2NpZCBvciBhIGRpdkxpbmVcbiAgICAgIGdyb3VwaW5nID0gZWxlbWVudC5jbG9zZXN0KCcuY2xlZiwgLmN1c3RvcywgLmFjY2lkLCAuZGl2TGluZScpO1xuICAgICAgaWYgKGdyb3VwaW5nID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRWxlbWVudCAnICtcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgK1xuICAgICAgICAgICAgJyBpcyBub3QgcGFydCBvZiBzcGVjaWZpZWQgZ3JvdXAgYW5kIGlzIG5vdCBhIGNsZWYgb3IgY3VzdG9zIG9yIGFjY2lkIG9yIGRpdkxpbmUuJyxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb250YWluc0xheWVyRWxlbWVudHMgPSBjb250YWluc0xheWVyRWxlbWVudHMgfHwgdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbnNOYyA9IGNvbnRhaW5zTmMgfHwgdHJ1ZTtcbiAgICB9XG4gICAgZ3JvdXBzVG9TZWxlY3QuYWRkKGdyb3VwaW5nKTtcblxuICAgIC8vIENoZWNrIGZvciBwcmVjZWRlcy9mb2xsb3dzXG4gICAgbGV0IHNlbGVjdGVkID0gZ3JvdXBpbmc7XG4gICAgbGV0IGZvbGxvd3MgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyk7XG4gICAgbGV0IHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICB3aGlsZSAoZm9sbG93cyB8fCBwcmVjZWRlcykge1xuICAgICAgaWYgKGZvbGxvd3MpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGZvbGxvd3Muc2xpY2UoMSkpO1xuICAgICAgICBpZiAoZ3JvdXBzVG9TZWxlY3QuaGFzKHNlbGVjdGVkKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkLmNsYXNzTGlzdC5hZGQoJ25vLW1vdmluZycpO1xuICAgICAgICBncm91cHNUb1NlbGVjdC5hZGQoc2VsZWN0ZWQpO1xuICAgICAgICBmb2xsb3dzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6Zm9sbG93cycpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZGVzKSB7XG4gICAgICAgIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBwcmVjZWRlcy5zbGljZSgxKSk7XG4gICAgICAgIGlmIChncm91cHNUb1NlbGVjdC5oYXMoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LmFkZCgnbm8tbW92aW5nJyk7XG4gICAgICAgIGdyb3Vwc1RvU2VsZWN0LmFkZChzZWxlY3RlZCk7XG4gICAgICAgIHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2VsZWN0IHRoZSBlbGVtZW50c1xuICBncm91cHNUb1NlbGVjdC5mb3JFYWNoKChncm91cDogU1ZHR3JhcGhpY3NFbGVtZW50KSA9PlxuICAgIHNlbGVjdChncm91cCwgZHJhZ0hhbmRsZXIsIGZhbHNlKSxcbiAgKTtcblxuICAvKiBEZXRlcm1pbmUgdGhlIGNvbnRleHQgbWVudSB0byBkaXNwbGF5IChpZiBhbnkpICovXG5cbiAgY29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbShncm91cHNUb1NlbGVjdC52YWx1ZXMoKSkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG5cbiAgLy8gSGFuZGxlIG9jY3VyYW5jZSBvZiBjbGVmIG9yIGN1c3RvcyBvciBhY2NpZCBvciBkaXZMaW5lXG4gIGlmIChjb250YWluc0xheWVyRWxlbWVudHMgJiYgIWNvbnRhaW5zTmMpIHtcbiAgICAvLyBBIGNvbnRleHQgbWVudSB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGEgc2luZ2xlIGNsZWZcbiAgICBpZiAoZ3JvdXBzVG9TZWxlY3Quc2l6ZSA9PT0gMSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhncm91cHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2VsZWN0aW9uVHlwZSA9PSAnc2VsQnlTeWxsYWJsZScpIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMoKTtcbiAgICAgICAgICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbiAgICAgICAgICByZXNpemUoZ3JvdXBzWzBdLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIGlmIChncm91cHNUb1NlbGVjdC5zaXplID09PSAxKSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckxheWVyRWxlbWVudEFjdGlvbnMoZ3JvdXBzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvLyBUT0RPIGNoYW5nZSBjb250ZXh0IGlmIGl0IGlzIG9ubHkgYSBuZXVtZS9uYy5cbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ3NpbmdsZVNlbGVjdCcpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGxpbmtlZCBzeWxsYWJsZSBzcGxpdCBieSBhIHN0YWZmIGJyZWFrXG4gICAgICAgICAgLy8gaWYgdGhleSBhcmUgbGlua2FibGUsIHVzZXIgY2FuIHRvZ2dsZSBsaW5rZWQtc3lsbHNcbiAgICAgICAgICBpZiAoR3JvdXBpbmcuaXNMaW5rYWJsZSgnc2VsQnlTeWxsYWJsZScsIGdyb3VwcykpIHtcbiAgICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnbGlua2FibGVTZWxlY3QnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgc3lsbGFibGVzIGFyZSBhbGwgbG9jYXRlZCBvbiBvbmUgc3RhdmUsIHRoZXkgc2hvdWxkIGJlIGdyb3VwYWJsZVxuICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nLmlzR3JvdXBhYmxlKCdzZWxCeVN5bGxhYmxlJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdtdWx0aVNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBzeWxscyBhcmUgYWNjcm9zcyBtdWx0aXBsZSBzdGF2ZXNcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnZGVmYXVsdCcpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIC8vIFRPRE8gY2hhbmdlIGNvbnRleHQgaWYgaXQgaXMgb25seSBhIG5jLlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck5ldW1lQWN0aW9ucygpO1xuICAgICAgICAgIEdyb3VwaW5nLmluaXRHcm91cGluZ0xpc3RlbmVycygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChHcm91cGluZy5pc0dyb3VwYWJsZSgnc2VsQnlOZXVtZScsIGdyb3VwcykpIHtcbiAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbmV1bWUnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJOY0FjdGlvbnMoZ3JvdXBzWzBdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGlmIChzaGFyZWRTZWNvbmRMZXZlbFBhcmVudChncm91cHMpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHNlbGVjdGlvbiBpcyBhIGxpZ2F0dXJlIG9yIGNhbiBiZSBhIGxpZ2F0dXJlXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVzZSBuZXVtZSBjb21wb25lbnRzIGFyZSBwYXJ0IG9mIHRoZSBzYW1lIG5ldW1lXG4gICAgICAgICAgICBpZiAoZ3JvdXBzWzBdLnBhcmVudEVsZW1lbnQgPT09IGdyb3Vwc1sxXS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShncm91cHNbMF0ucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBuZXVtZSBjb21wb25lbnRzIGFyZSBhZGphY2VudFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoXG4gICAgICAgICAgICAgICAgICBjaGlsZHJlbi5pbmRleE9mKGdyb3Vwc1swXSkgLSBjaGlsZHJlbi5pbmRleE9mKGdyb3Vwc1sxXSksXG4gICAgICAgICAgICAgICAgKSA9PT0gMVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHNlY29uZCBuZXVtZSBjb21wb25lbnQgaXMgbG93ZXIgdGhhbiBmaXJzdC5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG9yZGVyIGluIHRoZSBsaXN0IG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3JkZXIgYnkgeC1wb3NpdGlvbi5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQyA9IGdyb3Vwc1swXS5jaGlsZHJlblswXSBhcyBTVkdVc2VFbGVtZW50O1xuICAgICAgICAgICAgICAgIGxldCBzZWNvbmROQyA9IGdyb3Vwc1sxXS5jaGlsZHJlblswXSBhcyBTVkdVc2VFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0TkNYID0gZmlyc3ROQy54LmJhc2VWYWwudmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZE5DWCA9IHNlY29uZE5DLnguYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQ1kgPSBmaXJzdE5DLnkuYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2Vjb25kTkNZID0gc2Vjb25kTkMueS5iYXNlVmFsLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgLy8gb3JkZXIgbmMncyBieSB4IGNvb3JkIChsZWZ0IHRvIHJpZ2h0KVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGZpcnN0TkNYID4gc2Vjb25kTkNYIHx8XG4gICAgICAgICAgICAgICAgICAoZmlyc3ROQ1ggPT09IHNlY29uZE5DWCAmJiBmaXJzdE5DWSA8IHNlY29uZE5DWSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIFtmaXJzdE5DLCBzZWNvbmROQ10gPSBbc2Vjb25kTkMsIGZpcnN0TkNdO1xuICAgICAgICAgICAgICAgICAgW2ZpcnN0TkNYLCBmaXJzdE5DWSwgc2Vjb25kTkNYLCBzZWNvbmROQ1ldID0gW1xuICAgICAgICAgICAgICAgICAgICBzZWNvbmROQ1gsXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZE5DWSxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROQ1gsXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0TkNZLFxuICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBzdGFja2VkIG5jJ3MvbGlnYXR1cmUgKGlkZW50aWNhbCB4KSwgb3IgZGVzY2VuZGluZyBuYydzICh5IGRlc2NlbmRzKVxuICAgICAgICAgICAgICAgIGlmIChmaXJzdE5DWCA9PT0gc2Vjb25kTkNYIHx8IGZpcnN0TkNZIDwgc2Vjb25kTkNZKSB7XG4gICAgICAgICAgICAgICAgICBHcm91cGluZy50cmlnZ2VyR3JvdXBpbmcoJ2xpZ2F0dXJlJyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbmMnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKHNoYXJlZFNlY29uZExldmVsUGFyZW50KGdyb3VwcykpIHtcbiAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbmMnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBzZWxlY3RCQm94KGdyb3Vwc1swXSwgZHJhZ0hhbmRsZXIsIG5lb25WaWV3KTtcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJCQm94QWN0aW9ucygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKChnKSA9PiBzZWxlY3RCQm94KGcsIGRyYWdIYW5kbGVyLCB1bmRlZmluZWQpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlLiBUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4nKTtcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uIGNoYW5nZVN0YWZmTGlzdGVuZXIoKTogdm9pZCB7XG4gIC8vIHRyeSB7XG4gIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFuZ2VTdGFmZicpXG4gIC8vIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIFNlbGVjdE9wdGlvbnMuY2hhbmdlU3RhZmZIYW5kbGVyKTtcbiAgLy8gfSBjYXRjaCAoZSkge2NvbnNvbGUuZGVidWcoZSk7fVxuICAvLyB9XG59XG4iLCJpbXBvcnQgeyByZWNvcmROb3RpZmljYXRpb24gfSBmcm9tICcuL0Vycm9yTG9nJztcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gJy4vcmFuZG9tJztcblxudHlwZSBOb3RpZmljYXRpb25UeXBlID0gJ2RlZmF1bHQnIHwgJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdzdWNjZXNzJztcblxuY29uc3Qgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW10gPSBuZXcgQXJyYXkoMCk7XG5sZXQgY3VycmVudE1vZGVNZXNzYWdlOiBOb3RpZmljYXRpb24gPSBudWxsO1xuXG4vKipcbiAqIE51bWJlciBvZiBub3RpZmljYXRpb25zIHRvIGRpc3BsYXkgYXQgYSB0aW1lLlxuICovXG5jb25zdCBOVU1CRVJfVE9fRElTUExBWSA9IDM7XG5cbi8qKlxuICogTnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgdG8gZGlzcGxheSBhdCBhIHRpbWUuXG4gKi9cbmNvbnN0IFRJTUVPVVQgPSA1MDAwO1xuXG5jb25zdCBub3RpZmljYXRpb25JY29uOiBSZWNvcmQ8Tm90aWZpY2F0aW9uVHlwZSwgc3RyaW5nPiA9IHtcbiAgZGVmYXVsdDogJycsXG4gIHdhcm5pbmc6ICfimqDvuI8gJyxcbiAgZXJyb3I6ICfwn5S0ICcsXG4gIHN1Y2Nlc3M6ICfinIUgJyxcbn07XG5cbi8qKlxuICogQSBjbGFzcyB0byBtYW5hZ2UgTmVvbiBub3RpZmljYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkaXNwbGF5ZWQ6IGJvb2xlYW47XG4gIGlkOiBzdHJpbmc7XG4gIGlzTW9kZU1lc3NhZ2U6IGJvb2xlYW47XG4gIGxvZ0luZm86IHN0cmluZztcbiAgdGltZW91dElEOiBudW1iZXI7XG4gIHR5cGU6IE5vdGlmaWNhdGlvblR5cGU7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbm90aWZpY2F0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIE5vdGlmaWNhdGlvbiBjb250ZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG1lc3NhZ2U6IHN0cmluZywgdHlwZTogTm90aWZpY2F0aW9uVHlwZSwgbG9nSW5mbzogc3RyaW5nID0gbnVsbCkge1xuICAgIHRoaXMubWVzc2FnZSA9IG5vdGlmaWNhdGlvbkljb25bdHlwZV0gKyBtZXNzYWdlO1xuICAgIHRoaXMuZGlzcGxheWVkID0gZmFsc2U7XG4gICAgdGhpcy5pZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuaXNNb2RlTWVzc2FnZSA9IG1lc3NhZ2Uuc2VhcmNoKCdNb2RlJykgIT09IC0xO1xuICAgIHRoaXMubG9nSW5mbyA9IGxvZ0luZm87XG4gICAgdGhpcy50aW1lb3V0SUQgPSAtMTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgSUQgZnJvbSBzZXRUaW1lb3V0LiAqL1xuICBzZXRUaW1lb3V0SWQgKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVvdXRJRCA9IE1hdGgubWF4KGlkLCAtMSk7XG4gIH1cblxuICAvKiogRGlzcGxheSB0aGUgTm90aWZpY2F0aW9uLiAqL1xuICBkaXNwbGF5ICgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXllZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIFVVSUQgZm9yIHRoaXMgbm90aWZpY2F0aW9uLlxuICAgKi9cbiAgZ2V0SWQgKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhciB0aGUgbm90aWZpY2F0aW9uXG4gKiBAcGFyYW0gY3VycmVudElkIC0gVGhlIElEIG9mIHRoZSBub3RpZmljYXRpb24gdG8gYmUgY2xlYXJlZC5cbiAqL1xuZnVuY3Rpb24gY2xlYXJOb3RpZmljYXRpb24gKGN1cnJlbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjdXJyZW50SWQpKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VycmVudElkKS5yZW1vdmUoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgYSBub3RpZmljYXRpb24uXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uIC0gTm90aWZpY2F0aW9uIHRvIGRpc3BsYXkuXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlOb3RpZmljYXRpb24gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gIC8vIE5vdCBzdXJlIHdoYXQgaXQgZG9lcywgbWF5YmUgcmVsYXRlZCB0byByb2Rhbi9uZW9uXG4gIGlmIChub3RpZmljYXRpb24uaXNNb2RlTWVzc2FnZSkge1xuICAgIGlmIChjdXJyZW50TW9kZU1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgIGN1cnJlbnRNb2RlTWVzc2FnZSA9IG5vdGlmaWNhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dChjdXJyZW50TW9kZU1lc3NhZ2UudGltZW91dElEKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHRvcCBub3RpZmljYXRpb24gaWYgZXhjZWVkcyBtYXhtaW11bVxuICBub3RpZmljYXRpb25zLnB1c2gobm90aWZpY2F0aW9uKTtcbiAgaWYgKG5vdGlmaWNhdGlvbnMubGVuZ3RoID4gTlVNQkVSX1RPX0RJU1BMQVkpIHtcbiAgICBjb25zdCB0b1JlbW92ZSA9IG5vdGlmaWNhdGlvbnMuc2hpZnQoKTtcbiAgICBjbGVhck5vdGlmaWNhdGlvbih0b1JlbW92ZS5nZXRJZCgpKTtcbiAgfVxuICBjb25zdCBub3RpZmljYXRpb25Db250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbi1jb250ZW50Jyk7XG4gIGNvbnN0IG5ld05vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBuZXdOb3RpZmljYXRpb24uY2xhc3NMaXN0LmFkZCgnbmVvbi1ub3RpZmljYXRpb24nKTtcbiAgbmV3Tm90aWZpY2F0aW9uLmNsYXNzTGlzdC5hZGQoYG5lb24tbm90aWZpY2F0aW9uLSR7bm90aWZpY2F0aW9uLnR5cGV9YCk7XG4gIG5ld05vdGlmaWNhdGlvbi5pZCA9IG5vdGlmaWNhdGlvbi5nZXRJZCgpO1xuICBuZXdOb3RpZmljYXRpb24uaW5uZXJIVE1MID0gbm90aWZpY2F0aW9uLm1lc3NhZ2U7XG4gIG5vdGlmaWNhdGlvbkNvbnRlbnQuYXBwZW5kKG5ld05vdGlmaWNhdGlvbik7XG4gIG5vdGlmaWNhdGlvbkNvbnRlbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICBub3RpZmljYXRpb24uZGlzcGxheSgpO1xufVxuXG4vKipcbiAqIFN0YXJ0IGRpc3BsYXlpbmcgbm90aWZpY2F0aW9ucy4gQ2FsbGVkIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0Tm90aWZpY2F0aW9uIChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICBkaXNwbGF5Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gIG5vdGlmaWNhdGlvbi5zZXRUaW1lb3V0SWQoXG4gICAgd2luZG93LnNldFRpbWVvdXQoY2xlYXJOb3RpZmljYXRpb24sIFRJTUVPVVQsIG5vdGlmaWNhdGlvbi5nZXRJZCgpKVxuICApO1xuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChub3RpZmljYXRpb24uZ2V0SWQoKSlcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KG5vdGlmaWNhdGlvbi50aW1lb3V0SUQpO1xuICAgICAgY2xlYXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLmdldElkKCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEFkZCBhIG5vdGlmaWNhdGlvbiB0byB0aGUgcXVldWUuXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uIC0gTm90aWZpY2F0aW9uIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWV1ZU5vdGlmaWNhdGlvbiAobm90aWZpY2F0aW9uQ29udGVudDogc3RyaW5nLCB0eXBlOiBOb3RpZmljYXRpb25UeXBlID0gJ2RlZmF1bHQnLCBsb2dJbmZvOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24obm90aWZpY2F0aW9uQ29udGVudCwgdHlwZSwgbG9nSW5mbyk7XG5cbiAgaWYgKG5vdGlmaWNhdGlvbi50eXBlID09ICdlcnJvcicgfHwgbm90aWZpY2F0aW9uLnR5cGUgPT0gJ3dhcm5pbmcnKSB7XG4gICAgcmVjb3JkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gIH1cblxuICBzdGFydE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7IHF1ZXVlTm90aWZpY2F0aW9uIH07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gYXJnc0FycmF5O1xuXG5mdW5jdGlvbiBhcmdzQXJyYXkoZnVuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKGxlbikge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgIHZhciBpID0gLTE7XG4gICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuLmNhbGwodGhpcywgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4uY2FsbCh0aGlzLCBbXSk7XG4gICAgfVxuICB9O1xufSIsIm1vZHVsZS5leHBvcnRzID0gZDM7IiwiLyoqXG4gKiBIVE1MIGZvciBlYWNoIGluc2VydCB0YWIgKG5ldW1lLCBncm91cGluZywgY2xlZiwgc3lzdGVtLCBhbmQgZGl2aXNpb24pLlxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0VGFiSHRtbDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgcHJpbWl0aXZlVGFiOiBgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJwdW5jdHVtXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInB1bmN0dW1cIiB0aXRsZT1cInB1bmN0dW1cIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3B1bmN0dW0ucG5nXCIgY2xhc3M9XCJpbWFnZVwiLz48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInZpcmdhXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInZpcmdhXCIgdGl0bGU9XCJ2aXJnYVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdmlyZ2EucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidmlyZ2FSZXZlcnNlZFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJSZXZlcnNlZCBWaXJnYVwiIHRpdGxlPVwiUmV2ZXJzZWQgVmlyZ2FcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3ZpcmdhX3JldmVyc2VkLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRpYW1vbmRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiaW5jbGluYXR1bVwiIHRpdGxlPVwiaW5jbGluYXR1bVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvZGlhbW9uZC5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjdXN0b3NcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiY3VzdG9zXCIgdGl0bGU9XCJjdXN0b3NcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2N1c3Rvcy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjQ2xlZlwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJDIENsZWZcIiB0aXRsZT1cIiBDIENsZWZcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2NDbGVmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImZDbGVmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkYgQ2xlZlwiIHRpdGxlPVwiRiBDbGVmXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9mQ2xlZi5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJsaXF1ZXNjZW50QVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJMaXF1ZXNjZW50IEFcIiB0aXRsZT1cIkxpcXVlc2NlbnQgQVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbGlxdWVzY2VudEEucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibGlxdWVzY2VudENcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiTGlxdWVzY2VudCBDXCIgdGl0bGU9XCJMaXF1ZXNjZW50IENcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2xpcXVlc2NlbnRDLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImZsYXRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRmxhdFwiIHRpdGxlPVwiRmxhdFwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvYWNjaWRGbGF0LnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cIm5hdHVyYWxcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiTmF0dXJhbFwiIHRpdGxlPVwiTmF0dXJhbFwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvYWNjaWROYXR1cmFsLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRpdkxpbmVNYXhpbWFcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRGl2TGluZSBNYXhpbWFcIiB0aXRsZT1cIkRpdkxpbmUgTWF4aW1hXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9kaXZpc2lvLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPmAsXG4gIGdyb3VwaW5nVGFiOiBgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJwZXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicGVzXCIgdGl0bGU9XCJwZXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3Blcy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjbGl2aXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiY2xpdmlzXCIgdGl0bGU9XCJjbGl2aXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2NsaXZpcy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzY2FuZGljdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwic2NhbmRpY3VzXCIgdGl0bGU9XCJzY2FuZGljdXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3NjYW5kaWN1cy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjbGltYWN1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjbGltYWN1c1wiIHRpdGxlPVwiY2xpbWFjdXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2NsaW1hY3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvcmN1bHVzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInRvY3VsdXNcIiB0aXRsZT1cInRvY3VsdXNcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3RvcmN1bHVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInBvcnJlY3R1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwb3JyZWN0dXNcIiB0aXRsZT1cInBvcnJlY3R1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcG9ycmVjdHVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInByZXNzdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicHJlc3N1c1wiIHRpdGxlPVwicHJlc3N1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcHJlc3N1cy5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5gLFxuICBzeXN0ZW1UYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInN0YWZmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBsb25nZWxcIiBhcmlhLWxhYmVsPVwic3lzdGVtXCIgdGl0bGU9XCJzeXN0ZW1cIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3N0YWZmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cD5DbGljayB1cHBlciBsZWZ0IGFuZCBsb3dlciByaWdodCBjb3JuZXJzIG9mIG5ldyBzdGFmZi48L3A+YCxcbiAgLy8gZGl2aXNpb25UYWI6IFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J3NtYWxsRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvc21hbGxkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyBcIjxwIGNsYXNzPSdpbnNlcnQtZWxlbWVudC1jb250YWluZXInPlwiICtcbiAgLy8gICAgIFwiPGJ1dHRvbiBpZD0nbWlub3JEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9taW5vcmRpdi5wbmdcIicgY2xhc3M9J2ltYWdlJy8+PC9idXR0b24+PC9wPlwiICtcbiAgLy8gICAgIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J21ham9yRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvbWFqb3JkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyBcIjxwIGNsYXNzPSdpbnNlcnQtZWxlbWVudC1jb250YWluZXInPlwiICtcbiAgLy8gXCI8YnV0dG9uIGlkPSdmaW5hbERpdicgY2xhc3M9J3NpZGUtcGFuZWwtYnRuIGluc2VydGVsIHRhbGxlbCc+PGltZyBzcmM9J1wiICsgX19BU1NFVF9QUkVGSVhfXyArICdhc3NldHMvaW1nL2ZpbmFsZGl2LnBuZyBcIicgY2xhc3M9J2ltYWdlJy8+PC9idXR0b24+PC9wPlwiXG59O1xuXG4vKipcbiAqIFN0cnVjdHVyZSBvZiBpbnNlcnQgcGFuZWwgd2l0aCBiYXNpYyBncm91cGluZyB0YWJzLlxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0Q29udHJvbHNQYW5lbCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiIGlkPVwiaW5zZXJ0TWVudVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZy10aXRsZVwiPklOU0VSVDwvZGl2PlxuICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvbiBpcy1wdWxsZWQtcmlnaHRcIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVJbnNlcnRcIiB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gZmlyc3Qtc3Vic2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiaW5zZXJ0Q29udGVudHNcIiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCIgc3R5bGU9XCJvdmVyZmxvdy15OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cInByaW1pdGl2ZVRhYlwiIGNsYXNzPVwiaW5zZXJ0VGFiXCI+UHJpbWl0aXZlIEVsZW1lbnRzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiZ3JvdXBpbmdUYWJcIiBjbGFzcz1cImluc2VydFRhYlwiPkdyb3VwaW5nPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwic3lzdGVtVGFiXCIgY2xhc3M9XCJpbnNlcnRUYWJcIj5TeXN0ZW08L2E+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiaW5zZXJ0X2RhdGFcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBlZGl0IHBhbmVsIHdpdGggYnV0dG9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRDb250cm9sc1BhbmVsID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJlZGl0TWVudVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZy10aXRsZSBmb2N1c2VkXCI+RURJVDwvZGl2PlxuICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvbiBpcy1wdWxsZWQtcmlnaHRcIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVFZGl0XCIgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+XG4gICAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJlZGl0Q29udGVudHNcIiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gZmlyc3Qtc3Vic2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlbGVjdGlvbi1tb2RlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1zdWItdGl0bGVcIj5TZWxlY3Rpb24gTW9kZTo8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwic2VsZWN0aW9uLW1vZGUtYnRucy1jb250YWluZXJcIiAgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCIgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvO1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeVN5bGxhYmxlXCI+U3lsbGFibGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5TmV1bWVcIj5OZXVtZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlOY1wiPk5ldW1lIENvbXBvbmVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlTdGFmZlwiPlN0YWZmPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeUxheWVyRWxlbWVudFwiPkxheWVyIEVsZW1lbnQ8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJkaXNwbGF5LXNsaWRlci1hY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJtb3JlRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJleHRyYUVkaXRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgICAgICAqIFRoZSBleHRyYUVkaXQgcGFuZWwgaXMgYWRkZWQgZm9yIGVkaXQgb3B0aW9ucyB0aGF0IGhhdmUgZHJvcGRvd24gbWVudXNcbiAgICAgICAgICAgICAgICAgICAgKiBMaWtlIHRoZSBOZXVtZSBhbmQgQ2xlZiBtZW51c1xuICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSBtb3JlRWRpdCBtZW51IG5lZWRzIHRvIGhhdmUgb3ZlcmZsb3cgZm9yIGNhc2VzIHdoZXJlIGl0IGhhcyBsb3RzIG9mIGJ1dHRvbnNcbiAgICAgICAgICAgICAgICAgICAgKiBCdXQgb3ZlcmZsb3cgcnVpbnMgZHJvcGRvd24gbWVudXNcbiAgICAgICAgICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cIm5ldW1lRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInVuZG9SZWRvX2NvbnRyb2xzXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgbmMgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBuY0FjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgSGVhZCBTaGFwZTo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5IZWFkIFNoYXBlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQdW5jdHVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+UHVuY3R1bTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlZpcmdhXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+VmlyZ2E8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJWaXJnYVJldmVyc2VkXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+UmV2ZXJzZWQgVmlyZ2E8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJJbmNsaW5hdHVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+SW5jbGluYXR1bTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkxpcXVlc2NlbnRBbnRpY2xvY2t3aXNlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TGlxdWVzY2VudCBBPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiTGlxdWVzY2VudENsb2Nrd2lzZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPkxpcXVlc2NlbnQgQzwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGJhc2ljIG5ldW1lIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdE5ldW1lQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJzcGxpdC1uZXVtZVwiPlNwbGl0IE5ldW1lczwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgbmV1bWUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBuZXVtZUFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5Hcm91cGluZyBPcHRpb25zOjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkdyb3VwaW5nczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudCBzY3JvbGxhYmxlLWRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGltYWN1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaW1hY3VzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2xpbWFjdXNSZXN1cGludXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5DbGltYWN1cyBSZXN1cGludXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGl2aXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5DbGl2aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQZXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5QZXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQZXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UGVzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Qb3JyZWN0dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNGbGV4dXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Qb3JyZWN0dXMgRmxleHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiUG9ycmVjdHVzU3VicHVuY3Rpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1cyBTdWJwdW5jdGlzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiUHJlc3N1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlByZXNzdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5TY2FuZGljdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNGbGV4dXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5TY2FuZGljdXMgRmxleHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiU2NhbmRpY3VzU3VicHVuY3Rpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1cyBTdWJwdW5jdGlzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVG9yY3VsdXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Ub3JjdWx1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlRvcmN1bHVzUmVzdXBpbnVzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+VG9yY3VsdXMgUmVzdXBpbnVzPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5jc1wiPlVuZ3JvdXA8L2J1dHRvbj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGRlZmF1bHQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0QWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGRlZmF1bHQgYWN0aW9uIG1lbnUgd2hlbiBzZWxlY3RpbmcgYnkgc3lsbGFibGVcbiAqIFNhbWUgYXMgYWJvdmUgZXhjZXB0IGluY2x1ZGVzIHJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3lsQWN0aW9uQ29udGVudHMgPSBgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGN1c3RvcyBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGN1c3Rvc0FjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgbGF5ZXIgZWxlbWVudCAob3V0c2lkZSBzeWxsYWJsZSkgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckVsZW1lbnRPdXRBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImluc2VydFRvU3lsbGFibGVcIj5JbnNlcnQgdG8gbmVhcmVzdCBzeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGxheWVyIGVsZW1lbnQgKGluc2lkZSBzeWxsYWJsZSkgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibW92ZU91dHNpZGVTeWxsYWJsZVwiPk1vdmUgb3V0c2lkZSBzeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGFjY2lkIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgYWNjaWRBY3Rpb25Db250ZW50cyA9IGA8bGFiZWw+Q2hhbmdlIEFjY2lkZW50YWw6PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIm92ZXJmbG93PVwiYXV0b1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5TaGFwZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj48dXNlIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPjwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9GbGF0XCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RmxhdDwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTmF0dXJhbFwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPk5hdHVyYWw8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBzdGFmZiBzcGxpdCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0YWZmU3BsaXRBY3Rpb25Db250ZW50cyA9IGA8ZGl2PlNwbGl0IFN5c3RlbTo8L2Rpdj5cbiAgICA8ZGl2IGlkPVwic3BsaXQtc3lzdGVtLWJ0bnMtY29udGFpbmVyXCIgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzcGxpdC1zeXN0ZW1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCI+U3BsaXQ8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlc2V0LXJvdGF0ZVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5SZXNldCBSb3RhdGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGV4dHJhIHN0YWZmIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3Qgc3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5NZXJnZSBTeXN0ZW1zOjwvbGFiZWw+XG4gICAgPGRpdiBpZD1cIm1lcmdlLXN5c3RlbS1idG5zLWNvbnRhaW5lclwiIGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibWVyZ2Utc3lzdGVtc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5NZXJnZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYWNjaWQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBjb2x1bW5BY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwiY29sLWVkaXQtY29udGFpbmVyXCI+XG4gICAgICAgIEVkaXQgQ29sdW1uIEluZm9ybWF0aW9uOlxuICAgICAgICA8ZGl2IGlkPVwiY29sLXN0ZXBwZXItYnRucy1jb250YWluZXJcIiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtZGVjcmVtZW50XCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBjb2wtc3RlcHBlci1idG5cIj7igJM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY29sLWlucHV0XCIgY2xhc3M9XCJzaWRlLXBhbmVsLXN0ZXBwZXItaW5wdXRcIiB2YWx1ZT1cIjBcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtaW5jcmVtZW50XCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBjb2wtc3RlcHBlci1idG5cIj4rPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiY29sLWNvbmZpcm1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNpZGUtcGFuZWwtY29uZmlybS1idG5cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPkNvbmZpcm08L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjb2wtd2FybmluZ1wiIGNsYXNzPVwic2lkZS1wYW5lbC13YXJuaW5nXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgY2xlZiBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWZBY3Rpb25Db250ZW50cyA9IGBcbiAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCIgb3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzcGxhY2UgT2N0YXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cImluY3JlbWVudC1vY3RhdmVcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj4rMSBPY3RhdmU8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiZGVjcmVtZW50LW9jdGF2ZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPi0xIE9jdGF2ZTwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiIG92ZXJmbG93PVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNoYW5nZSBDbGVmIFNoYXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cIkNDbGVmXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+QyBDbGVmPC9hPlxuICAgICAgICAgICAgICAgICAgICA8YSBpZD1cIkZDbGVmXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RiBDbGVmPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIGA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGl2TGluZSB0eXBlIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZGl2TGluZUFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgRGl2TGluZTo8L2xhYmVsPlxuPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIm92ZXJmbG93PVwiYXV0b1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgPHNwYW4+U2hhcGVzPC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj48dXNlIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPjwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvQ2Flc3VyYVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPkNhZXN1cmE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvRmluYWxpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPkZpbmFsaXM8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWluaW1hXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TWluaW1hPC9hPlxuICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb01haW9yXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TWFpb3I8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWF4aW1hXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TWF4aW1hPC9hPlxuICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb1Zpcmd1bGFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5WaXJndWxhPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYmJveCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGJib3hBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1hdGNoSGVpZ2h0XCI+TWF0Y2ggSGVpZ2h0IGZvciBFbnRpcmUgUm93PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBIVE1MIGZvciBncm91cGluZyBzZWxlY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdyb3VwaW5nTWVudSA9IHtcbiAgbmM6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIG1vcmUtZWRpdC1idG5cIiBpZD1cImdyb3VwTmNzXCI+R3JvdXAgTmV1bWUgQ29tcG9uZW50czwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCxcbiAgbmV1bWU6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJncm91cE5ldW1lc1wiPkdyb3VwIE5ldW1lczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YCxcbiAgc3lsOiBgPGRpdiBjbGFzcz1cIm1vcmUtZWRpdC1idG4gcGFuZWwtYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWVyZ2VTeWxzXCI+TWVyZ2UgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXHRcdDwvZGl2PmAsXG4gIGxpZ2F0dXJlTmM6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZ3JvdXBOY3NcIj5Hcm91cCBOZXVtZSBDb21wb25lbnRzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saWdhdHVyZVwiPlRvZ2dsZSBMaWdhdHVyZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YCxcbiAgbGlnYXR1cmU6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saWdhdHVyZVwiPlRvZ2dsZSBMaWdhdHVyZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YCxcbiAgc3BsaXRTeWxsYWJsZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ0b2dnbGUtbGlua1wiPlRvZ2dsZSBMaW5rZWQgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gLFxufTtcblxuLyogQkdJTk5JTkcgT0YgTU9EQUwgV0lORE9XIENPTlRFTlQgU0VDVElPTiAqL1xuXG4vKipcbiAqIEhUTUwgZm9yIEVkaXQgU3lsbGFibGUgVGV4dCBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmVcIj5TYXZlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogSFRNTCBmb3IgSG90a2V5cyBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGhvdGtleXNNb2RhbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudFwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1ob3RrZXlzXCI+XG4gICAgICAgIDwhLS0gXCJEaXNwbGF5XCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5EaXNwbGF5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPis8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBJbjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBPdXQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+MDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5ab29tIFJlc2V0PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPmg8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+SGlkZSBHbHlwaDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+U2Nyb2xsIFRvIFN5bGxhYmxlIFRleHQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFwiRWRpdFwiIGhvdGtleXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LXN1YmNhdGVnb3J5LXRpdGxlXCI+RWRpdDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+Q3RybDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ejwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5VbmRvPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPkN0cmw8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj56PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJlZG88L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+cS93L2Uvci90L3k8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBieSBTdGFmZi9TeWxsYWJsZS9OZXVtZS9MYXllckVsZW1lbnQvU2VsZWN0aW9uL09mZlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj4xLzIvMy80LzUvNjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGJ5IFN5bGxhYmxlL05ldW1lL05ldW1lIENvbXBvbmVudC9TdGFmZi9MYXllciBFbGVtZW50L0JCb3hcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5OdW1iZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEJlZ2luIEluc2VydCBmb3IgdGhlIDxpPm50aDwvaT4gT3B0aW9uIGluIHRoZSBTZWxlY3RlZCBUYWJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ZzwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgR3JvdXAvVW5ncm91cCBTZWxlY3RlZCBFbGVtZW50KHMpXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBcIk90aGVyXCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5PdGhlcjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+czwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5TYXZlIEZpbGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+RXNjPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJldHVybiB0byBFZGl0IE1vZGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3Qgc3lsbGFibGVBY3Rpb25zQ29udGVudCA9IGBcbiAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1lcmdlU3lsc1wiPk1lcmdlIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICA8L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBlcnJvckxvZ3NQYW5lbENvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJlcnJvckxvZ0hlYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmctdGl0bGVcIj5FcnJvciBMb2c8L2Rpdj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVFcnJvckxvZ1wiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCIgaWQ9XCJlcnJvckxvZ0NvbnRlbnRzXCIgc3R5bGU9XCJvdmVyZmxvdzogc2Nyb2xsOyBwYWRkaW5nOiAwLjVlbSAwLjc1ZW07IG1heC1oZWlnaHQ6IDMwMHB4O1wiPjxkaXY+YDtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCJpbXBvcnQgUkVHRVggZnJvbSAnLi9yZWdleC5qcyc7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZTsiLCIvKiogQG1vZHVsZSBEaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzICovXG5cbmltcG9ydCAqIGFzIENvbG9yIGZyb20gJy4uL3V0aWxzL0NvbG9yJztcbmltcG9ydCBab29tSGFuZGxlciBmcm9tICcuLi9TaW5nbGVWaWV3L1pvb20nO1xuaW1wb3J0IHsgR3JvdXBpbmdUeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MsIHNldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5cbmxldCBsYXN0R2x5cGhPcGFjaXR5OiBudW1iZXIsIGxhc3RJbWFnZU9wYWNpdHk6IG51bWJlciwgbGFzdENpcmNsZVNpemU6IG51bWJlcjtcblxuLyoqXG4gKiBTZXQgem9vbSBjb250cm9sIGxpc3RlbmVyIGZvciBidXR0b24gYW5kIHNsaWRlclxuICogQHBhcmFtIHpvb21IYW5kbGVyIC0gQSBbW1pvb21IYW5kbGVyXV0gaXMgb25seSBuZWNlc3NhcnkgaW4gU2luZ2xlIFBhZ2UgbW9kZSBhcyBkaXZhLmpzIGhhbmRsZXMgem9vbWluZyBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRab29tQ29udHJvbHMgKHpvb21IYW5kbGVyPzogWm9vbUhhbmRsZXIpOiB2b2lkIHtcbiAgaWYgKHpvb21IYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgem9vbVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6b29tU2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgem9vbU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6b29tT3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyB6b29tIH0gPSBnZXRTZXR0aW5ncygpO1xuICB6b29tU2xpZGVyLnZhbHVlID0gU3RyaW5nKHpvb20pO1xuICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKHpvb20pO1xuICB6b29tSGFuZGxlci56b29tVG8oem9vbSAvIDEwMC4wKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXpvb20nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gJzEwMCc7XG4gICAgem9vbVNsaWRlci52YWx1ZSA9ICcxMDAnO1xuICAgIHpvb21IYW5kbGVyLnJlc2V0Wm9vbUFuZFBhbigpO1xuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2V0LXpvb20tZWFzeS1lZGl0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgem9vbU91dHB1dC52YWx1ZSA9ICcxODAnO1xuICAgIHpvb21TbGlkZXIudmFsdWUgPSAnMTgwJztcbiAgICB6b29tSGFuZGxlci56b29tVG8oMTgwLzEwMCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGlucHV0Q2hhbmdlSGFuZGxlciAoKTogdm9pZCB7XG4gICAgem9vbU91dHB1dC52YWx1ZSA9IHpvb21TbGlkZXIudmFsdWU7XG4gICAgem9vbUhhbmRsZXIuem9vbVRvKE51bWJlcih6b29tT3V0cHV0LnZhbHVlKSAvIDEwMC4wKTtcbiAgfVxuXG4gIC8vIHpvb21TbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBpbnB1dENoYW5nZUhhbmRsZXIpO1xuICB6b29tU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBpbnB1dENoYW5nZUhhbmRsZXIpO1xuICB6b29tU2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRab29tID0gcGFyc2VJbnQoem9vbU91dHB1dC52YWx1ZSk7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdBcnJvd1VwJyB8fCBldnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBcbiAgICBldnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZ0LmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJysnKSB7IC8vIGluY3JlYXNlIHpvb20gYnkgMjBcbiAgICAgIGNvbnN0IG5ld1pvb20gPSBNYXRoLm1pbihjdXJyZW50Wm9vbSArIDIwLCBwYXJzZUludCh6b29tU2xpZGVyLmdldEF0dHJpYnV0ZSgnbWF4JykpKTtcbiAgICAgIHpvb21IYW5kbGVyLnpvb21UbyhuZXdab29tIC8gMTAwLjApO1xuICAgICAgem9vbU91dHB1dC52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICAgIHpvb21TbGlkZXIudmFsdWUgPSBTdHJpbmcobmV3Wm9vbSk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnXycpIHsgLy8gZGVjcmVhc2Ugem9vbSBieSAyMFxuICAgICAgY29uc3QgbmV3Wm9vbSA9IE1hdGgubWF4KGN1cnJlbnRab29tIC0gMjAsIHBhcnNlSW50KHpvb21TbGlkZXIuZ2V0QXR0cmlidXRlKCdtaW4nKSkpO1xuICAgICAgem9vbUhhbmRsZXIuem9vbVRvKG5ld1pvb20gLyAxMDAuMCk7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICcwJykge1xuICAgICAgem9vbU91dHB1dC52YWx1ZSA9ICcxMDAnO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9ICcxMDAnO1xuICAgICAgem9vbUhhbmRsZXIucmVzZXRab29tQW5kUGFuKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgTUVJIG9wYWNpdHkgdG8gdmFsdWUgZnJvbSB0aGUgc2xpZGVyLlxuICogQHBhcmFtIG1laUNsYXNzTmFtZSAtIENsYXNzIHRoYXQgY29udGFpbnMgdGhlIHJlbmRlcmVkIE1FSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdseXBoT3BhY2l0eUZyb21TbGlkZXIgKG1laUNsYXNzTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBvcGFjaXR5T3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wYWNpdHlPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcbiAgY29uc3Qgb3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5U2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICBvcGFjaXR5U2xpZGVyLnZhbHVlID0gb3BhY2l0eU91dHB1dC52YWx1ZTtcbiAgLy8gdGhpcyBpcyB3aGVyZSB3ZSBsb2FkIGdseXBoIG9wYWNpdHkgZnJvbSBsb2NhbFN0b3JhZ2Ugb24gcGFnZS1sb2FkXG4gIHNldFNldHRpbmdzKHsgZ2x5cGhPcGFjaXR5OiBOdW1iZXIob3BhY2l0eU91dHB1dC52YWx1ZSkgfSk7XG5cbiAgLy8gZGlzcGF5IGNvcnJlY3Qgc2xpZGVyIHRvZ2dsZSBkaXNwbGF5IGljb25cbiAgY29uc3QgaGlkZUdseXBoSW1nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvZ2dsZS1nbHlwaC1vcGFjaXR5ID4gaW1nJyk7XG4gIGlmIChOdW1iZXIob3BhY2l0eU91dHB1dC52YWx1ZSkgPT09IDApIHtcbiAgICBoaWRlR2x5cGhJbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc2hvdy1pY29uLnN2Z2ApO1xuICAgIGhpZGVHbHlwaEltZy5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnU2hvdyBnbHlwaCcpO1xuICB9XG4gIGVsc2Uge1xuICAgIGhpZGVHbHlwaEltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9oaWRlLWljb24uc3ZnYCk7XG4gICAgaGlkZUdseXBoSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdIaWRlIGdseXBoJyk7XG4gIH1cblxuICB0cnkge1xuICAgICgoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBtZWlDbGFzc05hbWUpKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PikuZm9yRWFjaChnID0+IHtcbiAgICAgIGcuc3R5bGUub3BhY2l0eSA9IChOdW1iZXIob3BhY2l0eU91dHB1dC52YWx1ZSkgLyAxMDAuMCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIHByb3Blcmx5IHNldCBvcGFjaXR5IHRvIHBhZ2VzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgcmVuZGVyZWQgTUVJIG9wYWNpdHkgYnV0dG9uIGFuZCBzbGlkZXIgbGlzdGVuZXJzLlxuICogQHBhcmFtIG1laUNsYXNzTmFtZSAtIENsYXNzIHRoYXQgY29udGFpbnMgdGhlIHJlbmRlcmVkIE1FSS5cbiAqL1xuZnVuY3Rpb24gc2V0R2x5cGhPcGFjaXR5Q29udHJvbHMgKG1laUNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9wYWNpdHlTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IG9wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuXG4gIGNvbnN0IHsgZ2x5cGhPcGFjaXR5IH0gPSBnZXRTZXR0aW5ncygpO1xuICBsYXN0R2x5cGhPcGFjaXR5ID0gZ2x5cGhPcGFjaXR5O1xuICBvcGFjaXR5U2xpZGVyLnZhbHVlID0gU3RyaW5nKGdseXBoT3BhY2l0eSk7XG4gIG9wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoZ2x5cGhPcGFjaXR5KTtcblxuICBmdW5jdGlvbiBpbnB1dENoYW5nZU9wYWNpdHkgKCk6IHZvaWQge1xuICAgIG9wYWNpdHlPdXRwdXQudmFsdWUgPSBvcGFjaXR5U2xpZGVyLnZhbHVlO1xuICAgIGxhc3RHbHlwaE9wYWNpdHkgPSBOdW1iZXIob3BhY2l0eVNsaWRlci52YWx1ZSk7XG4gICAgc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlcihtZWlDbGFzc05hbWUpO1xuICB9XG5cbiAgY29uc3QgdG9nZ2xlT3BhY2l0eUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtZ2x5cGgtb3BhY2l0eScpO1xuXG4gIGlmIChnbHlwaE9wYWNpdHkgPT0gMTAwKSB7XG4gICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgfVxuXG4gIHRvZ2dsZU9wYWNpdHlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgbGV0IG5ld09wYWNpdHk7XG4gICAgaWYgKHRvZ2dsZU9wYWNpdHlCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRlLWljb24nKSkge1xuICAgICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRvZ2dsZU9wYWNpdHlCdG4uY2xhc3NMaXN0LmFkZCgnaGlkZS1pY29uJyk7XG4gICAgICBuZXdPcGFjaXR5ID0gMTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbml0aW9uIHNjYWxlIGlzIHRoZSByb290IGVsZW1lbnQgb2Ygd2hhdCBpcyBnZW5lcmF0ZWQgYnkgdmVyb3Zpb1xuICAgIFxuICAgIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIG1laUNsYXNzTmFtZSkgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4pLmZvckVhY2goZyA9PiB7XG4gICAgICBnLnN0eWxlLm9wYWNpdHkgPSBuZXdPcGFjaXR5LnRvU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBsYXN0R2x5cGhPcGFjaXR5ID0gTnVtYmVyKG9wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcobmV3T3BhY2l0eSAqIDEwMCk7XG4gICAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhNYXRoLnJvdW5kKG5ld09wYWNpdHkgKiAxMDApKTtcblxuICAgIHNldFNldHRpbmdzKHsgZ2x5cGhPcGFjaXR5OiBuZXdPcGFjaXR5ICogMTAwIH0pO1xuXG4gICAgaW5wdXRDaGFuZ2VPcGFjaXR5KCk7XG4gIH0pO1xuXG4gIG9wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBpbnB1dENoYW5nZU9wYWNpdHkpO1xuICBvcGFjaXR5U2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGlucHV0Q2hhbmdlT3BhY2l0eSk7XG5cbiAgb3BhY2l0eVNsaWRlci5kaXNhYmxlZCA9IGZhbHNlO1xufVxuXG5cbi8qKlxuICogU2V0IGJhY2tncm91bmQgaW1hZ2Ugb3BhY2l0eSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0gYmFja2dyb3VuZCAtIFRoZSBiYWNrZ3JvdW5kIGltYWdlIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBzZXRCZ09wYWNpdHlDb250cm9scyAoYmFja2dyb3VuZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJnT3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ09wYWNpdHlTbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCBiZ09wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmdPcGFjaXR5T3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyBpbWFnZU9wYWNpdHkgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RJbWFnZU9wYWNpdHkgPSBpbWFnZU9wYWNpdHk7XG4gIGJnT3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoaW1hZ2VPcGFjaXR5KTtcblxuICBmdW5jdGlvbiBiZ0lucHV0Q2hhbmdlSGFuZGxlciAoKTogdm9pZCB7XG4gICAgYmdPcGFjaXR5T3V0cHV0LnZhbHVlID0gYmdPcGFjaXR5U2xpZGVyLnZhbHVlO1xuICAgIGxhc3RJbWFnZU9wYWNpdHkgPSBOdW1iZXIoYmdPcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBzZXRCZ09wYWNpdHlGcm9tU2xpZGVyKGJhY2tncm91bmQpO1xuICB9XG5cblxuICBjb25zdCB0b2dnbGVCZ09wYWNpdHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWJnLW9wYWNpdHknKTtcblxuICBpZiAoaW1hZ2VPcGFjaXR5ID09IDEwMCkge1xuICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgfVxuXG4gIHRvZ2dsZUJnT3BhY2l0eUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblxuICAgIGxldCBuZXdPcGFjaXR5O1xuXG4gICAgaWYgKHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtaWNvbicpKSB7XG4gICAgICB0b2dnbGVCZ09wYWNpdHlCdG4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZS1pY29uJyk7XG4gICAgICBuZXdPcGFjaXR5ID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0b2dnbGVCZ09wYWNpdHlCdG4uY2xhc3NMaXN0LmFkZCgnaGlkZS1pY29uJyk7XG4gICAgICBuZXdPcGFjaXR5ID0gMTtcbiAgICB9XG4gICAgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYmFja2dyb3VuZClbMF0gYXMgSFRNTEVsZW1lbnQpXG4gICAgICAuc3R5bGUub3BhY2l0eSA9IG5ld09wYWNpdHkudG9TdHJpbmcoKTtcblxuICAgIGxhc3RJbWFnZU9wYWNpdHkgPSBOdW1iZXIoYmdPcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBiZ09wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcobmV3T3BhY2l0eSAqIDEwMCk7XG4gICAgYmdPcGFjaXR5T3V0cHV0LnZhbHVlID0gU3RyaW5nKE1hdGgucm91bmQobmV3T3BhY2l0eSAqIDEwMCkpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyBpbWFnZU9wYWNpdHk6IG5ld09wYWNpdHkgKiAxMDAgfSk7XG4gICAgYmdJbnB1dENoYW5nZUhhbmRsZXIoKTtcbiAgfSk7XG5cbiAgYmdPcGFjaXR5U2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmdJbnB1dENoYW5nZUhhbmRsZXIpO1xuICBiZ09wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYmdJbnB1dENoYW5nZUhhbmRsZXIpO1xuXG4gIGJnT3BhY2l0eVNsaWRlci5kaXNhYmxlZCA9IGZhbHNlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRCZ09wYWNpdHlGcm9tU2xpZGVyIChiYWNrZ3JvdW5kPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJnT3BhY2l0eU91dHB1dDogSFRNTE91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmdPcGFjaXR5T3V0cHV0Jyk7XG4gIFxuICBzZXRTZXR0aW5ncyh7IGltYWdlT3BhY2l0eTogTnVtYmVyKGJnT3BhY2l0eU91dHB1dC52YWx1ZSkgfSk7XG5cbiAgLy8gZGlzcGF5IGNvcnJlY3Qgc2xpZGVyIHRpZ2dsZSBkaXNwbGF5IGljb25cbiAgY29uc3QgaGlkZUJnSW1nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvZ2dsZS1iZy1vcGFjaXR5ID4gaW1nJyk7XG4gIGlmIChOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSA9PT0gMCkge1xuICAgIGhpZGVCZ0ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zaG93LWljb24uc3ZnYCk7XG4gICAgaGlkZUJnSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdTaG93IGJhY2tncm91bmQgaW1hZ2UnKTtcbiAgfVxuICBlbHNlIHtcbiAgICBoaWRlQmdJbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaGlkZS1pY29uLnN2Z2ApO1xuICAgIGhpZGVCZ0ltZy5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnSGlkZSBiYWNrZ3JvdW5kIGltYWdlJyk7XG4gIH1cblxuICBjb25zdCBiZzogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtiYWNrZ3JvdW5kfWApO1xuICBpZiAoYmcpIGJnLnN0eWxlLm9wYWNpdHkgPSBTdHJpbmcoTnVtYmVyKGJnT3BhY2l0eU91dHB1dC52YWx1ZSkgLyAxMDApO1xufVxuXG4vKipcbiAqIFNldCBiYm94IGFkanVzdG1lbnQgY2lyY2xlIHNpemUgYnV0dG9uIGFuZCBzbGlkZXIgbGlzdGVuZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2lyY2xlU2l6ZUNvbnRyb2xzICgpOiB2b2lkIHtcbiAgY29uc3QgY2lyY2xlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NpcmNsZVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGNpcmNsZU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaXJjbGVPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IGNpcmNsZVNpemUgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RDaXJjbGVTaXplID0gY2lyY2xlU2l6ZTtcbiAgY2lyY2xlU2xpZGVyLnZhbHVlID0gU3RyaW5nKGNpcmNsZVNpemUpO1xuICBjaXJjbGVPdXRwdXQudmFsdWUgPSBTdHJpbmcoY2lyY2xlU2l6ZSk7XG5cbiAgZnVuY3Rpb24gY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlciAoKTogdm9pZCB7XG4gICAgY2lyY2xlT3V0cHV0LnZhbHVlID0gY2lyY2xlU2xpZGVyLnZhbHVlO1xuICAgIGxhc3RDaXJjbGVTaXplID0gTnVtYmVyKGNpcmNsZVNsaWRlci52YWx1ZSk7XG4gICAgc2V0U2V0dGluZ3MoeyBjaXJjbGVTaXplOiBOdW1iZXIobGFzdENpcmNsZVNpemUpIH0pO1xuICAgIGNvbnN0IHJlc2l6ZVBvaW50cyA9IGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50Jyk7XG4gICAgaWYgKCFyZXNpemVQb2ludHMuZW1wdHkoKSkge1xuICAgICAgcmVzaXplUG9pbnRzLmF0dHIoJ3InLCBsYXN0Q2lyY2xlU2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtY2lyY2xlLXNpemUnKTtcbiAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdFNpemUgPSAyNTsgXG4gICAgLy8gaWYgaGFzIHJlc2l6ZVBvaW50cyBkaXNwbGF5ZWRcbiAgICBjb25zdCByZXNpemVQb2ludHMgPSBkMy5zZWxlY3RBbGwoJy5yZXNpemVQb2ludCcpO1xuICAgIGlmICghcmVzaXplUG9pbnRzLmVtcHR5KCkpIHtcbiAgICAgIHJlc2l6ZVBvaW50cy5hdHRyKCdyJywgZGVmYXVsdFNpemUpO1xuICAgIH1cblxuICAgIGxhc3RDaXJjbGVTaXplID0gTnVtYmVyKGRlZmF1bHRTaXplKTtcbiAgICBjaXJjbGVTbGlkZXIudmFsdWUgPSBTdHJpbmcoZGVmYXVsdFNpemUpO1xuICAgIGNpcmNsZU91dHB1dC52YWx1ZSA9IFN0cmluZyhkZWZhdWx0U2l6ZSk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IGNpcmNsZVNpemU6IE51bWJlcihkZWZhdWx0U2l6ZSkgfSk7XG4gICAgY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlcigpO1xuICB9KTtcblxuICBjaXJjbGVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyKTtcbiAgY2lyY2xlU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIpO1xuXG4gIGNpcmNsZVNsaWRlci5kaXNhYmxlZCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBoaWdobGlnaHQgZHJvcGRvd24gb3B0aW9uICsgZGlzcGxheVxuICogQHBhcmFtIGdyb3VwIC0gR3JvdXBpbmdUeXBlIC8gVGhlIERPTSBlbGVtZW50J3MgaWQgYXMgYGhpZ2hsaWdodC0ke2lkfWBcbiAqL1xuZnVuY3Rpb24gdXBkYXRlSGlnaGxpZ2h0T3B0aW9uIChncm91cDogR3JvdXBpbmdUeXBlKTogdm9pZCB7XG4gIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBoaWdobGlnaHQtJHtncm91cH1gKTtcbiAgY29uc3QgZHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWRyb3Bkb3duJyk7XG4gIGNvbnN0IGhpZ2hsaWdodFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LXR5cGUnKTtcblxuICAvLyBzYXZlIGhpZ2hsaWdodCBvcHRpb24gdG8gbG9jYWxTdG9yYWdlXG4gIHNldFNldHRpbmdzKHsgaGlnaGxpZ2h0TW9kZTogZ3JvdXAgfSk7XG5cbiAgZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gIH0pO1xuXG4gIGlmIChncm91cCA9PT0gJ25vbmUnKSB7XG4gICAgaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudCA9ICdcXHhBMC0gT2ZmJztcbiAgICBDb2xvci51bnNldEdyb3VwaW5nSGlnaGxpZ2h0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBvcHRpb24uY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG5cbiAgLy8gVGV4dCBjb250ZW50IGlzIHRoZSBncm91cGluZyB0eXBlIGNhcGl0YWxpemVkXG4gIGhpZ2hsaWdodFR5cGUudGV4dENvbnRlbnQgPSBgXFx4QTAtICR7Z3JvdXBbMF0udG9VcHBlckNhc2UoKSArIGdyb3VwLnNsaWNlKDEpfWA7XG4gIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KGdyb3VwKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgaGlnaGxpZ2h0IG1vZGUgY2hvc2VuIGJ5IHRoZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0VHlwZSAoKTogR3JvdXBpbmdUeXBlIHtcbiAgY29uc3QgaGlnaGxpZ2h0VHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpO1xuICByZXR1cm4gaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudC5zbGljZSgzKS50b0xvd2VyQ2FzZSgpIGFzIEdyb3VwaW5nVHlwZTtcbn1cblxuLyoqXG4gKiBTZXQgY2xpY2sgbGlzdGVuZXIgZm9yIGVhY2ggaGlnaGxpZ2h0IGRyb3Bkb3duIG9wdGlvblxuICogQHBhcmFtIGdyb3VwIC0gR3JvdXBpbmdUeXBlIC8gVGhlIERPTSBlbGVtZW50J3MgaWQgYXMgYGhpZ2hsaWdodC0ke2lkfWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhpZ2hsaWdodE9wdGlvbiAoZ3JvdXA6IEdyb3VwaW5nVHlwZSk6IHZvaWQge1xuICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaGlnaGxpZ2h0LSR7Z3JvdXB9YCk7XG4gIG9wdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oZ3JvdXApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDbGlja2F3YXkgbGlzdGVuZXIgZm9yIHRoZSBoaWdobGlnaHQgZHJvcGRvd24uXG4gKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodENsaWNrYXdheSAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWRyb3Bkb3duJykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG59XG5cbi8qKlxuICogU2V0IGxpc3RlbmVyIG9uIHN0YWZmIGhpZ2hsaWdodGluZyBjaGVja2JveC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhpZ2hsaWdodENvbnRyb2xzICgpOiB2b2lkIHtcbiAgY29uc3QgZHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWRyb3Bkb3duJyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1idXR0b24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldnQpID0+IHtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZHJvcGRvd24uY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJyk7XG4gICAgaWYgKGRyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuXG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ2NvbHVtbicpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdzdGFmZicpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdzeWxsYWJsZScpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCduZXVtZScpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdsYXllckVsZW1lbnQnKTtcbiAgICAgIHNldEhpZ2hsaWdodE9wdGlvbignbm9uZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlnaGxpZ2h0Q2xpY2thd2F5KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAgKiBTZXQgbGlzdGVuZXIgb24ga2V5IHNob3J0Y3V0cyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gaGlnaGxpZ2h0c1xuICAqIFxuICAqIFRoZSBjdXJyZW50IHBsYW4gaXMgdG8gdXNlIHRoZSBrZXlzIHEsIHcsIGUsIHIsIHQsIGFuZCB5XG4gICovXG5mdW5jdGlvbiBzZXRIaWdobGlnaHRLZXlDb250cm9scyAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICAvLyBQcmV2ZW50IGNtZC9jdHJsK3IgZnJvbSBjaGFuZ2luZyBoaWdobGlnaHQgb3B0aW9uXG4gICAgaWYgKGV2dC5tZXRhS2V5KSByZXR1cm47XG5cbiAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgIGNhc2UgJ3EnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ3N0YWZmJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndyc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc3lsbGFibGUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlJzpcbiAgICAgICAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKCduZXVtZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3InOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ2xheWVyRWxlbWVudCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3QnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ3NlbGVjdGlvbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3knOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ25vbmUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEhpZ2hsaWdodFNlbGVjdGlvbkNvbnRyb2xzICgpOiB2b2lkIHtcbiAgY29uc3QgaGlnaGxpZ2h0U2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1zZWxlY3Rpb24nKTtcbiAgaGlnaGxpZ2h0U2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGlnaGxpZ2h0LXNlbGVjdGVkJykuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gICAgfSk7XG4gICAgaGlnaGxpZ2h0U2VsZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodC1zZWxlY3RlZCcpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpLnRleHRDb250ZW50ID0gJyAtIFNlbGVjdGlvbic7XG4gICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3NlbGVjdGlvbicpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNldCB0aGUgaGlnaGxpZ2h0IGZvciBkaWZmZXJlbnQgdHlwZXMgYmFzZWQgb24gdGhlICdoaWdobGlnaHQtc2VsZWN0ZWQnIGNsYXNzIGluIHRoZSBET00uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVIaWdobGlnaHQgKCk6IHZvaWQge1xuICBsZXQgaGlnaGxpZ2h0SWQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBoaWdobGlnaHRJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5pZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhpZ2hsaWdodElkID0gJyc7XG4gIH1cbiAgc3dpdGNoIChoaWdobGlnaHRJZCkge1xuICAgIGNhc2UgJ2hpZ2hsaWdodC1jb2x1bW4nOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ2NvbHVtbicpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LXN0YWZmJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdzdGFmZicpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LXN5bGxhYmxlJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdzeWxsYWJsZScpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LW5ldW1lJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCduZXVtZScpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LWxheWVyRWxlbWVudCc6XG4gICAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnbGF5ZXJFbGVtZW50Jyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc2VsZWN0aW9uJzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdzZWxlY3Rpb24nKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBDb2xvci51bnNldEdyb3VwaW5nSGlnaGxpZ2h0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgbGlzdGVuZXIgb24gYnVyZ2VyIG1lbnUgZm9yIHNtYWxsZXIgc2NyZWVucy5cbiAqL1xuZnVuY3Rpb24gc2V0QnVyZ2VyQ29udHJvbHMgKCk6IHZvaWQge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVyZ2VyTWVudScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidXJnZXJNZW51JykuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdk1lbnUnKS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgfSk7XG59XG5cbi8qKiBcbiAqIFNldCBsaXN0ZW5lciBmb3IgXCJEaXNwbGF5IEFsbFwiIGJ1dHRvbiBpbiBEaXNwbGF5IHBhbmVsLlxuKi9cbmZ1bmN0aW9uIHNldERpc3BsYXlBbGxMaXN0ZW5lcigpOiB2b2lkIHtcbiAgY29uc3Qgc2VsZWN0QWxsQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Rpc3BsYXktYWxsLWJ0bicpO1xuICBzZWxlY3RBbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgLy8gYXQgdGhlIG1vbWVudCwgY2xhc3NuYW1lICdzZWxlY3RlZCcgaXMgb25seSB1c2VkIGZvciB0cmFja2luZyBwdXJwb3Nlc1xuICAgIGlmIChzZWxlY3RBbGxCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBzZWxlY3RBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgIHNlbGVjdEFsbEJ0bi5pbm5lckhUTUwgPSAnRGlzcGxheSBBbGwnO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9ICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hlY2tib3gtY29udGFpbmVyOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZTtcIl0pID4gLmNoZWNrYm94Jyk7XG5cbiAgICAgIEFycmF5LmZyb20ob3B0aW9ucykuZm9yRWFjaCgob3B0aW9uOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hlY2tlZCkgb3B0aW9uLmNsaWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzZWxlY3RBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgIHNlbGVjdEFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9ICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hlY2tib3gtY29udGFpbmVyOm5vdChbc3R5bGUqPVwiZGlzcGxheTogbm9uZTtcIl0pID4gLmNoZWNrYm94Jyk7XG4gICAgICBcbiAgICAgIEFycmF5LmZyb20ob3B0aW9ucykuZm9yRWFjaCgob3B0aW9uOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9uLmNoZWNrZWQpIG9wdGlvbi5jbGljaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIFxuICogVXBkYXRlIGBEaXNwbGF5IEFsbGAgYnV0dG9uIHN0YXR1c1xuKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5QWxsQnRuKCk6IHZvaWQge1xuICBjb25zdCBkaXNwbGF5QWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktYWxsLWJ0bicpO1xuICBjb25zdCBkaXNwbGF5SW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5SW5mbycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlCQm94ZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJCb3gnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCBkaXNwbGF5VGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5VGV4dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlFcnJMb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1lcnJvcnMnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIC8vIGlmIGFsbCBvcHRpb25zIGFyZSBzZWxlY3RlZCxcbiAgLy8gc2V0IFwiRGlzcGxheS9IaWRlIEFsbFwiIGJ1dHRvbiB0byBcIkhpZGUgQWxsXCIuXG4gIGlmIChkaXNwbGF5SW5mbz8uY2hlY2tlZCAmJiBkaXNwbGF5QkJveGVzPy5jaGVja2VkICYmIFxuICAgIGRpc3BsYXlUZXh0Py5jaGVja2VkICYmIGRpc3BsYXlFcnJMb2c/LmNoZWNrZWQpIHtcbiAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIFwiRGlzcGxheS9IaWRlIEFsbFwiIGJ1dHRvbiBpcyBpbiBcIkhpZGUgQWxsXCIgbW9kZSwgc2V0IGl0IHRvIFwiRGlzcGxheSBBbGxcIiBtb2RlXG4gICAgaWYgKGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTG9hZCBoaWdobGlnaHQgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRIaWdobGlnaHRTZXR0aW5ncyAoKTogdm9pZCB7XG4gIGNvbnN0IHsgaGlnaGxpZ2h0TW9kZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKGhpZ2hsaWdodE1vZGUpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgbGlzdGVuZXJzIGFuZCBjb250cm9scyBmb3IgZGlzcGxheSBwYW5lbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZWlDbGFzc05hbWUgLSBUaGUgY2xhc3MgdXNlZCB0byBzaWduaWZpeSB0aGUgTUVJIGVsZW1lbnQocykuXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFja2dyb3VuZCAtIFRoZSBjbGFzcyB1c2VkIHRvIHNpZ25pZnkgdGhlIGJhY2tncm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RGlzcGxheUNvbnRyb2xzIChtZWlDbGFzc05hbWU6IHN0cmluZywgYmFja2dyb3VuZDogc3RyaW5nKTogdm9pZCB7XG4gIHNldEdseXBoT3BhY2l0eUNvbnRyb2xzKG1laUNsYXNzTmFtZSk7XG4gIHNldEJnT3BhY2l0eUNvbnRyb2xzKGJhY2tncm91bmQpO1xuICBzZXRIaWdobGlnaHRDb250cm9scygpO1xuICBzZXRCdXJnZXJDb250cm9scygpO1xuICBzZXRIaWdobGlnaHRLZXlDb250cm9scygpO1xuICBzZXREaXNwbGF5QWxsTGlzdGVuZXIoKTtcbiAgbG9hZEhpZ2hsaWdodFNldHRpbmdzKCk7XG5cbiAgY29uc3QgZGlzcGxheUNvbnRlbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlDb250ZW50cycpO1xuICBjb25zdCB0b2dnbGVEaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZURpc3BsYXknKTtcbiAgY29uc3QgZGlzcGxheUhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5SGVhZGVyJyk7XG5cbiAgZGlzcGxheUhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyBpZiBkaXNwbGF5IHBhbmVsIGlzIGNsb3NlZCwgb3BlbiBpdFxuICAgIGlmIChkaXNwbGF5Q29udGVudHMuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKSkge1xuICAgICAgZGlzcGxheUNvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMC41ZW0gMC43NWVtJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaXNwbGF5Q29udGVudHMuc3R5bGUub3ZlcmZsb3cgPSAndmlzaWJsZSc7XG4gICAgICB9LCAyMDApO1xuICAgICAgdG9nZ2xlRGlzcGxheS5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9IFxuICAgIC8vIGlmIGRpc3BsYXkgcGFuZWwgaXMgb3BlbiwgY2xvc2UgaXRcbiAgICBlbHNlIHtcbiAgICAgIGRpc3BsYXlDb250ZW50cy5jbGFzc0xpc3QuYWRkKCdjbG9zZWQnKTtcbiAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5wYWRkaW5nID0gJzBweCc7XG4gICAgICB9LCAyMDApO1xuICAgICAgdG9nZ2xlRGlzcGxheS5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLXNpZGVgKTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgU2V0VGV4dEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IE1vZGFsV2luZG93SW50ZXJmYWNlIH0gZnJvbSAnLi4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBob3RrZXlzTW9kYWwsIGVkaXRUZXh0TW9kYWwgfSBmcm9tICcuLi9TcXVhcmVFZGl0L0NvbnRlbnRzJztcbmltcG9ydCB7IG5ld0ZvbGRlckhUTUwsIHJlbmFtZUhUTUwsIHVwbG9hZEFyZWFIVE1MIH0gZnJvbSAnLi4vRGFzaGJvYXJkL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuaW1wb3J0IHsgc2VsZWN0QkJveCwgdW5zZWxlY3QgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuXG4vKipcbiAqIERlZmluZXMgbW9kYWwgdHlwZXMuXG4gKiBUbyBjcmVhdGUgbmV3IG1vZGFsIHdpbmRvdyB0eXBlcywgYWRkIGVudW0gb3B0aW9uIGFuZCBpbXBsZW1lbnQgbG9naWMgaW5zaWRlIE1vZGFsIGNsYXNzLlxuICovXG5leHBvcnQgZW51bSBNb2RhbFdpbmRvd1ZpZXcge1xuICBFRElUX1RFWFQsXG4gIEhPVEtFWVMsXG4gIEVSUk9SX0xPRywgLy8gZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFnYWluc3QgTUVJIHNjaGVtYSBhbmQgaW52YWxpZCBlbGVtZW50IGVycm9yc1xuICBET0NVTUVOVF9VUExPQUQsXG4gIE1PVkVfVE8sXG4gIE5FV19GT0xERVIsXG4gIFJFTkFNRVxufVxuXG5lbnVtIE1vZGFsV2luZG93U3RhdGUge1xuICBPUEVOLFxuICBDTE9TRURcbn1cblxuXG5cbi8qKlxuICogTW9kYWwgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYW5kIGNvbnRyb2wgc3RhdGUvY29udGVudCBcbiAqIG9mIG1vZGFsIHdpbmRvd3MgaW4gTmVvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGFsV2luZG93IGltcGxlbWVudHMgTW9kYWxXaW5kb3dJbnRlcmZhY2Uge1xuICBwcml2YXRlIG1vZGFsV2luZG93VmlldzogTW9kYWxXaW5kb3dWaWV3OyAvLyBjdXJyZW50IG1vZGFsIHR5cGVcbiAgcHJpdmF0ZSBtb2RhbFdpbmRvd1N0YXRlOiBNb2RhbFdpbmRvd1N0YXRlOyAvLyBvcGVuIG9yIGNsb3NlZD9cbiAgcHJpdmF0ZSBuZW9uVmlldzogTmVvblZpZXc7IC8vIG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHRcblxuXG4gIC8qKlxuICAgKiBTZXQgbmVvblZpZXcgaW5zdGFuY2UgY29udGV4dCBmb3IgdGhpcyBtb2RhbCB3aW5kb3cgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBuZW9uVmlldyBuZW9uVmlldyBjb250ZXh0IGZvciBNb2RhbCBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3PzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5DTE9TRUQ7XG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGFwcGx5IHRvIGFsbCBtb2RhbCB3aW5kb3dzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWhlYWRlci1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93JykuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZm9jdXNNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLWNsb3NlJykucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mb2N1c01vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICB9XG5cblxuICAvKipcbiAgICogU2V0IHRoZSBtb2RhbCB2aWV3IG9mIHRoaXMgTW9kYWwgaW5zdGFuY2UuXG4gICAqIFVwZGF0ZSB0aGUgY29udGVudCBiYXNlZCBvbiBwYXNzZWQgdmlldy5cbiAgICogQHBhcmFtIHZpZXcgVHlwZSBvZiBtb2RhbCB0byBvcGVuIChNb2RhbFZpZXcgZW51bSlcbiAgICovXG4gIHNldE1vZGFsV2luZG93Vmlldyh2aWV3OiBNb2RhbFdpbmRvd1ZpZXcsIGNvbnRlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsV2luZG93VmlldyA9IHZpZXc7XG4gICAgdGhpcy5zZXRNb2RhbFdpbmRvd0NvbnRlbnQoY29udGVudCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbW9kYWwgdmlldyBhcyBhIHN0cmluZ1xuICAgKi9cbiAgZ2V0TW9kYWxXaW5kb3dWaWV3KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubW9kYWxXaW5kb3dWaWV3LnRvU3RyaW5nKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbW9kZWwgd2luZG93IHdpdGggY29udGVudCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgTW9kYWxWaWV3LlxuICAgKi9cbiAgb3Blbk1vZGFsV2luZG93KCk6IHZvaWQge1xuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpKS5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB9KTtcbiAgICBzd2l0Y2godGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIFxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICB0aGlzLm9wZW5FZGl0U3lsVGV4dE1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVM6XG4gICAgICAgIC8vIHNldCB1cCBhbmQgZGlwbGF5IGhvdGtleSBtb2RhbCBjb250ZW50XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRDpcbiAgICAgICAgLy8gYWRkIGZ1bmN0aW9uIHRvIHBhaXJpbmcgYnV0dG9uXG4gICAgICAgIC8vIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5NT1ZFX1RPOlxuICAgICAgICBcbiAgICAgICAgLy8gYnJlYWs7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5SRU5BTUU6XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIG1ha2Ugc3VyZSB1c2VyIGNhbid0IHNjcm9sbCB3aGVuIG1vZGFsIGlzIG9wZW5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5PUEVOO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBOZW9uIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgaGlkZU1vZGFsV2luZG93KCk6IHZvaWQge1xuICAgIHN3aXRjaCh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICBjb25zdCBzcGFuID0gKDxIVE1MU3BhbkVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzeWxfdGV4dCcpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZC10by1lZGl0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRDpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk1PVkVfVE86XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1jb250YWluZXInKS5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH0gXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgLy8gcmVzZXQgc2Nyb2xsIGJlaGF2aW9yIG9mIGJvZHlcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ3Njcm9sbCc7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5DTE9TRUQ7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICB9XG5cblxuICAvKipcbiAgICogU2V0IGNvbnRlbnQgb2YgbW9kYWwgd2luZG93XG4gICAqL1xuICBwcml2YXRlIHNldE1vZGFsV2luZG93Q29udGVudChjb250ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLXRpdGxlJyk7XG5cbiAgICBzd2l0Y2ggKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBlZGl0VGV4dE1vZGFsO1xuICAgICAgICAvLyBzZXQgbW9kYWwgd2luZG93IHRpdGxlXG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFRElUIFNZTExBQkxFIFRFWFQnO1xuXG4gICAgICAgIC8vIHNwYW4gYW5kIGN1cnJlbnQgdGV4dCBvZiBzZWxlY3RlZC10by1lZGl0IHN5bGxhYmxlIGFuZCBmaWx0ZXIgb3V0IHVud2FudGVkIGNoYXJzXG4gICAgICAgIGNvbnN0IHNwYW4gPSA8SFRNTFNwYW5FbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKS5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuLnNlbGVjdGVkLXRvLWVkaXQnKVswXTtcbiAgICAgICAgY29uc3QgcmVtb3ZlU3ltYm9sID0gL1xcdXsyNUNBfS91O1xuICAgICAgICBjb25zdCBvcmlnID0gc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcblxuICAgICAgICAvLyBzZXQgdmFsdWUgb2YgaW5wdXQgZmllbGQgdG8gY3VycmVudCBzeWxsYWJsZSB0ZXh0XG4gICAgICAgICg8SFRNTElucHV0RWxlbWVudD4gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXQnKSkpLnZhbHVlID0gb3JpZztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVM6XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBob3RrZXlzTW9kYWw7XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdIT1RLRVlTJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkVSUk9SX0xPRzpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IFxuICAgICAgICAgIGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMzBweDt3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XCI+JHtjb250ZW50fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwke2VuY29kZVVSSShjb250ZW50KX1cIiBkb3dubG9hZD1cImVycm9yLmxvZ1wiPlxuICAgICAgICAgICAgICBFeHBvcnRcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFUlJPUiBMT0cnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnRE9DVU1FTlQgVVBMT0FEJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHVwbG9hZEFyZWFIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ01PVkUgVE8nO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ05FVyBGT0xERVInO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbmV3Rm9sZGVySFRNTDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ1JFTkFNRSc7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSByZW5hbWVIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBzZWxlY3Rpb24gdHlwZS4gVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuJyk7XG4gICAgfSBcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgdXBkYXRpbmcgc3lsbGFibGUgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpKS5mb3JFYWNoKCAoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgRWRpdCBTeWxsYWJsZSBUZXh0IG1vZGFsIHdpbmRvd1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWVkaXQtdGV4dCcpLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICBcbiAgICAvLyBSZXNldCBcIkNhbmNlbFwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtY2FuY2VsJykucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsV2luZG93LmJpbmQodGhpcykpO1xuXG4gICAgLy8gUmVzZXQgXCJTYXZlXCIgYnV0dG9uIGV2ZW50IGxpc3RlbmVyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1zYXZlJykucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZVN5bFRleHQuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZVN5bFRleHQuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBkaXNwbGF5IG1vZGFsIHdpbmRvd1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHRoaXMuZm9jdXNNb2RhbFdpbmRvdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGV4dCBvZiBzZWxlY3RlZC10by1lZGl0IHN5bGxhYmxlcyB3aXRoIHVzZXItcHJvdmlkZWQgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTeWxUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIHNwYW4gYW5kIGN1cnJlbnQgdGV4dCBvZiBzZWxlY3RlZC10by1lZGl0IHN5bGxhYmxlIGFuZCBmaWx0ZXIgb3V0IHVud2FudGVkIGNoYXJzXG4gICAgY29uc3Qgc3BhbiA9IDxIVE1MU3BhbkVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzeWxfdGV4dCcpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdO1xuICAgIGNvbnN0IHJlbW92ZVN5bWJvbCA9IC9cXHV7MjVDQX0vdTtcbiAgICBjb25zdCBvcmlnID0gc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcbiAgICBjb25zdCB1cGRhdGVkU3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1pbnB1dCcpKS52YWx1ZTtcblxuICAgIGlmICh1cGRhdGVkU3lsVGV4dCAhPT0gbnVsbCAmJiB1cGRhdGVkU3lsVGV4dCAhPT0gb3JpZykge1xuICAgICAgLy8gY3JlYXRlIFwic2V0IHRleHRcIiBhY3Rpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IFsuLi5zcGFuLmNsYXNzTGlzdC5lbnRyaWVzKCldLmZpbHRlcigoY2xhc3NOYW1lKSA9PiBjbGFzc05hbWVbMV0gIT09ICd0ZXh0LXNlbGVjdCcgJiYgY2xhc3NOYW1lWzFdICE9PSAnc2VsZWN0ZWQtdG8tZWRpdCcpWzBdWzFdO1xuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBTZXRUZXh0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnRJZCxcbiAgICAgICAgICB0ZXh0OiB1cGRhdGVkU3lsVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBzZW5kIGFjdGlvbiB0byB2ZXJvdmlvIGZvciBwcm9jZXNzaW5nXG4gICAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzcG9uc2U6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBBbiB1cGRhdGUgdG8gdGhlIHBhZ2Ugd2lsbCByZWxvYWQgdGhlIGVudGlyZSBzdmc7XG4gICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgIC8vIGlmIGJib3hlcyBhcmUgZW5hYmxlZFxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEJCb3goc3BhbiwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5uZW9uVmlldyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXNlbGVjdCBpZiBubyBjaGFuZ2UgaXMgbWFkZVxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEJCb3goc3BhbiwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5uZW9uVmlldyk7XG4gICAgfVxuICAgIC8vIGNsb3NlIG1vZGFsIHdpbmRvd1xuICAgIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYm91bmRpbmcgYm94IHNlbGVjdGVkIHdoZW4gdGhlIGVkaXQgdGV4dCBtb2RhbCBoYXMgYmVlbiBjbGlja2VkIFxuICAqL1xuICB1cGRhdGVTZWxlY3RlZEJCb3ggKHNwYW46IEhUTUxTcGFuRWxlbWVudCwgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLCBuZW9uVmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgICB1bnNlbGVjdCgpO1xuXG4gICAgY29uc3QgYmJveElkID0gQXJyYXkuZnJvbShzcGFuLmNsYXNzTGlzdCkuZmluZChlID0+IGUgIT09ICd0ZXh0LXNlbGVjdCcgJiYgZSAhPT0gJ3NlbGVjdGVkLXRvLWVkaXQnKTtcblxuICAgIGlmICgoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlCQm94JykgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCkge1xuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJib3hJZCkpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheVJlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYm94SWQpLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykgYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBzZWxlY3RCQm94KGRpc3BsYXlSZWN0LCBkcmFnSGFuZGxlciwgbmVvblZpZXcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggaG90a2V5IGluZm8gY29udGVudFxuICAgKi9cbiAgLypcbiAgcHJpdmF0ZSBvcGVuSG90a2V5TW9kYWxXaW5kb3cgPSBmdW5jdGlvbigpIHsgICBcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQnKSkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgYW5kIGRpcGxheSBob3RrZXkgbW9kYWwgY29udGVudFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgfTtcbiAgKi9cblxuXG4gIC8qKlxuICAgKiBEZWZpbmUgZXZlbnQgbGlzdGVuZXJzIGZvciBtb2RhbCB3aW5kb3cgYmFzZWQgb24gbW9kYWxWaWV3IHR5cGVcbiAgICovXG4gIHByaXZhdGUga2V5ZG93bkxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIHByZXZlbnQgTmVvbiBob3RrZXkgZXZlbnRzIGZyb20gZmlyaW5nIHdoZW4gdXNlciBpcyB0eXBpbmdcblxuICAgIHN3aXRjaCh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHRoaXMudXBkYXRlU3lsVGV4dCgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH0gIFxuICB9O1xuXG5cbiAgLyoqXG4gICAqIEV2ZW50IGxpc3RlbmVyIHRoYXQgZm9jdXNlcyB0aGUgbW9kYWwgd2luZG93IGlmIHVzZXIgY2xpY2tzIGFueXdoZXJlIG91dHNpZGUgb2YgaXRcbiAgICovXG4gIHByaXZhdGUgZm9jdXNNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXQnKSkuc2VsZWN0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKS5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxufVxuIiwiaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgKiBhcyBHcm91cGluZyBmcm9tICcuL0dyb3VwaW5nJztcbmltcG9ydCBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdFN0YWZmSGFuZGxlciB9IGZyb20gJy4vU3RhZmZUb29scyc7XG5pbXBvcnQgeyBTcGxpdE5ldW1lSGFuZGxlciB9IGZyb20gJy4vTmV1bWVUb29scyc7XG5pbXBvcnQge1xuICBDaGFpbkFjdGlvbixcbiAgQ2hhbmdlU3RhZmZBY3Rpb24sXG4gIERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbixcbiAgRWRpdG9yQWN0aW9uLFxuICBNYXRjaEhlaWdodEFjdGlvbixcbiAgUmVtb3ZlQWN0aW9uLFxuICBTZXRBY3Rpb24sXG4gIFNldENsZWZBY3Rpb24sXG4gIFNldExpcXVlc2NlbnRBY3Rpb25cbn0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgZ2V0U3RhZmZCQm94IH0gZnJvbSAnLi4vdXRpbHMvU2VsZWN0VG9vbHMnO1xuXG4vKipcbiAqIFRoZSBOZW9uVmlldyBwYXJlbnQgdG8gY2FsbCBlZGl0b3IgYWN0aW9ucy5cbiAqL1xubGV0IG5lb25WaWV3OiBOZW9uVmlldztcblxuLyoqXG4gKiBJbml0aWFsaXplIE5lb25WaWV3LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdE5lb25WaWV3ICh2aWV3OiBOZW9uVmlldyk6IHZvaWQge1xuICBuZW9uVmlldyA9IHZpZXc7XG4gIEdyb3VwaW5nLmluaXROZW9uVmlldyh2aWV3KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgaW5jbGluYXR1bSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldEluY2xpbmF0dW1BY3Rpb24gKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgYXR0clZhbHVlOiAnJ1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYUFjdGlvbiAoaWQ6IHN0cmluZyk6IFNldEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0JyxcbiAgICBwYXJhbToge1xuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICBhdHRyVmFsdWU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSByZXZlcnNlZCB2aXJnYSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldFZpcmdhUmV2ZXJzZWRBY3Rpb24gKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgYXR0clZhbHVlOiAnJ1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgbGlxdWVzY2VudF9jbG9ja3dpc2UgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uIChpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICdjdXJ2ZScsXG4gICAgICBhdHRyVmFsdWU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2FudGljbG9ja3dpc2UgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbiAoaWQ6IHN0cmluZyk6IFNldExpcXVlc2NlbnRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldExpcXVlc2NlbnQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgY3VydmU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKiogRXZlbnQgaGFuZGxlciBmb3IgZGVsZXRlIGJ1dHRvbiBwcmVzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVCdXR0b25IYW5kbGVyIChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgaWYgKGV2dC5rZXkgPT09ICdkJyB8fCBldnQua2V5ID09PSAnQmFja3NwYWNlJykgeyByZW1vdmVIYW5kbGVyKCk7IGV2dC5wcmV2ZW50RGVmYXVsdCgpOyB9XG59XG5cbi8qKlxuICogRW5kIHRoZSBleHRyYSBvcHRpb25zIG1lbnUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRPcHRpb25zU2VsZWN0aW9uICgpOiB2b2lkIHtcbiAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgY29uc3QgZXh0cmFFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpO1xuICBpZiAobW9yZUVkaXQpIHtcbiAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9XG4gIGlmIChleHRyYUVkaXQpIHtcbiAgICBleHRyYUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgZXh0cmFFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZGVsZXRlQnV0dG9uSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBoYW5kbGUgcmVtb3ZpbmcgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIgKCk6IHZvaWQge1xuICBjb25zdCB0b1JlbW92ZTogUmVtb3ZlQWN0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBzZWxlY3RlZC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2FjY2lkJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5hY2NpZCcpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSkge1xuICAgICAgZWxlbSA9IGVsZW0uY2xvc2VzdCgnLmRpdkxpbmUnKTtcbiAgICB9XG4gICAgdG9SZW1vdmUucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAncmVtb3ZlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW0uaWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b1JlbW92ZVxuICB9O1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSByZS1hc3NvY2lhdGluZyBlbGVtZW50cyB0byB0aGUgbmVhcmVzdCBzdGFmZlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlU3RhZmZIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCB0b0NoYW5nZTogQ2hhbmdlU3RhZmZBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goZWxlbSA9PiB7XG4gICAgdG9DaGFuZ2UucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAnY2hhbmdlU3RhZmYnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbS5pZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b0NoYW5nZVxuICB9O1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnNlcnRpbmcgZGl2aXNpbyBvciBhY2NpZGVudGFsIGludG8gbmVhcmVzdCBzeWxsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvSW5zZXJ0OiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goZWxlbSA9PiB7XG4gICAgdG9JbnNlcnQucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAnaW5zZXJ0VG9TeWxsYWJsZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgY29uc3QgY2hhaW5BY3Rpb246IENoYWluQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogdG9JbnNlcnRcbiAgfTtcbiAgbmVvblZpZXcuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdJbnNlcnQgU3VjY2VzcycsICdzdWNjZXNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSW5zZXJ0IEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IFxuICB9KTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBoYW5kbGUgbW92aW5nIGRpdmlzaW8gb3IgYWNjaWRlbnRhbCBvdXQgb2Ygc3lsbGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCB0b01vdmU6IEVkaXRvckFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaChlbGVtID0+IHtcbiAgICB0b01vdmUucHVzaChcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAnbW92ZU91dHNpZGVTeWxsYWJsZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgY29uc3QgY2hhaW5BY3Rpb246IENoYWluQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogdG9Nb3ZlXG4gIH07XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7IFxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNb3ZlIEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IFxuICB9KTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBtYXRjaCBiYm94IGhlaWdodCB0byB0aGUgc2VsZWN0ZWQgYmJveFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hIZWlnaHRIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDYW5ub3QgbWF0Y2ggaGVpZ2h0IHRvIG11bHRpcGxlIGJib3gnLCAnZXJyb3InKTtcbiAgfVxuICBjb25zdCB0b0NoYW5nZTogTWF0Y2hIZWlnaHRBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWF0Y2hIZWlnaHQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IHNlbGVjdGVkWzBdLmlkXG4gICAgfVxuICB9O1xuXG4gIG5lb25WaWV3LmVkaXQodG9DaGFuZ2UsIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7IFxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSGVpZ2h0IE1hdGNoIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0hlaWdodCBNYXRjaCBGYWlsZWQgWG9YJywgJ2Vycm9yJyk7XG4gICAgfVxuICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpOyBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZERlbGV0ZUxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBkZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlJyk7XG5cbiAgaWYgKGRlbCkge1xuICAgIGRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICAgIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuXG4gICAgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgb3V0c2lkZSB0aGUgaWYgY29uZGl0aW9uP1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBjaGFuZ2VTdGFmZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFuZ2VTdGFmZicpO1xuICBjaGFuZ2VTdGFmZj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICBjaGFuZ2VTdGFmZj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgaW5wdXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29sdW1uSW5mbygpOiB2b2lkIHtcbiAgY29uc3QgY29sSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgc3RhdmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmLnNlbGVjdGVkJyk7XG4gIGxldCBjb2xJbmZvOiBudW1iZXI7XG4gIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgY29uc3QgaGFzQ29sdW1uID0gQXJyYXkuZnJvbShzdGFmZi5jbGFzc0xpc3QpLmpvaW4oJyAnKS5tYXRjaCgvXFxiY29sdW1uKFxcZCspXFxiLyk7XG4gICAgaWYgKGhhc0NvbHVtbikge1xuICAgICAgY29uc3Qgc3RhZmZDb2wgPSBwYXJzZUludChoYXNDb2x1bW5bMV0sIDEwKTtcbiAgICAgIGlmIChjb2xJbmZvICYmIGNvbEluZm8gIT0gc3RhZmZDb2wpIHtcbiAgICAgICAgY29uc3Qgd2FybmluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2wtd2FybmluZycpO1xuICAgICAgICB3YXJuaW5nLmlubmVyVGV4dCA9ICdUaGUgc2VsZWN0ZWQgc3RhdmVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgY29sdW1uISc7XG4gICAgICAgIGNvbEluZm8gPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbEluZm8gPSBzdGFmZkNvbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gXG4gIGlmIChjb2xJbmZvKSBjb2xJbnB1dC52YWx1ZSA9IGNvbEluZm8udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBBZGQgY29sdW1uIGluZm8gZWRpdCBoYW5kbGVyIGZvciBjb2x1bW4gaW5mbyBlZGl0b3JcbiAqL1xuZnVuY3Rpb24gYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCBkZWNyZW1lbnRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWRlY3JlbWVudCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBpbmNyZW1lbnRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWluY3JlbWVudCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBjb25maXJtQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC1jb25maXJtJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGNvbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC1pbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgZGVjcmVtZW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZU51bWJlcigtMSk7XG4gIH0pO1xuXG4gIGluY3JlbWVudEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVOdW1iZXIoMSk7XG4gIH0pO1xuXG4gIC8vIEFkZCBjb2x1bW4gaW5mbyBlZGl0IGhhbmRsZXJcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b1NldENvbHVtbjogRWRpdG9yQWN0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzdGF2ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYuc2VsZWN0ZWQnKTtcbiAgICBzdGF2ZXMuZm9yRWFjaChzdGFmZiA9PiB7XG4gICAgICB0b1NldENvbHVtbi5wdXNoKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgZWxlbWVudElkOiBzdGFmZi5pZCxcbiAgICAgICAgICAgIGF0dHJUeXBlOiAndHlwZScsXG4gICAgICAgICAgICBhdHRyVmFsdWU6ICdjb2x1bW4nICsgY29sSW5wdXQudmFsdWUsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgIHBhcmFtOiB0b1NldENvbHVtblxuICAgIH07XG4gICAgbmVvblZpZXcuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ29sdW1uIFZhbHVlIFVwZGF0ZSBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ29sdW1uIFZhbHVlIFVwZGF0ZSBGYWlsZWQgWG9YJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpOyBcbiAgICB9KTtcbiAgfSk7XG4gIFxuICBmdW5jdGlvbiB1cGRhdGVOdW1iZXIoY2hhbmdlOiBudW1iZXIpIHtcbiAgICBjb25zdCBtaW5OdW0gPSAxO1xuICAgIGNvbnN0IG1heE51bSA9IDU7XG4gICAgbGV0IGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KGNvbElucHV0LnZhbHVlLCAxMCkgfHwgMDtcbiAgICBjdXJyZW50VmFsdWUgKz0gY2hhbmdlO1xuXG4gICAgY3VycmVudFZhbHVlID0gTWF0aC5taW4oTWF0aC5tYXgoY3VycmVudFZhbHVlLCBtaW5OdW0pLCBtYXhOdW0pO1xuICAgIGlmIChjdXJyZW50VmFsdWUudG9TdHJpbmcoKSAhPSBjb2xJbnB1dC52YWx1ZSkgY29uZmlybUJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgY29sSW5wdXQudmFsdWUgPSBjdXJyZW50VmFsdWUudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHNldCB0aGUgSFRNTCBjb250ZW50IG9mIGVkaXQgY29udHJvbHM6IGVpdGhlciAjbW9yZUVkaXQgb3IgI2V4dHJhRWRpdFxuICpcbiAqIEBwYXJhbSB7J21vcmVFZGl0JyB8ICdleHRyYUVkaXQnfSBlZGl0VHlwZSAtIFRoZSB0eXBlIG9mIGVkaXQgY29udHJvbHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50cyAtIFRoZSBpbm5lckhUTUwgY29udGVudHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVwbGFjZSAtIElzIHRoZSBpbm5lckhUTUwgYmVpbmcgcmVwbGFjZWQsIG9yIGJlaW5nIGFkZGVkIHRvP1xuICovXG5mdW5jdGlvbiBzZXRFZGl0Q29udHJvbHMoZWRpdFR5cGU6ICdtb3JlRWRpdCcgfCAnZXh0cmFFZGl0JywgY29udGVudHM6IHN0cmluZywgcmVwbGFjZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3QgZWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRUeXBlKTtcbiAgXG4gIGlmIChlZGl0KSB7XG4gICAgZWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgIGlmIChyZXBsYWNlKSBlZGl0LmlubmVySFRNTCA9IGNvbnRlbnRzO1xuICAgIGVsc2UgZWRpdC5pbm5lckhUTUwgKz0gY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBleHRyYSBuYyBhY3Rpb24gbWVudSBmb3IgYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTmNBY3Rpb25zIChuYzogU1ZHR3JhcGhpY3NFbGVtZW50KTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdEFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5uY0FjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUHVuY3R1bS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldEluY2xpbmF0dW0sIHVuc2V0VmlyZ2EsIHVuc2V0VmlyZ2FSZXZlcnNlZCwgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlIF0gfSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0luY2xpbmF0dW0uZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRJbmNsaW5hdHVtOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3NlJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmVvblZpZXcuZWRpdCh7IGFjdGlvbjogJ2NoYWluJywgcGFyYW06IFsgdW5zZXRWaXJnYSwgdW5zZXRWaXJnYVJldmVyc2VkLCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsIHNldEluY2xpbmF0dW0gXSB9ICwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1ZpcmdhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHNldFZpcmdhOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3MnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldFZpcmdhUmV2ZXJzZWQsIHVuc2V0SW5jbGluYXR1bSwgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLCBzZXRWaXJnYSBdIH0sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNWaXJnYVJldmVyc2VkLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhID0gdW5zZXRWaXJnYUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3Qgc2V0VmlyZ2FSZXZlcnNlZDogU2V0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogbmMuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICduJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmVvblZpZXcuZWRpdCh7IGFjdGlvbjogJ2NoYWluJywgcGFyYW06IFsgdW5zZXRJbmNsaW5hdHVtLCB1bnNldFZpcmdhLCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsIHNldFZpcmdhUmV2ZXJzZWQgXSB9LCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjTGlxdWVzY2VudENsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHNldExpcXVlc2NlbnRDbG9ja3dpc2U6IFNldExpcXVlc2NlbnRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldExpcXVlc2NlbnQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogbmMuaWQsXG4gICAgICAgICAgY3VydmU6ICdjJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmVvblZpZXcuZWRpdCh7IGFjdGlvbjogJ2NoYWluJywgcGFyYW06IFsgdW5zZXRJbmNsaW5hdHVtLCB1bnNldFZpcmdhLCB1bnNldFZpcmdhUmV2ZXJzZWQsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsIHNldExpcXVlc2NlbnRDbG9ja3dpc2UgXSB9LCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTsgIFxuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZTogU2V0TGlxdWVzY2VudEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0TGlxdWVzY2VudCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBjdXJ2ZTogJ2EnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldEluY2xpbmF0dW0sIHVuc2V0VmlyZ2EsIHVuc2V0VmlyZ2FSZXZlcnNlZCwgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLCBzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSBdIH0sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0pOyAgXG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGV4dHJhIG5ldW1lIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTmV1bWVBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5kZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyk7XG4gIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMubmV1bWVBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgY29uc3QgbmV1bWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKTtcbiAgaWYgKG5ldW1lLmxlbmd0aCAhPT0gMSkge1xuICAgIGNvbnNvbGUud2FybignTW9yZSB0aGFuIG9uZSBuZXVtZSBzZWxlY3RlZCEgQ2Fubm90IHRyaWdnZXIgTmV1bWUgQ2xpY2tTZWxlY3QgYWN0aW9ucy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUT0RPIGFkZCB0cmlnZ2VyIGZvciBzcGxpdCBhY3Rpb25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0LW5ldW1lJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXVtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZXVtZS5zZWxlY3RlZCcpIGFzIFNWR0dFbGVtZW50O1xuICAgICAgaWYgKG5ldW1lICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gbmV3IFNwbGl0TmV1bWVIYW5kbGVyKG5lb25WaWV3LCBuZXVtZSk7XG4gICAgICAgIHNwbGl0LnN0YXJ0U3BsaXQoKTtcbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkIScpO1xuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1Blcy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1Blc1N1YnB1bmN0aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDbGl2aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXNGbGV4dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2xpbWFjdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDbGltYWN1c1Jlc3VwaW51cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1RvcmN1bHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjVG9yY3VsdXNSZXN1cGludXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXNGbGV4dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUHJlc3N1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcblxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlR3JvdXAgKGNvbnRvdXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZUdyb3VwaW5nQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdjaGFuZ2VHcm91cCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IG5ldW1lWzBdLmlkLFxuICAgICAgICBjb250b3VyOiBjb250b3VyXG4gICAgICB9XG4gICAgfTtcbiAgICBuZW9uVmlldy5lZGl0KGNoYW5nZUdyb3VwaW5nQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdHcm91cGluZyBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgfSk7XG4gIH1cblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3lsbGFibGUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJTeWxsYWJsZUFjdGlvbnMgKHNlbGVjdGlvblR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG5cbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLnN5bGxhYmxlQWN0aW9uc0NvbnRlbnQpO1xuICAvLyBpbml0aWFsaXplIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIGh0bWwgdG8gYmUgYWRkZWQgdG8gRGlzcGxheSBwYW5lbFxuICBsZXQgZXh0cmFBY3Rpb25zSFRNTCA9ICcnO1xuXG4gIC8vIGRldGVybWluZSB0aGUgdHlwZSBvZiBzZWxlY3Rpb24gdGhhdCB3YXMgbWFkZSBieSB0aGUgdXNlclxuICBzd2l0Y2goc2VsZWN0aW9uVHlwZSkge1xuICAgIC8vIG9ubHkgb25lIHN5bGxhYmxlXG4gICAgY2FzZSAnc2luZ2xlU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyB0d28gc3lsbGFibGVzIG9uIHNlcGFyYXRlIHN0YXZlc1xuICAgIGNhc2UgJ2xpbmthYmxlU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpbmtcIj5Ub2dnbGUgTGlua2VkIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBicmVhaztcblxuICAgIC8vIHRvdyBvciBtb3JlIHN5bGxhYmxlcyBvbiBvbmUgc3RhZmZcbiAgICBjYXNlICdtdWx0aVNlbGVjdCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IFxuICAgICAgICBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1lcmdlU3lsc1wiPk1lcmdlIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBicmVhaztcblxuICAgIC8vZGVmYXVsdCBvcHRpb25zXG4gICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IFxuICAgICAgICBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgfVxuXG4gIC8vIHNldCBjb250ZW50IG9mIGFkZGl0aW9uYWwgYWN0aW9ucyBpbiBEaXNwbGF5IHBhbmVsIFxuICAvLyBhbmQgaW5pdGlhbGl6ZSBuZWNlc3NhcnkgbGlzdGVuZXJzXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBleHRyYUFjdGlvbnNIVE1MLCB0cnVlKTtcbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgbGF5ZXIgZWxlbWVudCAoYWNjaWQsIGRpdkxpbmUsIGN1c3RvcywgY2xlZikgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJMYXllckVsZW1lbnRBY3Rpb25zIChlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnY3VzdG9zJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuY3VzdG9zQWN0aW9uQ29udGVudHMpO1xuICAgIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBjb25zdCBwYXJlbnRJc1N5bGxhYmxlID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKTtcbiAgY29uc3QgbGF5ZXJFbGVtZW50QWN0aW9ucyA9IHBhcmVudElzU3lsbGFibGVcbiAgICA/IENvbnRlbnRzLmxheWVyRWxlbWVudEluQWN0aW9uQ29udGVudHNcbiAgICA6IENvbnRlbnRzLmxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzO1xuICBcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIGxheWVyRWxlbWVudEFjdGlvbnMsIGZhbHNlKTtcbiAgXG4gIC8vIGV4dHJhIGFjdGlvbnMgZm9yIGFjY2lkIGFuZCBkaXZMaW5lXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYWNjaWQnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuYWNjaWRBY3Rpb25Db250ZW50cyk7XG4gICAgYWNjaWRPcHRpb25zTGlzdGVuZXIoZWxlbWVudCk7XG4gIH1cbiAgZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuY2xlZkFjdGlvbkNvbnRlbnRzKTtcbiAgICBjbGVmT3B0aW9uc0xpc3RlbmVyKGVsZW1lbnQpO1xuICB9XG4gIGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmRpdkxpbmVBY3Rpb25Db250ZW50cyk7XG4gICAgZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50KTtcbiAgfVxuICBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnNlcnRUb1N5bGxhYmxlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW92ZU91dHNpZGVTeWxsYWJsZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyKTtcblxuIFxuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydFRvU3lsbGFibGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnNlcnRUb1N5bGxhYmxlSGFuZGxlcik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3ZlT3V0c2lkZVN5bGxhYmxlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBhY2NpZE9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvRmxhdC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VUb0ZsYXQ6IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdhY2NpZCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnZidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oY2hhbmdlVG9GbGF0KTtcbiAgICB9KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTmF0dXJhbC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VUb05hdHVyYWw6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdhY2NpZCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oY2hhbmdlVG9OYXR1cmFsKTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xuXG59XG5cbmZ1bmN0aW9uIGNsZWZPcHRpb25zTGlzdGVuZXIoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50KTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbmNyZW1lbnQtb2N0YXZlJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbmNyZW1lbnRPY3RhdmU6IERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnZGlzcGxhY2VDbGVmT2N0YXZlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgZGlyZWN0aW9uOiAnYWJvdmUnXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG5lb25WaWV3LmVkaXQoaW5jcmVtZW50T2N0YXZlLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDbGVmIG9jdGF2ZSBpbmNyZW1lbnRlZC4nLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTWF4aW11bSBvY3RhdmUgZGlzcGxhY2VtZW50IHJlYWNoZWQuIENsZWYgY2FuIG9ubHkgYmUgZGlzcGxhY2VkIHVwIHRvIDMgb2N0YXZlcy4nLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVjcmVtZW50LW9jdGF2ZScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5jcmVtZW50T2N0YXZlOiBEaXNwbGFjZUNsZWZPY3RhdmVBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ2Rpc3BsYWNlQ2xlZk9jdGF2ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGRpcmVjdGlvbjogJ2JlbG93J1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBuZW9uVmlldy5lZGl0KGluY3JlbWVudE9jdGF2ZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xlZiBvY3RhdmUgZGVjcmVtZW50ZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ01heGltdW0gb2N0YXZlIGRpc3BsYWNlbWVudCByZWFjaGVkLiBDbGVmIGNhbiBvbmx5IGJlIGRpc3BsYWNlZCB1cCB0byAzIG9jdGF2ZXMuJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NDbGVmLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNldENDbGVmOiBTZXRDbGVmQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRDbGVmJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgc2hhcGU6ICdDJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRDQ2xlZik7XG4gICAgfSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNGQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRGQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnRidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oc2V0RkNsZWYpO1xuICAgIH0pO1xuXG4gIGluaXRPcHRpb25zTGlzdGVuZXJzKCk7XG59XG5cbmZ1bmN0aW9uIGRpdkxpbmVPcHRpb25zTGlzdGVuZXIoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50KTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDaGFuZ2VUb01pbmltYS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb01pbmltYTogU2V0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ21pbmltYSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9NaW5pbWEpO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDaGFuZ2VUb01haW9yLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWFpb3I6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdmb3JtJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdtYWlvcidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9NYWlvcik7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWF4aW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWF4aW1hOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWF4aW1hJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihDaGFuZ2VUb01heGltYSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvRmluYWxpcy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb0ZpbmFsaXM6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdmb3JtJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdmaW5hbGlzJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihDaGFuZ2VUb0ZpbmFsaXMpO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDaGFuZ2VUb0NhZXN1cmEuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ2hhbmdlVG9DYWVzdXJhOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnY2Flc3VyYSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9DYWVzdXJhKTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9WaXJndWxhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvVmlyZ3VsYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3Zpcmd1bGEnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvVmlyZ3VsYSk7XG4gICAgfSk7XG4gICAgXG4gIGluaXRPcHRpb25zTGlzdGVuZXJzKCk7XG59XG5cbi8qKlxuICogUGFyc2UgYWN0aW9ucyByZWdhcmRpbmcgc2hhcGUgY2hhbmdlcyB0byBlZGl0b3IgYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oYWN0aW9uOiBTZXRBY3Rpb24gfCBTZXRDbGVmQWN0aW9uKSB7XG4gIG5lb25WaWV3LmVkaXQoYWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgIH1cbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBleHRyYSBzdGFmZiBhY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5jb2x1bW5BY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgLy8gQ29sdW1uIGluZm8gZWRpdG9yXG4gIHVwZGF0ZUNvbHVtbkluZm8oKTtcbiAgYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lcmdlLXN5c3RlbXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBHcm91cGluZy5tZXJnZVN0YXZlcygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFbnRlciBzdGFmZiBzcGxpdHRpbmcgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclN0YWZmU3BsaXRNb2RlICgpOiB2b2lkIHtcbiAgY29uc3Qgc3RhZmYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3RhZmYuc2VsZWN0ZWQnKSBhcyBTVkdHRWxlbWVudDtcbiAgaWYgKHN0YWZmICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBuZXcgU3BsaXRTdGFmZkhhbmRsZXIobmVvblZpZXcsIHN0YWZmKTtcbiAgICBzcGxpdC5zdGFydFNwbGl0KCk7XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ05vIHN0YWZmIHdhcyBzZWxlY3RlZCEnKTtcbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHNwbGl0IHN0YWZmIG9wdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclNpbmdsZVN0YWZmQWN0aW9ucyAoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLnN0YWZmU3BsaXRBY3Rpb25Db250ZW50cyk7XG4gIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuY29sdW1uQWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIC8vIENvbHVtbiBpbmZvIGVkaXRvclxuICB1cGRhdGVDb2x1bW5JbmZvKCk7XG4gIGFkZENvbHVtbkluZm9TdGVwSGFuZGxlcigpO1xuXG4gIC8vIEFkZCB0cmlnZ2VyIGZvciBzcGxpdCBhY3Rpb25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0LXN5c3RlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdHJpZ2dlclN0YWZmU3BsaXRNb2RlKCk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXJvdGF0ZScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhZmYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3RhZmYuc2VsZWN0ZWQnKSBhcyBTVkdFbGVtZW50O1xuICAgICAgLy8gVW51c2VkIHZhcmlhYmxlczpcbiAgICAgIC8vIGNvbnN0IHJlY3QgPSBzdGFmZi5xdWVyeVNlbGVjdG9yKCcjcmVzaXplUmVjdCcpO1xuICAgICAgLy8gY29uc3QgY28gPSByZWN0LmdldEF0dHJpYnV0ZSgncG9pbnRzJykuc3BsaXQoJyAnKTtcbiAgICAgIC8vIGNvbnN0IGR5ID0gcGFyc2VJbnQoY29bMF0uc3BsaXQoJywnKVsxXSkgLSBwYXJzZUludChjb1sxXS5zcGxpdCgnLCcpWzFdKTtcbiAgICAgIGNvbnN0IHBvaW50cyA9IGdldFN0YWZmQkJveChzdGFmZiBhcyBTVkdHRWxlbWVudCk7XG4gICAgICBjb25zdCB5X2NoYW5nZSA9IE1hdGgudGFuKHBvaW50cy5yb3RhdGUpKihwb2ludHMubHJ4IC0gcG9pbnRzLnVseCk7XG4gICAgICBpZiAoc3RhZmYgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgZWxlbWVudElkOiBzdGFmZi5pZCxcbiAgICAgICAgICAgIHVseDogcG9pbnRzLnVseCxcbiAgICAgICAgICAgIHVseTogcG9pbnRzLnJvdGF0ZSA+IDAgPyBwb2ludHMudWx5ICsgeV9jaGFuZ2UvMiA6IHBvaW50cy51bHkgLSB5X2NoYW5nZS8yLFxuICAgICAgICAgICAgbHJ4OiBwb2ludHMubHJ4LFxuICAgICAgICAgICAgbHJ5OiBwb2ludHMucm90YXRlID4gMCA/IHBvaW50cy5scnkgLSB5X2NoYW5nZS8yIDogcG9pbnRzLmxyeSArIHlfY2hhbmdlLzIsXG4gICAgICAgICAgICByb3RhdGU6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkJyk7XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGJib3ggb3B0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckJCb3hBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuYmJveEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hdGNoSGVpZ2h0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbWF0Y2hIZWlnaHRIYW5kbGVyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZGVmYXVsdCBhY3Rpb25zIHdoZW4gc2VsZWN0aW5nIGJ5IHN5bFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTeWxBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdFN5bEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZGVmYXVsdCBzZWxlY3Rpb24gb3B0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGV4dHJhIGRyb3Bkb3duIG9wdGlvbnM6XG4gKiBMaXN0ZW4gdG8gY2xpY2tzIG9uIGRyb3Bkb3duc1xuICovXG5mdW5jdGlvbiBpbml0T3B0aW9uc0xpc3RlbmVycyAoKTogdm9pZCB7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wX3NlbGVjdCcpXG4gICAgLmZvckVhY2goXG4gICAgICBkcm9wID0+IHtcbiAgICAgICAgLy8gV2hlbiBhbnl0aGluZyB0aGF0IGlzIG5vdCB0aGUgZHJvcGRvd24gaXMgY2xpY2tlZCBhd2F5LCB0aGUgZHJvcGRvd25cbiAgICAgICAgLy8gc2hvdWxkIGxvc2UgaXRzIHZpc2liaWxpdHlcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NsaWNrYXdheSA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uc0NsaWNrYXdheSk7XG4gICAgICAgICAgZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkcm9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgICAgICAgIC8vIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGRyb3Bkb3duXG4gICAgICAgICAgZHJvcC5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcblxuICAgICAgICAgIC8vIFJlbW92ZSB2aXNpYmlsaXR5IG9mIG90aGVyIGRyb3Bkb3ducyB3aGVuIHRoaXMgb25lIGlzIGNsaWNrZWRcbiAgICAgICAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wX3NlbGVjdCcpKVxuICAgICAgICAgICAgLmZpbHRlcihvdGhlciA9PiBvdGhlciAhPT0gZHJvcClcbiAgICAgICAgICAgIC5mb3JFYWNoKG90aGVyID0+IG90aGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpKTtcblxuICAgICAgICAgIC8vIERvbid0IGFsbG93IG90aGVyIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgYm9keSB0byBpbnRlcmZlcmUgd2l0aCB0aGlzIGxpc3RlbmVyXG4gICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgaWYgKGRyb3AuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSlcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25zQ2xpY2thd2F5KTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uc0NsaWNrYXdheSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG59XG4iLCJpbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuZXhwb3J0IGludGVyZmFjZSBQb2ludCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJCb3gge1xuICB1bHg6IG51bWJlcjtcbiAgdWx5OiBudW1iZXI7XG4gIGxyeDogbnVtYmVyO1xuICBscnk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgU1ZHIHJlbGF0aXZlIGNvb3JkaW5hdGVzIGdpdmVuIGNsaWVudFggYW5kIGNsaWVudFlcbiAqIFNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjkyNjEzMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNWR1JlbENvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBQb2ludCB7XG4gIGNvbnN0IHB0ID0gbmV3IERPTVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFNWR1NWR0VsZW1lbnQ+KCcuYWN0aXZlLXBhZ2UgPiAuZGVmaW5pdGlvbi1zY2FsZScpO1xuICBjb25zdCBwYWdlTWFyZ2luID0gc3ZnLnF1ZXJ5U2VsZWN0b3I8U1ZHR0VsZW1lbnQ+KCcucGFnZS1tYXJnaW4nKTtcblxuICBjb25zdCB7IHgsIHkgfSA9IHB0Lm1hdHJpeFRyYW5zZm9ybShwYWdlTWFyZ2luLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gIHJldHVybiB7IHgsIHkgfTtcblxuICAvLyBJZiB0aGVyZSBpcyBzb21lIGlzc3VlIHdpdGggY29vcmRpbmF0ZXMsIHRoaXMgbWF5IGZpeCB0aGUgaXNzdWU6XG4gIC8vIGNvbnN0IHN2ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHU1ZHRWxlbWVudD4oJyNzdmdfZ3JvdXAnKTtcbiAgLy8gY29uc3QgeyB4LCB5IH0gPSBwdC5tYXRyaXhUcmFuc2Zvcm0oc3ZnLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG59XG5cbi8qKlxuICogR2V0IElEIG9mIHN0YWZmIGJ5IGNsaWVudCdzIHgteSBjb29yZGluYXRlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHRoZSAqdmlzdWFsKiBib3VuZGluZyBib3ggb2YgdGhlIHN0YWZmXG4gKiBiYXNlZCBvbiBpdHMgc3RhZmYgbGluZXMsIGluc3RlYWQgb2YgdGhlIFNWRyBlbGVtZW50IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmSWRCeUNvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzdGF2ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8U1ZHR0VsZW1lbnQ+KCcuc3RhZmYnKSk7XG4gIGNvbnN0IHN0YWZmQkJveGVzID0gc3RhdmVzLm1hcChzdGFmZiA9PiBnZXRTdGFmZkJCb3goc3RhZmYpKTtcblxuICAvLyBmaW5kIHRoZSBzdGFmZiB0aGF0IHRoZSBjdXJzb3IgaXMgaW5zaWRlXG4gIGNvbnN0IHsgeCwgeSB9ID0gZ2V0U1ZHUmVsQ29vcmRzKGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdGFmZiA9IHN0YWZmQkJveGVzLmZpbmQoXG4gICAgKGJib3gpID0+IHggPD0gYmJveC5scnggJiYgeCA+PSBiYm94LnVseCAmJiB5IDw9IGJib3gubHJ5ICYmIHkgPj0gYmJveC51bHlcbiAgKTsgXG5cbiAgLy8gSWYgdGhlcmUgaXMgaXNzdWVzIHdpdGggZmluZGluZyB0aGUgc3RhZmYsIHRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGU6XG4gIC8vIHJldHVybiAocHQueCA+IHVseCAmJiBwdC54IDwgbHJ4KSAmJlxuICAvLyAgIChwdC55ID4gKHVseSArIChwdC54IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkpKSAmJlxuICAvLyAgIChwdC55IDwgKGxyeSAtIChscnggLSBwdC54KSAqIE1hdGgudGFuKHJvdGF0ZSkpKTtcblxuICAvLyBpZiB0aGUgY3Vyc29yIGlzIG5vdCBpbnNpZGUgYW55IHN0YWZmLCB0aGVuIGV4cGxpY2l0bHkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHN0YWZmID8gc3RhZmYuaWQgOiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBzdGFmZiBieSBjbGllbnQncyB4LXkgY29vcmRpbmF0ZXM7IHdyYXBwZXIgZm9yIGdldFN0YWZmSWRCeUNvb3JkcywgYnV0XG4gKiAgIHJldHVybnMgdGhlIGVsZW1lbnQsIG5vdCB0aGUgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmQnlDb29yZHMgKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogU1ZHR0VsZW1lbnQgfCBudWxsIHtcbiAgY29uc3Qgc3RhZmZJZCA9IGdldFN0YWZmSWRCeUNvb3JkcyhjbGllbnRYLCBjbGllbnRZKTtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3N0YWZmSWR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc091dE9mU1ZHQm91bmRzICh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiZ0ltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHSW1hZ2VFbGVtZW50PignI2JnaW1nJyk7XG4gIFxuICByZXR1cm4gKFxuICAgIHggPD0gMCB8fCB4ID49IE51bWJlcihiZ0ltZy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHx8XG4gICAgeSA8PSAwIHx8IHkgPj0gTnVtYmVyKGJnSW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IGJvdW5kaW5nIGJveCAobHJ4LCBscnksIHVseCwgdWx5KSBvZiBhIGdseXBoLCB3aGljaFxuICogaXMgYSA8dXNlPiBlbGVtZW50IGluIHRoZSBTVkdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdseXBoQkJveCAoZzogU1ZHUmVjdEVsZW1lbnQgfCBTVkdVc2VFbGVtZW50KTogQkJveCB7XG4gIGNvbnN0IHJlY3QgPSAoZy50YWdOYW1lID09ICdyZWN0JykgPyBnLmdldEJCb3goKSA6IChnLnBhcmVudE5vZGUgYXMgU1ZHR0VsZW1lbnQpLmdldEJCb3goKTtcblxuICByZXR1cm4ge1xuICAgIHVseDogcmVjdC54LFxuICAgIHVseTogcmVjdC55LFxuICAgIGxyeDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBscnk6IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cbiIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gTm9kZS9Db21tb25KU1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTURcbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAod2l0aCBzdXBwb3J0IGZvciB3ZWIgd29ya2VycylcbiAgICAgICAgdmFyIGdsb2I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdsb2IgPSB3aW5kb3c7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdsb2IgPSBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2xvYi5TcGFya01ENSA9IGZhY3RvcnkoKTtcbiAgICB9XG59KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8qXG4gICAgICogRmFzdGVzdCBtZDUgaW1wbGVtZW50YXRpb24gYXJvdW5kIChKS00gbWQ1KS5cbiAgICAgKiBDcmVkaXRzOiBKb3NlcGggTXllcnNcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sXG4gICAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9tZDUtc2hvb3RvdXQvN1xuICAgICAqL1xuXG4gICAgLyogdGhpcyBmdW5jdGlvbiBpcyBtdWNoIGZhc3RlcixcbiAgICAgIHNvIGlmIHBvc3NpYmxlIHdlIHVzZSBpdC4gU29tZSBJRXNcbiAgICAgIGFyZSB0aGUgb25seSBvbmVzIEkga25vdyBvZiB0aGF0XG4gICAgICBuZWVkIHRoZSBpZGlvdGljIHNlY29uZCBmdW5jdGlvbixcbiAgICAgIGdlbmVyYXRlZCBieSBhbiBpZiBjbGF1c2UuICAqL1xuICAgIHZhciBhZGQzMiA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYSArIGIpICYgMHhGRkZGRkZGRjtcbiAgICB9LFxuICAgICAgICBoZXhfY2hyID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ107XG5cblxuICAgIGZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgICAgIGEgPSBhZGQzMihhZGQzMihhLCBxKSwgYWRkMzIoeCwgdCkpO1xuICAgICAgICByZXR1cm4gYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVjeWNsZSh4LCBrKSB7XG4gICAgICAgIHZhciBhID0geFswXSxcbiAgICAgICAgICAgIGIgPSB4WzFdLFxuICAgICAgICAgICAgYyA9IHhbMl0sXG4gICAgICAgICAgICBkID0geFszXTtcblxuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzBdIC0gNjgwODc2OTM2IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbMV0gLSAzODk1NjQ1ODYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbMl0gKyA2MDYxMDU4MTkgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbM10gLSAxMDQ0NTI1MzMwIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzRdIC0gMTc2NDE4ODk3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbNV0gKyAxMjAwMDgwNDI2IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzZdIC0gMTQ3MzIzMTM0MSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1s3XSAtIDQ1NzA1OTgzIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzhdICsgMTc3MDAzNTQxNiB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzldIC0gMTk1ODQxNDQxNyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxMF0gLSA0MjA2MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1sxMV0gLSAxOTkwNDA0MTYyIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzEyXSArIDE4MDQ2MDM2ODIgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1sxM10gLSA0MDM0MTEwMSB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxNF0gLSAxNTAyMDAyMjkwIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzE1XSArIDEyMzY1MzUzMjkgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG5cbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxXSAtIDE2NTc5NjUxMCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzZdIC0gMTA2OTUwMTYzMiB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzExXSArIDY0MzcxNzcxMyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1swXSAtIDM3Mzg5NzMwMiB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1s1XSAtIDcwMTU1ODY5MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzEwXSArIDM4MDE2MDgzIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTVdIC0gNjYwNDc4MzM1IHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzRdIC0gNDA1NTM3ODQ4IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzldICsgNTY4NDQ2NDM4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTRdIC0gMTAxOTgwMzY5MCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzNdIC0gMTg3MzYzOTYxIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzhdICsgMTE2MzUzMTUwMSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxM10gLSAxNDQ0NjgxNDY3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMl0gLSA1MTQwMzc4NCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzddICsgMTczNTMyODQ3MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1sxMl0gLSAxOTI2NjA3NzM0IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuXG4gICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzVdIC0gMzc4NTU4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzhdIC0gMjAyMjU3NDQ2MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTFdICsgMTgzOTAzMDU2MiB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTRdIC0gMzUzMDk1NTYgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMV0gLSAxNTMwOTkyMDYwIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzRdICsgMTI3Mjg5MzM1MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbN10gLSAxNTU0OTc2MzIgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgXiBkIF4gYSkgKyBrWzEwXSAtIDEwOTQ3MzA2NDAgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMTNdICsgNjgxMjc5MTc0IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzBdIC0gMzU4NTM3MjIyIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1szXSAtIDcyMjUyMTk3OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbNl0gKyA3NjAyOTE4OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1s5XSAtIDY0MDM2NDQ4NyB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhIF4gYiBeIGMpICsga1sxMl0gLSA0MjE4MTU4MzUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzE1XSArIDUzMDc0MjUyMCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMl0gLSA5OTUzMzg2NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcblxuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1swXSAtIDE5ODYzMDg0NCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1s3XSArIDExMjY4OTE0MTUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzE0XSAtIDE0MTYzNTQ5MDUgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzVdIC0gNTc0MzQwNTUgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGtbMTJdICsgMTcwMDQ4NTU3MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1szXSAtIDE4OTQ5ODY2MDYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzEwXSAtIDEwNTE1MjMgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzFdIC0gMjA1NDkyMjc5OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s4XSArIDE4NzMzMTMzNTkgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDYgfCBhID4+PiAyNikgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbMTVdIC0gMzA2MTE3NDQgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzZdIC0gMTU2MDE5ODM4MCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMTNdICsgMTMwOTE1MTY0OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s0XSAtIDE0NTUyMzA3MCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1sxMV0gLSAxMTIwMjEwMzc5IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwO1xuICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1syXSArIDcxODc4NzI1OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbOV0gLSAzNDM0ODU1NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHwgYiA+Pj4gMTEpICsgYyB8IDA7XG5cbiAgICAgICAgeFswXSA9IGEgKyB4WzBdIHwgMDtcbiAgICAgICAgeFsxXSA9IGIgKyB4WzFdIHwgMDtcbiAgICAgICAgeFsyXSA9IGMgKyB4WzJdIHwgMDtcbiAgICAgICAgeFszXSA9IGQgKyB4WzNdIHwgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVibGsocykge1xuICAgICAgICB2YXIgbWQ1YmxrcyA9IFtdLFxuICAgICAgICAgICAgaTsgLyogQW5keSBLaW5nIHNhaWQgZG8gaXQgdGhpcyB3YXkuICovXG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIG1kNWJsa3NbaSA+PiAyXSA9IHMuY2hhckNvZGVBdChpKSArIChzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDgpICsgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpICsgKHMuY2hhckNvZGVBdChpICsgMykgPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNWJsa19hcnJheShhKSB7XG4gICAgICAgIHZhciBtZDVibGtzID0gW10sXG4gICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gYVtpXSArIChhW2kgKyAxXSA8PCA4KSArIChhW2kgKyAyXSA8PCAxNikgKyAoYVtpICsgM10gPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNTEocykge1xuICAgICAgICB2YXIgbiA9IHMubGVuZ3RoLFxuICAgICAgICAgICAgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgdGFpbCxcbiAgICAgICAgICAgIHRtcCxcbiAgICAgICAgICAgIGxvLFxuICAgICAgICAgICAgaGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbjsgaSArPSA2NCkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIG1kNWJsayhzLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGkgLSA2NCk7XG4gICAgICAgIGxlbmd0aCA9IHMubGVuZ3RoO1xuICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBzLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cbiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIGlmIChpID4gNTUpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1pZ2h0IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdFxuICAgICAgICB0bXAgPSBuICogODtcbiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtcbiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwO1xuXG4gICAgICAgIHRhaWxbMTRdID0gbG87XG4gICAgICAgIHRhaWxbMTVdID0gaGk7XG5cbiAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWQ1MV9hcnJheShhKSB7XG4gICAgICAgIHZhciBuID0gYS5sZW5ndGgsXG4gICAgICAgICAgICBzdGF0ZSA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgICB0YWlsLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBuOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrX2FycmF5KGEuc3ViYXJyYXkoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IHN1cmUgaWYgaXQgaXMgYSBidWcsIGhvd2V2ZXIgSUUxMCB3aWxsIGFsd2F5cyBwcm9kdWNlIGEgc3ViIGFycmF5IG9mIGxlbmd0aCAxXG4gICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50IGFycmF5IGlmIHRoZSBzdWIgYXJyYXkgc3BlY2lmaWVkIHN0YXJ0c1xuICAgICAgICAvLyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgcGFyZW50IGFycmF5IC0gd2VpcmQuXG4gICAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNzcxNDUyL3R5cGVkLWFycmF5LXN1YmFycmF5LWlzc3VlXG4gICAgICAgIGEgPSAoaSAtIDY0KSA8IG4gPyBhLnN1YmFycmF5KGkgLSA2NCkgOiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gYVtpXSA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICBpZiAoaSA+IDU1KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtaWdodCBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXRcbiAgICAgICAgdG1wID0gbiAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuXG4gICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmhleChuKSB7XG4gICAgICAgIHZhciBzID0gJycsXG4gICAgICAgICAgICBqO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzICs9IGhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl0gKyBoZXhfY2hyWyhuID4+IChqICogOCkpICYgMHgwRl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGV4KHgpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB4W2ldID0gcmhleCh4W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBmYXN0IGFkZDMyIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkLi5cbiAgICBpZiAoaGV4KG1kNTEoJ2hlbGxvJykpICE9PSAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKSB7XG4gICAgICAgIGFkZDMyID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICAgIHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRiksXG4gICAgICAgICAgICAgICAgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gICAgICAgICAgICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEFycmF5QnVmZmVyIHNsaWNlIHBvbHlmaWxsLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHRhdWJlcnQvbm9kZS1hcnJheWJ1ZmZlci1zbGljZVxuICAgICAqL1xuXG4gICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIUFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gY2xhbXAodmFsLCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAodmFsIHwgMCkgfHwgMDtcblxuICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh2YWwgKyBsZW5ndGgsIDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWwsIGxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gY2xhbXAoZnJvbSwgbGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUFycmF5O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gY2xhbXAodG8sIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJlZ2luID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbnVtID0gZW5kIC0gYmVnaW47XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEFycmF5QnVmZmVyKG51bSk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLCBiZWdpbiwgbnVtKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXJzLlxuICAgICAqL1xuXG4gICAgZnVuY3Rpb24gdG9VdGY4KHN0cikge1xuICAgICAgICBpZiAoL1tcXHUwMDgwLVxcdUZGRkZdLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRmOFN0cjJBcnJheUJ1ZmZlcihzdHIsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgICAgICAgIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSxcbiAgICAgICAgICAgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksXG4gICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gYXJyIDogYnVmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcnJheUJ1ZmZlcjJVdGY4U3RyKGJ1ZmYpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGZpcnN0LCBzZWNvbmQsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGZpcnN0LmJ5dGVMZW5ndGggKyBzZWNvbmQuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShmaXJzdCkpO1xuICAgICAgICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KHNlY29uZCksIGZpcnN0LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gcmVzdWx0IDogcmVzdWx0LmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoZXhUb0JpbmFyeVN0cmluZyhoZXgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW10sXG4gICAgICAgICAgICBsZW5ndGggPSBoZXgubGVuZ3RoLFxuICAgICAgICAgICAgeDtcblxuICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGVuZ3RoIC0gMTsgeCArPSAyKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKHBhcnNlSW50KGhleC5zdWJzdHIoeCwgMiksIDE2KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIFNwYXJrTUQ1IE9PUCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbWQ1LCBvdGhlcndpc2UgdXNlIHRoZVxuICAgICAqIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuXG4gICAgICovXG5cbiAgICBmdW5jdGlvbiBTcGFya01ENSgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHN0cmluZy5cbiAgICAgKiBBIGNvbnZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGFuIHV0Zjggc3RyaW5nIGlzIGRldGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBhcHBlbmQgYXMgYmluYXJ5XG4gICAgICAgIHRoaXMuYXBwZW5kQmluYXJ5KHRvVXRmOChzdHIpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgVGhlIGJpbmFyeSBzdHJpbmcgdG8gYmUgYXBwZW5kZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZEJpbmFyeSA9IGZ1bmN0aW9uIChjb250ZW50cykge1xuICAgICAgICB0aGlzLl9idWZmICs9IGNvbnRlbnRzO1xuICAgICAgICB0aGlzLl9sZW5ndGggKz0gY29udGVudHMubGVuZ3RoO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9idWZmLmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbGVuZ3RoOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCBtZDVibGsodGhpcy5fYnVmZi5zdWJzdHJpbmcoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYnVmZiA9IHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGkgLSA2NCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0ID0gaGV4KHRoaXMuX2hhc2gpO1xuXG4gICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgIHJldCA9IGhleFRvQmluYXJ5U3RyaW5nKHJldCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYnVmZiA9ICcnO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9oYXNoID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1ZmY6IHRoaXMuX2J1ZmYsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMuX2xlbmd0aCxcbiAgICAgICAgICAgIGhhc2g6IHRoaXMuX2hhc2guc2xpY2UoKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLl9idWZmID0gc3RhdGUuYnVmZjtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB0aGlzLl9oYXNoID0gc3RhdGUuaGFzaDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgdGhlIGluY3JlbWVudGFsIGJ1ZmZlciBhbmQgb3RoZXIgYWRkaXRpb25hbFxuICAgICAqIHJlc291cmNlcy4gSWYgeW91IHBsYW4gdG8gdXNlIHRoZSBpbnN0YW5jZSBhZ2FpbiwgdXNlIHJlc2V0IGluc3RlYWQuXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9oYXNoO1xuICAgICAgICBkZWxldGUgdGhpcy5fYnVmZjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgdGFpbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9ICB0YWlsICAgVGhlIHRhaWwgKHdpbGwgYmUgbW9kaWZpZWQpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgYnVmZmVyXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAodGFpbCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBpID0gbGVuZ3RoLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgaWYgKGkgPiA1NSkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gdGhlIGZpbmFsIGNvbXB1dGF0aW9uIGJhc2VkIG9uIHRoZSB0YWlsIGFuZCBsZW5ndGhcbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtYXkgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0XG4gICAgICAgIHRtcCA9IHRoaXMuX2xlbmd0aCAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCB0YWlsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGEgc3RyaW5nLlxuICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIHN0ciBUaGUgc3RyaW5nXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbcmF3XSBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoID0gZnVuY3Rpb24gKHN0ciwgcmF3KSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBjb21wdXRlIGl0IHVzaW5nIHRoZSBiaW5hcnkgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuIFNwYXJrTUQ1Lmhhc2hCaW5hcnkodG9VdGY4KHN0ciksIHJhdyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIGNvbnRlbnQgVGhlIGJpbmFyeSBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddICAgICBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnQsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTEoY29udGVudCksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogU3BhcmtNRDUgT09QIGltcGxlbWVudGF0aW9uIGZvciBhcnJheSBidWZmZXJzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUgT05MWSBmb3IgYXJyYXkgYnVmZmVycy5cbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyIFRoZSBhcnJheSB0byBiZSBhcHBlbmRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGFycikge1xuICAgICAgICB2YXIgYnVmZiA9IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKHRoaXMuX2J1ZmYuYnVmZmVyLCBhcnIsIHRydWUpLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIHRoaXMuX2xlbmd0aCArPSBhcnIuYnl0ZUxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIG1kNWJsa19hcnJheShidWZmLnN1YmFycmF5KGkgLSA2NCwgaSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2J1ZmYgPSAoaSAtIDY0KSA8IGxlbmd0aCA/IG5ldyBVaW50OEFycmF5KGJ1ZmYuYnVmZmVyLnNsaWNlKGkgLSA2NCkpIDogbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmW2ldIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKHRhaWwsIGxlbmd0aCk7XG4gICAgICAgIHJldCA9IGhleCh0aGlzLl9oYXNoKTtcblxuICAgICAgICBpZiAocmF3KSB7XG4gICAgICAgICAgICByZXQgPSBoZXhUb0JpbmFyeVN0cmluZyhyZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmYgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5faGFzaCA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGVcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgYnVmZmVyIHRvIGEgc3RyaW5nXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSBhcnJheUJ1ZmZlcjJVdGY4U3RyKHN0YXRlLmJ1ZmYpO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYnVmZmVyXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSB1dGY4U3RyMkFycmF5QnVmZmVyKHN0YXRlLmJ1ZmYsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBTcGFya01ENS5wcm90b3R5cGUuc2V0U3RhdGUuY2FsbCh0aGlzLCBzdGF0ZSk7XG4gICAgfTtcblxuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3k7XG5cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuX2ZpbmlzaCA9IFNwYXJrTUQ1LnByb3RvdHlwZS5fZmluaXNoO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGFuIGFycmF5IGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFyciBUaGUgYXJyYXkgYnVmZmVyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSAgICAgW3Jhd10gVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IG9uZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIuaGFzaCA9IGZ1bmN0aW9uIChhcnIsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTFfYXJyYXkobmV3IFVpbnQ4QXJyYXkoYXJyKSksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIHJldHVybiBTcGFya01ENTtcbn0pKTtcbiIsIi8qKlxuICogRm9ybWF0cyByYXcgVVVJRCBkYXRhIGludG8gdGhlIHByb3BlciBzdHJpbmcgZm9ybWF0LlxuICogQHBhcmFtIGRhdGEgLSBSYXcgVVVJRCBkYXRhLlxuICogQHJldHVybnMgRm9ybWF0dGVkIFVVSUQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiB1aW50OFRvVXVpZCAoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gMTYpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBjYiAocHJldmlvdXM6IHN0cmluZywgY3VycmVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJldmlvdXMgKyBjdXJyZW50LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc2xpY2UoMCwgNCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNCwgNikucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNiwgOCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoOCwgMTApLnJlZHVjZShjYiwgJycpICtcbiAgICAnLScgKyBkYXRhLnNsaWNlKDEwKS5yZWR1Y2UoY2IsICcnKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBBIFt2ZXJzaW9uIDQgVVVJRF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXIjVmVyc2lvbl80XyhyYW5kb20pKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCAoKTogc3RyaW5nIHtcbiAgLy8gQ2hlY2sgZm9yIGNyeXB0byBBUElcbiAgaWYgKHdpbmRvdy5jcnlwdG8gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1aW50OFRvVXVpZChuZXcgVWludDhBcnJheSgxNikpO1xuICB9XG5cbiAgLy8gR2V0IDE2IG9jdGV0cyBmb3IgVVVJRFxuICBjb25zdCBvY3RldHMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGNvbnN0IG1vZGlmaWVycyA9IFVpbnQ4QXJyYXkuZnJvbShbXG4gICAgcGFyc2VJbnQoJzAxMDAwMDAwJywgMiksICAvLyBWZXJzaW9uIGJpdHMgKDQgPT4gMDEwMClcbiAgICBwYXJzZUludCgnMTAwMDAwMDAnLCAyKSwgIC8vIFZhcmlhbnQgYml0cyAoMTB4KVxuICAgIHBhcnNlSW50KCcwMDAwMTExMScsIDIpLCAgLy8gTWFzayB0byB6ZXJvIGhpZ2hlciBiaXRzLCB2ZXJzaW9uXG4gICAgcGFyc2VJbnQoJzAwMTExMTExJywgMikgICAvLyBNYXNrIHRvIHplcm8gaGlnaGVyIGJpdHMsIHZhcmlhbnRcbiAgXSk7XG4gIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG9jdGV0cyk7XG4gIC8vIFNldCB2ZXJzaW9uIGJpdHMgYW5kIHZhcmlhbnQgYml0c1xuICBvY3RldHNbNl0gPSAob2N0ZXRzWzZdICYgbW9kaWZpZXJzWzJdKSB8IG1vZGlmaWVyc1swXTtcbiAgb2N0ZXRzWzhdID0gKG9jdGV0c1s4XSAmIG1vZGlmaWVyc1szXSkgfCBtb2RpZmllcnNbMV07XG5cbiAgcmV0dXJuIHVpbnQ4VG9VdWlkKG9jdGV0cyk7XG59XG4iLCJpbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIGNvbG9yIHBhbGV0dGUgZnJvbSBGaWd1cmUgMiAoQ29sb3JzIG9wdGltaXplZCBmb3IgY29sb3ItYmxpbmRcbiAqIGluZGl2aWR1YWxzKSBmcm9tXG4gKiBbXCJQb2ludHMgb2YgdmlldzogQ29sb3IgYmxpbmRuZXNzXCIgYnkgQmFuZyBXb25nIHB1Ymxpc2hlZCBpbiBOYXR1cmUgTWV0aG9kcyB2b2x1bWUgOCBvbiAyNyBNYXkgMjAxMV0oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9ubWV0aC4xNjE4P1dULmVjX2lkPU5NRVRILTIwMTEwNilcbiAqL1xuY29uc3QgQ29sb3JQYWxldHRlOiBzdHJpbmdbXSA9IFtcbiAgJ3JnYigyMzAsIDE1OSwgMCknLFxuICAncmdiKDg2LCAxODAsIDIzMyknLFxuICAncmdiKDAsIDE1OCwgMTE1KScsXG4gICdyZ2IoMjQwLCAyMjgsIDY2KScsXG4gICdyZ2IoMCwgMTE0LCAxNzgpJyxcbiAgJ3JnYigyMTMsIDk0LCAwKScsXG4gICdyZ2IoMjA0LCAxMjEsIDE2NyknXG5dO1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgaGlnaGxpZ2h0IGZyb20gYSBzdGFmZi5cbiAqIEBwYXJhbSBzdGFmZiBJZiB1bmRlZmluZWQsIHRoZSBhbGwgc3RhdmVzIGFyZSB1bmhpZ2hsaWdodGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5oaWdobGlnaHQoc3RhZmY/OiBTVkdHRWxlbWVudCk6IHZvaWQge1xuICBsZXQgY2hpbGRyZW46IE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gIGlmIChzdGFmZikge1xuICAgIGNoaWxkcmVuID0gc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9XG4gIGNoaWxkcmVuLmZvckVhY2goZWxlbSA9PiB7XG4gICAgaWYgKGVsZW0udGFnTmFtZSA9PT0gJ3BhdGgnICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfSBlbHNlIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbGwnKTtcbiAgICAgIGxldCByZWN0cyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWN0cyA9IFtdIGFzIHVua25vd24gYXMgTm9kZUxpc3RPZjxFbGVtZW50PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApe1xuICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBoaWdobGlnaHQgZnJvbSBlYWNoIHN0YWZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRTdGFmZkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5oaWdobGlnaHQoKTtcbn1cblxuLyoqXG4gKiBVbnNldCBoaWdobGlnaHQgZm9yIGFsbCBncm91cGluZyB0eXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5zZXRTdGFmZkhpZ2hsaWdodCgpO1xuICBjb25zdCBoaWdobGlnaHRlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQnKSlcbiAgICAuZmlsdGVyKChlbGVtOiBIVE1MRWxlbWVudCkgPT4gIWVsZW0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpO1xuICBoaWdobGlnaHRlZC5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGVsZW0uc2V0QXR0cmlidXRlKCcjZDAwJywgbnVsbCk7XG4gICAgbGV0IHJlY3RzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICBpZiAoZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKSAhPT0gbnVsbCkge1xuICAgICAgICByZWN0cyA9IGVsZW0uY2xvc2VzdCgnLnN5bGxhYmxlJykucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgfVxuICAgIH1cbiAgICByZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWN0OiBIVE1MRWxlbWVudCkge1xuICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8IFxuICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICApe1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgIGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2gocmVjdCA9PiB7XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpLmZvckVhY2goKGVsKSA9PiB7IGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcnKTsgfSk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGEgc3RhZmYgYSBjZXJ0YWluIGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlnaGxpZ2h0KHN0YWZmOiBTVkdHRWxlbWVudCwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oc3RhZmYuY2hpbGRyZW4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ3BhdGgnKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykubGVuZ3RoICYmIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKSkge1xuICAgICAgQXJyYXkuZnJvbShjaGlsZC5jaGlsZHJlbikuZmlsdGVyKGVsID0+IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpIHx8IGNoaWxkLmlkID09PSAncmVzaXplUmVjdCcgfHwgY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyb3RhdGVQb2ludCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2xheWVyJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hpZ2hsaWdodC1zZWxlY3RlZCcpLmxlbmd0aCAmJlxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJylbMF0uaWQgPT09ICdoaWdobGlnaHQtbmV1bWUnXG4gICAgICAmJiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgbGV0IHJlY3RzID0gY2hpbGQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBjaGlsZC5jbG9zZXN0KCcuc3lsbGFibGUnKS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVjdHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlY3RzLmZvckVhY2goZnVuY3Rpb24gKHJlY3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICghKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApKSB7XG4gICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gY29sb3I7XG4gICAgICAgICAgcmVjdC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hpbGQuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0ZWQnKTtcbiAgfVxuICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgLyp0cnkge1xuICAgIHdpZHRoID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnd2lkdGgnKS5zcGxpdCgncHgnKVswXSk7XG4gICAgaGVpZ2h0ID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jykuc3BsaXQoJ3B4JylbMF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgfSovXG4gIGxldCBzdHJva2U6IHN0cmluZztcbiAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgJiYgaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBpZGsgbG9va3MgZ29vZCA6JylcbiAgICAvLyBUT0RPIGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHRoaXMgYXMgdGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgYXMgd2VsbCBhcyAzMHB4XG4gICAgc3Ryb2tlID0gKHdpZHRoICogaGVpZ2h0IC8gMTAwMDAwMCkudG9TdHJpbmcoKTtcbiAgfVxuICBlbHNlIHtcbiAgICBzdHJva2UgPSAnMzBweCc7XG4gIH1cbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnLm5jLCAuY3VzdG9zLCAuY2xlZiwgLmFjY2lkJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhpZ2hsaWdodCBlYWNoIHN0YWZmIGEgZGlmZmVyZW50IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RhZmZIaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3RhZmYnKSkgYXMgU1ZHR0VsZW1lbnRbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZkNvbG9yID0gQ29sb3JQYWxldHRlW2kgJSBDb2xvclBhbGV0dGUubGVuZ3RoXTtcbiAgICBoaWdobGlnaHQoc3RhdmVzW2ldLCBzdGFmZkNvbG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDb2x1bW5IaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0ICBncm91cHM6IHsgW2tleTogbnVtYmVyXTogU1ZHR0VsZW1lbnRbXSB9ID0ge307XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBjb25zdCBoYXNDb2x1bW4gPSBBcnJheS5mcm9tKHN0YWZmLmNsYXNzTGlzdCkuam9pbignICcpLm1hdGNoKC9cXGJjb2x1bW4oXFxkKylcXGIvKTtcbiAgICBsZXQgY29sdW1uTnVtID0gMDtcbiAgICBpZiAoaGFzQ29sdW1uKSB7XG4gICAgICBjb2x1bW5OdW0gPSBwYXJzZUludChoYXNDb2x1bW5bMV0sIDEwKSAtIDE7XG4gICAgfVxuXG4gICAgaWYgKCFncm91cHNbY29sdW1uTnVtXSkge1xuICAgICAgZ3JvdXBzW2NvbHVtbk51bV0gPSBbXTtcbiAgICB9XG5cbiAgICBncm91cHNbY29sdW1uTnVtXS5wdXNoKHN0YWZmIGFzIFNWR0dFbGVtZW50KTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29sdW1uLCBzdGF2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICBjb25zdCBjb2xvciA9IENvbG9yUGFsZXR0ZVtOdW1iZXIoY29sdW1uKSAlIENvbG9yUGFsZXR0ZS5sZW5ndGhdO1xuICAgIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgICBoaWdobGlnaHQoc3RhZmYsIGNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSBoaWdobGlnaHQgYnkgYSBkaWZmZXJlbnQgZ3JvdXBpbmcuXG4gKiBAcGFyYW0gZ3JvdXBpbmcgLSBFaXRoZXIgXCJzdGFmZlwiLCBcInN5bGxhYmxlXCIsIFwibmV1bWVcIiwgXCJzZWxlY3Rpb25cIiwgb3IgXCJsYXllckVsZW1lbnRcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdyb3VwaW5nSGlnaGxpZ2h0KGdyb3VwaW5nOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpO1xuICBpZiAoZ3JvdXBpbmcgPT09ICdzdGFmZicpIHtcbiAgICBzZXRTdGFmZkhpZ2hsaWdodCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBlbHNlIGlmIChncm91cGluZyA9PT0gJ2NvbHVtbicpIHtcbiAgICBzZXRDb2x1bW5IaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH0gXG4gIGVsc2UgaWYgKGdyb3VwaW5nID09PSAnc2VsZWN0aW9uJykge1xuICAgIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VsLWJ5LmlzLWFjdGl2ZScpLmlkO1xuICAgIHN3aXRjaCAodGVtcCkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgICBncm91cGluZyA9ICdzeWxsYWJsZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlDb2x1bW4nOlxuICAgICAgICBncm91cGluZyA9ICdjb2x1bW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBncm91cGluZyA9ICdzdGFmZic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlMYXllckVsZW1lbnQnOlxuICAgICAgICBncm91cGluZyA9ICdsYXllckVsZW1lbnQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZ3JvdXBpbmcgPSAnbmV1bWUnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXBpbmcpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZ3JvdXBzO1xuXG4gIGlmIChncm91cGluZyA9PSAnbGF5ZXJFbGVtZW50Jykge1xuICAgIGdyb3VwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hY2NpZCwgLmNsZWYsIC5jdXN0b3MsIC5kaXZMaW5lJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ3JvdXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShncm91cGluZykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD47XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmMsIC5jdXN0b3MsIC5jbGVmLCAuYWNjaWQsIC5kaXZMaW5lJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gIH0pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZ3JvdXBDb2xvciA9IENvbG9yUGFsZXR0ZVtpICUgQ29sb3JQYWxldHRlLmxlbmd0aF07XG4gICAgaWYgKChncm91cHNbaV0uY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpICYmICFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBncm91cHNbaV0uc2V0QXR0cmlidXRlKCdmaWxsJywgZ3JvdXBDb2xvcik7XG4gICAgICBjb25zdCByZWN0cyA9IGdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+O1xuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdCkge1xuICAgICAgICBpZiAocmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gZ3JvdXBDb2xvcjtcbiAgICAgIH0pO1xuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICBncm91cHNbaV0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKHJlY3QgPT4ge1xuICAgICAgICByZWN0LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2QwMCcpO1xuICAgICAgfVxuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGl2TGluZUNoaWxkcmVuID0gZ3JvdXBzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJyk7XG4gICAgaWYgKGRpdkxpbmVDaGlsZHJlbikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaXZMaW5lQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGl2TGluZUNoaWxkcmVuW2pdLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgZ3JvdXBDb2xvcik7XG4gICAgICAgIGRpdkxpbmVDaGlsZHJlbltqXS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxufVxuIiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdHJpbmdpZnkvcGFyc2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3Qgb3BlcmF0ZVxuICogcmVjdXJzaXZlbHksIHNvIHRoZXkgYXZvaWQgY2FsbCBzdGFjayBleGNlZWRlZFxuICogZXJyb3JzLlxuICovXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpbnB1dCkge1xuICB2YXIgcXVldWUgPSBbXTtcbiAgcXVldWUucHVzaCh7b2JqOiBpbnB1dH0pO1xuXG4gIHZhciByZXMgPSAnJztcbiAgdmFyIG5leHQsIG9iaiwgcHJlZml4LCB2YWwsIGksIGFycmF5UHJlZml4LCBrZXlzLCBrLCBrZXksIHZhbHVlLCBvYmpQcmVmaXg7XG4gIHdoaWxlICgobmV4dCA9IHF1ZXVlLnBvcCgpKSkge1xuICAgIG9iaiA9IG5leHQub2JqO1xuICAgIHByZWZpeCA9IG5leHQucHJlZml4IHx8ICcnO1xuICAgIHZhbCA9IG5leHQudmFsIHx8ICcnO1xuICAgIHJlcyArPSBwcmVmaXg7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmVzICs9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICByZXMgKz0gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgcmVzICs9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcXVldWUucHVzaCh7dmFsOiAnXSd9KTtcbiAgICAgIGZvciAoaSA9IG9iai5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhcnJheVByZWZpeCA9IGkgPT09IDAgPyAnJyA6ICcsJztcbiAgICAgICAgcXVldWUucHVzaCh7b2JqOiBvYmpbaV0sIHByZWZpeDogYXJyYXlQcmVmaXh9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ1snfSk7XG4gICAgfSBlbHNlIHsgLy8gb2JqZWN0XG4gICAgICBrZXlzID0gW107XG4gICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICBrZXlzLnB1c2goayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ30nfSk7XG4gICAgICBmb3IgKGkgPSBrZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIG9ialByZWZpeCA9IChpID4gMCA/ICcsJyA6ICcnKTtcbiAgICAgICAgb2JqUHJlZml4ICs9IEpTT04uc3RyaW5naWZ5KGtleSkgKyAnOic7XG4gICAgICAgIHF1ZXVlLnB1c2goe29iajogdmFsdWUsIHByZWZpeDogb2JqUHJlZml4fSk7XG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKHt2YWw6ICd7J30pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoZSBwYXJzZSBmdW5jdGlvbi5cbi8vIFRoaXMgcG9wIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbVxuLy8gcG91Y2hDb2xsYXRlLnBhcnNlSW5kZXhhYmxlU3RyaW5nXG5mdW5jdGlvbiBwb3Aob2JqLCBzdGFjaywgbWV0YVN0YWNrKSB7XG4gIHZhciBsYXN0TWV0YUVsZW1lbnQgPSBtZXRhU3RhY2tbbWV0YVN0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgIC8vIHBvcHBpbmcgYSBtZXRhLWVsZW1lbnQsIGUuZy4gYW4gb2JqZWN0IHdob3NlIHZhbHVlIGlzIGFub3RoZXIgb2JqZWN0XG4gICAgbWV0YVN0YWNrLnBvcCgpO1xuICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gIH1cbiAgdmFyIGVsZW1lbnQgPSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudDtcbiAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudC5wdXNoKG9iaik7XG4gIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICB2YXIga2V5ID0gc3RhY2sucG9wKCk7XG4gICAgZWxlbWVudFtrZXldID0gb2JqO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gob2JqKTsgLy8gb2JqIHdpdGgga2V5IG9ubHlcbiAgfVxufVxuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG1ldGFTdGFjayA9IFtdOyAvLyBzdGFjayBmb3IgYXJyYXlzIGFuZCBvYmplY3RzXG4gIHZhciBpID0gMDtcbiAgdmFyIGNvbGxhdGlvbkluZGV4LHBhcnNlZE51bSxudW1DaGFyO1xuICB2YXIgcGFyc2VkU3RyaW5nLGxhc3RDaCxudW1Db25zZWN1dGl2ZVNsYXNoZXMsY2g7XG4gIHZhciBhcnJheUVsZW1lbnQsIG9iakVsZW1lbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29sbGF0aW9uSW5kZXggPSBzdHJbaSsrXTtcbiAgICBpZiAoY29sbGF0aW9uSW5kZXggPT09ICd9JyB8fFxuICAgICAgICBjb2xsYXRpb25JbmRleCA9PT0gJ10nIHx8XG4gICAgICAgIHR5cGVvZiBjb2xsYXRpb25JbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLnBvcCgpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoY29sbGF0aW9uSW5kZXgpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnXFx0JzpcbiAgICAgIGNhc2UgJ1xcbic6XG4gICAgICBjYXNlICc6JzpcbiAgICAgIGNhc2UgJywnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ24nOlxuICAgICAgICBpICs9IDM7IC8vICd1bGwnXG4gICAgICAgIHBvcChudWxsLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgaSArPSAzOyAvLyAncnVlJ1xuICAgICAgICBwb3AodHJ1ZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZic6XG4gICAgICAgIGkgKz0gNDsgLy8gJ2Fsc2UnXG4gICAgICAgIHBvcChmYWxzZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMCc6XG4gICAgICBjYXNlICcxJzpcbiAgICAgIGNhc2UgJzInOlxuICAgICAgY2FzZSAnMyc6XG4gICAgICBjYXNlICc0JzpcbiAgICAgIGNhc2UgJzUnOlxuICAgICAgY2FzZSAnNic6XG4gICAgICBjYXNlICc3JzpcbiAgICAgIGNhc2UgJzgnOlxuICAgICAgY2FzZSAnOSc6XG4gICAgICBjYXNlICctJzpcbiAgICAgICAgcGFyc2VkTnVtID0gJyc7XG4gICAgICAgIGktLTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBudW1DaGFyID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKC9bXFxkXFwuXFwtZVxcK10vLnRlc3QobnVtQ2hhcikpIHtcbiAgICAgICAgICAgIHBhcnNlZE51bSArPSBudW1DaGFyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKHBhcnNlRmxvYXQocGFyc2VkTnVtKSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnXCInOlxuICAgICAgICBwYXJzZWRTdHJpbmcgPSAnJztcbiAgICAgICAgbGFzdENoID0gdm9pZCAwO1xuICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNoID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKGNoICE9PSAnXCInIHx8IChsYXN0Q2ggPT09ICdcXFxcJyAmJlxuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgJSAyID09PSAxKSkge1xuICAgICAgICAgICAgcGFyc2VkU3RyaW5nICs9IGNoO1xuICAgICAgICAgICAgbGFzdENoID0gY2g7XG4gICAgICAgICAgICBpZiAobGFzdENoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgbnVtQ29uc2VjdXRpdmVTbGFzaGVzKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKEpTT04ucGFyc2UoJ1wiJyArIHBhcnNlZFN0cmluZyArICdcIicpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdbJzpcbiAgICAgICAgYXJyYXlFbGVtZW50ID0geyBlbGVtZW50OiBbXSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKGFycmF5RWxlbWVudC5lbGVtZW50KTtcbiAgICAgICAgbWV0YVN0YWNrLnB1c2goYXJyYXlFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd7JzpcbiAgICAgICAgb2JqRWxlbWVudCA9IHsgZWxlbWVudDoge30sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChvYmpFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChvYmpFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3VuZXhwZWN0ZWRseSByZWFjaGVkIGVuZCBvZiBpbnB1dDogJyArIGNvbGxhdGlvbkluZGV4KTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgRHJhZ0FjdGlvbiwgRWRpdG9yQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQkJveCwgaXNPdXRPZlNWR0JvdW5kcywgZ2V0R2x5cGhCQm94IH0gZnJvbSAnLi9Db29yZGluYXRlcyc7XG5pbXBvcnQgeyBxdWV1ZU5vdGlmaWNhdGlvbiB9IGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IHNlbGVjdEFsbCwgc2VsZWN0QkJveCwgc2VsZWN0U3RhZmYgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuY2xhc3MgRHJhZ0hhbmRsZXIge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHByaXZhdGUgc2VsZWN0b3I6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3Rpb246IFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuICBwcml2YXRlIG5vTW92ZVByZWNlZGVzOiBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBwcml2YXRlIGRyYWdTdGFydENvb3JkczogW251bWJlciwgbnVtYmVyXSA9IFstMSwgLTFdO1xuICBwcml2YXRlIHJlc2V0VG9BY3Rpb246IChzZWxlY3Rpb246IGQzLlNlbGVjdGlvbjxkMy5CYXNlVHlwZSwgdW5rbm93biwgSFRNTEVsZW1lbnQsIHVua25vd24+LCBhcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBkeDogbnVtYmVyO1xuICBwcml2YXRlIGR5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIENTUyBzZWxlY3RvciBvZiBlbGVtZW50IHRvIGFwcGx5IGRyYWcgaGFuZGxlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGRyYWdnaW5nIGFjdGlvbiBhbmQgaGFuZGxlciBmb3Igc2VsZWN0ZWQgZWxlbWVudHMuXG4gICAqL1xuICBkcmFnSW5pdCAoKTogdm9pZCB7XG4gICAgLy8gRHJhZyBlZmZlY3RzXG4gICAgZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQgKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnU3RhcnRDb29yZHMgPSBbZDMuZXZlbnQueCwgZDMuZXZlbnQueV07XG4gICAgICB0aGlzLmR4ID0gMDtcbiAgICAgIHRoaXMuZHkgPSAwO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZDMuZXZlbnQuc291cmNlRXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwoZHJhZ0JlaGF2aW91cik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkaW5nIGxpc3RlbmVyc1xuICAgIGNvbnN0IGRyYWdCZWhhdmlvdXIgPSBkMy5kcmFnKClcbiAgICAgIC5vbignc3RhcnQnLCBkcmFnU3RhcnRlZC5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdkcmFnJywgdGhpcy5kcmFnZ2luZy5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdlbmQnLCB0aGlzLmRyYWdFbmRlZC5iaW5kKHRoaXMpKTtcblxuICAgIGNvbnN0IGFjdGl2ZU5jID0gZDMuc2VsZWN0QWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBhY3RpdmVOYy5jYWxsKGRyYWdCZWhhdmlvdXIpO1xuXG4gICAgbGV0IHNlbGVjdGlvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcuc2VsZWN0ZWQnKSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBkcmFncyB0aGUgZm9sbG93cyBzeWxsYWJsZSBpbiBhIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUsIFxuICAgIC8vIGNhbmNlbCB0aGUgY29tcGVuc2F0aW9uIGZvciBzeWwgbW92ZW1lbnQgaW4gZHJhZ2dpbmcuXG4gICAgdGhpcy5ub01vdmVQcmVjZWRlcyA9IHNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpICYmIGVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykpO1xuICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maWx0ZXIoZWwgPT4gIWVsLmNsYXNzTGlzdC5jb250YWlucygnbm8tbW92aW5nJykpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24uY29uY2F0KEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcucmVzaXplUG9pbnQnKSkpO1xuICB9XG5cbiAgZHJhZ2dpbmcgKCk6IHZvaWQge1xuICAgIHRoaXMuZHggPSBkMy5ldmVudC54IC0gdGhpcy5kcmFnU3RhcnRDb29yZHNbMF07XG4gICAgdGhpcy5keSA9IGQzLmV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydENvb3Jkc1sxXTtcblxuICAgIHRoaXMubW92ZUVsZW1lbnRzKHRoaXMuc2VsZWN0aW9uLCB0aGlzLmR4LCB0aGlzLmR5KTtcblxuICAgIC8qXG4gICAgICogaWYgd2UncmUgZHJhZ2dpbmcgYSBzeWxsYWJsZSAob3IgbmV1bWUgZXRjKSB0aGVuIHRoZXJlIHdvbid0IGJlIGEgc3lsIHNlbGVjdGVkXG4gICAgICogdGhlbiB3ZSBkb24ndCB3YW50IHRoZSBib3VuZGluZyBib3ggKGlmIGl0IGlzIGRpc3BsYXllZCkgdG8gbW92ZSB3aGVuIGRyYWdnaW5nIHRoZSBuZXVtZXNcbiAgICAgKiBpdCB3aWxsIGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQgaW4gc2VsZWN0aW9uLCBzbyBpdCB3aWxsIGdldCBtb3ZlZCBpbiB0aGUgYWJvdmUgbG9vcFxuICAgICAqIHNvIHdlIGNhbmNlbCB0aGF0IG1vdmVtZW50IG91dCBoZXJlXG4gICAgICovXG4gICAgY29uc3Qgc3lscyA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoZWwpID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpO1xuICAgIGlmIChzeWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLm5vTW92ZVByZWNlZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMubW92ZUVsZW1lbnRzKGJib3hlcywgLXRoaXMuZHgsIC10aGlzLmR5KTtcbiAgICB9XG4gIH1cblxuXG4gIGRyYWdFbmRlZCAoKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBoYXMgbm90IGJlZW4gbW92ZWQgbW9yZSB0aGFuIDUgcGl4ZWxzIGluIGFueSBkaXJlY3Rpb24sXG4gICAgLy8gZG8gbm90IGRvIGFueSBhY3Rpb25cbiAgICBjb25zdCB4RGlmZiA9IE1hdGguYWJzKHRoaXMuZHgpLCB5RGlmZiA9IE1hdGguYWJzKHRoaXMuZHkpO1xuICAgIGlmICh4RGlmZiA8PSA1ICYmIHlEaWZmIDw9IDUpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuZHJhZ0luaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgc2VsZWN0aW9uIGZvciBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpKTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIG91dCBvZiBib3VuZHMsXG4gICAgLy8gZHJhZyBhY3Rpb25zIHNob3VsZCBub3QgaGFwcGVuLiBSZXR1cm4gYW4gZXJyb3Igbm90aWZpY2F0aW9uIGFuZCByZXNldFxuICAgIC8vIHRoZSBkcmFnIGhhbmRsZXJcbiAgICBpZiAodGhpcy5pc0N1cnNvck91dE9mQm91bmRzKCkgfHwgdGhpcy5pc0RyYWdPdXRPZkJvdW5kcyhzZWxlY3Rpb24pKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIHNlbGVjdGlvbiBiYWNrIHRvIG5vcm1hbCBzdGF0ZVxuICAgICAgdGhpcy5yZXR1cm5FbGVtZW50cyh0aGlzLnNlbGVjdGlvbik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgYm91bmRpbmcgYm94ZXMgYXMgd2VsbFxuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMucmV0dXJuRWxlbWVudHMoYmJveGVzKTtcblxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIERyYWcgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNoYWluIGVkaXRvciBhY3Rpb24gZm9yIHNlbGVjdGlvblxuICAgIGNvbnN0IHBhcmFtQXJyYXk6IEVkaXRvckFjdGlvbltdID0gW107XG4gICAgc2VsZWN0aW9uLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGVsLnRhZ05hbWUgPT09ICdyZWN0JyA/IGVsLmNsb3Nlc3QoJy5zeWwnKS5pZCA6IGVsLmlkO1xuXG4gICAgICBjb25zdCBkcmFnQWN0aW9uOiBEcmFnQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdkcmFnJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHg6IHRoaXMuZHgsXG4gICAgICAgICAgeTogLXRoaXMuZHksXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHBhcmFtQXJyYXkucHVzaChkcmFnQWN0aW9uKTtcbiAgICB9KTtcbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgIHBhcmFtOiBwYXJhbUFycmF5XG4gICAgfTtcblxuICAgIC8vIFNlbmQgZWRpdG9yIGFjdGlvblxuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE5lb24gcmUtcmVuZGVycyB0aGUgZW50aXJlIFNWRywgYW5kIGhlbmNlLCBiZWZvcmUgd2UgZG8gc28sXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgYWxsIHRoZSBlbGVtZW50cyAoSURzKSB3ZSBuZWVkIHRvIHNlbGVjdCBhZ2FpblxuICAgICAgICAvLyBUaGVuLCB3ZSBuZWVkIHRvIHJlc2VsZWN0IHRoZW0gYnkgY2FsbGluZyBgdGhpcy5yZXNlbGVjdCgpYFxuICAgICAgICBjb25zdCB0b1Jlc2VsZWN0ID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKSlcbiAgICAgICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpKVxuICAgICAgICAgIC5tYXAoZWwgPT4gZWwuaWQpO1xuXG4gICAgICAgIC8vIENBVVRJT046IGB1cGRhdGVGb3JDdXJyZW50UGFnZSgpYCBpcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24hXG4gICAgICAgIC8vIEl0IHJlcXVpcmVzIGFuIGBhd2FpdGAga2V5d29yZC5cbiAgICAgICAgYXdhaXQgdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLmVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIC8vIFJlc2VsZWN0IHRoZSBlbGVtZW50cyBhbmQgcmVpbml0aWFsaXplIGRyYWdcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNlbGVjdCh0b1Jlc2VsZWN0KTtcbiAgICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyByZXNlbGVjdCAodG9SZXNlbGVjdDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNlbGVjdGVkID0gdG9SZXNlbGVjdC5tYXAoaWQgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxTVkdHcmFwaGljc0VsZW1lbnQ+KGAjJHtpZH1gKSk7XG5cbiAgICAvLyBBbGwgZ2x5cGhzIGV4Y2VwdCBib3VkaW5nIGJveGVzICgnc3lsJ3MpIG11c3QgYmUgc2VsZWN0ZWQgd2l0aFxuICAgIC8vIGBzZWxlY3RBbGwoKWBcbiAgICByZXNlbGVjdGVkXG4gICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKVxuICAgICAgLmZvckVhY2goYXN5bmMgKCkgPT4gYXdhaXQgc2VsZWN0QWxsKHJlc2VsZWN0ZWQsIHRoaXMubmVvblZpZXcsIHRoaXMpKTtcblxuICAgIC8vIEJvdW5kaW5nIGJveGVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0QkJveCgpYFxuICAgIHJlc2VsZWN0ZWRcbiAgICAgIC5maWx0ZXIoZWwgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSlcbiAgICAgIC5mb3JFYWNoKFxuICAgICAgICBlbCA9PiBzZWxlY3RCQm94KGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIHRoaXMsIHRoaXMubmVvblZpZXcpXG4gICAgICApO1xuXG4gICAgLy8gU3RhdmVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0U3RhZmYoKWBcbiAgICAvLyBBTkQgbXVzdCBiZSBzZWxlY3RlZCB3aXRoIGBzZWxlY3RBbGwoKWAgZm9yIGNvcnJlY3QgYmVoYXZpb3IgKGZvciBzb21lIHJlYXNvbikuXG4gICAgcmVzZWxlY3RlZFxuICAgICAgLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpXG4gICAgICAuZm9yRWFjaChlbCA9PiBzZWxlY3RTdGFmZihlbCwgdGhpcykpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZDMgYWN0aW9uIHRvIHVzZSBmb3IgW1tyZXNldF1dLiAqL1xuICByZXNldFRvIChyZXNldDogKHNlbGVjdGlvbjogZDMuU2VsZWN0aW9uPGQzLkJhc2VUeXBlLCB1bmtub3duLCBIVE1MRWxlbWVudCwgdW5rbm93bj4sIGFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRUb0FjdGlvbiA9IHJlc2V0O1xuICB9XG5cbiAgLyoqIFJlc2V0IHRvIGEgcHJldmlvdXMgZDMgYWN0aW9uIGZvciBbW3RoaXMuc2VsZWN0b3JdXS4gKi9cbiAgcmVzZXQgKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2V0VG9BY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwodGhpcy5yZXNldFRvQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBlbmRPcHRpb25zU2VsZWN0aW9uICgpOiB2b2lkIHtcbiAgICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICAgIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgICBpZiAobW9yZUVkaXQpIHtcbiAgICAgIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhRWRpdCkge1xuICAgICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZXh0cmFFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc3VhbGx5IG1vdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGJ5IGBkeGAgYW5kIGBkeWA7IChub3QgdXNpbmcgZDMpXG4gICAqL1xuICBtb3ZlRWxlbWVudHMgKHNlbGVjdGlvbjogRWxlbWVudFtdLCBkeDogbnVtYmVyLCBkeTogbnVtYmVyKTogdm9pZCB7XG4gICAgc2VsZWN0aW9uLmZpbHRlcihlbCA9PiBlbCAhPT0gbnVsbCkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2R4fSwke2R5fSlgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXN1YWxseSByZXR1cm4gc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgcG9zaXRpb25zXG4gICAqIGJ5IHJlbW92aW5nIHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlXG4gICAqL1xuICByZXR1cm5FbGVtZW50cyAoc2VsZWN0aW9uOiBFbGVtZW50W10pOiB2b2lkIHtcbiAgICBzZWxlY3Rpb24uZmlsdGVyKGVsID0+IGVsICE9PSBudWxsKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ3Vyc29yT3V0T2ZCb3VuZHMgKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVuZFggPSB0aGlzLmRyYWdTdGFydENvb3Jkc1swXSArIHRoaXMuZHg7XG4gICAgY29uc3QgZW5kWSA9IHRoaXMuZHJhZ1N0YXJ0Q29vcmRzWzFdICsgdGhpcy5keTtcblxuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKGVuZFgsIGVuZFkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBTVkdcbiAgICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnRbXX0gc2VsZWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJcyBzZWxlY3Rpb24gb3V0IG9mIGJvdW5kc1xuICAgKi9cbiAgaXNEcmFnT3V0T2ZCb3VuZHMgKHNlbGVjdGlvbjogU1ZHR3JhcGhpY3NFbGVtZW50W10pOiBib29sZWFuIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIGJveGVzIG9mIGFsbCBnbHlwaHMgKDx1c2U+IGVsZW1lbnRzKSB3aXRoaW4gdGhlIHNlbGVjdGlvbiBhcnJheVxuICAgIGNvbnN0IGlzQkJveERpc3BsYXllZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNkaXNwbGF5QkJveCcpLmNoZWNrZWQ7XG4gICAgbGV0IGdseXBoU2VsZWN0b3IgPSBpc0JCb3hEaXNwbGF5ZWQgPyAndXNlLCByZWN0JyA6ICd1c2UnO1xuXG4gICAgaWYgKHNlbGVjdGlvblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIGdseXBoU2VsZWN0b3IgPSAncGF0aCc7XG5cbiAgICBjb25zdCBnbHlwaHM6IFNWR1VzZUVsZW1lbnRbXSA9IHNlbGVjdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjLCBlbCkgPT4gYWNjLmNvbmNhdCguLi5lbC5xdWVyeVNlbGVjdG9yQWxsKGdseXBoU2VsZWN0b3IpKSwgW11cbiAgICApO1xuICAgIGNvbnN0IGdseXBoQkJveGVzOiBCQm94W10gPSBnbHlwaHMubWFwKGdldEdseXBoQkJveCk7XG5cbiAgICAvLyBHZXQgdGhlIHN1cnJvdW5kaW5nIGJvdW5kaW5nIGJveCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb25CQm94OiBCQm94ID0gZ2x5cGhCQm94ZXMucmVkdWNlKFxuICAgICAgKGJib3gsIGN1cnIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bHg6IE1hdGgubWluKGJib3gudWx4LCBjdXJyLnVseCksXG4gICAgICAgICAgdWx5OiBNYXRoLm1pbihiYm94LnVseSwgY3Vyci51bHkpLFxuICAgICAgICAgIGxyeDogTWF0aC5tYXgoYmJveC5scngsIGN1cnIubHJ4KSxcbiAgICAgICAgICBscnk6IE1hdGgubWF4KGJib3gubHJ5LCBjdXJyLmxyeSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB1bHg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIHVseTogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbHJ4OiBOdW1iZXIuTUlOX1ZBTFVFLFxuICAgICAgICBscnk6IE51bWJlci5NSU5fVkFMVUUsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgdWx4LCB1bHksIGxyeCwgbHJ5IH0gPSBzZWxlY3Rpb25CQm94O1xuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKHVseCArIHRoaXMuZHgsIHVseSArIHRoaXMuZHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4ICsgdGhpcy5keCwgbHJ5ICsgdGhpcy5keSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRHJhZ0hhbmRsZXIgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgKiBhcyBXYXJuaW5ncyBmcm9tICcuLi9XYXJuaW5ncyc7XG5pbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCAqIGFzIFNlbGVjdFRvb2xzIGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFRvZ2dsZUxpZ2F0dXJlQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgcmVtb3ZlSGFuZGxlciwgZGVsZXRlQnV0dG9uSGFuZGxlciB9IGZyb20gJy4vU2VsZWN0T3B0aW9ucyc7XG5cbi8qKlxuICogVGhlIE5lb25WaWV3IHBhcmVudCB0byBhY2Nlc3MgZWRpdG9yIGFjdGlvbnMuXG4gKi9cbmxldCBuZW9uVmlldzogTmVvblZpZXc7XG5cbi8qKlxuICogU2V0IHRoZSBuZW9uVmlldyBtZW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TmVvblZpZXcodmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgbmVvblZpZXcgPSB2aWV3O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGNhbiBiZSBncm91cGVkIG9yIG5vdFxuICogQHJldHVybnMgdHJ1ZSBpZiBjYW4gYmUgZ3JvdXBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyb3VwYWJsZShcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGVsZW1lbnRzLnZhbHVlcygpKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBpZiAoZ3JvdXBzLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBjYW5ub3QgZ3JvdXAgaWYgb25seSAxIGVsZW1lbnQgaXMgc2VsZWN0ZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIC8vIGlmIG5ldW1lcyBhcmUgaW4gc2FtZSBzeWxsYWJsZSwgZG9uJ3QgZGlzcGxheSBncm91cGluZyBvcHRpb25cbiAgICAgIGlmIChTZWxlY3RUb29scy5zaGFyZWRMb2dpY2FsUGFyZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlclxuICAgICAgaWYgKFNlbGVjdFRvb2xzLmFyZUFkamFjZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0xpbmtlZChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50cz86IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pIHtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gIH1cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSB8fFxuICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5jJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnVGhlIGFjdGlvbiBpbnZvbHZlcyBsaW5rZWQgc3lsbGFibGVzLCBwbGVhc2UgdW50b2dnbGUgdGhlbSBmaXJzdCcsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZShcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElOR1xuICAgICkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBlbGVtZW50cy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgY29uc3Qgc3lsbGFibGUgPSBlbGVtZW50cy5hdChpZHgpO1xuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAvLyBHZXQgeG1sOmlkIG9mIHRoZSBuZXh0IHN5bGxhYmxlICh3aXRob3V0IHRoZSAjLCBpZiBpdCBleGlzdHMpXG4gICAgICBjb25zdCBuZXh0U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgIC5yZXBsYWNlKCcjJywgJycpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBuZXh0IHN5bGxhYmxlIGFuZCBpdHMgaW5kZXggaW4gdGhlIGFycmF5XG4gICAgICBsZXQgbmV4dFN5bGxhYmxlSWR4OiBudW1iZXI7XG4gICAgICBjb25zdCBuZXh0U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT09IG5leHRTeWxsYWJsZUlkKSB7XG4gICAgICAgICAgbmV4dFN5bGxhYmxlSWR4ID0gaWR4O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgbmV4dCAoZm9sbG93aW5nKSBzeWxsYWJsZSBjYW5ub3QgYmUgZm91bmRcbiAgICAgIGlmICghbmV4dFN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIG5leHQgc3lsbGFibGUgaGFzIGJlZW4gZm91bmQsIGJ1dCB0aGUgQGZvbGxvd3MgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIW5leHRTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgbmV4dCBzeWxsYWJsZSdzIEBmb2xsb3dzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKG5leHRTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykgIT0gJyMnICsgc3lsbGFibGUuaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiA0OlxuICAgICAgLy8gU2luY2UgdGhlIEBmb2xsb3dzIHZhbHVlIGlzIGNvcnJlY3QsIGEgcGFpciBvZiBzeWxsYWJsZXMgZXhpc3QgZm9yIHRoZSB0b2dnbGUtbGlua2VkIHN5bGxhYmxlLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIEBmb2xsb3dzIHN5bGxhYmxlIGlzIHRoZSBuZXh0IHN5bGxhYmxlIChpbmRleC13aXNlKSBpbiB0aGUgYXJyYXk6XG4gICAgICBpZiAobmV4dFN5bGxhYmxlSWR4ICE9PSBpZHggKyAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpKSB7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJylcbiAgICAgICAgLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKFxuICAgICAgICAoc3lsbGFibGUpID0+IHN5bGxhYmxlLmlkID09PSBwcmV2U3lsbGFibGVJZCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIHByZXZpb3VzIHN5bGxhYmxlIGV4aXN0cywgYnV0IHRoZSBAcHJlY2VkZXMgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIXByZXZTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMzogVGhlIHByZXZpb3VzIHN5bGxhYmxlJ3MgQHByZWNlZGVzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKHByZXZTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICE9ICcjJyArIHN5bGxhYmxlLmlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaXMgYSBzZWxlY3Rpb24gb2YgZWxlbWVudHMgaXMgYWxyZWFkeSBsaW5rZWRcbiAqIEBwYXJhbSBlbGVtZW50cyBlbGVtZW50cyB0byBiZSBjb25zaWRlcmVkXG4gKiBAcmV0dXJucyB0cnVlIGlzIGxpbmtlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtlZChlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pik6IGJvb2xlYW4ge1xuICAvLyBldmVyeSBlbGVtZW50IHNob3VsZCBiZSBsaW5rZWRcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKFxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSAmJlxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEFzc3VtaW5nIGFsbCBlbGVtZW50cyBhcmUgdmFsaWQsXG4gKiBjaGVjayBpZiB0aGUgZWxlbWVudHMgY2FuIGJlIGxpbmtlZDpcbiAqIDEuIHNvcnQgZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgb3JkZXIgaW4gdGhlIERPTVxuICogMi4gZW5zdXJlIGVsZW1lbnRzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gKiAzLiBlbnN1cmUgZWxlbWVudHMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICogNC4gY2hlY2sgaWYgY2FuIGJlIGxpbmtlZDpcbiAqICAgIDQuMSBpZiBleGFjdGx5IHR3byBlbGVtZW50cywgYm90aCBuZWVkcyB0byBiZSB1bmxpbmtlZFxuICogICAgNC4yIGlmIG1vcmUgdGhhbiB0d28gZWxlbWVudHMsIG9ubHkgb25lIGVsZW1lbnQgY2FuIGJlIHVubGlua2VkLFxuICogICAgICAgIGF0IGVpdGhlciBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBzZXF1ZW5jZVxuICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEByZXR1cm5zIHRydWUgY2FuIGJlIGxpbmtlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuQmVMaW5rZWQoZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4pOiBib29sZWFuIHtcbiAgLy8gMS4gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZScpKTtcblxuICAvLyAyLiBFbnN1cmUgc3lsbGFibGVzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IG5leHQgPSBlbGVtZW50c1tpICsgMV07XG4gICAgY29uc3QgY3VycmVudFN5bGxhYmxlSW5kZXggPSBzeWxsYWJsZXMuaW5kZXhPZihjdXJyZW50KTtcbiAgICBjb25zdCBuZXh0U3lsbGFibGVJbmRleCA9IHN5bGxhYmxlcy5pbmRleE9mKG5leHQpO1xuICAgIGlmIChuZXh0U3lsbGFibGVJbmRleCAtIGN1cnJlbnRTeWxsYWJsZUluZGV4ICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIFN0YXZlcyBtdXN0IGJlIGFkamFjZW50XG4gICAgfVxuICAgIC8vIDMuIEVuc3VyZSBzeWxsYWJsZXMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICAgIGNvbnN0IGN1cnJlbnRTdGFmZiA9IGN1cnJlbnQuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgY29uc3QgbmV4dFN0YWZmID0gbmV4dC5jbG9zZXN0KCcuc3RhZmYnKTtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGFmZkluZGV4ID0gc3RhdmVzLmluZGV4T2YoY3VycmVudFN0YWZmIGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0U3RhZmZJbmRleCA9IHN0YXZlcy5pbmRleE9mKG5leHRTdGFmZiBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKG5leHRTdGFmZkluZGV4IC0gY3VycmVudFN0YWZmSW5kZXggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gU3RhdmVzIG11c3QgYmUgYWRqYWNlbnRcbiAgICB9XG4gIH1cblxuICAvLyA0LjEgSGFuZGxlIGNhc2UgZm9yIGV4YWN0bHkgdHdvIHN5bGxhYmxlc1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmV2ZXJ5KFxuICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiZcbiAgICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpLFxuICAgICk7XG4gIH1cblxuICAvLyA0LjIgSGFuZGxlIGNhc2UgZm9yIG1vcmUgdGhhbiB0d28gc3lsbGFibGVzXG4gIGNvbnN0IHVubGlua2VkRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW1lbnQpID0+XG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICYmXG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyksXG4gICk7XG5cbiAgaWYgKHVubGlua2VkRWxlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBPbmx5IG9uZSB1bmxpbmtlZCBzeWxsYWJsZSBpcyBhbGxvd2VkXG4gIH1cblxuICAvLyBUaGUgdW5saW5rZWQgc3lsbGFibGUgc2hvdWxkIGJlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kXG4gIGNvbnN0IGZpcnN0VW5saW5rZWQgPSB1bmxpbmtlZEVsZW1lbnRzWzBdO1xuXG4gIHJldHVybiAoXG4gICAgZWxlbWVudHMuaW5kZXhPZihmaXJzdFVubGlua2VkKSA9PT0gMCB8fFxuICAgIGVsZW1lbnRzLmluZGV4T2YoZmlyc3RVbmxpbmtlZCkgPT09IGVsZW1lbnRzLmxlbmd0aCAtIDFcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgY2FuIGJlIGxpbmtlZCBvciB1bmxpa25lZC5cbiAqIEBwYXJhbSBzZWxlY3Rpb25UeXBlIEN1cnJlbnQgc2VsZWN0aW9uIG1vZGUuIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gYmUgbGlua2VkXG4gKiBAcGFyYW0gZWxlbWVudHMgVGhlIGVsZW1lbnRzIHVuZGVyIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gbGluayBvciB1bi1saW5rIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2FibGUoXG4gIHNlbGVjdGlvblR5cGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gY2Fubm90IHRvZ2dsZSBsaW5rIGZvciBzeWxsYWJsZSBzZWxlY3Rpb24gaWYgbnVtYmVyIG9mIHNlbGVjdGVkXG4gIC8vIHN5bGxhYmxlcyBpcyBzbWFsbGVyIHRoYW4gMlxuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9ubHkgU3lsbGFibGVzIGNhbiBiZSBsaW5rZWQgb3IgdW5saW5rZWQgKD8pXG4gIGlmIChzZWxlY3Rpb25UeXBlICE9PSAnc2VsQnlTeWxsYWJsZScpIHJldHVybiBmYWxzZTtcblxuICAvLyBDaGVjayBpZiBoYXMgaW52YWxpZCBsaW5rZWQgc3lsbGFibGVzXG4gIGlmIChoYXNJbnZhbGlkTGlua2VkU3lsbGFibGUoZWxlbWVudHMpKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoZSBzZWxlY3RlZCBzeWxsYWJsZXMgaW5jbHVkZSBpbnZhbGlkIGxpbmtlZCBzeWxsYWJsZShzKSEnLFxuICAgICAgJ3dhcm5pbmcnLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaWYgQUxSRUFEWSBsaW5rZWRcbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGlmIENBTiBiZSBsaW5rZWRcbiAgZWxzZSBpZiAoY2FuQmVMaW5rZWQoZWxlbWVudHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VsZWN0ZWQgc3RhdmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVN0YXZlcygpOiB2b2lkIHtcbiAgY29uc3Qgc3lzdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGFmZi5zZWxlY3RlZCcpO1xuICBjb25zdCBlbGVtZW50SWRzID0gW107XG4gIHN5c3RlbXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBlbGVtZW50SWRzLnB1c2goc3RhZmYuaWQpO1xuICB9KTtcbiAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWVyZ2UnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWRzOiBlbGVtZW50SWRzLFxuICAgIH0sXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1N0YWZmIE1lcmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNZXJnZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBncm91cGluZyBzZWxlY3Rpb24gbWVudS5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIGdyb3VwaW5nIHR5cGU6IG5jLCBuZXVtZSwgc3lsLCBsaWdhdHVyZU5jLCBvciBsaWdhdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckdyb3VwaW5nKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICBtb3JlRWRpdC5pbm5lckhUTUwgKz0gQ29udGVudHMuZ3JvdXBpbmdNZW51W3R5cGVdO1xuICBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kR3JvdXBpbmdTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBUaGUgZ3JvdXBpbmcgZHJvcGRvd24gbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gIGNvbnN0IGRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUnKTtcbiAgZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG4gIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXJnZVN5bHMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGlmIChjb250YWluc0xpbmtlZChTZWxlY3RUb29scy5nZXRTZWxlY3Rpb25UeXBlKCkpKSByZXR1cm47XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5ldW1lcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGNvbnRhaW5zTGlua2VkKFNlbGVjdFRvb2xzLmdldFNlbGVjdGlvblR5cGUoKSkpIHJldHVybjtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRJZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5jcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpLmZpbHRlcigoZSkgPT5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduYycpLFxuICAgICAgKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZ3JvdXBOZXVtZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmdyb3VwTmNzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtbGlnYXR1cmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG5cbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBUb2dnbGVMaWdhdHVyZUFjdGlvbiA9IHtcbiAgICAgICAgICBhY3Rpb246ICd0b2dnbGVMaWdhdHVyZScsXG4gICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgbmVvblZpZXdcbiAgICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTGlnYXR1cmUgVG9nZ2xlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0xpZ2F0dXJlIFRvZ2dsZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWxpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG4vKipcbiAqIEdyb3VwaW5nL1VuZ3JvdXBpbmcga2V5YmluZGluZyBldmVudCBsaXN0ZW5lclxuICovXG5jb25zdCBrZXlkb3duTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICBpZiAoZS5rZXkgPT09ICdnJykge1xuICAgIC8vIGdldCBzZWxlY3RlZCBlbGVtZW50cyB0byBjaGVjayBpZiB0aGV5IGNhbiBiZSBncm91cGVkc1xuICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gU2VsZWN0VG9vbHMuZ2V0U2VsZWN0aW9uVHlwZSgpO1xuXG4gICAgaWYgKGNvbnRhaW5zTGlua2VkKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgLy8gR3JvdXAvbWVyZ2Ugb3IgdW5ncm91cC9zcGxpdCBiYXNlZCBvbiBzZWxlY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICAgIC8vIGlmIHN5bGxhYmxlcyBhcmUgbGlubmthYmxlLCB0b2dnbGUgbGlua2VkIHN5bGxhYmxlXG4gICAgICAgIC8vIGxpbmtlZCBzeWxsYWJsZXMgY2Fubm90IGJlIGdyb3VwZWQvdW5ncm91cGVkXG4gICAgICAgIGlmIChpc0xpbmthYmxlKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIGdyb3VwYWJsZSBiZWZvcmUgZ3JvdXBpbmdcbiAgICAgICAgZWxzZSBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCkuZmlsdGVyKChlKSA9PlxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduZXVtZScpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2FuIG9ubHkgdW5ncm91cCBpZiBsZW5ndGggaXMgMSAob25lIHN5bGxhYmxlIHNlbGVjdGVkKVxuICAgICAgICAvLyBjYW5ub3QgdW5ncm91cCBpZiBtdWx0aXBsZSBzeWxsYWJsZXMgYXJlIHNlbGVjdGVkXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgbWVyZ2VTdGF2ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTdGFmZlNwbGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBDYW4ndCBwZXJmb3JtIGdyb3VwaW5nL3VuZ3JvdXBpbmcgYWN0aW9uIG9uIHNlbGVjdGlvbiB0eXBlICR7c2VsZWN0aW9uVHlwZX0uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGb3JtIGFuZCBleGVjdXRlIGEgZ3JvdXAvdW5ncm91cCBhY3Rpb24uXG4gKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBleGVjdXRlLiBFaXRoZXIgXCJncm91cFwiIG9yIFwidW5ncm91cFwiLlxuICogQHBhcmFtIGdyb3VwVHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGdyb3VwLiBFaXRoZXIgXCJuZXVtZVwiIG9yIFwibmNcIi5cbiAqIEBwYXJhbSBlbGVtZW50SWRzIC0gVGhlIElEcyBvZiB0aGUgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdyb3VwaW5nQWN0aW9uKFxuICBhY3Rpb246ICdncm91cCcgfCAndW5ncm91cCcsXG4gIGdyb3VwVHlwZTogJ25ldW1lJyB8ICduYycsXG4gIGVsZW1lbnRJZHM6IHN0cmluZ1tdLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIHBhcmFtOiB7XG4gICAgICBncm91cFR5cGU6IGdyb3VwVHlwZSxcbiAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgfSxcbiAgfTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdncm91cCcpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignVW5ncm91cGluZyBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdVbmdyb3VwaW5nIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuXG4gICAgICAvLyBQcm9tcHQgdXNlciB0byBjb25maXJtIGlmIE5lb24gZG9lcyBub3QgcmUgY29nbml6ZSBjb250b3VyXG4gICAgICBpZiAoZ3JvdXBUeXBlID09PSAnbmMnKSB7XG4gICAgICAgIGNvbnN0IG5ldW1lUGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgZWxlbWVudElkc1swXSxcbiAgICAgICAgKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBuY3MgPSBBcnJheS5mcm9tKG5ldW1lUGFyZW50LmNoaWxkcmVuKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91cihuY3MpO1xuICAgICAgICBpZiAoY29udG91ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgV2FybmluZ3MuZ3JvdXBpbmdOb3RSZWNvZ25pemVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVubGluayhlbGVtZW50SWRzOiBzdHJpbmdbXSk6IEFycmF5PEVkaXRvckFjdGlvbj4ge1xuICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG4gIGZvciAoY29uc3QgaWQgb2YgZWxlbWVudElkcykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhbiBlbGVtZW50IGJ5IElEIGFuZCBlbnN1cmUgaXQncyBhbiBTVkdHcmFwaGljc0VsZW1lbnRcbmZ1bmN0aW9uIGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQoaWQ6IHN0cmluZyk6IFNWR0dyYXBoaWNzRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0dyYXBoaWNzRWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb2dnbGVTeWxsYWJsZUlkcyhcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBbU1ZHR3JhcGhpY3NFbGVtZW50LCBTVkdHcmFwaGljc0VsZW1lbnRdIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gW2VsZW1lbnRzWzBdLCBlbGVtZW50c1sxXV07XG4gIH1cblxuICBjb25zdCB1bmxpbmtlZEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKFxuICAgIChlbCkgPT4gIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiYgIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSxcbiAgKTtcblxuICBpZiAodW5saW5rZWRFbGVtZW50KSB7XG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKHVubGlua2VkRWxlbWVudCk7XG5cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBbZWxlbWVudHNbaW5kZXhdLCBlbGVtZW50c1tpbmRleCArIDFdXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBlbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gW2VsZW1lbnRzW2luZGV4IC0gMV0sIGVsZW1lbnRzW2luZGV4XV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoYXQgYWN0aW9uIChsaW5rL3VubGluaykgdG8gcGVyZm9ybSB3aGVuIHVzZXIgY2xpY2tzIG9uIFwiVG9nZ2xlIExpbmtlZCBTeWxsYWJsZVwiXG4gKiBBbHNvIGNhbGxlZCB3aGVuIGNvcnJlc3BpbmRpbmcgaG90a2V5IGlzIHByZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpIHtcbiAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICBjb25zdCBjaGFpbkFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogW10sXG4gIH07XG4gIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcblxuICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnRJZHNcbiAgICAubWFwKGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQpIC8vIE1hcCBJRHMgdG8gU1ZHR3JhcGhpY3NFbGVtZW50IG9yIG51bGxcbiAgICAuZmlsdGVyKChlbCk6IGVsIGlzIFNWR0dyYXBoaWNzRWxlbWVudCA9PiBlbCAhPT0gbnVsbCk7XG5cbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHBhcmFtLnB1c2goLi4udW5saW5rKGVsZW1lbnRJZHMpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbZmlyc3RTeWxsYWJsZSwgc2Vjb25kU3lsbGFibGVdID0gZ2V0VG9nZ2xlU3lsbGFibGVJZHMoZWxlbWVudHMpO1xuICAgIGNvbnNvbGUubG9nKGZpcnN0U3lsbGFibGUuaWQsIHNlY29uZFN5bGxhYmxlLmlkKTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIERlbGV0ZSBzeWwgb24gc2Vjb25kIHN5bGxhYmxlXG4gICAgY29uc3Qgc3lsID0gc2Vjb25kU3lsbGFibGUucXVlcnlTZWxlY3RvcignLnN5bCcpO1xuICAgIGlmIChzeWwgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3lsLmlkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hhaW5BY3Rpb24ucGFyYW0gPSBwYXJhbTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdUb2dnbGVkIFN5bGxhYmxlIExpbmsnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICdGYWlsZWQgdG8gVG9nZ2xlIFN5bGxhYmxlIExpbmsnLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgSURzIG9mIHNlbGVjdGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBnZXRJZHMoKTogc3RyaW5nW10ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlkcy5wdXNoKGVsLmlkKTtcbiAgfSk7XG4gIHJldHVybiBpZHM7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIElEcyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMnIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZHJlbklkcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNoaWxkcmVuSWRzID0gW107XG4gIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBpZiAoXG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSB8fFxuICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoKSA9PiB7XG4gICAgICBjaGlsZHJlbklkcy5wdXNoKGNoLmlkKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBjaGlsZHJlbklkcztcbn1cbiIsImV4cG9ydCB7IElFbnRyeSwgSUZpbGUsIElGb2xkZXIsIEVudHJ5VHlwZSB9IGZyb20gJy4vRmlsZVN5c3RlbUludGVyZmFjZXMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtVG9vbHMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbU1hbmFnZXIgfSBmcm9tICcuL0ZpbGVTeXN0ZW1NYW5hZ2VyJzsiLCJpbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBlcnJvckxvZ3NQYW5lbENvbnRlbnRzIH0gZnJvbSAnLi4vU3F1YXJlRWRpdC9Db250ZW50cyc7XG5pbXBvcnQgeyBzZXRTZXR0aW5ncywgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuaW1wb3J0IHsgTW9kYWxXaW5kb3csIE1vZGFsV2luZG93VmlldyB9IGZyb20gJy4vTW9kYWxXaW5kb3cnO1xuXG5mdW5jdGlvbiBjcmVhdGVMb2dNZXNzYWdlIChub3RpZjogTm90aWZpY2F0aW9uKTogRWxlbWVudCB7XG4gIGNvbnN0IG5vdGlmRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5vdGlmRGl2LmNsYXNzTGlzdC5hZGQoJ25vdGlmaWNhdGlvbi1jb250YWluZXInKTtcbiAgbm90aWZEaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctbWFpblwiPiR7bm90aWYubWVzc2FnZX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1leHRyYVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tYnRuLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLWxvZy1pbmZvLWljb24td3JhcHBlclwiPlxuICAgICAgICAgIDxpbWcgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGNsYXNzPVwibm90aWYtbG9nLWluZm8taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z1wiIHRpdGxlPVwiTG9nIE1lc3NhZ2VcIj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJlbW92ZS1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIGNsYXNzPVwibG9nLXJlbW92ZSBub3RpZi1yZW1vdmUtaWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9nYXJiYWdlLWNsb3NlZC5zdmdcIiB0aXRsZT1cIlJlbW92ZVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBgO1xuXG4gIGNvbnN0IHJlbW92ZUJ0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcubG9nLXJlbW92ZScpO1xuICByZW1vdmVCdG4ub25jbGljayA9ICgpID0+IG5vdGlmRGl2LnJlbW92ZSgpO1xuICByZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1vcGVuLnN2Z2ApO1xuICB9KTtcbiAgcmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1jbG9zZWQuc3ZnYCk7XG4gIH0pO1xuXG4gIGlmIChub3RpZi5sb2dJbmZvKSB7XG4gICAgY29uc3QgaW5mb0J0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcubm90aWYtbG9nLWluZm8taWNvbicpO1xuICAgIGluZm9CdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgcmVtb3ZlQnRuLnN0eWxlLmhlaWdodCA9ICcyMHB4JztcblxuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgaW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvbm90aWZpY2F0aW9uLWluZm8taWNvbi1kYXJrLnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICBpbmZvQnRuLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBvcGVuRXJyb3JMb2dXaW5kb3cobm90aWYubG9nSW5mbykpO1xuICB9XG5cbiAgcmV0dXJuIG5vdGlmRGl2O1xufVxuXG5cbi8qKlxuICogQWRkIG5vdGlmaWNhdGlvbiB0byB0aGUgcGVyc2lzdGVudCBlcnJvciBsb2cgb24gdGhlIHNpZGViYXJcbiAqIEBwYXJhbSBub3RpZiB7Tm90aWZpY2F0aW9ufSBOb3RpZmljYXRpb24gdG8gYWRkIHRvIHRoZSBlcnJvciBsb2dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE5vdGlmaWNhdGlvbiAobm90aWY6IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpO1xuICBsb2cucHJlcGVuZChjcmVhdGVMb2dNZXNzYWdlKG5vdGlmKSk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplIGVycm9yIGxvZy5cbiAqIEFkZHMgbmVjZXNzYXJ5IEhUTUwgdG8gRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEVycm9yTG9nKCk6IHZvaWQge1xuICAvLyBFcnJvciBsb2cgcGFuZWxcbiAgY29uc3QgbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBsb2cuaW5uZXJIVE1MID0gZXJyb3JMb2dzUGFuZWxDb250ZW50cztcblxuICBpbml0RXJyb3JMb2dDb250cm9scygpO1xufVxuXG5cbi8qKlxuICogU2V0IHVwIGV2ZW50IGxpc3RlbmVycyBmb3IgZXJyb3IgTG9nIHBhbmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXJyb3JMb2dDb250cm9scygpOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvcl9sb2cnKTtcbiAgY29uc3QgaGVhZGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvckxvZ0hlYWRpbmcnKTtcbiAgY29uc3QgZHJvcGRvd25JY29uID0gaGVhZGluZy5xdWVyeVNlbGVjdG9yKCdzdmcgPiB1c2UnKTtcbiAgY29uc3QgY29udGVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpIGFzIEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgaWYgKGRpc3BsYXlFcnJMb2cpIGVycm9yUGFuZWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuXG4gIGhlYWRpbmcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gaWYgZXJyb3IgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGNvbnRlbnRzLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykpIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGFuIG9wZW4gcGFuZWxcbiAgICAgIGNvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgY29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGRyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9IFxuICAgIC8vIGlmIGVycm9yIHBhbmVsIGlzIG9wZW4sIGNsb3NlIGl0XG4gICAgZWxzZSB7XG4gICAgICAvLyBzZXQgY2xhc3NlcyBhbmQgc3R5bGVzIGZvciBhIGNsb3NlZCBwYW5lbFxuICAgICAgY29udGVudHMuY2xhc3NMaXN0LmFkZCgnY2xvc2VkJyk7XG4gICAgICBjb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICBkcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1zaWRlYCk7XG4gICAgfVxuICB9KTtcblxuICBpbml0RGlzcGxheUxpc3RlbmVyKCk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplcyBjbGljayBsaXN0ZW5lciBvbiBcIlNob3cgZXJyb3IgbG9nc1wiIGJ1dHRvbiBpbiBcIlZpZXdcIiBkcm9wZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5TGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrYm94ZXNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1zaW5nbGUtY29udGFpbmVyJyk7XG4gIGNvbnN0IGVycm9yc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgY29uc3QgZXJvcnJzQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblxuICBlcm9ycnNCdG4uY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTtcbiAgZXJyb3JzTGFiZWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtY29udGFpbmVyJywgJ3NpZGUtcGFuZWwtYnRuJyk7XG4gIGVycm9yc0xhYmVsLnRleHRDb250ZW50ID0gJ0Vycm9ycyc7XG4gIGVyb3Jyc0J0bi5pZCA9ICdkaXNwbGF5LWVycm9ycyc7XG4gIGVyb3Jyc0J0bi50eXBlID0gJ2NoZWNrYm94JztcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBmYWxzZTtcbiAgZXJyb3JzTGFiZWwuYXBwZW5kQ2hpbGQoZXJvcnJzQnRuKTtcbiAgY2hlY2tib3hlc0NvbnRhaW5lci5hcHBlbmQoZXJyb3JzTGFiZWwpO1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBkaXNwbGF5RXJyTG9nO1xuXG4gIGVyb3Jyc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzZXRTZXR0aW5ncyh7IGRpc3BsYXlFcnJMb2c6IGVyb3Jyc0J0bi5jaGVja2VkIH0pO1xuICAgIHVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSgpO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBvcGVuRXJyb3JMb2dXaW5kb3cobG9nOiBzdHJpbmcpIHtcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5FUlJPUl9MT0csIGxvZyk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5KCk6IHZvaWQge1xuICBjb25zdCBub3RpZlBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBjb25zdCB7IGRlYnVnTW9kZSwgZGlzcGxheUVyckxvZywgZGlzcGxheUluZm8sIGRpc3BsYXlCQm94LCBkaXNwbGF5VGV4dCB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5QWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktYWxsLWJ0bicpO1xuXG4gIGlmIChkZWJ1Z01vZGUpIHtcbiAgICBpZiAoZGlzcGxheUVyckxvZykge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUluZm8gJiYgZGlzcGxheUJCb3ggJiYgXG4gICAgICAgIGRpc3BsYXlUZXh0ICYmIGRpc3BsYXlFcnJMb2cpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vdGlmUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIGlmIChkaXNwbGF5SW5mbyAmJiBkaXNwbGF5QkJveCAmJiBkaXNwbGF5VGV4dCkge1xuICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IHsgZ2V0U3RhZmZCQm94LCBzZWxlY3RCQm94LCBzZWxlY3RTdGFmZiwgc2VsZWN0QWxsIH0gZnJvbSAnLi9TZWxlY3RUb29scyc7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFJlc2l6ZUFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IGlzT3V0T2ZTVkdCb3VuZHMgfSBmcm9tICcuL0Nvb3JkaW5hdGVzJztcbmltcG9ydCB7IHF1ZXVlTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuXG4vKipcbiAqIFJlc2l6ZSBhIHN0YWZmIG9yIGEgc3lsbGFibGUgdGV4dCBib3VuZGluZyBib3guXG4gKiBGb3Igc3RhdmVzLCB0aGlzIGFsc28gc3VwcG9ydHMgYWRqdXN0aW5nIHRoZSByb3RhdGUuXG4gKi9cbnR5cGUgUG9pbnQgPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBuYW1lOiBudW1iZXIgfTtcblxuLyoqXG4gKiBUaGUgcG9pbnRzIHlvdSBjYW4gY2xpY2sgYW5kIGRyYWcgdG8gcmVzaXplXG4gKi9cbmNvbnN0IFBvaW50TmFtZXMgPSB7XG4gIFRvcExlZnQ6IDAsXG4gIFRvcDogMSxcbiAgVG9wUmlnaHQ6IDIsXG4gIFJpZ2h0OiAzLFxuICBCb3R0b21SaWdodDogNCxcbiAgQm90dG9tOiA1LFxuICBCb3R0b21MZWZ0OiA2LFxuICBMZWZ0OiA3XG59O1xuXG5mdW5jdGlvbiBnZXRQb2ludHModWx4OiBudW1iZXIsIHVseTogbnVtYmVyLCBscng6IG51bWJlciwgbHJ5OiBudW1iZXIsIHJvdGF0ZTogbnVtYmVyKTogUG9pbnRbXSB7XG4gIC8vIE5vdGUgdGhhdCBhcmMgZnVuY3Rpb25zIHJldHVybiBhbiBhbmdsZSB4IGluIFstcGkvMiwgcGkvMl0uXG4gIGxldCBwb2ludHM6IEFycmF5PFBvaW50PjtcbiAgLy8gdWwgaXMgdWx4LCB1bHksIGxyIGlzIGxyeCwgbHJ5XG4gIGlmIChyb3RhdGUgPj0gMCkge1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wTGVmdCB9LFxuICAgICAgeyB4OiAodWx4ICsgbHJ4KSAvIDIsIHk6IHVseSArIChscnggLSB1bHgpIC8gMiAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuVG9wIH0sXG4gICAgICB7IHg6IGxyeCwgeTogdWx5ICsgKGxyeCAtIHVseCkgKiBNYXRoLnNpbihyb3RhdGUpLCBuYW1lOiBQb2ludE5hbWVzLlRvcFJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogKHVseSArIGxyeSArIChscnggLSB1bHgpICogTWF0aC5zaW4ocm90YXRlKSkgLyAyLCBuYW1lOiBQb2ludE5hbWVzLlJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogbHJ5LCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0IH0sXG4gICAgICB7IHg6ICh1bHggKyBscngpIC8gMiwgeTogbHJ5IC0gKGxyeCAtIHVseCkgLyAyICogTWF0aC5zaW4ocm90YXRlKSwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6ICh1bHkgKyBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSkpIC8gMiwgbmFtZTogUG9pbnROYW1lcy5MZWZ0IH1cbiAgICBdO1xuICB9XG4gIC8vIE5vdCB0aGF0XG4gIGVsc2Uge1xuICAgIGNvbnN0IGEgPSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKE1hdGguYWJzKHJvdGF0ZSkpO1xuICAgIGNvbnN0IGIgPSBscnkgLSB1bHkgLSBhO1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHkgKyBhLCBuYW1lOiBQb2ludE5hbWVzLlRvcExlZnQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiB1bHkgKyBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Ub3AgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wUmlnaHQgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHkgKyBiIC8gMiwgbmFtZTogUG9pbnROYW1lcy5SaWdodCB9LFxuICAgICAgeyB4OiBscngsIHk6IHVseSArIGIsIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tUmlnaHQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiBscnkgLSBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6IGxyeSAtIGIgLyAyLCBuYW1lOiBQb2ludE5hbWVzLkxlZnQgfVxuICAgIF07XG4gIH1cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZSAoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50LCBuZW9uVmlldzogTmVvblZpZXcsIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcik6IHZvaWQge1xuICBsZXQgdWx4OiBudW1iZXI7XG4gIGxldCB1bHk6IG51bWJlcjtcbiAgbGV0IGxyeDogbnVtYmVyO1xuICBsZXQgbHJ5OiBudW1iZXI7XG4gIGxldCByb3RhdGU6IG51bWJlcjtcblxuICBsZXQgaW5pdGlhbFVseDogbnVtYmVyLCBpbml0aWFsTHJ4OiBudW1iZXI7XG4gIGxldCBpbml0aWFsUG9pbnQ6IG51bWJlcltdLCBpbml0aWFsVWx5OiBudW1iZXIsIGluaXRpYWxMcnk6IG51bWJlcixcbiAgICBpbml0aWFsWTogbnVtYmVyLCBpbml0aWFsUmVjdFk6IG51bWJlciwgcG9seUxlbjogbnVtYmVyLCBkeTogbnVtYmVyLCBpbml0aWFsUm90YXRlOiBudW1iZXI7XG5cbiAgZHJhd0luaXRpYWxSZWN0KCk7XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIG5ldyBib3VuZHNcbiAgICovXG4gIGZ1bmN0aW9uIHJlZHJhdyAoKTogdm9pZCB7XG4gICAgY29uc3QgcG9pbnRzOiBQb2ludFtdID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIGNvbnN0IHBvaW50U3RyaW5nOiBzdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfZWxlbSwgaW5kZXgpID0+IHsgcmV0dXJuIGluZGV4ICUgMiA9PT0gMDsgfSlcbiAgICAgIC5tYXAoZWxlbSA9PiBlbGVtLnggKyAnLCcgKyBlbGVtLnkpXG4gICAgICAuam9pbignICcpO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jlc2l6ZVJlY3QnKS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIHBvaW50U3RyaW5nKTtcblxuICAgIGNvbnN0IHRleHRSZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN5bC5zZWxlY3RlZCA+IC5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgaWYgKHRleHRSZWN0KSB7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCBTdHJpbmcoTWF0aC5taW4odWx4LCBscngpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoTWF0aC5taW4odWx5LCBscnkpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKE1hdGguYWJzKGxyeCAtIHVseCkpKTtcbiAgICAgIHRleHRSZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKE1hdGguYWJzKGxyeSAtIHVseSkpKTtcbiAgICB9XG5cblxuICAgIGZvciAoY29uc3QgcG9pbnROYW1lIGluIFBvaW50TmFtZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50OiBQb2ludCA9IHBvaW50c1tQb2ludE5hbWVzW3BvaW50TmFtZV1dO1xuICAgICAgZDMuc2VsZWN0KCcjcC0nICsgcG9pbnROYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpXG4gICAgICAgIC5hdHRyKCdjeCcsIHBvaW50LngpXG4gICAgICAgIC5hdHRyKCdjeScsIHBvaW50LnkpO1xuICAgIH1cblxuICAgIGxldCB4ID0gcG9pbnRzWzNdLng7XG4gICAgbGV0IHkgPSBwb2ludHNbM10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgKHggKyA3MCkgKyAnLCcgKyAoeSArIDUwKSArICcgJyArICh4ICsgMTAwKSArICcsJyArICh5ICsgMTUpICsgJyAnICsgKHggKyAxMzApICsgJywnICsgKHkgKyA1MCk7XG4gICAgeCA9IHBvaW50c1s3XS54O1xuICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ0xlZnQgPSAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDE1KSArICcgJyArXG4gICAgICAoeCAtIDEzMCkgKyAnLCcgKyAoeSAtIDUwKSArICcgJyArICh4IC0gMTAwKSArICcsJyArICh5IC0gODUpICsgJyAnICsgKHggLSA3MCkgKyAnLCcgKyAoeSAtIDUwKTtcblxuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZUxlZnQnKS5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZ0xlZnQpO1xuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgaW5pdGlhbCByZWN0YW5nbGUgYXJvdW5kIHRoZSBlbGVtZW50XG4gICAqIGFuZCBhZGQgdGhlIGxpc3RlbmVycyB0byBzdXBwb3J0IGRyYWdnaW5nIHRvIHJlc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGRyYXdJbml0aWFsUmVjdCAoKTogdm9pZCB7XG4gICAgaWYgKGVsZW1lbnQgPT09IG51bGwpIHJldHVybjtcblxuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJvdGF0ZVBvaW50JykucmVtb3ZlKCk7XG5cbiAgICAvLyBpZiBpdCdzIGEgYm91bmRpbmdib3gganVzdCBnZXQgdGhlIGNvb3JkaW5hdGVzXG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmIChyZWN0ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVHJpZWQgdG8gZHJhdyByZXNpemUgcmVjdCBmb3IgYSBzeWxUZXh0UmVjdCB0aGF0IGRvZXNuXFwndCBleGlzdCAob3IgaXNuXFwndCBkaXNwbGF5aW5nKScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bHggPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3gnKSk7XG4gICAgICB1bHkgPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3knKSk7XG4gICAgICBscnggPSArdWx4ICsgK3JlY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgICAgbHJ5ID0gK3VseSArICtyZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG5cbiAgICAgIHJvdGF0ZSA9IDA7XG4gICAgfVxuXG4gICAgLy8gaWYgaXQncyBhIHN0YWZmIHVzZSB0aGUgcGF0aHMgdG8gZ2V0IGl0J3MgYm91bmRpbmdib3hcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIGNvbnN0IGJib3ggPSBnZXRTdGFmZkJCb3goZWxlbWVudCk7XG4gICAgICB1bHggPSBiYm94LnVseDtcbiAgICAgIHVseSA9IGJib3gudWx5O1xuICAgICAgbHJ4ID0gYmJveC5scng7XG4gICAgICBscnkgPSBiYm94LmxyeTtcblxuICAgICAgY29uc3QgY29vcmRpbmF0ZXM6IG51bWJlcltdID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdwYXRoJylcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnZCcpXG4gICAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbigoY29vcmRpbmF0ZXNbM10gLSBjb29yZGluYXRlc1sxXSkgL1xuICAgICAgICAoY29vcmRpbmF0ZXNbMl0gLSBjb29yZGluYXRlc1swXSkpO1xuICAgIH1cblxuICAgIGluaXRpYWxVbHggPSB1bHgsIGluaXRpYWxVbHkgPSB1bHksIGluaXRpYWxMcnggPSBscngsIGluaXRpYWxMcnkgPSBscnk7XG5cbiAgICBsZXQgd2hpY2hQb2ludDogc3RyaW5nO1xuXG4gICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIHBvbHlMZW4gPSBwb2ludHNbMl0ueCAtIHBvaW50c1swXS54O1xuXG4gICAgY29uc3QgcG9pbnRTdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggJSAyID09PSAwKVxuICAgICAgLm1hcChlbGVtID0+IGVsZW0ueCArICcsJyArIGVsZW0ueSlcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICBkMy5zZWxlY3QoJyMnICsgZWxlbWVudC5pZCkuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgIC5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZylcbiAgICAgIC5hdHRyKCdpZCcsICdyZXNpemVSZWN0JylcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEwKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdtb3ZlJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICcyMCAxMCcpO1xuXG4gICAgY29uc3QgeyBjaXJjbGVTaXplIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgZm9yIChjb25zdCBwb2ludE5hbWUgaW4gUG9pbnROYW1lcykge1xuICAgICAgY29uc3QgcG9pbnQ6IFBvaW50ID0gcG9pbnRzW1BvaW50TmFtZXNbcG9pbnROYW1lXV07XG4gICAgICBkMy5zZWxlY3QoZWxlbWVudC52aWV3cG9ydEVsZW1lbnQpLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgLmF0dHIoJ2N4JywgcG9pbnQueClcbiAgICAgICAgLmF0dHIoJ2N5JywgcG9pbnQueSlcbiAgICAgICAgLmF0dHIoJ3InLCBjaXJjbGVTaXplKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDQpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJyMwMDk5ZmYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAncmVzaXplUG9pbnQnKVxuICAgICAgICAuYXR0cignaWQnLCAncC0nICsgcG9pbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyBkbyBpdCBhcyBhIGxvb3AgaW5zdGVhZCBvZiBzZWxlY3RBbGwgc28gdGhhdCB5b3UgY2FuIGVhc2lseSBrbm93IHdoaWNoIHBvaW50IHdhc1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBQb2ludE5hbWVzKSB7XG4gICAgICBkMy5zZWxlY3QoJyNwLScgKyBuYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpLmNhbGwoXG4gICAgICAgIGQzLmRyYWcoKVxuICAgICAgICAgIC5vbignc3RhcnQnLCAoKSA9PiB7IHJlc2l6ZVN0YXJ0KG5hbWUpOyB9KVxuICAgICAgICAgIC5vbignZHJhZycsIHJlc2l6ZURyYWcpXG4gICAgICAgICAgLm9uKCdlbmQnLCByZXNpemVFbmQuYmluZCh0aGlzKSkpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkge1xuICAgICAgbGV0IHggPSBwb2ludHNbM10ueDtcbiAgICAgIGxldCB5ID0gcG9pbnRzWzNdLnk7XG4gICAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgICAoeCArIDcwKSArICcsJyArICh5ICsgNTApICsgJyAnICsgKHggKyAxMDApICsgJywnICsgKHkgKyAxNSkgKyAnICcgKyAoeCArIDEzMCkgKyAnLCcgKyAoeSArIDUwKTtcbiAgICAgIHggPSBwb2ludHNbN10ueDtcbiAgICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICAgIGNvbnN0IHBvaW50U3RyaW5nTGVmdCA9ICh4IC0gMTAwKSArICcsJyArICh5IC0gMTUpICsgJyAnICtcbiAgICAgICAgKHggLSAxMzApICsgJywnICsgKHkgLSA1MCkgKyAnICcgKyAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDg1KSArICcgJyArICh4IC0gNzApICsgJywnICsgKHkgLSA1MCk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodClcbiAgICAgICAgLmF0dHIoJ2lkJywgJ3JvdGF0ZVJpZ2h0JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCA3KVxuICAgICAgICAuYXR0cignZmlsbCcsICcjMDA5OWZmJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3JvdGF0ZVBvaW50Jyk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdMZWZ0KVxuICAgICAgICAuYXR0cignaWQnLCAncm90YXRlTGVmdCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgNylcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnIzAwOTlmZicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdyb3RhdGVQb2ludCcpO1xuXG4gICAgICBkMy5zZWxlY3QoJyNyb3RhdGVMZWZ0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdMZWZ0KVxuICAgICAgICAgIC5vbignZW5kJywgcm90YXRlRW5kKSk7XG5cbiAgICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdSaWdodClcbiAgICAgICAgICAub24oJ2VuZCcsIHJvdGF0ZUVuZCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZVN0YXJ0IChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHdoaWNoUG9pbnQgPSBuYW1lO1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHMuZmluZChwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzW25hbWVdKTtcbiAgICAgIGluaXRpYWxQb2ludCA9IFtwb2ludC54LCBwb2ludC55XTtcbiAgICAgIGluaXRpYWxVbHkgPSB1bHk7XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZURyYWcgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFBvaW50ID0gZDMubW91c2UodGhpcyk7XG4gICAgICBzd2l0Y2ggKFBvaW50TmFtZXNbd2hpY2hQb2ludF0pIHtcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcExlZnQ6XG4gICAgICAgICAgdWx4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcDpcbiAgICAgICAgICB1bHkgPSBjdXJyZW50UG9pbnRbMV0gLSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuVG9wUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXSAtIChscnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlJpZ2h0OlxuICAgICAgICAgIGxyeCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICBscnkgPSBpbml0aWFsTHJ5ICsgKGN1cnJlbnRQb2ludFswXSAtIGluaXRpYWxQb2ludFswXSkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIGxyeSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLkJvdHRvbTpcbiAgICAgICAgICBscnkgPSBjdXJyZW50UG9pbnRbMV0gKyAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgbHJ5ID0gY3VycmVudFBvaW50WzFdICsgKGxyeCAtIHVseCkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgdWx5ID0gaW5pdGlhbFVseSArIChjdXJyZW50UG9pbnRbMF0gLSBpbml0aWFsUG9pbnRbMF0pICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdTb21ldGhpbmcgdGhhdCB3YXNuXFwndCBhIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB3YXMgZHJhZ2dlZC4gVGhpcyBzaG91bGRuXFwndCBoYXBwZW4uJyk7XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemVFbmQgKCk6IHZvaWQge1xuICAgICAgaWYgKGlzT3V0T2ZTVkdCb3VuZHModWx4LCB1bHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4LCBscnkpKSB7XG4gICAgICAgIHVseCA9IGluaXRpYWxVbHgsIHVseSA9IGluaXRpYWxVbHksIGxyeCA9IGluaXRpYWxMcngsIGxyeSA9IGluaXRpYWxMcnk7XG4gICAgICAgIHJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBxdWV1ZU5vdGlmaWNhdGlvbignW0ZBSUxdIEdseXBocyB3ZXJlIHBsYWNlZCBvdXQgb2YgYm91bmRzISBSZXNpemUgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBSZXNpemVBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3Jlc2l6ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHVseDogdWx4LFxuICAgICAgICAgIHVseTogdWx5LFxuICAgICAgICAgIGxyeDogbHJ4LFxuICAgICAgICAgIGxyeTogbHJ5XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgYXdhaXQgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKTtcbiAgICAgICAgdWx4ID0gdW5kZWZpbmVkLCB1bHkgPSB1bmRlZmluZWQsIGxyeCA9IHVuZGVmaW5lZCwgbHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdEFsbChbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKV0sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb3JlRWRpdCcpO1xuXG4gICAgICAgICAgaWYgKG1vcmVFZGl0KSB7XG4gICAgICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBST1RBVEVcbiAgICBmdW5jdGlvbiByb3RhdGVTdGFydCAoKTogdm9pZCB7XG4gICAgICBjb25zdCB3aGljaCA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50LnRhcmdldC5pZDtcbiAgICAgIGluaXRpYWxZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgICAgaW5pdGlhbFVseSA9IHVseTtcbiAgICAgIGluaXRpYWxSZWN0WSA9ICh3aGljaCA9PT0gJ3JvdGF0ZVJpZ2h0JyA/IGxyeSA6IHVseSk7XG4gICAgICBpbml0aWFsUm90YXRlID0gcm90YXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZURyYWdMZWZ0ICgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBjb25zdCB0ZW1wID0gY3VycmVudFkgLSBpbml0aWFsWTtcbiAgICAgIGNvbnN0IHRlbXBSb3RhdGUgPSBpbml0aWFsUm90YXRlIC0gTWF0aC5hdGFuKHRlbXAgLyBwb2x5TGVuKTtcbiAgICAgIGlmICh0ZW1wUm90YXRlID4gLTAuMiAmJiB0ZW1wUm90YXRlIDwgMC4yKSB7XG4gICAgICAgIGR5ID0gdGVtcDtcbiAgICAgICAgdWx5ID0gaW5pdGlhbFJlY3RZICsgZHk7XG4gICAgICAgIHJvdGF0ZSA9IHRlbXBSb3RhdGU7XG4gICAgICAgIGlmIChyb3RhdGUgPj0gMCkge1xuICAgICAgICAgIHVseSA9IGR5ICsgcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0KVswXS55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVseSA9IHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Ub3BSaWdodClbMF0ueTtcbiAgICAgICAgICBscnkgPSBkeSArIHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Cb3R0b21MZWZ0KVswXS55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGVEcmFnUmlnaHQgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFkgPSBkMy5tb3VzZSh0aGlzKVsxXTtcbiAgICAgIGNvbnN0IHRlbXAgPSBjdXJyZW50WSAtIGluaXRpYWxZO1xuICAgICAgY29uc3QgdGVtcFJvdGF0ZSA9IGluaXRpYWxSb3RhdGUgKyBNYXRoLmF0YW4odGVtcCAvIHBvbHlMZW4pO1xuICAgICAgaWYgKHRlbXBSb3RhdGUgPiAtMC4yICYmIHRlbXBSb3RhdGUgPCAwLjIpIHtcbiAgICAgICAgZHkgPSB0ZW1wO1xuICAgICAgICByb3RhdGUgPSB0ZW1wUm90YXRlO1xuICAgICAgICBpZiAocm90YXRlID49IDAgKSB7XG4gICAgICAgICAgbHJ5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuQm90dG9tUmlnaHQpWzBdLnk7XG4gICAgICAgICAgdWx5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdWx5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuVG9wUmlnaHQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbUxlZnQpWzBdLnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZHJhdygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZUVuZCAoKTogdm9pZCB7XG4gICAgICBpZiAoZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkeSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc091dE9mU1ZHQm91bmRzKHVseCwgdWx5KSB8fCBpc091dE9mU1ZHQm91bmRzKGxyeCwgbHJ5KSkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVzaXplUG9pbnQnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3Jlc2l6ZVJlY3QnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJvdGF0ZVBvaW50JykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQ7XG4gICAgICAgIHVseSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbHJ4ID0gdW5kZWZpbmVkO1xuICAgICAgICBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgICAgIHNlbGVjdEJCb3goZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLCBkcmFnSGFuZGxlciwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0U3RhZmYoZWxlbWVudCwgZHJhZ0hhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIFJvdGF0ZSBhY3Rpb24gZmFpbGVkLicsICdlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgdWx4OiB1bHgsXG4gICAgICAgICAgdWx5OiB1bHksXG4gICAgICAgICAgbHJ4OiBscngsXG4gICAgICAgICAgbHJ5OiBscnksXG4gICAgICAgICAgcm90YXRlOiByb3RhdGUgKiAxODAgLyBNYXRoLlBJXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQsIHVseSA9IHVuZGVmaW5lZCwgbHJ4ID0gdW5kZWZpbmVkLCBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdFN0YWZmKGVsZW1lbnQsIGRyYWdIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgaW1tZWRpYXRlIGZyb20gJ2ltbWVkaWF0ZSc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IE1kNSBmcm9tICdzcGFyay1tZDUnO1xuaW1wb3J0IHZ1dnV6ZWxhIGZyb20gJ3Z1dnV6ZWxhJztcbmltcG9ydCBnZXRBcmd1bWVudHMgZnJvbSAnYXJnc2FycmF5JztcbmltcG9ydCBpbmhlcml0cyBmcm9tICdpbmhlcml0cyc7XG5pbXBvcnQgRUUgZnJvbSAnZXZlbnRzJztcblxuZnVuY3Rpb24gbWFuZ2xlKGtleSkge1xuICByZXR1cm4gJyQnICsga2V5O1xufVxuZnVuY3Rpb24gdW5tYW5nbGUoa2V5KSB7XG4gIHJldHVybiBrZXkuc3Vic3RyaW5nKDEpO1xufVxuZnVuY3Rpb24gTWFwJDEoKSB7XG4gIHRoaXMuX3N0b3JlID0ge307XG59XG5NYXAkMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICByZXR1cm4gdGhpcy5fc3RvcmVbbWFuZ2xlZF07XG59O1xuTWFwJDEucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHRoaXMuX3N0b3JlW21hbmdsZWRdID0gdmFsdWU7XG4gIHJldHVybiB0cnVlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHJldHVybiBtYW5nbGVkIGluIHRoaXMuX3N0b3JlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLm1hcChrID0+IHVubWFuZ2xlKGspKTtcbn07XG5NYXAkMS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICB2YXIgcmVzID0gbWFuZ2xlZCBpbiB0aGlzLl9zdG9yZTtcbiAgZGVsZXRlIHRoaXMuX3N0b3JlW21hbmdsZWRdO1xuICByZXR1cm4gcmVzO1xufTtcbk1hcCQxLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuX3N0b3JlW2tleV07XG4gICAga2V5ID0gdW5tYW5nbGUoa2V5KTtcbiAgICBjYih2YWx1ZSwga2V5KTtcbiAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXAkMS5wcm90b3R5cGUsICdzaXplJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLmxlbmd0aDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIFNldCQxKGFycmF5KSB7XG4gIHRoaXMuX3N0b3JlID0gbmV3IE1hcCQxKCk7XG5cbiAgLy8gaW5pdCB3aXRoIGFuIGFycmF5XG4gIGlmIChhcnJheSAmJiBBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGhpcy5hZGQoYXJyYXlbaV0pO1xuICAgIH1cbiAgfVxufVxuU2V0JDEucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3N0b3JlLnNldChrZXksIHRydWUpO1xufTtcblNldCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9zdG9yZS5oYXMoa2V5KTtcbn07XG5TZXQkMS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYikge1xuICB0aGlzLl9zdG9yZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgY2Ioa2V5KTtcbiAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCQxLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5zaXplO1xuICB9XG59KTtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9rYW5nYXguZ2l0aHViLmlvL2NvbXBhdC10YWJsZS9lczYvIHdlIGNhbiBzbmlmZiBvdXRcbi8vIGluY29tcGxldGUgTWFwL1NldCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNhdXNlIG91ciB0ZXN0cyB0byBmYWlsLlxuLy8gTm90YWJseSB0aGV5IGZhaWwgaW4gSUUxMSBhbmQgaU9TIDguNCwgd2hpY2ggdGhpcyBwcmV2ZW50cy5cbmZ1bmN0aW9uIHN1cHBvcnRzTWFwQW5kU2V0KCkge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3AgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcCwgU3ltYm9sLnNwZWNpZXMpO1xuICByZXR1cm4gcHJvcCAmJiAnZ2V0JyBpbiBwcm9wICYmIE1hcFtTeW1ib2wuc3BlY2llc10gPT09IE1hcDtcbn1cblxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vbnRhZ2Vqcy9jb2xsZWN0aW9uc1xuXG52YXIgRXhwb3J0ZWRTZXQ7XG52YXIgRXhwb3J0ZWRNYXA7XG5cbntcbiAgaWYgKHN1cHBvcnRzTWFwQW5kU2V0KCkpIHsgLy8gcHJlZmVyIGJ1aWx0LWluIE1hcC9TZXRcbiAgICBFeHBvcnRlZFNldCA9IFNldDtcbiAgICBFeHBvcnRlZE1hcCA9IE1hcDtcbiAgfSBlbHNlIHsgLy8gZmFsbCBiYWNrIHRvIG91ciBwb2x5ZmlsbFxuICAgIEV4cG9ydGVkU2V0ID0gU2V0JDE7XG4gICAgRXhwb3J0ZWRNYXAgPSBNYXAkMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpbmFyeU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqZWN0IGluc3RhbmNlb2YgQmxvYik7XG59XG5cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYnVmZikge1xuICBpZiAodHlwZW9mIGJ1ZmYuc2xpY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYnVmZi5zbGljZSgwKTtcbiAgfVxuICAvLyBJRTEwLTExIHNsaWNlKCkgcG9seWZpbGxcbiAgdmFyIHRhcmdldCA9IG5ldyBBcnJheUJ1ZmZlcihidWZmLmJ5dGVMZW5ndGgpO1xuICB2YXIgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuICB2YXIgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmKTtcbiAgdGFyZ2V0QXJyYXkuc2V0KHNvdXJjZUFycmF5KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY2xvbmVCaW5hcnlPYmplY3Qob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG4gIH1cbiAgdmFyIHNpemUgPSBvYmplY3Quc2l6ZTtcbiAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcbiAgLy8gQmxvYlxuICBpZiAodHlwZW9mIG9iamVjdC5zbGljZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvYmplY3Quc2xpY2UoMCwgc2l6ZSwgdHlwZSk7XG4gIH1cbiAgLy8gUGhhbnRvbUpTIHNsaWNlKCkgcmVwbGFjZW1lbnRcbiAgcmV0dXJuIG9iamVjdC53ZWJraXRTbGljZSgwLCBzaXplLCB0eXBlKTtcbn1cblxuLy8gbW9zdCBvZiB0aGlzIGlzIGJvcnJvd2VkIGZyb20gbG9kYXNoLmlzUGxhaW5PYmplY3Q6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmlzLWNvbXBvbmVudHMvbG9kYXNoLmlzcGxhaW5vYmplY3QvXG4vLyBibG9iLzI5YzM1ODE0MGE3NGYyNTJhZWIwOGM5ZWIyOGJlZjg2ZjIyMTdkNGEvaW5kZXguanNcblxudmFyIGZ1bmNUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb3RvID09PSBudWxsKSB7IC8vIG5vdCBzdXJlIHdoZW4gdGhpcyBoYXBwZW5zLCBidXQgSSBndWVzcyBpdCBjYW5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gY2xvbmUob2JqZWN0KSB7XG4gIHZhciBuZXdPYmplY3Q7XG4gIHZhciBpO1xuICB2YXIgbGVuO1xuXG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBuZXdPYmplY3QgPSBbXTtcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBvYmplY3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG5ld09iamVjdFtpXSA9IGNsb25lKG9iamVjdFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNhc2U6IHRvIGF2b2lkIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIEluZGV4ZWREQlxuICAvLyBhbmQgb3RoZXIgYmFja2VuZHMsIHdlIGF1dG9tYXRpY2FsbHkgc3RyaW5naWZ5IERhdGVzXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlICYmIGlzRmluaXRlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICBpZiAoaXNCaW5hcnlPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBjbG9uZUJpbmFyeU9iamVjdChvYmplY3QpO1xuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0OyAvLyBkb24ndCBjbG9uZSBvYmplY3RzIGxpa2UgV29ya2Vyc1xuICB9XG5cbiAgbmV3T2JqZWN0ID0ge307XG4gIGZvciAoaSBpbiBvYmplY3QpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBpKSkge1xuICAgICAgdmFyIHZhbHVlID0gY2xvbmUob2JqZWN0W2ldKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5ld09iamVjdFtpXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3T2JqZWN0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGZ1bikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICAvLyB0aGlzIGlzIGEgc21va2UgdGVzdCBhbmQgc2hvdWxkIG5ldmVyIGFjdHVhbGx5IGhhcHBlblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbmNlIGNhbGxlZCBtb3JlIHRoYW4gb25jZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUHJvbWlzZShmdW5jKSB7XG4gIC8vY3JlYXRlIHRoZSBmdW5jdGlvbiB3ZSB3aWxsIGJlIHJldHVybmluZ1xuICByZXR1cm4gZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgLy8gQ2xvbmUgYXJndW1lbnRzXG4gICAgYXJncyA9IGNsb25lKGFyZ3MpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLCBhc3N1bWUgaXRzIGEgY2FsbGJhY2tcbiAgICB2YXIgdXNlZENCID0gKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpID8gYXJncy5wb3AoKSA6IGZhbHNlO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgICAgdmFyIHJlc3A7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBvbmNlKGZ1bmN0aW9uIChlcnIsIG1lc2cpIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVsZmlsbChtZXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjcmVhdGUgYSBjYWxsYmFjayBmb3IgdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgIC8vIGFwcGx5IHRoZSBmdW5jdGlvbiBpbiB0aGUgb3JpZyBjb250ZXh0XG4gICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJlc3AgPSBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICBpZiAocmVzcCAmJiB0eXBlb2YgcmVzcC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZnVsZmlsbChyZXNwKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gaWYgdGhlcmUgaXMgYSBjYWxsYmFjaywgY2FsbCBpdCBiYWNrXG4gICAgaWYgKHVzZWRDQikge1xuICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdXNlZENCKG51bGwsIHJlc3VsdCk7XG4gICAgICB9LCB1c2VkQ0IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGxvZ0FwaUNhbGwoc2VsZiwgbmFtZSwgYXJncykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHNlbGYuY29uc3RydWN0b3IubGlzdGVuZXJzKCdkZWJ1ZycpLmxlbmd0aCkge1xuICAgIHZhciBsb2dBcmdzID0gWydhcGknLCBzZWxmLm5hbWUsIG5hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGxvZ0FyZ3MucHVzaChhcmdzW2ldKTtcbiAgICB9XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCdkZWJ1ZycsIGxvZ0FyZ3MpO1xuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIGNhbGxiYWNrIGl0c2VsZiB0byBsb2cgdGhlIHJlc3BvbnNlXG4gICAgdmFyIG9yaWdDYWxsYmFjayA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIHZhciByZXNwb25zZUFyZ3MgPSBbJ2FwaScsIHNlbGYubmFtZSwgbmFtZV07XG4gICAgICByZXNwb25zZUFyZ3MgPSByZXNwb25zZUFyZ3MuY29uY2F0KFxuICAgICAgICBlcnIgPyBbJ2Vycm9yJywgZXJyXSA6IFsnc3VjY2VzcycsIHJlc11cbiAgICAgICk7XG4gICAgICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ2RlYnVnJywgcmVzcG9uc2VBcmdzKTtcbiAgICAgIG9yaWdDYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGFwdGVyRnVuKG5hbWUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0b1Byb21pc2UoZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZGF0YWJhc2UgaXMgY2xvc2VkJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdkYXRhYmFzZSBpcyBkZXN0cm95ZWQnKSk7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBsb2dBcGlDYWxsKHNlbGYsIG5hbWUsIGFyZ3MpO1xuICAgIGlmICghdGhpcy50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi50YXNrcXVldWUuYWRkVGFzayhmdW5jdGlvbiAoZmFpbGVkKSB7XG4gICAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgcmVqZWN0KGZhaWxlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZ1bGZpbGwoc2VsZltuYW1lXS5hcHBseShzZWxmLCBhcmdzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG4gIH0pKTtcbn1cblxuLy8gbGlrZSB1bmRlcnNjb3JlL2xvZGFzaCBfLnBpY2soKVxuZnVuY3Rpb24gcGljayhvYmosIGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IGFycltpXTtcbiAgICBpZiAocHJvcCBpbiBvYmopIHtcbiAgICAgIHJlc1twcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gTW9zdCBicm93c2VycyB0aHJvdHRsZSBjb25jdXJyZW50IHJlcXVlc3RzIGF0IDYsIHNvIGl0J3Mgc2lsbHlcbi8vIHRvIHNoaW0gX2J1bGtfZ2V0IGJ5IHRyeWluZyB0byBsYXVuY2ggcG90ZW50aWFsbHkgaHVuZHJlZHMgb2YgcmVxdWVzdHNcbi8vIGFuZCB0aGVuIGxldHRpbmcgdGhlIG1ham9yaXR5IHRpbWUgb3V0LiBXZSBjYW4gaGFuZGxlIHRoaXMgb3Vyc2VsdmVzLlxudmFyIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUyA9IDY7XG5cbmZ1bmN0aW9uIGlkZW50aXR5RnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0Rm9yT3BlblJldnNHZXQocmVzdWx0KSB7XG4gIHJldHVybiBbe1xuICAgIG9rOiByZXN1bHRcbiAgfV07XG59XG5cbi8vIHNoaW0gZm9yIFAvQ291Y2hEQiBhZGFwdGVycyB0aGF0IGRvbid0IGRpcmVjdGx5IGltcGxlbWVudCBfYnVsa19nZXRcbmZ1bmN0aW9uIGJ1bGtHZXQoZGIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXF1ZXN0cyA9IG9wdHMuZG9jcztcblxuICAvLyBjb25zb2xpZGF0ZSBpbnRvIG9uZSByZXF1ZXN0IHBlciBkb2MgaWYgcG9zc2libGVcbiAgdmFyIHJlcXVlc3RzQnlJZCA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICByZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgaWYgKHJlcXVlc3RzQnlJZC5oYXMocmVxdWVzdC5pZCkpIHtcbiAgICAgIHJlcXVlc3RzQnlJZC5nZXQocmVxdWVzdC5pZCkucHVzaChyZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdHNCeUlkLnNldChyZXF1ZXN0LmlkLCBbcmVxdWVzdF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIG51bURvY3MgPSByZXF1ZXN0c0J5SWQuc2l6ZTtcbiAgdmFyIG51bURvbmUgPSAwO1xuICB2YXIgcGVyRG9jUmVzdWx0cyA9IG5ldyBBcnJheShudW1Eb2NzKTtcblxuICBmdW5jdGlvbiBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBwZXJEb2NSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgcmVzLmRvY3MuZm9yRWFjaChmdW5jdGlvbiAoaW5mbykge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIGlkOiByZXMuaWQsXG4gICAgICAgICAgZG9jczogW2luZm9dXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY2FsbGJhY2sobnVsbCwge3Jlc3VsdHM6IHJlc3VsdHN9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICBpZiAoKytudW1Eb25lID09PSBudW1Eb2NzKSB7XG4gICAgICBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnb3RSZXN1bHQoZG9jSW5kZXgsIGlkLCBkb2NzKSB7XG4gICAgcGVyRG9jUmVzdWx0c1tkb2NJbmRleF0gPSB7aWQ6IGlkLCBkb2NzOiBkb2NzfTtcbiAgICBjaGVja0RvbmUoKTtcbiAgfVxuXG4gIHZhciBhbGxSZXF1ZXN0cyA9IFtdO1xuICByZXF1ZXN0c0J5SWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIGFsbFJlcXVlc3RzLnB1c2goa2V5KTtcbiAgfSk7XG5cbiAgdmFyIGkgPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHRCYXRjaCgpIHtcblxuICAgIGlmIChpID49IGFsbFJlcXVlc3RzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB1cFRvID0gTWF0aC5taW4oaSArIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUywgYWxsUmVxdWVzdHMubGVuZ3RoKTtcbiAgICB2YXIgYmF0Y2ggPSBhbGxSZXF1ZXN0cy5zbGljZShpLCB1cFRvKTtcbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2gsIGkpO1xuICAgIGkgKz0gYmF0Y2gubGVuZ3RoO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKGJhdGNoLCBvZmZzZXQpIHtcbiAgICBiYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJZCwgaikge1xuICAgICAgdmFyIGRvY0lkeCA9IG9mZnNldCArIGo7XG4gICAgICB2YXIgZG9jUmVxdWVzdHMgPSByZXF1ZXN0c0J5SWQuZ2V0KGRvY0lkKTtcblxuICAgICAgLy8ganVzdCB1c2UgdGhlIGZpcnN0IHJlcXVlc3QgYXMgdGhlIFwidGVtcGxhdGVcIlxuICAgICAgLy8gVE9ETzogVGhlIF9idWxrX2dldCBBUEkgYWxsb3dzIGZvciBtb3JlIHN1YnRsZSB1c2UgY2FzZXMgdGhhbiB0aGlzLFxuICAgICAgLy8gYnV0IGZvciBub3cgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGVyZSB3aWxsIGJlIGEgbWl4IG9mIGRpZmZlcmVudFxuICAgICAgLy8gXCJhdHRzX3NpbmNlXCIgb3IgXCJhdHRhY2htZW50c1wiIGluIHRoZSBzYW1lIHJlcXVlc3QsIHNpbmNlIGl0J3MganVzdFxuICAgICAgLy8gcmVwbGljYXRlLmpzIHRoYXQgaXMgdXNpbmcgdGhpcyBmb3IgdGhlIG1vbWVudC5cbiAgICAgIC8vIEFsc28sIGF0dHNfc2luY2UgaXMgYXNwaXJhdGlvbmFsLCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGl0IHlldC5cbiAgICAgIHZhciBkb2NPcHRzID0gcGljayhkb2NSZXF1ZXN0c1swXSwgWydhdHRzX3NpbmNlJywgJ2F0dGFjaG1lbnRzJ10pO1xuICAgICAgZG9jT3B0cy5vcGVuX3JldnMgPSBkb2NSZXF1ZXN0cy5tYXAoZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgLy8gcmV2IGlzIG9wdGlvbmFsLCBvcGVuX3JldnMgZGlzYWxsb3dlZFxuICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXY7XG4gICAgICB9KTtcblxuICAgICAgLy8gcmVtb3ZlIGZhbHNleSAvIHVuZGVmaW5lZCByZXZpc2lvbnNcbiAgICAgIGRvY09wdHMub3Blbl9yZXZzID0gZG9jT3B0cy5vcGVuX3JldnMuZmlsdGVyKGlkZW50aXR5RnVuY3Rpb24pO1xuXG4gICAgICB2YXIgZm9ybWF0UmVzdWx0ID0gaWRlbnRpdHlGdW5jdGlvbjtcblxuICAgICAgaWYgKGRvY09wdHMub3Blbl9yZXZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgZG9jT3B0cy5vcGVuX3JldnM7XG5cbiAgICAgICAgLy8gd2hlbiBmZXRjaGluZyBvbmx5IHRoZSBcIndpbm5pbmdcIiBsZWFmLFxuICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIHJlc3VsdCBzbyBpdCBsb29rcyBsaWtlIGFuIG9wZW5fcmV2c1xuICAgICAgICAvLyByZXF1ZXN0XG4gICAgICAgIGZvcm1hdFJlc3VsdCA9IGZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0O1xuICAgICAgfVxuXG4gICAgICAvLyBnbG9iYWxseS1zdXBwbGllZCBvcHRpb25zXG4gICAgICBbJ3JldnMnLCAnYXR0YWNobWVudHMnLCAnYmluYXJ5JywgJ2FqYXgnLCAnbGF0ZXN0J10uZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgaWYgKHBhcmFtIGluIG9wdHMpIHtcbiAgICAgICAgICBkb2NPcHRzW3BhcmFtXSA9IG9wdHNbcGFyYW1dO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGRiLmdldChkb2NJZCwgZG9jT3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gW3tlcnJvcjogZXJyfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gZm9ybWF0UmVzdWx0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZ290UmVzdWx0KGRvY0lkeCwgZG9jSWQsIHJlc3VsdCk7XG4gICAgICAgIG5leHRCYXRjaCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZXh0QmF0Y2goKTtcblxufVxuXG52YXIgaGFzTG9jYWw7XG5cbnRyeSB7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdfcG91Y2hfY2hlY2tfbG9jYWxzdG9yYWdlJywgMSk7XG4gIGhhc0xvY2FsID0gISFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnX3BvdWNoX2NoZWNrX2xvY2Fsc3RvcmFnZScpO1xufSBjYXRjaCAoZSkge1xuICBoYXNMb2NhbCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFN0b3JhZ2UoKSB7XG4gIHJldHVybiBoYXNMb2NhbDtcbn1cblxuLy8gQ3VzdG9tIG5leHRUaWNrKCkgc2hpbSBmb3IgYnJvd3NlcnMuIEluIG5vZGUsIHRoaXMgd2lsbCBqdXN0IGJlIHByb2Nlc3MubmV4dFRpY2soKS4gV2VcblxuaW5oZXJpdHMoQ2hhbmdlcywgRUUpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gYXR0YWNoQnJvd3NlckV2ZW50cyhzZWxmKSB7XG4gIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSkge1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBzZWxmLmVtaXQoZS5rZXkpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG4gIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gIGF0dGFjaEJyb3dzZXJFdmVudHModGhpcyk7XG59XG5DaGFuZ2VzLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkLCBkYiwgb3B0cykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHRoaXMuX2xpc3RlbmVyc1tpZF0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICBmdW5jdGlvbiBldmVudEZ1bmN0aW9uKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghc2VsZi5fbGlzdGVuZXJzW2lkXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5wcm9ncmVzcykge1xuICAgICAgaW5wcm9ncmVzcyA9ICd3YWl0aW5nJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5wcm9ncmVzcyA9IHRydWU7XG4gICAgdmFyIGNoYW5nZXNPcHRzID0gcGljayhvcHRzLCBbXG4gICAgICAnc3R5bGUnLCAnaW5jbHVkZV9kb2NzJywgJ2F0dGFjaG1lbnRzJywgJ2NvbmZsaWN0cycsICdmaWx0ZXInLFxuICAgICAgJ2RvY19pZHMnLCAndmlldycsICdzaW5jZScsICdxdWVyeV9wYXJhbXMnLCAnYmluYXJ5JywgJ3JldHVybl9kb2NzJ1xuICAgIF0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBvbkVycm9yKCkge1xuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRiLmNoYW5nZXMoY2hhbmdlc09wdHMpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoYykge1xuICAgICAgaWYgKGMuc2VxID4gb3B0cy5zaW5jZSAmJiAhb3B0cy5jYW5jZWxsZWQpIHtcbiAgICAgICAgb3B0cy5zaW5jZSA9IGMuc2VxO1xuICAgICAgICBvcHRzLm9uQ2hhbmdlKGMpO1xuICAgICAgfVxuICAgIH0pLm9uKCdjb21wbGV0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbnByb2dyZXNzID09PSAnd2FpdGluZycpIHtcbiAgICAgICAgaW1tZWRpYXRlKGV2ZW50RnVuY3Rpb24pO1xuICAgICAgfVxuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH0pLm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICB9XG4gIHRoaXMuX2xpc3RlbmVyc1tpZF0gPSBldmVudEZ1bmN0aW9uO1xuICB0aGlzLm9uKGRiTmFtZSwgZXZlbnRGdW5jdGlvbik7XG59O1xuXG5DaGFuZ2VzLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIShpZCBpbiB0aGlzLl9saXN0ZW5lcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEVFLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGRiTmFtZSxcbiAgICB0aGlzLl9saXN0ZW5lcnNbaWRdKTtcbiAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tpZF07XG59O1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5DaGFuZ2VzLnByb3RvdHlwZS5ub3RpZnlMb2NhbFdpbmRvd3MgPSBmdW5jdGlvbiAoZGJOYW1lKSB7XG4gIC8vZG8gYSB1c2VsZXNzIGNoYW5nZSBvbiBhIHN0b3JhZ2UgdGhpbmdcbiAgLy9pbiBvcmRlciB0byBnZXQgb3RoZXIgd2luZG93cydzIGxpc3RlbmVycyB0byBhY3RpdmF0ZVxuICBpZiAoaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICBsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9IChsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9PT0gXCJhXCIpID8gXCJiXCIgOiBcImFcIjtcbiAgfVxufTtcblxuQ2hhbmdlcy5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gKGRiTmFtZSkge1xuICB0aGlzLmVtaXQoZGJOYW1lKTtcbiAgdGhpcy5ub3RpZnlMb2NhbFdpbmRvd3MoZGJOYW1lKTtcbn07XG5cbmZ1bmN0aW9uIGd1YXJkZWRDb25zb2xlKG1ldGhvZCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgY29uc29sZVttZXRob2RdLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJhbmRvbU51bWJlcihtaW4sIG1heCkge1xuICB2YXIgbWF4VGltZW91dCA9IDYwMDAwMDsgLy8gSGFyZC1jb2RlZCBkZWZhdWx0IG9mIDEwIG1pbnV0ZXNcbiAgbWluID0gcGFyc2VJbnQobWluLCAxMCkgfHwgMDtcbiAgbWF4ID0gcGFyc2VJbnQobWF4LCAxMCk7XG4gIGlmIChtYXggIT09IG1heCB8fCBtYXggPD0gbWluKSB7XG4gICAgbWF4ID0gKG1pbiB8fCAxKSA8PCAxOyAvL2RvdWJsaW5nXG4gIH0gZWxzZSB7XG4gICAgbWF4ID0gbWF4ICsgMTtcbiAgfVxuICAvLyBJbiBvcmRlciB0byBub3QgZXhjZWVkIG1heFRpbWVvdXQsIHBpY2sgYSByYW5kb20gdmFsdWUgYmV0d2VlbiBoYWxmIG9mIG1heFRpbWVvdXQgYW5kIG1heFRpbWVvdXRcbiAgaWYgKG1heCA+IG1heFRpbWVvdXQpIHtcbiAgICBtaW4gPSBtYXhUaW1lb3V0ID4+IDE7IC8vIGRpdmlkZSBieSB0d29cbiAgICBtYXggPSBtYXhUaW1lb3V0O1xuICB9XG4gIHZhciByYXRpbyA9IE1hdGgucmFuZG9tKCk7XG4gIHZhciByYW5nZSA9IG1heCAtIG1pbjtcblxuICByZXR1cm4gfn4ocmFuZ2UgKiByYXRpbyArIG1pbik7IC8vIH5+IGNvZXJjZXMgdG8gYW4gaW50LCBidXQgZmFzdC5cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJhY2tPZmYobWluKSB7XG4gIHZhciBtYXggPSAwO1xuICBpZiAoIW1pbikge1xuICAgIG1heCA9IDIwMDA7XG4gIH1cbiAgcmV0dXJuIHJhbmRvbU51bWJlcihtaW4sIG1heCk7XG59XG5cbi8vIGRlc2lnbmVkIHRvIGdpdmUgaW5mbyB0byBicm93c2VyIHVzZXJzLCB3aG8gYXJlIGRpc3R1cmJlZFxuLy8gd2hlbiB0aGV5IHNlZSBodHRwIGVycm9ycyBpbiB0aGUgY29uc29sZVxuZnVuY3Rpb24gZXhwbGFpbkVycm9yKHN0YXR1cywgc3RyKSB7XG4gIGd1YXJkZWRDb25zb2xlKCdpbmZvJywgJ1RoZSBhYm92ZSAnICsgc3RhdHVzICsgJyBpcyB0b3RhbGx5IG5vcm1hbC4gJyArIHN0cik7XG59XG5cbnZhciBhc3NpZ247XG57XG4gIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG4gIH0gZWxzZSB7XG4gICAgLy8gbGl0ZSBPYmplY3QuYXNzaWduIHBvbHlmaWxsIGJhc2VkIG9uXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuICAgIGFzc2lnbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgbmV4dFNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG5cbiAgICAgICAgaWYgKG5leHRTb3VyY2UgIT0gbnVsbCkgeyAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIG5leHRTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3Mgd2hlbiBoYXNPd25Qcm9wZXJ0eSBpcyBzaGFkb3dlZFxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdG87XG4gICAgfTtcbiAgfVxufVxuXG52YXIgJGluamVjdF9PYmplY3RfYXNzaWduID0gYXNzaWduO1xuXG5pbmhlcml0cyhQb3VjaEVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIFBvdWNoRXJyb3Ioc3RhdHVzLCBlcnJvciwgcmVhc29uKSB7XG4gIEVycm9yLmNhbGwodGhpcywgcmVhc29uKTtcbiAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIHRoaXMubmFtZSA9IGVycm9yO1xuICB0aGlzLm1lc3NhZ2UgPSByZWFzb247XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xufVxuXG5Qb3VjaEVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgcmVhc29uOiB0aGlzLnJlYXNvblxuICB9KTtcbn07XG5cbnZhciBVTkFVVEhPUklaRUQgPSBuZXcgUG91Y2hFcnJvcig0MDEsICd1bmF1dGhvcml6ZWQnLCBcIk5hbWUgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LlwiKTtcbnZhciBNSVNTSU5HX0JVTEtfRE9DUyA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgXCJNaXNzaW5nIEpTT04gbGlzdCBvZiAnZG9jcydcIik7XG52YXIgTUlTU0lOR19ET0MgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnbWlzc2luZycpO1xudmFyIFJFVl9DT05GTElDVCA9IG5ldyBQb3VjaEVycm9yKDQwOSwgJ2NvbmZsaWN0JywgJ0RvY3VtZW50IHVwZGF0ZSBjb25mbGljdCcpO1xudmFyIElOVkFMSURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdfaWQgZmllbGQgbXVzdCBjb250YWluIGEgc3RyaW5nJyk7XG52YXIgTUlTU0lOR19JRCA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3NpbmdfaWQnLCAnX2lkIGlzIHJlcXVpcmVkIGZvciBwdXRzJyk7XG52YXIgUkVTRVJWRURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdPbmx5IHJlc2VydmVkIGRvY3VtZW50IGlkcyBtYXkgc3RhcnQgd2l0aCB1bmRlcnNjb3JlLicpO1xudmFyIE5PVF9PUEVOID0gbmV3IFBvdWNoRXJyb3IoNDEyLCAncHJlY29uZGl0aW9uX2ZhaWxlZCcsICdEYXRhYmFzZSBub3Qgb3BlbicpO1xudmFyIFVOS05PV05fRVJST1IgPSBuZXcgUG91Y2hFcnJvcig1MDAsICd1bmtub3duX2Vycm9yJywgJ0RhdGFiYXNlIGVuY291bnRlcmVkIGFuIHVua25vd24gZXJyb3InKTtcbnZhciBCQURfQVJHID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnYmFkYXJnJywgJ1NvbWUgcXVlcnkgYXJndW1lbnQgaXMgaW52YWxpZCcpO1xudmFyIElOVkFMSURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2ludmFsaWRfcmVxdWVzdCcsICdSZXF1ZXN0IHdhcyBpbnZhbGlkJyk7XG52YXIgUVVFUllfUEFSU0VfRVJST1IgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdxdWVyeV9wYXJzZV9lcnJvcicsICdTb21lIHF1ZXJ5IHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG52YXIgRE9DX1ZBTElEQVRJT04gPSBuZXcgUG91Y2hFcnJvcig1MDAsICdkb2NfdmFsaWRhdGlvbicsICdCYWQgc3BlY2lhbCBkb2N1bWVudCBtZW1iZXInKTtcbnZhciBCQURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ1NvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSByZXF1ZXN0Jyk7XG52YXIgTk9UX0FOX09CSkVDVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ0RvY3VtZW50IG11c3QgYmUgYSBKU09OIG9iamVjdCcpO1xudmFyIERCX01JU1NJTkcgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnRGF0YWJhc2Ugbm90IGZvdW5kJyk7XG52YXIgSURCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnaW5kZXhlZF9kYl93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgV1NRX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnd2ViX3NxbF93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgTERCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnbGV2ZWxEQl93ZW50X3dlbnRfYmFkJywgJ3Vua25vd24nKTtcbnZhciBGT1JCSURERU4gPSBuZXcgUG91Y2hFcnJvcig0MDMsICdmb3JiaWRkZW4nLCAnRm9yYmlkZGVuIGJ5IGRlc2lnbiBkb2MgdmFsaWRhdGVfZG9jX3VwZGF0ZSBmdW5jdGlvbicpO1xudmFyIElOVkFMSURfUkVWID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnSW52YWxpZCByZXYgZm9ybWF0Jyk7XG52YXIgRklMRV9FWElTVFMgPSBuZXcgUG91Y2hFcnJvcig0MTIsICdmaWxlX2V4aXN0cycsICdUaGUgZGF0YWJhc2UgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLicpO1xudmFyIE1JU1NJTkdfU1RVQiA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3Npbmdfc3R1YicsICdBIHByZS1leGlzdGluZyBhdHRhY2htZW50IHN0dWIgd2FzblxcJ3QgZm91bmQnKTtcbnZhciBJTlZBTElEX1VSTCA9IG5ldyBQb3VjaEVycm9yKDQxMywgJ2ludmFsaWRfdXJsJywgJ1Byb3ZpZGVkIFVSTCBpcyBpbnZhbGlkJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yKGVycm9yLCByZWFzb24pIHtcbiAgZnVuY3Rpb24gQ3VzdG9tUG91Y2hFcnJvcihyZWFzb24pIHtcbiAgICAvLyBpbmhlcml0IGVycm9yIHByb3BlcnRpZXMgZnJvbSBvdXIgcGFyZW50IGVycm9yIG1hbnVhbGx5XG4gICAgLy8gc28gYXMgdG8gYWxsb3cgcHJvcGVyIEpTT04gcGFyc2luZy5cbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyb3IpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBuYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBlcnJvcltuYW1lc1tpXV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tuYW1lc1tpXV0gPSBlcnJvcltuYW1lc1tpXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gICAgfVxuXG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIH1cbiAgfVxuICBDdXN0b21Qb3VjaEVycm9yLnByb3RvdHlwZSA9IFBvdWNoRXJyb3IucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEN1c3RvbVBvdWNoRXJyb3IocmVhc29uKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpIHtcblxuICBpZiAodHlwZW9mIGVyciAhPT0gJ29iamVjdCcpIHtcbiAgICB2YXIgZGF0YSA9IGVycjtcbiAgICBlcnIgPSBVTktOT1dOX0VSUk9SO1xuICAgIGVyci5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICgnZXJyb3InIGluIGVyciAmJiBlcnIuZXJyb3IgPT09ICdjb25mbGljdCcpIHtcbiAgICBlcnIubmFtZSA9ICdjb25mbGljdCc7XG4gICAgZXJyLnN0YXR1cyA9IDQwOTtcbiAgfVxuXG4gIGlmICghKCduYW1lJyBpbiBlcnIpKSB7XG4gICAgZXJyLm5hbWUgPSBlcnIuZXJyb3IgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgaWYgKCEoJ3N0YXR1cycgaW4gZXJyKSkge1xuICAgIGVyci5zdGF0dXMgPSA1MDA7XG4gIH1cblxuICBpZiAoISgnbWVzc2FnZScgaW4gZXJyKSkge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgZXJyLnJlYXNvbjtcbiAgfVxuXG4gIGlmICghKCdzdGFjaycgaW4gZXJyKSkge1xuICAgIGVyci5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiB0cnlGaWx0ZXIoZmlsdGVyLCBkb2MsIHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAhZmlsdGVyKGRvYywgcmVxKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdmFyIG1zZyA9ICdGaWx0ZXIgZnVuY3Rpb24gdGhyZXc6ICcgKyBlcnIudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIG1zZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsdGVyQ2hhbmdlKG9wdHMpIHtcbiAgdmFyIHJlcSA9IHt9O1xuICB2YXIgaGFzRmlsdGVyID0gb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nO1xuICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcblxuICByZXR1cm4gZnVuY3Rpb24gZmlsdGVyKGNoYW5nZSkge1xuICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgLy8gQ1NHIHNlbmRzIGV2ZW50cyBvbiB0aGUgY2hhbmdlcyBmZWVkIHRoYXQgZG9uJ3QgaGF2ZSBkb2N1bWVudHMsXG4gICAgICAvLyB0aGlzIGhhY2sgbWFrZXMgYSB3aG9sZSBsb3Qgb2YgZXhpc3RpbmcgY29kZSByb2J1c3QuXG4gICAgICBjaGFuZ2UuZG9jID0ge307XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlclJldHVybiA9IGhhc0ZpbHRlciAmJiB0cnlGaWx0ZXIob3B0cy5maWx0ZXIsIGNoYW5nZS5kb2MsIHJlcSk7XG5cbiAgICBpZiAodHlwZW9mIGZpbHRlclJldHVybiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJSZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlclJldHVybikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGRlbGV0ZSBjaGFuZ2UuZG9jO1xuICAgIH0gZWxzZSBpZiAoIW9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIGZvciAodmFyIGF0dCBpbiBjaGFuZ2UuZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZS5kb2MuX2F0dGFjaG1lbnRzLCBhdHQpKSB7XG4gICAgICAgICAgY2hhbmdlLmRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbihhcnJzKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXMgPSByZXMuY29uY2F0KGFycnNbaV0pO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vIHNoaW0gZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lLFxuXG4vLyBEZXRlcm1pbmUgaWQgYW4gSUQgaXMgdmFsaWRcbi8vICAgLSBpbnZhbGlkIElEcyBiZWdpbiB3aXRoIGFuIHVuZGVyZXNjb3JlIHRoYXQgZG9lcyBub3QgYmVnaW4gJ19kZXNpZ24nIG9yXG4vLyAgICAgJ19sb2NhbCdcbi8vICAgLSBhbnkgb3RoZXIgc3RyaW5nIHZhbHVlIGlzIGEgdmFsaWQgaWRcbi8vIFJldHVybnMgdGhlIHNwZWNpZmljIGVycm9yIG9iamVjdCBmb3IgZWFjaCBjYXNlXG5mdW5jdGlvbiBpbnZhbGlkSWRFcnJvcihpZCkge1xuICB2YXIgZXJyO1xuICBpZiAoIWlkKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19JRCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIGVyciA9IGNyZWF0ZUVycm9yKElOVkFMSURfSUQpO1xuICB9IGVsc2UgaWYgKC9eXy8udGVzdChpZCkgJiYgISgvXl8oZGVzaWdufGxvY2FsKS8pLnRlc3QoaWQpKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoUkVTRVJWRURfSUQpO1xuICB9XG4gIGlmIChlcnIpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLy8gQ2hlY2tzIGlmIGEgUG91Y2hEQiBvYmplY3QgaXMgXCJyZW1vdGVcIiBvciBub3QuIFRoaXMgaXNcblxuZnVuY3Rpb24gaXNSZW1vdGUoZGIpIHtcbiAgaWYgKHR5cGVvZiBkYi5fcmVtb3RlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZGIuX3JlbW90ZTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIGRiLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnd2FybicsXG4gICAgICAnZGIudHlwZSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICtcbiAgICAgICdhIGZ1dHVyZSB2ZXJzaW9uIG9mIFBvdWNoREInKTtcbiAgICByZXR1cm4gZGIudHlwZSgpID09PSAnaHR0cCc7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KGVlLCB0eXBlKSB7XG4gIHJldHVybiAnbGlzdGVuZXJDb3VudCcgaW4gZWUgPyBlZS5saXN0ZW5lckNvdW50KHR5cGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFLmxpc3RlbmVyQ291bnQoZWUsIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBwYXJ0cyA9IHMuc3BsaXQoJy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBwYXJ0cztcbiAgfVxuICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIFtzLCBzXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKHMpIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPyBub3JtYWxpemVkLmpvaW4oJy8nKSA6IG51bGw7XG59XG5cbi8vIG9yaWdpbmFsbHkgcGFyc2VVcmkgMS4yLjIsIG5vdyBwYXRjaGVkIGJ5IHVzXG4vLyAoYykgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4vLyBNSVQgTGljZW5zZVxudmFyIGtleXMgPSBbXCJzb3VyY2VcIiwgXCJwcm90b2NvbFwiLCBcImF1dGhvcml0eVwiLCBcInVzZXJJbmZvXCIsIFwidXNlclwiLCBcInBhc3N3b3JkXCIsXG4gICAgXCJob3N0XCIsIFwicG9ydFwiLCBcInJlbGF0aXZlXCIsIFwicGF0aFwiLCBcImRpcmVjdG9yeVwiLCBcImZpbGVcIiwgXCJxdWVyeVwiLCBcImFuY2hvclwiXTtcbnZhciBxTmFtZSA9XCJxdWVyeUtleVwiO1xudmFyIHFQYXJzZXIgPSAvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2c7XG5cbi8vIHVzZSB0aGUgXCJsb29zZVwiIHBhcnNlclxuLyogZXNsaW50IG5vLXVzZWxlc3MtZXNjYXBlOiAwICovXG52YXIgcGFyc2VyID0gL14oPzooPyFbXjpAXSs6W146QFxcL10qQCkoW146XFwvPyMuXSspOik/KD86XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuXG5mdW5jdGlvbiBwYXJzZVVyaShzdHIpIHtcbiAgdmFyIG0gPSBwYXJzZXIuZXhlYyhzdHIpO1xuICB2YXIgdXJpID0ge307XG4gIHZhciBpID0gMTQ7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IG1baV0gfHwgXCJcIjtcbiAgICB2YXIgZW5jb2RlZCA9IFsndXNlcicsICdwYXNzd29yZCddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgdXJpW2tleV0gPSBlbmNvZGVkID8gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSA6IHZhbHVlO1xuICB9XG5cbiAgdXJpW3FOYW1lXSA9IHt9O1xuICB1cmlba2V5c1sxMl1dLnJlcGxhY2UocVBhcnNlciwgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcbiAgICBpZiAoJDEpIHtcbiAgICAgIHVyaVtxTmFtZV1bJDFdID0gJDI7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdXJpO1xufVxuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vYWxleGRhdmlkL3Njb3BlLWV2YWwgdjAuMC4zXG4vLyAoc291cmNlOiBodHRwczovL3VucGtnLmNvbS9zY29wZS1ldmFsQDAuMC4zL3Njb3BlX2V2YWwuanMpXG4vLyBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgd3JhcHBlciBhcm91bmQgbmV3IEZ1bmN0aW9uKClcblxuZnVuY3Rpb24gc2NvcGVFdmFsKHNvdXJjZSwgc2NvcGUpIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gc2NvcGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3BlLCBrZXkpKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIHZhbHVlcy5wdXNoKHNjb3BlW2tleV0pO1xuICAgIH1cbiAgfVxuICBrZXlzLnB1c2goc291cmNlKTtcbiAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KG51bGwsIGtleXMpLmFwcGx5KG51bGwsIHZhbHVlcyk7XG59XG5cbi8vIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIFwidXBkYXRlIHN1Z2FyXCIgZnVuY3Rpb24gZnJvbSBkYWxlaGFydmV5L3BvdWNoZGIjMTM4OFxuLy8gdGhlIGRpZmZGdW4gdGVsbHMgdXMgd2hhdCBkZWx0YSB0byBhcHBseSB0byB0aGUgZG9jLiAgaXQgZWl0aGVyIHJldHVybnNcbi8vIHRoZSBkb2MsIG9yIGZhbHNlIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBkbyBhbiB1cGRhdGUgYWZ0ZXIgYWxsXG5mdW5jdGlvbiB1cHNlcnQoZGIsIGRvY0lkLCBkaWZmRnVuKSB7XG4gIHJldHVybiBkYi5nZXQoZG9jSWQpXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIC8vIHRoZSB1c2VyIG1pZ2h0IGNoYW5nZSB0aGUgX3Jldiwgc28gc2F2ZSBpdCBmb3IgcG9zdGVyaXR5XG4gICAgICB2YXIgZG9jUmV2ID0gZG9jLl9yZXY7XG4gICAgICB2YXIgbmV3RG9jID0gZGlmZkZ1bihkb2MpO1xuXG4gICAgICBpZiAoIW5ld0RvYykge1xuICAgICAgICAvLyBpZiB0aGUgZGlmZkZ1biByZXR1cm5zIGZhbHN5LCB3ZSBzaG9ydC1jaXJjdWl0IGFzXG4gICAgICAgIC8vIGFuIG9wdGltaXphdGlvblxuICAgICAgICByZXR1cm4ge3VwZGF0ZWQ6IGZhbHNlLCByZXY6IGRvY1Jldn07XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZXJzIGFyZW4ndCBhbGxvd2VkIHRvIG1vZGlmeSB0aGVzZSB2YWx1ZXMsXG4gICAgICAvLyBzbyByZXNldCB0aGVtIGhlcmVcbiAgICAgIG5ld0RvYy5faWQgPSBkb2NJZDtcbiAgICAgIG5ld0RvYy5fcmV2ID0gZG9jUmV2O1xuICAgICAgcmV0dXJuIHRyeUFuZFB1dChkYiwgbmV3RG9jLCBkaWZmRnVuKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdHJ5QW5kUHV0KGRiLCBkb2MsIGRpZmZGdW4pIHtcbiAgcmV0dXJuIGRiLnB1dChkb2MpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVkOiB0cnVlLFxuICAgICAgcmV2OiByZXMucmV2XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwOSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KGRiLCBkb2MuX2lkLCBkaWZmRnVuKTtcbiAgfSk7XG59XG5cbnZhciB0aGlzQXRvYiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGF0b2Ioc3RyKTtcbn07XG5cbnZhciB0aGlzQnRvYSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGJ0b2Eoc3RyKTtcbn07XG5cbi8vIEFic3RyYWN0cyBjb25zdHJ1Y3RpbmcgYSBCbG9iIG9iamVjdCwgc28gaXQgYWxzbyB3b3JrcyBpbiBvbGRlclxuLy8gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuYXRpdmUgQmxvYiBjb25zdHJ1Y3RvciAoZS5nLlxuLy8gb2xkIFF0V2ViS2l0IHZlcnNpb25zLCBBbmRyb2lkIDwgNC40KS5cbmZ1bmN0aW9uIGNyZWF0ZUJsb2IocGFydHMsIHByb3BlcnRpZXMpIHtcbiAgLyogZ2xvYmFsIEJsb2JCdWlsZGVyLE1TQmxvYkJ1aWxkZXIsTW96QmxvYkJ1aWxkZXIsV2ViS2l0QmxvYkJ1aWxkZXIgKi9cbiAgcGFydHMgPSBwYXJ0cyB8fCBbXTtcbiAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLm5hbWUgIT09IFwiVHlwZUVycm9yXCIpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHZhciBCdWlsZGVyID0gdHlwZW9mIEJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IEJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBNU0Jsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1TQmxvYkJ1aWxkZXIgOlxuICAgICAgICAgICAgICAgICAgdHlwZW9mIE1vekJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1vekJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIFdlYktpdEJsb2JCdWlsZGVyO1xuICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBidWlsZGVyLmFwcGVuZChwYXJ0c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IocHJvcGVydGllcy50eXBlKTtcbiAgfVxufVxuXG4vLyBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ5Njc2NDcvIChjb250aW51ZXMgb24gbmV4dCBsaW5lKVxuLy8gZW5jb2RlLWRlY29kZS1pbWFnZS13aXRoLWJhc2U2NC1icmVha3MtaW1hZ2UgKDIwMTMtMDQtMjEpXG5mdW5jdGlvbiBiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGJpbikge1xuICB2YXIgbGVuZ3RoID0gYmluLmxlbmd0aDtcbiAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpO1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IGJpbi5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGJpblN0cmluZ1RvQmx1ZmZlcihiaW5TdHJpbmcsIHR5cGUpIHtcbiAgcmV0dXJuIGNyZWF0ZUJsb2IoW2JpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYmluU3RyaW5nKV0sIHt0eXBlOiB0eXBlfSk7XG59XG5cbmZ1bmN0aW9uIGI2NFRvQmx1ZmZlcihiNjQsIHR5cGUpIHtcbiAgcmV0dXJuIGJpblN0cmluZ1RvQmx1ZmZlcih0aGlzQXRvYihiNjQpLCB0eXBlKTtcbn1cblxuLy9DYW4ndCBmaW5kIG9yaWdpbmFsIHBvc3QsIGJ1dCB0aGlzIGlzIGNsb3NlXG4vL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjk2NTEwNy8gKGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUpXG4vL2NvbnZlcnRpbmctYmV0d2Vlbi1zdHJpbmdzLWFuZC1hcnJheWJ1ZmZlcnNcbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcoYnVmZmVyKSB7XG4gIHZhciBiaW5hcnkgPSAnJztcbiAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgdmFyIGxlbmd0aCA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGJpbmFyeTtcbn1cblxuLy8gc2hpbSBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGl0XG5mdW5jdGlvbiByZWFkQXNCaW5hcnlTdHJpbmcoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHZhciBoYXNCaW5hcnlTdHJpbmcgPSB0eXBlb2YgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyA9PT0gJ2Z1bmN0aW9uJztcbiAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGUudGFyZ2V0LnJlc3VsdCB8fCAnJztcbiAgICBpZiAoaGFzQmluYXJ5U3RyaW5nKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICB9XG4gICAgY2FsbGJhY2soYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhyZXN1bHQpKTtcbiAgfTtcbiAgaWYgKGhhc0JpbmFyeVN0cmluZykge1xuICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gIH0gZWxzZSB7XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2JUb0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGNhbGxiYWNrKSB7XG4gIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGZ1bmN0aW9uIChiaW4pIHtcbiAgICBjYWxsYmFjayhiaW4pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2JPckJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2JPckJ1ZmZlciwgZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJhc2U2NCkpO1xuICB9KTtcbn1cblxuLy8gc2ltcGxpZmllZCBBUEkuIHVuaXZlcnNhbCBicm93c2VyIHN1cHBvcnQgaXMgYXNzdW1lZFxuZnVuY3Rpb24gcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQgfHwgbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gIH07XG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbn1cblxuLy8gdGhpcyBpcyBub3QgdXNlZCBpbiB0aGUgYnJvd3NlclxuXG52YXIgc2V0SW1tZWRpYXRlU2hpbSA9IHNlbGYuc2V0SW1tZWRpYXRlIHx8IHNlbGYuc2V0VGltZW91dDtcbnZhciBNRDVfQ0hVTktfU0laRSA9IDMyNzY4O1xuXG5mdW5jdGlvbiByYXdUb0Jhc2U2NChyYXcpIHtcbiAgcmV0dXJuIHRoaXNCdG9hKHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNsaWNlQmxvYihibG9iLCBzdGFydCwgZW5kKSB7XG4gIGlmIChibG9iLndlYmtpdFNsaWNlKSB7XG4gICAgcmV0dXJuIGJsb2Iud2Via2l0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIGJsb2Iuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEJsb2IoYnVmZmVyLCBibG9iLCBzdGFydCwgZW5kLCBjYWxsYmFjaykge1xuICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGJsb2Iuc2l6ZSkge1xuICAgIC8vIG9ubHkgc2xpY2UgYmxvYiBpZiB3ZSByZWFsbHkgbmVlZCB0b1xuICAgIGJsb2IgPSBzbGljZUJsb2IoYmxvYiwgc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgZnVuY3Rpb24gKGFycmF5QnVmZmVyKSB7XG4gICAgYnVmZmVyLmFwcGVuZChhcnJheUJ1ZmZlcik7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFN0cmluZyhidWZmZXIsIHN0cmluZywgc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcbiAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgLy8gb25seSBjcmVhdGUgYSBzdWJzdHJpbmcgaWYgd2UgcmVhbGx5IG5lZWQgdG9cbiAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICB9XG4gIGJ1ZmZlci5hcHBlbmRCaW5hcnkoc3RyaW5nKTtcbiAgY2FsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gYmluYXJ5TWQ1KGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBpbnB1dElzU3RyaW5nID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnO1xuICB2YXIgbGVuID0gaW5wdXRJc1N0cmluZyA/IGRhdGEubGVuZ3RoIDogZGF0YS5zaXplO1xuICB2YXIgY2h1bmtTaXplID0gTWF0aC5taW4oTUQ1X0NIVU5LX1NJWkUsIGxlbik7XG4gIHZhciBjaHVua3MgPSBNYXRoLmNlaWwobGVuIC8gY2h1bmtTaXplKTtcbiAgdmFyIGN1cnJlbnRDaHVuayA9IDA7XG4gIHZhciBidWZmZXIgPSBpbnB1dElzU3RyaW5nID8gbmV3IE1kNSgpIDogbmV3IE1kNS5BcnJheUJ1ZmZlcigpO1xuXG4gIHZhciBhcHBlbmQgPSBpbnB1dElzU3RyaW5nID8gYXBwZW5kU3RyaW5nIDogYXBwZW5kQmxvYjtcblxuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHNldEltbWVkaWF0ZVNoaW0obG9hZE5leHRDaHVuayk7XG4gIH1cblxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIHZhciByYXcgPSBidWZmZXIuZW5kKHRydWUpO1xuICAgIHZhciBiYXNlNjQgPSByYXdUb0Jhc2U2NChyYXcpO1xuICAgIGNhbGxiYWNrKGJhc2U2NCk7XG4gICAgYnVmZmVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWROZXh0Q2h1bmsoKSB7XG4gICAgdmFyIHN0YXJ0ID0gY3VycmVudENodW5rICogY2h1bmtTaXplO1xuICAgIHZhciBlbmQgPSBzdGFydCArIGNodW5rU2l6ZTtcbiAgICBjdXJyZW50Q2h1bmsrKztcbiAgICBpZiAoY3VycmVudENodW5rIDwgY2h1bmtzKSB7XG4gICAgICBhcHBlbmQoYnVmZmVyLCBkYXRhLCBzdGFydCwgZW5kLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kKGJ1ZmZlciwgZGF0YSwgc3RhcnQsIGVuZCwgZG9uZSk7XG4gICAgfVxuICB9XG4gIGxvYWROZXh0Q2h1bmsoKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTWQ1KHN0cmluZykge1xuICByZXR1cm4gTWQ1Lmhhc2goc3RyaW5nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJldmlzaW9uIHN0cmluZyB0aGF0IGRvZXMgTk9UIGluY2x1ZGUgdGhlIHJldmlzaW9uIGhlaWdodFxuICogRm9yIGV4YW1wbGUgJzU2NjQ5ZjFiMDUwNmM2Y2E5ZmRhMDc0NmViMGNhY2RmJ1xuICovXG5mdW5jdGlvbiByZXYkJDEoZG9jLCBkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgaWYgKCFkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgICByZXR1cm4gdjQoKS5yZXBsYWNlKC8tL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgdmFyIG11dGF0ZWFibGVEb2MgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIGRvYyk7XG4gIGRlbGV0ZSBtdXRhdGVhYmxlRG9jLl9yZXZfdHJlZTtcbiAgcmV0dXJuIHN0cmluZ01kNShKU09OLnN0cmluZ2lmeShtdXRhdGVhYmxlRG9jKSk7XG59XG5cbnZhciB1dWlkID0gdjQ7IC8vIG1pbWljIG9sZCBpbXBvcnQsIG9ubHkgdjQgaXMgZXZlciB1c2VkIGVsc2V3aGVyZVxuXG4vLyBXZSBmZXRjaCBhbGwgbGVhZnMgb2YgdGhlIHJldmlzaW9uIHRyZWUsIGFuZCBzb3J0IHRoZW0gYmFzZWQgb24gdHJlZSBsZW5ndGhcbi8vIGFuZCB3aGV0aGVyIHRoZXkgd2VyZSBkZWxldGVkLCB1bmRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggdGhlIGxvbmdlc3QgcmV2aXNpb25cbi8vIHRyZWUgKG1vc3QgZWRpdHMpIHdpblxuLy8gVGhlIGZpbmFsIHNvcnQgYWxnb3JpdGhtIGlzIHNsaWdodGx5IGRvY3VtZW50ZWQgaW4gYSBzaWRlYmFyIGhlcmU6XG4vLyBodHRwOi8vZ3VpZGUuY291Y2hkYi5vcmcvZHJhZnQvY29uZmxpY3RzLmh0bWxcbmZ1bmN0aW9uIHdpbm5pbmdSZXYobWV0YWRhdGEpIHtcbiAgdmFyIHdpbm5pbmdJZDtcbiAgdmFyIHdpbm5pbmdQb3M7XG4gIHZhciB3aW5uaW5nRGVsZXRlZDtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zO1xuICAgIGlmIChicmFuY2hlcy5sZW5ndGgpIHsgLy8gbm9uLWxlYWZcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBicmFuY2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0b1Zpc2l0LnB1c2goe3BvczogcG9zICsgMSwgaWRzOiBicmFuY2hlc1tpXX0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBkZWxldGVkID0gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgdmFyIGlkID0gdHJlZVswXTtcbiAgICAvLyBzb3J0IGJ5IGRlbGV0ZWQsIHRoZW4gcG9zLCB0aGVuIGlkXG4gICAgaWYgKCF3aW5uaW5nSWQgfHwgKHdpbm5pbmdEZWxldGVkICE9PSBkZWxldGVkID8gd2lubmluZ0RlbGV0ZWQgOlxuICAgICAgICB3aW5uaW5nUG9zICE9PSBwb3MgPyB3aW5uaW5nUG9zIDwgcG9zIDogd2lubmluZ0lkIDwgaWQpKSB7XG4gICAgICB3aW5uaW5nSWQgPSBpZDtcbiAgICAgIHdpbm5pbmdQb3MgPSBwb3M7XG4gICAgICB3aW5uaW5nRGVsZXRlZCA9IGRlbGV0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdpbm5pbmdQb3MgKyAnLScgKyB3aW5uaW5nSWQ7XG59XG5cbi8vIFByZXR0eSBtdWNoIGFsbCBiZWxvdyBjYW4gYmUgY29tYmluZWQgaW50byBhIGhpZ2hlciBvcmRlciBmdW5jdGlvbiB0b1xuLy8gdHJhdmVyc2UgcmV2aXNpb25zXG4vLyBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIGFzIGNvbnRleHQgdG8gYWxsXG4vLyBjaGlsZHJlbiBvZiB0aGF0IG5vZGVcbmZ1bmN0aW9uIHRyYXZlcnNlUmV2VHJlZShyZXZzLCBjYWxsYmFjaykge1xuICB2YXIgdG9WaXNpdCA9IHJldnMuc2xpY2UoKTtcblxuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBuZXdDdHggPVxuICAgICAgY2FsbGJhY2soYnJhbmNoZXMubGVuZ3RoID09PSAwLCBwb3MsIHRyZWVbMF0sIG5vZGUuY3R4LCB0cmVlWzFdKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBjdHg6IG5ld0N0eH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb3J0QnlQb3MoYSwgYikge1xuICByZXR1cm4gYS5wb3MgLSBiLnBvcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdExlYXZlcyhyZXZzKSB7XG4gIHZhciBsZWF2ZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIGFjYywgb3B0cykge1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIGxlYXZlcy5wdXNoKHtyZXY6IHBvcyArIFwiLVwiICsgaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG4gICAgfVxuICB9KTtcbiAgbGVhdmVzLnNvcnQoc29ydEJ5UG9zKS5yZXZlcnNlKCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkZWxldGUgbGVhdmVzW2ldLnBvcztcbiAgfVxuICByZXR1cm4gbGVhdmVzO1xufVxuXG4vLyByZXR1cm5zIHJldnMgb2YgYWxsIGNvbmZsaWN0cyB0aGF0IGlzIGxlYXZlcyBzdWNoIHRoYXRcbi8vIDEuIGFyZSBub3QgZGVsZXRlZCBhbmRcbi8vIDIuIGFyZSBkaWZmZXJlbnQgdGhhbiB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKSB7XG4gIHZhciB3aW4gPSB3aW5uaW5nUmV2KG1ldGFkYXRhKTtcbiAgdmFyIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMobWV0YWRhdGEucmV2X3RyZWUpO1xuICB2YXIgY29uZmxpY3RzID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgbGVhZiA9IGxlYXZlc1tpXTtcbiAgICBpZiAobGVhZi5yZXYgIT09IHdpbiAmJiAhbGVhZi5vcHRzLmRlbGV0ZWQpIHtcbiAgICAgIGNvbmZsaWN0cy5wdXNoKGxlYWYucmV2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuLy8gY29tcGFjdCBhIHRyZWUgYnkgbWFya2luZyBpdHMgbm9uLWxlYWZzIGFzIG1pc3NpbmcsXG4vLyBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZXZzIHRvIGRlbGV0ZVxuZnVuY3Rpb24gY29tcGFjdFRyZWUobWV0YWRhdGEpIHtcbiAgdmFyIHJldnMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkhhc2gsIGN0eCwgb3B0cykge1xuICAgIGlmIChvcHRzLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScgJiYgIWlzTGVhZikge1xuICAgICAgcmV2cy5wdXNoKHBvcyArICctJyArIHJldkhhc2gpO1xuICAgICAgb3B0cy5zdGF0dXMgPSAnbWlzc2luZyc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldnM7XG59XG5cbi8vIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgdGhlIHBhdGhzIHRvIHRoZSBsZWFmcyBpbiB0aGlzIHJldmlzaW9uIHRyZWVcbmZ1bmN0aW9uIHJvb3RUb0xlYWYocmV2cykge1xuICB2YXIgcGF0aHMgPSBbXTtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIHZhciBwb3MgPSBub2RlLnBvcztcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBpZCA9IHRyZWVbMF07XG4gICAgdmFyIG9wdHMgPSB0cmVlWzFdO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIGlzTGVhZiA9IGJyYW5jaGVzLmxlbmd0aCA9PT0gMDtcblxuICAgIHZhciBoaXN0b3J5ID0gbm9kZS5oaXN0b3J5ID8gbm9kZS5oaXN0b3J5LnNsaWNlKCkgOiBbXTtcbiAgICBoaXN0b3J5LnB1c2goe2lkOiBpZCwgb3B0czogb3B0c30pO1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIHBhdGhzLnB1c2goe3BvczogKHBvcyArIDEgLSBoaXN0b3J5Lmxlbmd0aCksIGlkczogaGlzdG9yeX0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBoaXN0b3J5OiBoaXN0b3J5fSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXRocy5yZXZlcnNlKCk7XG59XG5cbi8vIGZvciBhIGJldHRlciBvdmVydmlldyBvZiB3aGF0IHRoaXMgaXMgZG9pbmcsIHJlYWQ6XG5cbmZ1bmN0aW9uIHNvcnRCeVBvcyQxKGEsIGIpIHtcbiAgcmV0dXJuIGEucG9zIC0gYi5wb3M7XG59XG5cbi8vIGNsYXNzaWMgYmluYXJ5IHNlYXJjaFxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFyciwgaXRlbSwgY29tcGFyYXRvcikge1xuICB2YXIgbG93ID0gMDtcbiAgdmFyIGhpZ2ggPSBhcnIubGVuZ3RoO1xuICB2YXIgbWlkO1xuICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTtcbiAgICBpZiAoY29tcGFyYXRvcihhcnJbbWlkXSwgaXRlbSkgPCAwKSB7XG4gICAgICBsb3cgPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG93O1xufVxuXG4vLyBhc3N1bWluZyB0aGUgYXJyIGlzIHNvcnRlZCwgaW5zZXJ0IHRoZSBpdGVtIGluIHRoZSBwcm9wZXIgcGxhY2VcbmZ1bmN0aW9uIGluc2VydFNvcnRlZChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGlkeCA9IGJpbmFyeVNlYXJjaChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpO1xuICBhcnIuc3BsaWNlKGlkeCwgMCwgaXRlbSk7XG59XG5cbi8vIFR1cm4gYSBwYXRoIGFzIGEgZmxhdCBhcnJheSBpbnRvIGEgdHJlZSB3aXRoIGEgc2luZ2xlIGJyYW5jaC5cbi8vIElmIGFueSBzaG91bGQgYmUgc3RlbW1lZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LCB0aGF0J3MgcGFzc2VkXG4vLyBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXRoVG9UcmVlKHBhdGgsIG51bVN0ZW1tZWQpIHtcbiAgdmFyIHJvb3Q7XG4gIHZhciBsZWFmO1xuICBmb3IgKHZhciBpID0gbnVtU3RlbW1lZCwgbGVuID0gcGF0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBub2RlID0gcGF0aFtpXTtcbiAgICB2YXIgY3VycmVudExlYWYgPSBbbm9kZS5pZCwgbm9kZS5vcHRzLCBbXV07XG4gICAgaWYgKGxlYWYpIHtcbiAgICAgIGxlYWZbMl0ucHVzaChjdXJyZW50TGVhZik7XG4gICAgICBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3QgPSBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfVxuICB9XG4gIHJldHVybiByb290O1xufVxuXG4vLyBjb21wYXJlIHRoZSBJRHMgb2YgdHdvIHRyZWVzXG5mdW5jdGlvbiBjb21wYXJlVHJlZShhLCBiKSB7XG4gIHJldHVybiBhWzBdIDwgYlswXSA/IC0xIDogMTtcbn1cblxuLy8gTWVyZ2UgdHdvIHRyZWVzIHRvZ2V0aGVyXG4vLyBUaGUgcm9vdHMgb2YgdHJlZTEgYW5kIHRyZWUyIG11c3QgYmUgdGhlIHNhbWUgcmV2aXNpb25cbmZ1bmN0aW9uIG1lcmdlVHJlZShpbl90cmVlMSwgaW5fdHJlZTIpIHtcbiAgdmFyIHF1ZXVlID0gW3t0cmVlMTogaW5fdHJlZTEsIHRyZWUyOiBpbl90cmVlMn1dO1xuICB2YXIgY29uZmxpY3RzID0gZmFsc2U7XG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICB2YXIgdHJlZTEgPSBpdGVtLnRyZWUxO1xuICAgIHZhciB0cmVlMiA9IGl0ZW0udHJlZTI7XG5cbiAgICBpZiAodHJlZTFbMV0uc3RhdHVzIHx8IHRyZWUyWzFdLnN0YXR1cykge1xuICAgICAgdHJlZTFbMV0uc3RhdHVzID1cbiAgICAgICAgKHRyZWUxWzFdLnN0YXR1cyA9PT0gICdhdmFpbGFibGUnIHx8XG4gICAgICAgIHRyZWUyWzFdLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScpID8gJ2F2YWlsYWJsZScgOiAnbWlzc2luZyc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlMlsyXS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0cmVlMVsyXVswXSkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2xlYWYnO1xuICAgICAgICB0cmVlMVsyXVswXSA9IHRyZWUyWzJdW2ldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1lcmdlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmVlMVsyXS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodHJlZTFbMl1bal1bMF0gPT09IHRyZWUyWzJdW2ldWzBdKSB7XG4gICAgICAgICAgcXVldWUucHVzaCh7dHJlZTE6IHRyZWUxWzJdW2pdLCB0cmVlMjogdHJlZTJbMl1baV19KTtcbiAgICAgICAgICBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW1lcmdlZCkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2JyYW5jaCc7XG4gICAgICAgIGluc2VydFNvcnRlZCh0cmVlMVsyXSwgdHJlZTJbMl1baV0sIGNvbXBhcmVUcmVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtjb25mbGljdHM6IGNvbmZsaWN0cywgdHJlZTogaW5fdHJlZTF9O1xufVxuXG5mdW5jdGlvbiBkb01lcmdlKHRyZWUsIHBhdGgsIGRvbnRFeHBhbmQpIHtcbiAgdmFyIHJlc3RyZWUgPSBbXTtcbiAgdmFyIGNvbmZsaWN0cyA9IGZhbHNlO1xuICB2YXIgbWVyZ2VkID0gZmFsc2U7XG4gIHZhciByZXM7XG5cbiAgaWYgKCF0cmVlLmxlbmd0aCkge1xuICAgIHJldHVybiB7dHJlZTogW3BhdGhdLCBjb25mbGljdHM6ICduZXdfbGVhZid9O1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRyZWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYnJhbmNoID0gdHJlZVtpXTtcbiAgICBpZiAoYnJhbmNoLnBvcyA9PT0gcGF0aC5wb3MgJiYgYnJhbmNoLmlkc1swXSA9PT0gcGF0aC5pZHNbMF0pIHtcbiAgICAgIC8vIFBhdGhzIHN0YXJ0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFuZCBoYXZlIHRoZSBzYW1lIHJvb3QsIHNvIHRoZXkgbmVlZFxuICAgICAgLy8gbWVyZ2VkXG4gICAgICByZXMgPSBtZXJnZVRyZWUoYnJhbmNoLmlkcywgcGF0aC5pZHMpO1xuICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IGJyYW5jaC5wb3MsIGlkczogcmVzLnRyZWV9KTtcbiAgICAgIGNvbmZsaWN0cyA9IGNvbmZsaWN0cyB8fCByZXMuY29uZmxpY3RzO1xuICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRvbnRFeHBhbmQgIT09IHRydWUpIHtcbiAgICAgIC8vIFRoZSBwYXRocyBzdGFydCBhdCBhIGRpZmZlcmVudCBwb3NpdGlvbiwgdGFrZSB0aGUgZWFybGllc3QgcGF0aCBhbmRcbiAgICAgIC8vIHRyYXZlcnNlIHVwIHVudGlsIGl0IGFzIGF0IHRoZSBzYW1lIHBvaW50IGZyb20gcm9vdCBhcyB0aGUgcGF0aCB3ZVxuICAgICAgLy8gd2FudCB0byBtZXJnZS4gIElmIHRoZSBrZXlzIG1hdGNoIHdlIHJldHVybiB0aGUgbG9uZ2VyIHBhdGggd2l0aCB0aGVcbiAgICAgIC8vIG90aGVyIG1lcmdlZCBBZnRlciBzdGVtbWluZyB3ZSBkb250IHdhbnQgdG8gZXhwYW5kIHRoZSB0cmVlc1xuXG4gICAgICB2YXIgdDEgPSBicmFuY2gucG9zIDwgcGF0aC5wb3MgPyBicmFuY2ggOiBwYXRoO1xuICAgICAgdmFyIHQyID0gYnJhbmNoLnBvcyA8IHBhdGgucG9zID8gcGF0aCA6IGJyYW5jaDtcbiAgICAgIHZhciBkaWZmID0gdDIucG9zIC0gdDEucG9zO1xuXG4gICAgICB2YXIgY2FuZGlkYXRlUGFyZW50cyA9IFtdO1xuXG4gICAgICB2YXIgdHJlZXMgPSBbXTtcbiAgICAgIHRyZWVzLnB1c2goe2lkczogdDEuaWRzLCBkaWZmOiBkaWZmLCBwYXJlbnQ6IG51bGwsIHBhcmVudElkeDogbnVsbH0pO1xuICAgICAgd2hpbGUgKHRyZWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0cmVlcy5wb3AoKTtcbiAgICAgICAgaWYgKGl0ZW0uZGlmZiA9PT0gMCkge1xuICAgICAgICAgIGlmIChpdGVtLmlkc1swXSA9PT0gdDIuaWRzWzBdKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVQYXJlbnRzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbGVtZW50cyA9IGl0ZW0uaWRzWzJdO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgZWxlbWVudHNMZW4gPSBlbGVtZW50cy5sZW5ndGg7IGogPCBlbGVtZW50c0xlbjsgaisrKSB7XG4gICAgICAgICAgdHJlZXMucHVzaCh7XG4gICAgICAgICAgICBpZHM6IGVsZW1lbnRzW2pdLFxuICAgICAgICAgICAgZGlmZjogaXRlbS5kaWZmIC0gMSxcbiAgICAgICAgICAgIHBhcmVudDogaXRlbS5pZHMsXG4gICAgICAgICAgICBwYXJlbnRJZHg6IGpcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZWwgPSBjYW5kaWRhdGVQYXJlbnRzWzBdO1xuXG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gbWVyZ2VUcmVlKGVsLmlkcywgdDIuaWRzKTtcbiAgICAgICAgZWwucGFyZW50WzJdW2VsLnBhcmVudElkeF0gPSByZXMudHJlZTtcbiAgICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IHQxLnBvcywgaWRzOiB0MS5pZHN9KTtcbiAgICAgICAgY29uZmxpY3RzID0gY29uZmxpY3RzIHx8IHJlcy5jb25mbGljdHM7XG4gICAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIGRpZG50IGZpbmRcbiAgaWYgKCFtZXJnZWQpIHtcbiAgICByZXN0cmVlLnB1c2gocGF0aCk7XG4gIH1cblxuICByZXN0cmVlLnNvcnQoc29ydEJ5UG9zJDEpO1xuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdHJlZSxcbiAgICBjb25mbGljdHM6IGNvbmZsaWN0cyB8fCAnaW50ZXJuYWxfbm9kZSdcbiAgfTtcbn1cblxuLy8gVG8gZW5zdXJlIHdlIGRvbnQgZ3JvdyB0aGUgcmV2aXNpb24gdHJlZSBpbmZpbml0ZWx5LCB3ZSBzdGVtIG9sZCByZXZpc2lvbnNcbmZ1bmN0aW9uIHN0ZW0odHJlZSwgZGVwdGgpIHtcbiAgLy8gRmlyc3Qgd2UgYnJlYWsgb3V0IHRoZSB0cmVlIGludG8gYSBjb21wbGV0ZSBsaXN0IG9mIHJvb3QgdG8gbGVhZiBwYXRoc1xuICB2YXIgcGF0aHMgPSByb290VG9MZWFmKHRyZWUpO1xuICB2YXIgc3RlbW1lZFJldnM7XG5cbiAgdmFyIHJlc3VsdDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhdGhzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgLy8gVGhlbiBmb3IgZWFjaCBwYXRoLCB3ZSBjdXQgb2ZmIHRoZSBzdGFydCBvZiB0aGUgcGF0aCBiYXNlZCBvbiB0aGVcbiAgICAvLyBgZGVwdGhgIHRvIHN0ZW0gdG8sIGFuZCBnZW5lcmF0ZSBhIG5ldyBzZXQgb2YgZmxhdCB0cmVlc1xuICAgIHZhciBwYXRoID0gcGF0aHNbaV07XG4gICAgdmFyIHN0ZW1tZWQgPSBwYXRoLmlkcztcbiAgICB2YXIgbm9kZTtcbiAgICBpZiAoc3RlbW1lZC5sZW5ndGggPiBkZXB0aCkge1xuICAgICAgLy8gb25seSBkbyB0aGUgc3RlbW1pbmcgd29yayBpZiB3ZSBhY3R1YWxseSBuZWVkIHRvIHN0ZW1cbiAgICAgIGlmICghc3RlbW1lZFJldnMpIHtcbiAgICAgICAgc3RlbW1lZFJldnMgPSB7fTsgLy8gYXZvaWQgYWxsb2NhdGluZyB0aGlzIG9iamVjdCB1bm5lY2Vzc2FyaWx5XG4gICAgICB9XG4gICAgICB2YXIgbnVtU3RlbW1lZCA9IHN0ZW1tZWQubGVuZ3RoIC0gZGVwdGg7XG4gICAgICBub2RlID0ge1xuICAgICAgICBwb3M6IHBhdGgucG9zICsgbnVtU3RlbW1lZCxcbiAgICAgICAgaWRzOiBwYXRoVG9UcmVlKHN0ZW1tZWQsIG51bVN0ZW1tZWQpXG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBzID0gMDsgcyA8IG51bVN0ZW1tZWQ7IHMrKykge1xuICAgICAgICB2YXIgcmV2ID0gKHBhdGgucG9zICsgcykgKyAnLScgKyBzdGVtbWVkW3NdLmlkO1xuICAgICAgICBzdGVtbWVkUmV2c1tyZXZdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBubyBuZWVkIHRvIGFjdHVhbGx5IHN0ZW1cbiAgICAgIG5vZGUgPSB7XG4gICAgICAgIHBvczogcGF0aC5wb3MsXG4gICAgICAgIGlkczogcGF0aFRvVHJlZShzdGVtbWVkLCAwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHdlIHJlbWVyZ2UgYWxsIHRob3NlIGZsYXQgdHJlZXMgdG9nZXRoZXIsIGVuc3VyaW5nIHRoYXQgd2UgZG9udFxuICAgIC8vIGNvbm5lY3QgdHJlZXMgdGhhdCB3b3VsZCBnbyBiZXlvbmQgdGhlIGRlcHRoIGxpbWl0XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gZG9NZXJnZShyZXN1bHQsIG5vZGUsIHRydWUpLnRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFtub2RlXTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGlzIGlzIG1lbW9yeS1oZWF2eSBwZXIgQ2hyb21lIHByb2ZpbGVyLCBhdm9pZCB1bmxlc3Mgd2UgYWN0dWFsbHkgc3RlbW1lZFxuICBpZiAoc3RlbW1lZFJldnMpIHtcbiAgICB0cmF2ZXJzZVJldlRyZWUocmVzdWx0LCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIHJldkhhc2gpIHtcbiAgICAgIC8vIHNvbWUgcmV2aXNpb25zIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBhIGJyYW5jaCBidXQgbm90IGluIGFub3RoZXJcbiAgICAgIGRlbGV0ZSBzdGVtbWVkUmV2c1twb3MgKyAnLScgKyByZXZIYXNoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdWx0LFxuICAgIHJldnM6IHN0ZW1tZWRSZXZzID8gT2JqZWN0LmtleXMoc3RlbW1lZFJldnMpIDogW11cbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2UodHJlZSwgcGF0aCwgZGVwdGgpIHtcbiAgdmFyIG5ld1RyZWUgPSBkb01lcmdlKHRyZWUsIHBhdGgpO1xuICB2YXIgc3RlbW1lZCA9IHN0ZW0obmV3VHJlZS50cmVlLCBkZXB0aCk7XG4gIHJldHVybiB7XG4gICAgdHJlZTogc3RlbW1lZC50cmVlLFxuICAgIHN0ZW1tZWRSZXZzOiBzdGVtbWVkLnJldnMsXG4gICAgY29uZmxpY3RzOiBuZXdUcmVlLmNvbmZsaWN0c1xuICB9O1xufVxuXG4vLyByZXR1cm4gdHJ1ZSBpZiBhIHJldiBleGlzdHMgaW4gdGhlIHJldiB0cmVlLCBmYWxzZSBvdGhlcndpc2VcbmZ1bmN0aW9uIHJldkV4aXN0cyhyZXZzLCByZXYpIHtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBzcGxpdFJldiA9IHJldi5zcGxpdCgnLScpO1xuICB2YXIgdGFyZ2V0UG9zID0gcGFyc2VJbnQoc3BsaXRSZXZbMF0sIDEwKTtcbiAgdmFyIHRhcmdldElkID0gc3BsaXRSZXZbMV07XG5cbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKG5vZGUucG9zID09PSB0YXJnZXRQb3MgJiYgbm9kZS5pZHNbMF0gPT09IHRhcmdldElkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGJyYW5jaGVzID0gbm9kZS5pZHNbMl07XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJyYW5jaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0b1Zpc2l0LnB1c2goe3Bvczogbm9kZS5wb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJlZXMobm9kZSkge1xuICByZXR1cm4gbm9kZS5pZHM7XG59XG5cbi8vIGNoZWNrIGlmIGEgc3BlY2lmaWMgcmV2aXNpb24gb2YgYSBkb2MgaGFzIGJlZW4gZGVsZXRlZFxuLy8gIC0gbWV0YWRhdGE6IHRoZSBtZXRhZGF0YSBvYmplY3QgZnJvbSB0aGUgZG9jIHN0b3JlXG4vLyAgLSByZXY6IChvcHRpb25hbCkgdGhlIHJldmlzaW9uIHRvIGNoZWNrLiBkZWZhdWx0cyB0byB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBpc0RlbGV0ZWQobWV0YWRhdGEsIHJldikge1xuICBpZiAoIXJldikge1xuICAgIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICB9XG4gIHZhciBpZCA9IHJldi5zdWJzdHJpbmcocmV2LmluZGV4T2YoJy0nKSArIDEpO1xuICB2YXIgdG9WaXNpdCA9IG1ldGFkYXRhLnJldl90cmVlLm1hcChnZXRUcmVlcyk7XG5cbiAgdmFyIHRyZWU7XG4gIHdoaWxlICgodHJlZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKHRyZWVbMF0gPT09IGlkKSB7XG4gICAgICByZXR1cm4gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgfVxuICAgIHRvVmlzaXQgPSB0b1Zpc2l0LmNvbmNhdCh0cmVlWzJdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0xvY2FsSWQoaWQpIHtcbiAgcmV0dXJuICgvXl9sb2NhbC8pLnRlc3QoaWQpO1xufVxuXG4vLyByZXR1cm5zIHRoZSBjdXJyZW50IGxlYWYgbm9kZSBmb3IgYSBnaXZlbiByZXZpc2lvblxuZnVuY3Rpb24gbGF0ZXN0KHJldiwgbWV0YWRhdGEpIHtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgaWQgPSB0cmVlWzBdO1xuICAgIHZhciBvcHRzID0gdHJlZVsxXTtcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBpc0xlYWYgPSBicmFuY2hlcy5sZW5ndGggPT09IDA7XG5cbiAgICB2YXIgaGlzdG9yeSA9IG5vZGUuaGlzdG9yeSA/IG5vZGUuaGlzdG9yeS5zbGljZSgpIDogW107XG4gICAgaGlzdG9yeS5wdXNoKHtpZDogaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG5cbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaGlzdG9yeS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgaGlzdG9yeU5vZGUgPSBoaXN0b3J5W2ldO1xuICAgICAgICB2YXIgaGlzdG9yeVJldiA9IGhpc3RvcnlOb2RlLnBvcyArICctJyArIGhpc3RvcnlOb2RlLmlkO1xuXG4gICAgICAgIGlmIChoaXN0b3J5UmV2ID09PSByZXYpIHtcbiAgICAgICAgICAvLyByZXR1cm4gdGhlIHJldiBvZiB0aGlzIGxlYWZcbiAgICAgICAgICByZXR1cm4gcG9zICsgJy0nICsgaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMCwgbCA9IGJyYW5jaGVzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IHBvcyArIDEsIGlkczogYnJhbmNoZXNbal0sIGhpc3Rvcnk6IGhpc3Rvcnl9KTtcbiAgICB9XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIGxhdGVzdCByZXZpc2lvbiBmb3IgaWQgJyArIG1ldGFkYXRhLmlkICsgJywgcmV2ICcgKyByZXYpO1xufVxuXG5pbmhlcml0cyhDaGFuZ2VzJDEsIEVFKTtcblxuZnVuY3Rpb24gdHJ5Q2F0Y2hJbkNoYW5nZUxpc3RlbmVyKHNlbGYsIGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAvLyBpc29sYXRlIHRyeS9jYXRjaGVzIHRvIGF2b2lkIFY4IGRlb3B0aW1pemF0aW9uc1xuICB0cnkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywgY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsICdFcnJvciBpbiAub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24pOicsIGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMkMShkYiwgb3B0cywgY2FsbGJhY2spIHtcbiAgRUUuY2FsbCh0aGlzKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmRiID0gZGI7XG4gIG9wdHMgPSBvcHRzID8gY2xvbmUob3B0cykgOiB7fTtcbiAgdmFyIGNvbXBsZXRlID0gb3B0cy5jb21wbGV0ZSA9IG9uY2UoZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmIChsaXN0ZW5lckNvdW50KHNlbGYsICdlcnJvcicpID4gMCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5lbWl0KCdjb21wbGV0ZScsIHJlc3ApO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9KTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgc2VsZi5vbignY29tcGxldGUnLCBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCk7XG4gICAgfSk7XG4gICAgc2VsZi5vbignZXJyb3InLCBjYWxsYmFjayk7XG4gIH1cbiAgZnVuY3Rpb24gb25EZXN0cm95KCkge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gIH1cbiAgZGIub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcblxuICBvcHRzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lcihzZWxmLCBjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpO1xuICB9O1xuXG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIG9wdHMuY29tcGxldGUgPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmdWxmaWxsKHJlcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHNlbGYub25jZSgnY2FuY2VsJywgZnVuY3Rpb24gKCkge1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICAgIG9wdHMuY29tcGxldGUobnVsbCwge3N0YXR1czogJ2NhbmNlbGxlZCd9KTtcbiAgfSk7XG4gIHRoaXMudGhlbiA9IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpO1xuICB0aGlzWydjYXRjaCddID0gcHJvbWlzZVsnY2F0Y2gnXS5iaW5kKHByb21pc2UpO1xuICB0aGlzLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gIH0sIGNvbXBsZXRlKTtcblxuXG5cbiAgaWYgKCFkYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIGRiLnRhc2txdWV1ZS5hZGRUYXNrKGZ1bmN0aW9uIChmYWlsZWQpIHtcbiAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgb3B0cy5jb21wbGV0ZShmYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnY2FuY2VsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgfVxufVxuQ2hhbmdlcyQxLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICBpZiAodGhpcy5kYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvYywgbWV0YWRhdGEsIG9wdHMpIHtcbiAgdmFyIGNoYW5nZUxpc3QgPSBbe3JldjogZG9jLl9yZXZ9XTtcbiAgaWYgKG9wdHMuc3R5bGUgPT09ICdhbGxfZG9jcycpIHtcbiAgICBjaGFuZ2VMaXN0ID0gY29sbGVjdExlYXZlcyhtZXRhZGF0YS5yZXZfdHJlZSlcbiAgICAubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB7cmV2OiB4LnJldn07IH0pO1xuICB9XG4gIHZhciBjaGFuZ2UgPSB7XG4gICAgaWQ6IG1ldGFkYXRhLmlkLFxuICAgIGNoYW5nZXM6IGNoYW5nZUxpc3QsXG4gICAgZG9jOiBkb2NcbiAgfTtcblxuICBpZiAoaXNEZWxldGVkKG1ldGFkYXRhLCBkb2MuX3JldikpIHtcbiAgICBjaGFuZ2UuZGVsZXRlZCA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgY2hhbmdlLmRvYy5fY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgaWYgKCFjaGFuZ2UuZG9jLl9jb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgY2hhbmdlLmRvYy5fY29uZmxpY3RzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlO1xufVxuXG5DaGFuZ2VzJDEucHJvdG90eXBlLnZhbGlkYXRlQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBjYWxsYmFjayA9IG9wdHMuY29tcGxldGU7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbikge1xuICAgIFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4udmFsaWRhdGUob3B0cywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICB9XG59O1xuXG5DaGFuZ2VzJDEucHJvdG90eXBlLmRvQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIGlmICgnbGl2ZScgaW4gb3B0cyAmJiAhKCdjb250aW51b3VzJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuY29udGludW91cyA9IG9wdHMubGl2ZTtcbiAgfVxuICBvcHRzLnByb2Nlc3NDaGFuZ2UgPSBwcm9jZXNzQ2hhbmdlO1xuXG4gIGlmIChvcHRzLnNpbmNlID09PSAnbGF0ZXN0Jykge1xuICAgIG9wdHMuc2luY2UgPSAnbm93JztcbiAgfVxuICBpZiAoIW9wdHMuc2luY2UpIHtcbiAgICBvcHRzLnNpbmNlID0gMDtcbiAgfVxuICBpZiAob3B0cy5zaW5jZSA9PT0gJ25vdycpIHtcbiAgICB0aGlzLmRiLmluZm8oKS50aGVuKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9wdHMuc2luY2UgPSBpbmZvLnVwZGF0ZV9zZXE7XG4gICAgICBzZWxmLmRvQ2hhbmdlcyhvcHRzKTtcbiAgICB9LCBjYWxsYmFjayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4pIHtcbiAgICBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLm5vcm1hbGl6ZShvcHRzKTtcbiAgICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbi5zaG91bGRGaWx0ZXIodGhpcywgb3B0cykpIHtcbiAgICAgIHJldHVybiBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLmZpbHRlcih0aGlzLCBvcHRzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgWydkb2NfaWRzJywgJ2ZpbHRlcicsICdzZWxlY3RvcicsICd2aWV3J10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoa2V5IGluIG9wdHMpIHtcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLFxuICAgICAgICAgICdUaGUgXCInICsga2V5ICsgJ1wiIG9wdGlvbiB3YXMgcGFzc2VkIGluIHRvIGNoYW5nZXMvcmVwbGljYXRlLCAnICtcbiAgICAgICAgICAnYnV0IHBvdWNoZGItY2hhbmdlcy1maWx0ZXIgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQsIHNvIGl0ICcgK1xuICAgICAgICAgICd3YXMgaWdub3JlZC4gUGxlYXNlIGluc3RhbGwgdGhlIHBsdWdpbiB0byBlbmFibGUgZmlsdGVyaW5nLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghKCdkZXNjZW5kaW5nJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuZGVzY2VuZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gMCBhbmQgMSBzaG91bGQgcmV0dXJuIDEgZG9jdW1lbnRcbiAgb3B0cy5saW1pdCA9IG9wdHMubGltaXQgPT09IDAgPyAxIDogb3B0cy5saW1pdDtcbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICB2YXIgbmV3UHJvbWlzZSA9IHRoaXMuZGIuX2NoYW5nZXMob3B0cyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChuZXdQcm9taXNlICYmIHR5cGVvZiBuZXdQcm9taXNlLmNhbmNlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBjYW5jZWwgPSBzZWxmLmNhbmNlbDtcbiAgICBzZWxmLmNhbmNlbCA9IGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgbmV3UHJvbWlzZS5jYW5jZWwoKTtcbiAgICAgIGNhbmNlbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLypcbiAqIEEgZ2VuZXJpYyBwb3VjaCBhZGFwdGVyXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gV3JhcHBlciBmb3IgZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGUgYnVsa2RvY3MgYXBpIHdpdGggYSBzaW5nbGUgZG9jLFxuLy8gaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhbiBlcnJvciwgcmV0dXJuIGFuIGVycm9yXG5mdW5jdGlvbiB5YW5rRXJyb3IoY2FsbGJhY2ssIGRvY0lkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7XG4gICAgaWYgKGVyciB8fCAocmVzdWx0c1swXSAmJiByZXN1bHRzWzBdLmVycm9yKSkge1xuICAgICAgZXJyID0gZXJyIHx8IHJlc3VsdHNbMF07XG4gICAgICBlcnIuZG9jSWQgPSBkb2NJZDtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMubGVuZ3RoID8gcmVzdWx0c1swXSAgOiByZXN1bHRzKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIGNsZWFuIGRvY3MgZ2l2ZW4gdG8gdXMgYnkgdGhlIHVzZXJcbmZ1bmN0aW9uIGNsZWFuRG9jcyhkb2NzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NzW2ldO1xuICAgIGlmIChkb2MuX2RlbGV0ZWQpIHtcbiAgICAgIGRlbGV0ZSBkb2MuX2F0dGFjaG1lbnRzOyAvLyBpZ25vcmUgYXR0cyBmb3IgZGVsZXRlZCBkb2NzXG4gICAgfSBlbHNlIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBmaWx0ZXIgb3V0IGV4dHJhbmVvdXMga2V5cyBmcm9tIF9hdHRhY2htZW50c1xuICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXR0cy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgYXR0ID0gYXR0c1tqXTtcbiAgICAgICAgZG9jLl9hdHRhY2htZW50c1thdHRdID0gcGljayhkb2MuX2F0dGFjaG1lbnRzW2F0dF0sXG4gICAgICAgICAgWydkYXRhJywgJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnLCAnbGVuZ3RoJywgJ3JldnBvcycsICdzdHViJ10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBjb21wYXJlIHR3byBkb2NzLCBmaXJzdCBieSBfaWQgdGhlbiBieSBfcmV2XG5mdW5jdGlvbiBjb21wYXJlQnlJZFRoZW5SZXYoYSwgYikge1xuICB2YXIgaWRDb21wYXJlID0gY29tcGFyZShhLl9pZCwgYi5faWQpO1xuICBpZiAoaWRDb21wYXJlICE9PSAwKSB7XG4gICAgcmV0dXJuIGlkQ29tcGFyZTtcbiAgfVxuICB2YXIgYVN0YXJ0ID0gYS5fcmV2aXNpb25zID8gYS5fcmV2aXNpb25zLnN0YXJ0IDogMDtcbiAgdmFyIGJTdGFydCA9IGIuX3JldmlzaW9ucyA/IGIuX3JldmlzaW9ucy5zdGFydCA6IDA7XG4gIHJldHVybiBjb21wYXJlKGFTdGFydCwgYlN0YXJ0KTtcbn1cblxuLy8gZm9yIGV2ZXJ5IG5vZGUgaW4gYSByZXZpc2lvbiB0cmVlIGNvbXB1dGVzIGl0cyBkaXN0YW5jZSBmcm9tIHRoZSBjbG9zZXN0XG4vLyBsZWFmXG5mdW5jdGlvbiBjb21wdXRlSGVpZ2h0KHJldnMpIHtcbiAgdmFyIGhlaWdodCA9IHt9O1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIHBybnQpIHtcbiAgICB2YXIgcmV2ID0gcG9zICsgXCItXCIgKyBpZDtcbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBoZWlnaHRbcmV2XSA9IDA7XG4gICAgfVxuICAgIGlmIChwcm50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVkZ2VzLnB1c2goe2Zyb206IHBybnQsIHRvOiByZXZ9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldjtcbiAgfSk7XG5cbiAgZWRnZXMucmV2ZXJzZSgpO1xuICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgaWYgKGhlaWdodFtlZGdlLmZyb21dID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlaWdodFtlZGdlLmZyb21dID0gMSArIGhlaWdodFtlZGdlLnRvXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVpZ2h0W2VkZ2UuZnJvbV0gPSBNYXRoLm1pbihoZWlnaHRbZWRnZS5mcm9tXSwgMSArIGhlaWdodFtlZGdlLnRvXSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cblxuZnVuY3Rpb24gYWxsRG9jc0tleXNQYXJzZShvcHRzKSB7XG4gIHZhciBrZXlzID0gICgnbGltaXQnIGluIG9wdHMpID9cbiAgICBvcHRzLmtleXMuc2xpY2Uob3B0cy5za2lwLCBvcHRzLmxpbWl0ICsgb3B0cy5za2lwKSA6XG4gICAgKG9wdHMuc2tpcCA+IDApID8gb3B0cy5rZXlzLnNsaWNlKG9wdHMuc2tpcCkgOiBvcHRzLmtleXM7XG4gIG9wdHMua2V5cyA9IGtleXM7XG4gIG9wdHMuc2tpcCA9IDA7XG4gIGRlbGV0ZSBvcHRzLmxpbWl0O1xuICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAga2V5cy5yZXZlcnNlKCk7XG4gICAgb3B0cy5kZXNjZW5kaW5nID0gZmFsc2U7XG4gIH1cbn1cblxuLy8gYWxsIGNvbXBhY3Rpb24gaXMgZG9uZSBpbiBhIHF1ZXVlLCB0byBhdm9pZCBhdHRhY2hpbmdcbi8vIHRvbyBtYW55IGxpc3RlbmVycyBhdCBvbmNlXG5mdW5jdGlvbiBkb05leHRDb21wYWN0aW9uKHNlbGYpIHtcbiAgdmFyIHRhc2sgPSBzZWxmLl9jb21wYWN0aW9uUXVldWVbMF07XG4gIHZhciBvcHRzID0gdGFzay5vcHRzO1xuICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICBzZWxmLmdldCgnX2xvY2FsL2NvbXBhY3Rpb24nKS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAoZG9jICYmIGRvYy5sYXN0X3NlcSkge1xuICAgICAgb3B0cy5sYXN0X3NlcSA9IGRvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgc2VsZi5fY29tcGFjdChvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH1cbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoc2VsZi5fY29tcGFjdGlvblF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIGRvTmV4dENvbXBhY3Rpb24oc2VsZik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXR0YWNobWVudE5hbWVFcnJvcihuYW1lKSB7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gJ18nKSB7XG4gICAgcmV0dXJuIG5hbWUgKyAnIGlzIG5vdCBhIHZhbGlkIGF0dGFjaG1lbnQgbmFtZSwgYXR0YWNobWVudCAnICtcbiAgICAgICduYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBcXCdfXFwnJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmluaGVyaXRzKEFic3RyYWN0UG91Y2hEQiwgRUUpO1xuXG5mdW5jdGlvbiBBYnN0cmFjdFBvdWNoREIoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG5cbiAgLy8gcmUtYmluZCBwcm90b3R5cGVkIG1ldGhvZHNcbiAgZm9yICh2YXIgcCBpbiBBYnN0cmFjdFBvdWNoREIucHJvdG90eXBlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzW3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW3BdID0gdGhpc1twXS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnBvc3QgPVxuICBhZGFwdGVyRnVuKCdwb3N0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbZG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgZG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0ID0gYWRhcHRlckZ1bigncHV0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICBpbnZhbGlkSWRFcnJvcihkb2MuX2lkKTtcbiAgaWYgKGlzTG9jYWxJZChkb2MuX2lkKSAmJiB0eXBlb2YgdGhpcy5fcHV0TG9jYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVtb3ZlTG9jYWwoZG9jLCBjYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wdXRMb2NhbChkb2MsIGNiKTtcbiAgICB9XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAob3B0cy5mb3JjZSAmJiBkb2MuX3Jldikge1xuICAgIHRyYW5zZm9ybUZvcmNlT3B0aW9uVG9OZXdFZGl0c09wdGlvbigpO1xuICAgIHB1dERvYyhmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZXJyID8gbnVsbCA6IHtvazogdHJ1ZSwgaWQ6IGRvYy5faWQsIHJldjogZG9jLl9yZXZ9O1xuICAgICAgY2IoZXJyLCByZXN1bHQpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHB1dERvYyhjYik7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JjZU9wdGlvblRvTmV3RWRpdHNPcHRpb24oKSB7XG4gICAgdmFyIHBhcnRzID0gZG9jLl9yZXYuc3BsaXQoJy0nKTtcbiAgICB2YXIgb2xkUmV2SWQgPSBwYXJ0c1sxXTtcbiAgICB2YXIgb2xkUmV2TnVtID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcblxuICAgIHZhciBuZXdSZXZOdW0gPSBvbGRSZXZOdW0gKyAxO1xuICAgIHZhciBuZXdSZXZJZCA9IHJldiQkMSgpO1xuXG4gICAgZG9jLl9yZXZpc2lvbnMgPSB7XG4gICAgICBzdGFydDogbmV3UmV2TnVtLFxuICAgICAgaWRzOiBbbmV3UmV2SWQsIG9sZFJldklkXVxuICAgIH07XG4gICAgZG9jLl9yZXYgPSBuZXdSZXZOdW0gKyAnLScgKyBuZXdSZXZJZDtcbiAgICBvcHRzLm5ld19lZGl0cyA9IGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIHB1dERvYyhuZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBzZWxmLl9wdXQgPT09ICdmdW5jdGlvbicgJiYgb3B0cy5uZXdfZWRpdHMgIT09IGZhbHNlKSB7XG4gICAgICBzZWxmLl9wdXQoZG9jLCBvcHRzLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5idWxrRG9jcyh7ZG9jczogW2RvY119LCBvcHRzLCB5YW5rRXJyb3IobmV4dCwgZG9jLl9pZCkpO1xuICAgIH1cbiAgfVxufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0QXR0YWNobWVudCA9XG4gIGFkYXB0ZXJGdW4oJ3B1dEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCwgcmV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IsIHR5cGUpIHtcbiAgdmFyIGFwaSA9IHRoaXM7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHR5cGUgPSBibG9iO1xuICAgIGJsb2IgPSByZXY7XG4gICAgcmV2ID0gbnVsbDtcbiAgfVxuICAvLyBMZXRzIGZpeCBpbiBodHRwczovL2dpdGh1Yi5jb20vcG91Y2hkYi9wb3VjaGRiL2lzc3Vlcy8zMjY3XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHlwZSA9IGJsb2I7XG4gICAgYmxvYiA9IHJldjtcbiAgICByZXYgPSBudWxsO1xuICB9XG4gIGlmICghdHlwZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCd3YXJuJywgJ0F0dGFjaG1lbnQnLCBhdHRhY2htZW50SWQsICdvbiBkb2N1bWVudCcsIGRvY0lkLCAnaXMgbWlzc2luZyBjb250ZW50X3R5cGUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUF0dGFjaG1lbnQoZG9jKSB7XG4gICAgdmFyIHByZXZyZXZwb3MgPSAnX3JldicgaW4gZG9jID8gcGFyc2VJbnQoZG9jLl9yZXYsIDEwKSA6IDA7XG4gICAgZG9jLl9hdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgfHwge307XG4gICAgZG9jLl9hdHRhY2htZW50c1thdHRhY2htZW50SWRdID0ge1xuICAgICAgY29udGVudF90eXBlOiB0eXBlLFxuICAgICAgZGF0YTogYmxvYixcbiAgICAgIHJldnBvczogKytwcmV2cmV2cG9zXG4gICAgfTtcbiAgICByZXR1cm4gYXBpLnB1dChkb2MpO1xuICB9XG5cbiAgcmV0dXJuIGFwaS5nZXQoZG9jSWQpLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX3JldiAhPT0gcmV2KSB7XG4gICAgICB0aHJvdyBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVBdHRhY2htZW50KGRvYyk7XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgLy8gY3JlYXRlIG5ldyBkb2NcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChlcnIucmVhc29uID09PSBNSVNTSU5HX0RPQy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQXR0YWNobWVudCh7X2lkOiBkb2NJZH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZUF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdyZW1vdmVBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZ2V0KGRvY0lkLCBmdW5jdGlvbiAoZXJyLCBvYmopIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob2JqLl9yZXYgIT09IHJldikge1xuICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghb2JqLl9hdHRhY2htZW50cykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGRlbGV0ZSBvYmouX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF07XG4gICAgaWYgKE9iamVjdC5rZXlzKG9iai5fYXR0YWNobWVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9iai5fYXR0YWNobWVudHM7XG4gICAgfVxuICAgIHNlbGYucHV0KG9iaiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlbW92ZScsIGZ1bmN0aW9uIChkb2NPcklkLCBvcHRzT3JSZXYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBkb2M7XG4gIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnc3RyaW5nJykge1xuICAgIC8vIGlkLCByZXYsIG9wdHMsIGNhbGxiYWNrIHN0eWxlXG4gICAgZG9jID0ge1xuICAgICAgX2lkOiBkb2NPcklkLFxuICAgICAgX3Jldjogb3B0c09yUmV2XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgIGRvYyA9IGRvY09ySWQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0c09yUmV2O1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0gb3B0c09yUmV2O1xuICAgIH1cbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgb3B0cy53YXNfZGVsZXRlID0gdHJ1ZTtcbiAgdmFyIG5ld0RvYyA9IHtfaWQ6IGRvYy5faWQsIF9yZXY6IChkb2MuX3JldiB8fCBvcHRzLnJldil9O1xuICBuZXdEb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICBpZiAoaXNMb2NhbElkKG5ld0RvYy5faWQpICYmIHR5cGVvZiB0aGlzLl9yZW1vdmVMb2NhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVMb2NhbChkb2MsIGNhbGxiYWNrKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbbmV3RG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgbmV3RG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmV2c0RpZmYgPVxuICBhZGFwdGVyRnVuKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKHJlcSk7XG5cbiAgaWYgKCFpZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHt9KTtcbiAgfVxuXG4gIHZhciBjb3VudCA9IDA7XG4gIHZhciBtaXNzaW5nID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgZnVuY3Rpb24gYWRkVG9NaXNzaW5nKGlkLCByZXZJZCkge1xuICAgIGlmICghbWlzc2luZy5oYXMoaWQpKSB7XG4gICAgICBtaXNzaW5nLnNldChpZCwge21pc3Npbmc6IFtdfSk7XG4gICAgfVxuICAgIG1pc3NpbmcuZ2V0KGlkKS5taXNzaW5nLnB1c2gocmV2SWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RvYyhpZCwgcmV2X3RyZWUpIHtcbiAgICAvLyBJcyB0aGlzIGZhc3QgZW5vdWdoPyBNYXliZSB3ZSBzaG91bGQgc3dpdGNoIHRvIGEgc2V0IHNpbXVsYXRlZCBieSBhIG1hcFxuICAgIHZhciBtaXNzaW5nRm9ySWQgPSByZXFbaWRdLnNsaWNlKDApO1xuICAgIHRyYXZlcnNlUmV2VHJlZShyZXZfdHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsXG4gICAgICBvcHRzKSB7XG4gICAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgICB2YXIgaWR4ID0gbWlzc2luZ0ZvcklkLmluZGV4T2YocmV2KTtcbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nRm9ySWQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy5zdGF0dXMgIT09ICdhdmFpbGFibGUnKSB7XG4gICAgICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFRyYXZlcnNpbmcgdGhlIHRyZWUgaXMgc3luY2hyb25vdXMsIHNvIG5vdyBgbWlzc2luZ0ZvcklkYCBjb250YWluc1xuICAgIC8vIHJldmlzaW9ucyB0aGF0IHdlcmUgbm90IGZvdW5kIGluIHRoZSB0cmVlXG4gICAgbWlzc2luZ0ZvcklkLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgIH0pO1xuICB9XG5cbiAgaWRzLm1hcChmdW5jdGlvbiAoaWQpIHtcbiAgICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoaWQsIGZ1bmN0aW9uIChlcnIsIHJldl90cmVlKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgPT09IDQwNCAmJiBlcnIubWVzc2FnZSA9PT0gJ21pc3NpbmcnKSB7XG4gICAgICAgIG1pc3Npbmcuc2V0KGlkLCB7bWlzc2luZzogcmVxW2lkXX0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzRG9jKGlkLCByZXZfdHJlZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgrK2NvdW50ID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgTGF6eU1hcCB0byBvYmplY3RcbiAgICAgICAgdmFyIG1pc3NpbmdPYmogPSB7fTtcbiAgICAgICAgbWlzc2luZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgbWlzc2luZ09ialtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbWlzc2luZ09iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHRoaXMpO1xufSk7XG5cbi8vIF9idWxrX2dldCBBUEkgZm9yIGZhc3RlciByZXBsaWNhdGlvbiwgYXMgZGVzY3JpYmVkIGluXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvdWNoZGItY2h0dHBkL3B1bGwvMzNcbi8vIEF0IHRoZSBcImFic3RyYWN0XCIgbGV2ZWwsIGl0IHdpbGwganVzdCBydW4gbXVsdGlwbGUgZ2V0KClzIGluXG4vLyBwYXJhbGxlbCwgYmVjYXVzZSB0aGlzIGlzbid0IG11Y2ggb2YgYSBwZXJmb3JtYW5jZSBjb3N0XG4vLyBmb3IgbG9jYWwgZGF0YWJhc2VzIChleGNlcHQgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLCB3aGljaCBpc1xuLy8gc21hbGwpLiBUaGUgaHR0cCBhZGFwdGVyIG92ZXJyaWRlcyB0aGlzIGluIG9yZGVyXG4vLyB0byBkbyBhIG1vcmUgZWZmaWNpZW50IHNpbmdsZSBIVFRQIHJlcXVlc3QuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmJ1bGtHZXQgPVxuICBhZGFwdGVyRnVuKCdidWxrR2V0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGJ1bGtHZXQodGhpcywgb3B0cywgY2FsbGJhY2spO1xufSk7XG5cbi8vIGNvbXBhY3Qgb25lIGRvY3VtZW50IGFuZCBmaXJlIGNhbGxiYWNrXG4vLyBieSBjb21wYWN0aW5nIHdlIG1lYW4gcmVtb3ZpbmcgYWxsIHJldmlzaW9ucyB3aGljaFxuLy8gYXJlIGZ1cnRoZXIgZnJvbSB0aGUgbGVhZiBpbiByZXZpc2lvbiB0cmVlIHRoYW4gbWF4X2hlaWdodFxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0RG9jdW1lbnQgPVxuICBhZGFwdGVyRnVuKCdjb21wYWN0RG9jdW1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIG1heEhlaWdodCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoZG9jSWQsIGZ1bmN0aW9uIChlcnIsIHJldlRyZWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdmFyIGhlaWdodCA9IGNvbXB1dGVIZWlnaHQocmV2VHJlZSk7XG4gICAgdmFyIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICB2YXIgcmV2cyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGhlaWdodCkuZm9yRWFjaChmdW5jdGlvbiAocmV2KSB7XG4gICAgICBpZiAoaGVpZ2h0W3Jldl0gPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cmF2ZXJzZVJldlRyZWUocmV2VHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgaWYgKG9wdHMuc3RhdHVzID09PSAnYXZhaWxhYmxlJyAmJiBjYW5kaWRhdGVzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgcmV2cy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5fZG9Db21wYWN0aW9uKGRvY0lkLCByZXZzLCBjYWxsYmFjayk7XG4gIH0pO1xufSk7XG5cbi8vIGNvbXBhY3QgdGhlIHdob2xlIGRhdGFiYXNlIHVzaW5nIHNpbmdsZSBkb2N1bWVudFxuLy8gY29tcGFjdGlvblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0ID1cbiAgYWRhcHRlckZ1bignY29tcGFjdCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBzZWxmLl9jb21wYWN0aW9uUXVldWUgPSBzZWxmLl9jb21wYWN0aW9uUXVldWUgfHwgW107XG4gIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5wdXNoKHtvcHRzOiBvcHRzLCBjYWxsYmFjazogY2FsbGJhY2t9KTtcbiAgaWYgKHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICBkb05leHRDb21wYWN0aW9uKHNlbGYpO1xuICB9XG59KTtcbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuX2NvbXBhY3QgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2hhbmdlc09wdHMgPSB7XG4gICAgcmV0dXJuX2RvY3M6IGZhbHNlLFxuICAgIGxhc3Rfc2VxOiBvcHRzLmxhc3Rfc2VxIHx8IDBcbiAgfTtcbiAgdmFyIHByb21pc2VzID0gW107XG5cbiAgZnVuY3Rpb24gb25DaGFuZ2Uocm93KSB7XG4gICAgcHJvbWlzZXMucHVzaChzZWxmLmNvbXBhY3REb2N1bWVudChyb3cuaWQsIDApKTtcbiAgfVxuICBmdW5jdGlvbiBvbkNvbXBsZXRlKHJlc3ApIHtcbiAgICB2YXIgbGFzdFNlcSA9IHJlc3AubGFzdF9zZXE7XG4gICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHVwc2VydChzZWxmLCAnX2xvY2FsL2NvbXBhY3Rpb24nLCBmdW5jdGlvbiBkZWx0YUZ1bmMoZG9jKSB7XG4gICAgICAgIGlmICghZG9jLmxhc3Rfc2VxIHx8IGRvYy5sYXN0X3NlcSA8IGxhc3RTZXEpIHtcbiAgICAgICAgICBkb2MubGFzdF9zZXEgPSBsYXN0U2VxO1xuICAgICAgICAgIHJldHVybiBkb2M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzb21lYm9keSBlbHNlIGdvdCBoZXJlIGZpcnN0LCBkb24ndCB1cGRhdGVcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge29rOiB0cnVlfSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9XG4gIHNlbGYuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAub24oJ2NoYW5nZScsIG9uQ2hhbmdlKVxuICAgIC5vbignY29tcGxldGUnLCBvbkNvbXBsZXRlKVxuICAgIC5vbignZXJyb3InLCBjYWxsYmFjayk7XG59O1xuXG4vKiBCZWdpbiBhcGkgd3JhcHBlcnMuIFNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gc3RvcmFnZSBiZWxvbmdzIGluIHRoZVxuICAgX1ttZXRob2RdICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldCA9IGFkYXB0ZXJGdW4oJ2dldCcsIGZ1bmN0aW9uIChpZCwgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX0lEKSk7XG4gIH1cbiAgaWYgKGlzTG9jYWxJZChpZCkgJiYgdHlwZW9mIHRoaXMuX2dldExvY2FsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldExvY2FsKGlkLCBjYik7XG4gIH1cbiAgdmFyIGxlYXZlcyA9IFtdLCBzZWxmID0gdGhpcztcblxuICBmdW5jdGlvbiBmaW5pc2hPcGVuUmV2cygpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGNvdW50ID0gbGVhdmVzLmxlbmd0aDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNvdW50KSB7XG4gICAgICByZXR1cm4gY2IobnVsbCwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyBvcmRlciB3aXRoIG9wZW5fcmV2cyBpcyB1bnNwZWNpZmllZFxuICAgIGxlYXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChsZWFmKSB7XG4gICAgICBzZWxmLmdldChpZCwge1xuICAgICAgICByZXY6IGxlYWYsXG4gICAgICAgIHJldnM6IG9wdHMucmV2cyxcbiAgICAgICAgbGF0ZXN0OiBvcHRzLmxhdGVzdCxcbiAgICAgICAgYXR0YWNobWVudHM6IG9wdHMuYXR0YWNobWVudHMsXG4gICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRvYykge1xuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgIC8vIHVzaW5nIGxhdGVzdD10cnVlIGNhbiBwcm9kdWNlIGR1cGxpY2F0ZXNcbiAgICAgICAgICB2YXIgZXhpc3Rpbmc7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXN1bHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W2ldLm9rICYmIHJlc3VsdFtpXS5vay5fcmV2ID09PSBkb2MuX3Jldikge1xuICAgICAgICAgICAgICBleGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7b2s6IGRvY30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7bWlzc2luZzogbGVhZn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgICBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcHRzLm9wZW5fcmV2cykge1xuICAgIGlmIChvcHRzLm9wZW5fcmV2cyA9PT0gXCJhbGxcIikge1xuICAgICAgdGhpcy5fZ2V0UmV2aXNpb25UcmVlKGlkLCBmdW5jdGlvbiAoZXJyLCByZXZfdHJlZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMocmV2X3RyZWUpLm1hcChmdW5jdGlvbiAobGVhZikge1xuICAgICAgICAgIHJldHVybiBsZWFmLnJldjtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbmlzaE9wZW5SZXZzKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cy5vcGVuX3JldnMpKSB7XG4gICAgICAgIGxlYXZlcyA9IG9wdHMub3Blbl9yZXZzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlYXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBsID0gbGVhdmVzW2ldO1xuICAgICAgICAgIC8vIGxvb2tzIGxpa2UgaXQncyB0aGUgb25seSB0aGluZyBjb3VjaGRiIGNoZWNrc1xuICAgICAgICAgIGlmICghKHR5cGVvZiAobCkgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrLS8udGVzdChsKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX1JFVikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5pc2hPcGVuUmV2cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKFVOS05PV05fRVJST1IsICdmdW5jdGlvbl9jbGF1c2UnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjsgLy8gb3Blbl9yZXZzIGRvZXMgbm90IGxpa2Ugb3RoZXIgb3B0aW9uc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2dldChpZCwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgaWYgKGVycikge1xuICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgZG9jID0gcmVzdWx0LmRvYztcbiAgICB2YXIgbWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGE7XG4gICAgdmFyIGN0eCA9IHJlc3VsdC5jdHg7XG5cbiAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgIHZhciBjb25mbGljdHMgPSBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKTtcbiAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgIGRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlbGV0ZWQobWV0YWRhdGEsIGRvYy5fcmV2KSkge1xuICAgICAgZG9jLl9kZWxldGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzIHx8IG9wdHMucmV2c19pbmZvKSB7XG4gICAgICB2YXIgc3BsaXR0ZWRSZXYgPSBkb2MuX3Jldi5zcGxpdCgnLScpO1xuICAgICAgdmFyIHJldk5vICAgICAgID0gcGFyc2VJbnQoc3BsaXR0ZWRSZXZbMF0sIDEwKTtcbiAgICAgIHZhciByZXZIYXNoICAgICA9IHNwbGl0dGVkUmV2WzFdO1xuXG4gICAgICB2YXIgcGF0aHMgPSByb290VG9MZWFmKG1ldGFkYXRhLnJldl90cmVlKTtcbiAgICAgIHZhciBwYXRoID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudFBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgdmFyIGhhc2hJbmRleCA9IGN1cnJlbnRQYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguaWQ7IH0pXG4gICAgICAgICAgLmluZGV4T2YocmV2SGFzaCk7XG4gICAgICAgIHZhciBoYXNoRm91bmRBdFJldlBvcyA9IGhhc2hJbmRleCA9PT0gKHJldk5vIC0gMSk7XG5cbiAgICAgICAgaWYgKGhhc2hGb3VuZEF0UmV2UG9zIHx8ICghcGF0aCAmJiBoYXNoSW5kZXggIT09IC0xKSkge1xuICAgICAgICAgIHBhdGggPSBjdXJyZW50UGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ2ludmFsaWQgcmV2IHRyZWUnKTtcbiAgICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXhPZlJldiA9IHBhdGguaWRzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pZDsgfSlcbiAgICAgICAgLmluZGV4T2YoZG9jLl9yZXYuc3BsaXQoJy0nKVsxXSkgKyAxO1xuICAgICAgdmFyIGhvd01hbnkgPSBwYXRoLmlkcy5sZW5ndGggLSBpbmRleE9mUmV2O1xuICAgICAgcGF0aC5pZHMuc3BsaWNlKGluZGV4T2ZSZXYsIGhvd01hbnkpO1xuICAgICAgcGF0aC5pZHMucmV2ZXJzZSgpO1xuXG4gICAgICBpZiAob3B0cy5yZXZzKSB7XG4gICAgICAgIGRvYy5fcmV2aXNpb25zID0ge1xuICAgICAgICAgIHN0YXJ0OiAocGF0aC5wb3MgKyBwYXRoLmlkcy5sZW5ndGgpIC0gMSxcbiAgICAgICAgICBpZHM6IHBhdGguaWRzLm1hcChmdW5jdGlvbiAocmV2KSB7XG4gICAgICAgICAgICByZXR1cm4gcmV2LmlkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgICAgdmFyIHBvcyA9ICBwYXRoLnBvcyArIHBhdGguaWRzLmxlbmd0aDtcbiAgICAgICAgZG9jLl9yZXZzX2luZm8gPSBwYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHJldikge1xuICAgICAgICAgIHBvcy0tO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXY6IHBvcyArICctJyArIHJldi5pZCxcbiAgICAgICAgICAgIHN0YXR1czogcmV2Lm9wdHMuc3RhdHVzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jLl9hdHRhY2htZW50cztcbiAgICAgIHZhciBjb3VudCA9IE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGg7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhhdHRhY2htZW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHRoaXMuX2dldEF0dGFjaG1lbnQoZG9jLl9pZCwga2V5LCBhdHRhY2htZW50c1trZXldLCB7XG4gICAgICAgICAgLy8gUHJldmlvdXNseSB0aGUgcmV2aXNpb24gaGFuZGxpbmcgd2FzIGRvbmUgaW4gYWRhcHRlci5qc1xuICAgICAgICAgIC8vIGdldEF0dGFjaG1lbnQsIGhvd2V2ZXIgc2luY2UgaWRiLW5leHQgZG9lc250IHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBwYXNzIHRoZSByZXYgdGhyb3VnaFxuICAgICAgICAgIHJldjogZG9jLl9yZXYsXG4gICAgICAgICAgYmluYXJ5OiBvcHRzLmJpbmFyeSxcbiAgICAgICAgICBjdHg6IGN0eFxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgdmFyIGF0dCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgIGlmICghLS1jb3VudCkge1xuICAgICAgICAgICAgY2IobnVsbCwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvYy5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgICAgIGRvYy5fYXR0YWNobWVudHNba2V5XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNiKG51bGwsIGRvYyk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vLyBUT0RPOiBJIGRvbnQgbGlrZSB0aGlzLCBpdCBmb3JjZXMgYW4gZXh0cmEgcmVhZCBmb3IgZXZlcnlcbi8vIGF0dGFjaG1lbnQgcmVhZCBhbmQgZW5mb3JjZXMgYSBjb25mdXNpbmcgYXBpIGJldHdlZW5cbi8vIGFkYXB0ZXIuanMgYW5kIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldEF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdnZXRBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKG9wdHMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdGhpcy5fZ2V0KGRvY0lkLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgaWYgKHJlcy5kb2MuX2F0dGFjaG1lbnRzICYmIHJlcy5kb2MuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF0pIHtcbiAgICAgIG9wdHMuY3R4ID0gcmVzLmN0eDtcbiAgICAgIG9wdHMuYmluYXJ5ID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2dldEF0dGFjaG1lbnQoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmRvYy5fYXR0YWNobWVudHNbYXR0YWNobWVudElkXSwgb3B0cywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuYWxsRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBvcHRzLnNraXAgPSB0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJyA/IG9wdHMuc2tpcCA6IDA7XG4gIGlmIChvcHRzLnN0YXJ0X2tleSkge1xuICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgfVxuICBpZiAob3B0cy5lbmRfa2V5KSB7XG4gICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gIH1cbiAgaWYgKCdrZXlzJyBpbiBvcHRzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdHMua2V5cykpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdvcHRpb25zLmtleXMgbXVzdCBiZSBhbiBhcnJheScpKTtcbiAgICB9XG4gICAgdmFyIGluY29tcGF0aWJsZU9wdCA9XG4gICAgICBbJ3N0YXJ0a2V5JywgJ2VuZGtleScsICdrZXknXS5maWx0ZXIoZnVuY3Rpb24gKGluY29tcGF0aWJsZU9wdCkge1xuICAgICAgcmV0dXJuIGluY29tcGF0aWJsZU9wdCBpbiBvcHRzO1xuICAgIH0pWzBdO1xuICAgIGlmIChpbmNvbXBhdGlibGVPcHQpIHtcbiAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFFVRVJZX1BBUlNFX0VSUk9SLFxuICAgICAgICAnUXVlcnkgcGFyYW1ldGVyIGAnICsgaW5jb21wYXRpYmxlT3B0ICtcbiAgICAgICAgJ2AgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBtdWx0aS1nZXQnXG4gICAgICApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc1JlbW90ZSh0aGlzKSkge1xuICAgICAgYWxsRG9jc0tleXNQYXJzZShvcHRzKTtcbiAgICAgIGlmIChvcHRzLmtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxEb2NzKHtsaW1pdDogMH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fYWxsRG9jcyhvcHRzLCBjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jaGFuZ2VzID0gZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAvLyBCeSBkZWZhdWx0IHNldCByZXR1cm5fZG9jcyB0byBmYWxzZSBpZiB0aGUgY2FsbGVyIGhhcyBvcHRzLmxpdmUgPSB0cnVlLFxuICAvLyB0aGlzIHdpbGwgcHJldmVudCB1cyBmcm9tIGNvbGxlY3RpbmcgdGhlIHNldCBvZiBjaGFuZ2VzIGluZGVmaW5pdGVseVxuICAvLyByZXN1bHRpbmcgaW4gZ3Jvd2luZyBtZW1vcnlcbiAgb3B0cy5yZXR1cm5fZG9jcyA9ICgncmV0dXJuX2RvY3MnIGluIG9wdHMpID8gb3B0cy5yZXR1cm5fZG9jcyA6ICFvcHRzLmxpdmU7XG5cbiAgcmV0dXJuIG5ldyBDaGFuZ2VzJDEodGhpcywgb3B0cywgY2FsbGJhY2spO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jbG9zZSA9IGFkYXB0ZXJGdW4oJ2Nsb3NlJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gIHRoaXMuZW1pdCgnY2xvc2VkJyk7XG4gIHJldHVybiB0aGlzLl9jbG9zZShjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5pbmZvID0gYWRhcHRlckZ1bignaW5mbycsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX2luZm8oZnVuY3Rpb24gKGVyciwgaW5mbykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICAvLyBhc3N1bWUgd2Uga25vdyBiZXR0ZXIgdGhhbiB0aGUgYWRhcHRlciwgdW5sZXNzIGl0IGluZm9ybXMgdXNcbiAgICBpbmZvLmRiX25hbWUgPSBpbmZvLmRiX25hbWUgfHwgc2VsZi5uYW1lO1xuICAgIGluZm8uYXV0b19jb21wYWN0aW9uID0gISEoc2VsZi5hdXRvX2NvbXBhY3Rpb24gJiYgIWlzUmVtb3RlKHNlbGYpKTtcbiAgICBpbmZvLmFkYXB0ZXIgPSBzZWxmLmFkYXB0ZXI7XG4gICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuaWQgPSBhZGFwdGVyRnVuKCdpZCcsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faWQoY2FsbGJhY2spO1xufSk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodHlwZW9mIHRoaXMuX3R5cGUgPT09ICdmdW5jdGlvbicpID8gdGhpcy5fdHlwZSgpIDogdGhpcy5hZGFwdGVyO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5idWxrRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2J1bGtEb2NzJywgZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHJlcSkpIHtcbiAgICByZXEgPSB7XG4gICAgICBkb2NzOiByZXFcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFyZXEgfHwgIXJlcS5kb2NzIHx8ICFBcnJheS5pc0FycmF5KHJlcS5kb2NzKSkge1xuICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0JVTEtfRE9DUykpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXEuZG9jcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0eXBlb2YgcmVxLmRvY3NbaV0gIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVxLmRvY3NbaV0pKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTk9UX0FOX09CSkVDVCkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhdHRhY2htZW50RXJyb3I7XG4gIHJlcS5kb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGF0dGFjaG1lbnRFcnJvciA9IGF0dGFjaG1lbnRFcnJvciB8fCBhdHRhY2htZW50TmFtZUVycm9yKG5hbWUpO1xuICAgICAgICBpZiAoIWRvYy5fYXR0YWNobWVudHNbbmFtZV0uY29udGVudF90eXBlKSB7XG4gICAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLCAnQXR0YWNobWVudCcsIG5hbWUsICdvbiBkb2N1bWVudCcsIGRvYy5faWQsICdpcyBtaXNzaW5nIGNvbnRlbnRfdHlwZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChhdHRhY2htZW50RXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIGF0dGFjaG1lbnRFcnJvcikpO1xuICB9XG5cbiAgaWYgKCEoJ25ld19lZGl0cycgaW4gb3B0cykpIHtcbiAgICBpZiAoJ25ld19lZGl0cycgaW4gcmVxKSB7XG4gICAgICBvcHRzLm5ld19lZGl0cyA9IHJlcS5uZXdfZWRpdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMubmV3X2VkaXRzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgYWRhcHRlciA9IHRoaXM7XG4gIGlmICghb3B0cy5uZXdfZWRpdHMgJiYgIWlzUmVtb3RlKGFkYXB0ZXIpKSB7XG4gICAgLy8gZW5zdXJlIHJldmlzaW9ucyBvZiB0aGUgc2FtZSBkb2MgYXJlIHNvcnRlZCwgc28gdGhhdFxuICAgIC8vIHRoZSBsb2NhbCBhZGFwdGVyIHByb2Nlc3NlcyB0aGVtIGNvcnJlY3RseSAoIzI5MzUpXG4gICAgcmVxLmRvY3Muc29ydChjb21wYXJlQnlJZFRoZW5SZXYpO1xuICB9XG5cbiAgY2xlYW5Eb2NzKHJlcS5kb2NzKTtcblxuICAvLyBpbiB0aGUgY2FzZSBvZiBjb25mbGljdHMsIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBfaWRzIHRvIHRoZSB1c2VyXG4gIC8vIGhvd2V2ZXIsIHRoZSB1bmRlcmx5aW5nIGFkYXB0ZXIgbWF5IGRlc3Ryb3kgdGhlIGRvY3MgYXJyYXksIHNvXG4gIC8vIGNyZWF0ZSBhIGNvcHkgaGVyZVxuICB2YXIgaWRzID0gcmVxLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9pZDtcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXMuX2J1bGtEb2NzKHJlcSwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIGlmICghb3B0cy5uZXdfZWRpdHMpIHtcbiAgICAgIC8vIHRoaXMgaXMgd2hhdCBjb3VjaCBkb2VzIHdoZW4gbmV3X2VkaXRzIGlzIGZhbHNlXG4gICAgICByZXMgPSByZXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4LmVycm9yO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGFkZCBpZHMgZm9yIGVycm9yL2NvbmZsaWN0IHJlc3BvbnNlcyAobm90IHJlcXVpcmVkIGZvciBDb3VjaERCKVxuICAgIGlmICghaXNSZW1vdGUoYWRhcHRlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZXNbaV0uaWQgPSByZXNbaV0uaWQgfHwgaWRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UnLCBmdW5jdGlvbiAoZGVwZW5kZW50RGIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spIHtcbiAgdmFyIGRiT3B0aW9ucyA9IGNsb25lKHRoaXMuX19vcHRzKTtcbiAgaWYgKHRoaXMuX19vcHRzLnZpZXdfYWRhcHRlcikge1xuICAgIGRiT3B0aW9ucy5hZGFwdGVyID0gdGhpcy5fX29wdHMudmlld19hZGFwdGVyO1xuICB9XG5cbiAgdmFyIGRlcERCID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZGVwZW5kZW50RGIsIGRiT3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGlmZkZ1bihkb2MpIHtcbiAgICBkb2MuZGVwZW5kZW50RGJzID0gZG9jLmRlcGVuZGVudERicyB8fCB7fTtcbiAgICBpZiAoZG9jLmRlcGVuZGVudERic1tkZXBlbmRlbnREYl0pIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gdXBkYXRlIHJlcXVpcmVkXG4gICAgfVxuICAgIGRvYy5kZXBlbmRlbnREYnNbZGVwZW5kZW50RGJdID0gdHJ1ZTtcbiAgICByZXR1cm4gZG9jO1xuICB9XG4gIHVwc2VydCh0aGlzLCAnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBkaWZmRnVuKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtkYjogZGVwREJ9KTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5kZXN0cm95ID1cbiAgYWRhcHRlckZ1bignZGVzdHJveScsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB1c2VQcmVmaXggPSAndXNlX3ByZWZpeCcgaW4gc2VsZiA/IHNlbGYudXNlX3ByZWZpeCA6IHRydWU7XG5cbiAgZnVuY3Rpb24gZGVzdHJveURiKCkge1xuICAgIC8vIGNhbGwgZGVzdHJveSBtZXRob2Qgb2YgdGhlIHBhcnRpY3VsYXIgYWRhcHRvclxuICAgIHNlbGYuX2Rlc3Ryb3kob3B0cywgZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuX2Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICBzZWxmLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCB8fCB7ICdvayc6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNSZW1vdGUoc2VsZikpIHtcbiAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciBkZXBlbmRlbnQgREJzIGlmIGl0J3MgYSByZW1vdGUgREJcbiAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gIH1cblxuICBzZWxmLmdldCgnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBmdW5jdGlvbiAoZXJyLCBsb2NhbERvYykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7IC8vIG5vIGRlcGVuZGVuY2llc1xuICAgICAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBkZXBlbmRlbnREYnMgPSBsb2NhbERvYy5kZXBlbmRlbnREYnM7XG4gICAgdmFyIFBvdWNoREIgPSBzZWxmLmNvbnN0cnVjdG9yO1xuICAgIHZhciBkZWxldGVkTWFwID0gT2JqZWN0LmtleXMoZGVwZW5kZW50RGJzKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIC8vIHVzZV9wcmVmaXggaXMgb25seSBmYWxzZSBpbiB0aGUgYnJvd3NlclxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHZhciB0cnVlTmFtZSA9IHVzZVByZWZpeCA/XG4gICAgICAgIG5hbWUucmVwbGFjZShuZXcgUmVnRXhwKCdeJyArIFBvdWNoREIucHJlZml4KSwgJycpIDogbmFtZTtcbiAgICAgIHJldHVybiBuZXcgUG91Y2hEQih0cnVlTmFtZSwgc2VsZi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChkZWxldGVkTWFwKS50aGVuKGRlc3Ryb3lEYiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBUYXNrUXVldWUoKSB7XG4gIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICB0aGlzLmZhaWxlZCA9IGZhbHNlO1xuICB0aGlzLnF1ZXVlID0gW107XG59XG5cblRhc2tRdWV1ZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZ1bjtcbiAgaWYgKHRoaXMuZmFpbGVkKSB7XG4gICAgd2hpbGUgKChmdW4gPSB0aGlzLnF1ZXVlLnNoaWZ0KCkpKSB7XG4gICAgICBmdW4odGhpcy5mYWlsZWQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoKGZ1biA9IHRoaXMucXVldWUuc2hpZnQoKSkpIHtcbiAgICAgIGZ1bigpO1xuICAgIH1cbiAgfVxufTtcblxuVGFza1F1ZXVlLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmZhaWxlZCA9IGVycjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLnJlYWR5ID0gZnVuY3Rpb24gKGRiKSB7XG4gIHRoaXMuaXNSZWFkeSA9IHRydWU7XG4gIHRoaXMuZGIgPSBkYjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLmFkZFRhc2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gIHRoaXMucXVldWUucHVzaChmdW4pO1xuICBpZiAodGhpcy5mYWlsZWQpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcGFyc2VBZGFwdGVyKG5hbWUsIG9wdHMpIHtcbiAgdmFyIG1hdGNoID0gbmFtZS5tYXRjaCgvKFthLXotXSopOlxcL1xcLyguKikvKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgLy8gdGhlIGh0dHAgYWRhcHRlciBleHBlY3RzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAvaHR0cHM/Ly50ZXN0KG1hdGNoWzFdKSA/IG1hdGNoWzFdICsgJzovLycgKyBtYXRjaFsyXSA6IG1hdGNoWzJdLFxuICAgICAgYWRhcHRlcjogbWF0Y2hbMV1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGFkYXB0ZXJzID0gUG91Y2hEQi5hZGFwdGVycztcbiAgdmFyIHByZWZlcnJlZEFkYXB0ZXJzID0gUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycztcbiAgdmFyIHByZWZpeCA9IFBvdWNoREIucHJlZml4O1xuICB2YXIgYWRhcHRlck5hbWUgPSBvcHRzLmFkYXB0ZXI7XG5cbiAgaWYgKCFhZGFwdGVyTmFtZSkgeyAvLyBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhZGFwdGVyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmZXJyZWRBZGFwdGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgYWRhcHRlck5hbWUgPSBwcmVmZXJyZWRBZGFwdGVyc1tpXTtcbiAgICAgIC8vIGNoZWNrIGZvciBicm93c2VycyB0aGF0IGhhdmUgYmVlbiB1cGdyYWRlZCBmcm9tIHdlYnNxbC1vbmx5IHRvIHdlYnNxbCtpZGJcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGFkYXB0ZXJOYW1lID09PSAnaWRiJyAmJiAnd2Vic3FsJyBpbiBhZGFwdGVycyAmJlxuICAgICAgICAgIGhhc0xvY2FsU3RvcmFnZSgpICYmIGxvY2FsU3RvcmFnZVsnX3BvdWNoX193ZWJzcWxkYl8nICsgcHJlZml4ICsgbmFtZV0pIHtcbiAgICAgICAgLy8gbG9nIGl0LCBiZWNhdXNlIHRoaXMgY2FuIGJlIGNvbmZ1c2luZyBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ2xvZycsICdQb3VjaERCIGlzIGRvd25ncmFkaW5nIFwiJyArIG5hbWUgKyAnXCIgdG8gV2ViU1FMIHRvJyArXG4gICAgICAgICAgJyBhdm9pZCBkYXRhIGxvc3MsIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgb3BlbmVkIHdpdGggV2ViU1FMLicpO1xuICAgICAgICBjb250aW51ZTsgLy8ga2VlcCB1c2luZyB3ZWJzcWwgdG8gYXZvaWQgdXNlciBkYXRhIGxvc3NcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhZGFwdGVyID0gYWRhcHRlcnNbYWRhcHRlck5hbWVdO1xuXG4gIC8vIGlmIGFkYXB0ZXIgaXMgaW52YWxpZCwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBsYXRlclxuICB2YXIgdXNlUHJlZml4ID0gKGFkYXB0ZXIgJiYgJ3VzZV9wcmVmaXgnIGluIGFkYXB0ZXIpID9cbiAgICBhZGFwdGVyLnVzZV9wcmVmaXggOiB0cnVlO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogdXNlUHJlZml4ID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSxcbiAgICBhZGFwdGVyOiBhZGFwdGVyTmFtZVxuICB9O1xufVxuXG4vLyBPSywgc28gaGVyZSdzIHRoZSBkZWFsLiBDb25zaWRlciB0aGlzIGNvZGU6XG4vLyAgICAgdmFyIGRiMSA9IG5ldyBQb3VjaERCKCdmb28nKTtcbi8vICAgICB2YXIgZGIyID0gbmV3IFBvdWNoREIoJ2ZvbycpO1xuLy8gICAgIGRiMS5kZXN0cm95KCk7XG4vLyBeIHRoZXNlIHR3byBib3RoIG5lZWQgdG8gZW1pdCAnZGVzdHJveWVkJyBldmVudHMsXG4vLyBhcyB3ZWxsIGFzIHRoZSBQb3VjaERCIGNvbnN0cnVjdG9yIGl0c2VsZi5cbi8vIFNvIHdlIGhhdmUgb25lIGRiIG9iamVjdCAod2hpY2hldmVyIG9uZSBnb3QgZGVzdHJveSgpIGNhbGxlZCBvbiBpdClcbi8vIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyB0aGUgaW5pdGlhbCBldmVudCwgd2hpY2ggdGhlbiBnZXRzIGVtaXR0ZWRcbi8vIGJ5IHRoZSBjb25zdHJ1Y3Rvciwgd2hpY2ggdGhlbiBicm9hZGNhc3RzIGl0IHRvIGFueSBvdGhlciBkYnNcbi8vIHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIHNhbWUgbmFtZS5cbmZ1bmN0aW9uIHByZXBhcmVGb3JEZXN0cnVjdGlvbihzZWxmKSB7XG5cbiAgZnVuY3Rpb24gb25EZXN0cm95ZWQoZnJvbV9jb25zdHJ1Y3Rvcikge1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgICBpZiAoIWZyb21fY29uc3RydWN0b3IpIHtcbiAgICAgIHNlbGYuY29uc3RydWN0b3IuZW1pdCgnZGVzdHJveWVkJywgc2VsZi5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsb3NlZCgpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCd1bnJlZicsIHNlbGYpO1xuICB9XG5cbiAgc2VsZi5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gIHNlbGYub25jZSgnY2xvc2VkJywgb25DbG9zZWQpO1xuICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ3JlZicsIHNlbGYpO1xufVxuXG5pbmhlcml0cyhQb3VjaERCLCBBYnN0cmFjdFBvdWNoREIpO1xuZnVuY3Rpb24gUG91Y2hEQihuYW1lLCBvcHRzKSB7XG4gIC8vIEluIE5vZGUgb3VyIHRlc3Qgc3VpdGUgb25seSB0ZXN0cyB0aGlzIGZvciBQb3VjaEFsdCB1bmZvcnR1bmF0ZWx5XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hEQikpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoREIobmFtZSwgb3B0cyk7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSAnb2JqZWN0Jykge1xuICAgIG9wdHMgPSBuYW1lO1xuICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgZGVsZXRlIG9wdHMubmFtZTtcbiAgfVxuXG4gIGlmIChvcHRzLmRldGVybWluaXN0aWNfcmV2cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0cy5kZXRlcm1pbmlzdGljX3JldnMgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fX29wdHMgPSBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgc2VsZi5hdXRvX2NvbXBhY3Rpb24gPSBvcHRzLmF1dG9fY29tcGFjdGlvbjtcbiAgc2VsZi5wcmVmaXggPSBQb3VjaERCLnByZWZpeDtcblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nL2ludmFsaWQgREIgbmFtZScpO1xuICB9XG5cbiAgdmFyIHByZWZpeGVkTmFtZSA9IChvcHRzLnByZWZpeCB8fCAnJykgKyBuYW1lO1xuICB2YXIgYmFja2VuZCA9IHBhcnNlQWRhcHRlcihwcmVmaXhlZE5hbWUsIG9wdHMpO1xuXG4gIG9wdHMubmFtZSA9IGJhY2tlbmQubmFtZTtcbiAgb3B0cy5hZGFwdGVyID0gb3B0cy5hZGFwdGVyIHx8IGJhY2tlbmQuYWRhcHRlcjtcblxuICBzZWxmLm5hbWUgPSBuYW1lO1xuICBzZWxmLl9hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuICBQb3VjaERCLmVtaXQoJ2RlYnVnJywgWydhZGFwdGVyJywgJ1BpY2tlZCBhZGFwdGVyOiAnLCBvcHRzLmFkYXB0ZXJdKTtcblxuICBpZiAoIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXSB8fFxuICAgICAgIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS52YWxpZCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFkYXB0ZXI6ICcgKyBvcHRzLmFkYXB0ZXIpO1xuICB9XG5cbiAgaWYgKG9wdHMudmlld19hZGFwdGVyKSB7XG4gICAgaWYgKCFQb3VjaERCLmFkYXB0ZXJzW29wdHMudmlld19hZGFwdGVyXSB8fFxuICAgICAgICAhUG91Y2hEQi5hZGFwdGVyc1tvcHRzLnZpZXdfYWRhcHRlcl0udmFsaWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFZpZXcgQWRhcHRlcjogJyArIG9wdHMudmlld19hZGFwdGVyKTtcbiAgICB9XG4gIH1cblxuICBBYnN0cmFjdFBvdWNoREIuY2FsbChzZWxmKTtcbiAgc2VsZi50YXNrcXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XG5cbiAgc2VsZi5hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuXG4gIFBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS5jYWxsKHNlbGYsIG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gc2VsZi50YXNrcXVldWUuZmFpbChlcnIpO1xuICAgIH1cbiAgICBwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oc2VsZik7XG5cbiAgICBzZWxmLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmKTtcbiAgICBQb3VjaERCLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmLm5hbWUpO1xuICAgIHNlbGYudGFza3F1ZXVlLnJlYWR5KHNlbGYpO1xuICB9KTtcblxufVxuXG4vLyBBYm9ydENvbnRyb2xsZXIgd2FzIGludHJvZHVjZWQgcXVpdGUgYSB3aGlsZSBhZnRlciBmZXRjaCBhbmRcbi8vIGlzbnQgcmVxdWlyZWQgZm9yIFBvdWNoREIgdG8gZnVuY3Rpb24gc28gcG9seWZpbGwgaWYgbmVlZGVkXG52YXIgYSA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJylcbiAgICA/IEFib3J0Q29udHJvbGxlclxuICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4ge2Fib3J0OiBmdW5jdGlvbiAoKSB7fX07IH07XG5cbnZhciBmJDEgPSBmZXRjaDtcbnZhciBoID0gSGVhZGVycztcblxuUG91Y2hEQi5hZGFwdGVycyA9IHt9O1xuUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycyA9IFtdO1xuXG5Qb3VjaERCLnByZWZpeCA9ICdfcG91Y2hfJztcblxudmFyIGV2ZW50RW1pdHRlciA9IG5ldyBFRSgpO1xuXG5mdW5jdGlvbiBzZXRVcEV2ZW50RW1pdHRlcihQb3VjaCkge1xuICBPYmplY3Qua2V5cyhFRS5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICh0eXBlb2YgRUUucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIFBvdWNoW2tleV0gPSBldmVudEVtaXR0ZXJba2V5XS5iaW5kKGV2ZW50RW1pdHRlcik7XG4gICAgfVxuICB9KTtcblxuICAvLyB0aGVzZSBhcmUgY3JlYXRlZCBpbiBjb25zdHJ1Y3Rvci5qcywgYW5kIGFsbG93IHVzIHRvIG5vdGlmeSBlYWNoIERCIHdpdGhcbiAgLy8gdGhlIHNhbWUgbmFtZSB0aGF0IGl0IHdhcyBkZXN0cm95ZWQsIHZpYSB0aGUgY29uc3RydWN0b3Igb2JqZWN0XG4gIHZhciBkZXN0cnVjdExpc3RlbmVycyA9IFBvdWNoLl9kZXN0cnVjdGlvbkxpc3RlbmVycyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG4gIFBvdWNoLm9uKCdyZWYnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yUmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLnNldChkYi5uYW1lLCBbXSk7XG4gICAgfVxuICAgIGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKS5wdXNoKGRiKTtcbiAgfSk7XG5cbiAgUG91Y2gub24oJ3VucmVmJywgZnVuY3Rpb24gb25Db25zdHJ1Y3RvclVucmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRiTGlzdCA9IGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKTtcbiAgICB2YXIgcG9zID0gZGJMaXN0LmluZGV4T2YoZGIpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYkxpc3Quc3BsaWNlKHBvcywgMSk7XG4gICAgaWYgKGRiTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuc2V0KGRiLm5hbWUsIGRiTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShkYi5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIFBvdWNoLm9uKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yRGVzdHJveWVkKG5hbWUpIHtcbiAgICBpZiAoIWRlc3RydWN0TGlzdGVuZXJzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZGJMaXN0ID0gZGVzdHJ1Y3RMaXN0ZW5lcnMuZ2V0KG5hbWUpO1xuICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShuYW1lKTtcbiAgICBkYkxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGIpIHtcbiAgICAgIGRiLmVtaXQoJ2Rlc3Ryb3llZCcsdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5zZXRVcEV2ZW50RW1pdHRlcihQb3VjaERCKTtcblxuUG91Y2hEQi5hZGFwdGVyID0gZnVuY3Rpb24gKGlkLCBvYmosIGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKG9iai52YWxpZCgpKSB7XG4gICAgUG91Y2hEQi5hZGFwdGVyc1tpZF0gPSBvYmo7XG4gICAgaWYgKGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgICAgIFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMucHVzaChpZCk7XG4gICAgfVxuICB9XG59O1xuXG5Qb3VjaERCLnBsdWdpbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHsgLy8gZnVuY3Rpb24gc3R5bGUgZm9yIHBsdWdpbnNcbiAgICBvYmooUG91Y2hEQik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGx1Z2luOiBnb3QgXCInICsgb2JqICsgJ1wiLCBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbicpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgLy8gb2JqZWN0IHN0eWxlIGZvciBwbHVnaW5zXG4gICAgICBQb3VjaERCLnByb3RvdHlwZVtpZF0gPSBvYmpbaWRdO1xuICAgIH0pO1xuICB9XG4gIGlmICh0aGlzLl9fZGVmYXVsdHMpIHtcbiAgICBQb3VjaERCLl9fZGVmYXVsdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIHRoaXMuX19kZWZhdWx0cyk7XG4gIH1cbiAgcmV0dXJuIFBvdWNoREI7XG59O1xuXG5Qb3VjaERCLmRlZmF1bHRzID0gZnVuY3Rpb24gKGRlZmF1bHRPcHRzKSB7XG4gIGZ1bmN0aW9uIFBvdWNoQWx0KG5hbWUsIG9wdHMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hBbHQpKSB7XG4gICAgICByZXR1cm4gbmV3IFBvdWNoQWx0KG5hbWUsIG9wdHMpO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRzID0gbmFtZTtcbiAgICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgICBkZWxldGUgb3B0cy5uYW1lO1xuICAgIH1cblxuICAgIG9wdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIFBvdWNoQWx0Ll9fZGVmYXVsdHMsIG9wdHMpO1xuICAgIFBvdWNoREIuY2FsbCh0aGlzLCBuYW1lLCBvcHRzKTtcbiAgfVxuXG4gIGluaGVyaXRzKFBvdWNoQWx0LCBQb3VjaERCKTtcblxuICBQb3VjaEFsdC5wcmVmZXJyZWRBZGFwdGVycyA9IFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMuc2xpY2UoKTtcbiAgT2JqZWN0LmtleXMoUG91Y2hEQikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCEoa2V5IGluIFBvdWNoQWx0KSkge1xuICAgICAgUG91Y2hBbHRba2V5XSA9IFBvdWNoREJba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIG1ha2UgZGVmYXVsdCBvcHRpb25zIHRyYW5zaXRpdmVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvdWNoZGIvcG91Y2hkYi9pc3N1ZXMvNTkyMlxuICBQb3VjaEFsdC5fX2RlZmF1bHRzID0gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCB0aGlzLl9fZGVmYXVsdHMsIGRlZmF1bHRPcHRzKTtcblxuICByZXR1cm4gUG91Y2hBbHQ7XG59O1xuXG5Qb3VjaERCLmZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0cykge1xuICByZXR1cm4gZiQxKHVybCwgb3B0cyk7XG59O1xuXG4vLyBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkgYnkgc2V0LXZlcnNpb24uanNcbnZhciB2ZXJzaW9uID0gXCI3LjMuMFwiO1xuXG4vLyB0aGlzIHdvdWxkIGp1c3QgYmUgXCJyZXR1cm4gZG9jW2ZpZWxkXVwiLCBidXQgZmllbGRzXG4vLyBjYW4gYmUgXCJkZWVwXCIgZHVlIHRvIGRvdCBub3RhdGlvblxuZnVuY3Rpb24gZ2V0RmllbGRGcm9tRG9jKGRvYywgcGFyc2VkRmllbGQpIHtcbiAgdmFyIHZhbHVlID0gZG9jO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGFyc2VkRmllbGQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcGFyc2VkRmllbGRbaV07XG4gICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUkMShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gQ29udmVydHMgYSBzdHJpbmcgaW4gZG90IG5vdGF0aW9uIHRvIGFuIGFycmF5IG9mIGl0cyBjb21wb25lbnRzLCB3aXRoIGJhY2tzbGFzaCBlc2NhcGluZ1xuZnVuY3Rpb24gcGFyc2VGaWVsZChmaWVsZE5hbWUpIHtcbiAgLy8gZmllbGRzIG1heSBiZSBkZWVwIChlLmcuIFwiZm9vLmJhci5iYXpcIiksIHNvIHBhcnNlXG4gIHZhciBmaWVsZHMgPSBbXTtcbiAgdmFyIGN1cnJlbnQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZpZWxkTmFtZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBjaCA9IGZpZWxkTmFtZVtpXTtcbiAgICBpZiAoaSA+IDAgJiYgZmllbGROYW1lW2kgLSAxXSA9PT0gJ1xcXFwnICYmIChjaCA9PT0gJyQnIHx8IGNoID09PSAnLicpKSB7XG4gICAgICAvLyBlc2NhcGVkIGRlbGltaXRlclxuICAgICAgY3VycmVudCA9IGN1cnJlbnQuc3Vic3RyaW5nKDAsIGN1cnJlbnQubGVuZ3RoIC0gMSkgKyBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnLicpIHtcbiAgICAgIC8vIFdoZW4gYC5gIGlzIG5vdCBlc2NhcGVkIChhYm92ZSksIGl0IGlzIGEgZmllbGQgZGVsaW1pdGVyXG4gICAgICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgY2hhcmFjdGVyXG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH1cbiAgfVxuICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cblxudmFyIGNvbWJpbmF0aW9uRmllbGRzID0gWyckb3InLCAnJG5vcicsICckbm90J107XG5mdW5jdGlvbiBpc0NvbWJpbmF0aW9uYWxGaWVsZChmaWVsZCkge1xuICByZXR1cm4gY29tYmluYXRpb25GaWVsZHMuaW5kZXhPZihmaWVsZCkgPiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUob2JqKSB7XG4gIHJldHVybiBvYmpbZ2V0S2V5KG9iaildO1xufVxuXG5cbi8vIGZsYXR0ZW4gYW4gYXJyYXkgb2Ygc2VsZWN0b3JzIGpvaW5lZCBieSBhbiAkYW5kIG9wZXJhdG9yXG5mdW5jdGlvbiBtZXJnZUFuZGVkU2VsZWN0b3JzKHNlbGVjdG9ycykge1xuXG4gIC8vIHNvcnQgdG8gZW5zdXJlIHRoYXQgZS5nLiBpZiB0aGUgdXNlciBzcGVjaWZpZWRcbiAgLy8gJGFuZDogW3skZ3Q6ICdhJ30sIHskZ3Q6ICdiJ31dLCB0aGVuIGl0J3MgY29sbGFwc2VkIGludG9cbiAgLy8ganVzdCB7JGd0OiAnYid9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGZpcnN0ID0geyRvcjogdHJ1ZSwgJG5vcjogdHJ1ZX07XG5cbiAgc2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgT2JqZWN0LmtleXMoc2VsZWN0b3IpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgbWF0Y2hlciA9IHskZXE6IG1hdGNoZXJ9O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICAgIC8vIG9yLCBub3JcbiAgICAgICAgaWYgKG1hdGNoZXIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGlmIChmaXJzdFtmaWVsZF0pIHtcbiAgICAgICAgICAgIGZpcnN0W2ZpZWxkXSA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzW2ZpZWxkXSA9IG1hdGNoZXI7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICAgICAgICByZXNbZmllbGRdLmZvckVhY2goZnVuY3Rpb24gKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIG0gPSBtYXRjaGVyW2tleV07XG4gICAgICAgICAgICAgIHZhciBsb25nZXN0ID0gTWF0aC5tYXgoT2JqZWN0LmtleXMoZXhpc3RpbmcpLmxlbmd0aCwgT2JqZWN0LmtleXMobSkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgdmFyIG1lcmdlZCA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW2V4aXN0aW5nLCBtXSk7XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA8PSBsb25nZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHNpdHVhdGlvbiBsaWtlOiAoYSA6eyRlcSA6MX0gfHwgLi4uKSAmJiAoYSB7JGVxOiAyfSB8fCAuLi4pXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2luZyB3b3VsZCBwcm9kdWNlIGEgJGVxIDIgd2hlbiBhY3R1YWxseSB3ZSBzaG91bGRuJ3QgZXZlciBtYXRjaCBhZ2FpbnN0IHRoZXNlIG1lcmdlZCBjb25kaXRpb25zXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2VkIHNob3VsZCBhbHdheXMgY29udGFpbiBtb3JlIHZhbHVlcyB0byBiZSB2YWxpZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2gobWVyZ2VkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc1tmaWVsZF0gPSBlbnRyaWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vdFxuICAgICAgICAgIHJlc1tmaWVsZF0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKFttYXRjaGVyXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWVsZE1hdGNoZXJzID0gcmVzW2ZpZWxkXSA9IHJlc1tmaWVsZF0gfHwge307XG4gICAgICAgIE9iamVjdC5rZXlzKG1hdGNoZXIpLmZvckVhY2goZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gbWF0Y2hlcltvcGVyYXRvcl07XG5cbiAgICAgICAgICBpZiAob3BlcmF0b3IgPT09ICckZ3QnIHx8IG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUd0R3RlKG9wZXJhdG9yLCB2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gJyRsdCcgfHwgb3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSAnJG5lJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTmUodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09ICckZXEnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VFcSh2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gXCIkcmVnZXhcIikge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmVnZXgodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuXG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGd0L2d0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlR3RHdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA+IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID49IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRndGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckZ3RlJykge1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3Q7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRndCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGx0L2x0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGx0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA8IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDw9IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRsdCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbWJpbmUgJG5lIHZhbHVlcyBpbnRvIG9uZSBhcnJheVxuZnVuY3Rpb24gbWVyZ2VOZSh2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICBpZiAoJyRuZScgaW4gZmllbGRNYXRjaGVycykge1xuICAgIC8vIHRoZXJlIGFyZSBtYW55IHRoaW5ncyB0aGlzIGNvdWxkIFwibm90XCIgYmVcbiAgICBmaWVsZE1hdGNoZXJzLiRuZS5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIHsgLy8gZG9lc24ndCBleGlzdCB5ZXRcbiAgICBmaWVsZE1hdGNoZXJzLiRuZSA9IFt2YWx1ZV07XG4gIH1cbn1cblxuLy8gYWRkICRlcSBpbnRvIHRoZSBtaXhcbmZ1bmN0aW9uIG1lcmdlRXEodmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgbGVzcyBzcGVjaWZpY2l0eSB0aGFuIHRoZSAkZXFcbiAgLy8gVE9ETzogY2hlY2sgZm9yIHVzZXIgZXJyb3JzIGhlcmVcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGd0O1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3RlO1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRuZTtcbiAgZmllbGRNYXRjaGVycy4kZXEgPSB2YWx1ZTtcbn1cblxuLy8gY29tYmluZSAkcmVnZXggdmFsdWVzIGludG8gb25lIGFycmF5XG5mdW5jdGlvbiBtZXJnZVJlZ2V4KHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICgnJHJlZ2V4JyBpbiBmaWVsZE1hdGNoZXJzKSB7XG4gICAgLy8gYSB2YWx1ZSBjb3VsZCBtYXRjaCBtdWx0aXBsZSByZWdleGVzXG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXgucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSB7IC8vIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXggPSBbdmFsdWVdO1xuICB9XG59XG5cbi8vIzc0NTg6IGV4ZWN1dGUgZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9ycyBvbiBuZXN0ZWQgJGFuZFxuZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChvYmopIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmpbaV1bJyRhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICBvYmpbaV0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKG9ialtpXVsnJGFuZCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZCh2YWx1ZSk7IC8vIDwtIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cblxuLy8jNzQ1ODogZGV0ZXJtaW5lIGlkICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKVxuZnVuY3Rpb24gaXNBbmRJblNlbGVjdG9yKG9iaiwgaXNBbmQpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAocHJvcCA9PT0gJyRhbmQnKSB7XG4gICAgICAgICAgICBpc0FuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaXNBbmQgPSBpc0FuZEluU2VsZWN0b3IodmFsdWUsIGlzQW5kKTsgLy8gPC0gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNBbmQ7XG59XG5cbi8vXG4vLyBub3JtYWxpemUgdGhlIHNlbGVjdG9yXG4vL1xuZnVuY3Rpb24gbWFzc2FnZVNlbGVjdG9yKGlucHV0KSB7XG4gIHZhciByZXN1bHQgPSBjbG9uZShpbnB1dCk7XG4gIHZhciB3YXNBbmRlZCA9IGZhbHNlO1xuICAgIC8vIzc0NTg6IGlmICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKSBtZXJnZSBuZXN0ZWQgJGFuZFxuICAgIGlmIChpc0FuZEluU2VsZWN0b3IocmVzdWx0LCBmYWxzZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChyZXN1bHQpO1xuICAgICAgICBpZiAoJyRhbmQnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhyZXN1bHRbJyRhbmQnXSk7XG4gICAgICAgIH1cbiAgICAgICAgd2FzQW5kZWQgPSB0cnVlO1xuICAgIH1cblxuICBbJyRvcicsICckbm9yJ10uZm9yRWFjaChmdW5jdGlvbiAob3JPck5vcikge1xuICAgIGlmIChvck9yTm9yIGluIHJlc3VsdCkge1xuICAgICAgLy8gbWVzc2FnZSBlYWNoIGluZGl2aWR1YWwgc2VsZWN0b3JcbiAgICAgIC8vIGUuZy4ge2ZvbzogJ2Jhcid9IGJlY29tZXMge2ZvbzogeyRlcTogJ2Jhcid9fVxuICAgICAgcmVzdWx0W29yT3JOb3JdLmZvckVhY2goZnVuY3Rpb24gKHN1YlNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSBPYmplY3Qua2V5cyhzdWJTZWxlY3Rvcik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgIHZhciBtYXRjaGVyID0gc3ViU2VsZWN0b3JbZmllbGRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcgfHwgbWF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3ViU2VsZWN0b3JbZmllbGRdID0geyRlcTogbWF0Y2hlcn07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICgnJG5vdCcgaW4gcmVzdWx0KSB7XG4gICAgLy9UaGlzIGZlZWxzIGEgbGl0dGxlIGxpa2UgZm9yY2luZywgYnV0IGl0IHdpbGwgd29yayBmb3Igbm93LFxuICAgIC8vSSB3b3VsZCBsaWtlIHRvIGNvbWUgYmFjayB0byB0aGlzIGFuZCBtYWtlIHRoZSBtZXJnaW5nIG9mIHNlbGVjdG9ycyBhIGxpdHRsZSBtb3JlIGdlbmVyaWNcbiAgICByZXN1bHRbJyRub3QnXSA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW3Jlc3VsdFsnJG5vdCddXSk7XG4gIH1cblxuICB2YXIgZmllbGRzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICB2YXIgbWF0Y2hlciA9IHJlc3VsdFtmaWVsZF07XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgIT09ICdvYmplY3QnIHx8IG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIG1hdGNoZXIgPSB7JGVxOiBtYXRjaGVyfTtcbiAgICB9IGVsc2UgaWYgKCF3YXNBbmRlZCkge1xuICAgICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgcGxhY2VkIGluIGFuIGFycmF5IGJlY2F1c2UgdGhlc2Ugb3BlcmF0b3JzIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGZpZWxkXG4gICAgICAvLyB3aGVuICRhbmQgaXMgdXNlZCwgbWVyZ2VBbmRlZFNlbGVjdG9ycyB0YWtlcyBjYXJlIG9mIHB1dHRpbmcgdGhlbSBpbnRvIGFycmF5cywgb3RoZXJ3aXNlIGl0J3MgZG9uZSBoZXJlOlxuICAgICAgaWYgKCckbmUnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kbmUgPSBbbWF0Y2hlci4kbmVdO1xuICAgICAgfVxuICAgICAgaWYgKCckcmVnZXgnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kcmVnZXggPSBbbWF0Y2hlci4kcmVnZXhdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHRbZmllbGRdID0gbWF0Y2hlcjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhZChzdHIsIHBhZFdpdGgsIHVwVG9MZW5ndGgpIHtcbiAgdmFyIHBhZGRpbmcgPSAnJztcbiAgdmFyIHRhcmdldExlbmd0aCA9IHVwVG9MZW5ndGggLSBzdHIubGVuZ3RoO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB3aGlsZSAocGFkZGluZy5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBwYWRkaW5nICs9IHBhZFdpdGg7XG4gIH1cbiAgcmV0dXJuIHBhZGRpbmc7XG59XG5cbmZ1bmN0aW9uIHBhZExlZnQoc3RyLCBwYWRXaXRoLCB1cFRvTGVuZ3RoKSB7XG4gIHZhciBwYWRkaW5nID0gcGFkKHN0ciwgcGFkV2l0aCwgdXBUb0xlbmd0aCk7XG4gIHJldHVybiBwYWRkaW5nICsgc3RyO1xufVxuXG52YXIgTUlOX01BR05JVFVERSA9IC0zMjQ7IC8vIHZlcmlmaWVkIGJ5IC1OdW1iZXIuTUlOX1ZBTFVFXG52YXIgTUFHTklUVURFX0RJR0lUUyA9IDM7IC8vIGRpdHRvXG52YXIgU0VQID0gJyc7IC8vIHNldCB0byAnXycgZm9yIGVhc2llciBkZWJ1Z2dpbmdcblxuZnVuY3Rpb24gY29sbGF0ZShhLCBiKSB7XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGEgPSBub3JtYWxpemVLZXkoYSk7XG4gIGIgPSBub3JtYWxpemVLZXkoYik7XG5cbiAgdmFyIGFpID0gY29sbGF0aW9uSW5kZXgoYSk7XG4gIHZhciBiaSA9IGNvbGxhdGlvbkluZGV4KGIpO1xuICBpZiAoKGFpIC0gYmkpICE9PSAwKSB7XG4gICAgcmV0dXJuIGFpIC0gYmk7XG4gIH1cbiAgc3dpdGNoICh0eXBlb2YgYSkge1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IDE7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdDb2xsYXRlKGEsIGIpO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGEpID8gYXJyYXlDb2xsYXRlKGEsIGIpIDogb2JqZWN0Q29sbGF0ZShhLCBiKTtcbn1cblxuLy8gY291Y2ggY29uc2lkZXJzIG51bGwvTmFOL0luZmluaXR5Ly1JbmZpbml0eSA9PT0gdW5kZWZpbmVkLFxuLy8gZm9yIHRoZSBwdXJwb3NlcyBvZiBtYXByZWR1Y2UgaW5kZXhlcy4gYWxzbywgZGF0ZXMgZ2V0IHN0cmluZ2lmaWVkLlxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmIChrZXkgPT09IEluZmluaXR5IHx8IGtleSA9PT0gLUluZmluaXR5IHx8IGlzTmFOKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5O1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgb3JpZ0tleSA9IGtleTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgdmFyIGxlbiA9IGtleS5sZW5ndGg7XG4gICAgICAgIGtleSA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAga2V5W2ldID0gbm9ybWFsaXplS2V5KG9yaWdLZXlbaV0pO1xuICAgICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBrZXkudG9KU09OKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gbnVsbCkgeyAvLyBnZW5lcmljIG9iamVjdFxuICAgICAgICBrZXkgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvcmlnS2V5KSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcmlnS2V5LCBrKSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9yaWdLZXlba107XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAga2V5W2tdID0gbm9ybWFsaXplS2V5KHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGtleTtcbn1cblxuZnVuY3Rpb24gaW5kZXhpZnkoa2V5KSB7XG4gIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4ga2V5ID8gMSA6IDA7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gbnVtVG9JbmRleGFibGVTdHJpbmcoa2V5KTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIC8vIFdlJ3ZlIHRvIGJlIHN1cmUgdGhhdCBrZXkgZG9lcyBub3QgY29udGFpbiBcXHUwMDAwXG4gICAgICAgIC8vIERvIG9yZGVyLXByZXNlcnZpbmcgcmVwbGFjZW1lbnRzOlxuICAgICAgICAvLyAwIC0+IDEsIDFcbiAgICAgICAgLy8gMSAtPiAxLCAyXG4gICAgICAgIC8vIDIgLT4gMiwgMlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHJldHVybiBrZXlcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMi9nLCAnXFx1MDAwMlxcdTAwMDInKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAxL2csICdcXHUwMDAxXFx1MDAwMicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDAvZywgJ1xcdTAwMDFcXHUwMDAxJyk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29udHJvbC1yZWdleCAqL1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGtleSk7XG4gICAgICAgIHZhciBhcnIgPSBpc0FycmF5ID8ga2V5IDogT2JqZWN0LmtleXMoa2V5KTtcbiAgICAgICAgdmFyIGkgPSAtMTtcbiAgICAgICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9JbmRleGFibGVTdHJpbmcoYXJyW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgICAgICAgdmFyIG9iaktleSA9IGFycltpXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0luZGV4YWJsZVN0cmluZyhvYmpLZXkpICtcbiAgICAgICAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhrZXlbb2JqS2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLy8gY29udmVydCB0aGUgZ2l2ZW4ga2V5IHRvIGEgc3RyaW5nIHRoYXQgd291bGQgYmUgYXBwcm9wcmlhdGVcbi8vIGZvciBsZXhpY2FsIHNvcnRpbmcsIGUuZy4gd2l0aGluIGEgZGF0YWJhc2UsIHdoZXJlIHRoZVxuLy8gc29ydGluZyBpcyB0aGUgc2FtZSBnaXZlbiBieSB0aGUgY29sbGF0ZSgpIGZ1bmN0aW9uLlxuZnVuY3Rpb24gdG9JbmRleGFibGVTdHJpbmcoa2V5KSB7XG4gIHZhciB6ZXJvID0gJ1xcdTAwMDAnO1xuICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcbiAgcmV0dXJuIGNvbGxhdGlvbkluZGV4KGtleSkgKyBTRVAgKyBpbmRleGlmeShrZXkpICsgemVybztcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoc3RyLCBpKSB7XG4gIHZhciBvcmlnaW5hbElkeCA9IGk7XG4gIHZhciBudW07XG4gIHZhciB6ZXJvID0gc3RyW2ldID09PSAnMSc7XG4gIGlmICh6ZXJvKSB7XG4gICAgbnVtID0gMDtcbiAgICBpKys7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5lZyA9IHN0cltpXSA9PT0gJzAnO1xuICAgIGkrKztcbiAgICB2YXIgbnVtQXNTdHJpbmcgPSAnJztcbiAgICB2YXIgbWFnQXNTdHJpbmcgPSBzdHIuc3Vic3RyaW5nKGksIGkgKyBNQUdOSVRVREVfRElHSVRTKTtcbiAgICB2YXIgbWFnbml0dWRlID0gcGFyc2VJbnQobWFnQXNTdHJpbmcsIDEwKSArIE1JTl9NQUdOSVRVREU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBtYWduaXR1ZGUgPSAtbWFnbml0dWRlO1xuICAgIH1cbiAgICBpICs9IE1BR05JVFVERV9ESUdJVFM7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBjaCA9IHN0cltpXTtcbiAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtQXNTdHJpbmcgKz0gY2g7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIG51bUFzU3RyaW5nID0gbnVtQXNTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICBpZiAobnVtQXNTdHJpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgICBudW0gPSBwYXJzZUludChudW1Bc1N0cmluZywgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW1Bc1N0cmluZ1swXSArICcuJyArIG51bUFzU3RyaW5nWzFdKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBudW0gPSBudW0gLSAxMDtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobWFnbml0dWRlICE9PSAwKSB7XG4gICAgICAvLyBwYXJzZUZsb2F0IGlzIG1vcmUgcmVsaWFibGUgdGhhbiBwb3cgZHVlIHRvIHJvdW5kaW5nIGVycm9yc1xuICAgICAgLy8gZS5nLiBOdW1iZXIuTUFYX1ZBTFVFIHdvdWxkIHJldHVybiBJbmZpbml0eSBpZiB3ZSBkaWRcbiAgICAgIC8vIG51bSAqIE1hdGgucG93KDEwLCBtYWduaXR1ZGUpO1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0gKyAnZScgKyBtYWduaXR1ZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge251bTogbnVtLCBsZW5ndGggOiBpIC0gb3JpZ2luYWxJZHh9O1xufVxuXG4vLyBtb3ZlIHVwIHRoZSBzdGFjayB3aGlsZSBwYXJzaW5nXG4vLyB0aGlzIGZ1bmN0aW9uIG1vdmVkIG91dHNpZGUgb2YgcGFyc2VJbmRleGFibGVTdHJpbmcgZm9yIHBlcmZvcm1hbmNlXG5mdW5jdGlvbiBwb3Aoc3RhY2ssIG1ldGFTdGFjaykge1xuICB2YXIgb2JqID0gc3RhY2sucG9wKCk7XG5cbiAgaWYgKG1ldGFTdGFjay5sZW5ndGgpIHtcbiAgICB2YXIgbGFzdE1ldGFFbGVtZW50ID0gbWV0YVN0YWNrW21ldGFTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgICAgLy8gcG9wcGluZyBhIG1ldGEtZWxlbWVudCwgZS5nLiBhbiBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgYW5vdGhlciBvYmplY3RcbiAgICAgIG1ldGFTdGFjay5wb3AoKTtcbiAgICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gbGFzdE1ldGFFbGVtZW50LmVsZW1lbnQ7XG4gICAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQucHVzaChvYmopO1xuICAgIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICAgIHZhciBrZXkgPSBzdGFjay5wb3AoKTtcbiAgICAgIGVsZW1lbnRba2V5XSA9IG9iajtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhY2sucHVzaChvYmopOyAvLyBvYmogd2l0aCBrZXkgb25seVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUluZGV4YWJsZVN0cmluZyhzdHIpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBtZXRhU3RhY2sgPSBbXTsgLy8gc3RhY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0c1xuICB2YXIgaSA9IDA7XG5cbiAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIGNvbGxhdGlvbkluZGV4ID0gc3RyW2krK107XG4gICAgaWYgKGNvbGxhdGlvbkluZGV4ID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLCBtZXRhU3RhY2spO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoIChjb2xsYXRpb25JbmRleCkge1xuICAgICAgY2FzZSAnMSc6XG4gICAgICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMic6XG4gICAgICAgIHN0YWNrLnB1c2goc3RyW2ldID09PSAnMScpO1xuICAgICAgICBpKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMyc6XG4gICAgICAgIHZhciBwYXJzZWROdW0gPSBwYXJzZU51bWJlcihzdHIsIGkpO1xuICAgICAgICBzdGFjay5wdXNoKHBhcnNlZE51bS5udW0pO1xuICAgICAgICBpICs9IHBhcnNlZE51bS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNCc6XG4gICAgICAgIHZhciBwYXJzZWRTdHIgPSAnJztcbiAgICAgICAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIGNoID0gc3RyW2ldO1xuICAgICAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyc2VkU3RyICs9IGNoO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBwZXJmb3JtIHRoZSByZXZlcnNlIG9mIHRoZSBvcmRlci1wcmVzZXJ2aW5nIHJlcGxhY2VtZW50XG4gICAgICAgIC8vIGFsZ29yaXRobSAoc2VlIGFib3ZlKVxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHBhcnNlZFN0ciA9IHBhcnNlZFN0ci5yZXBsYWNlKC9cXHUwMDAxXFx1MDAwMS9nLCAnXFx1MDAwMCcpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDFcXHUwMDAyL2csICdcXHUwMDAxJylcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMlxcdTAwMDIvZywgJ1xcdTAwMDInKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHN0YWNrLnB1c2gocGFyc2VkU3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc1JzpcbiAgICAgICAgdmFyIGFycmF5RWxlbWVudCA9IHsgZWxlbWVudDogW10sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChhcnJheUVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKGFycmF5RWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNic6XG4gICAgICAgIHZhciBvYmpFbGVtZW50ID0geyBlbGVtZW50OiB7fSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKG9iakVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKG9iakVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2JhZCBjb2xsYXRpb25JbmRleCBvciB1bmV4cGVjdGVkbHkgcmVhY2hlZCBlbmQgb2YgaW5wdXQ6ICcgK1xuICAgICAgICAgICAgY29sbGF0aW9uSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcnJheUNvbGxhdGUoYSwgYikge1xuICB2YXIgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBzb3J0ID0gY29sbGF0ZShhW2ldLCBiW2ldKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSA/IDAgOlxuICAgIChhLmxlbmd0aCA+IGIubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbmZ1bmN0aW9uIHN0cmluZ0NvbGxhdGUoYSwgYikge1xuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYWxlaGFydmV5L3BvdWNoZGIvaXNzdWVzLzQwXG4gIC8vIFRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENvdWNoREIgaW1wbGVtZW50YXRpb24sIGJ1dCBpdHMgdGhlXG4gIC8vIGJlc3Qgd2UgY2FuIGRvIGZvciBub3dcbiAgcmV0dXJuIChhID09PSBiKSA/IDAgOiAoKGEgPiBiKSA/IDEgOiAtMSk7XG59XG5mdW5jdGlvbiBvYmplY3RDb2xsYXRlKGEsIGIpIHtcbiAgdmFyIGFrID0gT2JqZWN0LmtleXMoYSksIGJrID0gT2JqZWN0LmtleXMoYik7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhay5sZW5ndGgsIGJrLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBGaXJzdCBzb3J0IHRoZSBrZXlzXG4gICAgdmFyIHNvcnQgPSBjb2xsYXRlKGFrW2ldLCBia1tpXSk7XG4gICAgaWYgKHNvcnQgIT09IDApIHtcbiAgICAgIHJldHVybiBzb3J0O1xuICAgIH1cbiAgICAvLyBpZiB0aGUga2V5cyBhcmUgZXF1YWwgc29ydCB0aGUgdmFsdWVzXG4gICAgc29ydCA9IGNvbGxhdGUoYVtha1tpXV0sIGJbYmtbaV1dKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuXG4gIH1cbiAgcmV0dXJuIChhay5sZW5ndGggPT09IGJrLmxlbmd0aCkgPyAwIDpcbiAgICAoYWsubGVuZ3RoID4gYmsubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbi8vIFRoZSBjb2xsYXRpb24gaXMgZGVmaW5lZCBieSBlcmxhbmdzIG9yZGVyZWQgdGVybXNcbi8vIHRoZSBhdG9tcyBudWxsLCB0cnVlLCBmYWxzZSBjb21lIGZpcnN0LCB0aGVuIG51bWJlcnMsIHN0cmluZ3MsXG4vLyBhcnJheXMsIHRoZW4gb2JqZWN0c1xuLy8gbnVsbC91bmRlZmluZWQvTmFOL0luZmluaXR5Ly1JbmZpbml0eSBhcmUgYWxsIGNvbnNpZGVyZWQgbnVsbFxuZnVuY3Rpb24gY29sbGF0aW9uSW5kZXgoeCkge1xuICB2YXIgaWQgPSBbJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ3N0cmluZycsICdvYmplY3QnXTtcbiAgdmFyIGlkeCA9IGlkLmluZGV4T2YodHlwZW9mIHgpO1xuICAvL2ZhbHNlIGlmIC0xIG90aGVyd2lzZSB0cnVlLCBidXQgZmFzdCEhISExXG4gIGlmICh+aWR4KSB7XG4gICAgaWYgKHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgcmV0dXJuIDU7XG4gICAgfVxuICAgIHJldHVybiBpZHggPCAzID8gKGlkeCArIDIpIDogKGlkeCArIDMpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIDU7XG4gIH1cbn1cblxuLy8gY29udmVyc2lvbjpcbi8vIHggeXl5IHp6Li4uenpcbi8vIHggPSAwIGZvciBuZWdhdGl2ZSwgMSBmb3IgMCwgMiBmb3IgcG9zaXRpdmVcbi8vIHkgPSBleHBvbmVudCAoZm9yIG5lZ2F0aXZlIG51bWJlcnMgbmVnYXRlZCkgbW92ZWQgc28gdGhhdCBpdCdzID49IDBcbi8vIHogPSBtYW50aXNzZVxuZnVuY3Rpb24gbnVtVG9JbmRleGFibGVTdHJpbmcobnVtKSB7XG5cbiAgaWYgKG51bSA9PT0gMCkge1xuICAgIHJldHVybiAnMSc7XG4gIH1cblxuICAvLyBjb252ZXJ0IG51bWJlciB0byBleHBvbmVudGlhbCBmb3JtYXQgZm9yIGVhc2llciBhbmRcbiAgLy8gbW9yZSBzdWNjaW5jdCBzdHJpbmcgc29ydGluZ1xuICB2YXIgZXhwRm9ybWF0ID0gbnVtLnRvRXhwb25lbnRpYWwoKS5zcGxpdCgvZVxcKz8vKTtcbiAgdmFyIG1hZ25pdHVkZSA9IHBhcnNlSW50KGV4cEZvcm1hdFsxXSwgMTApO1xuXG4gIHZhciBuZWcgPSBudW0gPCAwO1xuXG4gIHZhciByZXN1bHQgPSBuZWcgPyAnMCcgOiAnMic7XG5cbiAgLy8gZmlyc3Qgc29ydCBieSBtYWduaXR1ZGVcbiAgLy8gaXQncyBlYXNpZXIgaWYgYWxsIG1hZ25pdHVkZXMgYXJlIHBvc2l0aXZlXG4gIHZhciBtYWdGb3JDb21wYXJpc29uID0gKChuZWcgPyAtbWFnbml0dWRlIDogbWFnbml0dWRlKSAtIE1JTl9NQUdOSVRVREUpO1xuICB2YXIgbWFnU3RyaW5nID0gcGFkTGVmdCgobWFnRm9yQ29tcGFyaXNvbikudG9TdHJpbmcoKSwgJzAnLCBNQUdOSVRVREVfRElHSVRTKTtcblxuICByZXN1bHQgKz0gU0VQICsgbWFnU3RyaW5nO1xuXG4gIC8vIHRoZW4gc29ydCBieSB0aGUgZmFjdG9yXG4gIHZhciBmYWN0b3IgPSBNYXRoLmFicyhwYXJzZUZsb2F0KGV4cEZvcm1hdFswXSkpOyAvLyBbMS4uMTApXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChuZWcpIHsgLy8gZm9yIG5lZ2F0aXZlIHJldmVyc2Ugb3JkZXJpbmdcbiAgICBmYWN0b3IgPSAxMCAtIGZhY3RvcjtcbiAgfVxuXG4gIHZhciBmYWN0b3JTdHIgPSBmYWN0b3IudG9GaXhlZCgyMCk7XG5cbiAgLy8gc3RyaXAgemVyb3MgZnJvbSB0aGUgZW5kXG4gIGZhY3RvclN0ciA9IGZhY3RvclN0ci5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuXG4gIHJlc3VsdCArPSBTRVAgKyBmYWN0b3JTdHI7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gY3JlYXRlIGEgY29tcGFyYXRvciBiYXNlZCBvbiB0aGUgc29ydCBvYmplY3RcbmZ1bmN0aW9uIGNyZWF0ZUZpZWxkU29ydGVyKHNvcnQpIHtcblxuICBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoZG9jKSB7XG4gICAgcmV0dXJuIHNvcnQubWFwKGZ1bmN0aW9uIChzb3J0aW5nKSB7XG4gICAgICB2YXIgZmllbGROYW1lID0gZ2V0S2V5KHNvcnRpbmcpO1xuICAgICAgdmFyIHBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgdmFyIGRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jLCBwYXJzZWRGaWVsZCk7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYVJvdywgYlJvdykge1xuICAgIHZhciBhRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYVJvdy5kb2MpO1xuICAgIHZhciBiRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYlJvdy5kb2MpO1xuICAgIHZhciBjb2xsYXRpb24gPSBjb2xsYXRlKGFGaWVsZFZhbHVlcywgYkZpZWxkVmFsdWVzKTtcbiAgICBpZiAoY29sbGF0aW9uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29sbGF0aW9uO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFuZ28gc2VlbXMgdG8gZG9cbiAgICByZXR1cm4gY29tcGFyZSQxKGFSb3cuZG9jLl9pZCwgYlJvdy5kb2MuX2lkKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmlsdGVySW5NZW1vcnlGaWVsZHMocm93cywgcmVxdWVzdERlZiwgaW5NZW1vcnlGaWVsZHMpIHtcbiAgcm93cyA9IHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICByZXR1cm4gcm93RmlsdGVyKHJvdy5kb2MsIHJlcXVlc3REZWYuc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKTtcbiAgfSk7XG5cbiAgaWYgKHJlcXVlc3REZWYuc29ydCkge1xuICAgIC8vIGluLW1lbW9yeSBzb3J0XG4gICAgdmFyIGZpZWxkU29ydGVyID0gY3JlYXRlRmllbGRTb3J0ZXIocmVxdWVzdERlZi5zb3J0KTtcbiAgICByb3dzID0gcm93cy5zb3J0KGZpZWxkU29ydGVyKTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3REZWYuc29ydFswXSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgZ2V0VmFsdWUocmVxdWVzdERlZi5zb3J0WzBdKSA9PT0gJ2Rlc2MnKSB7XG4gICAgICByb3dzID0gcm93cy5yZXZlcnNlKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCdsaW1pdCcgaW4gcmVxdWVzdERlZiB8fCAnc2tpcCcgaW4gcmVxdWVzdERlZikge1xuICAgIC8vIGhhdmUgdG8gZG8gdGhlIGxpbWl0IGluLW1lbW9yeVxuICAgIHZhciBza2lwID0gcmVxdWVzdERlZi5za2lwIHx8IDA7XG4gICAgdmFyIGxpbWl0ID0gKCdsaW1pdCcgaW4gcmVxdWVzdERlZiA/IHJlcXVlc3REZWYubGltaXQgOiByb3dzLmxlbmd0aCkgKyBza2lwO1xuICAgIHJvd3MgPSByb3dzLnNsaWNlKHNraXAsIGxpbWl0KTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gcm93RmlsdGVyKGRvYywgc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKSB7XG4gIHJldHVybiBpbk1lbW9yeUZpZWxkcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICB2YXIgcGFyc2VkRmllbGQgPSBwYXJzZUZpZWxkKGZpZWxkKTtcbiAgICB2YXIgZG9jRmllbGRWYWx1ZSA9IGdldEZpZWxkRnJvbURvYyhkb2MsIHBhcnNlZEZpZWxkKTtcbiAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvcihmaWVsZCwgbWF0Y2hlciwgZG9jKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hTZWxlY3RvcihtYXRjaGVyLCBkb2MsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoU2VsZWN0b3IobWF0Y2hlciwgZG9jLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICBpZiAoIW1hdGNoZXIpIHtcbiAgICAvLyBubyBmaWx0ZXJpbmcgbmVjZXNzYXJ5OyB0aGlzIGZpZWxkIGlzIGp1c3QgbmVlZGVkIGZvciBzb3J0aW5nXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyBtYXRjaGVyIGFuIG9iamVjdCwgaWYgc28gY29udGludWUgcmVjdXJzaW9uXG4gIGlmICh0eXBlb2YgbWF0Y2hlciA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWF0Y2hlcikuZXZlcnkoZnVuY3Rpb24gKG1heWJlVXNlck9wZXJhdG9yKSB7XG4gICAgICB2YXIgdXNlclZhbHVlID0gbWF0Y2hlclsgbWF5YmVVc2VyT3BlcmF0b3IgXTtcbiAgICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yXG4gICAgICBpZiAobWF5YmVVc2VyT3BlcmF0b3IuaW5kZXhPZihcIiRcIikgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoKG1heWJlVXNlck9wZXJhdG9yLCBkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHN1YlBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChtYXliZVVzZXJPcGVyYXRvcik7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvY0ZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHR5cGVvZiB1c2VyVmFsdWUgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBzdWJQYXJzZWRGaWVsZC5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG9yIGdldEZpZWxkRnJvbURvYyB3aWxsIHRocm93XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1YkRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jRmllbGRWYWx1ZSwgc3ViUGFyc2VkRmllbGQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdXNlclZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gZmllbGQgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYXQgbWlnaHQgY29udGFpbiBtb3JlIG9wZXJhdG9yc1xuICAgICAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgc3ViRG9jRmllbGRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbXBsaWNpdCBvcGVyYXRvclxuICAgICAgICByZXR1cm4gbWF0Y2goXCIkZXFcIiwgZG9jLCB1c2VyVmFsdWUsIHN1YlBhcnNlZEZpZWxkLCBzdWJEb2NGaWVsZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG5vIG1vcmUgZGVwdGgsIE5vIG5lZWQgdG8gcmVjdXJzZSBmdXJ0aGVyXG4gIHJldHVybiBtYXRjaGVyID09PSBkb2NGaWVsZFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yKGZpZWxkLCBtYXRjaGVyLCBkb2MpIHtcblxuICBpZiAoZmllbGQgPT09ICckb3InKSB7XG4gICAgcmV0dXJuIG1hdGNoZXIuc29tZShmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgICAgcmV0dXJuIHJvd0ZpbHRlcihkb2MsIG9yTWF0Y2hlcnMsIE9iamVjdC5rZXlzKG9yTWF0Y2hlcnMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChmaWVsZCA9PT0gJyRub3QnKSB7XG4gICAgcmV0dXJuICFyb3dGaWx0ZXIoZG9jLCBtYXRjaGVyLCBPYmplY3Qua2V5cyhtYXRjaGVyKSk7XG4gIH1cblxuICAvL2Akbm9yYFxuICByZXR1cm4gIW1hdGNoZXIuZmluZChmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgIHJldHVybiByb3dGaWx0ZXIoZG9jLCBvck1hdGNoZXJzLCBPYmplY3Qua2V5cyhvck1hdGNoZXJzKSk7XG4gIH0pO1xuXG59XG5cbmZ1bmN0aW9uIG1hdGNoKHVzZXJPcGVyYXRvciwgZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gIGlmICghbWF0Y2hlcnNbdXNlck9wZXJhdG9yXSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIG9wZXJhdG9yIFwiJyArIHVzZXJPcGVyYXRvciArXG4gICAgICAnXCIgLSBzaG91bGQgYmUgb25lIG9mICRlcSwgJGx0ZSwgJGx0LCAkZ3QsICRndGUsICRleGlzdHMsICRuZSwgJGluLCAnICtcbiAgICAgICckbmluLCAkc2l6ZSwgJG1vZCwgJHJlZ2V4LCAkZWxlbU1hdGNoLCAkdHlwZSwgJGFsbE1hdGNoIG9yICRhbGwnKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcnNbdXNlck9wZXJhdG9yXShkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jRmllbGRWYWx1ZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIG1vZEZpZWxkKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWUgIT09IFwibnVtYmVyXCIgfHxcbiAgICBwYXJzZUludChkb2NGaWVsZFZhbHVlLCAxMCkgIT09IGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZGl2aXNvciA9IHVzZXJWYWx1ZVswXTtcbiAgdmFyIG1vZCA9IHVzZXJWYWx1ZVsxXTtcblxuICByZXR1cm4gZG9jRmllbGRWYWx1ZSAlIGRpdmlzb3IgPT09IG1vZDtcbn1cblxuZnVuY3Rpb24gYXJyYXlDb250YWluc1ZhbHVlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICByZXR1cm4gdXNlclZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmIChkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICAgIHJldHVybiBjb2xsYXRlKHZhbCwgZG9jRmllbGRWYWx1ZUl0ZW0pID09PSAwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbGxhdGUodmFsLCBkb2NGaWVsZFZhbHVlKSA9PT0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICByZXR1cm4gY29sbGF0ZSh2YWwsIGRvY0ZpZWxkVmFsdWVJdGVtKSA9PT0gMDtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSB1c2VyVmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlZ2V4TWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHZhciByZSA9IG5ldyBSZWdFeHAodXNlclZhbHVlKTtcblxuICByZXR1cm4gcmUudGVzdChkb2NGaWVsZFZhbHVlKTtcbn1cblxuZnVuY3Rpb24gdHlwZU1hdGNoKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuXG4gIHN3aXRjaCAodXNlclZhbHVlKSB7XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZSA9PT0gbnVsbDtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnYm9vbGVhbic7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnbnVtYmVyJztcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHR5cGVvZiAoZG9jRmllbGRWYWx1ZSkgPT09ICdzdHJpbmcnO1xuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXk7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiAoe30pLnRvU3RyaW5nLmNhbGwoZG9jRmllbGRWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICB9XG59XG5cbnZhciBtYXRjaGVycyA9IHtcblxuICAnJGVsZW1NYXRjaCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZG9jRmllbGRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWVbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHJvd0ZpbHRlcih2YWwsIHVzZXJWYWx1ZSwgT2JqZWN0LmtleXModXNlclZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGFsbE1hdGNoJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkb2NGaWVsZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkb2NGaWVsZFZhbHVlWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gcm93RmlsdGVyKHZhbCwgdXNlclZhbHVlLCBPYmplY3Qua2V5cyh1c2VyVmFsdWUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGVxJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA9PT0gMDtcbiAgfSxcblxuICAnJGd0ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPj0gMDtcbiAgfSxcblxuICAnJGd0JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA+IDA7XG4gIH0sXG5cbiAgJyRsdGUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIDw9IDA7XG4gIH0sXG5cbiAgJyRsdCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPCAwO1xuICB9LFxuXG4gICckZXhpc3RzJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIC8vYSBmaWVsZCB0aGF0IGlzIG51bGwgaXMgc3RpbGwgY29uc2lkZXJlZCB0byBleGlzdFxuICAgIGlmICh1c2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiAhZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKTtcbiAgfSxcblxuICAnJG1vZCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgbW9kRmllbGQoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5lJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKG5lVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIG5lVmFsdWUpICE9PSAwO1xuICAgIH0pO1xuICB9LFxuICAnJGluJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJiBhcnJheUNvbnRhaW5zVmFsdWUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5pbic6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgIWFycmF5Q29udGFpbnNWYWx1ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckc2l6ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckYWxsJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRvY0ZpZWxkVmFsdWUpICYmIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJHJlZ2V4JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJlxuICAgICAgdHlwZW9mIGRvY0ZpZWxkVmFsdWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgdXNlclZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChyZWdleFZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZWdleE1hdGNoKGRvY0ZpZWxkVmFsdWUsIHJlZ2V4VmFsdWUpO1xuICAgICAgfSk7XG4gIH0sXG5cbiAgJyR0eXBlJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB0eXBlTWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfVxufTtcblxuLy8gcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRvYyBtYXRjaGVzIHRoZSBzdXBwbGllZCBzZWxlY3RvclxuZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKGRvYywgc2VsZWN0b3IpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdvYmplY3QnKSB7XG4gICAgLy8gbWF0Y2ggdGhlIENvdWNoREIgZXJyb3IgbWVzc2FnZVxuICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0b3IgZXJyb3I6IGV4cGVjdGVkIGEgSlNPTiBvYmplY3QnKTtcbiAgfVxuXG4gIHNlbGVjdG9yID0gbWFzc2FnZVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgdmFyIHJvdyA9IHtcbiAgICAnZG9jJzogZG9jXG4gIH07XG5cbiAgdmFyIHJvd3NNYXRjaGVkID0gZmlsdGVySW5NZW1vcnlGaWVsZHMoW3Jvd10sIHsgJ3NlbGVjdG9yJzogc2VsZWN0b3IgfSwgT2JqZWN0LmtleXMoc2VsZWN0b3IpKTtcbiAgcmV0dXJuIHJvd3NNYXRjaGVkICYmIHJvd3NNYXRjaGVkLmxlbmd0aCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gZXZhbEZpbHRlcihpbnB1dCkge1xuICByZXR1cm4gc2NvcGVFdmFsKCdcInVzZSBzdHJpY3RcIjtcXG5yZXR1cm4gJyArIGlucHV0ICsgJzsnLCB7fSk7XG59XG5cbmZ1bmN0aW9uIGV2YWxWaWV3KGlucHV0KSB7XG4gIHZhciBjb2RlID0gW1xuICAgICdyZXR1cm4gZnVuY3Rpb24oZG9jKSB7JyxcbiAgICAnICBcInVzZSBzdHJpY3RcIjsnLFxuICAgICcgIHZhciBlbWl0dGVkID0gZmFsc2U7JyxcbiAgICAnICB2YXIgZW1pdCA9IGZ1bmN0aW9uIChhLCBiKSB7JyxcbiAgICAnICAgIGVtaXR0ZWQgPSB0cnVlOycsXG4gICAgJyAgfTsnLFxuICAgICcgIHZhciB2aWV3ID0gJyArIGlucHV0ICsgJzsnLFxuICAgICcgIHZpZXcoZG9jKTsnLFxuICAgICcgIGlmIChlbWl0dGVkKSB7JyxcbiAgICAnICAgIHJldHVybiB0cnVlOycsXG4gICAgJyAgfScsXG4gICAgJ307J1xuICBdLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBzY29wZUV2YWwoY29kZSwge30pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShvcHRzLCBjYWxsYmFjaykge1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciAhPT0gJ19zZWxlY3RvcicpIHtcbiAgICAgIHZhciBmaWx0ZXJOYW1lID0gdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJyA/XG4gICAgICAgIG9wdHMuZmlsdGVyIDogJ2Z1bmN0aW9uJztcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ3NlbGVjdG9yIGludmFsaWQgZm9yIGZpbHRlciBcIicgKyBmaWx0ZXJOYW1lICsgJ1wiJykpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjaygpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUob3B0cykge1xuICBpZiAob3B0cy52aWV3ICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ192aWV3JztcbiAgfVxuXG4gIGlmIChvcHRzLnNlbGVjdG9yICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ19zZWxlY3Rvcic7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgIGlmIChvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgICAgb3B0cy52aWV3ID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMuZmlsdGVyID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMuZmlsdGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRmlsdGVyKGNoYW5nZXNIYW5kbGVyLCBvcHRzKSB7XG4gIHJldHVybiBvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdzdHJpbmcnICYmXG4gICAgIW9wdHMuZG9jX2lkcyAmJiAhaXNSZW1vdGUoY2hhbmdlc0hhbmRsZXIuZGIpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXIoY2hhbmdlc0hhbmRsZXIsIG9wdHMpIHtcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcbiAgaWYgKG9wdHMuZmlsdGVyID09PSAnX3ZpZXcnKSB7XG4gICAgaWYgKCFvcHRzLnZpZXcgfHwgdHlwZW9mIG9wdHMudmlldyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihCQURfUkVRVUVTVCxcbiAgICAgICAgJ2B2aWV3YCBmaWx0ZXIgcGFyYW1ldGVyIG5vdCBmb3VuZCBvciBpbnZhbGlkLicpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIC8vIGZldGNoIGEgdmlldyBmcm9tIGEgZGVzaWduIGRvYywgbWFrZSBpdCBiZWhhdmUgbGlrZSBhIGZpbHRlclxuICAgIHZhciB2aWV3TmFtZSA9IHBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgY2hhbmdlc0hhbmRsZXIuZGIuZ2V0KCdfZGVzaWduLycgKyB2aWV3TmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXBGdW4gPSBkZG9jICYmIGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0gJiZcbiAgICAgICAgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0ubWFwO1xuICAgICAgaWYgKCFtYXBGdW4pIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLFxuICAgICAgICAgIChkZG9jLnZpZXdzID8gJ21pc3NpbmcganNvbiBrZXk6ICcgKyB2aWV3TmFtZVsxXSA6XG4gICAgICAgICAgICAnbWlzc2luZyBqc29uIGtleTogdmlld3MnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsVmlldyhtYXBGdW4pO1xuICAgICAgY2hhbmdlc0hhbmRsZXIuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKG9wdHMuc2VsZWN0b3IpIHtcbiAgICBvcHRzLmZpbHRlciA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzU2VsZWN0b3IoZG9jLCBvcHRzLnNlbGVjdG9yKTtcbiAgICB9O1xuICAgIGNoYW5nZXNIYW5kbGVyLmRvQ2hhbmdlcyhvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBmZXRjaCBhIGZpbHRlciBmcm9tIGEgZGVzaWduIGRvY1xuICAgIHZhciBmaWx0ZXJOYW1lID0gcGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUob3B0cy5maWx0ZXIpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmRiLmdldCgnX2Rlc2lnbi8nICsgZmlsdGVyTmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBmaWx0ZXJGdW4gPSBkZG9jICYmIGRkb2MuZmlsdGVycyAmJiBkZG9jLmZpbHRlcnNbZmlsdGVyTmFtZVsxXV07XG4gICAgICBpZiAoIWZpbHRlckZ1bikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsXG4gICAgICAgICAgKChkZG9jICYmIGRkb2MuZmlsdGVycykgPyAnbWlzc2luZyBqc29uIGtleTogJyArIGZpbHRlck5hbWVbMV1cbiAgICAgICAgICAgIDogJ21pc3NpbmcganNvbiBrZXk6IGZpbHRlcnMnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsRmlsdGVyKGZpbHRlckZ1bik7XG4gICAgICBjaGFuZ2VzSGFuZGxlci5kb0NoYW5nZXMob3B0cyk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlDaGFuZ2VzRmlsdGVyUGx1Z2luKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbiA9IHtcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgbm9ybWFsaXplOiBub3JtYWxpemUsXG4gICAgc2hvdWxkRmlsdGVyOiBzaG91bGRGaWx0ZXIsXG4gICAgZmlsdGVyOiBmaWx0ZXJcbiAgfTtcbn1cblxuLy8gVE9ETzogcmVtb3ZlIGZyb20gcG91Y2hkYi1jb3JlIChicmVha2luZylcblBvdWNoREIucGx1Z2luKGFwcGx5Q2hhbmdlc0ZpbHRlclBsdWdpbik7XG5cblBvdWNoREIudmVyc2lvbiA9IHZlcnNpb247XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgaXRlbSkge1xuICAgIG9ialtpdGVtXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufVxuLy8gTGlzdCBvZiB0b3AgbGV2ZWwgcmVzZXJ2ZWQgd29yZHMgZm9yIGRvY1xudmFyIHJlc2VydmVkV29yZHMgPSB0b09iamVjdChbXG4gICdfaWQnLFxuICAnX3JldicsXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gICdfZGVsZXRlZCcsXG4gICdfcmV2aXNpb25zJyxcbiAgJ19yZXZzX2luZm8nLFxuICAnX2NvbmZsaWN0cycsXG4gICdfZGVsZXRlZF9jb25mbGljdHMnLFxuICAnX2xvY2FsX3NlcScsXG4gICdfcmV2X3RyZWUnLFxuICAvLyByZXBsaWNhdGlvbiBkb2N1bWVudHNcbiAgJ19yZXBsaWNhdGlvbl9pZCcsXG4gICdfcmVwbGljYXRpb25fc3RhdGUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3RpbWUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3JlYXNvbicsXG4gICdfcmVwbGljYXRpb25fc3RhdHMnLFxuICAvLyBTcGVjaWZpYyB0byBDb3VjaGJhc2UgU3luYyBHYXRld2F5XG4gICdfcmVtb3ZlZCdcbl0pO1xuXG4vLyBMaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgc2hvdWxkIGVuZCB1cCBpbiB0aGUgZG9jdW1lbnRcbnZhciBkYXRhV29yZHMgPSB0b09iamVjdChbXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gIC8vIHJlcGxpY2F0aW9uIGRvY3VtZW50c1xuICAnX3JlcGxpY2F0aW9uX2lkJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfdGltZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfcmVhc29uJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0cydcbl0pO1xuXG5mdW5jdGlvbiBwYXJzZVJldmlzaW9uSW5mbyhyZXYpIHtcbiAgaWYgKCEvXlxcZCstLy50ZXN0KHJldikpIHtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoSU5WQUxJRF9SRVYpO1xuICB9XG4gIHZhciBpZHggPSByZXYuaW5kZXhPZignLScpO1xuICB2YXIgbGVmdCA9IHJldi5zdWJzdHJpbmcoMCwgaWR4KTtcbiAgdmFyIHJpZ2h0ID0gcmV2LnN1YnN0cmluZyhpZHggKyAxKTtcbiAgcmV0dXJuIHtcbiAgICBwcmVmaXg6IHBhcnNlSW50KGxlZnQsIDEwKSxcbiAgICBpZDogcmlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKHJldmlzaW9ucywgb3B0cykge1xuICB2YXIgcG9zID0gcmV2aXNpb25zLnN0YXJ0IC0gcmV2aXNpb25zLmlkcy5sZW5ndGggKyAxO1xuXG4gIHZhciByZXZpc2lvbklkcyA9IHJldmlzaW9ucy5pZHM7XG4gIHZhciBpZHMgPSBbcmV2aXNpb25JZHNbMF0sIG9wdHMsIFtdXTtcblxuICBmb3IgKHZhciBpID0gMSwgbGVuID0gcmV2aXNpb25JZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZHMgPSBbcmV2aXNpb25JZHNbaV0sIHtzdGF0dXM6ICdtaXNzaW5nJ30sIFtpZHNdXTtcbiAgfVxuXG4gIHJldHVybiBbe1xuICAgIHBvczogcG9zLFxuICAgIGlkczogaWRzXG4gIH1dO1xufVxuXG4vLyBQcmVwcm9jZXNzIGRvY3VtZW50cywgcGFyc2UgdGhlaXIgcmV2aXNpb25zLCBhc3NpZ24gYW4gaWQgYW5kIGFcbi8vIHJldmlzaW9uIGZvciBuZXcgd3JpdGVzIHRoYXQgYXJlIG1pc3NpbmcgdGhlbSwgZXRjXG5mdW5jdGlvbiBwYXJzZURvYyhkb2MsIG5ld0VkaXRzLCBkYk9wdHMpIHtcbiAgaWYgKCFkYk9wdHMpIHtcbiAgICBkYk9wdHMgPSB7XG4gICAgICBkZXRlcm1pbmlzdGljX3JldnM6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgdmFyIG5SZXZOdW07XG4gIHZhciBuZXdSZXZJZDtcbiAgdmFyIHJldkluZm87XG4gIHZhciBvcHRzID0ge3N0YXR1czogJ2F2YWlsYWJsZSd9O1xuICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgb3B0cy5kZWxldGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChuZXdFZGl0cykge1xuICAgIGlmICghZG9jLl9pZCkge1xuICAgICAgZG9jLl9pZCA9IHV1aWQoKTtcbiAgICB9XG4gICAgbmV3UmV2SWQgPSByZXYkJDEoZG9jLCBkYk9wdHMuZGV0ZXJtaW5pc3RpY19yZXZzKTtcbiAgICBpZiAoZG9jLl9yZXYpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IHJldkluZm8ucHJlZml4LFxuICAgICAgICBpZHM6IFtyZXZJbmZvLmlkLCB7c3RhdHVzOiAnbWlzc2luZyd9LCBbW25ld1JldklkLCBvcHRzLCBbXV1dXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gcmV2SW5mby5wcmVmaXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gW3tcbiAgICAgICAgcG9zOiAxLFxuICAgICAgICBpZHMgOiBbbmV3UmV2SWQsIG9wdHMsIFtdXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gMTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRvYy5fcmV2aXNpb25zKSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKGRvYy5fcmV2aXNpb25zLCBvcHRzKTtcbiAgICAgIG5SZXZOdW0gPSBkb2MuX3JldmlzaW9ucy5zdGFydDtcbiAgICAgIG5ld1JldklkID0gZG9jLl9yZXZpc2lvbnMuaWRzWzBdO1xuICAgIH1cbiAgICBpZiAoIWRvYy5fcmV2X3RyZWUpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIG5SZXZOdW0gPSByZXZJbmZvLnByZWZpeDtcbiAgICAgIG5ld1JldklkID0gcmV2SW5mby5pZDtcbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IG5SZXZOdW0sXG4gICAgICAgIGlkczogW25ld1JldklkLCBvcHRzLCBbXV1cbiAgICAgIH1dO1xuICAgIH1cbiAgfVxuXG4gIGludmFsaWRJZEVycm9yKGRvYy5faWQpO1xuXG4gIGRvYy5fcmV2ID0gblJldk51bSArICctJyArIG5ld1JldklkO1xuXG4gIHZhciByZXN1bHQgPSB7bWV0YWRhdGEgOiB7fSwgZGF0YSA6IHt9fTtcbiAgZm9yICh2YXIga2V5IGluIGRvYykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb2MsIGtleSkpIHtcbiAgICAgIHZhciBzcGVjaWFsS2V5ID0ga2V5WzBdID09PSAnXyc7XG4gICAgICBpZiAoc3BlY2lhbEtleSAmJiAhcmVzZXJ2ZWRXb3Jkc1trZXldKSB7XG4gICAgICAgIHZhciBlcnJvciA9IGNyZWF0ZUVycm9yKERPQ19WQUxJREFUSU9OLCBrZXkpO1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gRE9DX1ZBTElEQVRJT04ubWVzc2FnZSArICc6ICcgKyBrZXk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsS2V5ICYmICFkYXRhV29yZHNba2V5XSkge1xuICAgICAgICByZXN1bHQubWV0YWRhdGFba2V5LnNsaWNlKDEpXSA9IGRvY1trZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmRhdGFba2V5XSA9IGRvY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwYXJzZUJhc2U2NChkYXRhKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXNBdG9iKGRhdGEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKEJBRF9BUkcsXG4gICAgICAnQXR0YWNobWVudCBpcyBub3QgYSB2YWxpZCBiYXNlNjQgc3RyaW5nJyk7XG4gICAgcmV0dXJuIHtlcnJvcjogZXJyfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzU3RyaW5nKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIHZhciBhc0JpbmFyeSA9IHBhcnNlQmFzZTY0KGF0dC5kYXRhKTtcbiAgaWYgKGFzQmluYXJ5LmVycm9yKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGFzQmluYXJ5LmVycm9yKTtcbiAgfVxuXG4gIGF0dC5sZW5ndGggPSBhc0JpbmFyeS5sZW5ndGg7XG4gIGlmIChibG9iVHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgYXR0LmRhdGEgPSBiaW5TdHJpbmdUb0JsdWZmZXIoYXNCaW5hcnksIGF0dC5jb250ZW50X3R5cGUpO1xuICB9IGVsc2UgaWYgKGJsb2JUeXBlID09PSAnYmFzZTY0Jykge1xuICAgIGF0dC5kYXRhID0gdGhpc0J0b2EoYXNCaW5hcnkpO1xuICB9IGVsc2UgeyAvLyBiaW5hcnlcbiAgICBhdHQuZGF0YSA9IGFzQmluYXJ5O1xuICB9XG4gIGJpbmFyeU1kNShhc0JpbmFyeSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyByZXN1bHQ7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NCbG9iKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGJpbmFyeU1kNShhdHQuZGF0YSwgZnVuY3Rpb24gKG1kNSkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyBtZDU7XG4gICAgLy8gc2l6ZSBpcyBmb3IgYmxvYnMgKGJyb3dzZXIpLCBsZW5ndGggaXMgZm9yIGJ1ZmZlcnMgKG5vZGUpXG4gICAgYXR0Lmxlbmd0aCA9IGF0dC5kYXRhLnNpemUgfHwgYXR0LmRhdGEubGVuZ3RoIHx8IDA7XG4gICAgaWYgKGJsb2JUeXBlID09PSAnYmluYXJ5Jykge1xuICAgICAgYmxvYlRvQmluYXJ5U3RyaW5nKGF0dC5kYXRhLCBmdW5jdGlvbiAoYmluU3RyaW5nKSB7XG4gICAgICAgIGF0dC5kYXRhID0gYmluU3RyaW5nO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChibG9iVHlwZSA9PT0gJ2Jhc2U2NCcpIHtcbiAgICAgIGJsb2JUb0Jhc2U2NChhdHQuZGF0YSwgZnVuY3Rpb24gKGI2NCkge1xuICAgICAgICBhdHQuZGF0YSA9IGI2NDtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NBdHRhY2htZW50KGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGlmIChhdHQuc3R1Yikge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG4gIGlmICh0eXBlb2YgYXR0LmRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGlucHV0IGlzIGEgYmFzZTY0IHN0cmluZ1xuICAgIHByZXByb2Nlc3NTdHJpbmcoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spO1xuICB9IGVsc2UgeyAvLyBpbnB1dCBpcyBhIGJsb2JcbiAgICBwcmVwcm9jZXNzQmxvYihhdHQsIGJsb2JUeXBlLCBjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgY2FsbGJhY2spIHtcblxuICBpZiAoIWRvY0luZm9zLmxlbmd0aCkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgdmFyIGRvY3YgPSAwO1xuICB2YXIgb3ZlcmFsbEVycjtcblxuICBkb2NJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJbmZvKSB7XG4gICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jSW5mby5kYXRhICYmIGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMgP1xuICAgICAgT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykgOiBbXTtcbiAgICB2YXIgcmVjdiA9IDA7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzZWRBdHRhY2htZW50KGVycikge1xuICAgICAgb3ZlcmFsbEVyciA9IGVycjtcbiAgICAgIHJlY3YrKztcbiAgICAgIGlmIChyZWN2ID09PSBhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgcHJlcHJvY2Vzc0F0dGFjaG1lbnQoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50c1trZXldLFxuICAgICAgICAgIGJsb2JUeXBlLCBwcm9jZXNzZWRBdHRhY2htZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgZG9jdisrO1xuICAgIGlmIChkb2NJbmZvcy5sZW5ndGggPT09IGRvY3YpIHtcbiAgICAgIGlmIChvdmVyYWxsRXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKG92ZXJhbGxFcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRG9jKHJldkxpbWl0LCBwcmV2LCBkb2NJbmZvLCByZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgIGksIGNiLCB3cml0ZURvYywgbmV3RWRpdHMpIHtcblxuICBpZiAocmV2RXhpc3RzKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2KSAmJiAhbmV3RWRpdHMpIHtcbiAgICByZXN1bHRzW2ldID0gZG9jSW5mbztcbiAgICByZXR1cm4gY2IoKTtcbiAgfVxuXG4gIC8vIHNvbWV0aW1lcyB0aGlzIGlzIHByZS1jYWxjdWxhdGVkLiBoaXN0b3JpY2FsbHkgbm90IGFsd2F5c1xuICB2YXIgcHJldmlvdXNXaW5uaW5nUmV2ID0gcHJldi53aW5uaW5nUmV2IHx8IHdpbm5pbmdSZXYocHJldik7XG4gIHZhciBwcmV2aW91c2x5RGVsZXRlZCA9ICdkZWxldGVkJyBpbiBwcmV2ID8gcHJldi5kZWxldGVkIDpcbiAgICBpc0RlbGV0ZWQocHJldiwgcHJldmlvdXNXaW5uaW5nUmV2KTtcbiAgdmFyIGRlbGV0ZWQgPSAnZGVsZXRlZCcgaW4gZG9jSW5mby5tZXRhZGF0YSA/IGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA6XG4gICAgaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEpO1xuICB2YXIgaXNSb290ID0gL14xLS8udGVzdChkb2NJbmZvLm1ldGFkYXRhLnJldik7XG5cbiAgaWYgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG5ld0VkaXRzICYmIGlzUm9vdCkge1xuICAgIHZhciBuZXdEb2MgPSBkb2NJbmZvLmRhdGE7XG4gICAgbmV3RG9jLl9yZXYgPSBwcmV2aW91c1dpbm5pbmdSZXY7XG4gICAgbmV3RG9jLl9pZCA9IGRvY0luZm8ubWV0YWRhdGEuaWQ7XG4gICAgZG9jSW5mbyA9IHBhcnNlRG9jKG5ld0RvYywgbmV3RWRpdHMpO1xuICB9XG5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWVbMF0sIHJldkxpbWl0KTtcblxuICB2YXIgaW5Db25mbGljdCA9IG5ld0VkaXRzICYmICgoXG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmIGRlbGV0ZWQgJiYgbWVyZ2VkLmNvbmZsaWN0cyAhPT0gJ25ld19sZWFmJykgfHxcbiAgICAoIXByZXZpb3VzbHlEZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgIT09ICduZXdfbGVhZicpIHx8XG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgPT09ICduZXdfYnJhbmNoJykpKTtcblxuICBpZiAoaW5Db25mbGljdCkge1xuICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIHJlc3VsdHNbaV0gPSBlcnI7XG4gICAgcmV0dXJuIGNiKCk7XG4gIH1cblxuICB2YXIgbmV3UmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG4gIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWUgPSBtZXJnZWQudHJlZTtcbiAgZG9jSW5mby5zdGVtbWVkUmV2cyA9IG1lcmdlZC5zdGVtbWVkUmV2cyB8fCBbXTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHByZXYucmV2X21hcCkge1xuICAgIGRvY0luZm8ubWV0YWRhdGEucmV2X21hcCA9IHByZXYucmV2X21hcDsgLy8gdXNlZCBvbmx5IGJ5IGxldmVsZGJcbiAgfVxuXG4gIC8vIHJlY2FsY3VsYXRlXG4gIHZhciB3aW5uaW5nUmV2JCQxID0gd2lubmluZ1Jldihkb2NJbmZvLm1ldGFkYXRhKTtcbiAgdmFyIHdpbm5pbmdSZXZJc0RlbGV0ZWQgPSBpc0RlbGV0ZWQoZG9jSW5mby5tZXRhZGF0YSwgd2lubmluZ1JldiQkMSk7XG5cbiAgLy8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSBhZGRlZC9yZW1vdmVkLFxuICAvLyBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0b3RhbF9yb3dzL2RvY19jb3VudFxuICB2YXIgZGVsdGEgPSAocHJldmlvdXNseURlbGV0ZWQgPT09IHdpbm5pbmdSZXZJc0RlbGV0ZWQpID8gMCA6XG4gICAgcHJldmlvdXNseURlbGV0ZWQgPCB3aW5uaW5nUmV2SXNEZWxldGVkID8gLTEgOiAxO1xuXG4gIHZhciBuZXdSZXZJc0RlbGV0ZWQ7XG4gIGlmIChuZXdSZXYgPT09IHdpbm5pbmdSZXYkJDEpIHtcbiAgICAvLyBpZiB0aGUgbmV3IHJldiBpcyB0aGUgc2FtZSBhcyB0aGUgd2lubmluZyByZXYsIHdlIGNhbiByZXVzZSB0aGF0IHZhbHVlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gd2lubmluZ1JldklzRGVsZXRlZDtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB0aGV5J3JlIG5vdCB0aGUgc2FtZSwgdGhlbiB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIG5ld1Jldik7XG4gIH1cblxuICB3cml0ZURvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLCBuZXdSZXZJc0RlbGV0ZWQsXG4gICAgdHJ1ZSwgZGVsdGEsIGksIGNiKTtcbn1cblxuZnVuY3Rpb24gcm9vdElzTWlzc2luZyhkb2NJbmZvKSB7XG4gIHJldHVybiBkb2NJbmZvLm1ldGFkYXRhLnJldl90cmVlWzBdLmlkc1sxXS5zdGF0dXMgPT09ICdtaXNzaW5nJztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0RvY3MocmV2TGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLCB0eCwgcmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgIHdyaXRlRG9jLCBvcHRzLCBvdmVyYWxsQ2FsbGJhY2spIHtcblxuICAvLyBEZWZhdWx0IHRvIDEwMDAgbG9jYWxseVxuICByZXZMaW1pdCA9IHJldkxpbWl0IHx8IDEwMDA7XG5cbiAgZnVuY3Rpb24gaW5zZXJ0RG9jKGRvY0luZm8sIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG4gICAgLy8gQ2FudCBpbnNlcnQgbmV3IGRlbGV0ZWQgZG9jdW1lbnRzXG4gICAgdmFyIHdpbm5pbmdSZXYkJDEgPSB3aW5uaW5nUmV2KGRvY0luZm8ubWV0YWRhdGEpO1xuICAgIHZhciBkZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEpO1xuICAgIGlmICgnd2FzX2RlbGV0ZScgaW4gb3B0cyAmJiBkZWxldGVkKSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHNJZHhdID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdkZWxldGVkJyk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvLyA0NzEyIC0gZGV0ZWN0IHdoZXRoZXIgYSBuZXcgZG9jdW1lbnQgd2FzIGluc2VydGVkIHdpdGggYSBfcmV2XG4gICAgdmFyIGluQ29uZmxpY3QgPSBuZXdFZGl0cyAmJiByb290SXNNaXNzaW5nKGRvY0luZm8pO1xuXG4gICAgaWYgKGluQ29uZmxpY3QpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IGVycjtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHZhciBkZWx0YSA9IGRlbGV0ZWQgPyAwIDogMTtcblxuICAgIHdyaXRlRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQsIGRlbGV0ZWQsIGZhbHNlLFxuICAgICAgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBuZXdFZGl0cyA9IG9wdHMubmV3X2VkaXRzO1xuICB2YXIgaWRzVG9Eb2NzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgdmFyIGRvY3NEb25lID0gMDtcbiAgdmFyIGRvY3NUb0RvID0gZG9jSW5mb3MubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNoZWNrQWxsRG9jc0RvbmUoKSB7XG4gICAgaWYgKCsrZG9jc0RvbmUgPT09IGRvY3NUb0RvICYmIG92ZXJhbGxDYWxsYmFjaykge1xuICAgICAgb3ZlcmFsbENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZG9jSW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudERvYywgcmVzdWx0c0lkeCkge1xuXG4gICAgaWYgKGN1cnJlbnREb2MuX2lkICYmIGlzTG9jYWxJZChjdXJyZW50RG9jLl9pZCkpIHtcbiAgICAgIHZhciBmdW4gPSBjdXJyZW50RG9jLl9kZWxldGVkID8gJ19yZW1vdmVMb2NhbCcgOiAnX3B1dExvY2FsJztcbiAgICAgIGFwaVtmdW5dKGN1cnJlbnREb2MsIHtjdHg6IHR4fSwgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHJlc3VsdHNbcmVzdWx0c0lkeF0gPSBlcnIgfHwgcmVzO1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaWQgPSBjdXJyZW50RG9jLm1ldGFkYXRhLmlkO1xuICAgIGlmIChpZHNUb0RvY3MuaGFzKGlkKSkge1xuICAgICAgZG9jc1RvRG8tLTsgLy8gZHVwbGljYXRlXG4gICAgICBpZHNUb0RvY3MuZ2V0KGlkKS5wdXNoKFtjdXJyZW50RG9jLCByZXN1bHRzSWR4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkc1RvRG9jcy5zZXQoaWQsIFtbY3VycmVudERvYywgcmVzdWx0c0lkeF1dKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGluIHRoZSBjYXNlIG9mIG5ld19lZGl0cywgdGhlIHVzZXIgY2FuIHByb3ZpZGUgbXVsdGlwbGUgZG9jc1xuICAvLyB3aXRoIHRoZSBzYW1lIGlkLiB0aGVzZSBuZWVkIHRvIGJlIHByb2Nlc3NlZCBzZXF1ZW50aWFsbHlcbiAgaWRzVG9Eb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvY3MsIGlkKSB7XG4gICAgdmFyIG51bURvbmUgPSAwO1xuXG4gICAgZnVuY3Rpb24gZG9jV3JpdHRlbigpIHtcbiAgICAgIGlmICgrK251bURvbmUgPCBkb2NzLmxlbmd0aCkge1xuICAgICAgICBuZXh0RG9jKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5leHREb2MoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBkb2NzW251bURvbmVdO1xuICAgICAgdmFyIGN1cnJlbnREb2MgPSB2YWx1ZVswXTtcbiAgICAgIHZhciByZXN1bHRzSWR4ID0gdmFsdWVbMV07XG5cbiAgICAgIGlmIChmZXRjaGVkRG9jcy5oYXMoaWQpKSB7XG4gICAgICAgIHVwZGF0ZURvYyhyZXZMaW1pdCwgZmV0Y2hlZERvY3MuZ2V0KGlkKSwgY3VycmVudERvYywgcmVzdWx0cyxcbiAgICAgICAgICByZXN1bHRzSWR4LCBkb2NXcml0dGVuLCB3cml0ZURvYywgbmV3RWRpdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRW5zdXJlIHN0ZW1taW5nIGFwcGxpZXMgdG8gbmV3IHdyaXRlcyBhcyB3ZWxsXG4gICAgICAgIHZhciBtZXJnZWQgPSBtZXJnZShbXSwgY3VycmVudERvYy5tZXRhZGF0YS5yZXZfdHJlZVswXSwgcmV2TGltaXQpO1xuICAgICAgICBjdXJyZW50RG9jLm1ldGFkYXRhLnJldl90cmVlID0gbWVyZ2VkLnRyZWU7XG4gICAgICAgIGN1cnJlbnREb2Muc3RlbW1lZFJldnMgPSBtZXJnZWQuc3RlbW1lZFJldnMgfHwgW107XG4gICAgICAgIGluc2VydERvYyhjdXJyZW50RG9jLCByZXN1bHRzSWR4LCBkb2NXcml0dGVuKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbmV4dERvYygpO1xuICB9KTtcbn1cblxuLy8gSW5kZXhlZERCIHJlcXVpcmVzIGEgdmVyc2lvbmVkIGRhdGFiYXNlIHN0cnVjdHVyZSwgc28gd2UgdXNlIHRoZVxuLy8gdmVyc2lvbiBoZXJlIHRvIG1hbmFnZSBtaWdyYXRpb25zLlxudmFyIEFEQVBURVJfVkVSU0lPTiA9IDU7XG5cbi8vIFRoZSBvYmplY3Qgc3RvcmVzIGNyZWF0ZWQgZm9yIGVhY2ggZGF0YWJhc2Vcbi8vIERPQ19TVE9SRSBzdG9yZXMgdGhlIGRvY3VtZW50IG1ldGEgZGF0YSwgaXRzIHJldmlzaW9uIGhpc3RvcnkgYW5kIHN0YXRlXG4vLyBLZXllZCBieSBkb2N1bWVudCBpZFxudmFyIERPQ19TVE9SRSA9ICdkb2N1bWVudC1zdG9yZSc7XG4vLyBCWV9TRVFfU1RPUkUgc3RvcmVzIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQsIGtleWVkIGJ5IGl0c1xuLy8gc2VxdWVuY2UgaWRcbnZhciBCWV9TRVFfU1RPUkUgPSAnYnktc2VxdWVuY2UnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgYXR0YWNobWVudHNcbnZhciBBVFRBQ0hfU1RPUkUgPSAnYXR0YWNoLXN0b3JlJztcbi8vIFdoZXJlIHdlIHN0b3JlIG1hbnktdG8tbWFueSByZWxhdGlvbnNcbi8vIGJldHdlZW4gYXR0YWNobWVudCBkaWdlc3RzIGFuZCBzZXFzXG52YXIgQVRUQUNIX0FORF9TRVFfU1RPUkUgPSAnYXR0YWNoLXNlcS1zdG9yZSc7XG5cbi8vIFdoZXJlIHdlIHN0b3JlIGRhdGFiYXNlLXdpZGUgbWV0YSBkYXRhIGluIGEgc2luZ2xlIHJlY29yZFxuLy8ga2V5ZWQgYnkgaWQ6IE1FVEFfU1RPUkVcbnZhciBNRVRBX1NUT1JFID0gJ21ldGEtc3RvcmUnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgbG9jYWwgZG9jdW1lbnRzXG52YXIgTE9DQUxfU1RPUkUgPSAnbG9jYWwtc3RvcmUnO1xuLy8gV2hlcmUgd2UgZGV0ZWN0IGJsb2Igc3VwcG9ydFxudmFyIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUgPSAnZGV0ZWN0LWJsb2Itc3VwcG9ydCc7XG5cbmZ1bmN0aW9uIHNhZmVKc29uUGFyc2Uoc3RyKSB7XG4gIC8vIFRoaXMgdHJ5L2NhdGNoIGd1YXJkcyBhZ2FpbnN0IHN0YWNrIG92ZXJmbG93IGVycm9ycy5cbiAgLy8gSlNPTi5wYXJzZSgpIGlzIGZhc3RlciB0aGFuIHZ1dnV6ZWxhLnBhcnNlKCkgYnV0IHZ1dnV6ZWxhXG4gIC8vIGNhbm5vdCBvdmVyZmxvdy5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEucGFyc2Uoc3RyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlSnNvblN0cmluZ2lmeShqc29uKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEuc3RyaW5naWZ5KGpzb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlkYkVycm9yKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAndW5rbm93bl9lcnJvcic7XG4gICAgaWYgKGV2dC50YXJnZXQgJiYgZXZ0LnRhcmdldC5lcnJvcikge1xuICAgICAgbWVzc2FnZSA9IGV2dC50YXJnZXQuZXJyb3IubmFtZSB8fCBldnQudGFyZ2V0LmVycm9yLm1lc3NhZ2U7XG4gICAgfVxuICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUiwgbWVzc2FnZSwgZXZ0LnR5cGUpKTtcbiAgfTtcbn1cblxuLy8gVW5mb3J0dW5hdGVseSwgdGhlIG1ldGFkYXRhIGhhcyB0byBiZSBzdHJpbmdpZmllZFxuLy8gd2hlbiBpdCBpcyBwdXQgaW50byB0aGUgZGF0YWJhc2UsIGJlY2F1c2Ugb3RoZXJ3aXNlXG4vLyBJbmRleGVkREIgY2FuIHRocm93IGVycm9ycyBmb3IgZGVlcGx5LW5lc3RlZCBvYmplY3RzLlxuLy8gT3JpZ2luYWxseSB3ZSBqdXN0IHVzZWQgSlNPTi5wYXJzZS9KU09OLnN0cmluZ2lmeTsgbm93XG4vLyB3ZSB1c2UgdGhpcyBjdXN0b20gdnV2dXplbGEgbGlicmFyeSB0aGF0IGF2b2lkcyByZWN1cnNpb24uXG4vLyBJZiB3ZSBjb3VsZCBkbyBpdCBhbGwgb3ZlciBhZ2Fpbiwgd2UnZCBwcm9iYWJseSB1c2UgYVxuLy8gZm9ybWF0IGZvciB0aGUgcmV2aXNpb24gdHJlZXMgb3RoZXIgdGhhbiBKU09OLlxuZnVuY3Rpb24gZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYsIGRlbGV0ZWQpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBzYWZlSnNvblN0cmluZ2lmeShtZXRhZGF0YSksXG4gICAgd2lubmluZ1Jldjogd2lubmluZ1JldixcbiAgICBkZWxldGVkT3JMb2NhbDogZGVsZXRlZCA/ICcxJyA6ICcwJyxcbiAgICBzZXE6IG1ldGFkYXRhLnNlcSwgLy8gaGlnaGVzdCBzZXEgZm9yIHRoaXMgZG9jXG4gICAgaWQ6IG1ldGFkYXRhLmlkXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlY29kZU1ldGFkYXRhKHN0b3JlZE9iamVjdCkge1xuICBpZiAoIXN0b3JlZE9iamVjdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBtZXRhZGF0YSA9IHNhZmVKc29uUGFyc2Uoc3RvcmVkT2JqZWN0LmRhdGEpO1xuICBtZXRhZGF0YS53aW5uaW5nUmV2ID0gc3RvcmVkT2JqZWN0Lndpbm5pbmdSZXY7XG4gIG1ldGFkYXRhLmRlbGV0ZWQgPSBzdG9yZWRPYmplY3QuZGVsZXRlZE9yTG9jYWwgPT09ICcxJztcbiAgbWV0YWRhdGEuc2VxID0gc3RvcmVkT2JqZWN0LnNlcTtcbiAgcmV0dXJuIG1ldGFkYXRhO1xufVxuXG4vLyByZWFkIHRoZSBkb2MgYmFjayBvdXQgZnJvbSB0aGUgZGF0YWJhc2UuIHdlIGRvbid0IHN0b3JlIHRoZVxuLy8gX2lkIG9yIF9yZXYgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgX2RvY19pZF9yZXYuXG5mdW5jdGlvbiBkZWNvZGVEb2MoZG9jKSB7XG4gIGlmICghZG9jKSB7XG4gICAgcmV0dXJuIGRvYztcbiAgfVxuICB2YXIgaWR4ID0gZG9jLl9kb2NfaWRfcmV2Lmxhc3RJbmRleE9mKCc6Jyk7XG4gIGRvYy5faWQgPSBkb2MuX2RvY19pZF9yZXYuc3Vic3RyaW5nKDAsIGlkeCAtIDEpO1xuICBkb2MuX3JldiA9IGRvYy5fZG9jX2lkX3Jldi5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gIGRlbGV0ZSBkb2MuX2RvY19pZF9yZXY7XG4gIHJldHVybiBkb2M7XG59XG5cbi8vIFJlYWQgYSBibG9iIGZyb20gdGhlIGRhdGFiYXNlLCBlbmNvZGluZyBhcyBuZWNlc3Nhcnlcbi8vIGFuZCB0cmFuc2xhdGluZyBmcm9tIGJhc2U2NCBpZiB0aGUgSURCIGRvZXNuJ3Qgc3VwcG9ydFxuLy8gbmF0aXZlIEJsb2JzXG5mdW5jdGlvbiByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgYXNCbG9iLCBjYWxsYmFjaykge1xuICBpZiAoYXNCbG9iKSB7XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjayhjcmVhdGVCbG9iKFsnJ10sIHt0eXBlOiB0eXBlfSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnKSB7IC8vIHdlIGhhdmUgYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9IGVsc2UgeyAvLyBubyBibG9iIHN1cHBvcnRcbiAgICAgIGNhbGxiYWNrKGI2NFRvQmx1ZmZlcihib2R5LCB0eXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBhcyBiYXNlNjQgc3RyaW5nXG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjaygnJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHsgLy8gd2UgaGF2ZSBibG9iIHN1cHBvcnRcbiAgICAgIHJlYWRBc0JpbmFyeVN0cmluZyhib2R5LCBmdW5jdGlvbiAoYmluYXJ5KSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJpbmFyeSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHsgLy8gbm8gYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRhY2htZW50c0lmTmVjZXNzYXJ5KGRvYywgb3B0cywgdHhuLCBjYikge1xuICB2YXIgYXR0YWNobWVudHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgaWYgKCFhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2IgJiYgY2IoKTtcbiAgfVxuICB2YXIgbnVtRG9uZSA9IDA7XG5cbiAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgIGlmICgrK251bURvbmUgPT09IGF0dGFjaG1lbnRzLmxlbmd0aCAmJiBjYikge1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnQoZG9jLCBhdHQpIHtcbiAgICB2YXIgYXR0T2JqID0gZG9jLl9hdHRhY2htZW50c1thdHRdO1xuICAgIHZhciBkaWdlc3QgPSBhdHRPYmouZGlnZXN0O1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKS5nZXQoZGlnZXN0KTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGF0dE9iai5ib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICBjaGVja0RvbmUoKTtcbiAgICB9O1xuICB9XG5cbiAgYXR0YWNobWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYXR0KSB7XG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGZldGNoQXR0YWNobWVudChkb2MsIGF0dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgIGNoZWNrRG9uZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIElEQi1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBuZWNlc3NhcnkgYmVjYXVzZVxuLy8gd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHdlIHN0b3JlZCBhIHRydWUgQmxvYiBvclxuLy8gYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcsIGFuZCBpZiBpdCdzIGEgQmxvYiBpdFxuLy8gbmVlZHMgdG8gYmUgcmVhZCBvdXRzaWRlIG9mIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG5mdW5jdGlvbiBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIGFzQmxvYikge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgIGlmIChyb3cuZG9jICYmIHJvdy5kb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICB2YXIgYXR0TmFtZXMgPSBPYmplY3Qua2V5cyhyb3cuZG9jLl9hdHRhY2htZW50cyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYXR0TmFtZXMubWFwKGZ1bmN0aW9uIChhdHQpIHtcbiAgICAgICAgdmFyIGF0dE9iaiA9IHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF07XG4gICAgICAgIGlmICghKCdib2R5JyBpbiBhdHRPYmopKSB7IC8vIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib2R5ID0gYXR0T2JqLmJvZHk7XG4gICAgICAgIHZhciB0eXBlID0gYXR0T2JqLmNvbnRlbnRfdHlwZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVhZEJsb2JEYXRhKGJvZHksIHR5cGUsIGFzQmxvYiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF0gPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oXG4gICAgICAgICAgICAgIHBpY2soYXR0T2JqLCBbJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnXSksXG4gICAgICAgICAgICAgIHtkYXRhOiBkYXRhfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhY3RSZXZzKHJldnMsIGRvY0lkLCB0eG4pIHtcblxuICB2YXIgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMgPSBbXTtcbiAgdmFyIHNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gIHZhciBhdHRTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpO1xuICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICB2YXIgY291bnQgPSByZXZzLmxlbmd0aDtcblxuICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgY291bnQtLTtcbiAgICBpZiAoIWNvdW50KSB7IC8vIGRvbmUgcHJvY2Vzc2luZyBhbGwgcmV2c1xuICAgICAgZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZU9ycGhhbmVkQXR0YWNobWVudHMoKSB7XG4gICAgaWYgKCFwb3NzaWJseU9ycGhhbmVkRGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMuZm9yRWFjaChmdW5jdGlvbiAoZGlnZXN0KSB7XG4gICAgICB2YXIgY291bnRSZXEgPSBhdHRBbmRTZXFTdG9yZS5pbmRleCgnZGlnZXN0U2VxJykuY291bnQoXG4gICAgICAgIElEQktleVJhbmdlLmJvdW5kKFxuICAgICAgICAgIGRpZ2VzdCArICc6OicsIGRpZ2VzdCArICc6OlxcdWZmZmYnLCBmYWxzZSwgZmFsc2UpKTtcbiAgICAgIGNvdW50UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjb3VudCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgIC8vIG9ycGhhbmVkXG4gICAgICAgICAgYXR0U3RvcmUuZGVsZXRlKGRpZ2VzdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXZzLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgIHZhciBrZXkgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICBpbmRleC5nZXRLZXkoa2V5KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHNlcSA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0eXBlb2Ygc2VxICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gY2hlY2tEb25lKCk7XG4gICAgICB9XG4gICAgICBzZXFTdG9yZS5kZWxldGUoc2VxKTtcblxuICAgICAgdmFyIGN1cnNvciA9IGF0dEFuZFNlcVN0b3JlLmluZGV4KCdzZXEnKVxuICAgICAgICAub3BlbkN1cnNvcihJREJLZXlSYW5nZS5vbmx5KHNlcSkpO1xuXG4gICAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgdmFyIGRpZ2VzdCA9IGN1cnNvci52YWx1ZS5kaWdlc3RTZXEuc3BsaXQoJzo6JylbMF07XG4gICAgICAgICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMucHVzaChkaWdlc3QpO1xuICAgICAgICAgIGF0dEFuZFNlcVN0b3JlLmRlbGV0ZShjdXJzb3IucHJpbWFyeUtleSk7XG4gICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIGRvbmVcbiAgICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCBtb2RlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4bjogaWRiLnRyYW5zYWN0aW9uKHN0b3JlcywgbW9kZSlcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVyclxuICAgIH07XG4gIH1cbn1cblxudmFyIGNoYW5nZXNIYW5kbGVyID0gbmV3IENoYW5nZXMoKTtcblxuZnVuY3Rpb24gaWRiQnVsa0RvY3MoZGJPcHRzLCByZXEsIG9wdHMsIGFwaSwgaWRiLCBjYWxsYmFjaykge1xuICB2YXIgZG9jSW5mb3MgPSByZXEuZG9jcztcbiAgdmFyIHR4bjtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGF0dGFjaFN0b3JlO1xuICB2YXIgYXR0YWNoQW5kU2VxU3RvcmU7XG4gIHZhciBtZXRhU3RvcmU7XG4gIHZhciBkb2NJbmZvRXJyb3I7XG4gIHZhciBtZXRhRG9jO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkb2NJbmZvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NJbmZvc1tpXTtcbiAgICBpZiAoZG9jLl9pZCAmJiBpc0xvY2FsSWQoZG9jLl9pZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBkb2MgPSBkb2NJbmZvc1tpXSA9IHBhcnNlRG9jKGRvYywgb3B0cy5uZXdfZWRpdHMsIGRiT3B0cyk7XG4gICAgaWYgKGRvYy5lcnJvciAmJiAhZG9jSW5mb0Vycm9yKSB7XG4gICAgICBkb2NJbmZvRXJyb3IgPSBkb2M7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRvY0luZm9FcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFjayhkb2NJbmZvRXJyb3IpO1xuICB9XG5cbiAgdmFyIGFsbERvY3NQcm9jZXNzZWQgPSBmYWxzZTtcbiAgdmFyIGRvY0NvdW50RGVsdGEgPSAwO1xuICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShkb2NJbmZvcy5sZW5ndGgpO1xuICB2YXIgZmV0Y2hlZERvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgdmFyIHByZWNvbmRpdGlvbkVycm9yZWQgPSBmYWxzZTtcbiAgdmFyIGJsb2JUeXBlID0gYXBpLl9tZXRhLmJsb2JTdXBwb3J0ID8gJ2Jsb2InIDogJ2Jhc2U2NCc7XG5cbiAgcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICBzdGFydFRyYW5zYWN0aW9uKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oKSB7XG5cbiAgICB2YXIgc3RvcmVzID0gW1xuICAgICAgRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBMT0NBTF9TVE9SRSwgQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICBNRVRBX1NUT1JFXG4gICAgXTtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgdHhuLm9udGltZW91dCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICB0eG4ub25jb21wbGV0ZSA9IGNvbXBsZXRlO1xuICAgIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgYnlTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgIGF0dGFjaFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSk7XG4gICAgYXR0YWNoQW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICAgIG1ldGFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKTtcblxuICAgIG1ldGFTdG9yZS5nZXQoTUVUQV9TVE9SRSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFEb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcbiAgICB9O1xuXG4gICAgdmVyaWZ5QXR0YWNobWVudHMoZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBwcmVjb25kaXRpb25FcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICBmZXRjaEV4aXN0aW5nRG9jcygpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25BbGxEb2NzUHJvY2Vzc2VkKCkge1xuICAgIGFsbERvY3NQcm9jZXNzZWQgPSB0cnVlO1xuICAgIHVwZGF0ZURvY0NvdW50SWZSZWFkeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaWRiUHJvY2Vzc0RvY3MoKSB7XG4gICAgcHJvY2Vzc0RvY3MoZGJPcHRzLnJldnNfbGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLFxuICAgICAgICAgICAgICAgIHR4biwgcmVzdWx0cywgd3JpdGVEb2MsIG9wdHMsIG9uQWxsRG9jc1Byb2Nlc3NlZCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVEb2NDb3VudElmUmVhZHkoKSB7XG4gICAgaWYgKCFtZXRhRG9jIHx8ICFhbGxEb2NzUHJvY2Vzc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNhY2hpbmcgdGhlIGRvY0NvdW50IHNhdmVzIGEgbG90IG9mIHRpbWUgaW4gYWxsRG9jcygpIGFuZFxuICAgIC8vIGluZm8oKSwgd2hpY2ggaXMgd2h5IHdlIGdvIHRvIGFsbCB0aGUgdHJvdWJsZSBvZiBkb2luZyB0aGlzXG4gICAgbWV0YURvYy5kb2NDb3VudCArPSBkb2NDb3VudERlbHRhO1xuICAgIG1ldGFTdG9yZS5wdXQobWV0YURvYyk7XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEV4aXN0aW5nRG9jcygpIHtcblxuICAgIGlmICghZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG51bUZldGNoZWQgPSAwO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgICAgaWYgKCsrbnVtRmV0Y2hlZCA9PT0gZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIGlkYlByb2Nlc3NEb2NzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGV2ZW50KSB7XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShldmVudC50YXJnZXQucmVzdWx0KTtcblxuICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgIGZldGNoZWREb2NzLnNldChtZXRhZGF0YS5pZCwgbWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgY2hlY2tEb25lKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRvY0luZm9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZG9jSW5mbyA9IGRvY0luZm9zW2ldO1xuICAgICAgaWYgKGRvY0luZm8uX2lkICYmIGlzTG9jYWxJZChkb2NJbmZvLl9pZCkpIHtcbiAgICAgICAgY2hlY2tEb25lKCk7IC8vIHNraXAgbG9jYWwgZG9jc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5nZXQoZG9jSW5mby5tZXRhZGF0YS5pZCk7XG4gICAgICByZXEub25zdWNjZXNzID0gcmVhZE1ldGFkYXRhO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgIGlmIChwcmVjb25kaXRpb25FcnJvcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGFwaS5fbWV0YS5uYW1lKTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBjYWxsYmFjaykge1xuXG4gICAgdmFyIHJlcSA9IGF0dGFjaFN0b3JlLmdldChkaWdlc3QpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlLnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfU1RVQixcbiAgICAgICAgICAndW5rbm93biBzdHViIGF0dGFjaG1lbnQgd2l0aCBkaWdlc3QgJyArXG4gICAgICAgICAgZGlnZXN0KTtcbiAgICAgICAgZXJyLnN0YXR1cyA9IDQxMjtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnRzKGZpbmlzaCkge1xuXG5cbiAgICB2YXIgZGlnZXN0cyA9IFtdO1xuICAgIGRvY0luZm9zLmZvckVhY2goZnVuY3Rpb24gKGRvY0luZm8pIHtcbiAgICAgIGlmIChkb2NJbmZvLmRhdGEgJiYgZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykge1xuICAgICAgICBPYmplY3Qua2V5cyhkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXTtcbiAgICAgICAgICBpZiAoYXR0LnN0dWIpIHtcbiAgICAgICAgICAgIGRpZ2VzdHMucHVzaChhdHQuZGlnZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICB9XG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBlcnI7XG5cbiAgICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgICBpZiAoKytudW1Eb25lID09PSBkaWdlc3RzLmxlbmd0aCkge1xuICAgICAgICBmaW5pc2goZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZGlnZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChkaWdlc3QpIHtcbiAgICAgIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBmdW5jdGlvbiAoYXR0RXJyKSB7XG4gICAgICAgIGlmIChhdHRFcnIgJiYgIWVycikge1xuICAgICAgICAgIGVyciA9IGF0dEVycjtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCwgbmV3UmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICBpc1VwZGF0ZSwgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICBkb2NJbmZvLm1ldGFkYXRhLndpbm5pbmdSZXYgPSB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA9IHdpbm5pbmdSZXZJc0RlbGV0ZWQ7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIGRvYy5faWQgPSBkb2NJbmZvLm1ldGFkYXRhLmlkO1xuICAgIGRvYy5fcmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG5cbiAgICBpZiAobmV3UmV2SXNEZWxldGVkKSB7XG4gICAgICBkb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBoYXNBdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpLmxlbmd0aDtcbiAgICBpZiAoaGFzQXR0YWNobWVudHMpIHtcbiAgICAgIHJldHVybiB3cml0ZUF0dGFjaG1lbnRzKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZG9jQ291bnREZWx0YSArPSBkZWx0YTtcbiAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcblxuICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIHZhciBtZXRhZGF0YSA9IGRvY0luZm8ubWV0YWRhdGE7XG5cbiAgICBkb2MuX2RvY19pZF9yZXYgPSBtZXRhZGF0YS5pZCArICc6OicgKyBtZXRhZGF0YS5yZXY7XG4gICAgZGVsZXRlIGRvYy5faWQ7XG4gICAgZGVsZXRlIGRvYy5fcmV2O1xuXG4gICAgZnVuY3Rpb24gYWZ0ZXJQdXREb2MoZSkge1xuICAgICAgdmFyIHJldnNUb0RlbGV0ZSA9IGRvY0luZm8uc3RlbW1lZFJldnMgfHwgW107XG5cbiAgICAgIGlmIChpc1VwZGF0ZSAmJiBhcGkuYXV0b19jb21wYWN0aW9uKSB7XG4gICAgICAgIHJldnNUb0RlbGV0ZSA9IHJldnNUb0RlbGV0ZS5jb25jYXQoY29tcGFjdFRyZWUoZG9jSW5mby5tZXRhZGF0YSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV2c1RvRGVsZXRlICYmIHJldnNUb0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgY29tcGFjdFJldnMocmV2c1RvRGVsZXRlLCBkb2NJbmZvLm1ldGFkYXRhLmlkLCB0eG4pO1xuICAgICAgfVxuXG4gICAgICBtZXRhZGF0YS5zZXEgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAvLyBDdXJyZW50IF9yZXYgaXMgY2FsY3VsYXRlZCBmcm9tIF9yZXZfdHJlZSBvbiByZWFkXG4gICAgICAvLyBkZWxldGUgbWV0YWRhdGEucmV2O1xuICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLCB3aW5uaW5nUmV2JCQxLFxuICAgICAgICB3aW5uaW5nUmV2SXNEZWxldGVkKTtcbiAgICAgIHZhciBtZXRhRGF0YVJlcSA9IGRvY1N0b3JlLnB1dChtZXRhZGF0YVRvU3RvcmUpO1xuICAgICAgbWV0YURhdGFSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXRNZXRhZGF0YTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dERvY0Vycm9yKGUpIHtcbiAgICAgIC8vIENvbnN0cmFpbnRFcnJvciwgbmVlZCB0byB1cGRhdGUsIG5vdCBwdXQgKHNlZSAjMTYzOCBmb3IgZGV0YWlscylcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gYWJvcnRcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIHZhciBpbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG4gICAgICB2YXIgZ2V0S2V5UmVxID0gaW5kZXguZ2V0S2V5KGRvYy5fZG9jX2lkX3Jldik7XG4gICAgICBnZXRLZXlSZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYywgZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgcHV0UmVxLm9uc3VjY2VzcyA9IGFmdGVyUHV0RG9jO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dE1ldGFkYXRhKCkge1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgICAgcmV2OiBtZXRhZGF0YS5yZXZcbiAgICAgIH07XG4gICAgICBmZXRjaGVkRG9jcy5zZXQoZG9jSW5mby5tZXRhZGF0YS5pZCwgZG9jSW5mby5tZXRhZGF0YSk7XG4gICAgICBpbnNlcnRBdHRhY2htZW50TWFwcGluZ3MoZG9jSW5mbywgbWV0YWRhdGEuc2VxLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYyk7XG5cbiAgICBwdXRSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXREb2M7XG4gICAgcHV0UmVxLm9uZXJyb3IgPSBhZnRlclB1dERvY0Vycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVBdHRhY2htZW50cyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjaykge1xuXG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuXG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBhdHRhY2htZW50cyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuXG4gICAgZnVuY3Rpb24gY29sbGVjdFJlc3VsdHMoKSB7XG4gICAgICBpZiAobnVtRG9uZSA9PT0gYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXR0YWNobWVudFNhdmVkKCkge1xuICAgICAgbnVtRG9uZSsrO1xuICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICB9XG5cbiAgICBhdHRhY2htZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2tleV07XG4gICAgICBpZiAoIWF0dC5zdHViKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXR0LmRhdGE7XG4gICAgICAgIGRlbGV0ZSBhdHQuZGF0YTtcbiAgICAgICAgYXR0LnJldnBvcyA9IHBhcnNlSW50KHdpbm5pbmdSZXYkJDEsIDEwKTtcbiAgICAgICAgdmFyIGRpZ2VzdCA9IGF0dC5kaWdlc3Q7XG4gICAgICAgIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgYXR0YWNobWVudFNhdmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bURvbmUrKztcbiAgICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG1hcCBzZXFzIHRvIGF0dGFjaG1lbnQgZGlnZXN0cywgd2hpY2hcbiAgLy8gd2Ugd2lsbCBuZWVkIGxhdGVyIGR1cmluZyBjb21wYWN0aW9uXG4gIGZ1bmN0aW9uIGluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyhkb2NJbmZvLCBzZXEsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgYXR0c0FkZGVkID0gMDtcbiAgICB2YXIgYXR0c1RvQWRkID0gT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cyB8fCB7fSk7XG5cbiAgICBpZiAoIWF0dHNUb0FkZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICAgIGlmICgrK2F0dHNBZGRlZCA9PT0gYXR0c1RvQWRkLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZChhdHQpIHtcbiAgICAgIHZhciBkaWdlc3QgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2F0dF0uZGlnZXN0O1xuICAgICAgdmFyIHJlcSA9IGF0dGFjaEFuZFNlcVN0b3JlLnB1dCh7XG4gICAgICAgIHNlcTogc2VxLFxuICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgIH0pO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gY2hlY2tEb25lO1xuICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGZvciBhIGNvbnN0YWludCBlcnJvciwgd2hpY2ggd2UgaWdub3JlXG4gICAgICAgIC8vIGJlY2F1c2UgdGhpcyBkb2NpZC9yZXYgaGFzIGFscmVhZHkgYmVlbiBhc3NvY2lhdGVkIHdpdGhcbiAgICAgICAgLy8gdGhlIGRpZ2VzdCAoZS5nLiB3aGVuIG5ld19lZGl0cyA9PSBmYWxzZSlcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBhYm9ydFxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBvbmVycm9yXG4gICAgICAgIGNoZWNrRG9uZSgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRzVG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChhdHRzVG9BZGRbaV0pOyAvLyBkbyBpbiBwYXJhbGxlbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgY2FsbGJhY2spIHtcblxuXG4gICAgdmFyIGdldEtleVJlcSA9IGF0dGFjaFN0b3JlLmNvdW50KGRpZ2VzdCk7XG4gICAgZ2V0S2V5UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY291bnQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7IC8vIGFscmVhZHkgZXhpc3RzXG4gICAgICB9XG4gICAgICB2YXIgbmV3QXR0ID0ge1xuICAgICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgICAgYm9keTogZGF0YVxuICAgICAgfTtcbiAgICAgIHZhciBwdXRSZXEgPSBhdHRhY2hTdG9yZS5wdXQobmV3QXR0KTtcbiAgICAgIHB1dFJlcS5vbnN1Y2Nlc3MgPSBjYWxsYmFjaztcbiAgICB9O1xuICB9XG59XG5cbi8vIEFic3RyYWN0aW9uIG92ZXIgSURCQ3Vyc29yIGFuZCBnZXRBbGwoKS9nZXRBbGxLZXlzKCkgdGhhdCBhbGxvd3MgdXMgdG8gYmF0Y2ggb3VyIG9wZXJhdGlvbnNcbi8vIHdoaWxlIGZhbGxpbmcgYmFjayB0byBhIG5vcm1hbCBJREJDdXJzb3Igb3BlcmF0aW9uIG9uIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBnZXRBbGwoKSBvclxuLy8gZ2V0QWxsS2V5cygpLiBUaGlzIGFsbG93cyBmb3IgYSBtdWNoIGZhc3RlciBpbXBsZW1lbnRhdGlvbiB0aGFuIGp1c3Qgc3RyYWlnaHQtdXAgY3Vyc29ycywgYmVjYXVzZVxuLy8gd2UncmUgbm90IHByb2Nlc3NpbmcgZWFjaCBkb2N1bWVudCBvbmUtYXQtYS10aW1lLlxuZnVuY3Rpb24gcnVuQmF0Y2hlZEN1cnNvcihvYmplY3RTdG9yZSwga2V5UmFuZ2UsIGRlc2NlbmRpbmcsIGJhdGNoU2l6ZSwgb25CYXRjaCkge1xuXG4gIGlmIChiYXRjaFNpemUgPT09IC0xKSB7XG4gICAgYmF0Y2hTaXplID0gMTAwMDtcbiAgfVxuXG4gIC8vIEJhaWwgb3V0IG9mIGdldEFsbCgpL2dldEFsbEtleXMoKSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAvLyAxKSBlaXRoZXIgbWV0aG9kIGlzIHVuc3VwcG9ydGVkIC0gd2UgbmVlZCBib3RoXG4gIC8vIDIpIGJhdGNoU2l6ZSBpcyAxIChtaWdodCBhcyB3ZWxsIHVzZSBJREJDdXJzb3IpXG4gIC8vIDMpIGRlc2NlbmRpbmcg4oCTIG5vIHJlYWwgd2F5IHRvIGRvIHRoaXMgdmlhIGdldEFsbCgpL2dldEFsbEtleXMoKVxuXG4gIHZhciB1c2VHZXRBbGwgPSB0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdFN0b3JlLmdldEFsbEtleXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICBiYXRjaFNpemUgPiAxICYmICFkZXNjZW5kaW5nO1xuXG4gIHZhciBrZXlzQmF0Y2g7XG4gIHZhciB2YWx1ZXNCYXRjaDtcbiAgdmFyIHBzZXVkb0N1cnNvcjtcblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFsdWVzQmF0Y2ggPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGtleXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2V0QWxsS2V5cyhlKSB7XG4gICAga2V5c0JhdGNoID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmICh2YWx1ZXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVlUHNldWRvQ3Vyc29yKCkge1xuICAgIGlmICgha2V5c0JhdGNoLmxlbmd0aCkgeyAvLyBubyBtb3JlIHJlc3VsdHNcbiAgICAgIHJldHVybiBvbkJhdGNoKCk7XG4gICAgfVxuICAgIC8vIGZldGNoIG5leHQgYmF0Y2gsIGV4Y2x1c2l2ZSBzdGFydFxuICAgIHZhciBsYXN0S2V5ID0ga2V5c0JhdGNoW2tleXNCYXRjaC5sZW5ndGggLSAxXTtcbiAgICB2YXIgbmV3S2V5UmFuZ2U7XG4gICAgaWYgKGtleVJhbmdlICYmIGtleVJhbmdlLnVwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKGxhc3RLZXksIGtleVJhbmdlLnVwcGVyLFxuICAgICAgICAgIHRydWUsIGtleVJhbmdlLnVwcGVyT3Blbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYgZS5jb2RlID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG9uQmF0Y2goKTsgLy8gd2UncmUgZG9uZSwgc3RhcnRrZXkgYW5kIGVuZGtleSBhcmUgZXF1YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmxvd2VyQm91bmQobGFzdEtleSwgdHJ1ZSk7XG4gICAgfVxuICAgIGtleVJhbmdlID0gbmV3S2V5UmFuZ2U7XG4gICAga2V5c0JhdGNoID0gbnVsbDtcbiAgICB2YWx1ZXNCYXRjaCA9IG51bGw7XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DdXJzb3IoZSkge1xuICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKCFjdXJzb3IpIHsgLy8gZG9uZVxuICAgICAgcmV0dXJuIG9uQmF0Y2goKTtcbiAgICB9XG4gICAgLy8gcmVndWxhciBJREJDdXJzb3IgYWN0cyBsaWtlIGEgYmF0Y2ggd2hlcmUgYmF0Y2ggc2l6ZSBpcyBhbHdheXMgMVxuICAgIG9uQmF0Y2goW2N1cnNvci5rZXldLCBbY3Vyc29yLnZhbHVlXSwgY3Vyc29yKTtcbiAgfVxuXG4gIGlmICh1c2VHZXRBbGwpIHtcbiAgICBwc2V1ZG9DdXJzb3IgPSB7XCJjb250aW51ZVwiOiBjb250aW51ZVBzZXVkb0N1cnNvcn07XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9IGVsc2UgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlLCAncHJldicpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9XG59XG5cbi8vIHNpbXBsZSBzaGltIGZvciBvYmplY3RTdG9yZS5nZXRBbGwoKSwgZmFsbGluZyBiYWNrIHRvIElEQkN1cnNvclxuZnVuY3Rpb24gZ2V0QWxsKG9iamVjdFN0b3JlLCBrZXlSYW5nZSwgb25TdWNjZXNzKSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gdXNlIG5hdGl2ZSBnZXRBbGxcbiAgICBvYmplY3RTdG9yZS5nZXRBbGwoa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uU3VjY2VzcztcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZmFsbCBiYWNrIHRvIGN1cnNvcnNcbiAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIG9uQ3Vyc29yKGUpIHtcbiAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmIChjdXJzb3IpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25TdWNjZXNzKHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgcmVzdWx0OiB2YWx1ZXNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSkub25zdWNjZXNzID0gb25DdXJzb3I7XG59XG5cbmZ1bmN0aW9uIGFsbERvY3NLZXlzKGtleXMsIGRvY1N0b3JlLCBvbkJhdGNoKSB7XG4gIC8vIEl0J3Mgbm90IGd1YXJhbnRlZCB0byBiZSByZXR1cm5lZCBpbiByaWdodCBvcmRlciAgXG4gIHZhciB2YWx1ZXNCYXRjaCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gIHZhciBjb3VudCA9IDA7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuICAgIGRvY1N0b3JlLmdldChrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFsdWVzQmF0Y2hbaW5kZXhdID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc0JhdGNoW2luZGV4XSA9IHtrZXk6IGtleSwgZXJyb3I6ICdub3RfZm91bmQnfTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPT09IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIG9uQmF0Y2goa2V5cywgdmFsdWVzQmF0Y2gsIHt9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIGRlc2NlbmRpbmcpIHtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoZW5kLCBzdGFydCwgIWluY2x1c2l2ZUVuZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCAhaW5jbHVzaXZlRW5kKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChzdGFydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChzdGFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmQpIHtcbiAgICAgIGlmIChkZXNjZW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGVuZCwgIWluY2x1c2l2ZUVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChlbmQsICFpbmNsdXNpdmVFbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5KSB7XG4gICAgICByZXR1cm4gSURCS2V5UmFuZ2Uub25seShrZXkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpZGJBbGxEb2NzKG9wdHMsIGlkYiwgY2FsbGJhY2spIHtcbiAgdmFyIHN0YXJ0ID0gJ3N0YXJ0a2V5JyBpbiBvcHRzID8gb3B0cy5zdGFydGtleSA6IGZhbHNlO1xuICB2YXIgZW5kID0gJ2VuZGtleScgaW4gb3B0cyA/IG9wdHMuZW5ka2V5IDogZmFsc2U7XG4gIHZhciBrZXkgPSAna2V5JyBpbiBvcHRzID8gb3B0cy5rZXkgOiBmYWxzZTtcbiAgdmFyIGtleXMgPSAna2V5cycgaW4gb3B0cyA/IG9wdHMua2V5cyA6IGZhbHNlOyBcbiAgdmFyIHNraXAgPSBvcHRzLnNraXAgfHwgMDtcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInID8gb3B0cy5saW1pdCA6IC0xO1xuICB2YXIgaW5jbHVzaXZlRW5kID0gb3B0cy5pbmNsdXNpdmVfZW5kICE9PSBmYWxzZTtcblxuICB2YXIga2V5UmFuZ2UgOyBcbiAgdmFyIGtleVJhbmdlRXJyb3I7XG4gIGlmICgha2V5cykge1xuICAgIGtleVJhbmdlID0gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIG9wdHMuZGVzY2VuZGluZyk7XG4gICAga2V5UmFuZ2VFcnJvciA9IGtleVJhbmdlICYmIGtleVJhbmdlLmVycm9yO1xuICAgIGlmIChrZXlSYW5nZUVycm9yICYmIFxuICAgICAgIShrZXlSYW5nZUVycm9yLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYga2V5UmFuZ2VFcnJvci5jb2RlID09PSAwKSkge1xuICAgICAgLy8gRGF0YUVycm9yIHdpdGggZXJyb3IgY29kZSAwIGluZGljYXRlcyBzdGFydCBpcyBsZXNzIHRoYW4gZW5kLCBzb1xuICAgICAgLy8gY2FuIGp1c3QgZG8gYW4gZW1wdHkgcXVlcnkuIEVsc2UgbmVlZCB0byB0aHJvd1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUixcbiAgICAgICAga2V5UmFuZ2VFcnJvci5uYW1lLCBrZXlSYW5nZUVycm9yLm1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RvcmVzID0gW0RPQ19TVE9SRSwgQllfU0VRX1NUT1JFLCBNRVRBX1NUT1JFXTtcblxuICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgIHN0b3Jlcy5wdXNoKEFUVEFDSF9TVE9SRSk7XG4gIH1cbiAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWRvbmx5Jyk7XG4gIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgfVxuICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICB2YXIgbWV0YVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpO1xuICB2YXIgZG9jSWRSZXZJbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgZG9jQ291bnQ7XG4gIHZhciB1cGRhdGVTZXE7XG5cbiAgbWV0YVN0b3JlLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGRvY0NvdW50ID0gZS50YXJnZXQucmVzdWx0LmRvY0NvdW50O1xuICB9O1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgZ2V0TWF4VXBkYXRlU2VxKHNlcVN0b3JlLCBmdW5jdGlvbiAoZSkgeyBcbiAgICAgIGlmIChlLnRhcmdldC5yZXN1bHQgJiYgZS50YXJnZXQucmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXBkYXRlU2VxID0gZS50YXJnZXQucmVzdWx0WzBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWF4VXBkYXRlU2VxKG9iamVjdFN0b3JlLCBvblN1Y2Nlc3MpIHtcbiAgICBmdW5jdGlvbiBvbkN1cnNvcihlKSB7XG4gICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgdmFyIG1heEtleSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjdXJzb3IgJiYgY3Vyc29yLmtleSkge1xuICAgICAgICBtYXhLZXkgPSBjdXJzb3Iua2V5O1xuICAgICAgfSBcbiAgICAgIHJldHVybiBvblN1Y2Nlc3Moe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICByZXN1bHQ6IFttYXhLZXldXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKG51bGwsICdwcmV2Jykub25zdWNjZXNzID0gb25DdXJzb3I7XG4gIH1cblxuICAvLyBpZiB0aGUgdXNlciBzcGVjaWZpZXMgaW5jbHVkZV9kb2NzPXRydWUsIHRoZW4gd2UgZG9uJ3RcbiAgLy8gd2FudCB0byBibG9jayB0aGUgbWFpbiBjdXJzb3Igd2hpbGUgd2UncmUgZmV0Y2hpbmcgdGhlIGRvY1xuICBmdW5jdGlvbiBmZXRjaERvY0FzeW5jaHJvbm91c2x5KG1ldGFkYXRhLCByb3csIHdpbm5pbmdSZXYkJDEpIHtcbiAgICB2YXIga2V5ID0gbWV0YWRhdGEuaWQgKyBcIjo6XCIgKyB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0lkUmV2SW5kZXguZ2V0KGtleSkub25zdWNjZXNzID0gIGZ1bmN0aW9uIG9uR2V0RG9jKGUpIHtcbiAgICAgIHJvdy5kb2MgPSBkZWNvZGVEb2MoZS50YXJnZXQucmVzdWx0KSB8fCB7fTtcbiAgICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgICB2YXIgY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93LmRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3Nhcnkocm93LmRvYywgb3B0cywgdHhuKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWxsRG9jc0lubmVyKHdpbm5pbmdSZXYkJDEsIG1ldGFkYXRhKSB7XG4gICAgdmFyIHJvdyA9IHtcbiAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIGtleTogbWV0YWRhdGEuaWQsXG4gICAgICB2YWx1ZToge1xuICAgICAgICByZXY6IHdpbm5pbmdSZXYkJDFcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgaWYgKGtleXMpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICAgIC8vIGRlbGV0ZWQgZG9jcyBhcmUgb2theSB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJvdy52YWx1ZS5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcm93LmRvYyA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChza2lwLS0gPD0gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgICAgZmV0Y2hEb2NBc3luY2hyb25vdXNseShtZXRhZGF0YSwgcm93LCB3aW5uaW5nUmV2JCQxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmF0Y2hWYWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gbGltaXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgYmF0Y2hWYWx1ZSA9IGJhdGNoVmFsdWVzW2ldO1xuICAgICAgaWYgKGJhdGNoVmFsdWUuZXJyb3IgJiYga2V5cykge1xuICAgICAgICAvLyBrZXkgd2FzIG5vdCBmb3VuZCB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJlc3VsdHMucHVzaChiYXRjaFZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShiYXRjaFZhbHVlKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIGFsbERvY3NJbm5lcih3aW5uaW5nUmV2JCQxLCBtZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25CYXRjaChiYXRjaEtleXMsIGJhdGNoVmFsdWVzLCBjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpO1xuICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8IGxpbWl0KSB7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFyIHZhbHVlcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2godmFsdWVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUmVzdWx0c1JlYWR5KCkge1xuICAgIHZhciByZXR1cm5WYWwgPSB7XG4gICAgICB0b3RhbF9yb3dzOiBkb2NDb3VudCxcbiAgICAgIG9mZnNldDogb3B0cy5za2lwLFxuICAgICAgcm93czogcmVzdWx0c1xuICAgIH07XG4gICAgXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSAmJiB1cGRhdGVTZXEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuVmFsLnVwZGF0ZV9zZXEgPSB1cGRhdGVTZXE7XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIHJldHVyblZhbCk7XG4gIH1cblxuICBmdW5jdGlvbiBvblR4bkNvbXBsZXRlKCkge1xuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIG9wdHMuYmluYXJ5KS50aGVuKG9uUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25SZXN1bHRzUmVhZHkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IHJlcXVlc3RzIGlmIHN0YXJ0ID4gZW5kIG9yIGxpbWl0ID09PSAwXG4gIGlmIChrZXlSYW5nZUVycm9yIHx8IGxpbWl0ID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChrZXlzKSB7XG4gICAgcmV0dXJuIGFsbERvY3NLZXlzKG9wdHMua2V5cywgZG9jU3RvcmUsIG9uQmF0Y2gpO1xuICB9XG4gIGlmIChsaW1pdCA9PT0gLTEpIHsgLy8ganVzdCBmZXRjaCBldmVyeXRoaW5nXG4gICAgcmV0dXJuIGdldEFsbChkb2NTdG9yZSwga2V5UmFuZ2UsIG9uR2V0QWxsKTtcbiAgfVxuICAvLyBlbHNlIGRvIGEgY3Vyc29yXG4gIC8vIGNob29zZSBhIGJhdGNoIHNpemUgYmFzZWQgb24gdGhlIHNraXAsIHNpbmNlIHdlJ2xsIG5lZWQgdG8gc2tpcCB0aGF0IG1hbnlcbiAgcnVuQmF0Y2hlZEN1cnNvcihkb2NTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQgKyBza2lwLCBvbkJhdGNoKTtcbn1cblxuLy9cbi8vIEJsb2JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGFsbCB2ZXJzaW9ucyBvZiBJbmRleGVkREIsIG5vdGFibHlcbi8vIENocm9tZSA8MzcgYW5kIEFuZHJvaWQgPDUuIEluIHRob3NlIHZlcnNpb25zLCBzdG9yaW5nIGEgYmxvYiB3aWxsIHRocm93LlxuLy9cbi8vIFZhcmlvdXMgb3RoZXIgYmxvYiBidWdzIGV4aXN0IGluIENocm9tZSB2MzctNDIgKGluY2x1c2l2ZSkuXG4vLyBEZXRlY3RpbmcgdGhlbSBpcyBleHBlbnNpdmUgYW5kIGNvbmZ1c2luZyB0byB1c2VycywgYW5kIENocm9tZSAzNy00MlxuLy8gaXMgYXQgdmVyeSBsb3cgdXNhZ2Ugd29ybGR3aWRlLCBzbyB3ZSBkbyBhIGhhY2t5IHVzZXJBZ2VudCBjaGVjayBpbnN0ZWFkLlxuLy9cbi8vIGNvbnRlbnQtdHlwZSBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00MDgxMjBcbi8vIDQwNCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc5MTZcbi8vIEZpbGVSZWFkZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3ODM2XG4vL1xuZnVuY3Rpb24gY2hlY2tCbG9iU3VwcG9ydCh0eG4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgdmFyIGJsb2IkJDEgPSBjcmVhdGVCbG9iKFsnJ10pO1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSkucHV0KGJsb2IkJDEsICdrZXknKTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbWF0Y2hlZENocm9tZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgICAgdmFyIG1hdGNoZWRFZGdlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLy8pO1xuICAgICAgLy8gTVMgRWRnZSBwcmV0ZW5kcyB0byBiZSBDaHJvbWUgNDI6XG4gICAgICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2hoODY5MzAxJTI4dj12cy44NSUyOS5hc3B4XG4gICAgICByZXNvbHZlKG1hdGNoZWRFZGdlIHx8ICFtYXRjaGVkQ2hyb21lIHx8XG4gICAgICAgIHBhcnNlSW50KG1hdGNoZWRDaHJvbWVbMV0sIDEwKSA+PSA0Myk7XG4gICAgfTtcblxuICAgIHJlcS5vbmVycm9yID0gdHhuLm9uYWJvcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gSWYgdGhlIHRyYW5zYWN0aW9uIGFib3J0cyBub3cgaXRzIGR1ZSB0byBub3QgYmVpbmcgYWJsZSB0b1xuICAgICAgLy8gd3JpdGUgdG8gdGhlIGRhdGFiYXNlLCBsaWtlbHkgZHVlIHRvIHRoZSBkaXNrIGJlaW5nIGZ1bGxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBlcnJvciwgc28gYXNzdW1lIHVuc3VwcG9ydGVkXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb3VudERvY3ModHhuLCBjYikge1xuICB2YXIgaW5kZXggPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5pbmRleCgnZGVsZXRlZE9yTG9jYWwnKTtcbiAgaW5kZXguY291bnQoSURCS2V5UmFuZ2Uub25seSgnMCcpKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGNiKGUudGFyZ2V0LnJlc3VsdCk7XG4gIH07XG59XG5cbi8vIFRoaXMgdGFzayBxdWV1ZSBlbnN1cmVzIHRoYXQgSURCIG9wZW4gY2FsbHMgYXJlIGRvbmUgaW4gdGhlaXIgb3duIHRpY2tcblxudmFyIHJ1bm5pbmcgPSBmYWxzZTtcbnZhciBxdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiB0cnlDb2RlKGZ1biwgZXJyLCByZXMsIFBvdWNoREIpIHtcbiAgdHJ5IHtcbiAgICBmdW4oZXJyLCByZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBTaG91bGRuJ3QgaGFwcGVuLCBidXQgaW4gc29tZSBvZGQgY2FzZXNcbiAgICAvLyBJbmRleGVkREIgaW1wbGVtZW50YXRpb25zIG1pZ2h0IHRocm93IGEgc3luY1xuICAgIC8vIGVycm9yLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBhdCBsZWFzdCBsb2cgaXQuXG4gICAgUG91Y2hEQi5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOZXh0KCkge1xuICBpZiAocnVubmluZyB8fCAhcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJ1bm5pbmcgPSB0cnVlO1xuICBxdWV1ZS5zaGlmdCgpKCk7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVUYXNrKGFjdGlvbiwgY2FsbGJhY2ssIFBvdWNoREIpIHtcbiAgcXVldWUucHVzaChmdW5jdGlvbiBydW5BY3Rpb24oKSB7XG4gICAgYWN0aW9uKGZ1bmN0aW9uIHJ1bkNhbGxiYWNrKGVyciwgcmVzKSB7XG4gICAgICB0cnlDb2RlKGNhbGxiYWNrLCBlcnIsIHJlcywgUG91Y2hEQik7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gcnVuTmV4dCgpIHtcbiAgICAgICAgYXBwbHlOZXh0KFBvdWNoREIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBhcHBseU5leHQoKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKSB7XG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgdmFyIGlkID0gZGJOYW1lICsgJzonICsgdXVpZCgpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmFkZExpc3RlbmVyKGRiTmFtZSwgaWQsIGFwaSwgb3B0cyk7XG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGRiTmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVMaXN0ZW5lcihkYk5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGRvY0lkcyA9IG9wdHMuZG9jX2lkcyAmJiBuZXcgRXhwb3J0ZWRTZXQob3B0cy5kb2NfaWRzKTtcblxuICBvcHRzLnNpbmNlID0gb3B0cy5zaW5jZSB8fCAwO1xuICB2YXIgbGFzdFNlcSA9IG9wdHMuc2luY2U7XG5cbiAgdmFyIGxpbWl0ID0gJ2xpbWl0JyBpbiBvcHRzID8gb3B0cy5saW1pdCA6IC0xO1xuICBpZiAobGltaXQgPT09IDApIHtcbiAgICBsaW1pdCA9IDE7IC8vIHBlciBDb3VjaERCIF9jaGFuZ2VzIHNwZWNcbiAgfVxuXG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBudW1SZXN1bHRzID0gMDtcbiAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKTtcbiAgdmFyIGRvY0lkc1RvTWV0YWRhdGEgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuICB2YXIgdHhuO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgZG9jSWRSZXZJbmRleDtcblxuICBmdW5jdGlvbiBvbkJhdGNoKGJhdGNoS2V5cywgYmF0Y2hWYWx1ZXMsIGN1cnNvcikge1xuICAgIGlmICghY3Vyc29yIHx8ICFiYXRjaEtleXMubGVuZ3RoKSB7IC8vIGRvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2lubmluZ0RvY3MgPSBuZXcgQXJyYXkoYmF0Y2hLZXlzLmxlbmd0aCk7XG4gICAgdmFyIG1ldGFkYXRhcyA9IG5ldyBBcnJheShiYXRjaEtleXMubGVuZ3RoKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpIHtcbiAgICAgIHZhciBjaGFuZ2UgPSBvcHRzLnByb2Nlc3NDaGFuZ2Uod2lubmluZ0RvYywgbWV0YWRhdGEsIG9wdHMpO1xuICAgICAgbGFzdFNlcSA9IGNoYW5nZS5zZXEgPSBtZXRhZGF0YS5zZXE7XG5cbiAgICAgIHZhciBmaWx0ZXJlZCA9IGZpbHRlcihjaGFuZ2UpO1xuICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJlZCA9PT0gJ29iamVjdCcpIHsgLy8gYW55dGhpbmcgYnV0IHRydWUvZmFsc2UgaW5kaWNhdGVzIGVycm9yXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChmaWx0ZXJlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZmlsdGVyZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgbnVtUmVzdWx0cysrO1xuICAgICAgaWYgKG9wdHMucmV0dXJuX2RvY3MpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGNoYW5nZSk7XG4gICAgICB9XG4gICAgICAvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IGltbWVkaWF0ZWx5XG4gICAgICAvLyBmb3IgdGhlIGJlbmVmaXQgb2YgbGl2ZSBsaXN0ZW5lcnNcbiAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeSh3aW5uaW5nRG9jLCBvcHRzLCB0eG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBvc3RQcm9jZXNzQXR0YWNobWVudHMoW2NoYW5nZV0sIG9wdHMuYmluYXJ5KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQmF0Y2hEb25lKCkge1xuICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gd2lubmluZ0RvY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKG51bVJlc3VsdHMgPT09IGxpbWl0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbm5pbmdEb2MgPSB3aW5uaW5nRG9jc1tpXTtcbiAgICAgICAgaWYgKCF3aW5uaW5nRG9jKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1ldGFkYXRhID0gbWV0YWRhdGFzW2ldO1xuICAgICAgICBwcm9taXNlcy5wdXNoKHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpKTtcbiAgICAgIH1cblxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBpZiAoY2hhbmdlc1tpXSkge1xuICAgICAgICAgICAgb3B0cy5vbkNoYW5nZShjaGFuZ2VzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKG9wdHMuY29tcGxldGUpO1xuXG4gICAgICBpZiAobnVtUmVzdWx0cyAhPT0gbGltaXQpIHtcbiAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggYWxsIG1ldGFkYXRhcy93aW5uaW5nZG9jcyBmcm9tIHRoaXMgYmF0Y2ggaW4gcGFyYWxsZWwsIHRoZW4gcHJvY2Vzc1xuICAgIC8vIHRoZW0gYWxsIG9ubHkgb25jZSBhbGwgZGF0YSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFRoaXMgaXMgZG9uZSBpbiBwYXJhbGxlbFxuICAgIC8vIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiBkb2luZyBpdCBvbmUtYXQtYS10aW1lLlxuICAgIHZhciBudW1Eb25lID0gMDtcbiAgICBiYXRjaFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZURvYyh2YWx1ZSk7XG4gICAgICB2YXIgc2VxID0gYmF0Y2hLZXlzW2ldO1xuICAgICAgZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGZ1bmN0aW9uIChtZXRhZGF0YSwgd2lubmluZ0RvYykge1xuICAgICAgICBtZXRhZGF0YXNbaV0gPSBtZXRhZGF0YTtcbiAgICAgICAgd2lubmluZ0RvY3NbaV0gPSB3aW5uaW5nRG9jO1xuICAgICAgICBpZiAoKytudW1Eb25lID09PSBiYXRjaEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgb25CYXRjaERvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldE1ldGFkYXRhKGRvYywgc2VxLCBtZXRhZGF0YSwgY2IpIHtcbiAgICBpZiAobWV0YWRhdGEuc2VxICE9PSBzZXEpIHtcbiAgICAgIC8vIHNvbWUgb3RoZXIgc2VxIGlzIGxhdGVyXG4gICAgICByZXR1cm4gY2IoKTtcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEud2lubmluZ1JldiA9PT0gZG9jLl9yZXYpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIHdpbm5pbmcgZG9jXG4gICAgICByZXR1cm4gY2IobWV0YWRhdGEsIGRvYyk7XG4gICAgfVxuXG4gICAgLy8gZmV0Y2ggd2lubmluZyBkb2MgaW4gc2VwYXJhdGUgcmVxdWVzdFxuICAgIHZhciBkb2NJZFJldiA9IGRvYy5faWQgKyAnOjonICsgbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICB2YXIgcmVxID0gZG9jSWRSZXZJbmRleC5nZXQoZG9jSWRSZXYpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgY2IobWV0YWRhdGEsIGRlY29kZURvYyhlLnRhcmdldC5yZXN1bHQpKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGNiKSB7XG4gICAgaWYgKGRvY0lkcyAmJiAhZG9jSWRzLmhhcyhkb2MuX2lkKSkge1xuICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuXG4gICAgdmFyIG1ldGFkYXRhID0gZG9jSWRzVG9NZXRhZGF0YS5nZXQoZG9jLl9pZCk7XG4gICAgaWYgKG1ldGFkYXRhKSB7IC8vIGNhY2hlZFxuICAgICAgcmV0dXJuIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfVxuICAgIC8vIG1ldGFkYXRhIG5vdCBjYWNoZWQsIGhhdmUgdG8gZ28gZmV0Y2ggaXRcbiAgICBkb2NTdG9yZS5nZXQoZG9jLl9pZCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgIGRvY0lkc1RvTWV0YWRhdGEuc2V0KGRvYy5faWQsIG1ldGFkYXRhKTtcbiAgICAgIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHtcbiAgICAgIHJlc3VsdHM6IHJlc3VsdHMsXG4gICAgICBsYXN0X3NlcTogbGFzdFNlcVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UeG5Db21wbGV0ZSgpIHtcbiAgICBpZiAoIW9wdHMuY29udGludW91cyAmJiBvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgcG9zdFByb2Nlc3Npbmcgd2FzIGFscmVhZHkgZG9uZSxcbiAgICAgIC8vIHNvIGRvIGl0IGFnYWluXG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMpLnRoZW4oZmluaXNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluaXNoKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG9iamVjdFN0b3JlcyA9IFtET0NfU1RPUkUsIEJZX1NFUV9TVE9SRV07XG4gIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgb2JqZWN0U3RvcmVzLnB1c2goQVRUQUNIX1NUT1JFKTtcbiAgfVxuICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgb2JqZWN0U3RvcmVzLCAncmVhZG9ubHknKTtcbiAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiBvcHRzLmNvbXBsZXRlKHR4blJlc3VsdC5lcnJvcik7XG4gIH1cbiAgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihvcHRzLmNvbXBsZXRlKTtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuXG4gIGJ5U2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgZG9jSWRSZXZJbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG5cbiAgdmFyIGtleVJhbmdlID0gKG9wdHMuc2luY2UgJiYgIW9wdHMuZGVzY2VuZGluZykgP1xuICAgIElEQktleVJhbmdlLmxvd2VyQm91bmQob3B0cy5zaW5jZSwgdHJ1ZSkgOiBudWxsO1xuXG4gIHJ1bkJhdGNoZWRDdXJzb3IoYnlTZXFTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQsIG9uQmF0Y2gpO1xufVxuXG52YXIgY2FjaGVkREJzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG52YXIgYmxvYlN1cHBvcnRQcm9taXNlO1xudmFyIG9wZW5SZXFMaXN0ID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbmZ1bmN0aW9uIElkYlBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBhcGkgPSB0aGlzO1xuXG4gIGVucXVldWVUYXNrKGZ1bmN0aW9uICh0aGlzQ2FsbGJhY2spIHtcbiAgICBpbml0KGFwaSwgb3B0cywgdGhpc0NhbGxiYWNrKTtcbiAgfSwgY2FsbGJhY2ssIGFwaS5jb25zdHJ1Y3Rvcik7XG59XG5cbmZ1bmN0aW9uIGluaXQoYXBpLCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIHZhciBkYk5hbWUgPSBvcHRzLm5hbWU7XG5cbiAgdmFyIGlkYiA9IG51bGw7XG4gIHZhciBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBudWxsO1xuICBhcGkuX21ldGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgIGlmIChlcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICFlcnJvci5yZWFzb24pIHtcbiAgICAgICAgaWYgKGlkYkdsb2JhbEZhaWx1cmVFcnJvcikge1xuICAgICAgICAgIGVycm9yLnJlYXNvbiA9IGlkYkdsb2JhbEZhaWx1cmVFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gY2FsbGVkIHdoZW4gY3JlYXRpbmcgYSBmcmVzaCBuZXcgZGF0YWJhc2VcbiAgZnVuY3Rpb24gY3JlYXRlU2NoZW1hKGRiKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoRE9DX1NUT1JFLCB7a2V5UGF0aCA6ICdpZCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShCWV9TRVFfU1RPUkUsIHthdXRvSW5jcmVtZW50OiB0cnVlfSlcbiAgICAgIC5jcmVhdGVJbmRleCgnX2RvY19pZF9yZXYnLCAnX2RvY19pZF9yZXYnLCB7dW5pcXVlOiB0cnVlfSk7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFLCB7a2V5UGF0aDogJ2RpZ2VzdCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShNRVRBX1NUT1JFLCB7a2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDogZmFsc2V9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFKTtcblxuICAgIC8vIGFkZGVkIGluIHYyXG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICAvLyBhZGRlZCBpbiB2M1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKExPQ0FMX1NUT1JFLCB7a2V5UGF0aDogJ19pZCd9KTtcblxuICAgIC8vIGFkZGVkIGluIHY0XG4gICAgdmFyIGF0dEFuZFNlcVN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICB7YXV0b0luY3JlbWVudDogdHJ1ZX0pO1xuICAgIGF0dEFuZFNlcVN0b3JlLmNyZWF0ZUluZGV4KCdzZXEnLCAnc2VxJyk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ2RpZ2VzdFNlcScsICdkaWdlc3RTZXEnLCB7dW5pcXVlOiB0cnVlfSk7XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiAyXG4gIC8vIHVuZm9ydHVuYXRlbHkgXCJkZWxldGVkT3JMb2NhbFwiIGlzIGEgbWlzbm9tZXIgbm93IHRoYXQgd2Ugbm8gbG9uZ2VyXG4gIC8vIHN0b3JlIGxvY2FsIGRvY3MgaW4gdGhlIG1haW4gZG9jLXN0b3JlLCBidXQgd2hhZGR5YWdvbm5hZG9cbiAgZnVuY3Rpb24gYWRkRGVsZXRlZE9yTG9jYWxJbmRleCh0eG4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICBkb2NTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZGVsZXRlZCA9IGlzRGVsZXRlZChtZXRhZGF0YSk7XG4gICAgICAgIG1ldGFkYXRhLmRlbGV0ZWRPckxvY2FsID0gZGVsZXRlZCA/IFwiMVwiIDogXCIwXCI7XG4gICAgICAgIGRvY1N0b3JlLnB1dChtZXRhZGF0YSk7XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAxKVxuICBmdW5jdGlvbiBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKSB7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUsIHtrZXlQYXRoOiAnX2lkJ30pXG4gICAgICAuY3JlYXRlSW5kZXgoJ19kb2NfaWRfcmV2JywgJ19kb2NfaWRfcmV2Jywge3VuaXF1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAyKVxuICBmdW5jdGlvbiBtaWdyYXRlTG9jYWxTdG9yZSh0eG4sIGNiKSB7XG4gICAgdmFyIGxvY2FsU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUpO1xuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICAgIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuXG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZG9jSWQgPSBtZXRhZGF0YS5pZDtcbiAgICAgICAgdmFyIGxvY2FsID0gaXNMb2NhbElkKGRvY0lkKTtcbiAgICAgICAgdmFyIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICB2YXIgZG9jSWRSZXYgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHNlcSBlbnRyaWVzXG4gICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jSWRcbiAgICAgICAgICB2YXIgc3RhcnQgPSBkb2NJZCArIFwiOjpcIjtcbiAgICAgICAgICB2YXIgZW5kID0gZG9jSWQgKyBcIjo6flwiO1xuICAgICAgICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgICAgICAgIHZhciByYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgdmFyIHNlcUN1cnNvciA9IGluZGV4Lm9wZW5DdXJzb3IocmFuZ2UpO1xuICAgICAgICAgIHNlcUN1cnNvci5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgc2VxQ3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFzZXFDdXJzb3IpIHtcbiAgICAgICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgICAgICBkb2NTdG9yZS5kZWxldGUoY3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkYXRhID0gc2VxQ3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZGF0YS5fZG9jX2lkX3JldiA9PT0gZG9jSWRSZXYpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JlLnB1dChkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXFTdG9yZS5kZWxldGUoc2VxQ3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBzZXFDdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMSlcbiAgZnVuY3Rpb24gYWRkQXR0YWNoQW5kU2VxU3RvcmUoZGIpIHtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSxcbiAgICAgIHthdXRvSW5jcmVtZW50OiB0cnVlfSk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ3NlcScsICdzZXEnKTtcbiAgICBhdHRBbmRTZXFTdG9yZS5jcmVhdGVJbmRleCgnZGlnZXN0U2VxJywgJ2RpZ2VzdFNlcScsIHt1bmlxdWU6IHRydWV9KTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMilcbiAgZnVuY3Rpb24gbWlncmF0ZUF0dHNBbmRTZXFzKHR4biwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgICB2YXIgYXR0U3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKTtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuXG4gICAgLy8gbmVlZCB0byBhY3R1YWxseSBwb3B1bGF0ZSB0aGUgdGFibGUuIHRoaXMgaXMgdGhlIGV4cGVuc2l2ZSBwYXJ0LFxuICAgIC8vIHNvIGFzIGFuIG9wdGltaXphdGlvbiwgY2hlY2sgZmlyc3QgdGhhdCB0aGlzIGRhdGFiYXNlIGV2ZW5cbiAgICAvLyBjb250YWlucyBhdHRhY2htZW50c1xuICAgIHZhciByZXEgPSBhdHRTdG9yZS5jb3VudCgpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGNvdW50ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgfVxuXG4gICAgICBzZXFTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjdXJzb3IpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkb2MgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgICAgICAgdmFyIGRpZ2VzdE1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgYXR0ID0gZG9jLl9hdHRhY2htZW50c1thdHRzW2pdXTtcbiAgICAgICAgICBkaWdlc3RNYXBbYXR0LmRpZ2VzdF0gPSB0cnVlOyAvLyB1bmlxIGRpZ2VzdHMsIGp1c3QgaW4gY2FzZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkaWdlc3RzID0gT2JqZWN0LmtleXMoZGlnZXN0TWFwKTtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGRpZ2VzdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgZGlnZXN0ID0gZGlnZXN0c1tqXTtcbiAgICAgICAgICBhdHRBbmRTZXFTdG9yZS5wdXQoe1xuICAgICAgICAgICAgc2VxOiBzZXEsXG4gICAgICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDVcbiAgLy8gSW5zdGVhZCBvZiByZWx5aW5nIG9uIG9uLXRoZS1mbHkgbWlncmF0aW9uIG9mIG1ldGFkYXRhLFxuICAvLyB0aGlzIGJyaW5ncyB0aGUgZG9jLXN0b3JlIHRvIGl0cyBtb2Rlcm4gZm9ybTpcbiAgLy8gLSBtZXRhZGF0YS53aW5uaW5ncmV2XG4gIC8vIC0gbWV0YWRhdGEuc2VxXG4gIC8vIC0gc3RyaW5naWZ5IHRoZSBtZXRhZGF0YSB3aGVuIHN0b3JpbmcgaXRcbiAgZnVuY3Rpb24gbWlncmF0ZU1ldGFkYXRhKHR4bikge1xuXG4gICAgZnVuY3Rpb24gZGVjb2RlTWV0YWRhdGFDb21wYXQoc3RvcmVkT2JqZWN0KSB7XG4gICAgICBpZiAoIXN0b3JlZE9iamVjdC5kYXRhKSB7XG4gICAgICAgIC8vIG9sZCBmb3JtYXQsIHdoZW4gd2UgZGlkbid0IHN0b3JlIGl0IHN0cmluZ2lmaWVkXG4gICAgICAgIHN0b3JlZE9iamVjdC5kZWxldGVkID0gc3RvcmVkT2JqZWN0LmRlbGV0ZWRPckxvY2FsID09PSAnMSc7XG4gICAgICAgIHJldHVybiBzdG9yZWRPYmplY3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVjb2RlTWV0YWRhdGEoc3RvcmVkT2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgdGhhdCBldmVyeSBtZXRhZGF0YSBoYXMgYSB3aW5uaW5nUmV2IGFuZCBzZXEsXG4gICAgLy8gd2hpY2ggd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBvbi10aGUtZmx5IGJ1dCBiZXR0ZXIgdG8gbWlncmF0ZVxuICAgIHZhciBieVNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICByZXR1cm47IC8vIGRvbmVcbiAgICAgIH1cbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhQ29tcGF0KGN1cnNvci52YWx1ZSk7XG5cbiAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYgPSBtZXRhZGF0YS53aW5uaW5nUmV2IHx8XG4gICAgICAgIHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuXG4gICAgICBmdW5jdGlvbiBmZXRjaE1ldGFkYXRhU2VxKCkge1xuICAgICAgICAvLyBtZXRhZGF0YS5zZXEgd2FzIGFkZGVkIHBvc3QtMy4yLjAsIHNvIGlmIGl0J3MgbWlzc2luZyxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBmZXRjaCBpdCBtYW51YWxseVxuICAgICAgICB2YXIgc3RhcnQgPSBtZXRhZGF0YS5pZCArICc6Oic7XG4gICAgICAgIHZhciBlbmQgPSBtZXRhZGF0YS5pZCArICc6OlxcdWZmZmYnO1xuICAgICAgICB2YXIgcmVxID0gYnlTZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKS5vcGVuQ3Vyc29yKFxuICAgICAgICAgIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQpKTtcblxuICAgICAgICB2YXIgbWV0YWRhdGFTZXEgPSAwO1xuICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5zZXEgPSBtZXRhZGF0YVNlcTtcbiAgICAgICAgICAgIHJldHVybiBvbkdldE1ldGFkYXRhU2VxKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgICBpZiAoc2VxID4gbWV0YWRhdGFTZXEpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhU2VxID0gc2VxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25HZXRNZXRhZGF0YVNlcSgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLFxuICAgICAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYsIG1ldGFkYXRhLmRlbGV0ZWQpO1xuXG4gICAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5wdXQobWV0YWRhdGFUb1N0b3JlKTtcbiAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGFkYXRhLnNlcSkge1xuICAgICAgICByZXR1cm4gb25HZXRNZXRhZGF0YVNlcSgpO1xuICAgICAgfVxuXG4gICAgICBmZXRjaE1ldGFkYXRhU2VxKCk7XG4gICAgfTtcblxuICB9XG5cbiAgYXBpLl9yZW1vdGUgPSBmYWxzZTtcbiAgYXBpLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdpZGInO1xuICB9O1xuXG4gIGFwaS5faWQgPSB0b1Byb21pc2UoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgYXBpLl9tZXRhLmluc3RhbmNlSWQpO1xuICB9KTtcblxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gaWRiX2J1bGtEb2NzKHJlcSwgcmVxT3B0cywgY2FsbGJhY2spIHtcbiAgICBpZGJCdWxrRG9jcyhvcHRzLCByZXEsIHJlcU9wdHMsIGFwaSwgaWRiLCBlbnJpY2hDYWxsYmFja0Vycm9yKGNhbGxiYWNrKSk7XG4gIH07XG5cbiAgLy8gRmlyc3Qgd2UgbG9vayB1cCB0aGUgbWV0YWRhdGEgaW4gdGhlIGlkcyBkYXRhYmFzZSwgdGhlbiB3ZSBmZXRjaCB0aGVcbiAgLy8gY3VycmVudCByZXZpc2lvbihzKSBmcm9tIHRoZSBieSBzZXF1ZW5jZSBzdG9yZVxuICBhcGkuX2dldCA9IGZ1bmN0aW9uIGlkYl9nZXQoaWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvYztcbiAgICB2YXIgbWV0YWRhdGE7XG4gICAgdmFyIGVycjtcbiAgICB2YXIgdHhuID0gb3B0cy5jdHg7XG4gICAgaWYgKCF0eG4pIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgY2FsbGJhY2soZXJyLCB7ZG9jOiBkb2MsIG1ldGFkYXRhOiBtZXRhZGF0YSwgY3R4OiB0eG59KTtcbiAgICB9XG5cbiAgICB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5nZXQoaWQpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAvLyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSByZXN1bHQgaGVyZSBpZjpcbiAgICAgIC8vIDEuIHRoZXJlIGlzIG5vIHN1Y2ggZG9jdW1lbnRcbiAgICAgIC8vIDIuIHRoZSBkb2N1bWVudCBpcyBkZWxldGVkIGFuZCB3ZSBkb24ndCBhc2sgYWJvdXQgc3BlY2lmaWMgcmV2XG4gICAgICAvLyBXaGVuIHdlIGFzayB3aXRoIG9wdHMucmV2IHdlIGV4cGVjdCB0aGUgYW5zd2VyIHRvIGJlIGVpdGhlclxuICAgICAgLy8gZG9jIChwb3NzaWJseSB3aXRoIF9kZWxldGVkPXRydWUpIG9yIG1pc3NpbmcgZXJyb3JcbiAgICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdtaXNzaW5nJyk7XG4gICAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldjtcbiAgICAgIGlmICghb3B0cy5yZXYpIHtcbiAgICAgICAgcmV2ID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgICAgdmFyIGRlbGV0ZWQgPSBpc0RlbGV0ZWQobWV0YWRhdGEpO1xuICAgICAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICAgIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLCBcImRlbGV0ZWRcIik7XG4gICAgICAgICAgcmV0dXJuIGZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXYgPSBvcHRzLmxhdGVzdCA/IGxhdGVzdChvcHRzLnJldiwgbWV0YWRhdGEpIDogb3B0cy5yZXY7XG4gICAgICB9XG5cbiAgICAgIHZhciBvYmplY3RTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgICAgdmFyIGtleSA9IG1ldGFkYXRhLmlkICsgJzo6JyArIHJldjtcblxuICAgICAgb2JqZWN0U3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2JykuZ2V0KGtleSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgZG9jID0gZGVjb2RlRG9jKGRvYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX0RPQywgJ21pc3NpbmcnKTtcbiAgICAgICAgICByZXR1cm4gZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoKCk7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG5cbiAgYXBpLl9nZXRBdHRhY2htZW50ID0gZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2hJZCwgYXR0YWNobWVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuO1xuICAgIGlmIChvcHRzLmN0eCkge1xuICAgICAgdHhuID0gb3B0cy5jdHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuICAgIHZhciBkaWdlc3QgPSBhdHRhY2htZW50LmRpZ2VzdDtcbiAgICB2YXIgdHlwZSA9IGF0dGFjaG1lbnQuY29udGVudF90eXBlO1xuXG4gICAgdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSkuZ2V0KGRpZ2VzdCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgb3B0cy5iaW5hcnksIGZ1bmN0aW9uIChibG9iRGF0YSkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBibG9iRGF0YSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5faW5mbyA9IGZ1bmN0aW9uIGlkYl9pbmZvKGNhbGxiYWNrKSB7XG4gICAgdmFyIHVwZGF0ZVNlcTtcbiAgICB2YXIgZG9jQ291bnQ7XG5cbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW01FVEFfU1RPUkUsIEJZX1NFUV9TVE9SRV0sICdyZWFkb25seScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSkuZ2V0KE1FVEFfU1RPUkUpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBkb2NDb3VudCA9IGUudGFyZ2V0LnJlc3VsdC5kb2NDb3VudDtcbiAgICB9O1xuICAgIHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpLm9wZW5DdXJzb3IobnVsbCwgJ3ByZXYnKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIHVwZGF0ZVNlcSA9IGN1cnNvciA/IGN1cnNvci5rZXkgOiAwO1xuICAgIH07XG5cbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgZG9jX2NvdW50OiBkb2NDb3VudCxcbiAgICAgICAgdXBkYXRlX3NlcTogdXBkYXRlU2VxLFxuICAgICAgICAvLyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlkYl9hdHRhY2htZW50X2Zvcm1hdDogKGFwaS5fbWV0YS5ibG9iU3VwcG9ydCA/ICdiaW5hcnknIDogJ2Jhc2U2NCcpXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5fYWxsRG9jcyA9IGZ1bmN0aW9uIGlkYl9hbGxEb2NzKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWRiQWxsRG9jcyhvcHRzLCBpZGIsIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spKTtcbiAgfTtcblxuICBhcGkuX2NoYW5nZXMgPSBmdW5jdGlvbiBpZGJDaGFuZ2VzKG9wdHMpIHtcbiAgICByZXR1cm4gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKTtcbiAgfTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9JbmRleGVkREIvSURCRGF0YWJhc2UjY2xvc2VcbiAgICAvLyBcIlJldHVybnMgaW1tZWRpYXRlbHkgYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBpbiBhIHNlcGFyYXRlIHRocmVhZC4uLlwiXG4gICAgaWRiLmNsb3NlKCk7XG4gICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgYXBpLl9nZXRSZXZpc2lvblRyZWUgPSBmdW5jdGlvbiAoZG9jSWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtET0NfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdmFyIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLmdldChkb2NJZCk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYy5yZXZfdHJlZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgcmV2aXNpb25zIG9mIGRvY3VtZW50IGRvY0lkXG4gIC8vIHdoaWNoIGFyZSBsaXN0ZWQgaW4gcmV2cyBhbmQgc2V0cyB0aGlzIGRvY3VtZW50XG4gIC8vIHJldmlzaW9uIHRvIHRvIHJldl90cmVlXG4gIGFwaS5fZG9Db21wYWN0aW9uID0gZnVuY3Rpb24gKGRvY0lkLCByZXZzLCBjYWxsYmFjaykge1xuICAgIHZhciBzdG9yZXMgPSBbXG4gICAgICBET0NfU1RPUkUsXG4gICAgICBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBBVFRBQ0hfQU5EX1NFUV9TVE9SRVxuICAgIF07XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWR3cml0ZScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcblxuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuXG4gICAgZG9jU3RvcmUuZ2V0KGRvY0lkKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgICAgdmFyIHJldiA9IHBvcyArICctJyArIHJldkhhc2g7XG4gICAgICAgIGlmIChyZXZzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgICBvcHRzLnN0YXR1cyA9ICdtaXNzaW5nJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb21wYWN0UmV2cyhyZXZzLCBkb2NJZCwgdHhuKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLnB1dChcbiAgICAgICAgZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQpKTtcbiAgICB9O1xuICAgIHR4bi5vbmFib3J0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHR4bi5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9O1xuXG5cbiAgYXBpLl9nZXRMb2NhbCA9IGZ1bmN0aW9uIChpZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHZhciB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKS5nZXQoaWQpO1xuXG4gICAgcmVxLm9uZXJyb3IgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBkb2NbJ19kb2NfaWRfcmV2J107IC8vIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX3B1dExvY2FsID0gZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgZGVsZXRlIGRvYy5fcmV2aXNpb25zOyAvLyBpZ25vcmUgdGhpcywgdHJ1c3QgdGhlIHJldlxuICAgIHZhciBvbGRSZXYgPSBkb2MuX3JldjtcbiAgICB2YXIgaWQgPSBkb2MuX2lkO1xuICAgIGlmICghb2xkUmV2KSB7XG4gICAgICBkb2MuX3JldiA9ICcwLTEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3JldiA9ICcwLScgKyAocGFyc2VJbnQob2xkUmV2LnNwbGl0KCctJylbMV0sIDEwKSArIDEpO1xuICAgIH1cblxuICAgIHZhciB0eCA9IG9wdHMuY3R4O1xuICAgIHZhciByZXQ7XG4gICAgaWYgKCF0eCkge1xuICAgICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtMT0NBTF9TVE9SRV0sICdyZWFkd3JpdGUnKTtcbiAgICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgICB0eC5vbmVycm9yID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxO1xuICAgIGlmIChvbGRSZXYpIHtcbiAgICAgIHJlcSA9IG9TdG9yZS5nZXQoaWQpO1xuICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmICghb2xkRG9jIHx8IG9sZERvYy5fcmV2ICE9PSBvbGRSZXYpIHtcbiAgICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gdXBkYXRlXG4gICAgICAgICAgdmFyIHJlcSA9IG9TdG9yZS5wdXQoZG9jKTtcbiAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0ID0ge29rOiB0cnVlLCBpZDogZG9jLl9pZCwgcmV2OiBkb2MuX3Jldn07XG4gICAgICAgICAgICBpZiAob3B0cy5jdHgpIHsgLy8gcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgeyAvLyBuZXcgZG9jXG4gICAgICByZXEgPSBvU3RvcmUuYWRkKGRvYyk7XG4gICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIGNvbnN0cmFpbnQgZXJyb3IsIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIGFib3J0XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIH07XG4gICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBkb2MuX2lkLCByZXY6IGRvYy5fcmV2fTtcbiAgICAgICAgaWYgKG9wdHMuY3R4KSB7IC8vIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIGFwaS5fcmVtb3ZlTG9jYWwgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICB2YXIgdHggPSBvcHRzLmN0eDtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWR3cml0ZScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4ID0gdHhuUmVzdWx0LnR4bjtcbiAgICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmV0O1xuICAgIHZhciBpZCA9IGRvYy5faWQ7XG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxID0gb1N0b3JlLmdldChpZCk7XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIW9sZERvYyB8fCBvbGREb2MuX3JldiAhPT0gZG9jLl9yZXYpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9TdG9yZS5kZWxldGUoaWQpO1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBpZCwgcmV2OiAnMC0wJ307XG4gICAgICAgIGlmIChvcHRzLmN0eCkgeyAvLyByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZGJOYW1lKTtcblxuICAgIC8vQ2xvc2Ugb3BlbiByZXF1ZXN0IGZvciBcImRiTmFtZVwiIGRhdGFiYXNlIHRvIGZpeCBpZSBkZWxheS5cbiAgICB2YXIgb3BlblJlcSA9IG9wZW5SZXFMaXN0LmdldChkYk5hbWUpO1xuICAgIGlmIChvcGVuUmVxICYmIG9wZW5SZXEucmVzdWx0KSB7XG4gICAgICBvcGVuUmVxLnJlc3VsdC5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH1cbiAgICB2YXIgcmVxID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGRiTmFtZSk7XG5cbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy9SZW1vdmUgb3BlbiByZXF1ZXN0IGZyb20gdGhlIGxpc3QuXG4gICAgICBvcGVuUmVxTGlzdC5kZWxldGUoZGJOYW1lKTtcbiAgICAgIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSAmJiAoZGJOYW1lIGluIGxvY2FsU3RvcmFnZSkpIHtcbiAgICAgICAgZGVsZXRlIGxvY2FsU3RvcmFnZVtkYk5hbWVdO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgeyAnb2snOiB0cnVlIH0pO1xuICAgIH07XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgfTtcblxuICB2YXIgY2FjaGVkID0gY2FjaGVkREJzLmdldChkYk5hbWUpO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICBpZGIgPSBjYWNoZWQuaWRiO1xuICAgIGFwaS5fbWV0YSA9IGNhY2hlZC5nbG9iYWw7XG4gICAgcmV0dXJuIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBhcGkpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHJlcSA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSwgQURBUFRFUl9WRVJTSU9OKTtcbiAgb3BlblJlcUxpc3Quc2V0KGRiTmFtZSwgcmVxKTtcblxuICByZXEub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgZGIgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDEpIHtcbiAgICAgIHJldHVybiBjcmVhdGVTY2hlbWEoZGIpOyAvLyBuZXcgZGIsIGluaXRpYWwgc2NoZW1hXG4gICAgfVxuICAgIC8vIGRvIG1pZ3JhdGlvbnNcblxuICAgIHZhciB0eG4gPSBlLmN1cnJlbnRUYXJnZXQudHJhbnNhY3Rpb247XG4gICAgLy8gdGhlc2UgbWlncmF0aW9ucyBoYXZlIHRvIGJlIGRvbmUgaW4gdGhpcyBmdW5jdGlvbiwgYmVmb3JlXG4gICAgLy8gY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgZXZlbnQgbG9vcCwgYmVjYXVzZSBJbmRleGVkREJcblxuICAgIGlmIChlLm9sZFZlcnNpb24gPCAzKSB7XG4gICAgICBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKTsgLy8gdjIgLT4gdjNcbiAgICB9XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDQpIHtcbiAgICAgIGFkZEF0dGFjaEFuZFNlcVN0b3JlKGRiKTsgLy8gdjMgLT4gdjRcbiAgICB9XG5cbiAgICB2YXIgbWlncmF0aW9ucyA9IFtcbiAgICAgIGFkZERlbGV0ZWRPckxvY2FsSW5kZXgsIC8vIHYxIC0+IHYyXG4gICAgICBtaWdyYXRlTG9jYWxTdG9yZSwgICAgICAvLyB2MiAtPiB2M1xuICAgICAgbWlncmF0ZUF0dHNBbmRTZXFzLCAgICAgLy8gdjMgLT4gdjRcbiAgICAgIG1pZ3JhdGVNZXRhZGF0YSAgICAgICAgIC8vIHY0IC0+IHY1XG4gICAgXTtcblxuICAgIHZhciBpID0gZS5vbGRWZXJzaW9uO1xuXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHZhciBtaWdyYXRpb24gPSBtaWdyYXRpb25zW2kgLSAxXTtcbiAgICAgIGkrKztcbiAgICAgIGlmIChtaWdyYXRpb24pIHtcbiAgICAgICAgbWlncmF0aW9uKHR4biwgbmV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xuXG4gIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuXG4gICAgaWRiID0gZS50YXJnZXQucmVzdWx0O1xuXG4gICAgaWRiLm9udmVyc2lvbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICBpZGIub25hYm9ydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCAnRGF0YWJhc2UgaGFzIGEgZ2xvYmFsIGZhaWx1cmUnLCBlLnRhcmdldC5lcnJvcik7XG4gICAgICBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBlLnRhcmdldC5lcnJvcjtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICAvLyBEbyBhIGZldyBzZXR1cCBvcGVyYXRpb25zIChpbiBwYXJhbGxlbCBhcyBtdWNoIGFzIHBvc3NpYmxlKTpcbiAgICAvLyAxLiBGZXRjaCBtZXRhIGRvY1xuICAgIC8vIDIuIENoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vIDMuIENhbGN1bGF0ZSBkb2NDb3VudFxuICAgIC8vIDQuIEdlbmVyYXRlIGFuIGluc3RhbmNlSWQgaWYgbmVjZXNzYXJ5XG4gICAgLy8gNS4gU3RvcmUgZG9jQ291bnQgYW5kIGluc3RhbmNlSWQgb24gbWV0YSBkb2NcblxuICAgIHZhciB0eG4gPSBpZGIudHJhbnNhY3Rpb24oW1xuICAgICAgTUVUQV9TVE9SRSxcbiAgICAgIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUsXG4gICAgICBET0NfU1RPUkVcbiAgICBdLCAncmVhZHdyaXRlJyk7XG5cbiAgICB2YXIgc3RvcmVkTWV0YURvYyA9IGZhbHNlO1xuICAgIHZhciBtZXRhRG9jO1xuICAgIHZhciBkb2NDb3VudDtcbiAgICB2YXIgYmxvYlN1cHBvcnQ7XG4gICAgdmFyIGluc3RhbmNlSWQ7XG5cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVNldHVwKCkge1xuICAgICAgaWYgKHR5cGVvZiBibG9iU3VwcG9ydCA9PT0gJ3VuZGVmaW5lZCcgfHwgIXN0b3JlZE1ldGFEb2MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLl9tZXRhID0ge1xuICAgICAgICBuYW1lOiBkYk5hbWUsXG4gICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsXG4gICAgICAgIGJsb2JTdXBwb3J0OiBibG9iU3VwcG9ydFxuICAgICAgfTtcblxuICAgICAgY2FjaGVkREJzLnNldChkYk5hbWUsIHtcbiAgICAgICAgaWRiOiBpZGIsXG4gICAgICAgIGdsb2JhbDogYXBpLl9tZXRhXG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RvcmVNZXRhRG9jSWZSZWFkeSgpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jQ291bnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBtZXRhRG9jID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaW5zdGFuY2VLZXkgPSBkYk5hbWUgKyAnX2lkJztcbiAgICAgIGlmIChpbnN0YW5jZUtleSBpbiBtZXRhRG9jKSB7XG4gICAgICAgIGluc3RhbmNlSWQgPSBtZXRhRG9jW2luc3RhbmNlS2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFEb2NbaW5zdGFuY2VLZXldID0gaW5zdGFuY2VJZCA9IHV1aWQoKTtcbiAgICAgIH1cbiAgICAgIG1ldGFEb2MuZG9jQ291bnQgPSBkb2NDb3VudDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKS5wdXQobWV0YURvYyk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBmZXRjaCBvciBnZW5lcmF0ZSB0aGUgaW5zdGFuY2VJZFxuICAgIC8vXG4gICAgdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgbWV0YURvYyA9IGUudGFyZ2V0LnJlc3VsdCB8fCB7IGlkOiBNRVRBX1NUT1JFIH07XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gY291bnREb2NzXG4gICAgLy9cbiAgICBjb3VudERvY3ModHhuLCBmdW5jdGlvbiAoY291bnQpIHtcbiAgICAgIGRvY0NvdW50ID0gY291bnQ7XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIGNoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vXG4gICAgaWYgKCFibG9iU3VwcG9ydFByb21pc2UpIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBibG9iIHN1cHBvcnQgaXMgb25seSBjaGVja2VkIG9uY2VcbiAgICAgIGJsb2JTdXBwb3J0UHJvbWlzZSA9IGNoZWNrQmxvYlN1cHBvcnQodHhuKTtcbiAgICB9XG5cbiAgICBibG9iU3VwcG9ydFByb21pc2UudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICBibG9iU3VwcG9ydCA9IHZhbDtcbiAgICAgIGNvbXBsZXRlU2V0dXAoKTtcbiAgICB9KTtcblxuICAgIC8vIG9ubHkgd2hlbiB0aGUgbWV0YWRhdGEgcHV0IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAgLy8gY29uc2lkZXIgdGhlIHNldHVwIGRvbmVcbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHN0b3JlZE1ldGFEb2MgPSB0cnVlO1xuICAgICAgY29tcGxldGVTZXR1cCgpO1xuICAgIH07XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gIH07XG5cbiAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBtc2cgPSBlLnRhcmdldC5lcnJvciAmJiBlLnRhcmdldC5lcnJvci5tZXNzYWdlO1xuXG4gICAgaWYgKCFtc2cpIHtcbiAgICAgIG1zZyA9ICdGYWlsZWQgdG8gb3BlbiBpbmRleGVkREIsIGFyZSB5b3UgaW4gcHJpdmF0ZSBicm93c2luZyBtb2RlPyc7XG4gICAgfSBlbHNlIGlmIChtc2cuaW5kZXhPZihcInN0b3JlZCBkYXRhYmFzZSBpcyBhIGhpZ2hlciB2ZXJzaW9uXCIpICE9PSAtMSkge1xuICAgICAgbXNnID0gbmV3IEVycm9yKCdUaGlzIERCIHdhcyBjcmVhdGVkIHdpdGggdGhlIG5ld2VyIFwiaW5kZXhlZGRiXCIgYWRhcHRlciwgYnV0IHlvdSBhcmUgdHJ5aW5nIHRvIG9wZW4gaXQgd2l0aCB0aGUgb2xkZXIgXCJpZGJcIiBhZGFwdGVyJyk7XG4gICAgfVxuXG4gICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJywgbXNnKTtcbiAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihJREJfRVJST1IsIG1zZykpO1xuICB9O1xufVxuXG5JZGJQb3VjaC52YWxpZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRm9sbG93aW5nICM3MDg1IGJ1Z2d5IGlkYiB2ZXJzaW9ucyAodHlwaWNhbGx5IFNhZmFyaSA8IDEwLjEpIGFyZVxuICAvLyBjb25zaWRlcmVkIHZhbGlkLlxuXG4gIC8vIE9uIEZpcmVmb3ggU2VjdXJpdHlFcnJvciBpcyB0aHJvd24gd2hpbGUgcmVmZXJlbmNpbmcgaW5kZXhlZERCIGlmIGNvb2tpZXNcbiAgLy8gYXJlIG5vdCBhbGxvd2VkLiBgdHlwZW9mIGluZGV4ZWREQmAgYWxzbyB0cmlnZ2VycyB0aGUgZXJyb3IuXG4gIHRyeSB7XG4gICAgLy8gc29tZSBvdXRkYXRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgSURCIHRoYXQgYXBwZWFyIG9uIFNhbXN1bmdcbiAgICAvLyBhbmQgSFRDIEFuZHJvaWQgZGV2aWNlcyA8NC40IGFyZSBtaXNzaW5nIElEQktleVJhbmdlXG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBJREJLZXlSYW5nZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIElEQlBvdWNoIChQb3VjaERCKSB7XG4gIFBvdWNoREIuYWRhcHRlcignaWRiJywgSWRiUG91Y2gsIHRydWUpO1xufVxuXG4vLyBkZWFkIHNpbXBsZSBwcm9taXNlIHBvb2wsIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS90aW1kcC9lczYtcHJvbWlzZS1wb29sXG4vLyBidXQgbXVjaCBzbWFsbGVyIGluIGNvZGUgc2l6ZS4gbGltaXRzIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBwcm9taXNlcyB0aGF0IGFyZSBleGVjdXRlZFxuXG5cbmZ1bmN0aW9uIHBvb2wocHJvbWlzZUZhY3RvcmllcywgbGltaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcnVubmluZyA9IDA7XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBkb25lID0gMDtcbiAgICB2YXIgbGVuID0gcHJvbWlzZUZhY3Rvcmllcy5sZW5ndGg7XG4gICAgdmFyIGVycjtcblxuICAgIGZ1bmN0aW9uIHJ1bk5leHQoKSB7XG4gICAgICBydW5uaW5nKys7XG4gICAgICBwcm9taXNlRmFjdG9yaWVzW2N1cnJlbnQrK10oKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgaWYgKCsrZG9uZSA9PT0gbGVuKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydW5OZXh0QmF0Y2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoKSB7XG4gICAgICBydW5uaW5nLS07XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIG9uRXJyb3IodGhpc0Vycikge1xuICAgICAgcnVubmluZy0tO1xuICAgICAgZXJyID0gZXJyIHx8IHRoaXNFcnI7XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5OZXh0QmF0Y2goKSB7XG4gICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIGN1cnJlbnQgPCBsZW4pIHtcbiAgICAgICAgcnVuTmV4dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bk5leHRCYXRjaCgpO1xuICB9KTtcbn1cblxudmFyIENIQU5HRVNfQkFUQ0hfU0laRSA9IDI1O1xudmFyIE1BWF9TSU1VTFRBTkVPVVNfUkVWUyA9IDUwO1xudmFyIENIQU5HRVNfVElNRU9VVF9CVUZGRVIgPSA1MDAwO1xudmFyIERFRkFVTFRfSEVBUlRCRUFUID0gMTAwMDA7XG5cbnZhciBzdXBwb3J0c0J1bGtHZXRNYXAgPSB7fTtcblxuZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocm93KSB7XG4gIHZhciBkb2MgPSByb3cuZG9jIHx8IHJvdy5vaztcbiAgdmFyIGF0dHMgPSBkb2MgJiYgZG9jLl9hdHRhY2htZW50cztcbiAgaWYgKCFhdHRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIE9iamVjdC5rZXlzKGF0dHMpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgIGF0dC5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZURvY0lkKGlkKSB7XG4gIGlmICgvXl9kZXNpZ24vLnRlc3QoaWQpKSB7XG4gICAgcmV0dXJuICdfZGVzaWduLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQuc2xpY2UoOCkpO1xuICB9XG4gIGlmICgvXl9sb2NhbC8udGVzdChpZCkpIHtcbiAgICByZXR1cm4gJ19sb2NhbC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkLnNsaWNlKDcpKTtcbiAgfVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGlkKTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKSB7XG4gIGlmICghZG9jLl9hdHRhY2htZW50cyB8fCAhT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgYXR0YWNobWVudCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICBpZiAoYXR0YWNobWVudC5kYXRhICYmIHR5cGVvZiBhdHRhY2htZW50LmRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgYmxvYlRvQmFzZTY0KGF0dGFjaG1lbnQuZGF0YSwgcmVzb2x2ZSk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChiNjQpIHtcbiAgICAgICAgYXR0YWNobWVudC5kYXRhID0gYjY0O1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGhhc1VybFByZWZpeChvcHRzKSB7XG4gIGlmICghb3B0cy5wcmVmaXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvY29sID0gcGFyc2VVcmkob3B0cy5wcmVmaXgpLnByb3RvY29sO1xuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwJyB8fCBwcm90b2NvbCA9PT0gJ2h0dHBzJztcbn1cblxuLy8gR2V0IGFsbCB0aGUgaW5mb3JtYXRpb24geW91IHBvc3NpYmx5IGNhbiBhYm91dCB0aGUgVVJJIGdpdmVuIGJ5IG5hbWUgYW5kXG4vLyByZXR1cm4gaXQgYXMgYSBzdWl0YWJsZSBvYmplY3QuXG5mdW5jdGlvbiBnZXRIb3N0KG5hbWUsIG9wdHMpIHtcbiAgLy8gZW5jb2RlIGRiIG5hbWUgaWYgb3B0cy5wcmVmaXggaXMgYSB1cmwgKCM1NTc0KVxuICBpZiAoaGFzVXJsUHJlZml4KG9wdHMpKSB7XG4gICAgdmFyIGRiTmFtZSA9IG9wdHMubmFtZS5zdWJzdHIob3B0cy5wcmVmaXgubGVuZ3RoKTtcbiAgICAvLyBFbnN1cmUgcHJlZml4IGhhcyBhIHRyYWlsaW5nIHNsYXNoXG4gICAgdmFyIHByZWZpeCA9IG9wdHMucHJlZml4LnJlcGxhY2UoL1xcLz8kLywgJy8nKTtcbiAgICBuYW1lID0gcHJlZml4ICsgZW5jb2RlVVJJQ29tcG9uZW50KGRiTmFtZSk7XG4gIH1cblxuICB2YXIgdXJpID0gcGFyc2VVcmkobmFtZSk7XG4gIGlmICh1cmkudXNlciB8fCB1cmkucGFzc3dvcmQpIHtcbiAgICB1cmkuYXV0aCA9IHt1c2VybmFtZTogdXJpLnVzZXIsIHBhc3N3b3JkOiB1cmkucGFzc3dvcmR9O1xuICB9XG5cbiAgLy8gU3BsaXQgdGhlIHBhdGggcGFydCBvZiB0aGUgVVJJIGludG8gcGFydHMgdXNpbmcgJy8nIGFzIHRoZSBkZWxpbWl0ZXJcbiAgLy8gYWZ0ZXIgcmVtb3ZpbmcgYW55IGxlYWRpbmcgJy8nIGFuZCBhbnkgdHJhaWxpbmcgJy8nXG4gIHZhciBwYXJ0cyA9IHVyaS5wYXRoLnJlcGxhY2UoLyheXFwvfFxcLyQpL2csICcnKS5zcGxpdCgnLycpO1xuXG4gIHVyaS5kYiA9IHBhcnRzLnBvcCgpO1xuICAvLyBQcmV2ZW50IGRvdWJsZSBlbmNvZGluZyBvZiBVUkkgY29tcG9uZW50XG4gIGlmICh1cmkuZGIuaW5kZXhPZignJScpID09PSAtMSkge1xuICAgIHVyaS5kYiA9IGVuY29kZVVSSUNvbXBvbmVudCh1cmkuZGIpO1xuICB9XG5cbiAgdXJpLnBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgcmV0dXJuIHVyaTtcbn1cblxuLy8gR2VuZXJhdGUgYSBVUkwgd2l0aCB0aGUgaG9zdCBkYXRhIGdpdmVuIGJ5IG9wdHMgYW5kIHRoZSBnaXZlbiBwYXRoXG5mdW5jdGlvbiBnZW5EQlVybChvcHRzLCBwYXRoKSB7XG4gIHJldHVybiBnZW5Vcmwob3B0cywgb3B0cy5kYiArICcvJyArIHBhdGgpO1xufVxuXG4vLyBHZW5lcmF0ZSBhIFVSTCB3aXRoIHRoZSBob3N0IGRhdGEgZ2l2ZW4gYnkgb3B0cyBhbmQgdGhlIGdpdmVuIHBhdGhcbmZ1bmN0aW9uIGdlblVybChvcHRzLCBwYXRoKSB7XG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHZhciBwYXRoRGVsID0gIW9wdHMucGF0aCA/ICcnIDogJy8nO1xuXG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHJldHVybiBvcHRzLnByb3RvY29sICsgJzovLycgKyBvcHRzLmhvc3QgK1xuICAgICAgICAgKG9wdHMucG9ydCA/ICgnOicgKyBvcHRzLnBvcnQpIDogJycpICtcbiAgICAgICAgICcvJyArIG9wdHMucGF0aCArIHBhdGhEZWwgKyBwYXRoO1xufVxuXG5mdW5jdGlvbiBwYXJhbXNUb1N0cihwYXJhbXMpIHtcbiAgcmV0dXJuICc/JyArIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0dXJuIGsgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tdKTtcbiAgfSkuam9pbignJicpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYWNoZUJ1c3Qob3B0cykge1xuICB2YXIgdWEgPSAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkgP1xuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIHZhciBpc0lFID0gdWEuaW5kZXhPZignbXNpZScpICE9PSAtMTtcbiAgdmFyIGlzVHJpZGVudCA9IHVhLmluZGV4T2YoJ3RyaWRlbnQnKSAhPT0gLTE7XG4gIHZhciBpc0VkZ2UgPSB1YS5pbmRleE9mKCdlZGdlJykgIT09IC0xO1xuICB2YXIgaXNHRVQgPSAhKCdtZXRob2QnIGluIG9wdHMpIHx8IG9wdHMubWV0aG9kID09PSAnR0VUJztcbiAgcmV0dXJuIChpc0lFIHx8IGlzVHJpZGVudCB8fCBpc0VkZ2UpICYmIGlzR0VUO1xufVxuXG4vLyBJbXBsZW1lbnRzIHRoZSBQb3VjaERCIEFQSSBmb3IgZGVhbGluZyB3aXRoIENvdWNoREIgaW5zdGFuY2VzIG92ZXIgSFRUUFxuZnVuY3Rpb24gSHR0cFBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG5cbiAgLy8gVGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBIdHRwUG91Y2hcbiAgdmFyIGFwaSA9IHRoaXM7XG5cbiAgdmFyIGhvc3QgPSBnZXRIb3N0KG9wdHMubmFtZSwgb3B0cyk7XG4gIHZhciBkYlVybCA9IGdlbkRCVXJsKGhvc3QsICcnKTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgdmFyIG91ckZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IG5ldyBoKCk7XG5cbiAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gJ2luY2x1ZGUnO1xuXG4gICAgaWYgKG9wdHMuYXV0aCB8fCBob3N0LmF1dGgpIHtcbiAgICAgIHZhciBuQXV0aCA9IG9wdHMuYXV0aCB8fCBob3N0LmF1dGg7XG4gICAgICB2YXIgc3RyID0gbkF1dGgudXNlcm5hbWUgKyAnOicgKyBuQXV0aC5wYXNzd29yZDtcbiAgICAgIHZhciB0b2tlbiA9IHRoaXNCdG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyB0b2tlbik7XG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge307XG4gICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuYXBwZW5kKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzaG91bGRDYWNoZUJ1c3Qob3B0aW9ucykpIHtcbiAgICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ19ub25jZT0nICsgRGF0ZS5ub3coKTtcbiAgICB9XG5cbiAgICB2YXIgZmV0Y2hGdW4gPSBvcHRzLmZldGNoIHx8IGYkMTtcbiAgICByZXR1cm4gZmV0Y2hGdW4odXJsLCBvcHRpb25zKTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGFwdGVyRnVuJCQxKG5hbWUsIGZ1bikge1xuICAgIHJldHVybiBhZGFwdGVyRnVuKG5hbWUsIGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfSk7XG4gICAgfSkpLmJpbmQoYXBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoSlNPTih1cmwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwgbmV3IGgoKTtcblxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQWNjZXB0JykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91ckZldGNoKHVybCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJlc3VsdC5vayA9IHJlc3BvbnNlLm9rO1xuICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgcmVzdWx0LmRhdGEgPSBqc29uO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgcmVzdWx0LmRhdGEuc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgICAgICAgdmFyIGVyciA9IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0LmRhdGEpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0LmRhdGEpKSB7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gcmVzdWx0LmRhdGEubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgaWYgKHYuZXJyb3IgfHwgdi5taXNzaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgc2V0dXBQcm9taXNlO1xuXG4gIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGlmIChvcHRzLnNraXBfc2V0dXApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNldHVwIGluIHByb2Nlc3Mgb3IgcHJldmlvdXMgc3VjY2Vzc2Z1bCBzZXR1cFxuICAgIC8vIGRvbmUgdGhlbiB3ZSB3aWxsIHVzZSB0aGF0XG4gICAgLy8gSWYgcHJldmlvdXMgc2V0dXBzIGhhdmUgYmVlbiByZWplY3RlZCB3ZSB3aWxsIHRyeSBhZ2FpblxuICAgIGlmIChzZXR1cFByb21pc2UpIHtcbiAgICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9taXNlID0gZmV0Y2hKU09OKGRiVXJsKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIC8vIERvZXNudCBleGlzdCwgY3JlYXRlIGl0XG4gICAgICAgIGV4cGxhaW5FcnJvcig0MDQsICdQb3VjaERCIGlzIGp1c3QgZGV0ZWN0aW5nIGlmIHRoZSByZW1vdGUgZXhpc3RzLicpO1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKGRiVXJsLCB7bWV0aG9kOiAnUFVUJ30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLy8gSWYgd2UgdHJ5IHRvIGNyZWF0ZSBhIGRhdGFiYXNlIHRoYXQgYWxyZWFkeSBleGlzdHMsIHNraXBwZWQgaW5cbiAgICAgIC8vIGlzdGFuYnVsIHNpbmNlIGl0cyBjYXRjaGluZyBhIHJhY2UgY29uZGl0aW9uLlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDEyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBzZXR1cFByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgc2V0dXBQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gIH1cblxuICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gIH0pO1xuXG4gIGFwaS5fcmVtb3RlID0gdHJ1ZTtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBhcGkudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ2h0dHAnO1xuICB9O1xuXG4gIGFwaS5pZCA9IGFkYXB0ZXJGdW4kJDEoJ2lkJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgb3VyRmV0Y2goZ2VuVXJsKGhvc3QsICcnKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gQmFkIHJlc3BvbnNlIG9yIG1pc3NpbmcgYHV1aWRgIHNob3VsZCBub3QgcHJldmVudCBJRCBnZW5lcmF0aW9uLlxuICAgICAgdmFyIHV1aWQkJDEgPSAocmVzdWx0ICYmIHJlc3VsdC51dWlkKSA/XG4gICAgICAgICAgKHJlc3VsdC51dWlkICsgaG9zdC5kYikgOiBnZW5EQlVybChob3N0LCAnJyk7XG4gICAgICBjYWxsYmFjayhudWxsLCB1dWlkJCQxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gdGhlIGhvc3QgY2FsbGluZyB0aGUgY291Y2hkYiBfY29tcGFjdCBmdW5jdGlvblxuICAvLyAgICB2ZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiBDb3VjaERCIGl0IGlzIHJ1bm5pbmdcbiAgYXBpLmNvbXBhY3QgPSBhZGFwdGVyRnVuJCQxKCdjb21wYWN0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2NvbXBhY3QnKSwge21ldGhvZDogJ1BPU1QnfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBwaW5nKCkge1xuICAgICAgICBhcGkuaW5mbyhmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBDb3VjaERCIG1heSBzZW5kIGEgXCJjb21wYWN0X3J1bm5pbmc6dHJ1ZVwiIGlmIGl0J3NcbiAgICAgICAgICAvLyBhbHJlYWR5IGNvbXBhY3RpbmcuIFBvdWNoREIgU2VydmVyIGRvZXNuJ3QuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAocmVzICYmICFyZXMuY29tcGFjdF9ydW5uaW5nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChwaW5nLCBvcHRzLmludGVydmFsIHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFBpbmcgdGhlIGh0dHAgaWYgaXQncyBmaW5pc2hlZCBjb21wYWN0aW9uXG4gICAgICBwaW5nKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGFwaS5idWxrR2V0ID0gYWRhcHRlckZ1bignYnVsa0dldCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvQnVsa0dldChjYikge1xuICAgICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgICAgaWYgKG9wdHMucmV2cykge1xuICAgICAgICBwYXJhbXMucmV2cyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMubGF0ZXN0KSB7XG4gICAgICAgIHBhcmFtcy5sYXRlc3QgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfYnVsa19nZXQnICsgcGFyYW1zVG9TdHIocGFyYW1zKSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG9jczogb3B0cy5kb2NzfSlcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAob3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmJpbmFyeSkge1xuICAgICAgICAgIHJlc3VsdC5kYXRhLnJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICByZXMuZG9jcy5mb3JFYWNoKHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYihudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgICB9KS5jYXRjaChjYik7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBkb0J1bGtHZXRTaGltKCkge1xuICAgICAgLy8gYXZvaWQgXCJ1cmwgdG9vIGxvbmcgZXJyb3JcIiBieSBzcGxpdHRpbmcgdXAgaW50byBtdWx0aXBsZSByZXF1ZXN0c1xuICAgICAgdmFyIGJhdGNoU2l6ZSA9IE1BWF9TSU1VTFRBTkVPVVNfUkVWUztcbiAgICAgIHZhciBudW1CYXRjaGVzID0gTWF0aC5jZWlsKG9wdHMuZG9jcy5sZW5ndGggLyBiYXRjaFNpemUpO1xuICAgICAgdmFyIG51bURvbmUgPSAwO1xuICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkobnVtQmF0Y2hlcyk7XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVzdWx0KGJhdGNoTnVtKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBlcnIgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIHNoaW0gcmV0dXJucyBhIGxpc3Qgb2YgZXJycyBpbiB0aGF0IGNhc2VcbiAgICAgICAgICByZXN1bHRzW2JhdGNoTnVtXSA9IHJlcy5yZXN1bHRzO1xuICAgICAgICAgIGlmICgrK251bURvbmUgPT09IG51bUJhdGNoZXMpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtyZXN1bHRzOiBmbGF0dGVuKHJlc3VsdHMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUJhdGNoZXM7IGkrKykge1xuICAgICAgICB2YXIgc3ViT3B0cyA9IHBpY2sob3B0cywgWydyZXZzJywgJ2F0dGFjaG1lbnRzJywgJ2JpbmFyeScsICdsYXRlc3QnXSk7XG4gICAgICAgIHN1Yk9wdHMuZG9jcyA9IG9wdHMuZG9jcy5zbGljZShpICogYmF0Y2hTaXplLFxuICAgICAgICAgIE1hdGgubWluKG9wdHMuZG9jcy5sZW5ndGgsIChpICsgMSkgKiBiYXRjaFNpemUpKTtcbiAgICAgICAgYnVsa0dldChzZWxmLCBzdWJPcHRzLCBvblJlc3VsdChpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFyayB0aGUgd2hvbGUgZGF0YWJhc2UgYXMgZWl0aGVyIHN1cHBvcnRpbmcgb3Igbm90IHN1cHBvcnRpbmcgX2J1bGtfZ2V0XG4gICAgdmFyIGRiVXJsID0gZ2VuVXJsKGhvc3QsICcnKTtcbiAgICB2YXIgc3VwcG9ydHNCdWxrR2V0ID0gc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBzdXBwb3J0c0J1bGtHZXQgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBkYXRhYmFzZSBzdXBwb3J0cyBfYnVsa19nZXRcbiAgICAgIGRvQnVsa0dldChmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHN1cHBvcnRzQnVsa0dldE1hcFtkYlVybF0gPSBmYWxzZTtcbiAgICAgICAgICBleHBsYWluRXJyb3IoXG4gICAgICAgICAgICBlcnIuc3RhdHVzLFxuICAgICAgICAgICAgJ1BvdWNoREIgaXMganVzdCBkZXRlY3RpbmcgaWYgdGhlIHJlbW90ZSAnICtcbiAgICAgICAgICAgICdzdXBwb3J0cyB0aGUgX2J1bGtfZ2V0IEFQSS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkb0J1bGtHZXRTaGltKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXSA9IHRydWU7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0J1bGtHZXQpIHtcbiAgICAgIGRvQnVsa0dldChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvQnVsa0dldFNoaW0oKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENhbGxzIEdFVCBvbiB0aGUgaG9zdCwgd2hpY2ggZ2V0cyBiYWNrIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZ1xuICAvLyAgICBjb3VjaGRiOiBBIHdlbGNvbWUgc3RyaW5nXG4gIC8vICAgIHZlcnNpb246IFRoZSB2ZXJzaW9uIG9mIENvdWNoREIgaXQgaXMgcnVubmluZ1xuICBhcGkuX2luZm8gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG91ckZldGNoKGdlbkRCVXJsKGhvc3QsICcnKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoaW5mbykge1xuICAgICAgaW5mby5ob3N0ID0gZ2VuREJVcmwoaG9zdCwgJycpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9O1xuXG4gIGFwaS5mZXRjaCA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdXJsID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJyA/XG4gICAgICAgIGdlblVybChob3N0LCBwYXRoLnN1YnN0cmluZygxKSkgOlxuICAgICAgICBnZW5EQlVybChob3N0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvdXJGZXRjaCh1cmwsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQgZnJvbSB0aGUgZGF0YWJhc2UgZ2l2ZW4gYnkgaG9zdC5cbiAgLy8gVGhlIGlkIGNvdWxkIGJlIHNvbGVseSB0aGUgX2lkIGluIHRoZSBkYXRhYmFzZSwgb3IgaXQgbWF5IGJlIGFcbiAgLy8gX2Rlc2lnbi9JRCBvciBfbG9jYWwvSUQgcGF0aFxuICBhcGkuZ2V0ID0gYWRhcHRlckZ1biQkMSgnZ2V0JywgZnVuY3Rpb24gKGlkLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIC8vIElmIG5vIG9wdGlvbnMgd2VyZSBnaXZlbiwgc2V0IHRoZSBjYWxsYmFjayB0byB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBHRVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSB7fTtcblxuICAgIGlmIChvcHRzLnJldnMpIHtcbiAgICAgIHBhcmFtcy5yZXZzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgIHBhcmFtcy5yZXZzX2luZm8gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmxhdGVzdCkge1xuICAgICAgcGFyYW1zLmxhdGVzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMub3Blbl9yZXZzKSB7XG4gICAgICBpZiAob3B0cy5vcGVuX3JldnMgIT09IFwiYWxsXCIpIHtcbiAgICAgICAgb3B0cy5vcGVuX3JldnMgPSBKU09OLnN0cmluZ2lmeShvcHRzLm9wZW5fcmV2cyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMub3Blbl9yZXZzID0gb3B0cy5vcGVuX3JldnM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2KSB7XG4gICAgICBwYXJhbXMucmV2ID0gb3B0cy5yZXY7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gb3B0cy5jb25mbGljdHM7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSBvcHRzLnVwZGF0ZV9zZXE7XG4gICAgfVxuXG4gICAgaWQgPSBlbmNvZGVEb2NJZChpZCk7XG5cbiAgICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnRzKGRvYykge1xuICAgICAgdmFyIGF0dHMgPSBkb2MuX2F0dGFjaG1lbnRzO1xuICAgICAgdmFyIGZpbGVuYW1lcyA9IGF0dHMgJiYgT2JqZWN0LmtleXMoYXR0cyk7XG4gICAgICBpZiAoIWF0dHMgfHwgIWZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gd2UgZmV0Y2ggdGhlc2UgbWFudWFsbHkgaW4gc2VwYXJhdGUgWEhScywgYmVjYXVzZVxuICAgICAgLy8gU3luYyBHYXRld2F5IHdvdWxkIG5vcm1hbGx5IHNlbmQgaXQgYmFjayBhcyBtdWx0aXBhcnQvbWl4ZWQsXG4gICAgICAvLyB3aGljaCB3ZSBjYW5ub3QgcGFyc2UuIEFsc28sIHRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhblxuICAgICAgLy8gcmVjZWl2aW5nIGF0dGFjaG1lbnRzIGFzIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3MuXG4gICAgICBmdW5jdGlvbiBmZXRjaERhdGEoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICB2YXIgcGF0aCA9IGVuY29kZURvY0lkKGRvYy5faWQpICsgJy8nICsgZW5jb2RlQXR0YWNobWVudElkKGZpbGVuYW1lKSArXG4gICAgICAgICAgICAnP3Jldj0nICsgZG9jLl9yZXY7XG4gICAgICAgIHJldHVybiBvdXJGZXRjaChnZW5EQlVybChob3N0LCBwYXRoKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAoJ2J1ZmZlcicgaW4gcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAgICAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgICAgICAgICB2YXIgdHlwZUZpZWxkRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmxvYi5fX3Byb3RvX18sICd0eXBlJyk7XG4gICAgICAgICAgICBpZiAoIXR5cGVGaWVsZERlc2NyaXB0b3IgfHwgdHlwZUZpZWxkRGVzY3JpcHRvci5zZXQpIHtcbiAgICAgICAgICAgICAgYmxvYi50eXBlID0gYXR0LmNvbnRlbnRfdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBibG9iO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGJsb2JUb0Jhc2U2NChibG9iLCByZXNvbHZlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHQuc3R1YjtcbiAgICAgICAgICBkZWxldGUgYXR0Lmxlbmd0aDtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZUZhY3RvcmllcyA9IGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YShmaWxlbmFtZSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhpcyBsaW1pdHMgdGhlIG51bWJlciBvZiBwYXJhbGxlbCB4aHIgcmVxdWVzdHMgdG8gNSBhbnkgdGltZVxuICAgICAgLy8gdG8gYXZvaWQgaXNzdWVzIHdpdGggbWF4aW11bSBicm93c2VyIHJlcXVlc3QgbGltaXRzXG4gICAgICByZXR1cm4gcG9vbChwcm9taXNlRmFjdG9yaWVzLCA1KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmZXRjaEFsbEF0dGFjaG1lbnRzKGRvY09yRG9jcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZG9jT3JEb2NzKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jT3JEb2NzLm1hcChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoQXR0YWNobWVudHMoZG9jLm9rKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEF0dGFjaG1lbnRzKGRvY09yRG9jcyk7XG4gICAgfVxuXG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGlkICsgcGFyYW1zVG9TdHIocGFyYW1zKSk7XG4gICAgZmV0Y2hKU09OKHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoQWxsQXR0YWNobWVudHMocmVzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzLmRhdGEpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUuZG9jSWQgPSBpZDtcbiAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIC8vIERlbGV0ZSB0aGUgZG9jdW1lbnQgZ2l2ZW4gYnkgZG9jIGZyb20gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5yZW1vdmUgPSBhZGFwdGVyRnVuJCQxKCdyZW1vdmUnLCBmdW5jdGlvbiAoZG9jT3JJZCwgb3B0c09yUmV2LCBvcHRzLCBjYikge1xuICAgIHZhciBkb2M7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZCwgcmV2LCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0ge1xuICAgICAgICBfaWQ6IGRvY09ySWQsXG4gICAgICAgIF9yZXY6IG9wdHNPclJldlxuICAgICAgfTtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0gZG9jT3JJZDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0c09yUmV2O1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSBvcHRzT3JSZXY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJldiA9IChkb2MuX3JldiB8fCBvcHRzLnJldik7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvYy5faWQpKSArICc/cmV2PScgKyByZXY7XG5cbiAgICBmZXRjaEpTT04odXJsLCB7bWV0aG9kOiAnREVMRVRFJ30sIGNiKS5jYXRjaChjYik7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpIHtcbiAgICByZXR1cm4gYXR0YWNobWVudElkLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgYXR0YWNobWVudFxuICBhcGkuZ2V0QXR0YWNobWVudCA9IGFkYXB0ZXJGdW4kJDEoJ2dldEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIHZhciBwYXJhbXMgPSBvcHRzLnJldiA/ICgnP3Jldj0nICsgb3B0cy5yZXYpIDogJyc7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvY0lkKSkgKyAnLycgK1xuICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSArIHBhcmFtcztcbiAgICB2YXIgY29udGVudFR5cGU7XG4gICAgb3VyRmV0Y2godXJsLCB7bWV0aG9kOiAnR0VUJ30pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICFwcm9jZXNzLmJyb3dzZXIgJiYgdHlwZW9mIHJlc3BvbnNlLmJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAvLyBUT0RPOiBhbHNvIHJlbW92ZVxuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhcHJvY2Vzcy5icm93c2VyKSB7XG4gICAgICAgIGJsb2IudHlwZSA9IGNvbnRlbnRUeXBlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgYmxvYik7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gUmVtb3ZlIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IHRoZSBpZCBhbmQgcmV2XG4gIGFwaS5yZW1vdmVBdHRhY2htZW50ID0gIGFkYXB0ZXJGdW4kJDEoJ3JlbW92ZUF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBlbmNvZGVEb2NJZChkb2NJZCkgKyAnLycgK1xuICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSkgKyAnP3Jldj0nICsgcmV2O1xuICAgIGZldGNoSlNPTih1cmwsIHttZXRob2Q6ICdERUxFVEUnfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gQWRkIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IGJsb2IgYW5kIGl0cyBjb250ZW50VHlwZSBwcm9wZXJ0eVxuICAvLyB0byB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQsIHRoZSByZXZpc2lvbiBnaXZlbiBieSByZXYsIGFuZFxuICAvLyBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5wdXRBdHRhY2htZW50ID0gYWRhcHRlckZ1biQkMSgncHV0QXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LCBibG9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gdHlwZTtcbiAgICAgIHR5cGUgPSBibG9iO1xuICAgICAgYmxvYiA9IHJldjtcbiAgICAgIHJldiA9IG51bGw7XG4gICAgfVxuICAgIHZhciBpZCA9IGVuY29kZURvY0lkKGRvY0lkKSArICcvJyArIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpO1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBpZCk7XG4gICAgaWYgKHJldikge1xuICAgICAgdXJsICs9ICc/cmV2PScgKyByZXY7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gaW5wdXQgaXMgYXNzdW1lZCB0byBiZSBhIGJhc2U2NCBzdHJpbmdcbiAgICAgIHZhciBiaW5hcnk7XG4gICAgICB0cnkge1xuICAgICAgICBiaW5hcnkgPSB0aGlzQXRvYihibG9iKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX0FSRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBdHRhY2htZW50IGlzIG5vdCBhIHZhbGlkIGJhc2U2NCBzdHJpbmcnKSk7XG4gICAgICB9XG4gICAgICBibG9iID0gYmluYXJ5ID8gYmluU3RyaW5nVG9CbHVmZmVyKGJpbmFyeSwgdHlwZSkgOiAnJztcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGF0dGFjaG1lbnRcbiAgICBmZXRjaEpTT04odXJsLCB7XG4gICAgICBoZWFkZXJzOiBuZXcgaCh7J0NvbnRlbnQtVHlwZSc6IHR5cGV9KSxcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBib2R5OiBibG9iXG4gICAgfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gVXBkYXRlL2NyZWF0ZSBtdWx0aXBsZSBkb2N1bWVudHMgZ2l2ZW4gYnkgcmVxIGluIHRoZSBkYXRhYmFzZVxuICAvLyBnaXZlbiBieSBob3N0LlxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAvLyBJZiBuZXdfZWRpdHM9ZmFsc2UgdGhlbiBpdCBwcmV2ZW50cyB0aGUgZGF0YWJhc2UgZnJvbSBjcmVhdGluZ1xuICAgIC8vIG5ldyByZXZpc2lvbiBudW1iZXJzIGZvciB0aGUgZG9jdW1lbnRzLiBJbnN0ZWFkIGl0IGp1c3QgdXNlc1xuICAgIC8vIHRoZSBvbGQgb25lcy4gVGhpcyBpcyB1c2VkIGluIGRhdGFiYXNlIHJlcGxpY2F0aW9uLlxuICAgIHJlcS5uZXdfZWRpdHMgPSBvcHRzLm5ld19lZGl0cztcblxuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVxLmRvY3MubWFwKHByZXByb2Nlc3NBdHRhY2htZW50cyQxKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVcGRhdGUvY3JlYXRlIHRoZSBkb2N1bWVudHNcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19idWxrX2RvY3MnKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxKVxuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgfTtcblxuXG4gIC8vIFVwZGF0ZS9jcmVhdGUgZG9jdW1lbnRcbiAgYXBpLl9wdXQgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgZW5jb2RlRG9jSWQoZG9jLl9pZCkpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRvYylcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0LmRhdGEpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGVyci5kb2NJZCA9IGRvYyAmJiBkb2MuX2lkO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfTtcblxuXG4gIC8vIEdldCBhIGxpc3Rpbmcgb2YgdGhlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgZ2l2ZW5cbiAgLy8gYnkgaG9zdCBhbmQgb3JkZXJlZCBieSBpbmNyZWFzaW5nIGlkLlxuICBhcGkuYWxsRG9jcyA9IGFkYXB0ZXJGdW4kJDEoJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgLy8gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgR0VUIHJlcXVlc3RcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdmFyIGJvZHk7XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnO1xuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICBwYXJhbXMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgcGFyYW1zLmRlc2NlbmRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgcGFyYW1zLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gYWRkZWQgaW4gQ291Y2hEQiAxLjYuMFxuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmtleSkge1xuICAgICAgcGFyYW1zLmtleSA9IEpTT04uc3RyaW5naWZ5KG9wdHMua2V5KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydF9rZXkpIHtcbiAgICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydGtleSkge1xuICAgICAgcGFyYW1zLnN0YXJ0a2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zdGFydGtleSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5kX2tleSkge1xuICAgICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5ka2V5KSB7XG4gICAgICBwYXJhbXMuZW5ka2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5lbmRrZXkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5pbmNsdXNpdmVfZW5kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmluY2x1c2l2ZV9lbmQgPSAhIW9wdHMuaW5jbHVzaXZlX2VuZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLnNraXAgPSBvcHRzLnNraXA7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtU3RyID0gcGFyYW1zVG9TdHIocGFyYW1zKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5rZXlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgYm9keSA9IHtrZXlzOiBvcHRzLmtleXN9O1xuICAgIH1cblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2FsbF9kb2NzJyArIHBhcmFtU3RyKSwge1xuICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlc3VsdC5kYXRhLnJvd3MuZm9yRWFjaChyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcik7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICAvLyBHZXQgYSBsaXN0IG9mIGNoYW5nZXMgbWFkZSB0byBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIC8vIFRPRE8gQWNjb3JkaW5nIHRvIHRoZSBSRUFETUUsIHRoZXJlIHNob3VsZCBiZSB0d28gb3RoZXIgbWV0aG9kcyBoZXJlLFxuICAvLyBhcGkuY2hhbmdlcy5hZGRMaXN0ZW5lciBhbmQgYXBpLmNoYW5nZXMucmVtb3ZlTGlzdGVuZXIuXG4gIGFwaS5fY2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICAvLyBXZSBpbnRlcm5hbGx5IHBhZ2UgdGhlIHJlc3VsdHMgb2YgYSBjaGFuZ2VzIHJlcXVlc3QsIHRoaXMgbWVhbnNcbiAgICAvLyBpZiB0aGVyZSBpcyBhIGxhcmdlIHNldCBvZiBjaGFuZ2VzIHRvIGJlIHJldHVybmVkIHdlIGNhbiBzdGFydFxuICAgIC8vIHByb2Nlc3NpbmcgdGhlbSBxdWlja2VyIGluc3RlYWQgb2Ygd2FpdGluZyBvbiB0aGUgZW50aXJlXG4gICAgLy8gc2V0IG9mIGNoYW5nZXMgdG8gcmV0dXJuIGFuZCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlbSBhdCBvbmNlXG4gICAgdmFyIGJhdGNoU2l6ZSA9ICdiYXRjaF9zaXplJyBpbiBvcHRzID8gb3B0cy5iYXRjaF9zaXplIDogQ0hBTkdFU19CQVRDSF9TSVpFO1xuXG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgaWYgKG9wdHMuY29udGludW91cyAmJiAhKCdoZWFydGJlYXQnIGluIG9wdHMpKSB7XG4gICAgICBvcHRzLmhlYXJ0YmVhdCA9IERFRkFVTFRfSEVBUlRCRUFUO1xuICAgIH1cblxuICAgIHZhciByZXF1ZXN0VGltZW91dCA9ICgndGltZW91dCcgaW4gb3B0cykgPyBvcHRzLnRpbWVvdXQgOiAzMCAqIDEwMDA7XG5cbiAgICAvLyBlbnN1cmUgQ0hBTkdFU19USU1FT1VUX0JVRkZFUiBhcHBsaWVzXG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCAmJlxuICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy50aW1lb3V0KSA8IENIQU5HRVNfVElNRU9VVF9CVUZGRVIpIHtcbiAgICAgICAgcmVxdWVzdFRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgKyBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzICYmIG9wdHMuaGVhcnRiZWF0ICYmXG4gICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy5oZWFydGJlYXQpIDwgQ0hBTkdFU19USU1FT1VUX0JVRkZFUikge1xuICAgICAgICByZXF1ZXN0VGltZW91dCA9IG9wdHMuaGVhcnRiZWF0ICsgQ0hBTkdFU19USU1FT1VUX0JVRkZFUjtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCkge1xuICAgICAgcGFyYW1zLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgfVxuXG4gICAgdmFyIGxpbWl0ID0gKHR5cGVvZiBvcHRzLmxpbWl0ICE9PSAndW5kZWZpbmVkJykgPyBvcHRzLmxpbWl0IDogZmFsc2U7XG4gICAgdmFyIGxlZnRUb0ZldGNoID0gbGltaXQ7XG5cbiAgICBpZiAob3B0cy5zdHlsZSkge1xuICAgICAgcGFyYW1zLnN0eWxlID0gb3B0cy5zdHlsZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MgfHwgb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgcGFyYW1zLmF0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgICBwYXJhbXMuZmVlZCA9ICdsb25ncG9sbCc7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VxX2ludGVydmFsKSB7XG4gICAgICBwYXJhbXMuc2VxX2ludGVydmFsID0gb3B0cy5zZXFfaW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICBwYXJhbXMuZGVzY2VuZGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzKSB7XG4gICAgICAvLyBJZiB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIGZhbHNlLCBpdCBkaXNhYmxlcyB0aGUgZGVmYXVsdCBoZWFydGJlYXRcbiAgICAgIGlmIChvcHRzLmhlYXJ0YmVhdCkge1xuICAgICAgICBwYXJhbXMuaGVhcnRiZWF0ID0gb3B0cy5oZWFydGJlYXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICBpZiAob3B0cy52aWV3ICYmIHR5cGVvZiBvcHRzLnZpZXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ192aWV3JztcbiAgICAgIHBhcmFtcy52aWV3ID0gb3B0cy52aWV3O1xuICAgIH1cblxuICAgIC8vIElmIG9wdHMucXVlcnlfcGFyYW1zIGV4aXN0cywgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAgLy8gVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgdXNlZCBieSB0aGUgZmlsdGVyIG9uIHRoZSBzb3VyY2UgZGF0YWJhc2UuXG4gICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zICYmIHR5cGVvZiBvcHRzLnF1ZXJ5X3BhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRzLnF1ZXJ5X3BhcmFtcywgcGFyYW1fbmFtZSkpIHtcbiAgICAgICAgICBwYXJhbXNbcGFyYW1fbmFtZV0gPSBvcHRzLnF1ZXJ5X3BhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtZXRob2QgPSAnR0VUJztcbiAgICB2YXIgYm9keTtcblxuICAgIGlmIChvcHRzLmRvY19pZHMpIHtcbiAgICAgIC8vIHNldCB0aGlzIGF1dG9tYWdpY2FsbHkgZm9yIHRoZSB1c2VyOyBpdCdzIGFubm95aW5nIHRoYXQgY291Y2hkYlxuICAgICAgLy8gcmVxdWlyZXMgYm90aCBhIFwiZmlsdGVyXCIgYW5kIGEgXCJkb2NfaWRzXCIgcGFyYW0uXG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ19kb2NfaWRzJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7ZG9jX2lkczogb3B0cy5kb2NfaWRzIH07XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZWxzZSBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgICAgLy8gc2V0IHRoaXMgYXV0b21hZ2ljYWxseSBmb3IgdGhlIHVzZXIsIHNpbWlsYXIgdG8gYWJvdmVcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSAnX3NlbGVjdG9yJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7c2VsZWN0b3I6IG9wdHMuc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICB2YXIgY29udHJvbGxlciA9IG5ldyBhKCk7XG4gICAgdmFyIGxhc3RGZXRjaGVkU2VxO1xuXG4gICAgLy8gR2V0IGFsbCB0aGUgY2hhbmdlcyBzdGFydGluZyB3dGloIHRoZSBvbmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXG4gICAgLy8gc2VxdWVuY2UgbnVtYmVyIGdpdmVuIGJ5IHNpbmNlLlxuICAgIHZhciBmZXRjaERhdGEgPSBmdW5jdGlvbiAoc2luY2UsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5zaW5jZSA9IHNpbmNlO1xuICAgICAgLy8gXCJzaW5jZVwiIGNhbiBiZSBhbnkga2luZCBvZiBqc29uIG9iamVjdCBpbiBDbG91ZGFudC9Db3VjaERCIDIueFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zLnNpbmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHBhcmFtcy5zaW5jZSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5zaW5jZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgaWYgKGxpbWl0KSB7XG4gICAgICAgICAgcGFyYW1zLmxpbWl0ID0gbGVmdFRvRmV0Y2g7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5saW1pdCA9ICghbGltaXQgfHwgbGVmdFRvRmV0Y2ggPiBiYXRjaFNpemUpID9cbiAgICAgICAgICBiYXRjaFNpemUgOiBsZWZ0VG9GZXRjaDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBvcHRpb25zIGZvciB0aGUgYWpheCBjYWxsXG4gICAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgJ19jaGFuZ2VzJyArIHBhcmFtc1RvU3RyKHBhcmFtcykpO1xuICAgICAgdmFyIGZldGNoT3B0cyA9IHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9O1xuICAgICAgbGFzdEZldGNoZWRTZXEgPSBzaW5jZTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBjaGFuZ2VzXG4gICAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKHVybCwgZmV0Y2hPcHRzLCBjYWxsYmFjayk7XG4gICAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIC8vIElmIG9wdHMuc2luY2UgZXhpc3RzLCBnZXQgYWxsIHRoZSBjaGFuZ2VzIGZyb20gdGhlIHNlcXVlbmNlXG4gICAgLy8gbnVtYmVyIGdpdmVuIGJ5IG9wdHMuc2luY2UuIE90aGVyd2lzZSwgZ2V0IGFsbCB0aGUgY2hhbmdlc1xuICAgIC8vIGZyb20gdGhlIHNlcXVlbmNlIG51bWJlciAwLlxuICAgIHZhciByZXN1bHRzID0ge3Jlc3VsdHM6IFtdfTtcblxuICAgIHZhciBmZXRjaGVkID0gZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByYXdfcmVzdWx0c19sZW5ndGggPSAwO1xuICAgICAgLy8gSWYgdGhlIHJlc3VsdCBvZiB0aGUgYWpheCBjYWxsIChyZXMpIGNvbnRhaW5zIGNoYW5nZXMgKHJlcy5yZXN1bHRzKVxuICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0cykge1xuICAgICAgICByYXdfcmVzdWx0c19sZW5ndGggPSByZXMucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIHJlc3VsdHMubGFzdF9zZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICAgIHZhciBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdmFyIGxhc3RTZXEgPSBudWxsO1xuICAgICAgICAvLyBBdHRhY2ggJ3BlbmRpbmcnIHByb3BlcnR5IGlmIHNlcnZlciBzdXBwb3J0cyBpdCAoQ291Y2hEQiAyLjArKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHR5cGVvZiByZXMucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBwZW5kaW5nID0gcmVzLnBlbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRzLmxhc3Rfc2VxID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0cy5sYXN0X3NlcSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsYXN0U2VxID0gcmVzdWx0cy5sYXN0X3NlcTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgZWFjaCBjaGFuZ2VcbiAgICAgICAgdmFyIHJlcSA9IHt9O1xuICAgICAgICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcbiAgICAgICAgcmVzLnJlc3VsdHMgPSByZXMucmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICBsZWZ0VG9GZXRjaC0tO1xuICAgICAgICAgIHZhciByZXQgPSBmaWx0ZXJDaGFuZ2Uob3B0cykoYyk7XG4gICAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzICYmIG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5iaW5hcnkpIHtcbiAgICAgICAgICAgICAgcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIoYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0cy5yZXR1cm5fZG9jcykge1xuICAgICAgICAgICAgICByZXN1bHRzLnJlc3VsdHMucHVzaChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdHMub25DaGFuZ2UoYywgcGVuZGluZywgbGFzdFNlcSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBlcnJvciwgc3RvcCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgYW5kIGNhbGxcbiAgICAgICAgLy8gb3B0cy5jb21wbGV0ZVxuICAgICAgICBvcHRzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICBvcHRzLmNvbXBsZXRlKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNoYW5nZXMgZmVlZCBtYXkgaGF2ZSB0aW1lZCBvdXQgd2l0aCBubyByZXN1bHRzXG4gICAgICAvLyBpZiBzbyByZXVzZSBsYXN0IHVwZGF0ZSBzZXF1ZW5jZVxuICAgICAgaWYgKHJlcyAmJiByZXMubGFzdF9zZXEpIHtcbiAgICAgICAgbGFzdEZldGNoZWRTZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5pc2hlZCA9IChsaW1pdCAmJiBsZWZ0VG9GZXRjaCA8PSAwKSB8fFxuICAgICAgICAocmVzICYmIHJhd19yZXN1bHRzX2xlbmd0aCA8IGJhdGNoU2l6ZSkgfHxcbiAgICAgICAgKG9wdHMuZGVzY2VuZGluZyk7XG5cbiAgICAgIGlmICgob3B0cy5jb250aW51b3VzICYmICEobGltaXQgJiYgbGVmdFRvRmV0Y2ggPD0gMCkpIHx8ICFmaW5pc2hlZCkge1xuICAgICAgICAvLyBRdWV1ZSBhIGNhbGwgdG8gZmV0Y2ggYWdhaW4gd2l0aCB0aGUgbmV3ZXN0IHNlcXVlbmNlIG51bWJlclxuICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkgeyBmZXRjaERhdGEobGFzdEZldGNoZWRTZXEsIGZldGNoZWQpOyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUsIGNhbGwgdGhlIGNhbGxiYWNrXG4gICAgICAgIG9wdHMuY29tcGxldGUobnVsbCwgcmVzdWx0cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZldGNoRGF0YShvcHRzLnNpbmNlIHx8IDAsIGZldGNoZWQpO1xuXG4gICAgLy8gUmV0dXJuIGEgbWV0aG9kIHRvIGNhbmNlbCB0aGlzIG1ldGhvZCBmcm9tIHByb2Nlc3NpbmcgYW55IG1vcmVcbiAgICByZXR1cm4ge1xuICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9wdHMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIEdpdmVuIGEgc2V0IG9mIGRvY3VtZW50L3JldmlzaW9uIElEcyAoZ2l2ZW4gYnkgcmVxKSwgdGV0cyB0aGUgc3Vic2V0IG9mXG4gIC8vIHRob3NlIHRoYXQgZG8gTk9UIGNvcnJlc3BvbmQgdG8gcmV2aXNpb25zIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuXG4gIC8vIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL2NvdWNoZGIvSHR0cFBvc3RSZXZzRGlmZlxuICBhcGkucmV2c0RpZmYgPSBhZGFwdGVyRnVuJCQxKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgLy8gSWYgbm8gb3B0aW9ucyB3ZXJlIGdpdmVuLCBzZXQgdGhlIGNhbGxiYWNrIHRvIGJlIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtaXNzaW5nIGRvY3VtZW50L3JldmlzaW9uIElEc1xuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX3JldnNfZGlmZicpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcSlcbiAgICB9LCBjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJycpLCB7bWV0aG9kOiAnREVMRVRFJ30pLnRoZW4oZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGpzb24pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIEh0dHBQb3VjaCBpcyBhIHZhbGlkIGFkYXB0ZXIuXG5IdHRwUG91Y2gudmFsaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gSHR0cFBvdWNoJDEgKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5hZGFwdGVyKCdodHRwJywgSHR0cFBvdWNoLCBmYWxzZSk7XG4gIFBvdWNoREIuYWRhcHRlcignaHR0cHMnLCBIdHRwUG91Y2gsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gUXVlcnlQYXJzZUVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDA7XG4gIHRoaXMubmFtZSA9ICdxdWVyeV9wYXJzZV9lcnJvcic7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xuICB0cnkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFF1ZXJ5UGFyc2VFcnJvcik7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbmluaGVyaXRzKFF1ZXJ5UGFyc2VFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBOb3RGb3VuZEVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDQ7XG4gIHRoaXMubmFtZSA9ICdub3RfZm91bmQnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBOb3RGb3VuZEVycm9yKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuaW5oZXJpdHMoTm90Rm91bmRFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBCdWlsdEluRXJyb3IobWVzc2FnZSkge1xuICB0aGlzLnN0YXR1cyA9IDUwMDtcbiAgdGhpcy5uYW1lID0gJ2ludmFsaWRfdmFsdWUnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBCdWlsdEluRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5pbmhlcml0cyhCdWlsdEluRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gcHJvbWlzZWRDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2spIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gY2FsbGJhY2tpZnkoZnVuKSB7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICB2YXIgY2IgPSBhcmdzLnBvcCgpO1xuICAgIHZhciBwcm9taXNlID0gZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbi8vIFByb21pc2UgZmluYWxseSB1dGlsIHNpbWlsYXIgdG8gUS5maW5hbGx5XG5mdW5jdGlvbiBmaW4ocHJvbWlzZSwgZmluYWxQcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICByZXR1cm4gZmluYWxQcm9taXNlRmFjdG9yeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiBmaW5hbFByb21pc2VGYWN0b3J5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW50aWFsaXplKHF1ZXVlLCBwcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gcXVldWUuYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlRmFjdG9yeS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gdW5pcSBhbiBhcnJheSBvZiBzdHJpbmdzLCBvcmRlciBub3QgZ3VhcmFudGVlZFxuLy8gc2ltaWxhciB0byB1bmRlcnNjb3JlL2xvZGFzaCBfLnVuaXFcbmZ1bmN0aW9uIHVuaXEoYXJyKSB7XG4gIHZhciB0aGVTZXQgPSBuZXcgRXhwb3J0ZWRTZXQoYXJyKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0aGVTZXQuc2l6ZSk7XG4gIHZhciBpbmRleCA9IC0xO1xuICB0aGVTZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1hcFRvS2V5c0FycmF5KG1hcCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG1hcC5zaXplKTtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0ga2V5O1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbHRJbkVycm9yKG5hbWUpIHtcbiAgdmFyIG1lc3NhZ2UgPSAnYnVpbHRpbiAnICsgbmFtZSArXG4gICAgJyBmdW5jdGlvbiByZXF1aXJlcyBtYXAgdmFsdWVzIHRvIGJlIG51bWJlcnMnICtcbiAgICAnIG9yIG51bWJlciBhcnJheXMnO1xuICByZXR1cm4gbmV3IEJ1aWx0SW5FcnJvcihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3VtKHZhbHVlcykge1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShudW0pKSB7XG4gICAgICAgIC8vIGxpc3RzIG9mIG51bWJlcnMgYXJlIGFsc28gYWxsb3dlZCwgc3VtIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICByZXN1bHQgPSB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJyA/IFtyZXN1bHRdIDogcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgakxlbiA9IG51bS5sZW5ndGg7IGogPCBqTGVuOyBqKyspIHtcbiAgICAgICAgICB2YXIgak51bSA9IG51bVtqXTtcbiAgICAgICAgICBpZiAodHlwZW9mIGpOdW0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCdWlsdEluRXJyb3IoJ19zdW0nKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHRbal0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChqTnVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W2pdICs9IGpOdW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyBub3QgYXJyYXkvbnVtYmVyXG4gICAgICAgIHRocm93IGNyZWF0ZUJ1aWx0SW5FcnJvcignX3N1bScpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJlc3VsdCArPSBudW07XG4gICAgfSBlbHNlIHsgLy8gYWRkIG51bWJlciB0byBhcnJheVxuICAgICAgcmVzdWx0WzBdICs9IG51bTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIGxvZyA9IGd1YXJkZWRDb25zb2xlLmJpbmQobnVsbCwgJ2xvZycpO1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHRvSlNPTiA9IEpTT04ucGFyc2U7XG5cbmZ1bmN0aW9uIGV2YWxGdW5jdGlvbldpdGhFdmFsKGZ1bmMsIGVtaXQpIHtcbiAgcmV0dXJuIHNjb3BlRXZhbChcbiAgICBcInJldHVybiAoXCIgKyBmdW5jLnJlcGxhY2UoLztcXHMqJC8sIFwiXCIpICsgXCIpO1wiLFxuICAgIHtcbiAgICAgIGVtaXQ6IGVtaXQsXG4gICAgICBzdW06IHN1bSxcbiAgICAgIGxvZzogbG9nLFxuICAgICAgaXNBcnJheTogaXNBcnJheSxcbiAgICAgIHRvSlNPTjogdG9KU09OXG4gICAgfVxuICApO1xufVxuXG4vKlxuICogU2ltcGxlIHRhc2sgcXVldWUgdG8gc2VxdWVudGlhbGl6ZSBhY3Rpb25zLiBBc3N1bWVzXG4gKiBjYWxsYmFja3Mgd2lsbCBldmVudHVhbGx5IGZpcmUgKG9uY2UpLlxuICovXG5cblxuZnVuY3Rpb24gVGFza1F1ZXVlJDEoKSB7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsKSB7ZnVsZmlsbCgpOyB9KTtcbn1cblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocHJvbWlzZUZhY3RvcnkpIHtcbiAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBqdXN0IHJlY292ZXJcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb21pc2VGYWN0b3J5KCk7XG4gIH0pO1xuICByZXR1cm4gdGhpcy5wcm9taXNlO1xufTtcblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnByb21pc2U7XG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkoaW5wdXQpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJzsgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3IgZW1wdHkgcmVkdWNlXG4gIH1cbiAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXQgd2l0aCBtYXByZWR1Y2UsIGZ1bmN0aW9ucy9zdHJpbmdzIGFyZSBzdHJpbmdpZmllZFxuICAvLyBhcy1pcy4gZXZlcnl0aGluZyBlbHNlIGlzIEpTT04tc3RyaW5naWZpZWQuXG4gIHN3aXRjaCAodHlwZW9mIGlucHV0KSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgLy8gZS5nLiBhIG1hcHJlZHVjZSBtYXBcbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAvLyBlLmcuIGEgbWFwcmVkdWNlIGJ1aWx0LWluIF9yZWR1Y2UgZnVuY3Rpb25cbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIGEgSlNPTiBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgbWFuZ28gcXVlcmllc1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGlucHV0KTtcbiAgfVxufVxuXG4vKiBjcmVhdGUgYSBzdHJpbmcgc2lnbmF0dXJlIGZvciBhIHZpZXcgc28gd2UgY2FuIGNhY2hlIGl0IGFuZCB1bmlxIGl0ICovXG5mdW5jdGlvbiBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKSB7XG4gIC8vIHRoZSBcInVuZGVmaW5lZFwiIHBhcnQgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIHJldHVybiBzdHJpbmdpZnkobWFwRnVuKSArIHN0cmluZ2lmeShyZWR1Y2VGdW4pICsgJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpZXcoc291cmNlREIsIHZpZXdOYW1lLCBtYXBGdW4sIHJlZHVjZUZ1biwgdGVtcG9yYXJ5LCBsb2NhbERvY05hbWUpIHtcbiAgdmFyIHZpZXdTaWduYXR1cmUgPSBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKTtcblxuICB2YXIgY2FjaGVkVmlld3M7XG4gIGlmICghdGVtcG9yYXJ5KSB7XG4gICAgLy8gY2FjaGUgdGhpcyB0byBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHVwZGF0ZSB0aGUgc2FtZSB2aWV3IHR3aWNlXG4gICAgY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgfHwge307XG4gICAgaWYgKGNhY2hlZFZpZXdzW3ZpZXdTaWduYXR1cmVdKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV07XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb21pc2VGb3JWaWV3ID0gc291cmNlREIuaW5mbygpLnRoZW4oZnVuY3Rpb24gKGluZm8pIHtcblxuICAgIHZhciBkZXBEYk5hbWUgPSBpbmZvLmRiX25hbWUgKyAnLW1ydmlldy0nICtcbiAgICAgICh0ZW1wb3JhcnkgPyAndGVtcCcgOiBzdHJpbmdNZDUodmlld1NpZ25hdHVyZSkpO1xuXG4gICAgLy8gc2F2ZSB0aGUgdmlldyBuYW1lIGluIHRoZSBzb3VyY2UgZGIgc28gaXQgY2FuIGJlIGNsZWFuZWQgdXAgaWYgbmVjZXNzYXJ5XG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgX2Rlc2lnbiBkb2MgaXMgZGVsZXRlZCwgcmVtb3ZlIGFsbCBhc3NvY2lhdGVkIHZpZXcgZGF0YSlcbiAgICBmdW5jdGlvbiBkaWZmRnVuY3Rpb24oZG9jKSB7XG4gICAgICBkb2Mudmlld3MgPSBkb2Mudmlld3MgfHwge307XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICBpZiAoZnVsbFZpZXdOYW1lLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgIH1cbiAgICAgIHZhciBkZXBEYnMgPSBkb2Mudmlld3NbZnVsbFZpZXdOYW1lXSA9IGRvYy52aWV3c1tmdWxsVmlld05hbWVdIHx8IHt9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZGVwRGJzW2RlcERiTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuOyAvLyBubyB1cGRhdGUgbmVjZXNzYXJ5XG4gICAgICB9XG4gICAgICBkZXBEYnNbZGVwRGJOYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZG9jO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KHNvdXJjZURCLCAnX2xvY2FsLycgKyBsb2NhbERvY05hbWUsIGRpZmZGdW5jdGlvbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc291cmNlREIucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZShkZXBEYk5hbWUpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB2YXIgZGIgPSByZXMuZGI7XG4gICAgICAgIGRiLmF1dG9fY29tcGFjdGlvbiA9IHRydWU7XG4gICAgICAgIHZhciB2aWV3ID0ge1xuICAgICAgICAgIG5hbWU6IGRlcERiTmFtZSxcbiAgICAgICAgICBkYjogZGIsXG4gICAgICAgICAgc291cmNlREI6IHNvdXJjZURCLFxuICAgICAgICAgIGFkYXB0ZXI6IHNvdXJjZURCLmFkYXB0ZXIsXG4gICAgICAgICAgbWFwRnVuOiBtYXBGdW4sXG4gICAgICAgICAgcmVkdWNlRnVuOiByZWR1Y2VGdW5cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZpZXcuZGIuZ2V0KCdfbG9jYWwvbGFzdFNlcScpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChsYXN0U2VxRG9jKSB7XG4gICAgICAgICAgdmlldy5zZXEgPSBsYXN0U2VxRG9jID8gbGFzdFNlcURvYy5zZXEgOiAwO1xuICAgICAgICAgIGlmIChjYWNoZWRWaWV3cykge1xuICAgICAgICAgICAgdmlldy5kYi5vbmNlKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZWRWaWV3c1t2aWV3U2lnbmF0dXJlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKGNhY2hlZFZpZXdzKSB7XG4gICAgY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV0gPSBwcm9taXNlRm9yVmlldztcbiAgfVxuICByZXR1cm4gcHJvbWlzZUZvclZpZXc7XG59XG5cbnZhciBwZXJzaXN0ZW50UXVldWVzID0ge307XG52YXIgdGVtcFZpZXdRdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xudmFyIENIQU5HRVNfQkFUQ0hfU0laRSQxID0gNTA7XG5cbmZ1bmN0aW9uIHBhcnNlVmlld05hbWUobmFtZSkge1xuICAvLyBjYW4gYmUgZWl0aGVyICdkZG9jbmFtZS92aWV3bmFtZScgb3IganVzdCAndmlld25hbWUnXG4gIC8vICh3aGVyZSB0aGUgZGRvYyBuYW1lIGlzIHRoZSBzYW1lKVxuICByZXR1cm4gbmFtZS5pbmRleE9mKCcvJykgPT09IC0xID8gW25hbWUsIG5hbWVdIDogbmFtZS5zcGxpdCgnLycpO1xufVxuXG5mdW5jdGlvbiBpc0dlbk9uZShjaGFuZ2VzKSB7XG4gIC8vIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgY2hhbmdlIGlzIDEtXG4gIC8vIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbGVhZnNcbiAgcmV0dXJuIGNoYW5nZXMubGVuZ3RoID09PSAxICYmIC9eMS0vLnRlc3QoY2hhbmdlc1swXS5yZXYpO1xufVxuXG5mdW5jdGlvbiBlbWl0RXJyb3IoZGIsIGUpIHtcbiAgdHJ5IHtcbiAgICBkYi5lbWl0KCdlcnJvcicsIGUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLFxuICAgICAgJ1RoZSB1c2VyXFwncyBtYXAvcmVkdWNlIGZ1bmN0aW9uIHRocmV3IGFuIHVuY2F1Z2h0IGVycm9yLlxcbicgK1xuICAgICAgJ1lvdSBjYW4gZGVidWcgdGhpcyBlcnJvciBieSBkb2luZzpcXG4nICtcbiAgICAgICdteURhdGFiYXNlLm9uKFxcJ2Vycm9yXFwnLCBmdW5jdGlvbiAoZXJyKSB7IGRlYnVnZ2VyOyB9KTtcXG4nICtcbiAgICAgICdQbGVhc2UgZG91YmxlLWNoZWNrIHlvdXIgbWFwL3JlZHVjZSBmdW5jdGlvbi4nKTtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCBlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gXCJhYnN0cmFjdFwiIG1hcHJlZHVjZSBvYmplY3Qgb2YgdGhlIGZvcm06XG4gKlxuICogICB7XG4gKiAgICAgcXVlcnk6IHF1ZXJ5RnVuLFxuICogICAgIHZpZXdDbGVhbnVwOiB2aWV3Q2xlYW51cEZ1blxuICogICB9XG4gKlxuICogQXJndW1lbnRzIGFyZTpcbiAqXG4gKiBsb2NhbERvYzogc3RyaW5nXG4gKiAgIFRoaXMgaXMgZm9yIHRoZSBsb2NhbCBkb2MgdGhhdCBnZXRzIHNhdmVkIGluIG9yZGVyIHRvIHRyYWNrIHRoZVxuICogICBcImRlcGVuZGVudFwiIERCcyBhbmQgY2xlYW4gdGhlbSB1cCBmb3Igdmlld0NsZWFudXAuIEl0IHNob3VsZCBiZVxuICogICB1bmlxdWUsIHNvIHRoYXQgaW5kZXhlciBwbHVnaW5zIGRvbid0IGNvbGxpZGUgd2l0aCBlYWNoIG90aGVyLlxuICogbWFwcGVyOiBmdW5jdGlvbiAobWFwRnVuRGVmLCBlbWl0KVxuICogICBSZXR1cm5zIGEgbWFwIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBtYXBGdW5EZWYsIHdoaWNoIGluIHRoZSBjYXNlIG9mXG4gKiAgIG5vcm1hbCBtYXAvcmVkdWNlIGlzIGp1c3QgdGhlIGRlLXN0cmluZ2lmaWVkIGZ1bmN0aW9uLCBidXQgbWF5IGJlXG4gKiAgIHNvbWV0aGluZyBlbHNlLCBzdWNoIGFzIGFuIG9iamVjdCBpbiB0aGUgY2FzZSBvZiBwb3VjaGRiLWZpbmQuXG4gKiByZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlRnVuRGVmKVxuICogICBEaXR0bywgYnV0IGZvciByZWR1Y2luZy4gTW9kdWxlcyBkb24ndCBoYXZlIHRvIHN1cHBvcnQgcmVkdWNpbmdcbiAqICAgKGUuZy4gcG91Y2hkYi1maW5kKS5cbiAqIGRkb2NWYWxpZGF0b3I6IGZ1bmN0aW9uIChkZG9jLCB2aWV3TmFtZSlcbiAqICAgVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBkZG9jIG9yIHZpZXdOYW1lIGlzIG5vdCB2YWxpZC5cbiAqICAgVGhpcyBjb3VsZCBiZSBhIHdheSB0byBjb21tdW5pY2F0ZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGVcbiAqICAgaW5kZXhlciBpcyBpbnZhbGlkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZShsb2NhbERvY05hbWUsIG1hcHBlciwgcmVkdWNlciwgZGRvY1ZhbGlkYXRvcikge1xuXG4gIGZ1bmN0aW9uIHRyeU1hcChkYiwgZnVuLCBkb2MpIHtcbiAgICAvLyBlbWl0IGFuIGV2ZW50IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB0aHJvd24gYnkgYSBtYXAgZnVuY3Rpb24uXG4gICAgLy8gcHV0dGluZyB0cnkvY2F0Y2hlcyBpbiBhIHNpbmdsZSBmdW5jdGlvbiBhbHNvIGF2b2lkcyBkZW9wdGltaXphdGlvbnMuXG4gICAgdHJ5IHtcbiAgICAgIGZ1bihkb2MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5UmVkdWNlKGRiLCBmdW4sIGtleXMsIHZhbHVlcywgcmVyZWR1Y2UpIHtcbiAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgcmV0dXJuaW5nIHRoZSByZXN1bHQgb3IgYW4gZXJyb3IuIHRoZXJlIGFyZSB0d28gc2VwYXJhdGVcbiAgICAvLyBmdW5jdGlvbnMgdG8gYXZvaWQgZXh0cmEgbWVtb3J5IGFsbG9jYXRpb25zIHNpbmNlIHRoZSB0cnlDb2RlKCkgY2FzZSBpcyB1c2VkXG4gICAgLy8gZm9yIGN1c3RvbSBtYXAgZnVuY3Rpb25zIChjb21tb24pIHZzIHRoaXMgZnVuY3Rpb24sIHdoaWNoIGlzIG9ubHkgdXNlZCBmb3JcbiAgICAvLyBjdXN0b20gcmVkdWNlIGZ1bmN0aW9ucyAocmFyZSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtvdXRwdXQgOiBmdW4oa2V5cywgdmFsdWVzLCByZXJlZHVjZSl9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzb3J0QnlLZXlUaGVuVmFsdWUoeCwgeSkge1xuICAgIHZhciBrZXlDb21wYXJlID0gY29sbGF0ZSh4LmtleSwgeS5rZXkpO1xuICAgIHJldHVybiBrZXlDb21wYXJlICE9PSAwID8ga2V5Q29tcGFyZSA6IGNvbGxhdGUoeC52YWx1ZSwgeS52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzbGljZVJlc3VsdHMocmVzdWx0cywgbGltaXQsIHNraXApIHtcbiAgICBza2lwID0gc2tpcCB8fCAwO1xuICAgIGlmICh0eXBlb2YgbGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5zbGljZShza2lwLCBsaW1pdCArIHNraXApO1xuICAgIH0gZWxzZSBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNsaWNlKHNraXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJvd1RvRG9jSWQocm93KSB7XG4gICAgdmFyIHZhbCA9IHJvdy52YWx1ZTtcbiAgICAvLyBVc2VycyBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IGEgam9pbmVkIGRvYyBfaWQsIG9yIGl0XG4gICAgLy8gZGVmYXVsdHMgdG8gdGhlIGRvYyBfaWQgdGhhdCBlbWl0dGVkIHRoZSBrZXkvdmFsdWUuXG4gICAgdmFyIGRvY0lkID0gKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwuX2lkKSB8fCByb3cuaWQ7XG4gICAgcmV0dXJuIGRvY0lkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocmVzKSB7XG4gICAgcmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICB2YXIgYXR0cyA9IHJvdy5kb2MgJiYgcm93LmRvYy5fYXR0YWNobWVudHM7XG4gICAgICBpZiAoIWF0dHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmtleXMoYXR0cykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICBhdHRzW2ZpbGVuYW1lXS5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKHJlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhZGRIdHRwUGFyYW0ocGFyYW1OYW1lLCBvcHRzLCBwYXJhbXMsIGFzSnNvbikge1xuICAgIC8vIGFkZCBhbiBodHRwIHBhcmFtIGZyb20gb3B0cyB0byBwYXJhbXMsIG9wdGlvbmFsbHkganNvbi1lbmNvZGVkXG4gICAgdmFyIHZhbCA9IG9wdHNbcGFyYW1OYW1lXTtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChhc0pzb24pIHtcbiAgICAgICAgdmFsID0gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnB1c2gocGFyYW1OYW1lICsgJz0nICsgdmFsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb2VyY2VJbnRlZ2VyKGludGVnZXJDYW5kaWRhdGUpIHtcbiAgICBpZiAodHlwZW9mIGludGVnZXJDYW5kaWRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgYXNOdW1iZXIgPSBOdW1iZXIoaW50ZWdlckNhbmRpZGF0ZSk7XG4gICAgICAvLyBwcmV2ZW50cyBlLmcuICcxZm9vJyBvciAnMS4xJyBiZWluZyBjb2VyY2VkIHRvIDFcbiAgICAgIGlmICghaXNOYU4oYXNOdW1iZXIpICYmIGFzTnVtYmVyID09PSBwYXJzZUludChpbnRlZ2VyQ2FuZGlkYXRlLCAxMCkpIHtcbiAgICAgICAgcmV0dXJuIGFzTnVtYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludGVnZXJDYW5kaWRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29lcmNlT3B0aW9ucyhvcHRzKSB7XG4gICAgb3B0cy5ncm91cF9sZXZlbCA9IGNvZXJjZUludGVnZXIob3B0cy5ncm91cF9sZXZlbCk7XG4gICAgb3B0cy5saW1pdCA9IGNvZXJjZUludGVnZXIob3B0cy5saW1pdCk7XG4gICAgb3B0cy5za2lwID0gY29lcmNlSW50ZWdlcihvcHRzLnNraXApO1xuICAgIHJldHVybiBvcHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tQb3NpdGl2ZUludGVnZXIobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlcikge1xuICAgICAgaWYgKHR5cGVvZiBudW1iZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAgbmV3IFF1ZXJ5UGFyc2VFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgaW50ZWdlcjogXCInICtcbiAgICAgICAgICBudW1iZXIgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlQYXJzZUVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwb3NpdGl2ZSBpbnRlZ2VyOiAnICtcbiAgICAgICAgICAnXCInICsgbnVtYmVyICsgJ1wiJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0aW9ucywgZnVuKSB7XG4gICAgdmFyIHN0YXJ0a2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdlbmRrZXknIDogJ3N0YXJ0a2V5JztcbiAgICB2YXIgZW5ka2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdzdGFydGtleScgOiAnZW5ka2V5JztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1tzdGFydGtleU5hbWVdICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIG9wdGlvbnNbZW5ka2V5TmFtZV0gIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBjb2xsYXRlKG9wdGlvbnNbc3RhcnRrZXlOYW1lXSwgb3B0aW9uc1tlbmRrZXlOYW1lXSkgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdObyByb3dzIGNhbiBtYXRjaCB5b3VyIGtleSByYW5nZSwgJyArXG4gICAgICAgICdyZXZlcnNlIHlvdXIgc3RhcnRfa2V5IGFuZCBlbmRfa2V5IG9yIHNldCB7ZGVzY2VuZGluZyA6IHRydWV9Jyk7XG4gICAgfSBlbHNlIGlmIChmdW4ucmVkdWNlICYmIG9wdGlvbnMucmVkdWNlICE9PSBmYWxzZSkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXJyb3IoJ3tpbmNsdWRlX2RvY3M6dHJ1ZX0gaXMgaW52YWxpZCBmb3IgcmVkdWNlJyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMua2V5cyAmJiBvcHRpb25zLmtleXMubGVuZ3RoID4gMSAmJlxuICAgICAgICAhb3B0aW9ucy5ncm91cCAmJiAhb3B0aW9ucy5ncm91cF9sZXZlbCkge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdNdWx0aS1rZXkgZmV0Y2hlcyBmb3IgcmVkdWNlIHZpZXdzIG11c3QgdXNlICcgK1xuICAgICAgICAgICd7Z3JvdXA6IHRydWV9Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFsnZ3JvdXBfbGV2ZWwnLCAnbGltaXQnLCAnc2tpcCddLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbk5hbWUpIHtcbiAgICAgIHZhciBlcnJvciA9IGNoZWNrUG9zaXRpdmVJbnRlZ2VyKG9wdGlvbnNbb3B0aW9uTmFtZV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaHR0cFF1ZXJ5KGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBQVVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICB2YXIgYm9keTtcbiAgICB2YXIgbWV0aG9kID0gJ0dFVCc7XG4gICAgdmFyIG9rLCBzdGF0dXM7XG5cbiAgICAvLyBJZiBvcHRzLnJlZHVjZSBleGlzdHMgYW5kIGlzIGRlZmluZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0XG4gICAgLy8gb2YgcGFyYW1ldGVycy5cbiAgICAvLyBJZiByZWR1Y2U9ZmFsc2UgdGhlbiB0aGUgcmVzdWx0cyBhcmUgdGhhdCBvZiBvbmx5IHRoZSBtYXAgZnVuY3Rpb25cbiAgICAvLyBub3QgdGhlIGZpbmFsIHJlc3VsdCBvZiBtYXAgYW5kIHJlZHVjZS5cbiAgICBhZGRIdHRwUGFyYW0oJ3JlZHVjZScsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdpbmNsdWRlX2RvY3MnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnYXR0YWNobWVudHMnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnbGltaXQnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnZGVzY2VuZGluZycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cF9sZXZlbCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdza2lwJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3N0YWxlJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2NvbmZsaWN0cycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydGtleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnZW5ka2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2VuZF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnaW5jbHVzaXZlX2VuZCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdrZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgndXBkYXRlX3NlcScsIG9wdHMsIHBhcmFtcyk7XG5cbiAgICAvLyBGb3JtYXQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBpbnRvIGEgdmFsaWQgVVJJIHF1ZXJ5IHN0cmluZ1xuICAgIHBhcmFtcyA9IHBhcmFtcy5qb2luKCcmJyk7XG4gICAgcGFyYW1zID0gcGFyYW1zID09PSAnJyA/ICcnIDogJz8nICsgcGFyYW1zO1xuXG4gICAgLy8gSWYga2V5cyBhcmUgc3VwcGxpZWQsIGlzc3VlIGEgUE9TVCB0byBjaXJjdW12ZW50IEdFVCBxdWVyeSBzdHJpbmcgbGltaXRzXG4gICAgLy8gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY291Y2hkYi9IVFRQX3ZpZXdfQVBJI1F1ZXJ5aW5nX09wdGlvbnNcbiAgICBpZiAodHlwZW9mIG9wdHMua2V5cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBNQVhfVVJMX0xFTkdUSCA9IDIwMDA7XG4gICAgICAvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE3MTg0LzY4MDc0MixcbiAgICAgIC8vIHRoZSBkZSBmYWN0byBVUkwgbGVuZ3RoIGxpbWl0IGlzIDIwMDAgY2hhcmFjdGVyc1xuXG4gICAgICB2YXIga2V5c0FzU3RyaW5nID1cbiAgICAgICAgJ2tleXM9JyArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvcHRzLmtleXMpKTtcbiAgICAgIGlmIChrZXlzQXNTdHJpbmcubGVuZ3RoICsgcGFyYW1zLmxlbmd0aCArIDEgPD0gTUFYX1VSTF9MRU5HVEgpIHtcbiAgICAgICAgLy8gSWYgdGhlIGtleXMgYXJlIHNob3J0IGVub3VnaCwgZG8gYSBHRVQuIHdlIGRvIHRoaXMgdG8gd29yayBhcm91bmRcbiAgICAgICAgLy8gU2FmYXJpIG5vdCB1bmRlcnN0YW5kaW5nIDMwNHMgb24gUE9TVHMgKHNlZSBwb3VjaGRiL3BvdWNoZGIjMTIzOSlcbiAgICAgICAgcGFyYW1zICs9IChwYXJhbXNbMF0gPT09ICc/JyA/ICcmJyA6ICc/JykgKyBrZXlzQXNTdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGJvZHkgPSB7a2V5czogb3B0cy5rZXlzfTtcbiAgICAgICAgfSBlbHNlIHsgLy8gZnVuIGlzIHttYXAgOiBtYXBmdW59LCBzbyBhcHBlbmQgdG8gdGhpc1xuICAgICAgICAgIGZ1bi5rZXlzID0gb3B0cy5rZXlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHJlZmVyZW5jaW5nIGEgcXVlcnkgZGVmaW5lZCBpbiB0aGUgZGVzaWduIGRvY1xuICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdW4pO1xuICAgICAgcmV0dXJuIGRiLmZldGNoKCdfZGVzaWduLycgKyBwYXJ0c1swXSArICcvX3ZpZXcvJyArIHBhcnRzWzFdICsgcGFyYW1zLCB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgb2sgPSByZXNwb25zZS5vaztcbiAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgIHRocm93IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmYWlsIHRoZSBlbnRpcmUgcmVxdWVzdCBpZiB0aGUgcmVzdWx0IGNvbnRhaW5zIGFuIGVycm9yXG4gICAgICAgIHJlc3VsdC5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChyb3cudmFsdWUgJiYgcm93LnZhbHVlLmVycm9yICYmIHJvdy52YWx1ZS5lcnJvciA9PT0gXCJidWlsdGluX3JlZHVjZV9lcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Iocm93LnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHVzaW5nIGEgdGVtcG9yYXJ5IHZpZXcsIHRlcnJpYmxlIGZvciBwZXJmb3JtYW5jZSwgZ29vZCBmb3IgdGVzdGluZ1xuICAgIGJvZHkgPSBib2R5IHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKGZ1bikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmdW5ba2V5XSkpIHtcbiAgICAgICAgYm9keVtrZXldID0gZnVuW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5W2tleV0gPSBmdW5ba2V5XS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRiLmZldGNoKCdfdGVtcF92aWV3JyArIHBhcmFtcywge1xuICAgICAgaGVhZGVyczogbmV3IGgoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBvayA9IHJlc3BvbnNlLm9rO1xuICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aHJvdyBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gIH1cblxuICAvLyBjdXN0b20gYWRhcHRlcnMgY2FuIGRlZmluZSB0aGVpciBvd24gYXBpLl9xdWVyeVxuICAvLyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZnVuY3Rpb24gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fcXVlcnkoZnVuLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGN1c3RvbSBhZGFwdGVycyBjYW4gZGVmaW5lIHRoZWlyIG93biBhcGkuX3ZpZXdDbGVhbnVwXG4gIC8vIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBjdXN0b21WaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fdmlld0NsZWFudXAoZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0c1RvKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocmVhc29uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gcmV0dXJucyBhIHByb21pc2UgZm9yIGEgbGlzdCBvZiBkb2NzIHRvIHVwZGF0ZSwgYmFzZWQgb24gdGhlIGlucHV0IGRvY0lkLlxuICAvLyB0aGUgb3JkZXIgZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2UgcG9zdC0zLjIuMCwgYnVsa0RvY3NcbiAgLy8gaXMgYW4gYXRvbWljIG9wZXJhdGlvbiBpbiBhbGwgdGhyZWUgYWRhcHRlcnMuXG4gIGZ1bmN0aW9uIGdldERvY3NUb1BlcnNpc3QoZG9jSWQsIHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKSB7XG4gICAgdmFyIG1ldGFEb2NJZCA9ICdfbG9jYWwvZG9jXycgKyBkb2NJZDtcbiAgICB2YXIgZGVmYXVsdE1ldGFEb2MgPSB7X2lkOiBtZXRhRG9jSWQsIGtleXM6IFtdfTtcbiAgICB2YXIgZG9jRGF0YSA9IGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLmdldChkb2NJZCk7XG4gICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IGRvY0RhdGFbMF07XG4gICAgdmFyIGNoYW5nZXMgPSBkb2NEYXRhWzFdO1xuXG4gICAgZnVuY3Rpb24gZ2V0TWV0YURvYygpIHtcbiAgICAgIGlmIChpc0dlbk9uZShjaGFuZ2VzKSkge1xuICAgICAgICAvLyBnZW5lcmF0aW9uIDEsIHNvIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGluaXRpYWwgc3RhdGVcbiAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKGF2b2lkcyB1bm5lY2Vzc2FyeSBHRVRzKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRlZmF1bHRNZXRhRG9jKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2aWV3LmRiLmdldChtZXRhRG9jSWQpLmNhdGNoKGRlZmF1bHRzVG8oZGVmYXVsdE1ldGFEb2MpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXlWYWx1ZURvY3MobWV0YURvYykge1xuICAgICAgaWYgKCFtZXRhRG9jLmtleXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIG5vIGtleXMsIG5vIG5lZWQgZm9yIGEgbG9va3VwXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jvd3M6IFtdfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmlldy5kYi5hbGxEb2NzKHtcbiAgICAgICAga2V5czogbWV0YURvYy5rZXlzLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKSB7XG4gICAgICB2YXIga3ZEb2NzID0gW107XG4gICAgICB2YXIgb2xkS2V5cyA9IG5ldyBFeHBvcnRlZFNldCgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0ga3ZEb2NzUmVzLnJvd3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IGt2RG9jc1Jlcy5yb3dzW2ldO1xuICAgICAgICB2YXIgZG9jID0gcm93LmRvYztcbiAgICAgICAgaWYgKCFkb2MpIHsgLy8gZGVsZXRlZFxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGt2RG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIG9sZEtleXMuYWRkKGRvYy5faWQpO1xuICAgICAgICBkb2MuX2RlbGV0ZWQgPSAhaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmhhcyhkb2MuX2lkKTtcbiAgICAgICAgaWYgKCFkb2MuX2RlbGV0ZWQpIHtcbiAgICAgICAgICB2YXIga2V5VmFsdWUgPSBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMuZ2V0KGRvYy5faWQpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBkb2MudmFsdWUgPSBrZXlWYWx1ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBuZXdLZXlzID0gbWFwVG9LZXlzQXJyYXkoaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKTtcbiAgICAgIG5ld0tleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghb2xkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIC8vIG5ldyBkb2NcbiAgICAgICAgICB2YXIga3ZEb2MgPSB7XG4gICAgICAgICAgICBfaWQ6IGtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIGtleVZhbHVlID0gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmdldChrZXkpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBrdkRvYy52YWx1ZSA9IGtleVZhbHVlLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrdkRvY3MucHVzaChrdkRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbWV0YURvYy5rZXlzID0gdW5pcShuZXdLZXlzLmNvbmNhdChtZXRhRG9jLmtleXMpKTtcbiAgICAgIGt2RG9jcy5wdXNoKG1ldGFEb2MpO1xuXG4gICAgICByZXR1cm4ga3ZEb2NzO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRNZXRhRG9jKCkudGhlbihmdW5jdGlvbiAobWV0YURvYykge1xuICAgICAgcmV0dXJuIGdldEtleVZhbHVlRG9jcyhtZXRhRG9jKS50aGVuKGZ1bmN0aW9uIChrdkRvY3NSZXMpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXBkYXRlcyBhbGwgZW1pdHRlZCBrZXkvdmFsdWUgZG9jcyBhbmQgbWV0YURvY3MgaW4gdGhlIG1ydmlldyBkYXRhYmFzZVxuICAvLyBmb3IgdGhlIGdpdmVuIGJhdGNoIG9mIGRvY3VtZW50cyBmcm9tIHRoZSBzb3VyY2UgZGF0YWJhc2VcbiAgZnVuY3Rpb24gc2F2ZUtleVZhbHVlcyh2aWV3LCBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cywgc2VxKSB7XG4gICAgdmFyIHNlcURvY0lkID0gJ19sb2NhbC9sYXN0U2VxJztcbiAgICByZXR1cm4gdmlldy5kYi5nZXQoc2VxRG9jSWQpXG4gICAgICAuY2F0Y2goZGVmYXVsdHNUbyh7X2lkOiBzZXFEb2NJZCwgc2VxOiAwfSkpXG4gICAgICAudGhlbihmdW5jdGlvbiAobGFzdFNlcURvYykge1xuICAgICAgICB2YXIgZG9jSWRzID0gbWFwVG9LZXlzQXJyYXkoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jSWRzLm1hcChmdW5jdGlvbiAoZG9jSWQpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RG9jc1RvUGVyc2lzdChkb2NJZCwgdmlldywgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAobGlzdE9mRG9jc1RvUGVyc2lzdCkge1xuICAgICAgICAgIHZhciBkb2NzVG9QZXJzaXN0ID0gZmxhdHRlbihsaXN0T2ZEb2NzVG9QZXJzaXN0KTtcbiAgICAgICAgICBsYXN0U2VxRG9jLnNlcSA9IHNlcTtcbiAgICAgICAgICBkb2NzVG9QZXJzaXN0LnB1c2gobGFzdFNlcURvYyk7XG4gICAgICAgICAgLy8gd3JpdGUgYWxsIGRvY3MgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLCB1cGRhdGUgdGhlIHNlcSBvbmNlXG4gICAgICAgICAgcmV0dXJuIHZpZXcuZGIuYnVsa0RvY3Moe2RvY3MgOiBkb2NzVG9QZXJzaXN0fSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRRdWV1ZSh2aWV3KSB7XG4gICAgdmFyIHZpZXdOYW1lID0gdHlwZW9mIHZpZXcgPT09ICdzdHJpbmcnID8gdmlldyA6IHZpZXcubmFtZTtcbiAgICB2YXIgcXVldWUgPSBwZXJzaXN0ZW50UXVldWVzW3ZpZXdOYW1lXTtcbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICBxdWV1ZSA9IHBlcnNpc3RlbnRRdWV1ZXNbdmlld05hbWVdID0gbmV3IFRhc2tRdWV1ZSQxKCk7XG4gICAgfVxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdXBkYXRlVmlld0luUXVldWUodmlldywgb3B0cyk7XG4gICAgfSkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXdJblF1ZXVlKHZpZXcsIG9wdHMpIHtcbiAgICAvLyBiaW5kIHRoZSBlbWl0IGZ1bmN0aW9uIG9uY2VcbiAgICB2YXIgbWFwUmVzdWx0cztcbiAgICB2YXIgZG9jO1xuXG4gICAgZnVuY3Rpb24gZW1pdChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb3V0cHV0ID0ge2lkOiBkb2MuX2lkLCBrZXk6IG5vcm1hbGl6ZUtleShrZXkpfTtcbiAgICAgIC8vIERvbid0IGV4cGxpY2l0bHkgc3RvcmUgdGhlIHZhbHVlIHVubGVzcyBpdCdzIGRlZmluZWQgYW5kIG5vbi1udWxsLlxuICAgICAgLy8gVGhpcyBzYXZlcyBvbiBzdG9yYWdlIHNwYWNlLCBiZWNhdXNlIG9mdGVuIHBlb3BsZSBkb24ndCB1c2UgaXQuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQudmFsdWUgPSBub3JtYWxpemVLZXkodmFsdWUpO1xuICAgICAgfVxuICAgICAgbWFwUmVzdWx0cy5wdXNoKG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIG1hcEZ1biA9IG1hcHBlcih2aWV3Lm1hcEZ1biwgZW1pdCk7XG5cbiAgICB2YXIgY3VycmVudFNlcSA9IHZpZXcuc2VxIHx8IDA7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzYXZlS2V5VmFsdWVzKHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXhlZF9kb2NzID0gMDtcbiAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICB2aWV3OiB2aWV3Lm5hbWUsXG4gICAgICBpbmRleGVkX2RvY3M6IGluZGV4ZWRfZG9jc1xuICAgIH07XG4gICAgdmlldy5zb3VyY2VEQi5lbWl0KCdpbmRleGluZycsIHByb2dyZXNzKTtcblxuICAgIHZhciBxdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc05leHRCYXRjaCgpIHtcbiAgICAgIHJldHVybiB2aWV3LnNvdXJjZURCLmNoYW5nZXMoe1xuICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSxcbiAgICAgICAgY29uZmxpY3RzOiB0cnVlLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICAgIHN0eWxlOiAnYWxsX2RvY3MnLFxuICAgICAgICBzaW5jZTogY3VycmVudFNlcSxcbiAgICAgICAgbGltaXQ6IG9wdHMuY2hhbmdlc19iYXRjaF9zaXplXG4gICAgICB9KS50aGVuKHByb2Nlc3NCYXRjaCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpO1xuICAgICAgcXVldWUuYWRkKHByb2Nlc3NDaGFuZ2UoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMsIGN1cnJlbnRTZXEpKTtcblxuICAgICAgaW5kZXhlZF9kb2NzID0gaW5kZXhlZF9kb2NzICsgcmVzdWx0cy5sZW5ndGg7XG4gICAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICAgIHZpZXc6IHZpZXcubmFtZSxcbiAgICAgICAgbGFzdF9zZXE6IHJlc3BvbnNlLmxhc3Rfc2VxLFxuICAgICAgICByZXN1bHRzX2NvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgaW5kZXhlZF9kb2NzOiBpbmRleGVkX2RvY3NcbiAgICAgIH07XG4gICAgICB2aWV3LnNvdXJjZURCLmVtaXQoJ2luZGV4aW5nJywgcHJvZ3Jlc3MpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPCBvcHRzLmNoYW5nZXNfYmF0Y2hfc2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvY2Vzc05leHRCYXRjaCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpIHtcbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IHJlc3VsdHNbaV07XG4gICAgICAgIGlmIChjaGFuZ2UuZG9jLl9pZFswXSAhPT0gJ18nKSB7XG4gICAgICAgICAgbWFwUmVzdWx0cyA9IFtdO1xuICAgICAgICAgIGRvYyA9IGNoYW5nZS5kb2M7XG5cbiAgICAgICAgICBpZiAoIWRvYy5fZGVsZXRlZCkge1xuICAgICAgICAgICAgdHJ5TWFwKHZpZXcuc291cmNlREIsIG1hcEZ1biwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwUmVzdWx0cy5zb3J0KHNvcnRCeUtleVRoZW5WYWx1ZSk7XG5cbiAgICAgICAgICB2YXIgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzID0gY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKG1hcFJlc3VsdHMpO1xuICAgICAgICAgIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLnNldChjaGFuZ2UuZG9jLl9pZCwgW1xuICAgICAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLFxuICAgICAgICAgICAgY2hhbmdlLmNoYW5nZXNcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50U2VxID0gY2hhbmdlLnNlcTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMobWFwUmVzdWx0cykge1xuICAgICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgdmFyIGxhc3RLZXk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbWFwUmVzdWx0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgZW1pdHRlZEtleVZhbHVlID0gbWFwUmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIGNvbXBsZXhLZXkgPSBbZW1pdHRlZEtleVZhbHVlLmtleSwgZW1pdHRlZEtleVZhbHVlLmlkXTtcbiAgICAgICAgaWYgKGkgPiAwICYmIGNvbGxhdGUoZW1pdHRlZEtleVZhbHVlLmtleSwgbGFzdEtleSkgPT09IDApIHtcbiAgICAgICAgICBjb21wbGV4S2V5LnB1c2goaSk7IC8vIGR1cCBrZXkraWQsIHNvIG1ha2UgaXQgdW5pcXVlXG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLnNldCh0b0luZGV4YWJsZVN0cmluZyhjb21wbGV4S2V5KSwgZW1pdHRlZEtleVZhbHVlKTtcbiAgICAgICAgbGFzdEtleSA9IGVtaXR0ZWRLZXlWYWx1ZS5rZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzTmV4dEJhdGNoKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVldWUuZmluaXNoKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2aWV3LnNlcSA9IGN1cnJlbnRTZXE7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWR1Y2VWaWV3KHZpZXcsIHJlc3VsdHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5ncm91cF9sZXZlbCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9wdGlvbnMuZ3JvdXBfbGV2ZWw7XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZEdyb3VwID0gb3B0aW9ucy5ncm91cCB8fCBvcHRpb25zLmdyb3VwX2xldmVsO1xuXG4gICAgdmFyIHJlZHVjZUZ1biA9IHJlZHVjZXIodmlldy5yZWR1Y2VGdW4pO1xuXG4gICAgdmFyIGdyb3VwcyA9IFtdO1xuICAgIHZhciBsdmwgPSBpc05hTihvcHRpb25zLmdyb3VwX2xldmVsKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6XG4gICAgICBvcHRpb25zLmdyb3VwX2xldmVsO1xuICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGxhc3QgPSBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIGdyb3VwS2V5ID0gc2hvdWxkR3JvdXAgPyBlLmtleSA6IG51bGw7XG5cbiAgICAgIC8vIG9ubHkgc2V0IGdyb3VwX2xldmVsIGZvciBhcnJheSBrZXlzXG4gICAgICBpZiAoc2hvdWxkR3JvdXAgJiYgQXJyYXkuaXNBcnJheShncm91cEtleSkpIHtcbiAgICAgICAgZ3JvdXBLZXkgPSBncm91cEtleS5zbGljZSgwLCBsdmwpO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdCAmJiBjb2xsYXRlKGxhc3QuZ3JvdXBLZXksIGdyb3VwS2V5KSA9PT0gMCkge1xuICAgICAgICBsYXN0LmtleXMucHVzaChbZS5rZXksIGUuaWRdKTtcbiAgICAgICAgbGFzdC52YWx1ZXMucHVzaChlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICBrZXlzOiBbW2Uua2V5LCBlLmlkXV0sXG4gICAgICAgIHZhbHVlczogW2UudmFsdWVdLFxuICAgICAgICBncm91cEtleTogZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZSA9IGdyb3Vwc1tpXTtcbiAgICAgIHZhciByZWR1Y2VUcnkgPSB0cnlSZWR1Y2Uodmlldy5zb3VyY2VEQiwgcmVkdWNlRnVuLCBlLmtleXMsIGUudmFsdWVzLCBmYWxzZSk7XG4gICAgICBpZiAocmVkdWNlVHJ5LmVycm9yICYmIHJlZHVjZVRyeS5lcnJvciBpbnN0YW5jZW9mIEJ1aWx0SW5FcnJvcikge1xuICAgICAgICAvLyBDb3VjaERCIHJldHVybnMgYW4gZXJyb3IgaWYgYSBidWlsdC1pbiBlcnJvcnMgb3V0XG4gICAgICAgIHRocm93IHJlZHVjZVRyeS5lcnJvcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIC8vIENvdWNoREIganVzdCBzZXRzIHRoZSB2YWx1ZSB0byBudWxsIGlmIGEgbm9uLWJ1aWx0LWluIGVycm9ycyBvdXRcbiAgICAgICAgdmFsdWU6IHJlZHVjZVRyeS5lcnJvciA/IG51bGwgOiByZWR1Y2VUcnkub3V0cHV0LFxuICAgICAgICBrZXk6IGUuZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBubyB0b3RhbF9yb3dzL29mZnNldCB3aGVuIHJlZHVjaW5nXG4gICAgcmV0dXJuIHtyb3dzOiBzbGljZVJlc3VsdHMocmVzdWx0cywgb3B0aW9ucy5saW1pdCwgb3B0aW9ucy5za2lwKX07XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKTtcbiAgICB9KSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKSB7XG4gICAgdmFyIHRvdGFsUm93cztcbiAgICB2YXIgc2hvdWxkUmVkdWNlID0gdmlldy5yZWR1Y2VGdW4gJiYgb3B0cy5yZWR1Y2UgIT09IGZhbHNlO1xuICAgIHZhciBza2lwID0gb3B0cy5za2lwIHx8IDA7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnICYmICFvcHRzLmtleXMubGVuZ3RoKSB7XG4gICAgICAvLyBlcXVpdmFsZW50IHF1ZXJ5XG4gICAgICBvcHRzLmxpbWl0ID0gMDtcbiAgICAgIGRlbGV0ZSBvcHRzLmtleXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmV0Y2hGcm9tVmlldyh2aWV3T3B0cykge1xuICAgICAgdmlld09wdHMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICAgIHJldHVybiB2aWV3LmRiLmFsbERvY3Modmlld09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB0b3RhbFJvd3MgPSByZXMudG90YWxfcm93cztcbiAgICAgICAgcmV0dXJuIHJlcy5yb3dzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG5cbiAgICAgICAgICAvLyBpbXBsaWNpdCBtaWdyYXRpb24gLSBpbiBvbGRlciB2ZXJzaW9ucyBvZiBQb3VjaERCLFxuICAgICAgICAgIC8vIHdlIGV4cGxpY2l0bHkgc3RvcmVkIHRoZSBkb2MgYXMge2lkOiAuLi4sIGtleTogLi4uLCB2YWx1ZTogLi4ufVxuICAgICAgICAgIC8vIHRoaXMgaXMgdGVzdGVkIGluIGEgbWlncmF0aW9uIHRlc3RcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIHJlc3VsdC5kb2MgJiYgdHlwZW9mIHJlc3VsdC5kb2MudmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICByZXN1bHQuZG9jLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdC5kb2MudmFsdWUpLnNvcnQoKTtcbiAgICAgICAgICAgIC8vIHRoaXMgZGV0ZWN0aW9uIG1ldGhvZCBpcyBub3QgcGVyZmVjdCwgYnV0IGl0J3MgdW5saWtlbHkgdGhlIHVzZXJcbiAgICAgICAgICAgIC8vIGVtaXR0ZWQgYSB2YWx1ZSB3aGljaCB3YXMgYW4gb2JqZWN0IHdpdGggdGhlc2UgMyBleGFjdCBrZXlzXG4gICAgICAgICAgICB2YXIgZXhwZWN0ZWRLZXlzID0gWydpZCcsICdrZXknLCAndmFsdWUnXTtcbiAgICAgICAgICAgIGlmICghKGtleXMgPCBleHBlY3RlZEtleXMgfHwga2V5cyA+IGV4cGVjdGVkS2V5cykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb2MudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHBhcnNlZEtleUFuZERvY0lkID0gcGFyc2VJbmRleGFibGVTdHJpbmcocmVzdWx0LmRvYy5faWQpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IHBhcnNlZEtleUFuZERvY0lkWzBdLFxuICAgICAgICAgICAgaWQ6IHBhcnNlZEtleUFuZERvY0lkWzFdLFxuICAgICAgICAgICAgdmFsdWU6ICgndmFsdWUnIGluIHJlc3VsdC5kb2MgPyByZXN1bHQuZG9jLnZhbHVlIDogbnVsbClcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTWFwUmVzdWx0c1JlYWR5KHJvd3MpIHtcbiAgICAgIHZhciBmaW5hbFJlc3VsdHM7XG4gICAgICBpZiAoc2hvdWxkUmVkdWNlKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHJlZHVjZVZpZXcodmlldywgcm93cywgb3B0cyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmtleXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHtcbiAgICAgICAgICB0b3RhbF9yb3dzOiB0b3RhbFJvd3MsXG4gICAgICAgICAgb2Zmc2V0OiBza2lwLFxuICAgICAgICAgIHJvd3M6IHJvd3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1cHBvcnQgbGltaXQsIHNraXAgZm9yIGtleXMgcXVlcnlcbiAgICAgICAgZmluYWxSZXN1bHRzID0ge1xuICAgICAgICAgIHRvdGFsX3Jvd3M6IHRvdGFsUm93cyxcbiAgICAgICAgICBvZmZzZXQ6IHNraXAsXG4gICAgICAgICAgcm93czogc2xpY2VSZXN1bHRzKHJvd3Msb3B0cy5saW1pdCxvcHRzLnNraXApXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgICAgZmluYWxSZXN1bHRzLnVwZGF0ZV9zZXEgPSB2aWV3LnNlcTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgICB2YXIgZG9jSWRzID0gdW5pcShyb3dzLm1hcChyb3dUb0RvY0lkKSk7XG5cbiAgICAgICAgcmV0dXJuIHZpZXcuc291cmNlREIuYWxsRG9jcyh7XG4gICAgICAgICAga2V5czogZG9jSWRzLFxuICAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZSxcbiAgICAgICAgICBjb25mbGljdHM6IG9wdHMuY29uZmxpY3RzLFxuICAgICAgICAgIGF0dGFjaG1lbnRzOiBvcHRzLmF0dGFjaG1lbnRzLFxuICAgICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWxsRG9jc1Jlcykge1xuICAgICAgICAgIHZhciBkb2NJZHNUb0RvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgICAgICBhbGxEb2NzUmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICBkb2NJZHNUb0RvY3Muc2V0KHJvdy5pZCwgcm93LmRvYyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHZhciBkb2NJZCA9IHJvd1RvRG9jSWQocm93KTtcbiAgICAgICAgICAgIHZhciBkb2MgPSBkb2NJZHNUb0RvY3MuZ2V0KGRvY0lkKTtcbiAgICAgICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgICAgcm93LmRvYyA9IGRvYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHRzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIga2V5cyA9IG9wdHMua2V5cztcbiAgICAgIHZhciBmZXRjaFByb21pc2VzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmlld09wdHMgPSB7XG4gICAgICAgICAgc3RhcnRrZXkgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5XSksXG4gICAgICAgICAgZW5ka2V5ICAgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5LCB7fV0pXG4gICAgICAgIH07XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgICAgdmlld09wdHMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZmV0Y2hQcm9taXNlcykudGhlbihmbGF0dGVuKS50aGVuKG9uTWFwUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgcXVlcnksIG5vICdrZXlzJ1xuICAgICAgdmFyIHZpZXdPcHRzID0ge1xuICAgICAgICBkZXNjZW5kaW5nIDogb3B0cy5kZXNjZW5kaW5nXG4gICAgICB9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgIHZpZXdPcHRzLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXJ0a2V5O1xuICAgICAgdmFyIGVuZGtleTtcbiAgICAgIGlmICgnc3RhcnRfa2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ3N0YXJ0a2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydGtleTtcbiAgICAgIH1cbiAgICAgIGlmICgnZW5kX2tleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ2VuZGtleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZGtleTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3RhcnRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0gb3B0cy5kZXNjZW5kaW5nID9cbiAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhbc3RhcnRrZXksIHt9XSkgOlxuICAgICAgICAgIHRvSW5kZXhhYmxlU3RyaW5nKFtzdGFydGtleV0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBlbmRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpbmNsdXNpdmVFbmQgPSBvcHRzLmluY2x1c2l2ZV9lbmQgIT09IGZhbHNlO1xuICAgICAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICAgICAgaW5jbHVzaXZlRW5kID0gIWluY2x1c2l2ZUVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IHRvSW5kZXhhYmxlU3RyaW5nKFxuICAgICAgICAgIGluY2x1c2l2ZUVuZCA/IFtlbmRrZXksIHt9XSA6IFtlbmRrZXldKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5rZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBrZXlTdGFydCA9IHRvSW5kZXhhYmxlU3RyaW5nKFtvcHRzLmtleV0pO1xuICAgICAgICB2YXIga2V5RW5kID0gdG9JbmRleGFibGVTdHJpbmcoW29wdHMua2V5LCB7fV0pO1xuICAgICAgICBpZiAodmlld09wdHMuZGVzY2VuZGluZykge1xuICAgICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IGtleVN0YXJ0O1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5RW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5U3RhcnQ7XG4gICAgICAgICAgdmlld09wdHMuZW5ka2V5ID0ga2V5RW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNob3VsZFJlZHVjZSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdmlld09wdHMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIHZpZXdPcHRzLnNraXAgPSBza2lwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpLnRoZW4ob25NYXBSZXN1bHRzUmVhZHkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGh0dHBWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5mZXRjaCgnX3ZpZXdfY2xlYW51cCcsIHtcbiAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYWxWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5nZXQoJ19sb2NhbC8nICsgbG9jYWxEb2NOYW1lKS50aGVuKGZ1bmN0aW9uIChtZXRhRG9jKSB7XG4gICAgICB2YXIgZG9jc1RvVmlld3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgIE9iamVjdC5rZXlzKG1ldGFEb2Mudmlld3MpLmZvckVhY2goZnVuY3Rpb24gKGZ1bGxWaWV3TmFtZSkge1xuICAgICAgICB2YXIgcGFydHMgPSBwYXJzZVZpZXdOYW1lKGZ1bGxWaWV3TmFtZSk7XG4gICAgICAgIHZhciBkZXNpZ25Eb2NOYW1lID0gJ19kZXNpZ24vJyArIHBhcnRzWzBdO1xuICAgICAgICB2YXIgdmlld05hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgdmFyIHZpZXdzID0gZG9jc1RvVmlld3MuZ2V0KGRlc2lnbkRvY05hbWUpO1xuICAgICAgICBpZiAoIXZpZXdzKSB7XG4gICAgICAgICAgdmlld3MgPSBuZXcgRXhwb3J0ZWRTZXQoKTtcbiAgICAgICAgICBkb2NzVG9WaWV3cy5zZXQoZGVzaWduRG9jTmFtZSwgdmlld3MpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXdzLmFkZCh2aWV3TmFtZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICBrZXlzIDogbWFwVG9LZXlzQXJyYXkoZG9jc1RvVmlld3MpLFxuICAgICAgICBpbmNsdWRlX2RvY3MgOiB0cnVlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRiLmFsbERvY3Mob3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHZhciB2aWV3c1RvU3RhdHVzID0ge307XG4gICAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHZhciBkZG9jTmFtZSA9IHJvdy5rZXkuc3Vic3RyaW5nKDgpOyAvLyBjdXRzIG9mZiAnX2Rlc2lnbi8nXG4gICAgICAgICAgZG9jc1RvVmlld3MuZ2V0KHJvdy5rZXkpLmZvckVhY2goZnVuY3Rpb24gKHZpZXdOYW1lKSB7XG4gICAgICAgICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZGRvY05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKCFtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pIHtcbiAgICAgICAgICAgICAgLy8gbmV3IGZvcm1hdCwgd2l0aG91dCBzbGFzaGVzLCB0byBzdXBwb3J0IFBvdWNoREIgMi4yLjBcbiAgICAgICAgICAgICAgLy8gbWlncmF0aW9uIHRlc3QgaW4gcG91Y2hkYidzIGJyb3dzZXIubWlncmF0aW9uLmpzIHZlcmlmaWVzIHRoaXNcbiAgICAgICAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmlld0RCTmFtZXMgPSBPYmplY3Qua2V5cyhtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pO1xuICAgICAgICAgICAgLy8gZGVzaWduIGRvYyBkZWxldGVkLCBvciB2aWV3IGZ1bmN0aW9uIG5vbmV4aXN0ZW50XG4gICAgICAgICAgICB2YXIgc3RhdHVzSXNHb29kID0gcm93LmRvYyAmJiByb3cuZG9jLnZpZXdzICYmXG4gICAgICAgICAgICAgIHJvdy5kb2Mudmlld3Nbdmlld05hbWVdO1xuICAgICAgICAgICAgdmlld0RCTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAodmlld0RCTmFtZSkge1xuICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdID1cbiAgICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdIHx8IHN0YXR1c0lzR29vZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGRic1RvRGVsZXRlID0gT2JqZWN0LmtleXModmlld3NUb1N0YXR1cykuZmlsdGVyKFxuICAgICAgICAgIGZ1bmN0aW9uICh2aWV3REJOYW1lKSB7IHJldHVybiAhdmlld3NUb1N0YXR1c1t2aWV3REJOYW1lXTsgfSk7XG4gICAgICAgIHZhciBkZXN0cm95UHJvbWlzZXMgPSBkYnNUb0RlbGV0ZS5tYXAoZnVuY3Rpb24gKHZpZXdEQk5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gc2VxdWVudGlhbGl6ZShnZXRRdWV1ZSh2aWV3REJOYW1lKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBkYi5jb25zdHJ1Y3Rvcih2aWV3REJOYW1lLCBkYi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRlc3Ryb3lQcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZX07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgZGVmYXVsdHNUbyh7b2s6IHRydWV9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3F1ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuICAgIGlmIChpc1JlbW90ZShkYikpIHtcbiAgICAgIHJldHVybiBodHRwUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZVZpZXdPcHRzID0ge1xuICAgICAgY2hhbmdlc19iYXRjaF9zaXplOiBkYi5fX29wdHMudmlld191cGRhdGVfY2hhbmdlc19iYXRjaF9zaXplIHx8IENIQU5HRVNfQkFUQ0hfU0laRSQxXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZnVuICE9PSAnc3RyaW5nJykge1xuICAgICAgLy8gdGVtcF92aWV3XG4gICAgICBjaGVja1F1ZXJ5UGFyc2VFcnJvcihvcHRzLCBmdW4pO1xuXG4gICAgICB0ZW1wVmlld1F1ZXVlLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGVWaWV3UHJvbWlzZSA9IGNyZWF0ZVZpZXcoXG4gICAgICAgICAgLyogc291cmNlREIgKi8gZGIsXG4gICAgICAgICAgLyogdmlld05hbWUgKi8gJ3RlbXBfdmlldy90ZW1wX3ZpZXcnLFxuICAgICAgICAgIC8qIG1hcEZ1biAqLyBmdW4ubWFwLFxuICAgICAgICAgIC8qIHJlZHVjZUZ1biAqLyBmdW4ucmVkdWNlLFxuICAgICAgICAgIC8qIHRlbXBvcmFyeSAqLyB0cnVlLFxuICAgICAgICAgIC8qIGxvY2FsRG9jTmFtZSAqLyBsb2NhbERvY05hbWUpO1xuICAgICAgICByZXR1cm4gY3JlYXRlVmlld1Byb21pc2UudGhlbihmdW5jdGlvbiAodmlldykge1xuICAgICAgICAgIHJldHVybiBmaW4odXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlcnlWaWV3KHZpZXcsIG9wdHMpO1xuICAgICAgICAgIH0pLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5kYi5kZXN0cm95KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGVtcFZpZXdRdWV1ZS5maW5pc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGVyc2lzdGVudCB2aWV3XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZnVuO1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdWxsVmlld05hbWUpO1xuICAgICAgdmFyIGRlc2lnbkRvY05hbWUgPSBwYXJ0c1swXTtcbiAgICAgIHZhciB2aWV3TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgcmV0dXJuIGRiLmdldCgnX2Rlc2lnbi8nICsgZGVzaWduRG9jTmFtZSkudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIHZhciBmdW4gPSBkb2Mudmlld3MgJiYgZG9jLnZpZXdzW3ZpZXdOYW1lXTtcblxuICAgICAgICBpZiAoIWZ1bikge1xuICAgICAgICAgIC8vIGJhc2ljIHZhbGlkYXRvcjsgaXQncyBhc3N1bWVkIHRoYXQgZXZlcnkgc3ViY2xhc3Mgd291bGQgd2FudCB0aGlzXG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ2Rkb2MgJyArIGRvYy5faWQgKyAnIGhhcyBubyB2aWV3IG5hbWVkICcgK1xuICAgICAgICAgICAgdmlld05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGRvY1ZhbGlkYXRvcihkb2MsIHZpZXdOYW1lKTtcbiAgICAgICAgY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0cywgZnVuKTtcblxuICAgICAgICB2YXIgY3JlYXRlVmlld1Byb21pc2UgPSBjcmVhdGVWaWV3KFxuICAgICAgICAgIC8qIHNvdXJjZURCICovIGRiLFxuICAgICAgICAgIC8qIHZpZXdOYW1lICovIGZ1bGxWaWV3TmFtZSxcbiAgICAgICAgICAvKiBtYXBGdW4gKi8gZnVuLm1hcCxcbiAgICAgICAgICAvKiByZWR1Y2VGdW4gKi8gZnVuLnJlZHVjZSxcbiAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8gZmFsc2UsXG4gICAgICAgICAgLyogbG9jYWxEb2NOYW1lICovIGxvY2FsRG9jTmFtZSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVWaWV3UHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgaWYgKG9wdHMuc3RhbGUgPT09ICdvaycgfHwgb3B0cy5zdGFsZSA9PT0gJ3VwZGF0ZV9hZnRlcicpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLnN0YWxlID09PSAndXBkYXRlX2FmdGVyJykge1xuICAgICAgICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXcodmlldywgdXBkYXRlVmlld09wdHMpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gc3RhbGUgbm90IG9rXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWJzdHJhY3RRdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IG9wdHMgPyBjb2VyY2VPcHRpb25zKG9wdHMpIDoge307XG5cbiAgICBpZiAodHlwZW9mIGZ1biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZnVuID0ge21hcCA6IGZ1bn07XG4gICAgfVxuXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpO1xuICAgIH0pO1xuICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgdmFyIGFic3RyYWN0Vmlld0NsZWFudXAgPSBjYWxsYmFja2lmeShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3ZpZXdDbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tVmlld0NsZWFudXAoZGIpO1xuICAgIH1cbiAgICBpZiAoaXNSZW1vdGUoZGIpKSB7XG4gICAgICByZXR1cm4gaHR0cFZpZXdDbGVhbnVwKGRiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlld0NsZWFudXAoZGIpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHF1ZXJ5OiBhYnN0cmFjdFF1ZXJ5LFxuICAgIHZpZXdDbGVhbnVwOiBhYnN0cmFjdFZpZXdDbGVhbnVwXG4gIH07XG59XG5cbnZhciBidWlsdEluUmVkdWNlID0ge1xuICBfc3VtOiBmdW5jdGlvbiAoa2V5cywgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHN1bSh2YWx1ZXMpO1xuICB9LFxuXG4gIF9jb3VudDogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoO1xuICB9LFxuXG4gIF9zdGF0czogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIC8vIG5vIG5lZWQgdG8gaW1wbGVtZW50IHJlcmVkdWNlPXRydWUsIGJlY2F1c2UgUG91Y2hcbiAgICAvLyB3aWxsIG5ldmVyIGNhbGwgaXRcbiAgICBmdW5jdGlvbiBzdW1zcXIodmFsdWVzKSB7XG4gICAgICB2YXIgX3N1bXNxciA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgICAgIF9zdW1zcXIgKz0gKG51bSAqIG51bSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3N1bXNxcjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1bSAgICAgOiBzdW0odmFsdWVzKSxcbiAgICAgIG1pbiAgICAgOiBNYXRoLm1pbi5hcHBseShudWxsLCB2YWx1ZXMpLFxuICAgICAgbWF4ICAgICA6IE1hdGgubWF4LmFwcGx5KG51bGwsIHZhbHVlcyksXG4gICAgICBjb3VudCAgIDogdmFsdWVzLmxlbmd0aCxcbiAgICAgIHN1bXNxciA6IHN1bXNxcih2YWx1ZXMpXG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpIHtcbiAgaWYgKC9eX3N1bS8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX3N1bTtcbiAgfSBlbHNlIGlmICgvXl9jb3VudC8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX2NvdW50O1xuICB9IGVsc2UgaWYgKC9eX3N0YXRzLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICByZXR1cm4gYnVpbHRJblJlZHVjZS5fc3RhdHM7XG4gIH0gZWxzZSBpZiAoL15fLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVkdWNlRnVuU3RyaW5nICsgJyBpcyBub3QgYSBzdXBwb3J0ZWQgcmVkdWNlIGZ1bmN0aW9uLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcHBlcihtYXBGdW4sIGVtaXQpIHtcbiAgLy8gZm9yIHRlbXBfdmlld3Mgb25lIGNhbiB1c2UgZW1pdChkb2MsIGVtaXQpLCBzZWUgIzM4XG4gIGlmICh0eXBlb2YgbWFwRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgbWFwRnVuLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBvcmlnTWFwID0gbWFwRnVuO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZG9jKSB7XG4gICAgICByZXR1cm4gb3JpZ01hcChkb2MsIGVtaXQpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV2YWxGdW5jdGlvbldpdGhFdmFsKG1hcEZ1bi50b1N0cmluZygpLCBlbWl0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VyKHJlZHVjZUZ1bikge1xuICB2YXIgcmVkdWNlRnVuU3RyaW5nID0gcmVkdWNlRnVuLnRvU3RyaW5nKCk7XG4gIHZhciBidWlsdEluID0gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpO1xuICBpZiAoYnVpbHRJbikge1xuICAgIHJldHVybiBidWlsdEluO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBldmFsRnVuY3Rpb25XaXRoRXZhbChyZWR1Y2VGdW5TdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRkb2NWYWxpZGF0b3IoZGRvYywgdmlld05hbWUpIHtcbiAgdmFyIGZ1biA9IGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZV07XG4gIGlmICh0eXBlb2YgZnVuLm1hcCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignZGRvYyAnICsgZGRvYy5faWQgKyAnIGhhcyBubyBzdHJpbmcgdmlldyBuYW1lZCAnICtcbiAgICAgIHZpZXdOYW1lICsgJywgaW5zdGVhZCBmb3VuZCBvYmplY3Qgb2YgdHlwZTogJyArIHR5cGVvZiBmdW4ubWFwKTtcbiAgfVxufVxuXG52YXIgbG9jYWxEb2NOYW1lID0gJ21ydmlld3MnO1xudmFyIGFic3RyYWN0ID0gY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UobG9jYWxEb2NOYW1lLCBtYXBwZXIsIHJlZHVjZXIsIGRkb2NWYWxpZGF0b3IpO1xuXG5mdW5jdGlvbiBxdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhYnN0cmFjdC5xdWVyeS5jYWxsKHRoaXMsIGZ1biwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiB2aWV3Q2xlYW51cChjYWxsYmFjaykge1xuICByZXR1cm4gYWJzdHJhY3Qudmlld0NsZWFudXAuY2FsbCh0aGlzLCBjYWxsYmFjayk7XG59XG5cbnZhciBtYXByZWR1Y2UgPSB7XG4gIHF1ZXJ5OiBxdWVyeSxcbiAgdmlld0NsZWFudXA6IHZpZXdDbGVhbnVwXG59O1xuXG5mdW5jdGlvbiBpc0dlbk9uZSQxKHJldikge1xuICByZXR1cm4gL14xLS8udGVzdChyZXYpO1xufVxuXG5mdW5jdGlvbiBmaWxlSGFzQ2hhbmdlZChsb2NhbERvYywgcmVtb3RlRG9jLCBmaWxlbmFtZSkge1xuICByZXR1cm4gIWxvY2FsRG9jLl9hdHRhY2htZW50cyB8fFxuICAgICAgICAgIWxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0gfHxcbiAgICAgICAgIGxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0uZGlnZXN0ICE9PSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXS5kaWdlc3Q7XG59XG5cbmZ1bmN0aW9uIGdldERvY0F0dGFjaG1lbnRzKGRiLCBkb2MpIHtcbiAgdmFyIGZpbGVuYW1lcyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZW5hbWVzLm1hcChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gZGIuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSwge3JldjogZG9jLl9yZXZ9KTtcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXREb2NBdHRhY2htZW50c0Zyb21UYXJnZXRPclNvdXJjZSh0YXJnZXQsIHNyYywgZG9jKSB7XG4gIHZhciBkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cyA9IGlzUmVtb3RlKHNyYykgJiYgIWlzUmVtb3RlKHRhcmdldCk7XG4gIHZhciBmaWxlbmFtZXMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcblxuICBpZiAoIWRvQ2hlY2tGb3JMb2NhbEF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQuZ2V0KGRvYy5faWQpLnRoZW4oZnVuY3Rpb24gKGxvY2FsRG9jKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICBpZiAoZmlsZUhhc0NoYW5nZWQobG9jYWxEb2MsIGRvYywgZmlsZW5hbWUpKSB7XG4gICAgICAgIHJldHVybiBzcmMuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQuZ2V0QXR0YWNobWVudChsb2NhbERvYy5faWQsIGZpbGVuYW1lKTtcbiAgICB9KSk7XG4gIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKSB7XG4gIHZhciByZXF1ZXN0cyA9IFtdO1xuICBPYmplY3Qua2V5cyhkaWZmcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbWlzc2luZ1JldnMgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICBtaXNzaW5nUmV2cy5mb3JFYWNoKGZ1bmN0aW9uIChtaXNzaW5nUmV2KSB7XG4gICAgICByZXF1ZXN0cy5wdXNoKHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICByZXY6IG1pc3NpbmdSZXZcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGRvY3M6IHJlcXVlc3RzLFxuICAgIHJldnM6IHRydWUsXG4gICAgbGF0ZXN0OiB0cnVlXG4gIH07XG59XG5cbi8vXG4vLyBGZXRjaCBhbGwgdGhlIGRvY3VtZW50cyBmcm9tIHRoZSBzcmMgYXMgZGVzY3JpYmVkIGluIHRoZSBcImRpZmZzXCIsXG4vLyB3aGljaCBpcyBhIG1hcHBpbmcgb2YgZG9jcyBJRHMgdG8gcmV2aXNpb25zLiBJZiB0aGUgc3RhdGUgZXZlclxuLy8gY2hhbmdlcyB0byBcImNhbmNlbGxlZFwiLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4vLyBFbHNlIGl0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhIGxpc3Qgb2YgZmV0Y2hlZCBkb2N1bWVudHMuXG4vL1xuZnVuY3Rpb24gZ2V0RG9jcyhzcmMsIHRhcmdldCwgZGlmZnMsIHN0YXRlKSB7XG4gIGRpZmZzID0gY2xvbmUoZGlmZnMpOyAvLyB3ZSBkbyBub3QgbmVlZCB0byBtb2RpZnkgdGhpc1xuXG4gIHZhciByZXN1bHREb2NzID0gW10sXG4gICAgICBvayA9IHRydWU7XG5cbiAgZnVuY3Rpb24gZ2V0QWxsRG9jcygpIHtcblxuICAgIHZhciBidWxrR2V0T3B0cyA9IGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKTtcblxuICAgIGlmICghYnVsa0dldE9wdHMuZG9jcy5sZW5ndGgpIHsgLy8gb3B0aW1pemF0aW9uOiBza2lwIGVtcHR5IHJlcXVlc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNyYy5idWxrR2V0KGJ1bGtHZXRPcHRzKS50aGVuKGZ1bmN0aW9uIChidWxrR2V0UmVzcG9uc2UpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHN0YXRlLmNhbmNlbGxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRSZXNwb25zZS5yZXN1bHRzLm1hcChmdW5jdGlvbiAoYnVsa0dldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRJbmZvLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgICB2YXIgcmVtb3RlRG9jID0gZG9jLm9rO1xuXG4gICAgICAgICAgaWYgKGRvYy5lcnJvcikge1xuICAgICAgICAgICAgLy8gd2hlbiBBVVRPX0NPTVBBQ1RJT04gaXMgc2V0LCBkb2NzIGNhbiBiZSByZXR1cm5lZCB3aGljaCBsb29rXG4gICAgICAgICAgICAvLyBsaWtlIHRoaXM6IHtcIm1pc3NpbmdcIjpcIjEtN2MzYWMyNTZiNjkzYzQ2MmFmODQ0MmY5OTJiODM2OTZcIn1cbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFyZW1vdGVEb2MgfHwgIXJlbW90ZURvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdGVEb2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlKHRhcmdldCwgc3JjLCByZW1vdGVEb2MpXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMocmVtb3RlRG9jLl9hdHRhY2htZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoYXR0YWNobWVudCwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHQgPSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lc1tpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dC5kYXRhID0gYXR0YWNobWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW90ZURvYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9KSlcblxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgcmVzdWx0RG9jcyA9IHJlc3VsdERvY3MuY29uY2F0KGZsYXR0ZW4ocmVzdWx0cykuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzQXR0YWNobWVudHMoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5fYXR0YWNobWVudHMgJiYgT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0NvbmZsaWN0cyhkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9jb25mbGljdHMgJiYgZG9jLl9jb25mbGljdHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcykge1xuICAgIC8vIE9wdGltaXphdGlvbjogZmV0Y2ggZ2VuLTEgZG9jcyBhbmQgYXR0YWNobWVudHMgaW5cbiAgICAvLyBhIHNpbmdsZSByZXF1ZXN0IHVzaW5nIF9hbGxfZG9jc1xuICAgIHJldHVybiBzcmMuYWxsRG9jcyh7XG4gICAgICBrZXlzOiBpZHMsXG4gICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICBjb25mbGljdHM6IHRydWVcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChzdGF0ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICBpZiAocm93LmRlbGV0ZWQgfHwgIXJvdy5kb2MgfHwgIWlzR2VuT25lJDEocm93LnZhbHVlLnJldikgfHxcbiAgICAgICAgICAgIGhhc0F0dGFjaG1lbnRzKHJvdy5kb2MpIHx8IGhhc0NvbmZsaWN0cyhyb3cuZG9jKSkge1xuICAgICAgICAgIC8vIGlmIGFueSBvZiB0aGVzZSBjb25kaXRpb25zIGFwcGx5LCB3ZSBuZWVkIHRvIGZldGNoIHVzaW5nIGdldCgpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RyaXAgX2NvbmZsaWN0cyBhcnJheSB0byBhcHBlYXNlIENTRyAoIzU3OTMpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocm93LmRvYy5fY29uZmxpY3RzKSB7XG4gICAgICAgICAgZGVsZXRlIHJvdy5kb2MuX2NvbmZsaWN0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBkb2Mgd2UgZ290IGJhY2sgZnJvbSBhbGxEb2NzKCkgaXMgc3VmZmljaWVudFxuICAgICAgICByZXN1bHREb2NzLnB1c2gocm93LmRvYyk7XG4gICAgICAgIGRlbGV0ZSBkaWZmc1tyb3cuaWRdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXZpc2lvbk9uZURvY3MoKSB7XG4gICAgLy8gZmlsdGVyIG91dCB0aGUgZ2VuZXJhdGlvbiAxIGRvY3MgYW5kIGdldCB0aGVtXG4gICAgLy8gbGVhdmluZyB0aGUgbm9uLWdlbmVyYXRpb24gb25lIGRvY3MgdG8gYmUgZ290IG90aGVyd2lzZVxuICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyhkaWZmcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgICAgdmFyIG1pc3NpbmcgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICAgIHJldHVybiBtaXNzaW5nLmxlbmd0aCA9PT0gMSAmJiBpc0dlbk9uZSQxKG1pc3NpbmdbMF0pO1xuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmV0dXJuUmVzdWx0KCkge1xuICAgIHJldHVybiB7IG9rOm9rLCBkb2NzOnJlc3VsdERvY3MgfTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKGdldFJldmlzaW9uT25lRG9jcylcbiAgICAudGhlbihnZXRBbGxEb2NzKVxuICAgIC50aGVuKHJldHVyblJlc3VsdCk7XG59XG5cbnZhciBDSEVDS1BPSU5UX1ZFUlNJT04gPSAxO1xudmFyIFJFUExJQ0FUT1IgPSBcInBvdWNoZGJcIjtcbi8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IG51bWJlciB0byBsaW1pdCB0aGVcbi8vIGFtb3VudCBvZiByZXBsaWNhdGlvbiBoaXN0b3J5IHdlIHNhdmUgaW4gdGhlIGNoZWNrcG9pbnQuXG4vLyBJZiB3ZSBzYXZlIHRvbyBtdWNoLCB0aGUgY2hlY2twb2luZyBkb2NzIHdpbGwgYmVjb21lIHZlcnkgYmlnLFxuLy8gaWYgd2Ugc2F2ZSBmZXdlciwgd2UnbGwgcnVuIGEgZ3JlYXRlciByaXNrIG9mIGhhdmluZyB0b1xuLy8gcmVhZCBhbGwgdGhlIGNoYW5nZXMgZnJvbSAwIHdoZW4gY2hlY2twb2ludCBQVVRzIGZhaWxcbi8vIENvdWNoREIgMi4wIGhhcyBhIG1vcmUgaW52b2x2ZWQgaGlzdG9yeSBwcnVuaW5nLFxuLy8gYnV0IGxldCdzIGdvIGZvciB0aGUgc2ltcGxlIHZlcnNpb24gZm9yIG5vdy5cbnZhciBDSEVDS1BPSU5UX0hJU1RPUllfU0laRSA9IDU7XG52YXIgTE9XRVNUX1NFUSA9IDA7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrcG9pbnQoZGIsIGlkLCBjaGVja3BvaW50LCBzZXNzaW9uLCByZXR1cm5WYWx1ZSkge1xuICByZXR1cm4gZGIuZ2V0KGlkKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgaWYgKGRiLmFkYXB0ZXIgPT09ICdodHRwJyB8fCBkYi5hZGFwdGVyID09PSAnaHR0cHMnKSB7XG4gICAgICAgIGV4cGxhaW5FcnJvcihcbiAgICAgICAgICA0MDQsICdQb3VjaERCIGlzIGp1c3QgY2hlY2tpbmcgaWYgYSByZW1vdGUgY2hlY2twb2ludCBleGlzdHMuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbixcbiAgICAgICAgX2lkOiBpZCxcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIHJlcGxpY2F0b3I6IFJFUExJQ0FUT1IsXG4gICAgICAgIHZlcnNpb246IENIRUNLUE9JTlRfVkVSU0lPTlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGNoZWNrcG9pbnQgaGFzIG5vdCBjaGFuZ2VkLCBkbyBub3QgdXBkYXRlXG4gICAgaWYgKGRvYy5sYXN0X3NlcSA9PT0gY2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgY3VycmVudCBlbnRyeSBmb3IgdGhpcyByZXBsaWNhdGlvblxuICAgIGRvYy5oaXN0b3J5ID0gKGRvYy5oaXN0b3J5IHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLnNlc3Npb25faWQgIT09IHNlc3Npb247XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIGxhdGVzdCBjaGVja3BvaW50IHRvIGhpc3RvcnlcbiAgICBkb2MuaGlzdG9yeS51bnNoaWZ0KHtcbiAgICAgIGxhc3Rfc2VxOiBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvblxuICAgIH0pO1xuXG4gICAgLy8gSnVzdCB0YWtlIHRoZSBsYXN0IHBpZWNlcyBpbiBoaXN0b3J5LCB0b1xuICAgIC8vIGF2b2lkIHJlYWxseSBiaWcgY2hlY2twb2ludCBkb2NzLlxuICAgIC8vIHNlZSBjb21tZW50IG9uIGhpc3Rvcnkgc2l6ZSBhYm92ZVxuICAgIGRvYy5oaXN0b3J5ID0gZG9jLmhpc3Rvcnkuc2xpY2UoMCwgQ0hFQ0tQT0lOVF9ISVNUT1JZX1NJWkUpO1xuXG4gICAgZG9jLnZlcnNpb24gPSBDSEVDS1BPSU5UX1ZFUlNJT047XG4gICAgZG9jLnJlcGxpY2F0b3IgPSBSRVBMSUNBVE9SO1xuXG4gICAgZG9jLnNlc3Npb25faWQgPSBzZXNzaW9uO1xuICAgIGRvYy5sYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG5cbiAgICByZXR1cm4gZGIucHV0KGRvYykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAvLyByZXRyeTsgc29tZW9uZSBpcyB0cnlpbmcgdG8gd3JpdGUgYSBjaGVja3BvaW50IHNpbXVsdGFuZW91c2x5XG4gICAgICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KGRiLCBpZCwgY2hlY2twb2ludCwgc2Vzc2lvbiwgcmV0dXJuVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gQ2hlY2twb2ludGVyKHNyYywgdGFyZ2V0LCBpZCwgcmV0dXJuVmFsdWUsIG9wdHMpIHtcbiAgdGhpcy5zcmMgPSBzcmM7XG4gIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICB0aGlzLmlkID0gaWQ7XG4gIHRoaXMucmV0dXJuVmFsdWUgPSByZXR1cm5WYWx1ZTtcbiAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fTtcbn1cblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS53cml0ZUNoZWNrcG9pbnQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiB0aGlzLnVwZGF0ZVRhcmdldChjaGVja3BvaW50LCBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZi51cGRhdGVTb3VyY2UoY2hlY2twb2ludCwgc2Vzc2lvbik7XG4gIH0pO1xufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVUYXJnZXQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCkge1xuICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KHRoaXMudGFyZ2V0LCB0aGlzLmlkLCBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbiwgdGhpcy5yZXR1cm5WYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVTb3VyY2UgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gdXBkYXRlQ2hlY2twb2ludCh0aGlzLnNyYywgdGhpcy5pZCwgY2hlY2twb2ludCxcbiAgICAgIHNlc3Npb24sIHRoaXMucmV0dXJuVmFsdWUpXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoaXNGb3JiaWRkZW5FcnJvcihlcnIpKSB7XG4gICAgICAgICAgc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn07XG5cbnZhciBjb21wYXJpc29ucyA9IHtcbiAgXCJ1bmRlZmluZWRcIjogZnVuY3Rpb24gKHRhcmdldERvYywgc291cmNlRG9jKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcHJldmlvdXMgY29tcGFyaXNvbiBmdW5jdGlvblxuICAgIGlmIChjb2xsYXRlKHRhcmdldERvYy5sYXN0X3NlcSwgc291cmNlRG9jLmxhc3Rfc2VxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNvdXJjZURvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgXCIxXCI6IGZ1bmN0aW9uICh0YXJnZXREb2MsIHNvdXJjZURvYykge1xuICAgIC8vIFRoaXMgaXMgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gcG9ydGVkIGZyb20gQ291Y2hEQlxuICAgIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNvdXJjZURvYywgdGFyZ2V0RG9jKS5sYXN0X3NlcTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS5nZXRDaGVja3BvaW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHNlbGYub3B0cyAmJiBzZWxmLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50ICYmICFzZWxmLm9wdHMud3JpdGVUYXJnZXRDaGVja3BvaW50KSB7XG4gICAgcmV0dXJuIHNlbGYuc3JjLmdldChzZWxmLmlkKS50aGVuKGZ1bmN0aW9uIChzb3VyY2VEb2MpIHtcbiAgICAgIHJldHVybiBzb3VyY2VEb2MubGFzdF9zZXEgfHwgTE9XRVNUX1NFUTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc2VsZi50YXJnZXQuZ2V0KHNlbGYuaWQpLnRoZW4oZnVuY3Rpb24gKHRhcmdldERvYykge1xuICAgIGlmIChzZWxmLm9wdHMgJiYgc2VsZi5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCAmJiAhc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuIHRhcmdldERvYy5sYXN0X3NlcSB8fCBMT1dFU1RfU0VRO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnNyYy5nZXQoc2VsZi5pZCkudGhlbihmdW5jdGlvbiAoc291cmNlRG9jKSB7XG4gICAgICAvLyBTaW5jZSB3ZSBjYW4ndCBtaWdyYXRlIGFuIG9sZCB2ZXJzaW9uIGRvYyB0byBhIG5ldyBvbmVcbiAgICAgIC8vIChubyBzZXNzaW9uIGlkKSwgd2UganVzdCBnbyB3aXRoIHRoZSBsb3dlc3Qgc2VxIGluIHRoaXMgY2FzZVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodGFyZ2V0RG9jLnZlcnNpb24gIT09IHNvdXJjZURvYy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVyc2lvbjtcbiAgICAgIGlmICh0YXJnZXREb2MudmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uID0gdGFyZ2V0RG9jLnZlcnNpb24udG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSBcInVuZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodmVyc2lvbiBpbiBjb21wYXJpc29ucykge1xuICAgICAgICByZXR1cm4gY29tcGFyaXNvbnNbdmVyc2lvbl0odGFyZ2V0RG9jLCBzb3VyY2VEb2MpO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDQgJiYgdGFyZ2V0RG9jLmxhc3Rfc2VxKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnNyYy5wdXQoe1xuICAgICAgICAgIF9pZDogc2VsZi5pZCxcbiAgICAgICAgICBsYXN0X3NlcTogTE9XRVNUX1NFUVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGlmIChpc0ZvcmJpZGRlbkVycm9yKGVycikpIHtcbiAgICAgICAgICAgIHNlbGYub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXREb2MubGFzdF9zZXE7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgfSk7XG59O1xuLy8gVGhpcyBjaGVja3BvaW50IGNvbXBhcmlzb24gaXMgcG9ydGVkIGZyb20gQ291Y2hEQnMgc291cmNlXG4vLyB0aGV5IGNvbWUgZnJvbSBoZXJlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb3VjaGRiLWNvdWNoLXJlcGxpY2F0b3IvYmxvYi9tYXN0ZXIvc3JjL2NvdWNoX3JlcGxpY2F0b3IuZXJsI0w4NjMtTDkwNlxuXG5mdW5jdGlvbiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNyY0RvYywgdGd0RG9jKSB7XG4gIGlmIChzcmNEb2Muc2Vzc2lvbl9pZCA9PT0gdGd0RG9jLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IHNyY0RvYy5sYXN0X3NlcSxcbiAgICAgIGhpc3Rvcnk6IHNyY0RvYy5oaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNyY0RvYy5oaXN0b3J5LCB0Z3REb2MuaGlzdG9yeSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVSZXBsaWNhdGlvbkhpc3Rvcnkoc291cmNlSGlzdG9yeSwgdGFyZ2V0SGlzdG9yeSkge1xuICAvLyB0aGUgZXJsYW5nIGxvb3AgdmlhIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc28gZWFzeSB0byByZXBlYXQgaW4gSlNcbiAgLy8gdGhlcmVmb3JlLCBkb2luZyB0aGlzIGFzIHJlY3Vyc2lvblxuICB2YXIgUyA9IHNvdXJjZUhpc3RvcnlbMF07XG4gIHZhciBzb3VyY2VSZXN0ID0gc291cmNlSGlzdG9yeS5zbGljZSgxKTtcbiAgdmFyIFQgPSB0YXJnZXRIaXN0b3J5WzBdO1xuICB2YXIgdGFyZ2V0UmVzdCA9IHRhcmdldEhpc3Rvcnkuc2xpY2UoMSk7XG5cbiAgaWYgKCFTIHx8IHRhcmdldEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3Rfc2VxOiBMT1dFU1RfU0VRLFxuICAgICAgaGlzdG9yeTogW11cbiAgICB9O1xuICB9XG5cbiAgdmFyIHNvdXJjZUlkID0gUy5zZXNzaW9uX2lkO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGhhc1Nlc3Npb25JZChzb3VyY2VJZCwgdGFyZ2V0SGlzdG9yeSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFMubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiBzb3VyY2VIaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHZhciB0YXJnZXRJZCA9IFQuc2Vzc2lvbl9pZDtcbiAgaWYgKGhhc1Nlc3Npb25JZCh0YXJnZXRJZCwgc291cmNlUmVzdCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFQubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiB0YXJnZXRSZXN0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNvdXJjZVJlc3QsIHRhcmdldFJlc3QpO1xufVxuXG5mdW5jdGlvbiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCBoaXN0b3J5KSB7XG4gIHZhciBwcm9wcyA9IGhpc3RvcnlbMF07XG4gIHZhciByZXN0ID0gaGlzdG9yeS5zbGljZSgxKTtcblxuICBpZiAoIXNlc3Npb25JZCB8fCBoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzZXNzaW9uSWQgPT09IHByb3BzLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCByZXN0KTtcbn1cblxuZnVuY3Rpb24gaXNGb3JiaWRkZW5FcnJvcihlcnIpIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnIuc3RhdHVzID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGVyci5zdGF0dXMgLyAxMDApID09PSA0O1xufVxuXG52YXIgU1RBUlRJTkdfQkFDS19PRkYgPSAwO1xuXG5mdW5jdGlvbiBiYWNrT2ZmKG9wdHMsIHJldHVyblZhbHVlLCBlcnJvciwgY2FsbGJhY2spIHtcbiAgaWYgKG9wdHMucmV0cnkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuVmFsdWUuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIG9wdHMuYmFja19vZmZfZnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uID0gZGVmYXVsdEJhY2tPZmY7XG4gIH1cbiAgcmV0dXJuVmFsdWUuZW1pdCgncmVxdWVzdEVycm9yJywgZXJyb3IpO1xuICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdhY3RpdmUnIHx8IHJldHVyblZhbHVlLnN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUuc3RhdGUgPSAnc3RvcHBlZCc7XG4gICAgdmFyIGJhY2tPZmZTZXQgPSBmdW5jdGlvbiBiYWNrb2ZmVGltZVNldCgpIHtcbiAgICAgIG9wdHMuY3VycmVudF9iYWNrX29mZiA9IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICAgIH07XG4gICAgdmFyIHJlbW92ZUJhY2tPZmZTZXR0ZXIgPSBmdW5jdGlvbiByZW1vdmVCYWNrT2ZmVGltZVNldCgpIHtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdhY3RpdmUnLCBiYWNrT2ZmU2V0KTtcbiAgICB9O1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ3BhdXNlZCcsIHJlbW92ZUJhY2tPZmZTZXR0ZXIpO1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ2FjdGl2ZScsIGJhY2tPZmZTZXQpO1xuICB9XG5cbiAgb3B0cy5jdXJyZW50X2JhY2tfb2ZmID0gb3B0cy5jdXJyZW50X2JhY2tfb2ZmIHx8IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICBvcHRzLmN1cnJlbnRfYmFja19vZmYgPSBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uKG9wdHMuY3VycmVudF9iYWNrX29mZik7XG4gIHNldFRpbWVvdXQoY2FsbGJhY2ssIG9wdHMuY3VycmVudF9iYWNrX29mZik7XG59XG5cbmZ1bmN0aW9uIHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkocXVlcnlQYXJhbXMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5zb3J0KGNvbGxhdGUpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcbiAgICByZXN1bHRba2V5XSA9IHF1ZXJ5UGFyYW1zW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xufVxuXG4vLyBHZW5lcmF0ZSBhIHVuaXF1ZSBpZCBwYXJ0aWN1bGFyIHRvIHRoaXMgcmVwbGljYXRpb24uXG4vLyBOb3QgZ3VhcmFudGVlZCB0byBhbGlnbiBwZXJmZWN0bHkgd2l0aCBDb3VjaERCJ3MgcmVwIGlkcy5cbmZ1bmN0aW9uIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykge1xuICB2YXIgZG9jSWRzID0gb3B0cy5kb2NfaWRzID8gb3B0cy5kb2NfaWRzLnNvcnQoY29sbGF0ZSkgOiAnJztcbiAgdmFyIGZpbHRlckZ1biA9IG9wdHMuZmlsdGVyID8gb3B0cy5maWx0ZXIudG9TdHJpbmcoKSA6ICcnO1xuICB2YXIgcXVlcnlQYXJhbXMgPSAnJztcbiAgdmFyIGZpbHRlclZpZXdOYW1lID0gICcnO1xuICB2YXIgc2VsZWN0b3IgPSAnJztcblxuICAvLyBwb3NzaWJpbGl0eSBmb3IgY2hlY2twb2ludHMgdG8gYmUgbG9zdCBoZXJlIGFzIGJlaGF2aW91ciBvZlxuICAvLyBKU09OLnN0cmluZ2lmeSBpcyBub3Qgc3RhYmxlIChzZWUgIzYyMjYpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIHNlbGVjdG9yID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zZWxlY3Rvcik7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICBxdWVyeVBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkob3B0cy5xdWVyeV9wYXJhbXMpKTtcbiAgfVxuXG4gIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgIGZpbHRlclZpZXdOYW1lID0gb3B0cy52aWV3LnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW3NyYy5pZCgpLCB0YXJnZXQuaWQoKV0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHZhciBxdWVyeURhdGEgPSByZXNbMF0gKyByZXNbMV0gKyBmaWx0ZXJGdW4gKyBmaWx0ZXJWaWV3TmFtZSArXG4gICAgICBxdWVyeVBhcmFtcyArIGRvY0lkcyArIHNlbGVjdG9yO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgYmluYXJ5TWQ1KHF1ZXJ5RGF0YSwgcmVzb2x2ZSk7XG4gICAgfSk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKG1kNXN1bSkge1xuICAgIC8vIGNhbid0IHVzZSBzdHJhaWdodC11cCBtZDUgYWxwaGFiZXQsIGJlY2F1c2VcbiAgICAvLyB0aGUgY2hhciAnLycgaXMgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgZm9yIGF0dGFjaG1lbnRzLFxuICAgIC8vIGFuZCArIGlzIGFsc28gbm90IHVybC1zYWZlXG4gICAgbWQ1c3VtID0gbWQ1c3VtLnJlcGxhY2UoL1xcLy9nLCAnLicpLnJlcGxhY2UoL1xcKy9nLCAnXycpO1xuICAgIHJldHVybiAnX2xvY2FsLycgKyBtZDVzdW07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlLCByZXN1bHQpIHtcbiAgdmFyIGJhdGNoZXMgPSBbXTsgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGJhdGNoZXMgdG8gYmUgcHJvY2Vzc2VkXG4gIHZhciBjdXJyZW50QmF0Y2g7ICAgICAgICAgICAgICAgLy8gdGhlIGJhdGNoIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWRcbiAgdmFyIHBlbmRpbmdCYXRjaCA9IHtcbiAgICBzZXE6IDAsXG4gICAgY2hhbmdlczogW10sXG4gICAgZG9jczogW11cbiAgfTsgLy8gbmV4dCBiYXRjaCwgbm90IHlldCByZWFkeSB0byBiZSBwcm9jZXNzZWRcbiAgdmFyIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7ICAvLyB0cnVlIHdoaWxlIGNoZWNrcG9pbnQgaXMgYmVpbmcgd3JpdHRlblxuICB2YXIgY2hhbmdlc0NvbXBsZXRlZCA9IGZhbHNlOyAgIC8vIHRydWUgd2hlbiBhbGwgY2hhbmdlcyByZWNlaXZlZFxuICB2YXIgcmVwbGljYXRpb25Db21wbGV0ZWQgPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIHJlcGxpY2F0aW9uIGhhcyBjb21wbGV0ZWRcbiAgdmFyIGxhc3Rfc2VxID0gMDtcbiAgdmFyIGNvbnRpbnVvdXMgPSBvcHRzLmNvbnRpbnVvdXMgfHwgb3B0cy5saXZlIHx8IGZhbHNlO1xuICB2YXIgYmF0Y2hfc2l6ZSA9IG9wdHMuYmF0Y2hfc2l6ZSB8fCAxMDA7XG4gIHZhciBiYXRjaGVzX2xpbWl0ID0gb3B0cy5iYXRjaGVzX2xpbWl0IHx8IDEwO1xuICB2YXIgc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICdhbGxfZG9jcyc7XG4gIHZhciBjaGFuZ2VzUGVuZGluZyA9IGZhbHNlOyAgICAgLy8gdHJ1ZSB3aGlsZSBzcmMuY2hhbmdlcyBpcyBydW5uaW5nXG4gIHZhciBkb2NfaWRzID0gb3B0cy5kb2NfaWRzO1xuICB2YXIgc2VsZWN0b3IgPSBvcHRzLnNlbGVjdG9yO1xuICB2YXIgcmVwSWQ7XG4gIHZhciBjaGVja3BvaW50ZXI7XG4gIHZhciBjaGFuZ2VkRG9jcyA9IFtdO1xuICAvLyBMaWtlIGNvdWNoZGIsIGV2ZXJ5IHJlcGxpY2F0aW9uIGdldHMgYSB1bmlxdWUgc2Vzc2lvbiBpZFxuICB2YXIgc2Vzc2lvbiA9IHV1aWQoKTtcblxuICByZXN1bHQgPSByZXN1bHQgfHwge1xuICAgIG9rOiB0cnVlLFxuICAgIHN0YXJ0X3RpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBkb2NzX3JlYWQ6IDAsXG4gICAgZG9jc193cml0dGVuOiAwLFxuICAgIGRvY193cml0ZV9mYWlsdXJlczogMCxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG5cbiAgdmFyIGNoYW5nZXNPcHRzID0ge307XG4gIHJldHVyblZhbHVlLnJlYWR5KHNyYywgdGFyZ2V0KTtcblxuICBmdW5jdGlvbiBpbml0Q2hlY2twb2ludGVyKCkge1xuICAgIGlmIChjaGVja3BvaW50ZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXBJZCA9IHJlcztcblxuICAgICAgdmFyIGNoZWNrcG9pbnRPcHRzID0ge307XG4gICAgICBpZiAob3B0cy5jaGVja3BvaW50ID09PSBmYWxzZSkge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiBmYWxzZSB9O1xuICAgICAgfSBlbHNlIGlmIChvcHRzLmNoZWNrcG9pbnQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIGNoZWNrcG9pbnRPcHRzID0geyB3cml0ZVNvdXJjZUNoZWNrcG9pbnQ6IHRydWUsIHdyaXRlVGFyZ2V0Q2hlY2twb2ludDogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSBpZiAob3B0cy5jaGVja3BvaW50ID09PSAndGFyZ2V0Jykge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiB0cnVlLCB3cml0ZVRhcmdldENoZWNrcG9pbnQ6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgY2hlY2twb2ludGVyID0gbmV3IENoZWNrcG9pbnRlcihzcmMsIHRhcmdldCwgcmVwSWQsIHJldHVyblZhbHVlLCBjaGVja3BvaW50T3B0cyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZURvY3MoKSB7XG4gICAgY2hhbmdlZERvY3MgPSBbXTtcblxuICAgIGlmIChjdXJyZW50QmF0Y2guZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRvY3MgPSBjdXJyZW50QmF0Y2guZG9jcztcbiAgICB2YXIgYnVsa09wdHMgPSB7dGltZW91dDogb3B0cy50aW1lb3V0fTtcbiAgICByZXR1cm4gdGFyZ2V0LmJ1bGtEb2NzKHtkb2NzOiBkb2NzLCBuZXdfZWRpdHM6IGZhbHNlfSwgYnVsa09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gYHJlc2AgZG9lc24ndCBpbmNsdWRlIGZ1bGwgZG9jdW1lbnRzICh3aGljaCBsaXZlIGluIGBkb2NzYCksIHNvIHdlIGNyZWF0ZSBhIG1hcCBvZlxuICAgICAgLy8gKGlkIC0+IGVycm9yKSwgYW5kIGNoZWNrIGZvciBlcnJvcnMgd2hpbGUgaXRlcmF0aW5nIG92ZXIgYGRvY3NgXG4gICAgICB2YXIgZXJyb3JzQnlJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICByZXMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgICAgICBlcnJvcnNCeUlkW3Jlcy5pZF0gPSByZXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgZXJyb3JzTm8gPSBPYmplY3Qua2V5cyhlcnJvcnNCeUlkKS5sZW5ndGg7XG4gICAgICByZXN1bHQuZG9jX3dyaXRlX2ZhaWx1cmVzICs9IGVycm9yc05vO1xuICAgICAgcmVzdWx0LmRvY3Nfd3JpdHRlbiArPSBkb2NzLmxlbmd0aCAtIGVycm9yc05vO1xuXG4gICAgICBkb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgICAgICB2YXIgZXJyb3IgPSBlcnJvcnNCeUlkW2RvYy5faWRdO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgIC8vIE5vcm1hbGl6ZSBlcnJvciBuYW1lLiBpLmUuICdVbmF1dGhvcml6ZWQnIC0+ICd1bmF1dGhvcml6ZWQnIChlZyBTeW5jIEdhdGV3YXkpXG4gICAgICAgICAgdmFyIGVycm9yTmFtZSA9IChlcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChlcnJvck5hbWUgPT09ICd1bmF1dGhvcml6ZWQnIHx8IGVycm9yTmFtZSA9PT0gJ2ZvcmJpZGRlbicpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2RlbmllZCcsIGNsb25lKGVycm9yKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VkRG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmVzdWx0LmRvY193cml0ZV9mYWlsdXJlcyArPSBkb2NzLmxlbmd0aDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaEJhdGNoKCkge1xuICAgIGlmIChjdXJyZW50QmF0Y2guZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgd2FzIGEgcHJvYmxlbSBnZXR0aW5nIGRvY3MuJyk7XG4gICAgfVxuICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY3VycmVudEJhdGNoLnNlcTtcbiAgICB2YXIgb3V0UmVzdWx0ID0gY2xvbmUocmVzdWx0KTtcbiAgICBpZiAoY2hhbmdlZERvY3MubGVuZ3RoKSB7XG4gICAgICBvdXRSZXN1bHQuZG9jcyA9IGNoYW5nZWREb2NzO1xuICAgICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50QmF0Y2gucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgb3V0UmVzdWx0LnBlbmRpbmcgPSBjdXJyZW50QmF0Y2gucGVuZGluZztcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5wZW5kaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hhbmdlJywgb3V0UmVzdWx0KTtcbiAgICB9XG4gICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgIHJldHVybiBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGN1cnJlbnRCYXRjaC5zZXEsXG4gICAgICAgIHNlc3Npb24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hlY2twb2ludCcsIHsgJ2NoZWNrcG9pbnQnOiBjdXJyZW50QmF0Y2guc2VxIH0pO1xuICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG4gICAgICBjdXJyZW50QmF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgICBnZXRDaGFuZ2VzKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgb25DaGVja3BvaW50RXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpZmZzKCkge1xuICAgIHZhciBkaWZmID0ge307XG4gICAgY3VycmVudEJhdGNoLmNoYW5nZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlKSB7XG4gICAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGVja3BvaW50JywgeyAncmV2c19kaWZmJzogY2hhbmdlIH0pO1xuICAgICAgLy8gQ291Y2hiYXNlIFN5bmMgR2F0ZXdheSBlbWl0cyB0aGVzZSwgYnV0IHdlIGNhbiBpZ25vcmUgdGhlbVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlLmlkID09PSBcIl91c2VyL1wiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpZmZbY2hhbmdlLmlkXSA9IGNoYW5nZS5jaGFuZ2VzLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geC5yZXY7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0LnJldnNEaWZmKGRpZmYpLnRoZW4oZnVuY3Rpb24gKGRpZmZzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgLy8gY3VycmVudEJhdGNoLmRpZmZzIGVsZW1lbnRzIGFyZSBkZWxldGVkIGFzIHRoZSBkb2N1bWVudHMgYXJlIHdyaXR0ZW5cbiAgICAgIGN1cnJlbnRCYXRjaC5kaWZmcyA9IGRpZmZzO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmF0Y2hEb2NzKCkge1xuICAgIHJldHVybiBnZXREb2NzKHNyYywgdGFyZ2V0LCBjdXJyZW50QmF0Y2guZGlmZnMsIHJldHVyblZhbHVlKS50aGVuKGZ1bmN0aW9uIChnb3QpIHtcbiAgICAgIGN1cnJlbnRCYXRjaC5lcnJvciA9ICFnb3Qub2s7XG4gICAgICBnb3QuZG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5kaWZmc1tkb2MuX2lkXTtcbiAgICAgICAgcmVzdWx0LmRvY3NfcmVhZCsrO1xuICAgICAgICBjdXJyZW50QmF0Y2guZG9jcy5wdXNoKGRvYyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0TmV4dEJhdGNoKCkge1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQgfHwgY3VycmVudEJhdGNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChiYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3VycmVudEJhdGNoID0gYmF0Y2hlcy5zaGlmdCgpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdzdGFydF9uZXh0X2JhdGNoJzogY3VycmVudEJhdGNoLnNlcSB9KTtcbiAgICBnZXREaWZmcygpXG4gICAgICAudGhlbihnZXRCYXRjaERvY3MpXG4gICAgICAudGhlbih3cml0ZURvY3MpXG4gICAgICAudGhlbihmaW5pc2hCYXRjaClcbiAgICAgIC50aGVuKHN0YXJ0TmV4dEJhdGNoKVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgYWJvcnRSZXBsaWNhdGlvbignYmF0Y2ggcHJvY2Vzc2luZyB0ZXJtaW5hdGVkIHdpdGggZXJyb3InLCBlcnIpO1xuICAgICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NQZW5kaW5nQmF0Y2goaW1tZWRpYXRlJCQxKSB7XG4gICAgaWYgKHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGJhdGNoZXMubGVuZ3RoID09PSAwICYmICFjdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKChjb250aW51b3VzICYmIGNoYW5nZXNPcHRzLmxpdmUpIHx8IGNoYW5nZXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZS5zdGF0ZSA9ICdwZW5kaW5nJztcbiAgICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc0NvbXBsZXRlZCkge1xuICAgICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBpbW1lZGlhdGUkJDEgfHxcbiAgICAgIGNoYW5nZXNDb21wbGV0ZWQgfHxcbiAgICAgIHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA+PSBiYXRjaF9zaXplXG4gICAgKSB7XG4gICAgICBiYXRjaGVzLnB1c2gocGVuZGluZ0JhdGNoKTtcbiAgICAgIHBlbmRpbmdCYXRjaCA9IHtcbiAgICAgICAgc2VxOiAwLFxuICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgZG9jczogW11cbiAgICAgIH07XG4gICAgICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdwZW5kaW5nJyB8fCByZXR1cm5WYWx1ZS5zdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICAgIHJldHVyblZhbHVlLnN0YXRlID0gJ2FjdGl2ZSc7XG4gICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgICAgc3RhcnROZXh0QmF0Y2goKTtcbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGFib3J0UmVwbGljYXRpb24ocmVhc29uLCBlcnIpIHtcbiAgICBpZiAocmVwbGljYXRpb25Db21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFlcnIubWVzc2FnZSkge1xuICAgICAgZXJyLm1lc3NhZ2UgPSByZWFzb247XG4gICAgfVxuICAgIHJlc3VsdC5vayA9IGZhbHNlO1xuICAgIHJlc3VsdC5zdGF0dXMgPSAnYWJvcnRpbmcnO1xuICAgIGJhdGNoZXMgPSBbXTtcbiAgICBwZW5kaW5nQmF0Y2ggPSB7XG4gICAgICBzZXE6IDAsXG4gICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgIGRvY3M6IFtdXG4gICAgfTtcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlUmVwbGljYXRpb24oZmF0YWxFcnJvcikge1xuICAgIGlmIChyZXBsaWNhdGlvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXN1bHQuc3RhdHVzID0gJ2NhbmNlbGxlZCc7XG4gICAgICBpZiAod3JpdGluZ0NoZWNrcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc3RhdHVzID0gcmVzdWx0LnN0YXR1cyB8fCAnY29tcGxldGUnO1xuICAgIHJlc3VsdC5lbmRfdGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICByZXN1bHQubGFzdF9zZXEgPSBsYXN0X3NlcTtcbiAgICByZXBsaWNhdGlvbkNvbXBsZXRlZCA9IHRydWU7XG5cbiAgICBpZiAoZmF0YWxFcnJvcikge1xuICAgICAgLy8gbmVlZCB0byBleHRlbmQgdGhlIGVycm9yIGJlY2F1c2UgRmlyZWZveCBjb25zaWRlcnMgXCIucmVzdWx0XCIgcmVhZC1vbmx5XG4gICAgICBmYXRhbEVycm9yID0gY3JlYXRlRXJyb3IoZmF0YWxFcnJvcik7XG4gICAgICBmYXRhbEVycm9yLnJlc3VsdCA9IHJlc3VsdDtcblxuICAgICAgLy8gTm9ybWFsaXplIGVycm9yIG5hbWUuIGkuZS4gJ1VuYXV0aG9yaXplZCcgLT4gJ3VuYXV0aG9yaXplZCcgKGVnIFN5bmMgR2F0ZXdheSlcbiAgICAgIHZhciBlcnJvck5hbWUgPSAoZmF0YWxFcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGVycm9yTmFtZSA9PT0gJ3VuYXV0aG9yaXplZCcgfHwgZXJyb3JOYW1lID09PSAnZm9yYmlkZGVuJykge1xuICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdlcnJvcicsIGZhdGFsRXJyb3IpO1xuICAgICAgICByZXR1cm5WYWx1ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhY2tPZmYob3B0cywgcmV0dXJuVmFsdWUsIGZhdGFsRXJyb3IsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2NvbXBsZXRlJywgcmVzdWx0KTtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2UoY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIHBlbmRpbmcgPT09ICdudW1iZXInKSB7XG4gICAgICBwZW5kaW5nQmF0Y2gucGVuZGluZyA9IHBlbmRpbmc7XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKShjaGFuZ2UpO1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBlbmRpbmdCYXRjaC5zZXEgPSBjaGFuZ2Uuc2VxIHx8IGxhc3RTZXE7XG4gICAgcGVuZGluZ0JhdGNoLmNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdwZW5kaW5nX2JhdGNoJzogcGVuZGluZ0JhdGNoLnNlcSB9KTtcbiAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaChiYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiBjaGFuZ2VzT3B0cy5saXZlKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2VzQ29tcGxldGUoY2hhbmdlcykge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBpZiBubyByZXN1bHRzIHdlcmUgcmV0dXJuZWQgdGhlbiB3ZSdyZSBkb25lLFxuICAgIC8vIGVsc2UgZmV0Y2ggbW9yZVxuICAgIGlmIChjaGFuZ2VzLnJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlc09wdHMuc2luY2UgPSBjaGFuZ2VzLnJlc3VsdHNbY2hhbmdlcy5yZXN1bHRzLmxlbmd0aCAtIDFdLnNlcTtcbiAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgIHByb2Nlc3NQZW5kaW5nQmF0Y2godHJ1ZSk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGludW91cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmxpdmUgPSB0cnVlO1xuICAgICAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUGVuZGluZ0JhdGNoKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBjaGVja3BvaW50IHNvIHdlIHN0YXJ0IGZyb20gdGhlIHJpZ2h0IHNlcSBuZXh0IHRpbWVcbiAgICAgIGlmICghY3VycmVudEJhdGNoICYmIGNoYW5nZXMucmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgICAgICBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGNoYW5nZXMubGFzdF9zZXEsXG4gICAgICAgICAgICBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY2hhbmdlcy5sYXN0X3NlcTtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25DaGVja3BvaW50RXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlc0Vycm9yKGVycikge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgYWJvcnRSZXBsaWNhdGlvbignY2hhbmdlcyByZWplY3RlZCcsIGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGdldENoYW5nZXMoKSB7XG4gICAgaWYgKCEoXG4gICAgICAhY2hhbmdlc1BlbmRpbmcgJiZcbiAgICAgICFjaGFuZ2VzQ29tcGxldGVkICYmXG4gICAgICBiYXRjaGVzLmxlbmd0aCA8IGJhdGNoZXNfbGltaXRcbiAgICAgICkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2hhbmdlc1BlbmRpbmcgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIGFib3J0Q2hhbmdlcygpIHtcbiAgICAgIGNoYW5nZXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKCkge1xuICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIGFib3J0Q2hhbmdlcyk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlLl9jaGFuZ2VzKSB7IC8vIHJlbW92ZSBvbGQgY2hhbmdlcygpIGFuZCBsaXN0ZW5lcnNcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdjYW5jZWwnLCByZXR1cm5WYWx1ZS5fYWJvcnRDaGFuZ2VzKTtcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzLmNhbmNlbCgpO1xuICAgIH1cbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBhYm9ydENoYW5nZXMpO1xuXG4gICAgdmFyIGNoYW5nZXMgPSBzcmMuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAgIC5vbignY2hhbmdlJywgb25DaGFuZ2UpO1xuICAgIGNoYW5nZXMudGhlbihyZW1vdmVMaXN0ZW5lciwgcmVtb3ZlTGlzdGVuZXIpO1xuICAgIGNoYW5nZXMudGhlbihvbkNoYW5nZXNDb21wbGV0ZSlcbiAgICAgIC5jYXRjaChvbkNoYW5nZXNFcnJvcik7XG5cbiAgICBpZiAob3B0cy5yZXRyeSkge1xuICAgICAgLy8gc2F2ZSBmb3IgbGF0ZXIgc28gd2UgY2FuIGNhbmNlbCBpZiBuZWNlc3NhcnlcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgIHJldHVyblZhbHVlLl9hYm9ydENoYW5nZXMgPSBhYm9ydENoYW5nZXM7XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBzdGFydENoYW5nZXMoKSB7XG4gICAgaW5pdENoZWNrcG9pbnRlcigpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrcG9pbnRlci5nZXRDaGVja3BvaW50KCkudGhlbihmdW5jdGlvbiAoY2hlY2twb2ludCkge1xuICAgICAgICBsYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG4gICAgICAgIGNoYW5nZXNPcHRzID0ge1xuICAgICAgICAgIHNpbmNlOiBsYXN0X3NlcSxcbiAgICAgICAgICBsaW1pdDogYmF0Y2hfc2l6ZSxcbiAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplLFxuICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICBkb2NfaWRzOiBkb2NfaWRzLFxuICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSAvLyByZXF1aXJlZCBzbyB3ZSBrbm93IHdoZW4gd2UncmUgZG9uZVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0cy5maWx0ZXIpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHRoZSBjbGllbnQtc2lkZSBmaWx0ZXIgaW4gb25DaGFuZ2VcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gZGRvYyBmaWx0ZXJcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2hlYXJ0YmVhdCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmhlYXJ0YmVhdCA9IG9wdHMuaGVhcnRiZWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmICgndGltZW91dCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zKSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMucXVlcnlfcGFyYW1zID0gb3B0cy5xdWVyeV9wYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMudmlldykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnZpZXcgPSBvcHRzLnZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgYWJvcnRSZXBsaWNhdGlvbignZ2V0Q2hlY2twb2ludCByZWplY3RlZCB3aXRoICcsIGVycik7XG4gICAgfSk7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBvbkNoZWNrcG9pbnRFcnJvcihlcnIpIHtcbiAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgIGFib3J0UmVwbGljYXRpb24oJ3dyaXRlQ2hlY2twb2ludCBjb21wbGV0ZWQgd2l0aCBlcnJvcicsIGVycik7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkgeyAvLyBjYW5jZWxsZWQgaW1tZWRpYXRlbHlcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFyZXR1cm5WYWx1ZS5fYWRkZWRMaXN0ZW5lcnMpIHtcbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBjb21wbGV0ZVJlcGxpY2F0aW9uKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuVmFsdWUub25jZSgnZXJyb3InLCBvcHRzLmNvbXBsZXRlKTtcbiAgICAgIHJldHVyblZhbHVlLm9uY2UoJ2NvbXBsZXRlJywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuVmFsdWUuX2FkZGVkTGlzdGVuZXJzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy5zaW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGFydENoYW5nZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0Q2hlY2twb2ludGVyKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB3cml0aW5nQ2hlY2twb2ludCA9IHRydWU7XG4gICAgICByZXR1cm4gY2hlY2twb2ludGVyLndyaXRlQ2hlY2twb2ludChvcHRzLnNpbmNlLCBzZXNzaW9uKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0X3NlcSA9IG9wdHMuc2luY2U7XG4gICAgICBzdGFydENoYW5nZXMoKTtcbiAgICB9KS5jYXRjaChvbkNoZWNrcG9pbnRFcnJvcik7XG4gIH1cbn1cblxuLy8gV2UgY3JlYXRlIGEgYmFzaWMgcHJvbWlzZSBzbyB0aGUgY2FsbGVyIGNhbiBjYW5jZWwgdGhlIHJlcGxpY2F0aW9uIHBvc3NpYmx5XG4vLyBiZWZvcmUgd2UgaGF2ZSBhY3R1YWxseSBzdGFydGVkIGxpc3RlbmluZyB0byBjaGFuZ2VzIGV0Y1xuaW5oZXJpdHMoUmVwbGljYXRpb24sIEVFKTtcbmZ1bmN0aW9uIFJlcGxpY2F0aW9uKCkge1xuICBFRS5jYWxsKHRoaXMpO1xuICB0aGlzLmNhbmNlbGxlZCA9IGZhbHNlO1xuICB0aGlzLnN0YXRlID0gJ3BlbmRpbmcnO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIHNlbGYub25jZSgnY29tcGxldGUnLCBmdWxmaWxsKTtcbiAgICBzZWxmLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG4gIHNlbGYudGhlbiA9IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gIH07XG4gIHNlbGYuY2F0Y2ggPSBmdW5jdGlvbiAocmVqZWN0KSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2gocmVqZWN0KTtcbiAgfTtcbiAgLy8gQXMgd2UgYWxsb3cgZXJyb3IgaGFuZGxpbmcgdmlhIFwiZXJyb3JcIiBldmVudCBhcyB3ZWxsLFxuICAvLyBwdXQgYSBzdHViIGluIGhlcmUgc28gdGhhdCByZWplY3RpbmcgbmV2ZXIgdGhyb3dzIFVuaGFuZGxlZEVycm9yLlxuICBzZWxmLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbn1cblxuUmVwbGljYXRpb24ucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICB0aGlzLnN0YXRlID0gJ2NhbmNlbGxlZCc7XG4gIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG59O1xuXG5SZXBsaWNhdGlvbi5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiAoc3JjLCB0YXJnZXQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5fcmVhZHlDYWxsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5fcmVhZHlDYWxsZWQgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIG9uRGVzdHJveSgpIHtcbiAgICBzZWxmLmNhbmNlbCgpO1xuICB9XG4gIHNyYy5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB0YXJnZXQub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gICAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9XG4gIHNlbGYub25jZSgnY29tcGxldGUnLCBjbGVhbnVwKTtcbiAgc2VsZi5vbmNlKCdlcnJvcicsIGNsZWFudXApO1xufTtcblxuZnVuY3Rpb24gdG9Qb3VjaChkYiwgb3B0cykge1xuICB2YXIgUG91Y2hDb25zdHJ1Y3RvciA9IG9wdHMuUG91Y2hDb25zdHJ1Y3RvcjtcbiAgaWYgKHR5cGVvZiBkYiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoQ29uc3RydWN0b3IoZGIsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsaWNhdGVXcmFwcGVyKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIGlmIChvcHRzLmRvY19pZHMgJiYgIUFycmF5LmlzQXJyYXkob3B0cy5kb2NfaWRzKSkge1xuICAgIHRocm93IGNyZWF0ZUVycm9yKEJBRF9SRVFVRVNULFxuICAgICAgICAgICAgICAgICAgICAgICBcImBkb2NfaWRzYCBmaWx0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGxpc3QuXCIpO1xuICB9XG5cbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIG9wdHMuY29udGludW91cyA9IG9wdHMuY29udGludW91cyB8fCBvcHRzLmxpdmU7XG4gIG9wdHMucmV0cnkgPSAoJ3JldHJ5JyBpbiBvcHRzKSA/IG9wdHMucmV0cnkgOiBmYWxzZTtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgb3B0cy5Qb3VjaENvbnN0cnVjdG9yID0gb3B0cy5Qb3VjaENvbnN0cnVjdG9yIHx8IHRoaXM7XG4gIHZhciByZXBsaWNhdGVSZXQgPSBuZXcgUmVwbGljYXRpb24ob3B0cyk7XG4gIHZhciBzcmNQb3VjaCA9IHRvUG91Y2goc3JjLCBvcHRzKTtcbiAgdmFyIHRhcmdldFBvdWNoID0gdG9Qb3VjaCh0YXJnZXQsIG9wdHMpO1xuICByZXBsaWNhdGUoc3JjUG91Y2gsIHRhcmdldFBvdWNoLCBvcHRzLCByZXBsaWNhdGVSZXQpO1xuICByZXR1cm4gcmVwbGljYXRlUmV0O1xufVxuXG5pbmhlcml0cyhTeW5jLCBFRSk7XG5mdW5jdGlvbiBzeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzID0ge307XG4gIH1cbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICBvcHRzLlBvdWNoQ29uc3RydWN0b3IgPSBvcHRzLlBvdWNoQ29uc3RydWN0b3IgfHwgdGhpcztcbiAgc3JjID0gdG9Qb3VjaChzcmMsIG9wdHMpO1xuICB0YXJnZXQgPSB0b1BvdWNoKHRhcmdldCwgb3B0cyk7XG4gIHJldHVybiBuZXcgU3luYyhzcmMsIHRhcmdldCwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBTeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcblxuICB2YXIgb3B0c1B1c2ggPSBvcHRzLnB1c2ggPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVzaCkgOiBvcHRzO1xuICB2YXIgb3B0c1B1bGwgPSBvcHRzLnB1bGwgPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVsbCkgOiBvcHRzO1xuXG4gIHRoaXMucHVzaCA9IHJlcGxpY2F0ZVdyYXBwZXIoc3JjLCB0YXJnZXQsIG9wdHNQdXNoKTtcbiAgdGhpcy5wdWxsID0gcmVwbGljYXRlV3JhcHBlcih0YXJnZXQsIHNyYywgb3B0c1B1bGwpO1xuXG4gIHRoaXMucHVzaFBhdXNlZCA9IHRydWU7XG4gIHRoaXMucHVsbFBhdXNlZCA9IHRydWU7XG5cbiAgZnVuY3Rpb24gcHVsbENoYW5nZShjaGFuZ2UpIHtcbiAgICBzZWxmLmVtaXQoJ2NoYW5nZScsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgY2hhbmdlOiBjaGFuZ2VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoQ2hhbmdlKGNoYW5nZSkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywge1xuICAgICAgZGlyZWN0aW9uOiAncHVzaCcsXG4gICAgICBjaGFuZ2U6IGNoYW5nZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hEZW5pZWQoZG9jKSB7XG4gICAgc2VsZi5lbWl0KCdkZW5pZWQnLCB7XG4gICAgICBkaXJlY3Rpb246ICdwdXNoJyxcbiAgICAgIGRvYzogZG9jXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcHVsbERlbmllZChkb2MpIHtcbiAgICBzZWxmLmVtaXQoJ2RlbmllZCcsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgZG9jOiBkb2NcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoUGF1c2VkKCkge1xuICAgIHNlbGYucHVzaFBhdXNlZCA9IHRydWU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdwYXVzZWQnKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbFBhdXNlZCgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSB0cnVlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLnB1c2hQYXVzZWQpIHtcbiAgICAgIHNlbGYuZW1pdCgncGF1c2VkJyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHB1c2hBY3RpdmUoKSB7XG4gICAgc2VsZi5wdXNoUGF1c2VkID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdhY3RpdmUnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3B1c2gnXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbEFjdGl2ZSgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSBmYWxzZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5wdXNoUGF1c2VkKSB7XG4gICAgICBzZWxmLmVtaXQoJ2FjdGl2ZScsIHtcbiAgICAgICAgZGlyZWN0aW9uOiAncHVsbCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZW1vdmVkID0ge307XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsKHR5cGUpIHsgLy8gdHlwZSBpcyAncHVzaCcgb3IgJ3B1bGwnXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgZnVuYykge1xuICAgICAgdmFyIGlzQ2hhbmdlID0gZXZlbnQgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQ2hhbmdlIHx8IGZ1bmMgPT09IHB1c2hDaGFuZ2UpO1xuICAgICAgdmFyIGlzRGVuaWVkID0gZXZlbnQgPT09ICdkZW5pZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsRGVuaWVkIHx8IGZ1bmMgPT09IHB1c2hEZW5pZWQpO1xuICAgICAgdmFyIGlzUGF1c2VkID0gZXZlbnQgPT09ICdwYXVzZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsUGF1c2VkIHx8IGZ1bmMgPT09IHB1c2hQYXVzZWQpO1xuICAgICAgdmFyIGlzQWN0aXZlID0gZXZlbnQgPT09ICdhY3RpdmUnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQWN0aXZlIHx8IGZ1bmMgPT09IHB1c2hBY3RpdmUpO1xuXG4gICAgICBpZiAoaXNDaGFuZ2UgfHwgaXNEZW5pZWQgfHwgaXNQYXVzZWQgfHwgaXNBY3RpdmUpIHtcbiAgICAgICAgaWYgKCEoZXZlbnQgaW4gcmVtb3ZlZCkpIHtcbiAgICAgICAgICByZW1vdmVkW2V2ZW50XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZWRbZXZlbnRdW3R5cGVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlbW92ZWRbZXZlbnRdKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAvLyBib3RoIHB1c2ggYW5kIHB1bGwgaGF2ZSBhc2tlZCB0byBiZSByZW1vdmVkXG4gICAgICAgICAgc2VsZi5yZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRzLmxpdmUpIHtcbiAgICB0aGlzLnB1c2gub24oJ2NvbXBsZXRlJywgc2VsZi5wdWxsLmNhbmNlbC5iaW5kKHNlbGYucHVsbCkpO1xuICAgIHRoaXMucHVsbC5vbignY29tcGxldGUnLCBzZWxmLnB1c2guY2FuY2VsLmJpbmQoc2VsZi5wdXNoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRPbmVMaXN0ZW5lcihlZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGVlLmxpc3RlbmVycyhldmVudCkuaW5kZXhPZihsaXN0ZW5lcikgPT0gLTEpIHtcbiAgICAgIGVlLm9uKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdjaGFuZ2UnLCBwdWxsQ2hhbmdlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2NoYW5nZScsIHB1c2hDaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdkZW5pZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2RlbmllZCcsIHB1c2hEZW5pZWQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdhY3RpdmUnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdhY3RpdmUnLCBwdWxsQWN0aXZlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdwYXVzZWQnLCBwdWxsUGF1c2VkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ3BhdXNlZCcsIHB1c2hQYXVzZWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5vbigncmVtb3ZlTGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ2NoYW5nZScsIHB1bGxDaGFuZ2UpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdjaGFuZ2UnLCBwdXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnZGVuaWVkJykge1xuICAgICAgc2VsZi5wdWxsLnJlbW92ZUxpc3RlbmVyKCdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIHNlbGYucHVzaC5yZW1vdmVMaXN0ZW5lcignZGVuaWVkJywgcHVzaERlbmllZCk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIHNlbGYucHVsbC5yZW1vdmVMaXN0ZW5lcignYWN0aXZlJywgcHVsbEFjdGl2ZSk7XG4gICAgICBzZWxmLnB1c2gucmVtb3ZlTGlzdGVuZXIoJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlZCcsIHB1bGxQYXVzZWQpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdwYXVzZWQnLCBwdXNoUGF1c2VkKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMucHVsbC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1bGwnKSk7XG4gIHRoaXMucHVzaC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1c2gnKSk7XG5cbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLmFsbChbXG4gICAgdGhpcy5wdXNoLFxuICAgIHRoaXMucHVsbFxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgdmFyIG91dCA9IHtcbiAgICAgIHB1c2g6IHJlc3BbMF0sXG4gICAgICBwdWxsOiByZXNwWzFdXG4gICAgfTtcbiAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgb3V0KTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIG91dCk7XG4gICAgfVxuICAgIHNlbGYucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGEgY2FsbGJhY2ssIHRoZW4gdGhlIGNhbGxiYWNrIGNhbiByZWNlaXZlXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnRcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2ssIHRoZW4gd2UncmUgc2FmZSB0byBlbWl0IGFuIGVycm9yXG4gICAgICAvLyBldmVudCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IGFuIHVuaGFuZGxlZCBlcnJvclxuICAgICAgLy8gZHVlIHRvICdlcnJvcicgYmVpbmcgYSBzcGVjaWFsIGV2ZW50IGluIEV2ZW50RW1pdHRlcnNcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gbm8gc2Vuc2UgdGhyb3dpbmcgaWYgd2UncmUgYWxyZWFkeSBlbWl0dGluZyBhbiAnZXJyb3InIGV2ZW50XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnRoZW4gPSBmdW5jdGlvbiAoc3VjY2VzcywgZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbihzdWNjZXNzLCBlcnIpO1xuICB9O1xuXG4gIHRoaXMuY2F0Y2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2goZXJyKTtcbiAgfTtcbn1cblxuU3luYy5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY2FuY2VsZWQpIHtcbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICB0aGlzLnB1c2guY2FuY2VsKCk7XG4gICAgdGhpcy5wdWxsLmNhbmNlbCgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiByZXBsaWNhdGlvbihQb3VjaERCKSB7XG4gIFBvdWNoREIucmVwbGljYXRlID0gcmVwbGljYXRlV3JhcHBlcjtcbiAgUG91Y2hEQi5zeW5jID0gc3luYztcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUG91Y2hEQi5wcm90b3R5cGUsICdyZXBsaWNhdGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGljYXRlTWV0aG9kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5yZXBsaWNhdGVNZXRob2RzID0ge1xuICAgICAgICAgIGZyb206IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShvdGhlciwgc2VsZiwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShzZWxmLCBvdGhlciwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlcGxpY2F0ZU1ldGhvZHM7XG4gICAgfVxuICB9KTtcblxuICBQb3VjaERCLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKGRiTmFtZSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5zeW5jKHRoaXMsIGRiTmFtZSwgb3B0cywgY2FsbGJhY2spO1xuICB9O1xufVxuXG5Qb3VjaERCLnBsdWdpbihJREJQb3VjaClcbiAgLnBsdWdpbihIdHRwUG91Y2gkMSlcbiAgLnBsdWdpbihtYXByZWR1Y2UpXG4gIC5wbHVnaW4ocmVwbGljYXRpb24pO1xuXG4vLyBQdWxsIGZyb20gc3JjIGJlY2F1c2UgcG91Y2hkYi1ub2RlL3BvdWNoZGItYnJvd3NlciB0aGVtc2VsdmVzXG5cbmV4cG9ydCBkZWZhdWx0IFBvdWNoREI7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJzsgLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcblxudmFyIF9jbG9ja3NlcTsgLy8gUHJldmlvdXMgdXVpZCBjcmVhdGlvbiB0aW1lXG5cblxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IEFycmF5KDE2KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7IC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuXG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtzZWVkQnl0ZXNbMF0gfCAweDAxLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG4gICAgfVxuXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9IC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuXG5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7IC8vIFBlciA0LjIuMS4yLCB1c2UgY291bnQgb2YgdXVpZCdzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY2xvY2tcbiAgLy8gY3ljbGUgdG8gc2ltdWxhdGUgaGlnaGVyIHJlc29sdXRpb24gY2xvY2tcblxuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7IC8vIFRpbWUgc2luY2UgbGFzdCB1dWlkIGNyZWF0aW9uIChpbiBtc2VjcylcblxuICB2YXIgZHQgPSBtc2VjcyAtIF9sYXN0TVNlY3MgKyAobnNlY3MgLSBfbGFzdE5TZWNzKSAvIDEwMDAwOyAvLyBQZXIgNC4yLjEuMiwgQnVtcCBjbG9ja3NlcSBvbiBjbG9jayByZWdyZXNzaW9uXG5cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfSAvLyBSZXNldCBuc2VjcyBpZiBjbG9jayByZWdyZXNzZXMgKG5ldyBjbG9ja3NlcSkgb3Igd2UndmUgbW92ZWQgb250byBhIG5ld1xuICAvLyB0aW1lIGludGVydmFsXG5cblxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfSAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG5cblxuICBpZiAobnNlY3MgPj0gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgfVxuXG4gIF9sYXN0TVNlY3MgPSBtc2VjcztcbiAgX2xhc3ROU2VjcyA9IG5zZWNzO1xuICBfY2xvY2tzZXEgPSBjbG9ja3NlcTsgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG5cbiAgbXNlY3MgKz0gMTIyMTkyOTI4MDAwMDA7IC8vIGB0aW1lX2xvd2BcblxuICB2YXIgdGwgPSAoKG1zZWNzICYgMHhmZmZmZmZmKSAqIDEwMDAwICsgbnNlY3MpICUgMHgxMDAwMDAwMDA7XG4gIGJbaSsrXSA9IHRsID4+PiAyNCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiAxNiAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdGwgJiAweGZmOyAvLyBgdGltZV9taWRgXG5cbiAgdmFyIHRtaCA9IG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjsgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcblxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG5cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7IC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiLypcbiAqIEJyb3dzZXItY29tcGF0aWJsZSBKYXZhU2NyaXB0IE1ENVxuICpcbiAqIE1vZGlmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqL1xuZnVuY3Rpb24gbWQ1KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShtc2cubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZDVUb0hleEVuY29kZWRBcnJheSh3b3Jkc1RvTWQ1KGJ5dGVzVG9Xb3JkcyhieXRlcyksIGJ5dGVzLmxlbmd0aCAqIDgpKTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNVRvSGV4RW5jb2RlZEFycmF5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGxlbmd0aDMyID0gaW5wdXQubGVuZ3RoICogMzI7XG4gIHZhciBoZXhUYWIgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5cblxuZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoOCkge1xuICByZXR1cm4gKGlucHV0TGVuZ3RoOCArIDY0ID4+PiA5IDw8IDQpICsgMTQgKyAxO1xufVxuLypcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKi9cblxuXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBieXRlcyB0byBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBDaGFyYWN0ZXJzID4yNTUgaGF2ZSB0aGVpciBoaWdoLWJ5dGUgc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE91dHB1dExlbmd0aChsZW5ndGg4KSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXRbaSAvIDhdICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9ucyBpbnRlcm5hbGx5XG4gKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuICovXG5cblxuZnVuY3Rpb24gc2FmZUFkZCh4LCB5KSB7XG4gIHZhciBsc3cgPSAoeCAmIDB4ZmZmZikgKyAoeSAmIDB4ZmZmZik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDB4ZmZmZjtcbn1cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cblxuXG5mdW5jdGlvbiBiaXRSb3RhdGVMZWZ0KG51bSwgY250KSB7XG4gIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbn1cbi8qXG4gKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBmb3VyIGJhc2ljIG9wZXJhdGlvbnMgdGhlIGFsZ29yaXRobSB1c2VzLlxuICovXG5cblxuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgYyB8IH5iICYgZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgZCB8IGMgJiB+ZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVpaShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWQ1OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IG1kNSBmcm9tICcuL21kNS5qcyc7XG52YXIgdjMgPSB2MzUoJ3YzJywgMHgzMCwgbWQ1KTtcbmV4cG9ydCBkZWZhdWx0IHYzOyIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImV4cG9ydCBkZWZhdWx0ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8qKlxyXG4qIHZrQmVhdXRpZnkgLSBqYXZhc2NyaXB0IHBsdWdpbiB0byBwcmV0dHktcHJpbnQgb3IgbWluaWZ5IHRleHQgaW4gWE1MLCBKU09OLCBDU1MgYW5kIFNRTCBmb3JtYXRzLlxyXG4qXHJcbiogQ29weXJpZ2h0IChjKSAyMDEyIFZhZGltIEtpcnl1a2hpblxyXG4qIHZraXJ5dWtoaW4gQCBnbWFpbC5jb21cclxuKiBodHRwOi8vd3d3LmVzbGluc3RydWN0b3IubmV0L3ZrYmVhdXRpZnkvXHJcbipcclxuKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczpcclxuKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiogICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWxcclxuKlxyXG4qICAgUHJldHR5IHByaW50XHJcbipcclxuKiAgICAgICAgdmtiZWF1dGlmeS54bWwodGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuanNvbih0ZXh0IFssaW5kZW50X3BhdHRlcm5dKTtcclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3ModGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQgWyxpbmRlbnRfcGF0dGVybl0pO1xyXG4qXHJcbiogICAgICAgIEB0ZXh0IC0gU3RyaW5nOyB0ZXh0IHRvIGJlYXR1Znk7XHJcbiogICAgICAgIEBpbmRlbnRfcGF0dGVybiAtIEludGVnZXIgfCBTdHJpbmc7XHJcbiogICAgICAgICAgICAgICAgSW50ZWdlcjogIG51bWJlciBvZiB3aGl0ZSBzcGFjZXM7XHJcbiogICAgICAgICAgICAgICAgU3RyaW5nOiAgIGNoYXJhY3RlciBzdHJpbmcgdG8gdmlzdWFsaXplIGluZGVudGF0aW9uICggY2FuIGFsc28gYmUgYSBzZXQgb2Ygd2hpdGUgc3BhY2VzIClcclxuKiAgIE1pbmlmeVxyXG4qXHJcbiogICAgICAgIHZrYmVhdXRpZnkueG1sbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuY3NzbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbG1pbih0ZXh0KTtcclxuKlxyXG4qICAgICAgICBAdGV4dCAtIFN0cmluZzsgdGV4dCB0byBtaW5pZnk7XHJcbiogICAgICAgIEBwcmVzZXJ2ZV9jb21tZW50cyAtIEJvb2w7IFtvcHRpb25hbF07XHJcbiogICAgICAgICAgICAgICAgU2V0IHRoaXMgZmxhZyB0byB0cnVlIHRvIHByZXZlbnQgcmVtb3ZpbmcgY29tbWVudHMgZnJvbSBAdGV4dCAoIG1pbnhtbCBhbmQgbWluY3NzIGZ1bmN0aW9ucyBvbmx5LiApXHJcbipcclxuKiAgIEV4YW1wbGVzOlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbCh0ZXh0KTsgLy8gcHJldHR5IHByaW50IFhNTFxyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb24odGV4dCwgNCApOyAvLyBwcmV0dHkgcHJpbnQgSlNPTlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LmNzcyh0ZXh0LCAnLiAuIC4gLicpOyAvLyBwcmV0dHkgcHJpbnQgQ1NTXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQsICctLS0tJyk7IC8vIHByZXR0eSBwcmludCBTUUxcclxuKlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbG1pbih0ZXh0LCB0cnVlKTsvLyBtaW5pZnkgWE1MLCBwcmVzZXJ2ZSBjb21tZW50c1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7Ly8gbWluaWZ5IEpTT05cclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3NtaW4odGV4dCk7Ly8gbWluaWZ5IENTUywgcmVtb3ZlIGNvbW1lbnRzICggZGVmYXVsdCApXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsbWluKHRleHQpOy8vIG1pbmlmeSBTUUxcclxuKlxyXG4qL1xyXG5mdW5jdGlvbiBjcmVhdGVTaGlmdEFycihzdGVwKSB7XHJcblxyXG5cdHZhciBzcGFjZSA9ICcgICAgJztcclxuXHJcblx0aWYgKCBpc05hTihwYXJzZUludChzdGVwKSkgKSB7ICAvLyBhcmd1bWVudCBpcyBzdHJpbmdcclxuXHRcdHNwYWNlID0gc3RlcDtcclxuXHR9IGVsc2UgeyAvLyBhcmd1bWVudCBpcyBpbnRlZ2VyXHJcblx0XHRzd2l0Y2goc3RlcCkge1xyXG5cdFx0XHRjYXNlIDE6IHNwYWNlID0gJyAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSAyOiBzcGFjZSA9ICcgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDM6IHNwYWNlID0gJyAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDQ6IHNwYWNlID0gJyAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA1OiBzcGFjZSA9ICcgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDY6IHNwYWNlID0gJyAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDc6IHNwYWNlID0gJyAgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA4OiBzcGFjZSA9ICcgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDk6IHNwYWNlID0gJyAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDEwOiBzcGFjZSA9ICcgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTE6IHNwYWNlID0gJyAgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTI6IHNwYWNlID0gJyAgICAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIHNoaWZ0ID0gWydcXG4nXTsgLy8gYXJyYXkgb2Ygc2hpZnRzXHJcblx0Zm9yKHZhciBpeD0wO2l4PDEwMDtpeCsrKSB7XHJcblx0XHRzaGlmdC5wdXNoKHNoaWZ0W2l4XStzcGFjZSk7XHJcblx0fVxyXG5cdHJldHVybiBzaGlmdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdmtiZWF1dGlmeSgpe1xyXG5cdHRoaXMuc3RlcCA9ICcgICAgJzsgLy8gNCBzcGFjZXNcclxuXHR0aGlzLnNoaWZ0ID0gY3JlYXRlU2hpZnRBcnIodGhpcy5zdGVwKTtcclxufTtcclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLnhtbCA9IGZ1bmN0aW9uKHRleHQsc3RlcCkge1xyXG5cclxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoLzwvZyxcIn46On48XCIpXHJcblx0XHRcdFx0IC5yZXBsYWNlKC9cXHMqeG1sbnNcXDovZyxcIn46On54bWxuczpcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoL1xccyp4bWxuc1xcPS9nLFwifjo6fnhtbG5zPVwiKVxyXG5cdFx0XHRcdCAuc3BsaXQoJ346On4nKSxcclxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcclxuXHRcdGluQ29tbWVudCA9IGZhbHNlLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cdFx0XHQvLyBzdGFydCBjb21tZW50IG9yIDwhW0NEQVRBWy4uLl1dPiBvciA8IURPQ1RZUEUgLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPCEvKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSB0cnVlO1xyXG5cdFx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0XHRpZihhcltpeF0uc2VhcmNoKC8tLT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goL1xcXT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goLyFET0NUWVBFLykgPiAtMSApIHtcclxuXHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBhcltpeF07XHJcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtPjwvZWxtPiAvL1xyXG5cdFx0XHRpZiggL148XFx3Ly5leGVjKGFyW2l4LTFdKSAmJiAvXjxcXC9cXHcvLmV4ZWMoYXJbaXhdKSAmJlxyXG5cdFx0XHRcdC9ePFtcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXgtMV0pID09IC9ePFxcL1tcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXhdKVswXS5yZXBsYWNlKCcvJywnJykpIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHRcdGlmKCFpbkNvbW1lbnQpIGRlZXAtLTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdCAvLyA8ZWxtPiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPT0gLTEgJiYgYXJbaXhdLnNlYXJjaCgvXFwvPi8pID09IC0xICkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0IC8vIDxlbG0+Li4uPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXHcvKSA+IC0xICYmIGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtLz4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvXFwvPi8pID4gLTEgKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPD8geG1sIC4uLiA/PiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFw/LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyB4bWxucyAvL1xyXG5cdFx0XHRpZiggYXJbaXhdLnNlYXJjaCgveG1sbnNcXDovKSA+IC0xICB8fCBhcltpeF0uc2VhcmNoKC94bWxuc1xcPS8pID4gLTEpIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdHJldHVybiAgKHN0clswXSA9PSAnXFxuJykgPyBzdHIuc2xpY2UoMSkgOiBzdHI7XHJcbn1cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLmpzb24gPSBmdW5jdGlvbih0ZXh0LHN0ZXApIHtcclxuXHJcblx0dmFyIHN0ZXAgPSBzdGVwID8gc3RlcCA6IHRoaXMuc3RlcDtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiICkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGV4dCksIG51bGwsIHN0ZXApO1xyXG5cdGlmICggdHlwZW9mIHRleHQgPT09IFwib2JqZWN0XCIgKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgc3RlcCk7XHJcblxyXG5cdHJldHVybiB0ZXh0OyAvLyB0ZXh0IGlzIG5vdCBzdHJpbmcgbm9yIG9iamVjdFxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3MgPSBmdW5jdGlvbih0ZXh0LCBzdGVwKSB7XHJcblxyXG5cdHZhciBhciA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLCcgJylcclxuXHRcdFx0XHQucmVwbGFjZSgvXFx7L2csXCJ7fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXH0vZyxcIn46On59fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXDsvZyxcIjt+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcL1xcKi9nLFwifjo6fi8qXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcKlxcLy9nLFwiKi9+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL346On5cXHN7MCx9fjo6fi9nLFwifjo6flwiKVxyXG5cdFx0XHRcdC5zcGxpdCgnfjo6ficpLFxyXG5cdFx0bGVuID0gYXIubGVuZ3RoLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cclxuXHRcdFx0aWYoIC9cXHsvLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdGlmKCAvXFwqXFxcXC8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxuezEsfS8sJycpO1xyXG59XHJcblxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmZ1bmN0aW9uIGlzU3VicXVlcnkoc3RyLCBwYXJlbnRoZXNpc0xldmVsKSB7XHJcblx0cmV0dXJuICBwYXJlbnRoZXNpc0xldmVsIC0gKHN0ci5yZXBsYWNlKC9cXCgvZywnJykubGVuZ3RoIC0gc3RyLnJlcGxhY2UoL1xcKS9nLCcnKS5sZW5ndGggKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzcGxpdF9zcWwoc3RyLCB0YWIpIHtcclxuXHJcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHN7MSx9L2csXCIgXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQU5EIC9pZyxcIn46On5cIit0YWIrdGFiK1wiQU5EIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQkVUV0VFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiQkVUV0VFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENBU0UgL2lnLFwifjo6flwiK3RhYitcIkNBU0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFTFNFIC9pZyxcIn46On5cIit0YWIrXCJFTFNFIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRU5EIC9pZyxcIn46On5cIit0YWIrXCJFTkQgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBGUk9NIC9pZyxcIn46On5GUk9NIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gR1JPVVBcXHN7MSx9QlkvaWcsXCJ+Ojp+R1JPVVAgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBIQVZJTkcgL2lnLFwifjo6fkhBVklORyBcIilcclxuXHRcdFx0XHQvLy5yZXBsYWNlKC8gU0VUIC9pZyxcIiBTRVR+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBJTiAvaWcsXCIgSU4gXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSk9JTiAvaWcsXCJ+Ojp+Sk9JTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENST1NTfjo6fnsxLH1KT0lOIC9pZyxcIn46On5DUk9TUyBKT0lOIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSU5ORVJ+Ojp+ezEsfUpPSU4gL2lnLFwifjo6fklOTkVSIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBMRUZUfjo6fnsxLH1KT0lOIC9pZyxcIn46On5MRUZUIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBSSUdIVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+UklHSFQgSk9JTiBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT04gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPUiAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIk9SIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT1JERVJcXHN7MSx9QlkvaWcsXCJ+Ojp+T1JERVIgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPVkVSIC9pZyxcIn46On5cIit0YWIrXCJPVkVSIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvXFwoXFxzezAsfVNFTEVDVCAvaWcsXCJ+Ojp+KFNFTEVDVCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFwpXFxzezAsfVNFTEVDVCAvaWcsXCIpfjo6flNFTEVDVCBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBUSEVOIC9pZyxcIiBUSEVOfjo6flwiK3RhYitcIlwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVU5JT04gL2lnLFwifjo6flVOSU9Ofjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVVNJTkcgL2lnLFwifjo6flVTSU5HIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gV0hFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiV0hFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdIRVJFIC9pZyxcIn46On5XSEVSRSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdJVEggL2lnLFwifjo6fldJVEggXCIpXHJcblxyXG5cdFx0XHRcdC8vLnJlcGxhY2UoL1xcLFxcc3swLH1cXCgvaWcsXCIsfjo6figgXCIpXHJcblx0XHRcdFx0Ly8ucmVwbGFjZSgvXFwsL2lnLFwiLH46On5cIit0YWIrdGFiK1wiXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQUxMIC9pZyxcIiBBTEwgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBUyAvaWcsXCIgQVMgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBU0MgL2lnLFwiIEFTQyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIERFU0MgL2lnLFwiIERFU0MgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBESVNUSU5DVCAvaWcsXCIgRElTVElOQ1QgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFWElTVFMgL2lnLFwiIEVYSVNUUyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIE5PVCAvaWcsXCIgTk9UIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gTlVMTCAvaWcsXCIgTlVMTCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIExJS0UgL2lnLFwiIExJS0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcc3swLH1TRUxFQ1QgL2lnLFwiU0VMRUNUIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHN7MCx9VVBEQVRFIC9pZyxcIlVQREFURSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFNFVCAvaWcsXCIgU0VUIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvfjo6fnsxLH0vZyxcIn46On5cIilcclxuXHRcdFx0XHQuc3BsaXQoJ346On4nKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuc3FsID0gZnVuY3Rpb24odGV4dCxzdGVwKSB7XHJcblxyXG5cdHZhciBhcl9ieV9xdW90ZSA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXCcvaWcsXCJ+Ojp+XFwnXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCd+Ojp+JyksXHJcblx0XHRsZW4gPSBhcl9ieV9xdW90ZS5sZW5ndGgsXHJcblx0XHRhciA9IFtdLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHR0YWIgPSB0aGlzLnN0ZXAsLy8rdGhpcy5zdGVwLFxyXG5cdFx0aW5Db21tZW50ID0gdHJ1ZSxcclxuXHRcdGluUXVvdGUgPSBmYWxzZSxcclxuXHRcdHBhcmVudGhlc2lzTGV2ZWwgPSAwLFxyXG5cdFx0c3RyID0gJycsXHJcblx0XHRpeCA9IDAsXHJcblx0XHRzaGlmdCA9IHN0ZXAgPyBjcmVhdGVTaGlmdEFycihzdGVwKSA6IHRoaXMuc2hpZnQ7O1xyXG5cclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblx0XHRcdGlmKGl4JTIpIHtcclxuXHRcdFx0XHRhciA9IGFyLmNvbmNhdChhcl9ieV9xdW90ZVtpeF0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyID0gYXIuY29uY2F0KHNwbGl0X3NxbChhcl9ieV9xdW90ZVtpeF0sIHRhYikgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGxlbiA9IGFyLmxlbmd0aDtcclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblxyXG5cdFx0XHRwYXJlbnRoZXNpc0xldmVsID0gaXNTdWJxdWVyeShhcltpeF0sIHBhcmVudGhlc2lzTGV2ZWwpO1xyXG5cclxuXHRcdFx0aWYoIC9cXHN7MCx9XFxzezAsfVNFTEVDVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggL1xcc3swLH1cXHN7MCx9U0VUXFxzezAsfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdGFyW2l4XSA9IGFyW2l4XS5yZXBsYWNlKC9cXCwvZyxcIixcXG5cIit0YWIrdGFiK1wiXCIpXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCAvXFxzezAsfVxcKFxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7XHJcblx0XHRcdFx0ZGVlcCsrO1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcJy8uZXhlYyhhcltpeF0pICkgIHtcclxuXHRcdFx0XHRpZihwYXJlbnRoZXNpc0xldmVsPDEgJiYgZGVlcCkge1xyXG5cdFx0XHRcdFx0ZGVlcC0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHRcdGlmKHBhcmVudGhlc2lzTGV2ZWw8MSAmJiBkZWVwKSB7XHJcblx0XHRcdFx0XHRkZWVwLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciBqdW5rID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRzdHIgPSBzdHIucmVwbGFjZSgvXlxcbnsxLH0vLCcnKS5yZXBsYWNlKC9cXG57MSx9L2csXCJcXG5cIik7XHJcblx0XHRyZXR1cm4gc3RyO1xyXG59XHJcblxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUueG1sbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xyXG5cclxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcclxuXHRcdFx0XHRcdFx0XHQgICA6IHRleHQucmVwbGFjZSgvXFw8IVsgXFxyXFxuXFx0XSooLS0oW15cXC1dfFtcXHJcXG5dfC1bXlxcLV0pKi0tWyBcXHJcXG5cXHRdKilcXD4vZyxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgLnJlcGxhY2UoL1sgXFxyXFxuXFx0XXsxLH14bWxucy9nLCAnIHhtbG5zJyk7XHJcblx0cmV0dXJuICBzdHIucmVwbGFjZSgvPlxcc3swLH08L2csXCI+PFwiKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuanNvbm1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0ZXh0KSwgbnVsbCwgMCk7XHJcblxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3NtaW4gPSBmdW5jdGlvbih0ZXh0LCBwcmVzZXJ2ZUNvbW1lbnRzKSB7XHJcblxyXG5cdHZhciBzdHIgPSBwcmVzZXJ2ZUNvbW1lbnRzID8gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdCAgIDogdGV4dC5yZXBsYWNlKC9cXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXiovXXxbXFxyXFxuXSkpKSpcXCorXFwvL2csXCJcIikgO1xyXG5cclxuXHRyZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xce1xcc3sxLH0vZyxcIntcIilcclxuXHRcdFx0ICAucmVwbGFjZSgvXFx9XFxzezEsfS9nLFwifVwiKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXDtcXHN7MSx9L2csXCI7XCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcL1xcKlxcc3sxLH0vZyxcIi8qXCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcKlxcL1xcc3sxLH0vZyxcIiovXCIpO1xyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5zcWxtaW4gPSBmdW5jdGlvbih0ZXh0KSB7XHJcblx0cmV0dXJuIHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKS5yZXBsYWNlKC9cXHN7MSx9XFwoLyxcIihcIikucmVwbGFjZSgvXFxzezEsfVxcKS8sXCIpXCIpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyB2a2JlYXV0aWZ5KCk7XHJcbiIsImV4cG9ydCBjb25zdCB1cGxvYWRBcmVhSFRNTCA9IFxuICBgPGRpdiBpZD1cImRvY3VtZW50LXVwbG9hZC1jb250YWluZXJcIj5cblxuICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9jb250YWluZXJcIj5cbiAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9hcmVhXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9tZXNzYWdlXCI+VXBsb2FkIEZpbGVzPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGlkPVwidXBsb2FkaW5nX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVfY29udGFpbmVyXCIgaWQ9XCJ1bnBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5VbnBhaXJlZCBEb2N1bWVudHM8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZmlsZXNfY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwibWVpX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1FSTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cIm1laV9saXN0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2NvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICNEQUVBRjE7IGJvcmRlci1yYWRpdXM6IDVweDtcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX3JhZGlvXCIgbmFtZT1cIm1laV9yYWRpb19ncm91cFwiIHZhbHVlPVwiY3JlYXRlX21laVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IGF1dG87bWFyZ2luLWxlZnQ6IDNweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImltYWdlX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPkltYWdlczwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cImltYWdlX2xpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZ2VuZXJhdGUtcGFpci1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbl9idXR0b25cIiBpZD1cIm1ha2VfcGFpclwiPk1ha2UgUGFpcjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9jb250YWluZXJcIiBpZD1cInBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5QYWlyZWQgRm9saW9zPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX3NvcnRfbmFtZVwiPlxuICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3J0X25hbWUgYXJyb3dfYnRuXCI+JiN4MjJDMDs8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb2xpb19saXN0XCIgaWQ9XCJwYWlyZWRfbGlzdFwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRfYnV0dG9uX2NvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25fYnV0dG9uXCIgaWQ9XCJ1cGxvYWRfYnV0dG9uXCI+XG4gICAgICAgICAgICBVcGxvYWRcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRpbmdfc3Bpbm5lclwiPuKGuzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS1cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2NvbnRhaW5lclwiIGlkPVwibWFudXNjcmlwdHNfY29udGFpbmVyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1hbnVzY3JpcHRzPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbGlvX2xpc3RcIiBpZD1cIm1hbnVzY3JpcHRfbGlzdFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAtLT5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3QgbmV3Rm9sZGVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG5leHBvcnQgY29uc3QgcmVuYW1lSFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5Db25maXJtPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDsiLCIvKiogQG1vZHVsZSBXYXJuaW5ncyAqL1xuXG4vKipcbiAqIFdhcm4gd2hlbiBncm91cGVkIG5ldW1lIGNvbXBvbmVudHMgZm9ybSBhbiB1bnJlY29nbml6ZWQgbmV1bWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ05vdFJlY29nbml6ZWQgKCk6IHZvaWQge1xuICBpZiAoISh3aW5kb3cuY29uZmlybSgnTmVvbiBkb2VzIG5vdCByZWNvZ25pemUgdGhpcyBuZXVtZSBncm91cGluZy4gV291bGQgeW91IGxpa2UgdG8gY3JlYXRlIGEgY29tcG91bmQgbmV1bWU/JykpKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG8nKS5jbGljaygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IHNlbGVjdEFsbCB9IGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuLi91dGlscy9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTVkdSZWxDb29yZHMgfSBmcm9tICcuLi91dGlscy9Db29yZGluYXRlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgc3RhZmYgaW50byB0d28gc3RhdmVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdFN0YWZmSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgc3RhZmY6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgc3RhZmY6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMuc3RhZmYgPSBzdGFmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgV2hlcmUgdG8gU3BsaXQnKTtcbiAgfVxuXG4gIHNwbGl0RGlzYWJsZSAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBpbnB1dCB0byBzcGxpdCBhIHN0YWZmLiAqL1xuICBoYW5kbGVyID0gKChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAvLyBGaW5kIHN0YWZmIHBvaW50IGNvcnJlc3BvbmRzIHRvIGlmIG9uZSBleGlzdHNcbiAgICAvLyBUT0RPXG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YWZmLmlkO1xuICAgIGNvbnN0IGN1cnNvciA9IGdldFNWR1JlbENvb3JkcyhldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXRBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdzcGxpdCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICB4OiBjdXJzb3IueFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLnN0YWZmJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKV0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgICAgIGlmIChtb3JlRWRpdCkge1xuICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdHMgc3BsaXQgb24gRXNjYXBlIHByZXNzLCBkaXNhYmxlcyBvbiBTaGlmdC4gKi9cbiAga2V5ZG93bkxpc3RlbmVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuc3BsaXREaXNhYmxlKCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKiBFeGl0IHNwbGl0IGlmIHVzZXIgY2xpY2tzIG9mZiBvZiBhY3RpdmUgcGFnZS4gKi9cbiAgY2xpY2thd2F5SGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5hY3RpdmUtcGFnZScpID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogQ2FsbGVkIHRvIHJlYXBwbHkgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIG5lY2Vzc2FyeS4gKi9cbiAgcmVzZXRIYW5kbGVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcbn1cbiIsImltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IFNwbGl0TmV1bWVBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgbmV1bWUgaW50byB0d28gbmV1bWVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdE5ldW1lSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgbmV1bWU6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmV1bWUgLSBUaGUgbmV1bWUgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgbmV1bWU6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMubmV1bWUgPSBuZXVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgVGhlIEJlZ2lubmluZyBvZiBUaGUgU2Vjb25kIE5ldW1lJyk7XG4gIH1cblxuICBzcGxpdERpc2FibGUgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXNldEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrYXdheUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgaW5wdXQgdG8gc3BsaXQgYSBuZXVtZS4gKi9cbiAgaGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5ldW1lLmlkO1xuXG4gICAgLy8gdW5zZWxlY3QoKTtcbiAgICBcbiAgICBjb25zdCBuYyA9IChldnQudGFyZ2V0IGFzIFNWR0dFbGVtZW50KS5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IG5jSWQgPSBuYy5pZDtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXROZXVtZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ3NwbGl0TmV1bWUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgbmNJZDogbmNJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9IFxuICAgICAgZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gZmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICAvLyB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAvLyBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLm5ldW1lJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgLy8gc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKSBhcyBTVkdHRWxlbWVudF0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICAgIC8vIHRyeSB7XG4gICAgICAvLyAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgLy8gICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5jbGFzc0xpc3QuYWRkKCdpcy1oaWRkZW4nKTtcbiAgICAgIC8vIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSk7XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIEV4aXRzIHNwbGl0IG9uIEVzY2FwZSBwcmVzcywgZGlzYWJsZXMgb24gU2hpZnQuICovXG4gIGtleWRvd25MaXN0ZW5lciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdCBzcGxpdCBpZiB1c2VyIGNsaWNrcyBvZmYgb2YgYWN0aXZlIHBhZ2UuICovXG4gIGNsaWNrYXdheUhhbmRsZXIgPSAoKGV2dDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYWN0aXZlLXBhZ2UnKSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIENhbGxlZCB0byByZWFwcGx5IHRoZSBldmVudCBsaXN0ZW5lciBpZiBuZWNlc3NhcnkuICovXG4gIHJlc2V0SGFuZGxlciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLnRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgZ2xvYmFsLnF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBnbG9iYWwucXVldWVNaWNyb3Rhc2soZnVuYyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy9iYXNlZCBvZmYgcnN2cCBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzXG4vL2xpY2Vuc2UgaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9tYXN0ZXIvbGliL3JzdnAvYXNhcC5qc1xuXG52YXIgTXV0YXRpb24gPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTXV0YXRpb247XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb24oaGFuZGxlKTtcbiAgdmFyIGVsZW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGVsZW1lbnQuZGF0YSA9IChjYWxsZWQgPSArK2NhbGxlZCAlIDIpO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAvLyB3ZSBjYW4gb25seSBnZXQgaGVyZSBpbiBJRTEwXG4gICAgLy8gd2hpY2ggZG9lc24ndCBoYW5kZWwgcG9zdE1lc3NhZ2Ugd2VsbFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoZnVuYykge1xuICB2YXIgY2hhbm5lbCA9IG5ldyBnbG9iYWwuTWVzc2FnZUNoYW5uZWwoKTtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59OyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RvY3VtZW50JyBpbiBnbG9iYWwgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICB2YXIgc2NyaXB0RWwgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0RWwub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlKCk7XG5cbiAgICAgIHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgIHNjcmlwdEVsID0gbnVsbDtcbiAgICB9O1xuICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpO1xuXG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uICh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCh0LCAwKTtcbiAgfTtcbn07IiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcbmltcG9ydCB7IEFsbERvY3MsIERvYywgdXBsb2Fkc0luZm8gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgKiBhcyBsb2NhbE1hbmlmZXN0IGZyb20gJy4uLy4uL2Fzc2V0cy9tYW5pZmVzdC5qc29uJztcblxuZXhwb3J0IGNvbnN0IGRiID0gbmV3IFBvdWNoREIoJ05lb24tVXNlci1TdG9yYWdlJyk7XG5cbmZ1bmN0aW9uIGdldEFsbERvY3VtZW50cygpOiBQcm9taXNlPEFsbERvY3M+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4gcmVzb2x2ZShyZXN1bHQpKVxuICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hVcGxvYWRzKCk6IFByb21pc2U8dXBsb2Fkc0luZm8+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRBbGxEb2N1bWVudHMoKTtcbiAgICByZXR1cm4gcmVzLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIG5hbWU6IHJvdy5kb2MgPyByb3cuZG9jLm5hbWUgOiAndW5kZWZpbmVkJyxcbiAgICB9KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKCdDb3VsZG5cXCd0IGZldGNoIHVwbG9hZGVkIGRvY3VtZW50cycsIGVyci5tZXNzYWdlKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmlmZXN0KGlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIG1laTogRmlsZSwgYmc6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobG9jYWxNYW5pZmVzdCkpO1xuICAgIG1hbmlmZXN0WydAaWQnXSA9IGlkO1xuICAgIG1hbmlmZXN0Wyd0aXRsZSddID0gdGl0bGU7XG4gICAgbWFuaWZlc3RbJ3RpbWVzdGFtcCddID0gKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBjb25zdCBtZWlQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBtZWlSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgbWVpUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUobWVpUmVhZGVyLnJlc3VsdCk7XG4gICAgICB9KTtcbiAgICAgIG1laVJlYWRlci5yZWFkQXNEYXRhVVJMKG1laSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBiZ1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGJnUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIGJnUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoYmdSZWFkZXIucmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgYmdSZWFkZXIucmVhZEFzRGF0YVVSTChiZyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBtZWlVcmkgPSBhd2FpdCBtZWlQcm9taXNlO1xuICAgIGNvbnN0IGJnVXJpID0gYXdhaXQgYmdQcm9taXNlO1xuXG4gICAgbWFuaWZlc3RbJ2ltYWdlJ10gPSBiZ1VyaTtcbiAgICBtYW5pZmVzdFsnbWVpX2Fubm90YXRpb25zJ10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgdHlwZTogJ0Fubm90YXRpb24nLFxuICAgICAgICBib2R5OiBtZWlVcmksXG4gICAgICAgIHRhcmdldDogYmdVcmlcbiAgICAgIH1cbiAgICBdO1xuICAgIHJlc29sdmUobWFuaWZlc3QpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBuZXcgZW50cnkgdG8gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0gaWQgXG4gKiBAcGFyYW0gdGl0bGUgXG4gKiBAcGFyYW0gY29udGVudCBcbiAqIEBwYXJhbSBzaW5nbGUgaXMgaXQgYSBzaW5nbGUgcGFnZSBvciBhIG1hbnVzY3JpcHRcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvY3VtZW50KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29udGVudDogQmxvYiwgc2luZ2xlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGIucHV0KHtcbiAgICAgIF9pZDogaWQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogc2luZ2xlID8gJ3BhZ2UnIDogJ21hbnVzY3JpcHQnLFxuICAgICAgX2F0dGFjaG1lbnRzOiB7XG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgZGF0YTogY29udGVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXNvbHZlKHRydWUpO1xuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICB3aW5kb3cuYWxlcnQoYEVycm9yIFVwbG9hZGluZyBEb2N1bWVudDogJHtlcnIubWVzc2FnZX0sIHRpdGxlOiAke25hbWV9LCBpZDogJHtpZH0uYCk7XG4gICAgICByZWplY3QoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSBpZCBcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZURvY3VtZW50KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5nZXQoaWQpXG4gICAgICAudGhlbihkb2MgPT4ge1xuICAgICAgICBkYi5yZW1vdmUoZG9jKVxuICAgICAgICAgIC50aGVuKF8gPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIGRvYyBmcm9tIHRoZSBkYXRhYmFzZSAoc3VwcG9ydHMgb25seSB0aXRsZSBmb3Igbm93KVxuICogQHBhcmFtIGlkIFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEb2NOYW1lKGlkOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIFJldHJpZXZlIGRvYyBmcm9tIGRhdGFiYXNlICh0byBnZXQgX3JldilcbiAgICBkYi5nZXQ8RG9jPihpZCkudGhlbihkb2MgPT4ge1xuXG4gICAgICAvLyBSZXRyaWV2ZSBtYW5pZmVzdCBmcm9tIGRhdGFiYXNlXG4gICAgICBkYi5nZXRBdHRhY2htZW50KGlkLCAnbWFuaWZlc3QnKS50aGVuKChtYW5pZmVzdEJsb2I6IEJsb2IpID0+IHtcbiAgICAgICAgbWFuaWZlc3RCbG9iLnRleHQoKS50aGVuKG1hbmlmZXN0VGV4dCA9PiB7XG4gICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKG1hbmlmZXN0VGV4dCk7XG4gICAgXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBtYW5pZmVzdFxuICAgICAgICAgIGRvYy5uYW1lID0gbmV3TmFtZTtcbiAgICAgICAgICBtYW5pZmVzdFsndGl0bGUnXSA9IG5ld05hbWU7XG4gICAgXG4gICAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIGJsb2JcbiAgICAgICAgICBjb25zdCBuZXdNYW5pZmVzdEJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicgfSk7XG5cbiAgICAgICAgICBkb2MuX2F0dGFjaG1lbnRzWydtYW5pZmVzdCddID0ge1xuICAgICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgICBkYXRhOiBuZXdNYW5pZmVzdEJsb2JcbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICAgIGRiLnB1dChkb2MpXG4gICAgICAgICAgICAudGhlbigoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7IC8vIGRiLnB1dFxuICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBtYW5pZmVzdFRleHRQcm9taXNlXG4gICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBkYi5nZXRBdHRhY2htZW50XG4gICAgfSkuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTsgLy8gZGIuZ2V0XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgSUVudHJ5LCBJRmlsZSwgSUZvbGRlciwgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IGRlbGV0ZURvY3VtZW50LCB1cGRhdGVEb2NOYW1lIH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IEZpbGVTeXN0ZW1NYW5hZ2VyIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IFNoaWZ0U2VsZWN0aW9uTWFuYWdlciwgZGFzaGJvYXJkU3RhdGUgfSBmcm9tICcuL0Rhc2hib2FyZFRvb2xzJztcbmltcG9ydCB7IEluaXRVcGxvYWRBcmVhIH0gZnJvbSAnLi9VcGxvYWRBcmVhJztcbmltcG9ydCAqIGFzIGNvbnRleHRNZW51Q29udGVudCBmcm9tICcuL0NvbnRleHRNZW51Q29udGVudCc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuXG5jb25zdCBkb2N1bWVudHNDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWNvbnRlbnQtY29udGFpbmVyJyk7XG5jb25zdCBiYWNrZ3JvdW5kQXJlYTogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IG9wZW5CdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI29wZW4tZG9jJyk7XG5jb25zdCByZW1vdmVCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JlbW92ZS1kb2MnKTtcbmNvbnN0IG5hdlBhdGhDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25hdi1wYXRoLWNvbnRhaW5lcicpO1xubGV0IGJhY2tCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWJhY2stYnRuJyk7XG5sZXQgZW1wdHlCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWVtcHR5LWJ0bicpO1xubGV0IGRlbGV0ZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZnMtZGVsZXRlLWJ0bicpO1xuY29uc3QgdXBsb2FkRG9jdW1lbnRzQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWQtbmV3LWRvYy1idXR0b24nKTtcbmNvbnN0IG5ld0ZvbGRlckJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkLWZvbGRlci1idXR0b24nKTtcblxuY29uc3Qgc2hpZnRTZWxlY3Rpb24gPSBuZXcgU2hpZnRTZWxlY3Rpb25NYW5hZ2VyKCk7XG5jb25zdCBmc20gPSBGaWxlU3lzdGVtTWFuYWdlcigpO1xuY29uc3Qgc3RhdGUgPSBkYXNoYm9hcmRTdGF0ZSgpO1xuXG5jb25zdCBtYWluU2VjdGlvbjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IGNvbnRleHRNZW51OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yaWdodC1jbGljay1maWxlLW1lbnUnKTtcbmNvbnN0IGNvbnRleHRNZW51Q29udGVudFdyYXBwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRleHQtbWVudS1pdGVtcy13cmFwcGVyJyk7XG5cbmxldCBtZXRhS2V5SXNQcmVzc2VkID0gZmFsc2U7XG5sZXQgc2hpZnRLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbmxldCBjdXJyZW50RHJhZ1RhcmdldCA9IG51bGw7XG5sZXQgcmlnaHRDbGlja2VkID0gZmFsc2U7XG5cbm9wZW5CdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkRvY3NIYW5kbGVyKTtcbnJlbW92ZUJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZW1vdmVEb2NzSGFuZGxlcik7XG51cGxvYWREb2N1bWVudHNCdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlblVwbG9hZEFyZWFIYW5kbGVyKTtcbm5ld0ZvbGRlckJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuTmV3Rm9sZGVyV2luZG93KTtcblxuLy8gU29ydGluZyBhbGdvcml0aG1zXG4vLyBjb25zdCBzb3J0QnlBbHBoYW51bWVyaWNhbCA9IChhOiBJRW50cnksIGI6IElFbnRyeSkgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbi8vIGNvbnN0IHNvcnRCeVRpbWUgPSAoYTogSUVudHJ5LCBiOiBJRW50cnkpID0+IHtcbi8vICAgY29uc3QgYVRpbWUgPSBhLm1ldGFkYXRhWydjcmVhdGVkX29uJ107XG4vLyAgIGNvbnN0IGJUaW1lID0gYi5tZXRhZGF0YVsnY3JlYXRlZF9vbiddO1xuLy8gICBpZiAoYVRpbWUgJiYgYlRpbWUpIHJldHVybiBhVGltZSAtIGJUaW1lO1xuLy8gICBlbHNlIGlmIChhVGltZSkgcmV0dXJuIC0xO1xuLy8gfTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICBpZiAoZS5tZXRhS2V5KSBtZXRhS2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgaWYgKGUuc2hpZnRLZXkpIHNoaWZ0S2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgLy8gTG9zZSBmb2N1cyBvbiBlc2Mga2V5XG4gIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgdXBkYXRlQWN0aW9uQmFyQnV0dG9ucygpO1xuICAgIHVwZGF0ZUZTQnV0dG9ucygpO1xuICB9XG59KTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGUpID0+IHtcbiAgaWYgKCFlLm1ldGFLZXkpIG1ldGFLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbiAgaWYgKCFlLnNoaWZ0S2V5KSBzaGlmdEtleUlzUHJlc3NlZCA9IGZhbHNlO1xufSk7XG5cbmJhY2tncm91bmRBcmVhPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEVsZW1lbnQ7XG4gIC8vIExvc2UgZm9jdXMgaWYgY2xpY2sgZXZlbnQgaW4gbWFpbiBzZWN0aW9uIGlzIG5vdCBhIGRvY3VtZW50IHRpbGVcbiAgY29uc3QgaXNEb2N1bWVudCA9IEJvb2xlYW4odGFyZ2V0LmNsb3Nlc3QoJy5kb2N1bWVudC1lbnRyeScpKTtcbiAgaWYgKCFpc0RvY3VtZW50KSB7XG4gICAgdW5zZWxlY3RBbGwoKTtcbiAgICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICAgIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgICB1cGRhdGVGU0J1dHRvbnMoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gb3BlblVwbG9hZEFyZWFIYW5kbGVyKCkge1xuICBpZiAoIXVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG4gIEluaXRVcGxvYWRBcmVhKHN0YXRlLmdldFBhcmVudEZvbGRlcigpKTtcbn1cblxuXG4vKipcbiAqIE9wZW5zIGEgbmV3IHRhYiB3aXRoIHRoZSBOZW9uIGVkaXRvciBmb3IgdGhlIGdpdmVuIGlkXG4gKiBcbiAqIEBwYXJhbSBpZCBrZXkgb2YgZmlsZSBpbiBiYmIgb3IgbWFuaWZlc3QgdXJsXG4gKiBAcGFyYW0gaXNTYW1wbGUgYm9vbGVhbiB0byBkZWNpZGUgd2hlcmUgdG8gZmV0Y2ggZmlsZVxuICovXG5mdW5jdGlvbiBvcGVuRWRpdG9yVGFiKGlkOiBzdHJpbmcsIGlzU2FtcGxlOiBib29sZWFuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IChpc1NhbXBsZSlcbiAgICA/IHsgbWFuaWZlc3Q6IGlkIH1cbiAgICA6IHsgc3RvcmFnZTogaWQgfTtcbiAgY29uc3QgcXVlcnkgPSBtYWtlUXVlcnkocGFyYW1zKTtcbiAgd2luZG93Lm9wZW4oYC4vZWRpdG9yLmh0bWw/JHtxdWVyeX1gLCAnX2JsYW5rJyk7XG59XG5cblxuLyoqXG4gKiBPcGVucyBlZGl0b3IgdGFiIGdpdmVuIGEgZG9jdW1lbnQgdGlsZSBlbGVtZW50XG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBcbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZW50cnk6IElGaWxlKSB7XG4gIGNvbnN0IGRvY3VtZW50VHlwZSA9IGVudHJ5Lm1ldGFkYXRhWydkb2N1bWVudCddO1xuICBpZiAodHlwZW9mIGRvY3VtZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaXNTYW1wbGUgPSBkb2N1bWVudFR5cGUgPT09ICdzYW1wbGUnO1xuICAgIG9wZW5FZGl0b3JUYWIoZW50cnkuaWQsIGlzU2FtcGxlKTtcbiAgfVxufVxuXG5cbi8qKlxuICogXG4gKiBAcGFyYW0gb2JqIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIG1ha2VRdWVyeShvYmopOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoa2V5ID0+IHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICB9KS5qb2luKCcmJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gc2VsZWN0KGluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRFbnRyaWVzKCkuYXQoaW5kZXgpO1xuICBzdGF0ZS5zZXRTZWxlY3Rpb24oaW5kZXgsIHRydWUpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZW50cnkuaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3QoaW5kZXg6IG51bWJlcikge1xuICBjb25zdCBpZCA9IHN0YXRlLmdldEVudHJpZXMoKS5hdChpbmRleCkuaWQ7XG4gIHN0YXRlLnNldFNlbGVjdGlvbihpbmRleCwgZmFsc2UpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3RBbGwoKSB7XG4gIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRvY3VtZW50LWVudHJ5LnNlbGVjdGVkJykpXG4gICAgLmZvckVhY2goKHRpbGUpID0+IHRpbGUuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gIHN0YXRlLnJlc2V0U2VsZWN0aW9uKCk7XG59XG5cbi8qKiBcbiAqIENyZWF0ZXMgYSBmb2xkZXIgb3IgZmlsZSB0aWxlIGVsZW1lbnQgZ2l2ZW4gYW4gZW50cnlcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnlcbiAqIEByZXR1cm5zIEhUTUxEaXZFbGVtZW50IHRpbGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBjcmVhdGVUaWxlKGVudHJ5OiBJRW50cnkpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1lbnRyeScpO1xuICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpOyAvLyBtYWtlIGZpbGUgb3IgZm9sZGVyIGRyYWdnYWJsZVxuXG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgaWNvbi5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1pY29uJyk7XG4gIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbmFtZS5pbm5lclRleHQgPSBlbnRyeS5uYW1lO1xuXG4gIHN3aXRjaCAoZW50cnkudHlwZSkge1xuICAgIGNhc2UgJ2ZvbGRlcic6XG4gICAgICAvLyBzZXQgdHlwZSBhdHRyaWIgYW5kIGlkXG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9sZGVyLWVudHJ5Jyk7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIGVudHJ5LmlkKTtcbiAgICAgIC8vIHNldCBpY29uXG4gICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9mb2xkZXItaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndHJhc2gnOlxuICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2ZvbGRlci1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBlbnRyeS5pZCk7XG4gICAgICAvLyBzZXQgaWNvblxuICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvdHJhc2gtaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmlsZS1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCAoZW50cnkgYXMgSUZpbGUpLmlkKTtcblxuICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGljb24gYW5kIGNsYXNzIHRvIGFkZCBkZXBlbmRpbmcgb24gZXhpc3RpbmcgbWV0YWRhdGFcbiAgICAgIGlmIChlbnRyeS5tZXRhZGF0YVsndHlwZSddID09PSAnbWFudXNjcmlwdCcpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFudXNjcmlwdC1lbnRyeScpO1xuICAgICAgICAvLyBzZXQgaWNvblxuICAgICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9tYW51c2NyaXB0LWljb24uc3ZnJztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVudHJ5Lm1ldGFkYXRhWyd0eXBlJ10gPT09ICdmb2xpbycpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9saW8tZW50cnknKTtcbiAgICAgICAgLy8gc2V0IGljb25cbiAgICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvZm9saW8taWNvbi5zdmcnO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIHNldCBpY29uIGZvciBubyB0eXBlXG4gICAgICAgIGljb24uc3JjID0gJy4vTmVvbi1naC9hc3NldHMvaW1nL2ZvbGlvLWljb24uc3ZnJztcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpY29uKTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5hbWUpO1xuXG4gIHJldHVybiBjb250YWluZXI7XG59XG5cbi8qKlxuICogQWRkcyBkYmxjbGljayBldmVudCBsaXN0ZW5lciB0byB0aWxlIGVsZW1lbnQgYW5kIGFkZHMgc2hpZnQgc2VsZWN0aW9uIGJlaGF2aW91clxuICogXG4gKiBAcGFyYW0gaW5kZXggYXMgZGlzcGxheWVkIG9uIGRhc2hib2FyZCB0byB1c2VyXG4gKiBAcGFyYW0gZW50cnkgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBjdXJyZW50IGZvbGRlclxuICogQHBhcmFtIHRpbGUgSFRNTERpdkVsZW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXg6IG51bWJlciwgZW50cnk6IElFbnRyeSwgdGlsZTogSFRNTERpdkVsZW1lbnQpIHtcbiAgLy8gZG91YmxlIGNsaWNrIGV2ZW50IGltbWVkaWF0ZWx5IG9wZW5zIGRvY3VtZW50XG4gIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGVudGVyRm9sZGVyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHVwZGF0ZURhc2hib2FyZChbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBlbnRyeSBhcyBJRm9sZGVyXSk7XG4gICAgfVxuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBlbnRlckZvbGRlciwgZmFsc2UpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBvcGVuRG9jc0hhbmRsZXIsIGZhbHNlKTtcbiAgfVxuICBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGUsIGluZGV4KTtcbiAgYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCk7XG59XG5cbi8qKlxuICogQWRkIHNoaWZ0IHNlbGVjdGlvbiBiZWhhdmlvdXIgdG8gaHRtbCB0aWxlIGVsZW1lbnRcbiAqIFxuICogV2hlbiBubyBrZXlzIGFyZSBwcmVzc2VkOiBlcmFzZSBhbnkgcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgc2VsZWN0IG9ubHkgY3VycmVudCB0aWxlXG4gKiBXaGVuIG1ldGEga2V5IGlzIHByZXNzZWQ6IGFkZCBjdXJyZW50IHRpbGUgdG8gc2VsZWN0aW9uIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLCBlbHNlIHJlbW92ZSBmcm9tXG4gKiBzZWxlY3Rpb24uIFdoZW4gc2hpZnQga2V5IGlzIHByZXNzZWQ6IHNlbGVjdCBhbGwgdGlsZXMgYmV0d2VlbiBjdXJyZW50IHRpbGUgYW5kIHByZXZpb3VzIHRpbGVcbiAqIFxuICogV2hlbiB0aGVyZSBpcyBhIHByZXZpb3VzIHNlbGVjdGlvbiwgdGhlIHN0YXJ0IG9mIHRoZSBzaGlmdCBzZWxlY3Rpb24gaXMgdGhlIGxhc3Qgc2VsZWN0ZWQgdGlsZS4gXG4gKiBTaGlmdCBjbGlja2luZyBhZnRlciB3aWxsIGFkZCB0aGUgc2hpZnQgc2VsZWN0aW9uIHRvIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gKiBcbiAqIEBwYXJhbSB0aWxlIFxuICogQHBhcmFtIGluZGV4IFxuICovXG5mdW5jdGlvbiBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGU6IEhUTUxEaXZFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihfZSkge1xuICAgIHNoaWZ0U2VsZWN0aW9uSGFuZGxlcihpbmRleCk7XG4gIH0sIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2hpZnRTZWxlY3Rpb25IYW5kbGVyKGluZGV4KSB7XG4gIGlmICghbWV0YUtleUlzUHJlc3NlZCAmJiAhc2hpZnRLZXlJc1ByZXNzZWQpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNlbGVjdChpbmRleCk7XG4gICAgc2hpZnRTZWxlY3Rpb24uc2V0U3RhcnQoaW5kZXgpO1xuICB9XG4gIGVsc2UgaWYgKG1ldGFLZXlJc1ByZXNzZWQpIHtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0aW9uKClbaW5kZXhdKSB7XG4gICAgICB1bnNlbGVjdChpbmRleCk7XG4gICAgICBzaGlmdFNlbGVjdGlvbi5zZXRTdGFydChzdGF0ZS5nZXRTZWxlY3Rpb24oKS5sYXN0SW5kZXhPZih0cnVlKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0KGluZGV4KTtcbiAgICAgIHNoaWZ0U2VsZWN0aW9uLnNldFN0YXJ0KGluZGV4KTsgXG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKHNoaWZ0S2V5SXNQcmVzc2VkKSB7XG4gICAgc2hpZnRTZWxlY3Rpb24uZ2V0UHJldlNlbGVjdGlvbigpLmZvckVhY2goKGlkeCkgPT4ge1xuICAgICAgdW5zZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgICBzaGlmdFNlbGVjdGlvbi5zZXRFbmQoaW5kZXgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLmdldFNlbGVjdGlvbihzdGF0ZS5nZXRTZWxlY3Rpb24oKSkuZm9yRWFjaCgoaWR4KSA9PiB7XG4gICAgICBzZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG4gIHVwZGF0ZUZTQnV0dG9ucygpO1xufVxuLyoqXG4gKiBPcGVucyBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkLlxuICogXG4gKiBJZiBhIGZvbGRlciBpcyBzZWxlY3RlZCwgb3BlbnMgZm9sZGVyLlxuICogSWYgYSBmaWxlKHMpIGlzIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICovXG5mdW5jdGlvbiBvcGVuRG9jc0hhbmRsZXIoKSB7XG4gIGlmICghb3BlbkJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgLy8gT3BlbiBmb2xkZXIgaWYgb25seSBvbmUgZm9sZGVyIGlzIHNlbGVjdGVkXG4gIGlmIChzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGggPT09IDEgfHwgc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG5ld1BhdGggPSBbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSBhcyBJRm9sZGVyXTtcbiAgICB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT3BlbiBhbGwgZmlsZXMsIGlnbm9yaW5nIGlmIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG4gIHN0YXRlLmdldFNlbGVjdGVkRmlsZXMoKS5mb3JFYWNoKChlbnRyeTogSUVudHJ5KSA9PiBvcGVuRmlsZShlbnRyeSBhcyBJRmlsZSkpO1xuICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICB1bnNlbGVjdEFsbCgpO1xuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG59XG5cbi8qKlxuICogTW92ZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkIHRvIHRyYXNoLiBcbiAqIFxuICovXG5mdW5jdGlvbiByZW1vdmVEb2NzSGFuZGxlcigpIHtcbiAgaWYgKCFyZW1vdmVCdXR0b24uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuXG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICBcbiAgZm9yIChsZXQgZW50cnkgb2Ygc2VsZWN0ZWRFbnRyaWVzKSB7XG4gICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZW50cnksIHsgcmVtb3ZlZF9vbjogZGF0ZXRpbWUsIHJlY292ZXJfZm9sZGVyOiBzdGF0ZS5nZXRGb2xkZXJQYXRoTmFtZXMoKSB9KTtcbiAgfVxuXG4gIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgdHJhc2hGb2xkZXIpO1xufVxuXG5mdW5jdGlvbiBwdXRCYWNrRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgXG4gIGZvciAobGV0IGVudHJ5IG9mIHNlbGVjdGVkRW50cmllcykge1xuICAgIGNvbnN0IGZvbGRlclBhdGhOYW1lcyA9IGVudHJ5Lm1ldGFkYXRhWydyZWNvdmVyX2ZvbGRlciddIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHRhcmdldEZvbGRlciA9IHN0YXRlLmdldEZvbGRlclBhdGhCeU5hbWVzKGZvbGRlclBhdGhOYW1lcyk7XG4gICAgaWYgKHRhcmdldEZvbGRlcikge1xuICAgICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMucmVtb3ZlTWV0YWRhdGEoZW50cnksIFsncmVtb3ZlZF9vbicsICdyZWNvdmVyX2ZvbGRlciddKTtcbiAgICAgIGNvbnN0IGRhdGVUaW1lUGF0dGVybiA9IC8gLSBcXGR7MSwyfVxcL1xcZHsxLDJ9XFwvXFxkezR9LCBcXGR7MSwyfTpcXGR7Mn06XFxkezJ9IFtBUE1hcG1dezJ9JC87XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlbmFtZSBlbmRzIHdpdGggdGhlIGRhdGUgdGltZSBwYXR0ZXJuXG4gICAgICBpZiAoZGF0ZVRpbWVQYXR0ZXJuLnRlc3QoZW50cnkubmFtZSkpIHtcbiAgICAgICAgZW50cnkubmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZShkYXRlVGltZVBhdHRlcm4sICcnKTtcbiAgICAgIH1cbiAgICAgIG1vdmVUb0ZvbGRlcihbZW50cnldLCBwYXJlbnRGb2xkZXIsIHRhcmdldEZvbGRlcik7XG4gICAgfSAgICBcbiAgfVxufVxuXG4vKipcbiAqIERlbGV0ZSBhIGZpbGVcbiAqIFxuICogQHBhcmFtIGZpbGUgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZpbGVFbnRyeShmaWxlOiBJRmlsZSwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGVsZXRlRG9jdW1lbnQoZmlsZS5pZClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLnJlbW92ZUVudHJ5KGZpbGUsIHBhcmVudEZvbGRlcik7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHJlamVjdChmYWxzZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBmb2xkZXIgYW5kIGl0cyBjb250ZW50XG4gKiBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZvbGRlckVudHJ5KGZvbGRlcjogSUZvbGRlciwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gZm9sZGVyLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShjaGlsZCBhcyBJRmlsZSwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoY2hpbGQgYXMgSUZvbGRlciwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7IC8vIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCByZXNvbHZpbmcgZm9yIHNhZmV0eVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5yZW1vdmVFbnRyeShmb2xkZXIsIHBhcmVudEZvbGRlcik7IC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyZW50IGZvbGRlclxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKGZhbHNlKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnRzIG9uIGRhc2hib2FyZC4gXG4gKiBcbiAqIElmIGEgZm9sZGVyIGlzIHNlbGVjdGVkLCBkZWxldGVzIGZvbGRlci5cbiAqIElmIGEgZmlsZShzKSBpcyBzZWxlY3RlZCwgZGVsZXRlcyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBkZWxldGVzIGFsbC5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IGFsbEVudHJpZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKTtcblxuICAvLyBDcmVhdGUgYSBmb3JtYXR0ZWQgbGlzdCBvZiBmaWxlbmFtZXMgdG8gZGlzcGxheSBpbiBhbGVydCBtZXNzYWdlXG4gIGNvbnN0IGNyZWF0ZUxpc3QgPSAoZW50cnlBcnJheTogSUVudHJ5W10pID0+IGVudHJ5QXJyYXkubWFwKGVudHJ5ID0+IGAtICR7ZW50cnkubmFtZX0gKCR7ZW50cnkudHlwZX0pYCkuam9pbignXFxuJyk7XG4gIFxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTpcXG4ke2NyZWF0ZUxpc3QoYWxsRW50cmllcyl9XFxuVGhpcyBhY3Rpb24gaXMgaXJyZXZlcnNpYmxlLmA7XG5cbiAgY29uc3QgaXNDb25maXJtZWQgPSB3aW5kb3cuY29uZmlybShhbGVydE1lc3NhZ2UpO1xuXG4gIGlmIChpc0NvbmZpcm1lZCkge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gYWxsRW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRmlsZUVudHJ5KGVudHJ5IGFzIElGaWxlLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCggZXJyID0+IGNvbnNvbGUuZGVidWcoJ2ZhaWxlZCB0byBkZWxldGUgZmlsZXM6ICcsIGVycikpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZW1wdHlUcmFzaEhhbmRsZXIoKSB7XG4gIGNvbnN0IHRyYXNoRm9sZGVyID0gc3RhdGUuZ2V0VHJhc2hGb2xkZXIoKTtcblxuICBpZiAoIXRyYXNoRm9sZGVyKSB7XG4gICAgY29uc29sZS5lcnJvcignVHJhc2ggZm9sZGVyIG5vdCBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBhbGwgdGhlIGZpbGVzIGluIFRyYXNoIEZvbGRlcj9cXG5UaGlzIGFjdGlvbiBpcyBpcnJldmVyc2libGUuJztcblxuICBjb25zdCBpc0NvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKGFsZXJ0TWVzc2FnZSk7XG5cbiAgaWYgKGlzQ29uZmlybWVkKSB7XG5cbiAgICBjb25zdCBkZWxldGVQcm9taXNlcyA9IHRyYXNoRm9sZGVyLmNoaWxkcmVuLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgdHJhc2hGb2xkZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgLy8gU2hvdWxkbid0IGhhcHBlbiwgYnV0IHJlc29sdmluZyBmb3Igc2FmZXR5XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChkZWxldGVQcm9taXNlcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gQWZ0ZXIgZGVsZXRpbmcgYWxsIGNvbnRlbnQsIHVwZGF0ZSB0aGUgZGFzaGJvYXJkXG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmRlYnVnKCdmYWlsZWQgdG8gZGVsZXRlIGZpbGVzOiAnLCBlcnIpKTtcbiAgfVxufVxuXG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmlzaWJpbGl0eSBvZiBhY3Rpb24gYmFyIGJ1dHRvbnMgYmFzZWQgb24gY3VycmVudCBzZWxlY3Rpb25zXG4gKiBcbiAqIE5vdGU6IGJldHRlciBub3QgdG8gY2hhbmdlIHRoZSBvcmRlclxuICovXG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCkge1xuICAvLyBpbnNpZGUgLi9TYW1wbGVzwqBvciBzZWxlY3RpbmcgdGhlIHNhbXBsZXMgZm9sZGVyXG4gIGlmIChzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gICAgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdICYmIHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm1ldGFkYXRhWydpbW11dGFibGUnXSkpIHtcbiAgICB1cGxvYWREb2N1bWVudHNCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHJlbW92ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxuICAvLyBpbnNpZGUgLi9UcmFzaFxuICBlbHNlIGlmIChzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gc2VsZWN0aW5nIHRoZSB0cmFzaCBmb2xkZXJcbiAgZWxzZSBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH0gXG4gIC8vIHNlbGVjdGluZyBlbnRyaWVzXG4gIGVsc2UgaWYgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gbm90aGluZyBzZWxlY3RlZCwgbm90IGluIC4vU2FtcGxlcyBvciAuL1RyYXNoXG4gIGVsc2Uge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBuYXYgcGF0aCB3aXRoIGN1cnJlbnQgZm9sZGVyIHBhdGhcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTmF2UGF0aCgpOiB2b2lkIHtcbiAgbmF2UGF0aENvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAvLyBjcmVhdGUgbmF2IGVsZW1lbnRzIGFuZCBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IG5hdkVsZW1lbnRzID0gc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLm1hcCgoZm9sZGVyLCBpZHgpID0+IHtcbiAgICBjb25zdCBuYXZTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbmF2U2VjdGlvbi5jbGFzc0xpc3QuYWRkKCduYXYtcGF0aC1zZWN0aW9uJyk7XG4gICAgbmF2U2VjdGlvbi5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgaWR4ICsgMSk7XG4gICAgbmF2U2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IGF3YWl0IHVwZGF0ZURhc2hib2FyZCh0YXJnZXRQYXRoKSk7XG4gICAgLy8gYWRkIGRyb3AgdGFyZ2V0IHRvIG1vdmUgZHJhZ2dlZCBlbGVtZW50IHRvIHRoZSBwcm9zcGVjdGl2ZSBmb2xkZXJzXG4gICAgYWRkRHJvcFRhcmdldExpc3RlbmVycyhuYXZTZWN0aW9uLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSwgdGFyZ2V0UGF0aC5hdCgtMSkpO1xuXG4gICAgcmV0dXJuIG5hdlNlY3Rpb247XG4gIH0pO1xuXG4gIC8vIGFkZCBuYXYgZWxlbWVudHMgdG8gbmF2IHBhdGggY29udGFpbmVyXG4gIG5hdkVsZW1lbnRzLmZvckVhY2goKG5hdkVsZW1lbnQsIGlkeCkgPT4ge1xuICAgIG5hdlBhdGhDb250YWluZXIuYXBwZW5kQ2hpbGQobmF2RWxlbWVudCk7XG4gICAgaWYgKGlkeCAhPT0gbmF2RWxlbWVudHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3Qgc2VwZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZXBlcmF0b3IuY2xhc3NMaXN0LmFkZCgnbmF2LXBhdGgtc2VwZXJhdG9yJyk7XG4gICAgICBzZXBlcmF0b3IuaW5uZXJIVE1MID0gJyAvICc7XG4gICAgICBuYXZQYXRoQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlcGVyYXRvcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBiYWNrIGJ1dHRvbiB3aXRoIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5mdW5jdGlvbiB1cGRhdGVCYWNrQnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBiYWNrQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgYmFja0J1dHRvbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChidXR0b25DbG9uZSwgYmFja0J1dHRvbik7XG5cbiAgLy8gRGlzYWJsZSBiYWNrIGJ1dHRvbiBpZiBhdCByb290XG4gIGNvbnN0IGlzUm9vdCA9IHN0YXRlLmdldEZvbGRlclBhdGgoKS5sZW5ndGggPT09IDE7XG4gIGlmIChpc1Jvb3QpIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgYnV0dG9uQ2xvbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVOYXZpZ2F0ZUJhY2spO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2VudGVyJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJykpO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2xlYXZlJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnMoYnV0dG9uQ2xvbmUsIHN0YXRlLmdldFBhcmVudEZvbGRlcigpLCBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuYXQoLTIpKTtcbiAgfVxuICBiYWNrQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVtcHR5QnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBlbXB0eUJ1dHRvbi5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGVtcHR5QnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBlbXB0eUJ1dHRvbik7XG5cbiAgY29uc3QgcGFyZW50Rm9sZGVyID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG5cbiAgLy8gRGlzcGxheSBpZiBpbiB0cmFzaFxuICBpZiAocGFyZW50Rm9sZGVyLnR5cGUgPT09ICd0cmFzaCcgfHwgc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICAvLyBBY3RpdmF0ZSBidXR0b24gaWYgaGFzIGNvbnRlbnQgYW5kIG5vdCBzZWxlY3Rpbmcgd2hlbiBmaXJzdCBsZXZlbCBwYXJlbnQgaXMgdHJhc2hcbiAgICBpZiAocGFyZW50Rm9sZGVyLmNoaWxkcmVuLmxlbmd0aCAmJiAhc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoICYmIHBhcmVudEZvbGRlci50eXBlID09PSAndHJhc2gnKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW1wdHlUcmFzaEhhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGJ1dHRvbiBpZiBubyBjb250ZW50XG4gICAgZWxzZSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG4gIGVtcHR5QnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlbGV0ZUJ1dHRvbigpIHtcbiAgLy8gRXJhc2UgcHJldmlvdXMgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IGJ1dHRvbkNsb25lID0gZGVsZXRlQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgZGVsZXRlQnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBkZWxldGVCdXR0b24pO1xuXG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuICAvLyBEaXNwbGF5IGlmIGluIHRyYXNoXG4gIGlmIChwYXJlbnRGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyB8fCBzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIC8vIEFkZCBsaXN0ZW5lciBpZiBzZWxlY3RzIGVudHJpZXNcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVsZXRlRG9jc0hhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGlmIG5vdGhpbmcgc2VsZWN0ZWRcbiAgICBlbHNlIHtcbiAgICAgIGJ1dHRvbkNsb25lLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgYnV0dG9uQ2xvbmUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbiAgZGVsZXRlQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZTQnV0dG9ucygpIHtcbiAgdXBkYXRlQmFja0J1dHRvbigpO1xuICB1cGRhdGVFbXB0eUJ1dHRvbigpO1xuICB1cGRhdGVEZWxldGVCdXR0b24oKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGNsaWNrIGV2ZW50IG9uIGJhY2sgYnV0dG9uIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZUJhY2soKSB7XG4gIGNvbnN0IG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgLTEpO1xuICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG59XG5cbi8qKlxuICogQWRkIG5ldyBGb2xkZXIgdG8gY3VycmVudCBmb2xkZXIgYW5kIHJlZnJlc2ggZGFzaGJvYXJkXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUFkZEZvbGRlcihmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgLy8gY3JlYXRlIG5ldyBmb2xkZXIgZWxlbWVudFxuICBjb25zdCBuZXdGb2xkZXJUaWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld0ZvbGRlclRpbGUuY2xhc3NMaXN0LmFkZCgnZG9jdW1lbnQtZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5jbGFzc0xpc3QuYWRkKCdmb2xkZXItZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ25ldy1mb2xkZXInKTtcblxuICBjb25zdCBuZXdGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRm9sZGVyKGZvbGRlck5hbWUpO1xuICBjb25zdCBzdWNjZWVkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobmV3Rm9sZGVyLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gIGlmIChzdWNjZWVkZWQpIHtcbiAgICBuZXdGb2xkZXJUaWxlLnNldEF0dHJpYnV0ZSgnaWQnLCBmb2xkZXJOYW1lKTtcbiAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBuZXdGb2xkZXJUaWxlLnJlbW92ZSgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmFtZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnQgb24gZGFzaGJvYXJkLCB1cGRhdGluZyB0aGUgZGF0YWJhc2UgZm9yIGZpbGVzXG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnkgdG8gcmVuYW1lXG4gKi9cbmZ1bmN0aW9uIHJlbmFtZUVudHJ5KGVudHJ5OiBJRW50cnksIG5ld05hbWU6IHN0cmluZykgeyAgXG4gIGNvbnN0IHN1Y2NlZWRlZCA9IEZpbGVTeXN0ZW1Ub29scy5yZW5hbWVFbnRyeShlbnRyeSwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCksIG5ld05hbWUpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gVXBkYXRlIGRhdGFiYXNlIGlmIGVudHJ5IGlzIGEgZmlsZVxuICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBlbnRyeSBhcyBJRmlsZTtcbiAgICAgIHVwZGF0ZURvY05hbWUoZmlsZS5pZCwgbmV3TmFtZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZURhc2hib2FyZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEdpdmVuIGFuIGVudHJ5IGlkLCByZXR1cm5zIHRoZSBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IGZvbGRlclxuICogXG4gKiBAcGFyYW0gaWQgXG4gKiBAcmV0dXJucyBJRW50cnlcbiovXG5mdW5jdGlvbiBnZXRFbnRyeUJ5SWQoaWQ6IHN0cmluZyk6IElFbnRyeSB7XG4gIGNvbnN0IHRhcmdldEVudHJ5ID0gc3RhdGUuZ2V0RW50cmllcygpLmZpbmQoZW50cnkgPT4ge1xuICAgIHJldHVybiBlbnRyeS5pZCA9PT0gaWQ7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0RW50cnk7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgY2hhbmdlcyBpbiBmaWxlIHN5c3RlbSBpbiBkYXNoYm9hcmQgVUlcbiAqIFxuICogQHBhcmFtIG5ld1BhdGggSWYgcHJvdmlkZWQsIHVzZXMgdGhpcyBwYXRoIHRvIHVwZGF0ZSBkYXNoYm9hcmQuIE90aGVyd2lzZSwgdXNlcyBjdXJyZW50IHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aD86IElGb2xkZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW5ld1BhdGgpIG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCk7XG4gIHN0YXRlLnNldEZvbGRlclBhdGgobmV3UGF0aCk7XG4gIGNvbnN0IGN1cnJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgLy8gY2xlYXIgY29udGVudCBhbmQgc2VsZWN0aW9uXG4gIGRvY3VtZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgc2hpZnRTZWxlY3Rpb24ucmVzZXQoKTtcblxuICAvLyB1cGRhdGUgb3JkZXJlZCBpdGVtcyBmb3IgY3VycmVudCBmcy1jb250ZW50c1xuICBzdGF0ZS5zZXRFbnRyaWVzKGN1cnJlbnRGb2xkZXIuY2hpbGRyZW4pO1xuXG4gIC8vIHBvcHVsYXRlIGZvbGRlciBjb250ZW50c1xuICBjdXJyZW50Rm9sZGVyLmNoaWxkcmVuLmZvckVhY2goYXN5bmMgKGVudHJ5LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBjcmVhdGVUaWxlKGVudHJ5KTtcbiAgICBkb2N1bWVudHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGlsZSk7XG4gICAgYXdhaXQgYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXgsIGVudHJ5LCB0aWxlKTtcbiAgfSk7IFxuXG4gIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgdXBkYXRlTmF2UGF0aCgpO1xuICB1cGRhdGVGU0J1dHRvbnMoKTtcblxuICBjb25zdCBpbmZvQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1iYWRnZScpO1xuICBpZiAoc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSAnRmlsZXMgd2lsbCBiZSBkZWxldGVkIGFmdGVyIDMwIGRheXMnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyM5REIyQkYnO1xuICB9IGVsc2Uge1xuICAgIGluZm9CYWRnZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7XG4gIH1cblxuICAvLyBhZGQgZHJhZyBhbmQgZHJvcCBsaXN0ZW5lcnMgZm9yIGN1cnJlbnQgZm9sZGVyIGNvbnRlbnRcbiAgY3VycmVudEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbnRyeS5pZCk7XG4gICAgYWRkRHJhZ1N0YXJ0TGlzdGVuZXIodGlsZSk7XG5cbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicgfHwgZW50cnkudHlwZSA9PT0gJ3RyYXNoJykgeyBcbiAgICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnModGlsZSwgY3VycmVudEZvbGRlciwgZW50cnkgYXMgSUZvbGRlcik7XG4gICAgfVxuICB9KTtcbiAgXG4gIGZzbS5zZXRGaWxlU3lzdGVtKHN0YXRlLmdldEZvbGRlclBhdGgoKS5hdCgwKSk7XG59XG5cbmZ1bmN0aW9uIGFkZERyYWdTdGFydExpc3RlbmVyKGVsZW06IEVsZW1lbnQpIHtcbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICBjdXJyZW50RHJhZ1RhcmdldCA9IGUudGFyZ2V0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRHJvcFRhcmdldExpc3RlbmVycyhlbGVtOiBFbGVtZW50LCBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcjogSUZvbGRlcikge1xuICAvKipcbiAgICAgKiBUaGUgZHJhZ2VudGVyIGFuZCBkcmFnb3ZlciBldmVudHMgbmVlZCB0byBiZSBvdmVycmlkZW4gaW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBkcmFnLWFuZC1kcm9wIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogUmVhZCBtb3JlIGF0OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9EcmFnX29wZXJhdGlvbnNcbiAgICAgKi9cbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlbGVtLmNsYXNzTGlzdC5hZGQoJ2RyYWdlbnRlcicpO1xuICB9KTsgICAgXG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZW50ZXInKTtcbiAgfSk7XG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBjcmVhdGVIYW5kbGVEcm9wKGN1cnJlbnRGb2xkZXIsIGRlc3RpbmF0aW9uRm9sZGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhhbmRsZURyb3AoY3VycmVudEZvbGRlcjogSUZvbGRlciwgZGVzdGluYXRpb25Gb2xkZXI6IElGb2xkZXIpIHtcbiAgcmV0dXJuIChlOiBFdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIGdldCB0aGUgSUQgb2YgdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICAgIGNvbnN0IGRyYWdUYXJnZXRJRCA9ICg8SFRNTEVsZW1lbnQ+IGN1cnJlbnREcmFnVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAvLyBVc2luZyBkcmFnVGFyZ2V0SUQsIGZpbmQgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIEZpbGUgYmVpbmcgZHJvcHBlZC5cbiAgICBjb25zdCBkcmFnRW50cnkgPSBnZXRFbnRyeUJ5SWQoZHJhZ1RhcmdldElEKTtcblxuICAgIC8vIElmIGZvbGRlciwgZGVzdGluYXRpb24sIGFuZCBmaWxlIHdlcmUgZm91bmQsIG1vdmUgdGhlIGZpbGUgaW50byB0aGUgZm9sZGVyLiBHcmVhdCBzdWNjZXNzIVxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgZm9sZGVyIGlzIG5vdCBiZWluZyBkcm9wcGVkIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICAgIGlmIChkcmFnRW50cnkgJiYgZHJhZ0VudHJ5ICE9PSBkZXN0aW5hdGlvbkZvbGRlcikge1xuICAgICAgbW92ZVRvRm9sZGVyKFtkcmFnRW50cnldLCBjdXJyZW50Rm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcik7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgdG8gbmV3Rm9sZGVyLCBhbmQgaWYgc28sIG1vdmVzIGl0IGFuZCByZWZyZXNoZXMgZGFzaGJvYXJkLlxuICogXG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHBhcmFtIG5ld0ZvbGRlciBcbiAqL1xuZnVuY3Rpb24gbW92ZVRvRm9sZGVyKGVudHJpZXM6IElFbnRyeVtdLCBwYXJlbnRGb2xkZXI6IElGb2xkZXIsIG5ld0ZvbGRlcjogSUZvbGRlcikge1xuICBjb25zdCBlcnJvck1lc3NhZ2VzID0gW107XG4gIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAvLyBIYW5kbGUgbmFtZSBjb25mbGljdHMgZm9yIHRyYXNoIGZvbGRlclxuICAgIGlmIChuZXdGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyAmJiBuZXdGb2xkZXIuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKSkge1xuICAgICAgZW50cnkubmFtZSA9IHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gRmlsZVN5c3RlbVRvb2xzLmNhbk1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICAgIGlmICghcmVzcG9uc2Uuc3VjY2VlZGVkKSBlcnJvck1lc3NhZ2VzLnB1c2gocmVzcG9uc2UuZXJyb3IpO1xuICAgIGVsc2UgRmlsZVN5c3RlbVRvb2xzLm1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICB9KTtcbiAgXG4gIGVycm9yTWVzc2FnZXMuZmlsdGVyKChtc2csIGlkeCwgYXJyKSA9PiBhcnIuaW5kZXhPZihtc2cpID09PSBpZHgpO1xuICBpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwKSB3aW5kb3cuYWxlcnQoZXJyb3JNZXNzYWdlcy5qb2luKCdcXG4nKSk7XG5cbiAgdXBkYXRlRGFzaGJvYXJkKCk7XG59XG5cbmZ1bmN0aW9uIHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICByZXR1cm4gZmlsZW5hbWUgKyAnIC0gJyArIGRhdGV0aW1lO1xufVxuXG4vKipcbiAqIE9wZW5zIE1vdmUtVG8gbWVudSBtb2RhbCB3aW5kb3cgd2l0aCBVSSBmb3IgbW92aW5nIHNlbGVjdGVkIGVudHJpZXMgdG8gYSBuZXcgZm9sZGVyLlxuICovXG5mdW5jdGlvbiBvcGVuTW92ZVRvV2luZG93KCkge1xuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5NT1ZFX1RPKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRFbnRyaWVzID0gc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCk7XG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuXG4gIC8vIENhbGxiYWNrIGZvciB3aGVuIHVzZXIgZG91YmxlLWNsaWNrcyBvbiBhIGZvbGRlciBhbmQgbW92ZXMgc2VsZWN0aW9uXG4gIGNvbnN0IG1vdmVUb0NhbGxiYWNrID0gKG5ld1BhcmVudEZvbGRlcjogSUZvbGRlcikgPT4ge1xuICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgbmV3UGFyZW50Rm9sZGVyKTtcbiAgfTtcblxuICBjb25zdCByb290VHJlZSA9IGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2spO1xuICBjb25zdCB0cmVlQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRyZWVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndHJlZS1jb250YWluZXInKTtcbiAgdHJlZUNvbnRhaW5lci5hcHBlbmRDaGlsZChyb290VHJlZSk7XG5cbiAgY29uc3QgbW9kYWxDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1jb250YWluZXInKTtcbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwibW92ZS1tZW51LW1zZ1wiPkRvdWJsZS1jbGljayB0aGUgZm9sZGVyIHlvdSB3YW50IHRvIG1vdmUgeW91ciBpdGVtcyB0byE8L3NwYW4+JztcbiAgbW9kYWxDb250YWluZXIuYXBwZW5kQ2hpbGQodHJlZUNvbnRhaW5lcik7XG59XG5cbi8qKlxuICogT3BlbnMgTmV3IEZvbGRlciBtZW51IG1vZGFsIHdpbmRvdyB0aGF0IHByb21wdHMgZm9yIGEgbmFtZS5cbiAqIE9uIGNsaWNraW5nIHRoZSBDcmVhdGUgYnV0dG9uLCBjbG9zZXMgbW9kYWwgd2luZG93IGFuZCBjcmVhdGVzIG5ldyBmb2xkZXIuXG4gKi9cbmZ1bmN0aW9uIG9wZW5OZXdGb2xkZXJXaW5kb3coKSB7XG4gIGlmICghbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHJldHVybjtcblxuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgXG4gIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hib2FyZF9pbnB1dF9jb250YWluZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbF9kYXNoYm9hcmQnKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuXG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXQuaWQgPSAnZGFzaGJvYXJkX2lucHV0JztcbiAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgaW5wdXQucGxhY2Vob2xkZXIgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXQudmFsdWUgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXRDb250YWluZXIuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuXG4gIGlucHV0LnNlbGVjdCgpO1xuICBpbnB1dC5mb2N1cygpO1xuXG4gIGNhbmNlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpKTtcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3csIGlucHV0LnZhbHVlKSk7XG5cbiAgaW5wdXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uZmlybU5ld0ZvbGRlckFjdGlvbihtb2RhbFdpbmRvdywgaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LCBmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFuYW1lRXhpc3RzKGZvbGRlck5hbWUpKSB7XG4gICAgbW9kYWxXaW5kb3cuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgaGFuZGxlQWRkRm9sZGVyKGZvbGRlck5hbWUpO1xuICB9IFxuICBlbHNlIHtcbiAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmb2xkZXIgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgb3Blbk5ld0ZvbGRlcldpbmRvdygpO1xuICB9XG59XG5cbi8qKlxuICogT3BlbnMgUmVuYW1lIG1lbnUgbW9kYWwgd2luZG93IHRoYXQgcHJvbXB0cyBmb3IgYSBuZXcgbmFtZS5cbiAqL1xuZnVuY3Rpb24gb3BlblJlbmFtZVdpbmRvdygpIHtcbiAgLy8gZ2VuZXJhdGUgbW9kYWwgd2luZG93XG4gIGNvbnN0IG1vZGFsV2luZG93ID0gbmV3IE1vZGFsV2luZG93KCk7XG4gIG1vZGFsV2luZG93LnNldE1vZGFsV2luZG93VmlldyhNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3QgaW5wdXRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkX2lucHV0X2NvbnRhaW5lcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICBjb25zdCBjYW5jZWxCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FuY2VsX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBjb25maXJtQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1fZGFzaGJvYXJkJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICBpbnB1dC5pZCA9ICdkYXNoYm9hcmRfaW5wdXQnO1xuICBpbnB1dC50eXBlID0gJ3RleHQnO1xuICBjb25zdCBwcmV2TmFtZSA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm5hbWU7XG4gIGlucHV0LnBsYWNlaG9sZGVyID0gcHJldk5hbWU7XG4gIGlucHV0LnZhbHVlID0gcHJldk5hbWU7XG4gIGlucHV0Q29udGFpbmVyLmFwcGVuZENoaWxkKGlucHV0KTtcblxuICBpbnB1dC5zZWxlY3QoKTtcbiAgaW5wdXQuZm9jdXMoKTtcblxuICBjYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKSk7XG4gIGNvbmZpcm1CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpKTtcblxuICBpbnB1dENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpO1xuICAgIH1cbiAgfSk7XG4gIFxufVxuXG4vLyBPbiBjb25maXJtYXRpb24sIGNsb3NlIG1vZGFsIHdpbmRvdyBhbmQgcmVuYW1lIGVudHJ5IChpZiBmaWxlLCBkYXRhYmFzZSBpcyB1cGRhdGVkKVxuZnVuY3Rpb24gY29uZmlybVJlbmFtZUFjdGlvbihtb2RhbFdpbmRvdzogTW9kYWxXaW5kb3csIG5ld05hbWU6IHN0cmluZywgcHJldk5hbWU6IHN0cmluZykge1xuICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCBuYW1lc1xuICBpZiAobmV3TmFtZSA9PT0gcHJldk5hbWUpIHtcbiAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoIW5hbWVFeGlzdHMobmV3TmFtZSkpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXTtcbiAgICAgIHJlbmFtZUVudHJ5KGVudHJ5LCBuZXdOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmaWxlbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgICBvcGVuUmVuYW1lV2luZG93KCk7XG4gICAgfVxuICB9ICBcbn1cblxuZnVuY3Rpb24gbmFtZUV4aXN0cyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50ID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG4gIHJldHVybiBwYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZm9sZGVyIHRyZWUgc3RydWN0dXJlIGZvciBtb3ZlLXRvIG1lbnVcbiAqIFxuICogQHBhcmFtIGZvbGRlciBJRm9sZGVyIHRvIGdlbmVyYXRlIHRyZWUgc3RydWN0dXJlIGZvciBhbmQgYWxsIGl0cyBzdWJmb2xkZXJzXG4gKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gdXNlciBkb3VibGUtY2xpY2tzIG9uIGEgZm9sZGVyIGFuZCBtb3ZlcyBzZWxlY3Rpb25cbiAqIEBwYXJhbSBkZWdyZWUgVGhlIGxldmVsIG9mIHN1YmZvbGRlcnMgZGVlcFxuICogQHJldHVybnMgTGlzdCBpdGVtIG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVGb2xkZXJUcmVlKGZvbGRlcjogSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQsIGRlZ3JlZTogbnVtYmVyKTogSFRNTExJRWxlbWVudCB7XG5cbiAgY29uc3QgdHJlZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gIC8vIGNvbnRhaW5lciBmb3IgZm9sZGVyIG5hbWUgYW5kIGFycm93XG4gIGNvbnN0IGxpQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGxpQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3RyZWUtbGktY29udGFpbmVyJyk7XG5cbiAgLy8gRm9sZGVyIFRFWFQ6IGNsaWNrIHRvIHNlbGVjdCAoZm9yIFVYKSwgZG91YmxlIGNsaWNrIHRvIG1vdmUgaXRlbXMgdG8gZm9sZGVyXG4gIGNvbnN0IGZvbGRlck5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCd0cmVlLW5hbWUnKTtcbiAgZm9sZGVyTmFtZS5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAvLyBPbiBzaW5nbGUgY2xpY2ssIGhpZ2hsaWdodC9zZWxlY3QgZm9sZGVyIG5hbWVcbiAgZm9sZGVyTmFtZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHJlZS1uYW1lJykuZm9yRWFjaChlbGVtID0+IGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICB9KTtcblxuICAvLyBPbiBkb3VibGUgY2xpY2ssIG1vdmUgc2VsZWN0ZWQgaXRlbXMgdG8gZm9sZGVyXG4gIGZvbGRlck5hbWUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XG4gICAgbW92ZVRvQ2FsbGJhY2soZm9sZGVyKTtcbiAgfSk7XG5cbiAgLy8gSWYgRm9sZGVyIGhhcyBubyBzdWJmb2xkZXJzLCByZXR1cm4gd2l0aG91dCBuZXN0ZWQgdWxcbiAgY29uc3QgaXNMZWFmID0gZm9sZGVyLmNoaWxkcmVuLmV2ZXJ5KGVudHJ5ID0+IGVudHJ5LnR5cGUgIT09ICdmb2xkZXInKTtcbiAgaWYgKGlzTGVhZikge1xuICAgIHRyZWUuYXBwZW5kQ2hpbGQobGlDb250YWluZXIpO1xuICAgIGxpQ29udGFpbmVyLmFwcGVuZENoaWxkKGZvbGRlck5hbWUpO1xuICAgIHJldHVybiB0cmVlO1xuICB9XG4gIC8vIE90aGVyd2lzZSBGb2xkZXIgaXMgbm90IGVtcHR5LCBtYWtlIHRyZWUgc3RydWN0dXJlXG5cbiAgLy8gVW5vcmRlcmVkIExJU1QgKGhpZGluZyBvciB1bmhpZGluZyBsaSlcbiAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuXG4gIC8vIEFSUk9XXG4gIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFycm93LmNsYXNzTGlzdC5hZGQoJ3RyZWUtYXJyb3cnKTtcbiAgYXJyb3cuaW5uZXJIVE1MID0gJ+KWtic7XG5cbiAgLy8gaWYgbW9yZSB0aGFuIC4uLiBzdWJmb2xkZXJzIGRvd24sIGhpZGUgYnkgZGVmYXVsdFxuICBpZiAoZGVncmVlIDwgMikgdWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChkZWdyZWUgPCAyKSBhcnJvdy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgXG4gIGFycm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGFycm93LmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICAgIHVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICB9KTtcblxuICB0cmVlLmFwcGVuZENoaWxkKGxpQ29udGFpbmVyKTtcbiAgbGlDb250YWluZXIuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICBsaUNvbnRhaW5lci5hcHBlbmRDaGlsZChmb2xkZXJOYW1lKTtcbiAgdHJlZS5hcHBlbmRDaGlsZCh1bCk7XG5cbiAgLy8gQXBwZW5kIGZvbGRlciBjb250ZW50c1xuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgIGNvbnN0IGZvbGRlclRyZWUgPSBnZW5lcmF0ZUZvbGRlclRyZWUoZW50cnkgYXMgSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2ssIGRlZ3JlZSArIDEpO1xuICAgICAgdWwuYXBwZW5kQ2hpbGQoZm9sZGVyVHJlZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGVudGlyZSBmaWxlIHN5c3RlbSBmb2xkZXIgdHJlZSBmb3IgbW92ZS10byBtZW51XG4gKiBcbiAqIEBwYXJhbSBtb3ZlVG9DYWxsYmFjayBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB1c2VyIGRvdWJsZS1jbGlja3Mgb24gYSBmb2xkZXIgYW5kIG1vdmVzIHNlbGVjdGlvblxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQpOiBIVE1MVUxpc3RFbGVtZW50IHtcbiAgY29uc3Qgcm9vdFRyZWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICByb290VHJlZS5pZCA9ICd0cmVlLXJvb3QnO1xuICByb290VHJlZS5hcHBlbmRDaGlsZChnZW5lcmF0ZUZvbGRlclRyZWUoc3RhdGUucm9vdCgpLCBtb3ZlVG9DYWxsYmFjaywgMCkpO1xuICByZXR1cm4gcm9vdFRyZWU7XG59XG5cbi8qKlxuICogRGlzcGxheXMgZGFzaGJvYXJkIGNvbnRleHQgbWVudSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IFxuICogXG4gKiBAcGFyYW0gdmlldyBjb250ZXh0IG1lbnUgdmlldyAoZGV0ZXJtaW5lcyBjb250ZW50IG9mIGNvbnRleHQgbWVudSlcbiAqL1xuZnVuY3Rpb24gc2hvd0NvbnRleHRNZW51KHZpZXc6IHN0cmluZywgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpIHtcblxuICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAvLyBDb250ZXh0IG1lbnUgb3B0aW9ucyB3aGVuIGZpbGVzL2ZvbGRlcnMgYXJlIHJpZ2h0LWNsaWNrZWRcbiAgICBjYXNlICdzZWxlY3Rpb24tb3B0aW9ucyc6XG5cbiAgICAgIC8vIE5lZWQgdG8gZGV0ZXJtaW5lIHNlbGVjdGlvbiBjYXRlZ29yeSBiZWZvcmUgZGlzcGxheWluZyBvcHRpb25zXG4gICAgICBjb25zdCBudW1iZXJPZlNlbGVjdGVkRmlsZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZpbGVzKCkubGVuZ3RoO1xuICAgICAgY29uc3QgbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGg7XG4gICAgICBjb25zdCBzZWxlY3RlZFRyYXNoID0gc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aDtcblxuICAgICAgLyoqXG4gICAgICAgKiBDb250ZXh0IG1lbnUgb3B0aW9ucyBjb25kaXRpb25zOlxuICAgICAgICogICAgMSkgMSBmaWxlIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDIpIDIrIGZpbGVzIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDMpIGZpbGUocykgKyBmb2xkZXIocykgLT4gbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNCkgMSBmb2xkZXIgLT4gb3BlbiwgbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNSkgMisgZm9sZGVycyAtPiBtb3ZlIHRvIHRyYXNoLCBtb3ZlXG4gICAgICAgKiAgICA2KSB0cmFzaCAtPiBlbXB0eSB0cmFzaFxuICAgICAgICogICAgNykgZW50cnkgaW4gdHJhc2ggLT4gcHV0IGJhY2ssIGRlbGV0ZVxuICAgICAgICovXG5cblxuICAgICAgLy8gdHJhc2hcbiAgICAgIGlmICghbnVtYmVyT2ZTZWxlY3RlZEZpbGVzICYmICFudW1iZXJPZlNlbGVjdGVkRm9sZGVycyAmJiBzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LnRyYXNoRm9sZGVyT3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmxlbmd0aCA+IDEgJiYgc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmF0KDEpLm5hbWUgPT0gJ1RyYXNoJykge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC50cmFzaEVudHJ5T3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1lbnRyeS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZpbGVcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA9PT0gMSAmJiAhbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQuc2luZ2xlRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnc2luZ2xlLWZpbGUtb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZmlsZXNcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA+IDEgJiYgIW51bWJlck9mU2VsZWN0ZWRGb2xkZXJzICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50Lm11bHRpRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnbXVsdGktZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyBmaWxlKHMpICsgZm9sZGVyKHMpXG4gICAgICBlbHNlIGlmIChudW1iZXJPZlNlbGVjdGVkRmlsZXMgPj0gMSAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+PSAxICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LmZvbGRlckFuZEZpbGVPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ2ZvbGRlci1hbmQtZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZvbGRlclxuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA9PT0gMSAmJiAhc2VsZWN0ZWRUcmFzaCkge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5zaW5nbGVGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ3NpbmdsZS1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZm9sZGVyc1xuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+IDEgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQubXVsdGlGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ211bHRpLWZvbGRlci1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIC8vIERlZmF1bHQgY29udGV4dCBtZW51IChyaWdoLWNsaWNraW5nIG9uIGRhc2hib2FyZCBiYWNrZ3JvdW5kKVxuICAgIGRlZmF1bHQ6XG4gICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5kZWZhdWx0T3B0aW9ucztcbiAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnZGVmYXVsdCcpO1xuICB9XG5cbiAgLy8gZGlzYWJsZSBlZGl0b3IgbWVudSBmb3IgdGhlIHNhbXBsZXMgZm9sZGVyIGFuZCB0cmFzaFxuICBpZihzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gIChzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSAmJiBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10pIHx8XG4gIHN0YXRlLmlzSW5UcmFzaCgpKSB7XG4gICAgY29uc3QgZGVsZXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NtLXJlbW92ZS1idG4nKTtcbiAgICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tcmVuYW1lLWJ0bicpO1xuICAgIGNvbnN0IG1vdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbW92ZS1idG4nKTtcbiAgICBjb25zdCB1cGRhdGVEb2NCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tdXBsb2FkLWRvYy1idG4nKTtcbiAgICBjb25zdCBuZXdGb2xkZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbmV3LWZvbGRlci1idG4nKTtcblxuICAgIGlmIChkZWxldGVCdG4pIHtcbiAgICAgIGRlbGV0ZUJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgICBpZiAocmVuYW1lQnRuKSB7XG4gICAgICByZW5hbWVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKG1vdmVCdG4pIHtcbiAgICAgIG1vdmVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZURvY0J0bikge1xuICAgICAgdXBkYXRlRG9jQnRuLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICAgIGlmIChuZXdGb2xkZXJCdG4pIHtcbiAgICAgIG5ld0ZvbGRlckJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHVzZXIncyBtb3VzZVxuICBjb250ZXh0TWVudS5zdHlsZS5sZWZ0ID0gYCR7Y2xpZW50WH1weGA7XG4gIGNvbnRleHRNZW51LnN0eWxlLnRvcCA9IGAke2NsaWVudFl9cHhgO1xuXG4gIC8vIGRpc3BsYXkgY29udGV4dCBtZW51XG4gIGNvbnRleHRNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xufVxuXG5cbi8qKlxuICogU2V0IGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG1lbnUgaXRlbXMgaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQgbWVudS5cbiAqIFxuICogQHBhcmFtIHZpZXcgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgbWVudSB2aWV3IHRoYXQgaXMgYmVpbmcgZGlzcGxheWVkLlxuICovXG5mdW5jdGlvbiBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnModmlldzogc3RyaW5nKSB7XG4gIC8vIEFsbCB0aGUgYnV0dG9ucyB0aGF0IHdpbGwgaGF2ZSBldmVudHMgYXR0YWNoZWQgdG8gdGhlbSBoYXZlIHRoZSBzYW1lIGNsYXNzbmFtZS5cbiAgY29uc3QgYnRuQ2xhc3NuYW1lID0gJ2NvbnRleHQtbWVudS1pdGVtLXdyYXBwZXInO1xuXG4gIHN3aXRjaCAodmlldykge1xuXG4gICAgY2FzZSAnc2luZ2xlLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpOyAgIFxuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ211bHRpLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9sZGVyLWFuZC1maWxlLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3NpbmdsZS1mb2xkZXItb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbXVsdGktZm9sZGVyLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3RyYXNoLWZvbGRlci1vcHRpb25zJzpcbiAgICAgIC8vIFwiRW1wdHkgVHJhc2hcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZW1wdHktdHJhc2gtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIGVtcHR5VHJhc2hIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0cmFzaC1lbnRyeS1vcHRpb25zJzpcbiAgICAgIC8vIFwiUHV0IEJhY2tcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tcmVjb3Zlci1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcHV0QmFja0RvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJEZWxldGVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZGVsZXRlLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBkZWxldGVEb2NzSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFwiVXBsb2FkIGRvY3VtZW50XCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXVwbG9hZC1kb2MtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5VcGxvYWRBcmVhSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFwiTmV3IGZvbGRlclwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1uZXctZm9sZGVyLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBvcGVuTmV3Rm9sZGVyV2luZG93KCk7XG4gICAgICB9KTtcblxuICB9XG5cbn1cblxuXG4vKipcbiAqIEluaXRpYWxpemUgZGFzaGJvYXJkIGNvbnRleHQgbWVudSAocmlnaHQgY2xpY2sgbWVudSkuXG4gKiBUaGlzIHdpbGwgc2V0IHVwIGFsbCBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFzIHdlbGwgYXNcbiAqIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbnRleHQgbWVudSwgd2hpY2hcbiAqIG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSB1c2VyIHJpZ2h0LWNsaWNrcyAoZmlsZSwgZmlsZXMsIGZvbGRlciwgYmFja2dyb3VuZCwgZXRjLilcbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZURlZmF1bHRDb250ZXh0TWVudSgpIHtcblxuICAvLyByaWdodC1jbGljayBvbiBkYXNoYm9hcmQgYmFja2dyb3VuZFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uJykuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIHVuc2VsZWN0QWxsKCk7XG5cbiAgICBzaG93Q29udGV4dE1lbnUoXG4gICAgICAnZGVmYXVsdCcsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRYLCBcbiAgICAgICg8TW91c2VFdmVudD4gZSkuY2xpZW50WVxuICAgICk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLXNlY3Rpb24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBsaXN0ZW5lcnMgZm9yIHNwZWNpZmljIGNvbnRleHQgbWVudXMuXG4gKiBTcGVjaWZpYyBjb250ZXh0IG1lbnVzIGFwcGVhciB3aGVuIHVzZXIgcmlnaHQtY2xpY2tzIG9uIHNlbGVjdGVkIGZpbGVzL2ZvbGRlcnMuXG4gKiBUaGUgYWN0dWFsIG1lbnUgdGhhdCBpcyBzaG93biBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHNlbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCkge1xuXG4gIC8vIHJpZ2h0LWNsaWNrIG9uIGZvbGRlciBpdGVtIChmaWxlIG9yIGZvbGRlcilcbiAgdGlsZS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAocmlnaHRDbGlja2VkIHx8IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdW5zZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICAvLyBzZWxlY3RcbiAgICBzZWxlY3QoaW5kZXgpO1xuXG4gICAgc2hvd0NvbnRleHRNZW51KFxuICAgICAgJ3NlbGVjdGlvbi1vcHRpb25zJywgXG4gICAgICAoPE1vdXNlRXZlbnQ+IGUpLmNsaWVudFgsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRZXG4gICAgKTtcbiAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICByaWdodENsaWNrZWQgPSB0cnVlO1xuICB9KTtcbiAgICBcbiAgLy8gaGlkZSBjb250ZXh0IG1lbnUgaWYgdXNlciBjbGlja3MgYXdheVxuICBtYWluU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKHJpZ2h0Q2xpY2tlZCkge1xuICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHJpZ2h0Q2xpY2tlZCA9IGZhbHNlO1xuICAgICAgaWYgKCFjbGlja2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgLy8gaWYgY2xpY2tzIG9uIGJsYW5rIFxuICAgICAgICB1bnNlbGVjdEFsbCgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIGlmIGNsaWNrcyBvbiBhIGZpbGUvZm9sZGVyLCBzZWxlY3QgaXRcbiAgICAgICAgY29uc3QgY2xpY2tlZEVudHJ5ID0gZ2V0RW50cnlCeUlkKGNsaWNrZWRFbGVtZW50LmlkKTtcbiAgICAgICAgc2hpZnRTZWxlY3Rpb25IYW5kbGVyKHN0YXRlLmdldEluZGV4QnlFbnRyeU5hbWUoY2xpY2tlZEVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgVHJhc2ggZm9sZGVyIGJ5IGRlbGV0aW5nIGVudHJpZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgMzAgZGF5cyBhZ29cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVHJhc2gocm9vdDogSUZvbGRlcik6IHZvaWQge1xuICBpZiAoIXN0YXRlLmdldFRyYXNoRm9sZGVyKCkpIHtcbiAgICBmc20ubmV3VHJhc2gocm9vdCk7XG4gIH1cbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHRoaXJ0eURheXNBZ28gPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDApOyAvLyAzMCBkYXlzIGluIG1pbGxpc2Vjb25kc1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhbiBlbnRyeSB3YXMgZGVsZXRlZCAzMCBkYXlzIGFnb1xuICBjb25zdCB0b0RlbGV0ZSA9IChlbnRyeTogSUVudHJ5KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKGVudHJ5Lm1ldGFkYXRhICYmIGVudHJ5Lm1ldGFkYXRhWydyZW1vdmVkX29uJ10pIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShlbnRyeS5tZXRhZGF0YVsncmVtb3ZlZF9vbiddIGFzIHN0cmluZyk7XG4gICAgICByZXR1cm4gZGF0ZSA8PSB0aGlydHlEYXlzQWdvO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnRyaWVzIGluIHRoZSBUcmFzaFxuICB0cmFzaEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGlmICh0b0RlbGV0ZShlbnRyeSkpIHtcbiAgICAgIC8vIERlbGV0ZSBlbnRyeSBpZiBkZWxldGVkIDMwIGRheXMgYWdvXG4gICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICBkZWxldGVGb2xkZXJFbnRyeShlbnRyeSBhcyBJRm9sZGVyLCB0cmFzaEZvbGRlcik7IFxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTG9hZHMgcm9vdCBmb2xkZXIgaW50byBkYXNoYm9hcmQgb24gc3RhcnR1cC4gXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRGFzaGJvYXJkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb290ID0gYXdhaXQgZnNtLmdldFJvb3QoKTtcbiAgc3RhdGUucm9vdChyb290KTtcbiAgdXBkYXRlVHJhc2gocm9vdCk7XG4gIHVwZGF0ZURhc2hib2FyZChbcm9vdF0pO1xuICBpbml0aWFsaXplRGVmYXVsdENvbnRleHRNZW51KCk7XG59OyIsImltcG9ydCB7IGxvYWREYXNoYm9hcmQgfSBmcm9tICcuLi8uLi9zcmMvRGFzaGJvYXJkL0Rhc2hib2FyZCc7XG5cbmxvYWREYXNoYm9hcmQoKTtcbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNob21lLWxpbmsnKT8uc2V0QXR0cmlidXRlKCdocmVmJywgX19MSU5LX0xPQ0FUSU9OX18pOyIsImV4cG9ydCBlbnVtIEVudHJ5VHlwZSB7XG4gIEZvbGRlciA9ICdmb2xkZXInLFxuICBUcmFzaCA9ICd0cmFzaCcsXG4gIEZpbGUgPSAnZmlsZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW50cnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEVudHJ5VHlwZTtcbiAgaWQ6IHN0cmluZztcbiAgY2hpbGRyZW46IElFbnRyeVtdO1xuICBtZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvbGRlciBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5Gb2xkZXIgfCBFbnRyeVR5cGUuVHJhc2g7XG4gIGlkOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBJRW50cnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZSBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5GaWxlXG4gIGlkOiBzdHJpbmc7XG59IiwiaW1wb3J0IHsgRW50cnlUeXBlLCBJRW50cnksIElGb2xkZXIsIElGaWxlIH0gZnJvbSAnLic7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi8uLi91dGlscy9yYW5kb20nO1xuXG4vKlxuKiAgIEZpbGUgU3lzdGVtIEZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSwgbW92ZSwgYW5kIGRlbGV0ZSBmaWxlIHN5c3RlbSBlbnRyaWVzXG4qICAgRG9lcyBub3QgZGVwZW5kIG9uIHN0YXRlIFxuKi9cblxuaW50ZXJmYWNlIHJlc3BvbnNlUHJvcCB7XG4gIHN1Y2NlZWRlZDogYm9vbGVhbixcbiAgZXJyb3I6IHN0cmluZyxcbn1cblxuY29uc3QgY3JlYXRlRW50cnkgPSAobmFtZTogc3RyaW5nLCB0eXBlOiBFbnRyeVR5cGUsIGlkOiBzdHJpbmcsIGNoaWxkcmVuPzogSUVudHJ5W10pOiBJRW50cnkgPT4ge1xuICBjb25zdCBtZXRhZGF0YSA9IHt9O1xuICBpZiAodHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiB7IG5hbWUsIHR5cGUsIGlkLCBtZXRhZGF0YSB9IGFzIElFbnRyeTtcbiAgZWxzZSByZXR1cm4geyBuYW1lLCB0eXBlLCBpZCwgY2hpbGRyZW4sIG1ldGFkYXRhIH0gYXMgSUVudHJ5O1xufTtcblxuY29uc3QgY3JlYXRlRm9sZGVyID0gKG5hbWU6IHN0cmluZyk6IElGb2xkZXIgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZvbGRlciwgdXVpZHY0KCksIFtdKSBhcyBJRm9sZGVyO1xufTtcblxuY29uc3QgY3JlYXRlVHJhc2ggPSAobmFtZTogc3RyaW5nKTogSUZvbGRlciA9PiB7XG4gIHJldHVybiBjcmVhdGVFbnRyeShuYW1lLCBFbnRyeVR5cGUuVHJhc2gsIHV1aWR2NCgpLCBbXSkgYXMgSUZvbGRlcjtcbn07XG5cbmNvbnN0IGNyZWF0ZUZpbGUgPSAobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogSUZpbGUgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZpbGUsIGlkKSBhcyBJRmlsZTtcbn07XG5cbmZ1bmN0aW9uIGFkZE1ldGFkYXRhKGVudHJ5OiBJRW50cnksIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IElFbnRyeSB7XG4gIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBlbnRyeS5tZXRhZGF0YVtrZXldID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gZW50cnk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU1ldGFkYXRhKGVudHJ5OiBJRW50cnksIGtleXM6IHN0cmluZ1tdKTogSUVudHJ5IHtcbiAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBkZWxldGUgZW50cnkubWV0YWRhdGFba2V5XTtcbiAgfSk7XG4gIHJldHVybiBlbnRyeTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIGFkZGVkIHRvIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5BZGRFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICBjb25zdCBuYW1lRXhpc3RzID0gcGFyZW50LmNoaWxkcmVuLnNvbWUoKGUpID0+IGUubmFtZSA9PT0gZW50cnkubmFtZSk7XG4gIGNvbnN0IGlzSW1tdXRhYmxlID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke2VudHJ5Lm5hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlKSAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yPzogc3RyaW5nIH1cbiAqL1xuY29uc3QgY2FuUmVtb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgY29uc3QgaWR4ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpO1xuICBjb25zdCBleGlzdHNJblBhcmVudCA9IGlkeCAhPT0gLTE7XG4gIGNvbnN0IGlzSW1tdXRhYmxlUGFyZW50ID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcbiAgY29uc3QgaXNJbW11dGFibGVFbnRyeSA9IGVudHJ5Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGRvZXMgbm90IGV4aXN0IGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlUGFyZW50KSAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZUVudHJ5KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgZnJvbSBwYXJlbnQgdG8gbmV3UGFyZW50IChubyBkdXBsaWNhdGUsIG11dGFibGUgcGFyZW50cywgZW50cnkgZXhpc3RzKVxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBuZXdQYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5Nb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICAvLyBpcyBBIGEgY2hpbGQgb2YgQlxuICBmdW5jdGlvbiBpc0NoaWxkT2YoYTogSUVudHJ5LCBiOiBJRm9sZGVyKSB7XG4gICAgcmV0dXJuIGIuY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcilcbiAgICAgIC5tYXAoKGM6IElGb2xkZXIpID0+IHtcbiAgICAgICAgaWYgKGMgPT09IGEpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBpc0NoaWxkT2YoYSwgYyk7XG4gICAgICB9KVxuICAgICAgLnNvbWUoKGUpID0+IGUgPT09IHRydWUpO1xuICB9XG4gICAgXG4gIGNvbnN0IGlzU2FtZSA9IGVudHJ5ID09PSBuZXdQYXJlbnQ7XG4gIGNvbnN0IG5hbWVFeGlzdHMgPSBuZXdQYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKTtcbiAgY29uc3QgaXNJbW11dGFibGVQYXJlbnQgPSBwYXJlbnQubWV0YWRhdGFbJ2ltbXV0YWJsZSddO1xuICBjb25zdCBpc0ltbXV0YWJsZU5ld1BhcmVudCA9IG5ld1BhcmVudC5tZXRhZGF0YVsnaW1tdXRhYmxlJ107XG4gIGNvbnN0IGV4aXN0c0luUGFyZW50ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpICE9PSAtMTtcbiAgLy8gaWYgZW50cnkgaXMgYSBmb2xkZXIsIGNoZWNrIGlmIG5ld1BhcmVudCBpcyBhIHN1YmZvbGRlciBvZiBlbnRyeVxuICBjb25zdCBuZXdQYXJlbnRJc0NoaWxkT2ZFbnRyeSA9IChlbnRyeS50eXBlID09IEVudHJ5VHlwZS5Gb2xkZXIpID8gaXNDaGlsZE9mKG5ld1BhcmVudCwgZW50cnkgYXMgSUZvbGRlcikgOiBmYWxzZTtcblxuXG4gIGNvbnN0IHJldHVybk9iaiA9IHsgc3VjY2VlZGVkOiBmYWxzZSwgZXJyb3I6ICcnIH07XG4gIGlmIChpc1NhbWUpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBDYW5ub3QgbW92ZSAke2VudHJ5Lm5hbWV9IHRvIGl0c2VsZi5gO1xuICBlbHNlIGlmIChuYW1lRXhpc3RzKSAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBEdXBsaWNhdGUgbmFtZTogJHtlbnRyeS5uYW1lfSBhbHJlYWR5IGV4aXN0cyBpbiAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZVBhcmVudCkgICAgICAgICByZXR1cm5PYmouZXJyb3IgPSBgJHtwYXJlbnQubmFtZX0gaXMgaW1tdXRhYmxlLmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlTmV3UGFyZW50KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke25ld1BhcmVudC5uYW1lfSBpcyBpbW11dGFibGUuYDtcbiAgZWxzZSBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7ZW50cnkubmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gJHtwYXJlbnQubmFtZX0uYDtcbiAgZWxzZSBpZiAobmV3UGFyZW50SXNDaGlsZE9mRW50cnkpICAgcmV0dXJuT2JqLmVycm9yID0gYENhbm5vdCBtb3ZlICR7ZW50cnkubmFtZX0gaW50byBhIGl0cyBvd24gc3ViZm9sZGVyLCAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuICAgIFxuICByZXR1cm4gcmV0dXJuT2JqO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIHJlbmFtZWQgKG5vIGR1cGxpY2F0ZSlcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3TmFtZSBcbiAqIEByZXR1cm5zIHJlc3BvbnNlIG9iamVjdCB7IHN1Y2NlZWRlZDogYm9vbGVhbiwgZXJyb3I6IHN0cmluZyB9XG4gKi9cbmNvbnN0IGNhblJlbmFtZUVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlciwgbmV3TmFtZTogc3RyaW5nKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgLy8gQ2hlY2sgaWYgbmV3TmFtZSBhbHJlYWR5IGV4aXN0cyBpbiBwYXJlbnRcbiAgY29uc3QgbmFtZUV4aXN0cyA9IHBhcmVudC5jaGlsZHJlbi5zb21lKChlLCBpZHgsIGFycikgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lICYmIGlkeCAhPT0gYXJyLmluZGV4T2YoZSkpO1xuICAgIFxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke25ld05hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgcmV0dXJuT2JqLnN1Y2NlZWRlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHJldHVybk9iajtcbn07XG5cbi8qKlxuICogQWRkcyBlbnRyeSB0byBwYXJlbnQgZm9sZGVyXG4gKiBAcGFyYW0gZW50cnlcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFkZGVkLCBlbHNlIGZhbHNlXG4gKi9cbmNvbnN0IGFkZEVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlcik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IHN1Y2NlZWRlZCwgZXJyb3IgfSA9IGNhbkFkZEVudHJ5KGVudHJ5LCBwYXJlbnQpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gQWRkIGVudHJ5IHRvIHBhcmVudCwgc29ydCBieSBhbHBoYW51bWVyaWNhbCBhbmQgZm9sZGVycyBiZWZvcmUgZmlsZXNcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChlbnRyeSk7XG4gICAgc29ydEZvbGRlcihwYXJlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmVzIGVudHJ5IGZyb20gcGFyZW50IGZvbGRlclxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBmb3JjZSBmb3JjZSBhIHJlbW92YWxcbiAqIEByZXR1cm5zIHRydWUgaWYgcmVtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5jb25zdCByZW1vdmVFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIsIGZvcmNlPWZhbHNlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgc3VjY2VlZGVkLCBlcnJvciB9ID0gY2FuUmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCk7XG4gIGlmIChzdWNjZWVkZWQgfHwgZm9yY2UpIHtcbiAgICBjb25zdCBpZHggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbnRyeSk7XG4gICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpZHgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBNb3ZlcyBlbnRyeSBmcm9tIHBhcmVudCB0byBuZXdQYXJlbnRcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3UGFyZW50IFxuICogQHJldHVybnMgdHJ1ZSBpZiBtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBtb3ZlRW50cnkoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbW92ZVJlc3BvbnNlID0gY2FuTW92ZUVudHJ5KGVudHJ5LCBwYXJlbnQsIG5ld1BhcmVudCk7XG5cbiAgaWYgKG1vdmVSZXNwb25zZS5zdWNjZWVkZWQpIHtcbiAgICBjb25zdCByZW1vdmVkID0gcmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCwgdHJ1ZSk7XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIGNvbnN0IGFkZGVkID0gYWRkRW50cnkoZW50cnksIG5ld1BhcmVudCk7XG4gICAgICBpZiAoYWRkZWQpIHJldHVybiB0cnVlO1xuICAgICAgZWxzZSBjb25zb2xlLmVycm9yKGBNb3Zpbmc6IGZhaWxlZCB0byBhZGQgJHtlbnRyeS5uYW1lfSB0byAke25ld1BhcmVudC5uYW1lfWApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE1vdmluZzogZmFpbGVkIHRvIHJlbW92ZSAke2VudHJ5Lm5hbWV9IGZyb20gJHtwYXJlbnQubmFtZX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihtb3ZlUmVzcG9uc2UuZXJyb3IpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGVudHJ5XG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50IFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyB0cnVlIGlmIHJlbmFtZWQsIGVsc2UgZmFsc2VcbiAqL1xuY29uc3QgcmVuYW1lRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdOYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgeyBzdWNjZWVkZWQsIGVycm9yIH0gPSBjYW5SZW5hbWVFbnRyeShlbnRyeSwgcGFyZW50LCBuZXdOYW1lKTtcblxuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgZW50cnkubmFtZSA9IG5ld05hbWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBnZXRBbGxOYW1lcyA9IChmb2xkZXI6IElGb2xkZXIpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gZm9sZGVyLmNoaWxkcmVuLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiAgU29ydHMgZm9sZGVyIGJ5IGFscGhhbnVtZXJpY2FsIGFuZCBmb2xkZXJzIGJlZm9yZSBmaWxlcyBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcmV0dXJucyByZWZlcmVuY2UgdG8gc2FtZSBmb2xkZXJcbiAqL1xuZnVuY3Rpb24gc29ydEZvbGRlcihmb2xkZXI6IElGb2xkZXIpOiBJRm9sZGVyIHtcbiAgZm9sZGVyLmNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICBmb2xkZXIuY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnR5cGUgPT09IEVudHJ5VHlwZS5GaWxlICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcikgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoYS50eXBlID09PSBFbnRyeVR5cGUuRm9sZGVyICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiAtMTtcbiAgICBlbHNlIHJldHVybiAwO1xuICB9KTtcbiAgcmV0dXJuIGZvbGRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEZpbGVTeXN0ZW1Ub29scyA9IHtcbiAgY3JlYXRlRm9sZGVyOiBjcmVhdGVGb2xkZXIsXG4gIGNyZWF0ZVRyYXNoOiBjcmVhdGVUcmFzaCxcbiAgY3JlYXRlRmlsZTogY3JlYXRlRmlsZSxcbiAgbW92ZUVudHJ5OiBtb3ZlRW50cnksXG4gIGNhbkFkZEVudHJ5OiBjYW5BZGRFbnRyeSxcbiAgY2FuUmVtb3ZlRW50cnk6IGNhblJlbW92ZUVudHJ5LFxuICBjYW5Nb3ZlRW50cnk6IGNhbk1vdmVFbnRyeSxcbiAgY2FuUmVuYW1lRW50cnk6IGNhblJlbmFtZUVudHJ5LFxuICBhZGRFbnRyeTogYWRkRW50cnksXG4gIHJlbW92ZUVudHJ5OiByZW1vdmVFbnRyeSxcbiAgYWRkTWV0YWRhdGE6IGFkZE1ldGFkYXRhLFxuICByZW1vdmVNZXRhZGF0YTogcmVtb3ZlTWV0YWRhdGEsXG4gIGdldEFsbE5hbWVzOiBnZXRBbGxOYW1lcyxcbiAgcmVuYW1lRW50cnk6IHJlbmFtZUVudHJ5LFxufTsiLCJpbXBvcnQgeyBJRm9sZGVyLCBGaWxlU3lzdGVtVG9vbHMgfSBmcm9tICcuJztcbmltcG9ydCB7IGZldGNoVXBsb2FkcyB9IGZyb20gJy4uL1N0b3JhZ2UnO1xuaW1wb3J0IHsgc2FtcGxlcyB9IGZyb20gJy4uL3NhbXBsZXNfZmlsZW5hbWVzJztcblxuaW50ZXJmYWNlIEZpbGVTeXN0ZW1Qcm9wcyB7XG4gIGdldFJvb3Q6ICgpID0+IFByb21pc2U8SUZvbGRlcj47XG4gIHNldEZpbGVTeXN0ZW06IChyb290OiBJRm9sZGVyKSA9PiBib29sZWFuO1xuICBnZXRGaWxlU3lzdGVtOiAoKSA9PiBQcm9taXNlPElGb2xkZXI+O1xuICBuZXdUcmFzaDogKHJvb3Q6IElGb2xkZXIpID0+IHZvaWQ7XG59XG4gIFxuXG4vLyBNYW5hZ2VyIGlzIHVzZWQgZm9yIGFjY2Vzc2luZyBsb2NhbCBzdG9yYWdlIGFuZCB0cmFja2luZyB0aGUgcG9zaXRpb24gb2YgY3VycmVudCBmb2xkZXJcbmV4cG9ydCBjb25zdCBGaWxlU3lzdGVtTWFuYWdlciA9ICgpOiBGaWxlU3lzdGVtUHJvcHMgPT4ge1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFJvb3QoKTogUHJvbWlzZTxJRm9sZGVyPiB7IFxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlU3lzdGVtKCk7XG4gIH1cblxuICAvLyBTYXZlIGZpbGVzeXN0ZW0gaW50byBsb2NhbCBzdG9yYWdlXG4gIGZ1bmN0aW9uIHNldEZpbGVTeXN0ZW0ocm9vdDogSUZvbGRlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ25lb24tZnMnLCBKU09OLnN0cmluZ2lmeShyb290KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHdpbmRvdy5hbGVydCgnRXJyb3Igc2F2aW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTG9hZCBmaWxlc3lzdGVtIGZyb20gbG9jYWwgc3RvcmFnZSwgY3JlYXRlcyBuZXcgcm9vdCBpZiBub25lIGV4aXN0c1xuICBhc3luYyBmdW5jdGlvbiBnZXRGaWxlU3lzdGVtKCk6IFByb21pc2U8SUZvbGRlcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmcyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbmVvbi1mcycpO1xuICAgICAgICAgICAgXG4gICAgICAvLyBpZiBsb2NhbHN0b3JhZ2UgZXhpc3RzLCBsb2FkIHByZXZpb3VzIHJvb3RcbiAgICAgIGlmIChmcykge1xuICAgICAgICBjb25zdCBsb2NhbEZpbGVTeXN0ZW0gPSBKU09OLnBhcnNlKGZzKSBhcyBJRm9sZGVyO1xuICAgICAgICByZXR1cm4gbG9jYWxGaWxlU3lzdGVtO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSwgY3JlYXRlIG5ldyByb290XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGb2xkZXIoJ0hvbWUnKTtcbiAgICAgICAgbG9hZFNhbXBsZXMocm9vdCk7XG4gICAgICAgIG5ld1RyYXNoKHJvb3QpO1xuICAgICAgICBhd2FpdCBsb2FkUHJldmlvdXNVcGxvYWRzKHJvb3QpO1xuICAgICAgICBzZXRGaWxlU3lzdGVtKHJvb3QpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgd2luZG93LmFsZXJ0KCdFcnJvciBsb2FkaW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgfVxuICB9IFxuXG4gIC8vIFRoaXMgbmV4dCBmdW5jdGlvbiBpcyBzb2xlbHkgZm9yIGxvYWRpbmcgc2FtcGxlcyBpbnRvIHRoZSByb290IGFzIGEgZGVmYXVsdCBmb3IgTmVvblxuICBmdW5jdGlvbiBsb2FkU2FtcGxlcyhyb290OiBJRm9sZGVyKSB7XG4gICAgLy8gTWFrZSBzYW1wbGUgZW50cmllc1xuICAgIGNvbnN0IHNhbXBsZUVudHJpZXMgPSBzYW1wbGVzLm1hcCgoW25hbWUsIHR5cGVdKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKG5hbWUsIG5hbWUpO1xuICAgICAgaWYgKHR5cGUgPT09ICdmb2xpbycpIHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKGVudHJ5LCB7IHR5cGU6ICdmb2xpbycsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ21hbnVzY3JpcHQnKSB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShlbnRyeSwgeyB0eXBlOiAnbWFudXNjcmlwdCcsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuXG4gICAgLy8gTWFrZSBzYW1wbGVzIGZvbGRlciBhbmQgYWRkIHRvIHJvb3RcbiAgICBjb25zdCBzYW1wbGVzRm9sZGVyID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZvbGRlcignU2FtcGxlcycpO1xuICAgIC8vIEFkZCBzYW1wbGUgZW50cmllcyB0byBzYW1wbGVzIGZvbGRlclxuICAgIHNhbXBsZUVudHJpZXMuZm9yRWFjaCgoc2FtcGxlKSA9PiB7XG4gICAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlLCBzYW1wbGVzRm9sZGVyKTtcbiAgICB9KTtcbiAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlc0ZvbGRlciwgcm9vdCk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKHNhbXBsZXNGb2xkZXIsIHsgaW1tdXRhYmxlOiB0cnVlIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBmdW5jdGlvbiBuZXdUcmFzaChyb290OiBJRm9sZGVyKSB7XG4gICAgY29uc3QgdHJhc2hGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlVHJhc2goJ1RyYXNoJyk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KHRyYXNoRm9sZGVyLCByb290KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQcmV2aW91c1VwbG9hZHMocm9vdDogSUZvbGRlcikge1xuICAgIC8vIEdldCBwcmV2aW91cyB1cGxvYWRzIGZyb20gbG9jYWwgc3RvcmFnZVxuICAgIGNvbnN0IHVwbG9hZHMgPSBhd2FpdCBmZXRjaFVwbG9hZHMoKTtcblxuICAgIC8vIE1ha2UgdXBsb2FkIGVudHJpZXNcbiAgICBjb25zdCB1cGxvYWRFbnRyaWVzID0gdXBsb2Fkcy5tYXAoKHVwbG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKHVwbG9hZC5uYW1lLCB1cGxvYWQuaWQpO1xuICAgIH0pO1xuXG4gICAgdXBsb2FkRW50cmllcy5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRFbnRyeSh1cGxvYWQsIHJvb3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBjb25zdCBGaWxlU3lzdGVtUHJvcHM6IEZpbGVTeXN0ZW1Qcm9wcyA9IHtcbiAgICBnZXRSb290OiBnZXRSb290LFxuICAgIHNldEZpbGVTeXN0ZW06IHNldEZpbGVTeXN0ZW0sXG4gICAgZ2V0RmlsZVN5c3RlbTogZ2V0RmlsZVN5c3RlbSxcbiAgICBuZXdUcmFzaDogbmV3VHJhc2gsXG4gIH07XG5cbiAgcmV0dXJuIEZpbGVTeXN0ZW1Qcm9wcztcbn07IiwiZXhwb3J0IGNvbnN0IHNhbXBsZXMgPSBbXG4gIFsnQ0ROLUhzbXVfTTIxNDkuTDRfMDAxcicsICdmb2xpbyddLFxuICBbJ0NETi1Ic211X00yMTQ5Lkw0XzAwMnInLCAnZm9saW8nXSxcbiAgWydDSC1FXzYxMV8wMjRyJywgJ2ZvbGlvJ10sXG4gIFsnQ0gtRV82MTFfMDI2cicsICdmb2xpbyddLFxuICBbJ0NILUVfNjExXzAyOHInLCAnZm9saW8nXSxcbiAgWydTYWx6aW5uZXMnLCAnbWFudXNjcmlwdCddXG5dOyIsImltcG9ydCB7IElFbnRyeSwgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmV4cG9ydCBjbGFzcyBTaGlmdFNlbGVjdGlvbk1hbmFnZXIge1xuICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgZW5kOiBudW1iZXI7XG4gIHByaXZhdGUgcHJldlNlbGVjdGlvbjogbnVtYmVyW10gPSBbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0KHN0YXJ0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5zdGFydCA9IE1hdGgubWF4KHN0YXJ0LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFbmQoZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICB0aGlzLmVuZCA9IC0xO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbi5zcGxpY2UoMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJldlNlbGVjdGlvbigpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJldlNlbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb24ob3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdKTogbnVtYmVyW10ge1xuICAgIGxldCBzdGFydDogbnVtYmVyO1xuICAgIGxldCBlbmQ6IG51bWJlcjtcblxuICAgIGlmICh0aGlzLmVuZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kIDwgdGhpcy5zdGFydCkge1xuICAgICAgc3RhcnQgPSB0aGlzLmVuZDtcbiAgICAgIGVuZCA9IHRoaXMuc3RhcnQgKyAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICAgIGVuZCA9IHRoaXMuZW5kICsgMTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2UgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAoZW5kIC0gc3RhcnQpIH0sICh2LCBrKSA9PiBrICsgc3RhcnQpO1xuXG4gICAgLy8gRm9yIGVhY2ggc2hpZnQgc2VsZWN0aW9uIGFjdGlvbjogaWYgdGhlIFNoaWZ0IGtleSBpcyBzdGlsbCBoZWxkLCB0aGUgZW5kIHNoaWZ0IHBvcyBjYW4gY2hhbmdlXG4gICAgLy8gd2l0aCB0aGUgcHJldmlvdXNseSAoYmVmb3JlLXNoaWZ0KSBzZWxlY3RlZCBlbGVtZW50cyBzdGlsbCBzZWxlY3RlZCB3aGlsZSB0aGUgY3VycmVudCBzaGlmdCBzZWxlY3Rpb25zIHVuc2VsZWN0LlxuICAgIGNvbnN0IHNwZWNpZmljU2VsZWN0aW9uID0gcmFuZ2UuZmlsdGVyKGlkeCA9PiAhKG9yZGVyZWRTZWxlY3Rpb25baWR4XSkpO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbiA9IHNwZWNpZmljU2VsZWN0aW9uO1xuICAgIHJldHVybiBzcGVjaWZpY1NlbGVjdGlvbjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFN0YXRlIHtcbiAgcm9vdChyb290Rm9sZGVyPzogSUZvbGRlcik6IElGb2xkZXIgfCBudWxsO1xuICBzZXRFbnRyaWVzKGVudHJpZXM6IElFbnRyeVtdKTogdm9pZDtcbiAgZ2V0RW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHNldFNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBib29sOiBib29sZWFuKTogdm9pZDtcbiAgZ2V0U2VsZWN0aW9uKCk6IGJvb2xlYW5bXTtcbiAgcmVzZXRTZWxlY3Rpb24oKTogdm9pZDtcbiAgc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pOiB2b2lkO1xuICBnZXRGb2xkZXJQYXRoKCk6IElGb2xkZXJbXTtcbiAgZ2V0Rm9sZGVyUGF0aE5hbWVzKCk6IHN0cmluZ1tdO1xuICBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZDtcbiAgZ2V0UGFyZW50Rm9sZGVyKCk6IElGb2xkZXIgfCB1bmRlZmluZWQ7XG4gIGdldFRyYXNoRm9sZGVyKCk6IElGb2xkZXI7XG4gIGdldFNlbGVjdGVkRW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0U2VsZWN0ZWRGb2xkZXJzKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZFRyYXNoKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZEZpbGVzKCk6IElFbnRyeVtdO1xuICBpc0luVHJhc2goKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZFN0YXRlKCk6IERhc2hib2FyZFN0YXRlIHtcbiAgLy8gYXMgZGlzcGxheWVkIG9uIHRoZSBkYXNoYm9hcmRcbiAgbGV0IG9yZGVyZWRFbnRyaWVzOiBJRW50cnlbXSA9IFtdO1xuICBsZXQgb3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdID0gW107XG4gIC8vIGNvbnN0IGN1cnJlbnRGaWxlU2VsZWN0aW9uID0gW107IC8vIGN1cnJlbnRseSB1c2VyLXNlbGVjdGVkIGZpbGVzXG4gIC8vIGNvbnN0IGN1cnJlbnRGb2xkZXJTZWxlY3Rpb24gPSBbXTsgLy8gY3VycmVudGx5IHVzZXItc2VsZWN0ZWQgZm9sZGVyc1xuXG4gIC8vIHBhdGggbGVhZGluZyB0byBjdXJyZW50IGZvbGRlclxuICBsZXQgZm9sZGVyUGF0aDogSUZvbGRlcltdID0gW107XG4gIGxldCBfcm9vdDogSUZvbGRlciA9IG51bGw7XG5cbiAgLyoqIFxuICAgKiBTZXRzIG9yIGdldHMgdGhlIHJvb3QgZm9sZGVyXG4gICAqIEBwYXJhbSByb290Rm9sZGVyIChvcHRpb25hbCkgLSB0aGUgcm9vdCBmb2xkZXIgdG8gc2V0XG4gICAqIEByZXR1cm5zIHRoZSByb290IGZvbGRlclxuICAgKi8gXG4gIGZ1bmN0aW9uIHJvb3Qocm9vdEZvbGRlcj86IElGb2xkZXIpIHtcbiAgICBpZiAocm9vdEZvbGRlcikgX3Jvb3QgPSByb290Rm9sZGVyO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEVudHJpZXMoZW50cmllczogSUVudHJ5W10pIHtcbiAgICBvcmRlcmVkRW50cmllcyA9IGVudHJpZXM7XG4gICAgb3JkZXJlZFNlbGVjdGlvbiA9IEFycmF5KGVudHJpZXMubGVuZ3RoKS5maWxsKGZhbHNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRFbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3JkZXJlZEVudHJpZXMuZmluZEluZGV4KGVudHJ5ID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIGJvb2w6IGJvb2xlYW4pIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uW2luZGV4XSA9IGJvb2w7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRTZWxlY3Rpb247XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFNlbGVjdGlvbigpIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uLmZpbGwoZmFsc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pIHtcbiAgICBmb2xkZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZvbGRlclBhdGgoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoTmFtZXMoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGgubWFwKGZvbGRlciA9PiBmb2xkZXIubmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZCB7XG4gICAgbGV0IGN1cnJlbnRGb2xkZXIgPSByb290KCk7XG4gICAgZm9sZGVyTmFtZXMgPSBmb2xkZXJOYW1lcy5zbGljZSgxKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyTmFtZSBvZiBmb2xkZXJOYW1lcykge1xuICAgICAgY29uc3QgdGFyZ2V0Rm9sZGVyID0gY3VycmVudEZvbGRlci5jaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLm5hbWUgPT09IGZvbGRlck5hbWUpO1xuICAgICAgaWYgKHRhcmdldEZvbGRlciAmJiB0YXJnZXRGb2xkZXIudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgICAgY3VycmVudEZvbGRlciA9IHRhcmdldEZvbGRlciBhcyBJRm9sZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZmFpbGVkIHRvIGZpbmQgZm9sZGVyOiAnLCBmb2xkZXJOYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Rm9sZGVyO1xuICB9XG5cblxuICBmdW5jdGlvbiBnZXRQYXJlbnRGb2xkZXIoKSB7IFxuICAgIHJldHVybiBmb2xkZXJQYXRoLmF0KC0xKTsgXG4gIH1cblxuICBmdW5jdGlvbiBnZXRUcmFzaEZvbGRlcigpIHtcbiAgICBjb25zdCB0cmFzaEZvbGRlcnMgPSByb290KCkuY2hpbGRyZW4uZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICd0cmFzaCcpIGFzIElGb2xkZXJbXTtcbiAgICByZXR1cm4gdHJhc2hGb2xkZXJzWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkge1xuICAgIHJldHVybiBvcmRlcmVkRW50cmllcy5maWx0ZXIoKF8sIGlkeCkgPT4gb3JkZXJlZFNlbGVjdGlvbltpZHhdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRm9sZGVycygpIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICdmb2xkZXInKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkVHJhc2goKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAndHJhc2gnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRmlsZXMoKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAnZmlsZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJblRyYXNoKCkge1xuICAgIGNvbnN0IGlzVHJhc2hGb2xkZXIgPSAoZm9sZGVyOiBJRm9sZGVyKTogYm9vbGVhbiA9PiBmb2xkZXIudHlwZSA9PT0gJ3RyYXNoJztcbiAgICByZXR1cm4gZm9sZGVyUGF0aC5zb21lKGlzVHJhc2hGb2xkZXIpO1xuICB9XG5cbiAgLy8gVE9ETzpcbiAgLy8gZnVuY3Rpb24gc29ydEVudHJpZXMoKSB7fVxuXG4gIHJldHVybiB7XG4gICAgcm9vdDogcm9vdCxcbiAgICBzZXRFbnRyaWVzOiBzZXRFbnRyaWVzLFxuICAgIGdldEVudHJpZXM6IGdldEVudHJpZXMsXG4gICAgZ2V0SW5kZXhCeUVudHJ5TmFtZTogZ2V0SW5kZXhCeUVudHJ5TmFtZSxcbiAgICBzZXRTZWxlY3Rpb246IHNldFNlbGVjdGlvbixcbiAgICBnZXRTZWxlY3Rpb246IGdldFNlbGVjdGlvbixcbiAgICByZXNldFNlbGVjdGlvbjogcmVzZXRTZWxlY3Rpb24sXG4gICAgc2V0Rm9sZGVyUGF0aDogc2V0Rm9sZGVyUGF0aCxcbiAgICBnZXRGb2xkZXJQYXRoOiBnZXRGb2xkZXJQYXRoLFxuICAgIGdldEZvbGRlclBhdGhOYW1lczogZ2V0Rm9sZGVyUGF0aE5hbWVzLFxuICAgIGdldEZvbGRlclBhdGhCeU5hbWVzOiBnZXRGb2xkZXJQYXRoQnlOYW1lcyxcbiAgICBnZXRQYXJlbnRGb2xkZXI6IGdldFBhcmVudEZvbGRlcixcbiAgICBnZXRUcmFzaEZvbGRlcjogZ2V0VHJhc2hGb2xkZXIsXG4gICAgZ2V0U2VsZWN0ZWRFbnRyaWVzOiBnZXRTZWxlY3RlZEVudHJpZXMsXG4gICAgZ2V0U2VsZWN0ZWRGb2xkZXJzOiBnZXRTZWxlY3RlZEZvbGRlcnMsXG4gICAgZ2V0U2VsZWN0ZWRUcmFzaDogZ2V0U2VsZWN0ZWRUcmFzaCxcbiAgICBnZXRTZWxlY3RlZEZpbGVzOiBnZXRTZWxlY3RlZEZpbGVzLFxuICAgIGlzSW5UcmFzaDogaXNJblRyYXNoLFxuICB9O1xufSIsImltcG9ydCB7IE1vZGFsV2luZG93LCBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuLi91dGlscy9Nb2RhbFdpbmRvdyc7XG5pbXBvcnQge1xuICBhZGROZXdGaWxlcyxcbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzLFxuICBoYW5kbGVNYWtlUGFpcixcbiAgc29ydEZpbGVCeU5hbWUsXG59IGZyb20gJy4vVXBsb2FkVG9vbHMnO1xuaW1wb3J0IHsgdXBkYXRlRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVVwbG9hZFVwZGF0ZShcbiAgbW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKSB7XG4gIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdXBsb2FkaW5nX3NwaW5uZXInKTtcbiAgc3Bpbm5lci5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKGN1cnJlbnRGb2xkZXIpXG4gICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuXG4gICAgICAgIC8vIFNob3cgdXBsb2FkZWQgZmlsZW5hbWVzXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxGaWxlcyA9IHJlc3VsdHNcbiAgICAgICAgICAuZmlsdGVyKChyZXN1bHQpID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAubWFwKChyZXN1bHQpID0+IHJlc3VsdC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHN1Y2Nlc3NmdWxGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW5mb0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tYmFkZ2UnKTtcbiAgICAgICAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSBgVXBsb2FkZWQgZmlsZXM6ICR7c3VjY2Vzc2Z1bEZpbGVzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgICBpbmZvQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaW5mb0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAnIzlEQjJCRic7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwMDApO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ09uZSBvciBtb3JlIHVwbG9hZHMgcmVqZWN0ZWQ6ICcsIGVycm9yKTtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbml0VXBsb2FkQXJlYShjdXJyZW50Rm9sZGVyOiBJRm9sZGVyKTogdm9pZCB7XG4gIC8vIGdlbmVyYXRlIG1vZGFsIHdpbmRvd1xuICBjb25zdCBtb2RhbFdpbmRvdyA9IG5ldyBNb2RhbFdpbmRvdygpO1xuICBtb2RhbFdpbmRvdy5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRCk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xuXG4gIGNvbnN0IHBhaXJCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFrZV9wYWlyJyk7XG4gIGNvbnN0IHVwbG9hZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWRfYnV0dG9uJyk7XG5cbiAgcGFpckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU1ha2VQYWlyKTtcbiAgdXBsb2FkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT5cbiAgICBoYW5kbGVVcGxvYWRVcGRhdGUobW9kYWxXaW5kb3csIGN1cnJlbnRGb2xkZXIpLFxuICApO1xuXG4gIC8vIHJlcXVlc3QgdXNlciBmaWxlIHN5c3RlbSB3aGVuIGNsaWNraW5nIG9uIHVwbG9hZCBhcmVhXG4gIGNvbnN0IGZpbGVTZWxlY3RvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVTZWxlY3Rvci50eXBlID0gJ2ZpbGUnO1xuICBmaWxlU2VsZWN0b3IubXVsdGlwbGUgPSB0cnVlO1xuICBmaWxlU2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdG9yQ2hhbmdlKCkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGZpbGVTZWxlY3Rvci5maWxlcztcbiAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oZmlsZUxpc3QpO1xuICAgIGNvbnN0IHJlamVjdEZpbGVzID0gYWRkTmV3RmlsZXMoZmlsZXMpO1xuICAgIGlmIChyZWplY3RGaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lcyA9IHJlamVjdEZpbGVzLm1hcCgoZmlsZSkgPT4gZmlsZS5uYW1lKTtcbiAgICAgIHdpbmRvdy5hbGVydChcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG5vdCAubWVpLCAucG5nLCAuanBlZywgb3IgLmpzb25sZCBmaWxlczogXFxuXFxuJHtmaWxlbmFtZXMuam9pbihcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHNlbGVjdGlvblxuICAgIGZpbGVTZWxlY3Rvci52YWx1ZSA9IG51bGw7XG4gIH0pO1xuXG4gIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMgZm9yIGNsaWNrIGFuZCBkcmFnIGFuZCBkcm9wXG4gIGNvbnN0IHVwbG9hZF9hcmVhOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJyNpbml0aWFsX3VwbG9hZF9hcmVhJyxcbiAgKTtcbiAgdXBsb2FkX2FyZWEub25jbGljayA9ICgpID0+IGZpbGVTZWxlY3Rvci5jbGljaygpO1xuICAvLyBhZGQgdmlzdWFsIGN1ZXMgZm9yIGRyYWdnaW5nIGZpbGVzIG92ZXIgdXBsb2FkIGFyZWFcbiAgdXBsb2FkX2FyZWEub25kcmFnbGVhdmUgPSAoKSA9PiB1cGxvYWRfYXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyJyk7XG4gIHVwbG9hZF9hcmVhLm9uZHJhZ292ZXIgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHVwbG9hZF9hcmVhLmNsYXNzTGlzdC5hZGQoJ292ZXInKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgfTtcbiAgLy8gcmVjZWl2ZSBmaWxlcyBvbmNlIGZpbGVzIGFyZSBkcm9wcGVkXG4gIHVwbG9hZF9hcmVhLm9uZHJvcCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdXBsb2FkX2FyZWEuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcicpO1xuICAgIGNvbnN0IGZpbGVMaXN0ID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShmaWxlTGlzdCk7XG4gICAgY29uc3QgcmVqZWN0RmlsZXMgPSBhZGROZXdGaWxlcyhmaWxlcyk7XG4gICAgaWYgKHJlamVjdEZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgZmlsZW5hbWVzID0gcmVqZWN0RmlsZXMubWFwKChmaWxlKSA9PiBmaWxlLm5hbWUpO1xuICAgICAgd2luZG93LmFsZXJ0KFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbm90IC5tZWksIC5wbmcsIC5qcGVnLCBvciAuanNvbmxkIGZpbGVzOiBcXG5cXG4ke2ZpbGVuYW1lcy5qb2luKFxuICAgICAgICAgICdcXG4nLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvLyBMaXN0ZW5lciBmb3Igc29ydGluZyBmaWxlL2ZvbGlvXG4gIGNvbnN0IHNvcnRCeU5hbWVCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNvcnRfbmFtZScpO1xuICBzb3J0QnlOYW1lQnRucy5mb3JFYWNoKChzb3J0QnlOYW1lQnRuKSA9PiB7XG4gICAgc29ydEJ5TmFtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+XG4gICAgICBzb3J0RmlsZUJ5TmFtZShzb3J0QnlOYW1lQnRuKSxcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IFVwbG9hZEZpbGVNYW5hZ2VyIGZyb20gJy4vVXBsb2FkRmlsZU1hbmFnZXInO1xuaW1wb3J0IHsgY3JlYXRlTWFuaWZlc3QsIGFkZERvY3VtZW50IH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IElGb2xkZXIsIEZpbGVTeXN0ZW1Ub29scyB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmNvbnN0IGZtID0gVXBsb2FkRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuLy8gU2V0IE1FSSB0ZW1wbGF0ZVxuY29uc3QgdGVtcGxhdGVQYXRoID0gJ3NhbXBsZXMvbWVpL21laV90ZW1wbGF0ZS5tZWknO1xuZm0uc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoKTtcblxuLy8gQWRkcyBuZXcgZmlsZXMgdG8gdXBsb2FkIHBhaXJpbmcgY29udGFpbmVyIGFuZCBmaWxlbWFuYWdlciwgcmV0dXJucyBsaXN0IG9mIHJlamVjdGVkIGZpbGVzXG5leHBvcnQgZnVuY3Rpb24gYWRkTmV3RmlsZXMoZmlsZXM6IEZpbGVbXSk6IEZpbGVbXSB7XG4gIGNvbnN0IG1laV9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21laV9saXN0Jyk7XG4gIGNvbnN0IGltYWdlX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW1hZ2VfbGlzdCcpO1xuXG4gIGNvbnN0IHJlamVjdEZpbGVzOiBGaWxlW10gPSBbXTtcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuXG4gICAgaWYgKGV4dCA9PT0gJ21laScpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdtZWknKTtcbiAgICAgIG1laV9jb250YWluZXIuYXBwZW5kQ2hpbGQodW5wYWlyZWRJdGVtKTtcbiAgICAgIGZtLmFkZEZpbGUoZmlsZSk7XG4gICAgfSBlbHNlIGlmIChbJ3BuZycsICdqcGcnLCAnanBlZyddLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdpbWFnZScpO1xuICAgICAgaW1hZ2VfY29udGFpbmVyLmFwcGVuZENoaWxkKHVucGFpcmVkSXRlbSk7XG4gICAgICBmbS5hZGRGaWxlKGZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZXh0ID09PSAnanNvbmxkJykge1xuICAgICAgLy8gLy8gcmVtb3ZlIG1hbnVzY3JpcHQgc3VwcG9ydCBmb3IgdGhlIGltbWVkaWF0ZSBmdXR1cmUhXG4gICAgICAvLyBjb25zdCBtYW51c2NyaXB0Rm9saW8gPSBjcmVhdGVNYW51c2NyaXB0Rm9saW8oZmlsZS5uYW1lKTtcbiAgICAgIC8vIG1hbnVzY3JpcHRfY29udGFpbmVyLmFwcGVuZENoaWxkKG1hbnVzY3JpcHRGb2xpbyk7XG4gICAgICAvLyBmbS5hZGRGaWxlKGZpbGUpO1xuICAgICAgLy8gZm0uYWRkTWFudXNjcmlwdChmaWxlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3RGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZWplY3RGaWxlcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVW5wYWlyZWRJdGVtKGZpbGVuYW1lOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcpOiBIVE1MRGl2RWxlbWVudCB7XG4gIGlmIChncm91cCAhPT0gJ21laScgJiYgZ3JvdXAgIT09ICdpbWFnZScpIHJldHVybjtcbiAgY29uc3QgcmFkaW9OYW1lID0gJ21laScgPT09IGdyb3VwID8gJ21laV9yYWRpb19ncm91cCcgOiAnaW1hZ2VfcmFkaW9fZ3JvdXAnO1xuICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuXG4gIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbm9kZS5jbGFzc05hbWUgPSAndW5wYWlyZWRfaXRlbV9jb250YWluZXInO1xuXG4gIGNvbnN0IHJhZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgcmFkaW8udHlwZSA9ICdyYWRpbyc7XG4gIHJhZGlvLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX3JhZGlvJztcbiAgcmFkaW8ubmFtZSA9IHJhZGlvTmFtZTtcbiAgcmFkaW8udmFsdWUgPSBmaWxlbmFtZTtcbiAgcmFkaW8uaWQgPSBpZDtcblxuICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gIGxhYmVsLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX2xhYmVsJztcbiAgbGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBpZCk7XG5cbiAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgdGV4dC5pbm5lclRleHQgPSBmb3JtYXRGaWxlbmFtZShmaWxlbmFtZSwgNTApO1xuICB0ZXh0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnbWFyZ2luLXRvcDogYXV0bzsgbWFyZ2luLWxlZnQ6IDNweDsnKTtcblxuICBjb25zdCBkZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgZGVsQnRuLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9kZWxfYnRuJztcbiAgZGVsQnRuLnNyYyA9IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy91bnBhaXJlZC1yZW1vdmUtZG9jLnN2Z2A7XG4gIGRlbEJ0bi50aXRsZSA9ICdkZWxldGUnO1xuXG4gIGxhYmVsLmFwcGVuZENoaWxkKHJhZGlvKTtcbiAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG4gIG5vZGUuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICBub2RlLmFwcGVuZENoaWxkKGRlbEJ0bik7XG5cbiAgZGVsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIG5vZGUucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlTWFrZVBhaXIoKTogdm9pZCB7XG4gIGNvbnN0IHBhaXJlZF9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID1cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGFpcmVkX2xpc3QnKTtcblxuICAvLyBnZXQgYW5kIGNoZWNrIGlmIHNlbGVjdGVkIHJhZGlvIGV4aXN0c1xuICBjb25zdCBzZWxlY3RlZE1laUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICdpbnB1dFtuYW1lPVwibWVpX3JhZGlvX2dyb3VwXCJdOmNoZWNrZWQnLFxuICApO1xuICBjb25zdCBzZWxlY3RlZEltYWdlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJ2lucHV0W25hbWU9XCJpbWFnZV9yYWRpb19ncm91cFwiXTpjaGVja2VkJyxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkTWVpRWxlbWVudCA9PT0gbnVsbCB8fCBzZWxlY3RlZEltYWdlRWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gIGxldCBtZWlfZmlsZW5hbWUgPSBzZWxlY3RlZE1laUVsZW1lbnQudmFsdWU7XG4gIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gc2VsZWN0ZWRJbWFnZUVsZW1lbnQudmFsdWU7XG4gIGxldCBpc0NyZWF0ZWQgPSBmYWxzZTtcblxuICBpZiAoc2VsZWN0ZWRNZWlFbGVtZW50LnZhbHVlID09PSAnY3JlYXRlX21laScpIHtcbiAgICBpc0NyZWF0ZWQgPSB0cnVlO1xuICAgIC8vIENoYW5nZSBleHRlbnNpb25cbiAgICBjb25zdCBmbiA9IGltYWdlX2ZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgaWYgKGZuLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZuLnBvcCgpO1xuICAgIH1cbiAgICBmbi5wdXNoKCdtZWknKTtcblxuICAgIG1laV9maWxlbmFtZSA9IGZuLmpvaW4oJy4nKTtcbiAgICAvLyBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgZm0uZ2V0SW1nRGltZW5zaW9uKGltYWdlX2ZpbGVuYW1lKVxuICAgICAgLnRoZW4oKGRpbWVuc2lvbnMpID0+IHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBzdGFmZlNwYWNlIH0gPSBkaW1lbnNpb25zO1xuICAgICAgICBjb25zdCBuZXdNZWlGaWxlID0gZm0uY3JlYXRlTWVpRmlsZShcbiAgICAgICAgICBtZWlfZmlsZW5hbWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHN0YWZmU3BhY2UsXG4gICAgICAgICk7XG4gICAgICAgIGZtLmFkZEZpbGUobmV3TWVpRmlsZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgY29uc3QgZmlsZW5hbWUgPSBtZWlfZmlsZW5hbWUuc3Vic3RyaW5nKDAsIG1laV9maWxlbmFtZS5sZW5ndGggLSA0KTtcbiAgLy8gbWFrZSBhbmQgYXBwZW5kIFVJIGVsZW1lbnRcbiAgY29uc3QgcGFpcmVkX2VsID0gY3JlYXRlUGFpcmVkRm9saW8oZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWUpO1xuICBwYWlyZWRfY29udGFpbmVyLmFwcGVuZENoaWxkKHBhaXJlZF9lbCk7XG4gIC8vIHJlZmxlY3QgaW4gZmlsZSBtYW5hZ2VyXG4gIGZtLmFkZEZvbGlvKGZpbGVuYW1lLCBtZWlfZmlsZW5hbWUsIGltYWdlX2ZpbGVuYW1lLCBpc0NyZWF0ZWQpO1xuICAvLyByZW1vdmUgZnJvbSB1bnBhaXJlZCBtZWkgYW5kIGltYWdlIGxpc3RzXG4gIGlmICghaXNDcmVhdGVkKSBzZWxlY3RlZE1laUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICBzZWxlY3RlZEltYWdlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJlZEZvbGlvKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBtZWlfZmlsZW5hbWU6IHN0cmluZyxcbiAgaW1hZ2VfZmlsZW5hbWU6IHN0cmluZyxcbik6IEhUTUxEaXZFbGVtZW50IHtcbiAgY29uc3QgbWVpX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWVpX2xpc3QnKTtcbiAgY29uc3QgaW1hZ2VfY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbWFnZV9saXN0Jyk7XG5cbiAgY29uc3QgZm9saW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW8uY2xhc3NOYW1lID0gJ2ZvbGlvX2l0ZW0nO1xuICBmb2xpby5zZXRBdHRyaWJ1dGUoJ21laScsIG1laV9maWxlbmFtZSk7XG4gIGZvbGlvLnNldEF0dHJpYnV0ZSgnaW1hZ2UnLCBpbWFnZV9maWxlbmFtZSk7XG5cbiAgY29uc3QgZm9saW9fZmlsZW5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW9fZmlsZW5hbWUuY2xhc3NMaXN0LmFkZCgnZm9saW8tZmlsZW5hbWUnKTtcbiAgZm9saW9fZmlsZW5hbWUuaW5uZXJIVE1MID0gZm9ybWF0RmlsZW5hbWUoZmlsZW5hbWUsIDUwKTtcbiAgZm9saW8uYXBwZW5kQ2hpbGQoZm9saW9fZmlsZW5hbWUpO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZVVucGFpcigpIHtcbiAgICAvLyByZW1vdmUgZm9saW8gZnJvbSBVSVxuICAgIGZvbGlvLnJlbW92ZSgpO1xuICAgIC8vIHJlbW92ZSBmb2xpbyBmcm9tIGZpbGUgbWFuYWdlclxuICAgIGNvbnN0IGlzQ3JlYXRlZCA9IGZtLmlzQ3JlYXRlZEZvbGlvKGZpbGVuYW1lKTtcbiAgICBmbS5yZW1vdmVGb2xpbyhmaWxlbmFtZSk7XG4gICAgLy8gYWRkIGl0ZW1zIGJhY2sgdG8gdW5wYWlyZWQgY29udGFpbmVyc1xuICAgIGlmICghaXNDcmVhdGVkKSB7XG4gICAgICBjb25zdCBtZWlJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKG1laV9maWxlbmFtZSwgJ21laScpO1xuICAgICAgbWVpX2NvbnRhaW5lci5hcHBlbmRDaGlsZChtZWlJdGVtKTtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKGltYWdlX2ZpbGVuYW1lLCAnaW1hZ2UnKTtcbiAgICBpbWFnZV9jb250YWluZXIuYXBwZW5kQ2hpbGQoaW1hZ2VJdGVtKTtcbiAgfVxuXG4gIGNvbnN0IHVucGFpckJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICB1bnBhaXJCdG4uY2xhc3NOYW1lID0gJ3VucGFpcl9idG4nO1xuICB1bnBhaXJCdG4uc3JjID0gYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3VucGFpci1kb2Muc3ZnYDtcbiAgdW5wYWlyQnRuLnRpdGxlID0gJ3VucGFpcic7XG4gIHVucGFpckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVVucGFpcik7XG4gIGZvbGlvLmFwcGVuZENoaWxkKHVucGFpckJ0bik7XG5cbiAgcmV0dXJuIGZvbGlvO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKTogUHJvbWlzZTx7IHN0YXR1czogc3RyaW5nOyB2YWx1ZT86IHN0cmluZzsgcmVhc29uPzogYW55IH1bXT4ge1xuICBjb25zdCBmb2xpb1Byb21pc2VzID0gZm1cbiAgICAuZ2V0Rm9saW9zKClcbiAgICAubWFwKGFzeW5jIChbbmFtZSwgbWVpLCBpbWFnZV06IFtzdHJpbmcsIEZpbGUsIEZpbGVdKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHVwbG9hZEZvbGlvKGlkLCBuYW1lLCBtZWksIGltYWdlLCBjdXJyZW50Rm9sZGVyKTtcbiAgICB9KTtcblxuICBjb25zdCBtYW51c2NyaXB0UHJvbWlzZXMgPSBbXTsgLy9mbS5nZXRNYW51c2NyaXB0cygpXG4gIC8vIC5tYXAoIGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG4gIC8vICAgcmV0dXJuIGF3YWl0IHVwbG9hZE1hbnVzY3JpcHQoZmlsZSk7XG4gIC8vIH0pO1xuXG4gIGNvbnN0IHByb21pc2VzID0gWy4uLmZvbGlvUHJvbWlzZXMsIC4uLm1hbnVzY3JpcHRQcm9taXNlc10ubWFwKChwKSA9PlxuICAgIFByb21pc2UucmVzb2x2ZShwKS50aGVuKFxuICAgICAgKHZhbHVlKSA9PiAoeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZSB9KSxcbiAgICAgIChyZWFzb24pID0+ICh7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uIH0pLFxuICAgICksXG4gICk7XG5cbiAgZm0uY2xlYXIoKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkRm9saW8oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgbWVpOiBGaWxlLFxuICBpbWFnZTogRmlsZSxcbiAgY3VycmVudEZvbGRlcjogSUZvbGRlcixcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBuZXdOYW1lID0gZm5Db25mbGljdEhhbmRsZXIoXG4gICAgbmFtZSxcbiAgICBGaWxlU3lzdGVtVG9vbHMuZ2V0QWxsTmFtZXMoY3VycmVudEZvbGRlciksXG4gICk7XG4gIHJldHVybiAoXG4gICAgY3JlYXRlTWFuaWZlc3QoaWQsIG5ld05hbWUsIG1laSwgaW1hZ2UpXG4gICAgICAudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RCbG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKV0sIHtcbiAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpc1NpbmdsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBhZGREb2N1bWVudChpZCwgbmV3TmFtZSwgbWFuaWZlc3RCbG9iLCBpc1NpbmdsZSk7XG4gICAgICB9KVxuICAgICAgLy8gYWRkIHRvIGRhc2hib2FyZCBGaWxlU3lzdGVtXG4gICAgICAudGhlbigoc3VjY2VlZGVkKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZWVkZWQpIHtcbiAgICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCBmaWxlRW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRmlsZShuZXdOYW1lLCBpZCk7XG4gICAgICAgICAgY29uc3QgZm9saW9FbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShmaWxlRW50cnksIHtcbiAgICAgICAgICAgIHR5cGU6ICdmb2xpbycsXG4gICAgICAgICAgICBjcmVhdGVkX29uOiBkYXRldGltZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBpc0FkZGVkID0gRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KGZvbGlvRW50cnksIGN1cnJlbnRGb2xkZXIpO1xuICAgICAgICAgIHJldHVybiBpc0FkZGVkID8gbmV3TmFtZSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICApO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KG1hbnVzY3JpcHQubmFtZSwgbWFudXNjcmlwdCwgZmFsc2UpO1xuLy8gfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29ydEZpbGVCeU5hbWUoc29ydEJ5TmFtZUJ0bjogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlTGlzdCA9IHNvcnRCeU5hbWVCdG4ucGFyZW50RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gIGNvbnN0IGZpbGVFbGVtZW50cyA9IEFycmF5LmZyb20oZmlsZUxpc3QuY2hpbGRyZW4pO1xuXG4gIGxldCBpc0FzY2VuZGluZyA9IHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdhcnJvdy11cCcpO1xuXG4gIGlmIChpc0FzY2VuZGluZykge1xuICAgIHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LnJlbW92ZSgnYXJyb3ctdXAnKTtcbiAgICBzb3J0QnlOYW1lQnRuLmNsYXNzTGlzdC5hZGQoJ2Fycm93LWRvd24nKTtcbiAgICBzb3J0QnlOYW1lQnRuLmlubmVySFRNTCA9ICcmI3gyMkMxOyc7XG4gIH0gZWxzZSB7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhcnJvdy1kb3duJyk7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QuYWRkKCdhcnJvdy11cCcpO1xuICAgIHNvcnRCeU5hbWVCdG4uaW5uZXJIVE1MID0gJyYjeDIyQzA7JztcbiAgfVxuXG4gIGlzQXNjZW5kaW5nID0gIWlzQXNjZW5kaW5nO1xuXG4gIGZpbGVFbGVtZW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgbmFtZUEgPSBhLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBjb25zdCBuYW1lQiA9IGIudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIHJldHVybiBpc0FzY2VuZGluZ1xuICAgICAgPyBuYW1lQS5sb2NhbGVDb21wYXJlKG5hbWVCKVxuICAgICAgOiBuYW1lQi5sb2NhbGVDb21wYXJlKG5hbWVBKTtcbiAgfSk7XG5cbiAgZmlsZUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBmaWxlTGlzdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgfSk7XG5cbiAgc29ydEJ5TmFtZUJ0bi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NvbG9yOiBibGFjaycpO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUsIGN1cnJlbnRGb2xkZXI6IElGb2xkZXIsIGV4aXN0aW5nTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4vLyAgIGNvbnN0IGlzU2luZ2xlID0gZmFsc2U7XG4vLyAgIGNvbnN0IGlkID0gbWFudXNjcmlwdFsnQGlkJ10gIT09IG51bGwgPyBtYW51c2NyaXB0WydAaWQnXSA6IG1hbnVzY3JpcHQubmFtZTtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KGlkLCBtYW51c2NyaXB0Lm5hbWUsIG1hbnVzY3JpcHQsIGlzU2luZ2xlKVxuLy8gICAgIC8vIGFkZCB0byBkYXNoYm9hcmQgRmlsZVN5c3RlbVxuLy8gICAgIC50aGVuKHN1Y2NlZWRlZCA9PiB7XG4vLyAgICAgICBpZiAoc3VjY2VlZGVkKSB7XG4vLyAgICAgICAgIGNvbnN0IG5ld05hbWUgPSBmbkNvbmZsaWN0SGFuZGxlcihtYW51c2NyaXB0Lm5hbWUsIGV4aXN0aW5nTmFtZXMpO1xuLy8gICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbi8vICAgICAgICAgY29uc3QgZmlsZUVudHJ5ID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZpbGUobmV3TmFtZSwgaWQpO1xuLy8gICAgICAgICBjb25zdCBtYW51c2NyaXB0RW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZmlsZUVudHJ5LCB7IHR5cGU6ICdtYW51c2NyaXB0JywgY3JlYXRlZF9vbjogZGF0ZXRpbWUgfSk7XG4vLyAgICAgICAgIGNvbnN0IGlzQWRkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobWFudXNjcmlwdEVudHJ5LCBjdXJyZW50Rm9sZGVyKTtcbi8vICAgICAgICAgcmV0dXJuIGlzQWRkZWQ7XG4vLyAgICAgICB9XG4vLyAgICAgICBlbHNlIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyB9XG5cbi8vIExpbWl0IGZpbGVuYW1lIGxlbmd0aFxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcsIG1heExlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2h1bmtMZW4gPSBNYXRoLmZsb29yKG1heExlbiAvIDIpO1xuICBjb25zdCBsZW4gPSBmaWxlbmFtZS5sZW5ndGg7XG4gIGlmIChsZW4gPD0gbWF4TGVuKSByZXR1cm4gZmlsZW5hbWU7XG4gIGVsc2VcbiAgICByZXR1cm4gYCR7ZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGNodW5rTGVuIC0gMSl9Li4uJHtmaWxlbmFtZS5zdWJzdHJpbmcoXG4gICAgICBsZW4gLSBjaHVua0xlbiArIDIsXG4gICAgICBsZW4sXG4gICAgKX1gO1xufVxuXG4vLyBSZW5hbWVzIGZpbGUgaWYgdGhlcmUgYXJlIG5hbWluZyBjb25mbGljdHMsIGluIHRoZSBmb3JtIG9mICdmb29iYXIgKDEpJ1xuZXhwb3J0IGZ1bmN0aW9uIGZuQ29uZmxpY3RIYW5kbGVyKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBleGlzdGluZ05hbWVzOiBzdHJpbmdbXSxcbik6IHN0cmluZyB7XG4gIGxldCBuZXdGaWxlbmFtZSA9IGZpbGVuYW1lO1xuICBsZXQgY291bnRlciA9IDE7XG5cbiAgd2hpbGUgKGV4aXN0aW5nTmFtZXMuaW5jbHVkZXMobmV3RmlsZW5hbWUpKSB7XG4gICAgbmV3RmlsZW5hbWUgPSBgJHtmaWxlbmFtZX0oJHtjb3VudGVyfSlgO1xuICAgIGNvdW50ZXIrKztcbiAgfVxuICByZXR1cm4gbmV3RmlsZW5hbWU7XG59XG4iLCJpbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi91dGlscy9yYW5kb20nO1xuaW1wb3J0ICogYXMgdmtiZWF1dGlmeSBmcm9tICd2a2JlYXV0aWZ5JztcblxuLyoqXG4gKiBNYW5hZ2VyIGZvciBmaWxlIHVwbG9hZGluZyBhbmQgcGFpcmluZyBwcm9jZXNzXG4gKi9cbmNsYXNzIFVwbG9hZEZpbGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVwbG9hZEZpbGVNYW5hZ2VyO1xuXG4gIHByaXZhdGUgYWxsRmlsZXMgPSBuZXcgTWFwPHN0cmluZywge2ZpbGU6IEZpbGUsIGNvdW50OiBudW1iZXJ9PigpO1xuICBwcml2YXRlIGZvbGlvcyA9IG5ldyBBcnJheTxmb2xpbz4oKTsgLy8gZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWVcbiAgLy8gcHJpdmF0ZSBtYW51c2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgbWVpVGVtcGxhdGU6IHN0cmluZztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXBsb2FkRmlsZU1hbmFnZXIge1xuICAgIGlmICghVXBsb2FkRmlsZU1hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgIFVwbG9hZEZpbGVNYW5hZ2VyLmluc3RhbmNlID0gbmV3IFVwbG9hZEZpbGVNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBVcGxvYWRGaWxlTWFuYWdlci5pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXMuaGFzKGZpbGUubmFtZSkpIHtcbiAgICAgIGNvbnN0IG5ld0VudHJ5ID0geyBmaWxlOiBmaWxlLCBjb3VudDogMSB9O1xuICAgICAgdGhpcy5hbGxGaWxlcy5zZXQoZmlsZS5uYW1lLCBuZXdFbnRyeSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGZpbGUubmFtZSk7XG4gICAgICBjb25zdCB1cGRhdGVkRW50cnkgPSB7IGZpbGU6IGZpbGUsIGNvdW50OiBleGlzdGluZ0NvdW50KzEgfTtcbiAgICAgIHRoaXMuYWxsRmlsZXMuc2V0KGZpbGUubmFtZSwgdXBkYXRlZEVudHJ5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0ZW1wbGF0ZVBhdGgpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIE1FSSB0ZW1wbGF0ZSBmcm9tICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1laVRlbXBsYXRlID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlTWVpRmlsZShmaWxlbmFtZTogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc3RhZmZTcGFjZTogbnVtYmVyKTogRmlsZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5tZWlUZW1wbGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIE1FSSB0ZW1wbGF0ZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcbiAgICAgIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGhpcy5tZWlUZW1wbGF0ZSwgJ3RleHQveG1sJyk7XG4gICAgICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICBjb25zdCBtZWlIZWFkID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ21laUhlYWQnKTtcbiAgICAgIG1laUhlYWQuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgZmlsZURlc2MgPSBtZWkucXVlcnlTZWxlY3RvcignZmlsZURlc2MnKTtcbiAgICAgIGZpbGVEZXNjLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHRpdGxlU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZVN0bXQnKTtcbiAgICAgIHRpdGxlU3RtdC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCB0aXRsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICAgICAgdGl0bGUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgcHViU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCdwdWJTdG10Jyk7XG4gICAgICBwdWJTdG10LnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IGZhY3NpbWlsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdmYWNzaW1pbGUnKTtcbiAgICAgIGZhY3NpbWlsZS5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdXJmYWNlID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N1cmZhY2UnKTtcbiAgICAgIGNvbnN0IHN1cmZhY2VJZCA9ICdtLScgKyB1dWlkdjQoKTtcbiAgICAgIHN1cmZhY2Uuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCBzdXJmYWNlSWQpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeCcsIHdpZHRoLnRvU3RyaW5nKCkpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeScsIGhlaWdodC50b1N0cmluZygpKTtcbiAgICAgIFxuICAgICAgY29uc3Qgem9uZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd6b25lJyk7XG4gICAgICBjb25zdCB6b25lSWQgPSAnbS0nICsgdXVpZHY0KCk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgem9uZUlkKTtcbiAgICAgIGNvbnN0IG1hcmdpblJhdGVWID0gMC4xO1xuICAgICAgY29uc3QgbWFyZ2luUmF0ZUggPSAwLjE1O1xuICAgICAgY29uc3QgbWFyZ2luViA9IE1hdGgucm91bmQobWFyZ2luUmF0ZVYgKiB3aWR0aCk7XG4gICAgICBjb25zdCBtYXJnaW5IID0gTWF0aC5yb3VuZChtYXJnaW5SYXRlSCAqIHdpZHRoKTtcbiAgICAgIHpvbmUuc2V0QXR0cmlidXRlKCd1bHgnLCBtYXJnaW5ILnRvU3RyaW5nKCkpO1xuICAgICAgem9uZS5zZXRBdHRyaWJ1dGUoJ3VseScsIG1hcmdpblYudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ4JywgKHdpZHRoIC0gbWFyZ2luSCkudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ5JywgKG1hcmdpblYgKyAzICogc3RhZmZTcGFjZSkudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IG1kaXYgPSBtZWkucXVlcnlTZWxlY3RvcignbWRpdicpO1xuICAgICAgbWRpdi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzY29yZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdzY29yZScpO1xuICAgICAgc2NvcmUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2NvcmVEZWYgPSBtZWkucXVlcnlTZWxlY3Rvcignc2NvcmVEZWYnKTtcbiAgICAgIHNjb3JlRGVmLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHN0YWZmR3JwID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N0YWZmR3JwJyk7XG4gICAgICBzdGFmZkdycC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdGFmZkRlZiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzdGFmZkRlZicpO1xuICAgICAgc3RhZmZEZWYuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzZWN0aW9uJyk7XG4gICAgICBzZWN0aW9uLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHBiID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3BiJyk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCAnIycgKyBzdXJmYWNlSWQpO1xuICAgICAgY29uc3Qgc2IgPSBtZWkucXVlcnlTZWxlY3Rvcignc2InKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgnZmFjcycsICcjJyArIHpvbmVJZCk7XG5cbiAgICAgIGNvbnN0IG1laUZpbGVDb250ZW50ID0gdmtiZWF1dGlmeS54bWwoc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhtZWlEb2MpKTtcbiAgICAgIGNvbnN0IG1laUJsb2IgPSBuZXcgQmxvYihbbWVpRmlsZUNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgRmlsZShbbWVpQmxvYl0sIGZpbGVuYW1lLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSBcblxuICBwdWJsaWMgZ2V0SW1nRGltZW5zaW9uKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIsIHN0YWZmU3BhY2U6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZ0ZpbGUgPSB0aGlzLmdldEZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICBpZiAoIWltZ0ZpbGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKCFjdHgpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgMkQgY29udGV4dCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXG4gICAgICAgICAgLy8gQmluYXJpemF0aW9uXG4gICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgIGNvbnN0IGJpbmFyeVRocmVzaG9sZCA9IDEyNztcbiAgICAgICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgICBjb25zdCBncmF5c2NhbGUgPSAoZGF0YVtpXSArIGRhdGFbaSArIDFdICsgZGF0YVtpICsgMl0pIC8gMztcbiAgICAgICAgICAgIGNvbnN0IGJpbmFyeVZhbHVlID0gZ3JheXNjYWxlIDwgYmluYXJ5VGhyZXNob2xkID8gMCA6IDI1NTtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBiaW5hcnlWYWx1ZTtcbiAgICAgICAgICAgIGRhdGFbaSArIDFdID0gYmluYXJ5VmFsdWU7XG4gICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJpbmFyeVZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG5cbiAgICAgICAgICAvLyBGaW5kaW5nIHN0YWZmIHNwYWNlXG4gICAgICAgICAgY29uc3Qgd2hpdGVSdW5MZW5ndGhzOiBudW1iZXJbXSA9IFtdOyAgXG4gICAgICAgICAgbGV0IGN1cnJTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNhbnZhcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAvLyBuZXcgY3VyclNwYWNlQ291bnQgZm9yIGV2ZXJ5IGNvbHVtblxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gY3R4LmdldEltYWdlRGF0YSh4LCAwLCAxLCBjYW52YXMuaGVpZ2h0KS5kYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBjb2x1bW4ubGVuZ3RoOyBwICs9IDQpIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpeGVsIGlzIGJsYWNrICgwKSBvciB3aGl0ZSAoMjU1KVxuICAgICAgICAgICAgICBpZiAoY29sdW1uW3BdID09PSAwICYmIGN1cnJTcGFjZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHdoaXRlUnVuTGVuZ3Rocy5wdXNoKGN1cnJTcGFjZUNvdW50KTtcbiAgICAgICAgICAgICAgICBjdXJyU3BhY2VDb3VudCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclNwYWNlQ291bnQrKztcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNlY29uZCBtb3N0IGNvbW1vbiB2YWx1ZSBhcyBzdGFmZiBzcGFjZVxuICAgICAgICAgIGNvbnN0IHN0YWZmU3BhY2UgPSB3aGl0ZVJ1bkxlbmd0aHMubGVuZ3RoID4gMCA/IHRoaXMuZmluZFNlY29uZE1vZGUod2hpdGVSdW5MZW5ndGhzKSA6IDA7XG5cbiAgICAgICAgICByZXNvbHZlKHsgd2lkdGg6IGltZy53aWR0aCwgaGVpZ2h0OiBpbWcuaGVpZ2h0LCBzdGFmZlNwYWNlOiAgc3RhZmZTcGFjZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgaW1hZ2U6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWcuc3JjID0gZXZlbnQudGFyZ2V0LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICB9O1xuXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChpbWdGaWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFNlY29uZE1vZGUoYXJyOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgY291bnRNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBDb3VudCBvY2N1cnJlbmNlcyBvZiBlYWNoIGVsZW1lbnRcbiAgICBhcnIuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGNvdW50ID0gKGNvdW50TWFwLmdldChlbGVtZW50KSB8fCAwKSArIDE7XG4gICAgICBjb3VudE1hcC5zZXQoZWxlbWVudCwgY291bnQpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc29ydGVkTWFwID0gQXJyYXkuZnJvbShjb3VudE1hcC5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+IGJbMV0gLSBhWzFdKTtcblxuICAgIHJldHVybiBzb3J0ZWRNYXBbMV1bMF07XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRGaWxlKGtleTogc3RyaW5nKTogRmlsZSB7XG4gICAgaWYgKHRoaXMuYWxsRmlsZXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGtleSk7XG4gICAgaWYgKGNvdW50ID09PSAwKSByZXR1cm47XG4gICAgZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgIHRoaXMuYWxsRmlsZXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdXBkYXRlZEVudHJ5ID0geyBmaWxlOiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGUsIGNvdW50OiBjb3VudC0xIH07XG4gICAgICB0aGlzLmFsbEZpbGVzLnNldChrZXksIHVwZGF0ZWRFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEZpbGVDb3VudChrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCB0aGlzLmFsbEZpbGVzLmhhcyhrZXkpICkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxsRmlsZXMuZ2V0KGtleSkuY291bnQ7XG4gICAgfVxuICAgIGVsc2UgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgYWRkRm9saW8obmFtZTogc3RyaW5nLCBtZWk6IHN0cmluZywgaW1hZ2U6IHN0cmluZywgaXNDcmVhdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV3Rm9saW86IGZvbGlvID0ge1xuICAgICAgZmlsZW5hbWU6IG5hbWUsXG4gICAgICBtZWlfZmlsZW5hbWU6IG1laSxcbiAgICAgIGltYWdlX2ZpbGVuYW1lOiBpbWFnZSxcbiAgICAgIGlzQ3JlYXRlZDogaXNDcmVhdGVkLFxuICAgIH07XG4gICAgdGhpcy5mb2xpb3MucHVzaChuZXdGb2xpbyk7XG4gIH1cblxuICAvLyBwdWJsaWMgYWRkTWFudXNjcmlwdChmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vICAgdGhpcy5tYW51c2NyaXB0cy5wdXNoKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBpc0NyZWF0ZWRGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9saW8gPSB0aGlzLmZvbGlvcy5maW5kKChmb2xpbykgPT4gZm9saW8uZmlsZW5hbWUgPT09IGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZm9saW8gPyBmb2xpby5pc0NyZWF0ZWQgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5mb2xpb3MuZmluZEluZGV4KCBmb2xpbyA9PiBmb2xpby5maWxlbmFtZSA9PT0gZmlsZW5hbWUpO1xuICAgIHRoaXMuZm9saW9zLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgLy8gcHVibGljIHJlbW92ZU1hbnVzY3JpcHQoZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAvLyAgIGNvbnN0IGlkeCA9IHRoaXMubWFudXNjcmlwdHMuZmluZEluZGV4KG1hbnVzY3JpcHQgPT4gbWFudXNjcmlwdCA9PT0gZmlsZW5hbWUpO1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuc3BsaWNlKGlkeCk7XG4gIC8vICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBnZXRGb2xpb3MoKTogW3N0cmluZywgRmlsZSwgRmlsZV1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9saW9zLm1hcCggZm9saW8gPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBmb2xpby5maWxlbmFtZTtcbiAgICAgIGNvbnN0IG1laV9maWxlbmFtZSA9IGZvbGlvLm1laV9maWxlbmFtZTtcbiAgICAgIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gZm9saW8uaW1hZ2VfZmlsZW5hbWU7XG4gICAgICByZXR1cm4gW2ZpbGVuYW1lLCB0aGlzLmdldEZpbGUobWVpX2ZpbGVuYW1lKSwgdGhpcy5nZXRGaWxlKGltYWdlX2ZpbGVuYW1lKV07XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0TWFudXNjcmlwdHMoKTogRmlsZVtdIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYW51c2NyaXB0cy5tYXAoIG1hbnVzY3JpcHQgPT4gdGhpcy5nZXRGaWxlKG1hbnVzY3JpcHQpKTtcbiAgLy8gfVxuXG4gIC8vIHB1YmxpYyBjbGVhck1hbnVzY3JpcHRzKCk6IHZvaWQge1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuZm9yRWFjaCggZmlsZW5hbWUgPT4ge1xuICAvLyAgICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gICB9KTtcbiAgLy8gICB0aGlzLm1hbnVzY3JpcHRzID0gW107XG4gIC8vIH1cbiAgXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5mb2xpb3Muc3BsaWNlKDApO1xuICB9XG5cbiAgcHVibGljIHByaW50KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHRoaXMuYWxsRmlsZXMpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZm9saW9zKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm1hbnVzY3JpcHRzKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVcGxvYWRGaWxlTWFuYWdlcjtcblxudHlwZSBmb2xpbyA9IHtcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgbWVpX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGltYWdlX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGlzQ3JlYXRlZDogYm9vbGVhbixcbn07IiwiLy8gSWYgdXNlciByaWdodC1jbGlja3Mgb24gYmFja2dyb3VuZCBhbmQgbm90aGluZyBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS11cGxvYWQtZG9jLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5VcGxvYWQgZG9jdW1lbnQ8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9uZXctZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1uZXctZm9sZGVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5OZXcgZm9sZGVyPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbmV3LWZvbGRlci5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBhIHNpbmdsZSBmaWxlIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3Qgc2luZ2xlRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmaWxlcyBhcmUgc2VsZWN0ZWRcbmV4cG9ydCBjb25zdCBtdWx0aUZpbGVPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1vcGVuLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5PcGVuPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvb3Blbi1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZSB0byBUcmFzaDwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLW1vdmUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk1vdmU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9tb3ZlLWRvYy1pY29uLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIDEgb3IgbW9yZSBmaWxlcyBhbmQgMSBvciBtb3JlIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgZm9sZGVyQW5kRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RGVsZXRlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgb25lIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHNpbmdsZUZvbGRlck9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmb2xkZXJzIGFyZSBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IG11bHRpRm9sZGVyT3B0aW9ucyA9IFxuICAgIGA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgdHJhc2ggZm9sZGVyIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgdHJhc2hGb2xkZXJPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1lbXB0eS10cmFzaC1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RW1wdHkgVHJhc2g8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW1vdmUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIGVudHJ5IGluIHRyYXNoIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHRyYXNoRW50cnlPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1yZWNvdmVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5QdXQgQmFjazwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlY292ZXItZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1kZWxldGUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPkRlbGV0ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +function n(e){var t=" ";if(isNaN(parseInt(e)))t=e;else switch(e){case 1:t=" ";break;case 2:t=" ";break;case 3:t=" ";break;case 4:t=" ";break;case 5:t=" ";break;case 6:t=" ";break;case 7:t=" ";break;case 8:t=" ";break;case 9:t=" ";break;case 10:t=" ";break;case 11:t=" ";break;case 12:t=" "}for(var n=["\n"],i=0;i<100;i++)n.push(n[i]+t);return n}function i(){this.step=" ",this.shift=n(this.step)}function r(e,t){return t-(e.replace(/\(/g,"").length-e.replace(/\)/g,"").length)}function o(e,t){return e.replace(/\s{1,}/g," ").replace(/ AND /gi,"~::~"+t+t+"AND ").replace(/ BETWEEN /gi,"~::~"+t+"BETWEEN ").replace(/ CASE /gi,"~::~"+t+"CASE ").replace(/ ELSE /gi,"~::~"+t+"ELSE ").replace(/ END /gi,"~::~"+t+"END ").replace(/ FROM /gi,"~::~FROM ").replace(/ GROUP\s{1,}BY/gi,"~::~GROUP BY ").replace(/ HAVING /gi,"~::~HAVING ").replace(/ IN /gi," IN ").replace(/ JOIN /gi,"~::~JOIN ").replace(/ CROSS~::~{1,}JOIN /gi,"~::~CROSS JOIN ").replace(/ INNER~::~{1,}JOIN /gi,"~::~INNER JOIN ").replace(/ LEFT~::~{1,}JOIN /gi,"~::~LEFT JOIN ").replace(/ RIGHT~::~{1,}JOIN /gi,"~::~RIGHT JOIN ").replace(/ ON /gi,"~::~"+t+"ON ").replace(/ OR /gi,"~::~"+t+t+"OR ").replace(/ ORDER\s{1,}BY/gi,"~::~ORDER BY ").replace(/ OVER /gi,"~::~"+t+"OVER ").replace(/\(\s{0,}SELECT /gi,"~::~(SELECT ").replace(/\)\s{0,}SELECT /gi,")~::~SELECT ").replace(/ THEN /gi," THEN~::~"+t).replace(/ UNION /gi,"~::~UNION~::~").replace(/ USING /gi,"~::~USING ").replace(/ WHEN /gi,"~::~"+t+"WHEN ").replace(/ WHERE /gi,"~::~WHERE ").replace(/ WITH /gi,"~::~WITH ").replace(/ ALL /gi," ALL ").replace(/ AS /gi," AS ").replace(/ ASC /gi," ASC ").replace(/ DESC /gi," DESC ").replace(/ DISTINCT /gi," DISTINCT ").replace(/ EXISTS /gi," EXISTS ").replace(/ NOT /gi," NOT ").replace(/ NULL /gi," NULL ").replace(/ LIKE /gi," LIKE ").replace(/\s{0,}SELECT /gi,"SELECT ").replace(/\s{0,}UPDATE /gi,"UPDATE ").replace(/ SET /gi," SET ").replace(/~::~{1,}/g,"~::~").split("~::~")}i.prototype.xml=function(e,t){var i=e.replace(/>\s{0,}<").replace(/-1?(a+=l[s]+i[c],o=!0,(i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1||i[c].search(/!DOCTYPE/)>-1)&&(o=!1)):i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1?(a+=i[c],o=!1):/^<\w/.exec(i[c-1])&&/^<\/\w/.exec(i[c])&&/^<[\w:\-\.\,]+/.exec(i[c-1])==/^<\/[\w:\-\.\,]+/.exec(i[c])[0].replace("/","")?(a+=i[c],o||s--):i[c].search(/<\w/)>-1&&-1==i[c].search(/<\//)&&-1==i[c].search(/\/>/)?a=a+=o?i[c]:l[s++]+i[c]:i[c].search(/<\w/)>-1&&i[c].search(/<\//)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\//)>-1?a=a+=o?i[c]:l[--s]+i[c]:i[c].search(/\/>/)>-1?a=a+=o?i[c]:l[s]+i[c]:i[c].search(/<\?/)>-1||i[c].search(/xmlns\:/)>-1||i[c].search(/xmlns\=/)>-1?a+=l[s]+i[c]:a+=i[c];return"\n"==a[0]?a.slice(1):a},i.prototype.json=function(e,t){t=t||this.step;return"undefined"==typeof JSON?e:"string"==typeof e?JSON.stringify(JSON.parse(e),null,t):"object"==typeof e?JSON.stringify(e,null,t):e},i.prototype.css=function(e,t){var i=e.replace(/\s{1,}/g," ").replace(/\{/g,"{~::~").replace(/\}/g,"~::~}~::~").replace(/\;/g,";~::~").replace(/\/\*/g,"~::~/*").replace(/\*\//g,"*/~::~").replace(/~::~\s{0,}~::~/g,"~::~").split("~::~"),r=i.length,o=0,s="",a=0,c=t?n(t):this.shift;for(a=0;a/g,"").replace(/[ \r\n\t]{1,}xmlns/g," xmlns")).replace(/>\s{0,}<")},i.prototype.jsonmin=function(e){return"undefined"==typeof JSON?e:JSON.stringify(JSON.parse(e),null,0)},i.prototype.cssmin=function(e,t){return(t?e:e.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"")).replace(/\s{1,}/g," ").replace(/\{\s{1,}/g,"{").replace(/\}\s{1,}/g,"}").replace(/\;\s{1,}/g,";").replace(/\/\*\s{1,}/g,"/*").replace(/\*\/\s{1,}/g,"*/")},i.prototype.sqlmin=function(e){return e.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")")},e.exports=new i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renameHTML=t.newFolderHTML=t.uploadAreaHTML=void 0,t.uploadAreaHTML='
\n\n
\n
\n
Upload Files
\n
\n
\n \n
\n
\n\n
Unpaired Documents
\n\n
\n\n
\n
MEI
\n
\n
Name
\n
\n
\n
\n
\n \n
\n
\n
\n\n
\n
Images
\n
\n
Name
\n
\n
\n
\n
\n\n
\n\n
\n
Make Pair
\n
\n
\n\n
\n\n
Paired Folios
\n
\n
Name
\n
\n
\n
\n\n
\n
\n Upload\n
\n
\n
\n\n
\n\n \x3c!--\n
\n

Manuscripts

\n
\n
\n --\x3e\n\n
\n
',t.newFolderHTML='\n
\n
\n
\n
\n \n \n
\n
\n ',t.renameHTML='\n
\n
\n
\n
\n \n \n
\n
\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.groupingNotRecognized=void 0,t.groupingNotRecognized=function(){window.confirm("Neon does not recognize this neume grouping. Would you like to create a compound neume?")||document.getElementById("undo").click()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitStaffHandler=void 0;const i=n(3),r=n(5),o=n(23),s=n(15);t.SplitStaffHandler=class{constructor(e,t){this.handler=(e=>{const t=this.staff.id,n=(0,s.getSVGRelCoords)(e.clientX,e.clientY),a={action:"split",param:{elementId:t,x:n.x}};this.neonView.edit(a,this.neonView.view.getCurrentPageURI()).then(async e=>{e&&(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success"));const n=new o.default(this.neonView,".staff");this.splitDisable(),(0,r.selectAll)([document.querySelector("#"+t)],this.neonView,n);const s=document.getElementById("moreEdit");s&&(s.innerHTML="",s.parentElement.classList.add("hidden"))})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.staff=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click Where to Split")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitNeumeHandler=void 0;const i=n(3);t.SplitNeumeHandler=class{constructor(e,t){this.handler=(e=>{const t={action:"splitNeume",param:{elementId:this.neume.id,ncId:e.target.parentElement.id}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(async e=>{e?(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success")):(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action failed","error")),this.splitDisable()})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.neume=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click The Beginning of The Second Neume")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t){},function(e,t,n){"use strict";(function(e){t.test=function(){return"function"==typeof e.queueMicrotask},t.install=function(t){return function(){e.queueMicrotask(t)}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){var n=e.MutationObserver||e.WebKitMutationObserver;t.test=function(){return n},t.install=function(t){var i=0,r=new n(t),o=e.document.createTextNode("");return r.observe(o,{characterData:!0}),function(){o.data=i=++i%2}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){t.test=function(){return!e.setImmediate&&void 0!==e.MessageChannel},t.install=function(t){var n=new e.MessageChannel;return n.port1.onmessage=t,function(){n.port2.postMessage(0)}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){t.test=function(){return"document"in e&&"onreadystatechange"in e.document.createElement("script")},t.install=function(t){return function(){var n=e.document.createElement("script");return n.onreadystatechange=function(){t(),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},e.document.documentElement.appendChild(n),t}}}).call(this,n(10))},function(e,t,n){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateDocName=t.deleteDocument=t.addDocument=t.createManifest=t.fetchUploads=t.db=void 0;const i=n(30),r=n(28),o=n(92);t.db=new r.default("Neon-User-Storage"),t.fetchUploads=async function(){try{return(await new Promise((e,n)=>{t.db.allDocs({include_docs:!0}).then(t=>e(t)).catch(e=>n(e))})).rows.map(e=>({id:e.id,name:e.doc?e.doc.name:"undefined"}))}catch(e){return console.log("Couldn't fetch uploaded documents",e.message),[]}},t.createManifest=function(e,t,n,r){return new Promise(async s=>{const a=JSON.parse(JSON.stringify(o));a["@id"]=e,a.title=t,a.timestamp=(new Date).toISOString();const c=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(n)}),l=new Promise(e=>{const t=new FileReader;t.addEventListener("load",()=>{e(t.result)}),t.readAsDataURL(r)}),d=await c,u=await l;a.image=u,a.mei_annotations=[{id:(0,i.v4)(),type:"Annotation",body:d,target:u}],s(a)})},t.addDocument=function(e,n,i,r){return new Promise((o,s)=>{t.db.put({_id:e,name:n,type:r?"page":"manuscript",_attachments:{manifest:{content_type:"application/ld+json",data:i}}}).then(()=>{o(!0)}).catch(t=>{window.alert(`Error Uploading Document: ${t.message}, title: ${n}, id: ${e}.`),s(!1)})})},t.deleteDocument=function(e){return new Promise((n,i)=>{t.db.get(e).then(e=>{t.db.remove(e).then(e=>{n(!0)}).catch(e=>{console.log(e),i(e)})}).catch(e=>{console.log(e),i(e)})})},t.updateDocName=function(e,n){return new Promise((i,r)=>{t.db.get(e).then(o=>{t.db.getAttachment(e,"manifest").then(e=>{e.text().then(e=>{const s=JSON.parse(e);o.name=n,s.title=n;const a=new Blob([JSON.stringify(s,null,2)],{type:"application/ld+json"});o._attachments.manifest={content_type:"application/ld+json",data:a},t.db.put(o).then(()=>i(!0)).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))}).catch(e=>r(e))})}},,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loadDashboard=t.updateDashboard=void 0;const i=n(25),r=n(46),o=n(25),s=n(94),a=n(95),c=n(98),l=n(9),d=document.querySelector("#fs-content-container"),u=document.querySelector("#main-section-content"),f=document.querySelector("#open-doc"),m=document.querySelector("#remove-doc"),h=document.querySelector("#nav-path-container");let p=document.querySelector("#fs-back-btn"),g=document.querySelector("#fs-empty-btn"),v=document.querySelector("#fs-delete-btn");const y=document.querySelector("#upload-new-doc-button"),b=document.querySelector("#add-folder-button"),w=new s.ShiftSelectionManager,_=(0,o.FileSystemManager)(),E=(0,s.dashboardState)(),S=document.querySelector(".main-section-content"),k=document.querySelector(".right-click-file-menu"),L=document.querySelector(".context-menu-items-wrapper");let A=!1,x=!1,C=null,T=!1;function N(){y.classList.contains("active")&&(0,a.InitUploadArea)(E.getParentFolder())}function O(e,t){const n=(i=t?{manifest:e}:{storage:e},Object.keys(i).map(e=>encodeURIComponent(e)+"="+encodeURIComponent(i[e])).join("&"));var i;window.open("./editor.html?"+n,"_blank")}function q(e){const t=E.getEntries().at(e);E.setSelection(e,!0);document.getElementById(t.id).classList.add("selected")}function I(e){const t=E.getEntries().at(e).id;E.setSelection(e,!1);document.getElementById(t).classList.remove("selected")}function B(){Array.from(document.querySelectorAll(".document-entry.selected")).forEach(e=>e.classList.remove("selected")),E.resetSelection()}async function M(e,t,n){if("folder"===t.type){n.addEventListener("dblclick",(async function(){return await z([...E.getFolderPath(),t])}),!1)}else n.addEventListener("dblclick",F,!1);!function(e,t){e.addEventListener("click",(function(e){P(t)}),!1)}(n,e),function(e,t){e.addEventListener("contextmenu",e=>{e.stopPropagation(),e.preventDefault(),(T||1===E.getSelectedEntries().length)&&B(),q(t),ne("selection-options",e.clientX,e.clientY),k.classList.remove("hidden"),T=!0}),S.addEventListener("click",e=>{if(T){let t=e.target;if(t.parentElement.classList.contains("document-entry")&&(t=t.parentElement),k.classList.add("hidden"),T=!1,t.classList.contains("document-entry")){const e=G(t.id);P(E.getIndexByEntryName(e.name))}else B()}})}(n,e)}function P(e){A||x?A?E.getSelection()[e]?(I(e),w.setStart(E.getSelection().lastIndexOf(!0))):(q(e),w.setStart(e)):x&&(w.getPrevSelection().forEach(e=>{I(e)}),w.setEnd(e),w.getSelection(E.getSelection()).forEach(e=>{q(e)})):(B(),q(e),w.setStart(e)),U(),V()}function F(){if(f.classList.contains("active"))if(1!==E.getSelectedFolders().length&&1!==E.getSelectedTrash().length)E.getSelectedFiles().forEach(e=>function(e){const t=e.metadata.document;if(void 0!==typeof t){const n="sample"===t;O(e.id,n)}}(e)),w.reset(),B(),U();else{z([...E.getFolderPath(),E.getSelectedEntries()[0]])}}function D(){if(!m.classList.contains("active"))return;const e=E.getSelectedEntries(),t=E.getParentFolder(),n=E.getTrashFolder(),r=(new Date).toLocaleString();for(let t of e)t=i.FileSystemTools.addMetadata(t,{removed_on:r,recover_folder:E.getFolderPathNames()});K(e,t,n)}function j(e,t){return new Promise((n,o)=>{(0,r.deleteDocument)(e.id).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>o(!1))})}function R(e,t){return new Promise(n=>{const r=e.children.map(t=>"file"===t.type?j(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(r).then(()=>{i.FileSystemTools.removeEntry(e,t),n(!0)}).catch(()=>n(!1))})}function H(){const e=E.getSelectedEntries(),t=`Are you sure you want to delete:\n${n=e,n.map(e=>`- ${e.name} (${e.type})`).join("\n")}\nThis action is irreversible.`;var n;if(window.confirm(t)){const t=e.map(e=>"file"===e.type?j(e,E.getParentFolder()):"folder"===e.type?R(e,E.getParentFolder()):void 0);Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function $(){const e=E.getTrashFolder();if(!e)return void console.error("Trash folder not found.");if(window.confirm("Are you sure you want to delete all the files in Trash Folder?\nThis action is irreversible.")){const t=e.children.map(t=>"file"===t.type?j(t,e):"folder"===t.type?R(t,e):Promise.resolve(!1));Promise.all(t).then(()=>{z(E.getFolderPath())}).catch(e=>console.debug("failed to delete files: ",e))}}function U(){E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),E.getSelectedEntries().length?f.classList.add("active"):f.classList.remove("active")):E.isInTrash()?(y.classList.remove("active"),b.classList.remove("active"),m.classList.remove("active"),f.classList.remove("active")):E.getSelectedTrash().length?(f.classList.add("active"),m.classList.remove("active"),y.classList.remove("active"),b.classList.remove("active")):E.getSelectedEntries().length?(f.classList.add("active"),m.classList.add("active"),y.classList.remove("active"),b.classList.remove("active")):(f.classList.remove("active"),m.classList.remove("active"),y.classList.add("active"),b.classList.add("active"))}function V(){!function(){const e=p.cloneNode(!0);p.parentNode.replaceChild(e,p),1===E.getFolderPath().length?(e.classList.remove("active"),e.setAttribute("disabled","true")):(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",W),e.addEventListener("ondragenter",()=>e.classList.add("active")),e.addEventListener("ondragleave",()=>e.classList.remove("active")),J(e,E.getParentFolder(),E.getFolderPath().at(-2))),p=e}(),function(){const e=g.cloneNode(!0);g.parentNode.replaceChild(e,g);const t=E.getParentFolder();"trash"===t.type||E.isInTrash()?(e.style.display="",t.children.length&&!E.getSelectedEntries().length&&"trash"===t.type?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",$)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",g=e}(),function(){const e=v.cloneNode(!0);v.parentNode.replaceChild(e,v),"trash"===E.getParentFolder().type||E.isInTrash()?(e.style.display="",E.getSelectedEntries().length?(e.classList.add("active"),e.removeAttribute("disabled"),e.addEventListener("click",H)):(e.classList.remove("active"),e.setAttribute("disabled","true"))):e.style.display="none",v=e}()}async function W(){const e=E.getFolderPath().slice(0,-1);await z(e)}function G(e){return E.getEntries().find(t=>t.id===e)}async function z(e){e||(e=E.getFolderPath()),E.setFolderPath(e);const t=E.getParentFolder();d.innerHTML="",w.reset(),E.setEntries(t.children),t.children.forEach(async(e,t)=>{const n=function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.setAttribute("draggable","true");const n=document.createElement("img");n.classList.add("document-icon");const i=document.createElement("div");switch(i.innerText=e.name,e.type){case"folder":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/folder-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"trash":t.classList.add("folder-entry"),t.setAttribute("id",e.id),n.src="./Neon-gh/assets/img/trash-icon.svg",t.setAttribute("drop-id",e.id),t.classList.add("drop-target");break;case"file":t.classList.add("file-entry"),t.setAttribute("id",e.id),"manuscript"===e.metadata.type?(t.classList.add("manuscript-entry"),n.src="./Neon-gh/assets/img/manuscript-icon.svg"):"folio"===e.metadata.type?(t.classList.add("folio-entry"),n.src="./Neon-gh/assets/img/folio-icon.svg"):n.src="./Neon-gh/assets/img/folio-icon.svg"}return t.appendChild(n),t.appendChild(i),t}(e);d.appendChild(n),await M(t,e,n)}),U(),function(){h.innerHTML="";const e=E.getFolderPath().map((e,t)=>{const n=document.createElement("div");n.classList.add("nav-path-section"),n.innerHTML=e.name;const i=E.getFolderPath().slice(0,t+1);return n.addEventListener("click",async()=>await z(i)),J(n,E.getParentFolder(),i.at(-1)),n});e.forEach((t,n)=>{if(h.appendChild(t),n!==e.length-1){const e=document.createElement("div");e.classList.add("nav-path-seperator"),e.innerHTML=" / ",h.appendChild(e)}})}(),V();const n=document.getElementById("info-badge");E.isInTrash()?(n.textContent="Files will be deleted after 30 days",n.style.background="#9DB2BF"):(n.textContent="",n.style.background=""),t.children.forEach(e=>{const n=document.getElementById(e.id);n.addEventListener("dragstart",e=>{e.dataTransfer.effectAllowed="move",C=e.target}),"folder"!==e.type&&"trash"!==e.type||J(n,t,e)}),_.setFileSystem(E.getFolderPath().at(0))}function J(e,t,n){e.addEventListener("dragenter",t=>{t.preventDefault(),e.classList.add("dragenter")}),e.addEventListener("dragleave",t=>{t.preventDefault(),e.classList.remove("dragenter")}),e.addEventListener("dragover",e=>e.preventDefault()),e.addEventListener("drop",function(e,t){return n=>{n.preventDefault();const i=G(C.getAttribute("id"));i&&i!==t&&K([i],e,t)}}(t,n))}function K(e,t,n){const r=[];e.forEach(e=>{"trash"===n.type&&n.children.some(t=>t.name===e.name)&&(e.name=function(e){const t=(new Date).toLocaleString();return e+" - "+t}(e.name));const o=i.FileSystemTools.canMoveEntry(e,t,n);o.succeeded?i.FileSystemTools.moveEntry(e,t,n):r.push(o.error)}),r.filter((e,t,n)=>n.indexOf(e)===t),r.length>0&&window.alert(r.join("\n")),z()}function X(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.MOVE_TO),e.openModalWindow();const t=E.getSelectedEntries(),n=E.getParentFolder(),i=function(e){const t=document.createElement("ul");return t.id="tree-root",t.appendChild(function e(t,n,i){const r=document.createElement("li"),o=document.createElement("div");o.classList.add("tree-li-container");const s=document.createElement("div");s.classList.add("tree-name"),s.innerHTML=t.name,s.addEventListener("click",()=>{document.querySelectorAll(".tree-name").forEach(e=>e.classList.remove("selected")),s.classList.add("selected")}),s.addEventListener("dblclick",()=>{n(t)});if(t.children.every(e=>"folder"!==e.type))return r.appendChild(o),o.appendChild(s),r;const a=document.createElement("ul"),c=document.createElement("div");c.classList.add("tree-arrow"),c.innerHTML="▶",i<2&&a.classList.add("active");i<2&&c.classList.add("active");return c.addEventListener("click",()=>{c.classList.toggle("active"),a.classList.toggle("active")}),r.appendChild(o),o.appendChild(c),o.appendChild(s),r.appendChild(a),t.children.forEach(t=>{if("folder"===t.type){const r=e(t,n,i+1);a.appendChild(r)}}),r}(E.root(),e,0)),t}(i=>{e.hideModalWindow(),K(t,n,i)}),r=document.createElement("div");r.classList.add("tree-container"),r.appendChild(i);const o=document.getElementById("neon-modal-window-content-container");o.innerHTML='Double-click the folder you want to move your items to!',o.appendChild(r)}function Y(){if(!b.classList.contains("active"))return;const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.NEW_FOLDER),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text",r.placeholder="Untitled Folder",r.value="Untitled Folder",t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>Q(e,r.value)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&Q(e,r.value)})}function Q(e,t){te(t)?(window.alert("The folder name already exists in the current folder!"),Y()):(e.hideModalWindow(),function(e){const t=document.createElement("div");t.classList.add("document-entry"),t.classList.add("folder-entry"),t.setAttribute("id","new-folder");const n=i.FileSystemTools.createFolder(e);i.FileSystemTools.addEntry(n,E.getParentFolder())?(t.setAttribute("id",e),z()):t.remove()}(t))}function Z(){const e=new l.ModalWindow;e.setModalWindowView(l.ModalWindowView.RENAME),e.openModalWindow();const t=document.getElementById("dashboard_input_container"),n=document.getElementById("cancel_dashboard"),i=document.getElementById("confirm_dashboard"),r=document.createElement("input");r.id="dashboard_input",r.type="text";const o=E.getSelectedEntries()[0].name;r.placeholder=o,r.value=o,t.appendChild(r),r.select(),r.focus(),n.addEventListener("click",()=>e.hideModalWindow()),i.addEventListener("click",()=>ee(e,r.value,o)),t.addEventListener("keydown",t=>{"Escape"===t.key?e.hideModalWindow():"Enter"===t.key&&ee(e,r.value,o)})}function ee(e,t,n){if(t===n)e.hideModalWindow();else if(te(t))window.alert("The filename already exists in the current folder!"),Z();else{e.hideModalWindow();!function(e,t){if(i.FileSystemTools.renameEntry(e,E.getParentFolder(),t))if("file"===e.type){const n=e;(0,r.updateDocName)(n.id,t).then(()=>{z()})}else z()}(E.getSelectedEntries()[0],t)}}function te(e){return E.getParentFolder().children.some(t=>t.name===e)}function ne(e,t,n){switch(e){case"selection-options":const e=E.getSelectedFiles().length,t=E.getSelectedFolders().length,n=E.getSelectedTrash().length;e||t||!n?E.getFolderPath().length>1&&"Trash"==E.getFolderPath().at(1).name?(L.innerHTML=c.trashEntryOptions,ie("trash-entry-options")):1!==e||t||n?e>1&&!t&&!n?(L.innerHTML=c.multiFileOptions,ie("multi-file-options")):e>=1&&t>=1&&!n?(L.innerHTML=c.folderAndFileOptions,ie("folder-and-file-options")):e||1!==t||n?!e&&t>1&&!n&&(L.innerHTML=c.multiFolderOptions,ie("multi-folder-options")):(L.innerHTML=c.singleFolderOptions,ie("single-folder-options")):(L.innerHTML=c.singleFileOptions,ie("single-file-options")):(L.innerHTML=c.trashFolderOptions,ie("trash-folder-options"));break;default:L.innerHTML=c.defaultOptions,ie("default")}if(E.getParentFolder().metadata.immutable||E.getSelectedEntries()[0]&&E.getSelectedEntries()[0].metadata.immutable||E.isInTrash()){const e=document.getElementById("cm-remove-btn"),t=document.getElementById("cm-rename-btn"),n=document.getElementById("cm-move-btn"),i=document.getElementById("cm-upload-doc-btn"),r=document.getElementById("cm-new-folder-btn");e&&e.classList.add("disabled"),t&&t.classList.add("disabled"),n&&n.classList.add("disabled"),i&&i.classList.add("disabled"),r&&r.classList.add("disabled")}k.style.left=t+"px",k.style.top=n+"px",k.classList.remove("hidden")}function ie(e){const t="context-menu-item-wrapper";switch(e){case"single-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-file-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"folder-and-file-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"single-folder-options":document.querySelector(`.${t}#cm-open-btn`).addEventListener("click",e=>{k.classList.add("hidden"),F()}),document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-rename-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Z()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"multi-folder-options":document.querySelector(`.${t}#cm-remove-btn`).addEventListener("click",e=>{k.classList.add("hidden"),D()}),document.querySelector(`.${t}#cm-move-btn`).addEventListener("click",e=>{k.classList.add("hidden"),X()});break;case"trash-folder-options":document.querySelector(`.${t}#cm-empty-trash-btn`).addEventListener("click",e=>{k.classList.add("hidden"),$()});break;case"trash-entry-options":document.querySelector(`.${t}#cm-recover-btn`).addEventListener("click",e=>{k.classList.add("hidden"),function(){const e=E.getSelectedEntries(),t=E.getParentFolder();for(let n of e){const e=n.metadata.recover_folder,r=E.getFolderPathByNames(e);if(r){n=i.FileSystemTools.removeMetadata(n,["removed_on","recover_folder"]);const e=/ - \d{1,2}\/\d{1,2}\/\d{4}, \d{1,2}:\d{2}:\d{2} [APMapm]{2}$/;e.test(n.name)&&(n.name=n.name.replace(e,"")),K([n],t,r)}}}()}),document.querySelector(`.${t}#cm-delete-btn`).addEventListener("click",e=>{k.classList.add("hidden"),H()});break;default:document.querySelector(`.${t}#cm-upload-doc-btn`).addEventListener("click",e=>{k.classList.add("hidden"),N()}),document.querySelector(`.${t}#cm-new-folder-btn`).addEventListener("click",e=>{k.classList.add("hidden"),Y()})}}function re(e){E.getTrashFolder()||_.newTrash(e);const t=E.getTrashFolder(),n=new Date,i=new Date(n.getTime()-2592e6);t.children.forEach(e=>{(e=>{if(e.metadata&&e.metadata.removed_on){return new Date(e.metadata.removed_on)<=i}return!1})(e)&&("file"===e.type?j(e,t):"folder"===e.type&&R(e,t))})}null==f||f.addEventListener("click",F),null==m||m.addEventListener("click",D),null==y||y.addEventListener("click",N),null==b||b.addEventListener("click",Y),window.addEventListener("keydown",e=>{e.metaKey&&(A=!0),e.shiftKey&&(x=!0),"Escape"===e.key&&(B(),w.reset(),U(),V())}),window.addEventListener("keyup",e=>{e.metaKey||(A=!1),e.shiftKey||(x=!1)}),null==u||u.addEventListener("click",e=>{const t=e.target;Boolean(t.closest(".document-entry"))||(B(),w.reset(),U(),V())}),t.updateDashboard=z;t.loadDashboard=async()=>{const e=await _.getRoot();E.root(e),re(e),z([e]),document.querySelector(".main-section").addEventListener("contextmenu",e=>{e.preventDefault(),B(),ne("default",e.clientX,e.clientY)}),document.querySelector(".main-section").addEventListener("click",e=>{k.classList.add("hidden")})}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0});(0,n(56).loadDashboard)(),null===(i=document.querySelector("#home-link"))||void 0===i||i.setAttribute("href","https://ddmal.music.mcgill.ca/Neon")},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EntryType=void 0,function(e){e.Folder="folder",e.Trash="trash",e.File="file"}(t.EntryType||(t.EntryType={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemTools=void 0;const i=n(25),r=n(17),o=(e,t,n,r)=>{const o={};return t===i.EntryType.File?{name:e,type:t,id:n,metadata:o}:{name:e,type:t,id:n,children:r,metadata:o}};const s=(e,t)=>{const n=t.children.some(t=>t.name===e.name),i=t.metadata.immutable,r={succeeded:!1,error:""};return n?r.error=`Duplicate name: ${e.name} already exists in ${t.name}.`:i?r.error=t.name+" is immutable.":r.succeeded=!0,r},a=(e,t)=>{const n=-1!==t.children.findIndex(t=>t.id===e.id),i=t.metadata.immutable,r=e.metadata.immutable,o={succeeded:!1,error:""};return n?i?o.error=t.name+" is immutable.":r?o.error=e.name+" is immutable.":o.succeeded=!0:o.error=`${e.name} does not exist in ${t.name}.`,o},c=(e,t,n)=>{const r=e===n,o=n.children.some(t=>t.name===e.name),s=t.metadata.immutable,a=n.metadata.immutable,c=-1!==t.children.findIndex(t=>t.id===e.id),l=e.type==i.EntryType.Folder&&function e(t,n){return n.children.filter(e=>e.type===i.EntryType.Folder).map(n=>n===t||e(t,n)).some(e=>!0===e)}(n,e),d={succeeded:!1,error:""};return r?d.error=`Cannot move ${e.name} to itself.`:o?d.error=`Duplicate name: ${e.name} already exists in ${n.name}.`:s?d.error=t.name+" is immutable.":a?d.error=n.name+" is immutable.":c?l?d.error=`Cannot move ${e.name} into a its own subfolder, ${n.name}.`:d.succeeded=!0:d.error=`${e.name} does not exist in ${t.name}.`,d},l=(e,t,n)=>{const i={succeeded:!1,error:""};return t.children.some((t,n,i)=>t.name===e.name&&n!==i.indexOf(t))?i.error=`Duplicate name: ${n} already exists in ${t.name}.`:i.succeeded=!0,i},d=(e,t)=>{const{succeeded:n,error:r}=s(e,t);return n?(t.children.push(e),(o=t).children.sort((e,t)=>e.name.localeCompare(t.name)),o.children.sort((e,t)=>e.type===i.EntryType.File&&t.type===i.EntryType.Folder?1:e.type===i.EntryType.Folder&&t.type===i.EntryType.File?-1:0),!0):(console.error(r),!1);var o},u=(e,t,n=!1)=>{const{succeeded:i,error:r}=a(e,t);if(i||n){const n=t.children.indexOf(e);return t.children.splice(n,1),!0}return console.error(r),!1};t.FileSystemTools={createFolder:e=>o(e,i.EntryType.Folder,(0,r.uuidv4)(),[]),createTrash:e=>o(e,i.EntryType.Trash,(0,r.uuidv4)(),[]),createFile:(e,t)=>o(e,i.EntryType.File,t),moveEntry:function(e,t,n){const i=c(e,t,n);if(i.succeeded){if(u(e,t,!0)){if(d(e,n))return!0;console.error(`Moving: failed to add ${e.name} to ${n.name}`)}else console.error(`Moving: failed to remove ${e.name} from ${t.name}`)}else console.error(i.error);return!1},canAddEntry:s,canRemoveEntry:a,canMoveEntry:c,canRenameEntry:l,addEntry:d,removeEntry:u,addMetadata:function(e,t){return Object.entries(t).forEach(([t,n])=>{e.metadata[t]=n}),e},removeMetadata:function(e,t){return t.forEach(t=>{delete e.metadata[t]}),e},getAllNames:e=>e.children.map(e=>e.name),renameEntry:(e,t,n)=>{const{succeeded:i,error:r}=l(e,t,n);return i?(e.name=n,!0):(console.error(r),!1)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileSystemManager=void 0;const i=n(25),r=n(46),o=n(93);t.FileSystemManager=()=>{function e(e){try{window.localStorage.setItem("neon-fs",JSON.stringify(e))}catch(e){return console.error(e),window.alert("Error saving file system"),!1}return!0}async function t(){try{const t=window.localStorage.getItem("neon-fs");if(t){return JSON.parse(t)}{const t=i.FileSystemTools.createFolder("Home");return function(e){const t=o.samples.map(([e,t])=>{const n=i.FileSystemTools.createFile(e,e);return"folio"===t?i.FileSystemTools.addMetadata(n,{type:"folio",document:"sample",immutable:!0}):"manuscript"===t&&i.FileSystemTools.addMetadata(n,{type:"manuscript",document:"sample",immutable:!0}),n}),n=i.FileSystemTools.createFolder("Samples");t.forEach(e=>{i.FileSystemTools.addEntry(e,n)}),i.FileSystemTools.addEntry(n,e),i.FileSystemTools.addMetadata(n,{immutable:!0})}(t),n(t),await async function(e){const t=await(0,r.fetchUploads)();return t.map(e=>i.FileSystemTools.createFile(e.name,e.id)).forEach(t=>{i.FileSystemTools.addEntry(t,e)}),e}(t),e(t),t}}catch(e){console.error(e),window.alert("Error loading file system")}}function n(e){const t=i.FileSystemTools.createTrash("Trash");i.FileSystemTools.addEntry(t,e)}return{getRoot:async function(){return await t()},setFileSystem:e,getFileSystem:t,newTrash:n}}},function(e){e.exports=JSON.parse('{"@context":["http://www.w3.org/ns/anno.jsonld",{"schema":"http://schema.org/","title":"schema:name","timestamp":"schema:dateModified","image":{"@id":"schema:image","@type":"@id"},"mei_annotations":{"@id":"Annotation","@type":"@id","@container":"@list"}}]}')},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.samples=void 0,t.samples=[["CDN-Hsmu_M2149.L4_001r","folio"],["CDN-Hsmu_M2149.L4_002r","folio"],["CH-E_611_024r","folio"],["CH-E_611_026r","folio"],["CH-E_611_028r","folio"],["Salzinnes","manuscript"]]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dashboardState=t.ShiftSelectionManager=void 0;t.ShiftSelectionManager=class{constructor(){this.prevSelection=[],this.reset()}setStart(e){this.reset(),this.start=Math.max(e,0)}setEnd(e){this.end=e}reset(){this.start=0,this.end=-1,this.prevSelection.splice(0)}getPrevSelection(){return this.prevSelection}getSelection(e){let t,n;if(-1===this.end)return[];this.endn+t).filter(t=>!e[t]);return this.prevSelection=i,i}},t.dashboardState=function(){let e=[],t=[],n=[],i=null;function r(e){return e&&(i=e),i}function o(){return e.filter((e,n)=>t[n])}return{root:r,setEntries:function(n){e=n,t=Array(n.length).fill(!1)},getEntries:function(){return e},getIndexByEntryName:function(t){return e.findIndex(e=>e.name===t)},setSelection:function(e,n){t[e]=n},getSelection:function(){return t},resetSelection:function(){t.fill(!1)},setFolderPath:function(e){n=e},getFolderPath:function(){return n},getFolderPathNames:function(){return n.map(e=>e.name)},getFolderPathByNames:function(e){let t=r();e=e.slice(1);for(const n of e){const e=t.children.find(e=>e.name===n);if(!e||"folder"!==e.type)return void console.debug("failed to find folder: ",n);t=e}return t},getParentFolder:function(){return n.at(-1)},getTrashFolder:function(){return r().children.filter(e=>"trash"===e.type)[0]},getSelectedEntries:o,getSelectedFolders:function(){return o().filter(e=>"folder"===e.type)},getSelectedTrash:function(){return o().filter(e=>"trash"===e.type)},getSelectedFiles:function(){return o().filter(e=>"file"===e.type)},isInTrash:function(){return n.some(e=>"trash"===e.type)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InitUploadArea=void 0;const i=n(9),r=n(96),o=n(56);t.InitUploadArea=function(e){const t=new i.ModalWindow;t.setModalWindowView(i.ModalWindowView.DOCUMENT_UPLOAD),t.openModalWindow();const n=document.querySelector("#make_pair"),s=document.querySelector("#upload_button");n.addEventListener("click",r.handleMakePair),s.addEventListener("click",()=>async function(e,t){const n=document.querySelector("#uploading_spinner");n.classList.add("visible"),(0,r.handleUploadAllDocuments)(t).then(t=>{setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow();const i=t.filter(e=>"fulfilled"===e.status&&e.value).map(e=>e.value);if(i.length>0){const e=document.getElementById("info-badge");e.textContent="Uploaded files: "+i.join(", "),e.style.display="block",e.style.background="#9DB2BF"}},2e3)}).catch(t=>{console.log("One or more uploads rejected: ",t),setTimeout(async()=>{await(0,o.updateDashboard)(),n.classList.remove("visible"),e.hideModalWindow()},2e3)})}(t,e));const a=document.createElement("input");a.type="file",a.multiple=!0,a.addEventListener("change",(function(){const e=a.files,t=Array.from(e),n=(0,r.addNewFiles)(t);if(0!==n.length){const e=n.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}a.value=null}));const c=document.querySelector("#initial_upload_area");c.onclick=()=>a.click(),c.ondragleave=()=>c.classList.remove("over"),c.ondragover=e=>{e.stopPropagation(),e.preventDefault(),c.classList.add("over"),e.dataTransfer.dropEffect="copy"},c.ondrop=e=>{e.stopPropagation(),e.preventDefault(),c.classList.remove("over");const t=e.dataTransfer.files,n=Array.from(t),i=(0,r.addNewFiles)(n);if(0!==i.length){const e=i.map(e=>e.name);window.alert("The following files are not .mei, .png, .jpeg, or .jsonld files: \n\n"+e.join("\n"))}},document.querySelectorAll(".sort_name").forEach(e=>{e.addEventListener("click",()=>(0,r.sortFileByName)(e))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.fnConflictHandler=t.formatFilename=t.sortFileByName=t.handleUploadAllDocuments=t.handleMakePair=t.addNewFiles=void 0;const i=n(30),r=n(97),o=n(46),s=n(25),a=r.default.getInstance();function c(e,t){if("mei"!==t&&"image"!==t)return;const n="mei"===t?"mei_radio_group":"image_radio_group",r=(0,i.v4)(),o=document.createElement("div");o.className="unpaired_item_container";const s=document.createElement("input");s.type="radio",s.className="unpaired_item_radio",s.name=n,s.value=e,s.id=r;const a=document.createElement("label");a.className="unpaired_item_label",a.setAttribute("for",r);const c=document.createElement("span");c.innerText=l(e,50),c.setAttribute("style","margin-top: auto; margin-left: 3px;");const d=document.createElement("img");return d.className="unpaired_del_btn",d.src="/Neon/Neon-gh/assets/img/unpaired-remove-doc.svg",d.title="delete",a.appendChild(s),a.appendChild(c),o.appendChild(a),o.appendChild(d),d.addEventListener("click",(function(){o.remove()})),o}function l(e,t){const n=Math.floor(t/2),i=e.length;return i<=t?e:`${e.substring(0,n-1)}...${e.substring(i-n+2,i)}`}function d(e,t){let n=e,i=1;for(;t.includes(n);)n=`${e}(${i})`,i++;return n}a.setMeiTemplate("samples/mei/mei_template.mei"),t.addNewFiles=function(e){const t=document.querySelector("#mei_list"),n=document.querySelector("#image_list"),i=[];return e.forEach(e=>{const r=e.name.split(".").pop();if("mei"===r){const n=c(e.name,"mei");t.appendChild(n),a.addFile(e)}else if(["png","jpg","jpeg"].includes(r)){const t=c(e.name,"image");n.appendChild(t),a.addFile(e)}else"jsonld"===r||i.push(e)}),i},t.handleMakePair=function(){const e=document.querySelector("#paired_list"),t=document.querySelector('input[name="mei_radio_group"]:checked'),n=document.querySelector('input[name="image_radio_group"]:checked');if(null===t||null===n)return;let i=t.value;const r=n.value;let o=!1;if("create_mei"===t.value){o=!0;const e=r.split(".");e.length>1&&e.pop(),e.push("mei"),i=e.join("."),a.getImgDimension(r).then(e=>{const{width:t,height:n,staffSpace:r}=e,o=a.createMeiFile(i,t,n,r);a.addFile(o)}).catch(e=>{console.error(e.message)})}const s=i.substring(0,i.length-4),d=function(e,t,n){const i=document.querySelector("#mei_list"),r=document.querySelector("#image_list"),o=document.createElement("div");o.className="folio_item",o.setAttribute("mei",t),o.setAttribute("image",n);const s=document.createElement("div");function d(){o.remove();const s=a.isCreatedFolio(e);if(a.removeFolio(e),!s){const e=c(t,"mei");i.appendChild(e)}const l=c(n,"image");r.appendChild(l)}s.classList.add("folio-filename"),s.innerHTML=l(e,50),o.appendChild(s);const u=document.createElement("img");return u.className="unpair_btn",u.src="/Neon/Neon-gh/assets/img/unpair-doc.svg",u.title="unpair",u.addEventListener("click",d),o.appendChild(u),o}(s,i,r);e.appendChild(d),a.addFolio(s,i,r,o),o||t.parentElement.parentElement.remove(),n.parentElement.parentElement.remove()},t.handleUploadAllDocuments=async function(e){const t=[...a.getFolios().map(async([t,n,r])=>{const a=(0,i.v4)();return await async function(e,t,n,i,r){const a=d(t,s.FileSystemTools.getAllNames(r));return(0,o.createManifest)(e,a,n,i).then(t=>{const n=new Blob([JSON.stringify(t,null,2)],{type:"application/ld+json"});return(0,o.addDocument)(e,a,n,!0)}).then(n=>{if(n){const t=(new Date).toLocaleString(),n=s.FileSystemTools.createFile(a,e),i=s.FileSystemTools.addMetadata(n,{type:"folio",created_on:t});return s.FileSystemTools.addEntry(i,r)?a:null}return console.log("failed to uploadFolio: "+t),null})}(a,t,n,r,e)})].map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e})));return a.clear(),Promise.all(t)},t.sortFileByName=async function(e){const t=e.parentElement.nextElementSibling,n=Array.from(t.children);let i=e.classList.contains("arrow-up");i?(e.classList.remove("arrow-up"),e.classList.add("arrow-down"),e.innerHTML="⋁"):(e.classList.remove("arrow-down"),e.classList.add("arrow-up"),e.innerHTML="⋀"),i=!i,n.sort((e,t)=>{const n=e.textContent.trim(),r=t.textContent.trim();return i?n.localeCompare(r):r.localeCompare(n)}),n.forEach(e=>{t.appendChild(e)}),e.setAttribute("style","color: black")},t.formatFilename=l,t.fnConflictHandler=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(17),r=n(32);class o{constructor(){this.allFiles=new Map,this.folios=new Array}static getInstance(){return o.instance||(o.instance=new o),o.instance}addFile(e){if(this.allFiles.has(e.name)){const t={file:e,count:this.getFileCount(e.name)+1};this.allFiles.set(e.name,t)}else{const t={file:e,count:1};this.allFiles.set(e.name,t)}}async setMeiTemplate(e){try{const t=await fetch(e);if(!t.ok)throw new Error("Failed to load MEI template from "+e);this.meiTemplate=await t.text()}catch(e){console.error(e)}}createMeiFile(e,t,n,o){try{if(!this.meiTemplate)throw new Error("Cannot find MEI template");const s=new DOMParser,a=new XMLSerializer,c=s.parseFromString(this.meiTemplate,"text/xml"),l=c.documentElement;l.querySelector("meiHead").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("fileDesc").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("titleStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("title").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("pubStmt").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("facsimile").setAttribute("xml:id","m-"+(0,i.uuidv4)());const d=l.querySelector("surface"),u="m-"+(0,i.uuidv4)();d.setAttribute("xml:id",u),d.setAttribute("lrx",t.toString()),d.setAttribute("lry",n.toString());const f=l.querySelector("zone"),m="m-"+(0,i.uuidv4)();f.setAttribute("xml:id",m);const h=.1,p=.15,g=Math.round(h*t),v=Math.round(p*t);f.setAttribute("ulx",v.toString()),f.setAttribute("uly",g.toString()),f.setAttribute("lrx",(t-v).toString()),f.setAttribute("lry",(g+3*o).toString());l.querySelector("mdiv").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("score").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("scoreDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffGrp").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("staffDef").setAttribute("xml:id","m-"+(0,i.uuidv4)());l.querySelector("section").setAttribute("xml:id","m-"+(0,i.uuidv4)());const y=l.querySelector("pb");y.setAttribute("xml:id","m-"+(0,i.uuidv4)()),y.setAttribute("facs","#"+u);const b=l.querySelector("sb");b.setAttribute("xml:id","m-"+(0,i.uuidv4)()),b.setAttribute("facs","#"+m);const w=r.xml(a.serializeToString(c)),_=new Blob([w],{type:"text/xml"});return new File([_],e,{type:"text/xml"})}catch(e){console.error(e)}}getImgDimension(e){return new Promise((t,n)=>{const i=this.getFile(e);if(!i)return void n(new Error("File not found: "+e));const r=new FileReader;r.onload=i=>{const r=new Image;r.onload=()=>{const e=document.createElement("canvas"),i=e.getContext("2d",{willReadFrequently:!0});if(!i)return void n(new Error("Could not get 2D context"));e.width=r.width,e.height=r.height,i.drawImage(r,0,0);const o=i.getImageData(0,0,e.width,e.height),s=o.data;for(let e=0;e0?(a.push(c),c=0):c++}const l=a.length>0?this.findSecondMode(a):0;t({width:r.width,height:r.height,staffSpace:l})},r.onerror=()=>{n(new Error("Failed to load image: "+e))},r.src=i.target.result},r.readAsDataURL(i)})}findSecondMode(e){const t=new Map;e.forEach(e=>{const n=(t.get(e)||0)+1;t.set(e,n)});return Array.from(t.entries()).sort((e,t)=>t[1]-e[1])[1][0]}getFile(e){if(this.allFiles.has(e))return this.allFiles.get(e).file}removeFile(e){const t=this.getFileCount(e);if(0!==t)if(1===t)this.allFiles.delete(e);else{const n={file:this.allFiles.get(e).file,count:t-1};this.allFiles.set(e,n)}}getFileCount(e){return this.allFiles.has(e)?this.allFiles.get(e).count:0}addFolio(e,t,n,i){const r={filename:e,mei_filename:t,image_filename:n,isCreated:i};this.folios.push(r)}isCreatedFolio(e){const t=this.folios.find(t=>t.filename===e);return!!t&&t.isCreated}removeFolio(e){const t=this.folios.findIndex(t=>t.filename===e);this.folios.splice(t,1)}getFolios(){return this.folios.map(e=>{const t=e.filename,n=e.mei_filename,i=e.image_filename;return[t,this.getFile(n),this.getFile(i)]})}clear(){this.allFiles.clear(),this.folios.splice(0)}print(){console.log(this.allFiles),console.log(this.folios)}}t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.trashEntryOptions=t.trashFolderOptions=t.multiFolderOptions=t.singleFolderOptions=t.folderAndFileOptions=t.multiFileOptions=t.singleFileOptions=t.defaultOptions=void 0,t.defaultOptions='
\n
Upload document
\n \n
\n
\n
New folder
\n \n
',t.singleFileOptions='
\n
Open
\n \n
\n
\n
Move to Trash
\n \n
\n
\n
Rename
\n \n
\n
\n
Move
\n \n
',t.multiFileOptions='
\n
Open
\n \n
\n
\n
Move to Trash
\n \n
\n
\n
Move
\n \n
',t.folderAndFileOptions='
\n
Delete
\n \n
\n
\n
Move
\n \n
',t.singleFolderOptions='
\n
Open
\n \n
\n
\n
Move to Trash
\n \n
\n
\n
Rename
\n \n
\n
\n
Move
\n \n
',t.multiFolderOptions='
\n
Move to Trash
\n \n
\n
\n
Move
\n \n
',t.trashFolderOptions='
\n
Empty Trash
\n \n
',t.trashEntryOptions='
\n
Put Back
\n \n
\n
\n
Delete
\n \n
'}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ltbWVkaWF0ZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL05vdGlmaWNhdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvTG9jYWxTZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvU2VsZWN0VG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FyZ3NhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJkM1wiIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L0NvbnRlbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Nb2RhbFdpbmRvdy50cyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db29yZGluYXRlcy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3BhcmstbWQ1L3NwYXJrLW1kNS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvcmFuZG9tLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db2xvci50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnV2dXplbGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRHJhZ0hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvR3JvdXBpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9FcnJvckxvZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvUmVzaXplLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wb3VjaGRiL2xpYi9pbmRleC1icm93c2VyLmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92a2JlYXV0aWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvV2FybmluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvU3RhZmZUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9OZXVtZVRvb2xzLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3F1ZXVlTWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL211dGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL21lc3NhZ2VDaGFubmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3N0YXRlQ2hhbmdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pbW1lZGlhdGUvbGliL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9TdG9yYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRGFzaGJvYXJkLnRzIiwid2VicGFjazovLy8uL2RlcGxveW1lbnQvc2NyaXB0cy9kYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1JbnRlcmZhY2VzLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvRmlsZVN5c3RlbS9GaWxlU3lzdGVtVG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9GaWxlU3lzdGVtL0ZpbGVTeXN0ZW1NYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvc2FtcGxlc19maWxlbmFtZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9EYXNoYm9hcmRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEFyZWEudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Rhc2hib2FyZC9VcGxvYWRUb29scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL1VwbG9hZEZpbGVNYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9EYXNoYm9hcmQvQ29udGV4dE1lbnVDb250ZW50LnRzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiUmVmbGVjdE93bktleXMiLCJSIiwiUmVmbGVjdCIsIlJlZmxlY3RBcHBseSIsImFwcGx5IiwidGFyZ2V0IiwicmVjZWl2ZXIiLCJhcmdzIiwiRnVuY3Rpb24iLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImNvbmNhdCIsIk51bWJlcklzTmFOIiwiTnVtYmVyIiwiaXNOYU4iLCJFdmVudEVtaXR0ZXIiLCJpbml0IiwidGhpcyIsIm9uY2UiLCJlbWl0dGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJlcnJvckxpc3RlbmVyIiwiZXJyIiwicmVtb3ZlTGlzdGVuZXIiLCJyZXNvbHZlciIsInNsaWNlIiwiYXJndW1lbnRzIiwiZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyIiwiaGFuZGxlciIsImZsYWdzIiwib24iLCJhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlciIsIl9ldmVudHMiLCJ1bmRlZmluZWQiLCJfZXZlbnRzQ291bnQiLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsImNoZWNrTGlzdGVuZXIiLCJsaXN0ZW5lciIsIlR5cGVFcnJvciIsIl9nZXRNYXhMaXN0ZW5lcnMiLCJ0aGF0IiwiX2FkZExpc3RlbmVyIiwidHlwZSIsInByZXBlbmQiLCJldmVudHMiLCJleGlzdGluZyIsIndhcm5pbmciLCJuZXdMaXN0ZW5lciIsImVtaXQiLCJ1bnNoaWZ0IiwicHVzaCIsImxlbmd0aCIsIndhcm5lZCIsInciLCJFcnJvciIsIlN0cmluZyIsImNvdW50IiwiY29uc29sZSIsIndhcm4iLCJvbmNlV3JhcHBlciIsImZpcmVkIiwid3JhcEZuIiwiX29uY2VXcmFwIiwic3RhdGUiLCJ3cmFwcGVkIiwiX2xpc3RlbmVycyIsInVud3JhcCIsImV2bGlzdGVuZXIiLCJhcnIiLCJyZXQiLCJBcnJheSIsInVud3JhcExpc3RlbmVycyIsImFycmF5Q2xvbmUiLCJsaXN0ZW5lckNvdW50IiwiY29weSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ3cmFwTGlzdGVuZXIiLCJhcmciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0IiwiUmFuZ2VFcnJvciIsImdldFByb3RvdHlwZU9mIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwiZG9FcnJvciIsImVycm9yIiwiZXIiLCJtZXNzYWdlIiwiY29udGV4dCIsImxlbiIsImxpc3RlbmVycyIsImFkZExpc3RlbmVyIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3QiLCJwb3NpdGlvbiIsIm9yaWdpbmFsTGlzdGVuZXIiLCJzaGlmdCIsImluZGV4IiwicG9wIiwic3BsaWNlT25lIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwia2V5cyIsInJhd0xpc3RlbmVycyIsImV2ZW50TmFtZXMiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIlRlbXBDdG9yIiwiZHJhaW5pbmciLCJjdXJyZW50UXVldWUiLCJzY2hlZHVsZURyYWluIiwidHlwZXMiLCJxdWV1ZUluZGV4IiwicXVldWUiLCJzY2hlZHVsZWQiLCJjbGVhblVwTmV4dFRpY2siLCJuZXh0VGljayIsInRpbWVvdXQiLCJzZXRUaW1lb3V0IiwicnVuIiwiY2xlYXJUaW1lb3V0IiwidGVzdCIsImluc3RhbGwiLCJJdGVtIiwiZnVuIiwiYXJyYXkiLCJ0YXNrIiwibm90aWZpY2F0aW9ucyIsImN1cnJlbnRNb2RlTWVzc2FnZSIsIm5vdGlmaWNhdGlvbkljb24iLCJkZWZhdWx0Iiwic3VjY2VzcyIsIk5vdGlmaWNhdGlvbiIsImxvZ0luZm8iLCJkaXNwbGF5ZWQiLCJpZCIsInV1aWR2NCIsImlzTW9kZU1lc3NhZ2UiLCJzZWFyY2giLCJ0aW1lb3V0SUQiLCJNYXRoIiwibWF4IiwiY2xlYXJOb3RpZmljYXRpb24iLCJjdXJyZW50SWQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwicmVtb3ZlIiwic3RhcnROb3RpZmljYXRpb24iLCJub3RpZmljYXRpb24iLCJ3aW5kb3ciLCJnZXRJZCIsIm5vdGlmaWNhdGlvbkNvbnRlbnQiLCJuZXdOb3RpZmljYXRpb24iLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwiaW5uZXJIVE1MIiwiYXBwZW5kIiwic3R5bGUiLCJkaXNwbGF5IiwiZGlzcGxheU5vdGlmaWNhdGlvbiIsInNldFRpbWVvdXRJZCIsInF1ZXVlTm90aWZpY2F0aW9uIiwicmVjb3JkTm90aWZpY2F0aW9uIiwibG9jYWxTZXR0aW5ncyIsIkRFRkFVTFRfU0VUVElOR1MiLCJ6b29tIiwiZ2x5cGhPcGFjaXR5IiwiaW1hZ2VPcGFjaXR5IiwiY2lyY2xlU2l6ZSIsImhpZ2hsaWdodE1vZGUiLCJ1c2VyTW9kZSIsImluc2VydE1vZGUiLCJpbnNlcnRUYWIiLCJzZWxlY3Rpb25Nb2RlIiwiZGVidWdNb2RlIiwiZGlzcGxheUJCb3giLCJkaXNwbGF5VGV4dCIsImRpc3BsYXlJbmZvIiwiZGlzcGxheUVyckxvZyIsInZpZXdCb3giLCJzZXR0aW5ncyIsInBhcmFtcyIsImZvbGlvSWQiLCJsb2FkIiwic3RvcmVkIiwiSlNPTiIsInBhcnNlIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInN5bmMiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZ2V0U2VsZWN0aW9uVHlwZSIsImVsZW1lbnQiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwidW5zZWxlY3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsInNlbGVjdGVkIiwiY29udGFpbnMiLCJyZW1vdmVBdHRyaWJ1dGUiLCJDb2xvciIsInVuaGlnaGxpZ2h0IiwiZmlsbCIsImZyb20iLCJkaXZMaW5lIiwic3Ryb2tlIiwic2V0QXR0cmlidXRlIiwibmV1bWUiLCJzeWxSZWN0IiwicGFyZW50RWxlbWVudCIsImQzIiwic2VsZWN0QWxsIiwiZWwiLCJjb2xvciIsImZvbnRXZWlnaHQiLCJTZWxlY3RPcHRpb25zIiwiZW5kT3B0aW9uc1NlbGVjdGlvbiIsIkdyb3VwaW5nIiwiZW5kR3JvdXBpbmdTZWxlY3Rpb24iLCJ1cGRhdGVIaWdobGlnaHQiLCJzZWxlY3RTdGFmZiIsInN0YWZmIiwiZHJhZ0hhbmRsZXIiLCJoaWdobGlnaHQiLCJ0cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zIiwiaW5pdEdyb3VwaW5nTGlzdGVuZXJzIiwiZHJhZ0luaXQiLCJzZWxlY3RMYXllckVsZW1lbnQiLCJsYXllckVsZW1lbnQiLCJzZWxlY3QiLCJuZWVkc0hpZ2hsaWdodFVwZGF0ZSIsInN5bElkIiwiZWxlbSIsImNsb3Nlc3QiLCJzcGFuIiwiYXN5bmMiLCJpc0xpZ2F0dXJlIiwibmMiLCJuZW9uVmlldyIsImF0dHJpYnV0ZXMiLCJnZXRFbGVtZW50QXR0ciIsInZpZXciLCJnZXRDdXJyZW50UGFnZVVSSSIsIkJvb2xlYW4iLCJsaWdhdGVkIiwiZWxlbWVudHNIYXZlQ29ycmVjdFR5cGUiLCJzZWxlY3Rpb25UeXBlIiwiZWxlbWVudHMiLCJzaGFyZWRTZWNvbmRMZXZlbFBhcmVudCIsInRlbXBFbGVtZW50cyIsInNlY29uZFBhcmVudCIsInNlbGVjdEJCb3giLCJiYm94Iiwic3lsIiwicmVzaXplIiwicXVlcnlTZWxlY3RvciIsInRyaWdnZXJCQm94QWN0aW9ucyIsInBhcmVudCIsInByZXZOYyIsInByZXZpb3VzU2libGluZyIsIm5leHROYyIsIm5leHRTaWJsaW5nIiwidHJpZ2dlckdyb3VwaW5nIiwidHJpZ2dlck5jQWN0aW9ucyIsImFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlIiwic29ydGVkRWxlbWVudHMiLCJqIiwiaXNTYW1lTm9kZSIsImZpcnN0RWxlbSIsInNlY29uZEVsZW0iLCJpbmRleDEiLCJpbmRleE9mIiwiaW5kZXgyIiwiYWJzIiwiZmlsdGVyIiwicmVmZXJlbmNlUGFyZW50U3RhZmYiLCJyZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSIsImVsZW1lbnRzQXJyYXkiLCJhbm90aGVyU3RhZmYiLCJ1bHgiLCJ1bHkiLCJscngiLCJscnkiLCJyb3RhdGUiLCJwYXRoIiwiY29vcmRpbmF0ZXMiLCJnZXRBdHRyaWJ1dGUiLCJtYXRjaCIsIm1hcCIsImF0YW4iLCJtaW4iLCJub3ROZXVtZXMiLCJubiIsInNlbGVjdGlvbkNsYXNzIiwiY29udGFpbnNMYXllckVsZW1lbnRzIiwiY29udGFpbnNOYyIsImdyb3Vwc1RvU2VsZWN0IiwiU2V0IiwiZ3JvdXBpbmciLCJmb2xsb3dzIiwicHJlY2VkZXMiLCJoYXMiLCJncm91cCIsImdyb3VwcyIsInZhbHVlcyIsInRyaWdnZXJNdWx0aVN0YWZmQWN0aW9ucyIsInNpemUiLCJ0cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyIsInRyaWdnZXJEZWZhdWx0QWN0aW9ucyIsInRyaWdnZXJTeWxsYWJsZUFjdGlvbnMiLCJhZGRBZGRTeWxMaXN0ZW5lciIsImlzTGlua2FibGUiLCJpc0dyb3VwYWJsZSIsInRyaWdnZXJOZXVtZUFjdGlvbnMiLCJjaGlsZHJlbiIsImZpcnN0TkMiLCJzZWNvbmROQyIsImZpcnN0TkNYIiwieCIsImJhc2VWYWwiLCJzZWNvbmROQ1giLCJmaXJzdE5DWSIsInkiLCJzZWNvbmROQ1kiLCJnIiwidHJpZ2dlckRlZmF1bHRTeWxBY3Rpb25zIiwiaW5zZXJ0VGFiSHRtbCIsInByaW1pdGl2ZVRhYiIsImdyb3VwaW5nVGFiIiwic3lzdGVtVGFiIiwiaW5zZXJ0Q29udHJvbHNQYW5lbCIsImVkaXRDb250cm9sc1BhbmVsIiwibmNBY3Rpb25Db250ZW50cyIsImRlZmF1bHROZXVtZUFjdGlvbkNvbnRlbnRzIiwibmV1bWVBY3Rpb25Db250ZW50cyIsImRlZmF1bHRBY3Rpb25Db250ZW50cyIsImRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyIsImN1c3Rvc0FjdGlvbkNvbnRlbnRzIiwibGF5ZXJFbGVtZW50T3V0QWN0aW9uQ29udGVudHMiLCJsYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzIiwiYWNjaWRBY3Rpb25Db250ZW50cyIsInN0YWZmU3BsaXRBY3Rpb25Db250ZW50cyIsInN0YWZmTWVyZ2VBY3Rpb25Db250ZW50cyIsImNvbHVtbkFjdGlvbkNvbnRlbnRzIiwiY2xlZkFjdGlvbkNvbnRlbnRzIiwiZGl2TGluZUFjdGlvbkNvbnRlbnRzIiwiYmJveEFjdGlvbkNvbnRlbnRzIiwiZ3JvdXBpbmdNZW51IiwibGlnYXR1cmVOYyIsImxpZ2F0dXJlIiwic3BsaXRTeWxsYWJsZSIsImFkZFRleHRNb2RhbCIsImVkaXRUZXh0TW9kYWwiLCJob3RrZXlzTW9kYWwiLCJzeWxsYWJsZUFjdGlvbnNDb250ZW50IiwiZXJyb3JMb2dzUGFuZWxDb250ZW50cyIsIk1vZGFsV2luZG93VmlldyIsIk1vZGFsV2luZG93U3RhdGUiLCJvcGVuQWRkU3lsVGV4dE1vZGFsV2luZG93IiwiaGlkZU1vZGFsV2luZG93IiwiYWRkU3lsVGV4dCIsImZvY3VzTW9kYWxXaW5kb3ciLCJvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyIsInVwZGF0ZVN5bFRleHQiLCJlZGl0b3JBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbSIsImVsZW1lbnRJZCIsInN5bFRleHQiLCJlZGl0IiwidGhlbiIsInJlc3BvbnNlIiwidXBkYXRlRm9yQ3VycmVudFBhZ2UiLCJvcmlnIiwidGV4dENvbnRlbnQiLCJyZXBsYWNlIiwidHJpbSIsInVwZGF0ZWRTeWxUZXh0IiwiZW50cmllcyIsImNsYXNzTmFtZSIsInRleHQiLCJ1cGRhdGVTZWxlY3RlZEJCb3giLCJrZXlkb3duTGlzdGVuZXIiLCJlIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwibW9kYWxXaW5kb3dWaWV3IiwiQUREX1RFWFQiLCJFRElUX1RFWFQiLCJET0NVTUVOVF9VUExPQUQiLCJORVdfRk9MREVSIiwiUkVOQU1FIiwiZm9jdXMiLCJtb2RhbFdpbmRvd1N0YXRlIiwiQ0xPU0VEIiwic2V0dXBFdmVudExpc3RlbmVycyIsImNvbnRlbnQiLCJzZXRNb2RhbFdpbmRvd0NvbnRlbnQiLCJ0b1N0cmluZyIsIkhPVEtFWVMiLCJNT1ZFX1RPIiwiYm9keSIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsIk9QRU4iLCJyZW1vdmVFdmVudExpc3RlbmVycyIsImNvbnRhaW5lciIsInRpdGxlIiwiaW5uZXJUZXh0IiwicmVtb3ZlU3ltYm9sIiwiRVJST1JfTE9HIiwiZW5jb2RlVVJJIiwidXBsb2FkQXJlYUhUTUwiLCJuZXdGb2xkZXJIVE1MIiwicmVuYW1lSFRNTCIsImJib3hJZCIsImZpbmQiLCJjaGVja2VkIiwiZGlzcGxheVJlY3QiLCJieXRlVG9IZXgiLCJzdWJzdHIiLCJvZmZzZXQiLCJ1dWlkIiwidG9Mb3dlckNhc2UiLCJsYXN0R2x5cGhPcGFjaXR5IiwibGFzdEltYWdlT3BhY2l0eSIsImxhc3RDaXJjbGVTaXplIiwic2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciIsIm1laUNsYXNzTmFtZSIsIm9wYWNpdHlPdXRwdXQiLCJzZXRTZXR0aW5ncyIsImhpZGVHbHlwaEltZyIsIm9wYWNpdHkiLCJzZXRCZ09wYWNpdHlGcm9tU2xpZGVyIiwiYmFja2dyb3VuZCIsImJnT3BhY2l0eU91dHB1dCIsImhpZGVCZ0ltZyIsImJnIiwidXBkYXRlSGlnaGxpZ2h0T3B0aW9uIiwib3B0aW9uIiwiZHJvcGRvd24iLCJoaWdobGlnaHRUeXBlIiwidW5zZXRHcm91cGluZ0hpZ2hsaWdodCIsInRvVXBwZXJDYXNlIiwic2V0R3JvdXBpbmdIaWdobGlnaHQiLCJzZXRIaWdobGlnaHRPcHRpb24iLCJoaWdobGlnaHRDbGlja2F3YXkiLCJzZXRIaWdobGlnaHRDb250cm9scyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInRvZ2dsZSIsImxvYWRIaWdobGlnaHRTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiem9vbUhhbmRsZXIiLCJ6b29tU2xpZGVyIiwiem9vbU91dHB1dCIsInpvb21UbyIsInJlc2V0Wm9vbUFuZFBhbiIsImRpc2FibGVkIiwiY3VycmVudFpvb20iLCJwYXJzZUludCIsInByZXZlbnREZWZhdWx0IiwibmV3Wm9vbSIsImNpcmNsZVNsaWRlciIsImNpcmNsZU91dHB1dCIsImNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIiLCJyZXNpemVQb2ludHMiLCJlbXB0eSIsImF0dHIiLCJoaWdobGlnaHRTZWxlY3Rpb24iLCJoaWdobGlnaHRJZCIsImRpc3BsYXlBbGxCdG4iLCJkaXNwbGF5QkJveGVzIiwib3BhY2l0eVNsaWRlciIsImlucHV0Q2hhbmdlT3BhY2l0eSIsInRvZ2dsZU9wYWNpdHlCdG4iLCJuZXdPcGFjaXR5Iiwicm91bmQiLCJzZXRHbHlwaE9wYWNpdHlDb250cm9scyIsImJnT3BhY2l0eVNsaWRlciIsImJnSW5wdXRDaGFuZ2VIYW5kbGVyIiwidG9nZ2xlQmdPcGFjaXR5QnRuIiwic2V0QmdPcGFjaXR5Q29udHJvbHMiLCJtZXRhS2V5Iiwic2VsZWN0QWxsQnRuIiwib3B0aW9ucyIsImNsaWNrIiwic2V0RGlzcGxheUFsbExpc3RlbmVyIiwiZGlzcGxheUNvbnRlbnRzIiwidG9nZ2xlRGlzcGxheSIsInBhZGRpbmciLCJvdmVyZmxvdyIsInVuc2V0SW5jbGluYXR1bUFjdGlvbiIsImF0dHJUeXBlIiwiYXR0clZhbHVlIiwidW5zZXRWaXJnYUFjdGlvbiIsInVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbiIsInVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbiIsInVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24iLCJjdXJ2ZSIsImRlbGV0ZUJ1dHRvbkhhbmRsZXIiLCJyZW1vdmVIYW5kbGVyIiwibW9yZUVkaXQiLCJleHRyYUVkaXQiLCJ0b1JlbW92ZSIsImNoYWluQWN0aW9uIiwiY2hhbmdlU3RhZmZIYW5kbGVyIiwidG9DaGFuZ2UiLCJpbnNlcnRUb1N5bGxhYmxlSGFuZGxlciIsInRvSW5zZXJ0IiwicmVzdWx0IiwibW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIiLCJ0b01vdmUiLCJtYXRjaEhlaWdodEhhbmRsZXIiLCJvcGVuQWRkU3lsV2luZG93IiwibW9kYWxXaW5kb3ciLCJtb2RhbCIsInNldE1vZGFsV2luZG93VmlldyIsIm9wZW5Nb2RhbFdpbmRvdyIsImFkZERlbGV0ZUxpc3RlbmVyIiwiZGVsIiwiYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lciIsImNoYW5nZVN0YWZmIiwidXBkYXRlQ29sdW1uSW5mbyIsImNvbElucHV0Iiwic3RhdmVzIiwiY29sSW5mbyIsImhhc0NvbHVtbiIsImpvaW4iLCJzdGFmZkNvbCIsImFkZENvbHVtbkluZm9TdGVwSGFuZGxlciIsImRlY3JlbWVudEJ1dHRvbiIsImluY3JlbWVudEJ1dHRvbiIsImNvbmZpcm1CdXR0b24iLCJ1cGRhdGVOdW1iZXIiLCJjaGFuZ2UiLCJjdXJyZW50VmFsdWUiLCJ0b1NldENvbHVtbiIsInNldEVkaXRDb250cm9scyIsImVkaXRUeXBlIiwiY29udGVudHMiLCJwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uIiwidHJpZ2dlclN0YWZmU3BsaXRNb2RlIiwiU3BsaXRTdGFmZkhhbmRsZXIiLCJzdGFydFNwbGl0IiwiaW5pdE9wdGlvbnNMaXN0ZW5lcnMiLCJkcm9wIiwib3B0aW9uc0NsaWNrYXdheSIsIm90aGVyIiwiaW5pdE5lb25WaWV3IiwiYWRkU3lsIiwiQ29udGVudHMiLCJ1bnNldEluY2xpbmF0dW0iLCJ1bnNldFZpcmdhIiwidW5zZXRWaXJnYVJldmVyc2VkIiwidW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwidW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSIsInNldEluY2xpbmF0dW0iLCJzZXRWaXJnYSIsInNldFZpcmdhUmV2ZXJzZWQiLCJzZXRMaXF1ZXNjZW50Q2xvY2t3aXNlIiwic2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UiLCJ0cmlnZ2VyQ2hhbmdlR3JvdXAiLCJjb250b3VyIiwiY2hhbmdlR3JvdXBpbmdBY3Rpb24iLCJTcGxpdE5ldW1lSGFuZGxlciIsImluZm8iLCJnZXRDb250b3VyQnlWYWx1ZSIsImV4dHJhQWN0aW9uc0hUTUwiLCJhY2NpZE9wdGlvbnNMaXN0ZW5lciIsImluY3JlbWVudE9jdGF2ZSIsImRpcmVjdGlvbiIsInNoYXBlIiwiY2xlZk9wdGlvbnNMaXN0ZW5lciIsImRpdkxpbmVPcHRpb25zTGlzdGVuZXIiLCJtZXJnZVN0YXZlcyIsInBvaW50cyIsImdldFN0YWZmQkJveCIsInlfY2hhbmdlIiwidGFuIiwiZ2V0U1ZHUmVsQ29vcmRzIiwiY2xpZW50WCIsImNsaWVudFkiLCJwdCIsIkRPTVBvaW50IiwicGFnZU1hcmdpbiIsIm1hdHJpeFRyYW5zZm9ybSIsImdldFNjcmVlbkNUTSIsImludmVyc2UiLCJnZXRTdGFmZklkQnlDb29yZHMiLCJzdGFmZkJCb3hlcyIsInN0YWZmSWQiLCJiZ0ltZyIsInJlY3QiLCJ0YWdOYW1lIiwiZ2V0QkJveCIsInBhcmVudE5vZGUiLCJ3aWR0aCIsImhlaWdodCIsImhleF9jaHIiLCJtZDVjeWNsZSIsImsiLCJhIiwiYiIsIm1kNWJsayIsIm1kNWJsa3MiLCJjaGFyQ29kZUF0IiwibWQ1YmxrX2FycmF5IiwibWQ1MSIsInRhaWwiLCJ0bXAiLCJsbyIsImhpIiwic3Vic3RyaW5nIiwicmhleCIsImhleCIsInRvVXRmOCIsInN0ciIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaGV4VG9CaW5hcnlTdHJpbmciLCJieXRlcyIsImZyb21DaGFyQ29kZSIsIlNwYXJrTUQ1IiwicmVzZXQiLCJBcnJheUJ1ZmZlciIsImNsYW1wIiwidmFsIiwidG8iLCJudW0iLCJ0YXJnZXRBcnJheSIsInNvdXJjZUFycmF5IiwiYnl0ZUxlbmd0aCIsImJlZ2luIiwiZW5kIiwiVWludDhBcnJheSIsImFwcGVuZEJpbmFyeSIsIl9idWZmIiwiX2xlbmd0aCIsIl9oYXNoIiwicmF3IiwiYnVmZiIsIl9maW5pc2giLCJnZXRTdGF0ZSIsImhhc2giLCJzZXRTdGF0ZSIsImRlc3Ryb3kiLCJoYXNoQmluYXJ5IiwiZmlyc3QiLCJzZWNvbmQiLCJyZXR1cm5VSW50OEFycmF5IiwiYnVmZmVyIiwic3ViYXJyYXkiLCJ1dGY4U3RyMkFycmF5QnVmZmVyIiwibWQ1MV9hcnJheSIsImZhY3RvcnkiLCJ1aW50OFRvVXVpZCIsImRhdGEiLCJjYiIsInByZXZpb3VzIiwiY3VycmVudCIsInBhZFN0YXJ0IiwicmVkdWNlIiwiY3J5cHRvIiwib2N0ZXRzIiwibW9kaWZpZXJzIiwiZ2V0UmFuZG9tVmFsdWVzIiwiQ29sb3JQYWxldHRlIiwicmVjdHMiLCJ1bnNldFN0YWZmSGlnaGxpZ2h0IiwiY2hpbGQiLCJjY2hpbGQiLCJzZXRTdGFmZkhpZ2hsaWdodCIsInN0YWZmQ29sb3IiLCJjb2x1bW5OdW0iLCJjb2x1bW4iLCJzZXRDb2x1bW5IaWdobGlnaHQiLCJncm91cENvbG9yIiwiZGl2TGluZUNoaWxkcmVuIiwicm5kczgiLCJybmciLCJtc0NyeXB0byIsIm9iaiIsInN0YWNrIiwibWV0YVN0YWNrIiwibGFzdE1ldGFFbGVtZW50IiwibGFzdEVsZW1lbnRJbmRleCIsImlzQXJyYXkiLCJpbnB1dCIsIm5leHQiLCJhcnJheVByZWZpeCIsIm9ialByZWZpeCIsInJlcyIsInByZWZpeCIsImNvbGxhdGlvbkluZGV4IiwicGFyc2VkTnVtIiwibnVtQ2hhciIsInBhcnNlZFN0cmluZyIsImxhc3RDaCIsIm51bUNvbnNlY3V0aXZlU2xhc2hlcyIsImNoIiwiYXJyYXlFbGVtZW50Iiwib2JqRWxlbWVudCIsInBhcnNlRmxvYXQiLCJidWYiLCJybmRzIiwicmFuZG9tIiwic2VsZWN0b3IiLCJkcmFnU3RhcnRDb29yZHMiLCJkcmFnQmVoYXZpb3VyIiwiZHJhZyIsImV2ZW50IiwiZHgiLCJkeSIsInNvdXJjZUV2ZW50IiwiZHJhZ2dpbmciLCJkcmFnRW5kZWQiLCJzZWxlY3Rpb24iLCJub01vdmVQcmVjZWRlcyIsImhhc0F0dHJpYnV0ZSIsIm1vdmVFbGVtZW50cyIsImJib3hlcyIsInhEaWZmIiwieURpZmYiLCJpc0N1cnNvck91dE9mQm91bmRzIiwiaXNEcmFnT3V0T2ZCb3VuZHMiLCJyZXR1cm5FbGVtZW50cyIsInBhcmFtQXJyYXkiLCJkcmFnQWN0aW9uIiwidG9SZXNlbGVjdCIsInJlc2VsZWN0IiwicmVzZWxlY3RlZCIsInJlc2V0VG9BY3Rpb24iLCJlbmRYIiwiZW5kWSIsImlzT3V0T2ZTVkdCb3VuZHMiLCJnbHlwaFNlbGVjdG9yIiwic2VsZWN0aW9uQkJveCIsImFjYyIsImdldEdseXBoQkJveCIsImN1cnIiLCJNQVhfVkFMVUUiLCJNSU5fVkFMVUUiLCJTZWxlY3RUb29scyIsInNoYXJlZExvZ2ljYWxQYXJlbnQiLCJhcmVBZGphY2VudCIsImNvbnRhaW5zTGlua2VkIiwiaXNMaW5rZWQiLCJjYW5CZUxpbmtlZCIsInNvcnQiLCJzdGFmZkEiLCJzdGFmZkIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzeWxsYWJsZXMiLCJjdXJyZW50U3lsbGFibGVJbmRleCIsImN1cnJlbnRTdGFmZiIsIm5leHRTdGFmZiIsImN1cnJlbnRTdGFmZkluZGV4IiwiZXZlcnkiLCJ1bmxpbmtlZEVsZW1lbnRzIiwiZmlyc3RVbmxpbmtlZCIsIkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyIsImlkeCIsInN5bGxhYmxlIiwiYXQiLCJuZXh0U3lsbGFibGVJZCIsIm5leHRTeWxsYWJsZUlkeCIsIm5leHRTeWxsYWJsZSIsInByZXZTeWxsYWJsZUlkIiwicHJldlN5bGxhYmxlIiwiaGFzSW52YWxpZExpbmtlZFN5bGxhYmxlIiwic3lzdGVtcyIsImVsZW1lbnRJZHMiLCJncm91cGluZ0FjdGlvbiIsImdldENoaWxkcmVuSWRzIiwiZ2V0SWRzIiwidG9nZ2xlTGlua2VkU3lsbGFibGVzIiwiZ3JvdXBUeXBlIiwibmV1bWVQYXJlbnQiLCJuY3MiLCJnZXRDb250b3VyIiwiV2FybmluZ3MiLCJncm91cGluZ05vdFJlY29nbml6ZWQiLCJnZXRTVkdHcmFwaGljc0VsZW1lbnRCeUlkIiwiU1ZHR3JhcGhpY3NFbGVtZW50IiwidW5saW5rIiwiZmlyc3RTeWxsYWJsZSIsInNlY29uZFN5bGxhYmxlIiwidW5saW5rZWRFbGVtZW50IiwiZ2V0VG9nZ2xlU3lsbGFibGVJZHMiLCJsb2ciLCJpZHMiLCJjaGlsZHJlbklkcyIsIkVudHJ5VHlwZSIsIkZpbGVTeXN0ZW1Ub29scyIsIkZpbGVTeXN0ZW1NYW5hZ2VyIiwiY3JlYXRlTG9nTWVzc2FnZSIsIm5vdGlmIiwibm90aWZEaXYiLCJyZW1vdmVCdG4iLCJvbmNsaWNrIiwiaW5mb0J0biIsIk1vZGFsV2luZG93Iiwib3BlbkVycm9yTG9nV2luZG93IiwiaW5pdEVycm9yTG9nQ29udHJvbHMiLCJlcnJvclBhbmVsIiwiaGVhZGluZyIsImRyb3Bkb3duSWNvbiIsImluaXREaXNwbGF5TGlzdGVuZXIiLCJjaGVja2JveGVzQ29udGFpbmVyIiwiZXJyb3JzTGFiZWwiLCJlcm9ycnNCdG4iLCJhcHBlbmRDaGlsZCIsInVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSIsIm5vdGlmUGFuZWwiLCJQb2ludE5hbWVzIiwiVG9wTGVmdCIsIlRvcCIsIlRvcFJpZ2h0IiwiUmlnaHQiLCJCb3R0b21SaWdodCIsIkJvdHRvbSIsIkJvdHRvbUxlZnQiLCJMZWZ0IiwiZ2V0UG9pbnRzIiwic2luIiwiaW5pdGlhbFVseCIsImluaXRpYWxMcngiLCJpbml0aWFsUG9pbnQiLCJpbml0aWFsVWx5IiwiaW5pdGlhbExyeSIsImluaXRpYWxZIiwiaW5pdGlhbFJlY3RZIiwicG9seUxlbiIsImluaXRpYWxSb3RhdGUiLCJyZWRyYXciLCJwb2ludFN0cmluZyIsIl9lbGVtIiwidGV4dFJlY3QiLCJwb2ludE5hbWUiLCJwb2ludCIsInBvaW50U3RyaW5nUmlnaHQiLCJwb2ludFN0cmluZ0xlZnQiLCJkcmF3SW5pdGlhbFJlY3QiLCJ3aGljaFBvaW50IiwiXyIsInZpZXdwb3J0RWxlbWVudCIsInJlc2l6ZVN0YXJ0IiwicmVzaXplRHJhZyIsInJlc2l6ZUVuZCIsInJvdGF0ZVN0YXJ0IiwidGVtcCIsIm1vdXNlIiwidGVtcFJvdGF0ZSIsInJvdGF0ZUVuZCIsImN1cnJlbnRQb2ludCIsIndoaWNoIiwiUEkiLCJFeHBvcnRlZFNldCIsIkV4cG9ydGVkTWFwIiwibWFuZ2xlIiwidW5tYW5nbGUiLCJNYXAkMSIsIl9zdG9yZSIsIlNldCQxIiwiY2xvbmVCaW5hcnlPYmplY3QiLCJjbG9uZUFycmF5QnVmZmVyIiwid2Via2l0U2xpY2UiLCJtYW5nbGVkIiwiZGVsZXRlIiwiTWFwIiwicHJvcCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInNwZWNpZXMiLCJzdXBwb3J0c01hcEFuZFNldCIsImZ1bmNUb1N0cmluZyIsIm9iamVjdEN0b3JTdHJpbmciLCJjbG9uZSIsIm5ld09iamVjdCIsIkRhdGUiLCJpc0Zpbml0ZSIsInRvSVNPU3RyaW5nIiwiQmxvYiIsImlzQmluYXJ5T2JqZWN0IiwicHJvdG8iLCJDdG9yIiwiaXNQbGFpbk9iamVjdCIsImNhbGxlZCIsInRvUHJvbWlzZSIsImZ1bmMiLCJzZWxmIiwidXNlZENCIiwicHJvbWlzZSIsImZ1bGZpbGwiLCJyZXNwIiwiY2FsbGJhY2siLCJtZXNnIiwiYWRhcHRlckZ1biIsIl9jbG9zZWQiLCJfZGVzdHJveWVkIiwibG9nQXJncyIsIm9yaWdDYWxsYmFjayIsInJlc3BvbnNlQXJncyIsImxvZ0FwaUNhbGwiLCJ0YXNrcXVldWUiLCJpc1JlYWR5IiwiYWRkVGFzayIsImZhaWxlZCIsInBpY2siLCJoYXNMb2NhbCIsImlkZW50aXR5RnVuY3Rpb24iLCJmb3JtYXRSZXN1bHRGb3JPcGVuUmV2c0dldCIsIm9rIiwiYnVsa0dldCIsImRiIiwib3B0cyIsInJlcXVlc3RzIiwiZG9jcyIsInJlcXVlc3RzQnlJZCIsInJlcXVlc3QiLCJudW1Eb2NzIiwibnVtRG9uZSIsInBlckRvY1Jlc3VsdHMiLCJjaGVja0RvbmUiLCJyZXN1bHRzIiwiYWxsUmVxdWVzdHMiLCJuZXh0QmF0Y2giLCJ1cFRvIiwiYmF0Y2giLCJkb2NJZCIsImRvY0lkeCIsImRvY1JlcXVlc3RzIiwiZG9jT3B0cyIsIm9wZW5fcmV2cyIsInJldiIsImZvcm1hdFJlc3VsdCIsInByb2Nlc3NCYXRjaCIsImhhc0xvY2FsU3RvcmFnZSIsIkNoYW5nZXMiLCJhdHRhY2hCcm93c2VyRXZlbnRzIiwiZ3VhcmRlZENvbnNvbGUiLCJtZXRob2QiLCJkZWZhdWx0QmFja09mZiIsIm1heFRpbWVvdXQiLCJyYW5kb21OdW1iZXIiLCJleHBsYWluRXJyb3IiLCJzdGF0dXMiLCJkYk5hbWUiLCJpbnByb2dyZXNzIiwiZXZlbnRGdW5jdGlvbiIsImNoYW5nZXNPcHRzIiwiY2hhbmdlcyIsInNlcSIsInNpbmNlIiwiY2FuY2VsbGVkIiwib25DaGFuZ2UiLCJub3RpZnlMb2NhbFdpbmRvd3MiLCJub3RpZnkiLCIkaW5qZWN0X09iamVjdF9hc3NpZ24iLCJhc3NpZ24iLCJuZXh0U291cmNlIiwibmV4dEtleSIsIlBvdWNoRXJyb3IiLCJyZWFzb24iLCJNSVNTSU5HX0JVTEtfRE9DUyIsIk1JU1NJTkdfRE9DIiwiUkVWX0NPTkZMSUNUIiwiSU5WQUxJRF9JRCIsIk1JU1NJTkdfSUQiLCJSRVNFUlZFRF9JRCIsIlVOS05PV05fRVJST1IiLCJCQURfQVJHIiwiUVVFUllfUEFSU0VfRVJST1IiLCJET0NfVkFMSURBVElPTiIsIkJBRF9SRVFVRVNUIiwiTk9UX0FOX09CSkVDVCIsIklEQl9FUlJPUiIsIklOVkFMSURfUkVWIiwiTUlTU0lOR19TVFVCIiwiY3JlYXRlRXJyb3IiLCJDdXN0b21Qb3VjaEVycm9yIiwibmFtZXMiLCJnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlIiwiZmlsdGVyQ2hhbmdlIiwicmVxIiwiaGFzRmlsdGVyIiwicXVlcnkiLCJxdWVyeV9wYXJhbXMiLCJkb2MiLCJmaWx0ZXJSZXR1cm4iLCJtc2ciLCJ0cnlGaWx0ZXIiLCJpbmNsdWRlX2RvY3MiLCJhdHRhY2htZW50cyIsImF0dCIsIl9hdHRhY2htZW50cyIsInN0dWIiLCJmbGF0dGVuIiwiYXJycyIsImludmFsaWRJZEVycm9yIiwiaXNSZW1vdGUiLCJfcmVtb3RlIiwicGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUiLCJwYXJ0cyIsInNwbGl0Iiwibm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lIiwibm9ybWFsaXplZCIsInFQYXJzZXIiLCJwYXJzZXIiLCJwYXJzZVVyaSIsImV4ZWMiLCJ1cmkiLCJlbmNvZGVkIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiJDAiLCIkMSIsIiQyIiwic2NvcGVFdmFsIiwic291cmNlIiwic2NvcGUiLCJ1cHNlcnQiLCJkaWZmRnVuIiwiY2F0Y2giLCJkb2NSZXYiLCJfcmV2IiwibmV3RG9jIiwiX2lkIiwicHV0IiwidXBkYXRlZCIsInRyeUFuZFB1dCIsInRoaXNBdG9iIiwiYXRvYiIsInRoaXNCdG9hIiwiYnRvYSIsImNyZWF0ZUJsb2IiLCJwcm9wZXJ0aWVzIiwiYnVpbGRlciIsIkJsb2JCdWlsZGVyIiwiTVNCbG9iQnVpbGRlciIsIk1vekJsb2JCdWlsZGVyIiwiV2ViS2l0QmxvYkJ1aWxkZXIiLCJnZXRCbG9iIiwiYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlciIsImJpbiIsImJpblN0cmluZ1RvQmx1ZmZlciIsImJpblN0cmluZyIsImI2NFRvQmx1ZmZlciIsImI2NCIsInJlYWRBc0JpbmFyeVN0cmluZyIsImJsb2IiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwiaGFzQmluYXJ5U3RyaW5nIiwib25sb2FkZW5kIiwiYmluYXJ5IiwiYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyIsInJlYWRBc0FycmF5QnVmZmVyIiwiYmxvYlRvQmluYXJ5U3RyaW5nIiwiYmxvYk9yQnVmZmVyIiwiYmxvYlRvQmFzZTY0IiwiYmFzZTY0Iiwic2V0SW1tZWRpYXRlU2hpbSIsInNldEltbWVkaWF0ZSIsImFwcGVuZEJsb2IiLCJzdGFydCIsInNsaWNlQmxvYiIsImFycmF5QnVmZmVyIiwiYXBwZW5kU3RyaW5nIiwic3RyaW5nIiwiYmluYXJ5TWQ1IiwiaW5wdXRJc1N0cmluZyIsImNodW5rU2l6ZSIsImNodW5rcyIsImNlaWwiLCJjdXJyZW50Q2h1bmsiLCJsb2FkTmV4dENodW5rIiwiZG9uZSIsInJhd1RvQmFzZTY0Iiwic3RyaW5nTWQ1IiwicmV2JCQxIiwiZGV0ZXJtaW5pc3RpY19yZXZzIiwibXV0YXRlYWJsZURvYyIsIl9yZXZfdHJlZSIsIndpbm5pbmdSZXYiLCJtZXRhZGF0YSIsIndpbm5pbmdJZCIsIndpbm5pbmdQb3MiLCJ3aW5uaW5nRGVsZXRlZCIsIm5vZGUiLCJ0b1Zpc2l0IiwicmV2X3RyZWUiLCJ0cmVlIiwiYnJhbmNoZXMiLCJwb3MiLCJkZWxldGVkIiwidHJhdmVyc2VSZXZUcmVlIiwicmV2cyIsIm5ld0N0eCIsImN0eCIsInNvcnRCeVBvcyIsImNvbGxlY3RMZWF2ZXMiLCJsZWF2ZXMiLCJpc0xlYWYiLCJyZXZlcnNlIiwiY29sbGVjdENvbmZsaWN0cyIsIndpbiIsImNvbmZsaWN0cyIsImxlYWYiLCJyb290VG9MZWFmIiwicGF0aHMiLCJoaXN0b3J5Iiwic29ydEJ5UG9zJDEiLCJpbnNlcnRTb3J0ZWQiLCJpdGVtIiwiY29tcGFyYXRvciIsIm1pZCIsImxvdyIsImhpZ2giLCJiaW5hcnlTZWFyY2giLCJzcGxpY2UiLCJwYXRoVG9UcmVlIiwibnVtU3RlbW1lZCIsInJvb3QiLCJjdXJyZW50TGVhZiIsImNvbXBhcmVUcmVlIiwibWVyZ2VUcmVlIiwiaW5fdHJlZTEiLCJpbl90cmVlMiIsInRyZWUxIiwidHJlZTIiLCJtZXJnZWQiLCJkb01lcmdlIiwiZG9udEV4cGFuZCIsInJlc3RyZWUiLCJicmFuY2giLCJ0MSIsInQyIiwiZGlmZiIsImNhbmRpZGF0ZVBhcmVudHMiLCJ0cmVlcyIsInBhcmVudElkeCIsImVsZW1lbnRzTGVuIiwibWVyZ2UiLCJkZXB0aCIsIm5ld1RyZWUiLCJzdGVtbWVkIiwic3RlbW1lZFJldnMiLCJyZXZIYXNoIiwic3RlbSIsImdldFRyZWVzIiwiaXNEZWxldGVkIiwiaXNMb2NhbElkIiwiQ2hhbmdlcyQxIiwiY29tcGxldGUiLCJlZSIsIm9uRGVzdHJveSIsImNhbmNlbCIsInBlbmRpbmciLCJsYXN0U2VxIiwiaXNDYW5jZWxsZWQiLCJ0cnlDYXRjaEluQ2hhbmdlTGlzdGVuZXIiLCJ2YWxpZGF0ZUNoYW5nZXMiLCJwcm9jZXNzQ2hhbmdlIiwiY2hhbmdlTGlzdCIsIl9jb25mbGljdHMiLCJjb21wYXJlIiwibGVmdCIsInJpZ2h0IiwieWFua0Vycm9yIiwiY29tcGFyZUJ5SWRUaGVuUmV2IiwiaWRDb21wYXJlIiwiX3JldmlzaW9ucyIsIkFic3RyYWN0UG91Y2hEQiIsIlRhc2tRdWV1ZSIsIlBvdWNoREIiLCJfX29wdHMiLCJhdXRvX2NvbXBhY3Rpb24iLCJiYWNrZW5kIiwiYWRhcHRlciIsImFkYXB0ZXJzIiwicHJlZmVycmVkQWRhcHRlcnMiLCJhZGFwdGVyTmFtZSIsInVzZV9wcmVmaXgiLCJwYXJzZUFkYXB0ZXIiLCJfYWRhcHRlciIsInZhbGlkIiwidmlld19hZGFwdGVyIiwiZmFpbCIsIm9uRGVzdHJveWVkIiwiZnJvbV9jb25zdHJ1Y3RvciIsIm9uQ2xvc2VkIiwicHJlcGFyZUZvckRlc3RydWN0aW9uIiwicmVhZHkiLCJfY2hhbmdlc0ZpbHRlclBsdWdpbiIsInZhbGlkYXRlIiwiZG9DaGFuZ2VzIiwiY29udGludW91cyIsImxpdmUiLCJub3JtYWxpemUiLCJzaG91bGRGaWx0ZXIiLCJkZXNjZW5kaW5nIiwibGltaXQiLCJuZXdQcm9taXNlIiwiX2NoYW5nZXMiLCJ1cGRhdGVfc2VxIiwicG9zdCIsImJ1bGtEb2NzIiwiX3B1dExvY2FsIiwiX2RlbGV0ZWQiLCJfcmVtb3ZlTG9jYWwiLCJvbGRSZXZJZCIsIm5ld1Jldk51bSIsIm5ld1JldklkIiwicHV0RG9jIiwiX3B1dCIsIm5ld19lZGl0cyIsImZvcmNlIiwicHV0QXR0YWNobWVudCIsImF0dGFjaG1lbnRJZCIsImFwaSIsImNyZWF0ZUF0dGFjaG1lbnQiLCJwcmV2cmV2cG9zIiwiY29udGVudF90eXBlIiwicmV2cG9zIiwicmVtb3ZlQXR0YWNobWVudCIsImRvY09ySWQiLCJvcHRzT3JSZXYiLCJ3YXNfZGVsZXRlIiwicmV2c0RpZmYiLCJtaXNzaW5nIiwiYWRkVG9NaXNzaW5nIiwicmV2SWQiLCJfZ2V0UmV2aXNpb25UcmVlIiwibWlzc2luZ0ZvcklkIiwicHJvY2Vzc0RvYyIsIm1pc3NpbmdPYmoiLCJjb21wYWN0RG9jdW1lbnQiLCJtYXhIZWlnaHQiLCJyZXZUcmVlIiwiZWRnZXMiLCJwcm50IiwiZWRnZSIsImNvbXB1dGVIZWlnaHQiLCJjYW5kaWRhdGVzIiwiX2RvQ29tcGFjdGlvbiIsImNvbXBhY3QiLCJfY29tcGFjdGlvblF1ZXVlIiwiZG9OZXh0Q29tcGFjdGlvbiIsImxhc3Rfc2VxIiwiX2NvbXBhY3QiLCJyZXR1cm5fZG9jcyIsInByb21pc2VzIiwicm93IiwiYWxsIiwiX2dldExvY2FsIiwiZmluaXNoT3BlblJldnMiLCJsYXRlc3QiLCJfZ2V0IiwicmV2c19pbmZvIiwic3BsaXR0ZWRSZXYiLCJyZXZObyIsImN1cnJlbnRQYXRoIiwiaGFzaEluZGV4IiwiaW5kZXhPZlJldiIsImhvd01hbnkiLCJfcmV2c19pbmZvIiwiX2dldEF0dGFjaG1lbnQiLCJnZXRBdHRhY2htZW50IiwiYWxsRG9jcyIsInNraXAiLCJzdGFydF9rZXkiLCJzdGFydGtleSIsImVuZF9rZXkiLCJlbmRrZXkiLCJpbmNvbXBhdGlibGVPcHQiLCJhbGxEb2NzS2V5c1BhcnNlIiwiX2FsbERvY3MiLCJjbG9zZSIsIl9jbG9zZSIsIl9pbmZvIiwiZGJfbmFtZSIsIl90eXBlIiwiYXR0YWNobWVudEVycm9yIiwiY2hhckF0IiwiYXR0YWNobWVudE5hbWVFcnJvciIsImF0dHMiLCJjbGVhbkRvY3MiLCJfYnVsa0RvY3MiLCJyZWdpc3RlckRlcGVuZGVudERhdGFiYXNlIiwiZGVwZW5kZW50RGIiLCJkYk9wdGlvbnMiLCJkZXBEQiIsImRlcGVuZGVudERicyIsInVzZVByZWZpeCIsImRlc3Ryb3lEYiIsIl9kZXN0cm95IiwibG9jYWxEb2MiLCJkZWxldGVkTWFwIiwidHJ1ZU5hbWUiLCJSZWdFeHAiLCJleGVjdXRlIiwiQWJvcnRDb250cm9sbGVyIiwiYWJvcnQiLCJmJDEiLCJmZXRjaCIsImgiLCJIZWFkZXJzIiwiZXZlbnRFbWl0dGVyIiwiUG91Y2giLCJkZXN0cnVjdExpc3RlbmVycyIsIl9kZXN0cnVjdGlvbkxpc3RlbmVycyIsImRiTGlzdCIsInNldFVwRXZlbnRFbWl0dGVyIiwiYWRkVG9QcmVmZXJyZWRBZGFwdGVycyIsInBsdWdpbiIsIl9fZGVmYXVsdHMiLCJkZWZhdWx0cyIsImRlZmF1bHRPcHRzIiwiUG91Y2hBbHQiLCJ1cmwiLCJnZXRGaWVsZEZyb21Eb2MiLCJwYXJzZWRGaWVsZCIsInBhcnNlRmllbGQiLCJmaWVsZE5hbWUiLCJmaWVsZHMiLCJjb21iaW5hdGlvbkZpZWxkcyIsImlzQ29tYmluYXRpb25hbEZpZWxkIiwiZmllbGQiLCJnZXRLZXkiLCJtZXJnZUFuZGVkU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwiJG9yIiwiJG5vciIsIm1hdGNoZXIiLCIkZXEiLCJsb25nZXN0IiwiZmllbGRNYXRjaGVycyIsIm9wZXJhdG9yIiwiJGd0ZSIsIiRndCIsIm1lcmdlR3RHdGUiLCIkbHRlIiwiJGx0IiwibWVyZ2VMdEx0ZSIsIiRuZSIsIm1lcmdlTmUiLCJtZXJnZUVxIiwiJHJlZ2V4IiwibWVyZ2VSZWdleCIsIm1hc3NhZ2VTZWxlY3RvciIsIndhc0FuZGVkIiwiaXNBbmRJblNlbGVjdG9yIiwiaXNBbmQiLCJtZXJnZUFuZGVkU2VsZWN0b3JzTmVzdGVkIiwib3JPck5vciIsInN1YlNlbGVjdG9yIiwiY29sbGF0ZSIsIm5vcm1hbGl6ZUtleSIsImFpIiwiYmkiLCJzdHJpbmdDb2xsYXRlIiwiYXJyYXlDb2xsYXRlIiwiYWsiLCJiayIsIm9iamVjdENvbGxhdGUiLCJJbmZpbml0eSIsIm9yaWdLZXkiLCJ0b0pTT04iLCJpbmRleGlmeSIsImV4cEZvcm1hdCIsInRvRXhwb25lbnRpYWwiLCJtYWduaXR1ZGUiLCJuZWciLCJtYWdTdHJpbmciLCJwYWRXaXRoIiwidXBUb0xlbmd0aCIsInRhcmdldExlbmd0aCIsInBhZCIsImZhY3RvciIsImZhY3RvclN0ciIsInRvRml4ZWQiLCJudW1Ub0luZGV4YWJsZVN0cmluZyIsInRvSW5kZXhhYmxlU3RyaW5nIiwib2JqS2V5IiwicGFyc2VOdW1iZXIiLCJvcmlnaW5hbElkeCIsIm51bUFzU3RyaW5nIiwibWFnQXNTdHJpbmciLCJmaWx0ZXJJbk1lbW9yeUZpZWxkcyIsInJvd3MiLCJyZXF1ZXN0RGVmIiwiaW5NZW1vcnlGaWVsZHMiLCJyb3dGaWx0ZXIiLCJmaWVsZFNvcnRlciIsImdldEZpZWxkVmFsdWVzQXNBcnJheSIsInNvcnRpbmciLCJhUm93IiwiYlJvdyIsImNvbGxhdGlvbiIsImNyZWF0ZUZpZWxkU29ydGVyIiwiZG9jRmllbGRWYWx1ZSIsInNvbWUiLCJvck1hdGNoZXJzIiwibWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvciIsIm1hdGNoU2VsZWN0b3IiLCJtYXliZVVzZXJPcGVyYXRvciIsInVzZXJWYWx1ZSIsInN1YlBhcnNlZEZpZWxkIiwic3ViRG9jRmllbGRWYWx1ZSIsInVzZXJPcGVyYXRvciIsIm1hdGNoZXJzIiwiZmllbGRFeGlzdHMiLCJmaWVsZElzTm90VW5kZWZpbmVkIiwiYXJyYXlDb250YWluc1ZhbHVlIiwiZG9jRmllbGRWYWx1ZUl0ZW0iLCJtb2RGaWVsZCIsIm5lVmFsdWUiLCJhcnJheVNpemUiLCJhcnJheUNvbnRhaW5zQWxsVmFsdWVzIiwicmVnZXhWYWx1ZSIsInJlZ2V4TWF0Y2giLCJ0eXBlTWF0Y2giLCJmaWx0ZXJOYW1lIiwiY2hhbmdlc0hhbmRsZXIiLCJkb2NfaWRzIiwidmlld05hbWUiLCJkZG9jIiwibWFwRnVuIiwidmlld3MiLCJyb3dzTWF0Y2hlZCIsIm1hdGNoZXNTZWxlY3RvciIsImZpbHRlckZ1biIsImZpbHRlcnMiLCJ0b09iamVjdCIsInZlcnNpb24iLCJyZXNlcnZlZFdvcmRzIiwiZGF0YVdvcmRzIiwicGFyc2VSZXZpc2lvbkluZm8iLCJwYXJzZURvYyIsIm5ld0VkaXRzIiwiZGJPcHRzIiwiblJldk51bSIsInJldkluZm8iLCJyZXZpc2lvbnMiLCJyZXZpc2lvbklkcyIsIm1ha2VSZXZUcmVlRnJvbVJldmlzaW9ucyIsInNwZWNpYWxLZXkiLCJwcmVwcm9jZXNzU3RyaW5nIiwiYmxvYlR5cGUiLCJhc0JpbmFyeSIsInBhcnNlQmFzZTY0IiwiZGlnZXN0IiwicHJlcHJvY2Vzc0F0dGFjaG1lbnQiLCJtZDUiLCJwcmVwcm9jZXNzQmxvYiIsInVwZGF0ZURvYyIsInJldkxpbWl0IiwicHJldiIsImRvY0luZm8iLCJ3cml0ZURvYyIsInNwbGl0UmV2IiwidGFyZ2V0UG9zIiwidGFyZ2V0SWQiLCJyZXZFeGlzdHMiLCJwcmV2aW91c1dpbm5pbmdSZXYiLCJwcmV2aW91c2x5RGVsZXRlZCIsImlzUm9vdCIsIm5ld1JldiIsInJldl9tYXAiLCJ3aW5uaW5nUmV2JCQxIiwid2lubmluZ1JldklzRGVsZXRlZCIsImRlbHRhIiwicHJvY2Vzc0RvY3MiLCJkb2NJbmZvcyIsImZldGNoZWREb2NzIiwidHgiLCJvdmVyYWxsQ2FsbGJhY2siLCJpZHNUb0RvY3MiLCJkb2NzRG9uZSIsImRvY3NUb0RvIiwiY2hlY2tBbGxEb2NzRG9uZSIsImN1cnJlbnREb2MiLCJyZXN1bHRzSWR4IiwiZG9jV3JpdHRlbiIsIm5leHREb2MiLCJyb290SXNNaXNzaW5nIiwiaW5zZXJ0RG9jIiwiRE9DX1NUT1JFIiwiTUVUQV9TVE9SRSIsInNhZmVKc29uU3RyaW5naWZ5IiwianNvbiIsImlkYkVycm9yIiwiZW5jb2RlTWV0YWRhdGEiLCJkZWxldGVkT3JMb2NhbCIsImRlY29kZU1ldGFkYXRhIiwic3RvcmVkT2JqZWN0Iiwic2FmZUpzb25QYXJzZSIsImRlY29kZURvYyIsIl9kb2NfaWRfcmV2IiwibGFzdEluZGV4T2YiLCJyZWFkQmxvYkRhdGEiLCJhc0Jsb2IiLCJmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3NhcnkiLCJ0eG4iLCJhdHRPYmoiLCJvYmplY3RTdG9yZSIsIm9uc3VjY2VzcyIsImZldGNoQXR0YWNobWVudCIsInBvc3RQcm9jZXNzQXR0YWNobWVudHMiLCJhdHROYW1lcyIsImNvbXBhY3RSZXZzIiwicG9zc2libHlPcnBoYW5lZERpZ2VzdHMiLCJzZXFTdG9yZSIsImF0dFN0b3JlIiwiYXR0QW5kU2VxU3RvcmUiLCJJREJLZXlSYW5nZSIsImJvdW5kIiwiZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cyIsIm9wZW5DdXJzb3IiLCJvbmx5IiwiY3Vyc29yIiwiZGlnZXN0U2VxIiwicHJpbWFyeUtleSIsImNvbnRpbnVlIiwib3BlblRyYW5zYWN0aW9uU2FmZWx5IiwiaWRiIiwic3RvcmVzIiwidHJhbnNhY3Rpb24iLCJpZGJCdWxrRG9jcyIsImRvY1N0b3JlIiwiYnlTZXFTdG9yZSIsImF0dGFjaFN0b3JlIiwiYXR0YWNoQW5kU2VxU3RvcmUiLCJtZXRhU3RvcmUiLCJkb2NJbmZvRXJyb3IiLCJtZXRhRG9jIiwiYWxsRG9jc1Byb2Nlc3NlZCIsImRvY0NvdW50RGVsdGEiLCJwcmVjb25kaXRpb25FcnJvcmVkIiwiX21ldGEiLCJibG9iU3VwcG9ydCIsIm9uQWxsRG9jc1Byb2Nlc3NlZCIsInVwZGF0ZURvY0NvdW50SWZSZWFkeSIsImRvY0NvdW50IiwibmV3UmV2SXNEZWxldGVkIiwiaXNVcGRhdGUiLCJjb2xsZWN0UmVzdWx0cyIsImZpbmlzaERvYyIsImF0dGFjaG1lbnRTYXZlZCIsIm5ld0F0dCIsInNhdmVBdHRhY2htZW50Iiwid3JpdGVBdHRhY2htZW50cyIsImFmdGVyUHV0RG9jIiwicmV2c1RvRGVsZXRlIiwiY29tcGFjdFRyZWUiLCJtZXRhZGF0YVRvU3RvcmUiLCJhZnRlclB1dE1ldGFkYXRhIiwiYXR0c0FkZGVkIiwiYXR0c1RvQWRkIiwib25lcnJvciIsImluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyIsInB1dFJlcSIsIm92ZXJhbGxFcnIiLCJkb2N2IiwicmVjdiIsInByb2Nlc3NlZEF0dGFjaG1lbnQiLCJwcmVwcm9jZXNzQXR0YWNobWVudHMiLCJ0eG5SZXN1bHQiLCJvbmFib3J0Iiwib250aW1lb3V0Iiwib25jb21wbGV0ZSIsImZpbmlzaCIsImRpZ2VzdHMiLCJmaWxlbmFtZSIsInZlcmlmeUF0dGFjaG1lbnQiLCJhdHRFcnIiLCJ2ZXJpZnlBdHRhY2htZW50cyIsIm51bUZldGNoZWQiLCJyZXZzX2xpbWl0IiwicmVhZE1ldGFkYXRhIiwiZmV0Y2hFeGlzdGluZ0RvY3MiLCJzdGFydFRyYW5zYWN0aW9uIiwicnVuQmF0Y2hlZEN1cnNvciIsImtleVJhbmdlIiwiYmF0Y2hTaXplIiwib25CYXRjaCIsImtleXNCYXRjaCIsInZhbHVlc0JhdGNoIiwicHNldWRvQ3Vyc29yIiwib25HZXRBbGwiLCJvbkdldEFsbEtleXMiLCJvbkN1cnNvciIsImdldEFsbCIsImdldEFsbEtleXMiLCJuZXdLZXlSYW5nZSIsImxhc3RLZXkiLCJ1cHBlciIsInVwcGVyT3BlbiIsImNvZGUiLCJsb3dlckJvdW5kIiwiaWRiQWxsRG9jcyIsImtleVJhbmdlRXJyb3IiLCJpbmNsdXNpdmVFbmQiLCJpbmNsdXNpdmVfZW5kIiwidXBwZXJCb3VuZCIsImNyZWF0ZUtleVJhbmdlIiwib25SZXN1bHRzUmVhZHkiLCJ1cGRhdGVTZXEiLCJvblN1Y2Nlc3MiLCJkb2NJZFJldkluZGV4IiwiYWxsRG9jc0lubmVyIiwiZmV0Y2hEb2NBc3luY2hyb25vdXNseSIsImJhdGNoVmFsdWVzIiwiYmF0Y2hWYWx1ZSIsImJhdGNoS2V5cyIsInJldHVyblZhbCIsInRvdGFsX3Jvd3MiLCJtYXhLZXkiLCJhbGxEb2NzS2V5cyIsInJ1bm5pbmciLCJhcHBseU5leHQiLCJkb2NJZHMiLCJudW1SZXN1bHRzIiwiZG9jSWRzVG9NZXRhZGF0YSIsIm9uR2V0TWV0YWRhdGEiLCJkb2NJZFJldiIsIm9iamVjdFN0b3JlcyIsIndpbm5pbmdEb2NzIiwibWV0YWRhdGFzIiwiZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEiLCJ3aW5uaW5nRG9jIiwicHJvY2Vzc01ldGFkYXRhQW5kV2lubmluZ0RvYyIsIm9uQmF0Y2hEb25lIiwiZmlsdGVyZWQiLCJibG9iU3VwcG9ydFByb21pc2UiLCJjYWNoZWREQnMiLCJvcGVuUmVxTGlzdCIsIklkYlBvdWNoIiwidHJ5Q29kZSIsImVucXVldWVUYXNrIiwidGhpc0NhbGxiYWNrIiwiaWRiR2xvYmFsRmFpbHVyZUVycm9yIiwiZW5yaWNoQ2FsbGJhY2tFcnJvciIsImFkZERlbGV0ZWRPckxvY2FsSW5kZXgiLCJjcmVhdGVJbmRleCIsInVuaXF1ZSIsIm1pZ3JhdGVMb2NhbFN0b3JlIiwibG9jYWxTdG9yZSIsImxvY2FsIiwicmFuZ2UiLCJzZXFDdXJzb3IiLCJtaWdyYXRlQXR0c0FuZFNlcXMiLCJkaWdlc3RNYXAiLCJtaWdyYXRlTWV0YWRhdGEiLCJvbkdldE1ldGFkYXRhU2VxIiwibWV0YWRhdGFTZXEiLCJmZXRjaE1ldGFkYXRhU2VxIiwiaW5zdGFuY2VJZCIsInJlcU9wdHMiLCJoaXN0b3J5Tm9kZSIsImF0dGFjaElkIiwiYXR0YWNobWVudCIsImJsb2JEYXRhIiwiZG9jX2NvdW50IiwiaWRiX2F0dGFjaG1lbnRfZm9ybWF0Iiwib2xkUmV2Iiwib1N0b3JlIiwib2xkRG9jIiwib3BlblJlcSIsImluZGV4ZWREQiIsImRlbGV0ZURhdGFiYXNlIiwiY2FjaGVkIiwiZ2xvYmFsIiwib3BlbiIsIm9udXBncmFkZW5lZWRlZCIsIm9sZFZlcnNpb24iLCJjcmVhdGVPYmplY3RTdG9yZSIsImtleVBhdGgiLCJhdXRvSW5jcmVtZW50IiwiY3JlYXRlU2NoZW1hIiwiY3VycmVudFRhcmdldCIsImNyZWF0ZUxvY2FsU3RvcmVTY2hlbWEiLCJhZGRBdHRhY2hBbmRTZXFTdG9yZSIsIm1pZ3JhdGlvbnMiLCJtaWdyYXRpb24iLCJvbnZlcnNpb25jaGFuZ2UiLCJzdG9yZWRNZXRhRG9jIiwiY29tcGxldGVTZXR1cCIsInN0b3JlTWV0YURvY0lmUmVhZHkiLCJpbnN0YW5jZUtleSIsImNvdW50RG9jcyIsImJsb2IkJDEiLCJtYXRjaGVkQ2hyb21lIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF0Y2hlZEVkZ2UiLCJjaGVja0Jsb2JTdXBwb3J0Iiwic3VwcG9ydHNCdWxrR2V0TWFwIiwicmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIiLCJlbmNvZGVEb2NJZCIsInByZXByb2Nlc3NBdHRhY2htZW50cyQxIiwiZ2V0SG9zdCIsInByb3RvY29sIiwiaGFzVXJsUHJlZml4IiwidXNlciIsInBhc3N3b3JkIiwiYXV0aCIsInVzZXJuYW1lIiwiZ2VuREJVcmwiLCJnZW5VcmwiLCJwYXRoRGVsIiwiaG9zdCIsInBvcnQiLCJwYXJhbXNUb1N0ciIsIkh0dHBQb3VjaCIsImRiVXJsIiwic2V0dXBQcm9taXNlIiwib3VyRmV0Y2giLCJoZWFkZXJzIiwiY3JlZGVudGlhbHMiLCJuQXV0aCIsInRva2VuIiwidWEiLCJpc0lFIiwiaXNUcmlkZW50IiwiaXNFZGdlIiwiaXNHRVQiLCJzaG91bGRDYWNoZUJ1c3QiLCJub3ciLCJhZGFwdGVyRnVuJCQxIiwic2V0dXAiLCJmZXRjaEpTT04iLCJ2Iiwic2tpcF9zZXR1cCIsImVuY29kZUF0dGFjaG1lbnRJZCIsInV1aWQkJDEiLCJwaW5nIiwiY29tcGFjdF9ydW5uaW5nIiwiaW50ZXJ2YWwiLCJkb0J1bGtHZXQiLCJkb0J1bGtHZXRTaGltIiwibnVtQmF0Y2hlcyIsIm9uUmVzdWx0IiwiYmF0Y2hOdW0iLCJzdWJPcHRzIiwic3VwcG9ydHNCdWxrR2V0IiwiZmV0Y2hBdHRhY2htZW50cyIsImZpbGVuYW1lcyIsInByb21pc2VGYWN0b3JpZXMiLCJkb05leHQiLCJydW5OZXh0QmF0Y2giLCJvbkVycm9yIiwidGhpc0VyciIsInBvb2wiLCJ0eXBlRmllbGREZXNjcmlwdG9yIiwiX19wcm90b19fIiwiZmV0Y2hEYXRhIiwiZG9jT3JEb2NzIiwiY29udGVudFR5cGUiLCJwcm9jZXNzIiwiYnJvd3NlciIsInBhcmFtU3RyIiwiYmF0Y2hfc2l6ZSIsImhlYXJ0YmVhdCIsInJlcXVlc3RUaW1lb3V0IiwibGVmdFRvRmV0Y2giLCJmZWVkIiwic2VxX2ludGVydmFsIiwicGFyYW1fbmFtZSIsImxhc3RGZXRjaGVkU2VxIiwiY29udHJvbGxlciIsImFib3J0ZWQiLCJmZXRjaE9wdHMiLCJzaWduYWwiLCJmZXRjaGVkIiwicmF3X3Jlc3VsdHNfbGVuZ3RoIiwiZmluaXNoZWQiLCJRdWVyeVBhcnNlRXJyb3IiLCJjYXB0dXJlU3RhY2tUcmFjZSIsIk5vdEZvdW5kRXJyb3IiLCJCdWlsdEluRXJyb3IiLCJwcm9taXNlZENhbGxiYWNrIiwic2VxdWVudGlhbGl6ZSIsInByb21pc2VGYWN0b3J5IiwidW5pcSIsInRoZVNldCIsIm1hcFRvS2V5c0FycmF5IiwiY3JlYXRlQnVpbHRJbkVycm9yIiwic3VtIiwiakxlbiIsImpOdW0iLCJldmFsRnVuY3Rpb25XaXRoRXZhbCIsIlRhc2tRdWV1ZSQxIiwiY3JlYXRlVmlldyIsInNvdXJjZURCIiwicmVkdWNlRnVuIiwidGVtcG9yYXJ5IiwibG9jYWxEb2NOYW1lIiwiY2FjaGVkVmlld3MiLCJ2aWV3U2lnbmF0dXJlIiwiY3JlYXRlVmlld1NpZ25hdHVyZSIsIl9jYWNoZWRWaWV3cyIsInByb21pc2VGb3JWaWV3IiwiZGVwRGJOYW1lIiwiZnVsbFZpZXdOYW1lIiwiZGVwRGJzIiwibGFzdFNlcURvYyIsInBlcnNpc3RlbnRRdWV1ZXMiLCJ0ZW1wVmlld1F1ZXVlIiwicGFyc2VWaWV3TmFtZSIsImVtaXRFcnJvciIsImJ1aWx0SW5SZWR1Y2UiLCJzdW1zcXIiLCJfc3Vtc3FyIiwiYWJzdHJhY3QiLCJtYXBwZXIiLCJyZWR1Y2VyIiwiZGRvY1ZhbGlkYXRvciIsInRyeU1hcCIsInRyeVJlZHVjZSIsInJlcmVkdWNlIiwib3V0cHV0Iiwic29ydEJ5S2V5VGhlblZhbHVlIiwia2V5Q29tcGFyZSIsInNsaWNlUmVzdWx0cyIsInJvd1RvRG9jSWQiLCJwb3N0cHJvY2Vzc0F0dGFjaG1lbnRzIiwiYWRkSHR0cFBhcmFtIiwicGFyYW1OYW1lIiwiYXNKc29uIiwiY29lcmNlSW50ZWdlciIsImludGVnZXJDYW5kaWRhdGUiLCJhc051bWJlciIsImNoZWNrUXVlcnlQYXJzZUVycm9yIiwic3RhcnRrZXlOYW1lIiwiZW5ka2V5TmFtZSIsImdyb3VwX2xldmVsIiwib3B0aW9uTmFtZSIsIm51bWJlciIsImNoZWNrUG9zaXRpdmVJbnRlZ2VyIiwiZGVmYXVsdHNUbyIsImdldERvY3NUb1BlcnNpc3QiLCJkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyIsIm1ldGFEb2NJZCIsImRlZmF1bHRNZXRhRG9jIiwiZG9jRGF0YSIsImluZGV4YWJsZUtleXNUb0tleVZhbHVlcyIsImlzR2VuT25lIiwiZ2V0S2V5VmFsdWVEb2NzIiwia3ZEb2NzUmVzIiwia3ZEb2NzIiwib2xkS2V5cyIsImtleVZhbHVlIiwibmV3S2V5cyIsImt2RG9jIiwicHJvY2Vzc0tleVZhbHVlRG9jcyIsImdldFF1ZXVlIiwidXBkYXRlVmlldyIsIm1hcFJlc3VsdHMiLCJjdXJyZW50U2VxIiwibGlzdE9mRG9jc1RvUGVyc2lzdCIsImRvY3NUb1BlcnNpc3QiLCJzYXZlS2V5VmFsdWVzIiwiaW5kZXhlZF9kb2NzIiwicHJvZ3Jlc3MiLCJwcm9jZXNzTmV4dEJhdGNoIiwiY2hhbmdlc19iYXRjaF9zaXplIiwiY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzIiwiY3JlYXRlRG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMiLCJyZXN1bHRzX2NvdW50IiwiZW1pdHRlZEtleVZhbHVlIiwiY29tcGxleEtleSIsInVwZGF0ZVZpZXdJblF1ZXVlIiwicXVlcnlWaWV3IiwidG90YWxSb3dzIiwic2hvdWxkUmVkdWNlIiwiZmV0Y2hGcm9tVmlldyIsInZpZXdPcHRzIiwiZXhwZWN0ZWRLZXlzIiwicGFyc2VkS2V5QW5kRG9jSWQiLCJwYXJzZWRTdHIiLCJwYXJzZUluZGV4YWJsZVN0cmluZyIsIm9uTWFwUmVzdWx0c1JlYWR5IiwiZmluYWxSZXN1bHRzIiwic2hvdWxkR3JvdXAiLCJsdmwiLCJQT1NJVElWRV9JTkZJTklUWSIsImxhc3QiLCJncm91cEtleSIsInJlZHVjZVRyeSIsInJlZHVjZVZpZXciLCJhbGxEb2NzUmVzIiwiZG9jSWRzVG9Eb2NzIiwiZmV0Y2hQcm9taXNlcyIsImtleVN0YXJ0Iiwia2V5RW5kIiwicXVlcnlWaWV3SW5RdWV1ZSIsInF1ZXJ5UHJvbWlzZWQiLCJfcXVlcnkiLCJjdXN0b21RdWVyeSIsImtleXNBc1N0cmluZyIsImh0dHBRdWVyeSIsInVwZGF0ZVZpZXdPcHRzIiwidmlld191cGRhdGVfY2hhbmdlc19iYXRjaF9zaXplIiwiZmluYWxQcm9taXNlRmFjdG9yeSIsImRlc2lnbkRvY05hbWUiLCJzdGFsZSIsImNvZXJjZU9wdGlvbnMiLCJ2aWV3Q2xlYW51cCIsIl92aWV3Q2xlYW51cCIsImN1c3RvbVZpZXdDbGVhbnVwIiwiaHR0cFZpZXdDbGVhbnVwIiwiZG9jc1RvVmlld3MiLCJ2aWV3c1RvU3RhdHVzIiwiZGRvY05hbWUiLCJ2aWV3REJOYW1lcyIsInN0YXR1c0lzR29vZCIsInZpZXdEQk5hbWUiLCJkZXN0cm95UHJvbWlzZXMiLCJsb2NhbFZpZXdDbGVhbnVwIiwiY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UiLCJvcmlnTWFwIiwicmVkdWNlRnVuU3RyaW5nIiwiYnVpbHRJbiIsImdldEJ1aWx0SW4iLCJtYXByZWR1Y2UiLCJpc0dlbk9uZSQxIiwiZ2V0RG9jQXR0YWNobWVudHMiLCJnZXREb2NzIiwic3JjIiwiZGlmZnMiLCJyZXN1bHREb2NzIiwiZmV0Y2hSZXZpc2lvbk9uZURvY3MiLCJoYXNDb25mbGljdHMiLCJidWxrR2V0T3B0cyIsIm1pc3NpbmdSZXYiLCJjcmVhdGVCdWxrR2V0T3B0cyIsImJ1bGtHZXRSZXNwb25zZSIsImJ1bGtHZXRJbmZvIiwicmVtb3RlRG9jIiwiZG9DaGVja0ZvckxvY2FsQXR0YWNobWVudHMiLCJmaWxlSGFzQ2hhbmdlZCIsImdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlIiwidXBkYXRlQ2hlY2twb2ludCIsImNoZWNrcG9pbnQiLCJzZXNzaW9uIiwicmV0dXJuVmFsdWUiLCJzZXNzaW9uX2lkIiwicmVwbGljYXRvciIsIkNoZWNrcG9pbnRlciIsIndyaXRlQ2hlY2twb2ludCIsInVwZGF0ZVRhcmdldCIsInVwZGF0ZVNvdXJjZSIsIndyaXRlVGFyZ2V0Q2hlY2twb2ludCIsIndyaXRlU291cmNlQ2hlY2twb2ludCIsImlzRm9yYmlkZGVuRXJyb3IiLCJjb21wYXJpc29ucyIsInRhcmdldERvYyIsInNvdXJjZURvYyIsInNyY0RvYyIsInRndERvYyIsImNvbXBhcmVSZXBsaWNhdGlvbkhpc3RvcnkiLCJzb3VyY2VIaXN0b3J5IiwidGFyZ2V0SGlzdG9yeSIsIlMiLCJzb3VyY2VSZXN0IiwiVCIsInRhcmdldFJlc3QiLCJoYXNTZXNzaW9uSWQiLCJjb21wYXJlUmVwbGljYXRpb25Mb2dzIiwic2Vzc2lvbklkIiwicHJvcHMiLCJyZXN0IiwiZmxvb3IiLCJnZXRDaGVja3BvaW50IiwiZ2VuZXJhdGVSZXBsaWNhdGlvbklkIiwicXVlcnlQYXJhbXMiLCJmaWx0ZXJWaWV3TmFtZSIsInNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkiLCJxdWVyeURhdGEiLCJtZDVzdW0iLCJyZXBsaWNhdGUiLCJjdXJyZW50QmF0Y2giLCJyZXBJZCIsImNoZWNrcG9pbnRlciIsImJhdGNoZXMiLCJwZW5kaW5nQmF0Y2giLCJ3cml0aW5nQ2hlY2twb2ludCIsImNoYW5nZXNDb21wbGV0ZWQiLCJyZXBsaWNhdGlvbkNvbXBsZXRlZCIsImJhdGNoZXNfbGltaXQiLCJjaGFuZ2VzUGVuZGluZyIsImNoYW5nZWREb2NzIiwic3RhcnRfdGltZSIsImRvY3NfcmVhZCIsImRvY3Nfd3JpdHRlbiIsImRvY193cml0ZV9mYWlsdXJlcyIsImVycm9ycyIsImluaXRDaGVja3BvaW50ZXIiLCJjaGVja3BvaW50T3B0cyIsIndyaXRlRG9jcyIsImJ1bGtPcHRzIiwiY29tcGxldGVSZXBsaWNhdGlvbiIsImVycm9yc0J5SWQiLCJlcnJvcnNObyIsImVycm9yTmFtZSIsImZpbmlzaEJhdGNoIiwib3V0UmVzdWx0IiwiZ2V0Q2hhbmdlcyIsIm9uQ2hlY2twb2ludEVycm9yIiwiZ2V0QmF0Y2hEb2NzIiwiZ290Iiwic3RhcnROZXh0QmF0Y2giLCJhYm9ydFJlcGxpY2F0aW9uIiwicHJvY2Vzc1BlbmRpbmdCYXRjaCIsImltbWVkaWF0ZSQkMSIsImZhdGFsRXJyb3IiLCJlbmRfdGltZSIsInJldHJ5IiwiYmFja19vZmZfZnVuY3Rpb24iLCJiYWNrT2ZmU2V0IiwiY3VycmVudF9iYWNrX29mZiIsImJhY2tPZmYiLCJvbkNoYW5nZXNDb21wbGV0ZSIsIm9uQ2hhbmdlc0Vycm9yIiwiX2Fib3J0Q2hhbmdlcyIsImFib3J0Q2hhbmdlcyIsInN0YXJ0Q2hhbmdlcyIsIl9hZGRlZExpc3RlbmVycyIsIlJlcGxpY2F0aW9uIiwidG9Qb3VjaCIsIlBvdWNoQ29uc3RydWN0b3IiLCJyZXBsaWNhdGVXcmFwcGVyIiwicmVwbGljYXRlUmV0IiwiU3luYyIsImNhbmNlbGVkIiwib3B0c1B1c2giLCJvcHRzUHVsbCIsInB1bGwiLCJwdWxsQ2hhbmdlIiwicHVzaENoYW5nZSIsInB1c2hEZW5pZWQiLCJwdWxsRGVuaWVkIiwicHVzaFBhdXNlZCIsInB1bGxQYXVzZWQiLCJwdXNoQWN0aXZlIiwicHVsbEFjdGl2ZSIsInJlbW92ZWQiLCJyZW1vdmVBbGwiLCJhZGRPbmVMaXN0ZW5lciIsIm91dCIsImNsZWFudXAiLCJfcmVhZHlDYWxsZWQiLCJyZXBsaWNhdGVNZXRob2RzIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImRyYWluUXVldWUiLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJub29wIiwiZW52IiwiYXJndiIsInZlcnNpb25zIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwiZGlyIiwidW1hc2siLCJfbm9kZUlkIiwiX2Nsb2Nrc2VxIiwiX2xhc3RNU2VjcyIsIl9sYXN0TlNlY3MiLCJjbG9ja3NlcSIsInNlZWRCeXRlcyIsIm1zZWNzIiwibnNlY3MiLCJkdCIsInRsIiwidG1oIiwiZ2VuZXJhdGVVVUlEIiwibmFtZXNwYWNlIiwic3RyaW5nVG9CeXRlcyIsImhhc2hmdW5jIiwiRE5TIiwiVVJMIiwiZ2V0T3V0cHV0TGVuZ3RoIiwiaW5wdXRMZW5ndGg4Iiwic2FmZUFkZCIsImxzdyIsIm1kNWNtbiIsInEiLCJjbnQiLCJtZDVmZiIsIm1kNWdnIiwibWQ1aGgiLCJtZDVpaSIsInYzNSIsImxlbmd0aDMyIiwibWQ1VG9IZXhFbmNvZGVkQXJyYXkiLCJvbGRhIiwib2xkYiIsIm9sZGMiLCJvbGRkIiwid29yZHNUb01kNSIsImxlbmd0aDgiLCJVaW50MzJBcnJheSIsImJ5dGVzVG9Xb3JkcyIsImYiLCJ6IiwiUk9UTCIsIksiLCJIIiwiTiIsIk0iLCJfaSIsInBvdyIsIl9pMiIsIlciLCJfdCIsIl90MiIsImNyZWF0ZVNoaWZ0QXJyIiwic3RlcCIsInNwYWNlIiwiaXgiLCJ2a2JlYXV0aWZ5IiwiaXNTdWJxdWVyeSIsInBhcmVudGhlc2lzTGV2ZWwiLCJzcGxpdF9zcWwiLCJ0YWIiLCJ4bWwiLCJhciIsImluQ29tbWVudCIsImRlZXAiLCJjc3MiLCJzcWwiLCJhcl9ieV9xdW90ZSIsInhtbG1pbiIsInByZXNlcnZlQ29tbWVudHMiLCJqc29ubWluIiwiY3NzbWluIiwic3FsbWluIiwiY29uZmlybSIsInNwbGl0RGlzYWJsZSIsImNhcHR1cmUiLCJjbGlja2F3YXlIYW5kbGVyIiwicmVzZXRIYW5kbGVyIiwibmNJZCIsInF1ZXVlTWljcm90YXNrIiwiTXV0YXRpb24iLCJNdXRhdGlvbk9ic2VydmVyIiwiV2ViS2l0TXV0YXRpb25PYnNlcnZlciIsImhhbmRsZSIsIm9ic2VydmVyIiwiY3JlYXRlVGV4dE5vZGUiLCJvYnNlcnZlIiwiY2hhcmFjdGVyRGF0YSIsIk1lc3NhZ2VDaGFubmVsIiwiY2hhbm5lbCIsInBvcnQxIiwib25tZXNzYWdlIiwicG9ydDIiLCJwb3N0TWVzc2FnZSIsInNjcmlwdEVsIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJkb2N1bWVudEVsZW1lbnQiLCJtZWkiLCJtYW5pZmVzdCIsImxvY2FsTWFuaWZlc3QiLCJtZWlQcm9taXNlIiwibWVpUmVhZGVyIiwicmVhZEFzRGF0YVVSTCIsImJnUHJvbWlzZSIsImJnUmVhZGVyIiwibWVpVXJpIiwiYmdVcmkiLCJzaW5nbGUiLCJhbGVydCIsIm5ld05hbWUiLCJtYW5pZmVzdEJsb2IiLCJtYW5pZmVzdFRleHQiLCJuZXdNYW5pZmVzdEJsb2IiLCJkb2N1bWVudHNDb250YWluZXIiLCJiYWNrZ3JvdW5kQXJlYSIsIm9wZW5CdXR0b24iLCJyZW1vdmVCdXR0b24iLCJuYXZQYXRoQ29udGFpbmVyIiwiYmFja0J1dHRvbiIsImVtcHR5QnV0dG9uIiwiZGVsZXRlQnV0dG9uIiwidXBsb2FkRG9jdW1lbnRzQnV0dG9uIiwibmV3Rm9sZGVyQnV0dG9uIiwic2hpZnRTZWxlY3Rpb24iLCJTaGlmdFNlbGVjdGlvbk1hbmFnZXIiLCJmc20iLCJkYXNoYm9hcmRTdGF0ZSIsIm1haW5TZWN0aW9uIiwiY29udGV4dE1lbnUiLCJjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyIiwibWV0YUtleUlzUHJlc3NlZCIsInNoaWZ0S2V5SXNQcmVzc2VkIiwiY3VycmVudERyYWdUYXJnZXQiLCJyaWdodENsaWNrZWQiLCJvcGVuVXBsb2FkQXJlYUhhbmRsZXIiLCJJbml0VXBsb2FkQXJlYSIsImdldFBhcmVudEZvbGRlciIsIm9wZW5FZGl0b3JUYWIiLCJpc1NhbXBsZSIsInN0b3JhZ2UiLCJlbnRyeSIsImdldEVudHJpZXMiLCJzZXRTZWxlY3Rpb24iLCJ1bnNlbGVjdEFsbCIsInRpbGUiLCJyZXNldFNlbGVjdGlvbiIsImFkZFRpbGVFdmVudExpc3RlbmVyIiwidXBkYXRlRGFzaGJvYXJkIiwiZ2V0Rm9sZGVyUGF0aCIsIm9wZW5Eb2NzSGFuZGxlciIsIl9lIiwic2hpZnRTZWxlY3Rpb25IYW5kbGVyIiwiYWRkU2hpZnRTZWxlY3Rpb25MaXN0ZW5lciIsImdldFNlbGVjdGVkRW50cmllcyIsInNob3dDb250ZXh0TWVudSIsImNsaWNrZWRFbGVtZW50IiwiY2xpY2tlZEVudHJ5IiwiZ2V0RW50cnlCeUlkIiwiZ2V0SW5kZXhCeUVudHJ5TmFtZSIsImFkZFNwZWNpZmljQ29udGV4dE1lbnVMaXN0ZW5lcnMiLCJnZXRTZWxlY3Rpb24iLCJzZXRTdGFydCIsImdldFByZXZTZWxlY3Rpb24iLCJzZXRFbmQiLCJ1cGRhdGVBY3Rpb25CYXJCdXR0b25zIiwidXBkYXRlRlNCdXR0b25zIiwiZ2V0U2VsZWN0ZWRGb2xkZXJzIiwiZ2V0U2VsZWN0ZWRUcmFzaCIsImdldFNlbGVjdGVkRmlsZXMiLCJkb2N1bWVudFR5cGUiLCJvcGVuRmlsZSIsInJlbW92ZURvY3NIYW5kbGVyIiwic2VsZWN0ZWRFbnRyaWVzIiwicGFyZW50Rm9sZGVyIiwidHJhc2hGb2xkZXIiLCJnZXRUcmFzaEZvbGRlciIsImRhdGV0aW1lIiwidG9Mb2NhbGVTdHJpbmciLCJhZGRNZXRhZGF0YSIsInJlbW92ZWRfb24iLCJyZWNvdmVyX2ZvbGRlciIsImdldEZvbGRlclBhdGhOYW1lcyIsIm1vdmVUb0ZvbGRlciIsImRlbGV0ZUZpbGVFbnRyeSIsImZpbGUiLCJkZWxldGVEb2N1bWVudCIsInJlbW92ZUVudHJ5IiwiZGVsZXRlRm9sZGVyRW50cnkiLCJmb2xkZXIiLCJkZWxldGVQcm9taXNlcyIsImRlbGV0ZURvY3NIYW5kbGVyIiwiYWxsRW50cmllcyIsImFsZXJ0TWVzc2FnZSIsImVudHJ5QXJyYXkiLCJkZWJ1ZyIsImVtcHR5VHJhc2hIYW5kbGVyIiwiaXNJblRyYXNoIiwiYnV0dG9uQ2xvbmUiLCJjbG9uZU5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJoYW5kbGVOYXZpZ2F0ZUJhY2siLCJhZGREcm9wVGFyZ2V0TGlzdGVuZXJzIiwidXBkYXRlQmFja0J1dHRvbiIsInVwZGF0ZUVtcHR5QnV0dG9uIiwidXBkYXRlRGVsZXRlQnV0dG9uIiwibmV3UGF0aCIsInNldEZvbGRlclBhdGgiLCJjdXJyZW50Rm9sZGVyIiwic2V0RW50cmllcyIsImljb24iLCJjcmVhdGVUaWxlIiwibmF2RWxlbWVudHMiLCJuYXZTZWN0aW9uIiwidGFyZ2V0UGF0aCIsIm5hdkVsZW1lbnQiLCJzZXBlcmF0b3IiLCJ1cGRhdGVOYXZQYXRoIiwiaW5mb0JhZGdlIiwiZGF0YVRyYW5zZmVyIiwiZWZmZWN0QWxsb3dlZCIsInNldEZpbGVTeXN0ZW0iLCJkZXN0aW5hdGlvbkZvbGRlciIsImRyYWdFbnRyeSIsImNyZWF0ZUhhbmRsZURyb3AiLCJuZXdGb2xkZXIiLCJlcnJvck1lc3NhZ2VzIiwidHJhc2hGTkNvbmZsaWN0SGFuZGxlciIsImNhbk1vdmVFbnRyeSIsInN1Y2NlZWRlZCIsIm1vdmVFbnRyeSIsIm9wZW5Nb3ZlVG9XaW5kb3ciLCJyb290VHJlZSIsIm1vdmVUb0NhbGxiYWNrIiwiZ2VuZXJhdGVGb2xkZXJUcmVlIiwiZGVncmVlIiwibGlDb250YWluZXIiLCJmb2xkZXJOYW1lIiwidWwiLCJhcnJvdyIsImZvbGRlclRyZWUiLCJnZW5lcmF0ZVJvb3RUcmVlIiwibmV3UGFyZW50Rm9sZGVyIiwidHJlZUNvbnRhaW5lciIsIm1vZGFsQ29udGFpbmVyIiwib3Blbk5ld0ZvbGRlcldpbmRvdyIsImlucHV0Q29udGFpbmVyIiwiY2FuY2VsQnV0dG9uIiwicGxhY2Vob2xkZXIiLCJjb25maXJtTmV3Rm9sZGVyQWN0aW9uIiwibmFtZUV4aXN0cyIsIm5ld0ZvbGRlclRpbGUiLCJjcmVhdGVGb2xkZXIiLCJhZGRFbnRyeSIsImhhbmRsZUFkZEZvbGRlciIsIm9wZW5SZW5hbWVXaW5kb3ciLCJwcmV2TmFtZSIsImNvbmZpcm1SZW5hbWVBY3Rpb24iLCJyZW5hbWVFbnRyeSIsInVwZGF0ZURvY05hbWUiLCJudW1iZXJPZlNlbGVjdGVkRmlsZXMiLCJudW1iZXJPZlNlbGVjdGVkRm9sZGVycyIsInNlbGVjdGVkVHJhc2giLCJjb250ZXh0TWVudUNvbnRlbnQiLCJ0cmFzaEVudHJ5T3B0aW9ucyIsInNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycyIsIm11bHRpRmlsZU9wdGlvbnMiLCJmb2xkZXJBbmRGaWxlT3B0aW9ucyIsIm11bHRpRm9sZGVyT3B0aW9ucyIsInNpbmdsZUZvbGRlck9wdGlvbnMiLCJzaW5nbGVGaWxlT3B0aW9ucyIsInRyYXNoRm9sZGVyT3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwiZGVsZXRlQnRuIiwicmVuYW1lQnRuIiwibW92ZUJ0biIsInVwZGF0ZURvY0J0biIsIm5ld0ZvbGRlckJ0biIsInRvcCIsImJ0bkNsYXNzbmFtZSIsImZvbGRlclBhdGhOYW1lcyIsInRhcmdldEZvbGRlciIsImdldEZvbGRlclBhdGhCeU5hbWVzIiwicmVtb3ZlTWV0YWRhdGEiLCJkYXRlVGltZVBhdHRlcm4iLCJwdXRCYWNrRG9jc0hhbmRsZXIiLCJ1cGRhdGVUcmFzaCIsIm5ld1RyYXNoIiwiY3VycmVudERhdGUiLCJ0aGlydHlEYXlzQWdvIiwiZ2V0VGltZSIsInRvRGVsZXRlIiwic2hpZnRLZXkiLCJsb2FkRGFzaGJvYXJkIiwiZ2V0Um9vdCIsImNyZWF0ZUVudHJ5IiwiRmlsZSIsImNhbkFkZEVudHJ5IiwiaXNJbW11dGFibGUiLCJyZXR1cm5PYmoiLCJjYW5SZW1vdmVFbnRyeSIsImV4aXN0c0luUGFyZW50IiwiZmluZEluZGV4IiwiaXNJbW11dGFibGVQYXJlbnQiLCJpc0ltbXV0YWJsZUVudHJ5IiwibmV3UGFyZW50IiwiaXNTYW1lIiwiaXNJbW11dGFibGVOZXdQYXJlbnQiLCJuZXdQYXJlbnRJc0NoaWxkT2ZFbnRyeSIsIkZvbGRlciIsImlzQ2hpbGRPZiIsImNhblJlbmFtZUVudHJ5IiwibG9jYWxlQ29tcGFyZSIsImNyZWF0ZVRyYXNoIiwiVHJhc2giLCJjcmVhdGVGaWxlIiwibW92ZVJlc3BvbnNlIiwiZ2V0QWxsTmFtZXMiLCJnZXRGaWxlU3lzdGVtIiwiZnMiLCJzYW1wbGVFbnRyaWVzIiwic2FtcGxlcyIsImltbXV0YWJsZSIsInNhbXBsZXNGb2xkZXIiLCJzYW1wbGUiLCJsb2FkU2FtcGxlcyIsInVwbG9hZHMiLCJmZXRjaFVwbG9hZHMiLCJ1cGxvYWQiLCJsb2FkUHJldmlvdXNVcGxvYWRzIiwicHJldlNlbGVjdGlvbiIsIm9yZGVyZWRTZWxlY3Rpb24iLCJzcGVjaWZpY1NlbGVjdGlvbiIsIm9yZGVyZWRFbnRyaWVzIiwiZm9sZGVyUGF0aCIsIl9yb290Iiwicm9vdEZvbGRlciIsImJvb2wiLCJmb2xkZXJOYW1lcyIsInBhaXJCdXR0b24iLCJ1cGxvYWRCdXR0b24iLCJoYW5kbGVNYWtlUGFpciIsInNwaW5uZXIiLCJoYW5kbGVVcGxvYWRBbGxEb2N1bWVudHMiLCJzdWNjZXNzZnVsRmlsZXMiLCJoYW5kbGVVcGxvYWRVcGRhdGUiLCJmaWxlU2VsZWN0b3IiLCJtdWx0aXBsZSIsImZpbGVMaXN0IiwiZmlsZXMiLCJyZWplY3RGaWxlcyIsImFkZE5ld0ZpbGVzIiwidXBsb2FkX2FyZWEiLCJvbmRyYWdsZWF2ZSIsIm9uZHJhZ292ZXIiLCJkcm9wRWZmZWN0Iiwib25kcm9wIiwic29ydEJ5TmFtZUJ0biIsInNvcnRGaWxlQnlOYW1lIiwiZm0iLCJnZXRJbnN0YW5jZSIsImNyZWF0ZVVucGFpcmVkSXRlbSIsInJhZGlvTmFtZSIsInJhZGlvIiwibGFiZWwiLCJmb3JtYXRGaWxlbmFtZSIsImRlbEJ0biIsIm1heExlbiIsImNodW5rTGVuIiwiZm5Db25mbGljdEhhbmRsZXIiLCJleGlzdGluZ05hbWVzIiwibmV3RmlsZW5hbWUiLCJjb3VudGVyIiwiaW5jbHVkZXMiLCJzZXRNZWlUZW1wbGF0ZSIsIm1laV9jb250YWluZXIiLCJpbWFnZV9jb250YWluZXIiLCJleHQiLCJ1bnBhaXJlZEl0ZW0iLCJhZGRGaWxlIiwicGFpcmVkX2NvbnRhaW5lciIsInNlbGVjdGVkTWVpRWxlbWVudCIsInNlbGVjdGVkSW1hZ2VFbGVtZW50IiwibWVpX2ZpbGVuYW1lIiwiaW1hZ2VfZmlsZW5hbWUiLCJpc0NyZWF0ZWQiLCJmbiIsImdldEltZ0RpbWVuc2lvbiIsImRpbWVuc2lvbnMiLCJzdGFmZlNwYWNlIiwibmV3TWVpRmlsZSIsImNyZWF0ZU1laUZpbGUiLCJwYWlyZWRfZWwiLCJmb2xpbyIsImZvbGlvX2ZpbGVuYW1lIiwiaGFuZGxlVW5wYWlyIiwiaXNDcmVhdGVkRm9saW8iLCJyZW1vdmVGb2xpbyIsIm1laUl0ZW0iLCJpbWFnZUl0ZW0iLCJ1bnBhaXJCdG4iLCJjcmVhdGVQYWlyZWRGb2xpbyIsImFkZEZvbGlvIiwiZ2V0Rm9saW9zIiwiaW1hZ2UiLCJjcmVhdGVNYW5pZmVzdCIsImFkZERvY3VtZW50IiwiZmlsZUVudHJ5IiwiZm9saW9FbnRyeSIsImNyZWF0ZWRfb24iLCJ1cGxvYWRGb2xpbyIsImNsZWFyIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiZmlsZUVsZW1lbnRzIiwiaXNBc2NlbmRpbmciLCJuYW1lQSIsIm5hbWVCIiwiVXBsb2FkRmlsZU1hbmFnZXIiLCJhbGxGaWxlcyIsImZvbGlvcyIsImluc3RhbmNlIiwidXBkYXRlZEVudHJ5IiwiZ2V0RmlsZUNvdW50IiwibmV3RW50cnkiLCJ0ZW1wbGF0ZVBhdGgiLCJtZWlUZW1wbGF0ZSIsIkRPTVBhcnNlciIsInNlcmlhbGl6ZXIiLCJYTUxTZXJpYWxpemVyIiwibWVpRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwic3VyZmFjZSIsInN1cmZhY2VJZCIsInpvbmUiLCJ6b25lSWQiLCJtYXJnaW5SYXRlViIsIm1hcmdpblJhdGVIIiwibWFyZ2luViIsIm1hcmdpbkgiLCJwYiIsInNiIiwibWVpRmlsZUNvbnRlbnQiLCJzZXJpYWxpemVUb1N0cmluZyIsIm1laUJsb2IiLCJpbWdGaWxlIiwiZ2V0RmlsZSIsIm9ubG9hZCIsImltZyIsIkltYWdlIiwiY2FudmFzIiwiZ2V0Q29udGV4dCIsIndpbGxSZWFkRnJlcXVlbnRseSIsImRyYXdJbWFnZSIsImltYWdlRGF0YSIsImdldEltYWdlRGF0YSIsImJpbmFyeVZhbHVlIiwicHV0SW1hZ2VEYXRhIiwid2hpdGVSdW5MZW5ndGhzIiwiY3VyclNwYWNlQ291bnQiLCJmaW5kU2Vjb25kTW9kZSIsImNvdW50TWFwIiwibmV3Rm9saW8iXSwibWFwcGluZ3MiOiJhQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQUtmRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZ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Qi83QixTQUFVMWtELEVBQ1YyN0UsYUFBYzdSLEVBQ2Q4UixlQUFnQm9CLEVBQ2hCbkIsVUFBV0EsR0FFYmw1RSxLQUFLbzdFLE9BQU9oNUUsS0FBSzA3RSxHQU9aLGVBQWUvN0IsR0FDcEIsTUFBTTIzQixFQUFRMTVFLEtBQUtvN0UsT0FBTzVoRSxLQUFNa2dFLEdBQVVBLEVBQU0zM0IsV0FBYUEsR0FDN0QsUUFBTzIzQixHQUFRQSxFQUFNUixVQUdoQixZQUFZbjNCLEdBQ2pCLE1BQU0zeUIsRUFBTXB2QixLQUFLbzdFLE9BQU9ySCxVQUFXMkYsR0FBU0EsRUFBTTMzQixXQUFhQSxHQUMvRC9oRCxLQUFLbzdFLE9BQU8zMUMsT0FBT3JXLEVBQUssR0FTbkIsWUFDTCxPQUFPcHZCLEtBQUtvN0UsT0FBTzNwRSxJQUFLaW9FLElBQ3RCLE1BQU0zM0IsRUFBVzIzQixFQUFNMzNCLFNBQ2pCaTNCLEVBQWVVLEVBQU1WLGFBQ3JCQyxFQUFpQlMsRUFBTVQsZUFDN0IsTUFBTyxDQUFDbDNCLEVBQVUvaEQsS0FBSzg4RSxRQUFROUQsR0FBZWg1RSxLQUFLODhFLFFBQVE3RCxNQWV4RCxRQUNMajVFLEtBQUttN0UsU0FBU1AsUUFDZDU2RSxLQUFLbzdFLE9BQU8zMUMsT0FBTyxHQUdkLFFBQ0w5aUMsUUFBUXF1QixJQUFJaHhCLEtBQUttN0UsVUFDakJ4NEUsUUFBUXF1QixJQUFJaHhCLEtBQUtvN0UsU0FLckIsVUFBZUYsRyx3UENqU0YsRUFBQWpKLGVBQ1QseWNBVVMsRUFBQUYsa0JBQ1QsaTNCQWtCUyxFQUFBSixpQkFDVCxvcEJBY1MsRUFBQUMscUJBQ1Qsc2JBVVMsRUFBQUUsb0JBQ1QsaTNCQWtCUyxFQUFBRCxtQkFDVCw2YkFVUyxFQUFBRyxtQkFDVCxvT0FNUyxFQUFBUCxrQkFDVCIsImZpbGUiOiJkYXNoYm9hcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gODgpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0eXBlcyA9IFtcbiAgcmVxdWlyZSgnLi9uZXh0VGljaycpLFxuICByZXF1aXJlKCcuL3F1ZXVlTWljcm90YXNrJyksXG4gIHJlcXVpcmUoJy4vbXV0YXRpb24uanMnKSxcbiAgcmVxdWlyZSgnLi9tZXNzYWdlQ2hhbm5lbCcpLFxuICByZXF1aXJlKCcuL3N0YXRlQ2hhbmdlJyksXG4gIHJlcXVpcmUoJy4vdGltZW91dCcpXG5dO1xudmFyIGRyYWluaW5nO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG52YXIgcXVldWUgPSBbXTtcbnZhciBzY2hlZHVsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRyYWluaW5nID0gZmFsc2U7XG4gIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gIH1cbiAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgIG5leHRUaWNrKCk7XG4gIH1cbn1cblxuLy9uYW1lZCBuZXh0VGljayBmb3IgbGVzcyBjb25mdXNpbmcgc3RhY2sgdHJhY2VzXG5mdW5jdGlvbiBuZXh0VGljaygpIHtcbiAgaWYgKGRyYWluaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNjaGVkdWxlZCA9IGZhbHNlO1xuICBkcmFpbmluZyA9IHRydWU7XG4gIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICB3aGlsZSAobGVuKSB7XG4gICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgcXVldWUgPSBbXTtcbiAgICB3aGlsZSAoY3VycmVudFF1ZXVlICYmICsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgIH1cbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICB9XG4gIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gIHF1ZXVlSW5kZXggPSAtMTtcbiAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxudmFyIHNjaGVkdWxlRHJhaW47XG52YXIgaSA9IC0xO1xudmFyIGxlbiA9IHR5cGVzLmxlbmd0aDtcbndoaWxlICgrK2kgPCBsZW4pIHtcbiAgaWYgKHR5cGVzW2ldICYmIHR5cGVzW2ldLnRlc3QgJiYgdHlwZXNbaV0udGVzdCgpKSB7XG4gICAgc2NoZWR1bGVEcmFpbiA9IHR5cGVzW2ldLmluc3RhbGwobmV4dFRpY2spO1xuICAgIGJyZWFrO1xuICB9XG59XG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgdGhpcy5mdW4gPSBmdW47XG4gIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZ1biA9IHRoaXMuZnVuO1xuICB2YXIgYXJyYXkgPSB0aGlzLmFycmF5O1xuICBzd2l0Y2ggKGFycmF5Lmxlbmd0aCkge1xuICBjYXNlIDA6XG4gICAgcmV0dXJuIGZ1bigpO1xuICBjYXNlIDE6XG4gICAgcmV0dXJuIGZ1bihhcnJheVswXSk7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdLCBhcnJheVsxXSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdLCBhcnJheVsxXSwgYXJyYXlbMl0pO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiBmdW4uYXBwbHkobnVsbCwgYXJyYXkpO1xuICB9XG5cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGltbWVkaWF0ZTtcbmZ1bmN0aW9uIGltbWVkaWF0ZSh0YXNrKSB7XG4gIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgfVxuICBxdWV1ZS5wdXNoKG5ldyBJdGVtKHRhc2ssIGFyZ3MpKTtcbiAgaWYgKCFzY2hlZHVsZWQgJiYgIWRyYWluaW5nKSB7XG4gICAgc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBzY2hlZHVsZURyYWluKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlY29yZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vRXJyb3JMb2cnO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSAnLi9yYW5kb20nO1xuXG50eXBlIE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ3N1Y2Nlc3MnO1xuXG5jb25zdCBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25bXSA9IG5ldyBBcnJheSgwKTtcbmxldCBjdXJyZW50TW9kZU1lc3NhZ2U6IE5vdGlmaWNhdGlvbiA9IG51bGw7XG5cbi8qKlxuICogTnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgdG8gZGlzcGxheSBhdCBhIHRpbWUuXG4gKi9cbmNvbnN0IE5VTUJFUl9UT19ESVNQTEFZID0gMztcblxuLyoqXG4gKiBOdW1iZXIgb2Ygbm90aWZpY2F0aW9ucyB0byBkaXNwbGF5IGF0IGEgdGltZS5cbiAqL1xuY29uc3QgVElNRU9VVCA9IDUwMDA7XG5cbmNvbnN0IG5vdGlmaWNhdGlvbkljb246IFJlY29yZDxOb3RpZmljYXRpb25UeXBlLCBzdHJpbmc+ID0ge1xuICBkZWZhdWx0OiAnJyxcbiAgd2FybmluZzogJ+KaoO+4jyAnLFxuICBlcnJvcjogJ/CflLQgJyxcbiAgc3VjY2VzczogJ+KchSAnLFxufTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIG1hbmFnZSBOZW9uIG5vdGlmaWNhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRpc3BsYXllZDogYm9vbGVhbjtcbiAgaWQ6IHN0cmluZztcbiAgaXNNb2RlTWVzc2FnZTogYm9vbGVhbjtcbiAgbG9nSW5mbzogc3RyaW5nO1xuICB0aW1lb3V0SUQ6IG51bWJlcjtcbiAgdHlwZTogTm90aWZpY2F0aW9uVHlwZTtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBub3RpZmljYXRpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gTm90aWZpY2F0aW9uIGNvbnRlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBOb3RpZmljYXRpb25UeXBlLCBsb2dJbmZvOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbm90aWZpY2F0aW9uSWNvblt0eXBlXSArIG1lc3NhZ2U7XG4gICAgdGhpcy5kaXNwbGF5ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5pc01vZGVNZXNzYWdlID0gbWVzc2FnZS5zZWFyY2goJ01vZGUnKSAhPT0gLTE7XG4gICAgdGhpcy5sb2dJbmZvID0gbG9nSW5mbztcbiAgICB0aGlzLnRpbWVvdXRJRCA9IC0xO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBJRCBmcm9tIHNldFRpbWVvdXQuICovXG4gIHNldFRpbWVvdXRJZCAoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudGltZW91dElEID0gTWF0aC5tYXgoaWQsIC0xKTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IHRoZSBOb3RpZmljYXRpb24uICovXG4gIGRpc3BsYXkgKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgVVVJRCBmb3IgdGhpcyBub3RpZmljYXRpb24uXG4gICAqL1xuICBnZXRJZCAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIHRoZSBub3RpZmljYXRpb25cbiAqIEBwYXJhbSBjdXJyZW50SWQgLSBUaGUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBjbGVhcmVkLlxuICovXG5mdW5jdGlvbiBjbGVhck5vdGlmaWNhdGlvbiAoY3VycmVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGN1cnJlbnRJZCkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjdXJyZW50SWQpLnJlbW92ZSgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBhIG5vdGlmaWNhdGlvbi5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gdG8gZGlzcGxheS5cbiAqL1xuZnVuY3Rpb24gZGlzcGxheU5vdGlmaWNhdGlvbiAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgLy8gTm90IHN1cmUgd2hhdCBpdCBkb2VzLCBtYXliZSByZWxhdGVkIHRvIHJvZGFuL25lb25cbiAgaWYgKG5vdGlmaWNhdGlvbi5pc01vZGVNZXNzYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRNb2RlTWVzc2FnZSA9PT0gbnVsbCkge1xuICAgICAgY3VycmVudE1vZGVNZXNzYWdlID0gbm90aWZpY2F0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGN1cnJlbnRNb2RlTWVzc2FnZS50aW1lb3V0SUQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgdG9wIG5vdGlmaWNhdGlvbiBpZiBleGNlZWRzIG1heG1pbXVtXG4gIG5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICBpZiAobm90aWZpY2F0aW9ucy5sZW5ndGggPiBOVU1CRVJfVE9fRElTUExBWSkge1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gbm90aWZpY2F0aW9ucy5zaGlmdCgpO1xuICAgIGNsZWFyTm90aWZpY2F0aW9uKHRvUmVtb3ZlLmdldElkKCkpO1xuICB9XG4gIGNvbnN0IG5vdGlmaWNhdGlvbkNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWNvbnRlbnQnKTtcbiAgY29uc3QgbmV3Tm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld05vdGlmaWNhdGlvbi5jbGFzc0xpc3QuYWRkKCduZW9uLW5vdGlmaWNhdGlvbicpO1xuICBuZXdOb3RpZmljYXRpb24uY2xhc3NMaXN0LmFkZChgbmVvbi1ub3RpZmljYXRpb24tJHtub3RpZmljYXRpb24udHlwZX1gKTtcbiAgbmV3Tm90aWZpY2F0aW9uLmlkID0gbm90aWZpY2F0aW9uLmdldElkKCk7XG4gIG5ld05vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSBub3RpZmljYXRpb24ubWVzc2FnZTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5hcHBlbmQobmV3Tm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIG5vdGlmaWNhdGlvbi5kaXNwbGF5KCk7XG59XG5cbi8qKlxuICogU3RhcnQgZGlzcGxheWluZyBub3RpZmljYXRpb25zLiBDYWxsZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gc3RhcnROb3RpZmljYXRpb24gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gIGRpc3BsYXlOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uLnNldFRpbWVvdXRJZChcbiAgICB3aW5kb3cuc2V0VGltZW91dChjbGVhck5vdGlmaWNhdGlvbiwgVElNRU9VVCwgbm90aWZpY2F0aW9uLmdldElkKCkpXG4gICk7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKG5vdGlmaWNhdGlvbi5nZXRJZCgpKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQobm90aWZpY2F0aW9uLnRpbWVvdXRJRCk7XG4gICAgICBjbGVhck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZ2V0SWQoKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQWRkIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBxdWV1ZS5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlTm90aWZpY2F0aW9uIChub3RpZmljYXRpb25Db250ZW50OiBzdHJpbmcsIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcsIGxvZ0luZm86IHN0cmluZyA9IG51bGwpOiB2b2lkIHtcbiAgY29uc3Qgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Db250ZW50LCB0eXBlLCBsb2dJbmZvKTtcblxuICBpZiAobm90aWZpY2F0aW9uLnR5cGUgPT0gJ2Vycm9yJyB8fCBub3RpZmljYXRpb24udHlwZSA9PSAnd2FybmluZycpIHtcbiAgICByZWNvcmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgfVxuXG4gIHN0YXJ0Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgcXVldWVOb3RpZmljYXRpb24gfTtcbiIsImltcG9ydCB7IEdyb3VwaW5nVHlwZSwgU2VsZWN0aW9uVHlwZSwgVXNlclR5cGUsIEluc2VydFR5cGUsIEluc2VydFRhYlR5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogVGhlIG9uZSBpbnN0YW5jZSBvZiBMb2NhbFNldHRpbmdzIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGFuZFxuICogdXNlZCBieSB0aGUgZWRpdG9yLlxuICogXG4gKiBVc2UgdGhlIGZ1bmN0aW9ucyBgZ2V0U2V0dGluZ3MoKWAgYW5kIGBzZXRTZXR0aW5ncygpYFxuICogdG8gYWNjZXNzIHRoaXMgaW5zdGFuY2UuXG4gKi9cbmxldCBsb2NhbFNldHRpbmdzOiBMb2NhbFNldHRpbmdzID0gbnVsbDtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBzZXR0aW5ncyBmb3IgZWFjaCBmb2xpb1xuICogc3RvcmVkIGluIGxvY2FsU3RvcmFnZS5cbiAqXG4gKiBFdmVyeSBrZXkgaXMgb3B0aW9uYWwgc28gdGhhdCB0aGlzIHNhbWUgdHlwaW5nXG4gKiBjYW4gYmUgdXNlZCBmb3IgYHNldFNldHRpbmdzKClgIC8gYExvY2FsU2V0dGluZ3Muc2V0KClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcbiAgem9vbTogbnVtYmVyO1xuICBnbHlwaE9wYWNpdHk6IG51bWJlcjtcbiAgaW1hZ2VPcGFjaXR5OiBudW1iZXI7XG4gIGNpcmNsZVNpemU6IG51bWJlcjtcbiAgaGlnaGxpZ2h0TW9kZTogR3JvdXBpbmdUeXBlO1xuICB1c2VyTW9kZTogVXNlclR5cGU7XG4gIGluc2VydE1vZGU6IEluc2VydFR5cGU7XG4gIGluc2VydFRhYjogSW5zZXJ0VGFiVHlwZTtcbiAgc2VsZWN0aW9uTW9kZTogU2VsZWN0aW9uVHlwZTtcbiAgZGVidWdNb2RlOiBib29sZWFuO1xuICBkaXNwbGF5QkJveDogYm9vbGVhbjtcbiAgZGlzcGxheVRleHQ6IGJvb2xlYW47XG4gIGRpc3BsYXlJbmZvOiBib29sZWFuO1xuICBkaXNwbGF5RXJyTG9nOiBib29sZWFuO1xuICB2aWV3Qm94OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBzZXR0aW5ncywgd2hpY2ggc2hvdWxkIGJlIHNldCBmb3IgYSBmb2xpbyB3aXRoIG5vXG4gKiBsb2NhbFN0b3JhZ2UgdmFsdWUuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgdXBkYXRlZCBhbG9uZ3NpZGUgdGhlIGludGVyZmFjZSBgU2V0dGluZ3NgXG4gKiBhbnkgdGltZSB3ZSB3YW50IHRvIGFkZCBhIG5ldyBzZXR0aW5nIHRvIHN0b3JlIGluIGxvY2FsU3RvcmFnZS5cbiAqL1xuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XG4gIHpvb206IDEwMCxcbiAgZ2x5cGhPcGFjaXR5OiAxMDAsXG4gIGltYWdlT3BhY2l0eTogMTAwLFxuICBjaXJjbGVTaXplOiAyNSxcbiAgaGlnaGxpZ2h0TW9kZTogJ25vbmUnLFxuICB1c2VyTW9kZTogJ2VkaXQnLFxuICBpbnNlcnRNb2RlOiAncHVuY3R1bScsXG4gIGluc2VydFRhYjogJ3ByaW1pdGl2ZVRhYicsXG4gIHNlbGVjdGlvbk1vZGU6ICdzZWxCeVN5bGxhYmxlJyxcbiAgZGVidWdNb2RlOiBmYWxzZSxcbiAgZGlzcGxheUJCb3g6IGZhbHNlLFxuICBkaXNwbGF5VGV4dDogZmFsc2UsXG4gIGRpc3BsYXlJbmZvOiBmYWxzZSxcbiAgZGlzcGxheUVyckxvZzogZmFsc2UsXG4gIHZpZXdCb3g6IG51bGxcbn07XG5cbmNsYXNzIExvY2FsU2V0dGluZ3Mge1xuICBpZDogc3RyaW5nO1xuICBzZXR0aW5nczogU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IgKGZvbGlvSWQ6IHN0cmluZykge1xuICAgIGxvY2FsU2V0dGluZ3MgPSB0aGlzO1xuICAgIHRoaXMuaWQgPSBmb2xpb0lkO1xuICAgIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2UsIGFuZCBzeW5jIGxvYWRlZCBzZXR0aW5ncyB3aXRoXG4gICAqIG5ldyBmaWVsZHMgdGhhdCBtYXkgbm90IGJlIGluIGxvY2FsU3RvcmFnZS5cbiAgICovXG4gIGxvYWQgKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQ6IFBhcnRpYWw8U2V0dGluZ3M+ID0gSlNPTi5wYXJzZSh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5pZCkpO1xuICAgICAgdGhpcy5zeW5jKHN0b3JlZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSB2YWx1ZSBpcyBub3QgYSBKU09OIG9iamVjdCAoZm9yIGluc3RhbmNlLCBhbiBlbXB0eSBzdHJpbmcpLFxuICAgICAgLy8gYSBTeW50YXhFcnJvciB3aWxsIGJlIHRocm93bi4gV2UgbXVzdCBoYW5kbGUgaXQgYnkgY2FsbGluZyBzeW5jKClcbiAgICAgIC8vIHdpdGggYW4gZW1wdHkgSlNPTiBvYmplY3QuXG4gICAgICB0aGlzLnN5bmMoe30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbmV3IGZpZWxkcyBpbiBsb2NhbFN0b3JhZ2UsIGFzIGEgXCJ1bmlvblwiIG9mIG9sZCBhbmQgbmV3IHNldHRpbmdzLlxuICAgKi9cbiAgc2V0IChwYXJhbXM6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4udGhpcy5zZXR0aW5ncywgLi4ucGFyYW1zIH07XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2V0dGluZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHNldHRpbmdzIHRoYXQgbWF5IG5vdCBiZSBpbmNsdWRlZCBpbiB1c2VyJ3MgbG9jYWxTdG9yYWdlLFxuICAgKiBzdWNoIGFzIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBsb2NhbFN0b3JhZ2UgaW4gYSBuZXdcbiAgICogdXBkYXRlIG9mIE5lb24uXG4gICAqL1xuICBzeW5jIChzdG9yZWQ6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4uREVGQVVMVF9TRVRUSU5HUywgLi4uc3RvcmVkIH07XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2V0dGluZ3MpKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBsb2NhbFN0b3JhZ2Ugc2V0dGluZ3MgZm9yIHRoZSBmb2xpby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzICgpOiBTZXR0aW5ncyB7XG4gIHJldHVybiBsb2NhbFNldHRpbmdzLnNldHRpbmdzO1xufVxuXG4vKipcbiAqIFNldCBzcGVjaWZpYyBsb2NhbFN0b3JhZ2Ugc2V0dGluZ3MgZm9yIHRoZSBmb2xpby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNldHRpbmdzIChwYXJhbXM6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gIGxvY2FsU2V0dGluZ3Muc2V0KHBhcmFtcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvY2FsU2V0dGluZ3M7XG4iLCJpbXBvcnQgKiBhcyBDb2xvciBmcm9tICcuL0NvbG9yJztcbmltcG9ydCB7IHVwZGF0ZUhpZ2hsaWdodCB9IGZyb20gJy4uL0Rpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMnO1xuaW1wb3J0ICogYXMgR3JvdXBpbmcgZnJvbSAnLi4vU3F1YXJlRWRpdC9Hcm91cGluZyc7XG5pbXBvcnQgeyByZXNpemUgfSBmcm9tICcuL1Jlc2l6ZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBzZWxlY3Rpb24gbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25UeXBlKCk6IFNlbGVjdGlvblR5cGUge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsLWJ5IGlzLWFjdGl2ZScpO1xuICBpZiAoZWxlbWVudC5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gZWxlbWVudFswXS5pZCBhcyBTZWxlY3Rpb25UeXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVW5zZWxlY3QgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGFuZCBydW4gdW5kbyBhbnkgZXh0cmFcbiAqIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNlbGVjdCgpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvckFsbCgnLm5vLW1vdmluZycpXG4gICAgLmZvckVhY2goKHNlbGVjdGVkOiBTVkdHRWxlbWVudCkgPT4gc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnbm8tbW92aW5nJykpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKS5mb3JFYWNoKChzZWxlY3RlZDogU1ZHR0VsZW1lbnQpID0+IHtcbiAgICBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIGlmIChzZWxlY3RlZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIHNlbGVjdGVkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIENvbG9yLnVuaGlnaGxpZ2h0KHNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgc2VsZWN0ZWQuc3R5bGUuZmlsbCA9ICcnO1xuICAgIH1cblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgIChkaXZMaW5lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBkaXZMaW5lLnN0eWxlLnN0cm9rZSA9ICcnO1xuICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykpLmZvckVhY2goXG4gICAgICAobmV1bWU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKSkuZm9yRWFjaChcbiAgICAgIChzeWxSZWN0OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBzeWxSZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJykpIHtcbiAgICAgIHNlbGVjdGVkLnBhcmVudEVsZW1lbnQuc3R5bGUuZmlsbCA9ICcnO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzeWxsYWJsZScpO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzeWxsYWJsZS1oaWdobGlnaHRlZCcpO1xuXG4gICAgICBBcnJheS5mcm9tKHNlbGVjdGVkLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgICAgKGRpdkxpbmU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgZGl2TGluZS5zdHlsZS5zdHJva2UgPSAnJztcbiAgICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKSkuZm9yRWFjaChcbiAgICAgICAgKG5ldW1lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcucm90YXRlUG9pbnQnKS5yZW1vdmUoKTtcbiAgfSk7XG5cbiAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGV4dC1zZWxlY3QnKSkuZm9yRWFjaChcbiAgICAoZWw6IFNWR0VsZW1lbnQpID0+IHtcbiAgICAgIGVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gJyc7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0ZXh0LXNlbGVjdCcpO1xuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICBHcm91cGluZy5lbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICB9XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIHVwZGF0ZUhpZ2hsaWdodCgpO1xufVxuXG4vKipcbiAqIFNlbGVjdCBhIHN0YWZmIGVsZW1lbnQuXG4gKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgZWxlbWVudCBpbiB0aGUgRE9NLlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gVGhlIGRyYWcgaGFuZGxlciBpbiB1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTdGFmZihcbiAgc3RhZmY6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGFmZi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzdGFmZi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIENvbG9yLnVuaGlnaGxpZ2h0KHN0YWZmKTtcbiAgICBDb2xvci5oaWdobGlnaHQoc3RhZmYsICcjZDAwJyk7XG4gICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk7XG4gICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCBhIGxheWVyIGVsZW1lbnQuXG4gKiBAcGFyYW0gbGF5ZXJFbGVtZW50IC0gVGhlIGxheWVyIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIFRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0TGF5ZXJFbGVtZW50KFxuICBsYXllckVsZW1lbnQ6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFsYXllckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgbGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgQ29sb3IudW5oaWdobGlnaHQobGF5ZXJFbGVtZW50KTtcbiAgICBDb2xvci5oaWdobGlnaHQobGF5ZXJFbGVtZW50LCAnI2QwMCcpO1xuICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmljIHNlbGVjdCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBlbCAtIEVsZW1lbnQgdG8gc2VsZWN0LlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gT25seSB1c2VkIGZvciBzdGF2ZXMuXG4gKiBAcGFyYW0gbmVlZHNIaWdobGlnaHRVcGRhdGUgLSBXaGV0aGVyIGFsbCB0aGUgZ3JvdXAncyBoaWdobGlnaHRzIHNob3VsZCBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoXG4gIGVsOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyPzogRHJhZ0hhbmRsZXIsXG4gIG5lZWRzSGlnaGxpZ2h0VXBkYXRlID0gdHJ1ZSxcbik6IHZvaWQge1xuICAvLyBJZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBleGl0XG4gIGlmICghZWwpIHJldHVybjtcblxuICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSB7XG4gICAgcmV0dXJuIHNlbGVjdFN0YWZmKGVsLCBkcmFnSGFuZGxlcik7XG4gIH1cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbGF5ZXInKSkge1xuICAgIHJldHVybiBzZWxlY3RMYXllckVsZW1lbnQoZWwsIGRyYWdIYW5kbGVyKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpICYmXG4gICAgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsVGV4dFJlY3QnKSAmJlxuICAgICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bFRleHRSZWN0LWRpc3BsYXknKVxuICApIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIC8vIHNldCBmaWxsIHRvIHJlZFxuICAgIC8vIHNldCBzdHJva2UgdG8gcmVkIG9ubHkgaWYgc2VsZWN0ZWQgZWxlbSBpcyBhIGRpdkxpbmVcbiAgICBlbC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgIGVsLnN0eWxlLnN0cm9rZSA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpID8gJyNkMDAnIDogJ2JsYWNrJztcblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKFxuICAgICAgICAoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtLnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtLnN0eWxlLnN0cm9rZSA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW0uc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNldCBjb2xvciBvZiB0aGUgY29ycmVzcG9uZGluZyB0ZXh0IGluIHRoZSB0ZXh0IHBhbmVsIHRvIHJlZFxuICAgIGxldCBzeWxJZDtcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSB7XG4gICAgICBzeWxJZCA9IGVsLmlkO1xuICAgIH0gZWxzZSBpZiAoZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykgIT09IG51bGwpIHtcbiAgICAgIHN5bElkID0gZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykuaWQ7XG4gICAgfVxuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uJyArIHN5bElkKTtcbiAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnI2QwMCc7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LXNlbGVjdCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChuZWVkc0hpZ2hsaWdodFVwZGF0ZSkge1xuICAgIHVwZGF0ZUhpZ2hsaWdodCgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGFuIG5jLlxuICogQHBhcmFtIGVsIC0gVGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE5jcyhcbiAgZWw6IFNWR0dyYXBoaWNzRWxlbWVudCxcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFlbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgdW5zZWxlY3QoKTtcbiAgICBzZWxlY3QocGFyZW50KTtcbiAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShwYXJlbnQsIG5lb25WaWV3KSkge1xuICAgICAgY29uc3QgcHJldk5jID0gcGFyZW50LnByZXZpb3VzU2libGluZyBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgIGlmIChhd2FpdCBpc0xpZ2F0dXJlKHByZXZOYywgbmVvblZpZXcpKSB7XG4gICAgICAgIHNlbGVjdChwcmV2TmMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dE5jID0gcGFyZW50Lm5leHRTaWJsaW5nIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShuZXh0TmMsIG5lb25WaWV3KSkge1xuICAgICAgICAgIHNlbGVjdChuZXh0TmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3I6IE5laXRoZXIgcHJldiBvciBuZXh0IG5jIGFyZSBsaWdhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCdsaWdhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnbmMnKSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmNBY3Rpb25zKHBhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gYWN0aW9uIHRyaWdnZXJlZCEnKTtcbiAgICB9XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBuYyAtIFRoZSBuZXVtZSBjb21wb25lbnQuXG4gKiBAcGFyYW0gbmVvblZpZXcgLSBUaGUgW1tOZW9uVmlld11dIGZvciB0aGlzIGluc3RhbmNlLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbmV1bWUgY29tcG9uZW50IGlzIHBhcnQgb2YgYSBsaWdhdHVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTGlnYXR1cmUoXG4gIG5jOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzID0gYXdhaXQgbmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoXG4gICAgbmMuaWQsXG4gICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICApO1xuICByZXR1cm4gQm9vbGVhbihhdHRyaWJ1dGVzLmxpZ2F0ZWQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGxpc3Qgb2YgZWxlbWVudHMgb2YgYSBjZXJ0YWluIHR5cGUgYXJlIGxvZ2ljYWxseSBhZGphY2VudCB0byBlYWNoIG90aGVyLlxuICogSW5jbHVkZXMgZWxlbWVudHMgdGhhdCBhcmUgb24gc2VwYXJhdGUgc3RhdmVzIGJ1dCB3b3VsZCBvdGhlcndpc2UgYmUgbmV4dCB0byBlYWNoIG90aGVyLlxuICogQ2FuIG5vdCBhcHBseSB0byBlbGVtZW50cyBvZiB0eXBlIG5ldW1lIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB1c2VyIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIG9mIGludGVyZXN0XG4gKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnRzIGFyZSBhZGphY2VudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBZGphY2VudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgLy8gMiBlbGVtZW50cyBjYW5ub3QgYmUgYWRqYWNlbnQgaWYgdGhlcmUgaXMgb25seSAxIGVsZW1lbnRcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcblxuICAvLyBnZXQgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgc2VsZWN0aW9uVHlwZVxuICBsZXQgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGU6IEhUTUxFbGVtZW50W107XG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUnKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgLy8gV2UgYXV0b21hdGljYWxseSByZXR1cm4gJ3RydWUnIGZvciBuZXVtZXMgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyIHRvIGJlXG4gICAgICAvLyBhbGxvd2VkIHRvIGdyb3VwIHR3byBuZXVtZXMgaW4gc2VwYXJhdGUgc3lsbGFiZXMgd2l0aG91dCBoYXZpbmcgdG8gcGFyZm9ybSBvdGhlclxuICAgICAgLy8gc3RlcHMgZmlyc3QuIFllcywgdGhlcmUgaXMgYSB0cmFkZS1vZmYgLSB0aGlzIGFsbG93cyB1c2VycyB0byB0cnkgYW5kIGdyb3VwIGFueVxuICAgICAgLy8gdHdvIG5vbi1hZGphY2VudCBuZXVtZXMsIGJ1dCBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBiZW5lZml0cyAoc3BlZWQgYW5kIGVmZmljaWVuY3kpXG4gICAgICAvLyBvdXR3ZWlnaCB0aGUgY29zdHMgKHVzZXIgdHJ5aW5nIGFuIGlsbGVnYWwgZWRpdCkuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYycpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gU29ydCBTRUxFQ1RFRCBlbGVtZW50cyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGJ5XG4gIC8vIG1hdGNoaW5nIHRvIG9yZGVyIG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBjb25zdCBzb3J0ZWRFbGVtZW50cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlW2ldLmlzU2FtZU5vZGUoZWxlbWVudHNbal0pKSB7XG4gICAgICAgIHNvcnRlZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyBjaGVjayBpZiBTRUxFQ1RFRCBlbGVtZW50cyBhcmUgYWxsIGFkamFjZW50IChpbiBhIHJvdykgYnlcbiAgLy8gZmluZGluZyBhbmQgY29tcGFyaW5nIHRoZWlyIGluZGVjZXMgaW4gdGhlIGFycmF5IG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGZpcnN0RWxlbSA9IHNvcnRlZEVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IHNlY29uZEVsZW0gPSBzb3J0ZWRFbGVtZW50c1tpICsgMV07XG5cbiAgICBjb25zdCBpbmRleDEgPSBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZS5pbmRleE9mKGZpcnN0RWxlbSk7XG4gICAgY29uc3QgaW5kZXgyID0gYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUuaW5kZXhPZihzZWNvbmRFbGVtKTtcblxuICAgIGlmIChNYXRoLmFicyhpbmRleDEgLSBpbmRleDIpICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgdGhlIGFycmF5IG9mIGVsZW1lbnRzIGFsbCBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudC5cbiAqIEZvciBleGFtcGxlOiBJZiBhbGwgbmV1bWVzIGFyZSBpbiB0aGUgc2FtZSBzeWxsYWJsZS5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgY3VycmVudGx5IG5vIGxvZ2ljIGZvciB0cmVhdGluZyBsYXllciBlbGVtZW50cyBhbmQgYmJveGVzIVxuICogTm90ZSEhIEZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlIGZvciBzdGF2ZSBlbGVtZW50cy4gKFNob3VsZCBpdD8/PylcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB0aGUgY3VycmVudCBOZW9uIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIGluIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBlbGVtZW50cyBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkTG9naWNhbFBhcmVudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW0pID0+XG4gICAgICAhKFxuICAgICAgICBlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGVmJylcbiAgICAgICksXG4gICk7XG5cbiAgaWYgKCFlbGVtZW50c0hhdmVDb3JyZWN0VHlwZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIGNvbnN0IHJlZmVyZW5jZVBhcmVudFN0YWZmID0gZWxlbWVudHNbMF0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmlzU2FtZU5vZGUocmVmZXJlbmNlUGFyZW50U3RhZmYpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBjb25zdCByZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSA9IGVsZW1lbnRzWzBdLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbGVtID0gZWxlbWVudHNbaV07XG4gICAgICAgIGlmICghZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKS5pc1NhbWVOb2RlKHJlZmVyZW5jZVBhcmVudFN5bGxhYmxlKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjdXJyZW50IHNlbGVjdGlvbiBtb2RlLlxuICogRm9yIGV4YW1wbGUsIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgb2YgdHlwZSBuZXVtZSwgb3Igc3lsbGFibGUsIGV0Yy5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgbm8gbG9naWMgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBsYXllciBlbGVtZW50cyBvciBiYm94ZXMuXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvblR5cGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1vZGVcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcgY2hlY2tlZFxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZWxlbWVudHMgbWF0Y2ggc2VsZWN0aW9uIG1vZGUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRzSGF2ZUNvcnJlY3RUeXBlKFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBpZiAoIWVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGlmICghZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeVN0YWZmJzpcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZWxlbWVudHMgLSBUaGUgZWxlbWVudHMgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgcGFyZW50IHVwIHR3byBsZXZlbHMsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFNlY29uZExldmVsUGFyZW50KFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGVtcEVsZW1lbnRzID0gQXJyYXkuZnJvbShlbGVtZW50cyk7XG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBFbGVtZW50cy5wb3AoKTtcbiAgY29uc3Qgc2Vjb25kUGFyZW50ID0gZmlyc3RFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRlbXBFbGVtZW50cykge1xuICAgIGNvbnN0IHNlY1BhciA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChzZWNQYXIuaWQgIT09IHNlY29uZFBhcmVudC5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB1c2VyIHNlbGVjdGVkIGVsZW1lbnRzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIHVzZXItc2VsZWN0ZWQgZWxlbWVudHNcbiAqIEByZXR1cm5zIHRydWUgaWYgc2VsZWN0aW9uIGlzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlTdGF2ZVNlbGVjdGlvbihlbGVtZW50czogU1ZHRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IGVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZiA9IGVsZW1lbnRzQXJyYXlbaV0uY2xvc2VzdCgnLnN0YWZmJyk7XG5cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGFub3RoZXJTdGFmZiA9IGVsZW1lbnRzQXJyYXlbal0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICAvLyBjb21wYXJlIHdpdGggb3RoZXIgc3RhdmVzXG4gICAgICBpZiAoIXN0YWZmLmlzU2FtZU5vZGUoYW5vdGhlclN0YWZmKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJvdW5kaW5nIGJveCBvYmplY3QgaW50ZXJmYWNlIGZvciBnZXRTdGFmZkJCb3goKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWZmQkJveCB7XG4gIGlkOiBzdHJpbmc7XG4gIHVseDogbnVtYmVyO1xuICB1bHk6IG51bWJlcjtcbiAgbHJ4OiBudW1iZXI7XG4gIGxyeTogbnVtYmVyO1xuICByb3RhdGU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJvdW5kaW5nIGJveCBvZiBhIHN0YWZmIGJhc2VkIG9uIGl0cyBzdGFmZiBsaW5lcy5cbiAqIFJvdGF0ZSBpcyBpbmNsdWRlZCBpbiByYWRpYW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhZmZCQm94KHN0YWZmOiBTVkdHRWxlbWVudCk6IFN0YWZmQkJveCB7XG4gIGxldCB1bHgsIHVseSwgbHJ4LCBscnksIHJvdGF0ZTtcbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgncGF0aCcpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb29yZGluYXRlczogbnVtYmVyW10gPSBwYXRoXG4gICAgICAuZ2V0QXR0cmlidXRlKCdkJylcbiAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgLm1hcCgoZWxlbWVudCkgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICBpZiAocm90YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbihcbiAgICAgICAgKGNvb3JkaW5hdGVzWzNdIC0gY29vcmRpbmF0ZXNbMV0pIC8gKGNvb3JkaW5hdGVzWzJdIC0gY29vcmRpbmF0ZXNbMF0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodWx5ID09PSB1bmRlZmluZWQgfHwgTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKSA8IHVseSkge1xuICAgICAgdWx5ID0gTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKTtcbiAgICB9XG4gICAgaWYgKHVseCA9PT0gdW5kZWZpbmVkIHx8IGNvb3JkaW5hdGVzWzBdIDwgdWx4KSB7XG4gICAgICB1bHggPSBjb29yZGluYXRlc1swXTtcbiAgICB9XG4gICAgaWYgKGxyeSA9PT0gdW5kZWZpbmVkIHx8IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSkgPiBscnkpIHtcbiAgICAgIGxyeSA9IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSk7XG4gICAgfVxuICAgIGlmIChscnggPT09IHVuZGVmaW5lZCB8fCBjb29yZGluYXRlc1syXSA+IGxyeCkge1xuICAgICAgbHJ4ID0gY29vcmRpbmF0ZXNbMl07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBpZDogc3RhZmYuaWQsIHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlIH07XG59XG5cbi8qKlxuICogc2VsZWN0IGEgYm91bmRpbmdib3ggZWxlbWVudFxuICogQHBhcmFtIGVsIC0gdGhlIGJib3ggKHN5bFRleHRSZWN0KSBlbGVtZW50IGluIHRoZSBET01cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIHRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCQm94KFxuICBlbDogU1ZHR3JhcGhpY3NFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IHZvaWQge1xuICBjb25zdCBiYm94ID0gZWw7XG4gIGNvbnN0IHN5bCA9IGJib3guY2xvc2VzdCgnLnN5bCcpO1xuICBpZiAoIXN5bC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzeWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBiYm94LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgY29uc3QgY2xvc2VzdCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNsb3Nlc3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICBjbG9zZXN0LmNsYXNzTGlzdC5hZGQoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG4gICAgaWYgKGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5sZW5ndGgpIHtcbiAgICAgIGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgfSk7XG4gICAgICBjbG9zZXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5zdHJva2UgPSAnI2QwMCc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmVvblZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzaXplKHN5bCBhcyBTVkdHcmFwaGljc0VsZW1lbnQsIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChkcmFnSGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgIH1cbiAgICBjb25zdCBzeWxJZCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpLmlkO1xuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzcGFuLicgKyBzeWxJZCk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNkMDAnO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgndGV4dC1zZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyQkJveEFjdGlvbnMoKTtcbn1cblxuLyoqXG4gKiBTZWxlY3Qgbm90IG5ldW1lIGVsZW1lbnRzLlxuICogQHBhcmFtIG5vdE5ldW1lcyAtIEFuIGFycmF5IG9mIG5vdCBuZXVtZXMgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RObihub3ROZXVtZXM6IFNWR0dyYXBoaWNzRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGlmIChub3ROZXVtZXMubGVuZ3RoID4gMCkge1xuICAgIG5vdE5ldW1lcy5mb3JFYWNoKChubikgPT4ge1xuICAgICAgc2VsZWN0KG5uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgc2VsZWN0aW5nIGFuIGFycmF5IG9mIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gdHlwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdEFsbChcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbiAgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNlbGVjdGlvblR5cGUgPSBnZXRTZWxlY3Rpb25UeXBlKCk7XG4gIHVuc2VsZWN0KCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHNlbGVjdGlvbkNsYXNzO1xuICBsZXQgY29udGFpbnNMYXllckVsZW1lbnRzID0gZmFsc2U7XG4gIGxldCBjb250YWluc05jID0gZmFsc2U7XG5cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3lsbGFibGUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmV1bWUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmMnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3RhZmYnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlCQm94JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5zeWxUZXh0UmVjdC1kaXNwbGF5JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5jbGVmLCAuY3VzdG9zLCAuYWNjaWQsIC5kaXZMaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlICcgKyBzZWxlY3Rpb25UeXBlKTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZ3JvdXBpbmdzIHNwZWNpZmllZCBieSBzZWxlY3Rpb25DbGFzc1xuICAvLyB0aGF0IGNvbnRhaW4gdGhlIHByb3ZpZGVkIGVsZW1lbnRzIHRvIHNlbGVjdC5cbiAgY29uc3QgZ3JvdXBzVG9TZWxlY3QgPSBuZXcgU2V0PFNWR0dFbGVtZW50PigpO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBsZXQgZ3JvdXBpbmcgPSBlbGVtZW50LmNsb3Nlc3Q8U1ZHR0VsZW1lbnQ+KHNlbGVjdGlvbkNsYXNzKTtcbiAgICBpZiAoZ3JvdXBpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGNsaWNrLXNlbGVjdGVkIGEgY2xlZiBvciBhIGN1c3RvcyBvciBhbiBhY2NpZCBvciBhIGRpdkxpbmVcbiAgICAgIGdyb3VwaW5nID0gZWxlbWVudC5jbG9zZXN0KCcuY2xlZiwgLmN1c3RvcywgLmFjY2lkLCAuZGl2TGluZScpO1xuICAgICAgaWYgKGdyb3VwaW5nID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRWxlbWVudCAnICtcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgK1xuICAgICAgICAgICAgJyBpcyBub3QgcGFydCBvZiBzcGVjaWZpZWQgZ3JvdXAgYW5kIGlzIG5vdCBhIGNsZWYgb3IgY3VzdG9zIG9yIGFjY2lkIG9yIGRpdkxpbmUuJyxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb250YWluc0xheWVyRWxlbWVudHMgPSBjb250YWluc0xheWVyRWxlbWVudHMgfHwgdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbnNOYyA9IGNvbnRhaW5zTmMgfHwgdHJ1ZTtcbiAgICB9XG4gICAgZ3JvdXBzVG9TZWxlY3QuYWRkKGdyb3VwaW5nKTtcblxuICAgIC8vIENoZWNrIGZvciBwcmVjZWRlcy9mb2xsb3dzXG4gICAgbGV0IHNlbGVjdGVkID0gZ3JvdXBpbmc7XG4gICAgbGV0IGZvbGxvd3MgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyk7XG4gICAgbGV0IHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICB3aGlsZSAoZm9sbG93cyB8fCBwcmVjZWRlcykge1xuICAgICAgaWYgKGZvbGxvd3MpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGZvbGxvd3Muc2xpY2UoMSkpO1xuICAgICAgICBpZiAoZ3JvdXBzVG9TZWxlY3QuaGFzKHNlbGVjdGVkKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkLmNsYXNzTGlzdC5hZGQoJ25vLW1vdmluZycpO1xuICAgICAgICBncm91cHNUb1NlbGVjdC5hZGQoc2VsZWN0ZWQpO1xuICAgICAgICBmb2xsb3dzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6Zm9sbG93cycpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZGVzKSB7XG4gICAgICAgIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBwcmVjZWRlcy5zbGljZSgxKSk7XG4gICAgICAgIGlmIChncm91cHNUb1NlbGVjdC5oYXMoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LmFkZCgnbm8tbW92aW5nJyk7XG4gICAgICAgIGdyb3Vwc1RvU2VsZWN0LmFkZChzZWxlY3RlZCk7XG4gICAgICAgIHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2VsZWN0IHRoZSBlbGVtZW50c1xuICBncm91cHNUb1NlbGVjdC5mb3JFYWNoKChncm91cDogU1ZHR3JhcGhpY3NFbGVtZW50KSA9PlxuICAgIHNlbGVjdChncm91cCwgZHJhZ0hhbmRsZXIsIGZhbHNlKSxcbiAgKTtcblxuICAvKiBEZXRlcm1pbmUgdGhlIGNvbnRleHQgbWVudSB0byBkaXNwbGF5IChpZiBhbnkpICovXG5cbiAgY29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbShncm91cHNUb1NlbGVjdC52YWx1ZXMoKSkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG5cbiAgLy8gSGFuZGxlIG9jY3VyYW5jZSBvZiBjbGVmIG9yIGN1c3RvcyBvciBhY2NpZCBvciBkaXZMaW5lXG4gIGlmIChjb250YWluc0xheWVyRWxlbWVudHMgJiYgIWNvbnRhaW5zTmMpIHtcbiAgICAvLyBBIGNvbnRleHQgbWVudSB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGEgc2luZ2xlIGNsZWZcbiAgICBpZiAoZ3JvdXBzVG9TZWxlY3Quc2l6ZSA9PT0gMSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhncm91cHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2VsZWN0aW9uVHlwZSA9PSAnc2VsQnlTeWxsYWJsZScpIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMoKTtcbiAgICAgICAgICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbiAgICAgICAgICByZXNpemUoZ3JvdXBzWzBdLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIGlmIChncm91cHNUb1NlbGVjdC5zaXplID09PSAxKSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckxheWVyRWxlbWVudEFjdGlvbnMoZ3JvdXBzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvLyBUT0RPIGNoYW5nZSBjb250ZXh0IGlmIGl0IGlzIG9ubHkgYSBuZXVtZS9uYy5cbiAgICAgICAgICAvLyAgQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHN5bGxhYmxlIGNvbnRhaW5zIGEgPHN5bD4gZWxlbWVudFxuICAgICAgICAgIGlmIChncm91cHNbMF0ucXVlcnlTZWxlY3RvcignLnN5bCA+IHJlY3QnKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAnVGhlIHNlbGVjdGVkIHN5bGxhYmxlIGRvZXMgbm90IGNvbnRhaW4gYSAmbHQ7c3lsJmd0OyBlbGVtZW50LCBwbGVhc2UgaW5zZXJ0IG9uZSB1c2luZyBidXR0b24gXCJBZGQgU3lsbGFibGUgVGV4dFwiLicsXG4gICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ25vU3lsJyk7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLmFkZEFkZFN5bExpc3RlbmVyKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnc2luZ2xlU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbGlua2VkIHN5bGxhYmxlIHNwbGl0IGJ5IGEgc3RhZmYgYnJlYWtcbiAgICAgICAgICAvLyBpZiB0aGV5IGFyZSBsaW5rYWJsZSwgdXNlciBjYW4gdG9nZ2xlIGxpbmtlZC1zeWxsc1xuICAgICAgICAgIGlmIChHcm91cGluZy5pc0xpbmthYmxlKCdzZWxCeVN5bGxhYmxlJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdsaW5rYWJsZVNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBzeWxsYWJsZXMgYXJlIGFsbCBsb2NhdGVkIG9uIG9uZSBzdGF2ZSwgdGhleSBzaG91bGQgYmUgZ3JvdXBhYmxlXG4gICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcuaXNHcm91cGFibGUoJ3NlbEJ5U3lsbGFibGUnLCBncm91cHMpKSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ211bHRpU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHN5bGxzIGFyZSBhY2Nyb3NzIG11bHRpcGxlIHN0YXZlc1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdkZWZhdWx0Jyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIHN3aXRjaCAoZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gVE9ETyBjaGFuZ2UgY29udGV4dCBpZiBpdCBpcyBvbmx5IGEgbmMuXG4gICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmV1bWVBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKEdyb3VwaW5nLmlzR3JvdXBhYmxlKCdzZWxCeU5ldW1lJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduZXVtZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck5jQWN0aW9ucyhncm91cHNbMF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHNoYXJlZFNlY29uZExldmVsUGFyZW50KGdyb3VwcykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgc2VsZWN0aW9uIGlzIGEgbGlnYXR1cmUgb3IgY2FuIGJlIGEgbGlnYXR1cmVcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXNlIG5ldW1lIGNvbXBvbmVudHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgbmV1bWVcbiAgICAgICAgICAgIGlmIChncm91cHNbMF0ucGFyZW50RWxlbWVudCA9PT0gZ3JvdXBzWzFdLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGdyb3Vwc1swXS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcblxuICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IG5ldW1lIGNvbXBvbmVudHMgYXJlIGFkamFjZW50XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzBdKSAtIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzFdKSxcbiAgICAgICAgICAgICAgICApID09PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2Vjb25kIG5ldW1lIGNvbXBvbmVudCBpcyBsb3dlciB0aGFuIGZpcnN0LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgb3JkZXIgaW4gdGhlIGxpc3QgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGVcbiAgICAgICAgICAgICAgICAvLyBvcmRlciBieSB4LXBvc2l0aW9uLlxuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DID0gZ3JvdXBzWzBdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZE5DID0gZ3JvdXBzWzFdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQ1ggPSBmaXJzdE5DLnguYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2Vjb25kTkNYID0gc2Vjb25kTkMueC5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DWSA9IGZpcnN0TkMueS5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBzZWNvbmROQ1kgPSBzZWNvbmROQy55LmJhc2VWYWwudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAvLyBvcmRlciBuYydzIGJ5IHggY29vcmQgKGxlZnQgdG8gcmlnaHQpXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ggPiBzZWNvbmROQ1ggfHxcbiAgICAgICAgICAgICAgICAgIChmaXJzdE5DWCA9PT0gc2Vjb25kTkNYICYmIGZpcnN0TkNZIDwgc2Vjb25kTkNZKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgW2ZpcnN0TkMsIHNlY29uZE5DXSA9IFtzZWNvbmROQywgZmlyc3ROQ107XG4gICAgICAgICAgICAgICAgICBbZmlyc3ROQ1gsIGZpcnN0TkNZLCBzZWNvbmROQ1gsIHNlY29uZE5DWV0gPSBbXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZE5DWCxcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kTkNZLFxuICAgICAgICAgICAgICAgICAgICBmaXJzdE5DWCxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ksXG4gICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIHN0YWNrZWQgbmMncy9saWdhdHVyZSAoaWRlbnRpY2FsIHgpLCBvciBkZXNjZW5kaW5nIG5jJ3MgKHkgZGVzY2VuZHMpXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0TkNYID09PSBzZWNvbmROQ1ggfHwgZmlyc3ROQ1kgPCBzZWNvbmROQ1kpIHtcbiAgICAgICAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbGlnYXR1cmUnKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoc2hhcmVkU2Vjb25kTGV2ZWxQYXJlbnQoZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5QkJveCc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHNlbGVjdEJCb3goZ3JvdXBzWzBdLCBkcmFnSGFuZGxlciwgbmVvblZpZXcpO1xuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckJCb3hBY3Rpb25zKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHNlbGVjdEJCb3goZywgZHJhZ0hhbmRsZXIsIHVuZGVmaW5lZCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gc2VsZWN0aW9uIHR5cGUuIFRoaXMgc2hvdWxkIG5vdCBoYXZlIG9jY3VycmVkLicpO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gY2hhbmdlU3RhZmZMaXN0ZW5lcigpOiB2b2lkIHtcbiAgLy8gdHJ5IHtcbiAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYW5nZVN0YWZmJylcbiAgLy8gLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgU2VsZWN0T3B0aW9ucy5jaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICAvLyB9IGNhdGNoIChlKSB7Y29uc29sZS5kZWJ1ZyhlKTt9XG4gIC8vIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBhcmdzQXJyYXk7XG5cbmZ1bmN0aW9uIGFyZ3NBcnJheShmdW4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgdmFyIGkgPSAtMTtcbiAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW4uY2FsbCh0aGlzLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bi5jYWxsKHRoaXMsIFtdKTtcbiAgICB9XG4gIH07XG59IiwibW9kdWxlLmV4cG9ydHMgPSBkMzsiLCIvKipcbiAqIEhUTUwgZm9yIGVhY2ggaW5zZXJ0IHRhYiAobmV1bWUsIGdyb3VwaW5nLCBjbGVmLCBzeXN0ZW0sIGFuZCBkaXZpc2lvbikuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRUYWJIdG1sOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBwcmltaXRpdmVUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInB1bmN0dW1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicHVuY3R1bVwiIHRpdGxlPVwicHVuY3R1bVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcHVuY3R1bS5wbmdcIiBjbGFzcz1cImltYWdlXCIvPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidmlyZ2FcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidmlyZ2FcIiB0aXRsZT1cInZpcmdhXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy92aXJnYS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ2aXJnYVJldmVyc2VkXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIlJldmVyc2VkIFZpcmdhXCIgdGl0bGU9XCJSZXZlcnNlZCBWaXJnYVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdmlyZ2FfcmV2ZXJzZWQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlhbW9uZFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJpbmNsaW5hdHVtXCIgdGl0bGU9XCJpbmNsaW5hdHVtXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9kaWFtb25kLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImN1c3Rvc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjdXN0b3NcIiB0aXRsZT1cImN1c3Rvc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY3VzdG9zLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNDbGVmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkMgQ2xlZlwiIHRpdGxlPVwiIEMgQ2xlZlwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY0NsZWYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZkNsZWZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRiBDbGVmXCIgdGl0bGU9XCJGIENsZWZcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ZDbGVmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImxpcXVlc2NlbnRBXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkxpcXVlc2NlbnQgQVwiIHRpdGxlPVwiTGlxdWVzY2VudCBBXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9saXF1ZXNjZW50QS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJsaXF1ZXNjZW50Q1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJMaXF1ZXNjZW50IENcIiB0aXRsZT1cIkxpcXVlc2NlbnQgQ1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbGlxdWVzY2VudEMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZmxhdFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJGbGF0XCIgdGl0bGU9XCJGbGF0XCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZEZsYXQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibmF0dXJhbFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJOYXR1cmFsXCIgdGl0bGU9XCJOYXR1cmFsXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZE5hdHVyYWwucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGl2TGluZU1heGltYVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJEaXZMaW5lIE1heGltYVwiIHRpdGxlPVwiRGl2TGluZSBNYXhpbWFcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2RpdmlzaW8ucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+YCxcbiAgZ3JvdXBpbmdUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInBlc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwZXNcIiB0aXRsZT1cInBlc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcGVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaXZpc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjbGl2aXNcIiB0aXRsZT1cImNsaXZpc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpdmlzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNjYW5kaWN1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJzY2FuZGljdXNcIiB0aXRsZT1cInNjYW5kaWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc2NhbmRpY3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaW1hY3VzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cImNsaW1hY3VzXCIgdGl0bGU9XCJjbGltYWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpbWFjdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG9yY3VsdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidG9jdWx1c1wiIHRpdGxlPVwidG9jdWx1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdG9yY3VsdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicG9ycmVjdHVzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInBvcnJlY3R1c1wiIHRpdGxlPVwicG9ycmVjdHVzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wb3JyZWN0dXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicHJlc3N1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwcmVzc3VzXCIgdGl0bGU9XCJwcmVzc3VzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wcmVzc3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPmAsXG4gIHN5c3RlbVRhYjogYDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3RhZmZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIGxvbmdlbFwiIGFyaWEtbGFiZWw9XCJzeXN0ZW1cIiB0aXRsZT1cInN5c3RlbVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc3RhZmYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPkNsaWNrIHVwcGVyIGxlZnQgYW5kIGxvd2VyIHJpZ2h0IGNvcm5lcnMgb2YgbmV3IHN0YWZmLjwvcD5gLFxuICAvLyBkaXZpc2lvblRhYjogXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nc21hbGxEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9zbWFsbGRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyAgICAgXCI8YnV0dG9uIGlkPSdtaW5vckRpdicgY2xhc3M9J3NpZGUtcGFuZWwtYnRuIGluc2VydGVsIHRhbGxlbCc+PGltZyBzcmM9J1wiICsgX19BU1NFVF9QUkVGSVhfXyArICdhc3NldHMvaW1nL21pbm9yZGl2LnBuZ1wiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyAgICAgXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nbWFqb3JEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9tYWpvcmRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J2ZpbmFsRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvZmluYWxkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCJcbn07XG5cbi8qKlxuICogU3RydWN0dXJlIG9mIGluc2VydCBwYW5lbCB3aXRoIGJhc2ljIGdyb3VwaW5nIHRhYnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRDb250cm9sc1BhbmVsID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJpbnNlcnRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlXCI+SU5TRVJUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUluc2VydFwiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblx0PGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwicHJpbWl0aXZlVGFiXCIgY2xhc3M9XCJpbnNlcnRUYWJcIj5QcmltaXRpdmUgRWxlbWVudHM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJncm91cGluZ1RhYlwiIGNsYXNzPVwiaW5zZXJ0VGFiXCI+R3JvdXBpbmc8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJzeXN0ZW1UYWJcIiBjbGFzcz1cImluc2VydFRhYlwiPlN5c3RlbTwvYT5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRfZGF0YVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGVkaXQgcGFuZWwgd2l0aCBidXR0b25zLlxuICovXG5leHBvcnQgY29uc3QgZWRpdENvbnRyb2xzUGFuZWwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiBpZD1cImVkaXRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlIGZvY3VzZWRcIj5FRElUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUVkaXRcIiB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImVkaXRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VsZWN0aW9uLW1vZGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXN1Yi10aXRsZVwiPlNlbGVjdGlvbiBNb2RlOjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWxlY3Rpb24tbW9kZS1idG5zLWNvbnRhaW5lclwiICBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5U3lsbGFibGVcIj5TeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlOZXVtZVwiPk5ldW1lPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeU5jXCI+TmV1bWUgQ29tcG9uZW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeVN0YWZmXCI+U3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5TGF5ZXJFbGVtZW50XCI+TGF5ZXIgRWxlbWVudDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cIm1vcmVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImV4dHJhRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgICAgICogVGhlIGV4dHJhRWRpdCBwYW5lbCBpcyBhZGRlZCBmb3IgZWRpdCBvcHRpb25zIHRoYXQgaGF2ZSBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAqIExpa2UgdGhlIE5ldW1lIGFuZCBDbGVmIG1lbnVzXG4gICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIG1vcmVFZGl0IG1lbnUgbmVlZHMgdG8gaGF2ZSBvdmVyZmxvdyBmb3IgY2FzZXMgd2hlcmUgaXQgaGFzIGxvdHMgb2YgYnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICAqIEJ1dCBvdmVyZmxvdyBydWlucyBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtY29udGVudC1zdWJzZWN0aW9uIGhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibmV1bWVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidW5kb1JlZG9fY29udHJvbHNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuYyBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5jQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBIZWFkIFNoYXBlOjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkhlYWQgU2hhcGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlB1bmN0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5QdW5jdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVmlyZ2FcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5WaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlZpcmdhUmV2ZXJzZWRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5SZXZlcnNlZCBWaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkluY2xpbmF0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5JbmNsaW5hdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiTGlxdWVzY2VudEFudGljbG9ja3dpc2VcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5MaXF1ZXNjZW50IEE8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJMaXF1ZXNjZW50Q2xvY2t3aXNlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TGlxdWVzY2VudCBDPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYmFzaWMgbmV1bWUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInNwbGl0LW5ldW1lXCI+U3BsaXQgTmV1bWVzPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuZXVtZSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5ldW1lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkdyb3VwaW5nIE9wdGlvbnM6PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+R3JvdXBpbmdzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50IHNjcm9sbGFibGUtZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaW1hY3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+Q2xpbWFjdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGltYWN1c1Jlc3VwaW51c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaW1hY3VzIFJlc3VwaW51czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaXZpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaXZpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBlczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1N1YnB1bmN0aXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5QZXMgU3VicHVuY3RpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UG9ycmVjdHVzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQcmVzc3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UHJlc3N1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+U2NhbmRpY3VzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJUb3JjdWx1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlRvcmN1bHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVG9yY3VsdXNSZXN1cGludXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Ub3JjdWx1cyBSZXN1cGludXM8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ1bmdyb3VwTmNzXCI+VW5ncm91cDwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudSB3aGVuIHNlbGVjdGluZyBieSBzeWxsYWJsZVxuICogU2FtZSBhcyBhYm92ZSBleGNlcHQgaW5jbHVkZXMgcmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmZcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyA9IGA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgY3VzdG9zIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9zQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBsYXllciBlbGVtZW50IChvdXRzaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiaW5zZXJ0VG9TeWxsYWJsZVwiPkluc2VydCB0byBuZWFyZXN0IHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgbGF5ZXIgZWxlbWVudCAoaW5zaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudEluQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtb3ZlT3V0c2lkZVN5bGxhYmxlXCI+TW92ZSBvdXRzaWRlIHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYWNjaWQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBhY2NpZEFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgQWNjaWRlbnRhbDo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlNoYXBlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb0ZsYXRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GbGF0PC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9OYXR1cmFsXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TmF0dXJhbDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIHN0YWZmIHNwbGl0IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3Qgc3RhZmZTcGxpdEFjdGlvbkNvbnRlbnRzID0gYDxkaXY+U3BsaXQgU3lzdGVtOjwvZGl2PlxuICAgIDxkaXYgaWQ9XCJzcGxpdC1zeXN0ZW0tYnRucy1jb250YWluZXJcIiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNwbGl0LXN5c3RlbVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5TcGxpdDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVzZXQtcm90YXRlXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPlJlc2V0IFJvdGF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgc3RhZmYgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFmZk1lcmdlQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPk1lcmdlIFN5c3RlbXM6PC9sYWJlbD5cbiAgICA8ZGl2IGlkPVwibWVyZ2Utc3lzdGVtLWJ0bnMtY29udGFpbmVyXCIgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtZXJnZS1zeXN0ZW1zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPk1lcmdlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBhY2NpZCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbHVtbkFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jb250YWluZXJcIj5cbiAgICAgICAgRWRpdCBDb2x1bW4gSW5mb3JtYXRpb246XG4gICAgICAgIDxkaXYgaWQ9XCJjb2wtc3RlcHBlci1idG5zLWNvbnRhaW5lclwiIGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1kZWNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPuKAkzwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjb2wtaW5wdXRcIiBjbGFzcz1cInNpZGUtcGFuZWwtc3RlcHBlci1pbnB1dFwiIHZhbHVlPVwiMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1pbmNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPis8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtY29uZmlybVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2lkZS1wYW5lbC1jb25maXJtLWJ0blwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+Q29uZmlybTwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBpZD1cImNvbC13YXJuaW5nXCIgY2xhc3M9XCJzaWRlLXBhbmVsLXdhcm5pbmdcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBjbGVmIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY2xlZkFjdGlvbkNvbnRlbnRzID0gYFxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIiBvdmVyZmxvdz1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EaXNwbGFjZSBPY3RhdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiaW5jcmVtZW50LW9jdGF2ZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPisxIE9jdGF2ZTwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJkZWNyZW1lbnQtb2N0YXZlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+LTEgT2N0YXZlPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCIgb3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2hhbmdlIENsZWYgU2hhcGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiQ0NsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5DIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiRkNsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgYDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBkaXZMaW5lIHR5cGUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkaXZMaW5lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBEaXZMaW5lOjwvbGFiZWw+XG48ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8c3Bhbj5TaGFwZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9DYWVzdXJhXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+Q2Flc3VyYTwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9GaW5hbGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RmluYWxpczwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NaW5pbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NaW5pbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWFpb3JcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYWlvcjwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NYXhpbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYXhpbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvVmlyZ3VsYVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlZpcmd1bGE8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBiYm94IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgYmJveEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWF0Y2hIZWlnaHRcIj5NYXRjaCBIZWlnaHQgZm9yIEVudGlyZSBSb3c8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIEhUTUwgZm9yIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZ3JvdXBpbmdNZW51ID0ge1xuICBuYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gbW9yZS1lZGl0LWJ0blwiIGlkPVwiZ3JvdXBOY3NcIj5Hcm91cCBOZXVtZSBDb21wb25lbnRzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBuZXVtZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImdyb3VwTmV1bWVzXCI+R3JvdXAgTmV1bWVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBzeWw6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtZXJnZVN5bHNcIj5NZXJnZSBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cdFx0PC9kaXY+YCxcbiAgbGlnYXR1cmVOYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJncm91cE5jc1wiPkdyb3VwIE5ldW1lIENvbXBvbmVudHM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gLFxuICBsaWdhdHVyZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gLFxuICBzcGxpdFN5bGxhYmxlOiBgPGRpdiBjbGFzcz1cIm1vcmUtZWRpdC1idG4gcGFuZWwtYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saW5rXCI+VG9nZ2xlIExpbmtlZCBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmAsXG59O1xuXG4vKiBCR0lOTklORyBPRiBNT0RBTCBXSU5ET1cgQ09OVEVOVCBTRUNUSU9OICovXG5cbi8qKlxuICogSFRNTCBmb3IgQWRkIFN5bGxhYmxlIFRleHQgbW9kYWwgd2luZG93XG4gKi9cbmV4cG9ydCBjb25zdCBhZGRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWFkZFwiPkFkZDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIEhUTUwgZm9yIEVkaXQgU3lsbGFibGUgVGV4dCBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmVcIj5TYXZlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogSFRNTCBmb3IgSG90a2V5cyBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGhvdGtleXNNb2RhbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudFwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1ob3RrZXlzXCI+XG4gICAgICAgIDwhLS0gXCJEaXNwbGF5XCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5EaXNwbGF5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPis8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBJbjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBPdXQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+MDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5ab29tIFJlc2V0PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPmg8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+SGlkZSBHbHlwaDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+U2Nyb2xsIFRvIFN5bGxhYmxlIFRleHQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFwiRWRpdFwiIGhvdGtleXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LXN1YmNhdGVnb3J5LXRpdGxlXCI+RWRpdDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+Q3RybDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ejwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5VbmRvPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPkN0cmw8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj56PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJlZG88L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+cS93L2Uvci90L3k8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBieSBTdGFmZi9TeWxsYWJsZS9OZXVtZS9MYXllckVsZW1lbnQvU2VsZWN0aW9uL09mZlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj4xLzIvMy80LzUvNjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGJ5IFN5bGxhYmxlL05ldW1lL05ldW1lIENvbXBvbmVudC9TdGFmZi9MYXllciBFbGVtZW50L0JCb3hcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5OdW1iZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEJlZ2luIEluc2VydCBmb3IgdGhlIDxpPm50aDwvaT4gT3B0aW9uIGluIHRoZSBTZWxlY3RlZCBUYWJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ZzwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgR3JvdXAvVW5ncm91cCBTZWxlY3RlZCBFbGVtZW50KHMpXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBcIk90aGVyXCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5PdGhlcjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+czwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5TYXZlIEZpbGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+RXNjPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJldHVybiB0byBFZGl0IE1vZGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3Qgc3lsbGFibGVBY3Rpb25zQ29udGVudCA9IGBcbiAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1lcmdlU3lsc1wiPk1lcmdlIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICA8L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBlcnJvckxvZ3NQYW5lbENvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJlcnJvckxvZ0hlYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmctdGl0bGVcIj5FcnJvciBMb2c8L2Rpdj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVFcnJvckxvZ1wiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCIgaWQ9XCJlcnJvckxvZ0NvbnRlbnRzXCIgc3R5bGU9XCJvdmVyZmxvdzogc2Nyb2xsOyBwYWRkaW5nOiAwLjVlbSAwLjc1ZW07IG1heC1oZWlnaHQ6IDMwMHB4O1wiPjxkaXY+YDtcbiIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBBZGRTeWxBY3Rpb24sIFNldFRleHRBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvd0ludGVyZmFjZSB9IGZyb20gJy4uL0ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgaG90a2V5c01vZGFsLFxuICBlZGl0VGV4dE1vZGFsLFxuICBhZGRUZXh0TW9kYWwsXG59IGZyb20gJy4uL1NxdWFyZUVkaXQvQ29udGVudHMnO1xuaW1wb3J0IHtcbiAgbmV3Rm9sZGVySFRNTCxcbiAgcmVuYW1lSFRNTCxcbiAgdXBsb2FkQXJlYUhUTUwsXG59IGZyb20gJy4uL0Rhc2hib2FyZC9EYXNoYm9hcmRDb250ZW50JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcbmltcG9ydCB7IHNlbGVjdEJCb3gsIHVuc2VsZWN0IH0gZnJvbSAnLi9TZWxlY3RUb29scyc7XG5cbi8qKlxuICogRGVmaW5lcyBtb2RhbCB0eXBlcy5cbiAqIFRvIGNyZWF0ZSBuZXcgbW9kYWwgd2luZG93IHR5cGVzLCBhZGQgZW51bSBvcHRpb24gYW5kIGltcGxlbWVudCBsb2dpYyBpbnNpZGUgTW9kYWwgY2xhc3MuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGFsV2luZG93VmlldyB7XG4gIEFERF9URVhULFxuICBFRElUX1RFWFQsXG4gIEhPVEtFWVMsXG4gIEVSUk9SX0xPRywgLy8gZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFnYWluc3QgTUVJIHNjaGVtYSBhbmQgaW52YWxpZCBlbGVtZW50IGVycm9yc1xuICBET0NVTUVOVF9VUExPQUQsXG4gIE1PVkVfVE8sXG4gIE5FV19GT0xERVIsXG4gIFJFTkFNRSxcbn1cblxuZW51bSBNb2RhbFdpbmRvd1N0YXRlIHtcbiAgT1BFTixcbiAgQ0xPU0VELFxufVxuXG4vKipcbiAqIE1vZGFsIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGFuZCBjb250cm9sIHN0YXRlL2NvbnRlbnRcbiAqIG9mIG1vZGFsIHdpbmRvd3MgaW4gTmVvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGFsV2luZG93IGltcGxlbWVudHMgTW9kYWxXaW5kb3dJbnRlcmZhY2Uge1xuICBwcml2YXRlIG1vZGFsV2luZG93VmlldzogTW9kYWxXaW5kb3dWaWV3OyAvLyBjdXJyZW50IG1vZGFsIHR5cGVcbiAgcHJpdmF0ZSBtb2RhbFdpbmRvd1N0YXRlOiBNb2RhbFdpbmRvd1N0YXRlOyAvLyBvcGVuIG9yIGNsb3NlZD9cbiAgcHJpdmF0ZSBuZW9uVmlldzogTmVvblZpZXc7IC8vIG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHRcblxuICAvKipcbiAgICogU2V0IG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHQgZm9yIHRoaXMgbW9kYWwgd2luZG93IGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbmVvblZpZXcgbmVvblZpZXcgY29udGV4dCBmb3IgTW9kYWwgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5lb25WaWV3PzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5DTE9TRUQ7XG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGFwcGx5IHRvIGFsbCBtb2RhbCB3aW5kb3dzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLWNsb3NlJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93JylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZm9jdXNNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItY2xvc2UnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lci5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mb2N1c01vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbW9kYWwgdmlldyBvZiB0aGlzIE1vZGFsIGluc3RhbmNlLlxuICAgKiBVcGRhdGUgdGhlIGNvbnRlbnQgYmFzZWQgb24gcGFzc2VkIHZpZXcuXG4gICAqIEBwYXJhbSB2aWV3IFR5cGUgb2YgbW9kYWwgdG8gb3BlbiAoTW9kYWxWaWV3IGVudW0pXG4gICAqL1xuICBzZXRNb2RhbFdpbmRvd1ZpZXcodmlldzogTW9kYWxXaW5kb3dWaWV3LCBjb250ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1ZpZXcgPSB2aWV3O1xuICAgIHRoaXMuc2V0TW9kYWxXaW5kb3dDb250ZW50KGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBtb2RhbCB2aWV3IGFzIGEgc3RyaW5nXG4gICAqL1xuICBnZXRNb2RhbFdpbmRvd1ZpZXcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbFdpbmRvd1ZpZXcudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbW9kZWwgd2luZG93IHdpdGggY29udGVudCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgTW9kYWxWaWV3LlxuICAgKi9cbiAgb3Blbk1vZGFsV2luZG93KCk6IHZvaWQge1xuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50JyksXG4gICAgKS5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB9KTtcbiAgICBzd2l0Y2ggKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5BRERfVEVYVDpcbiAgICAgICAgdGhpcy5vcGVuQWRkU3lsVGV4dE1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIHRoaXMub3BlbkVkaXRTeWxUZXh0TW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVM6XG4gICAgICAgIC8vIHNldCB1cCBhbmQgZGlwbGF5IGhvdGtleSBtb2RhbCBjb250ZW50XG4gICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKVxuICAgICAgICAgIC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRDpcbiAgICAgIC8vIGFkZCBmdW5jdGlvbiB0byBwYWlyaW5nIGJ1dHRvblxuICAgICAgLy8gYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk1PVkVfVE86XG5cbiAgICAgIC8vIGJyZWFrO1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAgICAgJ2ZsZXgnO1xuICAgICAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIG1ha2Ugc3VyZSB1c2VyIGNhbid0IHNjcm9sbCB3aGVuIG1vZGFsIGlzIG9wZW5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5PUEVOO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIE5lb24gbW9kYWwgd2luZG93XG4gICAqL1xuICBoaWRlTW9kYWxXaW5kb3coKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICBjb25zdCBzcGFuID0gPEhUTUxTcGFuRWxlbWVudD4oXG4gICAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAgIC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKVxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdXG4gICAgICAgICk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQtdG8tZWRpdCcpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk5FV19GT0xERVI6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5SRU5BTUU6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWNvbnRhaW5lcicsXG4gICAgICAgICkuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPVxuICAgICAgJ25vbmUnO1xuICAgIC8vIHJlc2V0IHNjcm9sbCBiZWhhdmlvciBvZiBib2R5XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1ggPSAnaGlkZGVuJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdzY3JvbGwnO1xuICAgIHRoaXMubW9kYWxXaW5kb3dTdGF0ZSA9IE1vZGFsV2luZG93U3RhdGUuQ0xPU0VEO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29udGVudCBvZiBtb2RhbCB3aW5kb3dcbiAgICovXG4gIHByaXZhdGUgc2V0TW9kYWxXaW5kb3dDb250ZW50KGNvbnRlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgICduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWNvbnRhaW5lcicsXG4gICAgKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItdGl0bGUnKTtcblxuICAgIHN3aXRjaCAodGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkFERF9URVhUOlxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYWRkVGV4dE1vZGFsO1xuICAgICAgICAvLyBzZXQgbW9kYWwgd2luZG93IHRpdGxlXG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFTlRFUiBTWUxMQUJMRSBURVhUJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkVESVRfVEVYVDpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGVkaXRUZXh0TW9kYWw7XG4gICAgICAgIC8vIHNldCBtb2RhbCB3aW5kb3cgdGl0bGVcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0VESVQgU1lMTEFCTEUgVEVYVCc7XG5cbiAgICAgICAgLy8gc3BhbiBhbmQgY3VycmVudCB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGUgYW5kIGZpbHRlciBvdXQgdW53YW50ZWQgY2hhcnNcbiAgICAgICAgY29uc3Qgc3BhbiA9IDxIVE1MU3BhbkVsZW1lbnQ+KFxuICAgICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0JylcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuLnNlbGVjdGVkLXRvLWVkaXQnKVswXVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZW1vdmVTeW1ib2wgPSAvXFx1ezI1Q0F9L3U7XG4gICAgICAgIGNvbnN0IG9yaWcgPSBzcGFuLnRleHRDb250ZW50LnJlcGxhY2UocmVtb3ZlU3ltYm9sLCAnJykudHJpbSgpO1xuXG4gICAgICAgIC8vIHNldCB2YWx1ZSBvZiBpbnB1dCBmaWVsZCB0byBjdXJyZW50IHN5bGxhYmxlIHRleHRcbiAgICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PihcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICAgICAgKSkudmFsdWUgPSBvcmlnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuSE9US0VZUzpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGhvdGtleXNNb2RhbDtcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0hPVEtFWVMnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRVJST1JfTE9HOlxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAzMHB4O3doaXRlLXNwYWNlOiBwcmUtbGluZTtcIj4ke2NvbnRlbnR9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCR7ZW5jb2RlVVJJKFxuICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgKX1cIiBkb3dubG9hZD1cImVycm9yLmxvZ1wiPlxuICAgICAgICAgICAgICBFeHBvcnRcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFUlJPUiBMT0cnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnRE9DVU1FTlQgVVBMT0FEJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHVwbG9hZEFyZWFIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ01PVkUgVE8nO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ05FVyBGT0xERVInO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbmV3Rm9sZGVySFRNTDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ1JFTkFNRSc7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSByZW5hbWVIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBzZWxlY3Rpb24gdHlwZS4gVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgYWRkaW5nIHN5bGxhYmxlIHRleHRcbiAgICovXG4gIHByaXZhdGUgb3BlbkFkZFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpLFxuICAgICkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgQWRkIFN5bGxhYmxlIFRleHQgbW9kYWwgd2luZG93XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1lZGl0LXRleHQnKVxuICAgICAgLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcblxuICAgIC8vIFJlc2V0IFwiQ2FuY2VsXCIgYnV0dG9uIGV2ZW50IGxpc3RlbmVyXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbCcpXG4gICAgICAucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdyk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbCcpXG4gICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcblxuICAgIC8vIFJlc2V0IFwiU2F2ZVwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1hZGQnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRTeWxUZXh0LmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1hZGQnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRTeWxUZXh0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gZGlzcGxheSBtb2RhbCB3aW5kb3dcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAnZmxleCc7XG4gICAgdGhpcy5mb2N1c01vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgdXBkYXRpbmcgc3lsbGFibGUgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpLFxuICAgICkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgRWRpdCBTeWxsYWJsZSBUZXh0IG1vZGFsIHdpbmRvd1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0JylcbiAgICAgIC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAvLyBSZXNldCBcIkNhbmNlbFwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBSZXNldCBcIlNhdmVcIiBidXR0b24gZXZlbnQgbGlzdGVuZXJcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtc2F2ZScpXG4gICAgICAucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZVN5bFRleHQuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy51cGRhdGVTeWxUZXh0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gZGlzcGxheSBtb2RhbCB3aW5kb3dcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAnZmxleCc7XG4gICAgdGhpcy5mb2N1c01vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGVzIHdpdGggdXNlci1wcm92aWRlZCB0ZXh0XG4gICAqL1xuICBwcml2YXRlIGFkZFN5bFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gR2V0IHRoZSBlbGVtZW50IElEIG9mIHRoZSBzZWxlY3RlZCBzeWxsYWJsZVxuICAgIGNvbnN0IGVsZW1lbnRJZCA9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzeWxsYWJsZSBzZWxlY3RlZCcpWzBdLmlkO1xuXG4gICAgY29uc3Qgc3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICApKS52YWx1ZTtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogQWRkU3lsQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnYWRkU3lsJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudElkLFxuICAgICAgICBzeWxUZXh0OiBzeWxUZXh0LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gc2VuZCBhY3Rpb24gdG8gdmVyb3ZpbyBmb3IgcHJvY2Vzc2luZ1xuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBBbiB1cGRhdGUgdG8gdGhlIHBhZ2Ugd2lsbCByZWxvYWQgdGhlIGVudGlyZSBzdmc7XG4gICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgIC8vIGlmIGJib3hlcyBhcmUgZW5hYmxlZFxuICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVTZWxlY3RlZEJCb3goc3BhbiwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5uZW9uVmlldyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gY2xvc2UgbW9kYWwgd2luZG93XG4gICAgdGhpcy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRleHQgb2Ygc2VsZWN0ZWQtdG8tZWRpdCBzeWxsYWJsZXMgd2l0aCB1c2VyLXByb3ZpZGVkIHRleHRcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU3lsVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBzcGFuIGFuZCBjdXJyZW50IHRleHQgb2Ygc2VsZWN0ZWQtdG8tZWRpdCBzeWxsYWJsZSBhbmQgZmlsdGVyIG91dCB1bndhbnRlZCBjaGFyc1xuICAgIGNvbnN0IHNwYW4gPSA8SFRNTFNwYW5FbGVtZW50PihcbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKVxuICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgnc3Bhbi5zZWxlY3RlZC10by1lZGl0JylbMF1cbiAgICApO1xuICAgIGNvbnN0IHJlbW92ZVN5bWJvbCA9IC9cXHV7MjVDQX0vdTtcbiAgICBjb25zdCBvcmlnID0gc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcbiAgICBjb25zdCB1cGRhdGVkU3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICApKS52YWx1ZTtcblxuICAgIGlmICh1cGRhdGVkU3lsVGV4dCAhPT0gbnVsbCAmJiB1cGRhdGVkU3lsVGV4dCAhPT0gb3JpZykge1xuICAgICAgLy8gY3JlYXRlIFwic2V0IHRleHRcIiBhY3Rpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IFsuLi5zcGFuLmNsYXNzTGlzdC5lbnRyaWVzKCldLmZpbHRlcihcbiAgICAgICAgKGNsYXNzTmFtZSkgPT5cbiAgICAgICAgICBjbGFzc05hbWVbMV0gIT09ICd0ZXh0LXNlbGVjdCcgJiYgY2xhc3NOYW1lWzFdICE9PSAnc2VsZWN0ZWQtdG8tZWRpdCcsXG4gICAgICApWzBdWzFdO1xuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBTZXRUZXh0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnRJZCxcbiAgICAgICAgICB0ZXh0OiB1cGRhdGVkU3lsVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBzZW5kIGFjdGlvbiB0byB2ZXJvdmlvIGZvciBwcm9jZXNzaW5nXG4gICAgICB0aGlzLm5lb25WaWV3XG4gICAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAgIC50aGVuKChyZXNwb25zZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICAgIHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gQW4gdXBkYXRlIHRvIHRoZSBwYWdlIHdpbGwgcmVsb2FkIHRoZSBlbnRpcmUgc3ZnO1xuICAgICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgICAgLy8gaWYgYmJveGVzIGFyZSBlbmFibGVkXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCQm94KHNwYW4sIHRoaXMuZHJhZ0hhbmRsZXIsIHRoaXMubmVvblZpZXcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZWxlY3QgaWYgbm8gY2hhbmdlIGlzIG1hZGVcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCQm94KHNwYW4sIHRoaXMuZHJhZ0hhbmRsZXIsIHRoaXMubmVvblZpZXcpO1xuICAgIH1cbiAgICAvLyBjbG9zZSBtb2RhbCB3aW5kb3dcbiAgICB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGJvdW5kaW5nIGJveCBzZWxlY3RlZCB3aGVuIHRoZSBlZGl0IHRleHQgbW9kYWwgaGFzIGJlZW4gY2xpY2tlZFxuICAgKi9cbiAgdXBkYXRlU2VsZWN0ZWRCQm94KFxuICAgIHNwYW46IEhUTUxTcGFuRWxlbWVudCxcbiAgICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gICAgbmVvblZpZXc6IE5lb25WaWV3LFxuICApOiB2b2lkIHtcbiAgICB1bnNlbGVjdCgpO1xuXG4gICAgY29uc3QgYmJveElkID0gQXJyYXkuZnJvbShzcGFuLmNsYXNzTGlzdCkuZmluZChcbiAgICAgIChlKSA9PiBlICE9PSAndGV4dC1zZWxlY3QnICYmIGUgIT09ICdzZWxlY3RlZC10by1lZGl0JyxcbiAgICApO1xuXG4gICAgaWYgKChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJCb3gnKSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmJveElkKSkge1xuICAgICAgICBjb25zdCBkaXNwbGF5UmVjdCA9IGRvY3VtZW50XG4gICAgICAgICAgLmdldEVsZW1lbnRCeUlkKGJib3hJZClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIHNlbGVjdEJCb3goZGlzcGxheVJlY3QsIGRyYWdIYW5kbGVyLCBuZW9uVmlldyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggaG90a2V5IGluZm8gY29udGVudFxuICAgKi9cbiAgLypcbiAgcHJpdmF0ZSBvcGVuSG90a2V5TW9kYWxXaW5kb3cgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQnKSkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgYW5kIGRpcGxheSBob3RrZXkgbW9kYWwgY29udGVudFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgfTtcbiAgKi9cblxuICAvKipcbiAgICogRGVmaW5lIGV2ZW50IGxpc3RlbmVycyBmb3IgbW9kYWwgd2luZG93IGJhc2VkIG9uIG1vZGFsVmlldyB0eXBlXG4gICAqL1xuICBwcml2YXRlIGtleWRvd25MaXN0ZW5lciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgLy8gcHJldmVudCBOZW9uIGhvdGtleSBldmVudHMgZnJvbSBmaXJpbmcgd2hlbiB1c2VyIGlzIHR5cGluZ1xuXG4gICAgc3dpdGNoICh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuQUREX1RFWFQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgdGhpcy5hZGRTeWxUZXh0KCk7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgdGhpcy51cGRhdGVTeWxUZXh0KCk7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRXZlbnQgbGlzdGVuZXIgdGhhdCBmb2N1c2VzIHRoZSBtb2RhbCB3aW5kb3cgaWYgdXNlciBjbGlja3MgYW55d2hlcmUgb3V0c2lkZSBvZiBpdFxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c01vZGFsV2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgIHN3aXRjaCAodGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkFERF9URVhUOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+KFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXQnKVxuICAgICAgICApKS5zZWxlY3QoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ET0NVTUVOVF9VUExPQUQ6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdycpLmZvY3VzKCk7XG4gICAgfVxuICB9O1xufVxuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbnZhciBieXRlVG9IZXggPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFycikge1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgdmFyIHV1aWQgPSAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwiZXhwb3J0IGRlZmF1bHQgL14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pOyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsIi8qKiBAbW9kdWxlIERpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMgKi9cblxuaW1wb3J0ICogYXMgQ29sb3IgZnJvbSAnLi4vdXRpbHMvQ29sb3InO1xuaW1wb3J0IFpvb21IYW5kbGVyIGZyb20gJy4uL1NpbmdsZVZpZXcvWm9vbSc7XG5pbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncywgc2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcblxubGV0IGxhc3RHbHlwaE9wYWNpdHk6IG51bWJlciwgbGFzdEltYWdlT3BhY2l0eTogbnVtYmVyLCBsYXN0Q2lyY2xlU2l6ZTogbnVtYmVyO1xuXG4vKipcbiAqIFNldCB6b29tIGNvbnRyb2wgbGlzdGVuZXIgZm9yIGJ1dHRvbiBhbmQgc2xpZGVyXG4gKiBAcGFyYW0gem9vbUhhbmRsZXIgLSBBIFtbWm9vbUhhbmRsZXJdXSBpcyBvbmx5IG5lY2Vzc2FyeSBpbiBTaW5nbGUgUGFnZSBtb2RlIGFzIGRpdmEuanMgaGFuZGxlcyB6b29taW5nIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFpvb21Db250cm9scyAoem9vbUhhbmRsZXI/OiBab29tSGFuZGxlcik6IHZvaWQge1xuICBpZiAoem9vbUhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB6b29tU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21TbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCB6b29tT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21PdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IHpvb20gfSA9IGdldFNldHRpbmdzKCk7XG4gIHpvb21TbGlkZXIudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21IYW5kbGVyLnpvb21Ubyh6b29tIC8gMTAwLjApO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtem9vbScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHpvb21PdXRwdXQudmFsdWUgPSAnMTAwJztcbiAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgem9vbUhhbmRsZXIucmVzZXRab29tQW5kUGFuKCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXQtem9vbS1lYXN5LWVkaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gJzE4MCc7XG4gICAgem9vbVNsaWRlci52YWx1ZSA9ICcxODAnO1xuICAgIHpvb21IYW5kbGVyLnpvb21UbygxODAvMTAwKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gaW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gem9vbVNsaWRlci52YWx1ZTtcbiAgICB6b29tSGFuZGxlci56b29tVG8oTnVtYmVyKHpvb21PdXRwdXQudmFsdWUpIC8gMTAwLjApO1xuICB9XG5cbiAgLy8gem9vbVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuZGlzYWJsZWQgPSBmYWxzZTtcblxuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZ0KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFpvb20gPSBwYXJzZUludCh6b29tT3V0cHV0LnZhbHVlKTtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2dC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IFxuICAgIGV2dC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldnQua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnKycpIHsgLy8gaW5jcmVhc2Ugem9vbSBieSAyMFxuICAgICAgY29uc3QgbmV3Wm9vbSA9IE1hdGgubWluKGN1cnJlbnRab29tICsgMjAsIHBhcnNlSW50KHpvb21TbGlkZXIuZ2V0QXR0cmlidXRlKCdtYXgnKSkpO1xuICAgICAgem9vbUhhbmRsZXIuem9vbVRvKG5ld1pvb20gLyAxMDAuMCk7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICdfJykgeyAvLyBkZWNyZWFzZSB6b29tIGJ5IDIwXG4gICAgICBjb25zdCBuZXdab29tID0gTWF0aC5tYXgoY3VycmVudFpvb20gLSAyMCwgcGFyc2VJbnQoem9vbVNsaWRlci5nZXRBdHRyaWJ1dGUoJ21pbicpKSk7XG4gICAgICB6b29tSGFuZGxlci56b29tVG8obmV3Wm9vbSAvIDEwMC4wKTtcbiAgICAgIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcobmV3Wm9vbSk7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJzAnKSB7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tSGFuZGxlci5yZXNldFpvb21BbmRQYW4oKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBNRUkgb3BhY2l0eSB0byB2YWx1ZSBmcm9tIHRoZSBzbGlkZXIuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciAobWVpQ2xhc3NOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuICBjb25zdCBvcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wYWNpdHlTbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBvcGFjaXR5T3V0cHV0LnZhbHVlO1xuICAvLyB0aGlzIGlzIHdoZXJlIHdlIGxvYWQgZ2x5cGggb3BhY2l0eSBmcm9tIGxvY2FsU3RvcmFnZSBvbiBwYWdlLWxvYWRcbiAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdG9nZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlR2x5cGhJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWdseXBoLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSA9PT0gMCkge1xuICAgIGhpZGVHbHlwaEltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zaG93LWljb24uc3ZnYCk7XG4gICAgaGlkZUdseXBoSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdTaG93IGdseXBoJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgaGlkZUdseXBoSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2hpZGUtaWNvbi5zdmdgKTtcbiAgICBoaWRlR2x5cGhJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0hpZGUgZ2x5cGgnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgKChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIG1laUNsYXNzTmFtZSkpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KS5mb3JFYWNoKGcgPT4ge1xuICAgICAgZy5zdHlsZS5vcGFjaXR5ID0gKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMC4wKS50b1N0cmluZygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gcHJvcGVybHkgc2V0IG9wYWNpdHkgdG8gcGFnZXMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCByZW5kZXJlZCBNRUkgb3BhY2l0eSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5mdW5jdGlvbiBzZXRHbHlwaE9wYWNpdHlDb250cm9scyAobWVpQ2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5U2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgb3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5T3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyBnbHlwaE9wYWNpdHkgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RHbHlwaE9wYWNpdHkgPSBnbHlwaE9wYWNpdHk7XG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcoZ2x5cGhPcGFjaXR5KTtcbiAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhnbHlwaE9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGlucHV0Q2hhbmdlT3BhY2l0eSAoKTogdm9pZCB7XG4gICAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IG9wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEdseXBoT3BhY2l0eSA9IE51bWJlcihvcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBzZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyKG1laUNsYXNzTmFtZSk7XG4gIH1cblxuICBjb25zdCB0b2dnbGVPcGFjaXR5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1nbHlwaC1vcGFjaXR5Jyk7XG5cbiAgaWYgKGdseXBoT3BhY2l0eSA9PSAxMDApIHtcbiAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlT3BhY2l0eUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cbiAgICBsZXQgbmV3T3BhY2l0eTtcbiAgICBpZiAodG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtaWNvbicpKSB7XG4gICAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUtaWNvbicpO1xuICAgICAgbmV3T3BhY2l0eSA9IDA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cblxuICAgIC8vIERlZmluaXRpb24gc2NhbGUgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB3aGF0IGlzIGdlbmVyYXRlZCBieSB2ZXJvdmlvXG4gICAgXG4gICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgbWVpQ2xhc3NOYW1lKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PikuZm9yRWFjaChnID0+IHtcbiAgICAgIGcuc3R5bGUub3BhY2l0eSA9IG5ld09wYWNpdHkudG9TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGxhc3RHbHlwaE9wYWNpdHkgPSBOdW1iZXIob3BhY2l0eVNsaWRlci52YWx1ZSk7XG4gICAgb3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBvcGFjaXR5T3V0cHV0LnZhbHVlID0gU3RyaW5nKE1hdGgucm91bmQobmV3T3BhY2l0eSAqIDEwMCkpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IG5ld09wYWNpdHkgKiAxMDAgfSk7XG5cbiAgICBpbnB1dENoYW5nZU9wYWNpdHkoKTtcbiAgfSk7XG5cbiAgb3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlT3BhY2l0eSk7XG4gIG9wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaW5wdXRDaGFuZ2VPcGFjaXR5KTtcblxuICBvcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBTZXQgYmFja2dyb3VuZCBpbWFnZSBvcGFjaXR5IGJ1dHRvbiBhbmQgc2xpZGVyIGxpc3RlbmVycy5cbiAqIEBwYXJhbSBiYWNrZ3JvdW5kIC0gVGhlIGJhY2tncm91bmQgaW1hZ2Ugc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHNldEJnT3BhY2l0eUNvbnRyb2xzIChiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnT3BhY2l0eVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGJnT3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ09wYWNpdHlPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IGltYWdlT3BhY2l0eSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdEltYWdlT3BhY2l0eSA9IGltYWdlT3BhY2l0eTtcbiAgYmdPcGFjaXR5U2xpZGVyLnZhbHVlID0gU3RyaW5nKGltYWdlT3BhY2l0eSk7XG4gIGJnT3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGJnSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBiZ09wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIHNldEJnT3BhY2l0eUZyb21TbGlkZXIoYmFja2dyb3VuZCk7XG4gIH1cblxuXG4gIGNvbnN0IHRvZ2dsZUJnT3BhY2l0eUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtYmctb3BhY2l0eScpO1xuXG4gIGlmIChpbWFnZU9wYWNpdHkgPT0gMTAwKSB7XG4gICAgdG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlQmdPcGFjaXR5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgbGV0IG5ld09wYWNpdHk7XG5cbiAgICBpZiAodG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5jb250YWlucygnaGlkZS1pY29uJykpIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cbiAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShiYWNrZ3JvdW5kKVswXSBhcyBIVE1MRWxlbWVudClcbiAgICAgIC5zdHlsZS5vcGFjaXR5ID0gbmV3T3BhY2l0eS50b1N0cmluZygpO1xuXG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIGJnT3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoTWF0aC5yb3VuZChuZXdPcGFjaXR5ICogMTAwKSk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IGltYWdlT3BhY2l0eTogbmV3T3BhY2l0eSAqIDEwMCB9KTtcbiAgICBiZ0lucHV0Q2hhbmdlSGFuZGxlcigpO1xuICB9KTtcblxuICBiZ09wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG4gIGJnT3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgYmdPcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEJnT3BhY2l0eUZyb21TbGlkZXIgKGJhY2tncm91bmQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5T3V0cHV0OiBIVE1MT3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiZ09wYWNpdHlPdXRwdXQnKTtcbiAgXG4gIHNldFNldHRpbmdzKHsgaW1hZ2VPcGFjaXR5OiBOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdGlnZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlQmdJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWJnLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihiZ09wYWNpdHlPdXRwdXQudmFsdWUpID09PSAwKSB7XG4gICAgaGlkZUJnSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3Nob3ctaWNvbi5zdmdgKTtcbiAgICBoaWRlQmdJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ1Nob3cgYmFja2dyb3VuZCBpbWFnZScpO1xuICB9XG4gIGVsc2Uge1xuICAgIGhpZGVCZ0ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9oaWRlLWljb24uc3ZnYCk7XG4gICAgaGlkZUJnSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdIaWRlIGJhY2tncm91bmQgaW1hZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IGJnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2JhY2tncm91bmR9YCk7XG4gIGlmIChiZykgYmcuc3R5bGUub3BhY2l0eSA9IFN0cmluZyhOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMCk7XG59XG5cbi8qKlxuICogU2V0IGJib3ggYWRqdXN0bWVudCBjaXJjbGUgc2l6ZSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDaXJjbGVTaXplQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBjaXJjbGVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2lyY2xlU2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgY2lyY2xlT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NpcmNsZU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuXG4gIGNvbnN0IHsgY2lyY2xlU2l6ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdENpcmNsZVNpemUgPSBjaXJjbGVTaXplO1xuICBjaXJjbGVTbGlkZXIudmFsdWUgPSBTdHJpbmcoY2lyY2xlU2l6ZSk7XG4gIGNpcmNsZU91dHB1dC52YWx1ZSA9IFN0cmluZyhjaXJjbGVTaXplKTtcblxuICBmdW5jdGlvbiBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBjaXJjbGVPdXRwdXQudmFsdWUgPSBjaXJjbGVTbGlkZXIudmFsdWU7XG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoY2lyY2xlU2xpZGVyLnZhbHVlKTtcbiAgICBzZXRTZXR0aW5ncyh7IGNpcmNsZVNpemU6IE51bWJlcihsYXN0Q2lyY2xlU2l6ZSkgfSk7XG4gICAgY29uc3QgcmVzaXplUG9pbnRzID0gZDMuc2VsZWN0QWxsKCcucmVzaXplUG9pbnQnKTtcbiAgICBpZiAoIXJlc2l6ZVBvaW50cy5lbXB0eSgpKSB7XG4gICAgICByZXNpemVQb2ludHMuYXR0cigncicsIGxhc3RDaXJjbGVTaXplKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1jaXJjbGUtc2l6ZScpO1xuICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0U2l6ZSA9IDI1OyBcbiAgICAvLyBpZiBoYXMgcmVzaXplUG9pbnRzIGRpc3BsYXllZFxuICAgIGNvbnN0IHJlc2l6ZVBvaW50cyA9IGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50Jyk7XG4gICAgaWYgKCFyZXNpemVQb2ludHMuZW1wdHkoKSkge1xuICAgICAgcmVzaXplUG9pbnRzLmF0dHIoJ3InLCBkZWZhdWx0U2l6ZSk7XG4gICAgfVxuXG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoZGVmYXVsdFNpemUpO1xuICAgIGNpcmNsZVNsaWRlci52YWx1ZSA9IFN0cmluZyhkZWZhdWx0U2l6ZSk7XG4gICAgY2lyY2xlT3V0cHV0LnZhbHVlID0gU3RyaW5nKGRlZmF1bHRTaXplKTtcblxuICAgIHNldFNldHRpbmdzKHsgY2lyY2xlU2l6ZTogTnVtYmVyKGRlZmF1bHRTaXplKSB9KTtcbiAgICBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyKCk7XG4gIH0pO1xuXG4gIGNpcmNsZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIpO1xuICBjaXJjbGVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgY2lyY2xlU2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cbi8qKlxuICogVXBkYXRlIGhpZ2hsaWdodCBkcm9wZG93biBvcHRpb24gKyBkaXNwbGF5XG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRPcHRpb24gKGdyb3VwOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhpZ2hsaWdodC0ke2dyb3VwfWApO1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcbiAgY29uc3QgaGlnaGxpZ2h0VHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpO1xuXG4gIC8vIHNhdmUgaGlnaGxpZ2h0IG9wdGlvbiB0byBsb2NhbFN0b3JhZ2VcbiAgc2V0U2V0dGluZ3MoeyBoaWdobGlnaHRNb2RlOiBncm91cCB9KTtcblxuICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmZvckVhY2goZWxlbSA9PiB7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgfSk7XG5cbiAgaWYgKGdyb3VwID09PSAnbm9uZScpIHtcbiAgICBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50ID0gJ1xceEEwLSBPZmYnO1xuICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIG9wdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcblxuICAvLyBUZXh0IGNvbnRlbnQgaXMgdGhlIGdyb3VwaW5nIHR5cGUgY2FwaXRhbGl6ZWRcbiAgaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudCA9IGBcXHhBMC0gJHtncm91cFswXS50b1VwcGVyQ2FzZSgpICsgZ3JvdXAuc2xpY2UoMSl9YDtcbiAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXApO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHQgbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWdobGlnaHRUeXBlICgpOiBHcm91cGluZ1R5cGUge1xuICBjb25zdCBoaWdobGlnaHRUeXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJyk7XG4gIHJldHVybiBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCkgYXMgR3JvdXBpbmdUeXBlO1xufVxuXG4vKipcbiAqIFNldCBjbGljayBsaXN0ZW5lciBmb3IgZWFjaCBoaWdobGlnaHQgZHJvcGRvd24gb3B0aW9uXG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0T3B0aW9uIChncm91cDogR3JvdXBpbmdUeXBlKTogdm9pZCB7XG4gIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBoaWdobGlnaHQtJHtncm91cH1gKTtcbiAgb3B0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbihncm91cCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENsaWNrYXdheSBsaXN0ZW5lciBmb3IgdGhlIGhpZ2hsaWdodCBkcm9wZG93bi5cbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q2xpY2thd2F5ICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbn1cblxuLyoqXG4gKiBTZXQgbGlzdGVuZXIgb24gc3RhZmYgaGlnaGxpZ2h0aW5nIGNoZWNrYm94LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0Q29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWJ1dHRvbicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcm9wZG93bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBpZiAoZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG5cbiAgICAgIHNldEhpZ2hsaWdodE9wdGlvbignY29sdW1uJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N0YWZmJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N5bGxhYmxlJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ2xheWVyRWxlbWVudCcpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdub25lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICAqIFNldCBsaXN0ZW5lciBvbiBrZXkgc2hvcnRjdXRzIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiBoaWdobGlnaHRzXG4gICogXG4gICogVGhlIGN1cnJlbnQgcGxhbiBpcyB0byB1c2UgdGhlIGtleXMgcSwgdywgZSwgciwgdCwgYW5kIHlcbiAgKi9cbmZ1bmN0aW9uIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIC8vIFByZXZlbnQgY21kL2N0cmwrciBmcm9tIGNoYW5naW5nIGhpZ2hsaWdodCBvcHRpb25cbiAgICBpZiAoZXZ0Lm1ldGFLZXkpIHJldHVybjtcblxuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAncSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc3RhZmYnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3JzpcbiAgICAgICAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKCdzeWxsYWJsZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2UnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncic6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbGF5ZXJFbGVtZW50Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndCc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc2VsZWN0aW9uJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbm9uZScpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0U2VsZWN0aW9uQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBoaWdobGlnaHRTZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LXNlbGVjdGlvbicpO1xuICBoaWdobGlnaHRTZWxlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1kcm9wZG93bicpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgICBoaWdobGlnaHRTZWxlY3Rpb24uY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJykudGV4dENvbnRlbnQgPSAnIC0gU2VsZWN0aW9uJztcbiAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnc2VsZWN0aW9uJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBoaWdobGlnaHQgZm9yIGRpZmZlcmVudCB0eXBlcyBiYXNlZCBvbiB0aGUgJ2hpZ2hsaWdodC1zZWxlY3RlZCcgY2xhc3MgaW4gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUhpZ2hsaWdodCAoKTogdm9pZCB7XG4gIGxldCBoaWdobGlnaHRJZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGhpZ2hsaWdodElkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmlkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGlnaGxpZ2h0SWQgPSAnJztcbiAgfVxuICBzd2l0Y2ggKGhpZ2hsaWdodElkKSB7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LWNvbHVtbic6XG4gICAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnY29sdW1uJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3RhZmYnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N0YWZmJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3lsbGFibGUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N5bGxhYmxlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbmV1bWUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ25ldW1lJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbGF5ZXJFbGVtZW50JzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdsYXllckVsZW1lbnQnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hpZ2hsaWdodC1zZWxlY3Rpb24nOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3NlbGVjdGlvbicpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBsaXN0ZW5lciBvbiBidXJnZXIgbWVudSBmb3Igc21hbGxlciBzY3JlZW5zLlxuICovXG5mdW5jdGlvbiBzZXRCdXJnZXJDb250cm9scyAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidXJnZXJNZW51JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1cmdlck1lbnUnKS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2TWVudScpLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuICB9KTtcbn1cblxuLyoqIFxuICogU2V0IGxpc3RlbmVyIGZvciBcIkRpc3BsYXkgQWxsXCIgYnV0dG9uIGluIERpc3BsYXkgcGFuZWwuXG4qL1xuZnVuY3Rpb24gc2V0RGlzcGxheUFsbExpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBzZWxlY3RBbGxCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1hbGwtYnRuJyk7XG4gIHNlbGVjdEFsbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAvLyBhdCB0aGUgbW9tZW50LCBjbGFzc25hbWUgJ3NlbGVjdGVkJyBpcyBvbmx5IHVzZWQgZm9yIHRyYWNraW5nIHB1cnBvc2VzXG4gICAgaWYgKHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcblxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGVja2VkKSBvcHRpb24uY2xpY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcbiAgICAgIFxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb24uY2hlY2tlZCkgb3B0aW9uLmNsaWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKiogXG4gKiBVcGRhdGUgYERpc3BsYXkgQWxsYCBidXR0b24gc3RhdHVzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlBbGxCdG4oKTogdm9pZCB7XG4gIGNvbnN0IGRpc3BsYXlBbGxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1hbGwtYnRuJyk7XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlJbmZvJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUJCb3hlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5QkJveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlUZXh0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUVyckxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5LWVycm9ycycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgLy8gaWYgYWxsIG9wdGlvbnMgYXJlIHNlbGVjdGVkLFxuICAvLyBzZXQgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIHRvIFwiSGlkZSBBbGxcIi5cbiAgaWYgKGRpc3BsYXlJbmZvPy5jaGVja2VkICYmIGRpc3BsYXlCQm94ZXM/LmNoZWNrZWQgJiYgXG4gICAgZGlzcGxheVRleHQ/LmNoZWNrZWQgJiYgZGlzcGxheUVyckxvZz8uY2hlY2tlZCkge1xuICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIGlzIGluIFwiSGlkZSBBbGxcIiBtb2RlLCBzZXQgaXQgdG8gXCJEaXNwbGF5IEFsbFwiIG1vZGVcbiAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0Rpc3BsYXkgQWxsJztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGhpZ2hsaWdodCBzZXR0aW5ncyBmcm9tIGxvY2FsU3RvcmFnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhpZ2hsaWdodFNldHRpbmdzICgpOiB2b2lkIHtcbiAgY29uc3QgeyBoaWdobGlnaHRNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICB1cGRhdGVIaWdobGlnaHRPcHRpb24oaGlnaGxpZ2h0TW9kZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsaXN0ZW5lcnMgYW5kIGNvbnRyb2xzIGZvciBkaXNwbGF5IHBhbmVsLlxuICogQHBhcmFtIHtzdHJpbmd9IG1laUNsYXNzTmFtZSAtIFRoZSBjbGFzcyB1c2VkIHRvIHNpZ25pZml5IHRoZSBNRUkgZWxlbWVudChzKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYWNrZ3JvdW5kIC0gVGhlIGNsYXNzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYmFja2dyb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5Q29udHJvbHMgKG1laUNsYXNzTmFtZTogc3RyaW5nLCBiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0R2x5cGhPcGFjaXR5Q29udHJvbHMobWVpQ2xhc3NOYW1lKTtcbiAgc2V0QmdPcGFjaXR5Q29udHJvbHMoYmFja2dyb3VuZCk7XG4gIHNldEhpZ2hsaWdodENvbnRyb2xzKCk7XG4gIHNldEJ1cmdlckNvbnRyb2xzKCk7XG4gIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzKCk7XG4gIHNldERpc3BsYXlBbGxMaXN0ZW5lcigpO1xuICBsb2FkSGlnaGxpZ2h0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5Q29udGVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUNvbnRlbnRzJyk7XG4gIGNvbnN0IHRvZ2dsZURpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlRGlzcGxheScpO1xuICBjb25zdCBkaXNwbGF5SGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlIZWFkZXInKTtcblxuICBkaXNwbGF5SGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGlmIGRpc3BsYXkgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGRpc3BsYXlDb250ZW50cy5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb3NlZCcpKSB7XG4gICAgICBkaXNwbGF5Q29udGVudHMuY2xhc3NMaXN0LnJlbW92ZSgnY2xvc2VkJyk7XG4gICAgICBkaXNwbGF5Q29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93bmApO1xuICAgIH0gXG4gICAgLy8gaWYgZGlzcGxheSBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdFxuICAgIGVsc2Uge1xuICAgICAgZGlzcGxheUNvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ2Nsb3NlZCcpO1xuICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tc2lkZWApO1xuICAgIH1cbiAgfSk7XG59XG5cbiIsImltcG9ydCAqIGFzIENvbnRlbnRzIGZyb20gJy4vQ29udGVudHMnO1xuaW1wb3J0ICogYXMgR3JvdXBpbmcgZnJvbSAnLi9Hcm91cGluZyc7XG5pbXBvcnQgTm90aWZpY2F0aW9uIGZyb20gJy4uL3V0aWxzL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgU3BsaXRTdGFmZkhhbmRsZXIgfSBmcm9tICcuL1N0YWZmVG9vbHMnO1xuaW1wb3J0IHsgU3BsaXROZXVtZUhhbmRsZXIgfSBmcm9tICcuL05ldW1lVG9vbHMnO1xuaW1wb3J0IHtcbiAgQ2hhaW5BY3Rpb24sXG4gIENoYW5nZVN0YWZmQWN0aW9uLFxuICBEaXNwbGFjZUNsZWZPY3RhdmVBY3Rpb24sXG4gIEVkaXRvckFjdGlvbixcbiAgTWF0Y2hIZWlnaHRBY3Rpb24sXG4gIFJlbW92ZUFjdGlvbixcbiAgU2V0QWN0aW9uLFxuICBTZXRDbGVmQWN0aW9uLFxuICBTZXRMaXF1ZXNjZW50QWN0aW9uLFxufSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuLi91dGlscy9TZWxlY3RUb29scyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuXG4vKipcbiAqIFRoZSBOZW9uVmlldyBwYXJlbnQgdG8gY2FsbCBlZGl0b3IgYWN0aW9ucy5cbiAqL1xubGV0IG5lb25WaWV3OiBOZW9uVmlldztcblxuLyoqXG4gKiBJbml0aWFsaXplIE5lb25WaWV3LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdE5lb25WaWV3KHZpZXc6IE5lb25WaWV3KTogdm9pZCB7XG4gIG5lb25WaWV3ID0gdmlldztcbiAgR3JvdXBpbmcuaW5pdE5lb25WaWV3KHZpZXcpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBpbmNsaW5hdHVtIHBhcmFtZXRlciBvZiBhIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc2V0SW5jbGluYXR1bUFjdGlvbihpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYUFjdGlvbihpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgcmV2ZXJzZWQgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2Nsb2Nrd2lzZSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24oaWQ6IHN0cmluZyk6IFNldEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0JyxcbiAgICBwYXJhbToge1xuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGF0dHJUeXBlOiAnY3VydmUnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2FudGljbG9ja3dpc2UgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihcbiAgaWQ6IHN0cmluZyxcbik6IFNldExpcXVlc2NlbnRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldExpcXVlc2NlbnQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgY3VydmU6ICcnLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBFdmVudCBoYW5kbGVyIGZvciBkZWxldGUgYnV0dG9uIHByZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUJ1dHRvbkhhbmRsZXIoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIGlmIChldnQua2V5ID09PSAnZCcgfHwgZXZ0LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcbiAgICByZW1vdmVIYW5kbGVyKCk7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmQgdGhlIGV4dHJhIG9wdGlvbnMgbWVudS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgaWYgKG1vcmVFZGl0KSB7XG4gICAgbW9yZUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgfVxuICBpZiAoZXh0cmFFZGl0KSB7XG4gICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgIGV4dHJhRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSByZW1vdmluZyBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcigpOiB2b2lkIHtcbiAgY29uc3QgdG9SZW1vdmU6IFJlbW92ZUFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2FjY2lkJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5hY2NpZCcpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSkge1xuICAgICAgZWxlbSA9IGVsZW0uY2xvc2VzdCgnLmRpdkxpbmUnKTtcbiAgICB9XG4gICAgdG9SZW1vdmUucHVzaCh7XG4gICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvUmVtb3ZlLFxuICB9O1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIHJlLWFzc29jaWF0aW5nIGVsZW1lbnRzIHRvIHRoZSBuZWFyZXN0IHN0YWZmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VTdGFmZkhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvQ2hhbmdlOiBDaGFuZ2VTdGFmZkFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIHRvQ2hhbmdlLnB1c2goe1xuICAgICAgYWN0aW9uOiAnY2hhbmdlU3RhZmYnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b0NoYW5nZSxcbiAgfTtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBuZW9uVmlldy5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKCkgPT4ge1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnNlcnRpbmcgZGl2aXNpbyBvciBhY2NpZGVudGFsIGludG8gbmVhcmVzdCBzeWxsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvSW5zZXJ0OiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICB0b0luc2VydC5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ2luc2VydFRvU3lsbGFibGUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvSW5zZXJ0LFxuICB9O1xuICBuZW9uVmlld1xuICAgIC5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0luc2VydCBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSW5zZXJ0IEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIG1vdmluZyBkaXZpc2lvIG9yIGFjY2lkZW50YWwgb3V0IG9mIHN5bGxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlT3V0c2lkZVN5bGxhYmxlSGFuZGxlcigpOiB2b2lkIHtcbiAgY29uc3QgdG9Nb3ZlOiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICB0b01vdmUucHVzaCh7XG4gICAgICBhY3Rpb246ICdtb3ZlT3V0c2lkZVN5bGxhYmxlJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbS5pZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b01vdmUsXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBGYWlsZWQgWG9YJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIG1hdGNoIGJib3ggaGVpZ2h0IHRvIHRoZSBzZWxlY3RlZCBiYm94XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEhlaWdodEhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDEpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnQ2Fubm90IG1hdGNoIGhlaWdodCB0byBtdWx0aXBsZSBiYm94JyxcbiAgICAgICdlcnJvcicsXG4gICAgKTtcbiAgfVxuICBjb25zdCB0b0NoYW5nZTogTWF0Y2hIZWlnaHRBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWF0Y2hIZWlnaHQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IHNlbGVjdGVkWzBdLmlkLFxuICAgIH0sXG4gIH07XG5cbiAgbmVvblZpZXcuZWRpdCh0b0NoYW5nZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0hlaWdodCBNYXRjaCBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdIZWlnaHQgTWF0Y2ggRmFpbGVkIFhvWCcsICdlcnJvcicpO1xuICAgIH1cbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgQWRkIFN5bCBUZXh0IG1vZGFsIHdpbmRvdyB3aXRoIFVJIGZvciBlbnRlcmluZyBzeWxsYWJsZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBvcGVuQWRkU3lsV2luZG93KCk6IHZvaWQge1xuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZW9uVmlldy5tb2RhbDtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5BRERfVEVYVCk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWRkU3lsTGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGFkZFN5bCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRTeWwnKTtcbiAgYWRkU3lsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5BZGRTeWxXaW5kb3cpO1xuICBhZGRTeWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkFkZFN5bFdpbmRvdyk7XG59XG5cbmZ1bmN0aW9uIGFkZERlbGV0ZUxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBkZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlJyk7XG5cbiAgaWYgKGRlbCkge1xuICAgIGRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICAgIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuXG4gICAgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgb3V0c2lkZSB0aGUgaWYgY29uZGl0aW9uP1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBjaGFuZ2VTdGFmZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFuZ2VTdGFmZicpO1xuICBjaGFuZ2VTdGFmZj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICBjaGFuZ2VTdGFmZj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgaW5wdXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29sdW1uSW5mbygpOiB2b2lkIHtcbiAgY29uc3QgY29sSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgc3RhdmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmLnNlbGVjdGVkJyk7XG4gIGxldCBjb2xJbmZvOiBudW1iZXI7XG4gIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgY29uc3QgaGFzQ29sdW1uID0gQXJyYXkuZnJvbShzdGFmZi5jbGFzc0xpc3QpXG4gICAgICAuam9pbignICcpXG4gICAgICAubWF0Y2goL1xcYmNvbHVtbihcXGQrKVxcYi8pO1xuICAgIGlmIChoYXNDb2x1bW4pIHtcbiAgICAgIGNvbnN0IHN0YWZmQ29sID0gcGFyc2VJbnQoaGFzQ29sdW1uWzFdLCAxMCk7XG4gICAgICBpZiAoY29sSW5mbyAmJiBjb2xJbmZvICE9IHN0YWZmQ29sKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLXdhcm5pbmcnKTtcbiAgICAgICAgd2FybmluZy5pbm5lclRleHQgPSAnVGhlIHNlbGVjdGVkIHN0YXZlcyBhcmUgbm90IG9mIHRoZSBzYW1lIGNvbHVtbiEnO1xuICAgICAgICBjb2xJbmZvID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xJbmZvID0gc3RhZmZDb2w7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb2xJbmZvKSBjb2xJbnB1dC52YWx1ZSA9IGNvbEluZm8udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBBZGQgY29sdW1uIGluZm8gZWRpdCBoYW5kbGVyIGZvciBjb2x1bW4gaW5mbyBlZGl0b3JcbiAqL1xuZnVuY3Rpb24gYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCBkZWNyZW1lbnRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAnY29sLWRlY3JlbWVudCcsXG4gICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGluY3JlbWVudEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICdjb2wtaW5jcmVtZW50JyxcbiAgKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICdjb2wtY29uZmlybScsXG4gICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGNvbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC1pbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgZGVjcmVtZW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZU51bWJlcigtMSk7XG4gIH0pO1xuXG4gIGluY3JlbWVudEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVOdW1iZXIoMSk7XG4gIH0pO1xuXG4gIC8vIEFkZCBjb2x1bW4gaW5mbyBlZGl0IGhhbmRsZXJcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b1NldENvbHVtbjogRWRpdG9yQWN0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzdGF2ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYuc2VsZWN0ZWQnKTtcbiAgICBzdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICAgIHRvU2V0Q29sdW1uLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3RhZmYuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICd0eXBlJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdjb2x1bW4nICsgY29sSW5wdXQudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgICBwYXJhbTogdG9TZXRDb2x1bW4sXG4gICAgfTtcbiAgICBuZW9uVmlld1xuICAgICAgLmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdDb2x1bW4gVmFsdWUgVXBkYXRlIFN1Y2Nlc3MnLFxuICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ0NvbHVtbiBWYWx1ZSBVcGRhdGUgRmFpbGVkIFhvWCcsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZU51bWJlcihjaGFuZ2U6IG51bWJlcikge1xuICAgIGNvbnN0IG1pbk51bSA9IDE7XG4gICAgY29uc3QgbWF4TnVtID0gNTtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gcGFyc2VJbnQoY29sSW5wdXQudmFsdWUsIDEwKSB8fCAwO1xuICAgIGN1cnJlbnRWYWx1ZSArPSBjaGFuZ2U7XG5cbiAgICBjdXJyZW50VmFsdWUgPSBNYXRoLm1pbihNYXRoLm1heChjdXJyZW50VmFsdWUsIG1pbk51bSksIG1heE51bSk7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS50b1N0cmluZygpICE9IGNvbElucHV0LnZhbHVlKVxuICAgICAgY29uZmlybUJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgY29sSW5wdXQudmFsdWUgPSBjdXJyZW50VmFsdWUudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHNldCB0aGUgSFRNTCBjb250ZW50IG9mIGVkaXQgY29udHJvbHM6IGVpdGhlciAjbW9yZUVkaXQgb3IgI2V4dHJhRWRpdFxuICpcbiAqIEBwYXJhbSB7J21vcmVFZGl0JyB8ICdleHRyYUVkaXQnfSBlZGl0VHlwZSAtIFRoZSB0eXBlIG9mIGVkaXQgY29udHJvbHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50cyAtIFRoZSBpbm5lckhUTUwgY29udGVudHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVwbGFjZSAtIElzIHRoZSBpbm5lckhUTUwgYmVpbmcgcmVwbGFjZWQsIG9yIGJlaW5nIGFkZGVkIHRvP1xuICovXG5mdW5jdGlvbiBzZXRFZGl0Q29udHJvbHMoXG4gIGVkaXRUeXBlOiAnbW9yZUVkaXQnIHwgJ2V4dHJhRWRpdCcsXG4gIGNvbnRlbnRzOiBzdHJpbmcsXG4gIHJlcGxhY2UgPSB0cnVlLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0VHlwZSk7XG5cbiAgaWYgKGVkaXQpIHtcbiAgICBlZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgaWYgKHJlcGxhY2UpIGVkaXQuaW5uZXJIVE1MID0gY29udGVudHM7XG4gICAgZWxzZSBlZGl0LmlubmVySFRNTCArPSBjb250ZW50cztcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgdGhlIGV4dHJhIG5jIGFjdGlvbiBtZW51IGZvciBhIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOY0FjdGlvbnMobmM6IFNWR0dyYXBoaWNzRWxlbWVudCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG5cbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLmRlZmF1bHRBY3Rpb25Db250ZW50cyk7XG4gIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMubmNBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1B1bmN0dW0uZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRJbmNsaW5hdHVtID0gdW5zZXRJbmNsaW5hdHVtQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2EgPSB1bnNldFZpcmdhQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNJbmNsaW5hdHVtLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2EgPSB1bnNldFZpcmdhQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNldEluY2xpbmF0dW06IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnc2UnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2EsXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2FSZXZlcnNlZCxcbiAgICAgICAgICAgICAgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgICBzZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjVmlyZ2EuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNldFZpcmdhOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3MnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2FSZXZlcnNlZCxcbiAgICAgICAgICAgICAgdW5zZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldFZpcmdhLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjVmlyZ2FSZXZlcnNlZC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKFxuICAgICAgICBuYy5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXRWaXJnYVJldmVyc2VkOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ24nLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgICBzZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjTGlxdWVzY2VudENsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKFxuICAgICAgICBuYy5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50Q2xvY2t3aXNlOiBTZXRMaXF1ZXNjZW50QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRMaXF1ZXNjZW50JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGN1cnZlOiAnYycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgbmVvblZpZXdcbiAgICAgICAgLmVkaXQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgICAgICAgICAgcGFyYW06IFtcbiAgICAgICAgICAgICAgdW5zZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgICB1bnNldFZpcmdhLFxuICAgICAgICAgICAgICB1bnNldFZpcmdhUmV2ZXJzZWQsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZTogU2V0TGlxdWVzY2VudEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0TGlxdWVzY2VudCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBjdXJ2ZTogJ2EnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgbmV1bWUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOZXVtZUFjdGlvbnMoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdE5ldW1lQWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLm5ldW1lQWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGNvbnN0IG5ldW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJyk7XG4gIGlmIChuZXVtZS5sZW5ndGggIT09IDEpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnTW9yZSB0aGFuIG9uZSBuZXVtZSBzZWxlY3RlZCEgQ2Fubm90IHRyaWdnZXIgTmV1bWUgQ2xpY2tTZWxlY3QgYWN0aW9ucy4nLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVE9ETyBhZGQgdHJpZ2dlciBmb3Igc3BsaXQgYWN0aW9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdC1uZXVtZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IG5ldW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ldW1lLnNlbGVjdGVkJykgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgaWYgKG5ldW1lICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IG5ldyBTcGxpdE5ldW1lSGFuZGxlcihuZW9uVmlldywgbmV1bWUpO1xuICAgICAgc3BsaXQuc3RhcnRTcGxpdCgpO1xuICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBzdGFmZiB3YXMgc2VsZWN0ZWQhJyk7XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjUGVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNQZXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDbGl2aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1NjYW5kaWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjU2NhbmRpY3VzRmxleHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDbGltYWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2xpbWFjdXNSZXN1cGludXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1RvcmN1bHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNUb3JjdWx1c1Jlc3VwaW51cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjUG9ycmVjdHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXNGbGV4dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1BvcnJlY3R1c1N1YnB1bmN0aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1ByZXNzdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlR3JvdXBpbmdBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYW5nZUdyb3VwJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogbmV1bWVbMF0uaWQsXG4gICAgICAgIGNvbnRvdXI6IGNvbnRvdXIsXG4gICAgICB9LFxuICAgIH07XG4gICAgbmVvblZpZXdcbiAgICAgIC5lZGl0KGNoYW5nZUdyb3VwaW5nQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3lsbGFibGUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoc2VsZWN0aW9uVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3lsbGFibGVBY3Rpb25zQ29udGVudCk7XG4gIC8vIGluaXRpYWxpemUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgaHRtbCB0byBiZSBhZGRlZCB0byBEaXNwbGF5IHBhbmVsXG4gIGxldCBleHRyYUFjdGlvbnNIVE1MID0gJyc7XG5cbiAgLy8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiB0aGF0IHdhcyBtYWRlIGJ5IHRoZSB1c2VyXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIC8vIG9ubHkgb25lIHN5bGxhYmxlIGFuZCBzeWxsYWJsZSBoYXMgbm8gPHN5bD5cbiAgICBjYXNlICdub1N5bCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiYWRkU3lsXCI+QWRkIFN5bGxhYmxlIFRleHQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyBvbmx5IG9uZSBzeWxsYWJsZVxuICAgIGNhc2UgJ3NpbmdsZVNlbGVjdCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyB0d28gc3lsbGFibGVzIG9uIHNlcGFyYXRlIHN0YXZlc1xuICAgIGNhc2UgJ2xpbmthYmxlU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ0b2dnbGUtbGlua1wiPlRvZ2dsZSBMaW5rZWQgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gdG93IG9yIG1vcmUgc3lsbGFibGVzIG9uIG9uZSBzdGFmZlxuICAgIGNhc2UgJ211bHRpU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtZXJnZVN5bHNcIj5NZXJnZSBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvL2RlZmF1bHQgb3B0aW9uc1xuICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgZXh0cmFBY3Rpb25zSFRNTCArPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBzZXQgY29udGVudCBvZiBhZGRpdGlvbmFsIGFjdGlvbnMgaW4gRGlzcGxheSBwYW5lbFxuICAvLyBhbmQgaW5pdGlhbGl6ZSBuZWNlc3NhcnkgbGlzdGVuZXJzXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBleHRyYUFjdGlvbnNIVE1MLCB0cnVlKTtcbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGV4dHJhIGxheWVyIGVsZW1lbnQgKGFjY2lkLCBkaXZMaW5lLCBjdXN0b3MsIGNsZWYpIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnY3VzdG9zJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuY3VzdG9zQWN0aW9uQ29udGVudHMpO1xuICAgIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFyZW50SXNTeWxsYWJsZSA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJyk7XG4gIGNvbnN0IGxheWVyRWxlbWVudEFjdGlvbnMgPSBwYXJlbnRJc1N5bGxhYmxlXG4gICAgPyBDb250ZW50cy5sYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzXG4gICAgOiBDb250ZW50cy5sYXllckVsZW1lbnRPdXRBY3Rpb25Db250ZW50cztcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgbGF5ZXJFbGVtZW50QWN0aW9ucywgZmFsc2UpO1xuXG4gIC8vIGV4dHJhIGFjdGlvbnMgZm9yIGFjY2lkIGFuZCBkaXZMaW5lXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYWNjaWQnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuYWNjaWRBY3Rpb25Db250ZW50cyk7XG4gICAgYWNjaWRPcHRpb25zTGlzdGVuZXIoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuY2xlZkFjdGlvbkNvbnRlbnRzKTtcbiAgICBjbGVmT3B0aW9uc0xpc3RlbmVyKGVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmRpdkxpbmVBY3Rpb25Db250ZW50cyk7XG4gICAgZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50KTtcbiAgfVxuICBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdpbnNlcnRUb1N5bGxhYmxlJylcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIpO1xuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZCgnbW92ZU91dHNpZGVTeWxsYWJsZScpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyKTtcblxuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydFRvU3lsbGFibGUnKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnNlcnRUb1N5bGxhYmxlSGFuZGxlcik7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdtb3ZlT3V0c2lkZVN5bGxhYmxlJylcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBhY2NpZE9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvRmxhdC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VUb0ZsYXQ6IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdhY2NpZCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnZicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihjaGFuZ2VUb0ZsYXQpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9OYXR1cmFsLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZVRvTmF0dXJhbDogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2FjY2lkJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICduJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKGNoYW5nZVRvTmF0dXJhbCk7XG4gICAgfSk7XG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuZnVuY3Rpb24gY2xlZk9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2luY3JlbWVudC1vY3RhdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBpbmNyZW1lbnRPY3RhdmU6IERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2Rpc3BsYWNlQ2xlZk9jdGF2ZScsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGRpcmVjdGlvbjogJ2Fib3ZlJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIG5lb25WaWV3XG4gICAgICAuZWRpdChpbmNyZW1lbnRPY3RhdmUsIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xlZiBvY3RhdmUgaW5jcmVtZW50ZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnTWF4aW11bSBvY3RhdmUgZGlzcGxhY2VtZW50IHJlYWNoZWQuIENsZWYgY2FuIG9ubHkgYmUgZGlzcGxhY2VkIHVwIHRvIDMgb2N0YXZlcy4nLFxuICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVjcmVtZW50LW9jdGF2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IGluY3JlbWVudE9jdGF2ZTogRGlzcGxhY2VDbGVmT2N0YXZlQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnZGlzcGxhY2VDbGVmT2N0YXZlJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZGlyZWN0aW9uOiAnYmVsb3cnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgbmVvblZpZXdcbiAgICAgIC5lZGl0KGluY3JlbWVudE9jdGF2ZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDbGVmIG9jdGF2ZSBkZWNyZW1lbnRlZC4nLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdNYXhpbXVtIG9jdGF2ZSBkaXNwbGFjZW1lbnQgcmVhY2hlZC4gQ2xlZiBjYW4gb25seSBiZSBkaXNwbGFjZWQgdXAgdG8gMyBvY3RhdmVzLicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRDQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnQycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRDQ2xlZik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNGQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRGQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnRicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRGQ2xlZik7XG4gICAgfSk7XG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuZnVuY3Rpb24gZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWluaW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWluaW1hOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWluaW1hJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvTWluaW1hKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9NYWlvci5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb01haW9yOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWFpb3InLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9NYWlvcik7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWF4aW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWF4aW1hOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWF4aW1hJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvTWF4aW1hKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9GaW5hbGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvRmluYWxpczogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ2ZpbmFsaXMnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9GaW5hbGlzKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9DYWVzdXJhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvQ2Flc3VyYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ2NhZXN1cmEnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9DYWVzdXJhKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9WaXJndWxhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvVmlyZ3VsYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3Zpcmd1bGEnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9WaXJndWxhKTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFBhcnNlIGFjdGlvbnMgcmVnYXJkaW5nIHNoYXBlIGNoYW5nZXMgdG8gZWRpdG9yIGFjdGlvblxuICovXG5mdW5jdGlvbiBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKGFjdGlvbjogU2V0QWN0aW9uIHwgU2V0Q2xlZkFjdGlvbikge1xuICBuZW9uVmlldy5lZGl0KGFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3RhZmYgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJNdWx0aVN0YWZmQWN0aW9ucygpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5jb2x1bW5BY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgLy8gQ29sdW1uIGluZm8gZWRpdG9yXG4gIHVwZGF0ZUNvbHVtbkluZm8oKTtcbiAgYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lcmdlLXN5c3RlbXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBHcm91cGluZy5tZXJnZVN0YXZlcygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFbnRlciBzdGFmZiBzcGxpdHRpbmcgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclN0YWZmU3BsaXRNb2RlKCk6IHZvaWQge1xuICBjb25zdCBzdGFmZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdGFmZi5zZWxlY3RlZCcpIGFzIFNWR0dFbGVtZW50O1xuICBpZiAoc3RhZmYgIT09IG51bGwpIHtcbiAgICBjb25zdCBzcGxpdCA9IG5ldyBTcGxpdFN0YWZmSGFuZGxlcihuZW9uVmlldywgc3RhZmYpO1xuICAgIHNwbGl0LnN0YXJ0U3BsaXQoKTtcbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkIScpO1xuICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgc3BsaXQgc3RhZmYgb3B0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5zdGFmZlNwbGl0QWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmNvbHVtbkFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcblxuICAvLyBDb2x1bW4gaW5mbyBlZGl0b3JcbiAgdXBkYXRlQ29sdW1uSW5mbygpO1xuICBhZGRDb2x1bW5JbmZvU3RlcEhhbmRsZXIoKTtcblxuICAvLyBBZGQgdHJpZ2dlciBmb3Igc3BsaXQgYWN0aW9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdC1zeXN0ZW0nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB0cmlnZ2VyU3RhZmZTcGxpdE1vZGUoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXJvdGF0ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWZmID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN0YWZmLnNlbGVjdGVkJykgYXMgU1ZHRWxlbWVudDtcbiAgICAvLyBVbnVzZWQgdmFyaWFibGVzOlxuICAgIC8vIGNvbnN0IHJlY3QgPSBzdGFmZi5xdWVyeVNlbGVjdG9yKCcjcmVzaXplUmVjdCcpO1xuICAgIC8vIGNvbnN0IGNvID0gcmVjdC5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpLnNwbGl0KCcgJyk7XG4gICAgLy8gY29uc3QgZHkgPSBwYXJzZUludChjb1swXS5zcGxpdCgnLCcpWzFdKSAtIHBhcnNlSW50KGNvWzFdLnNwbGl0KCcsJylbMV0pO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldFN0YWZmQkJveChzdGFmZiBhcyBTVkdHRWxlbWVudCk7XG4gICAgY29uc3QgeV9jaGFuZ2UgPSBNYXRoLnRhbihwb2ludHMucm90YXRlKSAqIChwb2ludHMubHJ4IC0gcG9pbnRzLnVseCk7XG4gICAgaWYgKHN0YWZmICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IHN0YWZmLmlkLFxuICAgICAgICAgIHVseDogcG9pbnRzLnVseCxcbiAgICAgICAgICB1bHk6XG4gICAgICAgICAgICBwb2ludHMucm90YXRlID4gMFxuICAgICAgICAgICAgICA/IHBvaW50cy51bHkgKyB5X2NoYW5nZSAvIDJcbiAgICAgICAgICAgICAgOiBwb2ludHMudWx5IC0geV9jaGFuZ2UgLyAyLFxuICAgICAgICAgIGxyeDogcG9pbnRzLmxyeCxcbiAgICAgICAgICBscnk6XG4gICAgICAgICAgICBwb2ludHMucm90YXRlID4gMFxuICAgICAgICAgICAgICA/IHBvaW50cy5scnkgLSB5X2NoYW5nZSAvIDJcbiAgICAgICAgICAgICAgOiBwb2ludHMubHJ5ICsgeV9jaGFuZ2UgLyAyLFxuICAgICAgICAgIHJvdGF0ZTogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBuZW9uVmlld1xuICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkJyk7XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGJib3ggb3B0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckJCb3hBY3Rpb25zKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5iYm94QWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWF0Y2hIZWlnaHQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtYXRjaEhlaWdodEhhbmRsZXIoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBkZWZhdWx0IGFjdGlvbnMgd2hlbiBzZWxlY3RpbmcgYnkgc3lsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLmRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGRlZmF1bHQgc2VsZWN0aW9uIG9wdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJEZWZhdWx0QWN0aW9ucygpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGV4dHJhIGRyb3Bkb3duIG9wdGlvbnM6XG4gKiBMaXN0ZW4gdG8gY2xpY2tzIG9uIGRyb3Bkb3duc1xuICovXG5mdW5jdGlvbiBpbml0T3B0aW9uc0xpc3RlbmVycygpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bfc2VsZWN0JykuZm9yRWFjaCgoZHJvcCkgPT4ge1xuICAgIC8vIFdoZW4gYW55dGhpbmcgdGhhdCBpcyBub3QgdGhlIGRyb3Bkb3duIGlzIGNsaWNrZWQgYXdheSwgdGhlIGRyb3Bkb3duXG4gICAgLy8gc2hvdWxkIGxvc2UgaXRzIHZpc2liaWxpdHlcbiAgICBjb25zdCBvcHRpb25zQ2xpY2thd2F5ID0gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9wdGlvbnNDbGlja2F3YXkpO1xuICAgICAgZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICB9O1xuXG4gICAgZHJvcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldnQpID0+IHtcbiAgICAgIC8vIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGRyb3Bkb3duXG4gICAgICBkcm9wLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAvLyBSZW1vdmUgdmlzaWJpbGl0eSBvZiBvdGhlciBkcm9wZG93bnMgd2hlbiB0aGlzIG9uZSBpcyBjbGlja2VkXG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wX3NlbGVjdCcpKVxuICAgICAgICAuZmlsdGVyKChvdGhlcikgPT4gb3RoZXIgIT09IGRyb3ApXG4gICAgICAgIC5mb3JFYWNoKChvdGhlcikgPT4gb3RoZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJykpO1xuXG4gICAgICAvLyBEb24ndCBhbGxvdyBvdGhlciBldmVudCBsaXN0ZW5lcnMgb24gdGhlIGJvZHkgdG8gaW50ZXJmZXJlIHdpdGggdGhpcyBsaXN0ZW5lclxuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoZHJvcC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uc0NsaWNrYXdheSk7XG4gICAgICBlbHNlIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25zQ2xpY2thd2F5KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuZXhwb3J0IGludGVyZmFjZSBQb2ludCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJCb3gge1xuICB1bHg6IG51bWJlcjtcbiAgdWx5OiBudW1iZXI7XG4gIGxyeDogbnVtYmVyO1xuICBscnk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgU1ZHIHJlbGF0aXZlIGNvb3JkaW5hdGVzIGdpdmVuIGNsaWVudFggYW5kIGNsaWVudFlcbiAqIFNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjkyNjEzMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNWR1JlbENvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBQb2ludCB7XG4gIGNvbnN0IHB0ID0gbmV3IERPTVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFNWR1NWR0VsZW1lbnQ+KCcuYWN0aXZlLXBhZ2UgPiAuZGVmaW5pdGlvbi1zY2FsZScpO1xuICBjb25zdCBwYWdlTWFyZ2luID0gc3ZnLnF1ZXJ5U2VsZWN0b3I8U1ZHR0VsZW1lbnQ+KCcucGFnZS1tYXJnaW4nKTtcblxuICBjb25zdCB7IHgsIHkgfSA9IHB0Lm1hdHJpeFRyYW5zZm9ybShwYWdlTWFyZ2luLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gIHJldHVybiB7IHgsIHkgfTtcblxuICAvLyBJZiB0aGVyZSBpcyBzb21lIGlzc3VlIHdpdGggY29vcmRpbmF0ZXMsIHRoaXMgbWF5IGZpeCB0aGUgaXNzdWU6XG4gIC8vIGNvbnN0IHN2ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHU1ZHRWxlbWVudD4oJyNzdmdfZ3JvdXAnKTtcbiAgLy8gY29uc3QgeyB4LCB5IH0gPSBwdC5tYXRyaXhUcmFuc2Zvcm0oc3ZnLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG59XG5cbi8qKlxuICogR2V0IElEIG9mIHN0YWZmIGJ5IGNsaWVudCdzIHgteSBjb29yZGluYXRlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHRoZSAqdmlzdWFsKiBib3VuZGluZyBib3ggb2YgdGhlIHN0YWZmXG4gKiBiYXNlZCBvbiBpdHMgc3RhZmYgbGluZXMsIGluc3RlYWQgb2YgdGhlIFNWRyBlbGVtZW50IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmSWRCeUNvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzdGF2ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8U1ZHR0VsZW1lbnQ+KCcuc3RhZmYnKSk7XG4gIGNvbnN0IHN0YWZmQkJveGVzID0gc3RhdmVzLm1hcChzdGFmZiA9PiBnZXRTdGFmZkJCb3goc3RhZmYpKTtcblxuICAvLyBmaW5kIHRoZSBzdGFmZiB0aGF0IHRoZSBjdXJzb3IgaXMgaW5zaWRlXG4gIGNvbnN0IHsgeCwgeSB9ID0gZ2V0U1ZHUmVsQ29vcmRzKGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdGFmZiA9IHN0YWZmQkJveGVzLmZpbmQoXG4gICAgKGJib3gpID0+IHggPD0gYmJveC5scnggJiYgeCA+PSBiYm94LnVseCAmJiB5IDw9IGJib3gubHJ5ICYmIHkgPj0gYmJveC51bHlcbiAgKTsgXG5cbiAgLy8gSWYgdGhlcmUgaXMgaXNzdWVzIHdpdGggZmluZGluZyB0aGUgc3RhZmYsIHRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGU6XG4gIC8vIHJldHVybiAocHQueCA+IHVseCAmJiBwdC54IDwgbHJ4KSAmJlxuICAvLyAgIChwdC55ID4gKHVseSArIChwdC54IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkpKSAmJlxuICAvLyAgIChwdC55IDwgKGxyeSAtIChscnggLSBwdC54KSAqIE1hdGgudGFuKHJvdGF0ZSkpKTtcblxuICAvLyBpZiB0aGUgY3Vyc29yIGlzIG5vdCBpbnNpZGUgYW55IHN0YWZmLCB0aGVuIGV4cGxpY2l0bHkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHN0YWZmID8gc3RhZmYuaWQgOiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBzdGFmZiBieSBjbGllbnQncyB4LXkgY29vcmRpbmF0ZXM7IHdyYXBwZXIgZm9yIGdldFN0YWZmSWRCeUNvb3JkcywgYnV0XG4gKiAgIHJldHVybnMgdGhlIGVsZW1lbnQsIG5vdCB0aGUgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmQnlDb29yZHMgKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogU1ZHR0VsZW1lbnQgfCBudWxsIHtcbiAgY29uc3Qgc3RhZmZJZCA9IGdldFN0YWZmSWRCeUNvb3JkcyhjbGllbnRYLCBjbGllbnRZKTtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3N0YWZmSWR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc091dE9mU1ZHQm91bmRzICh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiZ0ltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHSW1hZ2VFbGVtZW50PignI2JnaW1nJyk7XG4gIFxuICByZXR1cm4gKFxuICAgIHggPD0gMCB8fCB4ID49IE51bWJlcihiZ0ltZy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHx8XG4gICAgeSA8PSAwIHx8IHkgPj0gTnVtYmVyKGJnSW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IGJvdW5kaW5nIGJveCAobHJ4LCBscnksIHVseCwgdWx5KSBvZiBhIGdseXBoLCB3aGljaFxuICogaXMgYSA8dXNlPiBlbGVtZW50IGluIHRoZSBTVkdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdseXBoQkJveCAoZzogU1ZHUmVjdEVsZW1lbnQgfCBTVkdVc2VFbGVtZW50KTogQkJveCB7XG4gIGNvbnN0IHJlY3QgPSAoZy50YWdOYW1lID09ICdyZWN0JykgPyBnLmdldEJCb3goKSA6IChnLnBhcmVudE5vZGUgYXMgU1ZHR0VsZW1lbnQpLmdldEJCb3goKTtcblxuICByZXR1cm4ge1xuICAgIHVseDogcmVjdC54LFxuICAgIHVseTogcmVjdC55LFxuICAgIGxyeDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBscnk6IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cbiIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gTm9kZS9Db21tb25KU1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTURcbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAod2l0aCBzdXBwb3J0IGZvciB3ZWIgd29ya2VycylcbiAgICAgICAgdmFyIGdsb2I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdsb2IgPSB3aW5kb3c7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdsb2IgPSBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2xvYi5TcGFya01ENSA9IGZhY3RvcnkoKTtcbiAgICB9XG59KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8qXG4gICAgICogRmFzdGVzdCBtZDUgaW1wbGVtZW50YXRpb24gYXJvdW5kIChKS00gbWQ1KS5cbiAgICAgKiBDcmVkaXRzOiBKb3NlcGggTXllcnNcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sXG4gICAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9tZDUtc2hvb3RvdXQvN1xuICAgICAqL1xuXG4gICAgLyogdGhpcyBmdW5jdGlvbiBpcyBtdWNoIGZhc3RlcixcbiAgICAgIHNvIGlmIHBvc3NpYmxlIHdlIHVzZSBpdC4gU29tZSBJRXNcbiAgICAgIGFyZSB0aGUgb25seSBvbmVzIEkga25vdyBvZiB0aGF0XG4gICAgICBuZWVkIHRoZSBpZGlvdGljIHNlY29uZCBmdW5jdGlvbixcbiAgICAgIGdlbmVyYXRlZCBieSBhbiBpZiBjbGF1c2UuICAqL1xuICAgIHZhciBhZGQzMiA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYSArIGIpICYgMHhGRkZGRkZGRjtcbiAgICB9LFxuICAgICAgICBoZXhfY2hyID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ107XG5cblxuICAgIGZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgICAgIGEgPSBhZGQzMihhZGQzMihhLCBxKSwgYWRkMzIoeCwgdCkpO1xuICAgICAgICByZXR1cm4gYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVjeWNsZSh4LCBrKSB7XG4gICAgICAgIHZhciBhID0geFswXSxcbiAgICAgICAgICAgIGIgPSB4WzFdLFxuICAgICAgICAgICAgYyA9IHhbMl0sXG4gICAgICAgICAgICBkID0geFszXTtcblxuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzBdIC0gNjgwODc2OTM2IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbMV0gLSAzODk1NjQ1ODYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbMl0gKyA2MDYxMDU4MTkgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbM10gLSAxMDQ0NTI1MzMwIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzRdIC0gMTc2NDE4ODk3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbNV0gKyAxMjAwMDgwNDI2IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzZdIC0gMTQ3MzIzMTM0MSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1s3XSAtIDQ1NzA1OTgzIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzhdICsgMTc3MDAzNTQxNiB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzldIC0gMTk1ODQxNDQxNyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxMF0gLSA0MjA2MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1sxMV0gLSAxOTkwNDA0MTYyIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzEyXSArIDE4MDQ2MDM2ODIgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1sxM10gLSA0MDM0MTEwMSB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxNF0gLSAxNTAyMDAyMjkwIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzE1XSArIDEyMzY1MzUzMjkgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG5cbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxXSAtIDE2NTc5NjUxMCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzZdIC0gMTA2OTUwMTYzMiB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzExXSArIDY0MzcxNzcxMyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1swXSAtIDM3Mzg5NzMwMiB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1s1XSAtIDcwMTU1ODY5MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzEwXSArIDM4MDE2MDgzIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTVdIC0gNjYwNDc4MzM1IHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzRdIC0gNDA1NTM3ODQ4IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzldICsgNTY4NDQ2NDM4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTRdIC0gMTAxOTgwMzY5MCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzNdIC0gMTg3MzYzOTYxIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzhdICsgMTE2MzUzMTUwMSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxM10gLSAxNDQ0NjgxNDY3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMl0gLSA1MTQwMzc4NCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzddICsgMTczNTMyODQ3MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1sxMl0gLSAxOTI2NjA3NzM0IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuXG4gICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzVdIC0gMzc4NTU4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzhdIC0gMjAyMjU3NDQ2MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTFdICsgMTgzOTAzMDU2MiB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTRdIC0gMzUzMDk1NTYgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMV0gLSAxNTMwOTkyMDYwIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzRdICsgMTI3Mjg5MzM1MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbN10gLSAxNTU0OTc2MzIgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgXiBkIF4gYSkgKyBrWzEwXSAtIDEwOTQ3MzA2NDAgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMTNdICsgNjgxMjc5MTc0IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzBdIC0gMzU4NTM3MjIyIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1szXSAtIDcyMjUyMTk3OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbNl0gKyA3NjAyOTE4OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1s5XSAtIDY0MDM2NDQ4NyB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhIF4gYiBeIGMpICsga1sxMl0gLSA0MjE4MTU4MzUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzE1XSArIDUzMDc0MjUyMCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMl0gLSA5OTUzMzg2NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcblxuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1swXSAtIDE5ODYzMDg0NCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1s3XSArIDExMjY4OTE0MTUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzE0XSAtIDE0MTYzNTQ5MDUgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzVdIC0gNTc0MzQwNTUgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGtbMTJdICsgMTcwMDQ4NTU3MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1szXSAtIDE4OTQ5ODY2MDYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzEwXSAtIDEwNTE1MjMgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzFdIC0gMjA1NDkyMjc5OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s4XSArIDE4NzMzMTMzNTkgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDYgfCBhID4+PiAyNikgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbMTVdIC0gMzA2MTE3NDQgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzZdIC0gMTU2MDE5ODM4MCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMTNdICsgMTMwOTE1MTY0OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s0XSAtIDE0NTUyMzA3MCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1sxMV0gLSAxMTIwMjEwMzc5IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwO1xuICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1syXSArIDcxODc4NzI1OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbOV0gLSAzNDM0ODU1NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHwgYiA+Pj4gMTEpICsgYyB8IDA7XG5cbiAgICAgICAgeFswXSA9IGEgKyB4WzBdIHwgMDtcbiAgICAgICAgeFsxXSA9IGIgKyB4WzFdIHwgMDtcbiAgICAgICAgeFsyXSA9IGMgKyB4WzJdIHwgMDtcbiAgICAgICAgeFszXSA9IGQgKyB4WzNdIHwgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVibGsocykge1xuICAgICAgICB2YXIgbWQ1YmxrcyA9IFtdLFxuICAgICAgICAgICAgaTsgLyogQW5keSBLaW5nIHNhaWQgZG8gaXQgdGhpcyB3YXkuICovXG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIG1kNWJsa3NbaSA+PiAyXSA9IHMuY2hhckNvZGVBdChpKSArIChzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDgpICsgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpICsgKHMuY2hhckNvZGVBdChpICsgMykgPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNWJsa19hcnJheShhKSB7XG4gICAgICAgIHZhciBtZDVibGtzID0gW10sXG4gICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gYVtpXSArIChhW2kgKyAxXSA8PCA4KSArIChhW2kgKyAyXSA8PCAxNikgKyAoYVtpICsgM10gPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNTEocykge1xuICAgICAgICB2YXIgbiA9IHMubGVuZ3RoLFxuICAgICAgICAgICAgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgdGFpbCxcbiAgICAgICAgICAgIHRtcCxcbiAgICAgICAgICAgIGxvLFxuICAgICAgICAgICAgaGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbjsgaSArPSA2NCkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIG1kNWJsayhzLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGkgLSA2NCk7XG4gICAgICAgIGxlbmd0aCA9IHMubGVuZ3RoO1xuICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBzLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cbiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIGlmIChpID4gNTUpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1pZ2h0IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdFxuICAgICAgICB0bXAgPSBuICogODtcbiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtcbiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwO1xuXG4gICAgICAgIHRhaWxbMTRdID0gbG87XG4gICAgICAgIHRhaWxbMTVdID0gaGk7XG5cbiAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWQ1MV9hcnJheShhKSB7XG4gICAgICAgIHZhciBuID0gYS5sZW5ndGgsXG4gICAgICAgICAgICBzdGF0ZSA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgICB0YWlsLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBuOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrX2FycmF5KGEuc3ViYXJyYXkoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IHN1cmUgaWYgaXQgaXMgYSBidWcsIGhvd2V2ZXIgSUUxMCB3aWxsIGFsd2F5cyBwcm9kdWNlIGEgc3ViIGFycmF5IG9mIGxlbmd0aCAxXG4gICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50IGFycmF5IGlmIHRoZSBzdWIgYXJyYXkgc3BlY2lmaWVkIHN0YXJ0c1xuICAgICAgICAvLyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgcGFyZW50IGFycmF5IC0gd2VpcmQuXG4gICAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNzcxNDUyL3R5cGVkLWFycmF5LXN1YmFycmF5LWlzc3VlXG4gICAgICAgIGEgPSAoaSAtIDY0KSA8IG4gPyBhLnN1YmFycmF5KGkgLSA2NCkgOiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gYVtpXSA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICBpZiAoaSA+IDU1KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtaWdodCBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXRcbiAgICAgICAgdG1wID0gbiAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuXG4gICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmhleChuKSB7XG4gICAgICAgIHZhciBzID0gJycsXG4gICAgICAgICAgICBqO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzICs9IGhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl0gKyBoZXhfY2hyWyhuID4+IChqICogOCkpICYgMHgwRl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGV4KHgpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB4W2ldID0gcmhleCh4W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBmYXN0IGFkZDMyIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkLi5cbiAgICBpZiAoaGV4KG1kNTEoJ2hlbGxvJykpICE9PSAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKSB7XG4gICAgICAgIGFkZDMyID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICAgIHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRiksXG4gICAgICAgICAgICAgICAgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gICAgICAgICAgICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEFycmF5QnVmZmVyIHNsaWNlIHBvbHlmaWxsLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHRhdWJlcnQvbm9kZS1hcnJheWJ1ZmZlci1zbGljZVxuICAgICAqL1xuXG4gICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIUFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gY2xhbXAodmFsLCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAodmFsIHwgMCkgfHwgMDtcblxuICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh2YWwgKyBsZW5ndGgsIDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWwsIGxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gY2xhbXAoZnJvbSwgbGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUFycmF5O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gY2xhbXAodG8sIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJlZ2luID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbnVtID0gZW5kIC0gYmVnaW47XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEFycmF5QnVmZmVyKG51bSk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLCBiZWdpbiwgbnVtKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXJzLlxuICAgICAqL1xuXG4gICAgZnVuY3Rpb24gdG9VdGY4KHN0cikge1xuICAgICAgICBpZiAoL1tcXHUwMDgwLVxcdUZGRkZdLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRmOFN0cjJBcnJheUJ1ZmZlcihzdHIsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgICAgICAgIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSxcbiAgICAgICAgICAgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksXG4gICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gYXJyIDogYnVmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcnJheUJ1ZmZlcjJVdGY4U3RyKGJ1ZmYpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGZpcnN0LCBzZWNvbmQsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGZpcnN0LmJ5dGVMZW5ndGggKyBzZWNvbmQuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShmaXJzdCkpO1xuICAgICAgICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KHNlY29uZCksIGZpcnN0LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gcmVzdWx0IDogcmVzdWx0LmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoZXhUb0JpbmFyeVN0cmluZyhoZXgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW10sXG4gICAgICAgICAgICBsZW5ndGggPSBoZXgubGVuZ3RoLFxuICAgICAgICAgICAgeDtcblxuICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGVuZ3RoIC0gMTsgeCArPSAyKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKHBhcnNlSW50KGhleC5zdWJzdHIoeCwgMiksIDE2KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIFNwYXJrTUQ1IE9PUCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbWQ1LCBvdGhlcndpc2UgdXNlIHRoZVxuICAgICAqIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuXG4gICAgICovXG5cbiAgICBmdW5jdGlvbiBTcGFya01ENSgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHN0cmluZy5cbiAgICAgKiBBIGNvbnZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGFuIHV0Zjggc3RyaW5nIGlzIGRldGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBhcHBlbmQgYXMgYmluYXJ5XG4gICAgICAgIHRoaXMuYXBwZW5kQmluYXJ5KHRvVXRmOChzdHIpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgVGhlIGJpbmFyeSBzdHJpbmcgdG8gYmUgYXBwZW5kZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZEJpbmFyeSA9IGZ1bmN0aW9uIChjb250ZW50cykge1xuICAgICAgICB0aGlzLl9idWZmICs9IGNvbnRlbnRzO1xuICAgICAgICB0aGlzLl9sZW5ndGggKz0gY29udGVudHMubGVuZ3RoO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9idWZmLmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbGVuZ3RoOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCBtZDVibGsodGhpcy5fYnVmZi5zdWJzdHJpbmcoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYnVmZiA9IHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGkgLSA2NCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0ID0gaGV4KHRoaXMuX2hhc2gpO1xuXG4gICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgIHJldCA9IGhleFRvQmluYXJ5U3RyaW5nKHJldCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYnVmZiA9ICcnO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9oYXNoID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1ZmY6IHRoaXMuX2J1ZmYsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMuX2xlbmd0aCxcbiAgICAgICAgICAgIGhhc2g6IHRoaXMuX2hhc2guc2xpY2UoKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLl9idWZmID0gc3RhdGUuYnVmZjtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB0aGlzLl9oYXNoID0gc3RhdGUuaGFzaDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgdGhlIGluY3JlbWVudGFsIGJ1ZmZlciBhbmQgb3RoZXIgYWRkaXRpb25hbFxuICAgICAqIHJlc291cmNlcy4gSWYgeW91IHBsYW4gdG8gdXNlIHRoZSBpbnN0YW5jZSBhZ2FpbiwgdXNlIHJlc2V0IGluc3RlYWQuXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9oYXNoO1xuICAgICAgICBkZWxldGUgdGhpcy5fYnVmZjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgdGFpbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9ICB0YWlsICAgVGhlIHRhaWwgKHdpbGwgYmUgbW9kaWZpZWQpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgYnVmZmVyXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAodGFpbCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBpID0gbGVuZ3RoLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgaWYgKGkgPiA1NSkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gdGhlIGZpbmFsIGNvbXB1dGF0aW9uIGJhc2VkIG9uIHRoZSB0YWlsIGFuZCBsZW5ndGhcbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtYXkgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0XG4gICAgICAgIHRtcCA9IHRoaXMuX2xlbmd0aCAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCB0YWlsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGEgc3RyaW5nLlxuICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIHN0ciBUaGUgc3RyaW5nXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbcmF3XSBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoID0gZnVuY3Rpb24gKHN0ciwgcmF3KSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBjb21wdXRlIGl0IHVzaW5nIHRoZSBiaW5hcnkgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuIFNwYXJrTUQ1Lmhhc2hCaW5hcnkodG9VdGY4KHN0ciksIHJhdyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIGNvbnRlbnQgVGhlIGJpbmFyeSBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddICAgICBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnQsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTEoY29udGVudCksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogU3BhcmtNRDUgT09QIGltcGxlbWVudGF0aW9uIGZvciBhcnJheSBidWZmZXJzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUgT05MWSBmb3IgYXJyYXkgYnVmZmVycy5cbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyIFRoZSBhcnJheSB0byBiZSBhcHBlbmRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGFycikge1xuICAgICAgICB2YXIgYnVmZiA9IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKHRoaXMuX2J1ZmYuYnVmZmVyLCBhcnIsIHRydWUpLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIHRoaXMuX2xlbmd0aCArPSBhcnIuYnl0ZUxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIG1kNWJsa19hcnJheShidWZmLnN1YmFycmF5KGkgLSA2NCwgaSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2J1ZmYgPSAoaSAtIDY0KSA8IGxlbmd0aCA/IG5ldyBVaW50OEFycmF5KGJ1ZmYuYnVmZmVyLnNsaWNlKGkgLSA2NCkpIDogbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmW2ldIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKHRhaWwsIGxlbmd0aCk7XG4gICAgICAgIHJldCA9IGhleCh0aGlzLl9oYXNoKTtcblxuICAgICAgICBpZiAocmF3KSB7XG4gICAgICAgICAgICByZXQgPSBoZXhUb0JpbmFyeVN0cmluZyhyZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmYgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5faGFzaCA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGVcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgYnVmZmVyIHRvIGEgc3RyaW5nXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSBhcnJheUJ1ZmZlcjJVdGY4U3RyKHN0YXRlLmJ1ZmYpO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYnVmZmVyXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSB1dGY4U3RyMkFycmF5QnVmZmVyKHN0YXRlLmJ1ZmYsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBTcGFya01ENS5wcm90b3R5cGUuc2V0U3RhdGUuY2FsbCh0aGlzLCBzdGF0ZSk7XG4gICAgfTtcblxuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3k7XG5cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuX2ZpbmlzaCA9IFNwYXJrTUQ1LnByb3RvdHlwZS5fZmluaXNoO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGFuIGFycmF5IGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFyciBUaGUgYXJyYXkgYnVmZmVyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSAgICAgW3Jhd10gVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IG9uZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIuaGFzaCA9IGZ1bmN0aW9uIChhcnIsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTFfYXJyYXkobmV3IFVpbnQ4QXJyYXkoYXJyKSksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIHJldHVybiBTcGFya01ENTtcbn0pKTtcbiIsIi8qKlxuICogRm9ybWF0cyByYXcgVVVJRCBkYXRhIGludG8gdGhlIHByb3BlciBzdHJpbmcgZm9ybWF0LlxuICogQHBhcmFtIGRhdGEgLSBSYXcgVVVJRCBkYXRhLlxuICogQHJldHVybnMgRm9ybWF0dGVkIFVVSUQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiB1aW50OFRvVXVpZCAoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gMTYpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBjYiAocHJldmlvdXM6IHN0cmluZywgY3VycmVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJldmlvdXMgKyBjdXJyZW50LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc2xpY2UoMCwgNCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNCwgNikucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNiwgOCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoOCwgMTApLnJlZHVjZShjYiwgJycpICtcbiAgICAnLScgKyBkYXRhLnNsaWNlKDEwKS5yZWR1Y2UoY2IsICcnKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBBIFt2ZXJzaW9uIDQgVVVJRF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXIjVmVyc2lvbl80XyhyYW5kb20pKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCAoKTogc3RyaW5nIHtcbiAgLy8gQ2hlY2sgZm9yIGNyeXB0byBBUElcbiAgaWYgKHdpbmRvdy5jcnlwdG8gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1aW50OFRvVXVpZChuZXcgVWludDhBcnJheSgxNikpO1xuICB9XG5cbiAgLy8gR2V0IDE2IG9jdGV0cyBmb3IgVVVJRFxuICBjb25zdCBvY3RldHMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGNvbnN0IG1vZGlmaWVycyA9IFVpbnQ4QXJyYXkuZnJvbShbXG4gICAgcGFyc2VJbnQoJzAxMDAwMDAwJywgMiksICAvLyBWZXJzaW9uIGJpdHMgKDQgPT4gMDEwMClcbiAgICBwYXJzZUludCgnMTAwMDAwMDAnLCAyKSwgIC8vIFZhcmlhbnQgYml0cyAoMTB4KVxuICAgIHBhcnNlSW50KCcwMDAwMTExMScsIDIpLCAgLy8gTWFzayB0byB6ZXJvIGhpZ2hlciBiaXRzLCB2ZXJzaW9uXG4gICAgcGFyc2VJbnQoJzAwMTExMTExJywgMikgICAvLyBNYXNrIHRvIHplcm8gaGlnaGVyIGJpdHMsIHZhcmlhbnRcbiAgXSk7XG4gIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG9jdGV0cyk7XG4gIC8vIFNldCB2ZXJzaW9uIGJpdHMgYW5kIHZhcmlhbnQgYml0c1xuICBvY3RldHNbNl0gPSAob2N0ZXRzWzZdICYgbW9kaWZpZXJzWzJdKSB8IG1vZGlmaWVyc1swXTtcbiAgb2N0ZXRzWzhdID0gKG9jdGV0c1s4XSAmIG1vZGlmaWVyc1szXSkgfCBtb2RpZmllcnNbMV07XG5cbiAgcmV0dXJuIHVpbnQ4VG9VdWlkKG9jdGV0cyk7XG59XG4iLCJpbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIGNvbG9yIHBhbGV0dGUgZnJvbSBGaWd1cmUgMiAoQ29sb3JzIG9wdGltaXplZCBmb3IgY29sb3ItYmxpbmRcbiAqIGluZGl2aWR1YWxzKSBmcm9tXG4gKiBbXCJQb2ludHMgb2YgdmlldzogQ29sb3IgYmxpbmRuZXNzXCIgYnkgQmFuZyBXb25nIHB1Ymxpc2hlZCBpbiBOYXR1cmUgTWV0aG9kcyB2b2x1bWUgOCBvbiAyNyBNYXkgMjAxMV0oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9ubWV0aC4xNjE4P1dULmVjX2lkPU5NRVRILTIwMTEwNilcbiAqL1xuY29uc3QgQ29sb3JQYWxldHRlOiBzdHJpbmdbXSA9IFtcbiAgJ3JnYigyMzAsIDE1OSwgMCknLFxuICAncmdiKDg2LCAxODAsIDIzMyknLFxuICAncmdiKDAsIDE1OCwgMTE1KScsXG4gICdyZ2IoMjQwLCAyMjgsIDY2KScsXG4gICdyZ2IoMCwgMTE0LCAxNzgpJyxcbiAgJ3JnYigyMTMsIDk0LCAwKScsXG4gICdyZ2IoMjA0LCAxMjEsIDE2NyknXG5dO1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgaGlnaGxpZ2h0IGZyb20gYSBzdGFmZi5cbiAqIEBwYXJhbSBzdGFmZiBJZiB1bmRlZmluZWQsIHRoZSBhbGwgc3RhdmVzIGFyZSB1bmhpZ2hsaWdodGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5oaWdobGlnaHQoc3RhZmY/OiBTVkdHRWxlbWVudCk6IHZvaWQge1xuICBsZXQgY2hpbGRyZW46IE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gIGlmIChzdGFmZikge1xuICAgIGNoaWxkcmVuID0gc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9XG4gIGNoaWxkcmVuLmZvckVhY2goZWxlbSA9PiB7XG4gICAgaWYgKGVsZW0udGFnTmFtZSA9PT0gJ3BhdGgnICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfSBlbHNlIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbGwnKTtcbiAgICAgIGxldCByZWN0cyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWN0cyA9IFtdIGFzIHVua25vd24gYXMgTm9kZUxpc3RPZjxFbGVtZW50PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApe1xuICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBoaWdobGlnaHQgZnJvbSBlYWNoIHN0YWZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRTdGFmZkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5oaWdobGlnaHQoKTtcbn1cblxuLyoqXG4gKiBVbnNldCBoaWdobGlnaHQgZm9yIGFsbCBncm91cGluZyB0eXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5zZXRTdGFmZkhpZ2hsaWdodCgpO1xuICBjb25zdCBoaWdobGlnaHRlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQnKSlcbiAgICAuZmlsdGVyKChlbGVtOiBIVE1MRWxlbWVudCkgPT4gIWVsZW0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpO1xuICBoaWdobGlnaHRlZC5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGVsZW0uc2V0QXR0cmlidXRlKCcjZDAwJywgbnVsbCk7XG4gICAgbGV0IHJlY3RzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICBpZiAoZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKSAhPT0gbnVsbCkge1xuICAgICAgICByZWN0cyA9IGVsZW0uY2xvc2VzdCgnLnN5bGxhYmxlJykucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgfVxuICAgIH1cbiAgICByZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWN0OiBIVE1MRWxlbWVudCkge1xuICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8IFxuICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICApe1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgIGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2gocmVjdCA9PiB7XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpLmZvckVhY2goKGVsKSA9PiB7IGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcnKTsgfSk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGEgc3RhZmYgYSBjZXJ0YWluIGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlnaGxpZ2h0KHN0YWZmOiBTVkdHRWxlbWVudCwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oc3RhZmYuY2hpbGRyZW4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ3BhdGgnKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykubGVuZ3RoICYmIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKSkge1xuICAgICAgQXJyYXkuZnJvbShjaGlsZC5jaGlsZHJlbikuZmlsdGVyKGVsID0+IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpIHx8IGNoaWxkLmlkID09PSAncmVzaXplUmVjdCcgfHwgY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyb3RhdGVQb2ludCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2xheWVyJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hpZ2hsaWdodC1zZWxlY3RlZCcpLmxlbmd0aCAmJlxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJylbMF0uaWQgPT09ICdoaWdobGlnaHQtbmV1bWUnXG4gICAgICAmJiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgbGV0IHJlY3RzID0gY2hpbGQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBjaGlsZC5jbG9zZXN0KCcuc3lsbGFibGUnKS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVjdHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlY3RzLmZvckVhY2goZnVuY3Rpb24gKHJlY3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICghKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApKSB7XG4gICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gY29sb3I7XG4gICAgICAgICAgcmVjdC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hpbGQuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0ZWQnKTtcbiAgfVxuICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgLyp0cnkge1xuICAgIHdpZHRoID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnd2lkdGgnKS5zcGxpdCgncHgnKVswXSk7XG4gICAgaGVpZ2h0ID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jykuc3BsaXQoJ3B4JylbMF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgfSovXG4gIGxldCBzdHJva2U6IHN0cmluZztcbiAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgJiYgaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBpZGsgbG9va3MgZ29vZCA6JylcbiAgICAvLyBUT0RPIGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHRoaXMgYXMgdGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgYXMgd2VsbCBhcyAzMHB4XG4gICAgc3Ryb2tlID0gKHdpZHRoICogaGVpZ2h0IC8gMTAwMDAwMCkudG9TdHJpbmcoKTtcbiAgfVxuICBlbHNlIHtcbiAgICBzdHJva2UgPSAnMzBweCc7XG4gIH1cbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnLm5jLCAuY3VzdG9zLCAuY2xlZiwgLmFjY2lkJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhpZ2hsaWdodCBlYWNoIHN0YWZmIGEgZGlmZmVyZW50IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RhZmZIaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3RhZmYnKSkgYXMgU1ZHR0VsZW1lbnRbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZkNvbG9yID0gQ29sb3JQYWxldHRlW2kgJSBDb2xvclBhbGV0dGUubGVuZ3RoXTtcbiAgICBoaWdobGlnaHQoc3RhdmVzW2ldLCBzdGFmZkNvbG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDb2x1bW5IaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0ICBncm91cHM6IHsgW2tleTogbnVtYmVyXTogU1ZHR0VsZW1lbnRbXSB9ID0ge307XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBjb25zdCBoYXNDb2x1bW4gPSBBcnJheS5mcm9tKHN0YWZmLmNsYXNzTGlzdCkuam9pbignICcpLm1hdGNoKC9cXGJjb2x1bW4oXFxkKylcXGIvKTtcbiAgICBsZXQgY29sdW1uTnVtID0gMDtcbiAgICBpZiAoaGFzQ29sdW1uKSB7XG4gICAgICBjb2x1bW5OdW0gPSBwYXJzZUludChoYXNDb2x1bW5bMV0sIDEwKSAtIDE7XG4gICAgfVxuXG4gICAgaWYgKCFncm91cHNbY29sdW1uTnVtXSkge1xuICAgICAgZ3JvdXBzW2NvbHVtbk51bV0gPSBbXTtcbiAgICB9XG5cbiAgICBncm91cHNbY29sdW1uTnVtXS5wdXNoKHN0YWZmIGFzIFNWR0dFbGVtZW50KTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29sdW1uLCBzdGF2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICBjb25zdCBjb2xvciA9IENvbG9yUGFsZXR0ZVtOdW1iZXIoY29sdW1uKSAlIENvbG9yUGFsZXR0ZS5sZW5ndGhdO1xuICAgIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgICBoaWdobGlnaHQoc3RhZmYsIGNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSBoaWdobGlnaHQgYnkgYSBkaWZmZXJlbnQgZ3JvdXBpbmcuXG4gKiBAcGFyYW0gZ3JvdXBpbmcgLSBFaXRoZXIgXCJzdGFmZlwiLCBcInN5bGxhYmxlXCIsIFwibmV1bWVcIiwgXCJzZWxlY3Rpb25cIiwgb3IgXCJsYXllckVsZW1lbnRcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdyb3VwaW5nSGlnaGxpZ2h0KGdyb3VwaW5nOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpO1xuICBpZiAoZ3JvdXBpbmcgPT09ICdzdGFmZicpIHtcbiAgICBzZXRTdGFmZkhpZ2hsaWdodCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBlbHNlIGlmIChncm91cGluZyA9PT0gJ2NvbHVtbicpIHtcbiAgICBzZXRDb2x1bW5IaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH0gXG4gIGVsc2UgaWYgKGdyb3VwaW5nID09PSAnc2VsZWN0aW9uJykge1xuICAgIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VsLWJ5LmlzLWFjdGl2ZScpLmlkO1xuICAgIHN3aXRjaCAodGVtcCkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgICBncm91cGluZyA9ICdzeWxsYWJsZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlDb2x1bW4nOlxuICAgICAgICBncm91cGluZyA9ICdjb2x1bW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBncm91cGluZyA9ICdzdGFmZic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlMYXllckVsZW1lbnQnOlxuICAgICAgICBncm91cGluZyA9ICdsYXllckVsZW1lbnQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZ3JvdXBpbmcgPSAnbmV1bWUnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXBpbmcpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZ3JvdXBzO1xuXG4gIGlmIChncm91cGluZyA9PSAnbGF5ZXJFbGVtZW50Jykge1xuICAgIGdyb3VwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hY2NpZCwgLmNsZWYsIC5jdXN0b3MsIC5kaXZMaW5lJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ3JvdXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShncm91cGluZykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD47XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmMsIC5jdXN0b3MsIC5jbGVmLCAuYWNjaWQsIC5kaXZMaW5lJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gIH0pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZ3JvdXBDb2xvciA9IENvbG9yUGFsZXR0ZVtpICUgQ29sb3JQYWxldHRlLmxlbmd0aF07XG4gICAgaWYgKChncm91cHNbaV0uY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpICYmICFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBncm91cHNbaV0uc2V0QXR0cmlidXRlKCdmaWxsJywgZ3JvdXBDb2xvcik7XG4gICAgICBjb25zdCByZWN0cyA9IGdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+O1xuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdCkge1xuICAgICAgICBpZiAocmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gZ3JvdXBDb2xvcjtcbiAgICAgIH0pO1xuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICBncm91cHNbaV0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKHJlY3QgPT4ge1xuICAgICAgICByZWN0LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2QwMCcpO1xuICAgICAgfVxuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGl2TGluZUNoaWxkcmVuID0gZ3JvdXBzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJyk7XG4gICAgaWYgKGRpdkxpbmVDaGlsZHJlbikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaXZMaW5lQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGl2TGluZUNoaWxkcmVuW2pdLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgZ3JvdXBDb2xvcik7XG4gICAgICAgIGRpdkxpbmVDaGlsZHJlbltqXS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxufVxuIiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdHJpbmdpZnkvcGFyc2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3Qgb3BlcmF0ZVxuICogcmVjdXJzaXZlbHksIHNvIHRoZXkgYXZvaWQgY2FsbCBzdGFjayBleGNlZWRlZFxuICogZXJyb3JzLlxuICovXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpbnB1dCkge1xuICB2YXIgcXVldWUgPSBbXTtcbiAgcXVldWUucHVzaCh7b2JqOiBpbnB1dH0pO1xuXG4gIHZhciByZXMgPSAnJztcbiAgdmFyIG5leHQsIG9iaiwgcHJlZml4LCB2YWwsIGksIGFycmF5UHJlZml4LCBrZXlzLCBrLCBrZXksIHZhbHVlLCBvYmpQcmVmaXg7XG4gIHdoaWxlICgobmV4dCA9IHF1ZXVlLnBvcCgpKSkge1xuICAgIG9iaiA9IG5leHQub2JqO1xuICAgIHByZWZpeCA9IG5leHQucHJlZml4IHx8ICcnO1xuICAgIHZhbCA9IG5leHQudmFsIHx8ICcnO1xuICAgIHJlcyArPSBwcmVmaXg7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmVzICs9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICByZXMgKz0gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgcmVzICs9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcXVldWUucHVzaCh7dmFsOiAnXSd9KTtcbiAgICAgIGZvciAoaSA9IG9iai5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhcnJheVByZWZpeCA9IGkgPT09IDAgPyAnJyA6ICcsJztcbiAgICAgICAgcXVldWUucHVzaCh7b2JqOiBvYmpbaV0sIHByZWZpeDogYXJyYXlQcmVmaXh9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ1snfSk7XG4gICAgfSBlbHNlIHsgLy8gb2JqZWN0XG4gICAgICBrZXlzID0gW107XG4gICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICBrZXlzLnB1c2goayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ30nfSk7XG4gICAgICBmb3IgKGkgPSBrZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIG9ialByZWZpeCA9IChpID4gMCA/ICcsJyA6ICcnKTtcbiAgICAgICAgb2JqUHJlZml4ICs9IEpTT04uc3RyaW5naWZ5KGtleSkgKyAnOic7XG4gICAgICAgIHF1ZXVlLnB1c2goe29iajogdmFsdWUsIHByZWZpeDogb2JqUHJlZml4fSk7XG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKHt2YWw6ICd7J30pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoZSBwYXJzZSBmdW5jdGlvbi5cbi8vIFRoaXMgcG9wIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbVxuLy8gcG91Y2hDb2xsYXRlLnBhcnNlSW5kZXhhYmxlU3RyaW5nXG5mdW5jdGlvbiBwb3Aob2JqLCBzdGFjaywgbWV0YVN0YWNrKSB7XG4gIHZhciBsYXN0TWV0YUVsZW1lbnQgPSBtZXRhU3RhY2tbbWV0YVN0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgIC8vIHBvcHBpbmcgYSBtZXRhLWVsZW1lbnQsIGUuZy4gYW4gb2JqZWN0IHdob3NlIHZhbHVlIGlzIGFub3RoZXIgb2JqZWN0XG4gICAgbWV0YVN0YWNrLnBvcCgpO1xuICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gIH1cbiAgdmFyIGVsZW1lbnQgPSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudDtcbiAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudC5wdXNoKG9iaik7XG4gIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICB2YXIga2V5ID0gc3RhY2sucG9wKCk7XG4gICAgZWxlbWVudFtrZXldID0gb2JqO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gob2JqKTsgLy8gb2JqIHdpdGgga2V5IG9ubHlcbiAgfVxufVxuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG1ldGFTdGFjayA9IFtdOyAvLyBzdGFjayBmb3IgYXJyYXlzIGFuZCBvYmplY3RzXG4gIHZhciBpID0gMDtcbiAgdmFyIGNvbGxhdGlvbkluZGV4LHBhcnNlZE51bSxudW1DaGFyO1xuICB2YXIgcGFyc2VkU3RyaW5nLGxhc3RDaCxudW1Db25zZWN1dGl2ZVNsYXNoZXMsY2g7XG4gIHZhciBhcnJheUVsZW1lbnQsIG9iakVsZW1lbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29sbGF0aW9uSW5kZXggPSBzdHJbaSsrXTtcbiAgICBpZiAoY29sbGF0aW9uSW5kZXggPT09ICd9JyB8fFxuICAgICAgICBjb2xsYXRpb25JbmRleCA9PT0gJ10nIHx8XG4gICAgICAgIHR5cGVvZiBjb2xsYXRpb25JbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLnBvcCgpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoY29sbGF0aW9uSW5kZXgpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnXFx0JzpcbiAgICAgIGNhc2UgJ1xcbic6XG4gICAgICBjYXNlICc6JzpcbiAgICAgIGNhc2UgJywnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ24nOlxuICAgICAgICBpICs9IDM7IC8vICd1bGwnXG4gICAgICAgIHBvcChudWxsLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgaSArPSAzOyAvLyAncnVlJ1xuICAgICAgICBwb3AodHJ1ZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZic6XG4gICAgICAgIGkgKz0gNDsgLy8gJ2Fsc2UnXG4gICAgICAgIHBvcChmYWxzZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMCc6XG4gICAgICBjYXNlICcxJzpcbiAgICAgIGNhc2UgJzInOlxuICAgICAgY2FzZSAnMyc6XG4gICAgICBjYXNlICc0JzpcbiAgICAgIGNhc2UgJzUnOlxuICAgICAgY2FzZSAnNic6XG4gICAgICBjYXNlICc3JzpcbiAgICAgIGNhc2UgJzgnOlxuICAgICAgY2FzZSAnOSc6XG4gICAgICBjYXNlICctJzpcbiAgICAgICAgcGFyc2VkTnVtID0gJyc7XG4gICAgICAgIGktLTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBudW1DaGFyID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKC9bXFxkXFwuXFwtZVxcK10vLnRlc3QobnVtQ2hhcikpIHtcbiAgICAgICAgICAgIHBhcnNlZE51bSArPSBudW1DaGFyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKHBhcnNlRmxvYXQocGFyc2VkTnVtKSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnXCInOlxuICAgICAgICBwYXJzZWRTdHJpbmcgPSAnJztcbiAgICAgICAgbGFzdENoID0gdm9pZCAwO1xuICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNoID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKGNoICE9PSAnXCInIHx8IChsYXN0Q2ggPT09ICdcXFxcJyAmJlxuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgJSAyID09PSAxKSkge1xuICAgICAgICAgICAgcGFyc2VkU3RyaW5nICs9IGNoO1xuICAgICAgICAgICAgbGFzdENoID0gY2g7XG4gICAgICAgICAgICBpZiAobGFzdENoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgbnVtQ29uc2VjdXRpdmVTbGFzaGVzKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKEpTT04ucGFyc2UoJ1wiJyArIHBhcnNlZFN0cmluZyArICdcIicpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdbJzpcbiAgICAgICAgYXJyYXlFbGVtZW50ID0geyBlbGVtZW50OiBbXSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKGFycmF5RWxlbWVudC5lbGVtZW50KTtcbiAgICAgICAgbWV0YVN0YWNrLnB1c2goYXJyYXlFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd7JzpcbiAgICAgICAgb2JqRWxlbWVudCA9IHsgZWxlbWVudDoge30sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChvYmpFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChvYmpFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3VuZXhwZWN0ZWRseSByZWFjaGVkIGVuZCBvZiBpbnB1dDogJyArIGNvbGxhdGlvbkluZGV4KTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgRHJhZ0FjdGlvbiwgRWRpdG9yQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQkJveCwgaXNPdXRPZlNWR0JvdW5kcywgZ2V0R2x5cGhCQm94IH0gZnJvbSAnLi9Db29yZGluYXRlcyc7XG5pbXBvcnQgeyBxdWV1ZU5vdGlmaWNhdGlvbiB9IGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IHNlbGVjdEFsbCwgc2VsZWN0QkJveCwgc2VsZWN0U3RhZmYgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuY2xhc3MgRHJhZ0hhbmRsZXIge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHByaXZhdGUgc2VsZWN0b3I6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3Rpb246IFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuICBwcml2YXRlIG5vTW92ZVByZWNlZGVzOiBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBwcml2YXRlIGRyYWdTdGFydENvb3JkczogW251bWJlciwgbnVtYmVyXSA9IFstMSwgLTFdO1xuICBwcml2YXRlIHJlc2V0VG9BY3Rpb246IChzZWxlY3Rpb246IGQzLlNlbGVjdGlvbjxkMy5CYXNlVHlwZSwgdW5rbm93biwgSFRNTEVsZW1lbnQsIHVua25vd24+LCBhcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBkeDogbnVtYmVyO1xuICBwcml2YXRlIGR5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIENTUyBzZWxlY3RvciBvZiBlbGVtZW50IHRvIGFwcGx5IGRyYWcgaGFuZGxlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGRyYWdnaW5nIGFjdGlvbiBhbmQgaGFuZGxlciBmb3Igc2VsZWN0ZWQgZWxlbWVudHMuXG4gICAqL1xuICBkcmFnSW5pdCAoKTogdm9pZCB7XG4gICAgLy8gRHJhZyBlZmZlY3RzXG4gICAgZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQgKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnU3RhcnRDb29yZHMgPSBbZDMuZXZlbnQueCwgZDMuZXZlbnQueV07XG4gICAgICB0aGlzLmR4ID0gMDtcbiAgICAgIHRoaXMuZHkgPSAwO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZDMuZXZlbnQuc291cmNlRXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwoZHJhZ0JlaGF2aW91cik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkaW5nIGxpc3RlbmVyc1xuICAgIGNvbnN0IGRyYWdCZWhhdmlvdXIgPSBkMy5kcmFnKClcbiAgICAgIC5vbignc3RhcnQnLCBkcmFnU3RhcnRlZC5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdkcmFnJywgdGhpcy5kcmFnZ2luZy5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdlbmQnLCB0aGlzLmRyYWdFbmRlZC5iaW5kKHRoaXMpKTtcblxuICAgIGNvbnN0IGFjdGl2ZU5jID0gZDMuc2VsZWN0QWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBhY3RpdmVOYy5jYWxsKGRyYWdCZWhhdmlvdXIpO1xuXG4gICAgbGV0IHNlbGVjdGlvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcuc2VsZWN0ZWQnKSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBkcmFncyB0aGUgZm9sbG93cyBzeWxsYWJsZSBpbiBhIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUsIFxuICAgIC8vIGNhbmNlbCB0aGUgY29tcGVuc2F0aW9uIGZvciBzeWwgbW92ZW1lbnQgaW4gZHJhZ2dpbmcuXG4gICAgdGhpcy5ub01vdmVQcmVjZWRlcyA9IHNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpICYmIGVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykpO1xuICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maWx0ZXIoZWwgPT4gIWVsLmNsYXNzTGlzdC5jb250YWlucygnbm8tbW92aW5nJykpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24uY29uY2F0KEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcucmVzaXplUG9pbnQnKSkpO1xuICB9XG5cbiAgZHJhZ2dpbmcgKCk6IHZvaWQge1xuICAgIHRoaXMuZHggPSBkMy5ldmVudC54IC0gdGhpcy5kcmFnU3RhcnRDb29yZHNbMF07XG4gICAgdGhpcy5keSA9IGQzLmV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydENvb3Jkc1sxXTtcblxuICAgIHRoaXMubW92ZUVsZW1lbnRzKHRoaXMuc2VsZWN0aW9uLCB0aGlzLmR4LCB0aGlzLmR5KTtcblxuICAgIC8qXG4gICAgICogaWYgd2UncmUgZHJhZ2dpbmcgYSBzeWxsYWJsZSAob3IgbmV1bWUgZXRjKSB0aGVuIHRoZXJlIHdvbid0IGJlIGEgc3lsIHNlbGVjdGVkXG4gICAgICogdGhlbiB3ZSBkb24ndCB3YW50IHRoZSBib3VuZGluZyBib3ggKGlmIGl0IGlzIGRpc3BsYXllZCkgdG8gbW92ZSB3aGVuIGRyYWdnaW5nIHRoZSBuZXVtZXNcbiAgICAgKiBpdCB3aWxsIGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQgaW4gc2VsZWN0aW9uLCBzbyBpdCB3aWxsIGdldCBtb3ZlZCBpbiB0aGUgYWJvdmUgbG9vcFxuICAgICAqIHNvIHdlIGNhbmNlbCB0aGF0IG1vdmVtZW50IG91dCBoZXJlXG4gICAgICovXG4gICAgY29uc3Qgc3lscyA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoZWwpID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpO1xuICAgIGlmIChzeWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLm5vTW92ZVByZWNlZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMubW92ZUVsZW1lbnRzKGJib3hlcywgLXRoaXMuZHgsIC10aGlzLmR5KTtcbiAgICB9XG4gIH1cblxuXG4gIGRyYWdFbmRlZCAoKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBoYXMgbm90IGJlZW4gbW92ZWQgbW9yZSB0aGFuIDUgcGl4ZWxzIGluIGFueSBkaXJlY3Rpb24sXG4gICAgLy8gZG8gbm90IGRvIGFueSBhY3Rpb25cbiAgICBjb25zdCB4RGlmZiA9IE1hdGguYWJzKHRoaXMuZHgpLCB5RGlmZiA9IE1hdGguYWJzKHRoaXMuZHkpO1xuICAgIGlmICh4RGlmZiA8PSA1ICYmIHlEaWZmIDw9IDUpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuZHJhZ0luaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgc2VsZWN0aW9uIGZvciBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpKTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIG91dCBvZiBib3VuZHMsXG4gICAgLy8gZHJhZyBhY3Rpb25zIHNob3VsZCBub3QgaGFwcGVuLiBSZXR1cm4gYW4gZXJyb3Igbm90aWZpY2F0aW9uIGFuZCByZXNldFxuICAgIC8vIHRoZSBkcmFnIGhhbmRsZXJcbiAgICBpZiAodGhpcy5pc0N1cnNvck91dE9mQm91bmRzKCkgfHwgdGhpcy5pc0RyYWdPdXRPZkJvdW5kcyhzZWxlY3Rpb24pKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIHNlbGVjdGlvbiBiYWNrIHRvIG5vcm1hbCBzdGF0ZVxuICAgICAgdGhpcy5yZXR1cm5FbGVtZW50cyh0aGlzLnNlbGVjdGlvbik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgYm91bmRpbmcgYm94ZXMgYXMgd2VsbFxuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMucmV0dXJuRWxlbWVudHMoYmJveGVzKTtcblxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIERyYWcgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNoYWluIGVkaXRvciBhY3Rpb24gZm9yIHNlbGVjdGlvblxuICAgIGNvbnN0IHBhcmFtQXJyYXk6IEVkaXRvckFjdGlvbltdID0gW107XG4gICAgc2VsZWN0aW9uLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGVsLnRhZ05hbWUgPT09ICdyZWN0JyA/IGVsLmNsb3Nlc3QoJy5zeWwnKS5pZCA6IGVsLmlkO1xuXG4gICAgICBjb25zdCBkcmFnQWN0aW9uOiBEcmFnQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdkcmFnJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHg6IHRoaXMuZHgsXG4gICAgICAgICAgeTogLXRoaXMuZHksXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHBhcmFtQXJyYXkucHVzaChkcmFnQWN0aW9uKTtcbiAgICB9KTtcbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgIHBhcmFtOiBwYXJhbUFycmF5XG4gICAgfTtcblxuICAgIC8vIFNlbmQgZWRpdG9yIGFjdGlvblxuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE5lb24gcmUtcmVuZGVycyB0aGUgZW50aXJlIFNWRywgYW5kIGhlbmNlLCBiZWZvcmUgd2UgZG8gc28sXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgYWxsIHRoZSBlbGVtZW50cyAoSURzKSB3ZSBuZWVkIHRvIHNlbGVjdCBhZ2FpblxuICAgICAgICAvLyBUaGVuLCB3ZSBuZWVkIHRvIHJlc2VsZWN0IHRoZW0gYnkgY2FsbGluZyBgdGhpcy5yZXNlbGVjdCgpYFxuICAgICAgICBjb25zdCB0b1Jlc2VsZWN0ID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKSlcbiAgICAgICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpKVxuICAgICAgICAgIC5tYXAoZWwgPT4gZWwuaWQpO1xuXG4gICAgICAgIC8vIENBVVRJT046IGB1cGRhdGVGb3JDdXJyZW50UGFnZSgpYCBpcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24hXG4gICAgICAgIC8vIEl0IHJlcXVpcmVzIGFuIGBhd2FpdGAga2V5d29yZC5cbiAgICAgICAgYXdhaXQgdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLmVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIC8vIFJlc2VsZWN0IHRoZSBlbGVtZW50cyBhbmQgcmVpbml0aWFsaXplIGRyYWdcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNlbGVjdCh0b1Jlc2VsZWN0KTtcbiAgICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyByZXNlbGVjdCAodG9SZXNlbGVjdDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNlbGVjdGVkID0gdG9SZXNlbGVjdC5tYXAoaWQgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxTVkdHcmFwaGljc0VsZW1lbnQ+KGAjJHtpZH1gKSk7XG5cbiAgICAvLyBBbGwgZ2x5cGhzIGV4Y2VwdCBib3VkaW5nIGJveGVzICgnc3lsJ3MpIG11c3QgYmUgc2VsZWN0ZWQgd2l0aFxuICAgIC8vIGBzZWxlY3RBbGwoKWBcbiAgICByZXNlbGVjdGVkXG4gICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKVxuICAgICAgLmZvckVhY2goYXN5bmMgKCkgPT4gYXdhaXQgc2VsZWN0QWxsKHJlc2VsZWN0ZWQsIHRoaXMubmVvblZpZXcsIHRoaXMpKTtcblxuICAgIC8vIEJvdW5kaW5nIGJveGVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0QkJveCgpYFxuICAgIHJlc2VsZWN0ZWRcbiAgICAgIC5maWx0ZXIoZWwgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSlcbiAgICAgIC5mb3JFYWNoKFxuICAgICAgICBlbCA9PiBzZWxlY3RCQm94KGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIHRoaXMsIHRoaXMubmVvblZpZXcpXG4gICAgICApO1xuXG4gICAgLy8gU3RhdmVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0U3RhZmYoKWBcbiAgICAvLyBBTkQgbXVzdCBiZSBzZWxlY3RlZCB3aXRoIGBzZWxlY3RBbGwoKWAgZm9yIGNvcnJlY3QgYmVoYXZpb3IgKGZvciBzb21lIHJlYXNvbikuXG4gICAgcmVzZWxlY3RlZFxuICAgICAgLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpXG4gICAgICAuZm9yRWFjaChlbCA9PiBzZWxlY3RTdGFmZihlbCwgdGhpcykpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZDMgYWN0aW9uIHRvIHVzZSBmb3IgW1tyZXNldF1dLiAqL1xuICByZXNldFRvIChyZXNldDogKHNlbGVjdGlvbjogZDMuU2VsZWN0aW9uPGQzLkJhc2VUeXBlLCB1bmtub3duLCBIVE1MRWxlbWVudCwgdW5rbm93bj4sIGFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRUb0FjdGlvbiA9IHJlc2V0O1xuICB9XG5cbiAgLyoqIFJlc2V0IHRvIGEgcHJldmlvdXMgZDMgYWN0aW9uIGZvciBbW3RoaXMuc2VsZWN0b3JdXS4gKi9cbiAgcmVzZXQgKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2V0VG9BY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwodGhpcy5yZXNldFRvQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBlbmRPcHRpb25zU2VsZWN0aW9uICgpOiB2b2lkIHtcbiAgICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICAgIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgICBpZiAobW9yZUVkaXQpIHtcbiAgICAgIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhRWRpdCkge1xuICAgICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZXh0cmFFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc3VhbGx5IG1vdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGJ5IGBkeGAgYW5kIGBkeWA7IChub3QgdXNpbmcgZDMpXG4gICAqL1xuICBtb3ZlRWxlbWVudHMgKHNlbGVjdGlvbjogRWxlbWVudFtdLCBkeDogbnVtYmVyLCBkeTogbnVtYmVyKTogdm9pZCB7XG4gICAgc2VsZWN0aW9uLmZpbHRlcihlbCA9PiBlbCAhPT0gbnVsbCkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2R4fSwke2R5fSlgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXN1YWxseSByZXR1cm4gc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgcG9zaXRpb25zXG4gICAqIGJ5IHJlbW92aW5nIHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlXG4gICAqL1xuICByZXR1cm5FbGVtZW50cyAoc2VsZWN0aW9uOiBFbGVtZW50W10pOiB2b2lkIHtcbiAgICBzZWxlY3Rpb24uZmlsdGVyKGVsID0+IGVsICE9PSBudWxsKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ3Vyc29yT3V0T2ZCb3VuZHMgKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVuZFggPSB0aGlzLmRyYWdTdGFydENvb3Jkc1swXSArIHRoaXMuZHg7XG4gICAgY29uc3QgZW5kWSA9IHRoaXMuZHJhZ1N0YXJ0Q29vcmRzWzFdICsgdGhpcy5keTtcblxuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKGVuZFgsIGVuZFkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBTVkdcbiAgICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnRbXX0gc2VsZWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJcyBzZWxlY3Rpb24gb3V0IG9mIGJvdW5kc1xuICAgKi9cbiAgaXNEcmFnT3V0T2ZCb3VuZHMgKHNlbGVjdGlvbjogU1ZHR3JhcGhpY3NFbGVtZW50W10pOiBib29sZWFuIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIGJveGVzIG9mIGFsbCBnbHlwaHMgKDx1c2U+IGVsZW1lbnRzKSB3aXRoaW4gdGhlIHNlbGVjdGlvbiBhcnJheVxuICAgIGNvbnN0IGlzQkJveERpc3BsYXllZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNkaXNwbGF5QkJveCcpLmNoZWNrZWQ7XG4gICAgbGV0IGdseXBoU2VsZWN0b3IgPSBpc0JCb3hEaXNwbGF5ZWQgPyAndXNlLCByZWN0JyA6ICd1c2UnO1xuXG4gICAgaWYgKHNlbGVjdGlvblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIGdseXBoU2VsZWN0b3IgPSAncGF0aCc7XG5cbiAgICBjb25zdCBnbHlwaHM6IFNWR1VzZUVsZW1lbnRbXSA9IHNlbGVjdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjLCBlbCkgPT4gYWNjLmNvbmNhdCguLi5lbC5xdWVyeVNlbGVjdG9yQWxsKGdseXBoU2VsZWN0b3IpKSwgW11cbiAgICApO1xuICAgIGNvbnN0IGdseXBoQkJveGVzOiBCQm94W10gPSBnbHlwaHMubWFwKGdldEdseXBoQkJveCk7XG5cbiAgICAvLyBHZXQgdGhlIHN1cnJvdW5kaW5nIGJvdW5kaW5nIGJveCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb25CQm94OiBCQm94ID0gZ2x5cGhCQm94ZXMucmVkdWNlKFxuICAgICAgKGJib3gsIGN1cnIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bHg6IE1hdGgubWluKGJib3gudWx4LCBjdXJyLnVseCksXG4gICAgICAgICAgdWx5OiBNYXRoLm1pbihiYm94LnVseSwgY3Vyci51bHkpLFxuICAgICAgICAgIGxyeDogTWF0aC5tYXgoYmJveC5scngsIGN1cnIubHJ4KSxcbiAgICAgICAgICBscnk6IE1hdGgubWF4KGJib3gubHJ5LCBjdXJyLmxyeSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB1bHg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIHVseTogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbHJ4OiBOdW1iZXIuTUlOX1ZBTFVFLFxuICAgICAgICBscnk6IE51bWJlci5NSU5fVkFMVUUsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgdWx4LCB1bHksIGxyeCwgbHJ5IH0gPSBzZWxlY3Rpb25CQm94O1xuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKHVseCArIHRoaXMuZHgsIHVseSArIHRoaXMuZHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4ICsgdGhpcy5keCwgbHJ5ICsgdGhpcy5keSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRHJhZ0hhbmRsZXIgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgKiBhcyBXYXJuaW5ncyBmcm9tICcuLi9XYXJuaW5ncyc7XG5pbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCAqIGFzIFNlbGVjdFRvb2xzIGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFRvZ2dsZUxpZ2F0dXJlQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgcmVtb3ZlSGFuZGxlciwgZGVsZXRlQnV0dG9uSGFuZGxlciB9IGZyb20gJy4vU2VsZWN0T3B0aW9ucyc7XG5cbi8qKlxuICogVGhlIE5lb25WaWV3IHBhcmVudCB0byBhY2Nlc3MgZWRpdG9yIGFjdGlvbnMuXG4gKi9cbmxldCBuZW9uVmlldzogTmVvblZpZXc7XG5cbi8qKlxuICogU2V0IHRoZSBuZW9uVmlldyBtZW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TmVvblZpZXcodmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgbmVvblZpZXcgPSB2aWV3O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGNhbiBiZSBncm91cGVkIG9yIG5vdFxuICogQHJldHVybnMgdHJ1ZSBpZiBjYW4gYmUgZ3JvdXBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyb3VwYWJsZShcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGVsZW1lbnRzLnZhbHVlcygpKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBpZiAoZ3JvdXBzLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBjYW5ub3QgZ3JvdXAgaWYgb25seSAxIGVsZW1lbnQgaXMgc2VsZWN0ZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIC8vIGlmIG5ldW1lcyBhcmUgaW4gc2FtZSBzeWxsYWJsZSwgZG9uJ3QgZGlzcGxheSBncm91cGluZyBvcHRpb25cbiAgICAgIGlmIChTZWxlY3RUb29scy5zaGFyZWRMb2dpY2FsUGFyZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlclxuICAgICAgaWYgKFNlbGVjdFRvb2xzLmFyZUFkamFjZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0xpbmtlZChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50cz86IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pIHtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gIH1cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSB8fFxuICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5jJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnVGhlIGFjdGlvbiBpbnZvbHZlcyBsaW5rZWQgc3lsbGFibGVzLCBwbGVhc2UgdW50b2dnbGUgdGhlbSBmaXJzdCcsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZShcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElOR1xuICAgICkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBlbGVtZW50cy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgY29uc3Qgc3lsbGFibGUgPSBlbGVtZW50cy5hdChpZHgpO1xuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAvLyBHZXQgeG1sOmlkIG9mIHRoZSBuZXh0IHN5bGxhYmxlICh3aXRob3V0IHRoZSAjLCBpZiBpdCBleGlzdHMpXG4gICAgICBjb25zdCBuZXh0U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgIC5yZXBsYWNlKCcjJywgJycpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBuZXh0IHN5bGxhYmxlIGFuZCBpdHMgaW5kZXggaW4gdGhlIGFycmF5XG4gICAgICBsZXQgbmV4dFN5bGxhYmxlSWR4OiBudW1iZXI7XG4gICAgICBjb25zdCBuZXh0U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT09IG5leHRTeWxsYWJsZUlkKSB7XG4gICAgICAgICAgbmV4dFN5bGxhYmxlSWR4ID0gaWR4O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgbmV4dCAoZm9sbG93aW5nKSBzeWxsYWJsZSBjYW5ub3QgYmUgZm91bmRcbiAgICAgIGlmICghbmV4dFN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIG5leHQgc3lsbGFibGUgaGFzIGJlZW4gZm91bmQsIGJ1dCB0aGUgQGZvbGxvd3MgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIW5leHRTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgbmV4dCBzeWxsYWJsZSdzIEBmb2xsb3dzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKG5leHRTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykgIT0gJyMnICsgc3lsbGFibGUuaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiA0OlxuICAgICAgLy8gU2luY2UgdGhlIEBmb2xsb3dzIHZhbHVlIGlzIGNvcnJlY3QsIGEgcGFpciBvZiBzeWxsYWJsZXMgZXhpc3QgZm9yIHRoZSB0b2dnbGUtbGlua2VkIHN5bGxhYmxlLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIEBmb2xsb3dzIHN5bGxhYmxlIGlzIHRoZSBuZXh0IHN5bGxhYmxlIChpbmRleC13aXNlKSBpbiB0aGUgYXJyYXk6XG4gICAgICBpZiAobmV4dFN5bGxhYmxlSWR4ICE9PSBpZHggKyAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpKSB7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJylcbiAgICAgICAgLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKFxuICAgICAgICAoc3lsbGFibGUpID0+IHN5bGxhYmxlLmlkID09PSBwcmV2U3lsbGFibGVJZCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIHByZXZpb3VzIHN5bGxhYmxlIGV4aXN0cywgYnV0IHRoZSBAcHJlY2VkZXMgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIXByZXZTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMzogVGhlIHByZXZpb3VzIHN5bGxhYmxlJ3MgQHByZWNlZGVzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKHByZXZTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICE9ICcjJyArIHN5bGxhYmxlLmlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaXMgYSBzZWxlY3Rpb24gb2YgZWxlbWVudHMgaXMgYWxyZWFkeSBsaW5rZWRcbiAqIEBwYXJhbSBlbGVtZW50cyBlbGVtZW50cyB0byBiZSBjb25zaWRlcmVkXG4gKiBAcmV0dXJucyB0cnVlIGlzIGxpbmtlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtlZChlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pik6IGJvb2xlYW4ge1xuICAvLyBldmVyeSBlbGVtZW50IHNob3VsZCBiZSBsaW5rZWRcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKFxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSAmJlxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEFzc3VtaW5nIGFsbCBlbGVtZW50cyBhcmUgdmFsaWQsXG4gKiBjaGVjayBpZiB0aGUgZWxlbWVudHMgY2FuIGJlIGxpbmtlZDpcbiAqIDEuIHNvcnQgZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgb3JkZXIgaW4gdGhlIERPTVxuICogMi4gZW5zdXJlIGVsZW1lbnRzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gKiAzLiBlbnN1cmUgZWxlbWVudHMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICogNC4gY2hlY2sgaWYgY2FuIGJlIGxpbmtlZDpcbiAqICAgIDQuMSBpZiBleGFjdGx5IHR3byBlbGVtZW50cywgYm90aCBuZWVkcyB0byBiZSB1bmxpbmtlZFxuICogICAgNC4yIGlmIG1vcmUgdGhhbiB0d28gZWxlbWVudHMsIG9ubHkgb25lIGVsZW1lbnQgY2FuIGJlIHVubGlua2VkLFxuICogICAgICAgIGF0IGVpdGhlciBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBzZXF1ZW5jZVxuICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEByZXR1cm5zIHRydWUgY2FuIGJlIGxpbmtlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuQmVMaW5rZWQoZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4pOiBib29sZWFuIHtcbiAgLy8gMS4gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZScpKTtcblxuICAvLyAyLiBFbnN1cmUgc3lsbGFibGVzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IG5leHQgPSBlbGVtZW50c1tpICsgMV07XG4gICAgY29uc3QgY3VycmVudFN5bGxhYmxlSW5kZXggPSBzeWxsYWJsZXMuaW5kZXhPZihjdXJyZW50KTtcbiAgICBjb25zdCBuZXh0U3lsbGFibGVJbmRleCA9IHN5bGxhYmxlcy5pbmRleE9mKG5leHQpO1xuICAgIGlmIChuZXh0U3lsbGFibGVJbmRleCAtIGN1cnJlbnRTeWxsYWJsZUluZGV4ICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIFN0YXZlcyBtdXN0IGJlIGFkamFjZW50XG4gICAgfVxuICAgIC8vIDMuIEVuc3VyZSBzeWxsYWJsZXMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICAgIGNvbnN0IGN1cnJlbnRTdGFmZiA9IGN1cnJlbnQuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgY29uc3QgbmV4dFN0YWZmID0gbmV4dC5jbG9zZXN0KCcuc3RhZmYnKTtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGFmZkluZGV4ID0gc3RhdmVzLmluZGV4T2YoY3VycmVudFN0YWZmIGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0U3RhZmZJbmRleCA9IHN0YXZlcy5pbmRleE9mKG5leHRTdGFmZiBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKG5leHRTdGFmZkluZGV4IC0gY3VycmVudFN0YWZmSW5kZXggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gU3RhdmVzIG11c3QgYmUgYWRqYWNlbnRcbiAgICB9XG4gIH1cblxuICAvLyA0LjEgSGFuZGxlIGNhc2UgZm9yIGV4YWN0bHkgdHdvIHN5bGxhYmxlc1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmV2ZXJ5KFxuICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiZcbiAgICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpLFxuICAgICk7XG4gIH1cblxuICAvLyA0LjIgSGFuZGxlIGNhc2UgZm9yIG1vcmUgdGhhbiB0d28gc3lsbGFibGVzXG4gIGNvbnN0IHVubGlua2VkRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW1lbnQpID0+XG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICYmXG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyksXG4gICk7XG5cbiAgaWYgKHVubGlua2VkRWxlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBPbmx5IG9uZSB1bmxpbmtlZCBzeWxsYWJsZSBpcyBhbGxvd2VkXG4gIH1cblxuICAvLyBUaGUgdW5saW5rZWQgc3lsbGFibGUgc2hvdWxkIGJlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kXG4gIGNvbnN0IGZpcnN0VW5saW5rZWQgPSB1bmxpbmtlZEVsZW1lbnRzWzBdO1xuXG4gIHJldHVybiAoXG4gICAgZWxlbWVudHMuaW5kZXhPZihmaXJzdFVubGlua2VkKSA9PT0gMCB8fFxuICAgIGVsZW1lbnRzLmluZGV4T2YoZmlyc3RVbmxpbmtlZCkgPT09IGVsZW1lbnRzLmxlbmd0aCAtIDFcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgY2FuIGJlIGxpbmtlZCBvciB1bmxpa25lZC5cbiAqIEBwYXJhbSBzZWxlY3Rpb25UeXBlIEN1cnJlbnQgc2VsZWN0aW9uIG1vZGUuIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gYmUgbGlua2VkXG4gKiBAcGFyYW0gZWxlbWVudHMgVGhlIGVsZW1lbnRzIHVuZGVyIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gbGluayBvciB1bi1saW5rIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2FibGUoXG4gIHNlbGVjdGlvblR5cGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gY2Fubm90IHRvZ2dsZSBsaW5rIGZvciBzeWxsYWJsZSBzZWxlY3Rpb24gaWYgbnVtYmVyIG9mIHNlbGVjdGVkXG4gIC8vIHN5bGxhYmxlcyBpcyBzbWFsbGVyIHRoYW4gMlxuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9ubHkgU3lsbGFibGVzIGNhbiBiZSBsaW5rZWQgb3IgdW5saW5rZWQgKD8pXG4gIGlmIChzZWxlY3Rpb25UeXBlICE9PSAnc2VsQnlTeWxsYWJsZScpIHJldHVybiBmYWxzZTtcblxuICAvLyBDaGVjayBpZiBoYXMgaW52YWxpZCBsaW5rZWQgc3lsbGFibGVzXG4gIGlmIChoYXNJbnZhbGlkTGlua2VkU3lsbGFibGUoZWxlbWVudHMpKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoZSBzZWxlY3RlZCBzeWxsYWJsZXMgaW5jbHVkZSBpbnZhbGlkIGxpbmtlZCBzeWxsYWJsZShzKSEnLFxuICAgICAgJ3dhcm5pbmcnLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaWYgQUxSRUFEWSBsaW5rZWRcbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGlmIENBTiBiZSBsaW5rZWRcbiAgZWxzZSBpZiAoY2FuQmVMaW5rZWQoZWxlbWVudHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VsZWN0ZWQgc3RhdmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVN0YXZlcygpOiB2b2lkIHtcbiAgY29uc3Qgc3lzdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGFmZi5zZWxlY3RlZCcpO1xuICBjb25zdCBlbGVtZW50SWRzID0gW107XG4gIHN5c3RlbXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBlbGVtZW50SWRzLnB1c2goc3RhZmYuaWQpO1xuICB9KTtcbiAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWVyZ2UnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWRzOiBlbGVtZW50SWRzLFxuICAgIH0sXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1N0YWZmIE1lcmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNZXJnZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBncm91cGluZyBzZWxlY3Rpb24gbWVudS5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIGdyb3VwaW5nIHR5cGU6IG5jLCBuZXVtZSwgc3lsLCBsaWdhdHVyZU5jLCBvciBsaWdhdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckdyb3VwaW5nKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICBtb3JlRWRpdC5pbm5lckhUTUwgKz0gQ29udGVudHMuZ3JvdXBpbmdNZW51W3R5cGVdO1xuICBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kR3JvdXBpbmdTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBUaGUgZ3JvdXBpbmcgZHJvcGRvd24gbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gIGNvbnN0IGRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUnKTtcbiAgZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG4gIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXJnZVN5bHMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGlmIChjb250YWluc0xpbmtlZChTZWxlY3RUb29scy5nZXRTZWxlY3Rpb25UeXBlKCkpKSByZXR1cm47XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5ldW1lcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGNvbnRhaW5zTGlua2VkKFNlbGVjdFRvb2xzLmdldFNlbGVjdGlvblR5cGUoKSkpIHJldHVybjtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRJZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5jcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpLmZpbHRlcigoZSkgPT5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduYycpLFxuICAgICAgKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZ3JvdXBOZXVtZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmdyb3VwTmNzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtbGlnYXR1cmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG5cbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBUb2dnbGVMaWdhdHVyZUFjdGlvbiA9IHtcbiAgICAgICAgICBhY3Rpb246ICd0b2dnbGVMaWdhdHVyZScsXG4gICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgbmVvblZpZXdcbiAgICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTGlnYXR1cmUgVG9nZ2xlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0xpZ2F0dXJlIFRvZ2dsZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWxpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG4vKipcbiAqIEdyb3VwaW5nL1VuZ3JvdXBpbmcga2V5YmluZGluZyBldmVudCBsaXN0ZW5lclxuICovXG5jb25zdCBrZXlkb3duTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICBpZiAoZS5rZXkgPT09ICdnJykge1xuICAgIC8vIGdldCBzZWxlY3RlZCBlbGVtZW50cyB0byBjaGVjayBpZiB0aGV5IGNhbiBiZSBncm91cGVkc1xuICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gU2VsZWN0VG9vbHMuZ2V0U2VsZWN0aW9uVHlwZSgpO1xuXG4gICAgaWYgKGNvbnRhaW5zTGlua2VkKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgLy8gR3JvdXAvbWVyZ2Ugb3IgdW5ncm91cC9zcGxpdCBiYXNlZCBvbiBzZWxlY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICAgIC8vIGlmIHN5bGxhYmxlcyBhcmUgbGlubmthYmxlLCB0b2dnbGUgbGlua2VkIHN5bGxhYmxlXG4gICAgICAgIC8vIGxpbmtlZCBzeWxsYWJsZXMgY2Fubm90IGJlIGdyb3VwZWQvdW5ncm91cGVkXG4gICAgICAgIGlmIChpc0xpbmthYmxlKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIGdyb3VwYWJsZSBiZWZvcmUgZ3JvdXBpbmdcbiAgICAgICAgZWxzZSBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCkuZmlsdGVyKChlKSA9PlxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduZXVtZScpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2FuIG9ubHkgdW5ncm91cCBpZiBsZW5ndGggaXMgMSAob25lIHN5bGxhYmxlIHNlbGVjdGVkKVxuICAgICAgICAvLyBjYW5ub3QgdW5ncm91cCBpZiBtdWx0aXBsZSBzeWxsYWJsZXMgYXJlIHNlbGVjdGVkXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgbWVyZ2VTdGF2ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTdGFmZlNwbGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBDYW4ndCBwZXJmb3JtIGdyb3VwaW5nL3VuZ3JvdXBpbmcgYWN0aW9uIG9uIHNlbGVjdGlvbiB0eXBlICR7c2VsZWN0aW9uVHlwZX0uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGb3JtIGFuZCBleGVjdXRlIGEgZ3JvdXAvdW5ncm91cCBhY3Rpb24uXG4gKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBleGVjdXRlLiBFaXRoZXIgXCJncm91cFwiIG9yIFwidW5ncm91cFwiLlxuICogQHBhcmFtIGdyb3VwVHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGdyb3VwLiBFaXRoZXIgXCJuZXVtZVwiIG9yIFwibmNcIi5cbiAqIEBwYXJhbSBlbGVtZW50SWRzIC0gVGhlIElEcyBvZiB0aGUgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdyb3VwaW5nQWN0aW9uKFxuICBhY3Rpb246ICdncm91cCcgfCAndW5ncm91cCcsXG4gIGdyb3VwVHlwZTogJ25ldW1lJyB8ICduYycsXG4gIGVsZW1lbnRJZHM6IHN0cmluZ1tdLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIHBhcmFtOiB7XG4gICAgICBncm91cFR5cGU6IGdyb3VwVHlwZSxcbiAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgfSxcbiAgfTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdncm91cCcpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignVW5ncm91cGluZyBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdVbmdyb3VwaW5nIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuXG4gICAgICAvLyBQcm9tcHQgdXNlciB0byBjb25maXJtIGlmIE5lb24gZG9lcyBub3QgcmUgY29nbml6ZSBjb250b3VyXG4gICAgICBpZiAoZ3JvdXBUeXBlID09PSAnbmMnKSB7XG4gICAgICAgIGNvbnN0IG5ldW1lUGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgZWxlbWVudElkc1swXSxcbiAgICAgICAgKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBuY3MgPSBBcnJheS5mcm9tKG5ldW1lUGFyZW50LmNoaWxkcmVuKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91cihuY3MpO1xuICAgICAgICBpZiAoY29udG91ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgV2FybmluZ3MuZ3JvdXBpbmdOb3RSZWNvZ25pemVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVubGluayhlbGVtZW50SWRzOiBzdHJpbmdbXSk6IEFycmF5PEVkaXRvckFjdGlvbj4ge1xuICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG4gIGZvciAoY29uc3QgaWQgb2YgZWxlbWVudElkcykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhbiBlbGVtZW50IGJ5IElEIGFuZCBlbnN1cmUgaXQncyBhbiBTVkdHcmFwaGljc0VsZW1lbnRcbmZ1bmN0aW9uIGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQoaWQ6IHN0cmluZyk6IFNWR0dyYXBoaWNzRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0dyYXBoaWNzRWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb2dnbGVTeWxsYWJsZUlkcyhcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBbU1ZHR3JhcGhpY3NFbGVtZW50LCBTVkdHcmFwaGljc0VsZW1lbnRdIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gW2VsZW1lbnRzWzBdLCBlbGVtZW50c1sxXV07XG4gIH1cblxuICBjb25zdCB1bmxpbmtlZEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKFxuICAgIChlbCkgPT4gIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiYgIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSxcbiAgKTtcblxuICBpZiAodW5saW5rZWRFbGVtZW50KSB7XG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKHVubGlua2VkRWxlbWVudCk7XG5cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBbZWxlbWVudHNbaW5kZXhdLCBlbGVtZW50c1tpbmRleCArIDFdXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBlbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gW2VsZW1lbnRzW2luZGV4IC0gMV0sIGVsZW1lbnRzW2luZGV4XV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoYXQgYWN0aW9uIChsaW5rL3VubGluaykgdG8gcGVyZm9ybSB3aGVuIHVzZXIgY2xpY2tzIG9uIFwiVG9nZ2xlIExpbmtlZCBTeWxsYWJsZVwiXG4gKiBBbHNvIGNhbGxlZCB3aGVuIGNvcnJlc3BpbmRpbmcgaG90a2V5IGlzIHByZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpIHtcbiAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICBjb25zdCBjaGFpbkFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogW10sXG4gIH07XG4gIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcblxuICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnRJZHNcbiAgICAubWFwKGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQpIC8vIE1hcCBJRHMgdG8gU1ZHR3JhcGhpY3NFbGVtZW50IG9yIG51bGxcbiAgICAuZmlsdGVyKChlbCk6IGVsIGlzIFNWR0dyYXBoaWNzRWxlbWVudCA9PiBlbCAhPT0gbnVsbCk7XG5cbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHBhcmFtLnB1c2goLi4udW5saW5rKGVsZW1lbnRJZHMpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbZmlyc3RTeWxsYWJsZSwgc2Vjb25kU3lsbGFibGVdID0gZ2V0VG9nZ2xlU3lsbGFibGVJZHMoZWxlbWVudHMpO1xuICAgIGNvbnNvbGUubG9nKGZpcnN0U3lsbGFibGUuaWQsIHNlY29uZFN5bGxhYmxlLmlkKTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIERlbGV0ZSBzeWwgb24gc2Vjb25kIHN5bGxhYmxlXG4gICAgY29uc3Qgc3lsID0gc2Vjb25kU3lsbGFibGUucXVlcnlTZWxlY3RvcignLnN5bCcpO1xuICAgIGlmIChzeWwgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3lsLmlkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hhaW5BY3Rpb24ucGFyYW0gPSBwYXJhbTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdUb2dnbGVkIFN5bGxhYmxlIExpbmsnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICdGYWlsZWQgdG8gVG9nZ2xlIFN5bGxhYmxlIExpbmsnLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgSURzIG9mIHNlbGVjdGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBnZXRJZHMoKTogc3RyaW5nW10ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlkcy5wdXNoKGVsLmlkKTtcbiAgfSk7XG4gIHJldHVybiBpZHM7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIElEcyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMnIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZHJlbklkcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNoaWxkcmVuSWRzID0gW107XG4gIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBpZiAoXG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSB8fFxuICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoKSA9PiB7XG4gICAgICBjaGlsZHJlbklkcy5wdXNoKGNoLmlkKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBjaGlsZHJlbklkcztcbn1cbiIsImV4cG9ydCB7IElFbnRyeSwgSUZpbGUsIElGb2xkZXIsIEVudHJ5VHlwZSB9IGZyb20gJy4vRmlsZVN5c3RlbUludGVyZmFjZXMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtVG9vbHMnO1xuZXhwb3J0IHsgRmlsZVN5c3RlbU1hbmFnZXIgfSBmcm9tICcuL0ZpbGVTeXN0ZW1NYW5hZ2VyJzsiLCJpbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBlcnJvckxvZ3NQYW5lbENvbnRlbnRzIH0gZnJvbSAnLi4vU3F1YXJlRWRpdC9Db250ZW50cyc7XG5pbXBvcnQgeyBzZXRTZXR0aW5ncywgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuaW1wb3J0IHsgTW9kYWxXaW5kb3csIE1vZGFsV2luZG93VmlldyB9IGZyb20gJy4vTW9kYWxXaW5kb3cnO1xuXG5mdW5jdGlvbiBjcmVhdGVMb2dNZXNzYWdlIChub3RpZjogTm90aWZpY2F0aW9uKTogRWxlbWVudCB7XG4gIGNvbnN0IG5vdGlmRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5vdGlmRGl2LmNsYXNzTGlzdC5hZGQoJ25vdGlmaWNhdGlvbi1jb250YWluZXInKTtcbiAgbm90aWZEaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctbWFpblwiPiR7bm90aWYubWVzc2FnZX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1leHRyYVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tYnRuLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLWxvZy1pbmZvLWljb24td3JhcHBlclwiPlxuICAgICAgICAgIDxpbWcgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGNsYXNzPVwibm90aWYtbG9nLWluZm8taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z1wiIHRpdGxlPVwiTG9nIE1lc3NhZ2VcIj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJlbW92ZS1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIGNsYXNzPVwibG9nLXJlbW92ZSBub3RpZi1yZW1vdmUtaWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9nYXJiYWdlLWNsb3NlZC5zdmdcIiB0aXRsZT1cIlJlbW92ZVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICBgO1xuXG4gIGNvbnN0IHJlbW92ZUJ0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcubG9nLXJlbW92ZScpO1xuICByZW1vdmVCdG4ub25jbGljayA9ICgpID0+IG5vdGlmRGl2LnJlbW92ZSgpO1xuICByZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1vcGVuLnN2Z2ApO1xuICB9KTtcbiAgcmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1jbG9zZWQuc3ZnYCk7XG4gIH0pO1xuXG4gIGlmIChub3RpZi5sb2dJbmZvKSB7XG4gICAgY29uc3QgaW5mb0J0biA9IG5vdGlmRGl2LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcubm90aWYtbG9nLWluZm8taWNvbicpO1xuICAgIGluZm9CdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgcmVtb3ZlQnRuLnN0eWxlLmhlaWdodCA9ICcyMHB4JztcblxuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgaW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvbm90aWZpY2F0aW9uLWluZm8taWNvbi1kYXJrLnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICBpbmZvQnRuLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWxpZ2h0LnN2Z2ApO1xuICAgIH0pO1xuICAgIGluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBvcGVuRXJyb3JMb2dXaW5kb3cobm90aWYubG9nSW5mbykpO1xuICB9XG5cbiAgcmV0dXJuIG5vdGlmRGl2O1xufVxuXG5cbi8qKlxuICogQWRkIG5vdGlmaWNhdGlvbiB0byB0aGUgcGVyc2lzdGVudCBlcnJvciBsb2cgb24gdGhlIHNpZGViYXJcbiAqIEBwYXJhbSBub3RpZiB7Tm90aWZpY2F0aW9ufSBOb3RpZmljYXRpb24gdG8gYWRkIHRvIHRoZSBlcnJvciBsb2dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE5vdGlmaWNhdGlvbiAobm90aWY6IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpO1xuICBsb2cucHJlcGVuZChjcmVhdGVMb2dNZXNzYWdlKG5vdGlmKSk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplIGVycm9yIGxvZy5cbiAqIEFkZHMgbmVjZXNzYXJ5IEhUTUwgdG8gRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEVycm9yTG9nKCk6IHZvaWQge1xuICAvLyBFcnJvciBsb2cgcGFuZWxcbiAgY29uc3QgbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBsb2cuaW5uZXJIVE1MID0gZXJyb3JMb2dzUGFuZWxDb250ZW50cztcblxuICBpbml0RXJyb3JMb2dDb250cm9scygpO1xufVxuXG5cbi8qKlxuICogU2V0IHVwIGV2ZW50IGxpc3RlbmVycyBmb3IgZXJyb3IgTG9nIHBhbmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXJyb3JMb2dDb250cm9scygpOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvcl9sb2cnKTtcbiAgY29uc3QgaGVhZGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvckxvZ0hlYWRpbmcnKTtcbiAgY29uc3QgZHJvcGRvd25JY29uID0gaGVhZGluZy5xdWVyeVNlbGVjdG9yKCdzdmcgPiB1c2UnKTtcbiAgY29uc3QgY29udGVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dDb250ZW50cycpIGFzIEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgaWYgKGRpc3BsYXlFcnJMb2cpIGVycm9yUGFuZWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuXG4gIGhlYWRpbmcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gaWYgZXJyb3IgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGNvbnRlbnRzLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykpIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGFuIG9wZW4gcGFuZWxcbiAgICAgIGNvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgY29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGRyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9IFxuICAgIC8vIGlmIGVycm9yIHBhbmVsIGlzIG9wZW4sIGNsb3NlIGl0XG4gICAgZWxzZSB7XG4gICAgICAvLyBzZXQgY2xhc3NlcyBhbmQgc3R5bGVzIGZvciBhIGNsb3NlZCBwYW5lbFxuICAgICAgY29udGVudHMuY2xhc3NMaXN0LmFkZCgnY2xvc2VkJyk7XG4gICAgICBjb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICBkcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1zaWRlYCk7XG4gICAgfVxuICB9KTtcblxuICBpbml0RGlzcGxheUxpc3RlbmVyKCk7XG59XG5cblxuLyoqXG4gKiBJbml0aWFsaXplcyBjbGljayBsaXN0ZW5lciBvbiBcIlNob3cgZXJyb3IgbG9nc1wiIGJ1dHRvbiBpbiBcIlZpZXdcIiBkcm9wZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5TGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrYm94ZXNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1zaW5nbGUtY29udGFpbmVyJyk7XG4gIGNvbnN0IGVycm9yc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgY29uc3QgZXJvcnJzQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblxuICBlcm9ycnNCdG4uY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTtcbiAgZXJyb3JzTGFiZWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtY29udGFpbmVyJywgJ3NpZGUtcGFuZWwtYnRuJyk7XG4gIGVycm9yc0xhYmVsLnRleHRDb250ZW50ID0gJ0Vycm9ycyc7XG4gIGVyb3Jyc0J0bi5pZCA9ICdkaXNwbGF5LWVycm9ycyc7XG4gIGVyb3Jyc0J0bi50eXBlID0gJ2NoZWNrYm94JztcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBmYWxzZTtcbiAgZXJyb3JzTGFiZWwuYXBwZW5kQ2hpbGQoZXJvcnJzQnRuKTtcbiAgY2hlY2tib3hlc0NvbnRhaW5lci5hcHBlbmQoZXJyb3JzTGFiZWwpO1xuXG4gIGNvbnN0IHsgZGlzcGxheUVyckxvZyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgZXJvcnJzQnRuLmNoZWNrZWQgPSBkaXNwbGF5RXJyTG9nO1xuXG4gIGVyb3Jyc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzZXRTZXR0aW5ncyh7IGRpc3BsYXlFcnJMb2c6IGVyb3Jyc0J0bi5jaGVja2VkIH0pO1xuICAgIHVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSgpO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBvcGVuRXJyb3JMb2dXaW5kb3cobG9nOiBzdHJpbmcpIHtcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5FUlJPUl9MT0csIGxvZyk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5KCk6IHZvaWQge1xuICBjb25zdCBub3RpZlBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBjb25zdCB7IGRlYnVnTW9kZSwgZGlzcGxheUVyckxvZywgZGlzcGxheUluZm8sIGRpc3BsYXlCQm94LCBkaXNwbGF5VGV4dCB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5QWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktYWxsLWJ0bicpO1xuXG4gIGlmIChkZWJ1Z01vZGUpIHtcbiAgICBpZiAoZGlzcGxheUVyckxvZykge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUluZm8gJiYgZGlzcGxheUJCb3ggJiYgXG4gICAgICAgIGRpc3BsYXlUZXh0ICYmIGRpc3BsYXlFcnJMb2cpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbm90aWZQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vdGlmUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIGlmIChkaXNwbGF5SW5mbyAmJiBkaXNwbGF5QkJveCAmJiBkaXNwbGF5VGV4dCkge1xuICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IHsgZ2V0U3RhZmZCQm94LCBzZWxlY3RCQm94LCBzZWxlY3RTdGFmZiwgc2VsZWN0QWxsIH0gZnJvbSAnLi9TZWxlY3RUb29scyc7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vRHJhZ0hhbmRsZXInO1xuXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFJlc2l6ZUFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IGlzT3V0T2ZTVkdCb3VuZHMgfSBmcm9tICcuL0Nvb3JkaW5hdGVzJztcbmltcG9ydCB7IHF1ZXVlTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuXG4vKipcbiAqIFJlc2l6ZSBhIHN0YWZmIG9yIGEgc3lsbGFibGUgdGV4dCBib3VuZGluZyBib3guXG4gKiBGb3Igc3RhdmVzLCB0aGlzIGFsc28gc3VwcG9ydHMgYWRqdXN0aW5nIHRoZSByb3RhdGUuXG4gKi9cbnR5cGUgUG9pbnQgPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBuYW1lOiBudW1iZXIgfTtcblxuLyoqXG4gKiBUaGUgcG9pbnRzIHlvdSBjYW4gY2xpY2sgYW5kIGRyYWcgdG8gcmVzaXplXG4gKi9cbmNvbnN0IFBvaW50TmFtZXMgPSB7XG4gIFRvcExlZnQ6IDAsXG4gIFRvcDogMSxcbiAgVG9wUmlnaHQ6IDIsXG4gIFJpZ2h0OiAzLFxuICBCb3R0b21SaWdodDogNCxcbiAgQm90dG9tOiA1LFxuICBCb3R0b21MZWZ0OiA2LFxuICBMZWZ0OiA3XG59O1xuXG5mdW5jdGlvbiBnZXRQb2ludHModWx4OiBudW1iZXIsIHVseTogbnVtYmVyLCBscng6IG51bWJlciwgbHJ5OiBudW1iZXIsIHJvdGF0ZTogbnVtYmVyKTogUG9pbnRbXSB7XG4gIC8vIE5vdGUgdGhhdCBhcmMgZnVuY3Rpb25zIHJldHVybiBhbiBhbmdsZSB4IGluIFstcGkvMiwgcGkvMl0uXG4gIGxldCBwb2ludHM6IEFycmF5PFBvaW50PjtcbiAgLy8gdWwgaXMgdWx4LCB1bHksIGxyIGlzIGxyeCwgbHJ5XG4gIGlmIChyb3RhdGUgPj0gMCkge1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wTGVmdCB9LFxuICAgICAgeyB4OiAodWx4ICsgbHJ4KSAvIDIsIHk6IHVseSArIChscnggLSB1bHgpIC8gMiAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuVG9wIH0sXG4gICAgICB7IHg6IGxyeCwgeTogdWx5ICsgKGxyeCAtIHVseCkgKiBNYXRoLnNpbihyb3RhdGUpLCBuYW1lOiBQb2ludE5hbWVzLlRvcFJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogKHVseSArIGxyeSArIChscnggLSB1bHgpICogTWF0aC5zaW4ocm90YXRlKSkgLyAyLCBuYW1lOiBQb2ludE5hbWVzLlJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogbHJ5LCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0IH0sXG4gICAgICB7IHg6ICh1bHggKyBscngpIC8gMiwgeTogbHJ5IC0gKGxyeCAtIHVseCkgLyAyICogTWF0aC5zaW4ocm90YXRlKSwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6ICh1bHkgKyBscnkgLSAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSkpIC8gMiwgbmFtZTogUG9pbnROYW1lcy5MZWZ0IH1cbiAgICBdO1xuICB9XG4gIC8vIE5vdCB0aGF0XG4gIGVsc2Uge1xuICAgIGNvbnN0IGEgPSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKE1hdGguYWJzKHJvdGF0ZSkpO1xuICAgIGNvbnN0IGIgPSBscnkgLSB1bHkgLSBhO1xuICAgIHBvaW50cyA9IFtcbiAgICAgIHsgeDogdWx4LCB5OiB1bHkgKyBhLCBuYW1lOiBQb2ludE5hbWVzLlRvcExlZnQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiB1bHkgKyBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Ub3AgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHksIG5hbWU6IFBvaW50TmFtZXMuVG9wUmlnaHQgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHkgKyBiIC8gMiwgbmFtZTogUG9pbnROYW1lcy5SaWdodCB9LFxuICAgICAgeyB4OiBscngsIHk6IHVseSArIGIsIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tUmlnaHQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiBscnkgLSBhIC8gMiwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b20gfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tTGVmdCB9LFxuICAgICAgeyB4OiB1bHgsIHk6IGxyeSAtIGIgLyAyLCBuYW1lOiBQb2ludE5hbWVzLkxlZnQgfVxuICAgIF07XG4gIH1cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZSAoZWxlbWVudDogU1ZHR3JhcGhpY3NFbGVtZW50LCBuZW9uVmlldzogTmVvblZpZXcsIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcik6IHZvaWQge1xuICBsZXQgdWx4OiBudW1iZXI7XG4gIGxldCB1bHk6IG51bWJlcjtcbiAgbGV0IGxyeDogbnVtYmVyO1xuICBsZXQgbHJ5OiBudW1iZXI7XG4gIGxldCByb3RhdGU6IG51bWJlcjtcblxuICBsZXQgaW5pdGlhbFVseDogbnVtYmVyLCBpbml0aWFsTHJ4OiBudW1iZXI7XG4gIGxldCBpbml0aWFsUG9pbnQ6IG51bWJlcltdLCBpbml0aWFsVWx5OiBudW1iZXIsIGluaXRpYWxMcnk6IG51bWJlcixcbiAgICBpbml0aWFsWTogbnVtYmVyLCBpbml0aWFsUmVjdFk6IG51bWJlciwgcG9seUxlbjogbnVtYmVyLCBkeTogbnVtYmVyLCBpbml0aWFsUm90YXRlOiBudW1iZXI7XG5cbiAgZHJhd0luaXRpYWxSZWN0KCk7XG5cbiAgLyoqXG4gICAqIFJlZHJhdyB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIG5ldyBib3VuZHNcbiAgICovXG4gIGZ1bmN0aW9uIHJlZHJhdyAoKTogdm9pZCB7XG4gICAgY29uc3QgcG9pbnRzOiBQb2ludFtdID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIGNvbnN0IHBvaW50U3RyaW5nOiBzdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfZWxlbSwgaW5kZXgpID0+IHsgcmV0dXJuIGluZGV4ICUgMiA9PT0gMDsgfSlcbiAgICAgIC5tYXAoZWxlbSA9PiBlbGVtLnggKyAnLCcgKyBlbGVtLnkpXG4gICAgICAuam9pbignICcpO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jlc2l6ZVJlY3QnKS5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIHBvaW50U3RyaW5nKTtcblxuICAgIGNvbnN0IHRleHRSZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN5bC5zZWxlY3RlZCA+IC5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgaWYgKHRleHRSZWN0KSB7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCBTdHJpbmcoTWF0aC5taW4odWx4LCBscngpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoTWF0aC5taW4odWx5LCBscnkpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKE1hdGguYWJzKGxyeCAtIHVseCkpKTtcbiAgICAgIHRleHRSZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKE1hdGguYWJzKGxyeSAtIHVseSkpKTtcbiAgICB9XG5cblxuICAgIGZvciAoY29uc3QgcG9pbnROYW1lIGluIFBvaW50TmFtZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50OiBQb2ludCA9IHBvaW50c1tQb2ludE5hbWVzW3BvaW50TmFtZV1dO1xuICAgICAgZDMuc2VsZWN0KCcjcC0nICsgcG9pbnROYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpXG4gICAgICAgIC5hdHRyKCdjeCcsIHBvaW50LngpXG4gICAgICAgIC5hdHRyKCdjeScsIHBvaW50LnkpO1xuICAgIH1cblxuICAgIGxldCB4ID0gcG9pbnRzWzNdLng7XG4gICAgbGV0IHkgPSBwb2ludHNbM10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgKHggKyA3MCkgKyAnLCcgKyAoeSArIDUwKSArICcgJyArICh4ICsgMTAwKSArICcsJyArICh5ICsgMTUpICsgJyAnICsgKHggKyAxMzApICsgJywnICsgKHkgKyA1MCk7XG4gICAgeCA9IHBvaW50c1s3XS54O1xuICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICBjb25zdCBwb2ludFN0cmluZ0xlZnQgPSAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDE1KSArICcgJyArXG4gICAgICAoeCAtIDEzMCkgKyAnLCcgKyAoeSAtIDUwKSArICcgJyArICh4IC0gMTAwKSArICcsJyArICh5IC0gODUpICsgJyAnICsgKHggLSA3MCkgKyAnLCcgKyAoeSAtIDUwKTtcblxuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZUxlZnQnKS5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZ0xlZnQpO1xuICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgaW5pdGlhbCByZWN0YW5nbGUgYXJvdW5kIHRoZSBlbGVtZW50XG4gICAqIGFuZCBhZGQgdGhlIGxpc3RlbmVycyB0byBzdXBwb3J0IGRyYWdnaW5nIHRvIHJlc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGRyYXdJbml0aWFsUmVjdCAoKTogdm9pZCB7XG4gICAgaWYgKGVsZW1lbnQgPT09IG51bGwpIHJldHVybjtcblxuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJvdGF0ZVBvaW50JykucmVtb3ZlKCk7XG5cbiAgICAvLyBpZiBpdCdzIGEgYm91bmRpbmdib3gganVzdCBnZXQgdGhlIGNvb3JkaW5hdGVzXG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmIChyZWN0ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVHJpZWQgdG8gZHJhdyByZXNpemUgcmVjdCBmb3IgYSBzeWxUZXh0UmVjdCB0aGF0IGRvZXNuXFwndCBleGlzdCAob3IgaXNuXFwndCBkaXNwbGF5aW5nKScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bHggPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3gnKSk7XG4gICAgICB1bHkgPSBOdW1iZXIocmVjdC5nZXRBdHRyaWJ1dGUoJ3knKSk7XG4gICAgICBscnggPSArdWx4ICsgK3JlY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgICAgbHJ5ID0gK3VseSArICtyZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG5cbiAgICAgIHJvdGF0ZSA9IDA7XG4gICAgfVxuXG4gICAgLy8gaWYgaXQncyBhIHN0YWZmIHVzZSB0aGUgcGF0aHMgdG8gZ2V0IGl0J3MgYm91bmRpbmdib3hcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIGNvbnN0IGJib3ggPSBnZXRTdGFmZkJCb3goZWxlbWVudCk7XG4gICAgICB1bHggPSBiYm94LnVseDtcbiAgICAgIHVseSA9IGJib3gudWx5O1xuICAgICAgbHJ4ID0gYmJveC5scng7XG4gICAgICBscnkgPSBiYm94LmxyeTtcblxuICAgICAgY29uc3QgY29vcmRpbmF0ZXM6IG51bWJlcltdID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdwYXRoJylcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnZCcpXG4gICAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbigoY29vcmRpbmF0ZXNbM10gLSBjb29yZGluYXRlc1sxXSkgL1xuICAgICAgICAoY29vcmRpbmF0ZXNbMl0gLSBjb29yZGluYXRlc1swXSkpO1xuICAgIH1cblxuICAgIGluaXRpYWxVbHggPSB1bHgsIGluaXRpYWxVbHkgPSB1bHksIGluaXRpYWxMcnggPSBscngsIGluaXRpYWxMcnkgPSBscnk7XG5cbiAgICBsZXQgd2hpY2hQb2ludDogc3RyaW5nO1xuXG4gICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzKHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlKTtcblxuICAgIHBvbHlMZW4gPSBwb2ludHNbMl0ueCAtIHBvaW50c1swXS54O1xuXG4gICAgY29uc3QgcG9pbnRTdHJpbmcgPSBwb2ludHMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggJSAyID09PSAwKVxuICAgICAgLm1hcChlbGVtID0+IGVsZW0ueCArICcsJyArIGVsZW0ueSlcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICBkMy5zZWxlY3QoJyMnICsgZWxlbWVudC5pZCkuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgIC5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZylcbiAgICAgIC5hdHRyKCdpZCcsICdyZXNpemVSZWN0JylcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEwKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdtb3ZlJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICcyMCAxMCcpO1xuXG4gICAgY29uc3QgeyBjaXJjbGVTaXplIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgZm9yIChjb25zdCBwb2ludE5hbWUgaW4gUG9pbnROYW1lcykge1xuICAgICAgY29uc3QgcG9pbnQ6IFBvaW50ID0gcG9pbnRzW1BvaW50TmFtZXNbcG9pbnROYW1lXV07XG4gICAgICBkMy5zZWxlY3QoZWxlbWVudC52aWV3cG9ydEVsZW1lbnQpLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgLmF0dHIoJ2N4JywgcG9pbnQueClcbiAgICAgICAgLmF0dHIoJ2N5JywgcG9pbnQueSlcbiAgICAgICAgLmF0dHIoJ3InLCBjaXJjbGVTaXplKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDQpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJyMwMDk5ZmYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAncmVzaXplUG9pbnQnKVxuICAgICAgICAuYXR0cignaWQnLCAncC0nICsgcG9pbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyBkbyBpdCBhcyBhIGxvb3AgaW5zdGVhZCBvZiBzZWxlY3RBbGwgc28gdGhhdCB5b3UgY2FuIGVhc2lseSBrbm93IHdoaWNoIHBvaW50IHdhc1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBQb2ludE5hbWVzKSB7XG4gICAgICBkMy5zZWxlY3QoJyNwLScgKyBuYW1lKS5maWx0ZXIoJy5yZXNpemVQb2ludCcpLmNhbGwoXG4gICAgICAgIGQzLmRyYWcoKVxuICAgICAgICAgIC5vbignc3RhcnQnLCAoKSA9PiB7IHJlc2l6ZVN0YXJ0KG5hbWUpOyB9KVxuICAgICAgICAgIC5vbignZHJhZycsIHJlc2l6ZURyYWcpXG4gICAgICAgICAgLm9uKCdlbmQnLCByZXNpemVFbmQuYmluZCh0aGlzKSkpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkge1xuICAgICAgbGV0IHggPSBwb2ludHNbM10ueDtcbiAgICAgIGxldCB5ID0gcG9pbnRzWzNdLnk7XG4gICAgICBjb25zdCBwb2ludFN0cmluZ1JpZ2h0ID0gKHggKyAxMDApICsgJywnICsgKHkgKyA4NSkgKyAnICcgK1xuICAgICAgICAoeCArIDcwKSArICcsJyArICh5ICsgNTApICsgJyAnICsgKHggKyAxMDApICsgJywnICsgKHkgKyAxNSkgKyAnICcgKyAoeCArIDEzMCkgKyAnLCcgKyAoeSArIDUwKTtcbiAgICAgIHggPSBwb2ludHNbN10ueDtcbiAgICAgIHkgPSBwb2ludHNbN10ueTtcbiAgICAgIGNvbnN0IHBvaW50U3RyaW5nTGVmdCA9ICh4IC0gMTAwKSArICcsJyArICh5IC0gMTUpICsgJyAnICtcbiAgICAgICAgKHggLSAxMzApICsgJywnICsgKHkgLSA1MCkgKyAnICcgKyAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDg1KSArICcgJyArICh4IC0gNzApICsgJywnICsgKHkgLSA1MCk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdSaWdodClcbiAgICAgICAgLmF0dHIoJ2lkJywgJ3JvdGF0ZVJpZ2h0JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCA3KVxuICAgICAgICAuYXR0cignZmlsbCcsICcjMDA5OWZmJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3JvdGF0ZVBvaW50Jyk7XG5cbiAgICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdMZWZ0KVxuICAgICAgICAuYXR0cignaWQnLCAncm90YXRlTGVmdCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgNylcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnIzAwOTlmZicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdyb3RhdGVQb2ludCcpO1xuXG4gICAgICBkMy5zZWxlY3QoJyNyb3RhdGVMZWZ0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdMZWZ0KVxuICAgICAgICAgIC5vbignZW5kJywgcm90YXRlRW5kKSk7XG5cbiAgICAgIGQzLnNlbGVjdCgnI3JvdGF0ZVJpZ2h0JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsIHJvdGF0ZVN0YXJ0KVxuICAgICAgICAgIC5vbignZHJhZycsIHJvdGF0ZURyYWdSaWdodClcbiAgICAgICAgICAub24oJ2VuZCcsIHJvdGF0ZUVuZCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZVN0YXJ0IChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHdoaWNoUG9pbnQgPSBuYW1lO1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHMuZmluZChwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzW25hbWVdKTtcbiAgICAgIGluaXRpYWxQb2ludCA9IFtwb2ludC54LCBwb2ludC55XTtcbiAgICAgIGluaXRpYWxVbHkgPSB1bHk7XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZURyYWcgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFBvaW50ID0gZDMubW91c2UodGhpcyk7XG4gICAgICBzd2l0Y2ggKFBvaW50TmFtZXNbd2hpY2hQb2ludF0pIHtcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcExlZnQ6XG4gICAgICAgICAgdWx4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcDpcbiAgICAgICAgICB1bHkgPSBjdXJyZW50UG9pbnRbMV0gLSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuVG9wUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXSAtIChscnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlJpZ2h0OlxuICAgICAgICAgIGxyeCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICBscnkgPSBpbml0aWFsTHJ5ICsgKGN1cnJlbnRQb2ludFswXSAtIGluaXRpYWxQb2ludFswXSkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIGxyeSA9IGN1cnJlbnRQb2ludFsxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLkJvdHRvbTpcbiAgICAgICAgICBscnkgPSBjdXJyZW50UG9pbnRbMV0gKyAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgbHJ5ID0gY3VycmVudFBvaW50WzFdICsgKGxyeCAtIHVseCkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgdWx5ID0gaW5pdGlhbFVseSArIChjdXJyZW50UG9pbnRbMF0gLSBpbml0aWFsUG9pbnRbMF0pICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdTb21ldGhpbmcgdGhhdCB3YXNuXFwndCBhIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB3YXMgZHJhZ2dlZC4gVGhpcyBzaG91bGRuXFwndCBoYXBwZW4uJyk7XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemVFbmQgKCk6IHZvaWQge1xuICAgICAgaWYgKGlzT3V0T2ZTVkdCb3VuZHModWx4LCB1bHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4LCBscnkpKSB7XG4gICAgICAgIHVseCA9IGluaXRpYWxVbHgsIHVseSA9IGluaXRpYWxVbHksIGxyeCA9IGluaXRpYWxMcngsIGxyeSA9IGluaXRpYWxMcnk7XG4gICAgICAgIHJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBxdWV1ZU5vdGlmaWNhdGlvbignW0ZBSUxdIEdseXBocyB3ZXJlIHBsYWNlZCBvdXQgb2YgYm91bmRzISBSZXNpemUgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBSZXNpemVBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3Jlc2l6ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHVseDogdWx4LFxuICAgICAgICAgIHVseTogdWx5LFxuICAgICAgICAgIGxyeDogbHJ4LFxuICAgICAgICAgIGxyeTogbHJ5XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgYXdhaXQgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKTtcbiAgICAgICAgdWx4ID0gdW5kZWZpbmVkLCB1bHkgPSB1bmRlZmluZWQsIGxyeCA9IHVuZGVmaW5lZCwgbHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdEFsbChbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudC5pZH1gKV0sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb3JlRWRpdCcpO1xuXG4gICAgICAgICAgaWYgKG1vcmVFZGl0KSB7XG4gICAgICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBST1RBVEVcbiAgICBmdW5jdGlvbiByb3RhdGVTdGFydCAoKTogdm9pZCB7XG4gICAgICBjb25zdCB3aGljaCA9IGQzLmV2ZW50LnNvdXJjZUV2ZW50LnRhcmdldC5pZDtcbiAgICAgIGluaXRpYWxZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBpbml0aWFsTHJ5ID0gbHJ5O1xuICAgICAgaW5pdGlhbFVseSA9IHVseTtcbiAgICAgIGluaXRpYWxSZWN0WSA9ICh3aGljaCA9PT0gJ3JvdGF0ZVJpZ2h0JyA/IGxyeSA6IHVseSk7XG4gICAgICBpbml0aWFsUm90YXRlID0gcm90YXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZURyYWdMZWZ0ICgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBjb25zdCB0ZW1wID0gY3VycmVudFkgLSBpbml0aWFsWTtcbiAgICAgIGNvbnN0IHRlbXBSb3RhdGUgPSBpbml0aWFsUm90YXRlIC0gTWF0aC5hdGFuKHRlbXAgLyBwb2x5TGVuKTtcbiAgICAgIGlmICh0ZW1wUm90YXRlID4gLTAuMiAmJiB0ZW1wUm90YXRlIDwgMC4yKSB7XG4gICAgICAgIGR5ID0gdGVtcDtcbiAgICAgICAgdWx5ID0gaW5pdGlhbFJlY3RZICsgZHk7XG4gICAgICAgIHJvdGF0ZSA9IHRlbXBSb3RhdGU7XG4gICAgICAgIGlmIChyb3RhdGUgPj0gMCkge1xuICAgICAgICAgIHVseSA9IGR5ICsgcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0KVswXS55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVseSA9IHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Ub3BSaWdodClbMF0ueTtcbiAgICAgICAgICBscnkgPSBkeSArIHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Cb3R0b21MZWZ0KVswXS55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGVEcmFnUmlnaHQgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFkgPSBkMy5tb3VzZSh0aGlzKVsxXTtcbiAgICAgIGNvbnN0IHRlbXAgPSBjdXJyZW50WSAtIGluaXRpYWxZO1xuICAgICAgY29uc3QgdGVtcFJvdGF0ZSA9IGluaXRpYWxSb3RhdGUgKyBNYXRoLmF0YW4odGVtcCAvIHBvbHlMZW4pO1xuICAgICAgaWYgKHRlbXBSb3RhdGUgPiAtMC4yICYmIHRlbXBSb3RhdGUgPCAwLjIpIHtcbiAgICAgICAgZHkgPSB0ZW1wO1xuICAgICAgICByb3RhdGUgPSB0ZW1wUm90YXRlO1xuICAgICAgICBpZiAocm90YXRlID49IDAgKSB7XG4gICAgICAgICAgbHJ5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuQm90dG9tUmlnaHQpWzBdLnk7XG4gICAgICAgICAgdWx5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcExlZnQpWzBdLnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdWx5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuVG9wUmlnaHQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbUxlZnQpWzBdLnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZHJhdygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZUVuZCAoKTogdm9pZCB7XG4gICAgICBpZiAoZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkeSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc091dE9mU1ZHQm91bmRzKHVseCwgdWx5KSB8fCBpc091dE9mU1ZHQm91bmRzKGxyeCwgbHJ5KSkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVzaXplUG9pbnQnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3Jlc2l6ZVJlY3QnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJvdGF0ZVBvaW50JykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQ7XG4gICAgICAgIHVseSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbHJ4ID0gdW5kZWZpbmVkO1xuICAgICAgICBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgICAgIHNlbGVjdEJCb3goZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLCBkcmFnSGFuZGxlciwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0U3RhZmYoZWxlbWVudCwgZHJhZ0hhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIFJvdGF0ZSBhY3Rpb24gZmFpbGVkLicsICdlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgdWx4OiB1bHgsXG4gICAgICAgICAgdWx5OiB1bHksXG4gICAgICAgICAgbHJ4OiBscngsXG4gICAgICAgICAgbHJ5OiBscnksXG4gICAgICAgICAgcm90YXRlOiByb3RhdGUgKiAxODAgLyBNYXRoLlBJXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICB1bHggPSB1bmRlZmluZWQsIHVseSA9IHVuZGVmaW5lZCwgbHJ4ID0gdW5kZWZpbmVkLCBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGR5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkcmF3SW5pdGlhbFJlY3QoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdFN0YWZmKGVsZW1lbnQsIGRyYWdIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgaW1tZWRpYXRlIGZyb20gJ2ltbWVkaWF0ZSc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IE1kNSBmcm9tICdzcGFyay1tZDUnO1xuaW1wb3J0IHZ1dnV6ZWxhIGZyb20gJ3Z1dnV6ZWxhJztcbmltcG9ydCBnZXRBcmd1bWVudHMgZnJvbSAnYXJnc2FycmF5JztcbmltcG9ydCBpbmhlcml0cyBmcm9tICdpbmhlcml0cyc7XG5pbXBvcnQgRUUgZnJvbSAnZXZlbnRzJztcblxuZnVuY3Rpb24gbWFuZ2xlKGtleSkge1xuICByZXR1cm4gJyQnICsga2V5O1xufVxuZnVuY3Rpb24gdW5tYW5nbGUoa2V5KSB7XG4gIHJldHVybiBrZXkuc3Vic3RyaW5nKDEpO1xufVxuZnVuY3Rpb24gTWFwJDEoKSB7XG4gIHRoaXMuX3N0b3JlID0ge307XG59XG5NYXAkMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICByZXR1cm4gdGhpcy5fc3RvcmVbbWFuZ2xlZF07XG59O1xuTWFwJDEucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHRoaXMuX3N0b3JlW21hbmdsZWRdID0gdmFsdWU7XG4gIHJldHVybiB0cnVlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHJldHVybiBtYW5nbGVkIGluIHRoaXMuX3N0b3JlO1xufTtcbk1hcCQxLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLm1hcChrID0+IHVubWFuZ2xlKGspKTtcbn07XG5NYXAkMS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICB2YXIgcmVzID0gbWFuZ2xlZCBpbiB0aGlzLl9zdG9yZTtcbiAgZGVsZXRlIHRoaXMuX3N0b3JlW21hbmdsZWRdO1xuICByZXR1cm4gcmVzO1xufTtcbk1hcCQxLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuX3N0b3JlW2tleV07XG4gICAga2V5ID0gdW5tYW5nbGUoa2V5KTtcbiAgICBjYih2YWx1ZSwga2V5KTtcbiAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXAkMS5wcm90b3R5cGUsICdzaXplJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fc3RvcmUpLmxlbmd0aDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIFNldCQxKGFycmF5KSB7XG4gIHRoaXMuX3N0b3JlID0gbmV3IE1hcCQxKCk7XG5cbiAgLy8gaW5pdCB3aXRoIGFuIGFycmF5XG4gIGlmIChhcnJheSAmJiBBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGhpcy5hZGQoYXJyYXlbaV0pO1xuICAgIH1cbiAgfVxufVxuU2V0JDEucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3N0b3JlLnNldChrZXksIHRydWUpO1xufTtcblNldCQxLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9zdG9yZS5oYXMoa2V5KTtcbn07XG5TZXQkMS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYikge1xuICB0aGlzLl9zdG9yZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgY2Ioa2V5KTtcbiAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCQxLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5zaXplO1xuICB9XG59KTtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9rYW5nYXguZ2l0aHViLmlvL2NvbXBhdC10YWJsZS9lczYvIHdlIGNhbiBzbmlmZiBvdXRcbi8vIGluY29tcGxldGUgTWFwL1NldCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNhdXNlIG91ciB0ZXN0cyB0byBmYWlsLlxuLy8gTm90YWJseSB0aGV5IGZhaWwgaW4gSUUxMSBhbmQgaU9TIDguNCwgd2hpY2ggdGhpcyBwcmV2ZW50cy5cbmZ1bmN0aW9uIHN1cHBvcnRzTWFwQW5kU2V0KCkge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3AgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcCwgU3ltYm9sLnNwZWNpZXMpO1xuICByZXR1cm4gcHJvcCAmJiAnZ2V0JyBpbiBwcm9wICYmIE1hcFtTeW1ib2wuc3BlY2llc10gPT09IE1hcDtcbn1cblxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vbnRhZ2Vqcy9jb2xsZWN0aW9uc1xuXG52YXIgRXhwb3J0ZWRTZXQ7XG52YXIgRXhwb3J0ZWRNYXA7XG5cbntcbiAgaWYgKHN1cHBvcnRzTWFwQW5kU2V0KCkpIHsgLy8gcHJlZmVyIGJ1aWx0LWluIE1hcC9TZXRcbiAgICBFeHBvcnRlZFNldCA9IFNldDtcbiAgICBFeHBvcnRlZE1hcCA9IE1hcDtcbiAgfSBlbHNlIHsgLy8gZmFsbCBiYWNrIHRvIG91ciBwb2x5ZmlsbFxuICAgIEV4cG9ydGVkU2V0ID0gU2V0JDE7XG4gICAgRXhwb3J0ZWRNYXAgPSBNYXAkMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpbmFyeU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqZWN0IGluc3RhbmNlb2YgQmxvYik7XG59XG5cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYnVmZikge1xuICBpZiAodHlwZW9mIGJ1ZmYuc2xpY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYnVmZi5zbGljZSgwKTtcbiAgfVxuICAvLyBJRTEwLTExIHNsaWNlKCkgcG9seWZpbGxcbiAgdmFyIHRhcmdldCA9IG5ldyBBcnJheUJ1ZmZlcihidWZmLmJ5dGVMZW5ndGgpO1xuICB2YXIgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuICB2YXIgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmKTtcbiAgdGFyZ2V0QXJyYXkuc2V0KHNvdXJjZUFycmF5KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY2xvbmVCaW5hcnlPYmplY3Qob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG4gIH1cbiAgdmFyIHNpemUgPSBvYmplY3Quc2l6ZTtcbiAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcbiAgLy8gQmxvYlxuICBpZiAodHlwZW9mIG9iamVjdC5zbGljZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvYmplY3Quc2xpY2UoMCwgc2l6ZSwgdHlwZSk7XG4gIH1cbiAgLy8gUGhhbnRvbUpTIHNsaWNlKCkgcmVwbGFjZW1lbnRcbiAgcmV0dXJuIG9iamVjdC53ZWJraXRTbGljZSgwLCBzaXplLCB0eXBlKTtcbn1cblxuLy8gbW9zdCBvZiB0aGlzIGlzIGJvcnJvd2VkIGZyb20gbG9kYXNoLmlzUGxhaW5PYmplY3Q6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmlzLWNvbXBvbmVudHMvbG9kYXNoLmlzcGxhaW5vYmplY3QvXG4vLyBibG9iLzI5YzM1ODE0MGE3NGYyNTJhZWIwOGM5ZWIyOGJlZjg2ZjIyMTdkNGEvaW5kZXguanNcblxudmFyIGZ1bmNUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb3RvID09PSBudWxsKSB7IC8vIG5vdCBzdXJlIHdoZW4gdGhpcyBoYXBwZW5zLCBidXQgSSBndWVzcyBpdCBjYW5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gY2xvbmUob2JqZWN0KSB7XG4gIHZhciBuZXdPYmplY3Q7XG4gIHZhciBpO1xuICB2YXIgbGVuO1xuXG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBuZXdPYmplY3QgPSBbXTtcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBvYmplY3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG5ld09iamVjdFtpXSA9IGNsb25lKG9iamVjdFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNhc2U6IHRvIGF2b2lkIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIEluZGV4ZWREQlxuICAvLyBhbmQgb3RoZXIgYmFja2VuZHMsIHdlIGF1dG9tYXRpY2FsbHkgc3RyaW5naWZ5IERhdGVzXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlICYmIGlzRmluaXRlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICBpZiAoaXNCaW5hcnlPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBjbG9uZUJpbmFyeU9iamVjdChvYmplY3QpO1xuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0OyAvLyBkb24ndCBjbG9uZSBvYmplY3RzIGxpa2UgV29ya2Vyc1xuICB9XG5cbiAgbmV3T2JqZWN0ID0ge307XG4gIGZvciAoaSBpbiBvYmplY3QpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBpKSkge1xuICAgICAgdmFyIHZhbHVlID0gY2xvbmUob2JqZWN0W2ldKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5ld09iamVjdFtpXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3T2JqZWN0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGZ1bikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICAvLyB0aGlzIGlzIGEgc21va2UgdGVzdCBhbmQgc2hvdWxkIG5ldmVyIGFjdHVhbGx5IGhhcHBlblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbmNlIGNhbGxlZCBtb3JlIHRoYW4gb25jZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUHJvbWlzZShmdW5jKSB7XG4gIC8vY3JlYXRlIHRoZSBmdW5jdGlvbiB3ZSB3aWxsIGJlIHJldHVybmluZ1xuICByZXR1cm4gZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgLy8gQ2xvbmUgYXJndW1lbnRzXG4gICAgYXJncyA9IGNsb25lKGFyZ3MpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBpZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLCBhc3N1bWUgaXRzIGEgY2FsbGJhY2tcbiAgICB2YXIgdXNlZENCID0gKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpID8gYXJncy5wb3AoKSA6IGZhbHNlO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgICAgdmFyIHJlc3A7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBvbmNlKGZ1bmN0aW9uIChlcnIsIG1lc2cpIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVsZmlsbChtZXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjcmVhdGUgYSBjYWxsYmFjayBmb3IgdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgIC8vIGFwcGx5IHRoZSBmdW5jdGlvbiBpbiB0aGUgb3JpZyBjb250ZXh0XG4gICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJlc3AgPSBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICBpZiAocmVzcCAmJiB0eXBlb2YgcmVzcC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZnVsZmlsbChyZXNwKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gaWYgdGhlcmUgaXMgYSBjYWxsYmFjaywgY2FsbCBpdCBiYWNrXG4gICAgaWYgKHVzZWRDQikge1xuICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdXNlZENCKG51bGwsIHJlc3VsdCk7XG4gICAgICB9LCB1c2VkQ0IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGxvZ0FwaUNhbGwoc2VsZiwgbmFtZSwgYXJncykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHNlbGYuY29uc3RydWN0b3IubGlzdGVuZXJzKCdkZWJ1ZycpLmxlbmd0aCkge1xuICAgIHZhciBsb2dBcmdzID0gWydhcGknLCBzZWxmLm5hbWUsIG5hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGxvZ0FyZ3MucHVzaChhcmdzW2ldKTtcbiAgICB9XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCdkZWJ1ZycsIGxvZ0FyZ3MpO1xuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIGNhbGxiYWNrIGl0c2VsZiB0byBsb2cgdGhlIHJlc3BvbnNlXG4gICAgdmFyIG9yaWdDYWxsYmFjayA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIHZhciByZXNwb25zZUFyZ3MgPSBbJ2FwaScsIHNlbGYubmFtZSwgbmFtZV07XG4gICAgICByZXNwb25zZUFyZ3MgPSByZXNwb25zZUFyZ3MuY29uY2F0KFxuICAgICAgICBlcnIgPyBbJ2Vycm9yJywgZXJyXSA6IFsnc3VjY2VzcycsIHJlc11cbiAgICAgICk7XG4gICAgICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ2RlYnVnJywgcmVzcG9uc2VBcmdzKTtcbiAgICAgIG9yaWdDYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGFwdGVyRnVuKG5hbWUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0b1Byb21pc2UoZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZGF0YWJhc2UgaXMgY2xvc2VkJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdkYXRhYmFzZSBpcyBkZXN0cm95ZWQnKSk7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBsb2dBcGlDYWxsKHNlbGYsIG5hbWUsIGFyZ3MpO1xuICAgIGlmICghdGhpcy50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi50YXNrcXVldWUuYWRkVGFzayhmdW5jdGlvbiAoZmFpbGVkKSB7XG4gICAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgcmVqZWN0KGZhaWxlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZ1bGZpbGwoc2VsZltuYW1lXS5hcHBseShzZWxmLCBhcmdzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG4gIH0pKTtcbn1cblxuLy8gbGlrZSB1bmRlcnNjb3JlL2xvZGFzaCBfLnBpY2soKVxuZnVuY3Rpb24gcGljayhvYmosIGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IGFycltpXTtcbiAgICBpZiAocHJvcCBpbiBvYmopIHtcbiAgICAgIHJlc1twcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gTW9zdCBicm93c2VycyB0aHJvdHRsZSBjb25jdXJyZW50IHJlcXVlc3RzIGF0IDYsIHNvIGl0J3Mgc2lsbHlcbi8vIHRvIHNoaW0gX2J1bGtfZ2V0IGJ5IHRyeWluZyB0byBsYXVuY2ggcG90ZW50aWFsbHkgaHVuZHJlZHMgb2YgcmVxdWVzdHNcbi8vIGFuZCB0aGVuIGxldHRpbmcgdGhlIG1ham9yaXR5IHRpbWUgb3V0LiBXZSBjYW4gaGFuZGxlIHRoaXMgb3Vyc2VsdmVzLlxudmFyIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUyA9IDY7XG5cbmZ1bmN0aW9uIGlkZW50aXR5RnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0Rm9yT3BlblJldnNHZXQocmVzdWx0KSB7XG4gIHJldHVybiBbe1xuICAgIG9rOiByZXN1bHRcbiAgfV07XG59XG5cbi8vIHNoaW0gZm9yIFAvQ291Y2hEQiBhZGFwdGVycyB0aGF0IGRvbid0IGRpcmVjdGx5IGltcGxlbWVudCBfYnVsa19nZXRcbmZ1bmN0aW9uIGJ1bGtHZXQoZGIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXF1ZXN0cyA9IG9wdHMuZG9jcztcblxuICAvLyBjb25zb2xpZGF0ZSBpbnRvIG9uZSByZXF1ZXN0IHBlciBkb2MgaWYgcG9zc2libGVcbiAgdmFyIHJlcXVlc3RzQnlJZCA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICByZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgaWYgKHJlcXVlc3RzQnlJZC5oYXMocmVxdWVzdC5pZCkpIHtcbiAgICAgIHJlcXVlc3RzQnlJZC5nZXQocmVxdWVzdC5pZCkucHVzaChyZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdHNCeUlkLnNldChyZXF1ZXN0LmlkLCBbcmVxdWVzdF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIG51bURvY3MgPSByZXF1ZXN0c0J5SWQuc2l6ZTtcbiAgdmFyIG51bURvbmUgPSAwO1xuICB2YXIgcGVyRG9jUmVzdWx0cyA9IG5ldyBBcnJheShudW1Eb2NzKTtcblxuICBmdW5jdGlvbiBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBwZXJEb2NSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgcmVzLmRvY3MuZm9yRWFjaChmdW5jdGlvbiAoaW5mbykge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIGlkOiByZXMuaWQsXG4gICAgICAgICAgZG9jczogW2luZm9dXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY2FsbGJhY2sobnVsbCwge3Jlc3VsdHM6IHJlc3VsdHN9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICBpZiAoKytudW1Eb25lID09PSBudW1Eb2NzKSB7XG4gICAgICBjb2xsYXBzZVJlc3VsdHNBbmRGaW5pc2goKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnb3RSZXN1bHQoZG9jSW5kZXgsIGlkLCBkb2NzKSB7XG4gICAgcGVyRG9jUmVzdWx0c1tkb2NJbmRleF0gPSB7aWQ6IGlkLCBkb2NzOiBkb2NzfTtcbiAgICBjaGVja0RvbmUoKTtcbiAgfVxuXG4gIHZhciBhbGxSZXF1ZXN0cyA9IFtdO1xuICByZXF1ZXN0c0J5SWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIGFsbFJlcXVlc3RzLnB1c2goa2V5KTtcbiAgfSk7XG5cbiAgdmFyIGkgPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHRCYXRjaCgpIHtcblxuICAgIGlmIChpID49IGFsbFJlcXVlc3RzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB1cFRvID0gTWF0aC5taW4oaSArIE1BWF9OVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUywgYWxsUmVxdWVzdHMubGVuZ3RoKTtcbiAgICB2YXIgYmF0Y2ggPSBhbGxSZXF1ZXN0cy5zbGljZShpLCB1cFRvKTtcbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2gsIGkpO1xuICAgIGkgKz0gYmF0Y2gubGVuZ3RoO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKGJhdGNoLCBvZmZzZXQpIHtcbiAgICBiYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJZCwgaikge1xuICAgICAgdmFyIGRvY0lkeCA9IG9mZnNldCArIGo7XG4gICAgICB2YXIgZG9jUmVxdWVzdHMgPSByZXF1ZXN0c0J5SWQuZ2V0KGRvY0lkKTtcblxuICAgICAgLy8ganVzdCB1c2UgdGhlIGZpcnN0IHJlcXVlc3QgYXMgdGhlIFwidGVtcGxhdGVcIlxuICAgICAgLy8gVE9ETzogVGhlIF9idWxrX2dldCBBUEkgYWxsb3dzIGZvciBtb3JlIHN1YnRsZSB1c2UgY2FzZXMgdGhhbiB0aGlzLFxuICAgICAgLy8gYnV0IGZvciBub3cgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGVyZSB3aWxsIGJlIGEgbWl4IG9mIGRpZmZlcmVudFxuICAgICAgLy8gXCJhdHRzX3NpbmNlXCIgb3IgXCJhdHRhY2htZW50c1wiIGluIHRoZSBzYW1lIHJlcXVlc3QsIHNpbmNlIGl0J3MganVzdFxuICAgICAgLy8gcmVwbGljYXRlLmpzIHRoYXQgaXMgdXNpbmcgdGhpcyBmb3IgdGhlIG1vbWVudC5cbiAgICAgIC8vIEFsc28sIGF0dHNfc2luY2UgaXMgYXNwaXJhdGlvbmFsLCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGl0IHlldC5cbiAgICAgIHZhciBkb2NPcHRzID0gcGljayhkb2NSZXF1ZXN0c1swXSwgWydhdHRzX3NpbmNlJywgJ2F0dGFjaG1lbnRzJ10pO1xuICAgICAgZG9jT3B0cy5vcGVuX3JldnMgPSBkb2NSZXF1ZXN0cy5tYXAoZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgLy8gcmV2IGlzIG9wdGlvbmFsLCBvcGVuX3JldnMgZGlzYWxsb3dlZFxuICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXY7XG4gICAgICB9KTtcblxuICAgICAgLy8gcmVtb3ZlIGZhbHNleSAvIHVuZGVmaW5lZCByZXZpc2lvbnNcbiAgICAgIGRvY09wdHMub3Blbl9yZXZzID0gZG9jT3B0cy5vcGVuX3JldnMuZmlsdGVyKGlkZW50aXR5RnVuY3Rpb24pO1xuXG4gICAgICB2YXIgZm9ybWF0UmVzdWx0ID0gaWRlbnRpdHlGdW5jdGlvbjtcblxuICAgICAgaWYgKGRvY09wdHMub3Blbl9yZXZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgZG9jT3B0cy5vcGVuX3JldnM7XG5cbiAgICAgICAgLy8gd2hlbiBmZXRjaGluZyBvbmx5IHRoZSBcIndpbm5pbmdcIiBsZWFmLFxuICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIHJlc3VsdCBzbyBpdCBsb29rcyBsaWtlIGFuIG9wZW5fcmV2c1xuICAgICAgICAvLyByZXF1ZXN0XG4gICAgICAgIGZvcm1hdFJlc3VsdCA9IGZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0O1xuICAgICAgfVxuXG4gICAgICAvLyBnbG9iYWxseS1zdXBwbGllZCBvcHRpb25zXG4gICAgICBbJ3JldnMnLCAnYXR0YWNobWVudHMnLCAnYmluYXJ5JywgJ2FqYXgnLCAnbGF0ZXN0J10uZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgaWYgKHBhcmFtIGluIG9wdHMpIHtcbiAgICAgICAgICBkb2NPcHRzW3BhcmFtXSA9IG9wdHNbcGFyYW1dO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGRiLmdldChkb2NJZCwgZG9jT3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gW3tlcnJvcjogZXJyfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gZm9ybWF0UmVzdWx0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZ290UmVzdWx0KGRvY0lkeCwgZG9jSWQsIHJlc3VsdCk7XG4gICAgICAgIG5leHRCYXRjaCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZXh0QmF0Y2goKTtcblxufVxuXG52YXIgaGFzTG9jYWw7XG5cbnRyeSB7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdfcG91Y2hfY2hlY2tfbG9jYWxzdG9yYWdlJywgMSk7XG4gIGhhc0xvY2FsID0gISFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnX3BvdWNoX2NoZWNrX2xvY2Fsc3RvcmFnZScpO1xufSBjYXRjaCAoZSkge1xuICBoYXNMb2NhbCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFN0b3JhZ2UoKSB7XG4gIHJldHVybiBoYXNMb2NhbDtcbn1cblxuLy8gQ3VzdG9tIG5leHRUaWNrKCkgc2hpbSBmb3IgYnJvd3NlcnMuIEluIG5vZGUsIHRoaXMgd2lsbCBqdXN0IGJlIHByb2Nlc3MubmV4dFRpY2soKS4gV2VcblxuaW5oZXJpdHMoQ2hhbmdlcywgRUUpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gYXR0YWNoQnJvd3NlckV2ZW50cyhzZWxmKSB7XG4gIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSkge1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBzZWxmLmVtaXQoZS5rZXkpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG4gIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gIGF0dGFjaEJyb3dzZXJFdmVudHModGhpcyk7XG59XG5DaGFuZ2VzLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkLCBkYiwgb3B0cykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHRoaXMuX2xpc3RlbmVyc1tpZF0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICBmdW5jdGlvbiBldmVudEZ1bmN0aW9uKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghc2VsZi5fbGlzdGVuZXJzW2lkXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5wcm9ncmVzcykge1xuICAgICAgaW5wcm9ncmVzcyA9ICd3YWl0aW5nJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5wcm9ncmVzcyA9IHRydWU7XG4gICAgdmFyIGNoYW5nZXNPcHRzID0gcGljayhvcHRzLCBbXG4gICAgICAnc3R5bGUnLCAnaW5jbHVkZV9kb2NzJywgJ2F0dGFjaG1lbnRzJywgJ2NvbmZsaWN0cycsICdmaWx0ZXInLFxuICAgICAgJ2RvY19pZHMnLCAndmlldycsICdzaW5jZScsICdxdWVyeV9wYXJhbXMnLCAnYmluYXJ5JywgJ3JldHVybl9kb2NzJ1xuICAgIF0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBvbkVycm9yKCkge1xuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRiLmNoYW5nZXMoY2hhbmdlc09wdHMpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoYykge1xuICAgICAgaWYgKGMuc2VxID4gb3B0cy5zaW5jZSAmJiAhb3B0cy5jYW5jZWxsZWQpIHtcbiAgICAgICAgb3B0cy5zaW5jZSA9IGMuc2VxO1xuICAgICAgICBvcHRzLm9uQ2hhbmdlKGMpO1xuICAgICAgfVxuICAgIH0pLm9uKCdjb21wbGV0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbnByb2dyZXNzID09PSAnd2FpdGluZycpIHtcbiAgICAgICAgaW1tZWRpYXRlKGV2ZW50RnVuY3Rpb24pO1xuICAgICAgfVxuICAgICAgaW5wcm9ncmVzcyA9IGZhbHNlO1xuICAgIH0pLm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICB9XG4gIHRoaXMuX2xpc3RlbmVyc1tpZF0gPSBldmVudEZ1bmN0aW9uO1xuICB0aGlzLm9uKGRiTmFtZSwgZXZlbnRGdW5jdGlvbik7XG59O1xuXG5DaGFuZ2VzLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChkYk5hbWUsIGlkKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIShpZCBpbiB0aGlzLl9saXN0ZW5lcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEVFLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGRiTmFtZSxcbiAgICB0aGlzLl9saXN0ZW5lcnNbaWRdKTtcbiAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tpZF07XG59O1xuXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5DaGFuZ2VzLnByb3RvdHlwZS5ub3RpZnlMb2NhbFdpbmRvd3MgPSBmdW5jdGlvbiAoZGJOYW1lKSB7XG4gIC8vZG8gYSB1c2VsZXNzIGNoYW5nZSBvbiBhIHN0b3JhZ2UgdGhpbmdcbiAgLy9pbiBvcmRlciB0byBnZXQgb3RoZXIgd2luZG93cydzIGxpc3RlbmVycyB0byBhY3RpdmF0ZVxuICBpZiAoaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICBsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9IChsb2NhbFN0b3JhZ2VbZGJOYW1lXSA9PT0gXCJhXCIpID8gXCJiXCIgOiBcImFcIjtcbiAgfVxufTtcblxuQ2hhbmdlcy5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gKGRiTmFtZSkge1xuICB0aGlzLmVtaXQoZGJOYW1lKTtcbiAgdGhpcy5ub3RpZnlMb2NhbFdpbmRvd3MoZGJOYW1lKTtcbn07XG5cbmZ1bmN0aW9uIGd1YXJkZWRDb25zb2xlKG1ldGhvZCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgY29uc29sZVttZXRob2RdLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJhbmRvbU51bWJlcihtaW4sIG1heCkge1xuICB2YXIgbWF4VGltZW91dCA9IDYwMDAwMDsgLy8gSGFyZC1jb2RlZCBkZWZhdWx0IG9mIDEwIG1pbnV0ZXNcbiAgbWluID0gcGFyc2VJbnQobWluLCAxMCkgfHwgMDtcbiAgbWF4ID0gcGFyc2VJbnQobWF4LCAxMCk7XG4gIGlmIChtYXggIT09IG1heCB8fCBtYXggPD0gbWluKSB7XG4gICAgbWF4ID0gKG1pbiB8fCAxKSA8PCAxOyAvL2RvdWJsaW5nXG4gIH0gZWxzZSB7XG4gICAgbWF4ID0gbWF4ICsgMTtcbiAgfVxuICAvLyBJbiBvcmRlciB0byBub3QgZXhjZWVkIG1heFRpbWVvdXQsIHBpY2sgYSByYW5kb20gdmFsdWUgYmV0d2VlbiBoYWxmIG9mIG1heFRpbWVvdXQgYW5kIG1heFRpbWVvdXRcbiAgaWYgKG1heCA+IG1heFRpbWVvdXQpIHtcbiAgICBtaW4gPSBtYXhUaW1lb3V0ID4+IDE7IC8vIGRpdmlkZSBieSB0d29cbiAgICBtYXggPSBtYXhUaW1lb3V0O1xuICB9XG4gIHZhciByYXRpbyA9IE1hdGgucmFuZG9tKCk7XG4gIHZhciByYW5nZSA9IG1heCAtIG1pbjtcblxuICByZXR1cm4gfn4ocmFuZ2UgKiByYXRpbyArIG1pbik7IC8vIH5+IGNvZXJjZXMgdG8gYW4gaW50LCBidXQgZmFzdC5cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJhY2tPZmYobWluKSB7XG4gIHZhciBtYXggPSAwO1xuICBpZiAoIW1pbikge1xuICAgIG1heCA9IDIwMDA7XG4gIH1cbiAgcmV0dXJuIHJhbmRvbU51bWJlcihtaW4sIG1heCk7XG59XG5cbi8vIGRlc2lnbmVkIHRvIGdpdmUgaW5mbyB0byBicm93c2VyIHVzZXJzLCB3aG8gYXJlIGRpc3R1cmJlZFxuLy8gd2hlbiB0aGV5IHNlZSBodHRwIGVycm9ycyBpbiB0aGUgY29uc29sZVxuZnVuY3Rpb24gZXhwbGFpbkVycm9yKHN0YXR1cywgc3RyKSB7XG4gIGd1YXJkZWRDb25zb2xlKCdpbmZvJywgJ1RoZSBhYm92ZSAnICsgc3RhdHVzICsgJyBpcyB0b3RhbGx5IG5vcm1hbC4gJyArIHN0cik7XG59XG5cbnZhciBhc3NpZ247XG57XG4gIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG4gIH0gZWxzZSB7XG4gICAgLy8gbGl0ZSBPYmplY3QuYXNzaWduIHBvbHlmaWxsIGJhc2VkIG9uXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuICAgIGFzc2lnbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgbmV4dFNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG5cbiAgICAgICAgaWYgKG5leHRTb3VyY2UgIT0gbnVsbCkgeyAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIG5leHRTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3Mgd2hlbiBoYXNPd25Qcm9wZXJ0eSBpcyBzaGFkb3dlZFxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdG87XG4gICAgfTtcbiAgfVxufVxuXG52YXIgJGluamVjdF9PYmplY3RfYXNzaWduID0gYXNzaWduO1xuXG5pbmhlcml0cyhQb3VjaEVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIFBvdWNoRXJyb3Ioc3RhdHVzLCBlcnJvciwgcmVhc29uKSB7XG4gIEVycm9yLmNhbGwodGhpcywgcmVhc29uKTtcbiAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIHRoaXMubmFtZSA9IGVycm9yO1xuICB0aGlzLm1lc3NhZ2UgPSByZWFzb247XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xufVxuXG5Qb3VjaEVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgcmVhc29uOiB0aGlzLnJlYXNvblxuICB9KTtcbn07XG5cbnZhciBVTkFVVEhPUklaRUQgPSBuZXcgUG91Y2hFcnJvcig0MDEsICd1bmF1dGhvcml6ZWQnLCBcIk5hbWUgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LlwiKTtcbnZhciBNSVNTSU5HX0JVTEtfRE9DUyA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgXCJNaXNzaW5nIEpTT04gbGlzdCBvZiAnZG9jcydcIik7XG52YXIgTUlTU0lOR19ET0MgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnbWlzc2luZycpO1xudmFyIFJFVl9DT05GTElDVCA9IG5ldyBQb3VjaEVycm9yKDQwOSwgJ2NvbmZsaWN0JywgJ0RvY3VtZW50IHVwZGF0ZSBjb25mbGljdCcpO1xudmFyIElOVkFMSURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdfaWQgZmllbGQgbXVzdCBjb250YWluIGEgc3RyaW5nJyk7XG52YXIgTUlTU0lOR19JRCA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3NpbmdfaWQnLCAnX2lkIGlzIHJlcXVpcmVkIGZvciBwdXRzJyk7XG52YXIgUkVTRVJWRURfSUQgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdPbmx5IHJlc2VydmVkIGRvY3VtZW50IGlkcyBtYXkgc3RhcnQgd2l0aCB1bmRlcnNjb3JlLicpO1xudmFyIE5PVF9PUEVOID0gbmV3IFBvdWNoRXJyb3IoNDEyLCAncHJlY29uZGl0aW9uX2ZhaWxlZCcsICdEYXRhYmFzZSBub3Qgb3BlbicpO1xudmFyIFVOS05PV05fRVJST1IgPSBuZXcgUG91Y2hFcnJvcig1MDAsICd1bmtub3duX2Vycm9yJywgJ0RhdGFiYXNlIGVuY291bnRlcmVkIGFuIHVua25vd24gZXJyb3InKTtcbnZhciBCQURfQVJHID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnYmFkYXJnJywgJ1NvbWUgcXVlcnkgYXJndW1lbnQgaXMgaW52YWxpZCcpO1xudmFyIElOVkFMSURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2ludmFsaWRfcmVxdWVzdCcsICdSZXF1ZXN0IHdhcyBpbnZhbGlkJyk7XG52YXIgUVVFUllfUEFSU0VfRVJST1IgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdxdWVyeV9wYXJzZV9lcnJvcicsICdTb21lIHF1ZXJ5IHBhcmFtZXRlciBpcyBpbnZhbGlkJyk7XG52YXIgRE9DX1ZBTElEQVRJT04gPSBuZXcgUG91Y2hFcnJvcig1MDAsICdkb2NfdmFsaWRhdGlvbicsICdCYWQgc3BlY2lhbCBkb2N1bWVudCBtZW1iZXInKTtcbnZhciBCQURfUkVRVUVTVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ1NvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSByZXF1ZXN0Jyk7XG52YXIgTk9UX0FOX09CSkVDVCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ0RvY3VtZW50IG11c3QgYmUgYSBKU09OIG9iamVjdCcpO1xudmFyIERCX01JU1NJTkcgPSBuZXcgUG91Y2hFcnJvcig0MDQsICdub3RfZm91bmQnLCAnRGF0YWJhc2Ugbm90IGZvdW5kJyk7XG52YXIgSURCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnaW5kZXhlZF9kYl93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgV1NRX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnd2ViX3NxbF93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgTERCX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnbGV2ZWxEQl93ZW50X3dlbnRfYmFkJywgJ3Vua25vd24nKTtcbnZhciBGT1JCSURERU4gPSBuZXcgUG91Y2hFcnJvcig0MDMsICdmb3JiaWRkZW4nLCAnRm9yYmlkZGVuIGJ5IGRlc2lnbiBkb2MgdmFsaWRhdGVfZG9jX3VwZGF0ZSBmdW5jdGlvbicpO1xudmFyIElOVkFMSURfUkVWID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnSW52YWxpZCByZXYgZm9ybWF0Jyk7XG52YXIgRklMRV9FWElTVFMgPSBuZXcgUG91Y2hFcnJvcig0MTIsICdmaWxlX2V4aXN0cycsICdUaGUgZGF0YWJhc2UgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLicpO1xudmFyIE1JU1NJTkdfU1RVQiA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ21pc3Npbmdfc3R1YicsICdBIHByZS1leGlzdGluZyBhdHRhY2htZW50IHN0dWIgd2FzblxcJ3QgZm91bmQnKTtcbnZhciBJTlZBTElEX1VSTCA9IG5ldyBQb3VjaEVycm9yKDQxMywgJ2ludmFsaWRfdXJsJywgJ1Byb3ZpZGVkIFVSTCBpcyBpbnZhbGlkJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yKGVycm9yLCByZWFzb24pIHtcbiAgZnVuY3Rpb24gQ3VzdG9tUG91Y2hFcnJvcihyZWFzb24pIHtcbiAgICAvLyBpbmhlcml0IGVycm9yIHByb3BlcnRpZXMgZnJvbSBvdXIgcGFyZW50IGVycm9yIG1hbnVhbGx5XG4gICAgLy8gc28gYXMgdG8gYWxsb3cgcHJvcGVyIEpTT04gcGFyc2luZy5cbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyb3IpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBuYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBlcnJvcltuYW1lc1tpXV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tuYW1lc1tpXV0gPSBlcnJvcltuYW1lc1tpXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gICAgfVxuXG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIH1cbiAgfVxuICBDdXN0b21Qb3VjaEVycm9yLnByb3RvdHlwZSA9IFBvdWNoRXJyb3IucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEN1c3RvbVBvdWNoRXJyb3IocmVhc29uKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpIHtcblxuICBpZiAodHlwZW9mIGVyciAhPT0gJ29iamVjdCcpIHtcbiAgICB2YXIgZGF0YSA9IGVycjtcbiAgICBlcnIgPSBVTktOT1dOX0VSUk9SO1xuICAgIGVyci5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICgnZXJyb3InIGluIGVyciAmJiBlcnIuZXJyb3IgPT09ICdjb25mbGljdCcpIHtcbiAgICBlcnIubmFtZSA9ICdjb25mbGljdCc7XG4gICAgZXJyLnN0YXR1cyA9IDQwOTtcbiAgfVxuXG4gIGlmICghKCduYW1lJyBpbiBlcnIpKSB7XG4gICAgZXJyLm5hbWUgPSBlcnIuZXJyb3IgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgaWYgKCEoJ3N0YXR1cycgaW4gZXJyKSkge1xuICAgIGVyci5zdGF0dXMgPSA1MDA7XG4gIH1cblxuICBpZiAoISgnbWVzc2FnZScgaW4gZXJyKSkge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgZXJyLnJlYXNvbjtcbiAgfVxuXG4gIGlmICghKCdzdGFjaycgaW4gZXJyKSkge1xuICAgIGVyci5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiB0cnlGaWx0ZXIoZmlsdGVyLCBkb2MsIHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAhZmlsdGVyKGRvYywgcmVxKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdmFyIG1zZyA9ICdGaWx0ZXIgZnVuY3Rpb24gdGhyZXc6ICcgKyBlcnIudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIG1zZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsdGVyQ2hhbmdlKG9wdHMpIHtcbiAgdmFyIHJlcSA9IHt9O1xuICB2YXIgaGFzRmlsdGVyID0gb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nO1xuICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcblxuICByZXR1cm4gZnVuY3Rpb24gZmlsdGVyKGNoYW5nZSkge1xuICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgLy8gQ1NHIHNlbmRzIGV2ZW50cyBvbiB0aGUgY2hhbmdlcyBmZWVkIHRoYXQgZG9uJ3QgaGF2ZSBkb2N1bWVudHMsXG4gICAgICAvLyB0aGlzIGhhY2sgbWFrZXMgYSB3aG9sZSBsb3Qgb2YgZXhpc3RpbmcgY29kZSByb2J1c3QuXG4gICAgICBjaGFuZ2UuZG9jID0ge307XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlclJldHVybiA9IGhhc0ZpbHRlciAmJiB0cnlGaWx0ZXIob3B0cy5maWx0ZXIsIGNoYW5nZS5kb2MsIHJlcSk7XG5cbiAgICBpZiAodHlwZW9mIGZpbHRlclJldHVybiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJSZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlclJldHVybikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGRlbGV0ZSBjaGFuZ2UuZG9jO1xuICAgIH0gZWxzZSBpZiAoIW9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIGZvciAodmFyIGF0dCBpbiBjaGFuZ2UuZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZS5kb2MuX2F0dGFjaG1lbnRzLCBhdHQpKSB7XG4gICAgICAgICAgY2hhbmdlLmRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbihhcnJzKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXMgPSByZXMuY29uY2F0KGFycnNbaV0pO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vIHNoaW0gZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lLFxuXG4vLyBEZXRlcm1pbmUgaWQgYW4gSUQgaXMgdmFsaWRcbi8vICAgLSBpbnZhbGlkIElEcyBiZWdpbiB3aXRoIGFuIHVuZGVyZXNjb3JlIHRoYXQgZG9lcyBub3QgYmVnaW4gJ19kZXNpZ24nIG9yXG4vLyAgICAgJ19sb2NhbCdcbi8vICAgLSBhbnkgb3RoZXIgc3RyaW5nIHZhbHVlIGlzIGEgdmFsaWQgaWRcbi8vIFJldHVybnMgdGhlIHNwZWNpZmljIGVycm9yIG9iamVjdCBmb3IgZWFjaCBjYXNlXG5mdW5jdGlvbiBpbnZhbGlkSWRFcnJvcihpZCkge1xuICB2YXIgZXJyO1xuICBpZiAoIWlkKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19JRCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIGVyciA9IGNyZWF0ZUVycm9yKElOVkFMSURfSUQpO1xuICB9IGVsc2UgaWYgKC9eXy8udGVzdChpZCkgJiYgISgvXl8oZGVzaWdufGxvY2FsKS8pLnRlc3QoaWQpKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoUkVTRVJWRURfSUQpO1xuICB9XG4gIGlmIChlcnIpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLy8gQ2hlY2tzIGlmIGEgUG91Y2hEQiBvYmplY3QgaXMgXCJyZW1vdGVcIiBvciBub3QuIFRoaXMgaXNcblxuZnVuY3Rpb24gaXNSZW1vdGUoZGIpIHtcbiAgaWYgKHR5cGVvZiBkYi5fcmVtb3RlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZGIuX3JlbW90ZTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIGRiLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnd2FybicsXG4gICAgICAnZGIudHlwZSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICtcbiAgICAgICdhIGZ1dHVyZSB2ZXJzaW9uIG9mIFBvdWNoREInKTtcbiAgICByZXR1cm4gZGIudHlwZSgpID09PSAnaHR0cCc7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KGVlLCB0eXBlKSB7XG4gIHJldHVybiAnbGlzdGVuZXJDb3VudCcgaW4gZWUgPyBlZS5saXN0ZW5lckNvdW50KHR5cGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFLmxpc3RlbmVyQ291bnQoZWUsIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBwYXJ0cyA9IHMuc3BsaXQoJy8nKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBwYXJ0cztcbiAgfVxuICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIFtzLCBzXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKHMpIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPyBub3JtYWxpemVkLmpvaW4oJy8nKSA6IG51bGw7XG59XG5cbi8vIG9yaWdpbmFsbHkgcGFyc2VVcmkgMS4yLjIsIG5vdyBwYXRjaGVkIGJ5IHVzXG4vLyAoYykgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4vLyBNSVQgTGljZW5zZVxudmFyIGtleXMgPSBbXCJzb3VyY2VcIiwgXCJwcm90b2NvbFwiLCBcImF1dGhvcml0eVwiLCBcInVzZXJJbmZvXCIsIFwidXNlclwiLCBcInBhc3N3b3JkXCIsXG4gICAgXCJob3N0XCIsIFwicG9ydFwiLCBcInJlbGF0aXZlXCIsIFwicGF0aFwiLCBcImRpcmVjdG9yeVwiLCBcImZpbGVcIiwgXCJxdWVyeVwiLCBcImFuY2hvclwiXTtcbnZhciBxTmFtZSA9XCJxdWVyeUtleVwiO1xudmFyIHFQYXJzZXIgPSAvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2c7XG5cbi8vIHVzZSB0aGUgXCJsb29zZVwiIHBhcnNlclxuLyogZXNsaW50IG5vLXVzZWxlc3MtZXNjYXBlOiAwICovXG52YXIgcGFyc2VyID0gL14oPzooPyFbXjpAXSs6W146QFxcL10qQCkoW146XFwvPyMuXSspOik/KD86XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuXG5mdW5jdGlvbiBwYXJzZVVyaShzdHIpIHtcbiAgdmFyIG0gPSBwYXJzZXIuZXhlYyhzdHIpO1xuICB2YXIgdXJpID0ge307XG4gIHZhciBpID0gMTQ7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IG1baV0gfHwgXCJcIjtcbiAgICB2YXIgZW5jb2RlZCA9IFsndXNlcicsICdwYXNzd29yZCddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgdXJpW2tleV0gPSBlbmNvZGVkID8gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSA6IHZhbHVlO1xuICB9XG5cbiAgdXJpW3FOYW1lXSA9IHt9O1xuICB1cmlba2V5c1sxMl1dLnJlcGxhY2UocVBhcnNlciwgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcbiAgICBpZiAoJDEpIHtcbiAgICAgIHVyaVtxTmFtZV1bJDFdID0gJDI7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdXJpO1xufVxuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vYWxleGRhdmlkL3Njb3BlLWV2YWwgdjAuMC4zXG4vLyAoc291cmNlOiBodHRwczovL3VucGtnLmNvbS9zY29wZS1ldmFsQDAuMC4zL3Njb3BlX2V2YWwuanMpXG4vLyBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgd3JhcHBlciBhcm91bmQgbmV3IEZ1bmN0aW9uKClcblxuZnVuY3Rpb24gc2NvcGVFdmFsKHNvdXJjZSwgc2NvcGUpIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gc2NvcGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3BlLCBrZXkpKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIHZhbHVlcy5wdXNoKHNjb3BlW2tleV0pO1xuICAgIH1cbiAgfVxuICBrZXlzLnB1c2goc291cmNlKTtcbiAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KG51bGwsIGtleXMpLmFwcGx5KG51bGwsIHZhbHVlcyk7XG59XG5cbi8vIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIFwidXBkYXRlIHN1Z2FyXCIgZnVuY3Rpb24gZnJvbSBkYWxlaGFydmV5L3BvdWNoZGIjMTM4OFxuLy8gdGhlIGRpZmZGdW4gdGVsbHMgdXMgd2hhdCBkZWx0YSB0byBhcHBseSB0byB0aGUgZG9jLiAgaXQgZWl0aGVyIHJldHVybnNcbi8vIHRoZSBkb2MsIG9yIGZhbHNlIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBkbyBhbiB1cGRhdGUgYWZ0ZXIgYWxsXG5mdW5jdGlvbiB1cHNlcnQoZGIsIGRvY0lkLCBkaWZmRnVuKSB7XG4gIHJldHVybiBkYi5nZXQoZG9jSWQpXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIC8vIHRoZSB1c2VyIG1pZ2h0IGNoYW5nZSB0aGUgX3Jldiwgc28gc2F2ZSBpdCBmb3IgcG9zdGVyaXR5XG4gICAgICB2YXIgZG9jUmV2ID0gZG9jLl9yZXY7XG4gICAgICB2YXIgbmV3RG9jID0gZGlmZkZ1bihkb2MpO1xuXG4gICAgICBpZiAoIW5ld0RvYykge1xuICAgICAgICAvLyBpZiB0aGUgZGlmZkZ1biByZXR1cm5zIGZhbHN5LCB3ZSBzaG9ydC1jaXJjdWl0IGFzXG4gICAgICAgIC8vIGFuIG9wdGltaXphdGlvblxuICAgICAgICByZXR1cm4ge3VwZGF0ZWQ6IGZhbHNlLCByZXY6IGRvY1Jldn07XG4gICAgICB9XG5cbiAgICAgIC8vIHVzZXJzIGFyZW4ndCBhbGxvd2VkIHRvIG1vZGlmeSB0aGVzZSB2YWx1ZXMsXG4gICAgICAvLyBzbyByZXNldCB0aGVtIGhlcmVcbiAgICAgIG5ld0RvYy5faWQgPSBkb2NJZDtcbiAgICAgIG5ld0RvYy5fcmV2ID0gZG9jUmV2O1xuICAgICAgcmV0dXJuIHRyeUFuZFB1dChkYiwgbmV3RG9jLCBkaWZmRnVuKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdHJ5QW5kUHV0KGRiLCBkb2MsIGRpZmZGdW4pIHtcbiAgcmV0dXJuIGRiLnB1dChkb2MpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVkOiB0cnVlLFxuICAgICAgcmV2OiByZXMucmV2XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwOSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KGRiLCBkb2MuX2lkLCBkaWZmRnVuKTtcbiAgfSk7XG59XG5cbnZhciB0aGlzQXRvYiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGF0b2Ioc3RyKTtcbn07XG5cbnZhciB0aGlzQnRvYSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGJ0b2Eoc3RyKTtcbn07XG5cbi8vIEFic3RyYWN0cyBjb25zdHJ1Y3RpbmcgYSBCbG9iIG9iamVjdCwgc28gaXQgYWxzbyB3b3JrcyBpbiBvbGRlclxuLy8gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuYXRpdmUgQmxvYiBjb25zdHJ1Y3RvciAoZS5nLlxuLy8gb2xkIFF0V2ViS2l0IHZlcnNpb25zLCBBbmRyb2lkIDwgNC40KS5cbmZ1bmN0aW9uIGNyZWF0ZUJsb2IocGFydHMsIHByb3BlcnRpZXMpIHtcbiAgLyogZ2xvYmFsIEJsb2JCdWlsZGVyLE1TQmxvYkJ1aWxkZXIsTW96QmxvYkJ1aWxkZXIsV2ViS2l0QmxvYkJ1aWxkZXIgKi9cbiAgcGFydHMgPSBwYXJ0cyB8fCBbXTtcbiAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLm5hbWUgIT09IFwiVHlwZUVycm9yXCIpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHZhciBCdWlsZGVyID0gdHlwZW9mIEJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IEJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBNU0Jsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1TQmxvYkJ1aWxkZXIgOlxuICAgICAgICAgICAgICAgICAgdHlwZW9mIE1vekJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1vekJsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIFdlYktpdEJsb2JCdWlsZGVyO1xuICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBidWlsZGVyLmFwcGVuZChwYXJ0c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IocHJvcGVydGllcy50eXBlKTtcbiAgfVxufVxuXG4vLyBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ5Njc2NDcvIChjb250aW51ZXMgb24gbmV4dCBsaW5lKVxuLy8gZW5jb2RlLWRlY29kZS1pbWFnZS13aXRoLWJhc2U2NC1icmVha3MtaW1hZ2UgKDIwMTMtMDQtMjEpXG5mdW5jdGlvbiBiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGJpbikge1xuICB2YXIgbGVuZ3RoID0gYmluLmxlbmd0aDtcbiAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpO1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IGJpbi5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGJpblN0cmluZ1RvQmx1ZmZlcihiaW5TdHJpbmcsIHR5cGUpIHtcbiAgcmV0dXJuIGNyZWF0ZUJsb2IoW2JpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYmluU3RyaW5nKV0sIHt0eXBlOiB0eXBlfSk7XG59XG5cbmZ1bmN0aW9uIGI2NFRvQmx1ZmZlcihiNjQsIHR5cGUpIHtcbiAgcmV0dXJuIGJpblN0cmluZ1RvQmx1ZmZlcih0aGlzQXRvYihiNjQpLCB0eXBlKTtcbn1cblxuLy9DYW4ndCBmaW5kIG9yaWdpbmFsIHBvc3QsIGJ1dCB0aGlzIGlzIGNsb3NlXG4vL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjk2NTEwNy8gKGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUpXG4vL2NvbnZlcnRpbmctYmV0d2Vlbi1zdHJpbmdzLWFuZC1hcnJheWJ1ZmZlcnNcbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcoYnVmZmVyKSB7XG4gIHZhciBiaW5hcnkgPSAnJztcbiAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgdmFyIGxlbmd0aCA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGJpbmFyeTtcbn1cblxuLy8gc2hpbSBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGl0XG5mdW5jdGlvbiByZWFkQXNCaW5hcnlTdHJpbmcoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHZhciBoYXNCaW5hcnlTdHJpbmcgPSB0eXBlb2YgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyA9PT0gJ2Z1bmN0aW9uJztcbiAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGUudGFyZ2V0LnJlc3VsdCB8fCAnJztcbiAgICBpZiAoaGFzQmluYXJ5U3RyaW5nKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICB9XG4gICAgY2FsbGJhY2soYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhyZXN1bHQpKTtcbiAgfTtcbiAgaWYgKGhhc0JpbmFyeVN0cmluZykge1xuICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gIH0gZWxzZSB7XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2JUb0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGNhbGxiYWNrKSB7XG4gIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGZ1bmN0aW9uIChiaW4pIHtcbiAgICBjYWxsYmFjayhiaW4pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2JPckJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2JPckJ1ZmZlciwgZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJhc2U2NCkpO1xuICB9KTtcbn1cblxuLy8gc2ltcGxpZmllZCBBUEkuIHVuaXZlcnNhbCBicm93c2VyIHN1cHBvcnQgaXMgYXNzdW1lZFxuZnVuY3Rpb24gcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQgfHwgbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gIH07XG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbn1cblxuLy8gdGhpcyBpcyBub3QgdXNlZCBpbiB0aGUgYnJvd3NlclxuXG52YXIgc2V0SW1tZWRpYXRlU2hpbSA9IHNlbGYuc2V0SW1tZWRpYXRlIHx8IHNlbGYuc2V0VGltZW91dDtcbnZhciBNRDVfQ0hVTktfU0laRSA9IDMyNzY4O1xuXG5mdW5jdGlvbiByYXdUb0Jhc2U2NChyYXcpIHtcbiAgcmV0dXJuIHRoaXNCdG9hKHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNsaWNlQmxvYihibG9iLCBzdGFydCwgZW5kKSB7XG4gIGlmIChibG9iLndlYmtpdFNsaWNlKSB7XG4gICAgcmV0dXJuIGJsb2Iud2Via2l0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIGJsb2Iuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEJsb2IoYnVmZmVyLCBibG9iLCBzdGFydCwgZW5kLCBjYWxsYmFjaykge1xuICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGJsb2Iuc2l6ZSkge1xuICAgIC8vIG9ubHkgc2xpY2UgYmxvYiBpZiB3ZSByZWFsbHkgbmVlZCB0b1xuICAgIGJsb2IgPSBzbGljZUJsb2IoYmxvYiwgc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmVhZEFzQXJyYXlCdWZmZXIoYmxvYiwgZnVuY3Rpb24gKGFycmF5QnVmZmVyKSB7XG4gICAgYnVmZmVyLmFwcGVuZChhcnJheUJ1ZmZlcik7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFN0cmluZyhidWZmZXIsIHN0cmluZywgc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcbiAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgLy8gb25seSBjcmVhdGUgYSBzdWJzdHJpbmcgaWYgd2UgcmVhbGx5IG5lZWQgdG9cbiAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICB9XG4gIGJ1ZmZlci5hcHBlbmRCaW5hcnkoc3RyaW5nKTtcbiAgY2FsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gYmluYXJ5TWQ1KGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBpbnB1dElzU3RyaW5nID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnO1xuICB2YXIgbGVuID0gaW5wdXRJc1N0cmluZyA/IGRhdGEubGVuZ3RoIDogZGF0YS5zaXplO1xuICB2YXIgY2h1bmtTaXplID0gTWF0aC5taW4oTUQ1X0NIVU5LX1NJWkUsIGxlbik7XG4gIHZhciBjaHVua3MgPSBNYXRoLmNlaWwobGVuIC8gY2h1bmtTaXplKTtcbiAgdmFyIGN1cnJlbnRDaHVuayA9IDA7XG4gIHZhciBidWZmZXIgPSBpbnB1dElzU3RyaW5nID8gbmV3IE1kNSgpIDogbmV3IE1kNS5BcnJheUJ1ZmZlcigpO1xuXG4gIHZhciBhcHBlbmQgPSBpbnB1dElzU3RyaW5nID8gYXBwZW5kU3RyaW5nIDogYXBwZW5kQmxvYjtcblxuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHNldEltbWVkaWF0ZVNoaW0obG9hZE5leHRDaHVuayk7XG4gIH1cblxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIHZhciByYXcgPSBidWZmZXIuZW5kKHRydWUpO1xuICAgIHZhciBiYXNlNjQgPSByYXdUb0Jhc2U2NChyYXcpO1xuICAgIGNhbGxiYWNrKGJhc2U2NCk7XG4gICAgYnVmZmVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWROZXh0Q2h1bmsoKSB7XG4gICAgdmFyIHN0YXJ0ID0gY3VycmVudENodW5rICogY2h1bmtTaXplO1xuICAgIHZhciBlbmQgPSBzdGFydCArIGNodW5rU2l6ZTtcbiAgICBjdXJyZW50Q2h1bmsrKztcbiAgICBpZiAoY3VycmVudENodW5rIDwgY2h1bmtzKSB7XG4gICAgICBhcHBlbmQoYnVmZmVyLCBkYXRhLCBzdGFydCwgZW5kLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kKGJ1ZmZlciwgZGF0YSwgc3RhcnQsIGVuZCwgZG9uZSk7XG4gICAgfVxuICB9XG4gIGxvYWROZXh0Q2h1bmsoKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTWQ1KHN0cmluZykge1xuICByZXR1cm4gTWQ1Lmhhc2goc3RyaW5nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJldmlzaW9uIHN0cmluZyB0aGF0IGRvZXMgTk9UIGluY2x1ZGUgdGhlIHJldmlzaW9uIGhlaWdodFxuICogRm9yIGV4YW1wbGUgJzU2NjQ5ZjFiMDUwNmM2Y2E5ZmRhMDc0NmViMGNhY2RmJ1xuICovXG5mdW5jdGlvbiByZXYkJDEoZG9jLCBkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgaWYgKCFkZXRlcm1pbmlzdGljX3JldnMpIHtcbiAgICByZXR1cm4gdjQoKS5yZXBsYWNlKC8tL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgdmFyIG11dGF0ZWFibGVEb2MgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIGRvYyk7XG4gIGRlbGV0ZSBtdXRhdGVhYmxlRG9jLl9yZXZfdHJlZTtcbiAgcmV0dXJuIHN0cmluZ01kNShKU09OLnN0cmluZ2lmeShtdXRhdGVhYmxlRG9jKSk7XG59XG5cbnZhciB1dWlkID0gdjQ7IC8vIG1pbWljIG9sZCBpbXBvcnQsIG9ubHkgdjQgaXMgZXZlciB1c2VkIGVsc2V3aGVyZVxuXG4vLyBXZSBmZXRjaCBhbGwgbGVhZnMgb2YgdGhlIHJldmlzaW9uIHRyZWUsIGFuZCBzb3J0IHRoZW0gYmFzZWQgb24gdHJlZSBsZW5ndGhcbi8vIGFuZCB3aGV0aGVyIHRoZXkgd2VyZSBkZWxldGVkLCB1bmRlbGV0ZWQgZG9jdW1lbnRzIHdpdGggdGhlIGxvbmdlc3QgcmV2aXNpb25cbi8vIHRyZWUgKG1vc3QgZWRpdHMpIHdpblxuLy8gVGhlIGZpbmFsIHNvcnQgYWxnb3JpdGhtIGlzIHNsaWdodGx5IGRvY3VtZW50ZWQgaW4gYSBzaWRlYmFyIGhlcmU6XG4vLyBodHRwOi8vZ3VpZGUuY291Y2hkYi5vcmcvZHJhZnQvY29uZmxpY3RzLmh0bWxcbmZ1bmN0aW9uIHdpbm5pbmdSZXYobWV0YWRhdGEpIHtcbiAgdmFyIHdpbm5pbmdJZDtcbiAgdmFyIHdpbm5pbmdQb3M7XG4gIHZhciB3aW5uaW5nRGVsZXRlZDtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zO1xuICAgIGlmIChicmFuY2hlcy5sZW5ndGgpIHsgLy8gbm9uLWxlYWZcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBicmFuY2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB0b1Zpc2l0LnB1c2goe3BvczogcG9zICsgMSwgaWRzOiBicmFuY2hlc1tpXX0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBkZWxldGVkID0gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgdmFyIGlkID0gdHJlZVswXTtcbiAgICAvLyBzb3J0IGJ5IGRlbGV0ZWQsIHRoZW4gcG9zLCB0aGVuIGlkXG4gICAgaWYgKCF3aW5uaW5nSWQgfHwgKHdpbm5pbmdEZWxldGVkICE9PSBkZWxldGVkID8gd2lubmluZ0RlbGV0ZWQgOlxuICAgICAgICB3aW5uaW5nUG9zICE9PSBwb3MgPyB3aW5uaW5nUG9zIDwgcG9zIDogd2lubmluZ0lkIDwgaWQpKSB7XG4gICAgICB3aW5uaW5nSWQgPSBpZDtcbiAgICAgIHdpbm5pbmdQb3MgPSBwb3M7XG4gICAgICB3aW5uaW5nRGVsZXRlZCA9IGRlbGV0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdpbm5pbmdQb3MgKyAnLScgKyB3aW5uaW5nSWQ7XG59XG5cbi8vIFByZXR0eSBtdWNoIGFsbCBiZWxvdyBjYW4gYmUgY29tYmluZWQgaW50byBhIGhpZ2hlciBvcmRlciBmdW5jdGlvbiB0b1xuLy8gdHJhdmVyc2UgcmV2aXNpb25zXG4vLyBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIGFzIGNvbnRleHQgdG8gYWxsXG4vLyBjaGlsZHJlbiBvZiB0aGF0IG5vZGVcbmZ1bmN0aW9uIHRyYXZlcnNlUmV2VHJlZShyZXZzLCBjYWxsYmFjaykge1xuICB2YXIgdG9WaXNpdCA9IHJldnMuc2xpY2UoKTtcblxuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBuZXdDdHggPVxuICAgICAgY2FsbGJhY2soYnJhbmNoZXMubGVuZ3RoID09PSAwLCBwb3MsIHRyZWVbMF0sIG5vZGUuY3R4LCB0cmVlWzFdKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBjdHg6IG5ld0N0eH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb3J0QnlQb3MoYSwgYikge1xuICByZXR1cm4gYS5wb3MgLSBiLnBvcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdExlYXZlcyhyZXZzKSB7XG4gIHZhciBsZWF2ZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIGFjYywgb3B0cykge1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIGxlYXZlcy5wdXNoKHtyZXY6IHBvcyArIFwiLVwiICsgaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG4gICAgfVxuICB9KTtcbiAgbGVhdmVzLnNvcnQoc29ydEJ5UG9zKS5yZXZlcnNlKCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkZWxldGUgbGVhdmVzW2ldLnBvcztcbiAgfVxuICByZXR1cm4gbGVhdmVzO1xufVxuXG4vLyByZXR1cm5zIHJldnMgb2YgYWxsIGNvbmZsaWN0cyB0aGF0IGlzIGxlYXZlcyBzdWNoIHRoYXRcbi8vIDEuIGFyZSBub3QgZGVsZXRlZCBhbmRcbi8vIDIuIGFyZSBkaWZmZXJlbnQgdGhhbiB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKSB7XG4gIHZhciB3aW4gPSB3aW5uaW5nUmV2KG1ldGFkYXRhKTtcbiAgdmFyIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMobWV0YWRhdGEucmV2X3RyZWUpO1xuICB2YXIgY29uZmxpY3RzID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsZWF2ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgbGVhZiA9IGxlYXZlc1tpXTtcbiAgICBpZiAobGVhZi5yZXYgIT09IHdpbiAmJiAhbGVhZi5vcHRzLmRlbGV0ZWQpIHtcbiAgICAgIGNvbmZsaWN0cy5wdXNoKGxlYWYucmV2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuLy8gY29tcGFjdCBhIHRyZWUgYnkgbWFya2luZyBpdHMgbm9uLWxlYWZzIGFzIG1pc3NpbmcsXG4vLyBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZXZzIHRvIGRlbGV0ZVxuZnVuY3Rpb24gY29tcGFjdFRyZWUobWV0YWRhdGEpIHtcbiAgdmFyIHJldnMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkhhc2gsIGN0eCwgb3B0cykge1xuICAgIGlmIChvcHRzLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScgJiYgIWlzTGVhZikge1xuICAgICAgcmV2cy5wdXNoKHBvcyArICctJyArIHJldkhhc2gpO1xuICAgICAgb3B0cy5zdGF0dXMgPSAnbWlzc2luZyc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldnM7XG59XG5cbi8vIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgdGhlIHBhdGhzIHRvIHRoZSBsZWFmcyBpbiB0aGlzIHJldmlzaW9uIHRyZWVcbmZ1bmN0aW9uIHJvb3RUb0xlYWYocmV2cykge1xuICB2YXIgcGF0aHMgPSBbXTtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIHZhciBwb3MgPSBub2RlLnBvcztcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBpZCA9IHRyZWVbMF07XG4gICAgdmFyIG9wdHMgPSB0cmVlWzFdO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIGlzTGVhZiA9IGJyYW5jaGVzLmxlbmd0aCA9PT0gMDtcblxuICAgIHZhciBoaXN0b3J5ID0gbm9kZS5oaXN0b3J5ID8gbm9kZS5oaXN0b3J5LnNsaWNlKCkgOiBbXTtcbiAgICBoaXN0b3J5LnB1c2goe2lkOiBpZCwgb3B0czogb3B0c30pO1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIHBhdGhzLnB1c2goe3BvczogKHBvcyArIDEgLSBoaXN0b3J5Lmxlbmd0aCksIGlkczogaGlzdG9yeX0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldLCBoaXN0b3J5OiBoaXN0b3J5fSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXRocy5yZXZlcnNlKCk7XG59XG5cbi8vIGZvciBhIGJldHRlciBvdmVydmlldyBvZiB3aGF0IHRoaXMgaXMgZG9pbmcsIHJlYWQ6XG5cbmZ1bmN0aW9uIHNvcnRCeVBvcyQxKGEsIGIpIHtcbiAgcmV0dXJuIGEucG9zIC0gYi5wb3M7XG59XG5cbi8vIGNsYXNzaWMgYmluYXJ5IHNlYXJjaFxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFyciwgaXRlbSwgY29tcGFyYXRvcikge1xuICB2YXIgbG93ID0gMDtcbiAgdmFyIGhpZ2ggPSBhcnIubGVuZ3RoO1xuICB2YXIgbWlkO1xuICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTtcbiAgICBpZiAoY29tcGFyYXRvcihhcnJbbWlkXSwgaXRlbSkgPCAwKSB7XG4gICAgICBsb3cgPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG93O1xufVxuXG4vLyBhc3N1bWluZyB0aGUgYXJyIGlzIHNvcnRlZCwgaW5zZXJ0IHRoZSBpdGVtIGluIHRoZSBwcm9wZXIgcGxhY2VcbmZ1bmN0aW9uIGluc2VydFNvcnRlZChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGlkeCA9IGJpbmFyeVNlYXJjaChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpO1xuICBhcnIuc3BsaWNlKGlkeCwgMCwgaXRlbSk7XG59XG5cbi8vIFR1cm4gYSBwYXRoIGFzIGEgZmxhdCBhcnJheSBpbnRvIGEgdHJlZSB3aXRoIGEgc2luZ2xlIGJyYW5jaC5cbi8vIElmIGFueSBzaG91bGQgYmUgc3RlbW1lZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LCB0aGF0J3MgcGFzc2VkXG4vLyBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXRoVG9UcmVlKHBhdGgsIG51bVN0ZW1tZWQpIHtcbiAgdmFyIHJvb3Q7XG4gIHZhciBsZWFmO1xuICBmb3IgKHZhciBpID0gbnVtU3RlbW1lZCwgbGVuID0gcGF0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBub2RlID0gcGF0aFtpXTtcbiAgICB2YXIgY3VycmVudExlYWYgPSBbbm9kZS5pZCwgbm9kZS5vcHRzLCBbXV07XG4gICAgaWYgKGxlYWYpIHtcbiAgICAgIGxlYWZbMl0ucHVzaChjdXJyZW50TGVhZik7XG4gICAgICBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3QgPSBsZWFmID0gY3VycmVudExlYWY7XG4gICAgfVxuICB9XG4gIHJldHVybiByb290O1xufVxuXG4vLyBjb21wYXJlIHRoZSBJRHMgb2YgdHdvIHRyZWVzXG5mdW5jdGlvbiBjb21wYXJlVHJlZShhLCBiKSB7XG4gIHJldHVybiBhWzBdIDwgYlswXSA/IC0xIDogMTtcbn1cblxuLy8gTWVyZ2UgdHdvIHRyZWVzIHRvZ2V0aGVyXG4vLyBUaGUgcm9vdHMgb2YgdHJlZTEgYW5kIHRyZWUyIG11c3QgYmUgdGhlIHNhbWUgcmV2aXNpb25cbmZ1bmN0aW9uIG1lcmdlVHJlZShpbl90cmVlMSwgaW5fdHJlZTIpIHtcbiAgdmFyIHF1ZXVlID0gW3t0cmVlMTogaW5fdHJlZTEsIHRyZWUyOiBpbl90cmVlMn1dO1xuICB2YXIgY29uZmxpY3RzID0gZmFsc2U7XG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICB2YXIgdHJlZTEgPSBpdGVtLnRyZWUxO1xuICAgIHZhciB0cmVlMiA9IGl0ZW0udHJlZTI7XG5cbiAgICBpZiAodHJlZTFbMV0uc3RhdHVzIHx8IHRyZWUyWzFdLnN0YXR1cykge1xuICAgICAgdHJlZTFbMV0uc3RhdHVzID1cbiAgICAgICAgKHRyZWUxWzFdLnN0YXR1cyA9PT0gICdhdmFpbGFibGUnIHx8XG4gICAgICAgIHRyZWUyWzFdLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScpID8gJ2F2YWlsYWJsZScgOiAnbWlzc2luZyc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlMlsyXS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0cmVlMVsyXVswXSkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2xlYWYnO1xuICAgICAgICB0cmVlMVsyXVswXSA9IHRyZWUyWzJdW2ldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1lcmdlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmVlMVsyXS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodHJlZTFbMl1bal1bMF0gPT09IHRyZWUyWzJdW2ldWzBdKSB7XG4gICAgICAgICAgcXVldWUucHVzaCh7dHJlZTE6IHRyZWUxWzJdW2pdLCB0cmVlMjogdHJlZTJbMl1baV19KTtcbiAgICAgICAgICBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW1lcmdlZCkge1xuICAgICAgICBjb25mbGljdHMgPSAnbmV3X2JyYW5jaCc7XG4gICAgICAgIGluc2VydFNvcnRlZCh0cmVlMVsyXSwgdHJlZTJbMl1baV0sIGNvbXBhcmVUcmVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtjb25mbGljdHM6IGNvbmZsaWN0cywgdHJlZTogaW5fdHJlZTF9O1xufVxuXG5mdW5jdGlvbiBkb01lcmdlKHRyZWUsIHBhdGgsIGRvbnRFeHBhbmQpIHtcbiAgdmFyIHJlc3RyZWUgPSBbXTtcbiAgdmFyIGNvbmZsaWN0cyA9IGZhbHNlO1xuICB2YXIgbWVyZ2VkID0gZmFsc2U7XG4gIHZhciByZXM7XG5cbiAgaWYgKCF0cmVlLmxlbmd0aCkge1xuICAgIHJldHVybiB7dHJlZTogW3BhdGhdLCBjb25mbGljdHM6ICduZXdfbGVhZid9O1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRyZWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYnJhbmNoID0gdHJlZVtpXTtcbiAgICBpZiAoYnJhbmNoLnBvcyA9PT0gcGF0aC5wb3MgJiYgYnJhbmNoLmlkc1swXSA9PT0gcGF0aC5pZHNbMF0pIHtcbiAgICAgIC8vIFBhdGhzIHN0YXJ0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFuZCBoYXZlIHRoZSBzYW1lIHJvb3QsIHNvIHRoZXkgbmVlZFxuICAgICAgLy8gbWVyZ2VkXG4gICAgICByZXMgPSBtZXJnZVRyZWUoYnJhbmNoLmlkcywgcGF0aC5pZHMpO1xuICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IGJyYW5jaC5wb3MsIGlkczogcmVzLnRyZWV9KTtcbiAgICAgIGNvbmZsaWN0cyA9IGNvbmZsaWN0cyB8fCByZXMuY29uZmxpY3RzO1xuICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRvbnRFeHBhbmQgIT09IHRydWUpIHtcbiAgICAgIC8vIFRoZSBwYXRocyBzdGFydCBhdCBhIGRpZmZlcmVudCBwb3NpdGlvbiwgdGFrZSB0aGUgZWFybGllc3QgcGF0aCBhbmRcbiAgICAgIC8vIHRyYXZlcnNlIHVwIHVudGlsIGl0IGFzIGF0IHRoZSBzYW1lIHBvaW50IGZyb20gcm9vdCBhcyB0aGUgcGF0aCB3ZVxuICAgICAgLy8gd2FudCB0byBtZXJnZS4gIElmIHRoZSBrZXlzIG1hdGNoIHdlIHJldHVybiB0aGUgbG9uZ2VyIHBhdGggd2l0aCB0aGVcbiAgICAgIC8vIG90aGVyIG1lcmdlZCBBZnRlciBzdGVtbWluZyB3ZSBkb250IHdhbnQgdG8gZXhwYW5kIHRoZSB0cmVlc1xuXG4gICAgICB2YXIgdDEgPSBicmFuY2gucG9zIDwgcGF0aC5wb3MgPyBicmFuY2ggOiBwYXRoO1xuICAgICAgdmFyIHQyID0gYnJhbmNoLnBvcyA8IHBhdGgucG9zID8gcGF0aCA6IGJyYW5jaDtcbiAgICAgIHZhciBkaWZmID0gdDIucG9zIC0gdDEucG9zO1xuXG4gICAgICB2YXIgY2FuZGlkYXRlUGFyZW50cyA9IFtdO1xuXG4gICAgICB2YXIgdHJlZXMgPSBbXTtcbiAgICAgIHRyZWVzLnB1c2goe2lkczogdDEuaWRzLCBkaWZmOiBkaWZmLCBwYXJlbnQ6IG51bGwsIHBhcmVudElkeDogbnVsbH0pO1xuICAgICAgd2hpbGUgKHRyZWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0cmVlcy5wb3AoKTtcbiAgICAgICAgaWYgKGl0ZW0uZGlmZiA9PT0gMCkge1xuICAgICAgICAgIGlmIChpdGVtLmlkc1swXSA9PT0gdDIuaWRzWzBdKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVQYXJlbnRzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbGVtZW50cyA9IGl0ZW0uaWRzWzJdO1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgZWxlbWVudHNMZW4gPSBlbGVtZW50cy5sZW5ndGg7IGogPCBlbGVtZW50c0xlbjsgaisrKSB7XG4gICAgICAgICAgdHJlZXMucHVzaCh7XG4gICAgICAgICAgICBpZHM6IGVsZW1lbnRzW2pdLFxuICAgICAgICAgICAgZGlmZjogaXRlbS5kaWZmIC0gMSxcbiAgICAgICAgICAgIHBhcmVudDogaXRlbS5pZHMsXG4gICAgICAgICAgICBwYXJlbnRJZHg6IGpcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZWwgPSBjYW5kaWRhdGVQYXJlbnRzWzBdO1xuXG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gbWVyZ2VUcmVlKGVsLmlkcywgdDIuaWRzKTtcbiAgICAgICAgZWwucGFyZW50WzJdW2VsLnBhcmVudElkeF0gPSByZXMudHJlZTtcbiAgICAgICAgcmVzdHJlZS5wdXNoKHtwb3M6IHQxLnBvcywgaWRzOiB0MS5pZHN9KTtcbiAgICAgICAgY29uZmxpY3RzID0gY29uZmxpY3RzIHx8IHJlcy5jb25mbGljdHM7XG4gICAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RyZWUucHVzaChicmFuY2gpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIGRpZG50IGZpbmRcbiAgaWYgKCFtZXJnZWQpIHtcbiAgICByZXN0cmVlLnB1c2gocGF0aCk7XG4gIH1cblxuICByZXN0cmVlLnNvcnQoc29ydEJ5UG9zJDEpO1xuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdHJlZSxcbiAgICBjb25mbGljdHM6IGNvbmZsaWN0cyB8fCAnaW50ZXJuYWxfbm9kZSdcbiAgfTtcbn1cblxuLy8gVG8gZW5zdXJlIHdlIGRvbnQgZ3JvdyB0aGUgcmV2aXNpb24gdHJlZSBpbmZpbml0ZWx5LCB3ZSBzdGVtIG9sZCByZXZpc2lvbnNcbmZ1bmN0aW9uIHN0ZW0odHJlZSwgZGVwdGgpIHtcbiAgLy8gRmlyc3Qgd2UgYnJlYWsgb3V0IHRoZSB0cmVlIGludG8gYSBjb21wbGV0ZSBsaXN0IG9mIHJvb3QgdG8gbGVhZiBwYXRoc1xuICB2YXIgcGF0aHMgPSByb290VG9MZWFmKHRyZWUpO1xuICB2YXIgc3RlbW1lZFJldnM7XG5cbiAgdmFyIHJlc3VsdDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhdGhzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgLy8gVGhlbiBmb3IgZWFjaCBwYXRoLCB3ZSBjdXQgb2ZmIHRoZSBzdGFydCBvZiB0aGUgcGF0aCBiYXNlZCBvbiB0aGVcbiAgICAvLyBgZGVwdGhgIHRvIHN0ZW0gdG8sIGFuZCBnZW5lcmF0ZSBhIG5ldyBzZXQgb2YgZmxhdCB0cmVlc1xuICAgIHZhciBwYXRoID0gcGF0aHNbaV07XG4gICAgdmFyIHN0ZW1tZWQgPSBwYXRoLmlkcztcbiAgICB2YXIgbm9kZTtcbiAgICBpZiAoc3RlbW1lZC5sZW5ndGggPiBkZXB0aCkge1xuICAgICAgLy8gb25seSBkbyB0aGUgc3RlbW1pbmcgd29yayBpZiB3ZSBhY3R1YWxseSBuZWVkIHRvIHN0ZW1cbiAgICAgIGlmICghc3RlbW1lZFJldnMpIHtcbiAgICAgICAgc3RlbW1lZFJldnMgPSB7fTsgLy8gYXZvaWQgYWxsb2NhdGluZyB0aGlzIG9iamVjdCB1bm5lY2Vzc2FyaWx5XG4gICAgICB9XG4gICAgICB2YXIgbnVtU3RlbW1lZCA9IHN0ZW1tZWQubGVuZ3RoIC0gZGVwdGg7XG4gICAgICBub2RlID0ge1xuICAgICAgICBwb3M6IHBhdGgucG9zICsgbnVtU3RlbW1lZCxcbiAgICAgICAgaWRzOiBwYXRoVG9UcmVlKHN0ZW1tZWQsIG51bVN0ZW1tZWQpXG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBzID0gMDsgcyA8IG51bVN0ZW1tZWQ7IHMrKykge1xuICAgICAgICB2YXIgcmV2ID0gKHBhdGgucG9zICsgcykgKyAnLScgKyBzdGVtbWVkW3NdLmlkO1xuICAgICAgICBzdGVtbWVkUmV2c1tyZXZdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBubyBuZWVkIHRvIGFjdHVhbGx5IHN0ZW1cbiAgICAgIG5vZGUgPSB7XG4gICAgICAgIHBvczogcGF0aC5wb3MsXG4gICAgICAgIGlkczogcGF0aFRvVHJlZShzdGVtbWVkLCAwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHdlIHJlbWVyZ2UgYWxsIHRob3NlIGZsYXQgdHJlZXMgdG9nZXRoZXIsIGVuc3VyaW5nIHRoYXQgd2UgZG9udFxuICAgIC8vIGNvbm5lY3QgdHJlZXMgdGhhdCB3b3VsZCBnbyBiZXlvbmQgdGhlIGRlcHRoIGxpbWl0XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gZG9NZXJnZShyZXN1bHQsIG5vZGUsIHRydWUpLnRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFtub2RlXTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGlzIGlzIG1lbW9yeS1oZWF2eSBwZXIgQ2hyb21lIHByb2ZpbGVyLCBhdm9pZCB1bmxlc3Mgd2UgYWN0dWFsbHkgc3RlbW1lZFxuICBpZiAoc3RlbW1lZFJldnMpIHtcbiAgICB0cmF2ZXJzZVJldlRyZWUocmVzdWx0LCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIHJldkhhc2gpIHtcbiAgICAgIC8vIHNvbWUgcmV2aXNpb25zIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBhIGJyYW5jaCBidXQgbm90IGluIGFub3RoZXJcbiAgICAgIGRlbGV0ZSBzdGVtbWVkUmV2c1twb3MgKyAnLScgKyByZXZIYXNoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHJlZTogcmVzdWx0LFxuICAgIHJldnM6IHN0ZW1tZWRSZXZzID8gT2JqZWN0LmtleXMoc3RlbW1lZFJldnMpIDogW11cbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2UodHJlZSwgcGF0aCwgZGVwdGgpIHtcbiAgdmFyIG5ld1RyZWUgPSBkb01lcmdlKHRyZWUsIHBhdGgpO1xuICB2YXIgc3RlbW1lZCA9IHN0ZW0obmV3VHJlZS50cmVlLCBkZXB0aCk7XG4gIHJldHVybiB7XG4gICAgdHJlZTogc3RlbW1lZC50cmVlLFxuICAgIHN0ZW1tZWRSZXZzOiBzdGVtbWVkLnJldnMsXG4gICAgY29uZmxpY3RzOiBuZXdUcmVlLmNvbmZsaWN0c1xuICB9O1xufVxuXG4vLyByZXR1cm4gdHJ1ZSBpZiBhIHJldiBleGlzdHMgaW4gdGhlIHJldiB0cmVlLCBmYWxzZSBvdGhlcndpc2VcbmZ1bmN0aW9uIHJldkV4aXN0cyhyZXZzLCByZXYpIHtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG4gIHZhciBzcGxpdFJldiA9IHJldi5zcGxpdCgnLScpO1xuICB2YXIgdGFyZ2V0UG9zID0gcGFyc2VJbnQoc3BsaXRSZXZbMF0sIDEwKTtcbiAgdmFyIHRhcmdldElkID0gc3BsaXRSZXZbMV07XG5cbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKG5vZGUucG9zID09PSB0YXJnZXRQb3MgJiYgbm9kZS5pZHNbMF0gPT09IHRhcmdldElkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGJyYW5jaGVzID0gbm9kZS5pZHNbMl07XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJyYW5jaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0b1Zpc2l0LnB1c2goe3Bvczogbm9kZS5wb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJlZXMobm9kZSkge1xuICByZXR1cm4gbm9kZS5pZHM7XG59XG5cbi8vIGNoZWNrIGlmIGEgc3BlY2lmaWMgcmV2aXNpb24gb2YgYSBkb2MgaGFzIGJlZW4gZGVsZXRlZFxuLy8gIC0gbWV0YWRhdGE6IHRoZSBtZXRhZGF0YSBvYmplY3QgZnJvbSB0aGUgZG9jIHN0b3JlXG4vLyAgLSByZXY6IChvcHRpb25hbCkgdGhlIHJldmlzaW9uIHRvIGNoZWNrLiBkZWZhdWx0cyB0byB3aW5uaW5nIHJldmlzaW9uXG5mdW5jdGlvbiBpc0RlbGV0ZWQobWV0YWRhdGEsIHJldikge1xuICBpZiAoIXJldikge1xuICAgIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICB9XG4gIHZhciBpZCA9IHJldi5zdWJzdHJpbmcocmV2LmluZGV4T2YoJy0nKSArIDEpO1xuICB2YXIgdG9WaXNpdCA9IG1ldGFkYXRhLnJldl90cmVlLm1hcChnZXRUcmVlcyk7XG5cbiAgdmFyIHRyZWU7XG4gIHdoaWxlICgodHJlZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgaWYgKHRyZWVbMF0gPT09IGlkKSB7XG4gICAgICByZXR1cm4gISF0cmVlWzFdLmRlbGV0ZWQ7XG4gICAgfVxuICAgIHRvVmlzaXQgPSB0b1Zpc2l0LmNvbmNhdCh0cmVlWzJdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0xvY2FsSWQoaWQpIHtcbiAgcmV0dXJuICgvXl9sb2NhbC8pLnRlc3QoaWQpO1xufVxuXG4vLyByZXR1cm5zIHRoZSBjdXJyZW50IGxlYWYgbm9kZSBmb3IgYSBnaXZlbiByZXZpc2lvblxuZnVuY3Rpb24gbGF0ZXN0KHJldiwgbWV0YWRhdGEpIHtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgaWQgPSB0cmVlWzBdO1xuICAgIHZhciBvcHRzID0gdHJlZVsxXTtcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBpc0xlYWYgPSBicmFuY2hlcy5sZW5ndGggPT09IDA7XG5cbiAgICB2YXIgaGlzdG9yeSA9IG5vZGUuaGlzdG9yeSA/IG5vZGUuaGlzdG9yeS5zbGljZSgpIDogW107XG4gICAgaGlzdG9yeS5wdXNoKHtpZDogaWQsIHBvczogcG9zLCBvcHRzOiBvcHRzfSk7XG5cbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaGlzdG9yeS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgaGlzdG9yeU5vZGUgPSBoaXN0b3J5W2ldO1xuICAgICAgICB2YXIgaGlzdG9yeVJldiA9IGhpc3RvcnlOb2RlLnBvcyArICctJyArIGhpc3RvcnlOb2RlLmlkO1xuXG4gICAgICAgIGlmIChoaXN0b3J5UmV2ID09PSByZXYpIHtcbiAgICAgICAgICAvLyByZXR1cm4gdGhlIHJldiBvZiB0aGlzIGxlYWZcbiAgICAgICAgICByZXR1cm4gcG9zICsgJy0nICsgaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMCwgbCA9IGJyYW5jaGVzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IHBvcyArIDEsIGlkczogYnJhbmNoZXNbal0sIGhpc3Rvcnk6IGhpc3Rvcnl9KTtcbiAgICB9XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIGxhdGVzdCByZXZpc2lvbiBmb3IgaWQgJyArIG1ldGFkYXRhLmlkICsgJywgcmV2ICcgKyByZXYpO1xufVxuXG5pbmhlcml0cyhDaGFuZ2VzJDEsIEVFKTtcblxuZnVuY3Rpb24gdHJ5Q2F0Y2hJbkNoYW5nZUxpc3RlbmVyKHNlbGYsIGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAvLyBpc29sYXRlIHRyeS9jYXRjaGVzIHRvIGF2b2lkIFY4IGRlb3B0aW1pemF0aW9uc1xuICB0cnkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywgY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsICdFcnJvciBpbiAub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24pOicsIGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIENoYW5nZXMkMShkYiwgb3B0cywgY2FsbGJhY2spIHtcbiAgRUUuY2FsbCh0aGlzKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmRiID0gZGI7XG4gIG9wdHMgPSBvcHRzID8gY2xvbmUob3B0cykgOiB7fTtcbiAgdmFyIGNvbXBsZXRlID0gb3B0cy5jb21wbGV0ZSA9IG9uY2UoZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmIChsaXN0ZW5lckNvdW50KHNlbGYsICdlcnJvcicpID4gMCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5lbWl0KCdjb21wbGV0ZScsIHJlc3ApO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9KTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgc2VsZi5vbignY29tcGxldGUnLCBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCk7XG4gICAgfSk7XG4gICAgc2VsZi5vbignZXJyb3InLCBjYWxsYmFjayk7XG4gIH1cbiAgZnVuY3Rpb24gb25EZXN0cm95KCkge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gIH1cbiAgZGIub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcblxuICBvcHRzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lcihzZWxmLCBjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpO1xuICB9O1xuXG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIG9wdHMuY29tcGxldGUgPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmdWxmaWxsKHJlcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHNlbGYub25jZSgnY2FuY2VsJywgZnVuY3Rpb24gKCkge1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICAgIG9wdHMuY29tcGxldGUobnVsbCwge3N0YXR1czogJ2NhbmNlbGxlZCd9KTtcbiAgfSk7XG4gIHRoaXMudGhlbiA9IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpO1xuICB0aGlzWydjYXRjaCddID0gcHJvbWlzZVsnY2F0Y2gnXS5iaW5kKHByb21pc2UpO1xuICB0aGlzLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gIH0sIGNvbXBsZXRlKTtcblxuXG5cbiAgaWYgKCFkYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIGRiLnRhc2txdWV1ZS5hZGRUYXNrKGZ1bmN0aW9uIChmYWlsZWQpIHtcbiAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgb3B0cy5jb21wbGV0ZShmYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnY2FuY2VsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLnZhbGlkYXRlQ2hhbmdlcyhvcHRzKTtcbiAgfVxufVxuQ2hhbmdlcyQxLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICBpZiAodGhpcy5kYi50YXNrcXVldWUuaXNSZWFkeSkge1xuICAgIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvYywgbWV0YWRhdGEsIG9wdHMpIHtcbiAgdmFyIGNoYW5nZUxpc3QgPSBbe3JldjogZG9jLl9yZXZ9XTtcbiAgaWYgKG9wdHMuc3R5bGUgPT09ICdhbGxfZG9jcycpIHtcbiAgICBjaGFuZ2VMaXN0ID0gY29sbGVjdExlYXZlcyhtZXRhZGF0YS5yZXZfdHJlZSlcbiAgICAubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB7cmV2OiB4LnJldn07IH0pO1xuICB9XG4gIHZhciBjaGFuZ2UgPSB7XG4gICAgaWQ6IG1ldGFkYXRhLmlkLFxuICAgIGNoYW5nZXM6IGNoYW5nZUxpc3QsXG4gICAgZG9jOiBkb2NcbiAgfTtcblxuICBpZiAoaXNEZWxldGVkKG1ldGFkYXRhLCBkb2MuX3JldikpIHtcbiAgICBjaGFuZ2UuZGVsZXRlZCA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgY2hhbmdlLmRvYy5fY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgaWYgKCFjaGFuZ2UuZG9jLl9jb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgY2hhbmdlLmRvYy5fY29uZmxpY3RzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlO1xufVxuXG5DaGFuZ2VzJDEucHJvdG90eXBlLnZhbGlkYXRlQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBjYWxsYmFjayA9IG9wdHMuY29tcGxldGU7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbikge1xuICAgIFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4udmFsaWRhdGUob3B0cywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICB9XG59O1xuXG5DaGFuZ2VzJDEucHJvdG90eXBlLmRvQ2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIGlmICgnbGl2ZScgaW4gb3B0cyAmJiAhKCdjb250aW51b3VzJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuY29udGludW91cyA9IG9wdHMubGl2ZTtcbiAgfVxuICBvcHRzLnByb2Nlc3NDaGFuZ2UgPSBwcm9jZXNzQ2hhbmdlO1xuXG4gIGlmIChvcHRzLnNpbmNlID09PSAnbGF0ZXN0Jykge1xuICAgIG9wdHMuc2luY2UgPSAnbm93JztcbiAgfVxuICBpZiAoIW9wdHMuc2luY2UpIHtcbiAgICBvcHRzLnNpbmNlID0gMDtcbiAgfVxuICBpZiAob3B0cy5zaW5jZSA9PT0gJ25vdycpIHtcbiAgICB0aGlzLmRiLmluZm8oKS50aGVuKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChzZWxmLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9wdHMuc2luY2UgPSBpbmZvLnVwZGF0ZV9zZXE7XG4gICAgICBzZWxmLmRvQ2hhbmdlcyhvcHRzKTtcbiAgICB9LCBjYWxsYmFjayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4pIHtcbiAgICBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLm5vcm1hbGl6ZShvcHRzKTtcbiAgICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbi5zaG91bGRGaWx0ZXIodGhpcywgb3B0cykpIHtcbiAgICAgIHJldHVybiBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLmZpbHRlcih0aGlzLCBvcHRzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgWydkb2NfaWRzJywgJ2ZpbHRlcicsICdzZWxlY3RvcicsICd2aWV3J10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoa2V5IGluIG9wdHMpIHtcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLFxuICAgICAgICAgICdUaGUgXCInICsga2V5ICsgJ1wiIG9wdGlvbiB3YXMgcGFzc2VkIGluIHRvIGNoYW5nZXMvcmVwbGljYXRlLCAnICtcbiAgICAgICAgICAnYnV0IHBvdWNoZGItY2hhbmdlcy1maWx0ZXIgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQsIHNvIGl0ICcgK1xuICAgICAgICAgICd3YXMgaWdub3JlZC4gUGxlYXNlIGluc3RhbGwgdGhlIHBsdWdpbiB0byBlbmFibGUgZmlsdGVyaW5nLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghKCdkZXNjZW5kaW5nJyBpbiBvcHRzKSkge1xuICAgIG9wdHMuZGVzY2VuZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gMCBhbmQgMSBzaG91bGQgcmV0dXJuIDEgZG9jdW1lbnRcbiAgb3B0cy5saW1pdCA9IG9wdHMubGltaXQgPT09IDAgPyAxIDogb3B0cy5saW1pdDtcbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICB2YXIgbmV3UHJvbWlzZSA9IHRoaXMuZGIuX2NoYW5nZXMob3B0cyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChuZXdQcm9taXNlICYmIHR5cGVvZiBuZXdQcm9taXNlLmNhbmNlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBjYW5jZWwgPSBzZWxmLmNhbmNlbDtcbiAgICBzZWxmLmNhbmNlbCA9IGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgbmV3UHJvbWlzZS5jYW5jZWwoKTtcbiAgICAgIGNhbmNlbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLypcbiAqIEEgZ2VuZXJpYyBwb3VjaCBhZGFwdGVyXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gV3JhcHBlciBmb3IgZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGUgYnVsa2RvY3MgYXBpIHdpdGggYSBzaW5nbGUgZG9jLFxuLy8gaWYgdGhlIGZpcnN0IHJlc3VsdCBpcyBhbiBlcnJvciwgcmV0dXJuIGFuIGVycm9yXG5mdW5jdGlvbiB5YW5rRXJyb3IoY2FsbGJhY2ssIGRvY0lkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7XG4gICAgaWYgKGVyciB8fCAocmVzdWx0c1swXSAmJiByZXN1bHRzWzBdLmVycm9yKSkge1xuICAgICAgZXJyID0gZXJyIHx8IHJlc3VsdHNbMF07XG4gICAgICBlcnIuZG9jSWQgPSBkb2NJZDtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMubGVuZ3RoID8gcmVzdWx0c1swXSAgOiByZXN1bHRzKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIGNsZWFuIGRvY3MgZ2l2ZW4gdG8gdXMgYnkgdGhlIHVzZXJcbmZ1bmN0aW9uIGNsZWFuRG9jcyhkb2NzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NzW2ldO1xuICAgIGlmIChkb2MuX2RlbGV0ZWQpIHtcbiAgICAgIGRlbGV0ZSBkb2MuX2F0dGFjaG1lbnRzOyAvLyBpZ25vcmUgYXR0cyBmb3IgZGVsZXRlZCBkb2NzXG4gICAgfSBlbHNlIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBmaWx0ZXIgb3V0IGV4dHJhbmVvdXMga2V5cyBmcm9tIF9hdHRhY2htZW50c1xuICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXR0cy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgYXR0ID0gYXR0c1tqXTtcbiAgICAgICAgZG9jLl9hdHRhY2htZW50c1thdHRdID0gcGljayhkb2MuX2F0dGFjaG1lbnRzW2F0dF0sXG4gICAgICAgICAgWydkYXRhJywgJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnLCAnbGVuZ3RoJywgJ3JldnBvcycsICdzdHViJ10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBjb21wYXJlIHR3byBkb2NzLCBmaXJzdCBieSBfaWQgdGhlbiBieSBfcmV2XG5mdW5jdGlvbiBjb21wYXJlQnlJZFRoZW5SZXYoYSwgYikge1xuICB2YXIgaWRDb21wYXJlID0gY29tcGFyZShhLl9pZCwgYi5faWQpO1xuICBpZiAoaWRDb21wYXJlICE9PSAwKSB7XG4gICAgcmV0dXJuIGlkQ29tcGFyZTtcbiAgfVxuICB2YXIgYVN0YXJ0ID0gYS5fcmV2aXNpb25zID8gYS5fcmV2aXNpb25zLnN0YXJ0IDogMDtcbiAgdmFyIGJTdGFydCA9IGIuX3JldmlzaW9ucyA/IGIuX3JldmlzaW9ucy5zdGFydCA6IDA7XG4gIHJldHVybiBjb21wYXJlKGFTdGFydCwgYlN0YXJ0KTtcbn1cblxuLy8gZm9yIGV2ZXJ5IG5vZGUgaW4gYSByZXZpc2lvbiB0cmVlIGNvbXB1dGVzIGl0cyBkaXN0YW5jZSBmcm9tIHRoZSBjbG9zZXN0XG4vLyBsZWFmXG5mdW5jdGlvbiBjb21wdXRlSGVpZ2h0KHJldnMpIHtcbiAgdmFyIGhlaWdodCA9IHt9O1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdHJhdmVyc2VSZXZUcmVlKHJldnMsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgaWQsIHBybnQpIHtcbiAgICB2YXIgcmV2ID0gcG9zICsgXCItXCIgKyBpZDtcbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBoZWlnaHRbcmV2XSA9IDA7XG4gICAgfVxuICAgIGlmIChwcm50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVkZ2VzLnB1c2goe2Zyb206IHBybnQsIHRvOiByZXZ9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldjtcbiAgfSk7XG5cbiAgZWRnZXMucmV2ZXJzZSgpO1xuICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgaWYgKGhlaWdodFtlZGdlLmZyb21dID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlaWdodFtlZGdlLmZyb21dID0gMSArIGhlaWdodFtlZGdlLnRvXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVpZ2h0W2VkZ2UuZnJvbV0gPSBNYXRoLm1pbihoZWlnaHRbZWRnZS5mcm9tXSwgMSArIGhlaWdodFtlZGdlLnRvXSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cblxuZnVuY3Rpb24gYWxsRG9jc0tleXNQYXJzZShvcHRzKSB7XG4gIHZhciBrZXlzID0gICgnbGltaXQnIGluIG9wdHMpID9cbiAgICBvcHRzLmtleXMuc2xpY2Uob3B0cy5za2lwLCBvcHRzLmxpbWl0ICsgb3B0cy5za2lwKSA6XG4gICAgKG9wdHMuc2tpcCA+IDApID8gb3B0cy5rZXlzLnNsaWNlKG9wdHMuc2tpcCkgOiBvcHRzLmtleXM7XG4gIG9wdHMua2V5cyA9IGtleXM7XG4gIG9wdHMuc2tpcCA9IDA7XG4gIGRlbGV0ZSBvcHRzLmxpbWl0O1xuICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAga2V5cy5yZXZlcnNlKCk7XG4gICAgb3B0cy5kZXNjZW5kaW5nID0gZmFsc2U7XG4gIH1cbn1cblxuLy8gYWxsIGNvbXBhY3Rpb24gaXMgZG9uZSBpbiBhIHF1ZXVlLCB0byBhdm9pZCBhdHRhY2hpbmdcbi8vIHRvbyBtYW55IGxpc3RlbmVycyBhdCBvbmNlXG5mdW5jdGlvbiBkb05leHRDb21wYWN0aW9uKHNlbGYpIHtcbiAgdmFyIHRhc2sgPSBzZWxmLl9jb21wYWN0aW9uUXVldWVbMF07XG4gIHZhciBvcHRzID0gdGFzay5vcHRzO1xuICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICBzZWxmLmdldCgnX2xvY2FsL2NvbXBhY3Rpb24nKS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAoZG9jICYmIGRvYy5sYXN0X3NlcSkge1xuICAgICAgb3B0cy5sYXN0X3NlcSA9IGRvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgc2VsZi5fY29tcGFjdChvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH1cbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoc2VsZi5fY29tcGFjdGlvblF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIGRvTmV4dENvbXBhY3Rpb24oc2VsZik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXR0YWNobWVudE5hbWVFcnJvcihuYW1lKSB7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gJ18nKSB7XG4gICAgcmV0dXJuIG5hbWUgKyAnIGlzIG5vdCBhIHZhbGlkIGF0dGFjaG1lbnQgbmFtZSwgYXR0YWNobWVudCAnICtcbiAgICAgICduYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBcXCdfXFwnJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmluaGVyaXRzKEFic3RyYWN0UG91Y2hEQiwgRUUpO1xuXG5mdW5jdGlvbiBBYnN0cmFjdFBvdWNoREIoKSB7XG4gIEVFLmNhbGwodGhpcyk7XG5cbiAgLy8gcmUtYmluZCBwcm90b3R5cGVkIG1ldGhvZHNcbiAgZm9yICh2YXIgcCBpbiBBYnN0cmFjdFBvdWNoREIucHJvdG90eXBlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzW3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW3BdID0gdGhpc1twXS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnBvc3QgPVxuICBhZGFwdGVyRnVuKCdwb3N0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbZG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgZG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0ID0gYWRhcHRlckZ1bigncHV0JywgZnVuY3Rpb24gKGRvYywgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGRvYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkb2MpKSB7XG4gICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgfVxuICBpbnZhbGlkSWRFcnJvcihkb2MuX2lkKTtcbiAgaWYgKGlzTG9jYWxJZChkb2MuX2lkKSAmJiB0eXBlb2YgdGhpcy5fcHV0TG9jYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVtb3ZlTG9jYWwoZG9jLCBjYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wdXRMb2NhbChkb2MsIGNiKTtcbiAgICB9XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAob3B0cy5mb3JjZSAmJiBkb2MuX3Jldikge1xuICAgIHRyYW5zZm9ybUZvcmNlT3B0aW9uVG9OZXdFZGl0c09wdGlvbigpO1xuICAgIHB1dERvYyhmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZXJyID8gbnVsbCA6IHtvazogdHJ1ZSwgaWQ6IGRvYy5faWQsIHJldjogZG9jLl9yZXZ9O1xuICAgICAgY2IoZXJyLCByZXN1bHQpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHB1dERvYyhjYik7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JjZU9wdGlvblRvTmV3RWRpdHNPcHRpb24oKSB7XG4gICAgdmFyIHBhcnRzID0gZG9jLl9yZXYuc3BsaXQoJy0nKTtcbiAgICB2YXIgb2xkUmV2SWQgPSBwYXJ0c1sxXTtcbiAgICB2YXIgb2xkUmV2TnVtID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcblxuICAgIHZhciBuZXdSZXZOdW0gPSBvbGRSZXZOdW0gKyAxO1xuICAgIHZhciBuZXdSZXZJZCA9IHJldiQkMSgpO1xuXG4gICAgZG9jLl9yZXZpc2lvbnMgPSB7XG4gICAgICBzdGFydDogbmV3UmV2TnVtLFxuICAgICAgaWRzOiBbbmV3UmV2SWQsIG9sZFJldklkXVxuICAgIH07XG4gICAgZG9jLl9yZXYgPSBuZXdSZXZOdW0gKyAnLScgKyBuZXdSZXZJZDtcbiAgICBvcHRzLm5ld19lZGl0cyA9IGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIHB1dERvYyhuZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBzZWxmLl9wdXQgPT09ICdmdW5jdGlvbicgJiYgb3B0cy5uZXdfZWRpdHMgIT09IGZhbHNlKSB7XG4gICAgICBzZWxmLl9wdXQoZG9jLCBvcHRzLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5idWxrRG9jcyh7ZG9jczogW2RvY119LCBvcHRzLCB5YW5rRXJyb3IobmV4dCwgZG9jLl9pZCkpO1xuICAgIH1cbiAgfVxufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucHV0QXR0YWNobWVudCA9XG4gIGFkYXB0ZXJGdW4oJ3B1dEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCwgcmV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IsIHR5cGUpIHtcbiAgdmFyIGFwaSA9IHRoaXM7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHR5cGUgPSBibG9iO1xuICAgIGJsb2IgPSByZXY7XG4gICAgcmV2ID0gbnVsbDtcbiAgfVxuICAvLyBMZXRzIGZpeCBpbiBodHRwczovL2dpdGh1Yi5jb20vcG91Y2hkYi9wb3VjaGRiL2lzc3Vlcy8zMjY3XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHlwZSA9IGJsb2I7XG4gICAgYmxvYiA9IHJldjtcbiAgICByZXYgPSBudWxsO1xuICB9XG4gIGlmICghdHlwZSkge1xuICAgIGd1YXJkZWRDb25zb2xlKCd3YXJuJywgJ0F0dGFjaG1lbnQnLCBhdHRhY2htZW50SWQsICdvbiBkb2N1bWVudCcsIGRvY0lkLCAnaXMgbWlzc2luZyBjb250ZW50X3R5cGUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUF0dGFjaG1lbnQoZG9jKSB7XG4gICAgdmFyIHByZXZyZXZwb3MgPSAnX3JldicgaW4gZG9jID8gcGFyc2VJbnQoZG9jLl9yZXYsIDEwKSA6IDA7XG4gICAgZG9jLl9hdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgfHwge307XG4gICAgZG9jLl9hdHRhY2htZW50c1thdHRhY2htZW50SWRdID0ge1xuICAgICAgY29udGVudF90eXBlOiB0eXBlLFxuICAgICAgZGF0YTogYmxvYixcbiAgICAgIHJldnBvczogKytwcmV2cmV2cG9zXG4gICAgfTtcbiAgICByZXR1cm4gYXBpLnB1dChkb2MpO1xuICB9XG5cbiAgcmV0dXJuIGFwaS5nZXQoZG9jSWQpLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX3JldiAhPT0gcmV2KSB7XG4gICAgICB0aHJvdyBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVBdHRhY2htZW50KGRvYyk7XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgLy8gY3JlYXRlIG5ldyBkb2NcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChlcnIucmVhc29uID09PSBNSVNTSU5HX0RPQy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQXR0YWNobWVudCh7X2lkOiBkb2NJZH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZUF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdyZW1vdmVBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZ2V0KGRvY0lkLCBmdW5jdGlvbiAoZXJyLCBvYmopIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob2JqLl9yZXYgIT09IHJldikge1xuICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghb2JqLl9hdHRhY2htZW50cykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGRlbGV0ZSBvYmouX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF07XG4gICAgaWYgKE9iamVjdC5rZXlzKG9iai5fYXR0YWNobWVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9iai5fYXR0YWNobWVudHM7XG4gICAgfVxuICAgIHNlbGYucHV0KG9iaiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlbW92ZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlbW92ZScsIGZ1bmN0aW9uIChkb2NPcklkLCBvcHRzT3JSZXYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBkb2M7XG4gIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnc3RyaW5nJykge1xuICAgIC8vIGlkLCByZXYsIG9wdHMsIGNhbGxiYWNrIHN0eWxlXG4gICAgZG9jID0ge1xuICAgICAgX2lkOiBkb2NPcklkLFxuICAgICAgX3Jldjogb3B0c09yUmV2XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgIGRvYyA9IGRvY09ySWQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0c09yUmV2O1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0gb3B0c09yUmV2O1xuICAgIH1cbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgb3B0cy53YXNfZGVsZXRlID0gdHJ1ZTtcbiAgdmFyIG5ld0RvYyA9IHtfaWQ6IGRvYy5faWQsIF9yZXY6IChkb2MuX3JldiB8fCBvcHRzLnJldil9O1xuICBuZXdEb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICBpZiAoaXNMb2NhbElkKG5ld0RvYy5faWQpICYmIHR5cGVvZiB0aGlzLl9yZW1vdmVMb2NhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVMb2NhbChkb2MsIGNhbGxiYWNrKTtcbiAgfVxuICB0aGlzLmJ1bGtEb2NzKHtkb2NzOiBbbmV3RG9jXX0sIG9wdHMsIHlhbmtFcnJvcihjYWxsYmFjaywgbmV3RG9jLl9pZCkpO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmV2c0RpZmYgPVxuICBhZGFwdGVyRnVuKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKHJlcSk7XG5cbiAgaWYgKCFpZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHt9KTtcbiAgfVxuXG4gIHZhciBjb3VudCA9IDA7XG4gIHZhciBtaXNzaW5nID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgZnVuY3Rpb24gYWRkVG9NaXNzaW5nKGlkLCByZXZJZCkge1xuICAgIGlmICghbWlzc2luZy5oYXMoaWQpKSB7XG4gICAgICBtaXNzaW5nLnNldChpZCwge21pc3Npbmc6IFtdfSk7XG4gICAgfVxuICAgIG1pc3NpbmcuZ2V0KGlkKS5taXNzaW5nLnB1c2gocmV2SWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RvYyhpZCwgcmV2X3RyZWUpIHtcbiAgICAvLyBJcyB0aGlzIGZhc3QgZW5vdWdoPyBNYXliZSB3ZSBzaG91bGQgc3dpdGNoIHRvIGEgc2V0IHNpbXVsYXRlZCBieSBhIG1hcFxuICAgIHZhciBtaXNzaW5nRm9ySWQgPSByZXFbaWRdLnNsaWNlKDApO1xuICAgIHRyYXZlcnNlUmV2VHJlZShyZXZfdHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsXG4gICAgICBvcHRzKSB7XG4gICAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgICB2YXIgaWR4ID0gbWlzc2luZ0ZvcklkLmluZGV4T2YocmV2KTtcbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtaXNzaW5nRm9ySWQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy5zdGF0dXMgIT09ICdhdmFpbGFibGUnKSB7XG4gICAgICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFRyYXZlcnNpbmcgdGhlIHRyZWUgaXMgc3luY2hyb25vdXMsIHNvIG5vdyBgbWlzc2luZ0ZvcklkYCBjb250YWluc1xuICAgIC8vIHJldmlzaW9ucyB0aGF0IHdlcmUgbm90IGZvdW5kIGluIHRoZSB0cmVlXG4gICAgbWlzc2luZ0ZvcklkLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgICAgYWRkVG9NaXNzaW5nKGlkLCByZXYpO1xuICAgIH0pO1xuICB9XG5cbiAgaWRzLm1hcChmdW5jdGlvbiAoaWQpIHtcbiAgICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoaWQsIGZ1bmN0aW9uIChlcnIsIHJldl90cmVlKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgPT09IDQwNCAmJiBlcnIubWVzc2FnZSA9PT0gJ21pc3NpbmcnKSB7XG4gICAgICAgIG1pc3Npbmcuc2V0KGlkLCB7bWlzc2luZzogcmVxW2lkXX0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzRG9jKGlkLCByZXZfdHJlZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgrK2NvdW50ID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgTGF6eU1hcCB0byBvYmplY3RcbiAgICAgICAgdmFyIG1pc3NpbmdPYmogPSB7fTtcbiAgICAgICAgbWlzc2luZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgbWlzc2luZ09ialtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbWlzc2luZ09iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHRoaXMpO1xufSk7XG5cbi8vIF9idWxrX2dldCBBUEkgZm9yIGZhc3RlciByZXBsaWNhdGlvbiwgYXMgZGVzY3JpYmVkIGluXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvdWNoZGItY2h0dHBkL3B1bGwvMzNcbi8vIEF0IHRoZSBcImFic3RyYWN0XCIgbGV2ZWwsIGl0IHdpbGwganVzdCBydW4gbXVsdGlwbGUgZ2V0KClzIGluXG4vLyBwYXJhbGxlbCwgYmVjYXVzZSB0aGlzIGlzbid0IG11Y2ggb2YgYSBwZXJmb3JtYW5jZSBjb3N0XG4vLyBmb3IgbG9jYWwgZGF0YWJhc2VzIChleGNlcHQgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLCB3aGljaCBpc1xuLy8gc21hbGwpLiBUaGUgaHR0cCBhZGFwdGVyIG92ZXJyaWRlcyB0aGlzIGluIG9yZGVyXG4vLyB0byBkbyBhIG1vcmUgZWZmaWNpZW50IHNpbmdsZSBIVFRQIHJlcXVlc3QuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmJ1bGtHZXQgPVxuICBhZGFwdGVyRnVuKCdidWxrR2V0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGJ1bGtHZXQodGhpcywgb3B0cywgY2FsbGJhY2spO1xufSk7XG5cbi8vIGNvbXBhY3Qgb25lIGRvY3VtZW50IGFuZCBmaXJlIGNhbGxiYWNrXG4vLyBieSBjb21wYWN0aW5nIHdlIG1lYW4gcmVtb3ZpbmcgYWxsIHJldmlzaW9ucyB3aGljaFxuLy8gYXJlIGZ1cnRoZXIgZnJvbSB0aGUgbGVhZiBpbiByZXZpc2lvbiB0cmVlIHRoYW4gbWF4X2hlaWdodFxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0RG9jdW1lbnQgPVxuICBhZGFwdGVyRnVuKCdjb21wYWN0RG9jdW1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIG1heEhlaWdodCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoZG9jSWQsIGZ1bmN0aW9uIChlcnIsIHJldlRyZWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdmFyIGhlaWdodCA9IGNvbXB1dGVIZWlnaHQocmV2VHJlZSk7XG4gICAgdmFyIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICB2YXIgcmV2cyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGhlaWdodCkuZm9yRWFjaChmdW5jdGlvbiAocmV2KSB7XG4gICAgICBpZiAoaGVpZ2h0W3Jldl0gPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cmF2ZXJzZVJldlRyZWUocmV2VHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgaWYgKG9wdHMuc3RhdHVzID09PSAnYXZhaWxhYmxlJyAmJiBjYW5kaWRhdGVzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgcmV2cy5wdXNoKHJldik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5fZG9Db21wYWN0aW9uKGRvY0lkLCByZXZzLCBjYWxsYmFjayk7XG4gIH0pO1xufSk7XG5cbi8vIGNvbXBhY3QgdGhlIHdob2xlIGRhdGFiYXNlIHVzaW5nIHNpbmdsZSBkb2N1bWVudFxuLy8gY29tcGFjdGlvblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jb21wYWN0ID1cbiAgYWRhcHRlckZ1bignY29tcGFjdCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBzZWxmLl9jb21wYWN0aW9uUXVldWUgPSBzZWxmLl9jb21wYWN0aW9uUXVldWUgfHwgW107XG4gIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5wdXNoKHtvcHRzOiBvcHRzLCBjYWxsYmFjazogY2FsbGJhY2t9KTtcbiAgaWYgKHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICBkb05leHRDb21wYWN0aW9uKHNlbGYpO1xuICB9XG59KTtcbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuX2NvbXBhY3QgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2hhbmdlc09wdHMgPSB7XG4gICAgcmV0dXJuX2RvY3M6IGZhbHNlLFxuICAgIGxhc3Rfc2VxOiBvcHRzLmxhc3Rfc2VxIHx8IDBcbiAgfTtcbiAgdmFyIHByb21pc2VzID0gW107XG5cbiAgZnVuY3Rpb24gb25DaGFuZ2Uocm93KSB7XG4gICAgcHJvbWlzZXMucHVzaChzZWxmLmNvbXBhY3REb2N1bWVudChyb3cuaWQsIDApKTtcbiAgfVxuICBmdW5jdGlvbiBvbkNvbXBsZXRlKHJlc3ApIHtcbiAgICB2YXIgbGFzdFNlcSA9IHJlc3AubGFzdF9zZXE7XG4gICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHVwc2VydChzZWxmLCAnX2xvY2FsL2NvbXBhY3Rpb24nLCBmdW5jdGlvbiBkZWx0YUZ1bmMoZG9jKSB7XG4gICAgICAgIGlmICghZG9jLmxhc3Rfc2VxIHx8IGRvYy5sYXN0X3NlcSA8IGxhc3RTZXEpIHtcbiAgICAgICAgICBkb2MubGFzdF9zZXEgPSBsYXN0U2VxO1xuICAgICAgICAgIHJldHVybiBkb2M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzb21lYm9keSBlbHNlIGdvdCBoZXJlIGZpcnN0LCBkb24ndCB1cGRhdGVcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge29rOiB0cnVlfSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9XG4gIHNlbGYuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAub24oJ2NoYW5nZScsIG9uQ2hhbmdlKVxuICAgIC5vbignY29tcGxldGUnLCBvbkNvbXBsZXRlKVxuICAgIC5vbignZXJyb3InLCBjYWxsYmFjayk7XG59O1xuXG4vKiBCZWdpbiBhcGkgd3JhcHBlcnMuIFNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gc3RvcmFnZSBiZWxvbmdzIGluIHRoZVxuICAgX1ttZXRob2RdICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldCA9IGFkYXB0ZXJGdW4oJ2dldCcsIGZ1bmN0aW9uIChpZCwgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX0lEKSk7XG4gIH1cbiAgaWYgKGlzTG9jYWxJZChpZCkgJiYgdHlwZW9mIHRoaXMuX2dldExvY2FsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldExvY2FsKGlkLCBjYik7XG4gIH1cbiAgdmFyIGxlYXZlcyA9IFtdLCBzZWxmID0gdGhpcztcblxuICBmdW5jdGlvbiBmaW5pc2hPcGVuUmV2cygpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGNvdW50ID0gbGVhdmVzLmxlbmd0aDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNvdW50KSB7XG4gICAgICByZXR1cm4gY2IobnVsbCwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyBvcmRlciB3aXRoIG9wZW5fcmV2cyBpcyB1bnNwZWNpZmllZFxuICAgIGxlYXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChsZWFmKSB7XG4gICAgICBzZWxmLmdldChpZCwge1xuICAgICAgICByZXY6IGxlYWYsXG4gICAgICAgIHJldnM6IG9wdHMucmV2cyxcbiAgICAgICAgbGF0ZXN0OiBvcHRzLmxhdGVzdCxcbiAgICAgICAgYXR0YWNobWVudHM6IG9wdHMuYXR0YWNobWVudHMsXG4gICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRvYykge1xuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgIC8vIHVzaW5nIGxhdGVzdD10cnVlIGNhbiBwcm9kdWNlIGR1cGxpY2F0ZXNcbiAgICAgICAgICB2YXIgZXhpc3Rpbmc7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXN1bHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W2ldLm9rICYmIHJlc3VsdFtpXS5vay5fcmV2ID09PSBkb2MuX3Jldikge1xuICAgICAgICAgICAgICBleGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7b2s6IGRvY30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7bWlzc2luZzogbGVhZn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgICBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcHRzLm9wZW5fcmV2cykge1xuICAgIGlmIChvcHRzLm9wZW5fcmV2cyA9PT0gXCJhbGxcIikge1xuICAgICAgdGhpcy5fZ2V0UmV2aXNpb25UcmVlKGlkLCBmdW5jdGlvbiAoZXJyLCByZXZfdHJlZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGxlYXZlcyA9IGNvbGxlY3RMZWF2ZXMocmV2X3RyZWUpLm1hcChmdW5jdGlvbiAobGVhZikge1xuICAgICAgICAgIHJldHVybiBsZWFmLnJldjtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbmlzaE9wZW5SZXZzKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cy5vcGVuX3JldnMpKSB7XG4gICAgICAgIGxlYXZlcyA9IG9wdHMub3Blbl9yZXZzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlYXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBsID0gbGVhdmVzW2ldO1xuICAgICAgICAgIC8vIGxvb2tzIGxpa2UgaXQncyB0aGUgb25seSB0aGluZyBjb3VjaGRiIGNoZWNrc1xuICAgICAgICAgIGlmICghKHR5cGVvZiAobCkgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrLS8udGVzdChsKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihJTlZBTElEX1JFVikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5pc2hPcGVuUmV2cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKFVOS05PV05fRVJST1IsICdmdW5jdGlvbl9jbGF1c2UnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjsgLy8gb3Blbl9yZXZzIGRvZXMgbm90IGxpa2Ugb3RoZXIgb3B0aW9uc1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2dldChpZCwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgaWYgKGVycikge1xuICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgZG9jID0gcmVzdWx0LmRvYztcbiAgICB2YXIgbWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGE7XG4gICAgdmFyIGN0eCA9IHJlc3VsdC5jdHg7XG5cbiAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgIHZhciBjb25mbGljdHMgPSBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKTtcbiAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgIGRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlbGV0ZWQobWV0YWRhdGEsIGRvYy5fcmV2KSkge1xuICAgICAgZG9jLl9kZWxldGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzIHx8IG9wdHMucmV2c19pbmZvKSB7XG4gICAgICB2YXIgc3BsaXR0ZWRSZXYgPSBkb2MuX3Jldi5zcGxpdCgnLScpO1xuICAgICAgdmFyIHJldk5vICAgICAgID0gcGFyc2VJbnQoc3BsaXR0ZWRSZXZbMF0sIDEwKTtcbiAgICAgIHZhciByZXZIYXNoICAgICA9IHNwbGl0dGVkUmV2WzFdO1xuXG4gICAgICB2YXIgcGF0aHMgPSByb290VG9MZWFmKG1ldGFkYXRhLnJldl90cmVlKTtcbiAgICAgIHZhciBwYXRoID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudFBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgdmFyIGhhc2hJbmRleCA9IGN1cnJlbnRQYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguaWQ7IH0pXG4gICAgICAgICAgLmluZGV4T2YocmV2SGFzaCk7XG4gICAgICAgIHZhciBoYXNoRm91bmRBdFJldlBvcyA9IGhhc2hJbmRleCA9PT0gKHJldk5vIC0gMSk7XG5cbiAgICAgICAgaWYgKGhhc2hGb3VuZEF0UmV2UG9zIHx8ICghcGF0aCAmJiBoYXNoSW5kZXggIT09IC0xKSkge1xuICAgICAgICAgIHBhdGggPSBjdXJyZW50UGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ2ludmFsaWQgcmV2IHRyZWUnKTtcbiAgICAgICAgZXJyLmRvY0lkID0gaWQ7XG4gICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXhPZlJldiA9IHBhdGguaWRzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pZDsgfSlcbiAgICAgICAgLmluZGV4T2YoZG9jLl9yZXYuc3BsaXQoJy0nKVsxXSkgKyAxO1xuICAgICAgdmFyIGhvd01hbnkgPSBwYXRoLmlkcy5sZW5ndGggLSBpbmRleE9mUmV2O1xuICAgICAgcGF0aC5pZHMuc3BsaWNlKGluZGV4T2ZSZXYsIGhvd01hbnkpO1xuICAgICAgcGF0aC5pZHMucmV2ZXJzZSgpO1xuXG4gICAgICBpZiAob3B0cy5yZXZzKSB7XG4gICAgICAgIGRvYy5fcmV2aXNpb25zID0ge1xuICAgICAgICAgIHN0YXJ0OiAocGF0aC5wb3MgKyBwYXRoLmlkcy5sZW5ndGgpIC0gMSxcbiAgICAgICAgICBpZHM6IHBhdGguaWRzLm1hcChmdW5jdGlvbiAocmV2KSB7XG4gICAgICAgICAgICByZXR1cm4gcmV2LmlkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgICAgdmFyIHBvcyA9ICBwYXRoLnBvcyArIHBhdGguaWRzLmxlbmd0aDtcbiAgICAgICAgZG9jLl9yZXZzX2luZm8gPSBwYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHJldikge1xuICAgICAgICAgIHBvcy0tO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXY6IHBvcyArICctJyArIHJldi5pZCxcbiAgICAgICAgICAgIHN0YXR1czogcmV2Lm9wdHMuc3RhdHVzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jLl9hdHRhY2htZW50cztcbiAgICAgIHZhciBjb3VudCA9IE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGg7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhhdHRhY2htZW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHRoaXMuX2dldEF0dGFjaG1lbnQoZG9jLl9pZCwga2V5LCBhdHRhY2htZW50c1trZXldLCB7XG4gICAgICAgICAgLy8gUHJldmlvdXNseSB0aGUgcmV2aXNpb24gaGFuZGxpbmcgd2FzIGRvbmUgaW4gYWRhcHRlci5qc1xuICAgICAgICAgIC8vIGdldEF0dGFjaG1lbnQsIGhvd2V2ZXIgc2luY2UgaWRiLW5leHQgZG9lc250IHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBwYXNzIHRoZSByZXYgdGhyb3VnaFxuICAgICAgICAgIHJldjogZG9jLl9yZXYsXG4gICAgICAgICAgYmluYXJ5OiBvcHRzLmJpbmFyeSxcbiAgICAgICAgICBjdHg6IGN0eFxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgdmFyIGF0dCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgIGlmICghLS1jb3VudCkge1xuICAgICAgICAgICAgY2IobnVsbCwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvYy5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgICAgIGRvYy5fYXR0YWNobWVudHNba2V5XS5zdHViID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNiKG51bGwsIGRvYyk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vLyBUT0RPOiBJIGRvbnQgbGlrZSB0aGlzLCBpdCBmb3JjZXMgYW4gZXh0cmEgcmVhZCBmb3IgZXZlcnlcbi8vIGF0dGFjaG1lbnQgcmVhZCBhbmQgZW5mb3JjZXMgYSBjb25mdXNpbmcgYXBpIGJldHdlZW5cbi8vIGFkYXB0ZXIuanMgYW5kIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmdldEF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdnZXRBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKG9wdHMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgdGhpcy5fZ2V0KGRvY0lkLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgaWYgKHJlcy5kb2MuX2F0dGFjaG1lbnRzICYmIHJlcy5kb2MuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF0pIHtcbiAgICAgIG9wdHMuY3R4ID0gcmVzLmN0eDtcbiAgICAgIG9wdHMuYmluYXJ5ID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2dldEF0dGFjaG1lbnQoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmRvYy5fYXR0YWNobWVudHNbYXR0YWNobWVudElkXSwgb3B0cywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuYWxsRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBvcHRzLnNraXAgPSB0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJyA/IG9wdHMuc2tpcCA6IDA7XG4gIGlmIChvcHRzLnN0YXJ0X2tleSkge1xuICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgfVxuICBpZiAob3B0cy5lbmRfa2V5KSB7XG4gICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gIH1cbiAgaWYgKCdrZXlzJyBpbiBvcHRzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdHMua2V5cykpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdvcHRpb25zLmtleXMgbXVzdCBiZSBhbiBhcnJheScpKTtcbiAgICB9XG4gICAgdmFyIGluY29tcGF0aWJsZU9wdCA9XG4gICAgICBbJ3N0YXJ0a2V5JywgJ2VuZGtleScsICdrZXknXS5maWx0ZXIoZnVuY3Rpb24gKGluY29tcGF0aWJsZU9wdCkge1xuICAgICAgcmV0dXJuIGluY29tcGF0aWJsZU9wdCBpbiBvcHRzO1xuICAgIH0pWzBdO1xuICAgIGlmIChpbmNvbXBhdGlibGVPcHQpIHtcbiAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFFVRVJZX1BBUlNFX0VSUk9SLFxuICAgICAgICAnUXVlcnkgcGFyYW1ldGVyIGAnICsgaW5jb21wYXRpYmxlT3B0ICtcbiAgICAgICAgJ2AgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBtdWx0aS1nZXQnXG4gICAgICApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc1JlbW90ZSh0aGlzKSkge1xuICAgICAgYWxsRG9jc0tleXNQYXJzZShvcHRzKTtcbiAgICAgIGlmIChvcHRzLmtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxEb2NzKHtsaW1pdDogMH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fYWxsRG9jcyhvcHRzLCBjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jaGFuZ2VzID0gZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAvLyBCeSBkZWZhdWx0IHNldCByZXR1cm5fZG9jcyB0byBmYWxzZSBpZiB0aGUgY2FsbGVyIGhhcyBvcHRzLmxpdmUgPSB0cnVlLFxuICAvLyB0aGlzIHdpbGwgcHJldmVudCB1cyBmcm9tIGNvbGxlY3RpbmcgdGhlIHNldCBvZiBjaGFuZ2VzIGluZGVmaW5pdGVseVxuICAvLyByZXN1bHRpbmcgaW4gZ3Jvd2luZyBtZW1vcnlcbiAgb3B0cy5yZXR1cm5fZG9jcyA9ICgncmV0dXJuX2RvY3MnIGluIG9wdHMpID8gb3B0cy5yZXR1cm5fZG9jcyA6ICFvcHRzLmxpdmU7XG5cbiAgcmV0dXJuIG5ldyBDaGFuZ2VzJDEodGhpcywgb3B0cywgY2FsbGJhY2spO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5jbG9zZSA9IGFkYXB0ZXJGdW4oJ2Nsb3NlJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gIHRoaXMuZW1pdCgnY2xvc2VkJyk7XG4gIHJldHVybiB0aGlzLl9jbG9zZShjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5pbmZvID0gYWRhcHRlckZ1bignaW5mbycsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX2luZm8oZnVuY3Rpb24gKGVyciwgaW5mbykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICAvLyBhc3N1bWUgd2Uga25vdyBiZXR0ZXIgdGhhbiB0aGUgYWRhcHRlciwgdW5sZXNzIGl0IGluZm9ybXMgdXNcbiAgICBpbmZvLmRiX25hbWUgPSBpbmZvLmRiX25hbWUgfHwgc2VsZi5uYW1lO1xuICAgIGluZm8uYXV0b19jb21wYWN0aW9uID0gISEoc2VsZi5hdXRvX2NvbXBhY3Rpb24gJiYgIWlzUmVtb3RlKHNlbGYpKTtcbiAgICBpbmZvLmFkYXB0ZXIgPSBzZWxmLmFkYXB0ZXI7XG4gICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuaWQgPSBhZGFwdGVyRnVuKCdpZCcsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faWQoY2FsbGJhY2spO1xufSk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodHlwZW9mIHRoaXMuX3R5cGUgPT09ICdmdW5jdGlvbicpID8gdGhpcy5fdHlwZSgpIDogdGhpcy5hZGFwdGVyO1xufTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5idWxrRG9jcyA9XG4gIGFkYXB0ZXJGdW4oJ2J1bGtEb2NzJywgZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHJlcSkpIHtcbiAgICByZXEgPSB7XG4gICAgICBkb2NzOiByZXFcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFyZXEgfHwgIXJlcS5kb2NzIHx8ICFBcnJheS5pc0FycmF5KHJlcS5kb2NzKSkge1xuICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0JVTEtfRE9DUykpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXEuZG9jcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0eXBlb2YgcmVxLmRvY3NbaV0gIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVxLmRvY3NbaV0pKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTk9UX0FOX09CSkVDVCkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhdHRhY2htZW50RXJyb3I7XG4gIHJlcS5kb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGF0dGFjaG1lbnRFcnJvciA9IGF0dGFjaG1lbnRFcnJvciB8fCBhdHRhY2htZW50TmFtZUVycm9yKG5hbWUpO1xuICAgICAgICBpZiAoIWRvYy5fYXR0YWNobWVudHNbbmFtZV0uY29udGVudF90eXBlKSB7XG4gICAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLCAnQXR0YWNobWVudCcsIG5hbWUsICdvbiBkb2N1bWVudCcsIGRvYy5faWQsICdpcyBtaXNzaW5nIGNvbnRlbnRfdHlwZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChhdHRhY2htZW50RXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsIGF0dGFjaG1lbnRFcnJvcikpO1xuICB9XG5cbiAgaWYgKCEoJ25ld19lZGl0cycgaW4gb3B0cykpIHtcbiAgICBpZiAoJ25ld19lZGl0cycgaW4gcmVxKSB7XG4gICAgICBvcHRzLm5ld19lZGl0cyA9IHJlcS5uZXdfZWRpdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMubmV3X2VkaXRzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgYWRhcHRlciA9IHRoaXM7XG4gIGlmICghb3B0cy5uZXdfZWRpdHMgJiYgIWlzUmVtb3RlKGFkYXB0ZXIpKSB7XG4gICAgLy8gZW5zdXJlIHJldmlzaW9ucyBvZiB0aGUgc2FtZSBkb2MgYXJlIHNvcnRlZCwgc28gdGhhdFxuICAgIC8vIHRoZSBsb2NhbCBhZGFwdGVyIHByb2Nlc3NlcyB0aGVtIGNvcnJlY3RseSAoIzI5MzUpXG4gICAgcmVxLmRvY3Muc29ydChjb21wYXJlQnlJZFRoZW5SZXYpO1xuICB9XG5cbiAgY2xlYW5Eb2NzKHJlcS5kb2NzKTtcblxuICAvLyBpbiB0aGUgY2FzZSBvZiBjb25mbGljdHMsIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBfaWRzIHRvIHRoZSB1c2VyXG4gIC8vIGhvd2V2ZXIsIHRoZSB1bmRlcmx5aW5nIGFkYXB0ZXIgbWF5IGRlc3Ryb3kgdGhlIGRvY3MgYXJyYXksIHNvXG4gIC8vIGNyZWF0ZSBhIGNvcHkgaGVyZVxuICB2YXIgaWRzID0gcmVxLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9pZDtcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXMuX2J1bGtEb2NzKHJlcSwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIGlmICghb3B0cy5uZXdfZWRpdHMpIHtcbiAgICAgIC8vIHRoaXMgaXMgd2hhdCBjb3VjaCBkb2VzIHdoZW4gbmV3X2VkaXRzIGlzIGZhbHNlXG4gICAgICByZXMgPSByZXMuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4LmVycm9yO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGFkZCBpZHMgZm9yIGVycm9yL2NvbmZsaWN0IHJlc3BvbnNlcyAobm90IHJlcXVpcmVkIGZvciBDb3VjaERCKVxuICAgIGlmICghaXNSZW1vdGUoYWRhcHRlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZXNbaV0uaWQgPSByZXNbaV0uaWQgfHwgaWRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZSA9XG4gIGFkYXB0ZXJGdW4oJ3JlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UnLCBmdW5jdGlvbiAoZGVwZW5kZW50RGIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spIHtcbiAgdmFyIGRiT3B0aW9ucyA9IGNsb25lKHRoaXMuX19vcHRzKTtcbiAgaWYgKHRoaXMuX19vcHRzLnZpZXdfYWRhcHRlcikge1xuICAgIGRiT3B0aW9ucy5hZGFwdGVyID0gdGhpcy5fX29wdHMudmlld19hZGFwdGVyO1xuICB9XG5cbiAgdmFyIGRlcERCID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZGVwZW5kZW50RGIsIGRiT3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGlmZkZ1bihkb2MpIHtcbiAgICBkb2MuZGVwZW5kZW50RGJzID0gZG9jLmRlcGVuZGVudERicyB8fCB7fTtcbiAgICBpZiAoZG9jLmRlcGVuZGVudERic1tkZXBlbmRlbnREYl0pIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gdXBkYXRlIHJlcXVpcmVkXG4gICAgfVxuICAgIGRvYy5kZXBlbmRlbnREYnNbZGVwZW5kZW50RGJdID0gdHJ1ZTtcbiAgICByZXR1cm4gZG9jO1xuICB9XG4gIHVwc2VydCh0aGlzLCAnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBkaWZmRnVuKVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtkYjogZGVwREJ9KTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5kZXN0cm95ID1cbiAgYWRhcHRlckZ1bignZGVzdHJveScsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB1c2VQcmVmaXggPSAndXNlX3ByZWZpeCcgaW4gc2VsZiA/IHNlbGYudXNlX3ByZWZpeCA6IHRydWU7XG5cbiAgZnVuY3Rpb24gZGVzdHJveURiKCkge1xuICAgIC8vIGNhbGwgZGVzdHJveSBtZXRob2Qgb2YgdGhlIHBhcnRpY3VsYXIgYWRhcHRvclxuICAgIHNlbGYuX2Rlc3Ryb3kob3B0cywgZnVuY3Rpb24gKGVyciwgcmVzcCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuX2Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICBzZWxmLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcCB8fCB7ICdvayc6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNSZW1vdGUoc2VsZikpIHtcbiAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciBkZXBlbmRlbnQgREJzIGlmIGl0J3MgYSByZW1vdGUgREJcbiAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gIH1cblxuICBzZWxmLmdldCgnX2xvY2FsL19wb3VjaF9kZXBlbmRlbnREYnMnLCBmdW5jdGlvbiAoZXJyLCBsb2NhbERvYykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7IC8vIG5vIGRlcGVuZGVuY2llc1xuICAgICAgICByZXR1cm4gZGVzdHJveURiKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBkZXBlbmRlbnREYnMgPSBsb2NhbERvYy5kZXBlbmRlbnREYnM7XG4gICAgdmFyIFBvdWNoREIgPSBzZWxmLmNvbnN0cnVjdG9yO1xuICAgIHZhciBkZWxldGVkTWFwID0gT2JqZWN0LmtleXMoZGVwZW5kZW50RGJzKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIC8vIHVzZV9wcmVmaXggaXMgb25seSBmYWxzZSBpbiB0aGUgYnJvd3NlclxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHZhciB0cnVlTmFtZSA9IHVzZVByZWZpeCA/XG4gICAgICAgIG5hbWUucmVwbGFjZShuZXcgUmVnRXhwKCdeJyArIFBvdWNoREIucHJlZml4KSwgJycpIDogbmFtZTtcbiAgICAgIHJldHVybiBuZXcgUG91Y2hEQih0cnVlTmFtZSwgc2VsZi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChkZWxldGVkTWFwKS50aGVuKGRlc3Ryb3lEYiwgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBUYXNrUXVldWUoKSB7XG4gIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICB0aGlzLmZhaWxlZCA9IGZhbHNlO1xuICB0aGlzLnF1ZXVlID0gW107XG59XG5cblRhc2tRdWV1ZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZ1bjtcbiAgaWYgKHRoaXMuZmFpbGVkKSB7XG4gICAgd2hpbGUgKChmdW4gPSB0aGlzLnF1ZXVlLnNoaWZ0KCkpKSB7XG4gICAgICBmdW4odGhpcy5mYWlsZWQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoKGZ1biA9IHRoaXMucXVldWUuc2hpZnQoKSkpIHtcbiAgICAgIGZ1bigpO1xuICAgIH1cbiAgfVxufTtcblxuVGFza1F1ZXVlLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmZhaWxlZCA9IGVycjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLnJlYWR5ID0gZnVuY3Rpb24gKGRiKSB7XG4gIHRoaXMuaXNSZWFkeSA9IHRydWU7XG4gIHRoaXMuZGIgPSBkYjtcbiAgdGhpcy5leGVjdXRlKCk7XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLmFkZFRhc2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gIHRoaXMucXVldWUucHVzaChmdW4pO1xuICBpZiAodGhpcy5mYWlsZWQpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcGFyc2VBZGFwdGVyKG5hbWUsIG9wdHMpIHtcbiAgdmFyIG1hdGNoID0gbmFtZS5tYXRjaCgvKFthLXotXSopOlxcL1xcLyguKikvKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgLy8gdGhlIGh0dHAgYWRhcHRlciBleHBlY3RzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAvaHR0cHM/Ly50ZXN0KG1hdGNoWzFdKSA/IG1hdGNoWzFdICsgJzovLycgKyBtYXRjaFsyXSA6IG1hdGNoWzJdLFxuICAgICAgYWRhcHRlcjogbWF0Y2hbMV1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGFkYXB0ZXJzID0gUG91Y2hEQi5hZGFwdGVycztcbiAgdmFyIHByZWZlcnJlZEFkYXB0ZXJzID0gUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycztcbiAgdmFyIHByZWZpeCA9IFBvdWNoREIucHJlZml4O1xuICB2YXIgYWRhcHRlck5hbWUgPSBvcHRzLmFkYXB0ZXI7XG5cbiAgaWYgKCFhZGFwdGVyTmFtZSkgeyAvLyBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhZGFwdGVyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmZXJyZWRBZGFwdGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgYWRhcHRlck5hbWUgPSBwcmVmZXJyZWRBZGFwdGVyc1tpXTtcbiAgICAgIC8vIGNoZWNrIGZvciBicm93c2VycyB0aGF0IGhhdmUgYmVlbiB1cGdyYWRlZCBmcm9tIHdlYnNxbC1vbmx5IHRvIHdlYnNxbCtpZGJcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGFkYXB0ZXJOYW1lID09PSAnaWRiJyAmJiAnd2Vic3FsJyBpbiBhZGFwdGVycyAmJlxuICAgICAgICAgIGhhc0xvY2FsU3RvcmFnZSgpICYmIGxvY2FsU3RvcmFnZVsnX3BvdWNoX193ZWJzcWxkYl8nICsgcHJlZml4ICsgbmFtZV0pIHtcbiAgICAgICAgLy8gbG9nIGl0LCBiZWNhdXNlIHRoaXMgY2FuIGJlIGNvbmZ1c2luZyBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgICAgZ3VhcmRlZENvbnNvbGUoJ2xvZycsICdQb3VjaERCIGlzIGRvd25ncmFkaW5nIFwiJyArIG5hbWUgKyAnXCIgdG8gV2ViU1FMIHRvJyArXG4gICAgICAgICAgJyBhdm9pZCBkYXRhIGxvc3MsIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgb3BlbmVkIHdpdGggV2ViU1FMLicpO1xuICAgICAgICBjb250aW51ZTsgLy8ga2VlcCB1c2luZyB3ZWJzcWwgdG8gYXZvaWQgdXNlciBkYXRhIGxvc3NcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhZGFwdGVyID0gYWRhcHRlcnNbYWRhcHRlck5hbWVdO1xuXG4gIC8vIGlmIGFkYXB0ZXIgaXMgaW52YWxpZCwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBsYXRlclxuICB2YXIgdXNlUHJlZml4ID0gKGFkYXB0ZXIgJiYgJ3VzZV9wcmVmaXgnIGluIGFkYXB0ZXIpID9cbiAgICBhZGFwdGVyLnVzZV9wcmVmaXggOiB0cnVlO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogdXNlUHJlZml4ID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSxcbiAgICBhZGFwdGVyOiBhZGFwdGVyTmFtZVxuICB9O1xufVxuXG4vLyBPSywgc28gaGVyZSdzIHRoZSBkZWFsLiBDb25zaWRlciB0aGlzIGNvZGU6XG4vLyAgICAgdmFyIGRiMSA9IG5ldyBQb3VjaERCKCdmb28nKTtcbi8vICAgICB2YXIgZGIyID0gbmV3IFBvdWNoREIoJ2ZvbycpO1xuLy8gICAgIGRiMS5kZXN0cm95KCk7XG4vLyBeIHRoZXNlIHR3byBib3RoIG5lZWQgdG8gZW1pdCAnZGVzdHJveWVkJyBldmVudHMsXG4vLyBhcyB3ZWxsIGFzIHRoZSBQb3VjaERCIGNvbnN0cnVjdG9yIGl0c2VsZi5cbi8vIFNvIHdlIGhhdmUgb25lIGRiIG9iamVjdCAod2hpY2hldmVyIG9uZSBnb3QgZGVzdHJveSgpIGNhbGxlZCBvbiBpdClcbi8vIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyB0aGUgaW5pdGlhbCBldmVudCwgd2hpY2ggdGhlbiBnZXRzIGVtaXR0ZWRcbi8vIGJ5IHRoZSBjb25zdHJ1Y3Rvciwgd2hpY2ggdGhlbiBicm9hZGNhc3RzIGl0IHRvIGFueSBvdGhlciBkYnNcbi8vIHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggdGhlIHNhbWUgbmFtZS5cbmZ1bmN0aW9uIHByZXBhcmVGb3JEZXN0cnVjdGlvbihzZWxmKSB7XG5cbiAgZnVuY3Rpb24gb25EZXN0cm95ZWQoZnJvbV9jb25zdHJ1Y3Rvcikge1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgICBpZiAoIWZyb21fY29uc3RydWN0b3IpIHtcbiAgICAgIHNlbGYuY29uc3RydWN0b3IuZW1pdCgnZGVzdHJveWVkJywgc2VsZi5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsb3NlZCgpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCd1bnJlZicsIHNlbGYpO1xuICB9XG5cbiAgc2VsZi5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3llZCk7XG4gIHNlbGYub25jZSgnY2xvc2VkJywgb25DbG9zZWQpO1xuICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ3JlZicsIHNlbGYpO1xufVxuXG5pbmhlcml0cyhQb3VjaERCLCBBYnN0cmFjdFBvdWNoREIpO1xuZnVuY3Rpb24gUG91Y2hEQihuYW1lLCBvcHRzKSB7XG4gIC8vIEluIE5vZGUgb3VyIHRlc3Qgc3VpdGUgb25seSB0ZXN0cyB0aGlzIGZvciBQb3VjaEFsdCB1bmZvcnR1bmF0ZWx5XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hEQikpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoREIobmFtZSwgb3B0cyk7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSAnb2JqZWN0Jykge1xuICAgIG9wdHMgPSBuYW1lO1xuICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgZGVsZXRlIG9wdHMubmFtZTtcbiAgfVxuXG4gIGlmIChvcHRzLmRldGVybWluaXN0aWNfcmV2cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0cy5kZXRlcm1pbmlzdGljX3JldnMgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fX29wdHMgPSBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgc2VsZi5hdXRvX2NvbXBhY3Rpb24gPSBvcHRzLmF1dG9fY29tcGFjdGlvbjtcbiAgc2VsZi5wcmVmaXggPSBQb3VjaERCLnByZWZpeDtcblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nL2ludmFsaWQgREIgbmFtZScpO1xuICB9XG5cbiAgdmFyIHByZWZpeGVkTmFtZSA9IChvcHRzLnByZWZpeCB8fCAnJykgKyBuYW1lO1xuICB2YXIgYmFja2VuZCA9IHBhcnNlQWRhcHRlcihwcmVmaXhlZE5hbWUsIG9wdHMpO1xuXG4gIG9wdHMubmFtZSA9IGJhY2tlbmQubmFtZTtcbiAgb3B0cy5hZGFwdGVyID0gb3B0cy5hZGFwdGVyIHx8IGJhY2tlbmQuYWRhcHRlcjtcblxuICBzZWxmLm5hbWUgPSBuYW1lO1xuICBzZWxmLl9hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuICBQb3VjaERCLmVtaXQoJ2RlYnVnJywgWydhZGFwdGVyJywgJ1BpY2tlZCBhZGFwdGVyOiAnLCBvcHRzLmFkYXB0ZXJdKTtcblxuICBpZiAoIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXSB8fFxuICAgICAgIVBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS52YWxpZCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFkYXB0ZXI6ICcgKyBvcHRzLmFkYXB0ZXIpO1xuICB9XG5cbiAgaWYgKG9wdHMudmlld19hZGFwdGVyKSB7XG4gICAgaWYgKCFQb3VjaERCLmFkYXB0ZXJzW29wdHMudmlld19hZGFwdGVyXSB8fFxuICAgICAgICAhUG91Y2hEQi5hZGFwdGVyc1tvcHRzLnZpZXdfYWRhcHRlcl0udmFsaWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFZpZXcgQWRhcHRlcjogJyArIG9wdHMudmlld19hZGFwdGVyKTtcbiAgICB9XG4gIH1cblxuICBBYnN0cmFjdFBvdWNoREIuY2FsbChzZWxmKTtcbiAgc2VsZi50YXNrcXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XG5cbiAgc2VsZi5hZGFwdGVyID0gb3B0cy5hZGFwdGVyO1xuXG4gIFBvdWNoREIuYWRhcHRlcnNbb3B0cy5hZGFwdGVyXS5jYWxsKHNlbGYsIG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gc2VsZi50YXNrcXVldWUuZmFpbChlcnIpO1xuICAgIH1cbiAgICBwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oc2VsZik7XG5cbiAgICBzZWxmLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmKTtcbiAgICBQb3VjaERCLmVtaXQoJ2NyZWF0ZWQnLCBzZWxmLm5hbWUpO1xuICAgIHNlbGYudGFza3F1ZXVlLnJlYWR5KHNlbGYpO1xuICB9KTtcblxufVxuXG4vLyBBYm9ydENvbnRyb2xsZXIgd2FzIGludHJvZHVjZWQgcXVpdGUgYSB3aGlsZSBhZnRlciBmZXRjaCBhbmRcbi8vIGlzbnQgcmVxdWlyZWQgZm9yIFBvdWNoREIgdG8gZnVuY3Rpb24gc28gcG9seWZpbGwgaWYgbmVlZGVkXG52YXIgYSA9ICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJylcbiAgICA/IEFib3J0Q29udHJvbGxlclxuICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4ge2Fib3J0OiBmdW5jdGlvbiAoKSB7fX07IH07XG5cbnZhciBmJDEgPSBmZXRjaDtcbnZhciBoID0gSGVhZGVycztcblxuUG91Y2hEQi5hZGFwdGVycyA9IHt9O1xuUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycyA9IFtdO1xuXG5Qb3VjaERCLnByZWZpeCA9ICdfcG91Y2hfJztcblxudmFyIGV2ZW50RW1pdHRlciA9IG5ldyBFRSgpO1xuXG5mdW5jdGlvbiBzZXRVcEV2ZW50RW1pdHRlcihQb3VjaCkge1xuICBPYmplY3Qua2V5cyhFRS5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICh0eXBlb2YgRUUucHJvdG90eXBlW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIFBvdWNoW2tleV0gPSBldmVudEVtaXR0ZXJba2V5XS5iaW5kKGV2ZW50RW1pdHRlcik7XG4gICAgfVxuICB9KTtcblxuICAvLyB0aGVzZSBhcmUgY3JlYXRlZCBpbiBjb25zdHJ1Y3Rvci5qcywgYW5kIGFsbG93IHVzIHRvIG5vdGlmeSBlYWNoIERCIHdpdGhcbiAgLy8gdGhlIHNhbWUgbmFtZSB0aGF0IGl0IHdhcyBkZXN0cm95ZWQsIHZpYSB0aGUgY29uc3RydWN0b3Igb2JqZWN0XG4gIHZhciBkZXN0cnVjdExpc3RlbmVycyA9IFBvdWNoLl9kZXN0cnVjdGlvbkxpc3RlbmVycyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG4gIFBvdWNoLm9uKCdyZWYnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yUmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLnNldChkYi5uYW1lLCBbXSk7XG4gICAgfVxuICAgIGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKS5wdXNoKGRiKTtcbiAgfSk7XG5cbiAgUG91Y2gub24oJ3VucmVmJywgZnVuY3Rpb24gb25Db25zdHJ1Y3RvclVucmVmKGRiKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMoZGIubmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRiTGlzdCA9IGRlc3RydWN0TGlzdGVuZXJzLmdldChkYi5uYW1lKTtcbiAgICB2YXIgcG9zID0gZGJMaXN0LmluZGV4T2YoZGIpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYkxpc3Quc3BsaWNlKHBvcywgMSk7XG4gICAgaWYgKGRiTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuc2V0KGRiLm5hbWUsIGRiTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShkYi5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIFBvdWNoLm9uKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yRGVzdHJveWVkKG5hbWUpIHtcbiAgICBpZiAoIWRlc3RydWN0TGlzdGVuZXJzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZGJMaXN0ID0gZGVzdHJ1Y3RMaXN0ZW5lcnMuZ2V0KG5hbWUpO1xuICAgIGRlc3RydWN0TGlzdGVuZXJzLmRlbGV0ZShuYW1lKTtcbiAgICBkYkxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGIpIHtcbiAgICAgIGRiLmVtaXQoJ2Rlc3Ryb3llZCcsdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5zZXRVcEV2ZW50RW1pdHRlcihQb3VjaERCKTtcblxuUG91Y2hEQi5hZGFwdGVyID0gZnVuY3Rpb24gKGlkLCBvYmosIGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKG9iai52YWxpZCgpKSB7XG4gICAgUG91Y2hEQi5hZGFwdGVyc1tpZF0gPSBvYmo7XG4gICAgaWYgKGFkZFRvUHJlZmVycmVkQWRhcHRlcnMpIHtcbiAgICAgIFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMucHVzaChpZCk7XG4gICAgfVxuICB9XG59O1xuXG5Qb3VjaERCLnBsdWdpbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHsgLy8gZnVuY3Rpb24gc3R5bGUgZm9yIHBsdWdpbnNcbiAgICBvYmooUG91Y2hEQik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGx1Z2luOiBnb3QgXCInICsgb2JqICsgJ1wiLCBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbicpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgLy8gb2JqZWN0IHN0eWxlIGZvciBwbHVnaW5zXG4gICAgICBQb3VjaERCLnByb3RvdHlwZVtpZF0gPSBvYmpbaWRdO1xuICAgIH0pO1xuICB9XG4gIGlmICh0aGlzLl9fZGVmYXVsdHMpIHtcbiAgICBQb3VjaERCLl9fZGVmYXVsdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIHRoaXMuX19kZWZhdWx0cyk7XG4gIH1cbiAgcmV0dXJuIFBvdWNoREI7XG59O1xuXG5Qb3VjaERCLmRlZmF1bHRzID0gZnVuY3Rpb24gKGRlZmF1bHRPcHRzKSB7XG4gIGZ1bmN0aW9uIFBvdWNoQWx0KG5hbWUsIG9wdHMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG91Y2hBbHQpKSB7XG4gICAgICByZXR1cm4gbmV3IFBvdWNoQWx0KG5hbWUsIG9wdHMpO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRzID0gbmFtZTtcbiAgICAgIG5hbWUgPSBvcHRzLm5hbWU7XG4gICAgICBkZWxldGUgb3B0cy5uYW1lO1xuICAgIH1cblxuICAgIG9wdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIFBvdWNoQWx0Ll9fZGVmYXVsdHMsIG9wdHMpO1xuICAgIFBvdWNoREIuY2FsbCh0aGlzLCBuYW1lLCBvcHRzKTtcbiAgfVxuXG4gIGluaGVyaXRzKFBvdWNoQWx0LCBQb3VjaERCKTtcblxuICBQb3VjaEFsdC5wcmVmZXJyZWRBZGFwdGVycyA9IFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMuc2xpY2UoKTtcbiAgT2JqZWN0LmtleXMoUG91Y2hEQikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCEoa2V5IGluIFBvdWNoQWx0KSkge1xuICAgICAgUG91Y2hBbHRba2V5XSA9IFBvdWNoREJba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIG1ha2UgZGVmYXVsdCBvcHRpb25zIHRyYW5zaXRpdmVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvdWNoZGIvcG91Y2hkYi9pc3N1ZXMvNTkyMlxuICBQb3VjaEFsdC5fX2RlZmF1bHRzID0gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCB0aGlzLl9fZGVmYXVsdHMsIGRlZmF1bHRPcHRzKTtcblxuICByZXR1cm4gUG91Y2hBbHQ7XG59O1xuXG5Qb3VjaERCLmZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0cykge1xuICByZXR1cm4gZiQxKHVybCwgb3B0cyk7XG59O1xuXG4vLyBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkgYnkgc2V0LXZlcnNpb24uanNcbnZhciB2ZXJzaW9uID0gXCI3LjMuMFwiO1xuXG4vLyB0aGlzIHdvdWxkIGp1c3QgYmUgXCJyZXR1cm4gZG9jW2ZpZWxkXVwiLCBidXQgZmllbGRzXG4vLyBjYW4gYmUgXCJkZWVwXCIgZHVlIHRvIGRvdCBub3RhdGlvblxuZnVuY3Rpb24gZ2V0RmllbGRGcm9tRG9jKGRvYywgcGFyc2VkRmllbGQpIHtcbiAgdmFyIHZhbHVlID0gZG9jO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGFyc2VkRmllbGQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcGFyc2VkRmllbGRbaV07XG4gICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUkMShsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbn1cblxuLy8gQ29udmVydHMgYSBzdHJpbmcgaW4gZG90IG5vdGF0aW9uIHRvIGFuIGFycmF5IG9mIGl0cyBjb21wb25lbnRzLCB3aXRoIGJhY2tzbGFzaCBlc2NhcGluZ1xuZnVuY3Rpb24gcGFyc2VGaWVsZChmaWVsZE5hbWUpIHtcbiAgLy8gZmllbGRzIG1heSBiZSBkZWVwIChlLmcuIFwiZm9vLmJhci5iYXpcIiksIHNvIHBhcnNlXG4gIHZhciBmaWVsZHMgPSBbXTtcbiAgdmFyIGN1cnJlbnQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZpZWxkTmFtZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBjaCA9IGZpZWxkTmFtZVtpXTtcbiAgICBpZiAoaSA+IDAgJiYgZmllbGROYW1lW2kgLSAxXSA9PT0gJ1xcXFwnICYmIChjaCA9PT0gJyQnIHx8IGNoID09PSAnLicpKSB7XG4gICAgICAvLyBlc2NhcGVkIGRlbGltaXRlclxuICAgICAgY3VycmVudCA9IGN1cnJlbnQuc3Vic3RyaW5nKDAsIGN1cnJlbnQubGVuZ3RoIC0gMSkgKyBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnLicpIHtcbiAgICAgIC8vIFdoZW4gYC5gIGlzIG5vdCBlc2NhcGVkIChhYm92ZSksIGl0IGlzIGEgZmllbGQgZGVsaW1pdGVyXG4gICAgICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgY2hhcmFjdGVyXG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH1cbiAgfVxuICBmaWVsZHMucHVzaChjdXJyZW50KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cblxudmFyIGNvbWJpbmF0aW9uRmllbGRzID0gWyckb3InLCAnJG5vcicsICckbm90J107XG5mdW5jdGlvbiBpc0NvbWJpbmF0aW9uYWxGaWVsZChmaWVsZCkge1xuICByZXR1cm4gY29tYmluYXRpb25GaWVsZHMuaW5kZXhPZihmaWVsZCkgPiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUob2JqKSB7XG4gIHJldHVybiBvYmpbZ2V0S2V5KG9iaildO1xufVxuXG5cbi8vIGZsYXR0ZW4gYW4gYXJyYXkgb2Ygc2VsZWN0b3JzIGpvaW5lZCBieSBhbiAkYW5kIG9wZXJhdG9yXG5mdW5jdGlvbiBtZXJnZUFuZGVkU2VsZWN0b3JzKHNlbGVjdG9ycykge1xuXG4gIC8vIHNvcnQgdG8gZW5zdXJlIHRoYXQgZS5nLiBpZiB0aGUgdXNlciBzcGVjaWZpZWRcbiAgLy8gJGFuZDogW3skZ3Q6ICdhJ30sIHskZ3Q6ICdiJ31dLCB0aGVuIGl0J3MgY29sbGFwc2VkIGludG9cbiAgLy8ganVzdCB7JGd0OiAnYid9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGZpcnN0ID0geyRvcjogdHJ1ZSwgJG5vcjogdHJ1ZX07XG5cbiAgc2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgT2JqZWN0LmtleXMoc2VsZWN0b3IpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgbWF0Y2hlciA9IHskZXE6IG1hdGNoZXJ9O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICAgIC8vIG9yLCBub3JcbiAgICAgICAgaWYgKG1hdGNoZXIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGlmIChmaXJzdFtmaWVsZF0pIHtcbiAgICAgICAgICAgIGZpcnN0W2ZpZWxkXSA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzW2ZpZWxkXSA9IG1hdGNoZXI7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICAgICAgICByZXNbZmllbGRdLmZvckVhY2goZnVuY3Rpb24gKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIG0gPSBtYXRjaGVyW2tleV07XG4gICAgICAgICAgICAgIHZhciBsb25nZXN0ID0gTWF0aC5tYXgoT2JqZWN0LmtleXMoZXhpc3RpbmcpLmxlbmd0aCwgT2JqZWN0LmtleXMobSkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgdmFyIG1lcmdlZCA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW2V4aXN0aW5nLCBtXSk7XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA8PSBsb25nZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHNpdHVhdGlvbiBsaWtlOiAoYSA6eyRlcSA6MX0gfHwgLi4uKSAmJiAoYSB7JGVxOiAyfSB8fCAuLi4pXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2luZyB3b3VsZCBwcm9kdWNlIGEgJGVxIDIgd2hlbiBhY3R1YWxseSB3ZSBzaG91bGRuJ3QgZXZlciBtYXRjaCBhZ2FpbnN0IHRoZXNlIG1lcmdlZCBjb25kaXRpb25zXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2VkIHNob3VsZCBhbHdheXMgY29udGFpbiBtb3JlIHZhbHVlcyB0byBiZSB2YWxpZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2gobWVyZ2VkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc1tmaWVsZF0gPSBlbnRyaWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vdFxuICAgICAgICAgIHJlc1tmaWVsZF0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKFttYXRjaGVyXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWVsZE1hdGNoZXJzID0gcmVzW2ZpZWxkXSA9IHJlc1tmaWVsZF0gfHwge307XG4gICAgICAgIE9iamVjdC5rZXlzKG1hdGNoZXIpLmZvckVhY2goZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gbWF0Y2hlcltvcGVyYXRvcl07XG5cbiAgICAgICAgICBpZiAob3BlcmF0b3IgPT09ICckZ3QnIHx8IG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUd0R3RlKG9wZXJhdG9yLCB2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gJyRsdCcgfHwgb3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSAnJG5lJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlTmUodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09ICckZXEnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VFcSh2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gXCIkcmVnZXhcIikge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmVnZXgodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuXG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGd0L2d0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlR3RHdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA+IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID49IGZpZWxkTWF0Y2hlcnMuJGd0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRndGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRndCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckZ3RlJykge1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3Q7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3QpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRndCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbGxhcHNlIGxvZ2ljYWxseSBlcXVpdmFsZW50IGx0L2x0ZSB2YWx1ZXNcbmZ1bmN0aW9uIG1lcmdlTHRMdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZXEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nXG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGx0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA8IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDw9IGZpZWxkTWF0Y2hlcnMuJGx0ZSkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG9wZXJhdG9yID09PSAnJGd0J1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHQpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRsdCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZE1hdGNoZXJzW29wZXJhdG9yXSA9IHZhbHVlO1xuICB9XG59XG5cbi8vIGNvbWJpbmUgJG5lIHZhbHVlcyBpbnRvIG9uZSBhcnJheVxuZnVuY3Rpb24gbWVyZ2VOZSh2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICBpZiAoJyRuZScgaW4gZmllbGRNYXRjaGVycykge1xuICAgIC8vIHRoZXJlIGFyZSBtYW55IHRoaW5ncyB0aGlzIGNvdWxkIFwibm90XCIgYmVcbiAgICBmaWVsZE1hdGNoZXJzLiRuZS5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIHsgLy8gZG9lc24ndCBleGlzdCB5ZXRcbiAgICBmaWVsZE1hdGNoZXJzLiRuZSA9IFt2YWx1ZV07XG4gIH1cbn1cblxuLy8gYWRkICRlcSBpbnRvIHRoZSBtaXhcbmZ1bmN0aW9uIG1lcmdlRXEodmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgbGVzcyBzcGVjaWZpY2l0eSB0aGFuIHRoZSAkZXFcbiAgLy8gVE9ETzogY2hlY2sgZm9yIHVzZXIgZXJyb3JzIGhlcmVcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGd0O1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3RlO1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHQ7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdGU7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRuZTtcbiAgZmllbGRNYXRjaGVycy4kZXEgPSB2YWx1ZTtcbn1cblxuLy8gY29tYmluZSAkcmVnZXggdmFsdWVzIGludG8gb25lIGFycmF5XG5mdW5jdGlvbiBtZXJnZVJlZ2V4KHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICgnJHJlZ2V4JyBpbiBmaWVsZE1hdGNoZXJzKSB7XG4gICAgLy8gYSB2YWx1ZSBjb3VsZCBtYXRjaCBtdWx0aXBsZSByZWdleGVzXG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXgucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSB7IC8vIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgZmllbGRNYXRjaGVycy4kcmVnZXggPSBbdmFsdWVdO1xuICB9XG59XG5cbi8vIzc0NTg6IGV4ZWN1dGUgZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9ycyBvbiBuZXN0ZWQgJGFuZFxuZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChvYmopIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmpbaV1bJyRhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICBvYmpbaV0gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKG9ialtpXVsnJGFuZCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZCh2YWx1ZSk7IC8vIDwtIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cblxuLy8jNzQ1ODogZGV0ZXJtaW5lIGlkICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKVxuZnVuY3Rpb24gaXNBbmRJblNlbGVjdG9yKG9iaiwgaXNBbmQpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAocHJvcCA9PT0gJyRhbmQnKSB7XG4gICAgICAgICAgICBpc0FuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaXNBbmQgPSBpc0FuZEluU2VsZWN0b3IodmFsdWUsIGlzQW5kKTsgLy8gPC0gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNBbmQ7XG59XG5cbi8vXG4vLyBub3JtYWxpemUgdGhlIHNlbGVjdG9yXG4vL1xuZnVuY3Rpb24gbWFzc2FnZVNlbGVjdG9yKGlucHV0KSB7XG4gIHZhciByZXN1bHQgPSBjbG9uZShpbnB1dCk7XG4gIHZhciB3YXNBbmRlZCA9IGZhbHNlO1xuICAgIC8vIzc0NTg6IGlmICRhbmQgaXMgcHJlc2VudCBpbiBzZWxlY3RvciAoYXQgYW55IGxldmVsKSBtZXJnZSBuZXN0ZWQgJGFuZFxuICAgIGlmIChpc0FuZEluU2VsZWN0b3IocmVzdWx0LCBmYWxzZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9yc05lc3RlZChyZXN1bHQpO1xuICAgICAgICBpZiAoJyRhbmQnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhyZXN1bHRbJyRhbmQnXSk7XG4gICAgICAgIH1cbiAgICAgICAgd2FzQW5kZWQgPSB0cnVlO1xuICAgIH1cblxuICBbJyRvcicsICckbm9yJ10uZm9yRWFjaChmdW5jdGlvbiAob3JPck5vcikge1xuICAgIGlmIChvck9yTm9yIGluIHJlc3VsdCkge1xuICAgICAgLy8gbWVzc2FnZSBlYWNoIGluZGl2aWR1YWwgc2VsZWN0b3JcbiAgICAgIC8vIGUuZy4ge2ZvbzogJ2Jhcid9IGJlY29tZXMge2ZvbzogeyRlcTogJ2Jhcid9fVxuICAgICAgcmVzdWx0W29yT3JOb3JdLmZvckVhY2goZnVuY3Rpb24gKHN1YlNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSBPYmplY3Qua2V5cyhzdWJTZWxlY3Rvcik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgIHZhciBtYXRjaGVyID0gc3ViU2VsZWN0b3JbZmllbGRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcgfHwgbWF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3ViU2VsZWN0b3JbZmllbGRdID0geyRlcTogbWF0Y2hlcn07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICgnJG5vdCcgaW4gcmVzdWx0KSB7XG4gICAgLy9UaGlzIGZlZWxzIGEgbGl0dGxlIGxpa2UgZm9yY2luZywgYnV0IGl0IHdpbGwgd29yayBmb3Igbm93LFxuICAgIC8vSSB3b3VsZCBsaWtlIHRvIGNvbWUgYmFjayB0byB0aGlzIGFuZCBtYWtlIHRoZSBtZXJnaW5nIG9mIHNlbGVjdG9ycyBhIGxpdHRsZSBtb3JlIGdlbmVyaWNcbiAgICByZXN1bHRbJyRub3QnXSA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW3Jlc3VsdFsnJG5vdCddXSk7XG4gIH1cblxuICB2YXIgZmllbGRzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICB2YXIgbWF0Y2hlciA9IHJlc3VsdFtmaWVsZF07XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgIT09ICdvYmplY3QnIHx8IG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIG1hdGNoZXIgPSB7JGVxOiBtYXRjaGVyfTtcbiAgICB9IGVsc2UgaWYgKCF3YXNBbmRlZCkge1xuICAgICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgcGxhY2VkIGluIGFuIGFycmF5IGJlY2F1c2UgdGhlc2Ugb3BlcmF0b3JzIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGZpZWxkXG4gICAgICAvLyB3aGVuICRhbmQgaXMgdXNlZCwgbWVyZ2VBbmRlZFNlbGVjdG9ycyB0YWtlcyBjYXJlIG9mIHB1dHRpbmcgdGhlbSBpbnRvIGFycmF5cywgb3RoZXJ3aXNlIGl0J3MgZG9uZSBoZXJlOlxuICAgICAgaWYgKCckbmUnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kbmUgPSBbbWF0Y2hlci4kbmVdO1xuICAgICAgfVxuICAgICAgaWYgKCckcmVnZXgnIGluIG1hdGNoZXIpIHtcbiAgICAgICAgbWF0Y2hlci4kcmVnZXggPSBbbWF0Y2hlci4kcmVnZXhdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHRbZmllbGRdID0gbWF0Y2hlcjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhZChzdHIsIHBhZFdpdGgsIHVwVG9MZW5ndGgpIHtcbiAgdmFyIHBhZGRpbmcgPSAnJztcbiAgdmFyIHRhcmdldExlbmd0aCA9IHVwVG9MZW5ndGggLSBzdHIubGVuZ3RoO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB3aGlsZSAocGFkZGluZy5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBwYWRkaW5nICs9IHBhZFdpdGg7XG4gIH1cbiAgcmV0dXJuIHBhZGRpbmc7XG59XG5cbmZ1bmN0aW9uIHBhZExlZnQoc3RyLCBwYWRXaXRoLCB1cFRvTGVuZ3RoKSB7XG4gIHZhciBwYWRkaW5nID0gcGFkKHN0ciwgcGFkV2l0aCwgdXBUb0xlbmd0aCk7XG4gIHJldHVybiBwYWRkaW5nICsgc3RyO1xufVxuXG52YXIgTUlOX01BR05JVFVERSA9IC0zMjQ7IC8vIHZlcmlmaWVkIGJ5IC1OdW1iZXIuTUlOX1ZBTFVFXG52YXIgTUFHTklUVURFX0RJR0lUUyA9IDM7IC8vIGRpdHRvXG52YXIgU0VQID0gJyc7IC8vIHNldCB0byAnXycgZm9yIGVhc2llciBkZWJ1Z2dpbmdcblxuZnVuY3Rpb24gY29sbGF0ZShhLCBiKSB7XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGEgPSBub3JtYWxpemVLZXkoYSk7XG4gIGIgPSBub3JtYWxpemVLZXkoYik7XG5cbiAgdmFyIGFpID0gY29sbGF0aW9uSW5kZXgoYSk7XG4gIHZhciBiaSA9IGNvbGxhdGlvbkluZGV4KGIpO1xuICBpZiAoKGFpIC0gYmkpICE9PSAwKSB7XG4gICAgcmV0dXJuIGFpIC0gYmk7XG4gIH1cbiAgc3dpdGNoICh0eXBlb2YgYSkge1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IDE7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdDb2xsYXRlKGEsIGIpO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGEpID8gYXJyYXlDb2xsYXRlKGEsIGIpIDogb2JqZWN0Q29sbGF0ZShhLCBiKTtcbn1cblxuLy8gY291Y2ggY29uc2lkZXJzIG51bGwvTmFOL0luZmluaXR5Ly1JbmZpbml0eSA9PT0gdW5kZWZpbmVkLFxuLy8gZm9yIHRoZSBwdXJwb3NlcyBvZiBtYXByZWR1Y2UgaW5kZXhlcy4gYWxzbywgZGF0ZXMgZ2V0IHN0cmluZ2lmaWVkLlxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmIChrZXkgPT09IEluZmluaXR5IHx8IGtleSA9PT0gLUluZmluaXR5IHx8IGlzTmFOKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5O1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgb3JpZ0tleSA9IGtleTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgdmFyIGxlbiA9IGtleS5sZW5ndGg7XG4gICAgICAgIGtleSA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAga2V5W2ldID0gbm9ybWFsaXplS2V5KG9yaWdLZXlbaV0pO1xuICAgICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBrZXkudG9KU09OKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gbnVsbCkgeyAvLyBnZW5lcmljIG9iamVjdFxuICAgICAgICBrZXkgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvcmlnS2V5KSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcmlnS2V5LCBrKSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9yaWdLZXlba107XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAga2V5W2tdID0gbm9ybWFsaXplS2V5KHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGtleTtcbn1cblxuZnVuY3Rpb24gaW5kZXhpZnkoa2V5KSB7XG4gIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4ga2V5ID8gMSA6IDA7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gbnVtVG9JbmRleGFibGVTdHJpbmcoa2V5KTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIC8vIFdlJ3ZlIHRvIGJlIHN1cmUgdGhhdCBrZXkgZG9lcyBub3QgY29udGFpbiBcXHUwMDAwXG4gICAgICAgIC8vIERvIG9yZGVyLXByZXNlcnZpbmcgcmVwbGFjZW1lbnRzOlxuICAgICAgICAvLyAwIC0+IDEsIDFcbiAgICAgICAgLy8gMSAtPiAxLCAyXG4gICAgICAgIC8vIDIgLT4gMiwgMlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHJldHVybiBrZXlcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMi9nLCAnXFx1MDAwMlxcdTAwMDInKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAxL2csICdcXHUwMDAxXFx1MDAwMicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDAvZywgJ1xcdTAwMDFcXHUwMDAxJyk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29udHJvbC1yZWdleCAqL1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGtleSk7XG4gICAgICAgIHZhciBhcnIgPSBpc0FycmF5ID8ga2V5IDogT2JqZWN0LmtleXMoa2V5KTtcbiAgICAgICAgdmFyIGkgPSAtMTtcbiAgICAgICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9JbmRleGFibGVTdHJpbmcoYXJyW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgICAgICAgdmFyIG9iaktleSA9IGFycltpXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0luZGV4YWJsZVN0cmluZyhvYmpLZXkpICtcbiAgICAgICAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhrZXlbb2JqS2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLy8gY29udmVydCB0aGUgZ2l2ZW4ga2V5IHRvIGEgc3RyaW5nIHRoYXQgd291bGQgYmUgYXBwcm9wcmlhdGVcbi8vIGZvciBsZXhpY2FsIHNvcnRpbmcsIGUuZy4gd2l0aGluIGEgZGF0YWJhc2UsIHdoZXJlIHRoZVxuLy8gc29ydGluZyBpcyB0aGUgc2FtZSBnaXZlbiBieSB0aGUgY29sbGF0ZSgpIGZ1bmN0aW9uLlxuZnVuY3Rpb24gdG9JbmRleGFibGVTdHJpbmcoa2V5KSB7XG4gIHZhciB6ZXJvID0gJ1xcdTAwMDAnO1xuICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcbiAgcmV0dXJuIGNvbGxhdGlvbkluZGV4KGtleSkgKyBTRVAgKyBpbmRleGlmeShrZXkpICsgemVybztcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoc3RyLCBpKSB7XG4gIHZhciBvcmlnaW5hbElkeCA9IGk7XG4gIHZhciBudW07XG4gIHZhciB6ZXJvID0gc3RyW2ldID09PSAnMSc7XG4gIGlmICh6ZXJvKSB7XG4gICAgbnVtID0gMDtcbiAgICBpKys7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5lZyA9IHN0cltpXSA9PT0gJzAnO1xuICAgIGkrKztcbiAgICB2YXIgbnVtQXNTdHJpbmcgPSAnJztcbiAgICB2YXIgbWFnQXNTdHJpbmcgPSBzdHIuc3Vic3RyaW5nKGksIGkgKyBNQUdOSVRVREVfRElHSVRTKTtcbiAgICB2YXIgbWFnbml0dWRlID0gcGFyc2VJbnQobWFnQXNTdHJpbmcsIDEwKSArIE1JTl9NQUdOSVRVREU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBtYWduaXR1ZGUgPSAtbWFnbml0dWRlO1xuICAgIH1cbiAgICBpICs9IE1BR05JVFVERV9ESUdJVFM7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBjaCA9IHN0cltpXTtcbiAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtQXNTdHJpbmcgKz0gY2g7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIG51bUFzU3RyaW5nID0gbnVtQXNTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICBpZiAobnVtQXNTdHJpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgICBudW0gPSBwYXJzZUludChudW1Bc1N0cmluZywgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW1Bc1N0cmluZ1swXSArICcuJyArIG51bUFzU3RyaW5nWzFdKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobmVnKSB7XG4gICAgICBudW0gPSBudW0gLSAxMDtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAobWFnbml0dWRlICE9PSAwKSB7XG4gICAgICAvLyBwYXJzZUZsb2F0IGlzIG1vcmUgcmVsaWFibGUgdGhhbiBwb3cgZHVlIHRvIHJvdW5kaW5nIGVycm9yc1xuICAgICAgLy8gZS5nLiBOdW1iZXIuTUFYX1ZBTFVFIHdvdWxkIHJldHVybiBJbmZpbml0eSBpZiB3ZSBkaWRcbiAgICAgIC8vIG51bSAqIE1hdGgucG93KDEwLCBtYWduaXR1ZGUpO1xuICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0gKyAnZScgKyBtYWduaXR1ZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge251bTogbnVtLCBsZW5ndGggOiBpIC0gb3JpZ2luYWxJZHh9O1xufVxuXG4vLyBtb3ZlIHVwIHRoZSBzdGFjayB3aGlsZSBwYXJzaW5nXG4vLyB0aGlzIGZ1bmN0aW9uIG1vdmVkIG91dHNpZGUgb2YgcGFyc2VJbmRleGFibGVTdHJpbmcgZm9yIHBlcmZvcm1hbmNlXG5mdW5jdGlvbiBwb3Aoc3RhY2ssIG1ldGFTdGFjaykge1xuICB2YXIgb2JqID0gc3RhY2sucG9wKCk7XG5cbiAgaWYgKG1ldGFTdGFjay5sZW5ndGgpIHtcbiAgICB2YXIgbGFzdE1ldGFFbGVtZW50ID0gbWV0YVN0YWNrW21ldGFTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgICAgLy8gcG9wcGluZyBhIG1ldGEtZWxlbWVudCwgZS5nLiBhbiBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgYW5vdGhlciBvYmplY3RcbiAgICAgIG1ldGFTdGFjay5wb3AoKTtcbiAgICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gbGFzdE1ldGFFbGVtZW50LmVsZW1lbnQ7XG4gICAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQucHVzaChvYmopO1xuICAgIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICAgIHZhciBrZXkgPSBzdGFjay5wb3AoKTtcbiAgICAgIGVsZW1lbnRba2V5XSA9IG9iajtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhY2sucHVzaChvYmopOyAvLyBvYmogd2l0aCBrZXkgb25seVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUluZGV4YWJsZVN0cmluZyhzdHIpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBtZXRhU3RhY2sgPSBbXTsgLy8gc3RhY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0c1xuICB2YXIgaSA9IDA7XG5cbiAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIGNvbGxhdGlvbkluZGV4ID0gc3RyW2krK107XG4gICAgaWYgKGNvbGxhdGlvbkluZGV4ID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLCBtZXRhU3RhY2spO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoIChjb2xsYXRpb25JbmRleCkge1xuICAgICAgY2FzZSAnMSc6XG4gICAgICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMic6XG4gICAgICAgIHN0YWNrLnB1c2goc3RyW2ldID09PSAnMScpO1xuICAgICAgICBpKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMyc6XG4gICAgICAgIHZhciBwYXJzZWROdW0gPSBwYXJzZU51bWJlcihzdHIsIGkpO1xuICAgICAgICBzdGFjay5wdXNoKHBhcnNlZE51bS5udW0pO1xuICAgICAgICBpICs9IHBhcnNlZE51bS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNCc6XG4gICAgICAgIHZhciBwYXJzZWRTdHIgPSAnJztcbiAgICAgICAgLyplc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiBbXCJlcnJvclwiLCB7IFwiY2hlY2tMb29wc1wiOiBmYWxzZSB9XSovXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIGNoID0gc3RyW2ldO1xuICAgICAgICAgIGlmIChjaCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyc2VkU3RyICs9IGNoO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBwZXJmb3JtIHRoZSByZXZlcnNlIG9mIHRoZSBvcmRlci1wcmVzZXJ2aW5nIHJlcGxhY2VtZW50XG4gICAgICAgIC8vIGFsZ29yaXRobSAoc2VlIGFib3ZlKVxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHBhcnNlZFN0ciA9IHBhcnNlZFN0ci5yZXBsYWNlKC9cXHUwMDAxXFx1MDAwMS9nLCAnXFx1MDAwMCcpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDFcXHUwMDAyL2csICdcXHUwMDAxJylcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMlxcdTAwMDIvZywgJ1xcdTAwMDInKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICAgIHN0YWNrLnB1c2gocGFyc2VkU3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc1JzpcbiAgICAgICAgdmFyIGFycmF5RWxlbWVudCA9IHsgZWxlbWVudDogW10sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChhcnJheUVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKGFycmF5RWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNic6XG4gICAgICAgIHZhciBvYmpFbGVtZW50ID0geyBlbGVtZW50OiB7fSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKG9iakVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKG9iakVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2JhZCBjb2xsYXRpb25JbmRleCBvciB1bmV4cGVjdGVkbHkgcmVhY2hlZCBlbmQgb2YgaW5wdXQ6ICcgK1xuICAgICAgICAgICAgY29sbGF0aW9uSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcnJheUNvbGxhdGUoYSwgYikge1xuICB2YXIgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBzb3J0ID0gY29sbGF0ZShhW2ldLCBiW2ldKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSA/IDAgOlxuICAgIChhLmxlbmd0aCA+IGIubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbmZ1bmN0aW9uIHN0cmluZ0NvbGxhdGUoYSwgYikge1xuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYWxlaGFydmV5L3BvdWNoZGIvaXNzdWVzLzQwXG4gIC8vIFRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENvdWNoREIgaW1wbGVtZW50YXRpb24sIGJ1dCBpdHMgdGhlXG4gIC8vIGJlc3Qgd2UgY2FuIGRvIGZvciBub3dcbiAgcmV0dXJuIChhID09PSBiKSA/IDAgOiAoKGEgPiBiKSA/IDEgOiAtMSk7XG59XG5mdW5jdGlvbiBvYmplY3RDb2xsYXRlKGEsIGIpIHtcbiAgdmFyIGFrID0gT2JqZWN0LmtleXMoYSksIGJrID0gT2JqZWN0LmtleXMoYik7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhay5sZW5ndGgsIGJrLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBGaXJzdCBzb3J0IHRoZSBrZXlzXG4gICAgdmFyIHNvcnQgPSBjb2xsYXRlKGFrW2ldLCBia1tpXSk7XG4gICAgaWYgKHNvcnQgIT09IDApIHtcbiAgICAgIHJldHVybiBzb3J0O1xuICAgIH1cbiAgICAvLyBpZiB0aGUga2V5cyBhcmUgZXF1YWwgc29ydCB0aGUgdmFsdWVzXG4gICAgc29ydCA9IGNvbGxhdGUoYVtha1tpXV0sIGJbYmtbaV1dKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuXG4gIH1cbiAgcmV0dXJuIChhay5sZW5ndGggPT09IGJrLmxlbmd0aCkgPyAwIDpcbiAgICAoYWsubGVuZ3RoID4gYmsubGVuZ3RoKSA/IDEgOiAtMTtcbn1cbi8vIFRoZSBjb2xsYXRpb24gaXMgZGVmaW5lZCBieSBlcmxhbmdzIG9yZGVyZWQgdGVybXNcbi8vIHRoZSBhdG9tcyBudWxsLCB0cnVlLCBmYWxzZSBjb21lIGZpcnN0LCB0aGVuIG51bWJlcnMsIHN0cmluZ3MsXG4vLyBhcnJheXMsIHRoZW4gb2JqZWN0c1xuLy8gbnVsbC91bmRlZmluZWQvTmFOL0luZmluaXR5Ly1JbmZpbml0eSBhcmUgYWxsIGNvbnNpZGVyZWQgbnVsbFxuZnVuY3Rpb24gY29sbGF0aW9uSW5kZXgoeCkge1xuICB2YXIgaWQgPSBbJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ3N0cmluZycsICdvYmplY3QnXTtcbiAgdmFyIGlkeCA9IGlkLmluZGV4T2YodHlwZW9mIHgpO1xuICAvL2ZhbHNlIGlmIC0xIG90aGVyd2lzZSB0cnVlLCBidXQgZmFzdCEhISExXG4gIGlmICh+aWR4KSB7XG4gICAgaWYgKHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgcmV0dXJuIDU7XG4gICAgfVxuICAgIHJldHVybiBpZHggPCAzID8gKGlkeCArIDIpIDogKGlkeCArIDMpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIDU7XG4gIH1cbn1cblxuLy8gY29udmVyc2lvbjpcbi8vIHggeXl5IHp6Li4uenpcbi8vIHggPSAwIGZvciBuZWdhdGl2ZSwgMSBmb3IgMCwgMiBmb3IgcG9zaXRpdmVcbi8vIHkgPSBleHBvbmVudCAoZm9yIG5lZ2F0aXZlIG51bWJlcnMgbmVnYXRlZCkgbW92ZWQgc28gdGhhdCBpdCdzID49IDBcbi8vIHogPSBtYW50aXNzZVxuZnVuY3Rpb24gbnVtVG9JbmRleGFibGVTdHJpbmcobnVtKSB7XG5cbiAgaWYgKG51bSA9PT0gMCkge1xuICAgIHJldHVybiAnMSc7XG4gIH1cblxuICAvLyBjb252ZXJ0IG51bWJlciB0byBleHBvbmVudGlhbCBmb3JtYXQgZm9yIGVhc2llciBhbmRcbiAgLy8gbW9yZSBzdWNjaW5jdCBzdHJpbmcgc29ydGluZ1xuICB2YXIgZXhwRm9ybWF0ID0gbnVtLnRvRXhwb25lbnRpYWwoKS5zcGxpdCgvZVxcKz8vKTtcbiAgdmFyIG1hZ25pdHVkZSA9IHBhcnNlSW50KGV4cEZvcm1hdFsxXSwgMTApO1xuXG4gIHZhciBuZWcgPSBudW0gPCAwO1xuXG4gIHZhciByZXN1bHQgPSBuZWcgPyAnMCcgOiAnMic7XG5cbiAgLy8gZmlyc3Qgc29ydCBieSBtYWduaXR1ZGVcbiAgLy8gaXQncyBlYXNpZXIgaWYgYWxsIG1hZ25pdHVkZXMgYXJlIHBvc2l0aXZlXG4gIHZhciBtYWdGb3JDb21wYXJpc29uID0gKChuZWcgPyAtbWFnbml0dWRlIDogbWFnbml0dWRlKSAtIE1JTl9NQUdOSVRVREUpO1xuICB2YXIgbWFnU3RyaW5nID0gcGFkTGVmdCgobWFnRm9yQ29tcGFyaXNvbikudG9TdHJpbmcoKSwgJzAnLCBNQUdOSVRVREVfRElHSVRTKTtcblxuICByZXN1bHQgKz0gU0VQICsgbWFnU3RyaW5nO1xuXG4gIC8vIHRoZW4gc29ydCBieSB0aGUgZmFjdG9yXG4gIHZhciBmYWN0b3IgPSBNYXRoLmFicyhwYXJzZUZsb2F0KGV4cEZvcm1hdFswXSkpOyAvLyBbMS4uMTApXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChuZWcpIHsgLy8gZm9yIG5lZ2F0aXZlIHJldmVyc2Ugb3JkZXJpbmdcbiAgICBmYWN0b3IgPSAxMCAtIGZhY3RvcjtcbiAgfVxuXG4gIHZhciBmYWN0b3JTdHIgPSBmYWN0b3IudG9GaXhlZCgyMCk7XG5cbiAgLy8gc3RyaXAgemVyb3MgZnJvbSB0aGUgZW5kXG4gIGZhY3RvclN0ciA9IGZhY3RvclN0ci5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuXG4gIHJlc3VsdCArPSBTRVAgKyBmYWN0b3JTdHI7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gY3JlYXRlIGEgY29tcGFyYXRvciBiYXNlZCBvbiB0aGUgc29ydCBvYmplY3RcbmZ1bmN0aW9uIGNyZWF0ZUZpZWxkU29ydGVyKHNvcnQpIHtcblxuICBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoZG9jKSB7XG4gICAgcmV0dXJuIHNvcnQubWFwKGZ1bmN0aW9uIChzb3J0aW5nKSB7XG4gICAgICB2YXIgZmllbGROYW1lID0gZ2V0S2V5KHNvcnRpbmcpO1xuICAgICAgdmFyIHBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgdmFyIGRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jLCBwYXJzZWRGaWVsZCk7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYVJvdywgYlJvdykge1xuICAgIHZhciBhRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYVJvdy5kb2MpO1xuICAgIHZhciBiRmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlc0FzQXJyYXkoYlJvdy5kb2MpO1xuICAgIHZhciBjb2xsYXRpb24gPSBjb2xsYXRlKGFGaWVsZFZhbHVlcywgYkZpZWxkVmFsdWVzKTtcbiAgICBpZiAoY29sbGF0aW9uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29sbGF0aW9uO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFuZ28gc2VlbXMgdG8gZG9cbiAgICByZXR1cm4gY29tcGFyZSQxKGFSb3cuZG9jLl9pZCwgYlJvdy5kb2MuX2lkKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmlsdGVySW5NZW1vcnlGaWVsZHMocm93cywgcmVxdWVzdERlZiwgaW5NZW1vcnlGaWVsZHMpIHtcbiAgcm93cyA9IHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICByZXR1cm4gcm93RmlsdGVyKHJvdy5kb2MsIHJlcXVlc3REZWYuc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKTtcbiAgfSk7XG5cbiAgaWYgKHJlcXVlc3REZWYuc29ydCkge1xuICAgIC8vIGluLW1lbW9yeSBzb3J0XG4gICAgdmFyIGZpZWxkU29ydGVyID0gY3JlYXRlRmllbGRTb3J0ZXIocmVxdWVzdERlZi5zb3J0KTtcbiAgICByb3dzID0gcm93cy5zb3J0KGZpZWxkU29ydGVyKTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3REZWYuc29ydFswXSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgZ2V0VmFsdWUocmVxdWVzdERlZi5zb3J0WzBdKSA9PT0gJ2Rlc2MnKSB7XG4gICAgICByb3dzID0gcm93cy5yZXZlcnNlKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCdsaW1pdCcgaW4gcmVxdWVzdERlZiB8fCAnc2tpcCcgaW4gcmVxdWVzdERlZikge1xuICAgIC8vIGhhdmUgdG8gZG8gdGhlIGxpbWl0IGluLW1lbW9yeVxuICAgIHZhciBza2lwID0gcmVxdWVzdERlZi5za2lwIHx8IDA7XG4gICAgdmFyIGxpbWl0ID0gKCdsaW1pdCcgaW4gcmVxdWVzdERlZiA/IHJlcXVlc3REZWYubGltaXQgOiByb3dzLmxlbmd0aCkgKyBza2lwO1xuICAgIHJvd3MgPSByb3dzLnNsaWNlKHNraXAsIGxpbWl0KTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gcm93RmlsdGVyKGRvYywgc2VsZWN0b3IsIGluTWVtb3J5RmllbGRzKSB7XG4gIHJldHVybiBpbk1lbW9yeUZpZWxkcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgbWF0Y2hlciA9IHNlbGVjdG9yW2ZpZWxkXTtcbiAgICB2YXIgcGFyc2VkRmllbGQgPSBwYXJzZUZpZWxkKGZpZWxkKTtcbiAgICB2YXIgZG9jRmllbGRWYWx1ZSA9IGdldEZpZWxkRnJvbURvYyhkb2MsIHBhcnNlZEZpZWxkKTtcbiAgICBpZiAoaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvcihmaWVsZCwgbWF0Y2hlciwgZG9jKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hTZWxlY3RvcihtYXRjaGVyLCBkb2MsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoU2VsZWN0b3IobWF0Y2hlciwgZG9jLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICBpZiAoIW1hdGNoZXIpIHtcbiAgICAvLyBubyBmaWx0ZXJpbmcgbmVjZXNzYXJ5OyB0aGlzIGZpZWxkIGlzIGp1c3QgbmVlZGVkIGZvciBzb3J0aW5nXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyBtYXRjaGVyIGFuIG9iamVjdCwgaWYgc28gY29udGludWUgcmVjdXJzaW9uXG4gIGlmICh0eXBlb2YgbWF0Y2hlciA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWF0Y2hlcikuZXZlcnkoZnVuY3Rpb24gKG1heWJlVXNlck9wZXJhdG9yKSB7XG4gICAgICB2YXIgdXNlclZhbHVlID0gbWF0Y2hlclsgbWF5YmVVc2VyT3BlcmF0b3IgXTtcbiAgICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yXG4gICAgICBpZiAobWF5YmVVc2VyT3BlcmF0b3IuaW5kZXhPZihcIiRcIikgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoKG1heWJlVXNlck9wZXJhdG9yLCBkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHN1YlBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChtYXliZVVzZXJPcGVyYXRvcik7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvY0ZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHR5cGVvZiB1c2VyVmFsdWUgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBzdWJQYXJzZWRGaWVsZC5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIG9yIGdldEZpZWxkRnJvbURvYyB3aWxsIHRocm93XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1YkRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jRmllbGRWYWx1ZSwgc3ViUGFyc2VkRmllbGQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdXNlclZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gZmllbGQgdmFsdWUgaXMgYW4gb2JqZWN0IHRoYXQgbWlnaHQgY29udGFpbiBtb3JlIG9wZXJhdG9yc1xuICAgICAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgc3ViRG9jRmllbGRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbXBsaWNpdCBvcGVyYXRvclxuICAgICAgICByZXR1cm4gbWF0Y2goXCIkZXFcIiwgZG9jLCB1c2VyVmFsdWUsIHN1YlBhcnNlZEZpZWxkLCBzdWJEb2NGaWVsZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG5vIG1vcmUgZGVwdGgsIE5vIG5lZWQgdG8gcmVjdXJzZSBmdXJ0aGVyXG4gIHJldHVybiBtYXRjaGVyID09PSBkb2NGaWVsZFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yKGZpZWxkLCBtYXRjaGVyLCBkb2MpIHtcblxuICBpZiAoZmllbGQgPT09ICckb3InKSB7XG4gICAgcmV0dXJuIG1hdGNoZXIuc29tZShmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgICAgcmV0dXJuIHJvd0ZpbHRlcihkb2MsIG9yTWF0Y2hlcnMsIE9iamVjdC5rZXlzKG9yTWF0Y2hlcnMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChmaWVsZCA9PT0gJyRub3QnKSB7XG4gICAgcmV0dXJuICFyb3dGaWx0ZXIoZG9jLCBtYXRjaGVyLCBPYmplY3Qua2V5cyhtYXRjaGVyKSk7XG4gIH1cblxuICAvL2Akbm9yYFxuICByZXR1cm4gIW1hdGNoZXIuZmluZChmdW5jdGlvbiAob3JNYXRjaGVycykge1xuICAgIHJldHVybiByb3dGaWx0ZXIoZG9jLCBvck1hdGNoZXJzLCBPYmplY3Qua2V5cyhvck1hdGNoZXJzKSk7XG4gIH0pO1xuXG59XG5cbmZ1bmN0aW9uIG1hdGNoKHVzZXJPcGVyYXRvciwgZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gIGlmICghbWF0Y2hlcnNbdXNlck9wZXJhdG9yXSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIG9wZXJhdG9yIFwiJyArIHVzZXJPcGVyYXRvciArXG4gICAgICAnXCIgLSBzaG91bGQgYmUgb25lIG9mICRlcSwgJGx0ZSwgJGx0LCAkZ3QsICRndGUsICRleGlzdHMsICRuZSwgJGluLCAnICtcbiAgICAgICckbmluLCAkc2l6ZSwgJG1vZCwgJHJlZ2V4LCAkZWxlbU1hdGNoLCAkdHlwZSwgJGFsbE1hdGNoIG9yICRhbGwnKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcnNbdXNlck9wZXJhdG9yXShkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jRmllbGRWYWx1ZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIG1vZEZpZWxkKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWUgIT09IFwibnVtYmVyXCIgfHxcbiAgICBwYXJzZUludChkb2NGaWVsZFZhbHVlLCAxMCkgIT09IGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZGl2aXNvciA9IHVzZXJWYWx1ZVswXTtcbiAgdmFyIG1vZCA9IHVzZXJWYWx1ZVsxXTtcblxuICByZXR1cm4gZG9jRmllbGRWYWx1ZSAlIGRpdmlzb3IgPT09IG1vZDtcbn1cblxuZnVuY3Rpb24gYXJyYXlDb250YWluc1ZhbHVlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICByZXR1cm4gdXNlclZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmIChkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICAgIHJldHVybiBjb2xsYXRlKHZhbCwgZG9jRmllbGRWYWx1ZUl0ZW0pID09PSAwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbGxhdGUodmFsLCBkb2NGaWVsZFZhbHVlKSA9PT0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKGRvY0ZpZWxkVmFsdWVJdGVtKSB7XG4gICAgICByZXR1cm4gY29sbGF0ZSh2YWwsIGRvY0ZpZWxkVmFsdWVJdGVtKSA9PT0gMDtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSB1c2VyVmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlZ2V4TWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHZhciByZSA9IG5ldyBSZWdFeHAodXNlclZhbHVlKTtcblxuICByZXR1cm4gcmUudGVzdChkb2NGaWVsZFZhbHVlKTtcbn1cblxuZnVuY3Rpb24gdHlwZU1hdGNoKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuXG4gIHN3aXRjaCAodXNlclZhbHVlKSB7XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZSA9PT0gbnVsbDtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnYm9vbGVhbic7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnbnVtYmVyJztcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHR5cGVvZiAoZG9jRmllbGRWYWx1ZSkgPT09ICdzdHJpbmcnO1xuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlIGluc3RhbmNlb2YgQXJyYXk7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHJldHVybiAoe30pLnRvU3RyaW5nLmNhbGwoZG9jRmllbGRWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICB9XG59XG5cbnZhciBtYXRjaGVycyA9IHtcblxuICAnJGVsZW1NYXRjaCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZG9jRmllbGRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWVbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHJvd0ZpbHRlcih2YWwsIHVzZXJWYWx1ZSwgT2JqZWN0LmtleXModXNlclZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGFsbE1hdGNoJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkb2NGaWVsZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkb2NGaWVsZFZhbHVlWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gcm93RmlsdGVyKHZhbCwgdXNlclZhbHVlLCBPYmplY3Qua2V5cyh1c2VyVmFsdWUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKHVzZXJWYWx1ZSwgZG9jLCBwYXJzZWRGaWVsZCwgdmFsKTtcbiAgICB9KTtcbiAgfSxcblxuICAnJGVxJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA9PT0gMDtcbiAgfSxcblxuICAnJGd0ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPj0gMDtcbiAgfSxcblxuICAnJGd0JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA+IDA7XG4gIH0sXG5cbiAgJyRsdGUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIDw9IDA7XG4gIH0sXG5cbiAgJyRsdCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPCAwO1xuICB9LFxuXG4gICckZXhpc3RzJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIC8vYSBmaWVsZCB0aGF0IGlzIG51bGwgaXMgc3RpbGwgY29uc2lkZXJlZCB0byBleGlzdFxuICAgIGlmICh1c2VyVmFsdWUpIHtcbiAgICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiAhZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKTtcbiAgfSxcblxuICAnJG1vZCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgbW9kRmllbGQoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5lJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKG5lVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIG5lVmFsdWUpICE9PSAwO1xuICAgIH0pO1xuICB9LFxuICAnJGluJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJiBhcnJheUNvbnRhaW5zVmFsdWUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJG5pbic6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgIWFycmF5Q29udGFpbnNWYWx1ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckc2l6ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIGFycmF5U2l6ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckYWxsJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRvY0ZpZWxkVmFsdWUpICYmIGFycmF5Q29udGFpbnNBbGxWYWx1ZXMoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJHJlZ2V4JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJlxuICAgICAgdHlwZW9mIGRvY0ZpZWxkVmFsdWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgdXNlclZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChyZWdleFZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZWdleE1hdGNoKGRvY0ZpZWxkVmFsdWUsIHJlZ2V4VmFsdWUpO1xuICAgICAgfSk7XG4gIH0sXG5cbiAgJyR0eXBlJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiB0eXBlTWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfVxufTtcblxuLy8gcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRvYyBtYXRjaGVzIHRoZSBzdXBwbGllZCBzZWxlY3RvclxuZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKGRvYywgc2VsZWN0b3IpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdvYmplY3QnKSB7XG4gICAgLy8gbWF0Y2ggdGhlIENvdWNoREIgZXJyb3IgbWVzc2FnZVxuICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0b3IgZXJyb3I6IGV4cGVjdGVkIGEgSlNPTiBvYmplY3QnKTtcbiAgfVxuXG4gIHNlbGVjdG9yID0gbWFzc2FnZVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgdmFyIHJvdyA9IHtcbiAgICAnZG9jJzogZG9jXG4gIH07XG5cbiAgdmFyIHJvd3NNYXRjaGVkID0gZmlsdGVySW5NZW1vcnlGaWVsZHMoW3Jvd10sIHsgJ3NlbGVjdG9yJzogc2VsZWN0b3IgfSwgT2JqZWN0LmtleXMoc2VsZWN0b3IpKTtcbiAgcmV0dXJuIHJvd3NNYXRjaGVkICYmIHJvd3NNYXRjaGVkLmxlbmd0aCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gZXZhbEZpbHRlcihpbnB1dCkge1xuICByZXR1cm4gc2NvcGVFdmFsKCdcInVzZSBzdHJpY3RcIjtcXG5yZXR1cm4gJyArIGlucHV0ICsgJzsnLCB7fSk7XG59XG5cbmZ1bmN0aW9uIGV2YWxWaWV3KGlucHV0KSB7XG4gIHZhciBjb2RlID0gW1xuICAgICdyZXR1cm4gZnVuY3Rpb24oZG9jKSB7JyxcbiAgICAnICBcInVzZSBzdHJpY3RcIjsnLFxuICAgICcgIHZhciBlbWl0dGVkID0gZmFsc2U7JyxcbiAgICAnICB2YXIgZW1pdCA9IGZ1bmN0aW9uIChhLCBiKSB7JyxcbiAgICAnICAgIGVtaXR0ZWQgPSB0cnVlOycsXG4gICAgJyAgfTsnLFxuICAgICcgIHZhciB2aWV3ID0gJyArIGlucHV0ICsgJzsnLFxuICAgICcgIHZpZXcoZG9jKTsnLFxuICAgICcgIGlmIChlbWl0dGVkKSB7JyxcbiAgICAnICAgIHJldHVybiB0cnVlOycsXG4gICAgJyAgfScsXG4gICAgJ307J1xuICBdLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBzY29wZUV2YWwoY29kZSwge30pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShvcHRzLCBjYWxsYmFjaykge1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciAhPT0gJ19zZWxlY3RvcicpIHtcbiAgICAgIHZhciBmaWx0ZXJOYW1lID0gdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJyA/XG4gICAgICAgIG9wdHMuZmlsdGVyIDogJ2Z1bmN0aW9uJztcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ3NlbGVjdG9yIGludmFsaWQgZm9yIGZpbHRlciBcIicgKyBmaWx0ZXJOYW1lICsgJ1wiJykpO1xuICAgIH1cbiAgfVxuICBjYWxsYmFjaygpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUob3B0cykge1xuICBpZiAob3B0cy52aWV3ICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ192aWV3JztcbiAgfVxuXG4gIGlmIChvcHRzLnNlbGVjdG9yICYmICFvcHRzLmZpbHRlcikge1xuICAgIG9wdHMuZmlsdGVyID0gJ19zZWxlY3Rvcic7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgIGlmIChvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgICAgb3B0cy52aWV3ID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMuZmlsdGVyID0gbm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMuZmlsdGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRmlsdGVyKGNoYW5nZXNIYW5kbGVyLCBvcHRzKSB7XG4gIHJldHVybiBvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdzdHJpbmcnICYmXG4gICAgIW9wdHMuZG9jX2lkcyAmJiAhaXNSZW1vdGUoY2hhbmdlc0hhbmRsZXIuZGIpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXIoY2hhbmdlc0hhbmRsZXIsIG9wdHMpIHtcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcbiAgaWYgKG9wdHMuZmlsdGVyID09PSAnX3ZpZXcnKSB7XG4gICAgaWYgKCFvcHRzLnZpZXcgfHwgdHlwZW9mIG9wdHMudmlldyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihCQURfUkVRVUVTVCxcbiAgICAgICAgJ2B2aWV3YCBmaWx0ZXIgcGFyYW1ldGVyIG5vdCBmb3VuZCBvciBpbnZhbGlkLicpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIC8vIGZldGNoIGEgdmlldyBmcm9tIGEgZGVzaWduIGRvYywgbWFrZSBpdCBiZWhhdmUgbGlrZSBhIGZpbHRlclxuICAgIHZhciB2aWV3TmFtZSA9IHBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMudmlldyk7XG4gICAgY2hhbmdlc0hhbmRsZXIuZGIuZ2V0KCdfZGVzaWduLycgKyB2aWV3TmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXBGdW4gPSBkZG9jICYmIGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0gJiZcbiAgICAgICAgZGRvYy52aWV3c1t2aWV3TmFtZVsxXV0ubWFwO1xuICAgICAgaWYgKCFtYXBGdW4pIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLFxuICAgICAgICAgIChkZG9jLnZpZXdzID8gJ21pc3NpbmcganNvbiBrZXk6ICcgKyB2aWV3TmFtZVsxXSA6XG4gICAgICAgICAgICAnbWlzc2luZyBqc29uIGtleTogdmlld3MnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsVmlldyhtYXBGdW4pO1xuICAgICAgY2hhbmdlc0hhbmRsZXIuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKG9wdHMuc2VsZWN0b3IpIHtcbiAgICBvcHRzLmZpbHRlciA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzU2VsZWN0b3IoZG9jLCBvcHRzLnNlbGVjdG9yKTtcbiAgICB9O1xuICAgIGNoYW5nZXNIYW5kbGVyLmRvQ2hhbmdlcyhvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBmZXRjaCBhIGZpbHRlciBmcm9tIGEgZGVzaWduIGRvY1xuICAgIHZhciBmaWx0ZXJOYW1lID0gcGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUob3B0cy5maWx0ZXIpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmRiLmdldCgnX2Rlc2lnbi8nICsgZmlsdGVyTmFtZVswXSwgZnVuY3Rpb24gKGVyciwgZGRvYykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlc0hhbmRsZXIuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShlcnIpKTtcbiAgICAgIH1cbiAgICAgIHZhciBmaWx0ZXJGdW4gPSBkZG9jICYmIGRkb2MuZmlsdGVycyAmJiBkZG9jLmZpbHRlcnNbZmlsdGVyTmFtZVsxXV07XG4gICAgICBpZiAoIWZpbHRlckZ1bikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsXG4gICAgICAgICAgKChkZG9jICYmIGRkb2MuZmlsdGVycykgPyAnbWlzc2luZyBqc29uIGtleTogJyArIGZpbHRlck5hbWVbMV1cbiAgICAgICAgICAgIDogJ21pc3NpbmcganNvbiBrZXk6IGZpbHRlcnMnKSkpO1xuICAgICAgfVxuICAgICAgb3B0cy5maWx0ZXIgPSBldmFsRmlsdGVyKGZpbHRlckZ1bik7XG4gICAgICBjaGFuZ2VzSGFuZGxlci5kb0NoYW5nZXMob3B0cyk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlDaGFuZ2VzRmlsdGVyUGx1Z2luKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbiA9IHtcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgbm9ybWFsaXplOiBub3JtYWxpemUsXG4gICAgc2hvdWxkRmlsdGVyOiBzaG91bGRGaWx0ZXIsXG4gICAgZmlsdGVyOiBmaWx0ZXJcbiAgfTtcbn1cblxuLy8gVE9ETzogcmVtb3ZlIGZyb20gcG91Y2hkYi1jb3JlIChicmVha2luZylcblBvdWNoREIucGx1Z2luKGFwcGx5Q2hhbmdlc0ZpbHRlclBsdWdpbik7XG5cblBvdWNoREIudmVyc2lvbiA9IHZlcnNpb247XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgaXRlbSkge1xuICAgIG9ialtpdGVtXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufVxuLy8gTGlzdCBvZiB0b3AgbGV2ZWwgcmVzZXJ2ZWQgd29yZHMgZm9yIGRvY1xudmFyIHJlc2VydmVkV29yZHMgPSB0b09iamVjdChbXG4gICdfaWQnLFxuICAnX3JldicsXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gICdfZGVsZXRlZCcsXG4gICdfcmV2aXNpb25zJyxcbiAgJ19yZXZzX2luZm8nLFxuICAnX2NvbmZsaWN0cycsXG4gICdfZGVsZXRlZF9jb25mbGljdHMnLFxuICAnX2xvY2FsX3NlcScsXG4gICdfcmV2X3RyZWUnLFxuICAvLyByZXBsaWNhdGlvbiBkb2N1bWVudHNcbiAgJ19yZXBsaWNhdGlvbl9pZCcsXG4gICdfcmVwbGljYXRpb25fc3RhdGUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3RpbWUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3JlYXNvbicsXG4gICdfcmVwbGljYXRpb25fc3RhdHMnLFxuICAvLyBTcGVjaWZpYyB0byBDb3VjaGJhc2UgU3luYyBHYXRld2F5XG4gICdfcmVtb3ZlZCdcbl0pO1xuXG4vLyBMaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgc2hvdWxkIGVuZCB1cCBpbiB0aGUgZG9jdW1lbnRcbnZhciBkYXRhV29yZHMgPSB0b09iamVjdChbXG4gICdfYWNjZXNzJyxcbiAgJ19hdHRhY2htZW50cycsXG4gIC8vIHJlcGxpY2F0aW9uIGRvY3VtZW50c1xuICAnX3JlcGxpY2F0aW9uX2lkJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfdGltZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfcmVhc29uJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0cydcbl0pO1xuXG5mdW5jdGlvbiBwYXJzZVJldmlzaW9uSW5mbyhyZXYpIHtcbiAgaWYgKCEvXlxcZCstLy50ZXN0KHJldikpIHtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3IoSU5WQUxJRF9SRVYpO1xuICB9XG4gIHZhciBpZHggPSByZXYuaW5kZXhPZignLScpO1xuICB2YXIgbGVmdCA9IHJldi5zdWJzdHJpbmcoMCwgaWR4KTtcbiAgdmFyIHJpZ2h0ID0gcmV2LnN1YnN0cmluZyhpZHggKyAxKTtcbiAgcmV0dXJuIHtcbiAgICBwcmVmaXg6IHBhcnNlSW50KGxlZnQsIDEwKSxcbiAgICBpZDogcmlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKHJldmlzaW9ucywgb3B0cykge1xuICB2YXIgcG9zID0gcmV2aXNpb25zLnN0YXJ0IC0gcmV2aXNpb25zLmlkcy5sZW5ndGggKyAxO1xuXG4gIHZhciByZXZpc2lvbklkcyA9IHJldmlzaW9ucy5pZHM7XG4gIHZhciBpZHMgPSBbcmV2aXNpb25JZHNbMF0sIG9wdHMsIFtdXTtcblxuICBmb3IgKHZhciBpID0gMSwgbGVuID0gcmV2aXNpb25JZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZHMgPSBbcmV2aXNpb25JZHNbaV0sIHtzdGF0dXM6ICdtaXNzaW5nJ30sIFtpZHNdXTtcbiAgfVxuXG4gIHJldHVybiBbe1xuICAgIHBvczogcG9zLFxuICAgIGlkczogaWRzXG4gIH1dO1xufVxuXG4vLyBQcmVwcm9jZXNzIGRvY3VtZW50cywgcGFyc2UgdGhlaXIgcmV2aXNpb25zLCBhc3NpZ24gYW4gaWQgYW5kIGFcbi8vIHJldmlzaW9uIGZvciBuZXcgd3JpdGVzIHRoYXQgYXJlIG1pc3NpbmcgdGhlbSwgZXRjXG5mdW5jdGlvbiBwYXJzZURvYyhkb2MsIG5ld0VkaXRzLCBkYk9wdHMpIHtcbiAgaWYgKCFkYk9wdHMpIHtcbiAgICBkYk9wdHMgPSB7XG4gICAgICBkZXRlcm1pbmlzdGljX3JldnM6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgdmFyIG5SZXZOdW07XG4gIHZhciBuZXdSZXZJZDtcbiAgdmFyIHJldkluZm87XG4gIHZhciBvcHRzID0ge3N0YXR1czogJ2F2YWlsYWJsZSd9O1xuICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgb3B0cy5kZWxldGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChuZXdFZGl0cykge1xuICAgIGlmICghZG9jLl9pZCkge1xuICAgICAgZG9jLl9pZCA9IHV1aWQoKTtcbiAgICB9XG4gICAgbmV3UmV2SWQgPSByZXYkJDEoZG9jLCBkYk9wdHMuZGV0ZXJtaW5pc3RpY19yZXZzKTtcbiAgICBpZiAoZG9jLl9yZXYpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IHJldkluZm8ucHJlZml4LFxuICAgICAgICBpZHM6IFtyZXZJbmZvLmlkLCB7c3RhdHVzOiAnbWlzc2luZyd9LCBbW25ld1JldklkLCBvcHRzLCBbXV1dXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gcmV2SW5mby5wcmVmaXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gW3tcbiAgICAgICAgcG9zOiAxLFxuICAgICAgICBpZHMgOiBbbmV3UmV2SWQsIG9wdHMsIFtdXVxuICAgICAgfV07XG4gICAgICBuUmV2TnVtID0gMTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRvYy5fcmV2aXNpb25zKSB7XG4gICAgICBkb2MuX3Jldl90cmVlID0gbWFrZVJldlRyZWVGcm9tUmV2aXNpb25zKGRvYy5fcmV2aXNpb25zLCBvcHRzKTtcbiAgICAgIG5SZXZOdW0gPSBkb2MuX3JldmlzaW9ucy5zdGFydDtcbiAgICAgIG5ld1JldklkID0gZG9jLl9yZXZpc2lvbnMuaWRzWzBdO1xuICAgIH1cbiAgICBpZiAoIWRvYy5fcmV2X3RyZWUpIHtcbiAgICAgIHJldkluZm8gPSBwYXJzZVJldmlzaW9uSW5mbyhkb2MuX3Jldik7XG4gICAgICBpZiAocmV2SW5mby5lcnJvcikge1xuICAgICAgICByZXR1cm4gcmV2SW5mbztcbiAgICAgIH1cbiAgICAgIG5SZXZOdW0gPSByZXZJbmZvLnByZWZpeDtcbiAgICAgIG5ld1JldklkID0gcmV2SW5mby5pZDtcbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IG5SZXZOdW0sXG4gICAgICAgIGlkczogW25ld1JldklkLCBvcHRzLCBbXV1cbiAgICAgIH1dO1xuICAgIH1cbiAgfVxuXG4gIGludmFsaWRJZEVycm9yKGRvYy5faWQpO1xuXG4gIGRvYy5fcmV2ID0gblJldk51bSArICctJyArIG5ld1JldklkO1xuXG4gIHZhciByZXN1bHQgPSB7bWV0YWRhdGEgOiB7fSwgZGF0YSA6IHt9fTtcbiAgZm9yICh2YXIga2V5IGluIGRvYykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb2MsIGtleSkpIHtcbiAgICAgIHZhciBzcGVjaWFsS2V5ID0ga2V5WzBdID09PSAnXyc7XG4gICAgICBpZiAoc3BlY2lhbEtleSAmJiAhcmVzZXJ2ZWRXb3Jkc1trZXldKSB7XG4gICAgICAgIHZhciBlcnJvciA9IGNyZWF0ZUVycm9yKERPQ19WQUxJREFUSU9OLCBrZXkpO1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gRE9DX1ZBTElEQVRJT04ubWVzc2FnZSArICc6ICcgKyBrZXk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBlbHNlIGlmIChzcGVjaWFsS2V5ICYmICFkYXRhV29yZHNba2V5XSkge1xuICAgICAgICByZXN1bHQubWV0YWRhdGFba2V5LnNsaWNlKDEpXSA9IGRvY1trZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmRhdGFba2V5XSA9IGRvY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwYXJzZUJhc2U2NChkYXRhKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXNBdG9iKGRhdGEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKEJBRF9BUkcsXG4gICAgICAnQXR0YWNobWVudCBpcyBub3QgYSB2YWxpZCBiYXNlNjQgc3RyaW5nJyk7XG4gICAgcmV0dXJuIHtlcnJvcjogZXJyfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzU3RyaW5nKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIHZhciBhc0JpbmFyeSA9IHBhcnNlQmFzZTY0KGF0dC5kYXRhKTtcbiAgaWYgKGFzQmluYXJ5LmVycm9yKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGFzQmluYXJ5LmVycm9yKTtcbiAgfVxuXG4gIGF0dC5sZW5ndGggPSBhc0JpbmFyeS5sZW5ndGg7XG4gIGlmIChibG9iVHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgYXR0LmRhdGEgPSBiaW5TdHJpbmdUb0JsdWZmZXIoYXNCaW5hcnksIGF0dC5jb250ZW50X3R5cGUpO1xuICB9IGVsc2UgaWYgKGJsb2JUeXBlID09PSAnYmFzZTY0Jykge1xuICAgIGF0dC5kYXRhID0gdGhpc0J0b2EoYXNCaW5hcnkpO1xuICB9IGVsc2UgeyAvLyBiaW5hcnlcbiAgICBhdHQuZGF0YSA9IGFzQmluYXJ5O1xuICB9XG4gIGJpbmFyeU1kNShhc0JpbmFyeSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyByZXN1bHQ7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NCbG9iKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGJpbmFyeU1kNShhdHQuZGF0YSwgZnVuY3Rpb24gKG1kNSkge1xuICAgIGF0dC5kaWdlc3QgPSAnbWQ1LScgKyBtZDU7XG4gICAgLy8gc2l6ZSBpcyBmb3IgYmxvYnMgKGJyb3dzZXIpLCBsZW5ndGggaXMgZm9yIGJ1ZmZlcnMgKG5vZGUpXG4gICAgYXR0Lmxlbmd0aCA9IGF0dC5kYXRhLnNpemUgfHwgYXR0LmRhdGEubGVuZ3RoIHx8IDA7XG4gICAgaWYgKGJsb2JUeXBlID09PSAnYmluYXJ5Jykge1xuICAgICAgYmxvYlRvQmluYXJ5U3RyaW5nKGF0dC5kYXRhLCBmdW5jdGlvbiAoYmluU3RyaW5nKSB7XG4gICAgICAgIGF0dC5kYXRhID0gYmluU3RyaW5nO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChibG9iVHlwZSA9PT0gJ2Jhc2U2NCcpIHtcbiAgICAgIGJsb2JUb0Jhc2U2NChhdHQuZGF0YSwgZnVuY3Rpb24gKGI2NCkge1xuICAgICAgICBhdHQuZGF0YSA9IGI2NDtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NBdHRhY2htZW50KGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG4gIGlmIChhdHQuc3R1Yikge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG4gIGlmICh0eXBlb2YgYXR0LmRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGlucHV0IGlzIGEgYmFzZTY0IHN0cmluZ1xuICAgIHByZXByb2Nlc3NTdHJpbmcoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spO1xuICB9IGVsc2UgeyAvLyBpbnB1dCBpcyBhIGJsb2JcbiAgICBwcmVwcm9jZXNzQmxvYihhdHQsIGJsb2JUeXBlLCBjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgY2FsbGJhY2spIHtcblxuICBpZiAoIWRvY0luZm9zLmxlbmd0aCkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgdmFyIGRvY3YgPSAwO1xuICB2YXIgb3ZlcmFsbEVycjtcblxuICBkb2NJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJbmZvKSB7XG4gICAgdmFyIGF0dGFjaG1lbnRzID0gZG9jSW5mby5kYXRhICYmIGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMgP1xuICAgICAgT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykgOiBbXTtcbiAgICB2YXIgcmVjdiA9IDA7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzZWRBdHRhY2htZW50KGVycikge1xuICAgICAgb3ZlcmFsbEVyciA9IGVycjtcbiAgICAgIHJlY3YrKztcbiAgICAgIGlmIChyZWN2ID09PSBhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMsIGtleSkpIHtcbiAgICAgICAgcHJlcHJvY2Vzc0F0dGFjaG1lbnQoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50c1trZXldLFxuICAgICAgICAgIGJsb2JUeXBlLCBwcm9jZXNzZWRBdHRhY2htZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgZG9jdisrO1xuICAgIGlmIChkb2NJbmZvcy5sZW5ndGggPT09IGRvY3YpIHtcbiAgICAgIGlmIChvdmVyYWxsRXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKG92ZXJhbGxFcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRG9jKHJldkxpbWl0LCBwcmV2LCBkb2NJbmZvLCByZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgIGksIGNiLCB3cml0ZURvYywgbmV3RWRpdHMpIHtcblxuICBpZiAocmV2RXhpc3RzKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2KSAmJiAhbmV3RWRpdHMpIHtcbiAgICByZXN1bHRzW2ldID0gZG9jSW5mbztcbiAgICByZXR1cm4gY2IoKTtcbiAgfVxuXG4gIC8vIHNvbWV0aW1lcyB0aGlzIGlzIHByZS1jYWxjdWxhdGVkLiBoaXN0b3JpY2FsbHkgbm90IGFsd2F5c1xuICB2YXIgcHJldmlvdXNXaW5uaW5nUmV2ID0gcHJldi53aW5uaW5nUmV2IHx8IHdpbm5pbmdSZXYocHJldik7XG4gIHZhciBwcmV2aW91c2x5RGVsZXRlZCA9ICdkZWxldGVkJyBpbiBwcmV2ID8gcHJldi5kZWxldGVkIDpcbiAgICBpc0RlbGV0ZWQocHJldiwgcHJldmlvdXNXaW5uaW5nUmV2KTtcbiAgdmFyIGRlbGV0ZWQgPSAnZGVsZXRlZCcgaW4gZG9jSW5mby5tZXRhZGF0YSA/IGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA6XG4gICAgaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEpO1xuICB2YXIgaXNSb290ID0gL14xLS8udGVzdChkb2NJbmZvLm1ldGFkYXRhLnJldik7XG5cbiAgaWYgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG5ld0VkaXRzICYmIGlzUm9vdCkge1xuICAgIHZhciBuZXdEb2MgPSBkb2NJbmZvLmRhdGE7XG4gICAgbmV3RG9jLl9yZXYgPSBwcmV2aW91c1dpbm5pbmdSZXY7XG4gICAgbmV3RG9jLl9pZCA9IGRvY0luZm8ubWV0YWRhdGEuaWQ7XG4gICAgZG9jSW5mbyA9IHBhcnNlRG9jKG5ld0RvYywgbmV3RWRpdHMpO1xuICB9XG5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlKHByZXYucmV2X3RyZWUsIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWVbMF0sIHJldkxpbWl0KTtcblxuICB2YXIgaW5Db25mbGljdCA9IG5ld0VkaXRzICYmICgoXG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmIGRlbGV0ZWQgJiYgbWVyZ2VkLmNvbmZsaWN0cyAhPT0gJ25ld19sZWFmJykgfHxcbiAgICAoIXByZXZpb3VzbHlEZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgIT09ICduZXdfbGVhZicpIHx8XG4gICAgKHByZXZpb3VzbHlEZWxldGVkICYmICFkZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgPT09ICduZXdfYnJhbmNoJykpKTtcblxuICBpZiAoaW5Db25mbGljdCkge1xuICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgIHJlc3VsdHNbaV0gPSBlcnI7XG4gICAgcmV0dXJuIGNiKCk7XG4gIH1cblxuICB2YXIgbmV3UmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG4gIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWUgPSBtZXJnZWQudHJlZTtcbiAgZG9jSW5mby5zdGVtbWVkUmV2cyA9IG1lcmdlZC5zdGVtbWVkUmV2cyB8fCBbXTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHByZXYucmV2X21hcCkge1xuICAgIGRvY0luZm8ubWV0YWRhdGEucmV2X21hcCA9IHByZXYucmV2X21hcDsgLy8gdXNlZCBvbmx5IGJ5IGxldmVsZGJcbiAgfVxuXG4gIC8vIHJlY2FsY3VsYXRlXG4gIHZhciB3aW5uaW5nUmV2JCQxID0gd2lubmluZ1Jldihkb2NJbmZvLm1ldGFkYXRhKTtcbiAgdmFyIHdpbm5pbmdSZXZJc0RlbGV0ZWQgPSBpc0RlbGV0ZWQoZG9jSW5mby5tZXRhZGF0YSwgd2lubmluZ1JldiQkMSk7XG5cbiAgLy8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSBhZGRlZC9yZW1vdmVkLFxuICAvLyBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0b3RhbF9yb3dzL2RvY19jb3VudFxuICB2YXIgZGVsdGEgPSAocHJldmlvdXNseURlbGV0ZWQgPT09IHdpbm5pbmdSZXZJc0RlbGV0ZWQpID8gMCA6XG4gICAgcHJldmlvdXNseURlbGV0ZWQgPCB3aW5uaW5nUmV2SXNEZWxldGVkID8gLTEgOiAxO1xuXG4gIHZhciBuZXdSZXZJc0RlbGV0ZWQ7XG4gIGlmIChuZXdSZXYgPT09IHdpbm5pbmdSZXYkJDEpIHtcbiAgICAvLyBpZiB0aGUgbmV3IHJldiBpcyB0aGUgc2FtZSBhcyB0aGUgd2lubmluZyByZXYsIHdlIGNhbiByZXVzZSB0aGF0IHZhbHVlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gd2lubmluZ1JldklzRGVsZXRlZDtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB0aGV5J3JlIG5vdCB0aGUgc2FtZSwgdGhlbiB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlXG4gICAgbmV3UmV2SXNEZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIG5ld1Jldik7XG4gIH1cblxuICB3cml0ZURvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLCBuZXdSZXZJc0RlbGV0ZWQsXG4gICAgdHJ1ZSwgZGVsdGEsIGksIGNiKTtcbn1cblxuZnVuY3Rpb24gcm9vdElzTWlzc2luZyhkb2NJbmZvKSB7XG4gIHJldHVybiBkb2NJbmZvLm1ldGFkYXRhLnJldl90cmVlWzBdLmlkc1sxXS5zdGF0dXMgPT09ICdtaXNzaW5nJztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0RvY3MocmV2TGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLCB0eCwgcmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgIHdyaXRlRG9jLCBvcHRzLCBvdmVyYWxsQ2FsbGJhY2spIHtcblxuICAvLyBEZWZhdWx0IHRvIDEwMDAgbG9jYWxseVxuICByZXZMaW1pdCA9IHJldkxpbWl0IHx8IDEwMDA7XG5cbiAgZnVuY3Rpb24gaW5zZXJ0RG9jKGRvY0luZm8sIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG4gICAgLy8gQ2FudCBpbnNlcnQgbmV3IGRlbGV0ZWQgZG9jdW1lbnRzXG4gICAgdmFyIHdpbm5pbmdSZXYkJDEgPSB3aW5uaW5nUmV2KGRvY0luZm8ubWV0YWRhdGEpO1xuICAgIHZhciBkZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEpO1xuICAgIGlmICgnd2FzX2RlbGV0ZScgaW4gb3B0cyAmJiBkZWxldGVkKSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHNJZHhdID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdkZWxldGVkJyk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvLyA0NzEyIC0gZGV0ZWN0IHdoZXRoZXIgYSBuZXcgZG9jdW1lbnQgd2FzIGluc2VydGVkIHdpdGggYSBfcmV2XG4gICAgdmFyIGluQ29uZmxpY3QgPSBuZXdFZGl0cyAmJiByb290SXNNaXNzaW5nKGRvY0luZm8pO1xuXG4gICAgaWYgKGluQ29uZmxpY3QpIHtcbiAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpO1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IGVycjtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHZhciBkZWx0YSA9IGRlbGV0ZWQgPyAwIDogMTtcblxuICAgIHdyaXRlRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQsIGRlbGV0ZWQsIGZhbHNlLFxuICAgICAgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBuZXdFZGl0cyA9IG9wdHMubmV3X2VkaXRzO1xuICB2YXIgaWRzVG9Eb2NzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgdmFyIGRvY3NEb25lID0gMDtcbiAgdmFyIGRvY3NUb0RvID0gZG9jSW5mb3MubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNoZWNrQWxsRG9jc0RvbmUoKSB7XG4gICAgaWYgKCsrZG9jc0RvbmUgPT09IGRvY3NUb0RvICYmIG92ZXJhbGxDYWxsYmFjaykge1xuICAgICAgb3ZlcmFsbENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZG9jSW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudERvYywgcmVzdWx0c0lkeCkge1xuXG4gICAgaWYgKGN1cnJlbnREb2MuX2lkICYmIGlzTG9jYWxJZChjdXJyZW50RG9jLl9pZCkpIHtcbiAgICAgIHZhciBmdW4gPSBjdXJyZW50RG9jLl9kZWxldGVkID8gJ19yZW1vdmVMb2NhbCcgOiAnX3B1dExvY2FsJztcbiAgICAgIGFwaVtmdW5dKGN1cnJlbnREb2MsIHtjdHg6IHR4fSwgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIHJlc3VsdHNbcmVzdWx0c0lkeF0gPSBlcnIgfHwgcmVzO1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaWQgPSBjdXJyZW50RG9jLm1ldGFkYXRhLmlkO1xuICAgIGlmIChpZHNUb0RvY3MuaGFzKGlkKSkge1xuICAgICAgZG9jc1RvRG8tLTsgLy8gZHVwbGljYXRlXG4gICAgICBpZHNUb0RvY3MuZ2V0KGlkKS5wdXNoKFtjdXJyZW50RG9jLCByZXN1bHRzSWR4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkc1RvRG9jcy5zZXQoaWQsIFtbY3VycmVudERvYywgcmVzdWx0c0lkeF1dKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGluIHRoZSBjYXNlIG9mIG5ld19lZGl0cywgdGhlIHVzZXIgY2FuIHByb3ZpZGUgbXVsdGlwbGUgZG9jc1xuICAvLyB3aXRoIHRoZSBzYW1lIGlkLiB0aGVzZSBuZWVkIHRvIGJlIHByb2Nlc3NlZCBzZXF1ZW50aWFsbHlcbiAgaWRzVG9Eb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvY3MsIGlkKSB7XG4gICAgdmFyIG51bURvbmUgPSAwO1xuXG4gICAgZnVuY3Rpb24gZG9jV3JpdHRlbigpIHtcbiAgICAgIGlmICgrK251bURvbmUgPCBkb2NzLmxlbmd0aCkge1xuICAgICAgICBuZXh0RG9jKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0FsbERvY3NEb25lKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5leHREb2MoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBkb2NzW251bURvbmVdO1xuICAgICAgdmFyIGN1cnJlbnREb2MgPSB2YWx1ZVswXTtcbiAgICAgIHZhciByZXN1bHRzSWR4ID0gdmFsdWVbMV07XG5cbiAgICAgIGlmIChmZXRjaGVkRG9jcy5oYXMoaWQpKSB7XG4gICAgICAgIHVwZGF0ZURvYyhyZXZMaW1pdCwgZmV0Y2hlZERvY3MuZ2V0KGlkKSwgY3VycmVudERvYywgcmVzdWx0cyxcbiAgICAgICAgICByZXN1bHRzSWR4LCBkb2NXcml0dGVuLCB3cml0ZURvYywgbmV3RWRpdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRW5zdXJlIHN0ZW1taW5nIGFwcGxpZXMgdG8gbmV3IHdyaXRlcyBhcyB3ZWxsXG4gICAgICAgIHZhciBtZXJnZWQgPSBtZXJnZShbXSwgY3VycmVudERvYy5tZXRhZGF0YS5yZXZfdHJlZVswXSwgcmV2TGltaXQpO1xuICAgICAgICBjdXJyZW50RG9jLm1ldGFkYXRhLnJldl90cmVlID0gbWVyZ2VkLnRyZWU7XG4gICAgICAgIGN1cnJlbnREb2Muc3RlbW1lZFJldnMgPSBtZXJnZWQuc3RlbW1lZFJldnMgfHwgW107XG4gICAgICAgIGluc2VydERvYyhjdXJyZW50RG9jLCByZXN1bHRzSWR4LCBkb2NXcml0dGVuKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbmV4dERvYygpO1xuICB9KTtcbn1cblxuLy8gSW5kZXhlZERCIHJlcXVpcmVzIGEgdmVyc2lvbmVkIGRhdGFiYXNlIHN0cnVjdHVyZSwgc28gd2UgdXNlIHRoZVxuLy8gdmVyc2lvbiBoZXJlIHRvIG1hbmFnZSBtaWdyYXRpb25zLlxudmFyIEFEQVBURVJfVkVSU0lPTiA9IDU7XG5cbi8vIFRoZSBvYmplY3Qgc3RvcmVzIGNyZWF0ZWQgZm9yIGVhY2ggZGF0YWJhc2Vcbi8vIERPQ19TVE9SRSBzdG9yZXMgdGhlIGRvY3VtZW50IG1ldGEgZGF0YSwgaXRzIHJldmlzaW9uIGhpc3RvcnkgYW5kIHN0YXRlXG4vLyBLZXllZCBieSBkb2N1bWVudCBpZFxudmFyIERPQ19TVE9SRSA9ICdkb2N1bWVudC1zdG9yZSc7XG4vLyBCWV9TRVFfU1RPUkUgc3RvcmVzIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQsIGtleWVkIGJ5IGl0c1xuLy8gc2VxdWVuY2UgaWRcbnZhciBCWV9TRVFfU1RPUkUgPSAnYnktc2VxdWVuY2UnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgYXR0YWNobWVudHNcbnZhciBBVFRBQ0hfU1RPUkUgPSAnYXR0YWNoLXN0b3JlJztcbi8vIFdoZXJlIHdlIHN0b3JlIG1hbnktdG8tbWFueSByZWxhdGlvbnNcbi8vIGJldHdlZW4gYXR0YWNobWVudCBkaWdlc3RzIGFuZCBzZXFzXG52YXIgQVRUQUNIX0FORF9TRVFfU1RPUkUgPSAnYXR0YWNoLXNlcS1zdG9yZSc7XG5cbi8vIFdoZXJlIHdlIHN0b3JlIGRhdGFiYXNlLXdpZGUgbWV0YSBkYXRhIGluIGEgc2luZ2xlIHJlY29yZFxuLy8ga2V5ZWQgYnkgaWQ6IE1FVEFfU1RPUkVcbnZhciBNRVRBX1NUT1JFID0gJ21ldGEtc3RvcmUnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgbG9jYWwgZG9jdW1lbnRzXG52YXIgTE9DQUxfU1RPUkUgPSAnbG9jYWwtc3RvcmUnO1xuLy8gV2hlcmUgd2UgZGV0ZWN0IGJsb2Igc3VwcG9ydFxudmFyIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUgPSAnZGV0ZWN0LWJsb2Itc3VwcG9ydCc7XG5cbmZ1bmN0aW9uIHNhZmVKc29uUGFyc2Uoc3RyKSB7XG4gIC8vIFRoaXMgdHJ5L2NhdGNoIGd1YXJkcyBhZ2FpbnN0IHN0YWNrIG92ZXJmbG93IGVycm9ycy5cbiAgLy8gSlNPTi5wYXJzZSgpIGlzIGZhc3RlciB0aGFuIHZ1dnV6ZWxhLnBhcnNlKCkgYnV0IHZ1dnV6ZWxhXG4gIC8vIGNhbm5vdCBvdmVyZmxvdy5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEucGFyc2Uoc3RyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlSnNvblN0cmluZ2lmeShqc29uKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdnV2dXplbGEuc3RyaW5naWZ5KGpzb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlkYkVycm9yKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAndW5rbm93bl9lcnJvcic7XG4gICAgaWYgKGV2dC50YXJnZXQgJiYgZXZ0LnRhcmdldC5lcnJvcikge1xuICAgICAgbWVzc2FnZSA9IGV2dC50YXJnZXQuZXJyb3IubmFtZSB8fCBldnQudGFyZ2V0LmVycm9yLm1lc3NhZ2U7XG4gICAgfVxuICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUiwgbWVzc2FnZSwgZXZ0LnR5cGUpKTtcbiAgfTtcbn1cblxuLy8gVW5mb3J0dW5hdGVseSwgdGhlIG1ldGFkYXRhIGhhcyB0byBiZSBzdHJpbmdpZmllZFxuLy8gd2hlbiBpdCBpcyBwdXQgaW50byB0aGUgZGF0YWJhc2UsIGJlY2F1c2Ugb3RoZXJ3aXNlXG4vLyBJbmRleGVkREIgY2FuIHRocm93IGVycm9ycyBmb3IgZGVlcGx5LW5lc3RlZCBvYmplY3RzLlxuLy8gT3JpZ2luYWxseSB3ZSBqdXN0IHVzZWQgSlNPTi5wYXJzZS9KU09OLnN0cmluZ2lmeTsgbm93XG4vLyB3ZSB1c2UgdGhpcyBjdXN0b20gdnV2dXplbGEgbGlicmFyeSB0aGF0IGF2b2lkcyByZWN1cnNpb24uXG4vLyBJZiB3ZSBjb3VsZCBkbyBpdCBhbGwgb3ZlciBhZ2Fpbiwgd2UnZCBwcm9iYWJseSB1c2UgYVxuLy8gZm9ybWF0IGZvciB0aGUgcmV2aXNpb24gdHJlZXMgb3RoZXIgdGhhbiBKU09OLlxuZnVuY3Rpb24gZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYsIGRlbGV0ZWQpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBzYWZlSnNvblN0cmluZ2lmeShtZXRhZGF0YSksXG4gICAgd2lubmluZ1Jldjogd2lubmluZ1JldixcbiAgICBkZWxldGVkT3JMb2NhbDogZGVsZXRlZCA/ICcxJyA6ICcwJyxcbiAgICBzZXE6IG1ldGFkYXRhLnNlcSwgLy8gaGlnaGVzdCBzZXEgZm9yIHRoaXMgZG9jXG4gICAgaWQ6IG1ldGFkYXRhLmlkXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlY29kZU1ldGFkYXRhKHN0b3JlZE9iamVjdCkge1xuICBpZiAoIXN0b3JlZE9iamVjdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBtZXRhZGF0YSA9IHNhZmVKc29uUGFyc2Uoc3RvcmVkT2JqZWN0LmRhdGEpO1xuICBtZXRhZGF0YS53aW5uaW5nUmV2ID0gc3RvcmVkT2JqZWN0Lndpbm5pbmdSZXY7XG4gIG1ldGFkYXRhLmRlbGV0ZWQgPSBzdG9yZWRPYmplY3QuZGVsZXRlZE9yTG9jYWwgPT09ICcxJztcbiAgbWV0YWRhdGEuc2VxID0gc3RvcmVkT2JqZWN0LnNlcTtcbiAgcmV0dXJuIG1ldGFkYXRhO1xufVxuXG4vLyByZWFkIHRoZSBkb2MgYmFjayBvdXQgZnJvbSB0aGUgZGF0YWJhc2UuIHdlIGRvbid0IHN0b3JlIHRoZVxuLy8gX2lkIG9yIF9yZXYgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgX2RvY19pZF9yZXYuXG5mdW5jdGlvbiBkZWNvZGVEb2MoZG9jKSB7XG4gIGlmICghZG9jKSB7XG4gICAgcmV0dXJuIGRvYztcbiAgfVxuICB2YXIgaWR4ID0gZG9jLl9kb2NfaWRfcmV2Lmxhc3RJbmRleE9mKCc6Jyk7XG4gIGRvYy5faWQgPSBkb2MuX2RvY19pZF9yZXYuc3Vic3RyaW5nKDAsIGlkeCAtIDEpO1xuICBkb2MuX3JldiA9IGRvYy5fZG9jX2lkX3Jldi5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gIGRlbGV0ZSBkb2MuX2RvY19pZF9yZXY7XG4gIHJldHVybiBkb2M7XG59XG5cbi8vIFJlYWQgYSBibG9iIGZyb20gdGhlIGRhdGFiYXNlLCBlbmNvZGluZyBhcyBuZWNlc3Nhcnlcbi8vIGFuZCB0cmFuc2xhdGluZyBmcm9tIGJhc2U2NCBpZiB0aGUgSURCIGRvZXNuJ3Qgc3VwcG9ydFxuLy8gbmF0aXZlIEJsb2JzXG5mdW5jdGlvbiByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgYXNCbG9iLCBjYWxsYmFjaykge1xuICBpZiAoYXNCbG9iKSB7XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjayhjcmVhdGVCbG9iKFsnJ10sIHt0eXBlOiB0eXBlfSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnKSB7IC8vIHdlIGhhdmUgYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9IGVsc2UgeyAvLyBubyBibG9iIHN1cHBvcnRcbiAgICAgIGNhbGxiYWNrKGI2NFRvQmx1ZmZlcihib2R5LCB0eXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBhcyBiYXNlNjQgc3RyaW5nXG4gICAgaWYgKCFib2R5KSB7XG4gICAgICBjYWxsYmFjaygnJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHsgLy8gd2UgaGF2ZSBibG9iIHN1cHBvcnRcbiAgICAgIHJlYWRBc0JpbmFyeVN0cmluZyhib2R5LCBmdW5jdGlvbiAoYmluYXJ5KSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXNCdG9hKGJpbmFyeSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHsgLy8gbm8gYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhib2R5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRhY2htZW50c0lmTmVjZXNzYXJ5KGRvYywgb3B0cywgdHhuLCBjYikge1xuICB2YXIgYXR0YWNobWVudHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgaWYgKCFhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2IgJiYgY2IoKTtcbiAgfVxuICB2YXIgbnVtRG9uZSA9IDA7XG5cbiAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgIGlmICgrK251bURvbmUgPT09IGF0dGFjaG1lbnRzLmxlbmd0aCAmJiBjYikge1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnQoZG9jLCBhdHQpIHtcbiAgICB2YXIgYXR0T2JqID0gZG9jLl9hdHRhY2htZW50c1thdHRdO1xuICAgIHZhciBkaWdlc3QgPSBhdHRPYmouZGlnZXN0O1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKS5nZXQoZGlnZXN0KTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGF0dE9iai5ib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICBjaGVja0RvbmUoKTtcbiAgICB9O1xuICB9XG5cbiAgYXR0YWNobWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYXR0KSB7XG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIGZldGNoQXR0YWNobWVudChkb2MsIGF0dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYy5fYXR0YWNobWVudHNbYXR0XS5zdHViID0gdHJ1ZTtcbiAgICAgIGNoZWNrRG9uZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIElEQi1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBuZWNlc3NhcnkgYmVjYXVzZVxuLy8gd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHdlIHN0b3JlZCBhIHRydWUgQmxvYiBvclxuLy8gYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcsIGFuZCBpZiBpdCdzIGEgQmxvYiBpdFxuLy8gbmVlZHMgdG8gYmUgcmVhZCBvdXRzaWRlIG9mIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG5mdW5jdGlvbiBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIGFzQmxvYikge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgIGlmIChyb3cuZG9jICYmIHJvdy5kb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICB2YXIgYXR0TmFtZXMgPSBPYmplY3Qua2V5cyhyb3cuZG9jLl9hdHRhY2htZW50cyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYXR0TmFtZXMubWFwKGZ1bmN0aW9uIChhdHQpIHtcbiAgICAgICAgdmFyIGF0dE9iaiA9IHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF07XG4gICAgICAgIGlmICghKCdib2R5JyBpbiBhdHRPYmopKSB7IC8vIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib2R5ID0gYXR0T2JqLmJvZHk7XG4gICAgICAgIHZhciB0eXBlID0gYXR0T2JqLmNvbnRlbnRfdHlwZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVhZEJsb2JEYXRhKGJvZHksIHR5cGUsIGFzQmxvYiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHJvdy5kb2MuX2F0dGFjaG1lbnRzW2F0dF0gPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oXG4gICAgICAgICAgICAgIHBpY2soYXR0T2JqLCBbJ2RpZ2VzdCcsICdjb250ZW50X3R5cGUnXSksXG4gICAgICAgICAgICAgIHtkYXRhOiBkYXRhfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhY3RSZXZzKHJldnMsIGRvY0lkLCB0eG4pIHtcblxuICB2YXIgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMgPSBbXTtcbiAgdmFyIHNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gIHZhciBhdHRTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpO1xuICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICB2YXIgY291bnQgPSByZXZzLmxlbmd0aDtcblxuICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgY291bnQtLTtcbiAgICBpZiAoIWNvdW50KSB7IC8vIGRvbmUgcHJvY2Vzc2luZyBhbGwgcmV2c1xuICAgICAgZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZU9ycGhhbmVkQXR0YWNobWVudHMoKSB7XG4gICAgaWYgKCFwb3NzaWJseU9ycGhhbmVkRGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMuZm9yRWFjaChmdW5jdGlvbiAoZGlnZXN0KSB7XG4gICAgICB2YXIgY291bnRSZXEgPSBhdHRBbmRTZXFTdG9yZS5pbmRleCgnZGlnZXN0U2VxJykuY291bnQoXG4gICAgICAgIElEQktleVJhbmdlLmJvdW5kKFxuICAgICAgICAgIGRpZ2VzdCArICc6OicsIGRpZ2VzdCArICc6OlxcdWZmZmYnLCBmYWxzZSwgZmFsc2UpKTtcbiAgICAgIGNvdW50UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjb3VudCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgIC8vIG9ycGhhbmVkXG4gICAgICAgICAgYXR0U3RvcmUuZGVsZXRlKGRpZ2VzdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXZzLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgIHZhciBrZXkgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICBpbmRleC5nZXRLZXkoa2V5KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHNlcSA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0eXBlb2Ygc2VxICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gY2hlY2tEb25lKCk7XG4gICAgICB9XG4gICAgICBzZXFTdG9yZS5kZWxldGUoc2VxKTtcblxuICAgICAgdmFyIGN1cnNvciA9IGF0dEFuZFNlcVN0b3JlLmluZGV4KCdzZXEnKVxuICAgICAgICAub3BlbkN1cnNvcihJREJLZXlSYW5nZS5vbmx5KHNlcSkpO1xuXG4gICAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgdmFyIGRpZ2VzdCA9IGN1cnNvci52YWx1ZS5kaWdlc3RTZXEuc3BsaXQoJzo6JylbMF07XG4gICAgICAgICAgcG9zc2libHlPcnBoYW5lZERpZ2VzdHMucHVzaChkaWdlc3QpO1xuICAgICAgICAgIGF0dEFuZFNlcVN0b3JlLmRlbGV0ZShjdXJzb3IucHJpbWFyeUtleSk7XG4gICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIGRvbmVcbiAgICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCBtb2RlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4bjogaWRiLnRyYW5zYWN0aW9uKHN0b3JlcywgbW9kZSlcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVyclxuICAgIH07XG4gIH1cbn1cblxudmFyIGNoYW5nZXNIYW5kbGVyID0gbmV3IENoYW5nZXMoKTtcblxuZnVuY3Rpb24gaWRiQnVsa0RvY3MoZGJPcHRzLCByZXEsIG9wdHMsIGFwaSwgaWRiLCBjYWxsYmFjaykge1xuICB2YXIgZG9jSW5mb3MgPSByZXEuZG9jcztcbiAgdmFyIHR4bjtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGF0dGFjaFN0b3JlO1xuICB2YXIgYXR0YWNoQW5kU2VxU3RvcmU7XG4gIHZhciBtZXRhU3RvcmU7XG4gIHZhciBkb2NJbmZvRXJyb3I7XG4gIHZhciBtZXRhRG9jO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkb2NJbmZvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBkb2MgPSBkb2NJbmZvc1tpXTtcbiAgICBpZiAoZG9jLl9pZCAmJiBpc0xvY2FsSWQoZG9jLl9pZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBkb2MgPSBkb2NJbmZvc1tpXSA9IHBhcnNlRG9jKGRvYywgb3B0cy5uZXdfZWRpdHMsIGRiT3B0cyk7XG4gICAgaWYgKGRvYy5lcnJvciAmJiAhZG9jSW5mb0Vycm9yKSB7XG4gICAgICBkb2NJbmZvRXJyb3IgPSBkb2M7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRvY0luZm9FcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFjayhkb2NJbmZvRXJyb3IpO1xuICB9XG5cbiAgdmFyIGFsbERvY3NQcm9jZXNzZWQgPSBmYWxzZTtcbiAgdmFyIGRvY0NvdW50RGVsdGEgPSAwO1xuICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShkb2NJbmZvcy5sZW5ndGgpO1xuICB2YXIgZmV0Y2hlZERvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgdmFyIHByZWNvbmRpdGlvbkVycm9yZWQgPSBmYWxzZTtcbiAgdmFyIGJsb2JUeXBlID0gYXBpLl9tZXRhLmJsb2JTdXBwb3J0ID8gJ2Jsb2InIDogJ2Jhc2U2NCc7XG5cbiAgcHJlcHJvY2Vzc0F0dGFjaG1lbnRzKGRvY0luZm9zLCBibG9iVHlwZSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICBzdGFydFRyYW5zYWN0aW9uKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oKSB7XG5cbiAgICB2YXIgc3RvcmVzID0gW1xuICAgICAgRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBMT0NBTF9TVE9SRSwgQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICBNRVRBX1NUT1JFXG4gICAgXTtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgdHhuLm9udGltZW91dCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICB0eG4ub25jb21wbGV0ZSA9IGNvbXBsZXRlO1xuICAgIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgYnlTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgIGF0dGFjaFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSk7XG4gICAgYXR0YWNoQW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuICAgIG1ldGFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKTtcblxuICAgIG1ldGFTdG9yZS5nZXQoTUVUQV9TVE9SRSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFEb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcbiAgICB9O1xuXG4gICAgdmVyaWZ5QXR0YWNobWVudHMoZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBwcmVjb25kaXRpb25FcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICBmZXRjaEV4aXN0aW5nRG9jcygpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25BbGxEb2NzUHJvY2Vzc2VkKCkge1xuICAgIGFsbERvY3NQcm9jZXNzZWQgPSB0cnVlO1xuICAgIHVwZGF0ZURvY0NvdW50SWZSZWFkeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaWRiUHJvY2Vzc0RvY3MoKSB7XG4gICAgcHJvY2Vzc0RvY3MoZGJPcHRzLnJldnNfbGltaXQsIGRvY0luZm9zLCBhcGksIGZldGNoZWREb2NzLFxuICAgICAgICAgICAgICAgIHR4biwgcmVzdWx0cywgd3JpdGVEb2MsIG9wdHMsIG9uQWxsRG9jc1Byb2Nlc3NlZCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVEb2NDb3VudElmUmVhZHkoKSB7XG4gICAgaWYgKCFtZXRhRG9jIHx8ICFhbGxEb2NzUHJvY2Vzc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNhY2hpbmcgdGhlIGRvY0NvdW50IHNhdmVzIGEgbG90IG9mIHRpbWUgaW4gYWxsRG9jcygpIGFuZFxuICAgIC8vIGluZm8oKSwgd2hpY2ggaXMgd2h5IHdlIGdvIHRvIGFsbCB0aGUgdHJvdWJsZSBvZiBkb2luZyB0aGlzXG4gICAgbWV0YURvYy5kb2NDb3VudCArPSBkb2NDb3VudERlbHRhO1xuICAgIG1ldGFTdG9yZS5wdXQobWV0YURvYyk7XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEV4aXN0aW5nRG9jcygpIHtcblxuICAgIGlmICghZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG51bUZldGNoZWQgPSAwO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgICAgaWYgKCsrbnVtRmV0Y2hlZCA9PT0gZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIGlkYlByb2Nlc3NEb2NzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGV2ZW50KSB7XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShldmVudC50YXJnZXQucmVzdWx0KTtcblxuICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgIGZldGNoZWREb2NzLnNldChtZXRhZGF0YS5pZCwgbWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgY2hlY2tEb25lKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRvY0luZm9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZG9jSW5mbyA9IGRvY0luZm9zW2ldO1xuICAgICAgaWYgKGRvY0luZm8uX2lkICYmIGlzTG9jYWxJZChkb2NJbmZvLl9pZCkpIHtcbiAgICAgICAgY2hlY2tEb25lKCk7IC8vIHNraXAgbG9jYWwgZG9jc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5nZXQoZG9jSW5mby5tZXRhZGF0YS5pZCk7XG4gICAgICByZXEub25zdWNjZXNzID0gcmVhZE1ldGFkYXRhO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgIGlmIChwcmVjb25kaXRpb25FcnJvcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGFwaS5fbWV0YS5uYW1lKTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBjYWxsYmFjaykge1xuXG4gICAgdmFyIHJlcSA9IGF0dGFjaFN0b3JlLmdldChkaWdlc3QpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlLnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfU1RVQixcbiAgICAgICAgICAndW5rbm93biBzdHViIGF0dGFjaG1lbnQgd2l0aCBkaWdlc3QgJyArXG4gICAgICAgICAgZGlnZXN0KTtcbiAgICAgICAgZXJyLnN0YXR1cyA9IDQxMjtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZlcmlmeUF0dGFjaG1lbnRzKGZpbmlzaCkge1xuXG5cbiAgICB2YXIgZGlnZXN0cyA9IFtdO1xuICAgIGRvY0luZm9zLmZvckVhY2goZnVuY3Rpb24gKGRvY0luZm8pIHtcbiAgICAgIGlmIChkb2NJbmZvLmRhdGEgJiYgZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykge1xuICAgICAgICBPYmplY3Qua2V5cyhkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXTtcbiAgICAgICAgICBpZiAoYXR0LnN0dWIpIHtcbiAgICAgICAgICAgIGRpZ2VzdHMucHVzaChhdHQuZGlnZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICB9XG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBlcnI7XG5cbiAgICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgICBpZiAoKytudW1Eb25lID09PSBkaWdlc3RzLmxlbmd0aCkge1xuICAgICAgICBmaW5pc2goZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZGlnZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChkaWdlc3QpIHtcbiAgICAgIHZlcmlmeUF0dGFjaG1lbnQoZGlnZXN0LCBmdW5jdGlvbiAoYXR0RXJyKSB7XG4gICAgICAgIGlmIChhdHRFcnIgJiYgIWVycikge1xuICAgICAgICAgIGVyciA9IGF0dEVycjtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCwgbmV3UmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICBpc1VwZGF0ZSwgZGVsdGEsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICBkb2NJbmZvLm1ldGFkYXRhLndpbm5pbmdSZXYgPSB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0luZm8ubWV0YWRhdGEuZGVsZXRlZCA9IHdpbm5pbmdSZXZJc0RlbGV0ZWQ7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIGRvYy5faWQgPSBkb2NJbmZvLm1ldGFkYXRhLmlkO1xuICAgIGRvYy5fcmV2ID0gZG9jSW5mby5tZXRhZGF0YS5yZXY7XG5cbiAgICBpZiAobmV3UmV2SXNEZWxldGVkKSB7XG4gICAgICBkb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBoYXNBdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHMgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpLmxlbmd0aDtcbiAgICBpZiAoaGFzQXR0YWNobWVudHMpIHtcbiAgICAgIHJldHVybiB3cml0ZUF0dGFjaG1lbnRzKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZG9jQ291bnREZWx0YSArPSBkZWx0YTtcbiAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcblxuICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuICAgIHZhciBtZXRhZGF0YSA9IGRvY0luZm8ubWV0YWRhdGE7XG5cbiAgICBkb2MuX2RvY19pZF9yZXYgPSBtZXRhZGF0YS5pZCArICc6OicgKyBtZXRhZGF0YS5yZXY7XG4gICAgZGVsZXRlIGRvYy5faWQ7XG4gICAgZGVsZXRlIGRvYy5fcmV2O1xuXG4gICAgZnVuY3Rpb24gYWZ0ZXJQdXREb2MoZSkge1xuICAgICAgdmFyIHJldnNUb0RlbGV0ZSA9IGRvY0luZm8uc3RlbW1lZFJldnMgfHwgW107XG5cbiAgICAgIGlmIChpc1VwZGF0ZSAmJiBhcGkuYXV0b19jb21wYWN0aW9uKSB7XG4gICAgICAgIHJldnNUb0RlbGV0ZSA9IHJldnNUb0RlbGV0ZS5jb25jYXQoY29tcGFjdFRyZWUoZG9jSW5mby5tZXRhZGF0YSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV2c1RvRGVsZXRlICYmIHJldnNUb0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgY29tcGFjdFJldnMocmV2c1RvRGVsZXRlLCBkb2NJbmZvLm1ldGFkYXRhLmlkLCB0eG4pO1xuICAgICAgfVxuXG4gICAgICBtZXRhZGF0YS5zZXEgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAvLyBDdXJyZW50IF9yZXYgaXMgY2FsY3VsYXRlZCBmcm9tIF9yZXZfdHJlZSBvbiByZWFkXG4gICAgICAvLyBkZWxldGUgbWV0YWRhdGEucmV2O1xuICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLCB3aW5uaW5nUmV2JCQxLFxuICAgICAgICB3aW5uaW5nUmV2SXNEZWxldGVkKTtcbiAgICAgIHZhciBtZXRhRGF0YVJlcSA9IGRvY1N0b3JlLnB1dChtZXRhZGF0YVRvU3RvcmUpO1xuICAgICAgbWV0YURhdGFSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXRNZXRhZGF0YTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dERvY0Vycm9yKGUpIHtcbiAgICAgIC8vIENvbnN0cmFpbnRFcnJvciwgbmVlZCB0byB1cGRhdGUsIG5vdCBwdXQgKHNlZSAjMTYzOCBmb3IgZGV0YWlscylcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gYWJvcnRcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIHZhciBpbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG4gICAgICB2YXIgZ2V0S2V5UmVxID0gaW5kZXguZ2V0S2V5KGRvYy5fZG9jX2lkX3Jldik7XG4gICAgICBnZXRLZXlSZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYywgZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgcHV0UmVxLm9uc3VjY2VzcyA9IGFmdGVyUHV0RG9jO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dE1ldGFkYXRhKCkge1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgICAgcmV2OiBtZXRhZGF0YS5yZXZcbiAgICAgIH07XG4gICAgICBmZXRjaGVkRG9jcy5zZXQoZG9jSW5mby5tZXRhZGF0YS5pZCwgZG9jSW5mby5tZXRhZGF0YSk7XG4gICAgICBpbnNlcnRBdHRhY2htZW50TWFwcGluZ3MoZG9jSW5mbywgbWV0YWRhdGEuc2VxLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgdmFyIHB1dFJlcSA9IGJ5U2VxU3RvcmUucHV0KGRvYyk7XG5cbiAgICBwdXRSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXREb2M7XG4gICAgcHV0UmVxLm9uZXJyb3IgPSBhZnRlclB1dERvY0Vycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVBdHRhY2htZW50cyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjaykge1xuXG5cbiAgICB2YXIgZG9jID0gZG9jSW5mby5kYXRhO1xuXG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIHZhciBhdHRhY2htZW50cyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuXG4gICAgZnVuY3Rpb24gY29sbGVjdFJlc3VsdHMoKSB7XG4gICAgICBpZiAobnVtRG9uZSA9PT0gYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmlzaERvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXR0YWNobWVudFNhdmVkKCkge1xuICAgICAgbnVtRG9uZSsrO1xuICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICB9XG5cbiAgICBhdHRhY2htZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhdHQgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2tleV07XG4gICAgICBpZiAoIWF0dC5zdHViKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXR0LmRhdGE7XG4gICAgICAgIGRlbGV0ZSBhdHQuZGF0YTtcbiAgICAgICAgYXR0LnJldnBvcyA9IHBhcnNlSW50KHdpbm5pbmdSZXYkJDEsIDEwKTtcbiAgICAgICAgdmFyIGRpZ2VzdCA9IGF0dC5kaWdlc3Q7XG4gICAgICAgIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgYXR0YWNobWVudFNhdmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bURvbmUrKztcbiAgICAgICAgY29sbGVjdFJlc3VsdHMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIG1hcCBzZXFzIHRvIGF0dGFjaG1lbnQgZGlnZXN0cywgd2hpY2hcbiAgLy8gd2Ugd2lsbCBuZWVkIGxhdGVyIGR1cmluZyBjb21wYWN0aW9uXG4gIGZ1bmN0aW9uIGluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyhkb2NJbmZvLCBzZXEsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgYXR0c0FkZGVkID0gMDtcbiAgICB2YXIgYXR0c1RvQWRkID0gT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cyB8fCB7fSk7XG5cbiAgICBpZiAoIWF0dHNUb0FkZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICAgIGlmICgrK2F0dHNBZGRlZCA9PT0gYXR0c1RvQWRkLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZChhdHQpIHtcbiAgICAgIHZhciBkaWdlc3QgPSBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2F0dF0uZGlnZXN0O1xuICAgICAgdmFyIHJlcSA9IGF0dGFjaEFuZFNlcVN0b3JlLnB1dCh7XG4gICAgICAgIHNlcTogc2VxLFxuICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgIH0pO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gY2hlY2tEb25lO1xuICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGZvciBhIGNvbnN0YWludCBlcnJvciwgd2hpY2ggd2UgaWdub3JlXG4gICAgICAgIC8vIGJlY2F1c2UgdGhpcyBkb2NpZC9yZXYgaGFzIGFscmVhZHkgYmVlbiBhc3NvY2lhdGVkIHdpdGhcbiAgICAgICAgLy8gdGhlIGRpZ2VzdCAoZS5nLiB3aGVuIG5ld19lZGl0cyA9PSBmYWxzZSlcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBhYm9ydFxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBvbmVycm9yXG4gICAgICAgIGNoZWNrRG9uZSgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRzVG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChhdHRzVG9BZGRbaV0pOyAvLyBkbyBpbiBwYXJhbGxlbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVBdHRhY2htZW50KGRpZ2VzdCwgZGF0YSwgY2FsbGJhY2spIHtcblxuXG4gICAgdmFyIGdldEtleVJlcSA9IGF0dGFjaFN0b3JlLmNvdW50KGRpZ2VzdCk7XG4gICAgZ2V0S2V5UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY291bnQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7IC8vIGFscmVhZHkgZXhpc3RzXG4gICAgICB9XG4gICAgICB2YXIgbmV3QXR0ID0ge1xuICAgICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgICAgYm9keTogZGF0YVxuICAgICAgfTtcbiAgICAgIHZhciBwdXRSZXEgPSBhdHRhY2hTdG9yZS5wdXQobmV3QXR0KTtcbiAgICAgIHB1dFJlcS5vbnN1Y2Nlc3MgPSBjYWxsYmFjaztcbiAgICB9O1xuICB9XG59XG5cbi8vIEFic3RyYWN0aW9uIG92ZXIgSURCQ3Vyc29yIGFuZCBnZXRBbGwoKS9nZXRBbGxLZXlzKCkgdGhhdCBhbGxvd3MgdXMgdG8gYmF0Y2ggb3VyIG9wZXJhdGlvbnNcbi8vIHdoaWxlIGZhbGxpbmcgYmFjayB0byBhIG5vcm1hbCBJREJDdXJzb3Igb3BlcmF0aW9uIG9uIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBnZXRBbGwoKSBvclxuLy8gZ2V0QWxsS2V5cygpLiBUaGlzIGFsbG93cyBmb3IgYSBtdWNoIGZhc3RlciBpbXBsZW1lbnRhdGlvbiB0aGFuIGp1c3Qgc3RyYWlnaHQtdXAgY3Vyc29ycywgYmVjYXVzZVxuLy8gd2UncmUgbm90IHByb2Nlc3NpbmcgZWFjaCBkb2N1bWVudCBvbmUtYXQtYS10aW1lLlxuZnVuY3Rpb24gcnVuQmF0Y2hlZEN1cnNvcihvYmplY3RTdG9yZSwga2V5UmFuZ2UsIGRlc2NlbmRpbmcsIGJhdGNoU2l6ZSwgb25CYXRjaCkge1xuXG4gIGlmIChiYXRjaFNpemUgPT09IC0xKSB7XG4gICAgYmF0Y2hTaXplID0gMTAwMDtcbiAgfVxuXG4gIC8vIEJhaWwgb3V0IG9mIGdldEFsbCgpL2dldEFsbEtleXMoKSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAvLyAxKSBlaXRoZXIgbWV0aG9kIGlzIHVuc3VwcG9ydGVkIC0gd2UgbmVlZCBib3RoXG4gIC8vIDIpIGJhdGNoU2l6ZSBpcyAxIChtaWdodCBhcyB3ZWxsIHVzZSBJREJDdXJzb3IpXG4gIC8vIDMpIGRlc2NlbmRpbmcg4oCTIG5vIHJlYWwgd2F5IHRvIGRvIHRoaXMgdmlhIGdldEFsbCgpL2dldEFsbEtleXMoKVxuXG4gIHZhciB1c2VHZXRBbGwgPSB0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdFN0b3JlLmdldEFsbEtleXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICBiYXRjaFNpemUgPiAxICYmICFkZXNjZW5kaW5nO1xuXG4gIHZhciBrZXlzQmF0Y2g7XG4gIHZhciB2YWx1ZXNCYXRjaDtcbiAgdmFyIHBzZXVkb0N1cnNvcjtcblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFsdWVzQmF0Y2ggPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGtleXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2V0QWxsS2V5cyhlKSB7XG4gICAga2V5c0JhdGNoID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmICh2YWx1ZXNCYXRjaCkge1xuICAgICAgb25CYXRjaChrZXlzQmF0Y2gsIHZhbHVlc0JhdGNoLCBwc2V1ZG9DdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVlUHNldWRvQ3Vyc29yKCkge1xuICAgIGlmICgha2V5c0JhdGNoLmxlbmd0aCkgeyAvLyBubyBtb3JlIHJlc3VsdHNcbiAgICAgIHJldHVybiBvbkJhdGNoKCk7XG4gICAgfVxuICAgIC8vIGZldGNoIG5leHQgYmF0Y2gsIGV4Y2x1c2l2ZSBzdGFydFxuICAgIHZhciBsYXN0S2V5ID0ga2V5c0JhdGNoW2tleXNCYXRjaC5sZW5ndGggLSAxXTtcbiAgICB2YXIgbmV3S2V5UmFuZ2U7XG4gICAgaWYgKGtleVJhbmdlICYmIGtleVJhbmdlLnVwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKGxhc3RLZXksIGtleVJhbmdlLnVwcGVyLFxuICAgICAgICAgIHRydWUsIGtleVJhbmdlLnVwcGVyT3Blbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYgZS5jb2RlID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG9uQmF0Y2goKTsgLy8gd2UncmUgZG9uZSwgc3RhcnRrZXkgYW5kIGVuZGtleSBhcmUgZXF1YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdLZXlSYW5nZSA9IElEQktleVJhbmdlLmxvd2VyQm91bmQobGFzdEtleSwgdHJ1ZSk7XG4gICAgfVxuICAgIGtleVJhbmdlID0gbmV3S2V5UmFuZ2U7XG4gICAga2V5c0JhdGNoID0gbnVsbDtcbiAgICB2YWx1ZXNCYXRjaCA9IG51bGw7XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DdXJzb3IoZSkge1xuICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKCFjdXJzb3IpIHsgLy8gZG9uZVxuICAgICAgcmV0dXJuIG9uQmF0Y2goKTtcbiAgICB9XG4gICAgLy8gcmVndWxhciBJREJDdXJzb3IgYWN0cyBsaWtlIGEgYmF0Y2ggd2hlcmUgYmF0Y2ggc2l6ZSBpcyBhbHdheXMgMVxuICAgIG9uQmF0Y2goW2N1cnNvci5rZXldLCBbY3Vyc29yLnZhbHVlXSwgY3Vyc29yKTtcbiAgfVxuXG4gIGlmICh1c2VHZXRBbGwpIHtcbiAgICBwc2V1ZG9DdXJzb3IgPSB7XCJjb250aW51ZVwiOiBjb250aW51ZVBzZXVkb0N1cnNvcn07XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbEtleXMoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGxLZXlzO1xuICB9IGVsc2UgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlLCAncHJldicpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9XG59XG5cbi8vIHNpbXBsZSBzaGltIGZvciBvYmplY3RTdG9yZS5nZXRBbGwoKSwgZmFsbGluZyBiYWNrIHRvIElEQkN1cnNvclxuZnVuY3Rpb24gZ2V0QWxsKG9iamVjdFN0b3JlLCBrZXlSYW5nZSwgb25TdWNjZXNzKSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gdXNlIG5hdGl2ZSBnZXRBbGxcbiAgICBvYmplY3RTdG9yZS5nZXRBbGwoa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uU3VjY2VzcztcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZmFsbCBiYWNrIHRvIGN1cnNvcnNcbiAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIG9uQ3Vyc29yKGUpIHtcbiAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmIChjdXJzb3IpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25TdWNjZXNzKHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgcmVzdWx0OiB2YWx1ZXNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSkub25zdWNjZXNzID0gb25DdXJzb3I7XG59XG5cbmZ1bmN0aW9uIGFsbERvY3NLZXlzKGtleXMsIGRvY1N0b3JlLCBvbkJhdGNoKSB7XG4gIC8vIEl0J3Mgbm90IGd1YXJhbnRlZCB0byBiZSByZXR1cm5lZCBpbiByaWdodCBvcmRlciAgXG4gIHZhciB2YWx1ZXNCYXRjaCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gIHZhciBjb3VudCA9IDA7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuICAgIGRvY1N0b3JlLmdldChrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5yZXN1bHQpIHtcbiAgICAgICAgdmFsdWVzQmF0Y2hbaW5kZXhdID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc0JhdGNoW2luZGV4XSA9IHtrZXk6IGtleSwgZXJyb3I6ICdub3RfZm91bmQnfTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPT09IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIG9uQmF0Y2goa2V5cywgdmFsdWVzQmF0Y2gsIHt9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIGRlc2NlbmRpbmcpIHtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoZW5kLCBzdGFydCwgIWluY2x1c2l2ZUVuZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCAhaW5jbHVzaXZlRW5kKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChzdGFydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChzdGFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmQpIHtcbiAgICAgIGlmIChkZXNjZW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGVuZCwgIWluY2x1c2l2ZUVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UudXBwZXJCb3VuZChlbmQsICFpbmNsdXNpdmVFbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5KSB7XG4gICAgICByZXR1cm4gSURCS2V5UmFuZ2Uub25seShrZXkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpZGJBbGxEb2NzKG9wdHMsIGlkYiwgY2FsbGJhY2spIHtcbiAgdmFyIHN0YXJ0ID0gJ3N0YXJ0a2V5JyBpbiBvcHRzID8gb3B0cy5zdGFydGtleSA6IGZhbHNlO1xuICB2YXIgZW5kID0gJ2VuZGtleScgaW4gb3B0cyA/IG9wdHMuZW5ka2V5IDogZmFsc2U7XG4gIHZhciBrZXkgPSAna2V5JyBpbiBvcHRzID8gb3B0cy5rZXkgOiBmYWxzZTtcbiAgdmFyIGtleXMgPSAna2V5cycgaW4gb3B0cyA/IG9wdHMua2V5cyA6IGZhbHNlOyBcbiAgdmFyIHNraXAgPSBvcHRzLnNraXAgfHwgMDtcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInID8gb3B0cy5saW1pdCA6IC0xO1xuICB2YXIgaW5jbHVzaXZlRW5kID0gb3B0cy5pbmNsdXNpdmVfZW5kICE9PSBmYWxzZTtcblxuICB2YXIga2V5UmFuZ2UgOyBcbiAgdmFyIGtleVJhbmdlRXJyb3I7XG4gIGlmICgha2V5cykge1xuICAgIGtleVJhbmdlID0gY3JlYXRlS2V5UmFuZ2Uoc3RhcnQsIGVuZCwgaW5jbHVzaXZlRW5kLCBrZXksIG9wdHMuZGVzY2VuZGluZyk7XG4gICAga2V5UmFuZ2VFcnJvciA9IGtleVJhbmdlICYmIGtleVJhbmdlLmVycm9yO1xuICAgIGlmIChrZXlSYW5nZUVycm9yICYmIFxuICAgICAgIShrZXlSYW5nZUVycm9yLm5hbWUgPT09IFwiRGF0YUVycm9yXCIgJiYga2V5UmFuZ2VFcnJvci5jb2RlID09PSAwKSkge1xuICAgICAgLy8gRGF0YUVycm9yIHdpdGggZXJyb3IgY29kZSAwIGluZGljYXRlcyBzdGFydCBpcyBsZXNzIHRoYW4gZW5kLCBzb1xuICAgICAgLy8gY2FuIGp1c3QgZG8gYW4gZW1wdHkgcXVlcnkuIEVsc2UgbmVlZCB0byB0aHJvd1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUixcbiAgICAgICAga2V5UmFuZ2VFcnJvci5uYW1lLCBrZXlSYW5nZUVycm9yLm1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RvcmVzID0gW0RPQ19TVE9SRSwgQllfU0VRX1NUT1JFLCBNRVRBX1NUT1JFXTtcblxuICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgIHN0b3Jlcy5wdXNoKEFUVEFDSF9TVE9SRSk7XG4gIH1cbiAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWRvbmx5Jyk7XG4gIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgfVxuICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICB2YXIgbWV0YVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpO1xuICB2YXIgZG9jSWRSZXZJbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgZG9jQ291bnQ7XG4gIHZhciB1cGRhdGVTZXE7XG5cbiAgbWV0YVN0b3JlLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGRvY0NvdW50ID0gZS50YXJnZXQucmVzdWx0LmRvY0NvdW50O1xuICB9O1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgZ2V0TWF4VXBkYXRlU2VxKHNlcVN0b3JlLCBmdW5jdGlvbiAoZSkgeyBcbiAgICAgIGlmIChlLnRhcmdldC5yZXN1bHQgJiYgZS50YXJnZXQucmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXBkYXRlU2VxID0gZS50YXJnZXQucmVzdWx0WzBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWF4VXBkYXRlU2VxKG9iamVjdFN0b3JlLCBvblN1Y2Nlc3MpIHtcbiAgICBmdW5jdGlvbiBvbkN1cnNvcihlKSB7XG4gICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgdmFyIG1heEtleSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjdXJzb3IgJiYgY3Vyc29yLmtleSkge1xuICAgICAgICBtYXhLZXkgPSBjdXJzb3Iua2V5O1xuICAgICAgfSBcbiAgICAgIHJldHVybiBvblN1Y2Nlc3Moe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICByZXN1bHQ6IFttYXhLZXldXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKG51bGwsICdwcmV2Jykub25zdWNjZXNzID0gb25DdXJzb3I7XG4gIH1cblxuICAvLyBpZiB0aGUgdXNlciBzcGVjaWZpZXMgaW5jbHVkZV9kb2NzPXRydWUsIHRoZW4gd2UgZG9uJ3RcbiAgLy8gd2FudCB0byBibG9jayB0aGUgbWFpbiBjdXJzb3Igd2hpbGUgd2UncmUgZmV0Y2hpbmcgdGhlIGRvY1xuICBmdW5jdGlvbiBmZXRjaERvY0FzeW5jaHJvbm91c2x5KG1ldGFkYXRhLCByb3csIHdpbm5pbmdSZXYkJDEpIHtcbiAgICB2YXIga2V5ID0gbWV0YWRhdGEuaWQgKyBcIjo6XCIgKyB3aW5uaW5nUmV2JCQxO1xuICAgIGRvY0lkUmV2SW5kZXguZ2V0KGtleSkub25zdWNjZXNzID0gIGZ1bmN0aW9uIG9uR2V0RG9jKGUpIHtcbiAgICAgIHJvdy5kb2MgPSBkZWNvZGVEb2MoZS50YXJnZXQucmVzdWx0KSB8fCB7fTtcbiAgICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgICB2YXIgY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgICAgIGlmIChjb25mbGljdHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93LmRvYy5fY29uZmxpY3RzID0gY29uZmxpY3RzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3Nhcnkocm93LmRvYywgb3B0cywgdHhuKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWxsRG9jc0lubmVyKHdpbm5pbmdSZXYkJDEsIG1ldGFkYXRhKSB7XG4gICAgdmFyIHJvdyA9IHtcbiAgICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIGtleTogbWV0YWRhdGEuaWQsXG4gICAgICB2YWx1ZToge1xuICAgICAgICByZXY6IHdpbm5pbmdSZXYkJDFcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgaWYgKGtleXMpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICAgIC8vIGRlbGV0ZWQgZG9jcyBhcmUgb2theSB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJvdy52YWx1ZS5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcm93LmRvYyA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChza2lwLS0gPD0gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJvdyk7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgICAgZmV0Y2hEb2NBc3luY2hyb25vdXNseShtZXRhZGF0YSwgcm93LCB3aW5uaW5nUmV2JCQxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmF0Y2hWYWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gbGltaXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB2YXIgYmF0Y2hWYWx1ZSA9IGJhdGNoVmFsdWVzW2ldO1xuICAgICAgaWYgKGJhdGNoVmFsdWUuZXJyb3IgJiYga2V5cykge1xuICAgICAgICAvLyBrZXkgd2FzIG5vdCBmb3VuZCB3aXRoIFwia2V5c1wiIHJlcXVlc3RzXG4gICAgICAgIHJlc3VsdHMucHVzaChiYXRjaFZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShiYXRjaFZhbHVlKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIGFsbERvY3NJbm5lcih3aW5uaW5nUmV2JCQxLCBtZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25CYXRjaChiYXRjaEtleXMsIGJhdGNoVmFsdWVzLCBjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2goYmF0Y2hWYWx1ZXMpO1xuICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8IGxpbWl0KSB7XG4gICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldEFsbChlKSB7XG4gICAgdmFyIHZhbHVlcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBwcm9jZXNzQmF0Y2godmFsdWVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUmVzdWx0c1JlYWR5KCkge1xuICAgIHZhciByZXR1cm5WYWwgPSB7XG4gICAgICB0b3RhbF9yb3dzOiBkb2NDb3VudCxcbiAgICAgIG9mZnNldDogb3B0cy5za2lwLFxuICAgICAgcm93czogcmVzdWx0c1xuICAgIH07XG4gICAgXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSAmJiB1cGRhdGVTZXEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuVmFsLnVwZGF0ZV9zZXEgPSB1cGRhdGVTZXE7XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIHJldHVyblZhbCk7XG4gIH1cblxuICBmdW5jdGlvbiBvblR4bkNvbXBsZXRlKCkge1xuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMsIG9wdHMuYmluYXJ5KS50aGVuKG9uUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25SZXN1bHRzUmVhZHkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IHJlcXVlc3RzIGlmIHN0YXJ0ID4gZW5kIG9yIGxpbWl0ID09PSAwXG4gIGlmIChrZXlSYW5nZUVycm9yIHx8IGxpbWl0ID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChrZXlzKSB7XG4gICAgcmV0dXJuIGFsbERvY3NLZXlzKG9wdHMua2V5cywgZG9jU3RvcmUsIG9uQmF0Y2gpO1xuICB9XG4gIGlmIChsaW1pdCA9PT0gLTEpIHsgLy8ganVzdCBmZXRjaCBldmVyeXRoaW5nXG4gICAgcmV0dXJuIGdldEFsbChkb2NTdG9yZSwga2V5UmFuZ2UsIG9uR2V0QWxsKTtcbiAgfVxuICAvLyBlbHNlIGRvIGEgY3Vyc29yXG4gIC8vIGNob29zZSBhIGJhdGNoIHNpemUgYmFzZWQgb24gdGhlIHNraXAsIHNpbmNlIHdlJ2xsIG5lZWQgdG8gc2tpcCB0aGF0IG1hbnlcbiAgcnVuQmF0Y2hlZEN1cnNvcihkb2NTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQgKyBza2lwLCBvbkJhdGNoKTtcbn1cblxuLy9cbi8vIEJsb2JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGFsbCB2ZXJzaW9ucyBvZiBJbmRleGVkREIsIG5vdGFibHlcbi8vIENocm9tZSA8MzcgYW5kIEFuZHJvaWQgPDUuIEluIHRob3NlIHZlcnNpb25zLCBzdG9yaW5nIGEgYmxvYiB3aWxsIHRocm93LlxuLy9cbi8vIFZhcmlvdXMgb3RoZXIgYmxvYiBidWdzIGV4aXN0IGluIENocm9tZSB2MzctNDIgKGluY2x1c2l2ZSkuXG4vLyBEZXRlY3RpbmcgdGhlbSBpcyBleHBlbnNpdmUgYW5kIGNvbmZ1c2luZyB0byB1c2VycywgYW5kIENocm9tZSAzNy00MlxuLy8gaXMgYXQgdmVyeSBsb3cgdXNhZ2Ugd29ybGR3aWRlLCBzbyB3ZSBkbyBhIGhhY2t5IHVzZXJBZ2VudCBjaGVjayBpbnN0ZWFkLlxuLy9cbi8vIGNvbnRlbnQtdHlwZSBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00MDgxMjBcbi8vIDQwNCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc5MTZcbi8vIEZpbGVSZWFkZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3ODM2XG4vL1xuZnVuY3Rpb24gY2hlY2tCbG9iU3VwcG9ydCh0eG4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgdmFyIGJsb2IkJDEgPSBjcmVhdGVCbG9iKFsnJ10pO1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSkucHV0KGJsb2IkJDEsICdrZXknKTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbWF0Y2hlZENocm9tZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgICAgdmFyIG1hdGNoZWRFZGdlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLy8pO1xuICAgICAgLy8gTVMgRWRnZSBwcmV0ZW5kcyB0byBiZSBDaHJvbWUgNDI6XG4gICAgICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2hoODY5MzAxJTI4dj12cy44NSUyOS5hc3B4XG4gICAgICByZXNvbHZlKG1hdGNoZWRFZGdlIHx8ICFtYXRjaGVkQ2hyb21lIHx8XG4gICAgICAgIHBhcnNlSW50KG1hdGNoZWRDaHJvbWVbMV0sIDEwKSA+PSA0Myk7XG4gICAgfTtcblxuICAgIHJlcS5vbmVycm9yID0gdHhuLm9uYWJvcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gSWYgdGhlIHRyYW5zYWN0aW9uIGFib3J0cyBub3cgaXRzIGR1ZSB0byBub3QgYmVpbmcgYWJsZSB0b1xuICAgICAgLy8gd3JpdGUgdG8gdGhlIGRhdGFiYXNlLCBsaWtlbHkgZHVlIHRvIHRoZSBkaXNrIGJlaW5nIGZ1bGxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9O1xuICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBlcnJvciwgc28gYXNzdW1lIHVuc3VwcG9ydGVkXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb3VudERvY3ModHhuLCBjYikge1xuICB2YXIgaW5kZXggPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5pbmRleCgnZGVsZXRlZE9yTG9jYWwnKTtcbiAgaW5kZXguY291bnQoSURCS2V5UmFuZ2Uub25seSgnMCcpKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgIGNiKGUudGFyZ2V0LnJlc3VsdCk7XG4gIH07XG59XG5cbi8vIFRoaXMgdGFzayBxdWV1ZSBlbnN1cmVzIHRoYXQgSURCIG9wZW4gY2FsbHMgYXJlIGRvbmUgaW4gdGhlaXIgb3duIHRpY2tcblxudmFyIHJ1bm5pbmcgPSBmYWxzZTtcbnZhciBxdWV1ZSA9IFtdO1xuXG5mdW5jdGlvbiB0cnlDb2RlKGZ1biwgZXJyLCByZXMsIFBvdWNoREIpIHtcbiAgdHJ5IHtcbiAgICBmdW4oZXJyLCByZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBTaG91bGRuJ3QgaGFwcGVuLCBidXQgaW4gc29tZSBvZGQgY2FzZXNcbiAgICAvLyBJbmRleGVkREIgaW1wbGVtZW50YXRpb25zIG1pZ2h0IHRocm93IGEgc3luY1xuICAgIC8vIGVycm9yLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBhdCBsZWFzdCBsb2cgaXQuXG4gICAgUG91Y2hEQi5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOZXh0KCkge1xuICBpZiAocnVubmluZyB8fCAhcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJ1bm5pbmcgPSB0cnVlO1xuICBxdWV1ZS5zaGlmdCgpKCk7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVUYXNrKGFjdGlvbiwgY2FsbGJhY2ssIFBvdWNoREIpIHtcbiAgcXVldWUucHVzaChmdW5jdGlvbiBydW5BY3Rpb24oKSB7XG4gICAgYWN0aW9uKGZ1bmN0aW9uIHJ1bkNhbGxiYWNrKGVyciwgcmVzKSB7XG4gICAgICB0cnlDb2RlKGNhbGxiYWNrLCBlcnIsIHJlcywgUG91Y2hEQik7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gcnVuTmV4dCgpIHtcbiAgICAgICAgYXBwbHlOZXh0KFBvdWNoREIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBhcHBseU5leHQoKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKSB7XG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgdmFyIGlkID0gZGJOYW1lICsgJzonICsgdXVpZCgpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmFkZExpc3RlbmVyKGRiTmFtZSwgaWQsIGFwaSwgb3B0cyk7XG4gICAgY2hhbmdlc0hhbmRsZXIubm90aWZ5KGRiTmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVMaXN0ZW5lcihkYk5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGRvY0lkcyA9IG9wdHMuZG9jX2lkcyAmJiBuZXcgRXhwb3J0ZWRTZXQob3B0cy5kb2NfaWRzKTtcblxuICBvcHRzLnNpbmNlID0gb3B0cy5zaW5jZSB8fCAwO1xuICB2YXIgbGFzdFNlcSA9IG9wdHMuc2luY2U7XG5cbiAgdmFyIGxpbWl0ID0gJ2xpbWl0JyBpbiBvcHRzID8gb3B0cy5saW1pdCA6IC0xO1xuICBpZiAobGltaXQgPT09IDApIHtcbiAgICBsaW1pdCA9IDE7IC8vIHBlciBDb3VjaERCIF9jaGFuZ2VzIHNwZWNcbiAgfVxuXG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBudW1SZXN1bHRzID0gMDtcbiAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKTtcbiAgdmFyIGRvY0lkc1RvTWV0YWRhdGEgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuICB2YXIgdHhuO1xuICB2YXIgYnlTZXFTdG9yZTtcbiAgdmFyIGRvY1N0b3JlO1xuICB2YXIgZG9jSWRSZXZJbmRleDtcblxuICBmdW5jdGlvbiBvbkJhdGNoKGJhdGNoS2V5cywgYmF0Y2hWYWx1ZXMsIGN1cnNvcikge1xuICAgIGlmICghY3Vyc29yIHx8ICFiYXRjaEtleXMubGVuZ3RoKSB7IC8vIGRvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2lubmluZ0RvY3MgPSBuZXcgQXJyYXkoYmF0Y2hLZXlzLmxlbmd0aCk7XG4gICAgdmFyIG1ldGFkYXRhcyA9IG5ldyBBcnJheShiYXRjaEtleXMubGVuZ3RoKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpIHtcbiAgICAgIHZhciBjaGFuZ2UgPSBvcHRzLnByb2Nlc3NDaGFuZ2Uod2lubmluZ0RvYywgbWV0YWRhdGEsIG9wdHMpO1xuICAgICAgbGFzdFNlcSA9IGNoYW5nZS5zZXEgPSBtZXRhZGF0YS5zZXE7XG5cbiAgICAgIHZhciBmaWx0ZXJlZCA9IGZpbHRlcihjaGFuZ2UpO1xuICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJlZCA9PT0gJ29iamVjdCcpIHsgLy8gYW55dGhpbmcgYnV0IHRydWUvZmFsc2UgaW5kaWNhdGVzIGVycm9yXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChmaWx0ZXJlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZmlsdGVyZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgbnVtUmVzdWx0cysrO1xuICAgICAgaWYgKG9wdHMucmV0dXJuX2RvY3MpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGNoYW5nZSk7XG4gICAgICB9XG4gICAgICAvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IGltbWVkaWF0ZWx5XG4gICAgICAvLyBmb3IgdGhlIGJlbmVmaXQgb2YgbGl2ZSBsaXN0ZW5lcnNcbiAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeSh3aW5uaW5nRG9jLCBvcHRzLCB0eG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBvc3RQcm9jZXNzQXR0YWNobWVudHMoW2NoYW5nZV0sIG9wdHMuYmluYXJ5KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQmF0Y2hEb25lKCkge1xuICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gd2lubmluZ0RvY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKG51bVJlc3VsdHMgPT09IGxpbWl0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbm5pbmdEb2MgPSB3aW5uaW5nRG9jc1tpXTtcbiAgICAgICAgaWYgKCF3aW5uaW5nRG9jKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1ldGFkYXRhID0gbWV0YWRhdGFzW2ldO1xuICAgICAgICBwcm9taXNlcy5wdXNoKHByb2Nlc3NNZXRhZGF0YUFuZFdpbm5pbmdEb2MobWV0YWRhdGEsIHdpbm5pbmdEb2MpKTtcbiAgICAgIH1cblxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBpZiAoY2hhbmdlc1tpXSkge1xuICAgICAgICAgICAgb3B0cy5vbkNoYW5nZShjaGFuZ2VzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKG9wdHMuY29tcGxldGUpO1xuXG4gICAgICBpZiAobnVtUmVzdWx0cyAhPT0gbGltaXQpIHtcbiAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggYWxsIG1ldGFkYXRhcy93aW5uaW5nZG9jcyBmcm9tIHRoaXMgYmF0Y2ggaW4gcGFyYWxsZWwsIHRoZW4gcHJvY2Vzc1xuICAgIC8vIHRoZW0gYWxsIG9ubHkgb25jZSBhbGwgZGF0YSBoYXMgYmVlbiBjb2xsZWN0ZWQuIFRoaXMgaXMgZG9uZSBpbiBwYXJhbGxlbFxuICAgIC8vIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiBkb2luZyBpdCBvbmUtYXQtYS10aW1lLlxuICAgIHZhciBudW1Eb25lID0gMDtcbiAgICBiYXRjaFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZURvYyh2YWx1ZSk7XG4gICAgICB2YXIgc2VxID0gYmF0Y2hLZXlzW2ldO1xuICAgICAgZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGZ1bmN0aW9uIChtZXRhZGF0YSwgd2lubmluZ0RvYykge1xuICAgICAgICBtZXRhZGF0YXNbaV0gPSBtZXRhZGF0YTtcbiAgICAgICAgd2lubmluZ0RvY3NbaV0gPSB3aW5uaW5nRG9jO1xuICAgICAgICBpZiAoKytudW1Eb25lID09PSBiYXRjaEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgb25CYXRjaERvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldE1ldGFkYXRhKGRvYywgc2VxLCBtZXRhZGF0YSwgY2IpIHtcbiAgICBpZiAobWV0YWRhdGEuc2VxICE9PSBzZXEpIHtcbiAgICAgIC8vIHNvbWUgb3RoZXIgc2VxIGlzIGxhdGVyXG4gICAgICByZXR1cm4gY2IoKTtcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEud2lubmluZ1JldiA9PT0gZG9jLl9yZXYpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIHdpbm5pbmcgZG9jXG4gICAgICByZXR1cm4gY2IobWV0YWRhdGEsIGRvYyk7XG4gICAgfVxuXG4gICAgLy8gZmV0Y2ggd2lubmluZyBkb2MgaW4gc2VwYXJhdGUgcmVxdWVzdFxuICAgIHZhciBkb2NJZFJldiA9IGRvYy5faWQgKyAnOjonICsgbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICB2YXIgcmVxID0gZG9jSWRSZXZJbmRleC5nZXQoZG9jSWRSZXYpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgY2IobWV0YWRhdGEsIGRlY29kZURvYyhlLnRhcmdldC5yZXN1bHQpKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEoZG9jLCBzZXEsIGNiKSB7XG4gICAgaWYgKGRvY0lkcyAmJiAhZG9jSWRzLmhhcyhkb2MuX2lkKSkge1xuICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuXG4gICAgdmFyIG1ldGFkYXRhID0gZG9jSWRzVG9NZXRhZGF0YS5nZXQoZG9jLl9pZCk7XG4gICAgaWYgKG1ldGFkYXRhKSB7IC8vIGNhY2hlZFxuICAgICAgcmV0dXJuIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfVxuICAgIC8vIG1ldGFkYXRhIG5vdCBjYWNoZWQsIGhhdmUgdG8gZ28gZmV0Y2ggaXRcbiAgICBkb2NTdG9yZS5nZXQoZG9jLl9pZCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgIGRvY0lkc1RvTWV0YWRhdGEuc2V0KGRvYy5faWQsIG1ldGFkYXRhKTtcbiAgICAgIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHtcbiAgICAgIHJlc3VsdHM6IHJlc3VsdHMsXG4gICAgICBsYXN0X3NlcTogbGFzdFNlcVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UeG5Db21wbGV0ZSgpIHtcbiAgICBpZiAoIW9wdHMuY29udGludW91cyAmJiBvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAvLyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgcG9zdFByb2Nlc3Npbmcgd2FzIGFscmVhZHkgZG9uZSxcbiAgICAgIC8vIHNvIGRvIGl0IGFnYWluXG4gICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKHJlc3VsdHMpLnRoZW4oZmluaXNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluaXNoKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG9iamVjdFN0b3JlcyA9IFtET0NfU1RPUkUsIEJZX1NFUV9TVE9SRV07XG4gIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgb2JqZWN0U3RvcmVzLnB1c2goQVRUQUNIX1NUT1JFKTtcbiAgfVxuICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgb2JqZWN0U3RvcmVzLCAncmVhZG9ubHknKTtcbiAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiBvcHRzLmNvbXBsZXRlKHR4blJlc3VsdC5lcnJvcik7XG4gIH1cbiAgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihvcHRzLmNvbXBsZXRlKTtcbiAgdHhuLm9uY29tcGxldGUgPSBvblR4bkNvbXBsZXRlO1xuXG4gIGJ5U2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgZG9jSWRSZXZJbmRleCA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG5cbiAgdmFyIGtleVJhbmdlID0gKG9wdHMuc2luY2UgJiYgIW9wdHMuZGVzY2VuZGluZykgP1xuICAgIElEQktleVJhbmdlLmxvd2VyQm91bmQob3B0cy5zaW5jZSwgdHJ1ZSkgOiBudWxsO1xuXG4gIHJ1bkJhdGNoZWRDdXJzb3IoYnlTZXFTdG9yZSwga2V5UmFuZ2UsIG9wdHMuZGVzY2VuZGluZywgbGltaXQsIG9uQmF0Y2gpO1xufVxuXG52YXIgY2FjaGVkREJzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG52YXIgYmxvYlN1cHBvcnRQcm9taXNlO1xudmFyIG9wZW5SZXFMaXN0ID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbmZ1bmN0aW9uIElkYlBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBhcGkgPSB0aGlzO1xuXG4gIGVucXVldWVUYXNrKGZ1bmN0aW9uICh0aGlzQ2FsbGJhY2spIHtcbiAgICBpbml0KGFwaSwgb3B0cywgdGhpc0NhbGxiYWNrKTtcbiAgfSwgY2FsbGJhY2ssIGFwaS5jb25zdHJ1Y3Rvcik7XG59XG5cbmZ1bmN0aW9uIGluaXQoYXBpLCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIHZhciBkYk5hbWUgPSBvcHRzLm5hbWU7XG5cbiAgdmFyIGlkYiA9IG51bGw7XG4gIHZhciBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBudWxsO1xuICBhcGkuX21ldGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHtcbiAgICAgIGlmIChlcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICFlcnJvci5yZWFzb24pIHtcbiAgICAgICAgaWYgKGlkYkdsb2JhbEZhaWx1cmVFcnJvcikge1xuICAgICAgICAgIGVycm9yLnJlYXNvbiA9IGlkYkdsb2JhbEZhaWx1cmVFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYWxsYmFjayhlcnJvciwgcmVzdWx0KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gY2FsbGVkIHdoZW4gY3JlYXRpbmcgYSBmcmVzaCBuZXcgZGF0YWJhc2VcbiAgZnVuY3Rpb24gY3JlYXRlU2NoZW1hKGRiKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoRE9DX1NUT1JFLCB7a2V5UGF0aCA6ICdpZCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShCWV9TRVFfU1RPUkUsIHthdXRvSW5jcmVtZW50OiB0cnVlfSlcbiAgICAgIC5jcmVhdGVJbmRleCgnX2RvY19pZF9yZXYnLCAnX2RvY19pZF9yZXYnLCB7dW5pcXVlOiB0cnVlfSk7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFLCB7a2V5UGF0aDogJ2RpZ2VzdCd9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShNRVRBX1NUT1JFLCB7a2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDogZmFsc2V9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFKTtcblxuICAgIC8vIGFkZGVkIGluIHYyXG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICAvLyBhZGRlZCBpbiB2M1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKExPQ0FMX1NUT1JFLCB7a2V5UGF0aDogJ19pZCd9KTtcblxuICAgIC8vIGFkZGVkIGluIHY0XG4gICAgdmFyIGF0dEFuZFNlcVN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICB7YXV0b0luY3JlbWVudDogdHJ1ZX0pO1xuICAgIGF0dEFuZFNlcVN0b3JlLmNyZWF0ZUluZGV4KCdzZXEnLCAnc2VxJyk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ2RpZ2VzdFNlcScsICdkaWdlc3RTZXEnLCB7dW5pcXVlOiB0cnVlfSk7XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiAyXG4gIC8vIHVuZm9ydHVuYXRlbHkgXCJkZWxldGVkT3JMb2NhbFwiIGlzIGEgbWlzbm9tZXIgbm93IHRoYXQgd2Ugbm8gbG9uZ2VyXG4gIC8vIHN0b3JlIGxvY2FsIGRvY3MgaW4gdGhlIG1haW4gZG9jLXN0b3JlLCBidXQgd2hhZGR5YWdvbm5hZG9cbiAgZnVuY3Rpb24gYWRkRGVsZXRlZE9yTG9jYWxJbmRleCh0eG4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgZG9jU3RvcmUuY3JlYXRlSW5kZXgoJ2RlbGV0ZWRPckxvY2FsJywgJ2RlbGV0ZWRPckxvY2FsJywge3VuaXF1ZSA6IGZhbHNlfSk7XG5cbiAgICBkb2NTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZGVsZXRlZCA9IGlzRGVsZXRlZChtZXRhZGF0YSk7XG4gICAgICAgIG1ldGFkYXRhLmRlbGV0ZWRPckxvY2FsID0gZGVsZXRlZCA/IFwiMVwiIDogXCIwXCI7XG4gICAgICAgIGRvY1N0b3JlLnB1dChtZXRhZGF0YSk7XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAxKVxuICBmdW5jdGlvbiBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKSB7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUsIHtrZXlQYXRoOiAnX2lkJ30pXG4gICAgICAuY3JlYXRlSW5kZXgoJ19kb2NfaWRfcmV2JywgJ19kb2NfaWRfcmV2Jywge3VuaXF1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMyAocGFydCAyKVxuICBmdW5jdGlvbiBtaWdyYXRlTG9jYWxTdG9yZSh0eG4sIGNiKSB7XG4gICAgdmFyIGxvY2FsU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUpO1xuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICAgIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuXG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgZG9jSWQgPSBtZXRhZGF0YS5pZDtcbiAgICAgICAgdmFyIGxvY2FsID0gaXNMb2NhbElkKGRvY0lkKTtcbiAgICAgICAgdmFyIHJldiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICB2YXIgZG9jSWRSZXYgPSBkb2NJZCArIFwiOjpcIiArIHJldjtcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHNlcSBlbnRyaWVzXG4gICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jSWRcbiAgICAgICAgICB2YXIgc3RhcnQgPSBkb2NJZCArIFwiOjpcIjtcbiAgICAgICAgICB2YXIgZW5kID0gZG9jSWQgKyBcIjo6flwiO1xuICAgICAgICAgIHZhciBpbmRleCA9IHNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgICAgICAgIHZhciByYW5nZSA9IElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgdmFyIHNlcUN1cnNvciA9IGluZGV4Lm9wZW5DdXJzb3IocmFuZ2UpO1xuICAgICAgICAgIHNlcUN1cnNvci5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgc2VxQ3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFzZXFDdXJzb3IpIHtcbiAgICAgICAgICAgICAgLy8gZG9uZVxuICAgICAgICAgICAgICBkb2NTdG9yZS5kZWxldGUoY3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkYXRhID0gc2VxQ3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZGF0YS5fZG9jX2lkX3JldiA9PT0gZG9jSWRSZXYpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JlLnB1dChkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXFTdG9yZS5kZWxldGUoc2VxQ3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICBzZXFDdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMSlcbiAgZnVuY3Rpb24gYWRkQXR0YWNoQW5kU2VxU3RvcmUoZGIpIHtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSxcbiAgICAgIHthdXRvSW5jcmVtZW50OiB0cnVlfSk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ3NlcScsICdzZXEnKTtcbiAgICBhdHRBbmRTZXFTdG9yZS5jcmVhdGVJbmRleCgnZGlnZXN0U2VxJywgJ2RpZ2VzdFNlcScsIHt1bmlxdWU6IHRydWV9KTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDQgKHBhcnQgMilcbiAgZnVuY3Rpb24gbWlncmF0ZUF0dHNBbmRTZXFzKHR4biwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgICB2YXIgYXR0U3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKTtcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUpO1xuXG4gICAgLy8gbmVlZCB0byBhY3R1YWxseSBwb3B1bGF0ZSB0aGUgdGFibGUuIHRoaXMgaXMgdGhlIGV4cGVuc2l2ZSBwYXJ0LFxuICAgIC8vIHNvIGFzIGFuIG9wdGltaXphdGlvbiwgY2hlY2sgZmlyc3QgdGhhdCB0aGlzIGRhdGFiYXNlIGV2ZW5cbiAgICAvLyBjb250YWlucyBhdHRhY2htZW50c1xuICAgIHZhciByZXEgPSBhdHRTdG9yZS5jb3VudCgpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGNvdW50ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgfVxuXG4gICAgICBzZXFTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFjdXJzb3IpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gZG9uZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkb2MgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgdmFyIGF0dHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzIHx8IHt9KTtcbiAgICAgICAgdmFyIGRpZ2VzdE1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgYXR0ID0gZG9jLl9hdHRhY2htZW50c1thdHRzW2pdXTtcbiAgICAgICAgICBkaWdlc3RNYXBbYXR0LmRpZ2VzdF0gPSB0cnVlOyAvLyB1bmlxIGRpZ2VzdHMsIGp1c3QgaW4gY2FzZVxuICAgICAgICB9XG4gICAgICAgIHZhciBkaWdlc3RzID0gT2JqZWN0LmtleXMoZGlnZXN0TWFwKTtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGRpZ2VzdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgZGlnZXN0ID0gZGlnZXN0c1tqXTtcbiAgICAgICAgICBhdHRBbmRTZXFTdG9yZS5wdXQoe1xuICAgICAgICAgICAgc2VxOiBzZXEsXG4gICAgICAgICAgICBkaWdlc3RTZXE6IGRpZ2VzdCArICc6OicgKyBzZXFcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDVcbiAgLy8gSW5zdGVhZCBvZiByZWx5aW5nIG9uIG9uLXRoZS1mbHkgbWlncmF0aW9uIG9mIG1ldGFkYXRhLFxuICAvLyB0aGlzIGJyaW5ncyB0aGUgZG9jLXN0b3JlIHRvIGl0cyBtb2Rlcm4gZm9ybTpcbiAgLy8gLSBtZXRhZGF0YS53aW5uaW5ncmV2XG4gIC8vIC0gbWV0YWRhdGEuc2VxXG4gIC8vIC0gc3RyaW5naWZ5IHRoZSBtZXRhZGF0YSB3aGVuIHN0b3JpbmcgaXRcbiAgZnVuY3Rpb24gbWlncmF0ZU1ldGFkYXRhKHR4bikge1xuXG4gICAgZnVuY3Rpb24gZGVjb2RlTWV0YWRhdGFDb21wYXQoc3RvcmVkT2JqZWN0KSB7XG4gICAgICBpZiAoIXN0b3JlZE9iamVjdC5kYXRhKSB7XG4gICAgICAgIC8vIG9sZCBmb3JtYXQsIHdoZW4gd2UgZGlkbid0IHN0b3JlIGl0IHN0cmluZ2lmaWVkXG4gICAgICAgIHN0b3JlZE9iamVjdC5kZWxldGVkID0gc3RvcmVkT2JqZWN0LmRlbGV0ZWRPckxvY2FsID09PSAnMSc7XG4gICAgICAgIHJldHVybiBzdG9yZWRPYmplY3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVjb2RlTWV0YWRhdGEoc3RvcmVkT2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgdGhhdCBldmVyeSBtZXRhZGF0YSBoYXMgYSB3aW5uaW5nUmV2IGFuZCBzZXEsXG4gICAgLy8gd2hpY2ggd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBvbi10aGUtZmx5IGJ1dCBiZXR0ZXIgdG8gbWlncmF0ZVxuICAgIHZhciBieVNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgdmFyIGN1cnNvciA9IGRvY1N0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICBjdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICByZXR1cm47IC8vIGRvbmVcbiAgICAgIH1cbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhQ29tcGF0KGN1cnNvci52YWx1ZSk7XG5cbiAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYgPSBtZXRhZGF0YS53aW5uaW5nUmV2IHx8XG4gICAgICAgIHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuXG4gICAgICBmdW5jdGlvbiBmZXRjaE1ldGFkYXRhU2VxKCkge1xuICAgICAgICAvLyBtZXRhZGF0YS5zZXEgd2FzIGFkZGVkIHBvc3QtMy4yLjAsIHNvIGlmIGl0J3MgbWlzc2luZyxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBmZXRjaCBpdCBtYW51YWxseVxuICAgICAgICB2YXIgc3RhcnQgPSBtZXRhZGF0YS5pZCArICc6Oic7XG4gICAgICAgIHZhciBlbmQgPSBtZXRhZGF0YS5pZCArICc6OlxcdWZmZmYnO1xuICAgICAgICB2YXIgcmVxID0gYnlTZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKS5vcGVuQ3Vyc29yKFxuICAgICAgICAgIElEQktleVJhbmdlLmJvdW5kKHN0YXJ0LCBlbmQpKTtcblxuICAgICAgICB2YXIgbWV0YWRhdGFTZXEgPSAwO1xuICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5zZXEgPSBtZXRhZGF0YVNlcTtcbiAgICAgICAgICAgIHJldHVybiBvbkdldE1ldGFkYXRhU2VxKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBzZXEgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgICBpZiAoc2VxID4gbWV0YWRhdGFTZXEpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhU2VxID0gc2VxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25HZXRNZXRhZGF0YVNlcSgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhVG9TdG9yZSA9IGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLFxuICAgICAgICAgIG1ldGFkYXRhLndpbm5pbmdSZXYsIG1ldGFkYXRhLmRlbGV0ZWQpO1xuXG4gICAgICAgIHZhciByZXEgPSBkb2NTdG9yZS5wdXQobWV0YWRhdGFUb1N0b3JlKTtcbiAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGFkYXRhLnNlcSkge1xuICAgICAgICByZXR1cm4gb25HZXRNZXRhZGF0YVNlcSgpO1xuICAgICAgfVxuXG4gICAgICBmZXRjaE1ldGFkYXRhU2VxKCk7XG4gICAgfTtcblxuICB9XG5cbiAgYXBpLl9yZW1vdGUgPSBmYWxzZTtcbiAgYXBpLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdpZGInO1xuICB9O1xuXG4gIGFwaS5faWQgPSB0b1Byb21pc2UoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgYXBpLl9tZXRhLmluc3RhbmNlSWQpO1xuICB9KTtcblxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gaWRiX2J1bGtEb2NzKHJlcSwgcmVxT3B0cywgY2FsbGJhY2spIHtcbiAgICBpZGJCdWxrRG9jcyhvcHRzLCByZXEsIHJlcU9wdHMsIGFwaSwgaWRiLCBlbnJpY2hDYWxsYmFja0Vycm9yKGNhbGxiYWNrKSk7XG4gIH07XG5cbiAgLy8gRmlyc3Qgd2UgbG9vayB1cCB0aGUgbWV0YWRhdGEgaW4gdGhlIGlkcyBkYXRhYmFzZSwgdGhlbiB3ZSBmZXRjaCB0aGVcbiAgLy8gY3VycmVudCByZXZpc2lvbihzKSBmcm9tIHRoZSBieSBzZXF1ZW5jZSBzdG9yZVxuICBhcGkuX2dldCA9IGZ1bmN0aW9uIGlkYl9nZXQoaWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvYztcbiAgICB2YXIgbWV0YWRhdGE7XG4gICAgdmFyIGVycjtcbiAgICB2YXIgdHhuID0gb3B0cy5jdHg7XG4gICAgaWYgKCF0eG4pIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgY2FsbGJhY2soZXJyLCB7ZG9jOiBkb2MsIG1ldGFkYXRhOiBtZXRhZGF0YSwgY3R4OiB0eG59KTtcbiAgICB9XG5cbiAgICB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5nZXQoaWQpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAvLyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSByZXN1bHQgaGVyZSBpZjpcbiAgICAgIC8vIDEuIHRoZXJlIGlzIG5vIHN1Y2ggZG9jdW1lbnRcbiAgICAgIC8vIDIuIHRoZSBkb2N1bWVudCBpcyBkZWxldGVkIGFuZCB3ZSBkb24ndCBhc2sgYWJvdXQgc3BlY2lmaWMgcmV2XG4gICAgICAvLyBXaGVuIHdlIGFzayB3aXRoIG9wdHMucmV2IHdlIGV4cGVjdCB0aGUgYW5zd2VyIHRvIGJlIGVpdGhlclxuICAgICAgLy8gZG9jIChwb3NzaWJseSB3aXRoIF9kZWxldGVkPXRydWUpIG9yIG1pc3NpbmcgZXJyb3JcbiAgICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdtaXNzaW5nJyk7XG4gICAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldjtcbiAgICAgIGlmICghb3B0cy5yZXYpIHtcbiAgICAgICAgcmV2ID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgICAgdmFyIGRlbGV0ZWQgPSBpc0RlbGV0ZWQobWV0YWRhdGEpO1xuICAgICAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICAgIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLCBcImRlbGV0ZWRcIik7XG4gICAgICAgICAgcmV0dXJuIGZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXYgPSBvcHRzLmxhdGVzdCA/IGxhdGVzdChvcHRzLnJldiwgbWV0YWRhdGEpIDogb3B0cy5yZXY7XG4gICAgICB9XG5cbiAgICAgIHZhciBvYmplY3RTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgICAgdmFyIGtleSA9IG1ldGFkYXRhLmlkICsgJzo6JyArIHJldjtcblxuICAgICAgb2JqZWN0U3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2JykuZ2V0KGtleSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgZG9jID0gZGVjb2RlRG9jKGRvYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX0RPQywgJ21pc3NpbmcnKTtcbiAgICAgICAgICByZXR1cm4gZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoKCk7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG5cbiAgYXBpLl9nZXRBdHRhY2htZW50ID0gZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2hJZCwgYXR0YWNobWVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuO1xuICAgIGlmIChvcHRzLmN0eCkge1xuICAgICAgdHhuID0gb3B0cy5jdHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLFxuICAgICAgICBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIEFUVEFDSF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgfVxuICAgIHZhciBkaWdlc3QgPSBhdHRhY2htZW50LmRpZ2VzdDtcbiAgICB2YXIgdHlwZSA9IGF0dGFjaG1lbnQuY29udGVudF90eXBlO1xuXG4gICAgdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSkuZ2V0KGRpZ2VzdCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBib2R5ID0gZS50YXJnZXQucmVzdWx0LmJvZHk7XG4gICAgICByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgb3B0cy5iaW5hcnksIGZ1bmN0aW9uIChibG9iRGF0YSkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBibG9iRGF0YSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5faW5mbyA9IGZ1bmN0aW9uIGlkYl9pbmZvKGNhbGxiYWNrKSB7XG4gICAgdmFyIHVwZGF0ZVNlcTtcbiAgICB2YXIgZG9jQ291bnQ7XG5cbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW01FVEFfU1RPUkUsIEJZX1NFUV9TVE9SRV0sICdyZWFkb25seScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSkuZ2V0KE1FVEFfU1RPUkUpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBkb2NDb3VudCA9IGUudGFyZ2V0LnJlc3VsdC5kb2NDb3VudDtcbiAgICB9O1xuICAgIHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpLm9wZW5DdXJzb3IobnVsbCwgJ3ByZXYnKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIHVwZGF0ZVNlcSA9IGN1cnNvciA/IGN1cnNvci5rZXkgOiAwO1xuICAgIH07XG5cbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgZG9jX2NvdW50OiBkb2NDb3VudCxcbiAgICAgICAgdXBkYXRlX3NlcTogdXBkYXRlU2VxLFxuICAgICAgICAvLyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlkYl9hdHRhY2htZW50X2Zvcm1hdDogKGFwaS5fbWV0YS5ibG9iU3VwcG9ydCA/ICdiaW5hcnknIDogJ2Jhc2U2NCcpXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5fYWxsRG9jcyA9IGZ1bmN0aW9uIGlkYl9hbGxEb2NzKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWRiQWxsRG9jcyhvcHRzLCBpZGIsIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spKTtcbiAgfTtcblxuICBhcGkuX2NoYW5nZXMgPSBmdW5jdGlvbiBpZGJDaGFuZ2VzKG9wdHMpIHtcbiAgICByZXR1cm4gY2hhbmdlcyhvcHRzLCBhcGksIGRiTmFtZSwgaWRiKTtcbiAgfTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9JbmRleGVkREIvSURCRGF0YWJhc2UjY2xvc2VcbiAgICAvLyBcIlJldHVybnMgaW1tZWRpYXRlbHkgYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBpbiBhIHNlcGFyYXRlIHRocmVhZC4uLlwiXG4gICAgaWRiLmNsb3NlKCk7XG4gICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgYXBpLl9nZXRSZXZpc2lvblRyZWUgPSBmdW5jdGlvbiAoZG9jSWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtET0NfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdmFyIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLmdldChkb2NJZCk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGRvYyA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYy5yZXZfdHJlZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgcmV2aXNpb25zIG9mIGRvY3VtZW50IGRvY0lkXG4gIC8vIHdoaWNoIGFyZSBsaXN0ZWQgaW4gcmV2cyBhbmQgc2V0cyB0aGlzIGRvY3VtZW50XG4gIC8vIHJldmlzaW9uIHRvIHRvIHJldl90cmVlXG4gIGFwaS5fZG9Db21wYWN0aW9uID0gZnVuY3Rpb24gKGRvY0lkLCByZXZzLCBjYWxsYmFjaykge1xuICAgIHZhciBzdG9yZXMgPSBbXG4gICAgICBET0NfU1RPUkUsXG4gICAgICBCWV9TRVFfU1RPUkUsXG4gICAgICBBVFRBQ0hfU1RPUkUsXG4gICAgICBBVFRBQ0hfQU5EX1NFUV9TVE9SRVxuICAgIF07XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWR3cml0ZScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcblxuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuXG4gICAgZG9jU3RvcmUuZ2V0KGRvY0lkKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgdHJhdmVyc2VSZXZUcmVlKG1ldGFkYXRhLnJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICAgICAgdmFyIHJldiA9IHBvcyArICctJyArIHJldkhhc2g7XG4gICAgICAgIGlmIChyZXZzLmluZGV4T2YocmV2KSAhPT0gLTEpIHtcbiAgICAgICAgICBvcHRzLnN0YXR1cyA9ICdtaXNzaW5nJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb21wYWN0UmV2cyhyZXZzLCBkb2NJZCwgdHhuKTtcbiAgICAgIHZhciB3aW5uaW5nUmV2JCQxID0gbWV0YWRhdGEud2lubmluZ1JldjtcbiAgICAgIHZhciBkZWxldGVkID0gbWV0YWRhdGEuZGVsZXRlZDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLnB1dChcbiAgICAgICAgZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEsIGRlbGV0ZWQpKTtcbiAgICB9O1xuICAgIHR4bi5vbmFib3J0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHR4bi5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9O1xuXG5cbiAgYXBpLl9nZXRMb2NhbCA9IGZ1bmN0aW9uIChpZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHZhciB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgdmFyIHJlcSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKS5nZXQoaWQpO1xuXG4gICAgcmVxLm9uZXJyb3IgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBkb2NbJ19kb2NfaWRfcmV2J107IC8vIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX3B1dExvY2FsID0gZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgZGVsZXRlIGRvYy5fcmV2aXNpb25zOyAvLyBpZ25vcmUgdGhpcywgdHJ1c3QgdGhlIHJldlxuICAgIHZhciBvbGRSZXYgPSBkb2MuX3JldjtcbiAgICB2YXIgaWQgPSBkb2MuX2lkO1xuICAgIGlmICghb2xkUmV2KSB7XG4gICAgICBkb2MuX3JldiA9ICcwLTEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX3JldiA9ICcwLScgKyAocGFyc2VJbnQob2xkUmV2LnNwbGl0KCctJylbMV0sIDEwKSArIDEpO1xuICAgIH1cblxuICAgIHZhciB0eCA9IG9wdHMuY3R4O1xuICAgIHZhciByZXQ7XG4gICAgaWYgKCF0eCkge1xuICAgICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtMT0NBTF9TVE9SRV0sICdyZWFkd3JpdGUnKTtcbiAgICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgICB0eC5vbmVycm9yID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxO1xuICAgIGlmIChvbGRSZXYpIHtcbiAgICAgIHJlcSA9IG9TdG9yZS5nZXQoaWQpO1xuICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmICghb2xkRG9jIHx8IG9sZERvYy5fcmV2ICE9PSBvbGRSZXYpIHtcbiAgICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gdXBkYXRlXG4gICAgICAgICAgdmFyIHJlcSA9IG9TdG9yZS5wdXQoZG9jKTtcbiAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0ID0ge29rOiB0cnVlLCBpZDogZG9jLl9pZCwgcmV2OiBkb2MuX3Jldn07XG4gICAgICAgICAgICBpZiAob3B0cy5jdHgpIHsgLy8gcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgeyAvLyBuZXcgZG9jXG4gICAgICByZXEgPSBvU3RvcmUuYWRkKGRvYyk7XG4gICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIGNvbnN0cmFpbnQgZXJyb3IsIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIGFib3J0XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgIH07XG4gICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBkb2MuX2lkLCByZXY6IGRvYy5fcmV2fTtcbiAgICAgICAgaWYgKG9wdHMuY3R4KSB7IC8vIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIGFwaS5fcmVtb3ZlTG9jYWwgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICB2YXIgdHggPSBvcHRzLmN0eDtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWR3cml0ZScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4ID0gdHhuUmVzdWx0LnR4bjtcbiAgICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmV0O1xuICAgIHZhciBpZCA9IGRvYy5faWQ7XG4gICAgdmFyIG9TdG9yZSA9IHR4Lm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgcmVxID0gb1N0b3JlLmdldChpZCk7XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbGREb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIW9sZERvYyB8fCBvbGREb2MuX3JldiAhPT0gZG9jLl9yZXYpIHtcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9TdG9yZS5kZWxldGUoaWQpO1xuICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBpZCwgcmV2OiAnMC0wJ307XG4gICAgICAgIGlmIChvcHRzLmN0eCkgeyAvLyByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBjaGFuZ2VzSGFuZGxlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZGJOYW1lKTtcblxuICAgIC8vQ2xvc2Ugb3BlbiByZXF1ZXN0IGZvciBcImRiTmFtZVwiIGRhdGFiYXNlIHRvIGZpeCBpZSBkZWxheS5cbiAgICB2YXIgb3BlblJlcSA9IG9wZW5SZXFMaXN0LmdldChkYk5hbWUpO1xuICAgIGlmIChvcGVuUmVxICYmIG9wZW5SZXEucmVzdWx0KSB7XG4gICAgICBvcGVuUmVxLnJlc3VsdC5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH1cbiAgICB2YXIgcmVxID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGRiTmFtZSk7XG5cbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy9SZW1vdmUgb3BlbiByZXF1ZXN0IGZyb20gdGhlIGxpc3QuXG4gICAgICBvcGVuUmVxTGlzdC5kZWxldGUoZGJOYW1lKTtcbiAgICAgIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSAmJiAoZGJOYW1lIGluIGxvY2FsU3RvcmFnZSkpIHtcbiAgICAgICAgZGVsZXRlIGxvY2FsU3RvcmFnZVtkYk5hbWVdO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgeyAnb2snOiB0cnVlIH0pO1xuICAgIH07XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgfTtcblxuICB2YXIgY2FjaGVkID0gY2FjaGVkREJzLmdldChkYk5hbWUpO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICBpZGIgPSBjYWNoZWQuaWRiO1xuICAgIGFwaS5fbWV0YSA9IGNhY2hlZC5nbG9iYWw7XG4gICAgcmV0dXJuIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBhcGkpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHJlcSA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSwgQURBUFRFUl9WRVJTSU9OKTtcbiAgb3BlblJlcUxpc3Quc2V0KGRiTmFtZSwgcmVxKTtcblxuICByZXEub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgZGIgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDEpIHtcbiAgICAgIHJldHVybiBjcmVhdGVTY2hlbWEoZGIpOyAvLyBuZXcgZGIsIGluaXRpYWwgc2NoZW1hXG4gICAgfVxuICAgIC8vIGRvIG1pZ3JhdGlvbnNcblxuICAgIHZhciB0eG4gPSBlLmN1cnJlbnRUYXJnZXQudHJhbnNhY3Rpb247XG4gICAgLy8gdGhlc2UgbWlncmF0aW9ucyBoYXZlIHRvIGJlIGRvbmUgaW4gdGhpcyBmdW5jdGlvbiwgYmVmb3JlXG4gICAgLy8gY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgZXZlbnQgbG9vcCwgYmVjYXVzZSBJbmRleGVkREJcblxuICAgIGlmIChlLm9sZFZlcnNpb24gPCAzKSB7XG4gICAgICBjcmVhdGVMb2NhbFN0b3JlU2NoZW1hKGRiKTsgLy8gdjIgLT4gdjNcbiAgICB9XG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDQpIHtcbiAgICAgIGFkZEF0dGFjaEFuZFNlcVN0b3JlKGRiKTsgLy8gdjMgLT4gdjRcbiAgICB9XG5cbiAgICB2YXIgbWlncmF0aW9ucyA9IFtcbiAgICAgIGFkZERlbGV0ZWRPckxvY2FsSW5kZXgsIC8vIHYxIC0+IHYyXG4gICAgICBtaWdyYXRlTG9jYWxTdG9yZSwgICAgICAvLyB2MiAtPiB2M1xuICAgICAgbWlncmF0ZUF0dHNBbmRTZXFzLCAgICAgLy8gdjMgLT4gdjRcbiAgICAgIG1pZ3JhdGVNZXRhZGF0YSAgICAgICAgIC8vIHY0IC0+IHY1XG4gICAgXTtcblxuICAgIHZhciBpID0gZS5vbGRWZXJzaW9uO1xuXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHZhciBtaWdyYXRpb24gPSBtaWdyYXRpb25zW2kgLSAxXTtcbiAgICAgIGkrKztcbiAgICAgIGlmIChtaWdyYXRpb24pIHtcbiAgICAgICAgbWlncmF0aW9uKHR4biwgbmV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xuXG4gIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuXG4gICAgaWRiID0gZS50YXJnZXQucmVzdWx0O1xuXG4gICAgaWRiLm9udmVyc2lvbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICBpZGIub25hYm9ydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCAnRGF0YWJhc2UgaGFzIGEgZ2xvYmFsIGZhaWx1cmUnLCBlLnRhcmdldC5lcnJvcik7XG4gICAgICBpZGJHbG9iYWxGYWlsdXJlRXJyb3IgPSBlLnRhcmdldC5lcnJvcjtcbiAgICAgIGlkYi5jbG9zZSgpO1xuICAgICAgY2FjaGVkREJzLmRlbGV0ZShkYk5hbWUpO1xuICAgIH07XG5cbiAgICAvLyBEbyBhIGZldyBzZXR1cCBvcGVyYXRpb25zIChpbiBwYXJhbGxlbCBhcyBtdWNoIGFzIHBvc3NpYmxlKTpcbiAgICAvLyAxLiBGZXRjaCBtZXRhIGRvY1xuICAgIC8vIDIuIENoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vIDMuIENhbGN1bGF0ZSBkb2NDb3VudFxuICAgIC8vIDQuIEdlbmVyYXRlIGFuIGluc3RhbmNlSWQgaWYgbmVjZXNzYXJ5XG4gICAgLy8gNS4gU3RvcmUgZG9jQ291bnQgYW5kIGluc3RhbmNlSWQgb24gbWV0YSBkb2NcblxuICAgIHZhciB0eG4gPSBpZGIudHJhbnNhY3Rpb24oW1xuICAgICAgTUVUQV9TVE9SRSxcbiAgICAgIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUsXG4gICAgICBET0NfU1RPUkVcbiAgICBdLCAncmVhZHdyaXRlJyk7XG5cbiAgICB2YXIgc3RvcmVkTWV0YURvYyA9IGZhbHNlO1xuICAgIHZhciBtZXRhRG9jO1xuICAgIHZhciBkb2NDb3VudDtcbiAgICB2YXIgYmxvYlN1cHBvcnQ7XG4gICAgdmFyIGluc3RhbmNlSWQ7XG5cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVNldHVwKCkge1xuICAgICAgaWYgKHR5cGVvZiBibG9iU3VwcG9ydCA9PT0gJ3VuZGVmaW5lZCcgfHwgIXN0b3JlZE1ldGFEb2MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLl9tZXRhID0ge1xuICAgICAgICBuYW1lOiBkYk5hbWUsXG4gICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsXG4gICAgICAgIGJsb2JTdXBwb3J0OiBibG9iU3VwcG9ydFxuICAgICAgfTtcblxuICAgICAgY2FjaGVkREJzLnNldChkYk5hbWUsIHtcbiAgICAgICAgaWRiOiBpZGIsXG4gICAgICAgIGdsb2JhbDogYXBpLl9tZXRhXG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RvcmVNZXRhRG9jSWZSZWFkeSgpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jQ291bnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBtZXRhRG9jID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaW5zdGFuY2VLZXkgPSBkYk5hbWUgKyAnX2lkJztcbiAgICAgIGlmIChpbnN0YW5jZUtleSBpbiBtZXRhRG9jKSB7XG4gICAgICAgIGluc3RhbmNlSWQgPSBtZXRhRG9jW2luc3RhbmNlS2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFEb2NbaW5zdGFuY2VLZXldID0gaW5zdGFuY2VJZCA9IHV1aWQoKTtcbiAgICAgIH1cbiAgICAgIG1ldGFEb2MuZG9jQ291bnQgPSBkb2NDb3VudDtcbiAgICAgIHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKS5wdXQobWV0YURvYyk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBmZXRjaCBvciBnZW5lcmF0ZSB0aGUgaW5zdGFuY2VJZFxuICAgIC8vXG4gICAgdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgbWV0YURvYyA9IGUudGFyZ2V0LnJlc3VsdCB8fCB7IGlkOiBNRVRBX1NUT1JFIH07XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gY291bnREb2NzXG4gICAgLy9cbiAgICBjb3VudERvY3ModHhuLCBmdW5jdGlvbiAoY291bnQpIHtcbiAgICAgIGRvY0NvdW50ID0gY291bnQ7XG4gICAgICBzdG9yZU1ldGFEb2NJZlJlYWR5KCk7XG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIGNoZWNrIGJsb2Igc3VwcG9ydFxuICAgIC8vXG4gICAgaWYgKCFibG9iU3VwcG9ydFByb21pc2UpIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBibG9iIHN1cHBvcnQgaXMgb25seSBjaGVja2VkIG9uY2VcbiAgICAgIGJsb2JTdXBwb3J0UHJvbWlzZSA9IGNoZWNrQmxvYlN1cHBvcnQodHhuKTtcbiAgICB9XG5cbiAgICBibG9iU3VwcG9ydFByb21pc2UudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICBibG9iU3VwcG9ydCA9IHZhbDtcbiAgICAgIGNvbXBsZXRlU2V0dXAoKTtcbiAgICB9KTtcblxuICAgIC8vIG9ubHkgd2hlbiB0aGUgbWV0YWRhdGEgcHV0IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAgLy8gY29uc2lkZXIgdGhlIHNldHVwIGRvbmVcbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHN0b3JlZE1ldGFEb2MgPSB0cnVlO1xuICAgICAgY29tcGxldGVTZXR1cCgpO1xuICAgIH07XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gIH07XG5cbiAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBtc2cgPSBlLnRhcmdldC5lcnJvciAmJiBlLnRhcmdldC5lcnJvci5tZXNzYWdlO1xuXG4gICAgaWYgKCFtc2cpIHtcbiAgICAgIG1zZyA9ICdGYWlsZWQgdG8gb3BlbiBpbmRleGVkREIsIGFyZSB5b3UgaW4gcHJpdmF0ZSBicm93c2luZyBtb2RlPyc7XG4gICAgfSBlbHNlIGlmIChtc2cuaW5kZXhPZihcInN0b3JlZCBkYXRhYmFzZSBpcyBhIGhpZ2hlciB2ZXJzaW9uXCIpICE9PSAtMSkge1xuICAgICAgbXNnID0gbmV3IEVycm9yKCdUaGlzIERCIHdhcyBjcmVhdGVkIHdpdGggdGhlIG5ld2VyIFwiaW5kZXhlZGRiXCIgYWRhcHRlciwgYnV0IHlvdSBhcmUgdHJ5aW5nIHRvIG9wZW4gaXQgd2l0aCB0aGUgb2xkZXIgXCJpZGJcIiBhZGFwdGVyJyk7XG4gICAgfVxuXG4gICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJywgbXNnKTtcbiAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihJREJfRVJST1IsIG1zZykpO1xuICB9O1xufVxuXG5JZGJQb3VjaC52YWxpZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRm9sbG93aW5nICM3MDg1IGJ1Z2d5IGlkYiB2ZXJzaW9ucyAodHlwaWNhbGx5IFNhZmFyaSA8IDEwLjEpIGFyZVxuICAvLyBjb25zaWRlcmVkIHZhbGlkLlxuXG4gIC8vIE9uIEZpcmVmb3ggU2VjdXJpdHlFcnJvciBpcyB0aHJvd24gd2hpbGUgcmVmZXJlbmNpbmcgaW5kZXhlZERCIGlmIGNvb2tpZXNcbiAgLy8gYXJlIG5vdCBhbGxvd2VkLiBgdHlwZW9mIGluZGV4ZWREQmAgYWxzbyB0cmlnZ2VycyB0aGUgZXJyb3IuXG4gIHRyeSB7XG4gICAgLy8gc29tZSBvdXRkYXRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgSURCIHRoYXQgYXBwZWFyIG9uIFNhbXN1bmdcbiAgICAvLyBhbmQgSFRDIEFuZHJvaWQgZGV2aWNlcyA8NC40IGFyZSBtaXNzaW5nIElEQktleVJhbmdlXG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBJREJLZXlSYW5nZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIElEQlBvdWNoIChQb3VjaERCKSB7XG4gIFBvdWNoREIuYWRhcHRlcignaWRiJywgSWRiUG91Y2gsIHRydWUpO1xufVxuXG4vLyBkZWFkIHNpbXBsZSBwcm9taXNlIHBvb2wsIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS90aW1kcC9lczYtcHJvbWlzZS1wb29sXG4vLyBidXQgbXVjaCBzbWFsbGVyIGluIGNvZGUgc2l6ZS4gbGltaXRzIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBwcm9taXNlcyB0aGF0IGFyZSBleGVjdXRlZFxuXG5cbmZ1bmN0aW9uIHBvb2wocHJvbWlzZUZhY3RvcmllcywgbGltaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcnVubmluZyA9IDA7XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBkb25lID0gMDtcbiAgICB2YXIgbGVuID0gcHJvbWlzZUZhY3Rvcmllcy5sZW5ndGg7XG4gICAgdmFyIGVycjtcblxuICAgIGZ1bmN0aW9uIHJ1bk5leHQoKSB7XG4gICAgICBydW5uaW5nKys7XG4gICAgICBwcm9taXNlRmFjdG9yaWVzW2N1cnJlbnQrK10oKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgaWYgKCsrZG9uZSA9PT0gbGVuKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydW5OZXh0QmF0Y2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoKSB7XG4gICAgICBydW5uaW5nLS07XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIG9uRXJyb3IodGhpc0Vycikge1xuICAgICAgcnVubmluZy0tO1xuICAgICAgZXJyID0gZXJyIHx8IHRoaXNFcnI7XG4gICAgICBkb05leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5OZXh0QmF0Y2goKSB7XG4gICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmIGN1cnJlbnQgPCBsZW4pIHtcbiAgICAgICAgcnVuTmV4dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bk5leHRCYXRjaCgpO1xuICB9KTtcbn1cblxudmFyIENIQU5HRVNfQkFUQ0hfU0laRSA9IDI1O1xudmFyIE1BWF9TSU1VTFRBTkVPVVNfUkVWUyA9IDUwO1xudmFyIENIQU5HRVNfVElNRU9VVF9CVUZGRVIgPSA1MDAwO1xudmFyIERFRkFVTFRfSEVBUlRCRUFUID0gMTAwMDA7XG5cbnZhciBzdXBwb3J0c0J1bGtHZXRNYXAgPSB7fTtcblxuZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocm93KSB7XG4gIHZhciBkb2MgPSByb3cuZG9jIHx8IHJvdy5vaztcbiAgdmFyIGF0dHMgPSBkb2MgJiYgZG9jLl9hdHRhY2htZW50cztcbiAgaWYgKCFhdHRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIE9iamVjdC5rZXlzKGF0dHMpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgIGF0dC5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZURvY0lkKGlkKSB7XG4gIGlmICgvXl9kZXNpZ24vLnRlc3QoaWQpKSB7XG4gICAgcmV0dXJuICdfZGVzaWduLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQuc2xpY2UoOCkpO1xuICB9XG4gIGlmICgvXl9sb2NhbC8udGVzdChpZCkpIHtcbiAgICByZXR1cm4gJ19sb2NhbC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkLnNsaWNlKDcpKTtcbiAgfVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGlkKTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKSB7XG4gIGlmICghZG9jLl9hdHRhY2htZW50cyB8fCAhT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgYXR0YWNobWVudCA9IGRvYy5fYXR0YWNobWVudHNba2V5XTtcbiAgICBpZiAoYXR0YWNobWVudC5kYXRhICYmIHR5cGVvZiBhdHRhY2htZW50LmRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgYmxvYlRvQmFzZTY0KGF0dGFjaG1lbnQuZGF0YSwgcmVzb2x2ZSk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChiNjQpIHtcbiAgICAgICAgYXR0YWNobWVudC5kYXRhID0gYjY0O1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGhhc1VybFByZWZpeChvcHRzKSB7XG4gIGlmICghb3B0cy5wcmVmaXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvY29sID0gcGFyc2VVcmkob3B0cy5wcmVmaXgpLnByb3RvY29sO1xuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwJyB8fCBwcm90b2NvbCA9PT0gJ2h0dHBzJztcbn1cblxuLy8gR2V0IGFsbCB0aGUgaW5mb3JtYXRpb24geW91IHBvc3NpYmx5IGNhbiBhYm91dCB0aGUgVVJJIGdpdmVuIGJ5IG5hbWUgYW5kXG4vLyByZXR1cm4gaXQgYXMgYSBzdWl0YWJsZSBvYmplY3QuXG5mdW5jdGlvbiBnZXRIb3N0KG5hbWUsIG9wdHMpIHtcbiAgLy8gZW5jb2RlIGRiIG5hbWUgaWYgb3B0cy5wcmVmaXggaXMgYSB1cmwgKCM1NTc0KVxuICBpZiAoaGFzVXJsUHJlZml4KG9wdHMpKSB7XG4gICAgdmFyIGRiTmFtZSA9IG9wdHMubmFtZS5zdWJzdHIob3B0cy5wcmVmaXgubGVuZ3RoKTtcbiAgICAvLyBFbnN1cmUgcHJlZml4IGhhcyBhIHRyYWlsaW5nIHNsYXNoXG4gICAgdmFyIHByZWZpeCA9IG9wdHMucHJlZml4LnJlcGxhY2UoL1xcLz8kLywgJy8nKTtcbiAgICBuYW1lID0gcHJlZml4ICsgZW5jb2RlVVJJQ29tcG9uZW50KGRiTmFtZSk7XG4gIH1cblxuICB2YXIgdXJpID0gcGFyc2VVcmkobmFtZSk7XG4gIGlmICh1cmkudXNlciB8fCB1cmkucGFzc3dvcmQpIHtcbiAgICB1cmkuYXV0aCA9IHt1c2VybmFtZTogdXJpLnVzZXIsIHBhc3N3b3JkOiB1cmkucGFzc3dvcmR9O1xuICB9XG5cbiAgLy8gU3BsaXQgdGhlIHBhdGggcGFydCBvZiB0aGUgVVJJIGludG8gcGFydHMgdXNpbmcgJy8nIGFzIHRoZSBkZWxpbWl0ZXJcbiAgLy8gYWZ0ZXIgcmVtb3ZpbmcgYW55IGxlYWRpbmcgJy8nIGFuZCBhbnkgdHJhaWxpbmcgJy8nXG4gIHZhciBwYXJ0cyA9IHVyaS5wYXRoLnJlcGxhY2UoLyheXFwvfFxcLyQpL2csICcnKS5zcGxpdCgnLycpO1xuXG4gIHVyaS5kYiA9IHBhcnRzLnBvcCgpO1xuICAvLyBQcmV2ZW50IGRvdWJsZSBlbmNvZGluZyBvZiBVUkkgY29tcG9uZW50XG4gIGlmICh1cmkuZGIuaW5kZXhPZignJScpID09PSAtMSkge1xuICAgIHVyaS5kYiA9IGVuY29kZVVSSUNvbXBvbmVudCh1cmkuZGIpO1xuICB9XG5cbiAgdXJpLnBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgcmV0dXJuIHVyaTtcbn1cblxuLy8gR2VuZXJhdGUgYSBVUkwgd2l0aCB0aGUgaG9zdCBkYXRhIGdpdmVuIGJ5IG9wdHMgYW5kIHRoZSBnaXZlbiBwYXRoXG5mdW5jdGlvbiBnZW5EQlVybChvcHRzLCBwYXRoKSB7XG4gIHJldHVybiBnZW5Vcmwob3B0cywgb3B0cy5kYiArICcvJyArIHBhdGgpO1xufVxuXG4vLyBHZW5lcmF0ZSBhIFVSTCB3aXRoIHRoZSBob3N0IGRhdGEgZ2l2ZW4gYnkgb3B0cyBhbmQgdGhlIGdpdmVuIHBhdGhcbmZ1bmN0aW9uIGdlblVybChvcHRzLCBwYXRoKSB7XG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHZhciBwYXRoRGVsID0gIW9wdHMucGF0aCA/ICcnIDogJy8nO1xuXG4gIC8vIElmIHRoZSBob3N0IGFscmVhZHkgaGFzIGEgcGF0aCwgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSBwYXRoIGRlbGltaXRlclxuICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIGRlbGltaXRlciBpcyB0aGUgZW1wdHkgc3RyaW5nXG4gIHJldHVybiBvcHRzLnByb3RvY29sICsgJzovLycgKyBvcHRzLmhvc3QgK1xuICAgICAgICAgKG9wdHMucG9ydCA/ICgnOicgKyBvcHRzLnBvcnQpIDogJycpICtcbiAgICAgICAgICcvJyArIG9wdHMucGF0aCArIHBhdGhEZWwgKyBwYXRoO1xufVxuXG5mdW5jdGlvbiBwYXJhbXNUb1N0cihwYXJhbXMpIHtcbiAgcmV0dXJuICc/JyArIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0dXJuIGsgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tdKTtcbiAgfSkuam9pbignJicpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYWNoZUJ1c3Qob3B0cykge1xuICB2YXIgdWEgPSAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkgP1xuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIHZhciBpc0lFID0gdWEuaW5kZXhPZignbXNpZScpICE9PSAtMTtcbiAgdmFyIGlzVHJpZGVudCA9IHVhLmluZGV4T2YoJ3RyaWRlbnQnKSAhPT0gLTE7XG4gIHZhciBpc0VkZ2UgPSB1YS5pbmRleE9mKCdlZGdlJykgIT09IC0xO1xuICB2YXIgaXNHRVQgPSAhKCdtZXRob2QnIGluIG9wdHMpIHx8IG9wdHMubWV0aG9kID09PSAnR0VUJztcbiAgcmV0dXJuIChpc0lFIHx8IGlzVHJpZGVudCB8fCBpc0VkZ2UpICYmIGlzR0VUO1xufVxuXG4vLyBJbXBsZW1lbnRzIHRoZSBQb3VjaERCIEFQSSBmb3IgZGVhbGluZyB3aXRoIENvdWNoREIgaW5zdGFuY2VzIG92ZXIgSFRUUFxuZnVuY3Rpb24gSHR0cFBvdWNoKG9wdHMsIGNhbGxiYWNrKSB7XG5cbiAgLy8gVGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBIdHRwUG91Y2hcbiAgdmFyIGFwaSA9IHRoaXM7XG5cbiAgdmFyIGhvc3QgPSBnZXRIb3N0KG9wdHMubmFtZSwgb3B0cyk7XG4gIHZhciBkYlVybCA9IGdlbkRCVXJsKGhvc3QsICcnKTtcblxuICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgdmFyIG91ckZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IG5ldyBoKCk7XG5cbiAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gJ2luY2x1ZGUnO1xuXG4gICAgaWYgKG9wdHMuYXV0aCB8fCBob3N0LmF1dGgpIHtcbiAgICAgIHZhciBuQXV0aCA9IG9wdHMuYXV0aCB8fCBob3N0LmF1dGg7XG4gICAgICB2YXIgc3RyID0gbkF1dGgudXNlcm5hbWUgKyAnOicgKyBuQXV0aC5wYXNzd29yZDtcbiAgICAgIHZhciB0b2tlbiA9IHRoaXNCdG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyB0b2tlbik7XG4gICAgfVxuXG4gICAgdmFyIGhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge307XG4gICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuYXBwZW5kKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzaG91bGRDYWNoZUJ1c3Qob3B0aW9ucykpIHtcbiAgICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ19ub25jZT0nICsgRGF0ZS5ub3coKTtcbiAgICB9XG5cbiAgICB2YXIgZmV0Y2hGdW4gPSBvcHRzLmZldGNoIHx8IGYkMTtcbiAgICByZXR1cm4gZmV0Y2hGdW4odXJsLCBvcHRpb25zKTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGFwdGVyRnVuJCQxKG5hbWUsIGZ1bikge1xuICAgIHJldHVybiBhZGFwdGVyRnVuKG5hbWUsIGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfSk7XG4gICAgfSkpLmJpbmQoYXBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoSlNPTih1cmwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwgbmV3IGgoKTtcblxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzLmdldCgnQWNjZXB0JykpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91ckZldGNoKHVybCwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJlc3VsdC5vayA9IHJlc3BvbnNlLm9rO1xuICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgcmVzdWx0LmRhdGEgPSBqc29uO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgcmVzdWx0LmRhdGEuc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgICAgICAgdmFyIGVyciA9IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0LmRhdGEpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0LmRhdGEpKSB7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gcmVzdWx0LmRhdGEubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgaWYgKHYuZXJyb3IgfHwgdi5taXNzaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgc2V0dXBQcm9taXNlO1xuXG4gIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGlmIChvcHRzLnNraXBfc2V0dXApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHNldHVwIGluIHByb2Nlc3Mgb3IgcHJldmlvdXMgc3VjY2Vzc2Z1bCBzZXR1cFxuICAgIC8vIGRvbmUgdGhlbiB3ZSB3aWxsIHVzZSB0aGF0XG4gICAgLy8gSWYgcHJldmlvdXMgc2V0dXBzIGhhdmUgYmVlbiByZWplY3RlZCB3ZSB3aWxsIHRyeSBhZ2FpblxuICAgIGlmIChzZXR1cFByb21pc2UpIHtcbiAgICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9taXNlID0gZmV0Y2hKU09OKGRiVXJsKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIC8vIERvZXNudCBleGlzdCwgY3JlYXRlIGl0XG4gICAgICAgIGV4cGxhaW5FcnJvcig0MDQsICdQb3VjaERCIGlzIGp1c3QgZGV0ZWN0aW5nIGlmIHRoZSByZW1vdGUgZXhpc3RzLicpO1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKGRiVXJsLCB7bWV0aG9kOiAnUFVUJ30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLy8gSWYgd2UgdHJ5IHRvIGNyZWF0ZSBhIGRhdGFiYXNlIHRoYXQgYWxyZWFkeSBleGlzdHMsIHNraXBwZWQgaW5cbiAgICAgIC8vIGlzdGFuYnVsIHNpbmNlIGl0cyBjYXRjaGluZyBhIHJhY2UgY29uZGl0aW9uLlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA9PT0gNDEyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBzZXR1cFByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgc2V0dXBQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzZXR1cFByb21pc2U7XG4gIH1cblxuICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gIH0pO1xuXG4gIGFwaS5fcmVtb3RlID0gdHJ1ZTtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBhcGkudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ2h0dHAnO1xuICB9O1xuXG4gIGFwaS5pZCA9IGFkYXB0ZXJGdW4kJDEoJ2lkJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgb3VyRmV0Y2goZ2VuVXJsKGhvc3QsICcnKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gQmFkIHJlc3BvbnNlIG9yIG1pc3NpbmcgYHV1aWRgIHNob3VsZCBub3QgcHJldmVudCBJRCBnZW5lcmF0aW9uLlxuICAgICAgdmFyIHV1aWQkJDEgPSAocmVzdWx0ICYmIHJlc3VsdC51dWlkKSA/XG4gICAgICAgICAgKHJlc3VsdC51dWlkICsgaG9zdC5kYikgOiBnZW5EQlVybChob3N0LCAnJyk7XG4gICAgICBjYWxsYmFjayhudWxsLCB1dWlkJCQxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gdGhlIGhvc3QgY2FsbGluZyB0aGUgY291Y2hkYiBfY29tcGFjdCBmdW5jdGlvblxuICAvLyAgICB2ZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiBDb3VjaERCIGl0IGlzIHJ1bm5pbmdcbiAgYXBpLmNvbXBhY3QgPSBhZGFwdGVyRnVuJCQxKCdjb21wYWN0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2NvbXBhY3QnKSwge21ldGhvZDogJ1BPU1QnfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBwaW5nKCkge1xuICAgICAgICBhcGkuaW5mbyhmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBDb3VjaERCIG1heSBzZW5kIGEgXCJjb21wYWN0X3J1bm5pbmc6dHJ1ZVwiIGlmIGl0J3NcbiAgICAgICAgICAvLyBhbHJlYWR5IGNvbXBhY3RpbmcuIFBvdWNoREIgU2VydmVyIGRvZXNuJ3QuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAocmVzICYmICFyZXMuY29tcGFjdF9ydW5uaW5nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChwaW5nLCBvcHRzLmludGVydmFsIHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFBpbmcgdGhlIGh0dHAgaWYgaXQncyBmaW5pc2hlZCBjb21wYWN0aW9uXG4gICAgICBwaW5nKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGFwaS5idWxrR2V0ID0gYWRhcHRlckZ1bignYnVsa0dldCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvQnVsa0dldChjYikge1xuICAgICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgICAgaWYgKG9wdHMucmV2cykge1xuICAgICAgICBwYXJhbXMucmV2cyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMubGF0ZXN0KSB7XG4gICAgICAgIHBhcmFtcy5sYXRlc3QgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfYnVsa19nZXQnICsgcGFyYW1zVG9TdHIocGFyYW1zKSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG9jczogb3B0cy5kb2NzfSlcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAob3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmJpbmFyeSkge1xuICAgICAgICAgIHJlc3VsdC5kYXRhLnJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICByZXMuZG9jcy5mb3JFYWNoKHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYihudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgICB9KS5jYXRjaChjYik7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBkb0J1bGtHZXRTaGltKCkge1xuICAgICAgLy8gYXZvaWQgXCJ1cmwgdG9vIGxvbmcgZXJyb3JcIiBieSBzcGxpdHRpbmcgdXAgaW50byBtdWx0aXBsZSByZXF1ZXN0c1xuICAgICAgdmFyIGJhdGNoU2l6ZSA9IE1BWF9TSU1VTFRBTkVPVVNfUkVWUztcbiAgICAgIHZhciBudW1CYXRjaGVzID0gTWF0aC5jZWlsKG9wdHMuZG9jcy5sZW5ndGggLyBiYXRjaFNpemUpO1xuICAgICAgdmFyIG51bURvbmUgPSAwO1xuICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkobnVtQmF0Y2hlcyk7XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVzdWx0KGJhdGNoTnVtKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAvLyBlcnIgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIHNoaW0gcmV0dXJucyBhIGxpc3Qgb2YgZXJycyBpbiB0aGF0IGNhc2VcbiAgICAgICAgICByZXN1bHRzW2JhdGNoTnVtXSA9IHJlcy5yZXN1bHRzO1xuICAgICAgICAgIGlmICgrK251bURvbmUgPT09IG51bUJhdGNoZXMpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtyZXN1bHRzOiBmbGF0dGVuKHJlc3VsdHMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUJhdGNoZXM7IGkrKykge1xuICAgICAgICB2YXIgc3ViT3B0cyA9IHBpY2sob3B0cywgWydyZXZzJywgJ2F0dGFjaG1lbnRzJywgJ2JpbmFyeScsICdsYXRlc3QnXSk7XG4gICAgICAgIHN1Yk9wdHMuZG9jcyA9IG9wdHMuZG9jcy5zbGljZShpICogYmF0Y2hTaXplLFxuICAgICAgICAgIE1hdGgubWluKG9wdHMuZG9jcy5sZW5ndGgsIChpICsgMSkgKiBiYXRjaFNpemUpKTtcbiAgICAgICAgYnVsa0dldChzZWxmLCBzdWJPcHRzLCBvblJlc3VsdChpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFyayB0aGUgd2hvbGUgZGF0YWJhc2UgYXMgZWl0aGVyIHN1cHBvcnRpbmcgb3Igbm90IHN1cHBvcnRpbmcgX2J1bGtfZ2V0XG4gICAgdmFyIGRiVXJsID0gZ2VuVXJsKGhvc3QsICcnKTtcbiAgICB2YXIgc3VwcG9ydHNCdWxrR2V0ID0gc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBzdXBwb3J0c0J1bGtHZXQgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBkYXRhYmFzZSBzdXBwb3J0cyBfYnVsa19nZXRcbiAgICAgIGRvQnVsa0dldChmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHN1cHBvcnRzQnVsa0dldE1hcFtkYlVybF0gPSBmYWxzZTtcbiAgICAgICAgICBleHBsYWluRXJyb3IoXG4gICAgICAgICAgICBlcnIuc3RhdHVzLFxuICAgICAgICAgICAgJ1BvdWNoREIgaXMganVzdCBkZXRlY3RpbmcgaWYgdGhlIHJlbW90ZSAnICtcbiAgICAgICAgICAgICdzdXBwb3J0cyB0aGUgX2J1bGtfZ2V0IEFQSS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkb0J1bGtHZXRTaGltKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXSA9IHRydWU7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0J1bGtHZXQpIHtcbiAgICAgIGRvQnVsa0dldChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvQnVsa0dldFNoaW0oKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENhbGxzIEdFVCBvbiB0aGUgaG9zdCwgd2hpY2ggZ2V0cyBiYWNrIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZ1xuICAvLyAgICBjb3VjaGRiOiBBIHdlbGNvbWUgc3RyaW5nXG4gIC8vICAgIHZlcnNpb246IFRoZSB2ZXJzaW9uIG9mIENvdWNoREIgaXQgaXMgcnVubmluZ1xuICBhcGkuX2luZm8gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG91ckZldGNoKGdlbkRCVXJsKGhvc3QsICcnKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoaW5mbykge1xuICAgICAgaW5mby5ob3N0ID0gZ2VuREJVcmwoaG9zdCwgJycpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9O1xuXG4gIGFwaS5mZXRjaCA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdXJsID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJyA/XG4gICAgICAgIGdlblVybChob3N0LCBwYXRoLnN1YnN0cmluZygxKSkgOlxuICAgICAgICBnZW5EQlVybChob3N0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvdXJGZXRjaCh1cmwsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQgZnJvbSB0aGUgZGF0YWJhc2UgZ2l2ZW4gYnkgaG9zdC5cbiAgLy8gVGhlIGlkIGNvdWxkIGJlIHNvbGVseSB0aGUgX2lkIGluIHRoZSBkYXRhYmFzZSwgb3IgaXQgbWF5IGJlIGFcbiAgLy8gX2Rlc2lnbi9JRCBvciBfbG9jYWwvSUQgcGF0aFxuICBhcGkuZ2V0ID0gYWRhcHRlckZ1biQkMSgnZ2V0JywgZnVuY3Rpb24gKGlkLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIC8vIElmIG5vIG9wdGlvbnMgd2VyZSBnaXZlbiwgc2V0IHRoZSBjYWxsYmFjayB0byB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBHRVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSB7fTtcblxuICAgIGlmIChvcHRzLnJldnMpIHtcbiAgICAgIHBhcmFtcy5yZXZzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXZzX2luZm8pIHtcbiAgICAgIHBhcmFtcy5yZXZzX2luZm8gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmxhdGVzdCkge1xuICAgICAgcGFyYW1zLmxhdGVzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMub3Blbl9yZXZzKSB7XG4gICAgICBpZiAob3B0cy5vcGVuX3JldnMgIT09IFwiYWxsXCIpIHtcbiAgICAgICAgb3B0cy5vcGVuX3JldnMgPSBKU09OLnN0cmluZ2lmeShvcHRzLm9wZW5fcmV2cyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMub3Blbl9yZXZzID0gb3B0cy5vcGVuX3JldnM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2KSB7XG4gICAgICBwYXJhbXMucmV2ID0gb3B0cy5yZXY7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gb3B0cy5jb25mbGljdHM7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSBvcHRzLnVwZGF0ZV9zZXE7XG4gICAgfVxuXG4gICAgaWQgPSBlbmNvZGVEb2NJZChpZCk7XG5cbiAgICBmdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnRzKGRvYykge1xuICAgICAgdmFyIGF0dHMgPSBkb2MuX2F0dGFjaG1lbnRzO1xuICAgICAgdmFyIGZpbGVuYW1lcyA9IGF0dHMgJiYgT2JqZWN0LmtleXMoYXR0cyk7XG4gICAgICBpZiAoIWF0dHMgfHwgIWZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gd2UgZmV0Y2ggdGhlc2UgbWFudWFsbHkgaW4gc2VwYXJhdGUgWEhScywgYmVjYXVzZVxuICAgICAgLy8gU3luYyBHYXRld2F5IHdvdWxkIG5vcm1hbGx5IHNlbmQgaXQgYmFjayBhcyBtdWx0aXBhcnQvbWl4ZWQsXG4gICAgICAvLyB3aGljaCB3ZSBjYW5ub3QgcGFyc2UuIEFsc28sIHRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhblxuICAgICAgLy8gcmVjZWl2aW5nIGF0dGFjaG1lbnRzIGFzIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3MuXG4gICAgICBmdW5jdGlvbiBmZXRjaERhdGEoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICB2YXIgcGF0aCA9IGVuY29kZURvY0lkKGRvYy5faWQpICsgJy8nICsgZW5jb2RlQXR0YWNobWVudElkKGZpbGVuYW1lKSArXG4gICAgICAgICAgICAnP3Jldj0nICsgZG9jLl9yZXY7XG4gICAgICAgIHJldHVybiBvdXJGZXRjaChnZW5EQlVybChob3N0LCBwYXRoKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAoJ2J1ZmZlcicgaW4gcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAgICAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgICAgICAgICB2YXIgdHlwZUZpZWxkRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmxvYi5fX3Byb3RvX18sICd0eXBlJyk7XG4gICAgICAgICAgICBpZiAoIXR5cGVGaWVsZERlc2NyaXB0b3IgfHwgdHlwZUZpZWxkRGVzY3JpcHRvci5zZXQpIHtcbiAgICAgICAgICAgICAgYmxvYi50eXBlID0gYXR0LmNvbnRlbnRfdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBibG9iO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGJsb2JUb0Jhc2U2NChibG9iLCByZXNvbHZlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHQuc3R1YjtcbiAgICAgICAgICBkZWxldGUgYXR0Lmxlbmd0aDtcbiAgICAgICAgICBhdHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZUZhY3RvcmllcyA9IGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YShmaWxlbmFtZSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhpcyBsaW1pdHMgdGhlIG51bWJlciBvZiBwYXJhbGxlbCB4aHIgcmVxdWVzdHMgdG8gNSBhbnkgdGltZVxuICAgICAgLy8gdG8gYXZvaWQgaXNzdWVzIHdpdGggbWF4aW11bSBicm93c2VyIHJlcXVlc3QgbGltaXRzXG4gICAgICByZXR1cm4gcG9vbChwcm9taXNlRmFjdG9yaWVzLCA1KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmZXRjaEFsbEF0dGFjaG1lbnRzKGRvY09yRG9jcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZG9jT3JEb2NzKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jT3JEb2NzLm1hcChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoQXR0YWNobWVudHMoZG9jLm9rKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEF0dGFjaG1lbnRzKGRvY09yRG9jcyk7XG4gICAgfVxuXG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGlkICsgcGFyYW1zVG9TdHIocGFyYW1zKSk7XG4gICAgZmV0Y2hKU09OKHVybCkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoQWxsQXR0YWNobWVudHMocmVzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzLmRhdGEpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUuZG9jSWQgPSBpZDtcbiAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIC8vIERlbGV0ZSB0aGUgZG9jdW1lbnQgZ2l2ZW4gYnkgZG9jIGZyb20gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5yZW1vdmUgPSBhZGFwdGVyRnVuJCQxKCdyZW1vdmUnLCBmdW5jdGlvbiAoZG9jT3JJZCwgb3B0c09yUmV2LCBvcHRzLCBjYikge1xuICAgIHZhciBkb2M7XG4gICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZCwgcmV2LCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0ge1xuICAgICAgICBfaWQ6IGRvY09ySWQsXG4gICAgICAgIF9yZXY6IG9wdHNPclJldlxuICAgICAgfTtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jLCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgICAgZG9jID0gZG9jT3JJZDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0c09yUmV2O1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSBvcHRzT3JSZXY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJldiA9IChkb2MuX3JldiB8fCBvcHRzLnJldik7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvYy5faWQpKSArICc/cmV2PScgKyByZXY7XG5cbiAgICBmZXRjaEpTT04odXJsLCB7bWV0aG9kOiAnREVMRVRFJ30sIGNiKS5jYXRjaChjYik7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpIHtcbiAgICByZXR1cm4gYXR0YWNobWVudElkLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgYXR0YWNobWVudFxuICBhcGkuZ2V0QXR0YWNobWVudCA9IGFkYXB0ZXJGdW4kJDEoJ2dldEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIHZhciBwYXJhbXMgPSBvcHRzLnJldiA/ICgnP3Jldj0nICsgb3B0cy5yZXYpIDogJyc7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvY0lkKSkgKyAnLycgK1xuICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSArIHBhcmFtcztcbiAgICB2YXIgY29udGVudFR5cGU7XG4gICAgb3VyRmV0Y2godXJsLCB7bWV0aG9kOiAnR0VUJ30pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICFwcm9jZXNzLmJyb3dzZXIgJiYgdHlwZW9mIHJlc3BvbnNlLmJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5idWZmZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAvLyBUT0RPOiBhbHNvIHJlbW92ZVxuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhcHJvY2Vzcy5icm93c2VyKSB7XG4gICAgICAgIGJsb2IudHlwZSA9IGNvbnRlbnRUeXBlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgYmxvYik7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gUmVtb3ZlIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IHRoZSBpZCBhbmQgcmV2XG4gIGFwaS5yZW1vdmVBdHRhY2htZW50ID0gIGFkYXB0ZXJGdW4kJDEoJ3JlbW92ZUF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBlbmNvZGVEb2NJZChkb2NJZCkgKyAnLycgK1xuICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSkgKyAnP3Jldj0nICsgcmV2O1xuICAgIGZldGNoSlNPTih1cmwsIHttZXRob2Q6ICdERUxFVEUnfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gQWRkIHRoZSBhdHRhY2htZW50IGdpdmVuIGJ5IGJsb2IgYW5kIGl0cyBjb250ZW50VHlwZSBwcm9wZXJ0eVxuICAvLyB0byB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQsIHRoZSByZXZpc2lvbiBnaXZlbiBieSByZXYsIGFuZFxuICAvLyBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5wdXRBdHRhY2htZW50ID0gYWRhcHRlckZ1biQkMSgncHV0QXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LCBibG9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gdHlwZTtcbiAgICAgIHR5cGUgPSBibG9iO1xuICAgICAgYmxvYiA9IHJldjtcbiAgICAgIHJldiA9IG51bGw7XG4gICAgfVxuICAgIHZhciBpZCA9IGVuY29kZURvY0lkKGRvY0lkKSArICcvJyArIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpO1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBpZCk7XG4gICAgaWYgKHJldikge1xuICAgICAgdXJsICs9ICc/cmV2PScgKyByZXY7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gaW5wdXQgaXMgYXNzdW1lZCB0byBiZSBhIGJhc2U2NCBzdHJpbmdcbiAgICAgIHZhciBiaW5hcnk7XG4gICAgICB0cnkge1xuICAgICAgICBiaW5hcnkgPSB0aGlzQXRvYihibG9iKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoQkFEX0FSRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBdHRhY2htZW50IGlzIG5vdCBhIHZhbGlkIGJhc2U2NCBzdHJpbmcnKSk7XG4gICAgICB9XG4gICAgICBibG9iID0gYmluYXJ5ID8gYmluU3RyaW5nVG9CbHVmZmVyKGJpbmFyeSwgdHlwZSkgOiAnJztcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGF0dGFjaG1lbnRcbiAgICBmZXRjaEpTT04odXJsLCB7XG4gICAgICBoZWFkZXJzOiBuZXcgaCh7J0NvbnRlbnQtVHlwZSc6IHR5cGV9KSxcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBib2R5OiBibG9iXG4gICAgfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gVXBkYXRlL2NyZWF0ZSBtdWx0aXBsZSBkb2N1bWVudHMgZ2l2ZW4gYnkgcmVxIGluIHRoZSBkYXRhYmFzZVxuICAvLyBnaXZlbiBieSBob3N0LlxuICBhcGkuX2J1bGtEb2NzID0gZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAvLyBJZiBuZXdfZWRpdHM9ZmFsc2UgdGhlbiBpdCBwcmV2ZW50cyB0aGUgZGF0YWJhc2UgZnJvbSBjcmVhdGluZ1xuICAgIC8vIG5ldyByZXZpc2lvbiBudW1iZXJzIGZvciB0aGUgZG9jdW1lbnRzLiBJbnN0ZWFkIGl0IGp1c3QgdXNlc1xuICAgIC8vIHRoZSBvbGQgb25lcy4gVGhpcyBpcyB1c2VkIGluIGRhdGFiYXNlIHJlcGxpY2F0aW9uLlxuICAgIHJlcS5uZXdfZWRpdHMgPSBvcHRzLm5ld19lZGl0cztcblxuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVxLmRvY3MubWFwKHByZXByb2Nlc3NBdHRhY2htZW50cyQxKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVcGRhdGUvY3JlYXRlIHRoZSBkb2N1bWVudHNcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19idWxrX2RvY3MnKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxKVxuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgfTtcblxuXG4gIC8vIFVwZGF0ZS9jcmVhdGUgZG9jdW1lbnRcbiAgYXBpLl9wdXQgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEoZG9jKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgZW5jb2RlRG9jSWQoZG9jLl9pZCkpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRvYylcbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0LmRhdGEpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGVyci5kb2NJZCA9IGRvYyAmJiBkb2MuX2lkO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfTtcblxuXG4gIC8vIEdldCBhIGxpc3Rpbmcgb2YgdGhlIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgZ2l2ZW5cbiAgLy8gYnkgaG9zdCBhbmQgb3JkZXJlZCBieSBpbmNyZWFzaW5nIGlkLlxuICBhcGkuYWxsRG9jcyA9IGFkYXB0ZXJGdW4kJDEoJ2FsbERvY3MnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgLy8gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgR0VUIHJlcXVlc3RcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdmFyIGJvZHk7XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnO1xuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICBwYXJhbXMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgcGFyYW1zLmRlc2NlbmRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgcGFyYW1zLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gYWRkZWQgaW4gQ291Y2hEQiAxLjYuMFxuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmtleSkge1xuICAgICAgcGFyYW1zLmtleSA9IEpTT04uc3RyaW5naWZ5KG9wdHMua2V5KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydF9rZXkpIHtcbiAgICAgIG9wdHMuc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdGFydGtleSkge1xuICAgICAgcGFyYW1zLnN0YXJ0a2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zdGFydGtleSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5kX2tleSkge1xuICAgICAgb3B0cy5lbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5ka2V5KSB7XG4gICAgICBwYXJhbXMuZW5ka2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5lbmRrZXkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5pbmNsdXNpdmVfZW5kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmluY2x1c2l2ZV9lbmQgPSAhIW9wdHMuaW5jbHVzaXZlX2VuZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5za2lwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLnNraXAgPSBvcHRzLnNraXA7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtU3RyID0gcGFyYW1zVG9TdHIocGFyYW1zKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5rZXlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgYm9keSA9IHtrZXlzOiBvcHRzLmtleXN9O1xuICAgIH1cblxuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2FsbF9kb2NzJyArIHBhcmFtU3RyKSwge1xuICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlc3VsdC5kYXRhLnJvd3MuZm9yRWFjaChyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcik7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICAvLyBHZXQgYSBsaXN0IG9mIGNoYW5nZXMgbWFkZSB0byBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIC8vIFRPRE8gQWNjb3JkaW5nIHRvIHRoZSBSRUFETUUsIHRoZXJlIHNob3VsZCBiZSB0d28gb3RoZXIgbWV0aG9kcyBoZXJlLFxuICAvLyBhcGkuY2hhbmdlcy5hZGRMaXN0ZW5lciBhbmQgYXBpLmNoYW5nZXMucmVtb3ZlTGlzdGVuZXIuXG4gIGFwaS5fY2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICAvLyBXZSBpbnRlcm5hbGx5IHBhZ2UgdGhlIHJlc3VsdHMgb2YgYSBjaGFuZ2VzIHJlcXVlc3QsIHRoaXMgbWVhbnNcbiAgICAvLyBpZiB0aGVyZSBpcyBhIGxhcmdlIHNldCBvZiBjaGFuZ2VzIHRvIGJlIHJldHVybmVkIHdlIGNhbiBzdGFydFxuICAgIC8vIHByb2Nlc3NpbmcgdGhlbSBxdWlja2VyIGluc3RlYWQgb2Ygd2FpdGluZyBvbiB0aGUgZW50aXJlXG4gICAgLy8gc2V0IG9mIGNoYW5nZXMgdG8gcmV0dXJuIGFuZCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlbSBhdCBvbmNlXG4gICAgdmFyIGJhdGNoU2l6ZSA9ICdiYXRjaF9zaXplJyBpbiBvcHRzID8gb3B0cy5iYXRjaF9zaXplIDogQ0hBTkdFU19CQVRDSF9TSVpFO1xuXG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgaWYgKG9wdHMuY29udGludW91cyAmJiAhKCdoZWFydGJlYXQnIGluIG9wdHMpKSB7XG4gICAgICBvcHRzLmhlYXJ0YmVhdCA9IERFRkFVTFRfSEVBUlRCRUFUO1xuICAgIH1cblxuICAgIHZhciByZXF1ZXN0VGltZW91dCA9ICgndGltZW91dCcgaW4gb3B0cykgPyBvcHRzLnRpbWVvdXQgOiAzMCAqIDEwMDA7XG5cbiAgICAvLyBlbnN1cmUgQ0hBTkdFU19USU1FT1VUX0JVRkZFUiBhcHBsaWVzXG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCAmJlxuICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy50aW1lb3V0KSA8IENIQU5HRVNfVElNRU9VVF9CVUZGRVIpIHtcbiAgICAgICAgcmVxdWVzdFRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgKyBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzICYmIG9wdHMuaGVhcnRiZWF0ICYmXG4gICAgICAgKHJlcXVlc3RUaW1lb3V0IC0gb3B0cy5oZWFydGJlYXQpIDwgQ0hBTkdFU19USU1FT1VUX0JVRkZFUikge1xuICAgICAgICByZXF1ZXN0VGltZW91dCA9IG9wdHMuaGVhcnRiZWF0ICsgQ0hBTkdFU19USU1FT1VUX0JVRkZFUjtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzICYmIG9wdHMudGltZW91dCkge1xuICAgICAgcGFyYW1zLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgfVxuXG4gICAgdmFyIGxpbWl0ID0gKHR5cGVvZiBvcHRzLmxpbWl0ICE9PSAndW5kZWZpbmVkJykgPyBvcHRzLmxpbWl0IDogZmFsc2U7XG4gICAgdmFyIGxlZnRUb0ZldGNoID0gbGltaXQ7XG5cbiAgICBpZiAob3B0cy5zdHlsZSkge1xuICAgICAgcGFyYW1zLnN0eWxlID0gb3B0cy5zdHlsZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MgfHwgb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgcGFyYW1zLmF0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jb250aW51b3VzKSB7XG4gICAgICBwYXJhbXMuZmVlZCA9ICdsb25ncG9sbCc7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VxX2ludGVydmFsKSB7XG4gICAgICBwYXJhbXMuc2VxX2ludGVydmFsID0gb3B0cy5zZXFfaW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICBwYXJhbXMuY29uZmxpY3RzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICBwYXJhbXMuZGVzY2VuZGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzKSB7XG4gICAgICAvLyBJZiB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIGZhbHNlLCBpdCBkaXNhYmxlcyB0aGUgZGVmYXVsdCBoZWFydGJlYXRcbiAgICAgIGlmIChvcHRzLmhlYXJ0YmVhdCkge1xuICAgICAgICBwYXJhbXMuaGVhcnRiZWF0ID0gb3B0cy5oZWFydGJlYXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICBpZiAob3B0cy52aWV3ICYmIHR5cGVvZiBvcHRzLnZpZXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ192aWV3JztcbiAgICAgIHBhcmFtcy52aWV3ID0gb3B0cy52aWV3O1xuICAgIH1cblxuICAgIC8vIElmIG9wdHMucXVlcnlfcGFyYW1zIGV4aXN0cywgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAgLy8gVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgdXNlZCBieSB0aGUgZmlsdGVyIG9uIHRoZSBzb3VyY2UgZGF0YWJhc2UuXG4gICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zICYmIHR5cGVvZiBvcHRzLnF1ZXJ5X3BhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRzLnF1ZXJ5X3BhcmFtcywgcGFyYW1fbmFtZSkpIHtcbiAgICAgICAgICBwYXJhbXNbcGFyYW1fbmFtZV0gPSBvcHRzLnF1ZXJ5X3BhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtZXRob2QgPSAnR0VUJztcbiAgICB2YXIgYm9keTtcblxuICAgIGlmIChvcHRzLmRvY19pZHMpIHtcbiAgICAgIC8vIHNldCB0aGlzIGF1dG9tYWdpY2FsbHkgZm9yIHRoZSB1c2VyOyBpdCdzIGFubm95aW5nIHRoYXQgY291Y2hkYlxuICAgICAgLy8gcmVxdWlyZXMgYm90aCBhIFwiZmlsdGVyXCIgYW5kIGEgXCJkb2NfaWRzXCIgcGFyYW0uXG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ19kb2NfaWRzJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7ZG9jX2lkczogb3B0cy5kb2NfaWRzIH07XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZWxzZSBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgICAgLy8gc2V0IHRoaXMgYXV0b21hZ2ljYWxseSBmb3IgdGhlIHVzZXIsIHNpbWlsYXIgdG8gYWJvdmVcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSAnX3NlbGVjdG9yJztcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7c2VsZWN0b3I6IG9wdHMuc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICB2YXIgY29udHJvbGxlciA9IG5ldyBhKCk7XG4gICAgdmFyIGxhc3RGZXRjaGVkU2VxO1xuXG4gICAgLy8gR2V0IGFsbCB0aGUgY2hhbmdlcyBzdGFydGluZyB3dGloIHRoZSBvbmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXG4gICAgLy8gc2VxdWVuY2UgbnVtYmVyIGdpdmVuIGJ5IHNpbmNlLlxuICAgIHZhciBmZXRjaERhdGEgPSBmdW5jdGlvbiAoc2luY2UsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5zaW5jZSA9IHNpbmNlO1xuICAgICAgLy8gXCJzaW5jZVwiIGNhbiBiZSBhbnkga2luZCBvZiBqc29uIG9iamVjdCBpbiBDbG91ZGFudC9Db3VjaERCIDIueFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zLnNpbmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHBhcmFtcy5zaW5jZSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5zaW5jZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgaWYgKGxpbWl0KSB7XG4gICAgICAgICAgcGFyYW1zLmxpbWl0ID0gbGVmdFRvRmV0Y2g7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5saW1pdCA9ICghbGltaXQgfHwgbGVmdFRvRmV0Y2ggPiBiYXRjaFNpemUpID9cbiAgICAgICAgICBiYXRjaFNpemUgOiBsZWZ0VG9GZXRjaDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBvcHRpb25zIGZvciB0aGUgYWpheCBjYWxsXG4gICAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgJ19jaGFuZ2VzJyArIHBhcmFtc1RvU3RyKHBhcmFtcykpO1xuICAgICAgdmFyIGZldGNoT3B0cyA9IHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9O1xuICAgICAgbGFzdEZldGNoZWRTZXEgPSBzaW5jZTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBjaGFuZ2VzXG4gICAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmV0Y2hKU09OKHVybCwgZmV0Y2hPcHRzLCBjYWxsYmFjayk7XG4gICAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIC8vIElmIG9wdHMuc2luY2UgZXhpc3RzLCBnZXQgYWxsIHRoZSBjaGFuZ2VzIGZyb20gdGhlIHNlcXVlbmNlXG4gICAgLy8gbnVtYmVyIGdpdmVuIGJ5IG9wdHMuc2luY2UuIE90aGVyd2lzZSwgZ2V0IGFsbCB0aGUgY2hhbmdlc1xuICAgIC8vIGZyb20gdGhlIHNlcXVlbmNlIG51bWJlciAwLlxuICAgIHZhciByZXN1bHRzID0ge3Jlc3VsdHM6IFtdfTtcblxuICAgIHZhciBmZXRjaGVkID0gZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICBpZiAob3B0cy5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByYXdfcmVzdWx0c19sZW5ndGggPSAwO1xuICAgICAgLy8gSWYgdGhlIHJlc3VsdCBvZiB0aGUgYWpheCBjYWxsIChyZXMpIGNvbnRhaW5zIGNoYW5nZXMgKHJlcy5yZXN1bHRzKVxuICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0cykge1xuICAgICAgICByYXdfcmVzdWx0c19sZW5ndGggPSByZXMucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIHJlc3VsdHMubGFzdF9zZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICAgIHZhciBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdmFyIGxhc3RTZXEgPSBudWxsO1xuICAgICAgICAvLyBBdHRhY2ggJ3BlbmRpbmcnIHByb3BlcnR5IGlmIHNlcnZlciBzdXBwb3J0cyBpdCAoQ291Y2hEQiAyLjArKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHR5cGVvZiByZXMucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBwZW5kaW5nID0gcmVzLnBlbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRzLmxhc3Rfc2VxID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0cy5sYXN0X3NlcSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsYXN0U2VxID0gcmVzdWx0cy5sYXN0X3NlcTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgZWFjaCBjaGFuZ2VcbiAgICAgICAgdmFyIHJlcSA9IHt9O1xuICAgICAgICByZXEucXVlcnkgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcbiAgICAgICAgcmVzLnJlc3VsdHMgPSByZXMucmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICBsZWZ0VG9GZXRjaC0tO1xuICAgICAgICAgIHZhciByZXQgPSBmaWx0ZXJDaGFuZ2Uob3B0cykoYyk7XG4gICAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzICYmIG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5iaW5hcnkpIHtcbiAgICAgICAgICAgICAgcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIoYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0cy5yZXR1cm5fZG9jcykge1xuICAgICAgICAgICAgICByZXN1bHRzLnJlc3VsdHMucHVzaChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdHMub25DaGFuZ2UoYywgcGVuZGluZywgbGFzdFNlcSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBlcnJvciwgc3RvcCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgYW5kIGNhbGxcbiAgICAgICAgLy8gb3B0cy5jb21wbGV0ZVxuICAgICAgICBvcHRzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICBvcHRzLmNvbXBsZXRlKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNoYW5nZXMgZmVlZCBtYXkgaGF2ZSB0aW1lZCBvdXQgd2l0aCBubyByZXN1bHRzXG4gICAgICAvLyBpZiBzbyByZXVzZSBsYXN0IHVwZGF0ZSBzZXF1ZW5jZVxuICAgICAgaWYgKHJlcyAmJiByZXMubGFzdF9zZXEpIHtcbiAgICAgICAgbGFzdEZldGNoZWRTZXEgPSByZXMubGFzdF9zZXE7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5pc2hlZCA9IChsaW1pdCAmJiBsZWZ0VG9GZXRjaCA8PSAwKSB8fFxuICAgICAgICAocmVzICYmIHJhd19yZXN1bHRzX2xlbmd0aCA8IGJhdGNoU2l6ZSkgfHxcbiAgICAgICAgKG9wdHMuZGVzY2VuZGluZyk7XG5cbiAgICAgIGlmICgob3B0cy5jb250aW51b3VzICYmICEobGltaXQgJiYgbGVmdFRvRmV0Y2ggPD0gMCkpIHx8ICFmaW5pc2hlZCkge1xuICAgICAgICAvLyBRdWV1ZSBhIGNhbGwgdG8gZmV0Y2ggYWdhaW4gd2l0aCB0aGUgbmV3ZXN0IHNlcXVlbmNlIG51bWJlclxuICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkgeyBmZXRjaERhdGEobGFzdEZldGNoZWRTZXEsIGZldGNoZWQpOyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUsIGNhbGwgdGhlIGNhbGxiYWNrXG4gICAgICAgIG9wdHMuY29tcGxldGUobnVsbCwgcmVzdWx0cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZldGNoRGF0YShvcHRzLnNpbmNlIHx8IDAsIGZldGNoZWQpO1xuXG4gICAgLy8gUmV0dXJuIGEgbWV0aG9kIHRvIGNhbmNlbCB0aGlzIG1ldGhvZCBmcm9tIHByb2Nlc3NpbmcgYW55IG1vcmVcbiAgICByZXR1cm4ge1xuICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9wdHMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIEdpdmVuIGEgc2V0IG9mIGRvY3VtZW50L3JldmlzaW9uIElEcyAoZ2l2ZW4gYnkgcmVxKSwgdGV0cyB0aGUgc3Vic2V0IG9mXG4gIC8vIHRob3NlIHRoYXQgZG8gTk9UIGNvcnJlc3BvbmQgdG8gcmV2aXNpb25zIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuXG4gIC8vIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL2NvdWNoZGIvSHR0cFBvc3RSZXZzRGlmZlxuICBhcGkucmV2c0RpZmYgPSBhZGFwdGVyRnVuJCQxKCdyZXZzRGlmZicsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgLy8gSWYgbm8gb3B0aW9ucyB3ZXJlIGdpdmVuLCBzZXQgdGhlIGNhbGxiYWNrIHRvIGJlIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtaXNzaW5nIGRvY3VtZW50L3JldmlzaW9uIElEc1xuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX3JldnNfZGlmZicpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcSlcbiAgICB9LCBjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICBhcGkuX2Nsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcblxuICBhcGkuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJycpLCB7bWV0aG9kOiAnREVMRVRFJ30pLnRoZW4oZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGpzb24pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIEh0dHBQb3VjaCBpcyBhIHZhbGlkIGFkYXB0ZXIuXG5IdHRwUG91Y2gudmFsaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gSHR0cFBvdWNoJDEgKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5hZGFwdGVyKCdodHRwJywgSHR0cFBvdWNoLCBmYWxzZSk7XG4gIFBvdWNoREIuYWRhcHRlcignaHR0cHMnLCBIdHRwUG91Y2gsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gUXVlcnlQYXJzZUVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDA7XG4gIHRoaXMubmFtZSA9ICdxdWVyeV9wYXJzZV9lcnJvcic7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xuICB0cnkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFF1ZXJ5UGFyc2VFcnJvcik7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbmluaGVyaXRzKFF1ZXJ5UGFyc2VFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBOb3RGb3VuZEVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA0MDQ7XG4gIHRoaXMubmFtZSA9ICdub3RfZm91bmQnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBOb3RGb3VuZEVycm9yKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuaW5oZXJpdHMoTm90Rm91bmRFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBCdWlsdEluRXJyb3IobWVzc2FnZSkge1xuICB0aGlzLnN0YXR1cyA9IDUwMDtcbiAgdGhpcy5uYW1lID0gJ2ludmFsaWRfdmFsdWUnO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBCdWlsdEluRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5pbmhlcml0cyhCdWlsdEluRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gcHJvbWlzZWRDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2spIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gY2FsbGJhY2tpZnkoZnVuKSB7XG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICB2YXIgY2IgPSBhcmdzLnBvcCgpO1xuICAgIHZhciBwcm9taXNlID0gZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSk7XG59XG5cbi8vIFByb21pc2UgZmluYWxseSB1dGlsIHNpbWlsYXIgdG8gUS5maW5hbGx5XG5mdW5jdGlvbiBmaW4ocHJvbWlzZSwgZmluYWxQcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICByZXR1cm4gZmluYWxQcm9taXNlRmFjdG9yeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiBmaW5hbFByb21pc2VGYWN0b3J5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW50aWFsaXplKHF1ZXVlLCBwcm9taXNlRmFjdG9yeSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gcXVldWUuYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlRmFjdG9yeS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gdW5pcSBhbiBhcnJheSBvZiBzdHJpbmdzLCBvcmRlciBub3QgZ3VhcmFudGVlZFxuLy8gc2ltaWxhciB0byB1bmRlcnNjb3JlL2xvZGFzaCBfLnVuaXFcbmZ1bmN0aW9uIHVuaXEoYXJyKSB7XG4gIHZhciB0aGVTZXQgPSBuZXcgRXhwb3J0ZWRTZXQoYXJyKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0aGVTZXQuc2l6ZSk7XG4gIHZhciBpbmRleCA9IC0xO1xuICB0aGVTZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1hcFRvS2V5c0FycmF5KG1hcCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG1hcC5zaXplKTtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0ga2V5O1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbHRJbkVycm9yKG5hbWUpIHtcbiAgdmFyIG1lc3NhZ2UgPSAnYnVpbHRpbiAnICsgbmFtZSArXG4gICAgJyBmdW5jdGlvbiByZXF1aXJlcyBtYXAgdmFsdWVzIHRvIGJlIG51bWJlcnMnICtcbiAgICAnIG9yIG51bWJlciBhcnJheXMnO1xuICByZXR1cm4gbmV3IEJ1aWx0SW5FcnJvcihtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gc3VtKHZhbHVlcykge1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShudW0pKSB7XG4gICAgICAgIC8vIGxpc3RzIG9mIG51bWJlcnMgYXJlIGFsc28gYWxsb3dlZCwgc3VtIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICByZXN1bHQgPSB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJyA/IFtyZXN1bHRdIDogcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBqID0gMCwgakxlbiA9IG51bS5sZW5ndGg7IGogPCBqTGVuOyBqKyspIHtcbiAgICAgICAgICB2YXIgak51bSA9IG51bVtqXTtcbiAgICAgICAgICBpZiAodHlwZW9mIGpOdW0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCdWlsdEluRXJyb3IoJ19zdW0nKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHRbal0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChqTnVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W2pdICs9IGpOdW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyBub3QgYXJyYXkvbnVtYmVyXG4gICAgICAgIHRocm93IGNyZWF0ZUJ1aWx0SW5FcnJvcignX3N1bScpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJlc3VsdCArPSBudW07XG4gICAgfSBlbHNlIHsgLy8gYWRkIG51bWJlciB0byBhcnJheVxuICAgICAgcmVzdWx0WzBdICs9IG51bTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIGxvZyA9IGd1YXJkZWRDb25zb2xlLmJpbmQobnVsbCwgJ2xvZycpO1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHRvSlNPTiA9IEpTT04ucGFyc2U7XG5cbmZ1bmN0aW9uIGV2YWxGdW5jdGlvbldpdGhFdmFsKGZ1bmMsIGVtaXQpIHtcbiAgcmV0dXJuIHNjb3BlRXZhbChcbiAgICBcInJldHVybiAoXCIgKyBmdW5jLnJlcGxhY2UoLztcXHMqJC8sIFwiXCIpICsgXCIpO1wiLFxuICAgIHtcbiAgICAgIGVtaXQ6IGVtaXQsXG4gICAgICBzdW06IHN1bSxcbiAgICAgIGxvZzogbG9nLFxuICAgICAgaXNBcnJheTogaXNBcnJheSxcbiAgICAgIHRvSlNPTjogdG9KU09OXG4gICAgfVxuICApO1xufVxuXG4vKlxuICogU2ltcGxlIHRhc2sgcXVldWUgdG8gc2VxdWVudGlhbGl6ZSBhY3Rpb25zLiBBc3N1bWVzXG4gKiBjYWxsYmFja3Mgd2lsbCBldmVudHVhbGx5IGZpcmUgKG9uY2UpLlxuICovXG5cblxuZnVuY3Rpb24gVGFza1F1ZXVlJDEoKSB7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsKSB7ZnVsZmlsbCgpOyB9KTtcbn1cblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocHJvbWlzZUZhY3RvcnkpIHtcbiAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBqdXN0IHJlY292ZXJcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb21pc2VGYWN0b3J5KCk7XG4gIH0pO1xuICByZXR1cm4gdGhpcy5wcm9taXNlO1xufTtcblRhc2tRdWV1ZSQxLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnByb21pc2U7XG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkoaW5wdXQpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJzsgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3IgZW1wdHkgcmVkdWNlXG4gIH1cbiAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXQgd2l0aCBtYXByZWR1Y2UsIGZ1bmN0aW9ucy9zdHJpbmdzIGFyZSBzdHJpbmdpZmllZFxuICAvLyBhcy1pcy4gZXZlcnl0aGluZyBlbHNlIGlzIEpTT04tc3RyaW5naWZpZWQuXG4gIHN3aXRjaCAodHlwZW9mIGlucHV0KSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgLy8gZS5nLiBhIG1hcHJlZHVjZSBtYXBcbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAvLyBlLmcuIGEgbWFwcmVkdWNlIGJ1aWx0LWluIF9yZWR1Y2UgZnVuY3Rpb25cbiAgICAgIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIGEgSlNPTiBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgbWFuZ28gcXVlcmllc1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGlucHV0KTtcbiAgfVxufVxuXG4vKiBjcmVhdGUgYSBzdHJpbmcgc2lnbmF0dXJlIGZvciBhIHZpZXcgc28gd2UgY2FuIGNhY2hlIGl0IGFuZCB1bmlxIGl0ICovXG5mdW5jdGlvbiBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKSB7XG4gIC8vIHRoZSBcInVuZGVmaW5lZFwiIHBhcnQgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIHJldHVybiBzdHJpbmdpZnkobWFwRnVuKSArIHN0cmluZ2lmeShyZWR1Y2VGdW4pICsgJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpZXcoc291cmNlREIsIHZpZXdOYW1lLCBtYXBGdW4sIHJlZHVjZUZ1biwgdGVtcG9yYXJ5LCBsb2NhbERvY05hbWUpIHtcbiAgdmFyIHZpZXdTaWduYXR1cmUgPSBjcmVhdGVWaWV3U2lnbmF0dXJlKG1hcEZ1biwgcmVkdWNlRnVuKTtcblxuICB2YXIgY2FjaGVkVmlld3M7XG4gIGlmICghdGVtcG9yYXJ5KSB7XG4gICAgLy8gY2FjaGUgdGhpcyB0byBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHVwZGF0ZSB0aGUgc2FtZSB2aWV3IHR3aWNlXG4gICAgY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgPSBzb3VyY2VEQi5fY2FjaGVkVmlld3MgfHwge307XG4gICAgaWYgKGNhY2hlZFZpZXdzW3ZpZXdTaWduYXR1cmVdKSB7XG4gICAgICByZXR1cm4gY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV07XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb21pc2VGb3JWaWV3ID0gc291cmNlREIuaW5mbygpLnRoZW4oZnVuY3Rpb24gKGluZm8pIHtcblxuICAgIHZhciBkZXBEYk5hbWUgPSBpbmZvLmRiX25hbWUgKyAnLW1ydmlldy0nICtcbiAgICAgICh0ZW1wb3JhcnkgPyAndGVtcCcgOiBzdHJpbmdNZDUodmlld1NpZ25hdHVyZSkpO1xuXG4gICAgLy8gc2F2ZSB0aGUgdmlldyBuYW1lIGluIHRoZSBzb3VyY2UgZGIgc28gaXQgY2FuIGJlIGNsZWFuZWQgdXAgaWYgbmVjZXNzYXJ5XG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgX2Rlc2lnbiBkb2MgaXMgZGVsZXRlZCwgcmVtb3ZlIGFsbCBhc3NvY2lhdGVkIHZpZXcgZGF0YSlcbiAgICBmdW5jdGlvbiBkaWZmRnVuY3Rpb24oZG9jKSB7XG4gICAgICBkb2Mudmlld3MgPSBkb2Mudmlld3MgfHwge307XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICBpZiAoZnVsbFZpZXdOYW1lLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgIH1cbiAgICAgIHZhciBkZXBEYnMgPSBkb2Mudmlld3NbZnVsbFZpZXdOYW1lXSA9IGRvYy52aWV3c1tmdWxsVmlld05hbWVdIHx8IHt9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZGVwRGJzW2RlcERiTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuOyAvLyBubyB1cGRhdGUgbmVjZXNzYXJ5XG4gICAgICB9XG4gICAgICBkZXBEYnNbZGVwRGJOYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZG9jO1xuICAgIH1cbiAgICByZXR1cm4gdXBzZXJ0KHNvdXJjZURCLCAnX2xvY2FsLycgKyBsb2NhbERvY05hbWUsIGRpZmZGdW5jdGlvbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc291cmNlREIucmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZShkZXBEYk5hbWUpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB2YXIgZGIgPSByZXMuZGI7XG4gICAgICAgIGRiLmF1dG9fY29tcGFjdGlvbiA9IHRydWU7XG4gICAgICAgIHZhciB2aWV3ID0ge1xuICAgICAgICAgIG5hbWU6IGRlcERiTmFtZSxcbiAgICAgICAgICBkYjogZGIsXG4gICAgICAgICAgc291cmNlREI6IHNvdXJjZURCLFxuICAgICAgICAgIGFkYXB0ZXI6IHNvdXJjZURCLmFkYXB0ZXIsXG4gICAgICAgICAgbWFwRnVuOiBtYXBGdW4sXG4gICAgICAgICAgcmVkdWNlRnVuOiByZWR1Y2VGdW5cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZpZXcuZGIuZ2V0KCdfbG9jYWwvbGFzdFNlcScpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChsYXN0U2VxRG9jKSB7XG4gICAgICAgICAgdmlldy5zZXEgPSBsYXN0U2VxRG9jID8gbGFzdFNlcURvYy5zZXEgOiAwO1xuICAgICAgICAgIGlmIChjYWNoZWRWaWV3cykge1xuICAgICAgICAgICAgdmlldy5kYi5vbmNlKCdkZXN0cm95ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZWRWaWV3c1t2aWV3U2lnbmF0dXJlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKGNhY2hlZFZpZXdzKSB7XG4gICAgY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV0gPSBwcm9taXNlRm9yVmlldztcbiAgfVxuICByZXR1cm4gcHJvbWlzZUZvclZpZXc7XG59XG5cbnZhciBwZXJzaXN0ZW50UXVldWVzID0ge307XG52YXIgdGVtcFZpZXdRdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xudmFyIENIQU5HRVNfQkFUQ0hfU0laRSQxID0gNTA7XG5cbmZ1bmN0aW9uIHBhcnNlVmlld05hbWUobmFtZSkge1xuICAvLyBjYW4gYmUgZWl0aGVyICdkZG9jbmFtZS92aWV3bmFtZScgb3IganVzdCAndmlld25hbWUnXG4gIC8vICh3aGVyZSB0aGUgZGRvYyBuYW1lIGlzIHRoZSBzYW1lKVxuICByZXR1cm4gbmFtZS5pbmRleE9mKCcvJykgPT09IC0xID8gW25hbWUsIG5hbWVdIDogbmFtZS5zcGxpdCgnLycpO1xufVxuXG5mdW5jdGlvbiBpc0dlbk9uZShjaGFuZ2VzKSB7XG4gIC8vIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgY2hhbmdlIGlzIDEtXG4gIC8vIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbGVhZnNcbiAgcmV0dXJuIGNoYW5nZXMubGVuZ3RoID09PSAxICYmIC9eMS0vLnRlc3QoY2hhbmdlc1swXS5yZXYpO1xufVxuXG5mdW5jdGlvbiBlbWl0RXJyb3IoZGIsIGUpIHtcbiAgdHJ5IHtcbiAgICBkYi5lbWl0KCdlcnJvcicsIGUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLFxuICAgICAgJ1RoZSB1c2VyXFwncyBtYXAvcmVkdWNlIGZ1bmN0aW9uIHRocmV3IGFuIHVuY2F1Z2h0IGVycm9yLlxcbicgK1xuICAgICAgJ1lvdSBjYW4gZGVidWcgdGhpcyBlcnJvciBieSBkb2luZzpcXG4nICtcbiAgICAgICdteURhdGFiYXNlLm9uKFxcJ2Vycm9yXFwnLCBmdW5jdGlvbiAoZXJyKSB7IGRlYnVnZ2VyOyB9KTtcXG4nICtcbiAgICAgICdQbGVhc2UgZG91YmxlLWNoZWNrIHlvdXIgbWFwL3JlZHVjZSBmdW5jdGlvbi4nKTtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCBlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gXCJhYnN0cmFjdFwiIG1hcHJlZHVjZSBvYmplY3Qgb2YgdGhlIGZvcm06XG4gKlxuICogICB7XG4gKiAgICAgcXVlcnk6IHF1ZXJ5RnVuLFxuICogICAgIHZpZXdDbGVhbnVwOiB2aWV3Q2xlYW51cEZ1blxuICogICB9XG4gKlxuICogQXJndW1lbnRzIGFyZTpcbiAqXG4gKiBsb2NhbERvYzogc3RyaW5nXG4gKiAgIFRoaXMgaXMgZm9yIHRoZSBsb2NhbCBkb2MgdGhhdCBnZXRzIHNhdmVkIGluIG9yZGVyIHRvIHRyYWNrIHRoZVxuICogICBcImRlcGVuZGVudFwiIERCcyBhbmQgY2xlYW4gdGhlbSB1cCBmb3Igdmlld0NsZWFudXAuIEl0IHNob3VsZCBiZVxuICogICB1bmlxdWUsIHNvIHRoYXQgaW5kZXhlciBwbHVnaW5zIGRvbid0IGNvbGxpZGUgd2l0aCBlYWNoIG90aGVyLlxuICogbWFwcGVyOiBmdW5jdGlvbiAobWFwRnVuRGVmLCBlbWl0KVxuICogICBSZXR1cm5zIGEgbWFwIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBtYXBGdW5EZWYsIHdoaWNoIGluIHRoZSBjYXNlIG9mXG4gKiAgIG5vcm1hbCBtYXAvcmVkdWNlIGlzIGp1c3QgdGhlIGRlLXN0cmluZ2lmaWVkIGZ1bmN0aW9uLCBidXQgbWF5IGJlXG4gKiAgIHNvbWV0aGluZyBlbHNlLCBzdWNoIGFzIGFuIG9iamVjdCBpbiB0aGUgY2FzZSBvZiBwb3VjaGRiLWZpbmQuXG4gKiByZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlRnVuRGVmKVxuICogICBEaXR0bywgYnV0IGZvciByZWR1Y2luZy4gTW9kdWxlcyBkb24ndCBoYXZlIHRvIHN1cHBvcnQgcmVkdWNpbmdcbiAqICAgKGUuZy4gcG91Y2hkYi1maW5kKS5cbiAqIGRkb2NWYWxpZGF0b3I6IGZ1bmN0aW9uIChkZG9jLCB2aWV3TmFtZSlcbiAqICAgVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBkZG9jIG9yIHZpZXdOYW1lIGlzIG5vdCB2YWxpZC5cbiAqICAgVGhpcyBjb3VsZCBiZSBhIHdheSB0byBjb21tdW5pY2F0ZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGVcbiAqICAgaW5kZXhlciBpcyBpbnZhbGlkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZShsb2NhbERvY05hbWUsIG1hcHBlciwgcmVkdWNlciwgZGRvY1ZhbGlkYXRvcikge1xuXG4gIGZ1bmN0aW9uIHRyeU1hcChkYiwgZnVuLCBkb2MpIHtcbiAgICAvLyBlbWl0IGFuIGV2ZW50IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB0aHJvd24gYnkgYSBtYXAgZnVuY3Rpb24uXG4gICAgLy8gcHV0dGluZyB0cnkvY2F0Y2hlcyBpbiBhIHNpbmdsZSBmdW5jdGlvbiBhbHNvIGF2b2lkcyBkZW9wdGltaXphdGlvbnMuXG4gICAgdHJ5IHtcbiAgICAgIGZ1bihkb2MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5UmVkdWNlKGRiLCBmdW4sIGtleXMsIHZhbHVlcywgcmVyZWR1Y2UpIHtcbiAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgcmV0dXJuaW5nIHRoZSByZXN1bHQgb3IgYW4gZXJyb3IuIHRoZXJlIGFyZSB0d28gc2VwYXJhdGVcbiAgICAvLyBmdW5jdGlvbnMgdG8gYXZvaWQgZXh0cmEgbWVtb3J5IGFsbG9jYXRpb25zIHNpbmNlIHRoZSB0cnlDb2RlKCkgY2FzZSBpcyB1c2VkXG4gICAgLy8gZm9yIGN1c3RvbSBtYXAgZnVuY3Rpb25zIChjb21tb24pIHZzIHRoaXMgZnVuY3Rpb24sIHdoaWNoIGlzIG9ubHkgdXNlZCBmb3JcbiAgICAvLyBjdXN0b20gcmVkdWNlIGZ1bmN0aW9ucyAocmFyZSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtvdXRwdXQgOiBmdW4oa2V5cywgdmFsdWVzLCByZXJlZHVjZSl9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVtaXRFcnJvcihkYiwgZSk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzb3J0QnlLZXlUaGVuVmFsdWUoeCwgeSkge1xuICAgIHZhciBrZXlDb21wYXJlID0gY29sbGF0ZSh4LmtleSwgeS5rZXkpO1xuICAgIHJldHVybiBrZXlDb21wYXJlICE9PSAwID8ga2V5Q29tcGFyZSA6IGNvbGxhdGUoeC52YWx1ZSwgeS52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzbGljZVJlc3VsdHMocmVzdWx0cywgbGltaXQsIHNraXApIHtcbiAgICBza2lwID0gc2tpcCB8fCAwO1xuICAgIGlmICh0eXBlb2YgbGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5zbGljZShza2lwLCBsaW1pdCArIHNraXApO1xuICAgIH0gZWxzZSBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNsaWNlKHNraXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJvd1RvRG9jSWQocm93KSB7XG4gICAgdmFyIHZhbCA9IHJvdy52YWx1ZTtcbiAgICAvLyBVc2VycyBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IGEgam9pbmVkIGRvYyBfaWQsIG9yIGl0XG4gICAgLy8gZGVmYXVsdHMgdG8gdGhlIGRvYyBfaWQgdGhhdCBlbWl0dGVkIHRoZSBrZXkvdmFsdWUuXG4gICAgdmFyIGRvY0lkID0gKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwuX2lkKSB8fCByb3cuaWQ7XG4gICAgcmV0dXJuIGRvY0lkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocmVzKSB7XG4gICAgcmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICB2YXIgYXR0cyA9IHJvdy5kb2MgJiYgcm93LmRvYy5fYXR0YWNobWVudHM7XG4gICAgICBpZiAoIWF0dHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmtleXMoYXR0cykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbZmlsZW5hbWVdO1xuICAgICAgICBhdHRzW2ZpbGVuYW1lXS5kYXRhID0gYjY0VG9CbHVmZmVyKGF0dC5kYXRhLCBhdHQuY29udGVudF90eXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgIHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKHJlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhZGRIdHRwUGFyYW0ocGFyYW1OYW1lLCBvcHRzLCBwYXJhbXMsIGFzSnNvbikge1xuICAgIC8vIGFkZCBhbiBodHRwIHBhcmFtIGZyb20gb3B0cyB0byBwYXJhbXMsIG9wdGlvbmFsbHkganNvbi1lbmNvZGVkXG4gICAgdmFyIHZhbCA9IG9wdHNbcGFyYW1OYW1lXTtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChhc0pzb24pIHtcbiAgICAgICAgdmFsID0gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnB1c2gocGFyYW1OYW1lICsgJz0nICsgdmFsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb2VyY2VJbnRlZ2VyKGludGVnZXJDYW5kaWRhdGUpIHtcbiAgICBpZiAodHlwZW9mIGludGVnZXJDYW5kaWRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgYXNOdW1iZXIgPSBOdW1iZXIoaW50ZWdlckNhbmRpZGF0ZSk7XG4gICAgICAvLyBwcmV2ZW50cyBlLmcuICcxZm9vJyBvciAnMS4xJyBiZWluZyBjb2VyY2VkIHRvIDFcbiAgICAgIGlmICghaXNOYU4oYXNOdW1iZXIpICYmIGFzTnVtYmVyID09PSBwYXJzZUludChpbnRlZ2VyQ2FuZGlkYXRlLCAxMCkpIHtcbiAgICAgICAgcmV0dXJuIGFzTnVtYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludGVnZXJDYW5kaWRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29lcmNlT3B0aW9ucyhvcHRzKSB7XG4gICAgb3B0cy5ncm91cF9sZXZlbCA9IGNvZXJjZUludGVnZXIob3B0cy5ncm91cF9sZXZlbCk7XG4gICAgb3B0cy5saW1pdCA9IGNvZXJjZUludGVnZXIob3B0cy5saW1pdCk7XG4gICAgb3B0cy5za2lwID0gY29lcmNlSW50ZWdlcihvcHRzLnNraXApO1xuICAgIHJldHVybiBvcHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tQb3NpdGl2ZUludGVnZXIobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlcikge1xuICAgICAgaWYgKHR5cGVvZiBudW1iZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAgbmV3IFF1ZXJ5UGFyc2VFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgaW50ZWdlcjogXCInICtcbiAgICAgICAgICBudW1iZXIgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlQYXJzZUVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwb3NpdGl2ZSBpbnRlZ2VyOiAnICtcbiAgICAgICAgICAnXCInICsgbnVtYmVyICsgJ1wiJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0aW9ucywgZnVuKSB7XG4gICAgdmFyIHN0YXJ0a2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdlbmRrZXknIDogJ3N0YXJ0a2V5JztcbiAgICB2YXIgZW5ka2V5TmFtZSA9IG9wdGlvbnMuZGVzY2VuZGluZyA/ICdzdGFydGtleScgOiAnZW5ka2V5JztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1tzdGFydGtleU5hbWVdICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIG9wdGlvbnNbZW5ka2V5TmFtZV0gIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBjb2xsYXRlKG9wdGlvbnNbc3RhcnRrZXlOYW1lXSwgb3B0aW9uc1tlbmRrZXlOYW1lXSkgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdObyByb3dzIGNhbiBtYXRjaCB5b3VyIGtleSByYW5nZSwgJyArXG4gICAgICAgICdyZXZlcnNlIHlvdXIgc3RhcnRfa2V5IGFuZCBlbmRfa2V5IG9yIHNldCB7ZGVzY2VuZGluZyA6IHRydWV9Jyk7XG4gICAgfSBlbHNlIGlmIChmdW4ucmVkdWNlICYmIG9wdGlvbnMucmVkdWNlICE9PSBmYWxzZSkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXJyb3IoJ3tpbmNsdWRlX2RvY3M6dHJ1ZX0gaXMgaW52YWxpZCBmb3IgcmVkdWNlJyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMua2V5cyAmJiBvcHRpb25zLmtleXMubGVuZ3RoID4gMSAmJlxuICAgICAgICAhb3B0aW9ucy5ncm91cCAmJiAhb3B0aW9ucy5ncm91cF9sZXZlbCkge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCdNdWx0aS1rZXkgZmV0Y2hlcyBmb3IgcmVkdWNlIHZpZXdzIG11c3QgdXNlICcgK1xuICAgICAgICAgICd7Z3JvdXA6IHRydWV9Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFsnZ3JvdXBfbGV2ZWwnLCAnbGltaXQnLCAnc2tpcCddLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbk5hbWUpIHtcbiAgICAgIHZhciBlcnJvciA9IGNoZWNrUG9zaXRpdmVJbnRlZ2VyKG9wdGlvbnNbb3B0aW9uTmFtZV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaHR0cFF1ZXJ5KGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBQVVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICB2YXIgYm9keTtcbiAgICB2YXIgbWV0aG9kID0gJ0dFVCc7XG4gICAgdmFyIG9rLCBzdGF0dXM7XG5cbiAgICAvLyBJZiBvcHRzLnJlZHVjZSBleGlzdHMgYW5kIGlzIGRlZmluZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0XG4gICAgLy8gb2YgcGFyYW1ldGVycy5cbiAgICAvLyBJZiByZWR1Y2U9ZmFsc2UgdGhlbiB0aGUgcmVzdWx0cyBhcmUgdGhhdCBvZiBvbmx5IHRoZSBtYXAgZnVuY3Rpb25cbiAgICAvLyBub3QgdGhlIGZpbmFsIHJlc3VsdCBvZiBtYXAgYW5kIHJlZHVjZS5cbiAgICBhZGRIdHRwUGFyYW0oJ3JlZHVjZScsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdpbmNsdWRlX2RvY3MnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnYXR0YWNobWVudHMnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnbGltaXQnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnZGVzY2VuZGluZycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdncm91cF9sZXZlbCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdza2lwJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3N0YWxlJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2NvbmZsaWN0cycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydGtleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFydF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnZW5ka2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2VuZF9rZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnaW5jbHVzaXZlX2VuZCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdrZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgndXBkYXRlX3NlcScsIG9wdHMsIHBhcmFtcyk7XG5cbiAgICAvLyBGb3JtYXQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBpbnRvIGEgdmFsaWQgVVJJIHF1ZXJ5IHN0cmluZ1xuICAgIHBhcmFtcyA9IHBhcmFtcy5qb2luKCcmJyk7XG4gICAgcGFyYW1zID0gcGFyYW1zID09PSAnJyA/ICcnIDogJz8nICsgcGFyYW1zO1xuXG4gICAgLy8gSWYga2V5cyBhcmUgc3VwcGxpZWQsIGlzc3VlIGEgUE9TVCB0byBjaXJjdW12ZW50IEdFVCBxdWVyeSBzdHJpbmcgbGltaXRzXG4gICAgLy8gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY291Y2hkYi9IVFRQX3ZpZXdfQVBJI1F1ZXJ5aW5nX09wdGlvbnNcbiAgICBpZiAodHlwZW9mIG9wdHMua2V5cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBNQVhfVVJMX0xFTkdUSCA9IDIwMDA7XG4gICAgICAvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE3MTg0LzY4MDc0MixcbiAgICAgIC8vIHRoZSBkZSBmYWN0byBVUkwgbGVuZ3RoIGxpbWl0IGlzIDIwMDAgY2hhcmFjdGVyc1xuXG4gICAgICB2YXIga2V5c0FzU3RyaW5nID1cbiAgICAgICAgJ2tleXM9JyArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvcHRzLmtleXMpKTtcbiAgICAgIGlmIChrZXlzQXNTdHJpbmcubGVuZ3RoICsgcGFyYW1zLmxlbmd0aCArIDEgPD0gTUFYX1VSTF9MRU5HVEgpIHtcbiAgICAgICAgLy8gSWYgdGhlIGtleXMgYXJlIHNob3J0IGVub3VnaCwgZG8gYSBHRVQuIHdlIGRvIHRoaXMgdG8gd29yayBhcm91bmRcbiAgICAgICAgLy8gU2FmYXJpIG5vdCB1bmRlcnN0YW5kaW5nIDMwNHMgb24gUE9TVHMgKHNlZSBwb3VjaGRiL3BvdWNoZGIjMTIzOSlcbiAgICAgICAgcGFyYW1zICs9IChwYXJhbXNbMF0gPT09ICc/JyA/ICcmJyA6ICc/JykgKyBrZXlzQXNTdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGJvZHkgPSB7a2V5czogb3B0cy5rZXlzfTtcbiAgICAgICAgfSBlbHNlIHsgLy8gZnVuIGlzIHttYXAgOiBtYXBmdW59LCBzbyBhcHBlbmQgdG8gdGhpc1xuICAgICAgICAgIGZ1bi5rZXlzID0gb3B0cy5rZXlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHJlZmVyZW5jaW5nIGEgcXVlcnkgZGVmaW5lZCBpbiB0aGUgZGVzaWduIGRvY1xuICAgIGlmICh0eXBlb2YgZnVuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdW4pO1xuICAgICAgcmV0dXJuIGRiLmZldGNoKCdfZGVzaWduLycgKyBwYXJ0c1swXSArICcvX3ZpZXcvJyArIHBhcnRzWzFdICsgcGFyYW1zLCB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgb2sgPSByZXNwb25zZS5vaztcbiAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgIHRocm93IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmYWlsIHRoZSBlbnRpcmUgcmVxdWVzdCBpZiB0aGUgcmVzdWx0IGNvbnRhaW5zIGFuIGVycm9yXG4gICAgICAgIHJlc3VsdC5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChyb3cudmFsdWUgJiYgcm93LnZhbHVlLmVycm9yICYmIHJvdy52YWx1ZS5lcnJvciA9PT0gXCJidWlsdGluX3JlZHVjZV9lcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Iocm93LnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIHVzaW5nIGEgdGVtcG9yYXJ5IHZpZXcsIHRlcnJpYmxlIGZvciBwZXJmb3JtYW5jZSwgZ29vZCBmb3IgdGVzdGluZ1xuICAgIGJvZHkgPSBib2R5IHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKGZ1bikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmdW5ba2V5XSkpIHtcbiAgICAgICAgYm9keVtrZXldID0gZnVuW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5W2tleV0gPSBmdW5ba2V5XS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRiLmZldGNoKCdfdGVtcF92aWV3JyArIHBhcmFtcywge1xuICAgICAgaGVhZGVyczogbmV3IGgoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBvayA9IHJlc3BvbnNlLm9rO1xuICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aHJvdyBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLnRoZW4ocG9zdHByb2Nlc3NBdHRhY2htZW50cyhvcHRzKSk7XG4gIH1cblxuICAvLyBjdXN0b20gYWRhcHRlcnMgY2FuIGRlZmluZSB0aGVpciBvd24gYXBpLl9xdWVyeVxuICAvLyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZnVuY3Rpb24gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fcXVlcnkoZnVuLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGN1c3RvbSBhZGFwdGVycyBjYW4gZGVmaW5lIHRoZWlyIG93biBhcGkuX3ZpZXdDbGVhbnVwXG4gIC8vIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBjdXN0b21WaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBkYi5fdmlld0NsZWFudXAoZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0c1RvKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocmVhc29uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gcmV0dXJucyBhIHByb21pc2UgZm9yIGEgbGlzdCBvZiBkb2NzIHRvIHVwZGF0ZSwgYmFzZWQgb24gdGhlIGlucHV0IGRvY0lkLlxuICAvLyB0aGUgb3JkZXIgZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2UgcG9zdC0zLjIuMCwgYnVsa0RvY3NcbiAgLy8gaXMgYW4gYXRvbWljIG9wZXJhdGlvbiBpbiBhbGwgdGhyZWUgYWRhcHRlcnMuXG4gIGZ1bmN0aW9uIGdldERvY3NUb1BlcnNpc3QoZG9jSWQsIHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKSB7XG4gICAgdmFyIG1ldGFEb2NJZCA9ICdfbG9jYWwvZG9jXycgKyBkb2NJZDtcbiAgICB2YXIgZGVmYXVsdE1ldGFEb2MgPSB7X2lkOiBtZXRhRG9jSWQsIGtleXM6IFtdfTtcbiAgICB2YXIgZG9jRGF0YSA9IGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLmdldChkb2NJZCk7XG4gICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IGRvY0RhdGFbMF07XG4gICAgdmFyIGNoYW5nZXMgPSBkb2NEYXRhWzFdO1xuXG4gICAgZnVuY3Rpb24gZ2V0TWV0YURvYygpIHtcbiAgICAgIGlmIChpc0dlbk9uZShjaGFuZ2VzKSkge1xuICAgICAgICAvLyBnZW5lcmF0aW9uIDEsIHNvIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGluaXRpYWwgc3RhdGVcbiAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKGF2b2lkcyB1bm5lY2Vzc2FyeSBHRVRzKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRlZmF1bHRNZXRhRG9jKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2aWV3LmRiLmdldChtZXRhRG9jSWQpLmNhdGNoKGRlZmF1bHRzVG8oZGVmYXVsdE1ldGFEb2MpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXlWYWx1ZURvY3MobWV0YURvYykge1xuICAgICAgaWYgKCFtZXRhRG9jLmtleXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIG5vIGtleXMsIG5vIG5lZWQgZm9yIGEgbG9va3VwXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jvd3M6IFtdfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmlldy5kYi5hbGxEb2NzKHtcbiAgICAgICAga2V5czogbWV0YURvYy5rZXlzLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKSB7XG4gICAgICB2YXIga3ZEb2NzID0gW107XG4gICAgICB2YXIgb2xkS2V5cyA9IG5ldyBFeHBvcnRlZFNldCgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0ga3ZEb2NzUmVzLnJvd3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IGt2RG9jc1Jlcy5yb3dzW2ldO1xuICAgICAgICB2YXIgZG9jID0gcm93LmRvYztcbiAgICAgICAgaWYgKCFkb2MpIHsgLy8gZGVsZXRlZFxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGt2RG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIG9sZEtleXMuYWRkKGRvYy5faWQpO1xuICAgICAgICBkb2MuX2RlbGV0ZWQgPSAhaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmhhcyhkb2MuX2lkKTtcbiAgICAgICAgaWYgKCFkb2MuX2RlbGV0ZWQpIHtcbiAgICAgICAgICB2YXIga2V5VmFsdWUgPSBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMuZ2V0KGRvYy5faWQpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBkb2MudmFsdWUgPSBrZXlWYWx1ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBuZXdLZXlzID0gbWFwVG9LZXlzQXJyYXkoaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKTtcbiAgICAgIG5ld0tleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghb2xkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIC8vIG5ldyBkb2NcbiAgICAgICAgICB2YXIga3ZEb2MgPSB7XG4gICAgICAgICAgICBfaWQ6IGtleVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIGtleVZhbHVlID0gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmdldChrZXkpO1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIGtleVZhbHVlKSB7XG4gICAgICAgICAgICBrdkRvYy52YWx1ZSA9IGtleVZhbHVlLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrdkRvY3MucHVzaChrdkRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbWV0YURvYy5rZXlzID0gdW5pcShuZXdLZXlzLmNvbmNhdChtZXRhRG9jLmtleXMpKTtcbiAgICAgIGt2RG9jcy5wdXNoKG1ldGFEb2MpO1xuXG4gICAgICByZXR1cm4ga3ZEb2NzO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRNZXRhRG9jKCkudGhlbihmdW5jdGlvbiAobWV0YURvYykge1xuICAgICAgcmV0dXJuIGdldEtleVZhbHVlRG9jcyhtZXRhRG9jKS50aGVuKGZ1bmN0aW9uIChrdkRvY3NSZXMpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NLZXlWYWx1ZURvY3MobWV0YURvYywga3ZEb2NzUmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXBkYXRlcyBhbGwgZW1pdHRlZCBrZXkvdmFsdWUgZG9jcyBhbmQgbWV0YURvY3MgaW4gdGhlIG1ydmlldyBkYXRhYmFzZVxuICAvLyBmb3IgdGhlIGdpdmVuIGJhdGNoIG9mIGRvY3VtZW50cyBmcm9tIHRoZSBzb3VyY2UgZGF0YWJhc2VcbiAgZnVuY3Rpb24gc2F2ZUtleVZhbHVlcyh2aWV3LCBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cywgc2VxKSB7XG4gICAgdmFyIHNlcURvY0lkID0gJ19sb2NhbC9sYXN0U2VxJztcbiAgICByZXR1cm4gdmlldy5kYi5nZXQoc2VxRG9jSWQpXG4gICAgICAuY2F0Y2goZGVmYXVsdHNUbyh7X2lkOiBzZXFEb2NJZCwgc2VxOiAwfSkpXG4gICAgICAudGhlbihmdW5jdGlvbiAobGFzdFNlcURvYykge1xuICAgICAgICB2YXIgZG9jSWRzID0gbWFwVG9LZXlzQXJyYXkoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZG9jSWRzLm1hcChmdW5jdGlvbiAoZG9jSWQpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RG9jc1RvUGVyc2lzdChkb2NJZCwgdmlldywgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpO1xuICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAobGlzdE9mRG9jc1RvUGVyc2lzdCkge1xuICAgICAgICAgIHZhciBkb2NzVG9QZXJzaXN0ID0gZmxhdHRlbihsaXN0T2ZEb2NzVG9QZXJzaXN0KTtcbiAgICAgICAgICBsYXN0U2VxRG9jLnNlcSA9IHNlcTtcbiAgICAgICAgICBkb2NzVG9QZXJzaXN0LnB1c2gobGFzdFNlcURvYyk7XG4gICAgICAgICAgLy8gd3JpdGUgYWxsIGRvY3MgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLCB1cGRhdGUgdGhlIHNlcSBvbmNlXG4gICAgICAgICAgcmV0dXJuIHZpZXcuZGIuYnVsa0RvY3Moe2RvY3MgOiBkb2NzVG9QZXJzaXN0fSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRRdWV1ZSh2aWV3KSB7XG4gICAgdmFyIHZpZXdOYW1lID0gdHlwZW9mIHZpZXcgPT09ICdzdHJpbmcnID8gdmlldyA6IHZpZXcubmFtZTtcbiAgICB2YXIgcXVldWUgPSBwZXJzaXN0ZW50UXVldWVzW3ZpZXdOYW1lXTtcbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICBxdWV1ZSA9IHBlcnNpc3RlbnRRdWV1ZXNbdmlld05hbWVdID0gbmV3IFRhc2tRdWV1ZSQxKCk7XG4gICAgfVxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdXBkYXRlVmlld0luUXVldWUodmlldywgb3B0cyk7XG4gICAgfSkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXdJblF1ZXVlKHZpZXcsIG9wdHMpIHtcbiAgICAvLyBiaW5kIHRoZSBlbWl0IGZ1bmN0aW9uIG9uY2VcbiAgICB2YXIgbWFwUmVzdWx0cztcbiAgICB2YXIgZG9jO1xuXG4gICAgZnVuY3Rpb24gZW1pdChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb3V0cHV0ID0ge2lkOiBkb2MuX2lkLCBrZXk6IG5vcm1hbGl6ZUtleShrZXkpfTtcbiAgICAgIC8vIERvbid0IGV4cGxpY2l0bHkgc3RvcmUgdGhlIHZhbHVlIHVubGVzcyBpdCdzIGRlZmluZWQgYW5kIG5vbi1udWxsLlxuICAgICAgLy8gVGhpcyBzYXZlcyBvbiBzdG9yYWdlIHNwYWNlLCBiZWNhdXNlIG9mdGVuIHBlb3BsZSBkb24ndCB1c2UgaXQuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQudmFsdWUgPSBub3JtYWxpemVLZXkodmFsdWUpO1xuICAgICAgfVxuICAgICAgbWFwUmVzdWx0cy5wdXNoKG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIG1hcEZ1biA9IG1hcHBlcih2aWV3Lm1hcEZ1biwgZW1pdCk7XG5cbiAgICB2YXIgY3VycmVudFNlcSA9IHZpZXcuc2VxIHx8IDA7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQ2hhbmdlKGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzYXZlS2V5VmFsdWVzKHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXhlZF9kb2NzID0gMDtcbiAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICB2aWV3OiB2aWV3Lm5hbWUsXG4gICAgICBpbmRleGVkX2RvY3M6IGluZGV4ZWRfZG9jc1xuICAgIH07XG4gICAgdmlldy5zb3VyY2VEQi5lbWl0KCdpbmRleGluZycsIHByb2dyZXNzKTtcblxuICAgIHZhciBxdWV1ZSA9IG5ldyBUYXNrUXVldWUkMSgpO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc05leHRCYXRjaCgpIHtcbiAgICAgIHJldHVybiB2aWV3LnNvdXJjZURCLmNoYW5nZXMoe1xuICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSxcbiAgICAgICAgY29uZmxpY3RzOiB0cnVlLFxuICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICAgIHN0eWxlOiAnYWxsX2RvY3MnLFxuICAgICAgICBzaW5jZTogY3VycmVudFNlcSxcbiAgICAgICAgbGltaXQ6IG9wdHMuY2hhbmdlc19iYXRjaF9zaXplXG4gICAgICB9KS50aGVuKHByb2Nlc3NCYXRjaCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpO1xuICAgICAgcXVldWUuYWRkKHByb2Nlc3NDaGFuZ2UoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMsIGN1cnJlbnRTZXEpKTtcblxuICAgICAgaW5kZXhlZF9kb2NzID0gaW5kZXhlZF9kb2NzICsgcmVzdWx0cy5sZW5ndGg7XG4gICAgICBsZXQgcHJvZ3Jlc3MgPSB7XG4gICAgICAgIHZpZXc6IHZpZXcubmFtZSxcbiAgICAgICAgbGFzdF9zZXE6IHJlc3BvbnNlLmxhc3Rfc2VxLFxuICAgICAgICByZXN1bHRzX2NvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgaW5kZXhlZF9kb2NzOiBpbmRleGVkX2RvY3NcbiAgICAgIH07XG4gICAgICB2aWV3LnNvdXJjZURCLmVtaXQoJ2luZGV4aW5nJywgcHJvZ3Jlc3MpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPCBvcHRzLmNoYW5nZXNfYmF0Y2hfc2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvY2Vzc05leHRCYXRjaCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKHJlc3VsdHMpIHtcbiAgICAgIHZhciBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IHJlc3VsdHNbaV07XG4gICAgICAgIGlmIChjaGFuZ2UuZG9jLl9pZFswXSAhPT0gJ18nKSB7XG4gICAgICAgICAgbWFwUmVzdWx0cyA9IFtdO1xuICAgICAgICAgIGRvYyA9IGNoYW5nZS5kb2M7XG5cbiAgICAgICAgICBpZiAoIWRvYy5fZGVsZXRlZCkge1xuICAgICAgICAgICAgdHJ5TWFwKHZpZXcuc291cmNlREIsIG1hcEZ1biwgZG9jKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwUmVzdWx0cy5zb3J0KHNvcnRCeUtleVRoZW5WYWx1ZSk7XG5cbiAgICAgICAgICB2YXIgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzID0gY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKG1hcFJlc3VsdHMpO1xuICAgICAgICAgIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLnNldChjaGFuZ2UuZG9jLl9pZCwgW1xuICAgICAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLFxuICAgICAgICAgICAgY2hhbmdlLmNoYW5nZXNcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50U2VxID0gY2hhbmdlLnNlcTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMobWFwUmVzdWx0cykge1xuICAgICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgdmFyIGxhc3RLZXk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbWFwUmVzdWx0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgZW1pdHRlZEtleVZhbHVlID0gbWFwUmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIGNvbXBsZXhLZXkgPSBbZW1pdHRlZEtleVZhbHVlLmtleSwgZW1pdHRlZEtleVZhbHVlLmlkXTtcbiAgICAgICAgaWYgKGkgPiAwICYmIGNvbGxhdGUoZW1pdHRlZEtleVZhbHVlLmtleSwgbGFzdEtleSkgPT09IDApIHtcbiAgICAgICAgICBjb21wbGV4S2V5LnB1c2goaSk7IC8vIGR1cCBrZXkraWQsIHNvIG1ha2UgaXQgdW5pcXVlXG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLnNldCh0b0luZGV4YWJsZVN0cmluZyhjb21wbGV4S2V5KSwgZW1pdHRlZEtleVZhbHVlKTtcbiAgICAgICAgbGFzdEtleSA9IGVtaXR0ZWRLZXlWYWx1ZS5rZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzTmV4dEJhdGNoKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVldWUuZmluaXNoKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2aWV3LnNlcSA9IGN1cnJlbnRTZXE7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWR1Y2VWaWV3KHZpZXcsIHJlc3VsdHMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5ncm91cF9sZXZlbCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9wdGlvbnMuZ3JvdXBfbGV2ZWw7XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZEdyb3VwID0gb3B0aW9ucy5ncm91cCB8fCBvcHRpb25zLmdyb3VwX2xldmVsO1xuXG4gICAgdmFyIHJlZHVjZUZ1biA9IHJlZHVjZXIodmlldy5yZWR1Y2VGdW4pO1xuXG4gICAgdmFyIGdyb3VwcyA9IFtdO1xuICAgIHZhciBsdmwgPSBpc05hTihvcHRpb25zLmdyb3VwX2xldmVsKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6XG4gICAgICBvcHRpb25zLmdyb3VwX2xldmVsO1xuICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGxhc3QgPSBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIGdyb3VwS2V5ID0gc2hvdWxkR3JvdXAgPyBlLmtleSA6IG51bGw7XG5cbiAgICAgIC8vIG9ubHkgc2V0IGdyb3VwX2xldmVsIGZvciBhcnJheSBrZXlzXG4gICAgICBpZiAoc2hvdWxkR3JvdXAgJiYgQXJyYXkuaXNBcnJheShncm91cEtleSkpIHtcbiAgICAgICAgZ3JvdXBLZXkgPSBncm91cEtleS5zbGljZSgwLCBsdmwpO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdCAmJiBjb2xsYXRlKGxhc3QuZ3JvdXBLZXksIGdyb3VwS2V5KSA9PT0gMCkge1xuICAgICAgICBsYXN0LmtleXMucHVzaChbZS5rZXksIGUuaWRdKTtcbiAgICAgICAgbGFzdC52YWx1ZXMucHVzaChlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICBrZXlzOiBbW2Uua2V5LCBlLmlkXV0sXG4gICAgICAgIHZhbHVlczogW2UudmFsdWVdLFxuICAgICAgICBncm91cEtleTogZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZSA9IGdyb3Vwc1tpXTtcbiAgICAgIHZhciByZWR1Y2VUcnkgPSB0cnlSZWR1Y2Uodmlldy5zb3VyY2VEQiwgcmVkdWNlRnVuLCBlLmtleXMsIGUudmFsdWVzLCBmYWxzZSk7XG4gICAgICBpZiAocmVkdWNlVHJ5LmVycm9yICYmIHJlZHVjZVRyeS5lcnJvciBpbnN0YW5jZW9mIEJ1aWx0SW5FcnJvcikge1xuICAgICAgICAvLyBDb3VjaERCIHJldHVybnMgYW4gZXJyb3IgaWYgYSBidWlsdC1pbiBlcnJvcnMgb3V0XG4gICAgICAgIHRocm93IHJlZHVjZVRyeS5lcnJvcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIC8vIENvdWNoREIganVzdCBzZXRzIHRoZSB2YWx1ZSB0byBudWxsIGlmIGEgbm9uLWJ1aWx0LWluIGVycm9ycyBvdXRcbiAgICAgICAgdmFsdWU6IHJlZHVjZVRyeS5lcnJvciA/IG51bGwgOiByZWR1Y2VUcnkub3V0cHV0LFxuICAgICAgICBrZXk6IGUuZ3JvdXBLZXlcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBubyB0b3RhbF9yb3dzL29mZnNldCB3aGVuIHJlZHVjaW5nXG4gICAgcmV0dXJuIHtyb3dzOiBzbGljZVJlc3VsdHMocmVzdWx0cywgb3B0aW9ucy5saW1pdCwgb3B0aW9ucy5za2lwKX07XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVZpZXcodmlldywgb3B0cykge1xuICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXcpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKTtcbiAgICB9KSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVlcnlWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKSB7XG4gICAgdmFyIHRvdGFsUm93cztcbiAgICB2YXIgc2hvdWxkUmVkdWNlID0gdmlldy5yZWR1Y2VGdW4gJiYgb3B0cy5yZWR1Y2UgIT09IGZhbHNlO1xuICAgIHZhciBza2lwID0gb3B0cy5za2lwIHx8IDA7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnICYmICFvcHRzLmtleXMubGVuZ3RoKSB7XG4gICAgICAvLyBlcXVpdmFsZW50IHF1ZXJ5XG4gICAgICBvcHRzLmxpbWl0ID0gMDtcbiAgICAgIGRlbGV0ZSBvcHRzLmtleXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmV0Y2hGcm9tVmlldyh2aWV3T3B0cykge1xuICAgICAgdmlld09wdHMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICAgIHJldHVybiB2aWV3LmRiLmFsbERvY3Modmlld09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB0b3RhbFJvd3MgPSByZXMudG90YWxfcm93cztcbiAgICAgICAgcmV0dXJuIHJlcy5yb3dzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG5cbiAgICAgICAgICAvLyBpbXBsaWNpdCBtaWdyYXRpb24gLSBpbiBvbGRlciB2ZXJzaW9ucyBvZiBQb3VjaERCLFxuICAgICAgICAgIC8vIHdlIGV4cGxpY2l0bHkgc3RvcmVkIHRoZSBkb2MgYXMge2lkOiAuLi4sIGtleTogLi4uLCB2YWx1ZTogLi4ufVxuICAgICAgICAgIC8vIHRoaXMgaXMgdGVzdGVkIGluIGEgbWlncmF0aW9uIHRlc3RcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGlmICgndmFsdWUnIGluIHJlc3VsdC5kb2MgJiYgdHlwZW9mIHJlc3VsdC5kb2MudmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICByZXN1bHQuZG9jLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdC5kb2MudmFsdWUpLnNvcnQoKTtcbiAgICAgICAgICAgIC8vIHRoaXMgZGV0ZWN0aW9uIG1ldGhvZCBpcyBub3QgcGVyZmVjdCwgYnV0IGl0J3MgdW5saWtlbHkgdGhlIHVzZXJcbiAgICAgICAgICAgIC8vIGVtaXR0ZWQgYSB2YWx1ZSB3aGljaCB3YXMgYW4gb2JqZWN0IHdpdGggdGhlc2UgMyBleGFjdCBrZXlzXG4gICAgICAgICAgICB2YXIgZXhwZWN0ZWRLZXlzID0gWydpZCcsICdrZXknLCAndmFsdWUnXTtcbiAgICAgICAgICAgIGlmICghKGtleXMgPCBleHBlY3RlZEtleXMgfHwga2V5cyA+IGV4cGVjdGVkS2V5cykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb2MudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHBhcnNlZEtleUFuZERvY0lkID0gcGFyc2VJbmRleGFibGVTdHJpbmcocmVzdWx0LmRvYy5faWQpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IHBhcnNlZEtleUFuZERvY0lkWzBdLFxuICAgICAgICAgICAgaWQ6IHBhcnNlZEtleUFuZERvY0lkWzFdLFxuICAgICAgICAgICAgdmFsdWU6ICgndmFsdWUnIGluIHJlc3VsdC5kb2MgPyByZXN1bHQuZG9jLnZhbHVlIDogbnVsbClcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTWFwUmVzdWx0c1JlYWR5KHJvd3MpIHtcbiAgICAgIHZhciBmaW5hbFJlc3VsdHM7XG4gICAgICBpZiAoc2hvdWxkUmVkdWNlKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHJlZHVjZVZpZXcodmlldywgcm93cywgb3B0cyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmtleXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHtcbiAgICAgICAgICB0b3RhbF9yb3dzOiB0b3RhbFJvd3MsXG4gICAgICAgICAgb2Zmc2V0OiBza2lwLFxuICAgICAgICAgIHJvd3M6IHJvd3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1cHBvcnQgbGltaXQsIHNraXAgZm9yIGtleXMgcXVlcnlcbiAgICAgICAgZmluYWxSZXN1bHRzID0ge1xuICAgICAgICAgIHRvdGFsX3Jvd3M6IHRvdGFsUm93cyxcbiAgICAgICAgICBvZmZzZXQ6IHNraXAsXG4gICAgICAgICAgcm93czogc2xpY2VSZXN1bHRzKHJvd3Msb3B0cy5saW1pdCxvcHRzLnNraXApXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgICAgZmluYWxSZXN1bHRzLnVwZGF0ZV9zZXEgPSB2aWV3LnNlcTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgICB2YXIgZG9jSWRzID0gdW5pcShyb3dzLm1hcChyb3dUb0RvY0lkKSk7XG5cbiAgICAgICAgcmV0dXJuIHZpZXcuc291cmNlREIuYWxsRG9jcyh7XG4gICAgICAgICAga2V5czogZG9jSWRzLFxuICAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZSxcbiAgICAgICAgICBjb25mbGljdHM6IG9wdHMuY29uZmxpY3RzLFxuICAgICAgICAgIGF0dGFjaG1lbnRzOiBvcHRzLmF0dGFjaG1lbnRzLFxuICAgICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnlcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWxsRG9jc1Jlcykge1xuICAgICAgICAgIHZhciBkb2NJZHNUb0RvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgICAgICBhbGxEb2NzUmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICBkb2NJZHNUb0RvY3Muc2V0KHJvdy5pZCwgcm93LmRvYyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHZhciBkb2NJZCA9IHJvd1RvRG9jSWQocm93KTtcbiAgICAgICAgICAgIHZhciBkb2MgPSBkb2NJZHNUb0RvY3MuZ2V0KGRvY0lkKTtcbiAgICAgICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgICAgcm93LmRvYyA9IGRvYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHRzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIga2V5cyA9IG9wdHMua2V5cztcbiAgICAgIHZhciBmZXRjaFByb21pc2VzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmlld09wdHMgPSB7XG4gICAgICAgICAgc3RhcnRrZXkgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5XSksXG4gICAgICAgICAgZW5ka2V5ICAgOiB0b0luZGV4YWJsZVN0cmluZyhba2V5LCB7fV0pXG4gICAgICAgIH07XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgICAgdmlld09wdHMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZmV0Y2hQcm9taXNlcykudGhlbihmbGF0dGVuKS50aGVuKG9uTWFwUmVzdWx0c1JlYWR5KTtcbiAgICB9IGVsc2UgeyAvLyBub3JtYWwgcXVlcnksIG5vICdrZXlzJ1xuICAgICAgdmFyIHZpZXdPcHRzID0ge1xuICAgICAgICBkZXNjZW5kaW5nIDogb3B0cy5kZXNjZW5kaW5nXG4gICAgICB9O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgIHZpZXdPcHRzLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXJ0a2V5O1xuICAgICAgdmFyIGVuZGtleTtcbiAgICAgIGlmICgnc3RhcnRfa2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ3N0YXJ0a2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIHN0YXJ0a2V5ID0gb3B0cy5zdGFydGtleTtcbiAgICAgIH1cbiAgICAgIGlmICgnZW5kX2tleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZF9rZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ2VuZGtleScgaW4gb3B0cykge1xuICAgICAgICBlbmRrZXkgPSBvcHRzLmVuZGtleTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3RhcnRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0gb3B0cy5kZXNjZW5kaW5nID9cbiAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhbc3RhcnRrZXksIHt9XSkgOlxuICAgICAgICAgIHRvSW5kZXhhYmxlU3RyaW5nKFtzdGFydGtleV0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBlbmRrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpbmNsdXNpdmVFbmQgPSBvcHRzLmluY2x1c2l2ZV9lbmQgIT09IGZhbHNlO1xuICAgICAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICAgICAgaW5jbHVzaXZlRW5kID0gIWluY2x1c2l2ZUVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IHRvSW5kZXhhYmxlU3RyaW5nKFxuICAgICAgICAgIGluY2x1c2l2ZUVuZCA/IFtlbmRrZXksIHt9XSA6IFtlbmRrZXldKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5rZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBrZXlTdGFydCA9IHRvSW5kZXhhYmxlU3RyaW5nKFtvcHRzLmtleV0pO1xuICAgICAgICB2YXIga2V5RW5kID0gdG9JbmRleGFibGVTdHJpbmcoW29wdHMua2V5LCB7fV0pO1xuICAgICAgICBpZiAodmlld09wdHMuZGVzY2VuZGluZykge1xuICAgICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IGtleVN0YXJ0O1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5RW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZXdPcHRzLnN0YXJ0a2V5ID0ga2V5U3RhcnQ7XG4gICAgICAgICAgdmlld09wdHMuZW5ka2V5ID0ga2V5RW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNob3VsZFJlZHVjZSkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubGltaXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdmlld09wdHMubGltaXQgPSBvcHRzLmxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIHZpZXdPcHRzLnNraXAgPSBza2lwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZldGNoRnJvbVZpZXcodmlld09wdHMpLnRoZW4ob25NYXBSZXN1bHRzUmVhZHkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGh0dHBWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5mZXRjaCgnX3ZpZXdfY2xlYW51cCcsIHtcbiAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYWxWaWV3Q2xlYW51cChkYikge1xuICAgIHJldHVybiBkYi5nZXQoJ19sb2NhbC8nICsgbG9jYWxEb2NOYW1lKS50aGVuKGZ1bmN0aW9uIChtZXRhRG9jKSB7XG4gICAgICB2YXIgZG9jc1RvVmlld3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgIE9iamVjdC5rZXlzKG1ldGFEb2Mudmlld3MpLmZvckVhY2goZnVuY3Rpb24gKGZ1bGxWaWV3TmFtZSkge1xuICAgICAgICB2YXIgcGFydHMgPSBwYXJzZVZpZXdOYW1lKGZ1bGxWaWV3TmFtZSk7XG4gICAgICAgIHZhciBkZXNpZ25Eb2NOYW1lID0gJ19kZXNpZ24vJyArIHBhcnRzWzBdO1xuICAgICAgICB2YXIgdmlld05hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgdmFyIHZpZXdzID0gZG9jc1RvVmlld3MuZ2V0KGRlc2lnbkRvY05hbWUpO1xuICAgICAgICBpZiAoIXZpZXdzKSB7XG4gICAgICAgICAgdmlld3MgPSBuZXcgRXhwb3J0ZWRTZXQoKTtcbiAgICAgICAgICBkb2NzVG9WaWV3cy5zZXQoZGVzaWduRG9jTmFtZSwgdmlld3MpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXdzLmFkZCh2aWV3TmFtZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICBrZXlzIDogbWFwVG9LZXlzQXJyYXkoZG9jc1RvVmlld3MpLFxuICAgICAgICBpbmNsdWRlX2RvY3MgOiB0cnVlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRiLmFsbERvY3Mob3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHZhciB2aWV3c1RvU3RhdHVzID0ge307XG4gICAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHZhciBkZG9jTmFtZSA9IHJvdy5rZXkuc3Vic3RyaW5nKDgpOyAvLyBjdXRzIG9mZiAnX2Rlc2lnbi8nXG4gICAgICAgICAgZG9jc1RvVmlld3MuZ2V0KHJvdy5rZXkpLmZvckVhY2goZnVuY3Rpb24gKHZpZXdOYW1lKSB7XG4gICAgICAgICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZGRvY05hbWUgKyAnLycgKyB2aWV3TmFtZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKCFtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pIHtcbiAgICAgICAgICAgICAgLy8gbmV3IGZvcm1hdCwgd2l0aG91dCBzbGFzaGVzLCB0byBzdXBwb3J0IFBvdWNoREIgMi4yLjBcbiAgICAgICAgICAgICAgLy8gbWlncmF0aW9uIHRlc3QgaW4gcG91Y2hkYidzIGJyb3dzZXIubWlncmF0aW9uLmpzIHZlcmlmaWVzIHRoaXNcbiAgICAgICAgICAgICAgZnVsbFZpZXdOYW1lID0gdmlld05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmlld0RCTmFtZXMgPSBPYmplY3Qua2V5cyhtZXRhRG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0pO1xuICAgICAgICAgICAgLy8gZGVzaWduIGRvYyBkZWxldGVkLCBvciB2aWV3IGZ1bmN0aW9uIG5vbmV4aXN0ZW50XG4gICAgICAgICAgICB2YXIgc3RhdHVzSXNHb29kID0gcm93LmRvYyAmJiByb3cuZG9jLnZpZXdzICYmXG4gICAgICAgICAgICAgIHJvdy5kb2Mudmlld3Nbdmlld05hbWVdO1xuICAgICAgICAgICAgdmlld0RCTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAodmlld0RCTmFtZSkge1xuICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdID1cbiAgICAgICAgICAgICAgICB2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdIHx8IHN0YXR1c0lzR29vZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGRic1RvRGVsZXRlID0gT2JqZWN0LmtleXModmlld3NUb1N0YXR1cykuZmlsdGVyKFxuICAgICAgICAgIGZ1bmN0aW9uICh2aWV3REJOYW1lKSB7IHJldHVybiAhdmlld3NUb1N0YXR1c1t2aWV3REJOYW1lXTsgfSk7XG4gICAgICAgIHZhciBkZXN0cm95UHJvbWlzZXMgPSBkYnNUb0RlbGV0ZS5tYXAoZnVuY3Rpb24gKHZpZXdEQk5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gc2VxdWVudGlhbGl6ZShnZXRRdWV1ZSh2aWV3REJOYW1lKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBkYi5jb25zdHJ1Y3Rvcih2aWV3REJOYW1lLCBkYi5fX29wdHMpLmRlc3Ryb3koKTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRlc3Ryb3lQcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZX07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgZGVmYXVsdHNUbyh7b2s6IHRydWV9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3F1ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuICAgIGlmIChpc1JlbW90ZShkYikpIHtcbiAgICAgIHJldHVybiBodHRwUXVlcnkoZGIsIGZ1biwgb3B0cyk7XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZVZpZXdPcHRzID0ge1xuICAgICAgY2hhbmdlc19iYXRjaF9zaXplOiBkYi5fX29wdHMudmlld191cGRhdGVfY2hhbmdlc19iYXRjaF9zaXplIHx8IENIQU5HRVNfQkFUQ0hfU0laRSQxXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZnVuICE9PSAnc3RyaW5nJykge1xuICAgICAgLy8gdGVtcF92aWV3XG4gICAgICBjaGVja1F1ZXJ5UGFyc2VFcnJvcihvcHRzLCBmdW4pO1xuXG4gICAgICB0ZW1wVmlld1F1ZXVlLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGVWaWV3UHJvbWlzZSA9IGNyZWF0ZVZpZXcoXG4gICAgICAgICAgLyogc291cmNlREIgKi8gZGIsXG4gICAgICAgICAgLyogdmlld05hbWUgKi8gJ3RlbXBfdmlldy90ZW1wX3ZpZXcnLFxuICAgICAgICAgIC8qIG1hcEZ1biAqLyBmdW4ubWFwLFxuICAgICAgICAgIC8qIHJlZHVjZUZ1biAqLyBmdW4ucmVkdWNlLFxuICAgICAgICAgIC8qIHRlbXBvcmFyeSAqLyB0cnVlLFxuICAgICAgICAgIC8qIGxvY2FsRG9jTmFtZSAqLyBsb2NhbERvY05hbWUpO1xuICAgICAgICByZXR1cm4gY3JlYXRlVmlld1Byb21pc2UudGhlbihmdW5jdGlvbiAodmlldykge1xuICAgICAgICAgIHJldHVybiBmaW4odXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlcnlWaWV3KHZpZXcsIG9wdHMpO1xuICAgICAgICAgIH0pLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5kYi5kZXN0cm95KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGVtcFZpZXdRdWV1ZS5maW5pc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGVyc2lzdGVudCB2aWV3XG4gICAgICB2YXIgZnVsbFZpZXdOYW1lID0gZnVuO1xuICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdWxsVmlld05hbWUpO1xuICAgICAgdmFyIGRlc2lnbkRvY05hbWUgPSBwYXJ0c1swXTtcbiAgICAgIHZhciB2aWV3TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgcmV0dXJuIGRiLmdldCgnX2Rlc2lnbi8nICsgZGVzaWduRG9jTmFtZSkudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIHZhciBmdW4gPSBkb2Mudmlld3MgJiYgZG9jLnZpZXdzW3ZpZXdOYW1lXTtcblxuICAgICAgICBpZiAoIWZ1bikge1xuICAgICAgICAgIC8vIGJhc2ljIHZhbGlkYXRvcjsgaXQncyBhc3N1bWVkIHRoYXQgZXZlcnkgc3ViY2xhc3Mgd291bGQgd2FudCB0aGlzXG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ2Rkb2MgJyArIGRvYy5faWQgKyAnIGhhcyBubyB2aWV3IG5hbWVkICcgK1xuICAgICAgICAgICAgdmlld05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGRvY1ZhbGlkYXRvcihkb2MsIHZpZXdOYW1lKTtcbiAgICAgICAgY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0cywgZnVuKTtcblxuICAgICAgICB2YXIgY3JlYXRlVmlld1Byb21pc2UgPSBjcmVhdGVWaWV3KFxuICAgICAgICAgIC8qIHNvdXJjZURCICovIGRiLFxuICAgICAgICAgIC8qIHZpZXdOYW1lICovIGZ1bGxWaWV3TmFtZSxcbiAgICAgICAgICAvKiBtYXBGdW4gKi8gZnVuLm1hcCxcbiAgICAgICAgICAvKiByZWR1Y2VGdW4gKi8gZnVuLnJlZHVjZSxcbiAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8gZmFsc2UsXG4gICAgICAgICAgLyogbG9jYWxEb2NOYW1lICovIGxvY2FsRG9jTmFtZSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVWaWV3UHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgaWYgKG9wdHMuc3RhbGUgPT09ICdvaycgfHwgb3B0cy5zdGFsZSA9PT0gJ3VwZGF0ZV9hZnRlcicpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLnN0YWxlID09PSAndXBkYXRlX2FmdGVyJykge1xuICAgICAgICAgICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXcodmlldywgdXBkYXRlVmlld09wdHMpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gc3RhbGUgbm90IG9rXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWJzdHJhY3RRdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IG9wdHMgPyBjb2VyY2VPcHRpb25zKG9wdHMpIDoge307XG5cbiAgICBpZiAodHlwZW9mIGZ1biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZnVuID0ge21hcCA6IGZ1bn07XG4gICAgfVxuXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBxdWVyeVByb21pc2VkKGRiLCBmdW4sIG9wdHMpO1xuICAgIH0pO1xuICAgIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgdmFyIGFic3RyYWN0Vmlld0NsZWFudXAgPSBjYWxsYmFja2lmeShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRiID0gdGhpcztcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGIuX3ZpZXdDbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY3VzdG9tVmlld0NsZWFudXAoZGIpO1xuICAgIH1cbiAgICBpZiAoaXNSZW1vdGUoZGIpKSB7XG4gICAgICByZXR1cm4gaHR0cFZpZXdDbGVhbnVwKGRiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlld0NsZWFudXAoZGIpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHF1ZXJ5OiBhYnN0cmFjdFF1ZXJ5LFxuICAgIHZpZXdDbGVhbnVwOiBhYnN0cmFjdFZpZXdDbGVhbnVwXG4gIH07XG59XG5cbnZhciBidWlsdEluUmVkdWNlID0ge1xuICBfc3VtOiBmdW5jdGlvbiAoa2V5cywgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHN1bSh2YWx1ZXMpO1xuICB9LFxuXG4gIF9jb3VudDogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoO1xuICB9LFxuXG4gIF9zdGF0czogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIC8vIG5vIG5lZWQgdG8gaW1wbGVtZW50IHJlcmVkdWNlPXRydWUsIGJlY2F1c2UgUG91Y2hcbiAgICAvLyB3aWxsIG5ldmVyIGNhbGwgaXRcbiAgICBmdW5jdGlvbiBzdW1zcXIodmFsdWVzKSB7XG4gICAgICB2YXIgX3N1bXNxciA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBudW0gPSB2YWx1ZXNbaV07XG4gICAgICAgIF9zdW1zcXIgKz0gKG51bSAqIG51bSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3N1bXNxcjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1bSAgICAgOiBzdW0odmFsdWVzKSxcbiAgICAgIG1pbiAgICAgOiBNYXRoLm1pbi5hcHBseShudWxsLCB2YWx1ZXMpLFxuICAgICAgbWF4ICAgICA6IE1hdGgubWF4LmFwcGx5KG51bGwsIHZhbHVlcyksXG4gICAgICBjb3VudCAgIDogdmFsdWVzLmxlbmd0aCxcbiAgICAgIHN1bXNxciA6IHN1bXNxcih2YWx1ZXMpXG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpIHtcbiAgaWYgKC9eX3N1bS8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX3N1bTtcbiAgfSBlbHNlIGlmICgvXl9jb3VudC8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX2NvdW50O1xuICB9IGVsc2UgaWYgKC9eX3N0YXRzLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICByZXR1cm4gYnVpbHRJblJlZHVjZS5fc3RhdHM7XG4gIH0gZWxzZSBpZiAoL15fLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVkdWNlRnVuU3RyaW5nICsgJyBpcyBub3QgYSBzdXBwb3J0ZWQgcmVkdWNlIGZ1bmN0aW9uLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcHBlcihtYXBGdW4sIGVtaXQpIHtcbiAgLy8gZm9yIHRlbXBfdmlld3Mgb25lIGNhbiB1c2UgZW1pdChkb2MsIGVtaXQpLCBzZWUgIzM4XG4gIGlmICh0eXBlb2YgbWFwRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgbWFwRnVuLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBvcmlnTWFwID0gbWFwRnVuO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZG9jKSB7XG4gICAgICByZXR1cm4gb3JpZ01hcChkb2MsIGVtaXQpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV2YWxGdW5jdGlvbldpdGhFdmFsKG1hcEZ1bi50b1N0cmluZygpLCBlbWl0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VyKHJlZHVjZUZ1bikge1xuICB2YXIgcmVkdWNlRnVuU3RyaW5nID0gcmVkdWNlRnVuLnRvU3RyaW5nKCk7XG4gIHZhciBidWlsdEluID0gZ2V0QnVpbHRJbihyZWR1Y2VGdW5TdHJpbmcpO1xuICBpZiAoYnVpbHRJbikge1xuICAgIHJldHVybiBidWlsdEluO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBldmFsRnVuY3Rpb25XaXRoRXZhbChyZWR1Y2VGdW5TdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRkb2NWYWxpZGF0b3IoZGRvYywgdmlld05hbWUpIHtcbiAgdmFyIGZ1biA9IGRkb2Mudmlld3MgJiYgZGRvYy52aWV3c1t2aWV3TmFtZV07XG4gIGlmICh0eXBlb2YgZnVuLm1hcCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignZGRvYyAnICsgZGRvYy5faWQgKyAnIGhhcyBubyBzdHJpbmcgdmlldyBuYW1lZCAnICtcbiAgICAgIHZpZXdOYW1lICsgJywgaW5zdGVhZCBmb3VuZCBvYmplY3Qgb2YgdHlwZTogJyArIHR5cGVvZiBmdW4ubWFwKTtcbiAgfVxufVxuXG52YXIgbG9jYWxEb2NOYW1lID0gJ21ydmlld3MnO1xudmFyIGFic3RyYWN0ID0gY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UobG9jYWxEb2NOYW1lLCBtYXBwZXIsIHJlZHVjZXIsIGRkb2NWYWxpZGF0b3IpO1xuXG5mdW5jdGlvbiBxdWVyeShmdW4sIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhYnN0cmFjdC5xdWVyeS5jYWxsKHRoaXMsIGZ1biwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiB2aWV3Q2xlYW51cChjYWxsYmFjaykge1xuICByZXR1cm4gYWJzdHJhY3Qudmlld0NsZWFudXAuY2FsbCh0aGlzLCBjYWxsYmFjayk7XG59XG5cbnZhciBtYXByZWR1Y2UgPSB7XG4gIHF1ZXJ5OiBxdWVyeSxcbiAgdmlld0NsZWFudXA6IHZpZXdDbGVhbnVwXG59O1xuXG5mdW5jdGlvbiBpc0dlbk9uZSQxKHJldikge1xuICByZXR1cm4gL14xLS8udGVzdChyZXYpO1xufVxuXG5mdW5jdGlvbiBmaWxlSGFzQ2hhbmdlZChsb2NhbERvYywgcmVtb3RlRG9jLCBmaWxlbmFtZSkge1xuICByZXR1cm4gIWxvY2FsRG9jLl9hdHRhY2htZW50cyB8fFxuICAgICAgICAgIWxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0gfHxcbiAgICAgICAgIGxvY2FsRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0uZGlnZXN0ICE9PSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXS5kaWdlc3Q7XG59XG5cbmZ1bmN0aW9uIGdldERvY0F0dGFjaG1lbnRzKGRiLCBkb2MpIHtcbiAgdmFyIGZpbGVuYW1lcyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZW5hbWVzLm1hcChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gZGIuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSwge3JldjogZG9jLl9yZXZ9KTtcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXREb2NBdHRhY2htZW50c0Zyb21UYXJnZXRPclNvdXJjZSh0YXJnZXQsIHNyYywgZG9jKSB7XG4gIHZhciBkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cyA9IGlzUmVtb3RlKHNyYykgJiYgIWlzUmVtb3RlKHRhcmdldCk7XG4gIHZhciBmaWxlbmFtZXMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcblxuICBpZiAoIWRvQ2hlY2tGb3JMb2NhbEF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQuZ2V0KGRvYy5faWQpLnRoZW4oZnVuY3Rpb24gKGxvY2FsRG9jKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICBpZiAoZmlsZUhhc0NoYW5nZWQobG9jYWxEb2MsIGRvYywgZmlsZW5hbWUpKSB7XG4gICAgICAgIHJldHVybiBzcmMuZ2V0QXR0YWNobWVudChkb2MuX2lkLCBmaWxlbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQuZ2V0QXR0YWNobWVudChsb2NhbERvYy5faWQsIGZpbGVuYW1lKTtcbiAgICB9KSk7XG4gIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzKHNyYywgZG9jKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKSB7XG4gIHZhciByZXF1ZXN0cyA9IFtdO1xuICBPYmplY3Qua2V5cyhkaWZmcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbWlzc2luZ1JldnMgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICBtaXNzaW5nUmV2cy5mb3JFYWNoKGZ1bmN0aW9uIChtaXNzaW5nUmV2KSB7XG4gICAgICByZXF1ZXN0cy5wdXNoKHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICByZXY6IG1pc3NpbmdSZXZcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGRvY3M6IHJlcXVlc3RzLFxuICAgIHJldnM6IHRydWUsXG4gICAgbGF0ZXN0OiB0cnVlXG4gIH07XG59XG5cbi8vXG4vLyBGZXRjaCBhbGwgdGhlIGRvY3VtZW50cyBmcm9tIHRoZSBzcmMgYXMgZGVzY3JpYmVkIGluIHRoZSBcImRpZmZzXCIsXG4vLyB3aGljaCBpcyBhIG1hcHBpbmcgb2YgZG9jcyBJRHMgdG8gcmV2aXNpb25zLiBJZiB0aGUgc3RhdGUgZXZlclxuLy8gY2hhbmdlcyB0byBcImNhbmNlbGxlZFwiLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4vLyBFbHNlIGl0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhIGxpc3Qgb2YgZmV0Y2hlZCBkb2N1bWVudHMuXG4vL1xuZnVuY3Rpb24gZ2V0RG9jcyhzcmMsIHRhcmdldCwgZGlmZnMsIHN0YXRlKSB7XG4gIGRpZmZzID0gY2xvbmUoZGlmZnMpOyAvLyB3ZSBkbyBub3QgbmVlZCB0byBtb2RpZnkgdGhpc1xuXG4gIHZhciByZXN1bHREb2NzID0gW10sXG4gICAgICBvayA9IHRydWU7XG5cbiAgZnVuY3Rpb24gZ2V0QWxsRG9jcygpIHtcblxuICAgIHZhciBidWxrR2V0T3B0cyA9IGNyZWF0ZUJ1bGtHZXRPcHRzKGRpZmZzKTtcblxuICAgIGlmICghYnVsa0dldE9wdHMuZG9jcy5sZW5ndGgpIHsgLy8gb3B0aW1pemF0aW9uOiBza2lwIGVtcHR5IHJlcXVlc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNyYy5idWxrR2V0KGJ1bGtHZXRPcHRzKS50aGVuKGZ1bmN0aW9uIChidWxrR2V0UmVzcG9uc2UpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHN0YXRlLmNhbmNlbGxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRSZXNwb25zZS5yZXN1bHRzLm1hcChmdW5jdGlvbiAoYnVsa0dldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGJ1bGtHZXRJbmZvLmRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgICB2YXIgcmVtb3RlRG9jID0gZG9jLm9rO1xuXG4gICAgICAgICAgaWYgKGRvYy5lcnJvcikge1xuICAgICAgICAgICAgLy8gd2hlbiBBVVRPX0NPTVBBQ1RJT04gaXMgc2V0LCBkb2NzIGNhbiBiZSByZXR1cm5lZCB3aGljaCBsb29rXG4gICAgICAgICAgICAvLyBsaWtlIHRoaXM6IHtcIm1pc3NpbmdcIjpcIjEtN2MzYWMyNTZiNjkzYzQ2MmFmODQ0MmY5OTJiODM2OTZcIn1cbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFyZW1vdGVEb2MgfHwgIXJlbW90ZURvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdGVEb2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlKHRhcmdldCwgc3JjLCByZW1vdGVEb2MpXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMocmVtb3RlRG9jLl9hdHRhY2htZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoYXR0YWNobWVudCwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHQgPSByZW1vdGVEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lc1tpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dC5kYXRhID0gYXR0YWNobWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW90ZURvYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9KSlcblxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgcmVzdWx0RG9jcyA9IHJlc3VsdERvY3MuY29uY2F0KGZsYXR0ZW4ocmVzdWx0cykuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzQXR0YWNobWVudHMoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5fYXR0YWNobWVudHMgJiYgT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0NvbmZsaWN0cyhkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9jb25mbGljdHMgJiYgZG9jLl9jb25mbGljdHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcykge1xuICAgIC8vIE9wdGltaXphdGlvbjogZmV0Y2ggZ2VuLTEgZG9jcyBhbmQgYXR0YWNobWVudHMgaW5cbiAgICAvLyBhIHNpbmdsZSByZXF1ZXN0IHVzaW5nIF9hbGxfZG9jc1xuICAgIHJldHVybiBzcmMuYWxsRG9jcyh7XG4gICAgICBrZXlzOiBpZHMsXG4gICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICBjb25mbGljdHM6IHRydWVcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChzdGF0ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICBpZiAocm93LmRlbGV0ZWQgfHwgIXJvdy5kb2MgfHwgIWlzR2VuT25lJDEocm93LnZhbHVlLnJldikgfHxcbiAgICAgICAgICAgIGhhc0F0dGFjaG1lbnRzKHJvdy5kb2MpIHx8IGhhc0NvbmZsaWN0cyhyb3cuZG9jKSkge1xuICAgICAgICAgIC8vIGlmIGFueSBvZiB0aGVzZSBjb25kaXRpb25zIGFwcGx5LCB3ZSBuZWVkIHRvIGZldGNoIHVzaW5nIGdldCgpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RyaXAgX2NvbmZsaWN0cyBhcnJheSB0byBhcHBlYXNlIENTRyAoIzU3OTMpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocm93LmRvYy5fY29uZmxpY3RzKSB7XG4gICAgICAgICAgZGVsZXRlIHJvdy5kb2MuX2NvbmZsaWN0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBkb2Mgd2UgZ290IGJhY2sgZnJvbSBhbGxEb2NzKCkgaXMgc3VmZmljaWVudFxuICAgICAgICByZXN1bHREb2NzLnB1c2gocm93LmRvYyk7XG4gICAgICAgIGRlbGV0ZSBkaWZmc1tyb3cuaWRdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXZpc2lvbk9uZURvY3MoKSB7XG4gICAgLy8gZmlsdGVyIG91dCB0aGUgZ2VuZXJhdGlvbiAxIGRvY3MgYW5kIGdldCB0aGVtXG4gICAgLy8gbGVhdmluZyB0aGUgbm9uLWdlbmVyYXRpb24gb25lIGRvY3MgdG8gYmUgZ290IG90aGVyd2lzZVxuICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyhkaWZmcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgICAgdmFyIG1pc3NpbmcgPSBkaWZmc1tpZF0ubWlzc2luZztcbiAgICAgIHJldHVybiBtaXNzaW5nLmxlbmd0aCA9PT0gMSAmJiBpc0dlbk9uZSQxKG1pc3NpbmdbMF0pO1xuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZldGNoUmV2aXNpb25PbmVEb2NzKGlkcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmV0dXJuUmVzdWx0KCkge1xuICAgIHJldHVybiB7IG9rOm9rLCBkb2NzOnJlc3VsdERvY3MgfTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKGdldFJldmlzaW9uT25lRG9jcylcbiAgICAudGhlbihnZXRBbGxEb2NzKVxuICAgIC50aGVuKHJldHVyblJlc3VsdCk7XG59XG5cbnZhciBDSEVDS1BPSU5UX1ZFUlNJT04gPSAxO1xudmFyIFJFUExJQ0FUT1IgPSBcInBvdWNoZGJcIjtcbi8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IG51bWJlciB0byBsaW1pdCB0aGVcbi8vIGFtb3VudCBvZiByZXBsaWNhdGlvbiBoaXN0b3J5IHdlIHNhdmUgaW4gdGhlIGNoZWNrcG9pbnQuXG4vLyBJZiB3ZSBzYXZlIHRvbyBtdWNoLCB0aGUgY2hlY2twb2luZyBkb2NzIHdpbGwgYmVjb21lIHZlcnkgYmlnLFxuLy8gaWYgd2Ugc2F2ZSBmZXdlciwgd2UnbGwgcnVuIGEgZ3JlYXRlciByaXNrIG9mIGhhdmluZyB0b1xuLy8gcmVhZCBhbGwgdGhlIGNoYW5nZXMgZnJvbSAwIHdoZW4gY2hlY2twb2ludCBQVVRzIGZhaWxcbi8vIENvdWNoREIgMi4wIGhhcyBhIG1vcmUgaW52b2x2ZWQgaGlzdG9yeSBwcnVuaW5nLFxuLy8gYnV0IGxldCdzIGdvIGZvciB0aGUgc2ltcGxlIHZlcnNpb24gZm9yIG5vdy5cbnZhciBDSEVDS1BPSU5UX0hJU1RPUllfU0laRSA9IDU7XG52YXIgTE9XRVNUX1NFUSA9IDA7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrcG9pbnQoZGIsIGlkLCBjaGVja3BvaW50LCBzZXNzaW9uLCByZXR1cm5WYWx1ZSkge1xuICByZXR1cm4gZGIuZ2V0KGlkKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgaWYgKGRiLmFkYXB0ZXIgPT09ICdodHRwJyB8fCBkYi5hZGFwdGVyID09PSAnaHR0cHMnKSB7XG4gICAgICAgIGV4cGxhaW5FcnJvcihcbiAgICAgICAgICA0MDQsICdQb3VjaERCIGlzIGp1c3QgY2hlY2tpbmcgaWYgYSByZW1vdGUgY2hlY2twb2ludCBleGlzdHMuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbixcbiAgICAgICAgX2lkOiBpZCxcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIHJlcGxpY2F0b3I6IFJFUExJQ0FUT1IsXG4gICAgICAgIHZlcnNpb246IENIRUNLUE9JTlRfVkVSU0lPTlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9KS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGNoZWNrcG9pbnQgaGFzIG5vdCBjaGFuZ2VkLCBkbyBub3QgdXBkYXRlXG4gICAgaWYgKGRvYy5sYXN0X3NlcSA9PT0gY2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgY3VycmVudCBlbnRyeSBmb3IgdGhpcyByZXBsaWNhdGlvblxuICAgIGRvYy5oaXN0b3J5ID0gKGRvYy5oaXN0b3J5IHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLnNlc3Npb25faWQgIT09IHNlc3Npb247XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIGxhdGVzdCBjaGVja3BvaW50IHRvIGhpc3RvcnlcbiAgICBkb2MuaGlzdG9yeS51bnNoaWZ0KHtcbiAgICAgIGxhc3Rfc2VxOiBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvblxuICAgIH0pO1xuXG4gICAgLy8gSnVzdCB0YWtlIHRoZSBsYXN0IHBpZWNlcyBpbiBoaXN0b3J5LCB0b1xuICAgIC8vIGF2b2lkIHJlYWxseSBiaWcgY2hlY2twb2ludCBkb2NzLlxuICAgIC8vIHNlZSBjb21tZW50IG9uIGhpc3Rvcnkgc2l6ZSBhYm92ZVxuICAgIGRvYy5oaXN0b3J5ID0gZG9jLmhpc3Rvcnkuc2xpY2UoMCwgQ0hFQ0tQT0lOVF9ISVNUT1JZX1NJWkUpO1xuXG4gICAgZG9jLnZlcnNpb24gPSBDSEVDS1BPSU5UX1ZFUlNJT047XG4gICAgZG9jLnJlcGxpY2F0b3IgPSBSRVBMSUNBVE9SO1xuXG4gICAgZG9jLnNlc3Npb25faWQgPSBzZXNzaW9uO1xuICAgIGRvYy5sYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG5cbiAgICByZXR1cm4gZGIucHV0KGRvYykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAvLyByZXRyeTsgc29tZW9uZSBpcyB0cnlpbmcgdG8gd3JpdGUgYSBjaGVja3BvaW50IHNpbXVsdGFuZW91c2x5XG4gICAgICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KGRiLCBpZCwgY2hlY2twb2ludCwgc2Vzc2lvbiwgcmV0dXJuVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gQ2hlY2twb2ludGVyKHNyYywgdGFyZ2V0LCBpZCwgcmV0dXJuVmFsdWUsIG9wdHMpIHtcbiAgdGhpcy5zcmMgPSBzcmM7XG4gIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICB0aGlzLmlkID0gaWQ7XG4gIHRoaXMucmV0dXJuVmFsdWUgPSByZXR1cm5WYWx1ZTtcbiAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fTtcbn1cblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS53cml0ZUNoZWNrcG9pbnQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiB0aGlzLnVwZGF0ZVRhcmdldChjaGVja3BvaW50LCBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZi51cGRhdGVTb3VyY2UoY2hlY2twb2ludCwgc2Vzc2lvbik7XG4gIH0pO1xufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVUYXJnZXQgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCkge1xuICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KHRoaXMudGFyZ2V0LCB0aGlzLmlkLCBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbiwgdGhpcy5yZXR1cm5WYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS51cGRhdGVTb3VyY2UgPSBmdW5jdGlvbiAoY2hlY2twb2ludCwgc2Vzc2lvbikge1xuICBpZiAodGhpcy5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gdXBkYXRlQ2hlY2twb2ludCh0aGlzLnNyYywgdGhpcy5pZCwgY2hlY2twb2ludCxcbiAgICAgIHNlc3Npb24sIHRoaXMucmV0dXJuVmFsdWUpXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoaXNGb3JiaWRkZW5FcnJvcihlcnIpKSB7XG4gICAgICAgICAgc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn07XG5cbnZhciBjb21wYXJpc29ucyA9IHtcbiAgXCJ1bmRlZmluZWRcIjogZnVuY3Rpb24gKHRhcmdldERvYywgc291cmNlRG9jKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcHJldmlvdXMgY29tcGFyaXNvbiBmdW5jdGlvblxuICAgIGlmIChjb2xsYXRlKHRhcmdldERvYy5sYXN0X3NlcSwgc291cmNlRG9jLmxhc3Rfc2VxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNvdXJjZURvYy5sYXN0X3NlcTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgXCIxXCI6IGZ1bmN0aW9uICh0YXJnZXREb2MsIHNvdXJjZURvYykge1xuICAgIC8vIFRoaXMgaXMgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gcG9ydGVkIGZyb20gQ291Y2hEQlxuICAgIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNvdXJjZURvYywgdGFyZ2V0RG9jKS5sYXN0X3NlcTtcbiAgfVxufTtcblxuQ2hlY2twb2ludGVyLnByb3RvdHlwZS5nZXRDaGVja3BvaW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHNlbGYub3B0cyAmJiBzZWxmLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50ICYmICFzZWxmLm9wdHMud3JpdGVUYXJnZXRDaGVja3BvaW50KSB7XG4gICAgcmV0dXJuIHNlbGYuc3JjLmdldChzZWxmLmlkKS50aGVuKGZ1bmN0aW9uIChzb3VyY2VEb2MpIHtcbiAgICAgIHJldHVybiBzb3VyY2VEb2MubGFzdF9zZXEgfHwgTE9XRVNUX1NFUTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc2VsZi50YXJnZXQuZ2V0KHNlbGYuaWQpLnRoZW4oZnVuY3Rpb24gKHRhcmdldERvYykge1xuICAgIGlmIChzZWxmLm9wdHMgJiYgc2VsZi5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCAmJiAhc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCkge1xuICAgICAgcmV0dXJuIHRhcmdldERvYy5sYXN0X3NlcSB8fCBMT1dFU1RfU0VRO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnNyYy5nZXQoc2VsZi5pZCkudGhlbihmdW5jdGlvbiAoc291cmNlRG9jKSB7XG4gICAgICAvLyBTaW5jZSB3ZSBjYW4ndCBtaWdyYXRlIGFuIG9sZCB2ZXJzaW9uIGRvYyB0byBhIG5ldyBvbmVcbiAgICAgIC8vIChubyBzZXNzaW9uIGlkKSwgd2UganVzdCBnbyB3aXRoIHRoZSBsb3dlc3Qgc2VxIGluIHRoaXMgY2FzZVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodGFyZ2V0RG9jLnZlcnNpb24gIT09IHNvdXJjZURvYy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVyc2lvbjtcbiAgICAgIGlmICh0YXJnZXREb2MudmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uID0gdGFyZ2V0RG9jLnZlcnNpb24udG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSBcInVuZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodmVyc2lvbiBpbiBjb21wYXJpc29ucykge1xuICAgICAgICByZXR1cm4gY29tcGFyaXNvbnNbdmVyc2lvbl0odGFyZ2V0RG9jLCBzb3VyY2VEb2MpO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDQgJiYgdGFyZ2V0RG9jLmxhc3Rfc2VxKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnNyYy5wdXQoe1xuICAgICAgICAgIF9pZDogc2VsZi5pZCxcbiAgICAgICAgICBsYXN0X3NlcTogTE9XRVNUX1NFUVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGlmIChpc0ZvcmJpZGRlbkVycm9yKGVycikpIHtcbiAgICAgICAgICAgIHNlbGYub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXREb2MubGFzdF9zZXE7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgfSk7XG59O1xuLy8gVGhpcyBjaGVja3BvaW50IGNvbXBhcmlzb24gaXMgcG9ydGVkIGZyb20gQ291Y2hEQnMgc291cmNlXG4vLyB0aGV5IGNvbWUgZnJvbSBoZXJlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb3VjaGRiLWNvdWNoLXJlcGxpY2F0b3IvYmxvYi9tYXN0ZXIvc3JjL2NvdWNoX3JlcGxpY2F0b3IuZXJsI0w4NjMtTDkwNlxuXG5mdW5jdGlvbiBjb21wYXJlUmVwbGljYXRpb25Mb2dzKHNyY0RvYywgdGd0RG9jKSB7XG4gIGlmIChzcmNEb2Muc2Vzc2lvbl9pZCA9PT0gdGd0RG9jLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IHNyY0RvYy5sYXN0X3NlcSxcbiAgICAgIGhpc3Rvcnk6IHNyY0RvYy5oaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNyY0RvYy5oaXN0b3J5LCB0Z3REb2MuaGlzdG9yeSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVSZXBsaWNhdGlvbkhpc3Rvcnkoc291cmNlSGlzdG9yeSwgdGFyZ2V0SGlzdG9yeSkge1xuICAvLyB0aGUgZXJsYW5nIGxvb3AgdmlhIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc28gZWFzeSB0byByZXBlYXQgaW4gSlNcbiAgLy8gdGhlcmVmb3JlLCBkb2luZyB0aGlzIGFzIHJlY3Vyc2lvblxuICB2YXIgUyA9IHNvdXJjZUhpc3RvcnlbMF07XG4gIHZhciBzb3VyY2VSZXN0ID0gc291cmNlSGlzdG9yeS5zbGljZSgxKTtcbiAgdmFyIFQgPSB0YXJnZXRIaXN0b3J5WzBdO1xuICB2YXIgdGFyZ2V0UmVzdCA9IHRhcmdldEhpc3Rvcnkuc2xpY2UoMSk7XG5cbiAgaWYgKCFTIHx8IHRhcmdldEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3Rfc2VxOiBMT1dFU1RfU0VRLFxuICAgICAgaGlzdG9yeTogW11cbiAgICB9O1xuICB9XG5cbiAgdmFyIHNvdXJjZUlkID0gUy5zZXNzaW9uX2lkO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGhhc1Nlc3Npb25JZChzb3VyY2VJZCwgdGFyZ2V0SGlzdG9yeSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFMubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiBzb3VyY2VIaXN0b3J5XG4gICAgfTtcbiAgfVxuXG4gIHZhciB0YXJnZXRJZCA9IFQuc2Vzc2lvbl9pZDtcbiAgaWYgKGhhc1Nlc3Npb25JZCh0YXJnZXRJZCwgc291cmNlUmVzdCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IFQubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiB0YXJnZXRSZXN0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNvdXJjZVJlc3QsIHRhcmdldFJlc3QpO1xufVxuXG5mdW5jdGlvbiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCBoaXN0b3J5KSB7XG4gIHZhciBwcm9wcyA9IGhpc3RvcnlbMF07XG4gIHZhciByZXN0ID0gaGlzdG9yeS5zbGljZSgxKTtcblxuICBpZiAoIXNlc3Npb25JZCB8fCBoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzZXNzaW9uSWQgPT09IHByb3BzLnNlc3Npb25faWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBoYXNTZXNzaW9uSWQoc2Vzc2lvbklkLCByZXN0KTtcbn1cblxuZnVuY3Rpb24gaXNGb3JiaWRkZW5FcnJvcihlcnIpIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnIuc3RhdHVzID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGVyci5zdGF0dXMgLyAxMDApID09PSA0O1xufVxuXG52YXIgU1RBUlRJTkdfQkFDS19PRkYgPSAwO1xuXG5mdW5jdGlvbiBiYWNrT2ZmKG9wdHMsIHJldHVyblZhbHVlLCBlcnJvciwgY2FsbGJhY2spIHtcbiAgaWYgKG9wdHMucmV0cnkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuVmFsdWUuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIG9wdHMuYmFja19vZmZfZnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uID0gZGVmYXVsdEJhY2tPZmY7XG4gIH1cbiAgcmV0dXJuVmFsdWUuZW1pdCgncmVxdWVzdEVycm9yJywgZXJyb3IpO1xuICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdhY3RpdmUnIHx8IHJldHVyblZhbHVlLnN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnLCBlcnJvcik7XG4gICAgcmV0dXJuVmFsdWUuc3RhdGUgPSAnc3RvcHBlZCc7XG4gICAgdmFyIGJhY2tPZmZTZXQgPSBmdW5jdGlvbiBiYWNrb2ZmVGltZVNldCgpIHtcbiAgICAgIG9wdHMuY3VycmVudF9iYWNrX29mZiA9IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICAgIH07XG4gICAgdmFyIHJlbW92ZUJhY2tPZmZTZXR0ZXIgPSBmdW5jdGlvbiByZW1vdmVCYWNrT2ZmVGltZVNldCgpIHtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdhY3RpdmUnLCBiYWNrT2ZmU2V0KTtcbiAgICB9O1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ3BhdXNlZCcsIHJlbW92ZUJhY2tPZmZTZXR0ZXIpO1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ2FjdGl2ZScsIGJhY2tPZmZTZXQpO1xuICB9XG5cbiAgb3B0cy5jdXJyZW50X2JhY2tfb2ZmID0gb3B0cy5jdXJyZW50X2JhY2tfb2ZmIHx8IFNUQVJUSU5HX0JBQ0tfT0ZGO1xuICBvcHRzLmN1cnJlbnRfYmFja19vZmYgPSBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uKG9wdHMuY3VycmVudF9iYWNrX29mZik7XG4gIHNldFRpbWVvdXQoY2FsbGJhY2ssIG9wdHMuY3VycmVudF9iYWNrX29mZik7XG59XG5cbmZ1bmN0aW9uIHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkocXVlcnlQYXJhbXMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5zb3J0KGNvbGxhdGUpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcbiAgICByZXN1bHRba2V5XSA9IHF1ZXJ5UGFyYW1zW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xufVxuXG4vLyBHZW5lcmF0ZSBhIHVuaXF1ZSBpZCBwYXJ0aWN1bGFyIHRvIHRoaXMgcmVwbGljYXRpb24uXG4vLyBOb3QgZ3VhcmFudGVlZCB0byBhbGlnbiBwZXJmZWN0bHkgd2l0aCBDb3VjaERCJ3MgcmVwIGlkcy5cbmZ1bmN0aW9uIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykge1xuICB2YXIgZG9jSWRzID0gb3B0cy5kb2NfaWRzID8gb3B0cy5kb2NfaWRzLnNvcnQoY29sbGF0ZSkgOiAnJztcbiAgdmFyIGZpbHRlckZ1biA9IG9wdHMuZmlsdGVyID8gb3B0cy5maWx0ZXIudG9TdHJpbmcoKSA6ICcnO1xuICB2YXIgcXVlcnlQYXJhbXMgPSAnJztcbiAgdmFyIGZpbHRlclZpZXdOYW1lID0gICcnO1xuICB2YXIgc2VsZWN0b3IgPSAnJztcblxuICAvLyBwb3NzaWJpbGl0eSBmb3IgY2hlY2twb2ludHMgdG8gYmUgbG9zdCBoZXJlIGFzIGJlaGF2aW91ciBvZlxuICAvLyBKU09OLnN0cmluZ2lmeSBpcyBub3Qgc3RhYmxlIChzZWUgIzYyMjYpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIHNlbGVjdG9yID0gSlNPTi5zdHJpbmdpZnkob3B0cy5zZWxlY3Rvcik7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgb3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICBxdWVyeVBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkob3B0cy5xdWVyeV9wYXJhbXMpKTtcbiAgfVxuXG4gIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgIGZpbHRlclZpZXdOYW1lID0gb3B0cy52aWV3LnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW3NyYy5pZCgpLCB0YXJnZXQuaWQoKV0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHZhciBxdWVyeURhdGEgPSByZXNbMF0gKyByZXNbMV0gKyBmaWx0ZXJGdW4gKyBmaWx0ZXJWaWV3TmFtZSArXG4gICAgICBxdWVyeVBhcmFtcyArIGRvY0lkcyArIHNlbGVjdG9yO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgYmluYXJ5TWQ1KHF1ZXJ5RGF0YSwgcmVzb2x2ZSk7XG4gICAgfSk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKG1kNXN1bSkge1xuICAgIC8vIGNhbid0IHVzZSBzdHJhaWdodC11cCBtZDUgYWxwaGFiZXQsIGJlY2F1c2VcbiAgICAvLyB0aGUgY2hhciAnLycgaXMgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgZm9yIGF0dGFjaG1lbnRzLFxuICAgIC8vIGFuZCArIGlzIGFsc28gbm90IHVybC1zYWZlXG4gICAgbWQ1c3VtID0gbWQ1c3VtLnJlcGxhY2UoL1xcLy9nLCAnLicpLnJlcGxhY2UoL1xcKy9nLCAnXycpO1xuICAgIHJldHVybiAnX2xvY2FsLycgKyBtZDVzdW07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlLCByZXN1bHQpIHtcbiAgdmFyIGJhdGNoZXMgPSBbXTsgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGJhdGNoZXMgdG8gYmUgcHJvY2Vzc2VkXG4gIHZhciBjdXJyZW50QmF0Y2g7ICAgICAgICAgICAgICAgLy8gdGhlIGJhdGNoIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWRcbiAgdmFyIHBlbmRpbmdCYXRjaCA9IHtcbiAgICBzZXE6IDAsXG4gICAgY2hhbmdlczogW10sXG4gICAgZG9jczogW11cbiAgfTsgLy8gbmV4dCBiYXRjaCwgbm90IHlldCByZWFkeSB0byBiZSBwcm9jZXNzZWRcbiAgdmFyIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7ICAvLyB0cnVlIHdoaWxlIGNoZWNrcG9pbnQgaXMgYmVpbmcgd3JpdHRlblxuICB2YXIgY2hhbmdlc0NvbXBsZXRlZCA9IGZhbHNlOyAgIC8vIHRydWUgd2hlbiBhbGwgY2hhbmdlcyByZWNlaXZlZFxuICB2YXIgcmVwbGljYXRpb25Db21wbGV0ZWQgPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIHJlcGxpY2F0aW9uIGhhcyBjb21wbGV0ZWRcbiAgdmFyIGxhc3Rfc2VxID0gMDtcbiAgdmFyIGNvbnRpbnVvdXMgPSBvcHRzLmNvbnRpbnVvdXMgfHwgb3B0cy5saXZlIHx8IGZhbHNlO1xuICB2YXIgYmF0Y2hfc2l6ZSA9IG9wdHMuYmF0Y2hfc2l6ZSB8fCAxMDA7XG4gIHZhciBiYXRjaGVzX2xpbWl0ID0gb3B0cy5iYXRjaGVzX2xpbWl0IHx8IDEwO1xuICB2YXIgc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICdhbGxfZG9jcyc7XG4gIHZhciBjaGFuZ2VzUGVuZGluZyA9IGZhbHNlOyAgICAgLy8gdHJ1ZSB3aGlsZSBzcmMuY2hhbmdlcyBpcyBydW5uaW5nXG4gIHZhciBkb2NfaWRzID0gb3B0cy5kb2NfaWRzO1xuICB2YXIgc2VsZWN0b3IgPSBvcHRzLnNlbGVjdG9yO1xuICB2YXIgcmVwSWQ7XG4gIHZhciBjaGVja3BvaW50ZXI7XG4gIHZhciBjaGFuZ2VkRG9jcyA9IFtdO1xuICAvLyBMaWtlIGNvdWNoZGIsIGV2ZXJ5IHJlcGxpY2F0aW9uIGdldHMgYSB1bmlxdWUgc2Vzc2lvbiBpZFxuICB2YXIgc2Vzc2lvbiA9IHV1aWQoKTtcblxuICByZXN1bHQgPSByZXN1bHQgfHwge1xuICAgIG9rOiB0cnVlLFxuICAgIHN0YXJ0X3RpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBkb2NzX3JlYWQ6IDAsXG4gICAgZG9jc193cml0dGVuOiAwLFxuICAgIGRvY193cml0ZV9mYWlsdXJlczogMCxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG5cbiAgdmFyIGNoYW5nZXNPcHRzID0ge307XG4gIHJldHVyblZhbHVlLnJlYWR5KHNyYywgdGFyZ2V0KTtcblxuICBmdW5jdGlvbiBpbml0Q2hlY2twb2ludGVyKCkge1xuICAgIGlmIChjaGVja3BvaW50ZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyYXRlUmVwbGljYXRpb25JZChzcmMsIHRhcmdldCwgb3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXBJZCA9IHJlcztcblxuICAgICAgdmFyIGNoZWNrcG9pbnRPcHRzID0ge307XG4gICAgICBpZiAob3B0cy5jaGVja3BvaW50ID09PSBmYWxzZSkge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiBmYWxzZSB9O1xuICAgICAgfSBlbHNlIGlmIChvcHRzLmNoZWNrcG9pbnQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIGNoZWNrcG9pbnRPcHRzID0geyB3cml0ZVNvdXJjZUNoZWNrcG9pbnQ6IHRydWUsIHdyaXRlVGFyZ2V0Q2hlY2twb2ludDogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSBpZiAob3B0cy5jaGVja3BvaW50ID09PSAndGFyZ2V0Jykge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiBmYWxzZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiB0cnVlLCB3cml0ZVRhcmdldENoZWNrcG9pbnQ6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgY2hlY2twb2ludGVyID0gbmV3IENoZWNrcG9pbnRlcihzcmMsIHRhcmdldCwgcmVwSWQsIHJldHVyblZhbHVlLCBjaGVja3BvaW50T3B0cyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZURvY3MoKSB7XG4gICAgY2hhbmdlZERvY3MgPSBbXTtcblxuICAgIGlmIChjdXJyZW50QmF0Y2guZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRvY3MgPSBjdXJyZW50QmF0Y2guZG9jcztcbiAgICB2YXIgYnVsa09wdHMgPSB7dGltZW91dDogb3B0cy50aW1lb3V0fTtcbiAgICByZXR1cm4gdGFyZ2V0LmJ1bGtEb2NzKHtkb2NzOiBkb2NzLCBuZXdfZWRpdHM6IGZhbHNlfSwgYnVsa09wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gYHJlc2AgZG9lc24ndCBpbmNsdWRlIGZ1bGwgZG9jdW1lbnRzICh3aGljaCBsaXZlIGluIGBkb2NzYCksIHNvIHdlIGNyZWF0ZSBhIG1hcCBvZlxuICAgICAgLy8gKGlkIC0+IGVycm9yKSwgYW5kIGNoZWNrIGZvciBlcnJvcnMgd2hpbGUgaXRlcmF0aW5nIG92ZXIgYGRvY3NgXG4gICAgICB2YXIgZXJyb3JzQnlJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICByZXMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgICAgICBlcnJvcnNCeUlkW3Jlcy5pZF0gPSByZXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgZXJyb3JzTm8gPSBPYmplY3Qua2V5cyhlcnJvcnNCeUlkKS5sZW5ndGg7XG4gICAgICByZXN1bHQuZG9jX3dyaXRlX2ZhaWx1cmVzICs9IGVycm9yc05vO1xuICAgICAgcmVzdWx0LmRvY3Nfd3JpdHRlbiArPSBkb2NzLmxlbmd0aCAtIGVycm9yc05vO1xuXG4gICAgICBkb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgICAgICB2YXIgZXJyb3IgPSBlcnJvcnNCeUlkW2RvYy5faWRdO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgIC8vIE5vcm1hbGl6ZSBlcnJvciBuYW1lLiBpLmUuICdVbmF1dGhvcml6ZWQnIC0+ICd1bmF1dGhvcml6ZWQnIChlZyBTeW5jIEdhdGV3YXkpXG4gICAgICAgICAgdmFyIGVycm9yTmFtZSA9IChlcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChlcnJvck5hbWUgPT09ICd1bmF1dGhvcml6ZWQnIHx8IGVycm9yTmFtZSA9PT0gJ2ZvcmJpZGRlbicpIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2RlbmllZCcsIGNsb25lKGVycm9yKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VkRG9jcy5wdXNoKGRvYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmVzdWx0LmRvY193cml0ZV9mYWlsdXJlcyArPSBkb2NzLmxlbmd0aDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaEJhdGNoKCkge1xuICAgIGlmIChjdXJyZW50QmF0Y2guZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgd2FzIGEgcHJvYmxlbSBnZXR0aW5nIGRvY3MuJyk7XG4gICAgfVxuICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY3VycmVudEJhdGNoLnNlcTtcbiAgICB2YXIgb3V0UmVzdWx0ID0gY2xvbmUocmVzdWx0KTtcbiAgICBpZiAoY2hhbmdlZERvY3MubGVuZ3RoKSB7XG4gICAgICBvdXRSZXN1bHQuZG9jcyA9IGNoYW5nZWREb2NzO1xuICAgICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50QmF0Y2gucGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgb3V0UmVzdWx0LnBlbmRpbmcgPSBjdXJyZW50QmF0Y2gucGVuZGluZztcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5wZW5kaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hhbmdlJywgb3V0UmVzdWx0KTtcbiAgICB9XG4gICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgIHJldHVybiBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGN1cnJlbnRCYXRjaC5zZXEsXG4gICAgICAgIHNlc3Npb24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hlY2twb2ludCcsIHsgJ2NoZWNrcG9pbnQnOiBjdXJyZW50QmF0Y2guc2VxIH0pO1xuICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG4gICAgICBjdXJyZW50QmF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgICBnZXRDaGFuZ2VzKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgb25DaGVja3BvaW50RXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpZmZzKCkge1xuICAgIHZhciBkaWZmID0ge307XG4gICAgY3VycmVudEJhdGNoLmNoYW5nZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlKSB7XG4gICAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGVja3BvaW50JywgeyAncmV2c19kaWZmJzogY2hhbmdlIH0pO1xuICAgICAgLy8gQ291Y2hiYXNlIFN5bmMgR2F0ZXdheSBlbWl0cyB0aGVzZSwgYnV0IHdlIGNhbiBpZ25vcmUgdGhlbVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoY2hhbmdlLmlkID09PSBcIl91c2VyL1wiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpZmZbY2hhbmdlLmlkXSA9IGNoYW5nZS5jaGFuZ2VzLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geC5yZXY7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0LnJldnNEaWZmKGRpZmYpLnRoZW4oZnVuY3Rpb24gKGRpZmZzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgLy8gY3VycmVudEJhdGNoLmRpZmZzIGVsZW1lbnRzIGFyZSBkZWxldGVkIGFzIHRoZSBkb2N1bWVudHMgYXJlIHdyaXR0ZW5cbiAgICAgIGN1cnJlbnRCYXRjaC5kaWZmcyA9IGRpZmZzO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmF0Y2hEb2NzKCkge1xuICAgIHJldHVybiBnZXREb2NzKHNyYywgdGFyZ2V0LCBjdXJyZW50QmF0Y2guZGlmZnMsIHJldHVyblZhbHVlKS50aGVuKGZ1bmN0aW9uIChnb3QpIHtcbiAgICAgIGN1cnJlbnRCYXRjaC5lcnJvciA9ICFnb3Qub2s7XG4gICAgICBnb3QuZG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRCYXRjaC5kaWZmc1tkb2MuX2lkXTtcbiAgICAgICAgcmVzdWx0LmRvY3NfcmVhZCsrO1xuICAgICAgICBjdXJyZW50QmF0Y2guZG9jcy5wdXNoKGRvYyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0TmV4dEJhdGNoKCkge1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQgfHwgY3VycmVudEJhdGNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChiYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3VycmVudEJhdGNoID0gYmF0Y2hlcy5zaGlmdCgpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdzdGFydF9uZXh0X2JhdGNoJzogY3VycmVudEJhdGNoLnNlcSB9KTtcbiAgICBnZXREaWZmcygpXG4gICAgICAudGhlbihnZXRCYXRjaERvY3MpXG4gICAgICAudGhlbih3cml0ZURvY3MpXG4gICAgICAudGhlbihmaW5pc2hCYXRjaClcbiAgICAgIC50aGVuKHN0YXJ0TmV4dEJhdGNoKVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgYWJvcnRSZXBsaWNhdGlvbignYmF0Y2ggcHJvY2Vzc2luZyB0ZXJtaW5hdGVkIHdpdGggZXJyb3InLCBlcnIpO1xuICAgICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NQZW5kaW5nQmF0Y2goaW1tZWRpYXRlJCQxKSB7XG4gICAgaWYgKHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGJhdGNoZXMubGVuZ3RoID09PSAwICYmICFjdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKChjb250aW51b3VzICYmIGNoYW5nZXNPcHRzLmxpdmUpIHx8IGNoYW5nZXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZS5zdGF0ZSA9ICdwZW5kaW5nJztcbiAgICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdwYXVzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc0NvbXBsZXRlZCkge1xuICAgICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBpbW1lZGlhdGUkJDEgfHxcbiAgICAgIGNoYW5nZXNDb21wbGV0ZWQgfHxcbiAgICAgIHBlbmRpbmdCYXRjaC5jaGFuZ2VzLmxlbmd0aCA+PSBiYXRjaF9zaXplXG4gICAgKSB7XG4gICAgICBiYXRjaGVzLnB1c2gocGVuZGluZ0JhdGNoKTtcbiAgICAgIHBlbmRpbmdCYXRjaCA9IHtcbiAgICAgICAgc2VxOiAwLFxuICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgZG9jczogW11cbiAgICAgIH07XG4gICAgICBpZiAocmV0dXJuVmFsdWUuc3RhdGUgPT09ICdwZW5kaW5nJyB8fCByZXR1cm5WYWx1ZS5zdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICAgIHJldHVyblZhbHVlLnN0YXRlID0gJ2FjdGl2ZSc7XG4gICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgICAgc3RhcnROZXh0QmF0Y2goKTtcbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGFib3J0UmVwbGljYXRpb24ocmVhc29uLCBlcnIpIHtcbiAgICBpZiAocmVwbGljYXRpb25Db21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFlcnIubWVzc2FnZSkge1xuICAgICAgZXJyLm1lc3NhZ2UgPSByZWFzb247XG4gICAgfVxuICAgIHJlc3VsdC5vayA9IGZhbHNlO1xuICAgIHJlc3VsdC5zdGF0dXMgPSAnYWJvcnRpbmcnO1xuICAgIGJhdGNoZXMgPSBbXTtcbiAgICBwZW5kaW5nQmF0Y2ggPSB7XG4gICAgICBzZXE6IDAsXG4gICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgIGRvY3M6IFtdXG4gICAgfTtcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlUmVwbGljYXRpb24oZmF0YWxFcnJvcikge1xuICAgIGlmIChyZXBsaWNhdGlvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXN1bHQuc3RhdHVzID0gJ2NhbmNlbGxlZCc7XG4gICAgICBpZiAod3JpdGluZ0NoZWNrcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc3RhdHVzID0gcmVzdWx0LnN0YXR1cyB8fCAnY29tcGxldGUnO1xuICAgIHJlc3VsdC5lbmRfdGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICByZXN1bHQubGFzdF9zZXEgPSBsYXN0X3NlcTtcbiAgICByZXBsaWNhdGlvbkNvbXBsZXRlZCA9IHRydWU7XG5cbiAgICBpZiAoZmF0YWxFcnJvcikge1xuICAgICAgLy8gbmVlZCB0byBleHRlbmQgdGhlIGVycm9yIGJlY2F1c2UgRmlyZWZveCBjb25zaWRlcnMgXCIucmVzdWx0XCIgcmVhZC1vbmx5XG4gICAgICBmYXRhbEVycm9yID0gY3JlYXRlRXJyb3IoZmF0YWxFcnJvcik7XG4gICAgICBmYXRhbEVycm9yLnJlc3VsdCA9IHJlc3VsdDtcblxuICAgICAgLy8gTm9ybWFsaXplIGVycm9yIG5hbWUuIGkuZS4gJ1VuYXV0aG9yaXplZCcgLT4gJ3VuYXV0aG9yaXplZCcgKGVnIFN5bmMgR2F0ZXdheSlcbiAgICAgIHZhciBlcnJvck5hbWUgPSAoZmF0YWxFcnJvci5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGVycm9yTmFtZSA9PT0gJ3VuYXV0aG9yaXplZCcgfHwgZXJyb3JOYW1lID09PSAnZm9yYmlkZGVuJykge1xuICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdlcnJvcicsIGZhdGFsRXJyb3IpO1xuICAgICAgICByZXR1cm5WYWx1ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhY2tPZmYob3B0cywgcmV0dXJuVmFsdWUsIGZhdGFsRXJyb3IsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXBsaWNhdGUoc3JjLCB0YXJnZXQsIG9wdHMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2NvbXBsZXRlJywgcmVzdWx0KTtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2UoY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIHBlbmRpbmcgPT09ICdudW1iZXInKSB7XG4gICAgICBwZW5kaW5nQmF0Y2gucGVuZGluZyA9IHBlbmRpbmc7XG4gICAgfVxuXG4gICAgdmFyIGZpbHRlciA9IGZpbHRlckNoYW5nZShvcHRzKShjaGFuZ2UpO1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBlbmRpbmdCYXRjaC5zZXEgPSBjaGFuZ2Uuc2VxIHx8IGxhc3RTZXE7XG4gICAgcGVuZGluZ0JhdGNoLmNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdwZW5kaW5nX2JhdGNoJzogcGVuZGluZ0JhdGNoLnNlcSB9KTtcbiAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaChiYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiBjaGFuZ2VzT3B0cy5saXZlKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2VzQ29tcGxldGUoY2hhbmdlcykge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBpZiBubyByZXN1bHRzIHdlcmUgcmV0dXJuZWQgdGhlbiB3ZSdyZSBkb25lLFxuICAgIC8vIGVsc2UgZmV0Y2ggbW9yZVxuICAgIGlmIChjaGFuZ2VzLnJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlc09wdHMuc2luY2UgPSBjaGFuZ2VzLnJlc3VsdHNbY2hhbmdlcy5yZXN1bHRzLmxlbmd0aCAtIDFdLnNlcTtcbiAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgIHByb2Nlc3NQZW5kaW5nQmF0Y2godHJ1ZSk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGludW91cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmxpdmUgPSB0cnVlO1xuICAgICAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUGVuZGluZ0JhdGNoKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBjaGVja3BvaW50IHNvIHdlIHN0YXJ0IGZyb20gdGhlIHJpZ2h0IHNlcSBuZXh0IHRpbWVcbiAgICAgIGlmICghY3VycmVudEJhdGNoICYmIGNoYW5nZXMucmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgICAgICBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KGNoYW5nZXMubGFzdF9zZXEsXG4gICAgICAgICAgICBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxID0gY2hhbmdlcy5sYXN0X3NlcTtcbiAgICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25DaGVja3BvaW50RXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlc0Vycm9yKGVycikge1xuICAgIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICB9XG4gICAgYWJvcnRSZXBsaWNhdGlvbignY2hhbmdlcyByZWplY3RlZCcsIGVycik7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGdldENoYW5nZXMoKSB7XG4gICAgaWYgKCEoXG4gICAgICAhY2hhbmdlc1BlbmRpbmcgJiZcbiAgICAgICFjaGFuZ2VzQ29tcGxldGVkICYmXG4gICAgICBiYXRjaGVzLmxlbmd0aCA8IGJhdGNoZXNfbGltaXRcbiAgICAgICkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2hhbmdlc1BlbmRpbmcgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIGFib3J0Q2hhbmdlcygpIHtcbiAgICAgIGNoYW5nZXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKCkge1xuICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIGFib3J0Q2hhbmdlcyk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlLl9jaGFuZ2VzKSB7IC8vIHJlbW92ZSBvbGQgY2hhbmdlcygpIGFuZCBsaXN0ZW5lcnNcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdjYW5jZWwnLCByZXR1cm5WYWx1ZS5fYWJvcnRDaGFuZ2VzKTtcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzLmNhbmNlbCgpO1xuICAgIH1cbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBhYm9ydENoYW5nZXMpO1xuXG4gICAgdmFyIGNoYW5nZXMgPSBzcmMuY2hhbmdlcyhjaGFuZ2VzT3B0cylcbiAgICAgIC5vbignY2hhbmdlJywgb25DaGFuZ2UpO1xuICAgIGNoYW5nZXMudGhlbihyZW1vdmVMaXN0ZW5lciwgcmVtb3ZlTGlzdGVuZXIpO1xuICAgIGNoYW5nZXMudGhlbihvbkNoYW5nZXNDb21wbGV0ZSlcbiAgICAgIC5jYXRjaChvbkNoYW5nZXNFcnJvcik7XG5cbiAgICBpZiAob3B0cy5yZXRyeSkge1xuICAgICAgLy8gc2F2ZSBmb3IgbGF0ZXIgc28gd2UgY2FuIGNhbmNlbCBpZiBuZWNlc3NhcnlcbiAgICAgIHJldHVyblZhbHVlLl9jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgIHJldHVyblZhbHVlLl9hYm9ydENoYW5nZXMgPSBhYm9ydENoYW5nZXM7XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBzdGFydENoYW5nZXMoKSB7XG4gICAgaW5pdENoZWNrcG9pbnRlcigpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrcG9pbnRlci5nZXRDaGVja3BvaW50KCkudGhlbihmdW5jdGlvbiAoY2hlY2twb2ludCkge1xuICAgICAgICBsYXN0X3NlcSA9IGNoZWNrcG9pbnQ7XG4gICAgICAgIGNoYW5nZXNPcHRzID0ge1xuICAgICAgICAgIHNpbmNlOiBsYXN0X3NlcSxcbiAgICAgICAgICBsaW1pdDogYmF0Y2hfc2l6ZSxcbiAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplLFxuICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICBkb2NfaWRzOiBkb2NfaWRzLFxuICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICByZXR1cm5fZG9jczogdHJ1ZSAvLyByZXF1aXJlZCBzbyB3ZSBrbm93IHdoZW4gd2UncmUgZG9uZVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0cy5maWx0ZXIpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHRoZSBjbGllbnQtc2lkZSBmaWx0ZXIgaW4gb25DaGFuZ2VcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHsgLy8gZGRvYyBmaWx0ZXJcbiAgICAgICAgICAgIGNoYW5nZXNPcHRzLmZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2hlYXJ0YmVhdCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLmhlYXJ0YmVhdCA9IG9wdHMuaGVhcnRiZWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmICgndGltZW91dCcgaW4gb3B0cykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMucXVlcnlfcGFyYW1zKSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMucXVlcnlfcGFyYW1zID0gb3B0cy5xdWVyeV9wYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMudmlldykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnZpZXcgPSBvcHRzLnZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgYWJvcnRSZXBsaWNhdGlvbignZ2V0Q2hlY2twb2ludCByZWplY3RlZCB3aXRoICcsIGVycik7XG4gICAgfSk7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBvbkNoZWNrcG9pbnRFcnJvcihlcnIpIHtcbiAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgIGFib3J0UmVwbGljYXRpb24oJ3dyaXRlQ2hlY2twb2ludCBjb21wbGV0ZWQgd2l0aCBlcnJvcicsIGVycik7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkgeyAvLyBjYW5jZWxsZWQgaW1tZWRpYXRlbHlcbiAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFyZXR1cm5WYWx1ZS5fYWRkZWRMaXN0ZW5lcnMpIHtcbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdjYW5jZWwnLCBjb21wbGV0ZVJlcGxpY2F0aW9uKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuVmFsdWUub25jZSgnZXJyb3InLCBvcHRzLmNvbXBsZXRlKTtcbiAgICAgIHJldHVyblZhbHVlLm9uY2UoJ2NvbXBsZXRlJywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuVmFsdWUuX2FkZGVkTGlzdGVuZXJzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cy5zaW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGFydENoYW5nZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0Q2hlY2twb2ludGVyKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB3cml0aW5nQ2hlY2twb2ludCA9IHRydWU7XG4gICAgICByZXR1cm4gY2hlY2twb2ludGVyLndyaXRlQ2hlY2twb2ludChvcHRzLnNpbmNlLCBzZXNzaW9uKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0X3NlcSA9IG9wdHMuc2luY2U7XG4gICAgICBzdGFydENoYW5nZXMoKTtcbiAgICB9KS5jYXRjaChvbkNoZWNrcG9pbnRFcnJvcik7XG4gIH1cbn1cblxuLy8gV2UgY3JlYXRlIGEgYmFzaWMgcHJvbWlzZSBzbyB0aGUgY2FsbGVyIGNhbiBjYW5jZWwgdGhlIHJlcGxpY2F0aW9uIHBvc3NpYmx5XG4vLyBiZWZvcmUgd2UgaGF2ZSBhY3R1YWxseSBzdGFydGVkIGxpc3RlbmluZyB0byBjaGFuZ2VzIGV0Y1xuaW5oZXJpdHMoUmVwbGljYXRpb24sIEVFKTtcbmZ1bmN0aW9uIFJlcGxpY2F0aW9uKCkge1xuICBFRS5jYWxsKHRoaXMpO1xuICB0aGlzLmNhbmNlbGxlZCA9IGZhbHNlO1xuICB0aGlzLnN0YXRlID0gJ3BlbmRpbmcnO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgIHNlbGYub25jZSgnY29tcGxldGUnLCBmdWxmaWxsKTtcbiAgICBzZWxmLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG4gIHNlbGYudGhlbiA9IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gIH07XG4gIHNlbGYuY2F0Y2ggPSBmdW5jdGlvbiAocmVqZWN0KSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2gocmVqZWN0KTtcbiAgfTtcbiAgLy8gQXMgd2UgYWxsb3cgZXJyb3IgaGFuZGxpbmcgdmlhIFwiZXJyb3JcIiBldmVudCBhcyB3ZWxsLFxuICAvLyBwdXQgYSBzdHViIGluIGhlcmUgc28gdGhhdCByZWplY3RpbmcgbmV2ZXIgdGhyb3dzIFVuaGFuZGxlZEVycm9yLlxuICBzZWxmLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbn1cblxuUmVwbGljYXRpb24ucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICB0aGlzLnN0YXRlID0gJ2NhbmNlbGxlZCc7XG4gIHRoaXMuZW1pdCgnY2FuY2VsJyk7XG59O1xuXG5SZXBsaWNhdGlvbi5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiAoc3JjLCB0YXJnZXQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5fcmVhZHlDYWxsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5fcmVhZHlDYWxsZWQgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIG9uRGVzdHJveSgpIHtcbiAgICBzZWxmLmNhbmNlbCgpO1xuICB9XG4gIHNyYy5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB0YXJnZXQub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gICAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICB9XG4gIHNlbGYub25jZSgnY29tcGxldGUnLCBjbGVhbnVwKTtcbiAgc2VsZi5vbmNlKCdlcnJvcicsIGNsZWFudXApO1xufTtcblxuZnVuY3Rpb24gdG9Qb3VjaChkYiwgb3B0cykge1xuICB2YXIgUG91Y2hDb25zdHJ1Y3RvciA9IG9wdHMuUG91Y2hDb25zdHJ1Y3RvcjtcbiAgaWYgKHR5cGVvZiBkYiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IFBvdWNoQ29uc3RydWN0b3IoZGIsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkYjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsaWNhdGVXcmFwcGVyKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIGlmIChvcHRzLmRvY19pZHMgJiYgIUFycmF5LmlzQXJyYXkob3B0cy5kb2NfaWRzKSkge1xuICAgIHRocm93IGNyZWF0ZUVycm9yKEJBRF9SRVFVRVNULFxuICAgICAgICAgICAgICAgICAgICAgICBcImBkb2NfaWRzYCBmaWx0ZXIgcGFyYW1ldGVyIGlzIG5vdCBhIGxpc3QuXCIpO1xuICB9XG5cbiAgb3B0cy5jb21wbGV0ZSA9IGNhbGxiYWNrO1xuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIG9wdHMuY29udGludW91cyA9IG9wdHMuY29udGludW91cyB8fCBvcHRzLmxpdmU7XG4gIG9wdHMucmV0cnkgPSAoJ3JldHJ5JyBpbiBvcHRzKSA/IG9wdHMucmV0cnkgOiBmYWxzZTtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgb3B0cy5Qb3VjaENvbnN0cnVjdG9yID0gb3B0cy5Qb3VjaENvbnN0cnVjdG9yIHx8IHRoaXM7XG4gIHZhciByZXBsaWNhdGVSZXQgPSBuZXcgUmVwbGljYXRpb24ob3B0cyk7XG4gIHZhciBzcmNQb3VjaCA9IHRvUG91Y2goc3JjLCBvcHRzKTtcbiAgdmFyIHRhcmdldFBvdWNoID0gdG9Qb3VjaCh0YXJnZXQsIG9wdHMpO1xuICByZXBsaWNhdGUoc3JjUG91Y2gsIHRhcmdldFBvdWNoLCBvcHRzLCByZXBsaWNhdGVSZXQpO1xuICByZXR1cm4gcmVwbGljYXRlUmV0O1xufVxuXG5pbmhlcml0cyhTeW5jLCBFRSk7XG5mdW5jdGlvbiBzeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzID0ge307XG4gIH1cbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICBvcHRzLlBvdWNoQ29uc3RydWN0b3IgPSBvcHRzLlBvdWNoQ29uc3RydWN0b3IgfHwgdGhpcztcbiAgc3JjID0gdG9Qb3VjaChzcmMsIG9wdHMpO1xuICB0YXJnZXQgPSB0b1BvdWNoKHRhcmdldCwgb3B0cyk7XG4gIHJldHVybiBuZXcgU3luYyhzcmMsIHRhcmdldCwgb3B0cywgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBTeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcblxuICB2YXIgb3B0c1B1c2ggPSBvcHRzLnB1c2ggPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVzaCkgOiBvcHRzO1xuICB2YXIgb3B0c1B1bGwgPSBvcHRzLnB1bGwgPyAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIG9wdHMsIG9wdHMucHVsbCkgOiBvcHRzO1xuXG4gIHRoaXMucHVzaCA9IHJlcGxpY2F0ZVdyYXBwZXIoc3JjLCB0YXJnZXQsIG9wdHNQdXNoKTtcbiAgdGhpcy5wdWxsID0gcmVwbGljYXRlV3JhcHBlcih0YXJnZXQsIHNyYywgb3B0c1B1bGwpO1xuXG4gIHRoaXMucHVzaFBhdXNlZCA9IHRydWU7XG4gIHRoaXMucHVsbFBhdXNlZCA9IHRydWU7XG5cbiAgZnVuY3Rpb24gcHVsbENoYW5nZShjaGFuZ2UpIHtcbiAgICBzZWxmLmVtaXQoJ2NoYW5nZScsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgY2hhbmdlOiBjaGFuZ2VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoQ2hhbmdlKGNoYW5nZSkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywge1xuICAgICAgZGlyZWN0aW9uOiAncHVzaCcsXG4gICAgICBjaGFuZ2U6IGNoYW5nZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hEZW5pZWQoZG9jKSB7XG4gICAgc2VsZi5lbWl0KCdkZW5pZWQnLCB7XG4gICAgICBkaXJlY3Rpb246ICdwdXNoJyxcbiAgICAgIGRvYzogZG9jXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcHVsbERlbmllZChkb2MpIHtcbiAgICBzZWxmLmVtaXQoJ2RlbmllZCcsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1bGwnLFxuICAgICAgZG9jOiBkb2NcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoUGF1c2VkKCkge1xuICAgIHNlbGYucHVzaFBhdXNlZCA9IHRydWU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdwYXVzZWQnKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbFBhdXNlZCgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSB0cnVlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLnB1c2hQYXVzZWQpIHtcbiAgICAgIHNlbGYuZW1pdCgncGF1c2VkJyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHB1c2hBY3RpdmUoKSB7XG4gICAgc2VsZi5wdXNoUGF1c2VkID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVsbFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdhY3RpdmUnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3B1c2gnXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVsbEFjdGl2ZSgpIHtcbiAgICBzZWxmLnB1bGxQYXVzZWQgPSBmYWxzZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5wdXNoUGF1c2VkKSB7XG4gICAgICBzZWxmLmVtaXQoJ2FjdGl2ZScsIHtcbiAgICAgICAgZGlyZWN0aW9uOiAncHVsbCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZW1vdmVkID0ge307XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsKHR5cGUpIHsgLy8gdHlwZSBpcyAncHVzaCcgb3IgJ3B1bGwnXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgZnVuYykge1xuICAgICAgdmFyIGlzQ2hhbmdlID0gZXZlbnQgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQ2hhbmdlIHx8IGZ1bmMgPT09IHB1c2hDaGFuZ2UpO1xuICAgICAgdmFyIGlzRGVuaWVkID0gZXZlbnQgPT09ICdkZW5pZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsRGVuaWVkIHx8IGZ1bmMgPT09IHB1c2hEZW5pZWQpO1xuICAgICAgdmFyIGlzUGF1c2VkID0gZXZlbnQgPT09ICdwYXVzZWQnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsUGF1c2VkIHx8IGZ1bmMgPT09IHB1c2hQYXVzZWQpO1xuICAgICAgdmFyIGlzQWN0aXZlID0gZXZlbnQgPT09ICdhY3RpdmUnICYmXG4gICAgICAgIChmdW5jID09PSBwdWxsQWN0aXZlIHx8IGZ1bmMgPT09IHB1c2hBY3RpdmUpO1xuXG4gICAgICBpZiAoaXNDaGFuZ2UgfHwgaXNEZW5pZWQgfHwgaXNQYXVzZWQgfHwgaXNBY3RpdmUpIHtcbiAgICAgICAgaWYgKCEoZXZlbnQgaW4gcmVtb3ZlZCkpIHtcbiAgICAgICAgICByZW1vdmVkW2V2ZW50XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZWRbZXZlbnRdW3R5cGVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlbW92ZWRbZXZlbnRdKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAvLyBib3RoIHB1c2ggYW5kIHB1bGwgaGF2ZSBhc2tlZCB0byBiZSByZW1vdmVkXG4gICAgICAgICAgc2VsZi5yZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRzLmxpdmUpIHtcbiAgICB0aGlzLnB1c2gub24oJ2NvbXBsZXRlJywgc2VsZi5wdWxsLmNhbmNlbC5iaW5kKHNlbGYucHVsbCkpO1xuICAgIHRoaXMucHVsbC5vbignY29tcGxldGUnLCBzZWxmLnB1c2guY2FuY2VsLmJpbmQoc2VsZi5wdXNoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRPbmVMaXN0ZW5lcihlZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGVlLmxpc3RlbmVycyhldmVudCkuaW5kZXhPZihsaXN0ZW5lcikgPT0gLTEpIHtcbiAgICAgIGVlLm9uKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdjaGFuZ2UnLCBwdWxsQ2hhbmdlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2NoYW5nZScsIHB1c2hDaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdkZW5pZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2RlbmllZCcsIHB1c2hEZW5pZWQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdhY3RpdmUnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdhY3RpdmUnLCBwdWxsQWN0aXZlKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1bGwsICdwYXVzZWQnLCBwdWxsUGF1c2VkKTtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVzaCwgJ3BhdXNlZCcsIHB1c2hQYXVzZWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5vbigncmVtb3ZlTGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ2NoYW5nZScsIHB1bGxDaGFuZ2UpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdjaGFuZ2UnLCBwdXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnZGVuaWVkJykge1xuICAgICAgc2VsZi5wdWxsLnJlbW92ZUxpc3RlbmVyKCdkZW5pZWQnLCBwdWxsRGVuaWVkKTtcbiAgICAgIHNlbGYucHVzaC5yZW1vdmVMaXN0ZW5lcignZGVuaWVkJywgcHVzaERlbmllZCk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIHNlbGYucHVsbC5yZW1vdmVMaXN0ZW5lcignYWN0aXZlJywgcHVsbEFjdGl2ZSk7XG4gICAgICBzZWxmLnB1c2gucmVtb3ZlTGlzdGVuZXIoJ2FjdGl2ZScsIHB1c2hBY3RpdmUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdwYXVzZWQnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlZCcsIHB1bGxQYXVzZWQpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdwYXVzZWQnLCBwdXNoUGF1c2VkKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMucHVsbC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1bGwnKSk7XG4gIHRoaXMucHVzaC5vbigncmVtb3ZlTGlzdGVuZXInLCByZW1vdmVBbGwoJ3B1c2gnKSk7XG5cbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLmFsbChbXG4gICAgdGhpcy5wdXNoLFxuICAgIHRoaXMucHVsbFxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgdmFyIG91dCA9IHtcbiAgICAgIHB1c2g6IHJlc3BbMF0sXG4gICAgICBwdWxsOiByZXNwWzFdXG4gICAgfTtcbiAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgb3V0KTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIG91dCk7XG4gICAgfVxuICAgIHNlbGYucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIGEgY2FsbGJhY2ssIHRoZW4gdGhlIGNhbGxiYWNrIGNhbiByZWNlaXZlXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnRcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2ssIHRoZW4gd2UncmUgc2FmZSB0byBlbWl0IGFuIGVycm9yXG4gICAgICAvLyBldmVudCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IGFuIHVuaGFuZGxlZCBlcnJvclxuICAgICAgLy8gZHVlIHRvICdlcnJvcicgYmVpbmcgYSBzcGVjaWFsIGV2ZW50IGluIEV2ZW50RW1pdHRlcnNcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gbm8gc2Vuc2UgdGhyb3dpbmcgaWYgd2UncmUgYWxyZWFkeSBlbWl0dGluZyBhbiAnZXJyb3InIGV2ZW50XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnRoZW4gPSBmdW5jdGlvbiAoc3VjY2VzcywgZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbihzdWNjZXNzLCBlcnIpO1xuICB9O1xuXG4gIHRoaXMuY2F0Y2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2goZXJyKTtcbiAgfTtcbn1cblxuU3luYy5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY2FuY2VsZWQpIHtcbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICB0aGlzLnB1c2guY2FuY2VsKCk7XG4gICAgdGhpcy5wdWxsLmNhbmNlbCgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiByZXBsaWNhdGlvbihQb3VjaERCKSB7XG4gIFBvdWNoREIucmVwbGljYXRlID0gcmVwbGljYXRlV3JhcHBlcjtcbiAgUG91Y2hEQi5zeW5jID0gc3luYztcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUG91Y2hEQi5wcm90b3R5cGUsICdyZXBsaWNhdGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGljYXRlTWV0aG9kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5yZXBsaWNhdGVNZXRob2RzID0ge1xuICAgICAgICAgIGZyb206IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShvdGhlciwgc2VsZiwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86IGZ1bmN0aW9uIChvdGhlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0cnVjdG9yLnJlcGxpY2F0ZShzZWxmLCBvdGhlciwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlcGxpY2F0ZU1ldGhvZHM7XG4gICAgfVxuICB9KTtcblxuICBQb3VjaERCLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKGRiTmFtZSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5zeW5jKHRoaXMsIGRiTmFtZSwgb3B0cywgY2FsbGJhY2spO1xuICB9O1xufVxuXG5Qb3VjaERCLnBsdWdpbihJREJQb3VjaClcbiAgLnBsdWdpbihIdHRwUG91Y2gkMSlcbiAgLnBsdWdpbihtYXByZWR1Y2UpXG4gIC5wbHVnaW4ocmVwbGljYXRpb24pO1xuXG4vLyBQdWxsIGZyb20gc3JjIGJlY2F1c2UgcG91Y2hkYi1ub2RlL3BvdWNoZGItYnJvd3NlciB0aGVtc2VsdmVzXG5cbmV4cG9ydCBkZWZhdWx0IFBvdWNoREI7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJzsgLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcblxudmFyIF9jbG9ja3NlcTsgLy8gUHJldmlvdXMgdXVpZCBjcmVhdGlvbiB0aW1lXG5cblxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IEFycmF5KDE2KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7IC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuXG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtzZWVkQnl0ZXNbMF0gfCAweDAxLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG4gICAgfVxuXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9IC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuXG5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7IC8vIFBlciA0LjIuMS4yLCB1c2UgY291bnQgb2YgdXVpZCdzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY2xvY2tcbiAgLy8gY3ljbGUgdG8gc2ltdWxhdGUgaGlnaGVyIHJlc29sdXRpb24gY2xvY2tcblxuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7IC8vIFRpbWUgc2luY2UgbGFzdCB1dWlkIGNyZWF0aW9uIChpbiBtc2VjcylcblxuICB2YXIgZHQgPSBtc2VjcyAtIF9sYXN0TVNlY3MgKyAobnNlY3MgLSBfbGFzdE5TZWNzKSAvIDEwMDAwOyAvLyBQZXIgNC4yLjEuMiwgQnVtcCBjbG9ja3NlcSBvbiBjbG9jayByZWdyZXNzaW9uXG5cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfSAvLyBSZXNldCBuc2VjcyBpZiBjbG9jayByZWdyZXNzZXMgKG5ldyBjbG9ja3NlcSkgb3Igd2UndmUgbW92ZWQgb250byBhIG5ld1xuICAvLyB0aW1lIGludGVydmFsXG5cblxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfSAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG5cblxuICBpZiAobnNlY3MgPj0gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgfVxuXG4gIF9sYXN0TVNlY3MgPSBtc2VjcztcbiAgX2xhc3ROU2VjcyA9IG5zZWNzO1xuICBfY2xvY2tzZXEgPSBjbG9ja3NlcTsgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG5cbiAgbXNlY3MgKz0gMTIyMTkyOTI4MDAwMDA7IC8vIGB0aW1lX2xvd2BcblxuICB2YXIgdGwgPSAoKG1zZWNzICYgMHhmZmZmZmZmKSAqIDEwMDAwICsgbnNlY3MpICUgMHgxMDAwMDAwMDA7XG4gIGJbaSsrXSA9IHRsID4+PiAyNCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiAxNiAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdGwgJiAweGZmOyAvLyBgdGltZV9taWRgXG5cbiAgdmFyIHRtaCA9IG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjsgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcblxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG5cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7IC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiLypcbiAqIEJyb3dzZXItY29tcGF0aWJsZSBKYXZhU2NyaXB0IE1ENVxuICpcbiAqIE1vZGlmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqL1xuZnVuY3Rpb24gbWQ1KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShtc2cubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZDVUb0hleEVuY29kZWRBcnJheSh3b3Jkc1RvTWQ1KGJ5dGVzVG9Xb3JkcyhieXRlcyksIGJ5dGVzLmxlbmd0aCAqIDgpKTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNVRvSGV4RW5jb2RlZEFycmF5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGxlbmd0aDMyID0gaW5wdXQubGVuZ3RoICogMzI7XG4gIHZhciBoZXhUYWIgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5cblxuZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoOCkge1xuICByZXR1cm4gKGlucHV0TGVuZ3RoOCArIDY0ID4+PiA5IDw8IDQpICsgMTQgKyAxO1xufVxuLypcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKi9cblxuXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBieXRlcyB0byBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBDaGFyYWN0ZXJzID4yNTUgaGF2ZSB0aGVpciBoaWdoLWJ5dGUgc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE91dHB1dExlbmd0aChsZW5ndGg4KSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXRbaSAvIDhdICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9ucyBpbnRlcm5hbGx5XG4gKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuICovXG5cblxuZnVuY3Rpb24gc2FmZUFkZCh4LCB5KSB7XG4gIHZhciBsc3cgPSAoeCAmIDB4ZmZmZikgKyAoeSAmIDB4ZmZmZik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDB4ZmZmZjtcbn1cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cblxuXG5mdW5jdGlvbiBiaXRSb3RhdGVMZWZ0KG51bSwgY250KSB7XG4gIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbn1cbi8qXG4gKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBmb3VyIGJhc2ljIG9wZXJhdGlvbnMgdGhlIGFsZ29yaXRobSB1c2VzLlxuICovXG5cblxuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgYyB8IH5iICYgZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgZCB8IGMgJiB+ZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVpaShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWQ1OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IG1kNSBmcm9tICcuL21kNS5qcyc7XG52YXIgdjMgPSB2MzUoJ3YzJywgMHgzMCwgbWQ1KTtcbmV4cG9ydCBkZWZhdWx0IHYzOyIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImV4cG9ydCBkZWZhdWx0ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8qKlxyXG4qIHZrQmVhdXRpZnkgLSBqYXZhc2NyaXB0IHBsdWdpbiB0byBwcmV0dHktcHJpbnQgb3IgbWluaWZ5IHRleHQgaW4gWE1MLCBKU09OLCBDU1MgYW5kIFNRTCBmb3JtYXRzLlxyXG4qXHJcbiogQ29weXJpZ2h0IChjKSAyMDEyIFZhZGltIEtpcnl1a2hpblxyXG4qIHZraXJ5dWtoaW4gQCBnbWFpbC5jb21cclxuKiBodHRwOi8vd3d3LmVzbGluc3RydWN0b3IubmV0L3ZrYmVhdXRpZnkvXHJcbipcclxuKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczpcclxuKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiogICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWxcclxuKlxyXG4qICAgUHJldHR5IHByaW50XHJcbipcclxuKiAgICAgICAgdmtiZWF1dGlmeS54bWwodGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuanNvbih0ZXh0IFssaW5kZW50X3BhdHRlcm5dKTtcclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3ModGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQgWyxpbmRlbnRfcGF0dGVybl0pO1xyXG4qXHJcbiogICAgICAgIEB0ZXh0IC0gU3RyaW5nOyB0ZXh0IHRvIGJlYXR1Znk7XHJcbiogICAgICAgIEBpbmRlbnRfcGF0dGVybiAtIEludGVnZXIgfCBTdHJpbmc7XHJcbiogICAgICAgICAgICAgICAgSW50ZWdlcjogIG51bWJlciBvZiB3aGl0ZSBzcGFjZXM7XHJcbiogICAgICAgICAgICAgICAgU3RyaW5nOiAgIGNoYXJhY3RlciBzdHJpbmcgdG8gdmlzdWFsaXplIGluZGVudGF0aW9uICggY2FuIGFsc28gYmUgYSBzZXQgb2Ygd2hpdGUgc3BhY2VzIClcclxuKiAgIE1pbmlmeVxyXG4qXHJcbiogICAgICAgIHZrYmVhdXRpZnkueG1sbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuY3NzbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbG1pbih0ZXh0KTtcclxuKlxyXG4qICAgICAgICBAdGV4dCAtIFN0cmluZzsgdGV4dCB0byBtaW5pZnk7XHJcbiogICAgICAgIEBwcmVzZXJ2ZV9jb21tZW50cyAtIEJvb2w7IFtvcHRpb25hbF07XHJcbiogICAgICAgICAgICAgICAgU2V0IHRoaXMgZmxhZyB0byB0cnVlIHRvIHByZXZlbnQgcmVtb3ZpbmcgY29tbWVudHMgZnJvbSBAdGV4dCAoIG1pbnhtbCBhbmQgbWluY3NzIGZ1bmN0aW9ucyBvbmx5LiApXHJcbipcclxuKiAgIEV4YW1wbGVzOlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbCh0ZXh0KTsgLy8gcHJldHR5IHByaW50IFhNTFxyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb24odGV4dCwgNCApOyAvLyBwcmV0dHkgcHJpbnQgSlNPTlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LmNzcyh0ZXh0LCAnLiAuIC4gLicpOyAvLyBwcmV0dHkgcHJpbnQgQ1NTXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQsICctLS0tJyk7IC8vIHByZXR0eSBwcmludCBTUUxcclxuKlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbG1pbih0ZXh0LCB0cnVlKTsvLyBtaW5pZnkgWE1MLCBwcmVzZXJ2ZSBjb21tZW50c1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7Ly8gbWluaWZ5IEpTT05cclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3NtaW4odGV4dCk7Ly8gbWluaWZ5IENTUywgcmVtb3ZlIGNvbW1lbnRzICggZGVmYXVsdCApXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsbWluKHRleHQpOy8vIG1pbmlmeSBTUUxcclxuKlxyXG4qL1xyXG5mdW5jdGlvbiBjcmVhdGVTaGlmdEFycihzdGVwKSB7XHJcblxyXG5cdHZhciBzcGFjZSA9ICcgICAgJztcclxuXHJcblx0aWYgKCBpc05hTihwYXJzZUludChzdGVwKSkgKSB7ICAvLyBhcmd1bWVudCBpcyBzdHJpbmdcclxuXHRcdHNwYWNlID0gc3RlcDtcclxuXHR9IGVsc2UgeyAvLyBhcmd1bWVudCBpcyBpbnRlZ2VyXHJcblx0XHRzd2l0Y2goc3RlcCkge1xyXG5cdFx0XHRjYXNlIDE6IHNwYWNlID0gJyAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSAyOiBzcGFjZSA9ICcgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDM6IHNwYWNlID0gJyAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDQ6IHNwYWNlID0gJyAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA1OiBzcGFjZSA9ICcgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDY6IHNwYWNlID0gJyAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDc6IHNwYWNlID0gJyAgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA4OiBzcGFjZSA9ICcgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDk6IHNwYWNlID0gJyAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDEwOiBzcGFjZSA9ICcgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTE6IHNwYWNlID0gJyAgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTI6IHNwYWNlID0gJyAgICAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIHNoaWZ0ID0gWydcXG4nXTsgLy8gYXJyYXkgb2Ygc2hpZnRzXHJcblx0Zm9yKHZhciBpeD0wO2l4PDEwMDtpeCsrKSB7XHJcblx0XHRzaGlmdC5wdXNoKHNoaWZ0W2l4XStzcGFjZSk7XHJcblx0fVxyXG5cdHJldHVybiBzaGlmdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdmtiZWF1dGlmeSgpe1xyXG5cdHRoaXMuc3RlcCA9ICcgICAgJzsgLy8gNCBzcGFjZXNcclxuXHR0aGlzLnNoaWZ0ID0gY3JlYXRlU2hpZnRBcnIodGhpcy5zdGVwKTtcclxufTtcclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLnhtbCA9IGZ1bmN0aW9uKHRleHQsc3RlcCkge1xyXG5cclxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoLzwvZyxcIn46On48XCIpXHJcblx0XHRcdFx0IC5yZXBsYWNlKC9cXHMqeG1sbnNcXDovZyxcIn46On54bWxuczpcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoL1xccyp4bWxuc1xcPS9nLFwifjo6fnhtbG5zPVwiKVxyXG5cdFx0XHRcdCAuc3BsaXQoJ346On4nKSxcclxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcclxuXHRcdGluQ29tbWVudCA9IGZhbHNlLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cdFx0XHQvLyBzdGFydCBjb21tZW50IG9yIDwhW0NEQVRBWy4uLl1dPiBvciA8IURPQ1RZUEUgLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPCEvKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSB0cnVlO1xyXG5cdFx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0XHRpZihhcltpeF0uc2VhcmNoKC8tLT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goL1xcXT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goLyFET0NUWVBFLykgPiAtMSApIHtcclxuXHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBhcltpeF07XHJcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtPjwvZWxtPiAvL1xyXG5cdFx0XHRpZiggL148XFx3Ly5leGVjKGFyW2l4LTFdKSAmJiAvXjxcXC9cXHcvLmV4ZWMoYXJbaXhdKSAmJlxyXG5cdFx0XHRcdC9ePFtcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXgtMV0pID09IC9ePFxcL1tcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXhdKVswXS5yZXBsYWNlKCcvJywnJykpIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHRcdGlmKCFpbkNvbW1lbnQpIGRlZXAtLTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdCAvLyA8ZWxtPiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPT0gLTEgJiYgYXJbaXhdLnNlYXJjaCgvXFwvPi8pID09IC0xICkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0IC8vIDxlbG0+Li4uPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXHcvKSA+IC0xICYmIGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtLz4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvXFwvPi8pID4gLTEgKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPD8geG1sIC4uLiA/PiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFw/LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyB4bWxucyAvL1xyXG5cdFx0XHRpZiggYXJbaXhdLnNlYXJjaCgveG1sbnNcXDovKSA+IC0xICB8fCBhcltpeF0uc2VhcmNoKC94bWxuc1xcPS8pID4gLTEpIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdHJldHVybiAgKHN0clswXSA9PSAnXFxuJykgPyBzdHIuc2xpY2UoMSkgOiBzdHI7XHJcbn1cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLmpzb24gPSBmdW5jdGlvbih0ZXh0LHN0ZXApIHtcclxuXHJcblx0dmFyIHN0ZXAgPSBzdGVwID8gc3RlcCA6IHRoaXMuc3RlcDtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiICkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGV4dCksIG51bGwsIHN0ZXApO1xyXG5cdGlmICggdHlwZW9mIHRleHQgPT09IFwib2JqZWN0XCIgKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgc3RlcCk7XHJcblxyXG5cdHJldHVybiB0ZXh0OyAvLyB0ZXh0IGlzIG5vdCBzdHJpbmcgbm9yIG9iamVjdFxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3MgPSBmdW5jdGlvbih0ZXh0LCBzdGVwKSB7XHJcblxyXG5cdHZhciBhciA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLCcgJylcclxuXHRcdFx0XHQucmVwbGFjZSgvXFx7L2csXCJ7fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXH0vZyxcIn46On59fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXDsvZyxcIjt+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcL1xcKi9nLFwifjo6fi8qXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcKlxcLy9nLFwiKi9+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL346On5cXHN7MCx9fjo6fi9nLFwifjo6flwiKVxyXG5cdFx0XHRcdC5zcGxpdCgnfjo6ficpLFxyXG5cdFx0bGVuID0gYXIubGVuZ3RoLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cclxuXHRcdFx0aWYoIC9cXHsvLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdGlmKCAvXFwqXFxcXC8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxuezEsfS8sJycpO1xyXG59XHJcblxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmZ1bmN0aW9uIGlzU3VicXVlcnkoc3RyLCBwYXJlbnRoZXNpc0xldmVsKSB7XHJcblx0cmV0dXJuICBwYXJlbnRoZXNpc0xldmVsIC0gKHN0ci5yZXBsYWNlKC9cXCgvZywnJykubGVuZ3RoIC0gc3RyLnJlcGxhY2UoL1xcKS9nLCcnKS5sZW5ndGggKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzcGxpdF9zcWwoc3RyLCB0YWIpIHtcclxuXHJcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHN7MSx9L2csXCIgXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQU5EIC9pZyxcIn46On5cIit0YWIrdGFiK1wiQU5EIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQkVUV0VFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiQkVUV0VFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENBU0UgL2lnLFwifjo6flwiK3RhYitcIkNBU0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFTFNFIC9pZyxcIn46On5cIit0YWIrXCJFTFNFIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRU5EIC9pZyxcIn46On5cIit0YWIrXCJFTkQgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBGUk9NIC9pZyxcIn46On5GUk9NIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gR1JPVVBcXHN7MSx9QlkvaWcsXCJ+Ojp+R1JPVVAgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBIQVZJTkcgL2lnLFwifjo6fkhBVklORyBcIilcclxuXHRcdFx0XHQvLy5yZXBsYWNlKC8gU0VUIC9pZyxcIiBTRVR+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBJTiAvaWcsXCIgSU4gXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSk9JTiAvaWcsXCJ+Ojp+Sk9JTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENST1NTfjo6fnsxLH1KT0lOIC9pZyxcIn46On5DUk9TUyBKT0lOIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSU5ORVJ+Ojp+ezEsfUpPSU4gL2lnLFwifjo6fklOTkVSIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBMRUZUfjo6fnsxLH1KT0lOIC9pZyxcIn46On5MRUZUIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBSSUdIVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+UklHSFQgSk9JTiBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT04gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPUiAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIk9SIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT1JERVJcXHN7MSx9QlkvaWcsXCJ+Ojp+T1JERVIgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPVkVSIC9pZyxcIn46On5cIit0YWIrXCJPVkVSIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvXFwoXFxzezAsfVNFTEVDVCAvaWcsXCJ+Ojp+KFNFTEVDVCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFwpXFxzezAsfVNFTEVDVCAvaWcsXCIpfjo6flNFTEVDVCBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBUSEVOIC9pZyxcIiBUSEVOfjo6flwiK3RhYitcIlwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVU5JT04gL2lnLFwifjo6flVOSU9Ofjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVVNJTkcgL2lnLFwifjo6flVTSU5HIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gV0hFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiV0hFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdIRVJFIC9pZyxcIn46On5XSEVSRSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdJVEggL2lnLFwifjo6fldJVEggXCIpXHJcblxyXG5cdFx0XHRcdC8vLnJlcGxhY2UoL1xcLFxcc3swLH1cXCgvaWcsXCIsfjo6figgXCIpXHJcblx0XHRcdFx0Ly8ucmVwbGFjZSgvXFwsL2lnLFwiLH46On5cIit0YWIrdGFiK1wiXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQUxMIC9pZyxcIiBBTEwgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBUyAvaWcsXCIgQVMgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBU0MgL2lnLFwiIEFTQyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIERFU0MgL2lnLFwiIERFU0MgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBESVNUSU5DVCAvaWcsXCIgRElTVElOQ1QgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFWElTVFMgL2lnLFwiIEVYSVNUUyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIE5PVCAvaWcsXCIgTk9UIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gTlVMTCAvaWcsXCIgTlVMTCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIExJS0UgL2lnLFwiIExJS0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcc3swLH1TRUxFQ1QgL2lnLFwiU0VMRUNUIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHN7MCx9VVBEQVRFIC9pZyxcIlVQREFURSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFNFVCAvaWcsXCIgU0VUIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvfjo6fnsxLH0vZyxcIn46On5cIilcclxuXHRcdFx0XHQuc3BsaXQoJ346On4nKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuc3FsID0gZnVuY3Rpb24odGV4dCxzdGVwKSB7XHJcblxyXG5cdHZhciBhcl9ieV9xdW90ZSA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXCcvaWcsXCJ+Ojp+XFwnXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCd+Ojp+JyksXHJcblx0XHRsZW4gPSBhcl9ieV9xdW90ZS5sZW5ndGgsXHJcblx0XHRhciA9IFtdLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHR0YWIgPSB0aGlzLnN0ZXAsLy8rdGhpcy5zdGVwLFxyXG5cdFx0aW5Db21tZW50ID0gdHJ1ZSxcclxuXHRcdGluUXVvdGUgPSBmYWxzZSxcclxuXHRcdHBhcmVudGhlc2lzTGV2ZWwgPSAwLFxyXG5cdFx0c3RyID0gJycsXHJcblx0XHRpeCA9IDAsXHJcblx0XHRzaGlmdCA9IHN0ZXAgPyBjcmVhdGVTaGlmdEFycihzdGVwKSA6IHRoaXMuc2hpZnQ7O1xyXG5cclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblx0XHRcdGlmKGl4JTIpIHtcclxuXHRcdFx0XHRhciA9IGFyLmNvbmNhdChhcl9ieV9xdW90ZVtpeF0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyID0gYXIuY29uY2F0KHNwbGl0X3NxbChhcl9ieV9xdW90ZVtpeF0sIHRhYikgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGxlbiA9IGFyLmxlbmd0aDtcclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblxyXG5cdFx0XHRwYXJlbnRoZXNpc0xldmVsID0gaXNTdWJxdWVyeShhcltpeF0sIHBhcmVudGhlc2lzTGV2ZWwpO1xyXG5cclxuXHRcdFx0aWYoIC9cXHN7MCx9XFxzezAsfVNFTEVDVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggL1xcc3swLH1cXHN7MCx9U0VUXFxzezAsfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdGFyW2l4XSA9IGFyW2l4XS5yZXBsYWNlKC9cXCwvZyxcIixcXG5cIit0YWIrdGFiK1wiXCIpXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCAvXFxzezAsfVxcKFxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7XHJcblx0XHRcdFx0ZGVlcCsrO1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcJy8uZXhlYyhhcltpeF0pICkgIHtcclxuXHRcdFx0XHRpZihwYXJlbnRoZXNpc0xldmVsPDEgJiYgZGVlcCkge1xyXG5cdFx0XHRcdFx0ZGVlcC0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHRcdGlmKHBhcmVudGhlc2lzTGV2ZWw8MSAmJiBkZWVwKSB7XHJcblx0XHRcdFx0XHRkZWVwLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciBqdW5rID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRzdHIgPSBzdHIucmVwbGFjZSgvXlxcbnsxLH0vLCcnKS5yZXBsYWNlKC9cXG57MSx9L2csXCJcXG5cIik7XHJcblx0XHRyZXR1cm4gc3RyO1xyXG59XHJcblxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUueG1sbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xyXG5cclxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcclxuXHRcdFx0XHRcdFx0XHQgICA6IHRleHQucmVwbGFjZSgvXFw8IVsgXFxyXFxuXFx0XSooLS0oW15cXC1dfFtcXHJcXG5dfC1bXlxcLV0pKi0tWyBcXHJcXG5cXHRdKilcXD4vZyxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgLnJlcGxhY2UoL1sgXFxyXFxuXFx0XXsxLH14bWxucy9nLCAnIHhtbG5zJyk7XHJcblx0cmV0dXJuICBzdHIucmVwbGFjZSgvPlxcc3swLH08L2csXCI+PFwiKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuanNvbm1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0ZXh0KSwgbnVsbCwgMCk7XHJcblxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3NtaW4gPSBmdW5jdGlvbih0ZXh0LCBwcmVzZXJ2ZUNvbW1lbnRzKSB7XHJcblxyXG5cdHZhciBzdHIgPSBwcmVzZXJ2ZUNvbW1lbnRzID8gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdCAgIDogdGV4dC5yZXBsYWNlKC9cXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXiovXXxbXFxyXFxuXSkpKSpcXCorXFwvL2csXCJcIikgO1xyXG5cclxuXHRyZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xce1xcc3sxLH0vZyxcIntcIilcclxuXHRcdFx0ICAucmVwbGFjZSgvXFx9XFxzezEsfS9nLFwifVwiKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXDtcXHN7MSx9L2csXCI7XCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcL1xcKlxcc3sxLH0vZyxcIi8qXCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcKlxcL1xcc3sxLH0vZyxcIiovXCIpO1xyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5zcWxtaW4gPSBmdW5jdGlvbih0ZXh0KSB7XHJcblx0cmV0dXJuIHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKS5yZXBsYWNlKC9cXHN7MSx9XFwoLyxcIihcIikucmVwbGFjZSgvXFxzezEsfVxcKS8sXCIpXCIpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyB2a2JlYXV0aWZ5KCk7XHJcbiIsImV4cG9ydCBjb25zdCB1cGxvYWRBcmVhSFRNTCA9IFxuICBgPGRpdiBpZD1cImRvY3VtZW50LXVwbG9hZC1jb250YWluZXJcIj5cblxuICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9jb250YWluZXJcIj5cbiAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9hcmVhXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9tZXNzYWdlXCI+VXBsb2FkIEZpbGVzPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGlkPVwidXBsb2FkaW5nX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVfY29udGFpbmVyXCIgaWQ9XCJ1bnBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5VbnBhaXJlZCBEb2N1bWVudHM8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZmlsZXNfY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwibWVpX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1FSTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cIm1laV9saXN0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2NvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICNEQUVBRjE7IGJvcmRlci1yYWRpdXM6IDVweDtcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX3JhZGlvXCIgbmFtZT1cIm1laV9yYWRpb19ncm91cFwiIHZhbHVlPVwiY3JlYXRlX21laVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IGF1dG87bWFyZ2luLWxlZnQ6IDNweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImltYWdlX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPkltYWdlczwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cImltYWdlX2xpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZ2VuZXJhdGUtcGFpci1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbl9idXR0b25cIiBpZD1cIm1ha2VfcGFpclwiPk1ha2UgUGFpcjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9jb250YWluZXJcIiBpZD1cInBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5QYWlyZWQgRm9saW9zPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX3NvcnRfbmFtZVwiPlxuICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3J0X25hbWUgYXJyb3dfYnRuXCI+JiN4MjJDMDs8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb2xpb19saXN0XCIgaWQ9XCJwYWlyZWRfbGlzdFwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRfYnV0dG9uX2NvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25fYnV0dG9uXCIgaWQ9XCJ1cGxvYWRfYnV0dG9uXCI+XG4gICAgICAgICAgICBVcGxvYWRcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRpbmdfc3Bpbm5lclwiPuKGuzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS1cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2NvbnRhaW5lclwiIGlkPVwibWFudXNjcmlwdHNfY29udGFpbmVyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1hbnVzY3JpcHRzPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbGlvX2xpc3RcIiBpZD1cIm1hbnVzY3JpcHRfbGlzdFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAtLT5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3QgbmV3Rm9sZGVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG5leHBvcnQgY29uc3QgcmVuYW1lSFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5Db25maXJtPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDsiLCIvKiogQG1vZHVsZSBXYXJuaW5ncyAqL1xuXG4vKipcbiAqIFdhcm4gd2hlbiBncm91cGVkIG5ldW1lIGNvbXBvbmVudHMgZm9ybSBhbiB1bnJlY29nbml6ZWQgbmV1bWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ05vdFJlY29nbml6ZWQgKCk6IHZvaWQge1xuICBpZiAoISh3aW5kb3cuY29uZmlybSgnTmVvbiBkb2VzIG5vdCByZWNvZ25pemUgdGhpcyBuZXVtZSBncm91cGluZy4gV291bGQgeW91IGxpa2UgdG8gY3JlYXRlIGEgY29tcG91bmQgbmV1bWU/JykpKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG8nKS5jbGljaygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IHNlbGVjdEFsbCB9IGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuLi91dGlscy9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTVkdSZWxDb29yZHMgfSBmcm9tICcuLi91dGlscy9Db29yZGluYXRlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgc3RhZmYgaW50byB0d28gc3RhdmVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdFN0YWZmSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgc3RhZmY6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgc3RhZmY6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMuc3RhZmYgPSBzdGFmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgV2hlcmUgdG8gU3BsaXQnKTtcbiAgfVxuXG4gIHNwbGl0RGlzYWJsZSAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBpbnB1dCB0byBzcGxpdCBhIHN0YWZmLiAqL1xuICBoYW5kbGVyID0gKChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAvLyBGaW5kIHN0YWZmIHBvaW50IGNvcnJlc3BvbmRzIHRvIGlmIG9uZSBleGlzdHNcbiAgICAvLyBUT0RPXG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YWZmLmlkO1xuICAgIGNvbnN0IGN1cnNvciA9IGdldFNWR1JlbENvb3JkcyhldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXRBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdzcGxpdCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICB4OiBjdXJzb3IueFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLnN0YWZmJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKV0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgICAgIGlmIChtb3JlRWRpdCkge1xuICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdHMgc3BsaXQgb24gRXNjYXBlIHByZXNzLCBkaXNhYmxlcyBvbiBTaGlmdC4gKi9cbiAga2V5ZG93bkxpc3RlbmVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuc3BsaXREaXNhYmxlKCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKiBFeGl0IHNwbGl0IGlmIHVzZXIgY2xpY2tzIG9mZiBvZiBhY3RpdmUgcGFnZS4gKi9cbiAgY2xpY2thd2F5SGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5hY3RpdmUtcGFnZScpID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogQ2FsbGVkIHRvIHJlYXBwbHkgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIG5lY2Vzc2FyeS4gKi9cbiAgcmVzZXRIYW5kbGVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcbn1cbiIsImltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IFNwbGl0TmV1bWVBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgbmV1bWUgaW50byB0d28gbmV1bWVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdE5ldW1lSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgbmV1bWU6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmV1bWUgLSBUaGUgbmV1bWUgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgbmV1bWU6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMubmV1bWUgPSBuZXVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgVGhlIEJlZ2lubmluZyBvZiBUaGUgU2Vjb25kIE5ldW1lJyk7XG4gIH1cblxuICBzcGxpdERpc2FibGUgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXNldEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrYXdheUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgaW5wdXQgdG8gc3BsaXQgYSBuZXVtZS4gKi9cbiAgaGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5ldW1lLmlkO1xuXG4gICAgLy8gdW5zZWxlY3QoKTtcbiAgICBcbiAgICBjb25zdCBuYyA9IChldnQudGFyZ2V0IGFzIFNWR0dFbGVtZW50KS5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IG5jSWQgPSBuYy5pZDtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXROZXVtZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ3NwbGl0TmV1bWUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgbmNJZDogbmNJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9IFxuICAgICAgZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gZmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICAvLyB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAvLyBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLm5ldW1lJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgLy8gc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKSBhcyBTVkdHRWxlbWVudF0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICAgIC8vIHRyeSB7XG4gICAgICAvLyAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgLy8gICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5jbGFzc0xpc3QuYWRkKCdpcy1oaWRkZW4nKTtcbiAgICAgIC8vIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSk7XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIEV4aXRzIHNwbGl0IG9uIEVzY2FwZSBwcmVzcywgZGlzYWJsZXMgb24gU2hpZnQuICovXG4gIGtleWRvd25MaXN0ZW5lciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdCBzcGxpdCBpZiB1c2VyIGNsaWNrcyBvZmYgb2YgYWN0aXZlIHBhZ2UuICovXG4gIGNsaWNrYXdheUhhbmRsZXIgPSAoKGV2dDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYWN0aXZlLXBhZ2UnKSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIENhbGxlZCB0byByZWFwcGx5IHRoZSBldmVudCBsaXN0ZW5lciBpZiBuZWNlc3NhcnkuICovXG4gIHJlc2V0SGFuZGxlciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLnRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgZ2xvYmFsLnF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBnbG9iYWwucXVldWVNaWNyb3Rhc2soZnVuYyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy9iYXNlZCBvZmYgcnN2cCBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzXG4vL2xpY2Vuc2UgaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9tYXN0ZXIvbGliL3JzdnAvYXNhcC5qc1xuXG52YXIgTXV0YXRpb24gPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTXV0YXRpb247XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb24oaGFuZGxlKTtcbiAgdmFyIGVsZW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGVsZW1lbnQuZGF0YSA9IChjYWxsZWQgPSArK2NhbGxlZCAlIDIpO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAvLyB3ZSBjYW4gb25seSBnZXQgaGVyZSBpbiBJRTEwXG4gICAgLy8gd2hpY2ggZG9lc24ndCBoYW5kZWwgcG9zdE1lc3NhZ2Ugd2VsbFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoZnVuYykge1xuICB2YXIgY2hhbm5lbCA9IG5ldyBnbG9iYWwuTWVzc2FnZUNoYW5uZWwoKTtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59OyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RvY3VtZW50JyBpbiBnbG9iYWwgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICB2YXIgc2NyaXB0RWwgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0RWwub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlKCk7XG5cbiAgICAgIHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgIHNjcmlwdEVsID0gbnVsbDtcbiAgICB9O1xuICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpO1xuXG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uICh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCh0LCAwKTtcbiAgfTtcbn07IiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcbmltcG9ydCB7IEFsbERvY3MsIERvYywgdXBsb2Fkc0luZm8gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgKiBhcyBsb2NhbE1hbmlmZXN0IGZyb20gJy4uLy4uL2Fzc2V0cy9tYW5pZmVzdC5qc29uJztcblxuZXhwb3J0IGNvbnN0IGRiID0gbmV3IFBvdWNoREIoJ05lb24tVXNlci1TdG9yYWdlJyk7XG5cbmZ1bmN0aW9uIGdldEFsbERvY3VtZW50cygpOiBQcm9taXNlPEFsbERvY3M+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4gcmVzb2x2ZShyZXN1bHQpKVxuICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hVcGxvYWRzKCk6IFByb21pc2U8dXBsb2Fkc0luZm8+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRBbGxEb2N1bWVudHMoKTtcbiAgICByZXR1cm4gcmVzLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIG5hbWU6IHJvdy5kb2MgPyByb3cuZG9jLm5hbWUgOiAndW5kZWZpbmVkJyxcbiAgICB9KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKCdDb3VsZG5cXCd0IGZldGNoIHVwbG9hZGVkIGRvY3VtZW50cycsIGVyci5tZXNzYWdlKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmlmZXN0KGlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIG1laTogRmlsZSwgYmc6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobG9jYWxNYW5pZmVzdCkpO1xuICAgIG1hbmlmZXN0WydAaWQnXSA9IGlkO1xuICAgIG1hbmlmZXN0Wyd0aXRsZSddID0gdGl0bGU7XG4gICAgbWFuaWZlc3RbJ3RpbWVzdGFtcCddID0gKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBjb25zdCBtZWlQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBtZWlSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgbWVpUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUobWVpUmVhZGVyLnJlc3VsdCk7XG4gICAgICB9KTtcbiAgICAgIG1laVJlYWRlci5yZWFkQXNEYXRhVVJMKG1laSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBiZ1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGJnUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIGJnUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoYmdSZWFkZXIucmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgYmdSZWFkZXIucmVhZEFzRGF0YVVSTChiZyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBtZWlVcmkgPSBhd2FpdCBtZWlQcm9taXNlO1xuICAgIGNvbnN0IGJnVXJpID0gYXdhaXQgYmdQcm9taXNlO1xuXG4gICAgbWFuaWZlc3RbJ2ltYWdlJ10gPSBiZ1VyaTtcbiAgICBtYW5pZmVzdFsnbWVpX2Fubm90YXRpb25zJ10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgdHlwZTogJ0Fubm90YXRpb24nLFxuICAgICAgICBib2R5OiBtZWlVcmksXG4gICAgICAgIHRhcmdldDogYmdVcmlcbiAgICAgIH1cbiAgICBdO1xuICAgIHJlc29sdmUobWFuaWZlc3QpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBuZXcgZW50cnkgdG8gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0gaWQgXG4gKiBAcGFyYW0gdGl0bGUgXG4gKiBAcGFyYW0gY29udGVudCBcbiAqIEBwYXJhbSBzaW5nbGUgaXMgaXQgYSBzaW5nbGUgcGFnZSBvciBhIG1hbnVzY3JpcHRcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvY3VtZW50KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29udGVudDogQmxvYiwgc2luZ2xlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGIucHV0KHtcbiAgICAgIF9pZDogaWQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogc2luZ2xlID8gJ3BhZ2UnIDogJ21hbnVzY3JpcHQnLFxuICAgICAgX2F0dGFjaG1lbnRzOiB7XG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgZGF0YTogY29udGVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXNvbHZlKHRydWUpO1xuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICB3aW5kb3cuYWxlcnQoYEVycm9yIFVwbG9hZGluZyBEb2N1bWVudDogJHtlcnIubWVzc2FnZX0sIHRpdGxlOiAke25hbWV9LCBpZDogJHtpZH0uYCk7XG4gICAgICByZWplY3QoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSBpZCBcbiAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZURvY3VtZW50KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBkYi5nZXQoaWQpXG4gICAgICAudGhlbihkb2MgPT4ge1xuICAgICAgICBkYi5yZW1vdmUoZG9jKVxuICAgICAgICAgIC50aGVuKF8gPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIGRvYyBmcm9tIHRoZSBkYXRhYmFzZSAoc3VwcG9ydHMgb25seSB0aXRsZSBmb3Igbm93KVxuICogQHBhcmFtIGlkIFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEb2NOYW1lKGlkOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIFJldHJpZXZlIGRvYyBmcm9tIGRhdGFiYXNlICh0byBnZXQgX3JldilcbiAgICBkYi5nZXQ8RG9jPihpZCkudGhlbihkb2MgPT4ge1xuXG4gICAgICAvLyBSZXRyaWV2ZSBtYW5pZmVzdCBmcm9tIGRhdGFiYXNlXG4gICAgICBkYi5nZXRBdHRhY2htZW50KGlkLCAnbWFuaWZlc3QnKS50aGVuKChtYW5pZmVzdEJsb2I6IEJsb2IpID0+IHtcbiAgICAgICAgbWFuaWZlc3RCbG9iLnRleHQoKS50aGVuKG1hbmlmZXN0VGV4dCA9PiB7XG4gICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKG1hbmlmZXN0VGV4dCk7XG4gICAgXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBtYW5pZmVzdFxuICAgICAgICAgIGRvYy5uYW1lID0gbmV3TmFtZTtcbiAgICAgICAgICBtYW5pZmVzdFsndGl0bGUnXSA9IG5ld05hbWU7XG4gICAgXG4gICAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIGJsb2JcbiAgICAgICAgICBjb25zdCBuZXdNYW5pZmVzdEJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicgfSk7XG5cbiAgICAgICAgICBkb2MuX2F0dGFjaG1lbnRzWydtYW5pZmVzdCddID0ge1xuICAgICAgICAgICAgY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgICAgICBkYXRhOiBuZXdNYW5pZmVzdEJsb2JcbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICAgIGRiLnB1dChkb2MpXG4gICAgICAgICAgICAudGhlbigoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7IC8vIGRiLnB1dFxuICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBtYW5pZmVzdFRleHRQcm9taXNlXG4gICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpOyAvLyBkYi5nZXRBdHRhY2htZW50XG4gICAgfSkuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTsgLy8gZGIuZ2V0XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgSUVudHJ5LCBJRmlsZSwgSUZvbGRlciwgRmlsZVN5c3RlbVRvb2xzIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IGRlbGV0ZURvY3VtZW50LCB1cGRhdGVEb2NOYW1lIH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IEZpbGVTeXN0ZW1NYW5hZ2VyIH0gZnJvbSAnLi9GaWxlU3lzdGVtJztcbmltcG9ydCB7IFNoaWZ0U2VsZWN0aW9uTWFuYWdlciwgZGFzaGJvYXJkU3RhdGUgfSBmcm9tICcuL0Rhc2hib2FyZFRvb2xzJztcbmltcG9ydCB7IEluaXRVcGxvYWRBcmVhIH0gZnJvbSAnLi9VcGxvYWRBcmVhJztcbmltcG9ydCAqIGFzIGNvbnRleHRNZW51Q29udGVudCBmcm9tICcuL0NvbnRleHRNZW51Q29udGVudCc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuXG5jb25zdCBkb2N1bWVudHNDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWNvbnRlbnQtY29udGFpbmVyJyk7XG5jb25zdCBiYWNrZ3JvdW5kQXJlYTogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IG9wZW5CdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI29wZW4tZG9jJyk7XG5jb25zdCByZW1vdmVCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JlbW92ZS1kb2MnKTtcbmNvbnN0IG5hdlBhdGhDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25hdi1wYXRoLWNvbnRhaW5lcicpO1xubGV0IGJhY2tCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWJhY2stYnRuJyk7XG5sZXQgZW1wdHlCdXR0b246IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZzLWVtcHR5LWJ0bicpO1xubGV0IGRlbGV0ZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZnMtZGVsZXRlLWJ0bicpO1xuY29uc3QgdXBsb2FkRG9jdW1lbnRzQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWQtbmV3LWRvYy1idXR0b24nKTtcbmNvbnN0IG5ld0ZvbGRlckJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkLWZvbGRlci1idXR0b24nKTtcblxuY29uc3Qgc2hpZnRTZWxlY3Rpb24gPSBuZXcgU2hpZnRTZWxlY3Rpb25NYW5hZ2VyKCk7XG5jb25zdCBmc20gPSBGaWxlU3lzdGVtTWFuYWdlcigpO1xuY29uc3Qgc3RhdGUgPSBkYXNoYm9hcmRTdGF0ZSgpO1xuXG5jb25zdCBtYWluU2VjdGlvbjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uLWNvbnRlbnQnKTtcbmNvbnN0IGNvbnRleHRNZW51OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yaWdodC1jbGljay1maWxlLW1lbnUnKTtcbmNvbnN0IGNvbnRleHRNZW51Q29udGVudFdyYXBwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRleHQtbWVudS1pdGVtcy13cmFwcGVyJyk7XG5cbmxldCBtZXRhS2V5SXNQcmVzc2VkID0gZmFsc2U7XG5sZXQgc2hpZnRLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbmxldCBjdXJyZW50RHJhZ1RhcmdldCA9IG51bGw7XG5sZXQgcmlnaHRDbGlja2VkID0gZmFsc2U7XG5cbm9wZW5CdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkRvY3NIYW5kbGVyKTtcbnJlbW92ZUJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZW1vdmVEb2NzSGFuZGxlcik7XG51cGxvYWREb2N1bWVudHNCdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlblVwbG9hZEFyZWFIYW5kbGVyKTtcbm5ld0ZvbGRlckJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuTmV3Rm9sZGVyV2luZG93KTtcblxuLy8gU29ydGluZyBhbGdvcml0aG1zXG4vLyBjb25zdCBzb3J0QnlBbHBoYW51bWVyaWNhbCA9IChhOiBJRW50cnksIGI6IElFbnRyeSkgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbi8vIGNvbnN0IHNvcnRCeVRpbWUgPSAoYTogSUVudHJ5LCBiOiBJRW50cnkpID0+IHtcbi8vICAgY29uc3QgYVRpbWUgPSBhLm1ldGFkYXRhWydjcmVhdGVkX29uJ107XG4vLyAgIGNvbnN0IGJUaW1lID0gYi5tZXRhZGF0YVsnY3JlYXRlZF9vbiddO1xuLy8gICBpZiAoYVRpbWUgJiYgYlRpbWUpIHJldHVybiBhVGltZSAtIGJUaW1lO1xuLy8gICBlbHNlIGlmIChhVGltZSkgcmV0dXJuIC0xO1xuLy8gfTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICBpZiAoZS5tZXRhS2V5KSBtZXRhS2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgaWYgKGUuc2hpZnRLZXkpIHNoaWZ0S2V5SXNQcmVzc2VkID0gdHJ1ZTtcbiAgLy8gTG9zZSBmb2N1cyBvbiBlc2Mga2V5XG4gIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgdXBkYXRlQWN0aW9uQmFyQnV0dG9ucygpO1xuICAgIHVwZGF0ZUZTQnV0dG9ucygpO1xuICB9XG59KTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGUpID0+IHtcbiAgaWYgKCFlLm1ldGFLZXkpIG1ldGFLZXlJc1ByZXNzZWQgPSBmYWxzZTtcbiAgaWYgKCFlLnNoaWZ0S2V5KSBzaGlmdEtleUlzUHJlc3NlZCA9IGZhbHNlO1xufSk7XG5cbmJhY2tncm91bmRBcmVhPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEVsZW1lbnQ7XG4gIC8vIExvc2UgZm9jdXMgaWYgY2xpY2sgZXZlbnQgaW4gbWFpbiBzZWN0aW9uIGlzIG5vdCBhIGRvY3VtZW50IHRpbGVcbiAgY29uc3QgaXNEb2N1bWVudCA9IEJvb2xlYW4odGFyZ2V0LmNsb3Nlc3QoJy5kb2N1bWVudC1lbnRyeScpKTtcbiAgaWYgKCFpc0RvY3VtZW50KSB7XG4gICAgdW5zZWxlY3RBbGwoKTtcbiAgICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICAgIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgICB1cGRhdGVGU0J1dHRvbnMoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gb3BlblVwbG9hZEFyZWFIYW5kbGVyKCkge1xuICBpZiAoIXVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG4gIEluaXRVcGxvYWRBcmVhKHN0YXRlLmdldFBhcmVudEZvbGRlcigpKTtcbn1cblxuXG4vKipcbiAqIE9wZW5zIGEgbmV3IHRhYiB3aXRoIHRoZSBOZW9uIGVkaXRvciBmb3IgdGhlIGdpdmVuIGlkXG4gKiBcbiAqIEBwYXJhbSBpZCBrZXkgb2YgZmlsZSBpbiBiYmIgb3IgbWFuaWZlc3QgdXJsXG4gKiBAcGFyYW0gaXNTYW1wbGUgYm9vbGVhbiB0byBkZWNpZGUgd2hlcmUgdG8gZmV0Y2ggZmlsZVxuICovXG5mdW5jdGlvbiBvcGVuRWRpdG9yVGFiKGlkOiBzdHJpbmcsIGlzU2FtcGxlOiBib29sZWFuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IChpc1NhbXBsZSlcbiAgICA/IHsgbWFuaWZlc3Q6IGlkIH1cbiAgICA6IHsgc3RvcmFnZTogaWQgfTtcbiAgY29uc3QgcXVlcnkgPSBtYWtlUXVlcnkocGFyYW1zKTtcbiAgd2luZG93Lm9wZW4oYC4vZWRpdG9yLmh0bWw/JHtxdWVyeX1gLCAnX2JsYW5rJyk7XG59XG5cblxuLyoqXG4gKiBPcGVucyBlZGl0b3IgdGFiIGdpdmVuIGEgZG9jdW1lbnQgdGlsZSBlbGVtZW50XG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBcbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZW50cnk6IElGaWxlKSB7XG4gIGNvbnN0IGRvY3VtZW50VHlwZSA9IGVudHJ5Lm1ldGFkYXRhWydkb2N1bWVudCddO1xuICBpZiAodHlwZW9mIGRvY3VtZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaXNTYW1wbGUgPSBkb2N1bWVudFR5cGUgPT09ICdzYW1wbGUnO1xuICAgIG9wZW5FZGl0b3JUYWIoZW50cnkuaWQsIGlzU2FtcGxlKTtcbiAgfVxufVxuXG5cbi8qKlxuICogXG4gKiBAcGFyYW0gb2JqIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIG1ha2VRdWVyeShvYmopOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoa2V5ID0+IHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICB9KS5qb2luKCcmJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gc2VsZWN0KGluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRFbnRyaWVzKCkuYXQoaW5kZXgpO1xuICBzdGF0ZS5zZXRTZWxlY3Rpb24oaW5kZXgsIHRydWUpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZW50cnkuaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSBpbmRleCBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3QoaW5kZXg6IG51bWJlcikge1xuICBjb25zdCBpZCA9IHN0YXRlLmdldEVudHJpZXMoKS5hdChpbmRleCkuaWQ7XG4gIHN0YXRlLnNldFNlbGVjdGlvbihpbmRleCwgZmFsc2UpO1xuICBjb25zdCB0aWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB0aWxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG59XG5cblxuLyoqXG4gKiBcbiAqL1xuZnVuY3Rpb24gdW5zZWxlY3RBbGwoKSB7XG4gIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRvY3VtZW50LWVudHJ5LnNlbGVjdGVkJykpXG4gICAgLmZvckVhY2goKHRpbGUpID0+IHRpbGUuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gIHN0YXRlLnJlc2V0U2VsZWN0aW9uKCk7XG59XG5cbi8qKiBcbiAqIENyZWF0ZXMgYSBmb2xkZXIgb3IgZmlsZSB0aWxlIGVsZW1lbnQgZ2l2ZW4gYW4gZW50cnlcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnlcbiAqIEByZXR1cm5zIEhUTUxEaXZFbGVtZW50IHRpbGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBjcmVhdGVUaWxlKGVudHJ5OiBJRW50cnkpIHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1lbnRyeScpO1xuICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpOyAvLyBtYWtlIGZpbGUgb3IgZm9sZGVyIGRyYWdnYWJsZVxuXG4gIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgaWNvbi5jbGFzc0xpc3QuYWRkKCdkb2N1bWVudC1pY29uJyk7XG4gIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbmFtZS5pbm5lclRleHQgPSBlbnRyeS5uYW1lO1xuXG4gIHN3aXRjaCAoZW50cnkudHlwZSkge1xuICAgIGNhc2UgJ2ZvbGRlcic6XG4gICAgICAvLyBzZXQgdHlwZSBhdHRyaWIgYW5kIGlkXG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9sZGVyLWVudHJ5Jyk7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsIGVudHJ5LmlkKTtcbiAgICAgIC8vIHNldCBpY29uXG4gICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9mb2xkZXItaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndHJhc2gnOlxuICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2ZvbGRlci1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBlbnRyeS5pZCk7XG4gICAgICAvLyBzZXQgaWNvblxuICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvdHJhc2gtaWNvbi5zdmcnO1xuICAgICAgLy8gc2V0IGRyb3AgdGFyZ2V0IGF0dHJpYlxuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZHJvcC1pZCcsIGVudHJ5LmlkKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmlsZS1lbnRyeScpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCAoZW50cnkgYXMgSUZpbGUpLmlkKTtcblxuICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIGljb24gYW5kIGNsYXNzIHRvIGFkZCBkZXBlbmRpbmcgb24gZXhpc3RpbmcgbWV0YWRhdGFcbiAgICAgIGlmIChlbnRyeS5tZXRhZGF0YVsndHlwZSddID09PSAnbWFudXNjcmlwdCcpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFudXNjcmlwdC1lbnRyeScpO1xuICAgICAgICAvLyBzZXQgaWNvblxuICAgICAgICBpY29uLnNyYyA9ICcuL05lb24tZ2gvYXNzZXRzL2ltZy9tYW51c2NyaXB0LWljb24uc3ZnJztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVudHJ5Lm1ldGFkYXRhWyd0eXBlJ10gPT09ICdmb2xpbycpIHtcbiAgICAgICAgLy8gc2V0IHR5cGUgYXR0cmliIGFuZCBpZFxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9saW8tZW50cnknKTtcbiAgICAgICAgLy8gc2V0IGljb25cbiAgICAgICAgaWNvbi5zcmMgPSAnLi9OZW9uLWdoL2Fzc2V0cy9pbWcvZm9saW8taWNvbi5zdmcnO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIHNldCBpY29uIGZvciBubyB0eXBlXG4gICAgICAgIGljb24uc3JjID0gJy4vTmVvbi1naC9hc3NldHMvaW1nL2ZvbGlvLWljb24uc3ZnJztcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpY29uKTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5hbWUpO1xuXG4gIHJldHVybiBjb250YWluZXI7XG59XG5cbi8qKlxuICogQWRkcyBkYmxjbGljayBldmVudCBsaXN0ZW5lciB0byB0aWxlIGVsZW1lbnQgYW5kIGFkZHMgc2hpZnQgc2VsZWN0aW9uIGJlaGF2aW91clxuICogXG4gKiBAcGFyYW0gaW5kZXggYXMgZGlzcGxheWVkIG9uIGRhc2hib2FyZCB0byB1c2VyXG4gKiBAcGFyYW0gZW50cnkgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBjdXJyZW50IGZvbGRlclxuICogQHBhcmFtIHRpbGUgSFRNTERpdkVsZW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXg6IG51bWJlciwgZW50cnk6IElFbnRyeSwgdGlsZTogSFRNTERpdkVsZW1lbnQpIHtcbiAgLy8gZG91YmxlIGNsaWNrIGV2ZW50IGltbWVkaWF0ZWx5IG9wZW5zIGRvY3VtZW50XG4gIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGVudGVyRm9sZGVyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHVwZGF0ZURhc2hib2FyZChbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBlbnRyeSBhcyBJRm9sZGVyXSk7XG4gICAgfVxuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBlbnRlckZvbGRlciwgZmFsc2UpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBvcGVuRG9jc0hhbmRsZXIsIGZhbHNlKTtcbiAgfVxuICBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGUsIGluZGV4KTtcbiAgYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCk7XG59XG5cbi8qKlxuICogQWRkIHNoaWZ0IHNlbGVjdGlvbiBiZWhhdmlvdXIgdG8gaHRtbCB0aWxlIGVsZW1lbnRcbiAqIFxuICogV2hlbiBubyBrZXlzIGFyZSBwcmVzc2VkOiBlcmFzZSBhbnkgcHJldmlvdXMgc2VsZWN0aW9ucyBhbmQgc2VsZWN0IG9ubHkgY3VycmVudCB0aWxlXG4gKiBXaGVuIG1ldGEga2V5IGlzIHByZXNzZWQ6IGFkZCBjdXJyZW50IHRpbGUgdG8gc2VsZWN0aW9uIGlmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLCBlbHNlIHJlbW92ZSBmcm9tXG4gKiBzZWxlY3Rpb24uIFdoZW4gc2hpZnQga2V5IGlzIHByZXNzZWQ6IHNlbGVjdCBhbGwgdGlsZXMgYmV0d2VlbiBjdXJyZW50IHRpbGUgYW5kIHByZXZpb3VzIHRpbGVcbiAqIFxuICogV2hlbiB0aGVyZSBpcyBhIHByZXZpb3VzIHNlbGVjdGlvbiwgdGhlIHN0YXJ0IG9mIHRoZSBzaGlmdCBzZWxlY3Rpb24gaXMgdGhlIGxhc3Qgc2VsZWN0ZWQgdGlsZS4gXG4gKiBTaGlmdCBjbGlja2luZyBhZnRlciB3aWxsIGFkZCB0aGUgc2hpZnQgc2VsZWN0aW9uIHRvIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gKiBcbiAqIEBwYXJhbSB0aWxlIFxuICogQHBhcmFtIGluZGV4IFxuICovXG5mdW5jdGlvbiBhZGRTaGlmdFNlbGVjdGlvbkxpc3RlbmVyKHRpbGU6IEhUTUxEaXZFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihfZSkge1xuICAgIHNoaWZ0U2VsZWN0aW9uSGFuZGxlcihpbmRleCk7XG4gIH0sIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2hpZnRTZWxlY3Rpb25IYW5kbGVyKGluZGV4KSB7XG4gIGlmICghbWV0YUtleUlzUHJlc3NlZCAmJiAhc2hpZnRLZXlJc1ByZXNzZWQpIHtcbiAgICB1bnNlbGVjdEFsbCgpO1xuICAgIHNlbGVjdChpbmRleCk7XG4gICAgc2hpZnRTZWxlY3Rpb24uc2V0U3RhcnQoaW5kZXgpO1xuICB9XG4gIGVsc2UgaWYgKG1ldGFLZXlJc1ByZXNzZWQpIHtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0aW9uKClbaW5kZXhdKSB7XG4gICAgICB1bnNlbGVjdChpbmRleCk7XG4gICAgICBzaGlmdFNlbGVjdGlvbi5zZXRTdGFydChzdGF0ZS5nZXRTZWxlY3Rpb24oKS5sYXN0SW5kZXhPZih0cnVlKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0KGluZGV4KTtcbiAgICAgIHNoaWZ0U2VsZWN0aW9uLnNldFN0YXJ0KGluZGV4KTsgXG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKHNoaWZ0S2V5SXNQcmVzc2VkKSB7XG4gICAgc2hpZnRTZWxlY3Rpb24uZ2V0UHJldlNlbGVjdGlvbigpLmZvckVhY2goKGlkeCkgPT4ge1xuICAgICAgdW5zZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgICBzaGlmdFNlbGVjdGlvbi5zZXRFbmQoaW5kZXgpO1xuICAgIHNoaWZ0U2VsZWN0aW9uLmdldFNlbGVjdGlvbihzdGF0ZS5nZXRTZWxlY3Rpb24oKSkuZm9yRWFjaCgoaWR4KSA9PiB7XG4gICAgICBzZWxlY3QoaWR4KTtcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG4gIHVwZGF0ZUZTQnV0dG9ucygpO1xufVxuLyoqXG4gKiBPcGVucyBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkLlxuICogXG4gKiBJZiBhIGZvbGRlciBpcyBzZWxlY3RlZCwgb3BlbnMgZm9sZGVyLlxuICogSWYgYSBmaWxlKHMpIGlzIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBvcGVucyBmaWxlKHMpLlxuICovXG5mdW5jdGlvbiBvcGVuRG9jc0hhbmRsZXIoKSB7XG4gIGlmICghb3BlbkJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSByZXR1cm47XG5cbiAgLy8gT3BlbiBmb2xkZXIgaWYgb25seSBvbmUgZm9sZGVyIGlzIHNlbGVjdGVkXG4gIGlmIChzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGggPT09IDEgfHwgc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG5ld1BhdGggPSBbLi4uc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLCBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSBhcyBJRm9sZGVyXTtcbiAgICB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT3BlbiBhbGwgZmlsZXMsIGlnbm9yaW5nIGlmIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG4gIHN0YXRlLmdldFNlbGVjdGVkRmlsZXMoKS5mb3JFYWNoKChlbnRyeTogSUVudHJ5KSA9PiBvcGVuRmlsZShlbnRyeSBhcyBJRmlsZSkpO1xuICBzaGlmdFNlbGVjdGlvbi5yZXNldCgpO1xuICB1bnNlbGVjdEFsbCgpO1xuICB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCk7XG59XG5cbi8qKlxuICogTW92ZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBkb2N1bWVudHMgb24gZGFzaGJvYXJkIHRvIHRyYXNoLiBcbiAqIFxuICovXG5mdW5jdGlvbiByZW1vdmVEb2NzSGFuZGxlcigpIHtcbiAgaWYgKCFyZW1vdmVCdXR0b24uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuXG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICBcbiAgZm9yIChsZXQgZW50cnkgb2Ygc2VsZWN0ZWRFbnRyaWVzKSB7XG4gICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZW50cnksIHsgcmVtb3ZlZF9vbjogZGF0ZXRpbWUsIHJlY292ZXJfZm9sZGVyOiBzdGF0ZS5nZXRGb2xkZXJQYXRoTmFtZXMoKSB9KTtcbiAgfVxuXG4gIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgdHJhc2hGb2xkZXIpO1xufVxuXG5mdW5jdGlvbiBwdXRCYWNrRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpO1xuICBjb25zdCBwYXJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgXG4gIGZvciAobGV0IGVudHJ5IG9mIHNlbGVjdGVkRW50cmllcykge1xuICAgIGNvbnN0IGZvbGRlclBhdGhOYW1lcyA9IGVudHJ5Lm1ldGFkYXRhWydyZWNvdmVyX2ZvbGRlciddIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHRhcmdldEZvbGRlciA9IHN0YXRlLmdldEZvbGRlclBhdGhCeU5hbWVzKGZvbGRlclBhdGhOYW1lcyk7XG4gICAgaWYgKHRhcmdldEZvbGRlcikge1xuICAgICAgZW50cnkgPSBGaWxlU3lzdGVtVG9vbHMucmVtb3ZlTWV0YWRhdGEoZW50cnksIFsncmVtb3ZlZF9vbicsICdyZWNvdmVyX2ZvbGRlciddKTtcbiAgICAgIGNvbnN0IGRhdGVUaW1lUGF0dGVybiA9IC8gLSBcXGR7MSwyfVxcL1xcZHsxLDJ9XFwvXFxkezR9LCBcXGR7MSwyfTpcXGR7Mn06XFxkezJ9IFtBUE1hcG1dezJ9JC87XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlbmFtZSBlbmRzIHdpdGggdGhlIGRhdGUgdGltZSBwYXR0ZXJuXG4gICAgICBpZiAoZGF0ZVRpbWVQYXR0ZXJuLnRlc3QoZW50cnkubmFtZSkpIHtcbiAgICAgICAgZW50cnkubmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZShkYXRlVGltZVBhdHRlcm4sICcnKTtcbiAgICAgIH1cbiAgICAgIG1vdmVUb0ZvbGRlcihbZW50cnldLCBwYXJlbnRGb2xkZXIsIHRhcmdldEZvbGRlcik7XG4gICAgfSAgICBcbiAgfVxufVxuXG4vKipcbiAqIERlbGV0ZSBhIGZpbGVcbiAqIFxuICogQHBhcmFtIGZpbGUgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZpbGVFbnRyeShmaWxlOiBJRmlsZSwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGVsZXRlRG9jdW1lbnQoZmlsZS5pZClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLnJlbW92ZUVudHJ5KGZpbGUsIHBhcmVudEZvbGRlcik7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHJlamVjdChmYWxzZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBmb2xkZXIgYW5kIGl0cyBjb250ZW50XG4gKiBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZUZvbGRlckVudHJ5KGZvbGRlcjogSUZvbGRlciwgcGFyZW50Rm9sZGVyOiBJRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gZm9sZGVyLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShjaGlsZCBhcyBJRmlsZSwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoY2hpbGQgYXMgSUZvbGRlciwgZm9sZGVyKTsgLy8gUGFzcyB0aGUgY3VycmVudCBmb2xkZXIgYXMgdGhlIHBhcmVudFxuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7IC8vIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCByZXNvbHZpbmcgZm9yIHNhZmV0eVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5yZW1vdmVFbnRyeShmb2xkZXIsIHBhcmVudEZvbGRlcik7IC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyZW50IGZvbGRlclxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKGZhbHNlKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnRzIG9uIGRhc2hib2FyZC4gXG4gKiBcbiAqIElmIGEgZm9sZGVyIGlzIHNlbGVjdGVkLCBkZWxldGVzIGZvbGRlci5cbiAqIElmIGEgZmlsZShzKSBpcyBzZWxlY3RlZCwgZGVsZXRlcyBmaWxlKHMpLlxuICogSWYgYSBmb2xkZXIgYW5kIGZpbGUocykgYXJlIHNlbGVjdGVkLCBkZWxldGVzIGFsbC5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlRG9jc0hhbmRsZXIoKSB7XG4gIGNvbnN0IGFsbEVudHJpZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKTtcblxuICAvLyBDcmVhdGUgYSBmb3JtYXR0ZWQgbGlzdCBvZiBmaWxlbmFtZXMgdG8gZGlzcGxheSBpbiBhbGVydCBtZXNzYWdlXG4gIGNvbnN0IGNyZWF0ZUxpc3QgPSAoZW50cnlBcnJheTogSUVudHJ5W10pID0+IGVudHJ5QXJyYXkubWFwKGVudHJ5ID0+IGAtICR7ZW50cnkubmFtZX0gKCR7ZW50cnkudHlwZX0pYCkuam9pbignXFxuJyk7XG4gIFxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTpcXG4ke2NyZWF0ZUxpc3QoYWxsRW50cmllcyl9XFxuVGhpcyBhY3Rpb24gaXMgaXJyZXZlcnNpYmxlLmA7XG5cbiAgY29uc3QgaXNDb25maXJtZWQgPSB3aW5kb3cuY29uZmlybShhbGVydE1lc3NhZ2UpO1xuXG4gIGlmIChpc0NvbmZpcm1lZCkge1xuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gYWxsRW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRmlsZUVudHJ5KGVudHJ5IGFzIElGaWxlLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCggZXJyID0+IGNvbnNvbGUuZGVidWcoJ2ZhaWxlZCB0byBkZWxldGUgZmlsZXM6ICcsIGVycikpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZW1wdHlUcmFzaEhhbmRsZXIoKSB7XG4gIGNvbnN0IHRyYXNoRm9sZGVyID0gc3RhdGUuZ2V0VHJhc2hGb2xkZXIoKTtcblxuICBpZiAoIXRyYXNoRm9sZGVyKSB7XG4gICAgY29uc29sZS5lcnJvcignVHJhc2ggZm9sZGVyIG5vdCBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhbGVydE1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBhbGwgdGhlIGZpbGVzIGluIFRyYXNoIEZvbGRlcj9cXG5UaGlzIGFjdGlvbiBpcyBpcnJldmVyc2libGUuJztcblxuICBjb25zdCBpc0NvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKGFsZXJ0TWVzc2FnZSk7XG5cbiAgaWYgKGlzQ29uZmlybWVkKSB7XG5cbiAgICBjb25zdCBkZWxldGVQcm9taXNlcyA9IHRyYXNoRm9sZGVyLmNoaWxkcmVuLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICByZXR1cm4gZGVsZXRlRm9sZGVyRW50cnkoZW50cnkgYXMgSUZvbGRlciwgdHJhc2hGb2xkZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgLy8gU2hvdWxkbid0IGhhcHBlbiwgYnV0IHJlc29sdmluZyBmb3Igc2FmZXR5XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChkZWxldGVQcm9taXNlcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gQWZ0ZXIgZGVsZXRpbmcgYWxsIGNvbnRlbnQsIHVwZGF0ZSB0aGUgZGFzaGJvYXJkXG4gICAgICAgIHVwZGF0ZURhc2hib2FyZChzdGF0ZS5nZXRGb2xkZXJQYXRoKCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmRlYnVnKCdmYWlsZWQgdG8gZGVsZXRlIGZpbGVzOiAnLCBlcnIpKTtcbiAgfVxufVxuXG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmlzaWJpbGl0eSBvZiBhY3Rpb24gYmFyIGJ1dHRvbnMgYmFzZWQgb24gY3VycmVudCBzZWxlY3Rpb25zXG4gKiBcbiAqIE5vdGU6IGJldHRlciBub3QgdG8gY2hhbmdlIHRoZSBvcmRlclxuICovXG5mdW5jdGlvbiB1cGRhdGVBY3Rpb25CYXJCdXR0b25zKCkge1xuICAvLyBpbnNpZGUgLi9TYW1wbGVzwqBvciBzZWxlY3RpbmcgdGhlIHNhbXBsZXMgZm9sZGVyXG4gIGlmIChzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gICAgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdICYmIHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm1ldGFkYXRhWydpbW11dGFibGUnXSkpIHtcbiAgICB1cGxvYWREb2N1bWVudHNCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHJlbW92ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxuICAvLyBpbnNpZGUgLi9UcmFzaFxuICBlbHNlIGlmIChzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gc2VsZWN0aW5nIHRoZSB0cmFzaCBmb2xkZXJcbiAgZWxzZSBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH0gXG4gIC8vIHNlbGVjdGluZyBlbnRyaWVzXG4gIGVsc2UgaWYgKHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCkge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cbiAgLy8gbm90aGluZyBzZWxlY3RlZCwgbm90IGluIC4vU2FtcGxlcyBvciAuL1RyYXNoXG4gIGVsc2Uge1xuICAgIG9wZW5CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgcmVtb3ZlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHVwbG9hZERvY3VtZW50c0J1dHRvbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBuZXdGb2xkZXJCdXR0b24uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBuYXYgcGF0aCB3aXRoIGN1cnJlbnQgZm9sZGVyIHBhdGhcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTmF2UGF0aCgpOiB2b2lkIHtcbiAgbmF2UGF0aENvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAvLyBjcmVhdGUgbmF2IGVsZW1lbnRzIGFuZCBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IG5hdkVsZW1lbnRzID0gc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLm1hcCgoZm9sZGVyLCBpZHgpID0+IHtcbiAgICBjb25zdCBuYXZTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbmF2U2VjdGlvbi5jbGFzc0xpc3QuYWRkKCduYXYtcGF0aC1zZWN0aW9uJyk7XG4gICAgbmF2U2VjdGlvbi5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgaWR4ICsgMSk7XG4gICAgbmF2U2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IGF3YWl0IHVwZGF0ZURhc2hib2FyZCh0YXJnZXRQYXRoKSk7XG4gICAgLy8gYWRkIGRyb3AgdGFyZ2V0IHRvIG1vdmUgZHJhZ2dlZCBlbGVtZW50IHRvIHRoZSBwcm9zcGVjdGl2ZSBmb2xkZXJzXG4gICAgYWRkRHJvcFRhcmdldExpc3RlbmVycyhuYXZTZWN0aW9uLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSwgdGFyZ2V0UGF0aC5hdCgtMSkpO1xuXG4gICAgcmV0dXJuIG5hdlNlY3Rpb247XG4gIH0pO1xuXG4gIC8vIGFkZCBuYXYgZWxlbWVudHMgdG8gbmF2IHBhdGggY29udGFpbmVyXG4gIG5hdkVsZW1lbnRzLmZvckVhY2goKG5hdkVsZW1lbnQsIGlkeCkgPT4ge1xuICAgIG5hdlBhdGhDb250YWluZXIuYXBwZW5kQ2hpbGQobmF2RWxlbWVudCk7XG4gICAgaWYgKGlkeCAhPT0gbmF2RWxlbWVudHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3Qgc2VwZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZXBlcmF0b3IuY2xhc3NMaXN0LmFkZCgnbmF2LXBhdGgtc2VwZXJhdG9yJyk7XG4gICAgICBzZXBlcmF0b3IuaW5uZXJIVE1MID0gJyAvICc7XG4gICAgICBuYXZQYXRoQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlcGVyYXRvcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBiYWNrIGJ1dHRvbiB3aXRoIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5mdW5jdGlvbiB1cGRhdGVCYWNrQnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBiYWNrQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgYmFja0J1dHRvbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChidXR0b25DbG9uZSwgYmFja0J1dHRvbik7XG5cbiAgLy8gRGlzYWJsZSBiYWNrIGJ1dHRvbiBpZiBhdCByb290XG4gIGNvbnN0IGlzUm9vdCA9IHN0YXRlLmdldEZvbGRlclBhdGgoKS5sZW5ndGggPT09IDE7XG4gIGlmIChpc1Jvb3QpIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBidXR0b25DbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgYnV0dG9uQ2xvbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVOYXZpZ2F0ZUJhY2spO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2VudGVyJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJykpO1xuICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ29uZHJhZ2xlYXZlJywgKCkgPT4gYnV0dG9uQ2xvbmUuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnMoYnV0dG9uQ2xvbmUsIHN0YXRlLmdldFBhcmVudEZvbGRlcigpLCBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuYXQoLTIpKTtcbiAgfVxuICBiYWNrQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVtcHR5QnV0dG9uKCkge1xuICAvLyBFcmFzZSBwcmV2aW91cyBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgYnV0dG9uQ2xvbmUgPSBlbXB0eUJ1dHRvbi5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGVtcHR5QnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBlbXB0eUJ1dHRvbik7XG5cbiAgY29uc3QgcGFyZW50Rm9sZGVyID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG5cbiAgLy8gRGlzcGxheSBpZiBpbiB0cmFzaFxuICBpZiAocGFyZW50Rm9sZGVyLnR5cGUgPT09ICd0cmFzaCcgfHwgc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICAvLyBBY3RpdmF0ZSBidXR0b24gaWYgaGFzIGNvbnRlbnQgYW5kIG5vdCBzZWxlY3Rpbmcgd2hlbiBmaXJzdCBsZXZlbCBwYXJlbnQgaXMgdHJhc2hcbiAgICBpZiAocGFyZW50Rm9sZGVyLmNoaWxkcmVuLmxlbmd0aCAmJiAhc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoICYmIHBhcmVudEZvbGRlci50eXBlID09PSAndHJhc2gnKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW1wdHlUcmFzaEhhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGJ1dHRvbiBpZiBubyBjb250ZW50XG4gICAgZWxzZSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBidXR0b25DbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG4gIGVtcHR5QnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlbGV0ZUJ1dHRvbigpIHtcbiAgLy8gRXJhc2UgcHJldmlvdXMgZXZlbnQgbGlzdGVuZXJzXG4gIGNvbnN0IGJ1dHRvbkNsb25lID0gZGVsZXRlQnV0dG9uLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgZGVsZXRlQnV0dG9uLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1dHRvbkNsb25lLCBkZWxldGVCdXR0b24pO1xuXG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuICAvLyBEaXNwbGF5IGlmIGluIHRyYXNoXG4gIGlmIChwYXJlbnRGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyB8fCBzdGF0ZS5pc0luVHJhc2goKSkge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIC8vIEFkZCBsaXN0ZW5lciBpZiBzZWxlY3RzIGVudHJpZXNcbiAgICBpZiAoc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICBidXR0b25DbG9uZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGJ1dHRvbkNsb25lLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGJ1dHRvbkNsb25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVsZXRlRG9jc0hhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIGlmIG5vdGhpbmcgc2VsZWN0ZWRcbiAgICBlbHNlIHtcbiAgICAgIGJ1dHRvbkNsb25lLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgYnV0dG9uQ2xvbmUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGJ1dHRvbkNsb25lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbiAgZGVsZXRlQnV0dG9uID0gYnV0dG9uQ2xvbmU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZTQnV0dG9ucygpIHtcbiAgdXBkYXRlQmFja0J1dHRvbigpO1xuICB1cGRhdGVFbXB0eUJ1dHRvbigpO1xuICB1cGRhdGVEZWxldGVCdXR0b24oKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGNsaWNrIGV2ZW50IG9uIGJhY2sgYnV0dG9uIHRvIGdvIGJhY2sgb25lIGZvbGRlciBpZiBwb3NzaWJsZVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZUJhY2soKSB7XG4gIGNvbnN0IG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCkuc2xpY2UoMCwgLTEpO1xuICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aCk7XG59XG5cbi8qKlxuICogQWRkIG5ldyBGb2xkZXIgdG8gY3VycmVudCBmb2xkZXIgYW5kIHJlZnJlc2ggZGFzaGJvYXJkXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUFkZEZvbGRlcihmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgLy8gY3JlYXRlIG5ldyBmb2xkZXIgZWxlbWVudFxuICBjb25zdCBuZXdGb2xkZXJUaWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld0ZvbGRlclRpbGUuY2xhc3NMaXN0LmFkZCgnZG9jdW1lbnQtZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5jbGFzc0xpc3QuYWRkKCdmb2xkZXItZW50cnknKTtcbiAgbmV3Rm9sZGVyVGlsZS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ25ldy1mb2xkZXInKTtcblxuICBjb25zdCBuZXdGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRm9sZGVyKGZvbGRlck5hbWUpO1xuICBjb25zdCBzdWNjZWVkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobmV3Rm9sZGVyLCBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKSk7XG4gIGlmIChzdWNjZWVkZWQpIHtcbiAgICBuZXdGb2xkZXJUaWxlLnNldEF0dHJpYnV0ZSgnaWQnLCBmb2xkZXJOYW1lKTtcbiAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBuZXdGb2xkZXJUaWxlLnJlbW92ZSgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmFtZXMgY3VycmVudCBzZWxlY3Rpb24gb2YgZG9jdW1lbnQgb24gZGFzaGJvYXJkLCB1cGRhdGluZyB0aGUgZGF0YWJhc2UgZm9yIGZpbGVzXG4gKiBcbiAqIEBwYXJhbSBlbnRyeSBJRW50cnkgdG8gcmVuYW1lXG4gKi9cbmZ1bmN0aW9uIHJlbmFtZUVudHJ5KGVudHJ5OiBJRW50cnksIG5ld05hbWU6IHN0cmluZykgeyAgXG4gIGNvbnN0IHN1Y2NlZWRlZCA9IEZpbGVTeXN0ZW1Ub29scy5yZW5hbWVFbnRyeShlbnRyeSwgc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCksIG5ld05hbWUpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gVXBkYXRlIGRhdGFiYXNlIGlmIGVudHJ5IGlzIGEgZmlsZVxuICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBlbnRyeSBhcyBJRmlsZTtcbiAgICAgIHVwZGF0ZURvY05hbWUoZmlsZS5pZCwgbmV3TmFtZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZURhc2hib2FyZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEdpdmVuIGFuIGVudHJ5IGlkLCByZXR1cm5zIHRoZSBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IGZvbGRlclxuICogXG4gKiBAcGFyYW0gaWQgXG4gKiBAcmV0dXJucyBJRW50cnlcbiovXG5mdW5jdGlvbiBnZXRFbnRyeUJ5SWQoaWQ6IHN0cmluZyk6IElFbnRyeSB7XG4gIGNvbnN0IHRhcmdldEVudHJ5ID0gc3RhdGUuZ2V0RW50cmllcygpLmZpbmQoZW50cnkgPT4ge1xuICAgIHJldHVybiBlbnRyeS5pZCA9PT0gaWQ7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0RW50cnk7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgY2hhbmdlcyBpbiBmaWxlIHN5c3RlbSBpbiBkYXNoYm9hcmQgVUlcbiAqIFxuICogQHBhcmFtIG5ld1BhdGggSWYgcHJvdmlkZWQsIHVzZXMgdGhpcyBwYXRoIHRvIHVwZGF0ZSBkYXNoYm9hcmQuIE90aGVyd2lzZSwgdXNlcyBjdXJyZW50IHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEYXNoYm9hcmQobmV3UGF0aD86IElGb2xkZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW5ld1BhdGgpIG5ld1BhdGggPSBzdGF0ZS5nZXRGb2xkZXJQYXRoKCk7XG4gIHN0YXRlLnNldEZvbGRlclBhdGgobmV3UGF0aCk7XG4gIGNvbnN0IGN1cnJlbnRGb2xkZXIgPSBzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKTtcbiAgLy8gY2xlYXIgY29udGVudCBhbmQgc2VsZWN0aW9uXG4gIGRvY3VtZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgc2hpZnRTZWxlY3Rpb24ucmVzZXQoKTtcblxuICAvLyB1cGRhdGUgb3JkZXJlZCBpdGVtcyBmb3IgY3VycmVudCBmcy1jb250ZW50c1xuICBzdGF0ZS5zZXRFbnRyaWVzKGN1cnJlbnRGb2xkZXIuY2hpbGRyZW4pO1xuXG4gIC8vIHBvcHVsYXRlIGZvbGRlciBjb250ZW50c1xuICBjdXJyZW50Rm9sZGVyLmNoaWxkcmVuLmZvckVhY2goYXN5bmMgKGVudHJ5LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBjcmVhdGVUaWxlKGVudHJ5KTtcbiAgICBkb2N1bWVudHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGlsZSk7XG4gICAgYXdhaXQgYWRkVGlsZUV2ZW50TGlzdGVuZXIoaW5kZXgsIGVudHJ5LCB0aWxlKTtcbiAgfSk7IFxuXG4gIHVwZGF0ZUFjdGlvbkJhckJ1dHRvbnMoKTtcbiAgdXBkYXRlTmF2UGF0aCgpO1xuICB1cGRhdGVGU0J1dHRvbnMoKTtcblxuICBjb25zdCBpbmZvQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mby1iYWRnZScpO1xuICBpZiAoc3RhdGUuaXNJblRyYXNoKCkpIHtcbiAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSAnRmlsZXMgd2lsbCBiZSBkZWxldGVkIGFmdGVyIDMwIGRheXMnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyM5REIyQkYnO1xuICB9IGVsc2Uge1xuICAgIGluZm9CYWRnZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIGluZm9CYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7XG4gIH1cblxuICAvLyBhZGQgZHJhZyBhbmQgZHJvcCBsaXN0ZW5lcnMgZm9yIGN1cnJlbnQgZm9sZGVyIGNvbnRlbnRcbiAgY3VycmVudEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IHRpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbnRyeS5pZCk7XG4gICAgYWRkRHJhZ1N0YXJ0TGlzdGVuZXIodGlsZSk7XG5cbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicgfHwgZW50cnkudHlwZSA9PT0gJ3RyYXNoJykgeyBcbiAgICAgIGFkZERyb3BUYXJnZXRMaXN0ZW5lcnModGlsZSwgY3VycmVudEZvbGRlciwgZW50cnkgYXMgSUZvbGRlcik7XG4gICAgfVxuICB9KTtcbiAgXG4gIGZzbS5zZXRGaWxlU3lzdGVtKHN0YXRlLmdldEZvbGRlclBhdGgoKS5hdCgwKSk7XG59XG5cbmZ1bmN0aW9uIGFkZERyYWdTdGFydExpc3RlbmVyKGVsZW06IEVsZW1lbnQpIHtcbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICBjdXJyZW50RHJhZ1RhcmdldCA9IGUudGFyZ2V0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRHJvcFRhcmdldExpc3RlbmVycyhlbGVtOiBFbGVtZW50LCBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcjogSUZvbGRlcikge1xuICAvKipcbiAgICAgKiBUaGUgZHJhZ2VudGVyIGFuZCBkcmFnb3ZlciBldmVudHMgbmVlZCB0byBiZSBvdmVycmlkZW4gaW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBkcmFnLWFuZC1kcm9wIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogUmVhZCBtb3JlIGF0OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9EcmFnX29wZXJhdGlvbnNcbiAgICAgKi9cbiAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlbGVtLmNsYXNzTGlzdC5hZGQoJ2RyYWdlbnRlcicpO1xuICB9KTsgICAgXG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZW50ZXInKTtcbiAgfSk7XG4gIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBjcmVhdGVIYW5kbGVEcm9wKGN1cnJlbnRGb2xkZXIsIGRlc3RpbmF0aW9uRm9sZGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhhbmRsZURyb3AoY3VycmVudEZvbGRlcjogSUZvbGRlciwgZGVzdGluYXRpb25Gb2xkZXI6IElGb2xkZXIpIHtcbiAgcmV0dXJuIChlOiBFdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIGdldCB0aGUgSUQgb2YgdGhlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICAgIGNvbnN0IGRyYWdUYXJnZXRJRCA9ICg8SFRNTEVsZW1lbnQ+IGN1cnJlbnREcmFnVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAvLyBVc2luZyBkcmFnVGFyZ2V0SUQsIGZpbmQgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIEZpbGUgYmVpbmcgZHJvcHBlZC5cbiAgICBjb25zdCBkcmFnRW50cnkgPSBnZXRFbnRyeUJ5SWQoZHJhZ1RhcmdldElEKTtcblxuICAgIC8vIElmIGZvbGRlciwgZGVzdGluYXRpb24sIGFuZCBmaWxlIHdlcmUgZm91bmQsIG1vdmUgdGhlIGZpbGUgaW50byB0aGUgZm9sZGVyLiBHcmVhdCBzdWNjZXNzIVxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgZm9sZGVyIGlzIG5vdCBiZWluZyBkcm9wcGVkIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICAgIGlmIChkcmFnRW50cnkgJiYgZHJhZ0VudHJ5ICE9PSBkZXN0aW5hdGlvbkZvbGRlcikge1xuICAgICAgbW92ZVRvRm9sZGVyKFtkcmFnRW50cnldLCBjdXJyZW50Rm9sZGVyLCBkZXN0aW5hdGlvbkZvbGRlcik7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgdG8gbmV3Rm9sZGVyLCBhbmQgaWYgc28sIG1vdmVzIGl0IGFuZCByZWZyZXNoZXMgZGFzaGJvYXJkLlxuICogXG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50Rm9sZGVyIFxuICogQHBhcmFtIG5ld0ZvbGRlciBcbiAqL1xuZnVuY3Rpb24gbW92ZVRvRm9sZGVyKGVudHJpZXM6IElFbnRyeVtdLCBwYXJlbnRGb2xkZXI6IElGb2xkZXIsIG5ld0ZvbGRlcjogSUZvbGRlcikge1xuICBjb25zdCBlcnJvck1lc3NhZ2VzID0gW107XG4gIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAvLyBIYW5kbGUgbmFtZSBjb25mbGljdHMgZm9yIHRyYXNoIGZvbGRlclxuICAgIGlmIChuZXdGb2xkZXIudHlwZSA9PT0gJ3RyYXNoJyAmJiBuZXdGb2xkZXIuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKSkge1xuICAgICAgZW50cnkubmFtZSA9IHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gRmlsZVN5c3RlbVRvb2xzLmNhbk1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICAgIGlmICghcmVzcG9uc2Uuc3VjY2VlZGVkKSBlcnJvck1lc3NhZ2VzLnB1c2gocmVzcG9uc2UuZXJyb3IpO1xuICAgIGVsc2UgRmlsZVN5c3RlbVRvb2xzLm1vdmVFbnRyeShlbnRyeSwgcGFyZW50Rm9sZGVyLCBuZXdGb2xkZXIpO1xuICB9KTtcbiAgXG4gIGVycm9yTWVzc2FnZXMuZmlsdGVyKChtc2csIGlkeCwgYXJyKSA9PiBhcnIuaW5kZXhPZihtc2cpID09PSBpZHgpO1xuICBpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwKSB3aW5kb3cuYWxlcnQoZXJyb3JNZXNzYWdlcy5qb2luKCdcXG4nKSk7XG5cbiAgdXBkYXRlRGFzaGJvYXJkKCk7XG59XG5cbmZ1bmN0aW9uIHRyYXNoRk5Db25mbGljdEhhbmRsZXIoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGV0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuICByZXR1cm4gZmlsZW5hbWUgKyAnIC0gJyArIGRhdGV0aW1lO1xufVxuXG4vKipcbiAqIE9wZW5zIE1vdmUtVG8gbWVudSBtb2RhbCB3aW5kb3cgd2l0aCBVSSBmb3IgbW92aW5nIHNlbGVjdGVkIGVudHJpZXMgdG8gYSBuZXcgZm9sZGVyLlxuICovXG5mdW5jdGlvbiBvcGVuTW92ZVRvV2luZG93KCkge1xuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5NT1ZFX1RPKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRFbnRyaWVzID0gc3RhdGUuZ2V0U2VsZWN0ZWRFbnRyaWVzKCk7XG4gIGNvbnN0IHBhcmVudEZvbGRlciA9IHN0YXRlLmdldFBhcmVudEZvbGRlcigpO1xuXG4gIC8vIENhbGxiYWNrIGZvciB3aGVuIHVzZXIgZG91YmxlLWNsaWNrcyBvbiBhIGZvbGRlciBhbmQgbW92ZXMgc2VsZWN0aW9uXG4gIGNvbnN0IG1vdmVUb0NhbGxiYWNrID0gKG5ld1BhcmVudEZvbGRlcjogSUZvbGRlcikgPT4ge1xuICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIG1vdmVUb0ZvbGRlcihzZWxlY3RlZEVudHJpZXMsIHBhcmVudEZvbGRlciwgbmV3UGFyZW50Rm9sZGVyKTtcbiAgfTtcblxuICBjb25zdCByb290VHJlZSA9IGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2spO1xuICBjb25zdCB0cmVlQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRyZWVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndHJlZS1jb250YWluZXInKTtcbiAgdHJlZUNvbnRhaW5lci5hcHBlbmRDaGlsZChyb290VHJlZSk7XG5cbiAgY29uc3QgbW9kYWxDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1jb250YWluZXInKTtcbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwibW92ZS1tZW51LW1zZ1wiPkRvdWJsZS1jbGljayB0aGUgZm9sZGVyIHlvdSB3YW50IHRvIG1vdmUgeW91ciBpdGVtcyB0byE8L3NwYW4+JztcbiAgbW9kYWxDb250YWluZXIuYXBwZW5kQ2hpbGQodHJlZUNvbnRhaW5lcik7XG59XG5cbi8qKlxuICogT3BlbnMgTmV3IEZvbGRlciBtZW51IG1vZGFsIHdpbmRvdyB0aGF0IHByb21wdHMgZm9yIGEgbmFtZS5cbiAqIE9uIGNsaWNraW5nIHRoZSBDcmVhdGUgYnV0dG9uLCBjbG9zZXMgbW9kYWwgd2luZG93IGFuZCBjcmVhdGVzIG5ldyBmb2xkZXIuXG4gKi9cbmZ1bmN0aW9uIG9wZW5OZXdGb2xkZXJXaW5kb3coKSB7XG4gIGlmICghbmV3Rm9sZGVyQnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHJldHVybjtcblxuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZXcgTW9kYWxXaW5kb3coKTtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgXG4gIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hib2FyZF9pbnB1dF9jb250YWluZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbF9kYXNoYm9hcmQnKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25maXJtX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuXG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXQuaWQgPSAnZGFzaGJvYXJkX2lucHV0JztcbiAgaW5wdXQudHlwZSA9ICd0ZXh0JztcbiAgaW5wdXQucGxhY2Vob2xkZXIgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXQudmFsdWUgPSAnVW50aXRsZWQgRm9sZGVyJztcbiAgaW5wdXRDb250YWluZXIuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuXG4gIGlucHV0LnNlbGVjdCgpO1xuICBpbnB1dC5mb2N1cygpO1xuXG4gIGNhbmNlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpKTtcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3csIGlucHV0LnZhbHVlKSk7XG5cbiAgaW5wdXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uZmlybU5ld0ZvbGRlckFjdGlvbihtb2RhbFdpbmRvdywgaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpcm1OZXdGb2xkZXJBY3Rpb24obW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LCBmb2xkZXJOYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFuYW1lRXhpc3RzKGZvbGRlck5hbWUpKSB7XG4gICAgbW9kYWxXaW5kb3cuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgaGFuZGxlQWRkRm9sZGVyKGZvbGRlck5hbWUpO1xuICB9IFxuICBlbHNlIHtcbiAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmb2xkZXIgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgb3Blbk5ld0ZvbGRlcldpbmRvdygpO1xuICB9XG59XG5cbi8qKlxuICogT3BlbnMgUmVuYW1lIG1lbnUgbW9kYWwgd2luZG93IHRoYXQgcHJvbXB0cyBmb3IgYSBuZXcgbmFtZS5cbiAqL1xuZnVuY3Rpb24gb3BlblJlbmFtZVdpbmRvdygpIHtcbiAgLy8gZ2VuZXJhdGUgbW9kYWwgd2luZG93XG4gIGNvbnN0IG1vZGFsV2luZG93ID0gbmV3IE1vZGFsV2luZG93KCk7XG4gIG1vZGFsV2luZG93LnNldE1vZGFsV2luZG93VmlldyhNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG5cbiAgY29uc3QgaW5wdXRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkX2lucHV0X2NvbnRhaW5lcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICBjb25zdCBjYW5jZWxCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FuY2VsX2Rhc2hib2FyZCcpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICBjb25zdCBjb25maXJtQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1fZGFzaGJvYXJkJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cbiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICBpbnB1dC5pZCA9ICdkYXNoYm9hcmRfaW5wdXQnO1xuICBpbnB1dC50eXBlID0gJ3RleHQnO1xuICBjb25zdCBwcmV2TmFtZSA9IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpWzBdLm5hbWU7XG4gIGlucHV0LnBsYWNlaG9sZGVyID0gcHJldk5hbWU7XG4gIGlucHV0LnZhbHVlID0gcHJldk5hbWU7XG4gIGlucHV0Q29udGFpbmVyLmFwcGVuZENoaWxkKGlucHV0KTtcblxuICBpbnB1dC5zZWxlY3QoKTtcbiAgaW5wdXQuZm9jdXMoKTtcblxuICBjYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKSk7XG4gIGNvbmZpcm1CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpKTtcblxuICBpbnB1dENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBjb25maXJtUmVuYW1lQWN0aW9uKG1vZGFsV2luZG93LCBpbnB1dC52YWx1ZSwgcHJldk5hbWUpO1xuICAgIH1cbiAgfSk7XG4gIFxufVxuXG4vLyBPbiBjb25maXJtYXRpb24sIGNsb3NlIG1vZGFsIHdpbmRvdyBhbmQgcmVuYW1lIGVudHJ5IChpZiBmaWxlLCBkYXRhYmFzZSBpcyB1cGRhdGVkKVxuZnVuY3Rpb24gY29uZmlybVJlbmFtZUFjdGlvbihtb2RhbFdpbmRvdzogTW9kYWxXaW5kb3csIG5ld05hbWU6IHN0cmluZywgcHJldk5hbWU6IHN0cmluZykge1xuICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCBuYW1lc1xuICBpZiAobmV3TmFtZSA9PT0gcHJldk5hbWUpIHtcbiAgICBtb2RhbFdpbmRvdy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoIW5hbWVFeGlzdHMobmV3TmFtZSkpIHtcbiAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgY29uc3QgZW50cnkgPSBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXTtcbiAgICAgIHJlbmFtZUVudHJ5KGVudHJ5LCBuZXdOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB3aW5kb3cuYWxlcnQoJ1RoZSBmaWxlbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBmb2xkZXIhJyk7XG4gICAgICBvcGVuUmVuYW1lV2luZG93KCk7XG4gICAgfVxuICB9ICBcbn1cblxuZnVuY3Rpb24gbmFtZUV4aXN0cyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50ID0gc3RhdGUuZ2V0UGFyZW50Rm9sZGVyKCk7XG4gIHJldHVybiBwYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZm9sZGVyIHRyZWUgc3RydWN0dXJlIGZvciBtb3ZlLXRvIG1lbnVcbiAqIFxuICogQHBhcmFtIGZvbGRlciBJRm9sZGVyIHRvIGdlbmVyYXRlIHRyZWUgc3RydWN0dXJlIGZvciBhbmQgYWxsIGl0cyBzdWJmb2xkZXJzXG4gKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gdXNlciBkb3VibGUtY2xpY2tzIG9uIGEgZm9sZGVyIGFuZCBtb3ZlcyBzZWxlY3Rpb25cbiAqIEBwYXJhbSBkZWdyZWUgVGhlIGxldmVsIG9mIHN1YmZvbGRlcnMgZGVlcFxuICogQHJldHVybnMgTGlzdCBpdGVtIG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVGb2xkZXJUcmVlKGZvbGRlcjogSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQsIGRlZ3JlZTogbnVtYmVyKTogSFRNTExJRWxlbWVudCB7XG5cbiAgY29uc3QgdHJlZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gIC8vIGNvbnRhaW5lciBmb3IgZm9sZGVyIG5hbWUgYW5kIGFycm93XG4gIGNvbnN0IGxpQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGxpQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3RyZWUtbGktY29udGFpbmVyJyk7XG5cbiAgLy8gRm9sZGVyIFRFWFQ6IGNsaWNrIHRvIHNlbGVjdCAoZm9yIFVYKSwgZG91YmxlIGNsaWNrIHRvIG1vdmUgaXRlbXMgdG8gZm9sZGVyXG4gIGNvbnN0IGZvbGRlck5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCd0cmVlLW5hbWUnKTtcbiAgZm9sZGVyTmFtZS5pbm5lckhUTUwgPSBmb2xkZXIubmFtZTtcblxuICAvLyBPbiBzaW5nbGUgY2xpY2ssIGhpZ2hsaWdodC9zZWxlY3QgZm9sZGVyIG5hbWVcbiAgZm9sZGVyTmFtZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHJlZS1uYW1lJykuZm9yRWFjaChlbGVtID0+IGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7XG4gICAgZm9sZGVyTmFtZS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICB9KTtcblxuICAvLyBPbiBkb3VibGUgY2xpY2ssIG1vdmUgc2VsZWN0ZWQgaXRlbXMgdG8gZm9sZGVyXG4gIGZvbGRlck5hbWUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XG4gICAgbW92ZVRvQ2FsbGJhY2soZm9sZGVyKTtcbiAgfSk7XG5cbiAgLy8gSWYgRm9sZGVyIGhhcyBubyBzdWJmb2xkZXJzLCByZXR1cm4gd2l0aG91dCBuZXN0ZWQgdWxcbiAgY29uc3QgaXNMZWFmID0gZm9sZGVyLmNoaWxkcmVuLmV2ZXJ5KGVudHJ5ID0+IGVudHJ5LnR5cGUgIT09ICdmb2xkZXInKTtcbiAgaWYgKGlzTGVhZikge1xuICAgIHRyZWUuYXBwZW5kQ2hpbGQobGlDb250YWluZXIpO1xuICAgIGxpQ29udGFpbmVyLmFwcGVuZENoaWxkKGZvbGRlck5hbWUpO1xuICAgIHJldHVybiB0cmVlO1xuICB9XG4gIC8vIE90aGVyd2lzZSBGb2xkZXIgaXMgbm90IGVtcHR5LCBtYWtlIHRyZWUgc3RydWN0dXJlXG5cbiAgLy8gVW5vcmRlcmVkIExJU1QgKGhpZGluZyBvciB1bmhpZGluZyBsaSlcbiAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuXG4gIC8vIEFSUk9XXG4gIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFycm93LmNsYXNzTGlzdC5hZGQoJ3RyZWUtYXJyb3cnKTtcbiAgYXJyb3cuaW5uZXJIVE1MID0gJ+KWtic7XG5cbiAgLy8gaWYgbW9yZSB0aGFuIC4uLiBzdWJmb2xkZXJzIGRvd24sIGhpZGUgYnkgZGVmYXVsdFxuICBpZiAoZGVncmVlIDwgMikgdWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGlmIChkZWdyZWUgPCAyKSBhcnJvdy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgXG4gIGFycm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGFycm93LmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICAgIHVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuICB9KTtcblxuICB0cmVlLmFwcGVuZENoaWxkKGxpQ29udGFpbmVyKTtcbiAgbGlDb250YWluZXIuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICBsaUNvbnRhaW5lci5hcHBlbmRDaGlsZChmb2xkZXJOYW1lKTtcbiAgdHJlZS5hcHBlbmRDaGlsZCh1bCk7XG5cbiAgLy8gQXBwZW5kIGZvbGRlciBjb250ZW50c1xuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgIGNvbnN0IGZvbGRlclRyZWUgPSBnZW5lcmF0ZUZvbGRlclRyZWUoZW50cnkgYXMgSUZvbGRlciwgbW92ZVRvQ2FsbGJhY2ssIGRlZ3JlZSArIDEpO1xuICAgICAgdWwuYXBwZW5kQ2hpbGQoZm9sZGVyVHJlZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGVudGlyZSBmaWxlIHN5c3RlbSBmb2xkZXIgdHJlZSBmb3IgbW92ZS10byBtZW51XG4gKiBcbiAqIEBwYXJhbSBtb3ZlVG9DYWxsYmFjayBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB1c2VyIGRvdWJsZS1jbGlja3Mgb24gYSBmb2xkZXIgYW5kIG1vdmVzIHNlbGVjdGlvblxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUm9vdFRyZWUobW92ZVRvQ2FsbGJhY2s6IChuZXdQYXJlbnRGb2xkZXIgOklGb2xkZXIpID0+IHZvaWQpOiBIVE1MVUxpc3RFbGVtZW50IHtcbiAgY29uc3Qgcm9vdFRyZWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICByb290VHJlZS5pZCA9ICd0cmVlLXJvb3QnO1xuICByb290VHJlZS5hcHBlbmRDaGlsZChnZW5lcmF0ZUZvbGRlclRyZWUoc3RhdGUucm9vdCgpLCBtb3ZlVG9DYWxsYmFjaywgMCkpO1xuICByZXR1cm4gcm9vdFRyZWU7XG59XG5cbi8qKlxuICogRGlzcGxheXMgZGFzaGJvYXJkIGNvbnRleHQgbWVudSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IFxuICogXG4gKiBAcGFyYW0gdmlldyBjb250ZXh0IG1lbnUgdmlldyAoZGV0ZXJtaW5lcyBjb250ZW50IG9mIGNvbnRleHQgbWVudSlcbiAqL1xuZnVuY3Rpb24gc2hvd0NvbnRleHRNZW51KHZpZXc6IHN0cmluZywgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpIHtcblxuICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAvLyBDb250ZXh0IG1lbnUgb3B0aW9ucyB3aGVuIGZpbGVzL2ZvbGRlcnMgYXJlIHJpZ2h0LWNsaWNrZWRcbiAgICBjYXNlICdzZWxlY3Rpb24tb3B0aW9ucyc6XG5cbiAgICAgIC8vIE5lZWQgdG8gZGV0ZXJtaW5lIHNlbGVjdGlvbiBjYXRlZ29yeSBiZWZvcmUgZGlzcGxheWluZyBvcHRpb25zXG4gICAgICBjb25zdCBudW1iZXJPZlNlbGVjdGVkRmlsZXMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZpbGVzKCkubGVuZ3RoO1xuICAgICAgY29uc3QgbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgPSBzdGF0ZS5nZXRTZWxlY3RlZEZvbGRlcnMoKS5sZW5ndGg7XG4gICAgICBjb25zdCBzZWxlY3RlZFRyYXNoID0gc3RhdGUuZ2V0U2VsZWN0ZWRUcmFzaCgpLmxlbmd0aDtcblxuICAgICAgLyoqXG4gICAgICAgKiBDb250ZXh0IG1lbnUgb3B0aW9ucyBjb25kaXRpb25zOlxuICAgICAgICogICAgMSkgMSBmaWxlIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDIpIDIrIGZpbGVzIC0+IG9wZW4sIG1vdmUgdG8gdHJhc2gsIG1vdmVcbiAgICAgICAqICAgIDMpIGZpbGUocykgKyBmb2xkZXIocykgLT4gbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNCkgMSBmb2xkZXIgLT4gb3BlbiwgbW92ZSB0byB0cmFzaCwgbW92ZVxuICAgICAgICogICAgNSkgMisgZm9sZGVycyAtPiBtb3ZlIHRvIHRyYXNoLCBtb3ZlXG4gICAgICAgKiAgICA2KSB0cmFzaCAtPiBlbXB0eSB0cmFzaFxuICAgICAgICogICAgNykgZW50cnkgaW4gdHJhc2ggLT4gcHV0IGJhY2ssIGRlbGV0ZVxuICAgICAgICovXG5cblxuICAgICAgLy8gdHJhc2hcbiAgICAgIGlmICghbnVtYmVyT2ZTZWxlY3RlZEZpbGVzICYmICFudW1iZXJPZlNlbGVjdGVkRm9sZGVycyAmJiBzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LnRyYXNoRm9sZGVyT3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmxlbmd0aCA+IDEgJiYgc3RhdGUuZ2V0Rm9sZGVyUGF0aCgpLmF0KDEpLm5hbWUgPT0gJ1RyYXNoJykge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC50cmFzaEVudHJ5T3B0aW9ucztcbiAgICAgICAgc2V0Q29udGV4dE1lbnVJdGVtc0V2ZW50TGlzdGVuZXJzKCd0cmFzaC1lbnRyeS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZpbGVcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA9PT0gMSAmJiAhbnVtYmVyT2ZTZWxlY3RlZEZvbGRlcnMgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQuc2luZ2xlRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnc2luZ2xlLWZpbGUtb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZmlsZXNcbiAgICAgIGVsc2UgaWYgKG51bWJlck9mU2VsZWN0ZWRGaWxlcyA+IDEgJiYgIW51bWJlck9mU2VsZWN0ZWRGb2xkZXJzICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50Lm11bHRpRmlsZU9wdGlvbnM7XG4gICAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnbXVsdGktZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyBmaWxlKHMpICsgZm9sZGVyKHMpXG4gICAgICBlbHNlIGlmIChudW1iZXJPZlNlbGVjdGVkRmlsZXMgPj0gMSAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+PSAxICYmICFzZWxlY3RlZFRyYXNoKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudFdyYXBwZXIuaW5uZXJIVE1MID0gY29udGV4dE1lbnVDb250ZW50LmZvbGRlckFuZEZpbGVPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ2ZvbGRlci1hbmQtZmlsZS1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyAxIGZvbGRlclxuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA9PT0gMSAmJiAhc2VsZWN0ZWRUcmFzaCkge1xuICAgICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5zaW5nbGVGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ3NpbmdsZS1mb2xkZXItb3B0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gMisgZm9sZGVyc1xuICAgICAgZWxzZSBpZiAoIW51bWJlck9mU2VsZWN0ZWRGaWxlcyAmJiBudW1iZXJPZlNlbGVjdGVkRm9sZGVycyA+IDEgJiYgIXNlbGVjdGVkVHJhc2gpIHtcbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50V3JhcHBlci5pbm5lckhUTUwgPSBjb250ZXh0TWVudUNvbnRlbnQubXVsdGlGb2xkZXJPcHRpb25zO1xuICAgICAgICBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnMoJ211bHRpLWZvbGRlci1vcHRpb25zJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIC8vIERlZmF1bHQgY29udGV4dCBtZW51IChyaWdoLWNsaWNraW5nIG9uIGRhc2hib2FyZCBiYWNrZ3JvdW5kKVxuICAgIGRlZmF1bHQ6XG4gICAgICBjb250ZXh0TWVudUNvbnRlbnRXcmFwcGVyLmlubmVySFRNTCA9IGNvbnRleHRNZW51Q29udGVudC5kZWZhdWx0T3B0aW9ucztcbiAgICAgIHNldENvbnRleHRNZW51SXRlbXNFdmVudExpc3RlbmVycygnZGVmYXVsdCcpO1xuICB9XG5cbiAgLy8gZGlzYWJsZSBlZGl0b3IgbWVudSBmb3IgdGhlIHNhbXBsZXMgZm9sZGVyIGFuZCB0cmFzaFxuICBpZihzdGF0ZS5nZXRQYXJlbnRGb2xkZXIoKS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10gfHwgXG4gIChzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXSAmJiBzdGF0ZS5nZXRTZWxlY3RlZEVudHJpZXMoKVswXS5tZXRhZGF0YVsnaW1tdXRhYmxlJ10pIHx8XG4gIHN0YXRlLmlzSW5UcmFzaCgpKSB7XG4gICAgY29uc3QgZGVsZXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NtLXJlbW92ZS1idG4nKTtcbiAgICBjb25zdCByZW5hbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tcmVuYW1lLWJ0bicpO1xuICAgIGNvbnN0IG1vdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbW92ZS1idG4nKTtcbiAgICBjb25zdCB1cGRhdGVEb2NCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tdXBsb2FkLWRvYy1idG4nKTtcbiAgICBjb25zdCBuZXdGb2xkZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20tbmV3LWZvbGRlci1idG4nKTtcblxuICAgIGlmIChkZWxldGVCdG4pIHtcbiAgICAgIGRlbGV0ZUJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgICBpZiAocmVuYW1lQnRuKSB7XG4gICAgICByZW5hbWVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKG1vdmVCdG4pIHtcbiAgICAgIG1vdmVCdG4uY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZURvY0J0bikge1xuICAgICAgdXBkYXRlRG9jQnRuLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICAgIGlmIChuZXdGb2xkZXJCdG4pIHtcbiAgICAgIG5ld0ZvbGRlckJ0bi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHVzZXIncyBtb3VzZVxuICBjb250ZXh0TWVudS5zdHlsZS5sZWZ0ID0gYCR7Y2xpZW50WH1weGA7XG4gIGNvbnRleHRNZW51LnN0eWxlLnRvcCA9IGAke2NsaWVudFl9cHhgO1xuXG4gIC8vIGRpc3BsYXkgY29udGV4dCBtZW51XG4gIGNvbnRleHRNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xufVxuXG5cbi8qKlxuICogU2V0IGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG1lbnUgaXRlbXMgaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQgbWVudS5cbiAqIFxuICogQHBhcmFtIHZpZXcgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgbWVudSB2aWV3IHRoYXQgaXMgYmVpbmcgZGlzcGxheWVkLlxuICovXG5mdW5jdGlvbiBzZXRDb250ZXh0TWVudUl0ZW1zRXZlbnRMaXN0ZW5lcnModmlldzogc3RyaW5nKSB7XG4gIC8vIEFsbCB0aGUgYnV0dG9ucyB0aGF0IHdpbGwgaGF2ZSBldmVudHMgYXR0YWNoZWQgdG8gdGhlbSBoYXZlIHRoZSBzYW1lIGNsYXNzbmFtZS5cbiAgY29uc3QgYnRuQ2xhc3NuYW1lID0gJ2NvbnRleHQtbWVudS1pdGVtLXdyYXBwZXInO1xuXG4gIHN3aXRjaCAodmlldykge1xuXG4gICAgY2FzZSAnc2luZ2xlLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpOyAgIFxuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ211bHRpLWZpbGUtb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9sZGVyLWFuZC1maWxlLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3NpbmdsZS1mb2xkZXItb3B0aW9ucyc6XG4gICAgICAvLyBcIk9wZW5cIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tb3Blbi1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3BlbkRvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIlJlbmFtZVwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1yZW5hbWUtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5SZW5hbWVXaW5kb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7ICAgICAgXG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbXVsdGktZm9sZGVyLW9wdGlvbnMnOlxuICAgICAgLy8gXCJNb3ZlIHRvIFRyYXNoXCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXJlbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcmVtb3ZlRG9jc0hhbmRsZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBcIk1vdmVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tbW92ZS1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgb3Blbk1vdmVUb1dpbmRvdygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3RyYXNoLWZvbGRlci1vcHRpb25zJzpcbiAgICAgIC8vIFwiRW1wdHkgVHJhc2hcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZW1wdHktdHJhc2gtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIGVtcHR5VHJhc2hIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0cmFzaC1lbnRyeS1vcHRpb25zJzpcbiAgICAgIC8vIFwiUHV0IEJhY2tcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tcmVjb3Zlci1idG5gKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgcHV0QmFja0RvY3NIYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gXCJEZWxldGVcIiBtZW51IGl0ZW1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2J0bkNsYXNzbmFtZX0jY20tZGVsZXRlLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBkZWxldGVEb2NzSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFwiVXBsb2FkIGRvY3VtZW50XCIgbWVudSBpdGVtXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtidG5DbGFzc25hbWV9I2NtLXVwbG9hZC1kb2MtYnRuYCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoX2UpID0+IHtcbiAgICAgICAgY29udGV4dE1lbnUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIG9wZW5VcGxvYWRBcmVhSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFwiTmV3IGZvbGRlclwiIG1lbnUgaXRlbVxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7YnRuQ2xhc3NuYW1lfSNjbS1uZXctZm9sZGVyLWJ0bmApLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKF9lKSA9PiB7XG4gICAgICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBvcGVuTmV3Rm9sZGVyV2luZG93KCk7XG4gICAgICB9KTtcblxuICB9XG5cbn1cblxuXG4vKipcbiAqIEluaXRpYWxpemUgZGFzaGJvYXJkIGNvbnRleHQgbWVudSAocmlnaHQgY2xpY2sgbWVudSkuXG4gKiBUaGlzIHdpbGwgc2V0IHVwIGFsbCBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFzIHdlbGwgYXNcbiAqIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbnRleHQgbWVudSwgd2hpY2hcbiAqIG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSB1c2VyIHJpZ2h0LWNsaWNrcyAoZmlsZSwgZmlsZXMsIGZvbGRlciwgYmFja2dyb3VuZCwgZXRjLilcbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZURlZmF1bHRDb250ZXh0TWVudSgpIHtcblxuICAvLyByaWdodC1jbGljayBvbiBkYXNoYm9hcmQgYmFja2dyb3VuZFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1zZWN0aW9uJykuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIHVuc2VsZWN0QWxsKCk7XG5cbiAgICBzaG93Q29udGV4dE1lbnUoXG4gICAgICAnZGVmYXVsdCcsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRYLCBcbiAgICAgICg8TW91c2VFdmVudD4gZSkuY2xpZW50WVxuICAgICk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLXNlY3Rpb24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChfZSkgPT4ge1xuICAgIGNvbnRleHRNZW51LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZCBsaXN0ZW5lcnMgZm9yIHNwZWNpZmljIGNvbnRleHQgbWVudXMuXG4gKiBTcGVjaWZpYyBjb250ZXh0IG1lbnVzIGFwcGVhciB3aGVuIHVzZXIgcmlnaHQtY2xpY2tzIG9uIHNlbGVjdGVkIGZpbGVzL2ZvbGRlcnMuXG4gKiBUaGUgYWN0dWFsIG1lbnUgdGhhdCBpcyBzaG93biBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHNlbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWRkU3BlY2lmaWNDb250ZXh0TWVudUxpc3RlbmVycyh0aWxlLCBpbmRleCkge1xuXG4gIC8vIHJpZ2h0LWNsaWNrIG9uIGZvbGRlciBpdGVtIChmaWxlIG9yIGZvbGRlcilcbiAgdGlsZS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAocmlnaHRDbGlja2VkIHx8IHN0YXRlLmdldFNlbGVjdGVkRW50cmllcygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdW5zZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICAvLyBzZWxlY3RcbiAgICBzZWxlY3QoaW5kZXgpO1xuXG4gICAgc2hvd0NvbnRleHRNZW51KFxuICAgICAgJ3NlbGVjdGlvbi1vcHRpb25zJywgXG4gICAgICAoPE1vdXNlRXZlbnQ+IGUpLmNsaWVudFgsIFxuICAgICAgKDxNb3VzZUV2ZW50PiBlKS5jbGllbnRZXG4gICAgKTtcbiAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICByaWdodENsaWNrZWQgPSB0cnVlO1xuICB9KTtcbiAgICBcbiAgLy8gaGlkZSBjb250ZXh0IG1lbnUgaWYgdXNlciBjbGlja3MgYXdheVxuICBtYWluU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKHJpZ2h0Q2xpY2tlZCkge1xuICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb250ZXh0TWVudS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHJpZ2h0Q2xpY2tlZCA9IGZhbHNlO1xuICAgICAgaWYgKCFjbGlja2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RvY3VtZW50LWVudHJ5JykpIHtcbiAgICAgICAgLy8gaWYgY2xpY2tzIG9uIGJsYW5rIFxuICAgICAgICB1bnNlbGVjdEFsbCgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIGlmIGNsaWNrcyBvbiBhIGZpbGUvZm9sZGVyLCBzZWxlY3QgaXRcbiAgICAgICAgY29uc3QgY2xpY2tlZEVudHJ5ID0gZ2V0RW50cnlCeUlkKGNsaWNrZWRFbGVtZW50LmlkKTtcbiAgICAgICAgc2hpZnRTZWxlY3Rpb25IYW5kbGVyKHN0YXRlLmdldEluZGV4QnlFbnRyeU5hbWUoY2xpY2tlZEVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgVHJhc2ggZm9sZGVyIGJ5IGRlbGV0aW5nIGVudHJpZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgMzAgZGF5cyBhZ29cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVHJhc2gocm9vdDogSUZvbGRlcik6IHZvaWQge1xuICBpZiAoIXN0YXRlLmdldFRyYXNoRm9sZGVyKCkpIHtcbiAgICBmc20ubmV3VHJhc2gocm9vdCk7XG4gIH1cbiAgY29uc3QgdHJhc2hGb2xkZXIgPSBzdGF0ZS5nZXRUcmFzaEZvbGRlcigpO1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHRoaXJ0eURheXNBZ28gPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDApOyAvLyAzMCBkYXlzIGluIG1pbGxpc2Vjb25kc1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhbiBlbnRyeSB3YXMgZGVsZXRlZCAzMCBkYXlzIGFnb1xuICBjb25zdCB0b0RlbGV0ZSA9IChlbnRyeTogSUVudHJ5KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKGVudHJ5Lm1ldGFkYXRhICYmIGVudHJ5Lm1ldGFkYXRhWydyZW1vdmVkX29uJ10pIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShlbnRyeS5tZXRhZGF0YVsncmVtb3ZlZF9vbiddIGFzIHN0cmluZyk7XG4gICAgICByZXR1cm4gZGF0ZSA8PSB0aGlydHlEYXlzQWdvO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnRyaWVzIGluIHRoZSBUcmFzaFxuICB0cmFzaEZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGlmICh0b0RlbGV0ZShlbnRyeSkpIHtcbiAgICAgIC8vIERlbGV0ZSBlbnRyeSBpZiBkZWxldGVkIDMwIGRheXMgYWdvXG4gICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgIGRlbGV0ZUZpbGVFbnRyeShlbnRyeSBhcyBJRmlsZSwgdHJhc2hGb2xkZXIpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZm9sZGVyJykge1xuICAgICAgICBkZWxldGVGb2xkZXJFbnRyeShlbnRyeSBhcyBJRm9sZGVyLCB0cmFzaEZvbGRlcik7IFxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTG9hZHMgcm9vdCBmb2xkZXIgaW50byBkYXNoYm9hcmQgb24gc3RhcnR1cC4gXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRGFzaGJvYXJkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb290ID0gYXdhaXQgZnNtLmdldFJvb3QoKTtcbiAgc3RhdGUucm9vdChyb290KTtcbiAgdXBkYXRlVHJhc2gocm9vdCk7XG4gIHVwZGF0ZURhc2hib2FyZChbcm9vdF0pO1xuICBpbml0aWFsaXplRGVmYXVsdENvbnRleHRNZW51KCk7XG59OyIsImltcG9ydCB7IGxvYWREYXNoYm9hcmQgfSBmcm9tICcuLi8uLi9zcmMvRGFzaGJvYXJkL0Rhc2hib2FyZCc7XG5cbmxvYWREYXNoYm9hcmQoKTtcbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNob21lLWxpbmsnKT8uc2V0QXR0cmlidXRlKCdocmVmJywgX19MSU5LX0xPQ0FUSU9OX18pOyIsImV4cG9ydCBlbnVtIEVudHJ5VHlwZSB7XG4gIEZvbGRlciA9ICdmb2xkZXInLFxuICBUcmFzaCA9ICd0cmFzaCcsXG4gIEZpbGUgPSAnZmlsZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW50cnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEVudHJ5VHlwZTtcbiAgaWQ6IHN0cmluZztcbiAgY2hpbGRyZW46IElFbnRyeVtdO1xuICBtZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvbGRlciBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5Gb2xkZXIgfCBFbnRyeVR5cGUuVHJhc2g7XG4gIGlkOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBJRW50cnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZSBleHRlbmRzIElFbnRyeSB7XG4gIHR5cGU6IEVudHJ5VHlwZS5GaWxlXG4gIGlkOiBzdHJpbmc7XG59IiwiaW1wb3J0IHsgRW50cnlUeXBlLCBJRW50cnksIElGb2xkZXIsIElGaWxlIH0gZnJvbSAnLic7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi8uLi91dGlscy9yYW5kb20nO1xuXG4vKlxuKiAgIEZpbGUgU3lzdGVtIEZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSwgbW92ZSwgYW5kIGRlbGV0ZSBmaWxlIHN5c3RlbSBlbnRyaWVzXG4qICAgRG9lcyBub3QgZGVwZW5kIG9uIHN0YXRlIFxuKi9cblxuaW50ZXJmYWNlIHJlc3BvbnNlUHJvcCB7XG4gIHN1Y2NlZWRlZDogYm9vbGVhbixcbiAgZXJyb3I6IHN0cmluZyxcbn1cblxuY29uc3QgY3JlYXRlRW50cnkgPSAobmFtZTogc3RyaW5nLCB0eXBlOiBFbnRyeVR5cGUsIGlkOiBzdHJpbmcsIGNoaWxkcmVuPzogSUVudHJ5W10pOiBJRW50cnkgPT4ge1xuICBjb25zdCBtZXRhZGF0YSA9IHt9O1xuICBpZiAodHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiB7IG5hbWUsIHR5cGUsIGlkLCBtZXRhZGF0YSB9IGFzIElFbnRyeTtcbiAgZWxzZSByZXR1cm4geyBuYW1lLCB0eXBlLCBpZCwgY2hpbGRyZW4sIG1ldGFkYXRhIH0gYXMgSUVudHJ5O1xufTtcblxuY29uc3QgY3JlYXRlRm9sZGVyID0gKG5hbWU6IHN0cmluZyk6IElGb2xkZXIgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZvbGRlciwgdXVpZHY0KCksIFtdKSBhcyBJRm9sZGVyO1xufTtcblxuY29uc3QgY3JlYXRlVHJhc2ggPSAobmFtZTogc3RyaW5nKTogSUZvbGRlciA9PiB7XG4gIHJldHVybiBjcmVhdGVFbnRyeShuYW1lLCBFbnRyeVR5cGUuVHJhc2gsIHV1aWR2NCgpLCBbXSkgYXMgSUZvbGRlcjtcbn07XG5cbmNvbnN0IGNyZWF0ZUZpbGUgPSAobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogSUZpbGUgPT4ge1xuICByZXR1cm4gY3JlYXRlRW50cnkobmFtZSwgRW50cnlUeXBlLkZpbGUsIGlkKSBhcyBJRmlsZTtcbn07XG5cbmZ1bmN0aW9uIGFkZE1ldGFkYXRhKGVudHJ5OiBJRW50cnksIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IElFbnRyeSB7XG4gIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBlbnRyeS5tZXRhZGF0YVtrZXldID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gZW50cnk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU1ldGFkYXRhKGVudHJ5OiBJRW50cnksIGtleXM6IHN0cmluZ1tdKTogSUVudHJ5IHtcbiAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBkZWxldGUgZW50cnkubWV0YWRhdGFba2V5XTtcbiAgfSk7XG4gIHJldHVybiBlbnRyeTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIGFkZGVkIHRvIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5BZGRFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICBjb25zdCBuYW1lRXhpc3RzID0gcGFyZW50LmNoaWxkcmVuLnNvbWUoKGUpID0+IGUubmFtZSA9PT0gZW50cnkubmFtZSk7XG4gIGNvbnN0IGlzSW1tdXRhYmxlID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke2VudHJ5Lm5hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlKSAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHBhcmVudCBmb2xkZXJcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yPzogc3RyaW5nIH1cbiAqL1xuY29uc3QgY2FuUmVtb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgY29uc3QgaWR4ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpO1xuICBjb25zdCBleGlzdHNJblBhcmVudCA9IGlkeCAhPT0gLTE7XG4gIGNvbnN0IGlzSW1tdXRhYmxlUGFyZW50ID0gcGFyZW50Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcbiAgY29uc3QgaXNJbW11dGFibGVFbnRyeSA9IGVudHJ5Lm1ldGFkYXRhWydpbW11dGFibGUnXTtcblxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGRvZXMgbm90IGV4aXN0IGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlUGFyZW50KSAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7cGFyZW50Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZUVudHJ5KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke2VudHJ5Lm5hbWV9IGlzIGltbXV0YWJsZS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuXG4gIHJldHVybiByZXR1cm5PYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBlbnRyeSBjYW4gYmUgbW92ZWQgZnJvbSBwYXJlbnQgdG8gbmV3UGFyZW50IChubyBkdXBsaWNhdGUsIG11dGFibGUgcGFyZW50cywgZW50cnkgZXhpc3RzKVxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBuZXdQYXJlbnQgXG4gKiBAcmV0dXJucyByZXNwb25zZSBvYmplY3QgeyBzdWNjZWVkZWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmcgfVxuICovXG5jb25zdCBjYW5Nb3ZlRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiByZXNwb25zZVByb3AgPT4ge1xuICAvLyBpcyBBIGEgY2hpbGQgb2YgQlxuICBmdW5jdGlvbiBpc0NoaWxkT2YoYTogSUVudHJ5LCBiOiBJRm9sZGVyKSB7XG4gICAgcmV0dXJuIGIuY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcilcbiAgICAgIC5tYXAoKGM6IElGb2xkZXIpID0+IHtcbiAgICAgICAgaWYgKGMgPT09IGEpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBpc0NoaWxkT2YoYSwgYyk7XG4gICAgICB9KVxuICAgICAgLnNvbWUoKGUpID0+IGUgPT09IHRydWUpO1xuICB9XG4gICAgXG4gIGNvbnN0IGlzU2FtZSA9IGVudHJ5ID09PSBuZXdQYXJlbnQ7XG4gIGNvbnN0IG5hbWVFeGlzdHMgPSBuZXdQYXJlbnQuY2hpbGRyZW4uc29tZSgoZSkgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lKTtcbiAgY29uc3QgaXNJbW11dGFibGVQYXJlbnQgPSBwYXJlbnQubWV0YWRhdGFbJ2ltbXV0YWJsZSddO1xuICBjb25zdCBpc0ltbXV0YWJsZU5ld1BhcmVudCA9IG5ld1BhcmVudC5tZXRhZGF0YVsnaW1tdXRhYmxlJ107XG4gIGNvbnN0IGV4aXN0c0luUGFyZW50ID0gcGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50cnkuaWQpICE9PSAtMTtcbiAgLy8gaWYgZW50cnkgaXMgYSBmb2xkZXIsIGNoZWNrIGlmIG5ld1BhcmVudCBpcyBhIHN1YmZvbGRlciBvZiBlbnRyeVxuICBjb25zdCBuZXdQYXJlbnRJc0NoaWxkT2ZFbnRyeSA9IChlbnRyeS50eXBlID09IEVudHJ5VHlwZS5Gb2xkZXIpID8gaXNDaGlsZE9mKG5ld1BhcmVudCwgZW50cnkgYXMgSUZvbGRlcikgOiBmYWxzZTtcblxuXG4gIGNvbnN0IHJldHVybk9iaiA9IHsgc3VjY2VlZGVkOiBmYWxzZSwgZXJyb3I6ICcnIH07XG4gIGlmIChpc1NhbWUpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBDYW5ub3QgbW92ZSAke2VudHJ5Lm5hbWV9IHRvIGl0c2VsZi5gO1xuICBlbHNlIGlmIChuYW1lRXhpc3RzKSAgICAgICAgICAgICAgIHJldHVybk9iai5lcnJvciA9IGBEdXBsaWNhdGUgbmFtZTogJHtlbnRyeS5uYW1lfSBhbHJlYWR5IGV4aXN0cyBpbiAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIGlmIChpc0ltbXV0YWJsZVBhcmVudCkgICAgICAgICByZXR1cm5PYmouZXJyb3IgPSBgJHtwYXJlbnQubmFtZX0gaXMgaW1tdXRhYmxlLmA7XG4gIGVsc2UgaWYgKGlzSW1tdXRhYmxlTmV3UGFyZW50KSAgICAgIHJldHVybk9iai5lcnJvciA9IGAke25ld1BhcmVudC5uYW1lfSBpcyBpbW11dGFibGUuYDtcbiAgZWxzZSBpZiAoIWV4aXN0c0luUGFyZW50KSAgICAgICAgICAgcmV0dXJuT2JqLmVycm9yID0gYCR7ZW50cnkubmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gJHtwYXJlbnQubmFtZX0uYDtcbiAgZWxzZSBpZiAobmV3UGFyZW50SXNDaGlsZE9mRW50cnkpICAgcmV0dXJuT2JqLmVycm9yID0gYENhbm5vdCBtb3ZlICR7ZW50cnkubmFtZX0gaW50byBhIGl0cyBvd24gc3ViZm9sZGVyLCAke25ld1BhcmVudC5uYW1lfS5gO1xuICBlbHNlIHJldHVybk9iai5zdWNjZWVkZWQgPSB0cnVlO1xuICAgIFxuICByZXR1cm4gcmV0dXJuT2JqO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgZW50cnkgY2FuIGJlIHJlbmFtZWQgKG5vIGR1cGxpY2F0ZSlcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3TmFtZSBcbiAqIEByZXR1cm5zIHJlc3BvbnNlIG9iamVjdCB7IHN1Y2NlZWRlZDogYm9vbGVhbiwgZXJyb3I6IHN0cmluZyB9XG4gKi9cbmNvbnN0IGNhblJlbmFtZUVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlciwgbmV3TmFtZTogc3RyaW5nKTogcmVzcG9uc2VQcm9wID0+IHtcbiAgLy8gQ2hlY2sgaWYgbmV3TmFtZSBhbHJlYWR5IGV4aXN0cyBpbiBwYXJlbnRcbiAgY29uc3QgbmFtZUV4aXN0cyA9IHBhcmVudC5jaGlsZHJlbi5zb21lKChlLCBpZHgsIGFycikgPT4gZS5uYW1lID09PSBlbnRyeS5uYW1lICYmIGlkeCAhPT0gYXJyLmluZGV4T2YoZSkpO1xuICAgIFxuICBjb25zdCByZXR1cm5PYmogPSB7IHN1Y2NlZWRlZDogZmFsc2UsIGVycm9yOiAnJyB9O1xuICBpZiAobmFtZUV4aXN0cykgcmV0dXJuT2JqLmVycm9yID0gYER1cGxpY2F0ZSBuYW1lOiAke25ld05hbWV9IGFscmVhZHkgZXhpc3RzIGluICR7cGFyZW50Lm5hbWV9LmA7XG4gIGVsc2UgcmV0dXJuT2JqLnN1Y2NlZWRlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHJldHVybk9iajtcbn07XG5cbi8qKlxuICogQWRkcyBlbnRyeSB0byBwYXJlbnQgZm9sZGVyXG4gKiBAcGFyYW0gZW50cnlcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFkZGVkLCBlbHNlIGZhbHNlXG4gKi9cbmNvbnN0IGFkZEVudHJ5ID0gKGVudHJ5OiBJRW50cnksIHBhcmVudDogSUZvbGRlcik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IHN1Y2NlZWRlZCwgZXJyb3IgfSA9IGNhbkFkZEVudHJ5KGVudHJ5LCBwYXJlbnQpO1xuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgLy8gQWRkIGVudHJ5IHRvIHBhcmVudCwgc29ydCBieSBhbHBoYW51bWVyaWNhbCBhbmQgZm9sZGVycyBiZWZvcmUgZmlsZXNcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChlbnRyeSk7XG4gICAgc29ydEZvbGRlcihwYXJlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmVzIGVudHJ5IGZyb20gcGFyZW50IGZvbGRlclxuICogQHBhcmFtIGVudHJ5IFxuICogQHBhcmFtIHBhcmVudCBcbiAqIEBwYXJhbSBmb3JjZSBmb3JjZSBhIHJlbW92YWxcbiAqIEByZXR1cm5zIHRydWUgaWYgcmVtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5jb25zdCByZW1vdmVFbnRyeSA9IChlbnRyeTogSUVudHJ5LCBwYXJlbnQ6IElGb2xkZXIsIGZvcmNlPWZhbHNlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgc3VjY2VlZGVkLCBlcnJvciB9ID0gY2FuUmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCk7XG4gIGlmIChzdWNjZWVkZWQgfHwgZm9yY2UpIHtcbiAgICBjb25zdCBpZHggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbnRyeSk7XG4gICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpZHgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBNb3ZlcyBlbnRyeSBmcm9tIHBhcmVudCB0byBuZXdQYXJlbnRcbiAqIEBwYXJhbSBlbnRyeSBcbiAqIEBwYXJhbSBwYXJlbnQgXG4gKiBAcGFyYW0gbmV3UGFyZW50IFxuICogQHJldHVybnMgdHJ1ZSBpZiBtb3ZlZCwgZWxzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBtb3ZlRW50cnkoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdQYXJlbnQ6IElGb2xkZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbW92ZVJlc3BvbnNlID0gY2FuTW92ZUVudHJ5KGVudHJ5LCBwYXJlbnQsIG5ld1BhcmVudCk7XG5cbiAgaWYgKG1vdmVSZXNwb25zZS5zdWNjZWVkZWQpIHtcbiAgICBjb25zdCByZW1vdmVkID0gcmVtb3ZlRW50cnkoZW50cnksIHBhcmVudCwgdHJ1ZSk7XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIGNvbnN0IGFkZGVkID0gYWRkRW50cnkoZW50cnksIG5ld1BhcmVudCk7XG4gICAgICBpZiAoYWRkZWQpIHJldHVybiB0cnVlO1xuICAgICAgZWxzZSBjb25zb2xlLmVycm9yKGBNb3Zpbmc6IGZhaWxlZCB0byBhZGQgJHtlbnRyeS5uYW1lfSB0byAke25ld1BhcmVudC5uYW1lfWApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE1vdmluZzogZmFpbGVkIHRvIHJlbW92ZSAke2VudHJ5Lm5hbWV9IGZyb20gJHtwYXJlbnQubmFtZX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihtb3ZlUmVzcG9uc2UuZXJyb3IpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGVudHJ5XG4gKiBAcGFyYW0gZW50cnkgXG4gKiBAcGFyYW0gcGFyZW50IFxuICogQHBhcmFtIG5ld05hbWUgXG4gKiBAcmV0dXJucyB0cnVlIGlmIHJlbmFtZWQsIGVsc2UgZmFsc2VcbiAqL1xuY29uc3QgcmVuYW1lRW50cnkgPSAoZW50cnk6IElFbnRyeSwgcGFyZW50OiBJRm9sZGVyLCBuZXdOYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgeyBzdWNjZWVkZWQsIGVycm9yIH0gPSBjYW5SZW5hbWVFbnRyeShlbnRyeSwgcGFyZW50LCBuZXdOYW1lKTtcblxuICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgZW50cnkubmFtZSA9IG5ld05hbWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBnZXRBbGxOYW1lcyA9IChmb2xkZXI6IElGb2xkZXIpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gZm9sZGVyLmNoaWxkcmVuLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiAgU29ydHMgZm9sZGVyIGJ5IGFscGhhbnVtZXJpY2FsIGFuZCBmb2xkZXJzIGJlZm9yZSBmaWxlcyBcbiAqIEBwYXJhbSBmb2xkZXIgXG4gKiBAcmV0dXJucyByZWZlcmVuY2UgdG8gc2FtZSBmb2xkZXJcbiAqL1xuZnVuY3Rpb24gc29ydEZvbGRlcihmb2xkZXI6IElGb2xkZXIpOiBJRm9sZGVyIHtcbiAgZm9sZGVyLmNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICBmb2xkZXIuY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnR5cGUgPT09IEVudHJ5VHlwZS5GaWxlICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZvbGRlcikgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoYS50eXBlID09PSBFbnRyeVR5cGUuRm9sZGVyICYmIGIudHlwZSA9PT0gRW50cnlUeXBlLkZpbGUpIHJldHVybiAtMTtcbiAgICBlbHNlIHJldHVybiAwO1xuICB9KTtcbiAgcmV0dXJuIGZvbGRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEZpbGVTeXN0ZW1Ub29scyA9IHtcbiAgY3JlYXRlRm9sZGVyOiBjcmVhdGVGb2xkZXIsXG4gIGNyZWF0ZVRyYXNoOiBjcmVhdGVUcmFzaCxcbiAgY3JlYXRlRmlsZTogY3JlYXRlRmlsZSxcbiAgbW92ZUVudHJ5OiBtb3ZlRW50cnksXG4gIGNhbkFkZEVudHJ5OiBjYW5BZGRFbnRyeSxcbiAgY2FuUmVtb3ZlRW50cnk6IGNhblJlbW92ZUVudHJ5LFxuICBjYW5Nb3ZlRW50cnk6IGNhbk1vdmVFbnRyeSxcbiAgY2FuUmVuYW1lRW50cnk6IGNhblJlbmFtZUVudHJ5LFxuICBhZGRFbnRyeTogYWRkRW50cnksXG4gIHJlbW92ZUVudHJ5OiByZW1vdmVFbnRyeSxcbiAgYWRkTWV0YWRhdGE6IGFkZE1ldGFkYXRhLFxuICByZW1vdmVNZXRhZGF0YTogcmVtb3ZlTWV0YWRhdGEsXG4gIGdldEFsbE5hbWVzOiBnZXRBbGxOYW1lcyxcbiAgcmVuYW1lRW50cnk6IHJlbmFtZUVudHJ5LFxufTsiLCJpbXBvcnQgeyBJRm9sZGVyLCBGaWxlU3lzdGVtVG9vbHMgfSBmcm9tICcuJztcbmltcG9ydCB7IGZldGNoVXBsb2FkcyB9IGZyb20gJy4uL1N0b3JhZ2UnO1xuaW1wb3J0IHsgc2FtcGxlcyB9IGZyb20gJy4uL3NhbXBsZXNfZmlsZW5hbWVzJztcblxuaW50ZXJmYWNlIEZpbGVTeXN0ZW1Qcm9wcyB7XG4gIGdldFJvb3Q6ICgpID0+IFByb21pc2U8SUZvbGRlcj47XG4gIHNldEZpbGVTeXN0ZW06IChyb290OiBJRm9sZGVyKSA9PiBib29sZWFuO1xuICBnZXRGaWxlU3lzdGVtOiAoKSA9PiBQcm9taXNlPElGb2xkZXI+O1xuICBuZXdUcmFzaDogKHJvb3Q6IElGb2xkZXIpID0+IHZvaWQ7XG59XG4gIFxuXG4vLyBNYW5hZ2VyIGlzIHVzZWQgZm9yIGFjY2Vzc2luZyBsb2NhbCBzdG9yYWdlIGFuZCB0cmFja2luZyB0aGUgcG9zaXRpb24gb2YgY3VycmVudCBmb2xkZXJcbmV4cG9ydCBjb25zdCBGaWxlU3lzdGVtTWFuYWdlciA9ICgpOiBGaWxlU3lzdGVtUHJvcHMgPT4ge1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFJvb3QoKTogUHJvbWlzZTxJRm9sZGVyPiB7IFxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlU3lzdGVtKCk7XG4gIH1cblxuICAvLyBTYXZlIGZpbGVzeXN0ZW0gaW50byBsb2NhbCBzdG9yYWdlXG4gIGZ1bmN0aW9uIHNldEZpbGVTeXN0ZW0ocm9vdDogSUZvbGRlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ25lb24tZnMnLCBKU09OLnN0cmluZ2lmeShyb290KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHdpbmRvdy5hbGVydCgnRXJyb3Igc2F2aW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTG9hZCBmaWxlc3lzdGVtIGZyb20gbG9jYWwgc3RvcmFnZSwgY3JlYXRlcyBuZXcgcm9vdCBpZiBub25lIGV4aXN0c1xuICBhc3luYyBmdW5jdGlvbiBnZXRGaWxlU3lzdGVtKCk6IFByb21pc2U8SUZvbGRlcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmcyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbmVvbi1mcycpO1xuICAgICAgICAgICAgXG4gICAgICAvLyBpZiBsb2NhbHN0b3JhZ2UgZXhpc3RzLCBsb2FkIHByZXZpb3VzIHJvb3RcbiAgICAgIGlmIChmcykge1xuICAgICAgICBjb25zdCBsb2NhbEZpbGVTeXN0ZW0gPSBKU09OLnBhcnNlKGZzKSBhcyBJRm9sZGVyO1xuICAgICAgICByZXR1cm4gbG9jYWxGaWxlU3lzdGVtO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSwgY3JlYXRlIG5ldyByb290XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGb2xkZXIoJ0hvbWUnKTtcbiAgICAgICAgbG9hZFNhbXBsZXMocm9vdCk7XG4gICAgICAgIG5ld1RyYXNoKHJvb3QpO1xuICAgICAgICBhd2FpdCBsb2FkUHJldmlvdXNVcGxvYWRzKHJvb3QpO1xuICAgICAgICBzZXRGaWxlU3lzdGVtKHJvb3QpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgd2luZG93LmFsZXJ0KCdFcnJvciBsb2FkaW5nIGZpbGUgc3lzdGVtJyk7XG4gICAgfVxuICB9IFxuXG4gIC8vIFRoaXMgbmV4dCBmdW5jdGlvbiBpcyBzb2xlbHkgZm9yIGxvYWRpbmcgc2FtcGxlcyBpbnRvIHRoZSByb290IGFzIGEgZGVmYXVsdCBmb3IgTmVvblxuICBmdW5jdGlvbiBsb2FkU2FtcGxlcyhyb290OiBJRm9sZGVyKSB7XG4gICAgLy8gTWFrZSBzYW1wbGUgZW50cmllc1xuICAgIGNvbnN0IHNhbXBsZUVudHJpZXMgPSBzYW1wbGVzLm1hcCgoW25hbWUsIHR5cGVdKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKG5hbWUsIG5hbWUpO1xuICAgICAgaWYgKHR5cGUgPT09ICdmb2xpbycpIHtcbiAgICAgICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKGVudHJ5LCB7IHR5cGU6ICdmb2xpbycsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ21hbnVzY3JpcHQnKSB7XG4gICAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShlbnRyeSwgeyB0eXBlOiAnbWFudXNjcmlwdCcsIGRvY3VtZW50OiAnc2FtcGxlJywgaW1tdXRhYmxlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuXG4gICAgLy8gTWFrZSBzYW1wbGVzIGZvbGRlciBhbmQgYWRkIHRvIHJvb3RcbiAgICBjb25zdCBzYW1wbGVzRm9sZGVyID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZvbGRlcignU2FtcGxlcycpO1xuICAgIC8vIEFkZCBzYW1wbGUgZW50cmllcyB0byBzYW1wbGVzIGZvbGRlclxuICAgIHNhbXBsZUVudHJpZXMuZm9yRWFjaCgoc2FtcGxlKSA9PiB7XG4gICAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlLCBzYW1wbGVzRm9sZGVyKTtcbiAgICB9KTtcbiAgICBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkoc2FtcGxlc0ZvbGRlciwgcm9vdCk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZE1ldGFkYXRhKHNhbXBsZXNGb2xkZXIsIHsgaW1tdXRhYmxlOiB0cnVlIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBmdW5jdGlvbiBuZXdUcmFzaChyb290OiBJRm9sZGVyKSB7XG4gICAgY29uc3QgdHJhc2hGb2xkZXIgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlVHJhc2goJ1RyYXNoJyk7XG4gICAgRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KHRyYXNoRm9sZGVyLCByb290KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQcmV2aW91c1VwbG9hZHMocm9vdDogSUZvbGRlcikge1xuICAgIC8vIEdldCBwcmV2aW91cyB1cGxvYWRzIGZyb20gbG9jYWwgc3RvcmFnZVxuICAgIGNvbnN0IHVwbG9hZHMgPSBhd2FpdCBmZXRjaFVwbG9hZHMoKTtcblxuICAgIC8vIE1ha2UgdXBsb2FkIGVudHJpZXNcbiAgICBjb25zdCB1cGxvYWRFbnRyaWVzID0gdXBsb2Fkcy5tYXAoKHVwbG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIEZpbGVTeXN0ZW1Ub29scy5jcmVhdGVGaWxlKHVwbG9hZC5uYW1lLCB1cGxvYWQuaWQpO1xuICAgIH0pO1xuXG4gICAgdXBsb2FkRW50cmllcy5mb3JFYWNoKCh1cGxvYWQpID0+IHtcbiAgICAgIEZpbGVTeXN0ZW1Ub29scy5hZGRFbnRyeSh1cGxvYWQsIHJvb3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBjb25zdCBGaWxlU3lzdGVtUHJvcHM6IEZpbGVTeXN0ZW1Qcm9wcyA9IHtcbiAgICBnZXRSb290OiBnZXRSb290LFxuICAgIHNldEZpbGVTeXN0ZW06IHNldEZpbGVTeXN0ZW0sXG4gICAgZ2V0RmlsZVN5c3RlbTogZ2V0RmlsZVN5c3RlbSxcbiAgICBuZXdUcmFzaDogbmV3VHJhc2gsXG4gIH07XG5cbiAgcmV0dXJuIEZpbGVTeXN0ZW1Qcm9wcztcbn07IiwiZXhwb3J0IGNvbnN0IHNhbXBsZXMgPSBbXG4gIFsnQ0ROLUhzbXVfTTIxNDkuTDRfMDAxcicsICdmb2xpbyddLFxuICBbJ0NETi1Ic211X00yMTQ5Lkw0XzAwMnInLCAnZm9saW8nXSxcbiAgWydDSC1FXzYxMV8wMjRyJywgJ2ZvbGlvJ10sXG4gIFsnQ0gtRV82MTFfMDI2cicsICdmb2xpbyddLFxuICBbJ0NILUVfNjExXzAyOHInLCAnZm9saW8nXSxcbiAgWydTYWx6aW5uZXMnLCAnbWFudXNjcmlwdCddXG5dOyIsImltcG9ydCB7IElFbnRyeSwgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmV4cG9ydCBjbGFzcyBTaGlmdFNlbGVjdGlvbk1hbmFnZXIge1xuICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgZW5kOiBudW1iZXI7XG4gIHByaXZhdGUgcHJldlNlbGVjdGlvbjogbnVtYmVyW10gPSBbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0KHN0YXJ0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5zdGFydCA9IE1hdGgubWF4KHN0YXJ0LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFbmQoZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICB0aGlzLmVuZCA9IC0xO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbi5zcGxpY2UoMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJldlNlbGVjdGlvbigpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJldlNlbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb24ob3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdKTogbnVtYmVyW10ge1xuICAgIGxldCBzdGFydDogbnVtYmVyO1xuICAgIGxldCBlbmQ6IG51bWJlcjtcblxuICAgIGlmICh0aGlzLmVuZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kIDwgdGhpcy5zdGFydCkge1xuICAgICAgc3RhcnQgPSB0aGlzLmVuZDtcbiAgICAgIGVuZCA9IHRoaXMuc3RhcnQgKyAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICAgIGVuZCA9IHRoaXMuZW5kICsgMTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2UgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAoZW5kIC0gc3RhcnQpIH0sICh2LCBrKSA9PiBrICsgc3RhcnQpO1xuXG4gICAgLy8gRm9yIGVhY2ggc2hpZnQgc2VsZWN0aW9uIGFjdGlvbjogaWYgdGhlIFNoaWZ0IGtleSBpcyBzdGlsbCBoZWxkLCB0aGUgZW5kIHNoaWZ0IHBvcyBjYW4gY2hhbmdlXG4gICAgLy8gd2l0aCB0aGUgcHJldmlvdXNseSAoYmVmb3JlLXNoaWZ0KSBzZWxlY3RlZCBlbGVtZW50cyBzdGlsbCBzZWxlY3RlZCB3aGlsZSB0aGUgY3VycmVudCBzaGlmdCBzZWxlY3Rpb25zIHVuc2VsZWN0LlxuICAgIGNvbnN0IHNwZWNpZmljU2VsZWN0aW9uID0gcmFuZ2UuZmlsdGVyKGlkeCA9PiAhKG9yZGVyZWRTZWxlY3Rpb25baWR4XSkpO1xuICAgIHRoaXMucHJldlNlbGVjdGlvbiA9IHNwZWNpZmljU2VsZWN0aW9uO1xuICAgIHJldHVybiBzcGVjaWZpY1NlbGVjdGlvbjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFN0YXRlIHtcbiAgcm9vdChyb290Rm9sZGVyPzogSUZvbGRlcik6IElGb2xkZXIgfCBudWxsO1xuICBzZXRFbnRyaWVzKGVudHJpZXM6IElFbnRyeVtdKTogdm9pZDtcbiAgZ2V0RW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHNldFNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBib29sOiBib29sZWFuKTogdm9pZDtcbiAgZ2V0U2VsZWN0aW9uKCk6IGJvb2xlYW5bXTtcbiAgcmVzZXRTZWxlY3Rpb24oKTogdm9pZDtcbiAgc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pOiB2b2lkO1xuICBnZXRGb2xkZXJQYXRoKCk6IElGb2xkZXJbXTtcbiAgZ2V0Rm9sZGVyUGF0aE5hbWVzKCk6IHN0cmluZ1tdO1xuICBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZDtcbiAgZ2V0UGFyZW50Rm9sZGVyKCk6IElGb2xkZXIgfCB1bmRlZmluZWQ7XG4gIGdldFRyYXNoRm9sZGVyKCk6IElGb2xkZXI7XG4gIGdldFNlbGVjdGVkRW50cmllcygpOiBJRW50cnlbXTtcbiAgZ2V0U2VsZWN0ZWRGb2xkZXJzKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZFRyYXNoKCk6IElFbnRyeVtdO1xuICBnZXRTZWxlY3RlZEZpbGVzKCk6IElFbnRyeVtdO1xuICBpc0luVHJhc2goKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZFN0YXRlKCk6IERhc2hib2FyZFN0YXRlIHtcbiAgLy8gYXMgZGlzcGxheWVkIG9uIHRoZSBkYXNoYm9hcmRcbiAgbGV0IG9yZGVyZWRFbnRyaWVzOiBJRW50cnlbXSA9IFtdO1xuICBsZXQgb3JkZXJlZFNlbGVjdGlvbjogYm9vbGVhbltdID0gW107XG4gIC8vIGNvbnN0IGN1cnJlbnRGaWxlU2VsZWN0aW9uID0gW107IC8vIGN1cnJlbnRseSB1c2VyLXNlbGVjdGVkIGZpbGVzXG4gIC8vIGNvbnN0IGN1cnJlbnRGb2xkZXJTZWxlY3Rpb24gPSBbXTsgLy8gY3VycmVudGx5IHVzZXItc2VsZWN0ZWQgZm9sZGVyc1xuXG4gIC8vIHBhdGggbGVhZGluZyB0byBjdXJyZW50IGZvbGRlclxuICBsZXQgZm9sZGVyUGF0aDogSUZvbGRlcltdID0gW107XG4gIGxldCBfcm9vdDogSUZvbGRlciA9IG51bGw7XG5cbiAgLyoqIFxuICAgKiBTZXRzIG9yIGdldHMgdGhlIHJvb3QgZm9sZGVyXG4gICAqIEBwYXJhbSByb290Rm9sZGVyIChvcHRpb25hbCkgLSB0aGUgcm9vdCBmb2xkZXIgdG8gc2V0XG4gICAqIEByZXR1cm5zIHRoZSByb290IGZvbGRlclxuICAgKi8gXG4gIGZ1bmN0aW9uIHJvb3Qocm9vdEZvbGRlcj86IElGb2xkZXIpIHtcbiAgICBpZiAocm9vdEZvbGRlcikgX3Jvb3QgPSByb290Rm9sZGVyO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEVudHJpZXMoZW50cmllczogSUVudHJ5W10pIHtcbiAgICBvcmRlcmVkRW50cmllcyA9IGVudHJpZXM7XG4gICAgb3JkZXJlZFNlbGVjdGlvbiA9IEFycmF5KGVudHJpZXMubGVuZ3RoKS5maWxsKGZhbHNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRFbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5kZXhCeUVudHJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3JkZXJlZEVudHJpZXMuZmluZEluZGV4KGVudHJ5ID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIGJvb2w6IGJvb2xlYW4pIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uW2luZGV4XSA9IGJvb2w7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9yZGVyZWRTZWxlY3Rpb247XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFNlbGVjdGlvbigpIHtcbiAgICBvcmRlcmVkU2VsZWN0aW9uLmZpbGwoZmFsc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Rm9sZGVyUGF0aChwYXRoOiBJRm9sZGVyW10pIHtcbiAgICBmb2xkZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZvbGRlclBhdGgoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoTmFtZXMoKSB7XG4gICAgcmV0dXJuIGZvbGRlclBhdGgubWFwKGZvbGRlciA9PiBmb2xkZXIubmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoQnlOYW1lcyhmb2xkZXJOYW1lczogc3RyaW5nW10pOiBJRm9sZGVyIHwgdm9pZCB7XG4gICAgbGV0IGN1cnJlbnRGb2xkZXIgPSByb290KCk7XG4gICAgZm9sZGVyTmFtZXMgPSBmb2xkZXJOYW1lcy5zbGljZSgxKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyTmFtZSBvZiBmb2xkZXJOYW1lcykge1xuICAgICAgY29uc3QgdGFyZ2V0Rm9sZGVyID0gY3VycmVudEZvbGRlci5jaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLm5hbWUgPT09IGZvbGRlck5hbWUpO1xuICAgICAgaWYgKHRhcmdldEZvbGRlciAmJiB0YXJnZXRGb2xkZXIudHlwZSA9PT0gJ2ZvbGRlcicpIHtcbiAgICAgICAgY3VycmVudEZvbGRlciA9IHRhcmdldEZvbGRlciBhcyBJRm9sZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZmFpbGVkIHRvIGZpbmQgZm9sZGVyOiAnLCBmb2xkZXJOYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Rm9sZGVyO1xuICB9XG5cblxuICBmdW5jdGlvbiBnZXRQYXJlbnRGb2xkZXIoKSB7IFxuICAgIHJldHVybiBmb2xkZXJQYXRoLmF0KC0xKTsgXG4gIH1cblxuICBmdW5jdGlvbiBnZXRUcmFzaEZvbGRlcigpIHtcbiAgICBjb25zdCB0cmFzaEZvbGRlcnMgPSByb290KCkuY2hpbGRyZW4uZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICd0cmFzaCcpIGFzIElGb2xkZXJbXTtcbiAgICByZXR1cm4gdHJhc2hGb2xkZXJzWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkge1xuICAgIHJldHVybiBvcmRlcmVkRW50cmllcy5maWx0ZXIoKF8sIGlkeCkgPT4gb3JkZXJlZFNlbGVjdGlvbltpZHhdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRm9sZGVycygpIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRFbnRyaWVzKCkuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09ICdmb2xkZXInKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkVHJhc2goKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAndHJhc2gnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGVjdGVkRmlsZXMoKSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkRW50cmllcygpLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAnZmlsZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJblRyYXNoKCkge1xuICAgIGNvbnN0IGlzVHJhc2hGb2xkZXIgPSAoZm9sZGVyOiBJRm9sZGVyKTogYm9vbGVhbiA9PiBmb2xkZXIudHlwZSA9PT0gJ3RyYXNoJztcbiAgICByZXR1cm4gZm9sZGVyUGF0aC5zb21lKGlzVHJhc2hGb2xkZXIpO1xuICB9XG5cbiAgLy8gVE9ETzpcbiAgLy8gZnVuY3Rpb24gc29ydEVudHJpZXMoKSB7fVxuXG4gIHJldHVybiB7XG4gICAgcm9vdDogcm9vdCxcbiAgICBzZXRFbnRyaWVzOiBzZXRFbnRyaWVzLFxuICAgIGdldEVudHJpZXM6IGdldEVudHJpZXMsXG4gICAgZ2V0SW5kZXhCeUVudHJ5TmFtZTogZ2V0SW5kZXhCeUVudHJ5TmFtZSxcbiAgICBzZXRTZWxlY3Rpb246IHNldFNlbGVjdGlvbixcbiAgICBnZXRTZWxlY3Rpb246IGdldFNlbGVjdGlvbixcbiAgICByZXNldFNlbGVjdGlvbjogcmVzZXRTZWxlY3Rpb24sXG4gICAgc2V0Rm9sZGVyUGF0aDogc2V0Rm9sZGVyUGF0aCxcbiAgICBnZXRGb2xkZXJQYXRoOiBnZXRGb2xkZXJQYXRoLFxuICAgIGdldEZvbGRlclBhdGhOYW1lczogZ2V0Rm9sZGVyUGF0aE5hbWVzLFxuICAgIGdldEZvbGRlclBhdGhCeU5hbWVzOiBnZXRGb2xkZXJQYXRoQnlOYW1lcyxcbiAgICBnZXRQYXJlbnRGb2xkZXI6IGdldFBhcmVudEZvbGRlcixcbiAgICBnZXRUcmFzaEZvbGRlcjogZ2V0VHJhc2hGb2xkZXIsXG4gICAgZ2V0U2VsZWN0ZWRFbnRyaWVzOiBnZXRTZWxlY3RlZEVudHJpZXMsXG4gICAgZ2V0U2VsZWN0ZWRGb2xkZXJzOiBnZXRTZWxlY3RlZEZvbGRlcnMsXG4gICAgZ2V0U2VsZWN0ZWRUcmFzaDogZ2V0U2VsZWN0ZWRUcmFzaCxcbiAgICBnZXRTZWxlY3RlZEZpbGVzOiBnZXRTZWxlY3RlZEZpbGVzLFxuICAgIGlzSW5UcmFzaDogaXNJblRyYXNoLFxuICB9O1xufSIsImltcG9ydCB7IE1vZGFsV2luZG93LCBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuLi91dGlscy9Nb2RhbFdpbmRvdyc7XG5pbXBvcnQge1xuICBhZGROZXdGaWxlcyxcbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzLFxuICBoYW5kbGVNYWtlUGFpcixcbiAgc29ydEZpbGVCeU5hbWUsXG59IGZyb20gJy4vVXBsb2FkVG9vbHMnO1xuaW1wb3J0IHsgdXBkYXRlRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgSUZvbGRlciB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVVwbG9hZFVwZGF0ZShcbiAgbW9kYWxXaW5kb3c6IE1vZGFsV2luZG93LFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKSB7XG4gIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdXBsb2FkaW5nX3NwaW5uZXInKTtcbiAgc3Bpbm5lci5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKGN1cnJlbnRGb2xkZXIpXG4gICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuXG4gICAgICAgIC8vIFNob3cgdXBsb2FkZWQgZmlsZW5hbWVzXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxGaWxlcyA9IHJlc3VsdHNcbiAgICAgICAgICAuZmlsdGVyKChyZXN1bHQpID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAubWFwKChyZXN1bHQpID0+IHJlc3VsdC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHN1Y2Nlc3NmdWxGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW5mb0JhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm8tYmFkZ2UnKTtcbiAgICAgICAgICBpbmZvQmFkZ2UudGV4dENvbnRlbnQgPSBgVXBsb2FkZWQgZmlsZXM6ICR7c3VjY2Vzc2Z1bEZpbGVzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgICBpbmZvQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaW5mb0JhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAnIzlEQjJCRic7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwMDApO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ09uZSBvciBtb3JlIHVwbG9hZHMgcmVqZWN0ZWQ6ICcsIGVycm9yKTtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYXNoYm9hcmQoKTtcbiAgICAgICAgc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICAgIG1vZGFsV2luZG93LmhpZGVNb2RhbFdpbmRvdygpO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbml0VXBsb2FkQXJlYShjdXJyZW50Rm9sZGVyOiBJRm9sZGVyKTogdm9pZCB7XG4gIC8vIGdlbmVyYXRlIG1vZGFsIHdpbmRvd1xuICBjb25zdCBtb2RhbFdpbmRvdyA9IG5ldyBNb2RhbFdpbmRvdygpO1xuICBtb2RhbFdpbmRvdy5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRCk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xuXG4gIGNvbnN0IHBhaXJCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFrZV9wYWlyJyk7XG4gIGNvbnN0IHVwbG9hZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN1cGxvYWRfYnV0dG9uJyk7XG5cbiAgcGFpckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU1ha2VQYWlyKTtcbiAgdXBsb2FkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT5cbiAgICBoYW5kbGVVcGxvYWRVcGRhdGUobW9kYWxXaW5kb3csIGN1cnJlbnRGb2xkZXIpLFxuICApO1xuXG4gIC8vIHJlcXVlc3QgdXNlciBmaWxlIHN5c3RlbSB3aGVuIGNsaWNraW5nIG9uIHVwbG9hZCBhcmVhXG4gIGNvbnN0IGZpbGVTZWxlY3RvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVTZWxlY3Rvci50eXBlID0gJ2ZpbGUnO1xuICBmaWxlU2VsZWN0b3IubXVsdGlwbGUgPSB0cnVlO1xuICBmaWxlU2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdG9yQ2hhbmdlKCkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGZpbGVTZWxlY3Rvci5maWxlcztcbiAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oZmlsZUxpc3QpO1xuICAgIGNvbnN0IHJlamVjdEZpbGVzID0gYWRkTmV3RmlsZXMoZmlsZXMpO1xuICAgIGlmIChyZWplY3RGaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lcyA9IHJlamVjdEZpbGVzLm1hcCgoZmlsZSkgPT4gZmlsZS5uYW1lKTtcbiAgICAgIHdpbmRvdy5hbGVydChcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG5vdCAubWVpLCAucG5nLCAuanBlZywgb3IgLmpzb25sZCBmaWxlczogXFxuXFxuJHtmaWxlbmFtZXMuam9pbihcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHNlbGVjdGlvblxuICAgIGZpbGVTZWxlY3Rvci52YWx1ZSA9IG51bGw7XG4gIH0pO1xuXG4gIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMgZm9yIGNsaWNrIGFuZCBkcmFnIGFuZCBkcm9wXG4gIGNvbnN0IHVwbG9hZF9hcmVhOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJyNpbml0aWFsX3VwbG9hZF9hcmVhJyxcbiAgKTtcbiAgdXBsb2FkX2FyZWEub25jbGljayA9ICgpID0+IGZpbGVTZWxlY3Rvci5jbGljaygpO1xuICAvLyBhZGQgdmlzdWFsIGN1ZXMgZm9yIGRyYWdnaW5nIGZpbGVzIG92ZXIgdXBsb2FkIGFyZWFcbiAgdXBsb2FkX2FyZWEub25kcmFnbGVhdmUgPSAoKSA9PiB1cGxvYWRfYXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyJyk7XG4gIHVwbG9hZF9hcmVhLm9uZHJhZ292ZXIgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHVwbG9hZF9hcmVhLmNsYXNzTGlzdC5hZGQoJ292ZXInKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgfTtcbiAgLy8gcmVjZWl2ZSBmaWxlcyBvbmNlIGZpbGVzIGFyZSBkcm9wcGVkXG4gIHVwbG9hZF9hcmVhLm9uZHJvcCA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdXBsb2FkX2FyZWEuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcicpO1xuICAgIGNvbnN0IGZpbGVMaXN0ID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShmaWxlTGlzdCk7XG4gICAgY29uc3QgcmVqZWN0RmlsZXMgPSBhZGROZXdGaWxlcyhmaWxlcyk7XG4gICAgaWYgKHJlamVjdEZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgZmlsZW5hbWVzID0gcmVqZWN0RmlsZXMubWFwKChmaWxlKSA9PiBmaWxlLm5hbWUpO1xuICAgICAgd2luZG93LmFsZXJ0KFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbm90IC5tZWksIC5wbmcsIC5qcGVnLCBvciAuanNvbmxkIGZpbGVzOiBcXG5cXG4ke2ZpbGVuYW1lcy5qb2luKFxuICAgICAgICAgICdcXG4nLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvLyBMaXN0ZW5lciBmb3Igc29ydGluZyBmaWxlL2ZvbGlvXG4gIGNvbnN0IHNvcnRCeU5hbWVCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNvcnRfbmFtZScpO1xuICBzb3J0QnlOYW1lQnRucy5mb3JFYWNoKChzb3J0QnlOYW1lQnRuKSA9PiB7XG4gICAgc29ydEJ5TmFtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+XG4gICAgICBzb3J0RmlsZUJ5TmFtZShzb3J0QnlOYW1lQnRuKSxcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IFVwbG9hZEZpbGVNYW5hZ2VyIGZyb20gJy4vVXBsb2FkRmlsZU1hbmFnZXInO1xuaW1wb3J0IHsgY3JlYXRlTWFuaWZlc3QsIGFkZERvY3VtZW50IH0gZnJvbSAnLi9TdG9yYWdlJztcbmltcG9ydCB7IElGb2xkZXIsIEZpbGVTeXN0ZW1Ub29scyB9IGZyb20gJy4vRmlsZVN5c3RlbSc7XG5cbmNvbnN0IGZtID0gVXBsb2FkRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuLy8gU2V0IE1FSSB0ZW1wbGF0ZVxuY29uc3QgdGVtcGxhdGVQYXRoID0gJ3NhbXBsZXMvbWVpL21laV90ZW1wbGF0ZS5tZWknO1xuZm0uc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoKTtcblxuLy8gQWRkcyBuZXcgZmlsZXMgdG8gdXBsb2FkIHBhaXJpbmcgY29udGFpbmVyIGFuZCBmaWxlbWFuYWdlciwgcmV0dXJucyBsaXN0IG9mIHJlamVjdGVkIGZpbGVzXG5leHBvcnQgZnVuY3Rpb24gYWRkTmV3RmlsZXMoZmlsZXM6IEZpbGVbXSk6IEZpbGVbXSB7XG4gIGNvbnN0IG1laV9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21laV9saXN0Jyk7XG4gIGNvbnN0IGltYWdlX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW1hZ2VfbGlzdCcpO1xuXG4gIGNvbnN0IHJlamVjdEZpbGVzOiBGaWxlW10gPSBbXTtcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4dCA9IGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuXG4gICAgaWYgKGV4dCA9PT0gJ21laScpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdtZWknKTtcbiAgICAgIG1laV9jb250YWluZXIuYXBwZW5kQ2hpbGQodW5wYWlyZWRJdGVtKTtcbiAgICAgIGZtLmFkZEZpbGUoZmlsZSk7XG4gICAgfSBlbHNlIGlmIChbJ3BuZycsICdqcGcnLCAnanBlZyddLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgIGNvbnN0IHVucGFpcmVkSXRlbSA9IGNyZWF0ZVVucGFpcmVkSXRlbShmaWxlLm5hbWUsICdpbWFnZScpO1xuICAgICAgaW1hZ2VfY29udGFpbmVyLmFwcGVuZENoaWxkKHVucGFpcmVkSXRlbSk7XG4gICAgICBmbS5hZGRGaWxlKGZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZXh0ID09PSAnanNvbmxkJykge1xuICAgICAgLy8gLy8gcmVtb3ZlIG1hbnVzY3JpcHQgc3VwcG9ydCBmb3IgdGhlIGltbWVkaWF0ZSBmdXR1cmUhXG4gICAgICAvLyBjb25zdCBtYW51c2NyaXB0Rm9saW8gPSBjcmVhdGVNYW51c2NyaXB0Rm9saW8oZmlsZS5uYW1lKTtcbiAgICAgIC8vIG1hbnVzY3JpcHRfY29udGFpbmVyLmFwcGVuZENoaWxkKG1hbnVzY3JpcHRGb2xpbyk7XG4gICAgICAvLyBmbS5hZGRGaWxlKGZpbGUpO1xuICAgICAgLy8gZm0uYWRkTWFudXNjcmlwdChmaWxlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3RGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZWplY3RGaWxlcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVW5wYWlyZWRJdGVtKGZpbGVuYW1lOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcpOiBIVE1MRGl2RWxlbWVudCB7XG4gIGlmIChncm91cCAhPT0gJ21laScgJiYgZ3JvdXAgIT09ICdpbWFnZScpIHJldHVybjtcbiAgY29uc3QgcmFkaW9OYW1lID0gJ21laScgPT09IGdyb3VwID8gJ21laV9yYWRpb19ncm91cCcgOiAnaW1hZ2VfcmFkaW9fZ3JvdXAnO1xuICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuXG4gIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbm9kZS5jbGFzc05hbWUgPSAndW5wYWlyZWRfaXRlbV9jb250YWluZXInO1xuXG4gIGNvbnN0IHJhZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgcmFkaW8udHlwZSA9ICdyYWRpbyc7XG4gIHJhZGlvLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX3JhZGlvJztcbiAgcmFkaW8ubmFtZSA9IHJhZGlvTmFtZTtcbiAgcmFkaW8udmFsdWUgPSBmaWxlbmFtZTtcbiAgcmFkaW8uaWQgPSBpZDtcblxuICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gIGxhYmVsLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9pdGVtX2xhYmVsJztcbiAgbGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBpZCk7XG5cbiAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgdGV4dC5pbm5lclRleHQgPSBmb3JtYXRGaWxlbmFtZShmaWxlbmFtZSwgNTApO1xuICB0ZXh0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnbWFyZ2luLXRvcDogYXV0bzsgbWFyZ2luLWxlZnQ6IDNweDsnKTtcblxuICBjb25zdCBkZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgZGVsQnRuLmNsYXNzTmFtZSA9ICd1bnBhaXJlZF9kZWxfYnRuJztcbiAgZGVsQnRuLnNyYyA9IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy91bnBhaXJlZC1yZW1vdmUtZG9jLnN2Z2A7XG4gIGRlbEJ0bi50aXRsZSA9ICdkZWxldGUnO1xuXG4gIGxhYmVsLmFwcGVuZENoaWxkKHJhZGlvKTtcbiAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG4gIG5vZGUuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICBub2RlLmFwcGVuZENoaWxkKGRlbEJ0bik7XG5cbiAgZGVsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIG5vZGUucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlTWFrZVBhaXIoKTogdm9pZCB7XG4gIGNvbnN0IHBhaXJlZF9jb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID1cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGFpcmVkX2xpc3QnKTtcblxuICAvLyBnZXQgYW5kIGNoZWNrIGlmIHNlbGVjdGVkIHJhZGlvIGV4aXN0c1xuICBjb25zdCBzZWxlY3RlZE1laUVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICdpbnB1dFtuYW1lPVwibWVpX3JhZGlvX2dyb3VwXCJdOmNoZWNrZWQnLFxuICApO1xuICBjb25zdCBzZWxlY3RlZEltYWdlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJ2lucHV0W25hbWU9XCJpbWFnZV9yYWRpb19ncm91cFwiXTpjaGVja2VkJyxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkTWVpRWxlbWVudCA9PT0gbnVsbCB8fCBzZWxlY3RlZEltYWdlRWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gIGxldCBtZWlfZmlsZW5hbWUgPSBzZWxlY3RlZE1laUVsZW1lbnQudmFsdWU7XG4gIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gc2VsZWN0ZWRJbWFnZUVsZW1lbnQudmFsdWU7XG4gIGxldCBpc0NyZWF0ZWQgPSBmYWxzZTtcblxuICBpZiAoc2VsZWN0ZWRNZWlFbGVtZW50LnZhbHVlID09PSAnY3JlYXRlX21laScpIHtcbiAgICBpc0NyZWF0ZWQgPSB0cnVlO1xuICAgIC8vIENoYW5nZSBleHRlbnNpb25cbiAgICBjb25zdCBmbiA9IGltYWdlX2ZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgaWYgKGZuLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZuLnBvcCgpO1xuICAgIH1cbiAgICBmbi5wdXNoKCdtZWknKTtcblxuICAgIG1laV9maWxlbmFtZSA9IGZuLmpvaW4oJy4nKTtcbiAgICAvLyBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgZm0uZ2V0SW1nRGltZW5zaW9uKGltYWdlX2ZpbGVuYW1lKVxuICAgICAgLnRoZW4oKGRpbWVuc2lvbnMpID0+IHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBzdGFmZlNwYWNlIH0gPSBkaW1lbnNpb25zO1xuICAgICAgICBjb25zdCBuZXdNZWlGaWxlID0gZm0uY3JlYXRlTWVpRmlsZShcbiAgICAgICAgICBtZWlfZmlsZW5hbWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHN0YWZmU3BhY2UsXG4gICAgICAgICk7XG4gICAgICAgIGZtLmFkZEZpbGUobmV3TWVpRmlsZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgY29uc3QgZmlsZW5hbWUgPSBtZWlfZmlsZW5hbWUuc3Vic3RyaW5nKDAsIG1laV9maWxlbmFtZS5sZW5ndGggLSA0KTtcbiAgLy8gbWFrZSBhbmQgYXBwZW5kIFVJIGVsZW1lbnRcbiAgY29uc3QgcGFpcmVkX2VsID0gY3JlYXRlUGFpcmVkRm9saW8oZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWUpO1xuICBwYWlyZWRfY29udGFpbmVyLmFwcGVuZENoaWxkKHBhaXJlZF9lbCk7XG4gIC8vIHJlZmxlY3QgaW4gZmlsZSBtYW5hZ2VyXG4gIGZtLmFkZEZvbGlvKGZpbGVuYW1lLCBtZWlfZmlsZW5hbWUsIGltYWdlX2ZpbGVuYW1lLCBpc0NyZWF0ZWQpO1xuICAvLyByZW1vdmUgZnJvbSB1bnBhaXJlZCBtZWkgYW5kIGltYWdlIGxpc3RzXG4gIGlmICghaXNDcmVhdGVkKSBzZWxlY3RlZE1laUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICBzZWxlY3RlZEltYWdlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJlZEZvbGlvKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBtZWlfZmlsZW5hbWU6IHN0cmluZyxcbiAgaW1hZ2VfZmlsZW5hbWU6IHN0cmluZyxcbik6IEhUTUxEaXZFbGVtZW50IHtcbiAgY29uc3QgbWVpX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWVpX2xpc3QnKTtcbiAgY29uc3QgaW1hZ2VfY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbWFnZV9saXN0Jyk7XG5cbiAgY29uc3QgZm9saW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW8uY2xhc3NOYW1lID0gJ2ZvbGlvX2l0ZW0nO1xuICBmb2xpby5zZXRBdHRyaWJ1dGUoJ21laScsIG1laV9maWxlbmFtZSk7XG4gIGZvbGlvLnNldEF0dHJpYnV0ZSgnaW1hZ2UnLCBpbWFnZV9maWxlbmFtZSk7XG5cbiAgY29uc3QgZm9saW9fZmlsZW5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZm9saW9fZmlsZW5hbWUuY2xhc3NMaXN0LmFkZCgnZm9saW8tZmlsZW5hbWUnKTtcbiAgZm9saW9fZmlsZW5hbWUuaW5uZXJIVE1MID0gZm9ybWF0RmlsZW5hbWUoZmlsZW5hbWUsIDUwKTtcbiAgZm9saW8uYXBwZW5kQ2hpbGQoZm9saW9fZmlsZW5hbWUpO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZVVucGFpcigpIHtcbiAgICAvLyByZW1vdmUgZm9saW8gZnJvbSBVSVxuICAgIGZvbGlvLnJlbW92ZSgpO1xuICAgIC8vIHJlbW92ZSBmb2xpbyBmcm9tIGZpbGUgbWFuYWdlclxuICAgIGNvbnN0IGlzQ3JlYXRlZCA9IGZtLmlzQ3JlYXRlZEZvbGlvKGZpbGVuYW1lKTtcbiAgICBmbS5yZW1vdmVGb2xpbyhmaWxlbmFtZSk7XG4gICAgLy8gYWRkIGl0ZW1zIGJhY2sgdG8gdW5wYWlyZWQgY29udGFpbmVyc1xuICAgIGlmICghaXNDcmVhdGVkKSB7XG4gICAgICBjb25zdCBtZWlJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKG1laV9maWxlbmFtZSwgJ21laScpO1xuICAgICAgbWVpX2NvbnRhaW5lci5hcHBlbmRDaGlsZChtZWlJdGVtKTtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VJdGVtID0gY3JlYXRlVW5wYWlyZWRJdGVtKGltYWdlX2ZpbGVuYW1lLCAnaW1hZ2UnKTtcbiAgICBpbWFnZV9jb250YWluZXIuYXBwZW5kQ2hpbGQoaW1hZ2VJdGVtKTtcbiAgfVxuXG4gIGNvbnN0IHVucGFpckJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICB1bnBhaXJCdG4uY2xhc3NOYW1lID0gJ3VucGFpcl9idG4nO1xuICB1bnBhaXJCdG4uc3JjID0gYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3VucGFpci1kb2Muc3ZnYDtcbiAgdW5wYWlyQnRuLnRpdGxlID0gJ3VucGFpcic7XG4gIHVucGFpckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVVucGFpcik7XG4gIGZvbGlvLmFwcGVuZENoaWxkKHVucGFpckJ0bik7XG5cbiAgcmV0dXJuIGZvbGlvO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlVXBsb2FkQWxsRG9jdW1lbnRzKFxuICBjdXJyZW50Rm9sZGVyOiBJRm9sZGVyLFxuKTogUHJvbWlzZTx7IHN0YXR1czogc3RyaW5nOyB2YWx1ZT86IHN0cmluZzsgcmVhc29uPzogYW55IH1bXT4ge1xuICBjb25zdCBmb2xpb1Byb21pc2VzID0gZm1cbiAgICAuZ2V0Rm9saW9zKClcbiAgICAubWFwKGFzeW5jIChbbmFtZSwgbWVpLCBpbWFnZV06IFtzdHJpbmcsIEZpbGUsIEZpbGVdKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHVwbG9hZEZvbGlvKGlkLCBuYW1lLCBtZWksIGltYWdlLCBjdXJyZW50Rm9sZGVyKTtcbiAgICB9KTtcblxuICBjb25zdCBtYW51c2NyaXB0UHJvbWlzZXMgPSBbXTsgLy9mbS5nZXRNYW51c2NyaXB0cygpXG4gIC8vIC5tYXAoIGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG4gIC8vICAgcmV0dXJuIGF3YWl0IHVwbG9hZE1hbnVzY3JpcHQoZmlsZSk7XG4gIC8vIH0pO1xuXG4gIGNvbnN0IHByb21pc2VzID0gWy4uLmZvbGlvUHJvbWlzZXMsIC4uLm1hbnVzY3JpcHRQcm9taXNlc10ubWFwKChwKSA9PlxuICAgIFByb21pc2UucmVzb2x2ZShwKS50aGVuKFxuICAgICAgKHZhbHVlKSA9PiAoeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZSB9KSxcbiAgICAgIChyZWFzb24pID0+ICh7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uIH0pLFxuICAgICksXG4gICk7XG5cbiAgZm0uY2xlYXIoKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkRm9saW8oXG4gIGlkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgbWVpOiBGaWxlLFxuICBpbWFnZTogRmlsZSxcbiAgY3VycmVudEZvbGRlcjogSUZvbGRlcixcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBuZXdOYW1lID0gZm5Db25mbGljdEhhbmRsZXIoXG4gICAgbmFtZSxcbiAgICBGaWxlU3lzdGVtVG9vbHMuZ2V0QWxsTmFtZXMoY3VycmVudEZvbGRlciksXG4gICk7XG4gIHJldHVybiAoXG4gICAgY3JlYXRlTWFuaWZlc3QoaWQsIG5ld05hbWUsIG1laSwgaW1hZ2UpXG4gICAgICAudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RCbG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKV0sIHtcbiAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vbGQranNvbicsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpc1NpbmdsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBhZGREb2N1bWVudChpZCwgbmV3TmFtZSwgbWFuaWZlc3RCbG9iLCBpc1NpbmdsZSk7XG4gICAgICB9KVxuICAgICAgLy8gYWRkIHRvIGRhc2hib2FyZCBGaWxlU3lzdGVtXG4gICAgICAudGhlbigoc3VjY2VlZGVkKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZWVkZWQpIHtcbiAgICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCBmaWxlRW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuY3JlYXRlRmlsZShuZXdOYW1lLCBpZCk7XG4gICAgICAgICAgY29uc3QgZm9saW9FbnRyeSA9IEZpbGVTeXN0ZW1Ub29scy5hZGRNZXRhZGF0YShmaWxlRW50cnksIHtcbiAgICAgICAgICAgIHR5cGU6ICdmb2xpbycsXG4gICAgICAgICAgICBjcmVhdGVkX29uOiBkYXRldGltZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBpc0FkZGVkID0gRmlsZVN5c3RlbVRvb2xzLmFkZEVudHJ5KGZvbGlvRW50cnksIGN1cnJlbnRGb2xkZXIpO1xuICAgICAgICAgIHJldHVybiBpc0FkZGVkID8gbmV3TmFtZSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICApO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KG1hbnVzY3JpcHQubmFtZSwgbWFudXNjcmlwdCwgZmFsc2UpO1xuLy8gfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29ydEZpbGVCeU5hbWUoc29ydEJ5TmFtZUJ0bjogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlTGlzdCA9IHNvcnRCeU5hbWVCdG4ucGFyZW50RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gIGNvbnN0IGZpbGVFbGVtZW50cyA9IEFycmF5LmZyb20oZmlsZUxpc3QuY2hpbGRyZW4pO1xuXG4gIGxldCBpc0FzY2VuZGluZyA9IHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdhcnJvdy11cCcpO1xuXG4gIGlmIChpc0FzY2VuZGluZykge1xuICAgIHNvcnRCeU5hbWVCdG4uY2xhc3NMaXN0LnJlbW92ZSgnYXJyb3ctdXAnKTtcbiAgICBzb3J0QnlOYW1lQnRuLmNsYXNzTGlzdC5hZGQoJ2Fycm93LWRvd24nKTtcbiAgICBzb3J0QnlOYW1lQnRuLmlubmVySFRNTCA9ICcmI3gyMkMxOyc7XG4gIH0gZWxzZSB7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhcnJvdy1kb3duJyk7XG4gICAgc29ydEJ5TmFtZUJ0bi5jbGFzc0xpc3QuYWRkKCdhcnJvdy11cCcpO1xuICAgIHNvcnRCeU5hbWVCdG4uaW5uZXJIVE1MID0gJyYjeDIyQzA7JztcbiAgfVxuXG4gIGlzQXNjZW5kaW5nID0gIWlzQXNjZW5kaW5nO1xuXG4gIGZpbGVFbGVtZW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgbmFtZUEgPSBhLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICBjb25zdCBuYW1lQiA9IGIudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIHJldHVybiBpc0FzY2VuZGluZ1xuICAgICAgPyBuYW1lQS5sb2NhbGVDb21wYXJlKG5hbWVCKVxuICAgICAgOiBuYW1lQi5sb2NhbGVDb21wYXJlKG5hbWVBKTtcbiAgfSk7XG5cbiAgZmlsZUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBmaWxlTGlzdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgfSk7XG5cbiAgc29ydEJ5TmFtZUJ0bi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2NvbG9yOiBibGFjaycpO1xufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB1cGxvYWRNYW51c2NyaXB0KG1hbnVzY3JpcHQ6IEZpbGUsIGN1cnJlbnRGb2xkZXI6IElGb2xkZXIsIGV4aXN0aW5nTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4vLyAgIGNvbnN0IGlzU2luZ2xlID0gZmFsc2U7XG4vLyAgIGNvbnN0IGlkID0gbWFudXNjcmlwdFsnQGlkJ10gIT09IG51bGwgPyBtYW51c2NyaXB0WydAaWQnXSA6IG1hbnVzY3JpcHQubmFtZTtcbi8vICAgcmV0dXJuIGFkZEVudHJ5KGlkLCBtYW51c2NyaXB0Lm5hbWUsIG1hbnVzY3JpcHQsIGlzU2luZ2xlKVxuLy8gICAgIC8vIGFkZCB0byBkYXNoYm9hcmQgRmlsZVN5c3RlbVxuLy8gICAgIC50aGVuKHN1Y2NlZWRlZCA9PiB7XG4vLyAgICAgICBpZiAoc3VjY2VlZGVkKSB7XG4vLyAgICAgICAgIGNvbnN0IG5ld05hbWUgPSBmbkNvbmZsaWN0SGFuZGxlcihtYW51c2NyaXB0Lm5hbWUsIGV4aXN0aW5nTmFtZXMpO1xuLy8gICAgICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTtcbi8vICAgICAgICAgY29uc3QgZmlsZUVudHJ5ID0gRmlsZVN5c3RlbVRvb2xzLmNyZWF0ZUZpbGUobmV3TmFtZSwgaWQpO1xuLy8gICAgICAgICBjb25zdCBtYW51c2NyaXB0RW50cnkgPSBGaWxlU3lzdGVtVG9vbHMuYWRkTWV0YWRhdGEoZmlsZUVudHJ5LCB7IHR5cGU6ICdtYW51c2NyaXB0JywgY3JlYXRlZF9vbjogZGF0ZXRpbWUgfSk7XG4vLyAgICAgICAgIGNvbnN0IGlzQWRkZWQgPSBGaWxlU3lzdGVtVG9vbHMuYWRkRW50cnkobWFudXNjcmlwdEVudHJ5LCBjdXJyZW50Rm9sZGVyKTtcbi8vICAgICAgICAgcmV0dXJuIGlzQWRkZWQ7XG4vLyAgICAgICB9XG4vLyAgICAgICBlbHNlIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCB0byB1cGxvYWRGb2xpbzogJyArIG5hbWUpO1xuLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyB9XG5cbi8vIExpbWl0IGZpbGVuYW1lIGxlbmd0aFxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcsIG1heExlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2h1bmtMZW4gPSBNYXRoLmZsb29yKG1heExlbiAvIDIpO1xuICBjb25zdCBsZW4gPSBmaWxlbmFtZS5sZW5ndGg7XG4gIGlmIChsZW4gPD0gbWF4TGVuKSByZXR1cm4gZmlsZW5hbWU7XG4gIGVsc2VcbiAgICByZXR1cm4gYCR7ZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGNodW5rTGVuIC0gMSl9Li4uJHtmaWxlbmFtZS5zdWJzdHJpbmcoXG4gICAgICBsZW4gLSBjaHVua0xlbiArIDIsXG4gICAgICBsZW4sXG4gICAgKX1gO1xufVxuXG4vLyBSZW5hbWVzIGZpbGUgaWYgdGhlcmUgYXJlIG5hbWluZyBjb25mbGljdHMsIGluIHRoZSBmb3JtIG9mICdmb29iYXIgKDEpJ1xuZXhwb3J0IGZ1bmN0aW9uIGZuQ29uZmxpY3RIYW5kbGVyKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBleGlzdGluZ05hbWVzOiBzdHJpbmdbXSxcbik6IHN0cmluZyB7XG4gIGxldCBuZXdGaWxlbmFtZSA9IGZpbGVuYW1lO1xuICBsZXQgY291bnRlciA9IDE7XG5cbiAgd2hpbGUgKGV4aXN0aW5nTmFtZXMuaW5jbHVkZXMobmV3RmlsZW5hbWUpKSB7XG4gICAgbmV3RmlsZW5hbWUgPSBgJHtmaWxlbmFtZX0oJHtjb3VudGVyfSlgO1xuICAgIGNvdW50ZXIrKztcbiAgfVxuICByZXR1cm4gbmV3RmlsZW5hbWU7XG59XG4iLCJpbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi91dGlscy9yYW5kb20nO1xuaW1wb3J0ICogYXMgdmtiZWF1dGlmeSBmcm9tICd2a2JlYXV0aWZ5JztcblxuLyoqXG4gKiBNYW5hZ2VyIGZvciBmaWxlIHVwbG9hZGluZyBhbmQgcGFpcmluZyBwcm9jZXNzXG4gKi9cbmNsYXNzIFVwbG9hZEZpbGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVwbG9hZEZpbGVNYW5hZ2VyO1xuXG4gIHByaXZhdGUgYWxsRmlsZXMgPSBuZXcgTWFwPHN0cmluZywge2ZpbGU6IEZpbGUsIGNvdW50OiBudW1iZXJ9PigpO1xuICBwcml2YXRlIGZvbGlvcyA9IG5ldyBBcnJheTxmb2xpbz4oKTsgLy8gZmlsZW5hbWUsIG1laV9maWxlbmFtZSwgaW1hZ2VfZmlsZW5hbWVcbiAgLy8gcHJpdmF0ZSBtYW51c2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgbWVpVGVtcGxhdGU6IHN0cmluZztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXBsb2FkRmlsZU1hbmFnZXIge1xuICAgIGlmICghVXBsb2FkRmlsZU1hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgIFVwbG9hZEZpbGVNYW5hZ2VyLmluc3RhbmNlID0gbmV3IFVwbG9hZEZpbGVNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBVcGxvYWRGaWxlTWFuYWdlci5pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXMuaGFzKGZpbGUubmFtZSkpIHtcbiAgICAgIGNvbnN0IG5ld0VudHJ5ID0geyBmaWxlOiBmaWxlLCBjb3VudDogMSB9O1xuICAgICAgdGhpcy5hbGxGaWxlcy5zZXQoZmlsZS5uYW1lLCBuZXdFbnRyeSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGZpbGUubmFtZSk7XG4gICAgICBjb25zdCB1cGRhdGVkRW50cnkgPSB7IGZpbGU6IGZpbGUsIGNvdW50OiBleGlzdGluZ0NvdW50KzEgfTtcbiAgICAgIHRoaXMuYWxsRmlsZXMuc2V0KGZpbGUubmFtZSwgdXBkYXRlZEVudHJ5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0TWVpVGVtcGxhdGUodGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0ZW1wbGF0ZVBhdGgpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIE1FSSB0ZW1wbGF0ZSBmcm9tICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1laVRlbXBsYXRlID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlTWVpRmlsZShmaWxlbmFtZTogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc3RhZmZTcGFjZTogbnVtYmVyKTogRmlsZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5tZWlUZW1wbGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIE1FSSB0ZW1wbGF0ZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcbiAgICAgIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGhpcy5tZWlUZW1wbGF0ZSwgJ3RleHQveG1sJyk7XG4gICAgICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICBjb25zdCBtZWlIZWFkID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ21laUhlYWQnKTtcbiAgICAgIG1laUhlYWQuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgZmlsZURlc2MgPSBtZWkucXVlcnlTZWxlY3RvcignZmlsZURlc2MnKTtcbiAgICAgIGZpbGVEZXNjLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHRpdGxlU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZVN0bXQnKTtcbiAgICAgIHRpdGxlU3RtdC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCB0aXRsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICAgICAgdGl0bGUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3QgcHViU3RtdCA9IG1laS5xdWVyeVNlbGVjdG9yKCdwdWJTdG10Jyk7XG4gICAgICBwdWJTdG10LnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IGZhY3NpbWlsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdmYWNzaW1pbGUnKTtcbiAgICAgIGZhY3NpbWlsZS5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdXJmYWNlID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N1cmZhY2UnKTtcbiAgICAgIGNvbnN0IHN1cmZhY2VJZCA9ICdtLScgKyB1dWlkdjQoKTtcbiAgICAgIHN1cmZhY2Uuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCBzdXJmYWNlSWQpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeCcsIHdpZHRoLnRvU3RyaW5nKCkpO1xuICAgICAgc3VyZmFjZS5zZXRBdHRyaWJ1dGUoJ2xyeScsIGhlaWdodC50b1N0cmluZygpKTtcbiAgICAgIFxuICAgICAgY29uc3Qgem9uZSA9IG1laS5xdWVyeVNlbGVjdG9yKCd6b25lJyk7XG4gICAgICBjb25zdCB6b25lSWQgPSAnbS0nICsgdXVpZHY0KCk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgem9uZUlkKTtcbiAgICAgIGNvbnN0IG1hcmdpblJhdGVWID0gMC4xO1xuICAgICAgY29uc3QgbWFyZ2luUmF0ZUggPSAwLjE1O1xuICAgICAgY29uc3QgbWFyZ2luViA9IE1hdGgucm91bmQobWFyZ2luUmF0ZVYgKiB3aWR0aCk7XG4gICAgICBjb25zdCBtYXJnaW5IID0gTWF0aC5yb3VuZChtYXJnaW5SYXRlSCAqIHdpZHRoKTtcbiAgICAgIHpvbmUuc2V0QXR0cmlidXRlKCd1bHgnLCBtYXJnaW5ILnRvU3RyaW5nKCkpO1xuICAgICAgem9uZS5zZXRBdHRyaWJ1dGUoJ3VseScsIG1hcmdpblYudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ4JywgKHdpZHRoIC0gbWFyZ2luSCkudG9TdHJpbmcoKSk7XG4gICAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ5JywgKG1hcmdpblYgKyAzICogc3RhZmZTcGFjZSkudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IG1kaXYgPSBtZWkucXVlcnlTZWxlY3RvcignbWRpdicpO1xuICAgICAgbWRpdi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzY29yZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdzY29yZScpO1xuICAgICAgc2NvcmUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2NvcmVEZWYgPSBtZWkucXVlcnlTZWxlY3Rvcignc2NvcmVEZWYnKTtcbiAgICAgIHNjb3JlRGVmLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHN0YWZmR3JwID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N0YWZmR3JwJyk7XG4gICAgICBzdGFmZkdycC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBjb25zdCBzdGFmZkRlZiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzdGFmZkRlZicpO1xuICAgICAgc3RhZmZEZWYuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IG1laS5xdWVyeVNlbGVjdG9yKCdzZWN0aW9uJyk7XG4gICAgICBzZWN0aW9uLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIGNvbnN0IHBiID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3BiJyk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICBwYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCAnIycgKyBzdXJmYWNlSWQpO1xuICAgICAgY29uc3Qgc2IgPSBtZWkucXVlcnlTZWxlY3Rvcignc2InKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgIHNiLnNldEF0dHJpYnV0ZSgnZmFjcycsICcjJyArIHpvbmVJZCk7XG5cbiAgICAgIGNvbnN0IG1laUZpbGVDb250ZW50ID0gdmtiZWF1dGlmeS54bWwoc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhtZWlEb2MpKTtcbiAgICAgIGNvbnN0IG1laUJsb2IgPSBuZXcgQmxvYihbbWVpRmlsZUNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgRmlsZShbbWVpQmxvYl0sIGZpbGVuYW1lLCB7IHR5cGU6ICd0ZXh0L3htbCcgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSBcblxuICBwdWJsaWMgZ2V0SW1nRGltZW5zaW9uKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIsIHN0YWZmU3BhY2U6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZ0ZpbGUgPSB0aGlzLmdldEZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICBpZiAoIWltZ0ZpbGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKCFjdHgpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgMkQgY29udGV4dCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXG4gICAgICAgICAgLy8gQmluYXJpemF0aW9uXG4gICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgIGNvbnN0IGJpbmFyeVRocmVzaG9sZCA9IDEyNztcbiAgICAgICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgICBjb25zdCBncmF5c2NhbGUgPSAoZGF0YVtpXSArIGRhdGFbaSArIDFdICsgZGF0YVtpICsgMl0pIC8gMztcbiAgICAgICAgICAgIGNvbnN0IGJpbmFyeVZhbHVlID0gZ3JheXNjYWxlIDwgYmluYXJ5VGhyZXNob2xkID8gMCA6IDI1NTtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBiaW5hcnlWYWx1ZTtcbiAgICAgICAgICAgIGRhdGFbaSArIDFdID0gYmluYXJ5VmFsdWU7XG4gICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJpbmFyeVZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG5cbiAgICAgICAgICAvLyBGaW5kaW5nIHN0YWZmIHNwYWNlXG4gICAgICAgICAgY29uc3Qgd2hpdGVSdW5MZW5ndGhzOiBudW1iZXJbXSA9IFtdOyAgXG4gICAgICAgICAgbGV0IGN1cnJTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNhbnZhcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAvLyBuZXcgY3VyclNwYWNlQ291bnQgZm9yIGV2ZXJ5IGNvbHVtblxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gY3R4LmdldEltYWdlRGF0YSh4LCAwLCAxLCBjYW52YXMuaGVpZ2h0KS5kYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBjb2x1bW4ubGVuZ3RoOyBwICs9IDQpIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpeGVsIGlzIGJsYWNrICgwKSBvciB3aGl0ZSAoMjU1KVxuICAgICAgICAgICAgICBpZiAoY29sdW1uW3BdID09PSAwICYmIGN1cnJTcGFjZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHdoaXRlUnVuTGVuZ3Rocy5wdXNoKGN1cnJTcGFjZUNvdW50KTtcbiAgICAgICAgICAgICAgICBjdXJyU3BhY2VDb3VudCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclNwYWNlQ291bnQrKztcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNlY29uZCBtb3N0IGNvbW1vbiB2YWx1ZSBhcyBzdGFmZiBzcGFjZVxuICAgICAgICAgIGNvbnN0IHN0YWZmU3BhY2UgPSB3aGl0ZVJ1bkxlbmd0aHMubGVuZ3RoID4gMCA/IHRoaXMuZmluZFNlY29uZE1vZGUod2hpdGVSdW5MZW5ndGhzKSA6IDA7XG5cbiAgICAgICAgICByZXNvbHZlKHsgd2lkdGg6IGltZy53aWR0aCwgaGVpZ2h0OiBpbWcuaGVpZ2h0LCBzdGFmZlNwYWNlOiAgc3RhZmZTcGFjZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgaW1hZ2U6ICR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICB9O1xuICAgICAgICBpbWcuc3JjID0gZXZlbnQudGFyZ2V0LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICB9O1xuXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChpbWdGaWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFNlY29uZE1vZGUoYXJyOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgY29uc3QgY291bnRNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBDb3VudCBvY2N1cnJlbmNlcyBvZiBlYWNoIGVsZW1lbnRcbiAgICBhcnIuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGNvdW50ID0gKGNvdW50TWFwLmdldChlbGVtZW50KSB8fCAwKSArIDE7XG4gICAgICBjb3VudE1hcC5zZXQoZWxlbWVudCwgY291bnQpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc29ydGVkTWFwID0gQXJyYXkuZnJvbShjb3VudE1hcC5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+IGJbMV0gLSBhWzFdKTtcblxuICAgIHJldHVybiBzb3J0ZWRNYXBbMV1bMF07XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRGaWxlKGtleTogc3RyaW5nKTogRmlsZSB7XG4gICAgaWYgKHRoaXMuYWxsRmlsZXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZ2V0RmlsZUNvdW50KGtleSk7XG4gICAgaWYgKGNvdW50ID09PSAwKSByZXR1cm47XG4gICAgZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgIHRoaXMuYWxsRmlsZXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdXBkYXRlZEVudHJ5ID0geyBmaWxlOiB0aGlzLmFsbEZpbGVzLmdldChrZXkpLmZpbGUsIGNvdW50OiBjb3VudC0xIH07XG4gICAgICB0aGlzLmFsbEZpbGVzLnNldChrZXksIHVwZGF0ZWRFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEZpbGVDb3VudChrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCB0aGlzLmFsbEZpbGVzLmhhcyhrZXkpICkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxsRmlsZXMuZ2V0KGtleSkuY291bnQ7XG4gICAgfVxuICAgIGVsc2UgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgYWRkRm9saW8obmFtZTogc3RyaW5nLCBtZWk6IHN0cmluZywgaW1hZ2U6IHN0cmluZywgaXNDcmVhdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV3Rm9saW86IGZvbGlvID0ge1xuICAgICAgZmlsZW5hbWU6IG5hbWUsXG4gICAgICBtZWlfZmlsZW5hbWU6IG1laSxcbiAgICAgIGltYWdlX2ZpbGVuYW1lOiBpbWFnZSxcbiAgICAgIGlzQ3JlYXRlZDogaXNDcmVhdGVkLFxuICAgIH07XG4gICAgdGhpcy5mb2xpb3MucHVzaChuZXdGb2xpbyk7XG4gIH1cblxuICAvLyBwdWJsaWMgYWRkTWFudXNjcmlwdChmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vICAgdGhpcy5tYW51c2NyaXB0cy5wdXNoKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBpc0NyZWF0ZWRGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9saW8gPSB0aGlzLmZvbGlvcy5maW5kKChmb2xpbykgPT4gZm9saW8uZmlsZW5hbWUgPT09IGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZm9saW8gPyBmb2xpby5pc0NyZWF0ZWQgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGb2xpbyhmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5mb2xpb3MuZmluZEluZGV4KCBmb2xpbyA9PiBmb2xpby5maWxlbmFtZSA9PT0gZmlsZW5hbWUpO1xuICAgIHRoaXMuZm9saW9zLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgLy8gcHVibGljIHJlbW92ZU1hbnVzY3JpcHQoZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAvLyAgIGNvbnN0IGlkeCA9IHRoaXMubWFudXNjcmlwdHMuZmluZEluZGV4KG1hbnVzY3JpcHQgPT4gbWFudXNjcmlwdCA9PT0gZmlsZW5hbWUpO1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuc3BsaWNlKGlkeCk7XG4gIC8vICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBnZXRGb2xpb3MoKTogW3N0cmluZywgRmlsZSwgRmlsZV1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9saW9zLm1hcCggZm9saW8gPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBmb2xpby5maWxlbmFtZTtcbiAgICAgIGNvbnN0IG1laV9maWxlbmFtZSA9IGZvbGlvLm1laV9maWxlbmFtZTtcbiAgICAgIGNvbnN0IGltYWdlX2ZpbGVuYW1lID0gZm9saW8uaW1hZ2VfZmlsZW5hbWU7XG4gICAgICByZXR1cm4gW2ZpbGVuYW1lLCB0aGlzLmdldEZpbGUobWVpX2ZpbGVuYW1lKSwgdGhpcy5nZXRGaWxlKGltYWdlX2ZpbGVuYW1lKV07XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0TWFudXNjcmlwdHMoKTogRmlsZVtdIHtcbiAgLy8gICByZXR1cm4gdGhpcy5tYW51c2NyaXB0cy5tYXAoIG1hbnVzY3JpcHQgPT4gdGhpcy5nZXRGaWxlKG1hbnVzY3JpcHQpKTtcbiAgLy8gfVxuXG4gIC8vIHB1YmxpYyBjbGVhck1hbnVzY3JpcHRzKCk6IHZvaWQge1xuICAvLyAgIHRoaXMubWFudXNjcmlwdHMuZm9yRWFjaCggZmlsZW5hbWUgPT4ge1xuICAvLyAgICAgdGhpcy5yZW1vdmVGaWxlKGZpbGVuYW1lKTtcbiAgLy8gICB9KTtcbiAgLy8gICB0aGlzLm1hbnVzY3JpcHRzID0gW107XG4gIC8vIH1cbiAgXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFsbEZpbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5mb2xpb3Muc3BsaWNlKDApO1xuICB9XG5cbiAgcHVibGljIHByaW50KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHRoaXMuYWxsRmlsZXMpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZm9saW9zKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm1hbnVzY3JpcHRzKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVcGxvYWRGaWxlTWFuYWdlcjtcblxudHlwZSBmb2xpbyA9IHtcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgbWVpX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGltYWdlX2ZpbGVuYW1lOiBzdHJpbmcsXG4gIGlzQ3JlYXRlZDogYm9vbGVhbixcbn07IiwiLy8gSWYgdXNlciByaWdodC1jbGlja3Mgb24gYmFja2dyb3VuZCBhbmQgbm90aGluZyBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS11cGxvYWQtZG9jLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5VcGxvYWQgZG9jdW1lbnQ8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9uZXctZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1uZXctZm9sZGVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5OZXcgZm9sZGVyPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbmV3LWZvbGRlci5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBhIHNpbmdsZSBmaWxlIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3Qgc2luZ2xlRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmaWxlcyBhcmUgc2VsZWN0ZWRcbmV4cG9ydCBjb25zdCBtdWx0aUZpbGVPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1vcGVuLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5PcGVuPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvb3Blbi1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZSB0byBUcmFzaDwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImNtLW1vdmUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk1vdmU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9tb3ZlLWRvYy1pY29uLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIDEgb3IgbW9yZSBmaWxlcyBhbmQgMSBvciBtb3JlIGZvbGRlcnMgYXJlIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgZm9sZGVyQW5kRmlsZU9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLXJlbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RGVsZXRlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgb25lIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHNpbmdsZUZvbGRlck9wdGlvbnMgPSBcbiAgICBgPGRpdiBpZD1cImNtLW9wZW4tYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPk9wZW48L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9vcGVuLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tcmVuYW1lLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5SZW5hbWU8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW5hbWUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1tb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbW92ZS1kb2MtaWNvbi5zdmdcIj5cbiAgICA8L2Rpdj5gO1xuXG4vLyBJZiBtdWx0aXBsZSBmb2xkZXJzIGFyZSBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IG11bHRpRm9sZGVyT3B0aW9ucyA9IFxuICAgIGA8ZGl2IGlkPVwiY20tcmVtb3ZlLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5Nb3ZlIHRvIFRyYXNoPC9kaXY+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcmVtb3ZlLWRvYy5zdmdcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiY20tbW92ZS1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+TW92ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL21vdmUtZG9jLWljb24uc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuLy8gSWYgdHJhc2ggZm9sZGVyIGlzIHNlbGVjdGVkXG5leHBvcnQgY29uc3QgdHJhc2hGb2xkZXJPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1lbXB0eS10cmFzaC1idG5cIiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCI+RW1wdHkgVHJhc2g8L2Rpdj5cbiAgICAgICAgPGltZyBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9yZW1vdmUtZG9jLnN2Z1wiPlxuICAgIDwvZGl2PmA7XG5cbi8vIElmIGVudHJ5IGluIHRyYXNoIGZvbGRlciBpcyBzZWxlY3RlZFxuZXhwb3J0IGNvbnN0IHRyYXNoRW50cnlPcHRpb25zID0gXG4gICAgYDxkaXYgaWQ9XCJjbS1yZWNvdmVyLWJ0blwiIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIj5QdXQgQmFjazwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlY292ZXItZG9jLnN2Z1wiPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJjbS1kZWxldGUtYnRuXCIgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiPkRlbGV0ZTwvZGl2PlxuICAgICAgICA8aW1nIGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW0taWNvblwiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3JlbW92ZS1kb2Muc3ZnXCI+XG4gICAgPC9kaXY+YDtcblxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/Neon-gh/editor.js b/Neon-gh/editor.js index a5a1f864..641ec80a 100644 --- a/Neon-gh/editor.js +++ b/Neon-gh/editor.js @@ -1,4 +1,4 @@ -!function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=58)}([function(e,t,n){"use strict";var i,r="object"==typeof Reflect?Reflect:null,s=r&&"function"==typeof r.apply?r.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};i=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var o=Number.isNaN||function(e){return e!=e};function a(){a.init.call(this)}e.exports=a,e.exports.once=function(e,t){return new Promise((function(n,i){function r(n){e.removeListener(t,s),i(n)}function s(){"function"==typeof e.removeListener&&e.removeListener("error",r),n([].slice.call(arguments))}v(e,t,s,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&v(e,"error",t,n)}(e,r,{once:!0})}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var c=10;function l(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function u(e){return void 0===e._maxListeners?a.defaultMaxListeners:e._maxListeners}function d(e,t,n,i){var r,s,o,a;if(l(n),void 0===(s=e._events)?(s=e._events=Object.create(null),e._eventsCount=0):(void 0!==s.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),s=e._events),o=s[t]),void 0===o)o=s[t]=n,++e._eventsCount;else if("function"==typeof o?o=s[t]=i?[n,o]:[o,n]:i?o.unshift(n):o.push(n),(r=u(e))>0&&o.length>r&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,console&&console.warn&&console.warn(a)}return e}function h(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function f(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=h.bind(i);return r.listener=n,i.wrapFn=r,r}function g(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var c=r[e];if(void 0===c)return!1;if("function"==typeof c)s(c,this,t);else{var l=c.length,u=m(c,l);for(n=0;n=0;s--)if(n[s]===t||n[s].listener===t){o=n[s].listener,r=s;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},a.prototype.listeners=function(e){return g(this,e,!0)},a.prototype.rawListeners=function(e){return g(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?i(this._events):[]}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){"use strict";var i,r,s,o=[n(37),n(38),n(39),n(40),n(41),n(42)],a=-1,c=[],l=!1;function u(){i&&r&&(i=!1,r.length?c=r.concat(c):a=-1,c.length&&d())}function d(){if(!i){l=!1,i=!0;for(var e=c.length,t=setTimeout(u);e;){for(r=c,c=[];r&&++a1)for(var n=1;ne.classList.remove("no-moving")),document.querySelectorAll(".selected").forEach(e=>{e.classList.remove("selected"),e.classList.contains("staff")?(e.removeAttribute("style"),i.unhighlight(e)):(e.removeAttribute("style"),e.style.fill=""),Array.from(e.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""}),Array.from(e.querySelectorAll(".sylTextRect-display")).forEach(e=>{e.style.fill="blue"}),e.parentElement.classList.contains("syllable-highlighted")&&(e.parentElement.style.fill="",e.parentElement.classList.add("syllable"),e.parentElement.classList.remove("syllable-highlighted"),Array.from(e.parentElement.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.parentElement.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""})),c.selectAll("#resizeRect").remove(),c.selectAll(".resizePoint").remove(),c.selectAll(".rotatePoint").remove()}),Array.from(document.querySelectorAll(".text-select")).forEach(e=>{e.style.color="",e.style.fontWeight="",e.classList.remove("text-select")}),document.getElementById("selByStaff").classList.contains("is-active")?a.endOptionsSelection():s.endGroupingSelection(),document.getElementById("extraEdit").innerHTML="",document.getElementById("extraEdit").parentElement.classList.add("hidden"),(0,r.updateHighlight)()}function d(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),a.triggerSingleStaffActions(),s.initGroupingListeners(),t.dragInit())}function h(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),t.dragInit())}function f(e,t,n=!0){if(e){if(e.classList.contains("staff"))return d(e,t);if(e.classList.contains("layer"))return h(e,t);if(!e.classList.contains("selected")&&!e.classList.contains("sylTextRect")&&!e.classList.contains("sylTextRect-display")){let t;if(e.classList.add("selected"),e.style.fill="#d00",e.style.stroke=e.classList.contains("divLine")?"#d00":"black",e.querySelectorAll(".sylTextRect-display").length&&e.querySelectorAll(".sylTextRect-display").forEach(e=>{e.style.fill="#d00"}),e.querySelectorAll(".divLine").length&&e.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"}),e.classList.contains("syllable")&&e.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),e.classList.contains("syllable")?t=e.id:null!==e.closest(".syllable")&&(t=e.closest(".syllable").id),void 0!==t){document.querySelectorAll("span."+t).forEach(e=>{e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select")})}}n&&(0,r.updateHighlight)()}}async function g(e,t){const n=await t.getElementAttr(e.id,t.view.getCurrentPageURI());return Boolean(n.ligated)}function p(e,t){if(t.length<2)return!1;switch(e){case"selBySyllable":t.forEach(e=>{if(!e.classList.contains("syllable"))return!1});break;case"selByNeume":t.forEach(e=>{if(!e.classList.contains("neume"))return!1});break;case"selByStaff":t.forEach(e=>{if(!e.classList.contains("staff"))return!1});break;default:return!1}return!0}function m(e){const t=Array.from(e),n=t.pop().parentElement.parentElement;for(const e of t){if(e.parentElement.parentElement.id!==n.id)return!1}return!0}function v(e,t,n){const i=e,r=i.closest(".syl");if(!r.classList.contains("selected")){r.classList.add("selected"),i.style.fill="#d00";const s=e.closest(".syllable");s.style.fill="#d00",s.classList.add("syllable-highlighted"),s.querySelectorAll(".divLine").length&&(s.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),s.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"})),void 0!==n&&(0,o.resize)(r,n,t),void 0!==t&&t.dragInit();const a=e.closest(".syllable").id;if(void 0!==a){const e=document.querySelector("span."+a);e&&(e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select"))}}a.triggerBBoxActions()}t.getSelectionType=l,t.unselect=u,t.selectStaff=d,t.selectLayerElement=h,t.select=f,t.selectNcs=async function(e,t,n){if(!e.parentElement.classList.contains("selected")){const i=e.parentElement;if(u(),f(i),await g(i,t)){const e=i.previousSibling;if(await g(e,t))f(e);else{const e=i.nextSibling;await g(e,t)?f(e):console.warn("Error: Neither prev or next nc are ligatures")}s.triggerGrouping("ligature")}else i.classList.contains("nc")?a.triggerNcActions(i):console.warn("No action triggered!");n.dragInit()}},t.isLigature=g,t.areAdjacent=function(e,t){if(t.length<2)return!1;let n;switch(e){case"selBySyllable":n=Array.from(document.querySelectorAll(".syllable"));break;case"selByNeume":return!0;case"selByNc":n=Array.from(document.querySelectorAll(".nc"));break;case"selByStaff":n=Array.from(document.querySelectorAll(".staff"));break;default:return!1}const i=[];for(let e=0;e!(e.classList.contains("divLine")||e.classList.contains("accid")||e.classList.contains("clef")))))return!1;switch(e){case"selBySyllable":const e=t[0].closest(".staff");for(let n=0;n{const o=e.getAttribute("d").match(/\d+/g).map(e=>Number(e));void 0===s&&(s=Math.atan((o[3]-o[1])/(o[2]-o[0]))),(void 0===n||Math.min(o[1],o[3])r)&&(r=Math.max(o[1],o[3])),(void 0===i||o[2]>i)&&(i=o[2])}),{id:e.id,ulx:t,uly:n,lrx:i,lry:r,rotate:s}},t.selectBBox=v,t.selectNn=function(e){return!(e.length>0)||(e.forEach(e=>{f(e)}),!1)},t.selectAll=async function(e,t,n){const i=l();if(u(),0===e.length)return;let r,c=!1,d=!1;switch(i){case"selBySyllable":r=".syllable";break;case"selByNeume":r=".neume";break;case"selByNc":r=".nc";break;case"selByStaff":r=".staff";break;case"selByBBox":r=".sylTextRect-display";break;case"selByLayerElement":r=".clef, .custos, .accid, .divLine";break;default:return void console.error("Unknown selection type "+i)}const h=new Set;for(const t of e){let e=t.closest(r);if(null===e){if(e=t.closest(".clef, .custos, .accid, .divLine"),null===e){console.warn("Element "+t.id+" is not part of specified group and is not a clef or custos or accid or divLine.");continue}c=c||!0}else d=d||!0;h.add(e);let n=e,i=n.getAttribute("mei:follows"),s=n.getAttribute("mei:precedes");for(;i||s;){if(i){if(n=document.querySelector("#"+i.slice(1)),h.has(n))break;n.classList.add("no-moving"),h.add(n),i=n.getAttribute("mei:follows")}if(s){if(n=document.querySelector("#"+s.slice(1)),h.has(n))break;n.classList.add("no-moving"),h.add(n),s=n.getAttribute("mei:precedes")}}}h.forEach(e=>f(e,n,!1));const g=Array.from(h.values());if(!c||d)switch(i){case"selByStaff":switch(g.length){case 1:a.triggerSingleStaffActions(),s.initGroupingListeners(),(0,o.resize)(g[0],t,n);break;default:a.triggerMultiStaffActions(),s.initGroupingListeners()}break;case"selByLayerElement":1===h.size?a.triggerLayerElementActions(g[0]):a.triggerDefaultActions();break;case"selBySyllable":switch(g.length){case 1:a.triggerSyllableActions("singleSelect");break;default:s.isLinkable("selBySyllable",g)?a.triggerSyllableActions("linkableSelect"):s.isGroupable("selBySyllable",g)?a.triggerSyllableActions("multiSelect"):a.triggerSyllableActions("default")}break;case"selByNeume":switch(g.length){case 1:a.triggerNeumeActions(),s.initGroupingListeners();break;default:s.isGroupable("selByNeume",g)?s.triggerGrouping("neume"):a.triggerDefaultActions()}break;case"selByNc":switch(g.length){case 1:a.triggerNcActions(g[0]);break;case 2:if(m(g)){if(g[0].parentElement===g[1].parentElement){const e=Array.from(g[0].parentElement.children);if(1===Math.abs(e.indexOf(g[0])-e.indexOf(g[1]))){let e=g[0].children[0],t=g[1].children[0],n=e.x.baseVal.value,i=t.x.baseVal.value,r=e.y.baseVal.value,o=t.y.baseVal.value;if((n>i||n===i&&rv(e,n,void 0))}break;default:console.error("Unknown selection type. This should not have occurred.")}else 1===h.size?a.triggerLayerElementActions(g[0]):"selBySyllable"==i?a.triggerDefaultSylActions():a.triggerDefaultActions()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.queueNotification=t.Notification=void 0;const i=n(26),r=n(17),s=new Array(0);let o=null;const a={default:"",warning:"⚠️ ",error:"🔴 ",success:"✅ "};class c{constructor(e,t,n=null){this.message=a[t]+e,this.displayed=!1,this.id=(0,r.uuidv4)(),this.isModeMessage=-1!==e.search("Mode"),this.logInfo=n,this.timeoutID=-1,this.type=t}setTimeoutId(e){this.timeoutID=Math.max(e,-1)}display(){this.displayed=!0}getId(){return this.id}}function l(e){document.getElementById(e)&&document.getElementById(e).remove()}function u(e){!function(e){if(e.isModeMessage){if(null!==o)return void window.clearTimeout(o.timeoutID);o=e}if(s.push(e),s.length>3){l(s.shift().getId())}const t=document.getElementById("notification-content"),n=document.createElement("div");n.classList.add("neon-notification"),n.classList.add("neon-notification-"+e.type),n.id=e.getId(),n.innerHTML=e.message,t.append(n),t.style.display="",e.display()}(e),e.setTimeoutId(window.setTimeout(l,5e3,e.getId())),document.getElementById(e.getId()).addEventListener("click",()=>{window.clearTimeout(e.timeoutID),l(e.getId())})}function d(e,t="default",n=null){const r=new c(e,t,n);"error"!=r.type&&"warning"!=r.type||(0,i.recordNotification)(r),u(r)}t.Notification=c,t.queueNotification=d,t.default={queueNotification:d}},function(e,t,n){"use strict";e.exports=function(e){return function(){var t=arguments.length;if(t){for(var n=[],i=-1;++i\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',groupingTab:'

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',systemTab:'

\n \n

\n

Click upper left and lower right corners of new staff.

'},t.insertControlsPanel='
\n
INSERT
\n \n \n \n
\n\t
\n \n
',t.editControlsPanel='
\n
EDIT
\n \n \n \n
\n
\n
\n
\n
Selection Mode:
\n
\n\n \n \n \n \n \n\n
\n
\n
\n\n
\n \n \n \x3c!--\n * The extraEdit panel is added for edit options that have dropdown menus\n * Like the Neume and Clef menus\n * This is done because the moreEdit menu needs to have overflow for cases where it has lots of buttons\n * But overflow ruins dropdown menus\n --\x3e\n \n
\n
\n
\n
\n
',t.ncActionContents='\n ',t.defaultNeumeActionContents='
\n \n \n
',t.neumeActionContents='\n
\n \n ',t.defaultActionContents='
\n \n
',t.defaultSylActionContents='\n ',t.custosActionContents='
\n \n \n
',t.layerElementOutActionContents='
\n \n \n \n
',t.layerElementInActionContents='
\n \n \n \n
',t.accidActionContents='\n ',t.staffSplitActionContents='
Split System:
\n
\n \n \n \n
',t.staffMergeActionContents='\n
\n \n \n
',t.columnActionContents='
\n Edit Column Information:\n
\n \n \n \n \n
\n
\n
',t.clefActionContents='\n
\n \n \n
\n ',t.divLineActionContents='\n',t.bboxActionContents='
\n \n \n
',t.groupingMenu={nc:'
\n
\n \n \n
\n
',neume:'
\n
\n \n \n
\n
',syl:'
\n
\n \n \n \n
\n\t\t
',ligatureNc:'
\n
\n \n \n \n
\n
',ligature:'
\n
\n \n \n
\n
',splitSyllable:'
\n
\n \n \n
\n
'},t.editTextModal='
\n \n \n
\n
Cancel
\n
Save
\n
\n
',t.hotkeysModal='\n
\n \x3c!-- "Display" hotkeys --\x3e\n
\n
Display
\n
\n
\n
Shift
\n
+
\n
+
\n
\n
Zoom In
\n
\n
\n
\n
Shift
\n
+
\n
-
\n
\n
Zoom Out
\n
\n
\n
\n
0
\n
\n
Zoom Reset
\n
\n
\n
\n
h
\n
\n
Hide Glyph
\n
\n
\n
\n
Shift
\n
+
\n
T
\n
\n
Scroll To Syllable Text
\n
\n
\n\n \x3c!-- "Edit" hotkeys --\x3e\n
\n
Edit
\n
\n
\n
Ctrl
\n
+
\n
z
\n
or
\n
\n
+
\n
z
\n
\n
Undo
\n
\n
\n
\n
Ctrl
\n
+
\n
Shift
\n
+
\n
z
\n
or
\n
\n
+
\n
Shift
\n
+
\n
z
\n
\n
Redo
\n
\n
\n
\n
q/w/e/r/t/y
\n
\n
\n Highlight by Staff/Syllable/Neume/LayerElement/Selection/Off\n
\n
\n
\n
\n
1/2/3/4/5/6
\n
\n
\n Select by Syllable/Neume/Neume Component/Staff/Layer Element/BBox\n
\n
\n
\n
\n
Shift
\n
+
\n
Number
\n
\n
\n Begin Insert for the nth Option in the Selected Tab\n
\n
\n
\n
\n
g
\n
\n
\n Group/Ungroup Selected Element(s)\n
\n
\n
\n\n \x3c!-- "Other" hotkeys --\x3e\n
\n
Other
\n
\n
\n
s
\n
\n
Save File
\n
\n
\n
\n
Esc
\n
\n
Return to Edit Mode
\n
\n
\n
',t.syllableActionsContent='\n
\n \n \n \n \n
\n',t.errorLogsPanelContents='
\n
Error Log
\n \n \n \n
\n
'},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";for(var i=n(11),r=[],s=0;s<256;++s)r.push((s+256).toString(16).substr(1));t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!Object(i.a)(n))throw TypeError("Stringified UUID is invalid");return n}},function(e,t,n){"use strict";var i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.a=function(e){return"string"==typeof e&&i.test(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initDisplayControls=t.loadHighlightSettings=t.updateDisplayAllBtn=t.updateHighlight=t.setHighlightSelectionControls=t.setHighlightControls=t.setHighlightOption=t.getHighlightType=t.setCircleSizeControls=t.setBgOpacityFromSlider=t.setGlyphOpacityFromSlider=t.setZoomControls=void 0;const i=n(18),r=n(3),s=n(7);let o,a,c;function l(e){const t=document.getElementById("opacityOutput");document.getElementById("opacitySlider").value=t.value,(0,r.setSettings)({glyphOpacity:Number(t.value)});const n=document.querySelector("#toggle-glyph-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show glyph")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide glyph"));try{document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=(Number(t.value)/100).toString()})}catch(e){console.warn("Unable to properly set opacity to pages")}}function u(e){const t=document.querySelector("#bgOpacityOutput");(0,r.setSettings)({imageOpacity:Number(t.value)});const n=document.querySelector("#toggle-bg-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show background image")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide background image"));const i=document.querySelector("."+e);i&&(i.style.opacity=String(Number(t.value)/100))}function d(e){const t=document.getElementById("highlight-"+e),n=document.getElementById("highlight-dropdown"),s=document.getElementById("highlight-type");if((0,r.setSettings)({highlightMode:e}),n.classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),"none"===e)return s.textContent=" - Off",void i.unsetGroupingHighlight();t.classList.add("highlight-selected"),s.textContent=" - "+(e[0].toUpperCase()+e.slice(1)),i.setGroupingHighlight(e)}function h(e){document.getElementById("highlight-"+e).addEventListener("click",()=>{d(e)})}function f(){document.body.removeEventListener("click",f),document.getElementById("highlight-dropdown").classList.remove("is-active")}function g(){const e=document.getElementById("highlight-dropdown");document.getElementById("highlight-button").addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("is-active"),e.classList.contains("is-active")?(document.body.addEventListener("click",f),h("column"),h("staff"),h("syllable"),h("neume"),h("layerElement"),h("none")):document.body.removeEventListener("click",f)})}function p(){const{highlightMode:e}=(0,r.getSettings)();d(e)}t.setZoomControls=function(e){if(void 0===e)return;const t=document.getElementById("zoomSlider"),n=document.getElementById("zoomOutput"),{zoom:i}=(0,r.getSettings)();t.value=String(i),n.value=String(i),e.zoomTo(i/100),document.getElementById("reset-zoom").addEventListener("click",()=>{n.value="100",t.value="100",e.resetZoomAndPan()}),document.querySelector("#set-zoom-easy-edit").addEventListener("click",()=>{n.value="180",t.value="180",e.zoomTo(1.8)}),t.addEventListener("mouseup",(function(){n.value=t.value,e.zoomTo(Number(n.value)/100)})),t.disabled=!1,document.body.addEventListener("keydown",i=>{const r=parseInt(n.value);if("ArrowUp"===i.key||"ArrowDown"===i.key||"ArrowRight"===i.key||"ArrowLeft"===i.key)i.preventDefault();else if("+"===i.key){const i=Math.min(r+20,parseInt(t.getAttribute("max")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else if("_"===i.key){const i=Math.max(r-20,parseInt(t.getAttribute("min")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else"0"===i.key&&(n.value="100",t.value="100",e.resetZoomAndPan())})},t.setGlyphOpacityFromSlider=l,t.setBgOpacityFromSlider=u,t.setCircleSizeControls=function(){const e=document.getElementById("circleSlider"),t=document.getElementById("circleOutput"),{circleSize:n}=(0,r.getSettings)();function i(){t.value=e.value,c=Number(e.value),(0,r.setSettings)({circleSize:Number(c)});const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",c)}c=n,e.value=String(n),t.value=String(n),document.getElementById("reset-circle-size").addEventListener("click",()=>{const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",25),c=Number(25),e.value=String(25),t.value=String(25),(0,r.setSettings)({circleSize:Number(25)}),i()}),e.addEventListener("input",i),e.addEventListener("change",i),e.disabled=!1},t.getHighlightType=function(){return document.getElementById("highlight-type").textContent.slice(3).toLowerCase()},t.setHighlightOption=h,t.setHighlightControls=g,t.setHighlightSelectionControls=function(){const e=document.getElementById("highlight-selection");e.addEventListener("click",()=>{document.getElementById("highlight-dropdown").classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),e.classList.add("highlight-selected"),document.getElementById("highlight-type").textContent=" - Selection",i.setGroupingHighlight("selection")})},t.updateHighlight=function(){let e;try{e=document.querySelector(".highlight-selected").id}catch(t){e=""}switch(e){case"highlight-column":i.setGroupingHighlight("column");break;case"highlight-staff":i.setGroupingHighlight("staff");break;case"highlight-syllable":i.setGroupingHighlight("syllable");break;case"highlight-neume":i.setGroupingHighlight("neume");break;case"highlight-layerElement":i.setGroupingHighlight("layerElement");break;case"highlight-selection":i.setGroupingHighlight("selection");break;default:i.unsetGroupingHighlight()}},t.updateDisplayAllBtn=function(){const e=document.getElementById("display-all-btn"),t=document.getElementById("displayInfo"),n=document.getElementById("displayBBox"),i=document.getElementById("displayText"),r=document.getElementById("display-errors");(null==t?void 0:t.checked)&&(null==n?void 0:n.checked)&&(null==i?void 0:i.checked)&&(null==r?void 0:r.checked)?(e.classList.add("selected"),e.innerHTML="Hide All"):e.classList.contains("selected")&&(e.classList.remove("selected"),e.innerHTML="Display All")},t.loadHighlightSettings=p,t.initDisplayControls=function(e,t){!function(e){const t=document.getElementById("opacitySlider"),n=document.getElementById("opacityOutput"),{glyphOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,o=Number(t.value),l(e)}o=i,t.value=String(i),n.value=String(i);const a=document.getElementById("toggle-glyph-opacity");100==i&&a.classList.add("hide-icon"),null==a||a.addEventListener("click",()=>{let i;a.classList.contains("hide-icon")?(a.classList.remove("hide-icon"),i=0):(a.classList.add("hide-icon"),i=1),document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=i.toString()}),o=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({glyphOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(e),function(e){const t=document.getElementById("bgOpacitySlider"),n=document.getElementById("bgOpacityOutput"),{imageOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,a=Number(t.value),u(e)}a=i,t.value=String(i),n.value=String(i);const o=document.getElementById("toggle-bg-opacity");100==i&&o.classList.add("hide-icon"),o.addEventListener("click",()=>{let i;o.classList.contains("hide-icon")?(o.classList.remove("hide-icon"),i=0):(o.classList.add("hide-icon"),i=1),document.getElementsByClassName(e)[0].style.opacity=i.toString(),a=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({imageOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(t),g(),document.getElementById("burgerMenu").addEventListener("click",()=>{document.getElementById("burgerMenu").classList.toggle("is-active"),document.getElementById("navMenu").classList.toggle("is-active")}),document.body.addEventListener("keydown",e=>{if(!e.metaKey)switch(e.key){case"q":d("staff");break;case"w":d("syllable");break;case"e":d("neume");break;case"r":d("layerElement");break;case"t":d("selection");break;case"y":d("none")}}),function(){const e=document.querySelector("#display-all-btn");e.addEventListener("click",()=>{if(e.classList.contains("selected")){e.classList.remove("selected"),e.innerHTML="Display All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked&&e.click()})}else{e.classList.add("selected"),e.innerHTML="Hide All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked||e.click()})}})}(),p();const n=document.getElementById("displayContents"),i=document.getElementById("toggleDisplay");document.getElementById("displayHeader").addEventListener("click",e=>{e.stopPropagation(),n.classList.contains("closed")?(n.classList.remove("closed"),n.style.padding="0.5em 0.75em",setTimeout(()=>{n.style.overflow="visible"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(n.classList.add("closed"),n.style.overflow="hidden",setTimeout(()=>{n.style.padding="0px"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalWindow=t.ModalWindowView=void 0;const i=n(8),r=n(33),s=n(4);var o,a;!function(e){e[e.EDIT_TEXT=0]="EDIT_TEXT",e[e.HOTKEYS=1]="HOTKEYS",e[e.ERROR_LOG=2]="ERROR_LOG",e[e.DOCUMENT_UPLOAD=3]="DOCUMENT_UPLOAD",e[e.MOVE_TO=4]="MOVE_TO",e[e.NEW_FOLDER=5]="NEW_FOLDER",e[e.RENAME=6]="RENAME"}(o=t.ModalWindowView||(t.ModalWindowView={})),function(e){e[e.OPEN=0]="OPEN",e[e.CLOSED=1]="CLOSED"}(a||(a={}));t.ModalWindow=class{constructor(e){this.openEditSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-save").removeEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-save").addEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.updateSylText=function(){const e=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0],t=e.textContent.replace(/\u{25CA}/u,"").trim(),n=document.getElementById("neon-modal-window-edit-text-input").value;if(null!==n&&n!==t){const t={action:"setText",param:{elementId:[...e.classList.entries()].filter(e=>"text-select"!==e[1]&&"selected-to-edit"!==e[1])[0][1],text:n}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(t=>{t&&this.neonView.updateForCurrentPage().then(()=>{this.updateSelectedBBox(e,this.dragHandler,this.neonView)})})}else this.updateSelectedBBox(e,this.dragHandler,this.neonView);this.hideModalWindow()},this.keydownListener=function(e){switch(e.stopImmediatePropagation(),this.modalWindowView){case o.EDIT_TEXT:"Enter"===e.key&&this.updateSylText();default:"Escape"===e.key&&this.hideModalWindow()}},this.focusModalWindow=function(){switch(this.modalWindowView){case o.EDIT_TEXT:document.getElementById("neon-modal-window-edit-text-input").select();break;case o.DOCUMENT_UPLOAD:case o.NEW_FOLDER:case o.RENAME:break;default:document.getElementById("neon-modal-window").focus()}},this.neonView=e,this.modalWindowState=a.CLOSED,this.setupEventListeners()}setupEventListeners(){document.getElementById("neon-modal-window-header-close").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").addEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").addEventListener("click",this.focusModalWindow.bind(this))}removeEventListeners(){document.getElementById("neon-modal-window-header-close").removeEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").removeEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").removeEventListener("click",this.focusModalWindow.bind(this))}setModalWindowView(e,t){this.modalWindowView=e,this.setModalWindowContent(t)}getModalWindowView(){return this.modalWindowView.toString()}openModalWindow(){switch(Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),this.modalWindowView){case o.EDIT_TEXT:this.openEditSylTextModalWindow();break;case o.HOTKEYS:document.getElementById("neon-modal-window-content-hotkeys").classList.add("visible");case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:default:document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()}document.body.style.overflowX="hidden",document.body.style.overflowY="hidden",this.modalWindowState=a.OPEN}hideModalWindow(){switch(this.modalWindowView){case o.EDIT_TEXT:document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].classList.remove("selected-to-edit");break;case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:document.getElementById("neon-modal-window-content-container").innerHTML=""}document.getElementById("neon-modal-window-container").style.display="none",document.body.style.overflowX="hidden",document.body.style.overflowY="scroll",this.modalWindowState=a.CLOSED,this.removeEventListeners()}setModalWindowContent(e){const t=document.getElementById("neon-modal-window-content-container"),n=document.getElementById("neon-modal-window-header-title");switch(this.modalWindowView){case o.EDIT_TEXT:t.innerHTML=i.editTextModal,n.innerText="EDIT SYLLABLE TEXT";const s=/\u{25CA}/u,a=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].textContent.replace(s,"").trim();document.getElementById("neon-modal-window-edit-text-input").value=a;break;case o.HOTKEYS:t.innerHTML=i.hotkeysModal,n.innerText="HOTKEYS";break;case o.ERROR_LOG:t.innerHTML=`
${e}
\n `,n.innerText="ERROR LOG";break;case o.DOCUMENT_UPLOAD:n.innerText="DOCUMENT UPLOAD",t.innerHTML=r.uploadAreaHTML;break;case o.MOVE_TO:n.innerText="MOVE TO";break;case o.NEW_FOLDER:n.innerText="NEW FOLDER",t.innerHTML=r.newFolderHTML;break;case o.RENAME:n.innerText="RENAME",t.innerHTML=r.renameHTML;break;default:console.error("Unknown selection type. This should not have occurred.")}}updateSelectedBBox(e,t,n){(0,s.unselect)();const i=Array.from(e.classList).find(e=>"text-select"!==e&&"selected-to-edit"!==e);if(document.getElementById("displayBBox").checked&&document.getElementById(i)){const e=document.getElementById(i).querySelector(".sylTextRect-display");(0,s.selectBBox)(e,t,n)}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.triggerDefaultActions=t.triggerDefaultSylActions=t.triggerBBoxActions=t.triggerSingleStaffActions=t.triggerStaffSplitMode=t.triggerMultiStaffActions=t.triggerLayerElementActions=t.triggerSyllableActions=t.triggerNeumeActions=t.triggerNcActions=t.addChangeStaffListener=t.matchHeightHandler=t.moveOutsideSyllableHandler=t.insertToSyllableHandler=t.changeStaffHandler=t.removeHandler=t.endOptionsSelection=t.deleteButtonHandler=t.unsetLiquescentAnticlockwiseAction=t.unsetLiquescentClockwiseAction=t.unsetVirgaReversedAction=t.unsetVirgaAction=t.unsetInclinatumAction=t.initNeonView=void 0;const i=n(8),r=n(24),s=n(5),o=n(35),a=n(36),c=n(4);let l;function u(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function d(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function h(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function f(e){return{action:"set",param:{elementId:e,attrType:"curve",attrValue:""}}}function g(e){return{action:"setLiquescent",param:{elementId:e,curve:""}}}function p(e){"d"!==e.key&&"Backspace"!==e.key||(v(),e.preventDefault())}function m(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden")),document.body.removeEventListener("keydown",p)}function v(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{t.classList.contains("syl")&&(t=t.closest(".syllable")),t.classList.contains("accid")&&(t=t.closest(".accid")),t.classList.contains("divLine")&&(t=t.closest(".divLine")),e.push({action:"remove",param:{elementId:t.id}})});const t={action:"chain",param:e};m(),l.edit(t,l.view.getCurrentPageURI()).then(()=>{l.updateForCurrentPage()})}function y(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"changeStaff",param:{elementId:t.id}})});const t={action:"chain",param:e};m(),l.edit(t,l.view.getCurrentPageURI()).then(()=>{l.updateForCurrentPage()})}function b(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"insertToSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Insert Success","success"):s.default.queueNotification("Insert Failed XoX","error"),m(),l.updateForCurrentPage()})}function w(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"moveOutsideSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Move Success","success"):s.default.queueNotification("Move Failed XoX","error"),m(),l.updateForCurrentPage()})}function _(){const e=Array.from(document.getElementsByClassName("selected"));e.length>1&&s.default.queueNotification("Cannot match height to multiple bbox","error");const t={action:"matchHeight",param:{elementId:e[0].id}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Height Match Success","success"):s.default.queueNotification("Height Match Failed XoX","error"),m(),l.updateForCurrentPage()})}function E(){const e=document.getElementById("delete");e&&(e.removeEventListener("click",v),e.addEventListener("click",v),document.body.addEventListener("keydown",p))}function S(){const e=document.getElementById("changeStaff");null==e||e.removeEventListener("click",y),null==e||e.addEventListener("click",y)}function x(){const e=document.getElementById("col-input"),t=document.querySelectorAll(".staff.selected");let n;for(const e of t){const t=Array.from(e.classList).join(" ").match(/\bcolumn(\d+)\b/);if(t){const e=parseInt(t[1],10);if(n&&n!=e){document.getElementById("col-warning").innerText="The selected staves are not of the same column!",n=0;break}n=e}}n&&(e.value=n.toString())}function L(){const e=document.getElementById("col-decrement"),t=document.getElementById("col-increment"),n=document.getElementById("col-confirm"),i=document.getElementById("col-input");function r(e){let t=parseInt(i.value,10)||0;t+=e,t=Math.min(Math.max(t,1),5),t.toString()!=i.value&&(n.style.display=""),i.value=t.toString()}e.addEventListener("click",(function(){r(-1)})),t.addEventListener("click",(function(){r(1)})),n.addEventListener("click",(function(){const e=[];document.querySelectorAll(".staff.selected").forEach(t=>{e.push({action:"set",param:{elementId:t.id,attrType:"type",attrValue:"column"+i.value}})});const t={action:"chain",param:e};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Column Value Update Success","success"):s.default.queueNotification("Column Value Update Failed XoX","error"),m(),l.updateForCurrentPage()})}))}function A(e,t,n=!0){const i=document.getElementById(e);i&&(i.parentElement.classList.remove("hidden"),n?i.innerHTML=t:i.innerHTML+=t)}function k(e){l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}function C(){const e=document.querySelector(".staff.selected");if(null!==e){new o.SplitStaffHandler(l,e).startSplit(),m()}else console.error("No staff was selected!"),m()}function I(){document.querySelectorAll(".drop_select").forEach(e=>{const t=()=>{document.body.removeEventListener("click",t),e.classList.remove("is-active")};e.addEventListener("click",n=>{e.classList.toggle("is-active"),Array.from(document.querySelectorAll(".drop_select")).filter(t=>t!==e).forEach(e=>e.classList.remove("is-active")),n.stopPropagation(),e.classList.contains("is-active")?document.body.addEventListener("click",t):document.body.removeEventListener("click",t)})})}t.initNeonView=function(e){l=e,r.initNeonView(e)},t.unsetInclinatumAction=u,t.unsetVirgaAction=d,t.unsetVirgaReversedAction=h,t.unsetLiquescentClockwiseAction=f,t.unsetLiquescentAnticlockwiseAction=g,t.deleteButtonHandler=p,t.endOptionsSelection=m,t.removeHandler=v,t.changeStaffHandler=y,t.insertToSyllableHandler=b,t.moveOutsideSyllableHandler=w,t.matchHeightHandler=_,t.addChangeStaffListener=S,t.triggerNcActions=function(e){m(),A("moreEdit",i.defaultActionContents),A("extraEdit",i.ncActionContents),E(),document.querySelector("#Punctum.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=h(e.id),r=f(e.id),o=g(e.id);l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#Inclinatum.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=g(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"se"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#Virga.dropdown-item").addEventListener("click",()=>{const t=h(e.id),n=u(e.id),i=f(e.id),r=g(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"s"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#VirgaReversed.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=f(e.id),r=g(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"n"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#LiquescentClockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=h(e.id),r=g(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"c"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#LiquescentAnticlockwise.dropdown-item").addEventListener("click",()=>{const t=u(e.id),n=d(e.id),i=h(e.id),r=f(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"a"}};l.edit({action:"chain",param:[t,n,i,r,o]},l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),m(),l.updateForCurrentPage()})}),I()},t.triggerNeumeActions=function(){m(),A("moreEdit",i.defaultNeumeActionContents),A("extraEdit",i.neumeActionContents),E();const e=document.querySelectorAll(".selected");function t(t){const n={action:"changeGroup",param:{elementId:e[0].id,contour:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Grouping Changed","success"):s.default.queueNotification("Grouping Failed","error"),m(),l.updateForCurrentPage()})}1===e.length?(document.getElementById("split-neume").addEventListener("click",()=>{const e=document.querySelector(".neume.selected");if(null!==e){new a.SplitNeumeHandler(l,e).startSplit(),m()}else console.error("No staff was selected!"),m()}),document.querySelector("#Pes.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PesSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Clivis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Scandicus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusFlexus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Climacus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#ClimacusResupinus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Torculus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#TorculusResupinus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Porrectus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusFlexus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusSubpunctis.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),document.querySelector("#Pressus.dropdown-item").addEventListener("click",e=>{t(l.info.getContourByValue(e.target.id))}),I()):console.warn("More than one neume selected! Cannot trigger Neume ClickSelect actions.")},t.triggerSyllableActions=function(e){m(),A("moreEdit",i.syllableActionsContent);let t="";switch(e){case"singleSelect":t+='
\n \n \n \n
';break;case"linkableSelect":t+='
\n \n \n \n
';break;case"multiSelect":t+='
\n \n \n \n
';break;case"default":t+='
\n \n \n
'}A("moreEdit",t,!0),S(),E(),r.initGroupingListeners()},t.triggerLayerElementActions=function(e){var t,n,r,o;if(m(),e.classList.contains("custos"))return A("moreEdit",i.custosActionContents),S(),void E();A("moreEdit",e.parentElement.classList.contains("syllable")?i.layerElementInActionContents:i.layerElementOutActionContents,!1),e.classList.contains("accid")?(A("extraEdit",i.accidActionContents),function(e){document.querySelector("#ChangeToFlat.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"f"}})}),document.querySelector("#ChangeToNatural.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"n"}})}),I()}(e)):e.classList.contains("clef")?(A("extraEdit",i.clefActionContents),function(e){document.querySelector("#increment-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"above"}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave incremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#decrement-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"below"}};l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave decremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),m(),l.updateForCurrentPage()})}),document.querySelector("#CClef.dropdown-item").addEventListener("click",()=>{k({action:"setClef",param:{elementId:e.id,shape:"C"}})}),document.querySelector("#FClef.dropdown-item").addEventListener("click",()=>{k({action:"setClef",param:{elementId:e.id,shape:"F"}})}),I()}(e)):e.classList.contains("divLine")&&(A("extraEdit",i.divLineActionContents),function(e){document.querySelector("#ChangeToMinima.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"minima"}})}),document.querySelector("#ChangeToMaior.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maior"}})}),document.querySelector("#ChangeToMaxima.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maxima"}})}),document.querySelector("#ChangeToFinalis.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"finalis"}})}),document.querySelector("#ChangeToCaesura.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"caesura"}})}),document.querySelector("#ChangeToVirgula.dropdown-item").addEventListener("click",()=>{k({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"virgula"}})}),I()}(e)),S(),null===(t=document.getElementById("insertToSyllable"))||void 0===t||t.addEventListener("click",b),null===(n=document.getElementById("moveOutsideSyllable"))||void 0===n||n.addEventListener("click",w),E(),S(),null===(r=document.getElementById("insertToSyllable"))||void 0===r||r.addEventListener("click",b),null===(o=document.getElementById("moveOutsideSyllable"))||void 0===o||o.addEventListener("click",w)},t.triggerMultiStaffActions=function(){m(),A("moreEdit",i.staffMergeActionContents),A("extraEdit",i.columnActionContents),E(),x(),L(),document.getElementById("merge-systems").addEventListener("click",()=>{r.mergeStaves()})},t.triggerStaffSplitMode=C,t.triggerSingleStaffActions=function(){m(),A("moreEdit",i.staffSplitActionContents),A("extraEdit",i.columnActionContents),E(),x(),L(),document.getElementById("split-system").addEventListener("click",()=>{C()}),document.getElementById("reset-rotate").addEventListener("click",()=>{const e=document.querySelector(".staff.selected"),t=(0,c.getStaffBBox)(e),n=Math.tan(t.rotate)*(t.lrx-t.ulx);if(null!==e){const i={action:"resizeRotate",param:{elementId:e.id,ulx:t.ulx,uly:t.rotate>0?t.uly+n/2:t.uly-n/2,lrx:t.lrx,lry:t.rotate>0?t.lry-n/2:t.lry+n/2,rotate:0}};l.edit(i,l.view.getCurrentPageURI()).then(async e=>{e&&await l.updateForCurrentPage()}),m()}else console.error("No staff was selected"),m()})},t.triggerBBoxActions=function(){m(),A("moreEdit",i.bboxActionContents),E(),document.getElementById("matchHeight").addEventListener("click",()=>{_()})},t.triggerDefaultSylActions=function(){m(),A("moreEdit",i.defaultSylActionContents),E(),S()},t.triggerDefaultActions=function(){m(),A("moreEdit",i.defaultActionContents),E()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getGlyphBBox=t.isOutOfSVGBounds=t.getStaffByCoords=t.getStaffIdByCoords=t.getSVGRelCoords=void 0;const i=n(4);function r(e,t){const n=new DOMPoint(e,t),i=document.querySelector(".active-page > .definition-scale").querySelector(".page-margin"),{x:r,y:s}=n.matrixTransform(i.getScreenCTM().inverse());return{x:r,y:s}}function s(e,t){const n=Array.from(document.querySelectorAll(".staff")).map(e=>(0,i.getStaffBBox)(e)),{x:s,y:o}=r(e,t),a=n.find(e=>s<=e.lrx&&s>=e.ulx&&o<=e.lry&&o>=e.uly);return a?a.id:null}t.getSVGRelCoords=r,t.getStaffIdByCoords=s,t.getStaffByCoords=function(e,t){const n=s(e,t);return document.querySelector("#"+n)},t.isOutOfSVGBounds=function(e,t){const n=document.querySelector("#bgimg");return e<=0||e>=Number(n.getAttribute("width"))||t<=0||t>=Number(n.getAttribute("height"))},t.getGlyphBBox=function(e){const t="rect"==e.tagName?e.getBBox():e.parentNode.getBBox();return{ulx:t.x,uly:t.y,lrx:t.x+t.width,lry:t.y+t.height}}},function(e,t,n){e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function n(e,t){var n=e[0],i=e[1],r=e[2],s=e[3];i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[0]-680876936|0)<<7|n>>>25)+i|0)&i|~n&r)+t[1]-389564586|0)<<12|s>>>20)+n|0)&n|~s&i)+t[2]+606105819|0)<<17|r>>>15)+s|0)&s|~r&n)+t[3]-1044525330|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[4]-176418897|0)<<7|n>>>25)+i|0)&i|~n&r)+t[5]+1200080426|0)<<12|s>>>20)+n|0)&n|~s&i)+t[6]-1473231341|0)<<17|r>>>15)+s|0)&s|~r&n)+t[7]-45705983|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[8]+1770035416|0)<<7|n>>>25)+i|0)&i|~n&r)+t[9]-1958414417|0)<<12|s>>>20)+n|0)&n|~s&i)+t[10]-42063|0)<<17|r>>>15)+s|0)&s|~r&n)+t[11]-1990404162|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[12]+1804603682|0)<<7|n>>>25)+i|0)&i|~n&r)+t[13]-40341101|0)<<12|s>>>20)+n|0)&n|~s&i)+t[14]-1502002290|0)<<17|r>>>15)+s|0)&s|~r&n)+t[15]+1236535329|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[1]-165796510|0)<<5|n>>>27)+i|0)&r|i&~r)+t[6]-1069501632|0)<<9|s>>>23)+n|0)&i|n&~i)+t[11]+643717713|0)<<14|r>>>18)+s|0)&n|s&~n)+t[0]-373897302|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[5]-701558691|0)<<5|n>>>27)+i|0)&r|i&~r)+t[10]+38016083|0)<<9|s>>>23)+n|0)&i|n&~i)+t[15]-660478335|0)<<14|r>>>18)+s|0)&n|s&~n)+t[4]-405537848|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[9]+568446438|0)<<5|n>>>27)+i|0)&r|i&~r)+t[14]-1019803690|0)<<9|s>>>23)+n|0)&i|n&~i)+t[3]-187363961|0)<<14|r>>>18)+s|0)&n|s&~n)+t[8]+1163531501|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[13]-1444681467|0)<<5|n>>>27)+i|0)&r|i&~r)+t[2]-51403784|0)<<9|s>>>23)+n|0)&i|n&~i)+t[7]+1735328473|0)<<14|r>>>18)+s|0)&n|s&~n)+t[12]-1926607734|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[5]-378558|0)<<4|n>>>28)+i|0)^i^r)+t[8]-2022574463|0)<<11|s>>>21)+n|0)^n^i)+t[11]+1839030562|0)<<16|r>>>16)+s|0)^s^n)+t[14]-35309556|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[1]-1530992060|0)<<4|n>>>28)+i|0)^i^r)+t[4]+1272893353|0)<<11|s>>>21)+n|0)^n^i)+t[7]-155497632|0)<<16|r>>>16)+s|0)^s^n)+t[10]-1094730640|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[13]+681279174|0)<<4|n>>>28)+i|0)^i^r)+t[0]-358537222|0)<<11|s>>>21)+n|0)^n^i)+t[3]-722521979|0)<<16|r>>>16)+s|0)^s^n)+t[6]+76029189|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[9]-640364487|0)<<4|n>>>28)+i|0)^i^r)+t[12]-421815835|0)<<11|s>>>21)+n|0)^n^i)+t[15]+530742520|0)<<16|r>>>16)+s|0)^s^n)+t[2]-995338651|0)<<23|i>>>9)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[0]-198630844|0)<<6|n>>>26)+i|0)|~r))+t[7]+1126891415|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[14]-1416354905|0)<<15|r>>>17)+s|0)|~n))+t[5]-57434055|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[12]+1700485571|0)<<6|n>>>26)+i|0)|~r))+t[3]-1894986606|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[10]-1051523|0)<<15|r>>>17)+s|0)|~n))+t[1]-2054922799|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[8]+1873313359|0)<<6|n>>>26)+i|0)|~r))+t[15]-30611744|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[6]-1560198380|0)<<15|r>>>17)+s|0)|~n))+t[13]+1309151649|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[4]-145523070|0)<<6|n>>>26)+i|0)|~r))+t[11]-1120210379|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[2]+718787259|0)<<15|r>>>17)+s|0)|~n))+t[9]-343485551|0)<<21|i>>>11)+r|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=r+e[2]|0,e[3]=s+e[3]|0}function i(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function r(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function s(e){var t,r,s,o,a,c,l=e.length,u=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=l;t+=64)n(u,i(e.substring(t-64,t)));for(r=(e=e.substring(t-64)).length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t>2]|=e.charCodeAt(t)<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}function o(e){var n,i="";for(n=0;n<4;n+=1)i+=t[e>>8*n+4&15]+t[e>>8*n&15];return i}function a(e){var t;for(t=0;tu?new ArrayBuffer(0):(r=u-l,s=new ArrayBuffer(r),o=new Uint8Array(s),a=new Uint8Array(this,l,r),o.set(a),s)}}(),u.prototype.append=function(e){return this.appendBinary(c(e)),this},u.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,r=this._buff.length;for(t=64;t<=r;t+=64)n(this._hash,i(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},u.prototype.end=function(e){var t,n,i=this._buff,r=i.length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},u.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},u.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},u.prototype._finish=function(e,t){var i,r,s,o=t;if(e[o>>2]|=128<<(o%4<<3),o>55)for(n(this._hash,e),o=0;o<16;o+=1)e[o]=0;i=(i=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(i[2],16),s=parseInt(i[1],16)||0,e[14]=r,e[15]=s,n(this._hash,e)},u.hash=function(e,t){return u.hashBinary(c(e),t)},u.hashBinary=function(e,t){var n=a(s(e));return t?l(n):n},u.ArrayBuffer=function(){this.reset()},u.ArrayBuffer.prototype.append=function(e){var t,i,s,o,a,c=(i=this._buff.buffer,s=e,o=!0,(a=new Uint8Array(i.byteLength+s.byteLength)).set(new Uint8Array(i)),a.set(new Uint8Array(s),i.byteLength),o?a:a.buffer),l=c.length;for(this._length+=e.byteLength,t=64;t<=l;t+=64)n(this._hash,r(c.subarray(t-64,t)));return this._buff=t-64>2]|=i[t]<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.ArrayBuffer.prototype.getState=function(){var e,t=u.prototype.getState.call(this);return t.buff=(e=t.buff,String.fromCharCode.apply(null,new Uint8Array(e))),t},u.ArrayBuffer.prototype.setState=function(e){return e.buff=function(e,t){var n,i=e.length,r=new ArrayBuffer(i),s=new Uint8Array(r);for(n=0;n>2]|=e[t]<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}(new Uint8Array(e)));return t?l(i):i},u}()},function(e,t,n){"use strict";function i(e){if(16!==e.length)return"";function t(e,t){return e+t.toString(16).padStart(2,"0")}return e.slice(0,4).reduce(t,"")+"-"+e.slice(4,6).reduce(t,"")+"-"+e.slice(6,8).reduce(t,"")+"-"+e.slice(8,10).reduce(t,"")+"-"+e.slice(10).reduce(t,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.uuidv4=void 0,t.uuidv4=function(){if(void 0===window.crypto)return i(new Uint8Array(16));const e=new Uint8Array(16),t=Uint8Array.from([parseInt("01000000",2),parseInt("10000000",2),parseInt("00001111",2),parseInt("00111111",2)]);return window.crypto.getRandomValues(e),e[6]=e[6]&t[2]|t[0],e[8]=e[8]&t[3]|t[1],i(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setGroupingHighlight=t.setStaffHighlight=t.highlight=t.unsetGroupingHighlight=t.unsetStaffHighlight=t.unhighlight=void 0;const i=["rgb(230, 159, 0)","rgb(86, 180, 233)","rgb(0, 158, 115)","rgb(240, 228, 66)","rgb(0, 114, 178)","rgb(213, 94, 0)","rgb(204, 121, 167)"];function r(e){let t;t=e?e.querySelectorAll(":not(.selected) .highlighted"):document.querySelectorAll(":not(.selected) .highlighted"),t.forEach(e=>{if("path"!==e.tagName||e.closest(".staff").classList.contains("selected"))if(e.classList.contains("divLine")&&!e.closest(".staff").classList.contains("selected"))e.setAttribute("stroke","#000000");else{e.removeAttribute("fill");let t=e.querySelectorAll(".sylTextRect-display");if(!t.length)try{t=e.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(e){t=[]}t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")}))}else e.setAttribute("stroke","#000000");e.classList.remove("highlighted")})}function s(){r()}function o(){s();Array.from(document.getElementsByClassName("highlighted")).filter(e=>!e.parentElement.classList.contains("selected")).forEach(e=>{e.setAttribute("#d00",null);let t=e.querySelectorAll(".sylTextRect-display");t.length||null!==e.closest(".syllable")&&(t=e.closest(".syllable").querySelectorAll("sylTextRect-display")),t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")})),e.classList.remove("highlighted"),e.querySelectorAll("sylTextRect-display").forEach(e=>{e.classList.remove("highlighted")})}),Array.from(document.getElementsByClassName("selected")).forEach(e=>{e.setAttribute("fill","")})}function a(e,t){const n=Array.from(e.children);for(let e=0;ee.querySelectorAll(".divLine")).forEach(e=>{n.push(e)});else{if(i.classList.contains("resizePoint")||"resizeRect"===i.id||i.classList.contains("rotatePoint"))return;if(i.classList.contains("layer"))Array.from(i.children).forEach(e=>{n.push(e)});else if(document.getElementsByClassName("highlight-selected").length&&"highlight-neume"===document.getElementsByClassName("highlight-selected")[0].id&&i.classList.contains("syllable"))Array.from(i.children).filter(e=>e.classList.contains("neume")).forEach(e=>{n.push(e)});else{i.setAttribute("fill",t);let e=i.querySelectorAll(".sylTextRect-display");if(!e.length)try{e=i.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(t){e=[]}e.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||(e.style.fill=t,e.classList.add("highlighted"))}))}}i.classList.add("highlighted")}let i;i="30px",e.querySelectorAll(".nc, .custos, .clef, .accid").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width",i)})}function c(){const e=Array.from(document.getElementsByClassName("staff"));for(let t=0;t{const n=Array.from(t.classList).join(" ").match(/\bcolumn(\d+)\b/);let i=0;n&&(i=parseInt(n[1],10)-1),e[i]||(e[i]=[]),e[i].push(t)});for(const[t,n]of Object.entries(e)){const e=i[Number(t)%i.length];for(const t of n)a(t,e)}}();if("selection"===t){switch(document.querySelector(".sel-by.is-active").id){case"selBySyllable":case"selByBBox":t="syllable";break;case"selByColumn":t="column";break;case"selByStaff":t="staff";break;case"selByLayerElement":t="layerElement";break;case"selByNeume":default:t="neume"}return void e(t)}let n;n="layerElement"==t?document.querySelectorAll(".accid, .clef, .custos, .divLine"):document.getElementsByClassName(t),document.querySelectorAll(".nc, .custos, .clef, .accid, .divLine").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width","30px")});for(let e=0;e{e.classList.add("highlighted")})}const r=n[e].querySelectorAll(".divLine");if(r)for(let e=0;e=0;s--)o=0===s?"":",",t.push({obj:i[s],prefix:o});t.push({val:"["})}else{for(c in a=[],i)i.hasOwnProperty(c)&&a.push(c);for(t.push({val:"}"}),s=a.length-1;s>=0;s--)u=i[l=a[s]],d=s>0?",":"",d+=JSON.stringify(l)+":",t.push({obj:u,prefix:d});t.push({val:"{"})}return h},t.parse=function(e){for(var t,n,r,s,o,a,c,l,u,d=[],h=[],f=0;;)if("}"!==(t=e[f++])&&"]"!==t&&void 0!==t)switch(t){case" ":case"\t":case"\n":case":":case",":break;case"n":f+=3,i(null,d,h);break;case"t":f+=3,i(!0,d,h);break;case"f":f+=4,i(!1,d,h);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",f--;;){if(r=e[f++],!/[\d\.\-e\+]/.test(r)){f--;break}n+=r}i(parseFloat(n),d,h);break;case'"':for(s="",o=void 0,a=0;'"'!==(c=e[f++])||"\\"===o&&a%2==1;)s+=c,"\\"===(o=c)?a++:a=0;i(JSON.parse('"'+s+'"'),d,h);break;case"[":l={element:[],index:d.length},d.push(l.element),h.push(l);break;case"{":u={element:{},index:d.length},d.push(u.element),h.push(u);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===d.length)return d.pop();i(d.pop(),d,h)}}},function(e,t,n){"use strict";var i=n(20),r=n(10);t.a=function(e,t,n){var s=(e=e||{}).random||(e.rng||i.a)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){n=n||0;for(var o=0;o<16;++o)t[n+o]=s[o];return t}return Object(r.a)(s)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),s=n(5),o=n(4);t.default=class{constructor(e,t){this.dragStartCoords=[-1,-1],this.neonView=e,this.selector=t}dragInit(){const e=i.drag().on("start",function(){this.dragStartCoords=[i.event.x,i.event.y],this.dx=0,this.dy=0,i.event.sourceEvent.target.classList.contains("staff")&&i.select(this.selector).call(e)}.bind(this)).on("drag",this.dragging.bind(this)).on("end",this.dragEnded.bind(this));i.selectAll(".selected").call(e);let t=Array.from(document.querySelectorAll(".selected"));this.noMovePrecedes=t.filter(e=>e.classList.contains("no-moving")&&e.hasAttribute("mei:precedes")),t=t.filter(e=>!e.classList.contains("no-moving")),this.selection=t.concat(Array.from(document.querySelectorAll(".resizePoint")))}dragging(){this.dx=i.event.x-this.dragStartCoords[0],this.dy=i.event.y-this.dragStartCoords[1],this.moveElements(this.selection,this.dx,this.dy);if(0===this.selection.filter(e=>e.classList.contains("syl")).length&&0===this.noMovePrecedes.length){const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));this.moveElements(e,-this.dx,-this.dy)}}dragEnded(){const e=Math.abs(this.dx),t=Math.abs(this.dy);if(e<=5&&t<=5)return this.reset(),void this.dragInit();const n=this.selection.filter(e=>!e.classList.contains("resizePoint"));if(this.isCursorOutOfBounds()||this.isDragOutOfBounds(n)){this.returnElements(this.selection);const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));return this.returnElements(e),this.reset(),this.dragInit(),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Drag action failed.","error")}const i=[];n.forEach(e=>{const t={action:"drag",param:{elementId:"rect"===e.tagName?e.closest(".syl").id:e.id,x:this.dx,y:-this.dy}};i.push(t)});const r={action:"chain",param:i};this.neonView.edit(r,this.neonView.view.getCurrentPageURI()).then(async()=>{const e=Array.from(document.querySelectorAll(".selected")).filter(e=>!e.classList.contains("no-moving")).map(e=>e.id);await this.neonView.updateForCurrentPage(),this.endOptionsSelection(),this.reset(),await this.reselect(e),this.dragInit()})}async reselect(e){const t=e.map(e=>document.querySelector("#"+e));t.filter(e=>!e.classList.contains("syl")).forEach(async()=>await(0,o.selectAll)(t,this.neonView,this)),t.filter(e=>e.classList.contains("syl")).forEach(e=>(0,o.selectBBox)(e.querySelector(".sylTextRect-display"),this,this.neonView)),t.filter(e=>e.classList.contains("staff")).forEach(e=>(0,o.selectStaff)(e,this))}resetTo(e){this.resetToAction=e}reset(){void 0!==this.resetToAction&&i.select(this.selector).call(this.resetToAction)}endOptionsSelection(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden"))}moveElements(e,t,n){e.filter(e=>null!==e).forEach(e=>{e.setAttribute("transform",`translate(${t},${n})`)})}returnElements(e){e.filter(e=>null!==e).forEach(e=>{e.removeAttribute("transform")})}isCursorOutOfBounds(){const e=this.dragStartCoords[0]+this.dx,t=this.dragStartCoords[1]+this.dy;return(0,r.isOutOfSVGBounds)(e,t)}isDragOutOfBounds(e){let t=document.querySelector("#displayBBox").checked?"use, rect":"use";e[0].classList.contains("staff")&&(t="path");const n=e.reduce((e,n)=>e.concat(...n.querySelectorAll(t)),[]).map(r.getGlyphBBox).reduce((e,t)=>({ulx:Math.min(e.ulx,t.ulx),uly:Math.min(e.uly,t.uly),lrx:Math.max(e.lrx,t.lrx),lry:Math.max(e.lry,t.lry)}),{ulx:Number.MAX_VALUE,uly:Number.MAX_VALUE,lrx:Number.MIN_VALUE,lry:Number.MIN_VALUE}),{ulx:i,uly:s,lrx:o,lry:a}=n;return(0,r.isOutOfSVGBounds)(i+this.dx,s+this.dy)||(0,r.isOutOfSVGBounds)(o+this.dx,a+this.dy)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initGroupingListeners=t.endGroupingSelection=t.triggerGrouping=t.mergeStaves=t.isLinkable=t.canBeLinked=t.isLinked=t.isGroupable=t.initNeonView=void 0;const i=n(8),r=n(34),s=n(5),o=n(4),a=n(14),c=n(14);let l;function u(e,t){if(Array.from(t.values()).length<2)return!1;switch(e){case"selByNeume":if(o.sharedLogicalParent(e,t))return!1;default:return!!o.areAdjacent(e,t)}}function d(e,t){switch(t||(t=Array.from(document.querySelectorAll(".selected"))),e){case"selBySyllable":for(const e of t)if(e.hasAttribute("mei:follows")||e.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNeume":for(const e of t)if(e.parentElement.hasAttribute("mei:follows")||e.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNc":for(const e of t)if(e.parentElement.parentElement.hasAttribute("mei:follows")||e.parentElement.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1}}function h(e){for(const t of e)if(!t.hasAttribute("mei:precedes")&&!t.hasAttribute("mei:follows"))return!1;return!0}function f(e){e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1});const t=Array.from(document.querySelectorAll(".staff")),n=Array.from(document.querySelectorAll(".syllable"));for(let i=0;i!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));const i=e.filter(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(1!==i.length)return!1;const r=i[0];return 0===e.indexOf(r)||e.indexOf(r)===e.length-1}function g(e,t){return!(t.length<2)&&("selBySyllable"===e&&(function(e){e.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING?1:0);for(let t=0;te.id===i&&(r=t,!0));if(!s)return!0;if(!s.hasAttribute("mei:follows"))return!0;if(s.getAttribute("mei:follows")!="#"+n.id)return!0;if(r!==t+1)return!0}if(n.hasAttribute("mei:follows")){const t=n.getAttribute("mei:follows").replace("#",""),i=e.find(e=>e.id===t);if(!i)return!0;if(!i.hasAttribute("mei:precedes"))return!0;if(i.getAttribute("mei:precedes")!="#"+n.id)return!0}return!1}}(t)?(s.queueNotification("The selected syllables include invalid linked syllable(s)!","warning"),!1):!!h(t)||!!f(t)))}function p(){const e=document.querySelectorAll(".staff.selected"),t=[];e.forEach(e=>{t.push(e.id)});const n={action:"merge",param:{elementIds:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?(s.queueNotification("Staff Merged","success"),a.endOptionsSelection(),l.updateForCurrentPage()):s.queueNotification("Merge Failed","error")})}function m(){const e=document.getElementById("moreEdit");e.innerHTML="",e.parentElement.classList.add("hidden"),document.body.removeEventListener("keydown",c.deleteButtonHandler),document.body.removeEventListener("keydown",y)}function v(){const e=document.getElementById("delete");e.removeEventListener("click",c.removeHandler),e.addEventListener("click",c.removeHandler),document.body.addEventListener("keydown",c.deleteButtonHandler),document.body.addEventListener("keydown",y);try{document.getElementById("mergeSyls").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNeumes").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",E().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNcs").addEventListener("click",()=>{b("group","nc",E().filter(e=>document.getElementById(e).classList.contains("nc")))})}catch(e){}try{document.getElementById("ungroupNeumes").addEventListener("click",()=>{b("ungroup","neume",S())})}catch(e){}try{document.getElementById("ungroupNcs").addEventListener("click",()=>{b("ungroup","nc",S())})}catch(e){}try{document.getElementById("toggle-ligature").addEventListener("click",async()=>{const e={action:"toggleLigature",param:{elementIds:E()}};l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Ligature Toggled","success"):s.queueNotification("Ligature Toggle Failed","error"),m(),l.updateForCurrentPage()})})}catch(e){}try{document.getElementById("toggle-link").addEventListener("click",()=>{_()})}catch(e){}}t.initNeonView=function(e){l=e},t.isGroupable=u,t.isLinked=h,t.canBeLinked=f,t.isLinkable=g,t.mergeStaves=p,t.triggerGrouping=function(e){const t=document.getElementById("moreEdit");t.parentElement.classList.remove("hidden"),t.innerHTML+=i.groupingMenu[e],v()},t.endGroupingSelection=m,t.initGroupingListeners=v;const y=function(e){if("g"===e.key){const e=Array.from(document.querySelectorAll(".selected"));if(0==e.length)return;const t=o.getSelectionType();if(d(t,e))return;switch(t){case"selBySyllable":if(g(t,e))_();else if(u(t,e)){b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))}else if(1===e.length){b("ungroup","neume",S())}break;case"selByNeume":if(u(t,e)){b("group","neume",E())}else{b("ungroup","nc",S())}break;case"selByNc":if(u(t,e)){b("group","nc",E())}else{b("ungroup","nc",S())}break;case"selByStaff":u(t,e)?p():a.triggerStaffSplitMode();break;default:return void console.error(`Can't perform grouping/ungrouping action on selection type ${t}.`)}}};function b(e,t,n){const i={action:e,param:{groupType:t,elementIds:n}};l.edit(i,l.view.getCurrentPageURI()).then(i=>{if(i?"group"===e?s.queueNotification("Grouping Success","success"):s.queueNotification("Ungrouping Success","success"):"group"===e?s.queueNotification("Grouping Failed","error"):s.queueNotification("Ungrouping Failed","error"),l.updateForCurrentPage(),"nc"===t){const e=document.getElementById(n[0]).parentElement,t=Array.from(e.children);void 0===l.info.getContour(t)&&r.groupingNotRecognized()}m()})}function w(e){const t=document.getElementById(e);return t instanceof SVGGraphicsElement?t:null}function _(){const e=E(),t={action:"chain",param:[]},n=new Array,i=e.map(w).filter(e=>null!==e);if(h(i))n.push(...function(e){const t=new Array;for(const n of e){const e=document.getElementById(n);e.getAttribute("mei:precedes")&&t.push({action:"set",param:{elementId:n,attrType:"precedes",attrValue:""}}),e.getAttribute("mei:follows")&&(t.push({action:"set",param:{elementId:n,attrType:"follows",attrValue:""}}),t.push({action:"setText",param:{elementId:n,text:""}}))}return t}(e));else{const[e,t]=function(e){if(e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}),2===e.length)return[e[0],e[1]];const t=e.find(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(t){const n=e.indexOf(t);if(0===n)return[e[n],e[n+1]];if(n===e.length-1)return[e[n-1],e[n]]}}(i);console.log(e.id,t.id),n.push({action:"set",param:{elementId:e.id,attrType:"precedes",attrValue:"#"+t.id}}),n.push({action:"set",param:{elementId:t.id,attrType:"follows",attrValue:"#"+e.id}});const r=t.querySelector(".syl");null!==r&&n.push({action:"remove",param:{elementId:r.id}})}t.param=n,l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Toggled Syllable Link","success"):s.queueNotification("Failed to Toggle Syllable Link","error"),m(),l.updateForCurrentPage()})}function E(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push(t.id)}),e}function S(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{if(t.classList.contains("divLine")||t.classList.contains("accid")||t.classList.contains("clef"))return;Array.from(t.children).forEach(t=>{e.push(t.id)})}),e}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateErrorLogVisibility=t.initDisplayListener=t.initErrorLogControls=t.initErrorLog=t.recordNotification=void 0;const i=n(8),r=n(3),s=n(13);function o(e){const t=document.createElement("div");t.classList.add("notification-container"),t.innerHTML=`\n
\n
${e.message}
\n
\n
\n\n
\n
\n \n
\n\n
\n \n
\n
\n `;const n=t.querySelector(".log-remove");if(n.onclick=()=>t.remove(),n.addEventListener("mouseover",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-open.svg")}),n.addEventListener("mouseout",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-closed.svg")}),e.logInfo){const i=t.querySelector(".notif-log-info-icon");i.style.display="",n.style.height="20px",i.addEventListener("mouseover",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-dark.svg")}),i.addEventListener("mouseout",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-light.svg")}),i.addEventListener("click",()=>function(e){const t=new s.ModalWindow;t.setModalWindowView(s.ModalWindowView.ERROR_LOG,e),t.openModalWindow()}(e.logInfo))}return t}function a(){const e=document.querySelector("#error_log"),t=document.querySelector("#errorLogHeading"),n=t.querySelector("svg > use"),i=document.querySelector("#errorLogContents"),{displayErrLog:s}=(0,r.getSettings)();s&&e.classList.add("visible"),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),c()}function c(){const e=document.querySelector("#display-single-container"),t=document.createElement("label"),n=document.createElement("input");n.classList.add("checkbox"),t.classList.add("checkbox-container","side-panel-btn"),t.textContent="Errors",n.id="display-errors",n.type="checkbox",n.checked=!1,t.appendChild(n),e.append(t);const{displayErrLog:i}=(0,r.getSettings)();n.checked=i,n.addEventListener("click",()=>{(0,r.setSettings)({displayErrLog:n.checked}),l()})}function l(){const e=document.querySelector("#error_log"),{debugMode:t,displayErrLog:n,displayInfo:i,displayBBox:s,displayText:o}=(0,r.getSettings)(),a=document.getElementById("display-all-btn");t?n?(e.classList.add("visible"),i&&s&&o&&n&&(a.classList.add("selected"),a.innerHTML="Hide All")):(e.classList.remove("visible"),a.classList.contains("selected")&&(a.classList.remove("selected"),a.innerHTML="Display All")):(e.classList.remove("visible"),i&&s&&o?(a.classList.add("selected"),a.innerHTML="Hide All"):(a.classList.remove("selected"),a.innerHTML="Display All"))}t.recordNotification=function(e){document.querySelector("#errorLogContents").prepend(o(e))},t.initErrorLog=function(){document.querySelector("#error_log").innerHTML=i.errorLogsPanelContents,a()},t.initErrorLogControls=a,t.initDisplayListener=c,t.updateErrorLogVisibility=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resize=void 0;const i=n(4),r=n(7),s=n(15),o=n(5),a=n(3),c={TopLeft:0,Top:1,TopRight:2,Right:3,BottomRight:4,Bottom:5,BottomLeft:6,Left:7};function l(e,t,n,i,r){let s;if(r>=0)s=[{x:e,y:t,name:c.TopLeft},{x:(e+n)/2,y:t+(n-e)/2*Math.sin(r),name:c.Top},{x:n,y:t+(n-e)*Math.sin(r),name:c.TopRight},{x:n,y:(t+i+(n-e)*Math.sin(r))/2,name:c.Right},{x:n,y:i,name:c.BottomRight},{x:(e+n)/2,y:i-(n-e)/2*Math.sin(r),name:c.Bottom},{x:e,y:i-(n-e)*Math.sin(r),name:c.BottomLeft},{x:e,y:(t+i-(n-e)*Math.sin(r))/2,name:c.Left}];else{const o=(n-e)*Math.tan(Math.abs(r)),a=i-t-o;s=[{x:e,y:t+o,name:c.TopLeft},{x:(e+n)/2,y:t+o/2,name:c.Top},{x:n,y:t,name:c.TopRight},{x:n,y:t+a/2,name:c.Right},{x:n,y:t+a,name:c.BottomRight},{x:(e+n)/2,y:i-o/2,name:c.Bottom},{x:e,y:i,name:c.BottomLeft},{x:e,y:i-a/2,name:c.Left}]}return s}t.resize=function(e,t,n){let u,d,h,f,g,p,m,v,y,b,w,_,E,S,x;function L(){const e=l(u,d,h,f,g),t=e.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");document.querySelector("#resizeRect").setAttribute("points",t);const n=document.querySelector(".syl.selected > .sylTextRect-display");n&&(n.setAttribute("x",String(Math.min(u,h))),n.setAttribute("y",String(Math.min(d,f))),n.setAttribute("width",String(Math.abs(h-u))),n.setAttribute("height",String(Math.abs(f-d))));for(const t in c){const n=e[c[t]];r.select("#p-"+t).filter(".resizePoint").attr("cx",n.x).attr("cy",n.y)}let i=e[3].x,s=e[3].y;const o=i+100+","+(s+85)+" "+(i+70)+","+(s+50)+" "+(i+100)+","+(s+15)+" "+(i+130)+","+(s+50);i=e[7].x,s=e[7].y;const a=i-100+","+(s-15)+" "+(i-130)+","+(s-50)+" "+(i-100)+","+(s-85)+" "+(i-70)+","+(s-50);r.select("#rotateLeft").attr("points",a),r.select("#rotateRight").attr("points",o)}!function A(){if(null===e)return;if(r.selectAll(".resizePoint").remove(),r.selectAll("#resizeRect").remove(),r.selectAll(".rotatePoint").remove(),e.classList.contains("syl")){const t=e.querySelector(".sylTextRect-display");if(null===t)return void console.warn("Tried to draw resize rect for a sylTextRect that doesn't exist (or isn't displaying)");u=Number(t.getAttribute("x")),d=Number(t.getAttribute("y")),h=+u+ +t.getAttribute("width"),f=+d+ +t.getAttribute("height"),g=0}if(e.classList.contains("staff")){const t=(0,i.getStaffBBox)(e);u=t.ulx,d=t.uly,h=t.lrx,f=t.lry;const n=e.querySelector("path").getAttribute("d").match(/\d+/g).map(e=>Number(e));g=Math.atan((n[3]-n[1])/(n[2]-n[0]))}let k;p=u,y=d,m=h,b=f;const C=l(u,d,h,f,g);E=C[2].x-C[0].x;const I=C.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");r.select("#"+e.id).append("polygon").attr("points",I).attr("id","resizeRect").attr("stroke","black").attr("stroke-width",10).attr("fill","none").style("cursor","move").style("stroke-dasharray","20 10");const{circleSize:P}=(0,a.getSettings)();for(const t in c){const n=C[c[t]];r.select(e.viewportElement).append("circle").attr("cx",n.x).attr("cy",n.y).attr("r",P).attr("stroke","black").attr("stroke-width",4).attr("fill","#0099ff").attr("class","resizePoint").attr("id","p-"+t)}for(const e in c)r.select("#p-"+e).filter(".resizePoint").call(r.drag().on("start",()=>{O(e)}).on("drag",B).on("end",T.bind(this)));if(e.classList.contains("staff")){let t=C[3].x,n=C[3].y;const i=t+100+","+(n+85)+" "+(t+70)+","+(n+50)+" "+(t+100)+","+(n+15)+" "+(t+130)+","+(n+50);t=C[7].x,n=C[7].y;const s=t-100+","+(n-15)+" "+(t-130)+","+(n-50)+" "+(t-100)+","+(n-85)+" "+(t-70)+","+(n-50);r.select("#"+e.id).append("polygon").attr("points",i).attr("id","rotateRight").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#"+e.id).append("polygon").attr("points",s).attr("id","rotateLeft").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#rotateLeft").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x-Math.atan(e/E);t>-.2&&t<.2&&(S=e,d=_+S,g=t,g>=0?(d=S+C.filter(e=>e.name===c.TopLeft)[0].y,f=C.filter(e=>e.name===c.BottomRight)[0].y):(d=C.filter(e=>e.name===c.TopRight)[0].y,f=S+C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M)),r.select("#rotateRight").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x+Math.atan(e/E);t>-.2&&t<.2&&(S=e,g=t,g>=0?(f=S+C.filter(e=>e.name===c.BottomRight)[0].y,d=C.filter(e=>e.name===c.TopLeft)[0].y):(d=S+C.filter(e=>e.name===c.TopRight)[0].y,f=C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M))}function O(e){k=e;const t=C.find(t=>t.name===c[e]);v=[t.x,t.y],y=d,b=f}function B(){const e=r.mouse(this);switch(c[k]){case c.TopLeft:u=e[0],d=e[1];break;case c.Top:d=e[1]-(h-u)*Math.tan(g)/2;break;case c.TopRight:h=e[0],d=e[1]-(h-u)*Math.tan(g);break;case c.Right:h=e[0],f=b+(e[0]-v[0])*Math.tan(g);break;case c.BottomRight:h=e[0],f=e[1];break;case c.Bottom:f=e[1]+(h-u)*Math.tan(g)/2;break;case c.BottomLeft:u=e[0],f=e[1]+(h-u)*Math.tan(g);break;case c.Left:u=e[0],d=y+(e[0]-v[0])*Math.tan(g);break;default:console.error("Something that wasn't a side of the rectangle was dragged. This shouldn't happen.")}L()}function T(){if((0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return u=p,d=y,h=m,f=b,L(),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Resize action failed.","error");const r={action:"resize",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{if(r&&await t.updateForCurrentPage(),e=document.querySelector("#"+e.id),u=void 0,d=void 0,h=void 0,f=void 0,A(),e.classList.contains("syl"))(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this);else{(0,i.selectAll)([document.querySelector("#"+e.id)],t,n);const r=document.querySelector("moreEdit");r&&(r.innerHTML="",r.parentElement.classList.add("hidden"))}})}function N(){const e=r.event.sourceEvent.target.id;w=r.mouse(this)[1],b=f,y=d,_="rotateRight"===e?f:d,x=g}function M(){if(void 0===S&&(S=0),(0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return document.querySelectorAll(".resizePoint").forEach(e=>e.remove()),document.querySelectorAll("#resizeRect").forEach(e=>e.remove()),document.querySelectorAll(".rotatePoint").forEach(e=>e.remove()),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Rotate action failed.","error");const r={action:"resizeRotate",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f,rotate:180*g/Math.PI}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{r&&await t.updateForCurrentPage(),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n)})}}()}},function(e,t,n){"use strict";n.r(t),function(e){var i,r,s=n(2),o=n.n(s),a=n(22),c=n(16),l=n.n(c),u=n(21),d=n.n(u),h=n(6),f=n.n(h),g=n(1),p=n.n(g),m=n(0),v=n.n(m);function y(e){return"$"+e}function b(e){return e.substring(1)}function w(){this._store={}}function _(e){if(this._store=new w,e&&Array.isArray(e))for(var t=0,n=e.length;tb(e))},w.prototype.delete=function(e){var t=y(e),n=t in this._store;return delete this._store[t],n},w.prototype.forEach=function(e){for(var t=Object.keys(this._store),n=0,i=t.length;n=u.length)){var n=Math.min(d+6,u.length),i=u.slice(d,n);!function(n,i){n.forEach((function(n,r){var o=i+r,a=s.get(n),u=I(a[0],["atts_since","attachments"]);u.open_revs=a.map((function(e){return e.rev})),u.open_revs=u.open_revs.filter(O);var d=O;0===u.open_revs.length&&(delete u.open_revs,d=B),["revs","attachments","binary","ajax","latest"].forEach((function(e){e in t&&(u[e]=t[e])})),e.get(n,u,(function(e,t){var i,r,s;i=e?[{error:e}]:d(t),r=n,s=i,c[o]={id:r,docs:s},l(),h()}))}))}(i,d),d+=i.length}}h()}try{localStorage.setItem("_pouch_check_localstorage",1),P=!!localStorage.getItem("_pouch_check_localstorage")}catch(e){P=!1}function N(){return P}function M(){v.a.call(this),this._listeners={},function(e){N()&&addEventListener("storage",(function(t){e.emit(t.key)}))}(this)}function q(e){if("undefined"!=typeof console&&"function"==typeof console[e]){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function D(e){var t=0;return e||(t=2e3),function(e,t){return e=parseInt(e,10)||0,(t=parseInt(t,10))!=t||t<=e?t=(e||1)<<1:t+=1,t>6e5&&(e=3e5,t=6e5),~~((t-e)*Math.random()+e)}(e,t)}function F(e,t){q("info","The above "+e+" is totally normal. "+t)}p()(M,v.a),M.prototype.addListener=function(e,t,n,i){if(!this._listeners[t]){var r=this,s=!1;this._listeners[t]=a,this.on(e,a)}function a(){if(r._listeners[t])if(s)s="waiting";else{s=!0;var e=I(i,["style","include_docs","attachments","conflicts","filter","doc_ids","view","since","query_params","binary","return_docs"]);n.changes(e).on("change",(function(e){e.seq>i.since&&!i.cancelled&&(i.since=e.seq,i.onChange(e))})).on("complete",(function(){"waiting"===s&&o()(a),s=!1})).on("error",(function(){s=!1}))}}},M.prototype.removeListener=function(e,t){t in this._listeners&&(v.a.prototype.removeListener.call(this,e,this._listeners[t]),delete this._listeners[t])},M.prototype.notifyLocalWindows=function(e){N()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},M.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)};var j="function"==typeof Object.assign?Object.assign:function(e){for(var t=Object(e),n=1;n0||i0||i>>1],t)<0?r=i+1:s=i;return r}(e,t,n);e.splice(i,0,t)}function Re(e,t){for(var n,i,r=t,s=e.length;r0;){var r=n.pop(),s=r.tree1,o=r.tree2;(s[1].status||o[1].status)&&(s[1].status="available"===s[1].status||"available"===o[1].status?"available":"missing");for(var a=0;a0;){var p=g.pop();if(0!==p.diff)for(var m=p.ids[2],v=0,y=m.length;vt){n||(n={});var u=l.length-t;a={pos:c.pos+u,ids:Re(l,u)};for(var d=0;d0&&i.emit("error",t)):i.emit("complete",n),i.removeAllListeners(),e.removeListener("destroyed",s)}));function s(){i.cancel()}n&&(i.on("complete",(function(e){n(null,e)})),i.on("error",n)),e.once("destroyed",s),t.onChange=function(e,t,n){i.isCancelled||function(e,t,n,i){try{e.emit("change",t,n,i)}catch(e){q("error",'Error in .on("change", function):',e)}}(i,e,t,n)};var o=new Promise((function(e,n){t.complete=function(t,i){t?n(t):e(i)}}));i.once("cancel",(function(){e.removeListener("destroyed",s),t.complete(null,{status:"cancelled"})})),this.then=o.then.bind(o),this.catch=o.catch.bind(o),this.then((function(e){r(null,e)}),r),e.taskqueue.isReady?i.validateChanges(t):e.taskqueue.addTask((function(e){e?t.complete(e):i.isCancelled?i.emit("cancel"):i.validateChanges(t)}))}function Ke(e,t,n){var i=[{rev:e._rev}];"all_docs"===n.style&&(i=Me(t.rev_tree).map((function(e){return{rev:e.rev}})));var r={id:t.id,changes:i,doc:e};return Ze(t,e._rev)&&(r.deleted=!0),n.conflicts&&(r.doc._conflicts=qe(t),r.doc._conflicts.length||delete r.doc._conflicts),r}function Ye(e,t){return et?1:0}function Xe(e,t){return function(n,i){n||i[0]&&i[0].error?((n=n||i[0]).docId=t,e(n)):e(null,i.length?i[0]:i)}}function Je(e,t){var n=Ye(e._id,t._id);return 0!==n?n:Ye(e._revisions?e._revisions.start:0,t._revisions?t._revisions.start:0)}function Qe(){for(var e in v.a.call(this),Qe.prototype)"function"==typeof this[e]&&(this[e]=this[e].bind(this))}function et(){this.isReady=!1,this.failed=!1,this.queue=[]}function tt(e,t){if(!(this instanceof tt))return new tt(e,t);var n=this;if(t=t||{},e&&"object"==typeof e&&(e=(t=e).name,delete t.name),void 0===t.deterministic_revs&&(t.deterministic_revs=!0),this.__opts=t=L(t),n.auto_compaction=t.auto_compaction,n.prefix=tt.prefix,"string"!=typeof e)throw new Error("Missing/invalid DB name");var i=function(e,t){var n=e.match(/([a-z-]*):\/\/(.*)/);if(n)return{name:/https?/.test(n[1])?n[1]+"://"+n[2]:n[2],adapter:n[1]};var i=tt.adapters,r=tt.preferredAdapters,s=tt.prefix,o=t.adapter;if(!o)for(var a=0;at&&a.push(e)})),Te(s,(function(e,t,n,i,r){var s=t+"-"+n;"available"===r.status&&-1!==a.indexOf(s)&&c.push(s)})),i._doCompaction(e,c,n)}))})),Qe.prototype.compact=C("compact",(function(e,t){"function"==typeof e&&(t=e,e={});e=e||{},this._compactionQueue=this._compactionQueue||[],this._compactionQueue.push({opts:e,callback:t}),1===this._compactionQueue.length&&function e(t){var n=t._compactionQueue[0],i=n.opts,r=n.callback;t.get("_local/compaction").catch((function(){return!1})).then((function(n){n&&n.last_seq&&(i.last_seq=n.last_seq),t._compact(i,(function(n,i){n?r(n):r(null,i),o()((function(){t._compactionQueue.shift(),t._compactionQueue.length&&e(t)}))}))}))}(this)})),Qe.prototype._compact=function(e,t){var n=this,i={return_docs:!1,last_seq:e.last_seq||0},r=[];n.changes(i).on("change",(function(e){r.push(n.compactDocument(e.id,0))})).on("complete",(function(e){var i=e.last_seq;Promise.all(r).then((function(){return pe(n,"_local/compaction",(function(e){return(!e.last_seq||e.last_seq0?e.keys.slice(e.skip):e.keys;e.keys=t,e.skip=0,delete e.limit,e.descending&&(t.reverse(),e.descending=!1)}(e),0===e.keys.length))return this._allDocs({limit:0},t)}return this._allDocs(e,t)})),Qe.prototype.changes=function(e,t){return"function"==typeof e&&(t=e,e={}),(e=e||{}).return_docs="return_docs"in e?e.return_docs:!e.live,new We(this,e,t)},Qe.prototype.close=C("close",(function(e){return this._closed=!0,this.emit("closed"),this._close(e)})),Qe.prototype.info=C("info",(function(e){var t=this;this._info((function(n,i){if(n)return e(n);i.db_name=i.db_name||t.name,i.auto_compaction=!(!t.auto_compaction||ae(t)),i.adapter=t.adapter,e(null,i)}))})),Qe.prototype.id=C("id",(function(e){return this._id(e)})),Qe.prototype.type=function(){return"function"==typeof this._type?this._type():this.adapter},Qe.prototype.bulkDocs=C("bulkDocs",(function(e,t,n){if("function"==typeof t&&(n=t,t={}),t=t||{},Array.isArray(e)&&(e={docs:e}),!e||!e.docs||!Array.isArray(e.docs))return n(ne(V));for(var i=0;i1?t.set(e.name,n):t.delete(e.name))}})),e.on("destroyed",(function(e){if(t.has(e)){var n=t.get(e);t.delete(e),n.forEach((function(e){e.emit("destroyed",!0)}))}}))}(tt),tt.adapter=function(e,t,n){t.valid()&&(tt.adapters[e]=t,n&&tt.preferredAdapters.push(e))},tt.plugin=function(e){if("function"==typeof e)e(tt);else{if("object"!=typeof e||0===Object.keys(e).length)throw new Error('Invalid plugin: got "'+e+'", expected an object or a function');Object.keys(e).forEach((function(t){tt.prototype[t]=e[t]}))}return this.__defaults&&(tt.__defaults=j({},this.__defaults)),tt},tt.defaults=function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);n=n||{},e&&"object"==typeof e&&(e=(n=e).name,delete n.name),n=j({},t.__defaults,n),tt.call(this,e,n)}return p()(t,tt),t.preferredAdapters=tt.preferredAdapters.slice(),Object.keys(tt).forEach((function(e){e in t||(t[e]=tt[e])})),t.__defaults=j({},this.__defaults,e),t},tt.fetch=function(e,t){return it(e,t)};function ot(e,t){for(var n=e,i=0,r=t.length;i0&&"\\"===e[i-1]&&("$"===s||"."===s)?n=n.substring(0,n.length-1)+s:"."===s?(t.push(n),n=""):n+=s}return t.push(n),t}var ct=["$or","$nor","$not"];function lt(e){return ct.indexOf(e)>-1}function ut(e){return Object.keys(e)[0]}function dt(e){var t={},n={$or:!0,$nor:!0};return e.forEach((function(e){Object.keys(e).forEach((function(i){var r=e[i];if("object"!=typeof r&&(r={$eq:r}),lt(i))if(r instanceof Array){if(n[i])return n[i]=!1,void(t[i]=r);var s=[];t[i].forEach((function(e){Object.keys(r).forEach((function(t){var n=r[t],i=Math.max(Object.keys(e).length,Object.keys(n).length),o=dt([e,n]);Object.keys(o).length<=i||s.push(o)}))})),t[i]=s}else t[i]=dt([r]);else{var o=t[i]=t[i]||{};Object.keys(r).forEach((function(e){var t=r[e];return"$gt"===e||"$gte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$gte?"$gte"===e?t>n.$gte&&(n.$gte=t):t>=n.$gte&&(delete n.$gte,n.$gt=t):void 0!==n.$gt?"$gte"===e?t>n.$gt&&(delete n.$gt,n.$gte=t):t>n.$gt&&(n.$gt=t):n[e]=t}(e,t,o):"$lt"===e||"$lte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$lte?"$lte"===e?tt?1:-1}(e,t)}return Array.isArray(e)?function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:-1}(e,t):function(e,t){for(var n=Object.keys(e),i=Object.keys(t),r=Math.min(n.length,i.length),s=0;si.length?1:-1}(e,t)}function gt(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-1/0||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var n=e.length;e=new Array(n);for(var i=0;ir?1:0)}}(t.sort);e=e.sort(i),"string"!=typeof t.sort[0]&&"desc"===(r=t.sort[0])[ut(r)]&&(e=e.reverse())}var r;if("limit"in t||"skip"in t){var s=t.skip||0,o=("limit"in t?t.limit:e.length)+s;e=e.slice(s,o)}return e}function _t(e,t,n){return n.every((function(n){var i=t[n],r=at(n),s=ot(e,r);return lt(n)?function(e,t,n){if("$or"===e)return t.some((function(e){return _t(n,e,Object.keys(e))}));if("$not"===e)return!_t(n,t,Object.keys(t));return!t.find((function(e){return _t(n,e,Object.keys(e))}))}(n,i,e):Et(i,e,r,s)}))}function Et(e,t,n,i){return!e||("object"==typeof e?Object.keys(e).every((function(r){var s=e[r];if(0===r.indexOf("$"))return St(r,t,s,n,i);var o=at(r);if(void 0===i&&"object"!=typeof s&&o.length>0)return!1;var a=ot(i,o);return"object"==typeof s?Et(s,t,n,a):St("$eq",t,s,o,a)})):e===i)}function St(e,t,n,i,r){if(!kt[e])throw new Error('unknown operator "'+e+'" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, $nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');return kt[e](t,n,i,r)}function xt(e){return null!=e}function Lt(e){return void 0!==e}function At(e,t){return t.some((function(t){return e instanceof Array?e.some((function(e){return 0===ft(t,e)})):0===ft(t,e)}))}var kt={$elemMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.some((function(e){return _t(e,t,Object.keys(t))})):i.some((function(i){return Et(t,e,n,i)}))))},$allMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.every((function(e){return _t(e,t,Object.keys(t))})):i.every((function(i){return Et(t,e,n,i)}))))},$eq:function(e,t,n,i){return Lt(i)&&0===ft(i,t)},$gte:function(e,t,n,i){return Lt(i)&&ft(i,t)>=0},$gt:function(e,t,n,i){return Lt(i)&&ft(i,t)>0},$lte:function(e,t,n,i){return Lt(i)&&ft(i,t)<=0},$lt:function(e,t,n,i){return Lt(i)&&ft(i,t)<0},$exists:function(e,t,n,i){return t?Lt(i):!Lt(i)},$mod:function(e,t,n,i){return xt(i)&&function(e,t){return"number"==typeof e&&parseInt(e,10)===e&&e%t[0]===t[1]}(i,t)},$ne:function(e,t,n,i){return t.every((function(e){return 0!==ft(i,e)}))},$in:function(e,t,n,i){return xt(i)&&At(i,t)},$nin:function(e,t,n,i){return xt(i)&&!At(i,t)},$size:function(e,t,n,i){return xt(i)&&Array.isArray(i)&&function(e,t){return e.length===t}(i,t)},$all:function(e,t,n,i){return Array.isArray(i)&&function(e,t){return t.every((function(t){return e.some((function(e){return 0===ft(t,e)}))}))}(i,t)},$regex:function(e,t,n,i){return xt(i)&&"string"==typeof i&&t.every((function(e){return function(e,t){return new RegExp(t).test(e)}(i,e)}))},$type:function(e,t,n,i){return function(e,t){switch(t){case"null":return null===e;case"boolean":return"boolean"==typeof e;case"number":return"number"==typeof e;case"string":return"string"==typeof e;case"array":return e instanceof Array;case"object":return"[object Object]"==={}.toString.call(e)}}(i,t)}};function Ct(e,t){if(e.selector&&e.filter&&"_selector"!==e.filter){var n="string"==typeof e.filter?e.filter:"function";return t(new Error('selector invalid for filter "'+n+'"'))}t()}function It(e){e.view&&!e.filter&&(e.filter="_view"),e.selector&&!e.filter&&(e.filter="_selector"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=le(e.view):e.filter=le(e.filter))}function Pt(e,t){return t.filter&&"string"==typeof t.filter&&!t.doc_ids&&!ae(e.db)}function Ot(e,t){var n=t.complete;if("_view"===t.filter){if(!t.view||"string"!=typeof t.view){var i=ne(X,"`view` filter parameter not found or invalid.");return n(i)}var r=ce(t.view);e.db.get("_design/"+r[0],(function(i,s){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=s&&s.views&&s.views[r[1]]&&s.views[r[1]].map;if(!o)return n(ne(z,s.views?"missing json key: "+r[1]:"missing json key: views"));t.filter=ge(["return function(doc) {",' "use strict";'," var emitted = false;"," var emit = function (a, b) {"," emitted = true;"," };"," var view = "+o+";"," view(doc);"," if (emitted) {"," return true;"," }","};"].join("\n"),{}),e.doChanges(t)}))}else if(t.selector)t.filter=function(e){return function(e,t){if("object"!=typeof t)throw new Error("Selector error: expected a JSON object");var n=wt([{doc:e}],{selector:t=ht(t)},Object.keys(t));return n&&1===n.length}(e,t.selector)},e.doChanges(t);else{var s=ce(t.filter);e.db.get("_design/"+s[0],(function(i,r){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=r&&r.filters&&r.filters[s[1]];if(!o)return n(ne(z,r&&r.filters?"missing json key: "+s[1]:"missing json key: filters"));t.filter=ge('"use strict";\nreturn '+o+";",{}),e.doChanges(t)}))}}function Bt(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})}tt.plugin((function(e){e._changesFilterPlugin={validate:Ct,normalize:It,shouldFilter:Pt,filter:Ot}})),tt.version="7.3.0";var Tt=Bt(["_id","_rev","_access","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),Nt=Bt(["_access","_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);function Mt(e){if(!/^\d+-/.test(e))return ne(ee);var t=e.indexOf("-"),n=e.substring(0,t),i=e.substring(t+1);return{prefix:parseInt(n,10),id:i}}function qt(e,t,n){var i,r,s;n||(n={deterministic_revs:!0});var o={status:"available"};if(e._deleted&&(o.deleted=!0),t)if(e._id||(e._id=Oe()),r=Pe(e,n.deterministic_revs),e._rev){if((s=Mt(e._rev)).error)return s;e._rev_tree=[{pos:s.prefix,ids:[s.id,{status:"missing"},[[r,o,[]]]]}],i=s.prefix+1}else e._rev_tree=[{pos:1,ids:[r,o,[]]}],i=1;else if(e._revisions&&(e._rev_tree=function(e,t){for(var n=e.start-e.ids.length+1,i=e.ids,r=[i[0],t,[]],s=1,o=i.length;s1&&!n?(a={continue:function(){if(!s.length)return r();var n,a=s[s.length-1];if(t&&t.upper)try{n=IDBKeyRange.bound(a,t.upper,!0,t.upperOpen)}catch(e){if("DataError"===e.name&&0===e.code)return r()}else n=IDBKeyRange.lowerBound(a,!0);t=n,s=null,o=null,e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l}},e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l):n?e.openCursor(t,"prev").onsuccess=u:e.openCursor(t).onsuccess=u}function nn(e,t,n){var i,r,s="startkey"in e&&e.startkey,o="endkey"in e&&e.endkey,a="key"in e&&e.key,c="keys"in e&&e.keys,l=e.skip||0,u="number"==typeof e.limit?e.limit:-1,d=!1!==e.inclusive_end;if(!c&&(r=(i=function(e,t,n,i,r){try{if(e&&t)return r?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return r?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return r?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(i)return IDBKeyRange.only(i)}catch(e){return{error:e}}return null}(s,o,d,a,e.descending))&&i.error)&&("DataError"!==r.name||0!==r.code))return n(ne(Q,r.name,r.message));var h=[Vt,"by-sequence",zt];e.attachments&&h.push("attach-store");var f=Jt(t,h,"readonly");if(f.error)return n(f.error);var g=f.txn;g.oncomplete=function(){e.attachments?Yt(E,e.binary).then(A):A()},g.onabort=Ut(n);var p,m,v,y=g.objectStore(Vt),b=g.objectStore("by-sequence"),w=g.objectStore(zt),_=b.index("_doc_id_rev"),E=[];function S(t,n){var i={id:n.id,key:n.id,value:{rev:t}};n.deleted?c&&(E.push(i),i.value.deleted=!0,i.doc=null):l--<=0&&(E.push(i),e.include_docs&&function(t,n,i){var r=t.id+"::"+i;_.get(r).onsuccess=function(i){if(n.doc=Gt(i.target.result)||{},e.conflicts){var r=qe(t);r.length&&(n.doc._conflicts=r)}Kt(n.doc,e,g)}}(n,i,t))}function x(e){for(var t=0,n=e.length;t0&&(m=e.target.result[0])},b.openCursor(null,"prev").onsuccess=function(e){var t=e.target.result,n=void 0;return t&&t.key&&(n=t.key),v({target:{result:[n]}})}),r||0===u?void 0:c?function(e,t,n){var i=new Array(e.length),r=0;e.forEach((function(s,o){t.get(s).onsuccess=function(t){t.target.result?i[o]=t.target.result:i[o]={key:s,error:"not_found"},++r===e.length&&n(e,i,{})}}))}(e.keys,y,L):-1===u?function(e,t,n){if("function"!=typeof e.getAll){var i=[];e.openCursor(t).onsuccess=function(e){var t=e.target.result;t?(i.push(t.value),t.continue()):n({target:{result:i}})}}else e.getAll(t).onsuccess=n}(y,i,(function(t){var n=t.target.result;e.descending&&(n=n.reverse()),x(n)})):void tn(y,i,e.descending,u+l,L)}var rn=!1,sn=[];function on(){!rn&&sn.length&&(rn=!0,sn.shift()())}function an(e,t,n,s){if((e=L(e)).continuous){var o=n+":"+Oe();return Qt.addListener(n,o,t,e),Qt.notify(n),{cancel:function(){Qt.removeListener(n,o)}}}var a=e.doc_ids&&new i(e.doc_ids);e.since=e.since||0;var c=e.since,l="limit"in e?e.limit:-1;0===l&&(l=1);var u,d,h,f,g=[],p=0,m=re(e),v=new r;function y(e,t,n,i){if(n.seq!==t)return i();if(n.winningRev===e._rev)return i(n,e);var r=e._id+"::"+n.winningRev;f.get(r).onsuccess=function(e){i(n,Gt(e.target.result))}}function b(){e.complete(null,{results:g,last_seq:c})}var w=[Vt,"by-sequence"];e.attachments&&w.push("attach-store");var _=Jt(s,w,"readonly");if(_.error)return e.complete(_.error);(u=_.txn).onabort=Ut(e.complete),u.oncomplete=function(){!e.continuous&&e.attachments?Yt(g).then(b):b()},d=u.objectStore("by-sequence"),h=u.objectStore(Vt),f=d.index("_doc_id_rev"),tn(d,e.since&&!e.descending?IDBKeyRange.lowerBound(e.since,!0):null,e.descending,l,(function(t,n,i){if(i&&t.length){var r=new Array(t.length),s=new Array(t.length),o=0;n.forEach((function(n,c){!function(e,t,n){if(a&&!a.has(e._id))return n();var i=v.get(e._id);if(i)return y(e,t,i,n);h.get(e._id).onsuccess=function(r){i=Zt(r.target.result),v.set(e._id,i),y(e,t,i,n)}}(Gt(n),t[c],(function(n,a){s[c]=n,r[c]=a,++o===t.length&&function(){for(var t=[],n=0,o=r.length;nr&&(r=n),t.continue()}}()}function o(){var e=$t(s,s.winningRev,s.deleted);n.put(e).onsuccess=function(){i.continue()}}}}e._meta=null,e._remote=!1,e.type=function(){return"idb"},e._id=k((function(t){t(null,e._meta.instanceId)})),e._bulkDocs=function(n,i,s){en(t,n,i,e,r,a(s))},e._get=function(e,t,n){var i,s,o,a=t.ctx;if(!a){var c=Jt(r,[Vt,"by-sequence","attach-store"],"readonly");if(c.error)return n(c.error);a=c.txn}function l(){n(o,{doc:i,metadata:s,ctx:a})}a.objectStore(Vt).get(e).onsuccess=function(e){if(!(s=Zt(e.target.result)))return o=ne(z,"missing"),l();var n;if(t.rev)n=t.latest?function(e,t){for(var n,i=t.rev_tree.slice();n=i.pop();){var r=n.pos,s=n.ids,o=s[0],a=s[1],c=s[2],l=0===c.length,u=n.history?n.history.slice():[];if(u.push({id:o,pos:r,opts:a}),l)for(var d=0,h=u.length;d=43)},i.onerror=e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)}})).catch((function(){return!1}))}(u)),cn.then((function(e){c=e,h()})),u.oncomplete=function(){d=!0,h()},u.onabort=Ut(n)},f.onerror=function(e){var t=e.target.error&&e.target.error.message;t?-1!==t.indexOf("stored database is a higher version")&&(t=new Error('This DB was created with the newer "indexeddb" adapter, but you are trying to open it with the older "idb" adapter')):t="Failed to open indexedDB, are you in private browsing mode?",q("error",t),n(ne(Q,t))}}(n,e,t)}),t,n.constructor)}dn.valid=function(){try{return"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}};var hn={};function fn(e){var t=e.doc||e.ok,n=t&&t._attachments;n&&Object.keys(n).forEach((function(e){var t=n[e];t.data=_e(t.data,t.content_type)}))}function gn(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function pn(e){return e._attachments&&Object.keys(e._attachments)?Promise.all(Object.keys(e._attachments).map((function(t){var n=e._attachments[t];if(n.data&&"string"!=typeof n.data)return new Promise((function(e){xe(n.data,e)})).then((function(e){n.data=e}))}))):Promise.resolve()}function mn(e,t){if(function(e){if(!e.prefix)return!1;var t=fe(e.prefix).protocol;return"http"===t||"https"===t}(t)){var n=t.name.substr(t.prefix.length);e=t.prefix.replace(/\/?$/,"/")+encodeURIComponent(n)}var i=fe(e);(i.user||i.password)&&(i.auth={username:i.user,password:i.password});var r=i.path.replace(/(^\/|\/$)/g,"").split("/");return i.db=r.pop(),-1===i.db.indexOf("%")&&(i.db=encodeURIComponent(i.db)),i.path=r.join("/"),i}function vn(e,t){return yn(e,e.db+"/"+t)}function yn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function bn(e){return"?"+Object.keys(e).map((function(t){return t+"="+encodeURIComponent(e[t])})).join("&")}function wn(t,n){var i=this,r=mn(t.name,t),s=vn(r,"");t=L(t);var a,c=function(e,n){if((n=n||{}).headers=n.headers||new rt,n.credentials="include",t.auth||r.auth){var i=t.auth||r.auth,s=i.username+":"+i.password,o=ve(unescape(encodeURIComponent(s)));n.headers.set("Authorization","Basic "+o)}var a=t.headers||{};return Object.keys(a).forEach((function(e){n.headers.append(e,a[e])})),function(e){var t="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",n=-1!==t.indexOf("msie"),i=-1!==t.indexOf("trident"),r=-1!==t.indexOf("edge"),s=!("method"in e)||"GET"===e.method;return(n||i||r)&&s}(n)&&(e+=(-1===e.indexOf("?")?"?":"&")+"_nonce="+Date.now()),(t.fetch||it)(e,n)};function l(e,t){return C(e,f()((function(e){d().then((function(){return t.apply(this,e)})).catch((function(t){e.pop()(t)}))}))).bind(i)}function u(e,t,n){var i={};return(t=t||{}).headers=t.headers||new rt,t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json"),t.headers.get("Accept")||t.headers.set("Accept","application/json"),c(e,t).then((function(e){return i.ok=e.ok,i.status=e.status,e.json()})).then((function(e){if(i.data=e,!i.ok){i.data.status=i.status;var t=ie(i.data);if(n)return n(t);throw t}if(Array.isArray(i.data)&&(i.data=i.data.map((function(e){return e.error||e.missing?ie(e):e}))),!n)return i;n(null,i.data)}))}function d(){return t.skip_setup?Promise.resolve():a||((a=u(s).catch((function(e){return e&&e.status&&404===e.status?(F(404,"PouchDB is just detecting if the remote exists."),u(s,{method:"PUT"})):Promise.reject(e)})).catch((function(e){return!(!e||!e.status||412!==e.status)||Promise.reject(e)}))).catch((function(){a=null})),a)}function h(e){return e.split("/").map(encodeURIComponent).join("/")}o()((function(){n(null,i)})),i._remote=!0,i.type=function(){return"http"},i.id=l("id",(function(e){c(yn(r,"")).then((function(e){return e.json()})).catch((function(){return{}})).then((function(t){var n=t&&t.uuid?t.uuid+r.db:vn(r,"");e(null,n)}))})),i.compact=l("compact",(function(e,t){"function"==typeof e&&(t=e,e={}),e=L(e),u(vn(r,"_compact"),{method:"POST"}).then((function(){!function n(){i.info((function(i,r){r&&!r.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)}))}()}))})),i.bulkGet=C("bulkGet",(function(e,t){var n=this;function i(t){var n={};e.revs&&(n.revs=!0),e.attachments&&(n.attachments=!0),e.latest&&(n.latest=!0),u(vn(r,"_bulk_get"+bn(n)),{method:"POST",body:JSON.stringify({docs:e.docs})}).then((function(n){e.attachments&&e.binary&&n.data.results.forEach((function(e){e.docs.forEach(fn)})),t(null,n.data)})).catch(t)}function s(){var i=Math.ceil(e.docs.length/50),r=0,s=new Array(i);function o(e){return function(n,o){s[e]=o.results,++r===i&&t(null,{results:se(s)})}}for(var a=0;at?t:a;var c=vn(r,"_changes"+bn(i)),p={signal:g.signal,method:h,body:JSON.stringify(l)};f=n,e.aborted||d().then((function(){return u(c,p,o)})).catch(o)}},m={results:[]},v=function(n,i){if(!e.aborted){var r=0;if(i&&i.results){r=i.results.length,m.last_seq=i.last_seq;var c=null,l=null;"number"==typeof i.pending&&(c=i.pending),"string"!=typeof m.last_seq&&"number"!=typeof m.last_seq||(l=m.last_seq);e.query_params,i.results=i.results.filter((function(t){a--;var n=re(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&fn(t),e.return_docs&&m.results.push(t),e.onChange(t,c,l)),n}))}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(f=i.last_seq);var u=s&&a<=0||i&&r0?e.slice(n):e}function d(e){var t=e.value;return t&&"object"==typeof t&&t._id||e.id}function h(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&function(e){e.rows.forEach((function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach((function(e){var n=t[e];t[e].data=_e(n.data,n.content_type)}))}))}(t),t}}function g(e,t,n,i){var r=t[e];void 0!==r&&(i&&(r=encodeURIComponent(JSON.stringify(r))),n.push(e+"="+r))}function p(e){if(void 0!==e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function m(e,t){var n=e.descending?"endkey":"startkey",i=e.descending?"startkey":"endkey";if(void 0!==e[n]&&void 0!==e[i]&&ft(e[n],e[i])>0)throw new _n("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&!1!==e.reduce){if(e.include_docs)throw new _n("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new _n("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach((function(t){var n=function(e){if(e){if("number"!=typeof e)return new _n('Invalid value for integer: "'+e+'"');if(e<0)return new _n('Invalid value for positive integer: "'+e+'"')}}(e[t]);if(n)throw n}))}function v(e){return function(t){if(404===t.status)return e;throw t}}function y(e,t,n){var r="_local/doc_"+e,s={_id:r,keys:[]},o=n.get(e),a=o[0];return(function(e){return 1===e.length&&/^1-/.test(e[0].rev)}(o[1])?Promise.resolve(s):t.db.get(r).catch(v(s))).then((function(e){return function(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):Promise.resolve({rows:[]})}(e).then((function(t){return function(e,t){for(var n=[],r=new i,s=0,o=t.rows.length;s0&&0===ft(o.key,t)&&a.push(i),n.set(mt(a),o),t=o.key}return n}return g().then((function(){return f.finish()})).then((function(){e.seq=c}))}(e,n)}))()}function _(e,t){return Ln(b(e),(function(){return function(e,t){var i,s=e.reduceFun&&!1!==t.reduce,o=t.skip||0;void 0===t.keys||t.keys.length||(t.limit=0,delete t.keys);function a(t){return t.include_docs=!0,e.db.allDocs(t).then((function(e){return i=e.total_rows,e.rows.map((function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(tn))return e.doc.value}var i=function(e){for(var t=[],n=[],i=0;;){var r=e[i++];if("\0"!==r)switch(r){case"1":t.push(null);break;case"2":t.push("1"===e[i]),i++;break;case"3":var s=vt(e,i);t.push(s.num),i+=s.length;break;case"4":for(var o="";;){var a=e[i];if("\0"===a)break;o+=a,i++}o=o.replace(/\u0001\u0001/g,"\0").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(o);break;case"5":var c={element:[],index:t.length};t.push(c.element),n.push(c);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+r)}else{if(1===t.length)return t.pop();yt(t,n)}}}(e.doc._id);return{key:i[0],id:i[1],value:"value"in e.doc?e.doc.value:null}}))}))}function l(a){var l;if(l=s?function(e,t,i){0===i.group_level&&delete i.group_level;var r=i.group||i.group_level,s=n(e.reduceFun),o=[],a=isNaN(i.group_level)?Number.POSITIVE_INFINITY:i.group_level;t.forEach((function(e){var t=o[o.length-1],n=r?e.key:null;if(r&&Array.isArray(n)&&(n=n.slice(0,a)),t&&0===ft(t.groupKey,n))return t.keys.push([e.key,e.id]),void t.values.push(e.value);o.push({keys:[[e.key,e.id]],values:[e.value],groupKey:n})})),t=[];for(var l=0,d=o.length;l0)||function(e){return e._conflicts&&e._conflicts.length>0}(e.doc)||(e.doc._conflicts&&delete e.doc._conflicts,r.push(e.doc),delete n[e.id])}))}))}return Promise.resolve().then((function(){var e=Object.keys(n).filter((function(e){var t=n[e].missing;return 1===t.length&&Zn(t[0])}));if(e.length>0)return o(e)})).then((function(){var o=function(e){var t=[];return Object.keys(e).forEach((function(n){e[n].missing.forEach((function(e){t.push({id:n,rev:e})}))})),{docs:t,revs:!0,latest:!0}}(n);if(o.docs.length)return e.bulkGet(o).then((function(n){if(i.cancelled)throw new Error("cancelled");return Promise.all(n.results.map((function(n){return Promise.all(n.docs.map((function(n){var i=n.ok;return n.error&&(s=!1),i&&i._attachments?function(e,t,n){var i=ae(t)&&!ae(e),r=Object.keys(n._attachments);return i?e.get(n._id).then((function(i){return Promise.all(r.map((function(r){return function(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}(i,n,r)?t.getAttachment(n._id,r):e.getAttachment(i._id,r)})))})).catch((function(e){if(404!==e.status)throw e;return Gn(t,n)})):Gn(t,n)}(t,e,i).then((function(e){var t=Object.keys(i._attachments);return e.forEach((function(e,n){var r=i._attachments[t[n]];delete r.stub,delete r.length,r.data=e})),i})):i})))}))).then((function(e){r=r.concat(se(e).filter(Boolean))}))}))})).then((function(){return{ok:s,docs:r}}))}function Kn(e,t,n,i,r){return e.get(t).catch((function(n){if(404===n.status)return"http"!==e.adapter&&"https"!==e.adapter||F(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:i,_id:t,history:[],replicator:"pouchdb",version:1};throw n})).then((function(s){if(!r.cancelled&&s.last_seq!==n)return s.history=(s.history||[]).filter((function(e){return e.session_id!==i})),s.history.unshift({last_seq:n,session_id:i}),s.history=s.history.slice(0,5),s.version=1,s.replicator="pouchdb",s.session_id=i,s.last_seq=n,e.put(s).catch((function(s){if(409===s.status)return Kn(e,t,n,i,r);throw s}))}))}function Yn(e,t,n,i,r){this.src=e,this.target=t,this.id=n,this.returnValue=i,this.opts=r||{}}Yn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then((function(){return n.updateSource(e,t)}))},Yn.prototype.updateTarget=function(e,t){return this.opts.writeTargetCheckpoint?Kn(this.target,this.id,e,t,this.returnValue):Promise.resolve(!0)},Yn.prototype.updateSource=function(e,t){if(this.opts.writeSourceCheckpoint){var n=this;return Kn(this.src,this.id,e,t,this.returnValue).catch((function(e){if(Qn(e))return n.opts.writeSourceCheckpoint=!1,!0;throw e}))}return Promise.resolve(!0)};var Xn={undefined:function(e,t){return 0===ft(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return function(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history};return function e(t,n){var i=t[0],r=t.slice(1),s=n[0],o=n.slice(1);if(!i||0===n.length)return{last_seq:0,history:[]};if(Jn(i.session_id,n))return{last_seq:i.last_seq,history:t};if(Jn(s.session_id,r))return{last_seq:s.last_seq,history:o};return e(r,o)}(e.history,t.history)}(t,e).last_seq}};function Jn(e,t){var n=t[0],i=t.slice(1);return!(!e||0===t.length)&&(e===n.session_id||Jn(e,i))}function Qn(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}Yn.prototype.getCheckpoint=function(){var e=this;return e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then((function(e){return e.last_seq||0})).catch((function(e){if(404!==e.status)throw e;return 0})):e.target.get(e.id).then((function(t){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?t.last_seq||0:e.src.get(e.id).then((function(e){return t.version!==e.version?0:(n=t.version?t.version.toString():"undefined")in Xn?Xn[n](t,e):0;var n}),(function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:0}).then((function(){return 0}),(function(n){return Qn(n)?(e.opts.writeSourceCheckpoint=!1,t.last_seq):0}));throw n}))})).catch((function(e){if(404!==e.status)throw e;return 0}))};function ei(e,t,n){var i=n.doc_ids?n.doc_ids.sort(ft):"",r=n.filter?n.filter.toString():"",s="",o="",a="";return n.selector&&(a=JSON.stringify(n.selector)),n.filter&&n.query_params&&(s=JSON.stringify(function(e){return Object.keys(e).sort(ft).reduce((function(t,n){return t[n]=e[n],t}),{})}(n.query_params))),n.filter&&"_view"===n.filter&&(o=n.view.toString()),Promise.all([e.id(),t.id()]).then((function(e){var t=e[0]+e[1]+r+o+s+i+a;return new Promise((function(e){Ce(t,e)}))})).then((function(e){return"_local/"+(e=e.replace(/\//g,".").replace(/\+/g,"_"))}))}function ti(e,t,n,i,r){var s,a,c,l=[],u={seq:0,changes:[],docs:[]},d=!1,h=!1,f=!1,g=0,p=n.continuous||n.live||!1,m=n.batch_size||100,v=n.batches_limit||10,y=n.style||"all_docs",b=!1,w=n.doc_ids,_=n.selector,E=[],S=Oe();r=r||{ok:!0,start_time:(new Date).toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var x={};function A(){return c?Promise.resolve():ei(e,t,n).then((function(r){a=r;var s={};s=!1===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:"source"===n.checkpoint?{writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:"target"===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:{writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},c=new Yn(e,t,a,i,s)}))}function k(){if(E=[],0!==s.docs.length){var e=s.docs,o={timeout:n.timeout};return t.bulkDocs({docs:e,new_edits:!1},o).then((function(t){if(i.cancelled)throw T(),new Error("cancelled");var n=Object.create(null);t.forEach((function(e){e.error&&(n[e.id]=e)}));var s=Object.keys(n).length;r.doc_write_failures+=s,r.docs_written+=e.length-s,e.forEach((function(e){var t=n[e._id];if(t){r.errors.push(t);var s=(t.name||"").toLowerCase();if("unauthorized"!==s&&"forbidden"!==s)throw t;i.emit("denied",L(t))}else E.push(e)}))}),(function(t){throw r.doc_write_failures+=e.length,t}))}}function C(){if(s.error)throw new Error("There was a problem getting docs.");r.last_seq=g=s.seq;var e=L(r);return E.length&&(e.docs=E,"number"==typeof s.pending&&(e.pending=s.pending,delete s.pending),i.emit("change",e)),d=!0,c.writeCheckpoint(s.seq,S).then((function(){if(i.emit("checkpoint",{checkpoint:s.seq}),d=!1,i.cancelled)throw T(),new Error("cancelled");s=void 0,F()})).catch((function(e){throw R(e),e}))}function I(){return Wn(e,t,s.diffs,i).then((function(e){s.error=!e.ok,e.docs.forEach((function(e){delete s.diffs[e._id],r.docs_read++,s.docs.push(e)}))}))}function P(){var e;i.cancelled||s||(0!==l.length?(s=l.shift(),i.emit("checkpoint",{start_next_batch:s.seq}),(e={},s.changes.forEach((function(t){i.emit("checkpoint",{revs_diff:t}),"_user/"!==t.id&&(e[t.id]=t.changes.map((function(e){return e.rev})))})),t.revsDiff(e).then((function(e){if(i.cancelled)throw T(),new Error("cancelled");s.diffs=e}))).then(I).then(k).then(C).then(P).catch((function(e){B("batch processing terminated with error",e)}))):O(!0))}function O(e){0!==u.changes.length?(e||h||u.changes.length>=m)&&(l.push(u),u={seq:0,changes:[],docs:[]},"pending"!==i.state&&"stopped"!==i.state||(i.state="active",i.emit("active")),P()):0!==l.length||s||((p&&x.live||h)&&(i.state="pending",i.emit("paused")),h&&T())}function B(e,t){f||(t.message||(t.message=e),r.ok=!1,r.status="aborting",l=[],u={seq:0,changes:[],docs:[]},T(t))}function T(s){if(!(f||i.cancelled&&(r.status="cancelled",d)))if(r.status=r.status||"complete",r.end_time=(new Date).toISOString(),r.last_seq=g,f=!0,s){(s=ne(s)).result=r;var o=(s.name||"").toLowerCase();"unauthorized"===o||"forbidden"===o?(i.emit("error",s),i.removeAllListeners()):function(e,t,n,i){if(!1===e.retry)return t.emit("error",n),void t.removeAllListeners();if("function"!=typeof e.back_off_function&&(e.back_off_function=D),t.emit("requestError",n),"active"===t.state||"pending"===t.state){t.emit("paused",n),t.state="stopped";var r=function(){e.current_back_off=0};t.once("paused",(function(){t.removeListener("active",r)})),t.once("active",r)}e.current_back_off=e.current_back_off||0,e.current_back_off=e.back_off_function(e.current_back_off),setTimeout(i,e.current_back_off)}(n,i,s,(function(){ti(e,t,n,i)}))}else i.emit("complete",r),i.removeAllListeners()}function N(e,t,r){if(i.cancelled)return T();"number"==typeof t&&(u.pending=t),re(n)(e)&&(u.seq=e.seq||r,u.changes.push(e),i.emit("checkpoint",{pending_batch:u.seq}),o()((function(){O(0===l.length&&x.live)})))}function M(e){if(b=!1,i.cancelled)return T();if(e.results.length>0)x.since=e.results[e.results.length-1].seq,F(),O(!0);else{var t=function(){p?(x.live=!0,F()):h=!0,O(!0)};s||0!==e.results.length?t():(d=!0,c.writeCheckpoint(e.last_seq,S).then((function(){d=!1,r.last_seq=g=e.last_seq,t()})).catch(R))}}function q(e){if(b=!1,i.cancelled)return T();B("changes rejected",e)}function F(){if(!b&&!h&&l.length1)for(var n=1;n0&&o.length>r&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,console&&console.warn&&console.warn(a)}return e}function h(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function f(e,t,n){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=h.bind(i);return r.listener=n,i.wrapFn=r,r}function g(e,t,n){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var c=r[e];if(void 0===c)return!1;if("function"==typeof c)s(c,this,t);else{var l=c.length,u=m(c,l);for(n=0;n=0;s--)if(n[s]===t||n[s].listener===t){o=n[s].listener,r=s;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1=0;i--)this.removeListener(e,t[i]);return this},a.prototype.listeners=function(e){return g(this,e,!0)},a.prototype.rawListeners=function(e){return g(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?i(this._events):[]}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){"use strict";var i,r,s,o=[n(37),n(38),n(39),n(40),n(41),n(42)],a=-1,c=[],l=!1;function u(){i&&r&&(i=!1,r.length?c=r.concat(c):a=-1,c.length&&d())}function d(){if(!i){l=!1,i=!0;for(var e=c.length,t=setTimeout(u);e;){for(r=c,c=[];r&&++a1)for(var n=1;n3){l(s.shift().getId())}const t=document.getElementById("notification-content"),n=document.createElement("div");n.classList.add("neon-notification"),n.classList.add("neon-notification-"+e.type),n.id=e.getId(),n.innerHTML=e.message,t.append(n),t.style.display="",e.display()}(e),e.setTimeoutId(window.setTimeout(l,5e3,e.getId())),document.getElementById(e.getId()).addEventListener("click",()=>{window.clearTimeout(e.timeoutID),l(e.getId())})}function d(e,t="default",n=null){const r=new c(e,t,n);"error"!=r.type&&"warning"!=r.type||(0,i.recordNotification)(r),u(r)}t.Notification=c,t.queueNotification=d,t.default={queueNotification:d}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setSettings=t.getSettings=void 0;let i=null;const r={zoom:100,glyphOpacity:100,imageOpacity:100,circleSize:25,highlightMode:"none",userMode:"edit",insertMode:"punctum",insertTab:"primitiveTab",selectionMode:"selBySyllable",debugMode:!1,displayBBox:!1,displayText:!1,displayInfo:!1,displayErrLog:!1,viewBox:null};t.getSettings=function(){return i.settings},t.setSettings=function(e){i.set(e)},t.default=class{constructor(e){i=this,this.id=e,this.load()}load(){try{const e=JSON.parse(window.localStorage.getItem(this.id));this.sync(e)}catch(e){this.sync({})}}set(e){this.settings=Object.assign(Object.assign({},this.settings),e),window.localStorage.setItem(this.id,JSON.stringify(this.settings))}sync(e){this.settings=Object.assign(Object.assign({},r),e),window.localStorage.setItem(this.id,JSON.stringify(this.settings))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.selectAll=t.selectNn=t.selectBBox=t.getStaffBBox=t.isMultiStaveSelection=t.sharedSecondLevelParent=t.elementsHaveCorrectType=t.sharedLogicalParent=t.areAdjacent=t.isLigature=t.selectNcs=t.select=t.selectLayerElement=t.selectStaff=t.unselect=t.getSelectionType=void 0;const i=n(18),r=n(13),s=n(24),o=n(27),a=n(14),c=n(3),l=n(7);function u(){const e=document.getElementsByClassName("sel-by is-active");return 0!==e.length?e[0].id:null}function d(){document.querySelectorAll(".no-moving").forEach(e=>e.classList.remove("no-moving")),document.querySelectorAll(".selected").forEach(e=>{e.classList.remove("selected"),e.classList.contains("staff")?(e.removeAttribute("style"),i.unhighlight(e)):(e.removeAttribute("style"),e.style.fill=""),Array.from(e.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""}),Array.from(e.querySelectorAll(".sylTextRect-display")).forEach(e=>{e.style.fill="blue"}),e.parentElement.classList.contains("syllable-highlighted")&&(e.parentElement.style.fill="",e.parentElement.classList.add("syllable"),e.parentElement.classList.remove("syllable-highlighted"),Array.from(e.parentElement.querySelectorAll(".divLine")).forEach(e=>{e.style.stroke="",e.setAttribute("stroke-width","30px")}),Array.from(e.parentElement.querySelectorAll(".neume")).forEach(e=>{e.style.fill=""})),l.selectAll("#resizeRect").remove(),l.selectAll(".resizePoint").remove(),l.selectAll(".rotatePoint").remove()}),Array.from(document.querySelectorAll(".text-select")).forEach(e=>{e.style.color="",e.style.fontWeight="",e.classList.remove("text-select")}),document.getElementById("selByStaff").classList.contains("is-active")?a.endOptionsSelection():s.endGroupingSelection(),document.getElementById("extraEdit").innerHTML="",document.getElementById("extraEdit").parentElement.classList.add("hidden"),(0,r.updateHighlight)()}function h(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),a.triggerSingleStaffActions(),s.initGroupingListeners(),t.dragInit())}function f(e,t){e.classList.contains("selected")||(e.classList.add("selected"),i.unhighlight(e),i.highlight(e,"#d00"),t.dragInit())}function g(e,t,n=!0){if(e){if(e.classList.contains("staff"))return h(e,t);if(e.classList.contains("layer"))return f(e,t);if(!e.classList.contains("selected")&&!e.classList.contains("sylTextRect")&&!e.classList.contains("sylTextRect-display")){let t;if(e.classList.add("selected"),e.style.fill="#d00",e.style.stroke=e.classList.contains("divLine")?"#d00":"black",e.querySelectorAll(".sylTextRect-display").length&&e.querySelectorAll(".sylTextRect-display").forEach(e=>{e.style.fill="#d00"}),e.querySelectorAll(".divLine").length&&e.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"}),e.classList.contains("syllable")&&e.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),e.classList.contains("syllable")?t=e.id:null!==e.closest(".syllable")&&(t=e.closest(".syllable").id),void 0!==t){document.querySelectorAll("span."+t).forEach(e=>{e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select")})}}n&&(0,r.updateHighlight)()}}async function p(e,t){const n=await t.getElementAttr(e.id,t.view.getCurrentPageURI());return Boolean(n.ligated)}function m(e,t){if(t.length<2)return!1;switch(e){case"selBySyllable":t.forEach(e=>{if(!e.classList.contains("syllable"))return!1});break;case"selByNeume":t.forEach(e=>{if(!e.classList.contains("neume"))return!1});break;case"selByStaff":t.forEach(e=>{if(!e.classList.contains("staff"))return!1});break;default:return!1}return!0}function v(e){const t=Array.from(e),n=t.pop().parentElement.parentElement;for(const e of t){if(e.parentElement.parentElement.id!==n.id)return!1}return!0}function y(e,t,n){const i=e,r=i.closest(".syl");if(!r.classList.contains("selected")){r.classList.add("selected"),i.style.fill="#d00";const s=e.closest(".syllable");s.style.fill="#d00",s.classList.add("syllable-highlighted"),s.querySelectorAll(".divLine").length&&(s.querySelectorAll(".neume").forEach(e=>{e.style.fill="#d00"}),s.querySelectorAll(".divLine").forEach(e=>{e.style.stroke="#d00"})),void 0!==n&&(0,o.resize)(r,n,t),void 0!==t&&t.dragInit();const a=e.closest(".syllable").id;if(void 0!==a){const e=document.querySelector("span."+a);e&&(e.style.color="#d00",e.style.fontWeight="bold",e.classList.add("text-select"))}}a.triggerBBoxActions()}t.getSelectionType=u,t.unselect=d,t.selectStaff=h,t.selectLayerElement=f,t.select=g,t.selectNcs=async function(e,t,n){if(!e.parentElement.classList.contains("selected")){const i=e.parentElement;if(d(),g(i),await p(i,t)){const e=i.previousSibling;if(await p(e,t))g(e);else{const e=i.nextSibling;await p(e,t)?g(e):console.warn("Error: Neither prev or next nc are ligatures")}s.triggerGrouping("ligature")}else i.classList.contains("nc")?a.triggerNcActions(i):console.warn("No action triggered!");n.dragInit()}},t.isLigature=p,t.areAdjacent=function(e,t){if(t.length<2)return!1;let n;switch(e){case"selBySyllable":n=Array.from(document.querySelectorAll(".syllable"));break;case"selByNeume":return!0;case"selByNc":n=Array.from(document.querySelectorAll(".nc"));break;case"selByStaff":n=Array.from(document.querySelectorAll(".staff"));break;default:return!1}const i=[];for(let e=0;e!(e.classList.contains("divLine")||e.classList.contains("accid")||e.classList.contains("clef")))))return!1;switch(e){case"selBySyllable":const e=t[0].closest(".staff");for(let n=0;n{const o=e.getAttribute("d").match(/\d+/g).map(e=>Number(e));void 0===s&&(s=Math.atan((o[3]-o[1])/(o[2]-o[0]))),(void 0===n||Math.min(o[1],o[3])r)&&(r=Math.max(o[1],o[3])),(void 0===i||o[2]>i)&&(i=o[2])}),{id:e.id,ulx:t,uly:n,lrx:i,lry:r,rotate:s}},t.selectBBox=y,t.selectNn=function(e){return!(e.length>0)||(e.forEach(e=>{g(e)}),!1)},t.selectAll=async function(e,t,n){const i=u();if(d(),0===e.length)return;let r,l=!1,h=!1;switch(i){case"selBySyllable":r=".syllable";break;case"selByNeume":r=".neume";break;case"selByNc":r=".nc";break;case"selByStaff":r=".staff";break;case"selByBBox":r=".sylTextRect-display";break;case"selByLayerElement":r=".clef, .custos, .accid, .divLine";break;default:return void console.error("Unknown selection type "+i)}const f=new Set;for(const t of e){let e=t.closest(r);if(null===e){if(e=t.closest(".clef, .custos, .accid, .divLine"),null===e){console.warn("Element "+t.id+" is not part of specified group and is not a clef or custos or accid or divLine.");continue}l=l||!0}else h=h||!0;f.add(e);let n=e,i=n.getAttribute("mei:follows"),s=n.getAttribute("mei:precedes");for(;i||s;){if(i){if(n=document.querySelector("#"+i.slice(1)),f.has(n))break;n.classList.add("no-moving"),f.add(n),i=n.getAttribute("mei:follows")}if(s){if(n=document.querySelector("#"+s.slice(1)),f.has(n))break;n.classList.add("no-moving"),f.add(n),s=n.getAttribute("mei:precedes")}}}f.forEach(e=>g(e,n,!1));const p=Array.from(f.values());if(!l||h)switch(i){case"selByStaff":switch(p.length){case 1:a.triggerSingleStaffActions(),s.initGroupingListeners(),(0,o.resize)(p[0],t,n);break;default:a.triggerMultiStaffActions(),s.initGroupingListeners()}break;case"selByLayerElement":1===f.size?a.triggerLayerElementActions(p[0]):a.triggerDefaultActions();break;case"selBySyllable":switch(p.length){case 1:null===p[0].querySelector(".syl > rect")?(c.queueNotification('The selected syllable does not contain a <syl> element, please insert one using button "Add Syllable Text".',"warning"),a.triggerSyllableActions("noSyl"),a.addAddSylListener()):a.triggerSyllableActions("singleSelect");break;default:s.isLinkable("selBySyllable",p)?a.triggerSyllableActions("linkableSelect"):s.isGroupable("selBySyllable",p)?a.triggerSyllableActions("multiSelect"):a.triggerSyllableActions("default")}break;case"selByNeume":switch(p.length){case 1:a.triggerNeumeActions(),s.initGroupingListeners();break;default:s.isGroupable("selByNeume",p)?s.triggerGrouping("neume"):a.triggerDefaultActions()}break;case"selByNc":switch(p.length){case 1:a.triggerNcActions(p[0]);break;case 2:if(v(p)){if(p[0].parentElement===p[1].parentElement){const e=Array.from(p[0].parentElement.children);if(1===Math.abs(e.indexOf(p[0])-e.indexOf(p[1]))){let e=p[0].children[0],t=p[1].children[0],n=e.x.baseVal.value,i=t.x.baseVal.value,r=e.y.baseVal.value,o=t.y.baseVal.value;if((n>i||n===i&&ry(e,n,void 0))}break;default:console.error("Unknown selection type. This should not have occurred.")}else 1===f.size?a.triggerLayerElementActions(p[0]):"selBySyllable"==i?a.triggerDefaultSylActions():a.triggerDefaultActions()}},function(e,t,n){"use strict";e.exports=function(e){return function(){var t=arguments.length;if(t){for(var n=[],i=-1;++i\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',groupingTab:'

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

\n

\n \n

',systemTab:'

\n \n

\n

Click upper left and lower right corners of new staff.

'},t.insertControlsPanel='
\n
INSERT
\n \n \n \n
\n\t
\n \n
',t.editControlsPanel='
\n
EDIT
\n \n \n \n
\n
\n
\n
\n
Selection Mode:
\n
\n\n \n \n \n \n \n\n
\n
\n
\n\n
\n \n \n \x3c!--\n * The extraEdit panel is added for edit options that have dropdown menus\n * Like the Neume and Clef menus\n * This is done because the moreEdit menu needs to have overflow for cases where it has lots of buttons\n * But overflow ruins dropdown menus\n --\x3e\n \n
\n
\n
\n
\n
',t.ncActionContents='\n ',t.defaultNeumeActionContents='
\n \n \n
',t.neumeActionContents='\n
\n \n ',t.defaultActionContents='
\n \n
',t.defaultSylActionContents='\n ',t.custosActionContents='
\n \n \n
',t.layerElementOutActionContents='
\n \n \n \n
',t.layerElementInActionContents='
\n \n \n \n
',t.accidActionContents='\n ',t.staffSplitActionContents='
Split System:
\n
\n \n \n \n
',t.staffMergeActionContents='\n
\n \n \n
',t.columnActionContents='
\n Edit Column Information:\n
\n \n \n \n \n
\n
\n
',t.clefActionContents='\n
\n \n \n
\n ',t.divLineActionContents='\n',t.bboxActionContents='
\n \n \n
',t.groupingMenu={nc:'
\n
\n \n \n
\n
',neume:'
\n
\n \n \n
\n
',syl:'
\n
\n \n \n \n
\n\t\t
',ligatureNc:'
\n
\n \n \n \n
\n
',ligature:'
\n
\n \n \n
\n
',splitSyllable:'
\n
\n \n \n
\n
'},t.addTextModal='
\n \n \n
\n
Cancel
\n
Add
\n
\n
',t.editTextModal='
\n \n \n
\n
Cancel
\n
Save
\n
\n
',t.hotkeysModal='\n
\n \x3c!-- "Display" hotkeys --\x3e\n
\n
Display
\n
\n
\n
Shift
\n
+
\n
+
\n
\n
Zoom In
\n
\n
\n
\n
Shift
\n
+
\n
-
\n
\n
Zoom Out
\n
\n
\n
\n
0
\n
\n
Zoom Reset
\n
\n
\n
\n
h
\n
\n
Hide Glyph
\n
\n
\n
\n
Shift
\n
+
\n
T
\n
\n
Scroll To Syllable Text
\n
\n
\n\n \x3c!-- "Edit" hotkeys --\x3e\n
\n
Edit
\n
\n
\n
Ctrl
\n
+
\n
z
\n
or
\n
\n
+
\n
z
\n
\n
Undo
\n
\n
\n
\n
Ctrl
\n
+
\n
Shift
\n
+
\n
z
\n
or
\n
\n
+
\n
Shift
\n
+
\n
z
\n
\n
Redo
\n
\n
\n
\n
q/w/e/r/t/y
\n
\n
\n Highlight by Staff/Syllable/Neume/LayerElement/Selection/Off\n
\n
\n
\n
\n
1/2/3/4/5/6
\n
\n
\n Select by Syllable/Neume/Neume Component/Staff/Layer Element/BBox\n
\n
\n
\n
\n
Shift
\n
+
\n
Number
\n
\n
\n Begin Insert for the nth Option in the Selected Tab\n
\n
\n
\n
\n
g
\n
\n
\n Group/Ungroup Selected Element(s)\n
\n
\n
\n\n \x3c!-- "Other" hotkeys --\x3e\n
\n
Other
\n
\n
\n
s
\n
\n
Save File
\n
\n
\n
\n
Esc
\n
\n
Return to Edit Mode
\n
\n
\n
',t.syllableActionsContent='\n
\n \n \n \n \n
\n',t.errorLogsPanelContents='
\n
Error Log
\n \n \n \n
\n
'},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalWindow=t.ModalWindowView=void 0;const i=n(8),r=n(33),s=n(5);var o,a;!function(e){e[e.ADD_TEXT=0]="ADD_TEXT",e[e.EDIT_TEXT=1]="EDIT_TEXT",e[e.HOTKEYS=2]="HOTKEYS",e[e.ERROR_LOG=3]="ERROR_LOG",e[e.DOCUMENT_UPLOAD=4]="DOCUMENT_UPLOAD",e[e.MOVE_TO=5]="MOVE_TO",e[e.NEW_FOLDER=6]="NEW_FOLDER",e[e.RENAME=7]="RENAME"}(o=t.ModalWindowView||(t.ModalWindowView={})),function(e){e[e.OPEN=0]="OPEN",e[e.CLOSED=1]="CLOSED"}(a||(a={}));t.ModalWindow=class{constructor(e){this.openAddSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-add").removeEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-add").addEventListener("click",this.addSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.openEditSylTextModalWindow=function(){Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),document.getElementById("neon-modal-window-content-edit-text").classList.add("visible"),document.getElementById("neon-modal-window-edit-text-cancel").removeEventListener("click",this.hideModalWindow),document.getElementById("neon-modal-window-edit-text-cancel").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window-edit-text-save").removeEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-edit-text-save").addEventListener("click",this.updateSylText.bind(this)),document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()},this.addSylText=function(){const e={action:"addSyl",param:{elementId:document.getElementsByClassName("syllable selected")[0].id,sylText:document.getElementById("neon-modal-window-edit-text-input").value}};this.neonView.edit(e,this.neonView.view.getCurrentPageURI()).then(e=>{e&&this.neonView.updateForCurrentPage().then(()=>{})}),this.hideModalWindow()},this.updateSylText=function(){const e=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0],t=e.textContent.replace(/\u{25CA}/u,"").trim(),n=document.getElementById("neon-modal-window-edit-text-input").value;if(null!==n&&n!==t){const t={action:"setText",param:{elementId:[...e.classList.entries()].filter(e=>"text-select"!==e[1]&&"selected-to-edit"!==e[1])[0][1],text:n}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(t=>{t&&this.neonView.updateForCurrentPage().then(()=>{this.updateSelectedBBox(e,this.dragHandler,this.neonView)})})}else this.updateSelectedBBox(e,this.dragHandler,this.neonView);this.hideModalWindow()},this.keydownListener=function(e){switch(e.stopImmediatePropagation(),this.modalWindowView){case o.ADD_TEXT:"Enter"===e.key&&this.addSylText(),"Escape"===e.key&&this.hideModalWindow();break;case o.EDIT_TEXT:"Enter"===e.key&&this.updateSylText(),"Escape"===e.key&&this.hideModalWindow();break;default:"Escape"===e.key&&this.hideModalWindow()}},this.focusModalWindow=function(){switch(this.modalWindowView){case o.ADD_TEXT:case o.EDIT_TEXT:document.getElementById("neon-modal-window-edit-text-input").select();break;case o.DOCUMENT_UPLOAD:case o.NEW_FOLDER:case o.RENAME:break;default:document.getElementById("neon-modal-window").focus()}},this.neonView=e,this.modalWindowState=a.CLOSED,this.setupEventListeners()}setupEventListeners(){document.getElementById("neon-modal-window-header-close").addEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").addEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").addEventListener("click",this.focusModalWindow.bind(this))}removeEventListeners(){document.getElementById("neon-modal-window-header-close").removeEventListener("click",this.hideModalWindow.bind(this)),document.getElementById("neon-modal-window").removeEventListener("keydown",this.keydownListener.bind(this)),document.getElementById("neon-modal-window-container").removeEventListener("click",this.focusModalWindow.bind(this))}setModalWindowView(e,t){this.modalWindowView=e,this.setModalWindowContent(t)}getModalWindowView(){return this.modalWindowView.toString()}openModalWindow(){switch(Array.from(document.getElementsByClassName("neon-modal-window-content")).forEach(e=>{e.classList.remove("visible")}),this.modalWindowView){case o.ADD_TEXT:this.openAddSylTextModalWindow();break;case o.EDIT_TEXT:this.openEditSylTextModalWindow();break;case o.HOTKEYS:document.getElementById("neon-modal-window-content-hotkeys").classList.add("visible");case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:default:document.getElementById("neon-modal-window-container").style.display="flex",this.focusModalWindow()}document.body.style.overflowX="hidden",document.body.style.overflowY="hidden",this.modalWindowState=a.OPEN}hideModalWindow(){switch(this.modalWindowView){case o.EDIT_TEXT:document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].classList.remove("selected-to-edit");break;case o.DOCUMENT_UPLOAD:case o.MOVE_TO:case o.NEW_FOLDER:case o.RENAME:document.getElementById("neon-modal-window-content-container").innerHTML=""}document.getElementById("neon-modal-window-container").style.display="none",document.body.style.overflowX="hidden",document.body.style.overflowY="scroll",this.modalWindowState=a.CLOSED,this.removeEventListeners()}setModalWindowContent(e){const t=document.getElementById("neon-modal-window-content-container"),n=document.getElementById("neon-modal-window-header-title");switch(this.modalWindowView){case o.ADD_TEXT:t.innerHTML=i.addTextModal,n.innerText="ENTER SYLLABLE TEXT";break;case o.EDIT_TEXT:t.innerHTML=i.editTextModal,n.innerText="EDIT SYLLABLE TEXT";const s=/\u{25CA}/u,a=document.getElementById("syl_text").querySelectorAll("span.selected-to-edit")[0].textContent.replace(s,"").trim();document.getElementById("neon-modal-window-edit-text-input").value=a;break;case o.HOTKEYS:t.innerHTML=i.hotkeysModal,n.innerText="HOTKEYS";break;case o.ERROR_LOG:t.innerHTML=`
${e}
\n `,n.innerText="ERROR LOG";break;case o.DOCUMENT_UPLOAD:n.innerText="DOCUMENT UPLOAD",t.innerHTML=r.uploadAreaHTML;break;case o.MOVE_TO:n.innerText="MOVE TO";break;case o.NEW_FOLDER:n.innerText="NEW FOLDER",t.innerHTML=r.newFolderHTML;break;case o.RENAME:n.innerText="RENAME",t.innerHTML=r.renameHTML;break;default:console.error("Unknown selection type. This should not have occurred.")}}updateSelectedBBox(e,t,n){(0,s.unselect)();const i=Array.from(e.classList).find(e=>"text-select"!==e&&"selected-to-edit"!==e);if(document.getElementById("displayBBox").checked&&document.getElementById(i)){const e=document.getElementById(i).querySelector(".sylTextRect-display");(0,s.selectBBox)(e,t,n)}}}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";for(var i=n(12),r=[],s=0;s<256;++s)r.push((s+256).toString(16).substr(1));t.a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!Object(i.a)(n))throw TypeError("Stringified UUID is invalid");return n}},function(e,t,n){"use strict";var i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.a=function(e){return"string"==typeof e&&i.test(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initDisplayControls=t.loadHighlightSettings=t.updateDisplayAllBtn=t.updateHighlight=t.setHighlightSelectionControls=t.setHighlightControls=t.setHighlightOption=t.getHighlightType=t.setCircleSizeControls=t.setBgOpacityFromSlider=t.setGlyphOpacityFromSlider=t.setZoomControls=void 0;const i=n(18),r=n(4),s=n(7);let o,a,c;function l(e){const t=document.getElementById("opacityOutput");document.getElementById("opacitySlider").value=t.value,(0,r.setSettings)({glyphOpacity:Number(t.value)});const n=document.querySelector("#toggle-glyph-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show glyph")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide glyph"));try{document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=(Number(t.value)/100).toString()})}catch(e){console.warn("Unable to properly set opacity to pages")}}function u(e){const t=document.querySelector("#bgOpacityOutput");(0,r.setSettings)({imageOpacity:Number(t.value)});const n=document.querySelector("#toggle-bg-opacity > img");0===Number(t.value)?(n.setAttribute("src","/Neon/Neon-gh/assets/img/show-icon.svg"),n.parentElement.setAttribute("title","Show background image")):(n.setAttribute("src","/Neon/Neon-gh/assets/img/hide-icon.svg"),n.parentElement.setAttribute("title","Hide background image"));const i=document.querySelector("."+e);i&&(i.style.opacity=String(Number(t.value)/100))}function d(e){const t=document.getElementById("highlight-"+e),n=document.getElementById("highlight-dropdown"),s=document.getElementById("highlight-type");if((0,r.setSettings)({highlightMode:e}),n.classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),"none"===e)return s.textContent=" - Off",void i.unsetGroupingHighlight();t.classList.add("highlight-selected"),s.textContent=" - "+(e[0].toUpperCase()+e.slice(1)),i.setGroupingHighlight(e)}function h(e){document.getElementById("highlight-"+e).addEventListener("click",()=>{d(e)})}function f(){document.body.removeEventListener("click",f),document.getElementById("highlight-dropdown").classList.remove("is-active")}function g(){const e=document.getElementById("highlight-dropdown");document.getElementById("highlight-button").addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("is-active"),e.classList.contains("is-active")?(document.body.addEventListener("click",f),h("column"),h("staff"),h("syllable"),h("neume"),h("layerElement"),h("none")):document.body.removeEventListener("click",f)})}function p(){const{highlightMode:e}=(0,r.getSettings)();d(e)}t.setZoomControls=function(e){if(void 0===e)return;const t=document.getElementById("zoomSlider"),n=document.getElementById("zoomOutput"),{zoom:i}=(0,r.getSettings)();t.value=String(i),n.value=String(i),e.zoomTo(i/100),document.getElementById("reset-zoom").addEventListener("click",()=>{n.value="100",t.value="100",e.resetZoomAndPan()}),document.querySelector("#set-zoom-easy-edit").addEventListener("click",()=>{n.value="180",t.value="180",e.zoomTo(1.8)}),t.addEventListener("mouseup",(function(){n.value=t.value,e.zoomTo(Number(n.value)/100)})),t.disabled=!1,document.body.addEventListener("keydown",i=>{const r=parseInt(n.value);if("ArrowUp"===i.key||"ArrowDown"===i.key||"ArrowRight"===i.key||"ArrowLeft"===i.key)i.preventDefault();else if("+"===i.key){const i=Math.min(r+20,parseInt(t.getAttribute("max")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else if("_"===i.key){const i=Math.max(r-20,parseInt(t.getAttribute("min")));e.zoomTo(i/100),n.value=String(i),t.value=String(i)}else"0"===i.key&&(n.value="100",t.value="100",e.resetZoomAndPan())})},t.setGlyphOpacityFromSlider=l,t.setBgOpacityFromSlider=u,t.setCircleSizeControls=function(){const e=document.getElementById("circleSlider"),t=document.getElementById("circleOutput"),{circleSize:n}=(0,r.getSettings)();function i(){t.value=e.value,c=Number(e.value),(0,r.setSettings)({circleSize:Number(c)});const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",c)}c=n,e.value=String(n),t.value=String(n),document.getElementById("reset-circle-size").addEventListener("click",()=>{const n=s.selectAll(".resizePoint");n.empty()||n.attr("r",25),c=Number(25),e.value=String(25),t.value=String(25),(0,r.setSettings)({circleSize:Number(25)}),i()}),e.addEventListener("input",i),e.addEventListener("change",i),e.disabled=!1},t.getHighlightType=function(){return document.getElementById("highlight-type").textContent.slice(3).toLowerCase()},t.setHighlightOption=h,t.setHighlightControls=g,t.setHighlightSelectionControls=function(){const e=document.getElementById("highlight-selection");e.addEventListener("click",()=>{document.getElementById("highlight-dropdown").classList.remove("is-active"),document.querySelectorAll(".highlight-selected").forEach(e=>{e.classList.remove("highlight-selected")}),e.classList.add("highlight-selected"),document.getElementById("highlight-type").textContent=" - Selection",i.setGroupingHighlight("selection")})},t.updateHighlight=function(){let e;try{e=document.querySelector(".highlight-selected").id}catch(t){e=""}switch(e){case"highlight-column":i.setGroupingHighlight("column");break;case"highlight-staff":i.setGroupingHighlight("staff");break;case"highlight-syllable":i.setGroupingHighlight("syllable");break;case"highlight-neume":i.setGroupingHighlight("neume");break;case"highlight-layerElement":i.setGroupingHighlight("layerElement");break;case"highlight-selection":i.setGroupingHighlight("selection");break;default:i.unsetGroupingHighlight()}},t.updateDisplayAllBtn=function(){const e=document.getElementById("display-all-btn"),t=document.getElementById("displayInfo"),n=document.getElementById("displayBBox"),i=document.getElementById("displayText"),r=document.getElementById("display-errors");(null==t?void 0:t.checked)&&(null==n?void 0:n.checked)&&(null==i?void 0:i.checked)&&(null==r?void 0:r.checked)?(e.classList.add("selected"),e.innerHTML="Hide All"):e.classList.contains("selected")&&(e.classList.remove("selected"),e.innerHTML="Display All")},t.loadHighlightSettings=p,t.initDisplayControls=function(e,t){!function(e){const t=document.getElementById("opacitySlider"),n=document.getElementById("opacityOutput"),{glyphOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,o=Number(t.value),l(e)}o=i,t.value=String(i),n.value=String(i);const a=document.getElementById("toggle-glyph-opacity");100==i&&a.classList.add("hide-icon"),null==a||a.addEventListener("click",()=>{let i;a.classList.contains("hide-icon")?(a.classList.remove("hide-icon"),i=0):(a.classList.add("hide-icon"),i=1),document.querySelectorAll("."+e).forEach(e=>{e.style.opacity=i.toString()}),o=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({glyphOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(e),function(e){const t=document.getElementById("bgOpacitySlider"),n=document.getElementById("bgOpacityOutput"),{imageOpacity:i}=(0,r.getSettings)();function s(){n.value=t.value,a=Number(t.value),u(e)}a=i,t.value=String(i),n.value=String(i);const o=document.getElementById("toggle-bg-opacity");100==i&&o.classList.add("hide-icon"),o.addEventListener("click",()=>{let i;o.classList.contains("hide-icon")?(o.classList.remove("hide-icon"),i=0):(o.classList.add("hide-icon"),i=1),document.getElementsByClassName(e)[0].style.opacity=i.toString(),a=Number(t.value),t.value=String(100*i),n.value=String(Math.round(100*i)),(0,r.setSettings)({imageOpacity:100*i}),s()}),t.addEventListener("input",s),t.addEventListener("change",s),t.disabled=!1}(t),g(),document.getElementById("burgerMenu").addEventListener("click",()=>{document.getElementById("burgerMenu").classList.toggle("is-active"),document.getElementById("navMenu").classList.toggle("is-active")}),document.body.addEventListener("keydown",e=>{if(!e.metaKey)switch(e.key){case"q":d("staff");break;case"w":d("syllable");break;case"e":d("neume");break;case"r":d("layerElement");break;case"t":d("selection");break;case"y":d("none")}}),function(){const e=document.querySelector("#display-all-btn");e.addEventListener("click",()=>{if(e.classList.contains("selected")){e.classList.remove("selected"),e.innerHTML="Display All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked&&e.click()})}else{e.classList.add("selected"),e.innerHTML="Hide All";const t=document.querySelectorAll('.checkbox-container:not([style*="display: none;"]) > .checkbox');Array.from(t).forEach(e=>{e.checked||e.click()})}})}(),p();const n=document.getElementById("displayContents"),i=document.getElementById("toggleDisplay");document.getElementById("displayHeader").addEventListener("click",e=>{e.stopPropagation(),n.classList.contains("closed")?(n.classList.remove("closed"),n.style.padding="0.5em 0.75em",setTimeout(()=>{n.style.overflow="visible"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(n.classList.add("closed"),n.style.overflow="hidden",setTimeout(()=>{n.style.padding="0px"},200),i.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.triggerDefaultActions=t.triggerDefaultSylActions=t.triggerBBoxActions=t.triggerSingleStaffActions=t.triggerStaffSplitMode=t.triggerMultiStaffActions=t.triggerLayerElementActions=t.triggerSyllableActions=t.triggerNeumeActions=t.triggerNcActions=t.addChangeStaffListener=t.addAddSylListener=t.matchHeightHandler=t.moveOutsideSyllableHandler=t.insertToSyllableHandler=t.changeStaffHandler=t.removeHandler=t.endOptionsSelection=t.deleteButtonHandler=t.unsetLiquescentAnticlockwiseAction=t.unsetLiquescentClockwiseAction=t.unsetVirgaReversedAction=t.unsetVirgaAction=t.unsetInclinatumAction=t.initNeonView=void 0;const i=n(8),r=n(24),s=n(3),o=n(35),a=n(36),c=n(5),l=n(9);let u;function d(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function h(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function f(e){return{action:"set",param:{elementId:e,attrType:"tilt",attrValue:""}}}function g(e){return{action:"set",param:{elementId:e,attrType:"curve",attrValue:""}}}function p(e){return{action:"setLiquescent",param:{elementId:e,curve:""}}}function m(e){"d"!==e.key&&"Backspace"!==e.key||(y(),e.preventDefault())}function v(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden")),document.body.removeEventListener("keydown",m)}function y(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{t.classList.contains("syl")&&(t=t.closest(".syllable")),t.classList.contains("accid")&&(t=t.closest(".accid")),t.classList.contains("divLine")&&(t=t.closest(".divLine")),e.push({action:"remove",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),u.edit(t,u.view.getCurrentPageURI()).then(()=>{u.updateForCurrentPage()})}function b(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"changeStaff",param:{elementId:t.id}})});const t={action:"chain",param:e};v(),u.edit(t,u.view.getCurrentPageURI()).then(()=>{u.updateForCurrentPage()})}function w(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"insertToSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Insert Success","success"):s.default.queueNotification("Insert Failed XoX","error"),v(),u.updateForCurrentPage()})}function _(){const e=[];Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push({action:"moveOutsideSyllable",param:{elementId:t.id}})});const t={action:"chain",param:e};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Move Success","success"):s.default.queueNotification("Move Failed XoX","error"),v(),u.updateForCurrentPage()})}function E(){const e=Array.from(document.getElementsByClassName("selected"));e.length>1&&s.default.queueNotification("Cannot match height to multiple bbox","error");const t={action:"matchHeight",param:{elementId:e[0].id}};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Height Match Success","success"):s.default.queueNotification("Height Match Failed XoX","error"),v(),u.updateForCurrentPage()})}function S(){const e=u.modal;e.setModalWindowView(l.ModalWindowView.ADD_TEXT),e.openModalWindow()}function x(){const e=document.getElementById("delete");e&&(e.removeEventListener("click",y),e.addEventListener("click",y),document.body.addEventListener("keydown",m))}function L(){const e=document.getElementById("changeStaff");null==e||e.removeEventListener("click",b),null==e||e.addEventListener("click",b)}function A(){const e=document.getElementById("col-input"),t=document.querySelectorAll(".staff.selected");let n;for(const e of t){const t=Array.from(e.classList).join(" ").match(/\bcolumn(\d+)\b/);if(t){const e=parseInt(t[1],10);if(n&&n!=e){document.getElementById("col-warning").innerText="The selected staves are not of the same column!",n=0;break}n=e}}n&&(e.value=n.toString())}function k(){const e=document.getElementById("col-decrement"),t=document.getElementById("col-increment"),n=document.getElementById("col-confirm"),i=document.getElementById("col-input");function r(e){let t=parseInt(i.value,10)||0;t+=e,t=Math.min(Math.max(t,1),5),t.toString()!=i.value&&(n.style.display=""),i.value=t.toString()}e.addEventListener("click",(function(){r(-1)})),t.addEventListener("click",(function(){r(1)})),n.addEventListener("click",(function(){const e=[];document.querySelectorAll(".staff.selected").forEach(t=>{e.push({action:"set",param:{elementId:t.id,attrType:"type",attrValue:"column"+i.value}})});const t={action:"chain",param:e};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Column Value Update Success","success"):s.default.queueNotification("Column Value Update Failed XoX","error"),v(),u.updateForCurrentPage()})}))}function C(e,t,n=!0){const i=document.getElementById(e);i&&(i.parentElement.classList.remove("hidden"),n?i.innerHTML=t:i.innerHTML+=t)}function I(e){u.edit(e,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}function P(){const e=document.querySelector(".staff.selected");if(null!==e){new o.SplitStaffHandler(u,e).startSplit(),v()}else console.error("No staff was selected!"),v()}function O(){document.querySelectorAll(".drop_select").forEach(e=>{const t=()=>{document.body.removeEventListener("click",t),e.classList.remove("is-active")};e.addEventListener("click",n=>{e.classList.toggle("is-active"),Array.from(document.querySelectorAll(".drop_select")).filter(t=>t!==e).forEach(e=>e.classList.remove("is-active")),n.stopPropagation(),e.classList.contains("is-active")?document.body.addEventListener("click",t):document.body.removeEventListener("click",t)})})}t.initNeonView=function(e){u=e,r.initNeonView(e)},t.unsetInclinatumAction=d,t.unsetVirgaAction=h,t.unsetVirgaReversedAction=f,t.unsetLiquescentClockwiseAction=g,t.unsetLiquescentAnticlockwiseAction=p,t.deleteButtonHandler=m,t.endOptionsSelection=v,t.removeHandler=y,t.changeStaffHandler=b,t.insertToSyllableHandler=w,t.moveOutsideSyllableHandler=_,t.matchHeightHandler=E,t.addAddSylListener=function(){const e=document.getElementById("addSyl");null==e||e.removeEventListener("click",S),null==e||e.addEventListener("click",S)},t.addChangeStaffListener=L,t.triggerNcActions=function(e){v(),C("moreEdit",i.defaultActionContents),C("extraEdit",i.ncActionContents),x(),document.querySelector("#Punctum.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=g(e.id),o=p(e.id);u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#Inclinatum.dropdown-item").addEventListener("click",()=>{const t=h(e.id),n=f(e.id),i=g(e.id),r=p(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"se"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#Virga.dropdown-item").addEventListener("click",()=>{const t=f(e.id),n=d(e.id),i=g(e.id),r=p(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"s"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#VirgaReversed.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=g(e.id),r=p(e.id),o={action:"set",param:{elementId:e.id,attrType:"tilt",attrValue:"n"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#LiquescentClockwise.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=p(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"c"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#LiquescentAnticlockwise.dropdown-item").addEventListener("click",()=>{const t=d(e.id),n=h(e.id),i=f(e.id),r=g(e.id),o={action:"setLiquescent",param:{elementId:e.id,curve:"a"}};u.edit({action:"chain",param:[t,n,i,r,o]},u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Shape Changed","success"):s.default.queueNotification("Shape Change Failed","error"),v(),u.updateForCurrentPage()})}),O()},t.triggerNeumeActions=function(){v(),C("moreEdit",i.defaultNeumeActionContents),C("extraEdit",i.neumeActionContents),x();const e=document.querySelectorAll(".selected");function t(t){const n={action:"changeGroup",param:{elementId:e[0].id,contour:t}};u.edit(n,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Grouping Changed","success"):s.default.queueNotification("Grouping Failed","error"),v(),u.updateForCurrentPage()})}1===e.length?(document.getElementById("split-neume").addEventListener("click",()=>{const e=document.querySelector(".neume.selected");if(null!==e){new a.SplitNeumeHandler(u,e).startSplit(),v()}else console.error("No staff was selected!"),v()}),document.querySelector("#Pes.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#PesSubpunctis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Clivis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Scandicus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusFlexus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#ScandicusSubpunctis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Climacus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#ClimacusResupinus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Torculus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#TorculusResupinus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Porrectus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusFlexus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#PorrectusSubpunctis.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),document.querySelector("#Pressus.dropdown-item").addEventListener("click",e=>{t(u.info.getContourByValue(e.target.id))}),O()):console.warn("More than one neume selected! Cannot trigger Neume ClickSelect actions.")},t.triggerSyllableActions=function(e){v(),C("moreEdit",i.syllableActionsContent);let t="";switch(e){case"noSyl":t+='
\n \n \n
';break;case"singleSelect":t+='
\n \n \n \n
';break;case"linkableSelect":t+='
\n \n \n \n
';break;case"multiSelect":t+='
\n \n \n \n
';break;case"default":t+='
\n \n \n
'}C("moreEdit",t,!0),L(),x(),r.initGroupingListeners()},t.triggerLayerElementActions=function(e){var t,n,r,o;if(v(),e.classList.contains("custos"))return C("moreEdit",i.custosActionContents),L(),void x();C("moreEdit",e.parentElement.classList.contains("syllable")?i.layerElementInActionContents:i.layerElementOutActionContents,!1),e.classList.contains("accid")?(C("extraEdit",i.accidActionContents),function(e){document.querySelector("#ChangeToFlat.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"f"}})}),document.querySelector("#ChangeToNatural.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"accid",attrValue:"n"}})}),O()}(e)):e.classList.contains("clef")?(C("extraEdit",i.clefActionContents),function(e){document.querySelector("#increment-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"above"}};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave incremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#decrement-octave").addEventListener("click",()=>{const t={action:"displaceClefOctave",param:{elementId:e.id,direction:"below"}};u.edit(t,u.view.getCurrentPageURI()).then(e=>{e?s.default.queueNotification("Clef octave decremented.","success"):s.default.queueNotification("Maximum octave displacement reached. Clef can only be displaced up to 3 octaves.","error"),v(),u.updateForCurrentPage()})}),document.querySelector("#CClef.dropdown-item").addEventListener("click",()=>{I({action:"setClef",param:{elementId:e.id,shape:"C"}})}),document.querySelector("#FClef.dropdown-item").addEventListener("click",()=>{I({action:"setClef",param:{elementId:e.id,shape:"F"}})}),O()}(e)):e.classList.contains("divLine")&&(C("extraEdit",i.divLineActionContents),function(e){document.querySelector("#ChangeToMinima.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"minima"}})}),document.querySelector("#ChangeToMaior.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maior"}})}),document.querySelector("#ChangeToMaxima.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"maxima"}})}),document.querySelector("#ChangeToFinalis.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"finalis"}})}),document.querySelector("#ChangeToCaesura.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"caesura"}})}),document.querySelector("#ChangeToVirgula.dropdown-item").addEventListener("click",()=>{I({action:"set",param:{elementId:e.id,attrType:"form",attrValue:"virgula"}})}),O()}(e)),L(),null===(t=document.getElementById("insertToSyllable"))||void 0===t||t.addEventListener("click",w),null===(n=document.getElementById("moveOutsideSyllable"))||void 0===n||n.addEventListener("click",_),x(),L(),null===(r=document.getElementById("insertToSyllable"))||void 0===r||r.addEventListener("click",w),null===(o=document.getElementById("moveOutsideSyllable"))||void 0===o||o.addEventListener("click",_)},t.triggerMultiStaffActions=function(){v(),C("moreEdit",i.staffMergeActionContents),C("extraEdit",i.columnActionContents),x(),A(),k(),document.getElementById("merge-systems").addEventListener("click",()=>{r.mergeStaves()})},t.triggerStaffSplitMode=P,t.triggerSingleStaffActions=function(){v(),C("moreEdit",i.staffSplitActionContents),C("extraEdit",i.columnActionContents),x(),A(),k(),document.getElementById("split-system").addEventListener("click",()=>{P()}),document.getElementById("reset-rotate").addEventListener("click",()=>{const e=document.querySelector(".staff.selected"),t=(0,c.getStaffBBox)(e),n=Math.tan(t.rotate)*(t.lrx-t.ulx);if(null!==e){const i={action:"resizeRotate",param:{elementId:e.id,ulx:t.ulx,uly:t.rotate>0?t.uly+n/2:t.uly-n/2,lrx:t.lrx,lry:t.rotate>0?t.lry-n/2:t.lry+n/2,rotate:0}};u.edit(i,u.view.getCurrentPageURI()).then(async e=>{e&&await u.updateForCurrentPage()}),v()}else console.error("No staff was selected"),v()})},t.triggerBBoxActions=function(){v(),C("moreEdit",i.bboxActionContents),x(),document.getElementById("matchHeight").addEventListener("click",()=>{E()})},t.triggerDefaultSylActions=function(){v(),C("moreEdit",i.defaultSylActionContents),x(),L()},t.triggerDefaultActions=function(){v(),C("moreEdit",i.defaultActionContents),x()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getGlyphBBox=t.isOutOfSVGBounds=t.getStaffByCoords=t.getStaffIdByCoords=t.getSVGRelCoords=void 0;const i=n(5);function r(e,t){const n=new DOMPoint(e,t),i=document.querySelector(".active-page > .definition-scale").querySelector(".page-margin"),{x:r,y:s}=n.matrixTransform(i.getScreenCTM().inverse());return{x:r,y:s}}function s(e,t){const n=Array.from(document.querySelectorAll(".staff")).map(e=>(0,i.getStaffBBox)(e)),{x:s,y:o}=r(e,t),a=n.find(e=>s<=e.lrx&&s>=e.ulx&&o<=e.lry&&o>=e.uly);return a?a.id:null}t.getSVGRelCoords=r,t.getStaffIdByCoords=s,t.getStaffByCoords=function(e,t){const n=s(e,t);return document.querySelector("#"+n)},t.isOutOfSVGBounds=function(e,t){const n=document.querySelector("#bgimg");return e<=0||e>=Number(n.getAttribute("width"))||t<=0||t>=Number(n.getAttribute("height"))},t.getGlyphBBox=function(e){const t="rect"==e.tagName?e.getBBox():e.parentNode.getBBox();return{ulx:t.x,uly:t.y,lrx:t.x+t.width,lry:t.y+t.height}}},function(e,t,n){e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function n(e,t){var n=e[0],i=e[1],r=e[2],s=e[3];i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[0]-680876936|0)<<7|n>>>25)+i|0)&i|~n&r)+t[1]-389564586|0)<<12|s>>>20)+n|0)&n|~s&i)+t[2]+606105819|0)<<17|r>>>15)+s|0)&s|~r&n)+t[3]-1044525330|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[4]-176418897|0)<<7|n>>>25)+i|0)&i|~n&r)+t[5]+1200080426|0)<<12|s>>>20)+n|0)&n|~s&i)+t[6]-1473231341|0)<<17|r>>>15)+s|0)&s|~r&n)+t[7]-45705983|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[8]+1770035416|0)<<7|n>>>25)+i|0)&i|~n&r)+t[9]-1958414417|0)<<12|s>>>20)+n|0)&n|~s&i)+t[10]-42063|0)<<17|r>>>15)+s|0)&s|~r&n)+t[11]-1990404162|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&r|~i&s)+t[12]+1804603682|0)<<7|n>>>25)+i|0)&i|~n&r)+t[13]-40341101|0)<<12|s>>>20)+n|0)&n|~s&i)+t[14]-1502002290|0)<<17|r>>>15)+s|0)&s|~r&n)+t[15]+1236535329|0)<<22|i>>>10)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[1]-165796510|0)<<5|n>>>27)+i|0)&r|i&~r)+t[6]-1069501632|0)<<9|s>>>23)+n|0)&i|n&~i)+t[11]+643717713|0)<<14|r>>>18)+s|0)&n|s&~n)+t[0]-373897302|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[5]-701558691|0)<<5|n>>>27)+i|0)&r|i&~r)+t[10]+38016083|0)<<9|s>>>23)+n|0)&i|n&~i)+t[15]-660478335|0)<<14|r>>>18)+s|0)&n|s&~n)+t[4]-405537848|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[9]+568446438|0)<<5|n>>>27)+i|0)&r|i&~r)+t[14]-1019803690|0)<<9|s>>>23)+n|0)&i|n&~i)+t[3]-187363961|0)<<14|r>>>18)+s|0)&n|s&~n)+t[8]+1163531501|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i&s|r&~s)+t[13]-1444681467|0)<<5|n>>>27)+i|0)&r|i&~r)+t[2]-51403784|0)<<9|s>>>23)+n|0)&i|n&~i)+t[7]+1735328473|0)<<14|r>>>18)+s|0)&n|s&~n)+t[12]-1926607734|0)<<20|i>>>12)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[5]-378558|0)<<4|n>>>28)+i|0)^i^r)+t[8]-2022574463|0)<<11|s>>>21)+n|0)^n^i)+t[11]+1839030562|0)<<16|r>>>16)+s|0)^s^n)+t[14]-35309556|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[1]-1530992060|0)<<4|n>>>28)+i|0)^i^r)+t[4]+1272893353|0)<<11|s>>>21)+n|0)^n^i)+t[7]-155497632|0)<<16|r>>>16)+s|0)^s^n)+t[10]-1094730640|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[13]+681279174|0)<<4|n>>>28)+i|0)^i^r)+t[0]-358537222|0)<<11|s>>>21)+n|0)^n^i)+t[3]-722521979|0)<<16|r>>>16)+s|0)^s^n)+t[6]+76029189|0)<<23|i>>>9)+r|0,i=((i+=((r=((r+=((s=((s+=((n=((n+=(i^r^s)+t[9]-640364487|0)<<4|n>>>28)+i|0)^i^r)+t[12]-421815835|0)<<11|s>>>21)+n|0)^n^i)+t[15]+530742520|0)<<16|r>>>16)+s|0)^s^n)+t[2]-995338651|0)<<23|i>>>9)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[0]-198630844|0)<<6|n>>>26)+i|0)|~r))+t[7]+1126891415|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[14]-1416354905|0)<<15|r>>>17)+s|0)|~n))+t[5]-57434055|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[12]+1700485571|0)<<6|n>>>26)+i|0)|~r))+t[3]-1894986606|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[10]-1051523|0)<<15|r>>>17)+s|0)|~n))+t[1]-2054922799|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[8]+1873313359|0)<<6|n>>>26)+i|0)|~r))+t[15]-30611744|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[6]-1560198380|0)<<15|r>>>17)+s|0)|~n))+t[13]+1309151649|0)<<21|i>>>11)+r|0,i=((i+=((s=((s+=(i^((n=((n+=(r^(i|~s))+t[4]-145523070|0)<<6|n>>>26)+i|0)|~r))+t[11]-1120210379|0)<<10|s>>>22)+n|0)^((r=((r+=(n^(s|~i))+t[2]+718787259|0)<<15|r>>>17)+s|0)|~n))+t[9]-343485551|0)<<21|i>>>11)+r|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=r+e[2]|0,e[3]=s+e[3]|0}function i(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function r(e){var t,n=[];for(t=0;t<64;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function s(e){var t,r,s,o,a,c,l=e.length,u=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=l;t+=64)n(u,i(e.substring(t-64,t)));for(r=(e=e.substring(t-64)).length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t>2]|=e.charCodeAt(t)<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}function o(e){var n,i="";for(n=0;n<4;n+=1)i+=t[e>>8*n+4&15]+t[e>>8*n&15];return i}function a(e){var t;for(t=0;tu?new ArrayBuffer(0):(r=u-l,s=new ArrayBuffer(r),o=new Uint8Array(s),a=new Uint8Array(this,l,r),o.set(a),s)}}(),u.prototype.append=function(e){return this.appendBinary(c(e)),this},u.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,r=this._buff.length;for(t=64;t<=r;t+=64)n(this._hash,i(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},u.prototype.end=function(e){var t,n,i=this._buff,r=i.length,s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},u.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},u.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},u.prototype._finish=function(e,t){var i,r,s,o=t;if(e[o>>2]|=128<<(o%4<<3),o>55)for(n(this._hash,e),o=0;o<16;o+=1)e[o]=0;i=(i=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(i[2],16),s=parseInt(i[1],16)||0,e[14]=r,e[15]=s,n(this._hash,e)},u.hash=function(e,t){return u.hashBinary(c(e),t)},u.hashBinary=function(e,t){var n=a(s(e));return t?l(n):n},u.ArrayBuffer=function(){this.reset()},u.ArrayBuffer.prototype.append=function(e){var t,i,s,o,a,c=(i=this._buff.buffer,s=e,o=!0,(a=new Uint8Array(i.byteLength+s.byteLength)).set(new Uint8Array(i)),a.set(new Uint8Array(s),i.byteLength),o?a:a.buffer),l=c.length;for(this._length+=e.byteLength,t=64;t<=l;t+=64)n(this._hash,r(c.subarray(t-64,t)));return this._buff=t-64>2]|=i[t]<<(t%4<<3);return this._finish(s,r),n=a(this._hash),e&&(n=l(n)),this.reset(),n},u.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},u.ArrayBuffer.prototype.getState=function(){var e,t=u.prototype.getState.call(this);return t.buff=(e=t.buff,String.fromCharCode.apply(null,new Uint8Array(e))),t},u.ArrayBuffer.prototype.setState=function(e){return e.buff=function(e,t){var n,i=e.length,r=new ArrayBuffer(i),s=new Uint8Array(r);for(n=0;n>2]|=e[t]<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(u,s),t=0;t<16;t+=1)s[t]=0;return o=(o=8*l).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(o[2],16),c=parseInt(o[1],16)||0,s[14]=a,s[15]=c,n(u,s),u}(new Uint8Array(e)));return t?l(i):i},u}()},function(e,t,n){"use strict";function i(e){if(16!==e.length)return"";function t(e,t){return e+t.toString(16).padStart(2,"0")}return e.slice(0,4).reduce(t,"")+"-"+e.slice(4,6).reduce(t,"")+"-"+e.slice(6,8).reduce(t,"")+"-"+e.slice(8,10).reduce(t,"")+"-"+e.slice(10).reduce(t,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.uuidv4=void 0,t.uuidv4=function(){if(void 0===window.crypto)return i(new Uint8Array(16));const e=new Uint8Array(16),t=Uint8Array.from([parseInt("01000000",2),parseInt("10000000",2),parseInt("00001111",2),parseInt("00111111",2)]);return window.crypto.getRandomValues(e),e[6]=e[6]&t[2]|t[0],e[8]=e[8]&t[3]|t[1],i(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setGroupingHighlight=t.setStaffHighlight=t.highlight=t.unsetGroupingHighlight=t.unsetStaffHighlight=t.unhighlight=void 0;const i=["rgb(230, 159, 0)","rgb(86, 180, 233)","rgb(0, 158, 115)","rgb(240, 228, 66)","rgb(0, 114, 178)","rgb(213, 94, 0)","rgb(204, 121, 167)"];function r(e){let t;t=e?e.querySelectorAll(":not(.selected) .highlighted"):document.querySelectorAll(":not(.selected) .highlighted"),t.forEach(e=>{if("path"!==e.tagName||e.closest(".staff").classList.contains("selected"))if(e.classList.contains("divLine")&&!e.closest(".staff").classList.contains("selected"))e.setAttribute("stroke","#000000");else{e.removeAttribute("fill");let t=e.querySelectorAll(".sylTextRect-display");if(!t.length)try{t=e.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(e){t=[]}t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")}))}else e.setAttribute("stroke","#000000");e.classList.remove("highlighted")})}function s(){r()}function o(){s();Array.from(document.getElementsByClassName("highlighted")).filter(e=>!e.parentElement.classList.contains("selected")).forEach(e=>{e.setAttribute("#d00",null);let t=e.querySelectorAll(".sylTextRect-display");t.length||null!==e.closest(".syllable")&&(t=e.closest(".syllable").querySelectorAll("sylTextRect-display")),t.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")?e.style.fill="#d00":e.style.fill="blue",e.classList.remove("highlighted")})),e.classList.remove("highlighted"),e.querySelectorAll("sylTextRect-display").forEach(e=>{e.classList.remove("highlighted")})}),Array.from(document.getElementsByClassName("selected")).forEach(e=>{e.setAttribute("fill","")})}function a(e,t){const n=Array.from(e.children);for(let e=0;ee.querySelectorAll(".divLine")).forEach(e=>{n.push(e)});else{if(i.classList.contains("resizePoint")||"resizeRect"===i.id||i.classList.contains("rotatePoint"))return;if(i.classList.contains("layer"))Array.from(i.children).forEach(e=>{n.push(e)});else if(document.getElementsByClassName("highlight-selected").length&&"highlight-neume"===document.getElementsByClassName("highlight-selected")[0].id&&i.classList.contains("syllable"))Array.from(i.children).filter(e=>e.classList.contains("neume")).forEach(e=>{n.push(e)});else{i.setAttribute("fill",t);let e=i.querySelectorAll(".sylTextRect-display");if(!e.length)try{e=i.closest(".syllable").querySelectorAll(".sylTextRect-display")}catch(t){e=[]}e.forEach((function(e){e.closest(".syllable").classList.contains("selected")||e.closest(".syl").classList.contains("selected")||e.closest(".staff").classList.contains("selected")||(e.style.fill=t,e.classList.add("highlighted"))}))}}i.classList.add("highlighted")}let i;i="30px",e.querySelectorAll(".nc, .custos, .clef, .accid").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width",i)})}function c(){const e=Array.from(document.getElementsByClassName("staff"));for(let t=0;t{const n=Array.from(t.classList).join(" ").match(/\bcolumn(\d+)\b/);let i=0;n&&(i=parseInt(n[1],10)-1),e[i]||(e[i]=[]),e[i].push(t)});for(const[t,n]of Object.entries(e)){const e=i[Number(t)%i.length];for(const t of n)a(t,e)}}();if("selection"===t){switch(document.querySelector(".sel-by.is-active").id){case"selBySyllable":case"selByBBox":t="syllable";break;case"selByColumn":t="column";break;case"selByStaff":t="staff";break;case"selByLayerElement":t="layerElement";break;case"selByNeume":default:t="neume"}return void e(t)}let n;n="layerElement"==t?document.querySelectorAll(".accid, .clef, .custos, .divLine"):document.getElementsByClassName(t),document.querySelectorAll(".nc, .custos, .clef, .accid, .divLine").forEach(e=>{e.setAttribute("stroke","black"),e.setAttribute("stroke-width","30px")});for(let e=0;e{e.classList.add("highlighted")})}const r=n[e].querySelectorAll(".divLine");if(r)for(let e=0;e=0;s--)o=0===s?"":",",t.push({obj:i[s],prefix:o});t.push({val:"["})}else{for(c in a=[],i)i.hasOwnProperty(c)&&a.push(c);for(t.push({val:"}"}),s=a.length-1;s>=0;s--)u=i[l=a[s]],d=s>0?",":"",d+=JSON.stringify(l)+":",t.push({obj:u,prefix:d});t.push({val:"{"})}return h},t.parse=function(e){for(var t,n,r,s,o,a,c,l,u,d=[],h=[],f=0;;)if("}"!==(t=e[f++])&&"]"!==t&&void 0!==t)switch(t){case" ":case"\t":case"\n":case":":case",":break;case"n":f+=3,i(null,d,h);break;case"t":f+=3,i(!0,d,h);break;case"f":f+=4,i(!1,d,h);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",f--;;){if(r=e[f++],!/[\d\.\-e\+]/.test(r)){f--;break}n+=r}i(parseFloat(n),d,h);break;case'"':for(s="",o=void 0,a=0;'"'!==(c=e[f++])||"\\"===o&&a%2==1;)s+=c,"\\"===(o=c)?a++:a=0;i(JSON.parse('"'+s+'"'),d,h);break;case"[":l={element:[],index:d.length},d.push(l.element),h.push(l);break;case"{":u={element:{},index:d.length},d.push(u.element),h.push(u);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===d.length)return d.pop();i(d.pop(),d,h)}}},function(e,t,n){"use strict";var i=n(20),r=n(11);t.a=function(e,t,n){var s=(e=e||{}).random||(e.rng||i.a)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){n=n||0;for(var o=0;o<16;++o)t[n+o]=s[o];return t}return Object(r.a)(s)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),s=n(3),o=n(5);t.default=class{constructor(e,t){this.dragStartCoords=[-1,-1],this.neonView=e,this.selector=t}dragInit(){const e=i.drag().on("start",function(){this.dragStartCoords=[i.event.x,i.event.y],this.dx=0,this.dy=0,i.event.sourceEvent.target.classList.contains("staff")&&i.select(this.selector).call(e)}.bind(this)).on("drag",this.dragging.bind(this)).on("end",this.dragEnded.bind(this));i.selectAll(".selected").call(e);let t=Array.from(document.querySelectorAll(".selected"));this.noMovePrecedes=t.filter(e=>e.classList.contains("no-moving")&&e.hasAttribute("mei:precedes")),t=t.filter(e=>!e.classList.contains("no-moving")),this.selection=t.concat(Array.from(document.querySelectorAll(".resizePoint")))}dragging(){this.dx=i.event.x-this.dragStartCoords[0],this.dy=i.event.y-this.dragStartCoords[1],this.moveElements(this.selection,this.dx,this.dy);if(0===this.selection.filter(e=>e.classList.contains("syl")).length&&0===this.noMovePrecedes.length){const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));this.moveElements(e,-this.dx,-this.dy)}}dragEnded(){const e=Math.abs(this.dx),t=Math.abs(this.dy);if(e<=5&&t<=5)return this.reset(),void this.dragInit();const n=this.selection.filter(e=>!e.classList.contains("resizePoint"));if(this.isCursorOutOfBounds()||this.isDragOutOfBounds(n)){this.returnElements(this.selection);const e=Array.from(document.querySelectorAll(".syllable.selected")).map(e=>e.querySelector(".sylTextRect-display"));return this.returnElements(e),this.reset(),this.dragInit(),(0,s.queueNotification)("[FAIL] Glyphs were placed out of bounds! Drag action failed.","error")}const i=[];n.forEach(e=>{const t={action:"drag",param:{elementId:"rect"===e.tagName?e.closest(".syl").id:e.id,x:this.dx,y:-this.dy}};i.push(t)});const r={action:"chain",param:i};this.neonView.edit(r,this.neonView.view.getCurrentPageURI()).then(async()=>{const e=Array.from(document.querySelectorAll(".selected")).filter(e=>!e.classList.contains("no-moving")).map(e=>e.id);await this.neonView.updateForCurrentPage(),this.endOptionsSelection(),this.reset(),await this.reselect(e),this.dragInit()})}async reselect(e){const t=e.map(e=>document.querySelector("#"+e));t.filter(e=>!e.classList.contains("syl")).forEach(async()=>await(0,o.selectAll)(t,this.neonView,this)),t.filter(e=>e.classList.contains("syl")).forEach(e=>(0,o.selectBBox)(e.querySelector(".sylTextRect-display"),this,this.neonView)),t.filter(e=>e.classList.contains("staff")).forEach(e=>(0,o.selectStaff)(e,this))}resetTo(e){this.resetToAction=e}reset(){void 0!==this.resetToAction&&i.select(this.selector).call(this.resetToAction)}endOptionsSelection(){const e=document.getElementById("moreEdit"),t=document.getElementById("extraEdit");e&&(e.innerHTML="",e.parentElement.classList.add("hidden")),t&&(t.innerHTML="",t.parentElement.classList.add("hidden"))}moveElements(e,t,n){e.filter(e=>null!==e).forEach(e=>{e.setAttribute("transform",`translate(${t},${n})`)})}returnElements(e){e.filter(e=>null!==e).forEach(e=>{e.removeAttribute("transform")})}isCursorOutOfBounds(){const e=this.dragStartCoords[0]+this.dx,t=this.dragStartCoords[1]+this.dy;return(0,r.isOutOfSVGBounds)(e,t)}isDragOutOfBounds(e){let t=document.querySelector("#displayBBox").checked?"use, rect":"use";e[0].classList.contains("staff")&&(t="path");const n=e.reduce((e,n)=>e.concat(...n.querySelectorAll(t)),[]).map(r.getGlyphBBox).reduce((e,t)=>({ulx:Math.min(e.ulx,t.ulx),uly:Math.min(e.uly,t.uly),lrx:Math.max(e.lrx,t.lrx),lry:Math.max(e.lry,t.lry)}),{ulx:Number.MAX_VALUE,uly:Number.MAX_VALUE,lrx:Number.MIN_VALUE,lry:Number.MIN_VALUE}),{ulx:i,uly:s,lrx:o,lry:a}=n;return(0,r.isOutOfSVGBounds)(i+this.dx,s+this.dy)||(0,r.isOutOfSVGBounds)(o+this.dx,a+this.dy)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initGroupingListeners=t.endGroupingSelection=t.triggerGrouping=t.mergeStaves=t.isLinkable=t.canBeLinked=t.isLinked=t.isGroupable=t.initNeonView=void 0;const i=n(8),r=n(34),s=n(3),o=n(5),a=n(14),c=n(14);let l;function u(e,t){if(Array.from(t.values()).length<2)return!1;switch(e){case"selByNeume":if(o.sharedLogicalParent(e,t))return!1;default:return!!o.areAdjacent(e,t)}}function d(e,t){switch(t||(t=Array.from(document.querySelectorAll(".selected"))),e){case"selBySyllable":for(const e of t)if(e.hasAttribute("mei:follows")||e.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNeume":for(const e of t)if(e.parentElement.hasAttribute("mei:follows")||e.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1;case"selByNc":for(const e of t)if(e.parentElement.parentElement.hasAttribute("mei:follows")||e.parentElement.parentElement.hasAttribute("mei:precedes"))return s.queueNotification("The action involves linked syllables, please untoggle them first","warning"),!0;return!1}}function h(e){for(const t of e)if(!t.hasAttribute("mei:precedes")&&!t.hasAttribute("mei:follows"))return!1;return!0}function f(e){e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1});const t=Array.from(document.querySelectorAll(".staff")),n=Array.from(document.querySelectorAll(".syllable"));for(let i=0;i!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));const i=e.filter(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(1!==i.length)return!1;const r=i[0];return 0===e.indexOf(r)||e.indexOf(r)===e.length-1}function g(e,t){return!(t.length<2)&&("selBySyllable"===e&&(function(e){e.sort((e,t)=>e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING?-1:e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING?1:0);for(let t=0;te.id===i&&(r=t,!0));if(!s)return!0;if(!s.hasAttribute("mei:follows"))return!0;if(s.getAttribute("mei:follows")!="#"+n.id)return!0;if(r!==t+1)return!0}if(n.hasAttribute("mei:follows")){const t=n.getAttribute("mei:follows").replace("#",""),i=e.find(e=>e.id===t);if(!i)return!0;if(!i.hasAttribute("mei:precedes"))return!0;if(i.getAttribute("mei:precedes")!="#"+n.id)return!0}return!1}}(t)?(s.queueNotification("The selected syllables include invalid linked syllable(s)!","warning"),!1):!!h(t)||!!f(t)))}function p(){const e=document.querySelectorAll(".staff.selected"),t=[];e.forEach(e=>{t.push(e.id)});const n={action:"merge",param:{elementIds:t}};l.edit(n,l.view.getCurrentPageURI()).then(e=>{e?(s.queueNotification("Staff Merged","success"),a.endOptionsSelection(),l.updateForCurrentPage()):s.queueNotification("Merge Failed","error")})}function m(){const e=document.getElementById("moreEdit");e.innerHTML="",e.parentElement.classList.add("hidden"),document.body.removeEventListener("keydown",c.deleteButtonHandler),document.body.removeEventListener("keydown",y)}function v(){const e=document.getElementById("delete");e.removeEventListener("click",c.removeHandler),e.addEventListener("click",c.removeHandler),document.body.addEventListener("keydown",c.deleteButtonHandler),document.body.addEventListener("keydown",y);try{document.getElementById("mergeSyls").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNeumes").addEventListener("click",()=>{if(d(o.getSelectionType()))return;b("group","neume",E().filter(e=>document.getElementById(e).classList.contains("neume")))})}catch(e){}try{document.getElementById("groupNcs").addEventListener("click",()=>{b("group","nc",E().filter(e=>document.getElementById(e).classList.contains("nc")))})}catch(e){}try{document.getElementById("ungroupNeumes").addEventListener("click",()=>{b("ungroup","neume",S())})}catch(e){}try{document.getElementById("ungroupNcs").addEventListener("click",()=>{b("ungroup","nc",S())})}catch(e){}try{document.getElementById("toggle-ligature").addEventListener("click",async()=>{const e={action:"toggleLigature",param:{elementIds:E()}};l.edit(e,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Ligature Toggled","success"):s.queueNotification("Ligature Toggle Failed","error"),m(),l.updateForCurrentPage()})})}catch(e){}try{document.getElementById("toggle-link").addEventListener("click",()=>{_()})}catch(e){}}t.initNeonView=function(e){l=e},t.isGroupable=u,t.isLinked=h,t.canBeLinked=f,t.isLinkable=g,t.mergeStaves=p,t.triggerGrouping=function(e){const t=document.getElementById("moreEdit");t.parentElement.classList.remove("hidden"),t.innerHTML+=i.groupingMenu[e],v()},t.endGroupingSelection=m,t.initGroupingListeners=v;const y=function(e){if("g"===e.key){const e=Array.from(document.querySelectorAll(".selected"));if(0==e.length)return;const t=o.getSelectionType();if(d(t,e))return;switch(t){case"selBySyllable":if(g(t,e))_();else if(u(t,e)){b("group","neume",S().filter(e=>document.getElementById(e).classList.contains("neume")))}else if(1===e.length){b("ungroup","neume",S())}break;case"selByNeume":if(u(t,e)){b("group","neume",E())}else{b("ungroup","nc",S())}break;case"selByNc":if(u(t,e)){b("group","nc",E())}else{b("ungroup","nc",S())}break;case"selByStaff":u(t,e)?p():a.triggerStaffSplitMode();break;default:return void console.error(`Can't perform grouping/ungrouping action on selection type ${t}.`)}}};function b(e,t,n){const i={action:e,param:{groupType:t,elementIds:n}};l.edit(i,l.view.getCurrentPageURI()).then(i=>{if(i?"group"===e?s.queueNotification("Grouping Success","success"):s.queueNotification("Ungrouping Success","success"):"group"===e?s.queueNotification("Grouping Failed","error"):s.queueNotification("Ungrouping Failed","error"),l.updateForCurrentPage(),"nc"===t){const e=document.getElementById(n[0]).parentElement,t=Array.from(e.children);void 0===l.info.getContour(t)&&r.groupingNotRecognized()}m()})}function w(e){const t=document.getElementById(e);return t instanceof SVGGraphicsElement?t:null}function _(){const e=E(),t={action:"chain",param:[]},n=new Array,i=e.map(w).filter(e=>null!==e);if(h(i))n.push(...function(e){const t=new Array;for(const n of e){const e=document.getElementById(n);e.getAttribute("mei:precedes")&&t.push({action:"set",param:{elementId:n,attrType:"precedes",attrValue:""}}),e.getAttribute("mei:follows")&&(t.push({action:"set",param:{elementId:n,attrType:"follows",attrValue:""}}),t.push({action:"setText",param:{elementId:n,text:""}}))}return t}(e));else{const[e,t]=function(e){if(e.sort((e,t)=>{const n=e.closest(".staff"),i=t.closest(".staff");return n.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}),2===e.length)return[e[0],e[1]];const t=e.find(e=>!e.hasAttribute("mei:precedes")&&!e.hasAttribute("mei:follows"));if(t){const n=e.indexOf(t);if(0===n)return[e[n],e[n+1]];if(n===e.length-1)return[e[n-1],e[n]]}}(i);console.log(e.id,t.id),n.push({action:"set",param:{elementId:e.id,attrType:"precedes",attrValue:"#"+t.id}}),n.push({action:"set",param:{elementId:t.id,attrType:"follows",attrValue:"#"+e.id}});const r=t.querySelector(".syl");null!==r&&n.push({action:"remove",param:{elementId:r.id}})}t.param=n,l.edit(t,l.view.getCurrentPageURI()).then(e=>{e?s.queueNotification("Toggled Syllable Link","success"):s.queueNotification("Failed to Toggle Syllable Link","error"),m(),l.updateForCurrentPage()})}function E(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{e.push(t.id)}),e}function S(){const e=[];return Array.from(document.getElementsByClassName("selected")).forEach(t=>{if(t.classList.contains("divLine")||t.classList.contains("accid")||t.classList.contains("clef"))return;Array.from(t.children).forEach(t=>{e.push(t.id)})}),e}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateErrorLogVisibility=t.initDisplayListener=t.initErrorLogControls=t.initErrorLog=t.recordNotification=void 0;const i=n(8),r=n(4),s=n(9);function o(e){const t=document.createElement("div");t.classList.add("notification-container"),t.innerHTML=`\n
\n
${e.message}
\n
\n
\n\n
\n
\n \n
\n\n
\n \n
\n
\n `;const n=t.querySelector(".log-remove");if(n.onclick=()=>t.remove(),n.addEventListener("mouseover",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-open.svg")}),n.addEventListener("mouseout",()=>{n.setAttribute("src","/Neon/Neon-gh//assets/img/garbage-closed.svg")}),e.logInfo){const i=t.querySelector(".notif-log-info-icon");i.style.display="",n.style.height="20px",i.addEventListener("mouseover",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-dark.svg")}),i.addEventListener("mouseout",()=>{i.setAttribute("src","/Neon/Neon-gh//assets/img/notification-info-icon-light.svg")}),i.addEventListener("click",()=>function(e){const t=new s.ModalWindow;t.setModalWindowView(s.ModalWindowView.ERROR_LOG,e),t.openModalWindow()}(e.logInfo))}return t}function a(){const e=document.querySelector("#error_log"),t=document.querySelector("#errorLogHeading"),n=t.querySelector("svg > use"),i=document.querySelector("#errorLogContents"),{displayErrLog:s}=(0,r.getSettings)();s&&e.classList.add("visible"),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),n.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),c()}function c(){const e=document.querySelector("#display-single-container"),t=document.createElement("label"),n=document.createElement("input");n.classList.add("checkbox"),t.classList.add("checkbox-container","side-panel-btn"),t.textContent="Errors",n.id="display-errors",n.type="checkbox",n.checked=!1,t.appendChild(n),e.append(t);const{displayErrLog:i}=(0,r.getSettings)();n.checked=i,n.addEventListener("click",()=>{(0,r.setSettings)({displayErrLog:n.checked}),l()})}function l(){const e=document.querySelector("#error_log"),{debugMode:t,displayErrLog:n,displayInfo:i,displayBBox:s,displayText:o}=(0,r.getSettings)(),a=document.getElementById("display-all-btn");t?n?(e.classList.add("visible"),i&&s&&o&&n&&(a.classList.add("selected"),a.innerHTML="Hide All")):(e.classList.remove("visible"),a.classList.contains("selected")&&(a.classList.remove("selected"),a.innerHTML="Display All")):(e.classList.remove("visible"),i&&s&&o?(a.classList.add("selected"),a.innerHTML="Hide All"):(a.classList.remove("selected"),a.innerHTML="Display All"))}t.recordNotification=function(e){document.querySelector("#errorLogContents").prepend(o(e))},t.initErrorLog=function(){document.querySelector("#error_log").innerHTML=i.errorLogsPanelContents,a()},t.initErrorLogControls=a,t.initDisplayListener=c,t.updateErrorLogVisibility=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resize=void 0;const i=n(5),r=n(7),s=n(15),o=n(3),a=n(4),c={TopLeft:0,Top:1,TopRight:2,Right:3,BottomRight:4,Bottom:5,BottomLeft:6,Left:7};function l(e,t,n,i,r){let s;if(r>=0)s=[{x:e,y:t,name:c.TopLeft},{x:(e+n)/2,y:t+(n-e)/2*Math.sin(r),name:c.Top},{x:n,y:t+(n-e)*Math.sin(r),name:c.TopRight},{x:n,y:(t+i+(n-e)*Math.sin(r))/2,name:c.Right},{x:n,y:i,name:c.BottomRight},{x:(e+n)/2,y:i-(n-e)/2*Math.sin(r),name:c.Bottom},{x:e,y:i-(n-e)*Math.sin(r),name:c.BottomLeft},{x:e,y:(t+i-(n-e)*Math.sin(r))/2,name:c.Left}];else{const o=(n-e)*Math.tan(Math.abs(r)),a=i-t-o;s=[{x:e,y:t+o,name:c.TopLeft},{x:(e+n)/2,y:t+o/2,name:c.Top},{x:n,y:t,name:c.TopRight},{x:n,y:t+a/2,name:c.Right},{x:n,y:t+a,name:c.BottomRight},{x:(e+n)/2,y:i-o/2,name:c.Bottom},{x:e,y:i,name:c.BottomLeft},{x:e,y:i-a/2,name:c.Left}]}return s}t.resize=function(e,t,n){let u,d,h,f,g,p,m,v,y,b,w,_,E,S,x;function L(){const e=l(u,d,h,f,g),t=e.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");document.querySelector("#resizeRect").setAttribute("points",t);const n=document.querySelector(".syl.selected > .sylTextRect-display");n&&(n.setAttribute("x",String(Math.min(u,h))),n.setAttribute("y",String(Math.min(d,f))),n.setAttribute("width",String(Math.abs(h-u))),n.setAttribute("height",String(Math.abs(f-d))));for(const t in c){const n=e[c[t]];r.select("#p-"+t).filter(".resizePoint").attr("cx",n.x).attr("cy",n.y)}let i=e[3].x,s=e[3].y;const o=i+100+","+(s+85)+" "+(i+70)+","+(s+50)+" "+(i+100)+","+(s+15)+" "+(i+130)+","+(s+50);i=e[7].x,s=e[7].y;const a=i-100+","+(s-15)+" "+(i-130)+","+(s-50)+" "+(i-100)+","+(s-85)+" "+(i-70)+","+(s-50);r.select("#rotateLeft").attr("points",a),r.select("#rotateRight").attr("points",o)}!function A(){if(null===e)return;if(r.selectAll(".resizePoint").remove(),r.selectAll("#resizeRect").remove(),r.selectAll(".rotatePoint").remove(),e.classList.contains("syl")){const t=e.querySelector(".sylTextRect-display");if(null===t)return void console.warn("Tried to draw resize rect for a sylTextRect that doesn't exist (or isn't displaying)");u=Number(t.getAttribute("x")),d=Number(t.getAttribute("y")),h=+u+ +t.getAttribute("width"),f=+d+ +t.getAttribute("height"),g=0}if(e.classList.contains("staff")){const t=(0,i.getStaffBBox)(e);u=t.ulx,d=t.uly,h=t.lrx,f=t.lry;const n=e.querySelector("path").getAttribute("d").match(/\d+/g).map(e=>Number(e));g=Math.atan((n[3]-n[1])/(n[2]-n[0]))}let k;p=u,y=d,m=h,b=f;const C=l(u,d,h,f,g);E=C[2].x-C[0].x;const I=C.filter((e,t)=>t%2==0).map(e=>e.x+","+e.y).join(" ");r.select("#"+e.id).append("polygon").attr("points",I).attr("id","resizeRect").attr("stroke","black").attr("stroke-width",10).attr("fill","none").style("cursor","move").style("stroke-dasharray","20 10");const{circleSize:P}=(0,a.getSettings)();for(const t in c){const n=C[c[t]];r.select(e.viewportElement).append("circle").attr("cx",n.x).attr("cy",n.y).attr("r",P).attr("stroke","black").attr("stroke-width",4).attr("fill","#0099ff").attr("class","resizePoint").attr("id","p-"+t)}for(const e in c)r.select("#p-"+e).filter(".resizePoint").call(r.drag().on("start",()=>{O(e)}).on("drag",B).on("end",T.bind(this)));if(e.classList.contains("staff")){let t=C[3].x,n=C[3].y;const i=t+100+","+(n+85)+" "+(t+70)+","+(n+50)+" "+(t+100)+","+(n+15)+" "+(t+130)+","+(n+50);t=C[7].x,n=C[7].y;const s=t-100+","+(n-15)+" "+(t-130)+","+(n-50)+" "+(t-100)+","+(n-85)+" "+(t-70)+","+(n-50);r.select("#"+e.id).append("polygon").attr("points",i).attr("id","rotateRight").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#"+e.id).append("polygon").attr("points",s).attr("id","rotateLeft").attr("stroke","black").attr("stroke-width",7).attr("fill","#0099ff").attr("class","rotatePoint"),r.select("#rotateLeft").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x-Math.atan(e/E);t>-.2&&t<.2&&(S=e,d=_+S,g=t,g>=0?(d=S+C.filter(e=>e.name===c.TopLeft)[0].y,f=C.filter(e=>e.name===c.BottomRight)[0].y):(d=C.filter(e=>e.name===c.TopRight)[0].y,f=S+C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M)),r.select("#rotateRight").call(r.drag().on("start",N).on("drag",(function(){const e=r.mouse(this)[1]-w,t=x+Math.atan(e/E);t>-.2&&t<.2&&(S=e,g=t,g>=0?(f=S+C.filter(e=>e.name===c.BottomRight)[0].y,d=C.filter(e=>e.name===c.TopLeft)[0].y):(d=S+C.filter(e=>e.name===c.TopRight)[0].y,f=C.filter(e=>e.name===c.BottomLeft)[0].y));L()})).on("end",M))}function O(e){k=e;const t=C.find(t=>t.name===c[e]);v=[t.x,t.y],y=d,b=f}function B(){const e=r.mouse(this);switch(c[k]){case c.TopLeft:u=e[0],d=e[1];break;case c.Top:d=e[1]-(h-u)*Math.tan(g)/2;break;case c.TopRight:h=e[0],d=e[1]-(h-u)*Math.tan(g);break;case c.Right:h=e[0],f=b+(e[0]-v[0])*Math.tan(g);break;case c.BottomRight:h=e[0],f=e[1];break;case c.Bottom:f=e[1]+(h-u)*Math.tan(g)/2;break;case c.BottomLeft:u=e[0],f=e[1]+(h-u)*Math.tan(g);break;case c.Left:u=e[0],d=y+(e[0]-v[0])*Math.tan(g);break;default:console.error("Something that wasn't a side of the rectangle was dragged. This shouldn't happen.")}L()}function T(){if((0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return u=p,d=y,h=m,f=b,L(),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Resize action failed.","error");const r={action:"resize",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{if(r&&await t.updateForCurrentPage(),e=document.querySelector("#"+e.id),u=void 0,d=void 0,h=void 0,f=void 0,A(),e.classList.contains("syl"))(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this);else{(0,i.selectAll)([document.querySelector("#"+e.id)],t,n);const r=document.querySelector("moreEdit");r&&(r.innerHTML="",r.parentElement.classList.add("hidden"))}})}function N(){const e=r.event.sourceEvent.target.id;w=r.mouse(this)[1],b=f,y=d,_="rotateRight"===e?f:d,x=g}function M(){if(void 0===S&&(S=0),(0,s.isOutOfSVGBounds)(u,d)||(0,s.isOutOfSVGBounds)(h,f))return document.querySelectorAll(".resizePoint").forEach(e=>e.remove()),document.querySelectorAll("#resizeRect").forEach(e=>e.remove()),document.querySelectorAll(".rotatePoint").forEach(e=>e.remove()),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n),(0,o.queueNotification)("[FAIL] Glyphs were placed out of bounds! Rotate action failed.","error");const r={action:"resizeRotate",param:{elementId:e.id,ulx:u,uly:d,lrx:h,lry:f,rotate:180*g/Math.PI}};t.edit(r,t.view.getCurrentPageURI()).then(async r=>{r&&await t.updateForCurrentPage(),e=document.getElementById(e.id),u=void 0,d=void 0,h=void 0,f=void 0,S=void 0,A(),e.classList.contains("syl")?(0,i.selectBBox)(e.querySelector(".sylTextRect-display"),n,this):(0,i.selectStaff)(e,n)})}}()}},function(e,t,n){"use strict";n.r(t),function(e){var i,r,s=n(2),o=n.n(s),a=n(22),c=n(16),l=n.n(c),u=n(21),d=n.n(u),h=n(6),f=n.n(h),g=n(1),p=n.n(g),m=n(0),v=n.n(m);function y(e){return"$"+e}function b(e){return e.substring(1)}function w(){this._store={}}function _(e){if(this._store=new w,e&&Array.isArray(e))for(var t=0,n=e.length;tb(e))},w.prototype.delete=function(e){var t=y(e),n=t in this._store;return delete this._store[t],n},w.prototype.forEach=function(e){for(var t=Object.keys(this._store),n=0,i=t.length;n=u.length)){var n=Math.min(d+6,u.length),i=u.slice(d,n);!function(n,i){n.forEach((function(n,r){var o=i+r,a=s.get(n),u=I(a[0],["atts_since","attachments"]);u.open_revs=a.map((function(e){return e.rev})),u.open_revs=u.open_revs.filter(O);var d=O;0===u.open_revs.length&&(delete u.open_revs,d=B),["revs","attachments","binary","ajax","latest"].forEach((function(e){e in t&&(u[e]=t[e])})),e.get(n,u,(function(e,t){var i,r,s;i=e?[{error:e}]:d(t),r=n,s=i,c[o]={id:r,docs:s},l(),h()}))}))}(i,d),d+=i.length}}h()}try{localStorage.setItem("_pouch_check_localstorage",1),P=!!localStorage.getItem("_pouch_check_localstorage")}catch(e){P=!1}function N(){return P}function M(){v.a.call(this),this._listeners={},function(e){N()&&addEventListener("storage",(function(t){e.emit(t.key)}))}(this)}function q(e){if("undefined"!=typeof console&&"function"==typeof console[e]){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function D(e){var t=0;return e||(t=2e3),function(e,t){return e=parseInt(e,10)||0,(t=parseInt(t,10))!=t||t<=e?t=(e||1)<<1:t+=1,t>6e5&&(e=3e5,t=6e5),~~((t-e)*Math.random()+e)}(e,t)}function F(e,t){q("info","The above "+e+" is totally normal. "+t)}p()(M,v.a),M.prototype.addListener=function(e,t,n,i){if(!this._listeners[t]){var r=this,s=!1;this._listeners[t]=a,this.on(e,a)}function a(){if(r._listeners[t])if(s)s="waiting";else{s=!0;var e=I(i,["style","include_docs","attachments","conflicts","filter","doc_ids","view","since","query_params","binary","return_docs"]);n.changes(e).on("change",(function(e){e.seq>i.since&&!i.cancelled&&(i.since=e.seq,i.onChange(e))})).on("complete",(function(){"waiting"===s&&o()(a),s=!1})).on("error",(function(){s=!1}))}}},M.prototype.removeListener=function(e,t){t in this._listeners&&(v.a.prototype.removeListener.call(this,e,this._listeners[t]),delete this._listeners[t])},M.prototype.notifyLocalWindows=function(e){N()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},M.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)};var j="function"==typeof Object.assign?Object.assign:function(e){for(var t=Object(e),n=1;n0||i0||i>>1],t)<0?r=i+1:s=i;return r}(e,t,n);e.splice(i,0,t)}function Re(e,t){for(var n,i,r=t,s=e.length;r0;){var r=n.pop(),s=r.tree1,o=r.tree2;(s[1].status||o[1].status)&&(s[1].status="available"===s[1].status||"available"===o[1].status?"available":"missing");for(var a=0;a0;){var p=g.pop();if(0!==p.diff)for(var m=p.ids[2],v=0,y=m.length;vt){n||(n={});var u=l.length-t;a={pos:c.pos+u,ids:Re(l,u)};for(var d=0;d0&&i.emit("error",t)):i.emit("complete",n),i.removeAllListeners(),e.removeListener("destroyed",s)}));function s(){i.cancel()}n&&(i.on("complete",(function(e){n(null,e)})),i.on("error",n)),e.once("destroyed",s),t.onChange=function(e,t,n){i.isCancelled||function(e,t,n,i){try{e.emit("change",t,n,i)}catch(e){q("error",'Error in .on("change", function):',e)}}(i,e,t,n)};var o=new Promise((function(e,n){t.complete=function(t,i){t?n(t):e(i)}}));i.once("cancel",(function(){e.removeListener("destroyed",s),t.complete(null,{status:"cancelled"})})),this.then=o.then.bind(o),this.catch=o.catch.bind(o),this.then((function(e){r(null,e)}),r),e.taskqueue.isReady?i.validateChanges(t):e.taskqueue.addTask((function(e){e?t.complete(e):i.isCancelled?i.emit("cancel"):i.validateChanges(t)}))}function Ke(e,t,n){var i=[{rev:e._rev}];"all_docs"===n.style&&(i=Me(t.rev_tree).map((function(e){return{rev:e.rev}})));var r={id:t.id,changes:i,doc:e};return Ze(t,e._rev)&&(r.deleted=!0),n.conflicts&&(r.doc._conflicts=qe(t),r.doc._conflicts.length||delete r.doc._conflicts),r}function Ye(e,t){return et?1:0}function Xe(e,t){return function(n,i){n||i[0]&&i[0].error?((n=n||i[0]).docId=t,e(n)):e(null,i.length?i[0]:i)}}function Je(e,t){var n=Ye(e._id,t._id);return 0!==n?n:Ye(e._revisions?e._revisions.start:0,t._revisions?t._revisions.start:0)}function Qe(){for(var e in v.a.call(this),Qe.prototype)"function"==typeof this[e]&&(this[e]=this[e].bind(this))}function et(){this.isReady=!1,this.failed=!1,this.queue=[]}function tt(e,t){if(!(this instanceof tt))return new tt(e,t);var n=this;if(t=t||{},e&&"object"==typeof e&&(e=(t=e).name,delete t.name),void 0===t.deterministic_revs&&(t.deterministic_revs=!0),this.__opts=t=L(t),n.auto_compaction=t.auto_compaction,n.prefix=tt.prefix,"string"!=typeof e)throw new Error("Missing/invalid DB name");var i=function(e,t){var n=e.match(/([a-z-]*):\/\/(.*)/);if(n)return{name:/https?/.test(n[1])?n[1]+"://"+n[2]:n[2],adapter:n[1]};var i=tt.adapters,r=tt.preferredAdapters,s=tt.prefix,o=t.adapter;if(!o)for(var a=0;at&&a.push(e)})),Te(s,(function(e,t,n,i,r){var s=t+"-"+n;"available"===r.status&&-1!==a.indexOf(s)&&c.push(s)})),i._doCompaction(e,c,n)}))})),Qe.prototype.compact=C("compact",(function(e,t){"function"==typeof e&&(t=e,e={});e=e||{},this._compactionQueue=this._compactionQueue||[],this._compactionQueue.push({opts:e,callback:t}),1===this._compactionQueue.length&&function e(t){var n=t._compactionQueue[0],i=n.opts,r=n.callback;t.get("_local/compaction").catch((function(){return!1})).then((function(n){n&&n.last_seq&&(i.last_seq=n.last_seq),t._compact(i,(function(n,i){n?r(n):r(null,i),o()((function(){t._compactionQueue.shift(),t._compactionQueue.length&&e(t)}))}))}))}(this)})),Qe.prototype._compact=function(e,t){var n=this,i={return_docs:!1,last_seq:e.last_seq||0},r=[];n.changes(i).on("change",(function(e){r.push(n.compactDocument(e.id,0))})).on("complete",(function(e){var i=e.last_seq;Promise.all(r).then((function(){return pe(n,"_local/compaction",(function(e){return(!e.last_seq||e.last_seq0?e.keys.slice(e.skip):e.keys;e.keys=t,e.skip=0,delete e.limit,e.descending&&(t.reverse(),e.descending=!1)}(e),0===e.keys.length))return this._allDocs({limit:0},t)}return this._allDocs(e,t)})),Qe.prototype.changes=function(e,t){return"function"==typeof e&&(t=e,e={}),(e=e||{}).return_docs="return_docs"in e?e.return_docs:!e.live,new We(this,e,t)},Qe.prototype.close=C("close",(function(e){return this._closed=!0,this.emit("closed"),this._close(e)})),Qe.prototype.info=C("info",(function(e){var t=this;this._info((function(n,i){if(n)return e(n);i.db_name=i.db_name||t.name,i.auto_compaction=!(!t.auto_compaction||ae(t)),i.adapter=t.adapter,e(null,i)}))})),Qe.prototype.id=C("id",(function(e){return this._id(e)})),Qe.prototype.type=function(){return"function"==typeof this._type?this._type():this.adapter},Qe.prototype.bulkDocs=C("bulkDocs",(function(e,t,n){if("function"==typeof t&&(n=t,t={}),t=t||{},Array.isArray(e)&&(e={docs:e}),!e||!e.docs||!Array.isArray(e.docs))return n(ne(V));for(var i=0;i1?t.set(e.name,n):t.delete(e.name))}})),e.on("destroyed",(function(e){if(t.has(e)){var n=t.get(e);t.delete(e),n.forEach((function(e){e.emit("destroyed",!0)}))}}))}(tt),tt.adapter=function(e,t,n){t.valid()&&(tt.adapters[e]=t,n&&tt.preferredAdapters.push(e))},tt.plugin=function(e){if("function"==typeof e)e(tt);else{if("object"!=typeof e||0===Object.keys(e).length)throw new Error('Invalid plugin: got "'+e+'", expected an object or a function');Object.keys(e).forEach((function(t){tt.prototype[t]=e[t]}))}return this.__defaults&&(tt.__defaults=j({},this.__defaults)),tt},tt.defaults=function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);n=n||{},e&&"object"==typeof e&&(e=(n=e).name,delete n.name),n=j({},t.__defaults,n),tt.call(this,e,n)}return p()(t,tt),t.preferredAdapters=tt.preferredAdapters.slice(),Object.keys(tt).forEach((function(e){e in t||(t[e]=tt[e])})),t.__defaults=j({},this.__defaults,e),t},tt.fetch=function(e,t){return it(e,t)};function ot(e,t){for(var n=e,i=0,r=t.length;i0&&"\\"===e[i-1]&&("$"===s||"."===s)?n=n.substring(0,n.length-1)+s:"."===s?(t.push(n),n=""):n+=s}return t.push(n),t}var ct=["$or","$nor","$not"];function lt(e){return ct.indexOf(e)>-1}function ut(e){return Object.keys(e)[0]}function dt(e){var t={},n={$or:!0,$nor:!0};return e.forEach((function(e){Object.keys(e).forEach((function(i){var r=e[i];if("object"!=typeof r&&(r={$eq:r}),lt(i))if(r instanceof Array){if(n[i])return n[i]=!1,void(t[i]=r);var s=[];t[i].forEach((function(e){Object.keys(r).forEach((function(t){var n=r[t],i=Math.max(Object.keys(e).length,Object.keys(n).length),o=dt([e,n]);Object.keys(o).length<=i||s.push(o)}))})),t[i]=s}else t[i]=dt([r]);else{var o=t[i]=t[i]||{};Object.keys(r).forEach((function(e){var t=r[e];return"$gt"===e||"$gte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$gte?"$gte"===e?t>n.$gte&&(n.$gte=t):t>=n.$gte&&(delete n.$gte,n.$gt=t):void 0!==n.$gt?"$gte"===e?t>n.$gt&&(delete n.$gt,n.$gte=t):t>n.$gt&&(n.$gt=t):n[e]=t}(e,t,o):"$lt"===e||"$lte"===e?function(e,t,n){if(void 0!==n.$eq)return;void 0!==n.$lte?"$lte"===e?tt?1:-1}(e,t)}return Array.isArray(e)?function(e,t){for(var n=Math.min(e.length,t.length),i=0;it.length?1:-1}(e,t):function(e,t){for(var n=Object.keys(e),i=Object.keys(t),r=Math.min(n.length,i.length),s=0;si.length?1:-1}(e,t)}function gt(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-1/0||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var n=e.length;e=new Array(n);for(var i=0;ir?1:0)}}(t.sort);e=e.sort(i),"string"!=typeof t.sort[0]&&"desc"===(r=t.sort[0])[ut(r)]&&(e=e.reverse())}var r;if("limit"in t||"skip"in t){var s=t.skip||0,o=("limit"in t?t.limit:e.length)+s;e=e.slice(s,o)}return e}function _t(e,t,n){return n.every((function(n){var i=t[n],r=at(n),s=ot(e,r);return lt(n)?function(e,t,n){if("$or"===e)return t.some((function(e){return _t(n,e,Object.keys(e))}));if("$not"===e)return!_t(n,t,Object.keys(t));return!t.find((function(e){return _t(n,e,Object.keys(e))}))}(n,i,e):Et(i,e,r,s)}))}function Et(e,t,n,i){return!e||("object"==typeof e?Object.keys(e).every((function(r){var s=e[r];if(0===r.indexOf("$"))return St(r,t,s,n,i);var o=at(r);if(void 0===i&&"object"!=typeof s&&o.length>0)return!1;var a=ot(i,o);return"object"==typeof s?Et(s,t,n,a):St("$eq",t,s,o,a)})):e===i)}function St(e,t,n,i,r){if(!kt[e])throw new Error('unknown operator "'+e+'" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, $nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');return kt[e](t,n,i,r)}function xt(e){return null!=e}function Lt(e){return void 0!==e}function At(e,t){return t.some((function(t){return e instanceof Array?e.some((function(e){return 0===ft(t,e)})):0===ft(t,e)}))}var kt={$elemMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.some((function(e){return _t(e,t,Object.keys(t))})):i.some((function(i){return Et(t,e,n,i)}))))},$allMatch:function(e,t,n,i){return!!Array.isArray(i)&&(0!==i.length&&("object"==typeof i[0]?i.every((function(e){return _t(e,t,Object.keys(t))})):i.every((function(i){return Et(t,e,n,i)}))))},$eq:function(e,t,n,i){return Lt(i)&&0===ft(i,t)},$gte:function(e,t,n,i){return Lt(i)&&ft(i,t)>=0},$gt:function(e,t,n,i){return Lt(i)&&ft(i,t)>0},$lte:function(e,t,n,i){return Lt(i)&&ft(i,t)<=0},$lt:function(e,t,n,i){return Lt(i)&&ft(i,t)<0},$exists:function(e,t,n,i){return t?Lt(i):!Lt(i)},$mod:function(e,t,n,i){return xt(i)&&function(e,t){return"number"==typeof e&&parseInt(e,10)===e&&e%t[0]===t[1]}(i,t)},$ne:function(e,t,n,i){return t.every((function(e){return 0!==ft(i,e)}))},$in:function(e,t,n,i){return xt(i)&&At(i,t)},$nin:function(e,t,n,i){return xt(i)&&!At(i,t)},$size:function(e,t,n,i){return xt(i)&&Array.isArray(i)&&function(e,t){return e.length===t}(i,t)},$all:function(e,t,n,i){return Array.isArray(i)&&function(e,t){return t.every((function(t){return e.some((function(e){return 0===ft(t,e)}))}))}(i,t)},$regex:function(e,t,n,i){return xt(i)&&"string"==typeof i&&t.every((function(e){return function(e,t){return new RegExp(t).test(e)}(i,e)}))},$type:function(e,t,n,i){return function(e,t){switch(t){case"null":return null===e;case"boolean":return"boolean"==typeof e;case"number":return"number"==typeof e;case"string":return"string"==typeof e;case"array":return e instanceof Array;case"object":return"[object Object]"==={}.toString.call(e)}}(i,t)}};function Ct(e,t){if(e.selector&&e.filter&&"_selector"!==e.filter){var n="string"==typeof e.filter?e.filter:"function";return t(new Error('selector invalid for filter "'+n+'"'))}t()}function It(e){e.view&&!e.filter&&(e.filter="_view"),e.selector&&!e.filter&&(e.filter="_selector"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=le(e.view):e.filter=le(e.filter))}function Pt(e,t){return t.filter&&"string"==typeof t.filter&&!t.doc_ids&&!ae(e.db)}function Ot(e,t){var n=t.complete;if("_view"===t.filter){if(!t.view||"string"!=typeof t.view){var i=ne(X,"`view` filter parameter not found or invalid.");return n(i)}var r=ce(t.view);e.db.get("_design/"+r[0],(function(i,s){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=s&&s.views&&s.views[r[1]]&&s.views[r[1]].map;if(!o)return n(ne(z,s.views?"missing json key: "+r[1]:"missing json key: views"));t.filter=ge(["return function(doc) {",' "use strict";'," var emitted = false;"," var emit = function (a, b) {"," emitted = true;"," };"," var view = "+o+";"," view(doc);"," if (emitted) {"," return true;"," }","};"].join("\n"),{}),e.doChanges(t)}))}else if(t.selector)t.filter=function(e){return function(e,t){if("object"!=typeof t)throw new Error("Selector error: expected a JSON object");var n=wt([{doc:e}],{selector:t=ht(t)},Object.keys(t));return n&&1===n.length}(e,t.selector)},e.doChanges(t);else{var s=ce(t.filter);e.db.get("_design/"+s[0],(function(i,r){if(e.isCancelled)return n(null,{status:"cancelled"});if(i)return n(ie(i));var o=r&&r.filters&&r.filters[s[1]];if(!o)return n(ne(z,r&&r.filters?"missing json key: "+s[1]:"missing json key: filters"));t.filter=ge('"use strict";\nreturn '+o+";",{}),e.doChanges(t)}))}}function Bt(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})}tt.plugin((function(e){e._changesFilterPlugin={validate:Ct,normalize:It,shouldFilter:Pt,filter:Ot}})),tt.version="7.3.0";var Tt=Bt(["_id","_rev","_access","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),Nt=Bt(["_access","_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);function Mt(e){if(!/^\d+-/.test(e))return ne(ee);var t=e.indexOf("-"),n=e.substring(0,t),i=e.substring(t+1);return{prefix:parseInt(n,10),id:i}}function qt(e,t,n){var i,r,s;n||(n={deterministic_revs:!0});var o={status:"available"};if(e._deleted&&(o.deleted=!0),t)if(e._id||(e._id=Oe()),r=Pe(e,n.deterministic_revs),e._rev){if((s=Mt(e._rev)).error)return s;e._rev_tree=[{pos:s.prefix,ids:[s.id,{status:"missing"},[[r,o,[]]]]}],i=s.prefix+1}else e._rev_tree=[{pos:1,ids:[r,o,[]]}],i=1;else if(e._revisions&&(e._rev_tree=function(e,t){for(var n=e.start-e.ids.length+1,i=e.ids,r=[i[0],t,[]],s=1,o=i.length;s1&&!n?(a={continue:function(){if(!s.length)return r();var n,a=s[s.length-1];if(t&&t.upper)try{n=IDBKeyRange.bound(a,t.upper,!0,t.upperOpen)}catch(e){if("DataError"===e.name&&0===e.code)return r()}else n=IDBKeyRange.lowerBound(a,!0);t=n,s=null,o=null,e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l}},e.getAll(t,i).onsuccess=c,e.getAllKeys(t,i).onsuccess=l):n?e.openCursor(t,"prev").onsuccess=u:e.openCursor(t).onsuccess=u}function nn(e,t,n){var i,r,s="startkey"in e&&e.startkey,o="endkey"in e&&e.endkey,a="key"in e&&e.key,c="keys"in e&&e.keys,l=e.skip||0,u="number"==typeof e.limit?e.limit:-1,d=!1!==e.inclusive_end;if(!c&&(r=(i=function(e,t,n,i,r){try{if(e&&t)return r?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return r?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return r?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(i)return IDBKeyRange.only(i)}catch(e){return{error:e}}return null}(s,o,d,a,e.descending))&&i.error)&&("DataError"!==r.name||0!==r.code))return n(ne(Q,r.name,r.message));var h=[Vt,"by-sequence",zt];e.attachments&&h.push("attach-store");var f=Jt(t,h,"readonly");if(f.error)return n(f.error);var g=f.txn;g.oncomplete=function(){e.attachments?Yt(E,e.binary).then(A):A()},g.onabort=Ut(n);var p,m,v,y=g.objectStore(Vt),b=g.objectStore("by-sequence"),w=g.objectStore(zt),_=b.index("_doc_id_rev"),E=[];function S(t,n){var i={id:n.id,key:n.id,value:{rev:t}};n.deleted?c&&(E.push(i),i.value.deleted=!0,i.doc=null):l--<=0&&(E.push(i),e.include_docs&&function(t,n,i){var r=t.id+"::"+i;_.get(r).onsuccess=function(i){if(n.doc=Gt(i.target.result)||{},e.conflicts){var r=qe(t);r.length&&(n.doc._conflicts=r)}Kt(n.doc,e,g)}}(n,i,t))}function x(e){for(var t=0,n=e.length;t0&&(m=e.target.result[0])},b.openCursor(null,"prev").onsuccess=function(e){var t=e.target.result,n=void 0;return t&&t.key&&(n=t.key),v({target:{result:[n]}})}),r||0===u?void 0:c?function(e,t,n){var i=new Array(e.length),r=0;e.forEach((function(s,o){t.get(s).onsuccess=function(t){t.target.result?i[o]=t.target.result:i[o]={key:s,error:"not_found"},++r===e.length&&n(e,i,{})}}))}(e.keys,y,L):-1===u?function(e,t,n){if("function"!=typeof e.getAll){var i=[];e.openCursor(t).onsuccess=function(e){var t=e.target.result;t?(i.push(t.value),t.continue()):n({target:{result:i}})}}else e.getAll(t).onsuccess=n}(y,i,(function(t){var n=t.target.result;e.descending&&(n=n.reverse()),x(n)})):void tn(y,i,e.descending,u+l,L)}var rn=!1,sn=[];function on(){!rn&&sn.length&&(rn=!0,sn.shift()())}function an(e,t,n,s){if((e=L(e)).continuous){var o=n+":"+Oe();return Qt.addListener(n,o,t,e),Qt.notify(n),{cancel:function(){Qt.removeListener(n,o)}}}var a=e.doc_ids&&new i(e.doc_ids);e.since=e.since||0;var c=e.since,l="limit"in e?e.limit:-1;0===l&&(l=1);var u,d,h,f,g=[],p=0,m=re(e),v=new r;function y(e,t,n,i){if(n.seq!==t)return i();if(n.winningRev===e._rev)return i(n,e);var r=e._id+"::"+n.winningRev;f.get(r).onsuccess=function(e){i(n,Gt(e.target.result))}}function b(){e.complete(null,{results:g,last_seq:c})}var w=[Vt,"by-sequence"];e.attachments&&w.push("attach-store");var _=Jt(s,w,"readonly");if(_.error)return e.complete(_.error);(u=_.txn).onabort=Ut(e.complete),u.oncomplete=function(){!e.continuous&&e.attachments?Yt(g).then(b):b()},d=u.objectStore("by-sequence"),h=u.objectStore(Vt),f=d.index("_doc_id_rev"),tn(d,e.since&&!e.descending?IDBKeyRange.lowerBound(e.since,!0):null,e.descending,l,(function(t,n,i){if(i&&t.length){var r=new Array(t.length),s=new Array(t.length),o=0;n.forEach((function(n,c){!function(e,t,n){if(a&&!a.has(e._id))return n();var i=v.get(e._id);if(i)return y(e,t,i,n);h.get(e._id).onsuccess=function(r){i=Zt(r.target.result),v.set(e._id,i),y(e,t,i,n)}}(Gt(n),t[c],(function(n,a){s[c]=n,r[c]=a,++o===t.length&&function(){for(var t=[],n=0,o=r.length;nr&&(r=n),t.continue()}}()}function o(){var e=$t(s,s.winningRev,s.deleted);n.put(e).onsuccess=function(){i.continue()}}}}e._meta=null,e._remote=!1,e.type=function(){return"idb"},e._id=k((function(t){t(null,e._meta.instanceId)})),e._bulkDocs=function(n,i,s){en(t,n,i,e,r,a(s))},e._get=function(e,t,n){var i,s,o,a=t.ctx;if(!a){var c=Jt(r,[Vt,"by-sequence","attach-store"],"readonly");if(c.error)return n(c.error);a=c.txn}function l(){n(o,{doc:i,metadata:s,ctx:a})}a.objectStore(Vt).get(e).onsuccess=function(e){if(!(s=Zt(e.target.result)))return o=ne(z,"missing"),l();var n;if(t.rev)n=t.latest?function(e,t){for(var n,i=t.rev_tree.slice();n=i.pop();){var r=n.pos,s=n.ids,o=s[0],a=s[1],c=s[2],l=0===c.length,u=n.history?n.history.slice():[];if(u.push({id:o,pos:r,opts:a}),l)for(var d=0,h=u.length;d=43)},i.onerror=e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)}})).catch((function(){return!1}))}(u)),cn.then((function(e){c=e,h()})),u.oncomplete=function(){d=!0,h()},u.onabort=Ut(n)},f.onerror=function(e){var t=e.target.error&&e.target.error.message;t?-1!==t.indexOf("stored database is a higher version")&&(t=new Error('This DB was created with the newer "indexeddb" adapter, but you are trying to open it with the older "idb" adapter')):t="Failed to open indexedDB, are you in private browsing mode?",q("error",t),n(ne(Q,t))}}(n,e,t)}),t,n.constructor)}dn.valid=function(){try{return"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}};var hn={};function fn(e){var t=e.doc||e.ok,n=t&&t._attachments;n&&Object.keys(n).forEach((function(e){var t=n[e];t.data=_e(t.data,t.content_type)}))}function gn(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function pn(e){return e._attachments&&Object.keys(e._attachments)?Promise.all(Object.keys(e._attachments).map((function(t){var n=e._attachments[t];if(n.data&&"string"!=typeof n.data)return new Promise((function(e){xe(n.data,e)})).then((function(e){n.data=e}))}))):Promise.resolve()}function mn(e,t){if(function(e){if(!e.prefix)return!1;var t=fe(e.prefix).protocol;return"http"===t||"https"===t}(t)){var n=t.name.substr(t.prefix.length);e=t.prefix.replace(/\/?$/,"/")+encodeURIComponent(n)}var i=fe(e);(i.user||i.password)&&(i.auth={username:i.user,password:i.password});var r=i.path.replace(/(^\/|\/$)/g,"").split("/");return i.db=r.pop(),-1===i.db.indexOf("%")&&(i.db=encodeURIComponent(i.db)),i.path=r.join("/"),i}function vn(e,t){return yn(e,e.db+"/"+t)}function yn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function bn(e){return"?"+Object.keys(e).map((function(t){return t+"="+encodeURIComponent(e[t])})).join("&")}function wn(t,n){var i=this,r=mn(t.name,t),s=vn(r,"");t=L(t);var a,c=function(e,n){if((n=n||{}).headers=n.headers||new rt,n.credentials="include",t.auth||r.auth){var i=t.auth||r.auth,s=i.username+":"+i.password,o=ve(unescape(encodeURIComponent(s)));n.headers.set("Authorization","Basic "+o)}var a=t.headers||{};return Object.keys(a).forEach((function(e){n.headers.append(e,a[e])})),function(e){var t="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",n=-1!==t.indexOf("msie"),i=-1!==t.indexOf("trident"),r=-1!==t.indexOf("edge"),s=!("method"in e)||"GET"===e.method;return(n||i||r)&&s}(n)&&(e+=(-1===e.indexOf("?")?"?":"&")+"_nonce="+Date.now()),(t.fetch||it)(e,n)};function l(e,t){return C(e,f()((function(e){d().then((function(){return t.apply(this,e)})).catch((function(t){e.pop()(t)}))}))).bind(i)}function u(e,t,n){var i={};return(t=t||{}).headers=t.headers||new rt,t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json"),t.headers.get("Accept")||t.headers.set("Accept","application/json"),c(e,t).then((function(e){return i.ok=e.ok,i.status=e.status,e.json()})).then((function(e){if(i.data=e,!i.ok){i.data.status=i.status;var t=ie(i.data);if(n)return n(t);throw t}if(Array.isArray(i.data)&&(i.data=i.data.map((function(e){return e.error||e.missing?ie(e):e}))),!n)return i;n(null,i.data)}))}function d(){return t.skip_setup?Promise.resolve():a||((a=u(s).catch((function(e){return e&&e.status&&404===e.status?(F(404,"PouchDB is just detecting if the remote exists."),u(s,{method:"PUT"})):Promise.reject(e)})).catch((function(e){return!(!e||!e.status||412!==e.status)||Promise.reject(e)}))).catch((function(){a=null})),a)}function h(e){return e.split("/").map(encodeURIComponent).join("/")}o()((function(){n(null,i)})),i._remote=!0,i.type=function(){return"http"},i.id=l("id",(function(e){c(yn(r,"")).then((function(e){return e.json()})).catch((function(){return{}})).then((function(t){var n=t&&t.uuid?t.uuid+r.db:vn(r,"");e(null,n)}))})),i.compact=l("compact",(function(e,t){"function"==typeof e&&(t=e,e={}),e=L(e),u(vn(r,"_compact"),{method:"POST"}).then((function(){!function n(){i.info((function(i,r){r&&!r.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)}))}()}))})),i.bulkGet=C("bulkGet",(function(e,t){var n=this;function i(t){var n={};e.revs&&(n.revs=!0),e.attachments&&(n.attachments=!0),e.latest&&(n.latest=!0),u(vn(r,"_bulk_get"+bn(n)),{method:"POST",body:JSON.stringify({docs:e.docs})}).then((function(n){e.attachments&&e.binary&&n.data.results.forEach((function(e){e.docs.forEach(fn)})),t(null,n.data)})).catch(t)}function s(){var i=Math.ceil(e.docs.length/50),r=0,s=new Array(i);function o(e){return function(n,o){s[e]=o.results,++r===i&&t(null,{results:se(s)})}}for(var a=0;at?t:a;var c=vn(r,"_changes"+bn(i)),p={signal:g.signal,method:h,body:JSON.stringify(l)};f=n,e.aborted||d().then((function(){return u(c,p,o)})).catch(o)}},m={results:[]},v=function(n,i){if(!e.aborted){var r=0;if(i&&i.results){r=i.results.length,m.last_seq=i.last_seq;var c=null,l=null;"number"==typeof i.pending&&(c=i.pending),"string"!=typeof m.last_seq&&"number"!=typeof m.last_seq||(l=m.last_seq);e.query_params,i.results=i.results.filter((function(t){a--;var n=re(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&fn(t),e.return_docs&&m.results.push(t),e.onChange(t,c,l)),n}))}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(f=i.last_seq);var u=s&&a<=0||i&&r0?e.slice(n):e}function d(e){var t=e.value;return t&&"object"==typeof t&&t._id||e.id}function h(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&function(e){e.rows.forEach((function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach((function(e){var n=t[e];t[e].data=_e(n.data,n.content_type)}))}))}(t),t}}function g(e,t,n,i){var r=t[e];void 0!==r&&(i&&(r=encodeURIComponent(JSON.stringify(r))),n.push(e+"="+r))}function p(e){if(void 0!==e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function m(e,t){var n=e.descending?"endkey":"startkey",i=e.descending?"startkey":"endkey";if(void 0!==e[n]&&void 0!==e[i]&&ft(e[n],e[i])>0)throw new _n("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&!1!==e.reduce){if(e.include_docs)throw new _n("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new _n("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach((function(t){var n=function(e){if(e){if("number"!=typeof e)return new _n('Invalid value for integer: "'+e+'"');if(e<0)return new _n('Invalid value for positive integer: "'+e+'"')}}(e[t]);if(n)throw n}))}function v(e){return function(t){if(404===t.status)return e;throw t}}function y(e,t,n){var r="_local/doc_"+e,s={_id:r,keys:[]},o=n.get(e),a=o[0];return(function(e){return 1===e.length&&/^1-/.test(e[0].rev)}(o[1])?Promise.resolve(s):t.db.get(r).catch(v(s))).then((function(e){return function(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):Promise.resolve({rows:[]})}(e).then((function(t){return function(e,t){for(var n=[],r=new i,s=0,o=t.rows.length;s0&&0===ft(o.key,t)&&a.push(i),n.set(mt(a),o),t=o.key}return n}return g().then((function(){return f.finish()})).then((function(){e.seq=c}))}(e,n)}))()}function _(e,t){return Ln(b(e),(function(){return function(e,t){var i,s=e.reduceFun&&!1!==t.reduce,o=t.skip||0;void 0===t.keys||t.keys.length||(t.limit=0,delete t.keys);function a(t){return t.include_docs=!0,e.db.allDocs(t).then((function(e){return i=e.total_rows,e.rows.map((function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(tn))return e.doc.value}var i=function(e){for(var t=[],n=[],i=0;;){var r=e[i++];if("\0"!==r)switch(r){case"1":t.push(null);break;case"2":t.push("1"===e[i]),i++;break;case"3":var s=vt(e,i);t.push(s.num),i+=s.length;break;case"4":for(var o="";;){var a=e[i];if("\0"===a)break;o+=a,i++}o=o.replace(/\u0001\u0001/g,"\0").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(o);break;case"5":var c={element:[],index:t.length};t.push(c.element),n.push(c);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+r)}else{if(1===t.length)return t.pop();yt(t,n)}}}(e.doc._id);return{key:i[0],id:i[1],value:"value"in e.doc?e.doc.value:null}}))}))}function l(a){var l;if(l=s?function(e,t,i){0===i.group_level&&delete i.group_level;var r=i.group||i.group_level,s=n(e.reduceFun),o=[],a=isNaN(i.group_level)?Number.POSITIVE_INFINITY:i.group_level;t.forEach((function(e){var t=o[o.length-1],n=r?e.key:null;if(r&&Array.isArray(n)&&(n=n.slice(0,a)),t&&0===ft(t.groupKey,n))return t.keys.push([e.key,e.id]),void t.values.push(e.value);o.push({keys:[[e.key,e.id]],values:[e.value],groupKey:n})})),t=[];for(var l=0,d=o.length;l0)||function(e){return e._conflicts&&e._conflicts.length>0}(e.doc)||(e.doc._conflicts&&delete e.doc._conflicts,r.push(e.doc),delete n[e.id])}))}))}return Promise.resolve().then((function(){var e=Object.keys(n).filter((function(e){var t=n[e].missing;return 1===t.length&&Zn(t[0])}));if(e.length>0)return o(e)})).then((function(){var o=function(e){var t=[];return Object.keys(e).forEach((function(n){e[n].missing.forEach((function(e){t.push({id:n,rev:e})}))})),{docs:t,revs:!0,latest:!0}}(n);if(o.docs.length)return e.bulkGet(o).then((function(n){if(i.cancelled)throw new Error("cancelled");return Promise.all(n.results.map((function(n){return Promise.all(n.docs.map((function(n){var i=n.ok;return n.error&&(s=!1),i&&i._attachments?function(e,t,n){var i=ae(t)&&!ae(e),r=Object.keys(n._attachments);return i?e.get(n._id).then((function(i){return Promise.all(r.map((function(r){return function(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}(i,n,r)?t.getAttachment(n._id,r):e.getAttachment(i._id,r)})))})).catch((function(e){if(404!==e.status)throw e;return Gn(t,n)})):Gn(t,n)}(t,e,i).then((function(e){var t=Object.keys(i._attachments);return e.forEach((function(e,n){var r=i._attachments[t[n]];delete r.stub,delete r.length,r.data=e})),i})):i})))}))).then((function(e){r=r.concat(se(e).filter(Boolean))}))}))})).then((function(){return{ok:s,docs:r}}))}function Kn(e,t,n,i,r){return e.get(t).catch((function(n){if(404===n.status)return"http"!==e.adapter&&"https"!==e.adapter||F(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:i,_id:t,history:[],replicator:"pouchdb",version:1};throw n})).then((function(s){if(!r.cancelled&&s.last_seq!==n)return s.history=(s.history||[]).filter((function(e){return e.session_id!==i})),s.history.unshift({last_seq:n,session_id:i}),s.history=s.history.slice(0,5),s.version=1,s.replicator="pouchdb",s.session_id=i,s.last_seq=n,e.put(s).catch((function(s){if(409===s.status)return Kn(e,t,n,i,r);throw s}))}))}function Yn(e,t,n,i,r){this.src=e,this.target=t,this.id=n,this.returnValue=i,this.opts=r||{}}Yn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then((function(){return n.updateSource(e,t)}))},Yn.prototype.updateTarget=function(e,t){return this.opts.writeTargetCheckpoint?Kn(this.target,this.id,e,t,this.returnValue):Promise.resolve(!0)},Yn.prototype.updateSource=function(e,t){if(this.opts.writeSourceCheckpoint){var n=this;return Kn(this.src,this.id,e,t,this.returnValue).catch((function(e){if(Qn(e))return n.opts.writeSourceCheckpoint=!1,!0;throw e}))}return Promise.resolve(!0)};var Xn={undefined:function(e,t){return 0===ft(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return function(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history};return function e(t,n){var i=t[0],r=t.slice(1),s=n[0],o=n.slice(1);if(!i||0===n.length)return{last_seq:0,history:[]};if(Jn(i.session_id,n))return{last_seq:i.last_seq,history:t};if(Jn(s.session_id,r))return{last_seq:s.last_seq,history:o};return e(r,o)}(e.history,t.history)}(t,e).last_seq}};function Jn(e,t){var n=t[0],i=t.slice(1);return!(!e||0===t.length)&&(e===n.session_id||Jn(e,i))}function Qn(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}Yn.prototype.getCheckpoint=function(){var e=this;return e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then((function(e){return e.last_seq||0})).catch((function(e){if(404!==e.status)throw e;return 0})):e.target.get(e.id).then((function(t){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?t.last_seq||0:e.src.get(e.id).then((function(e){return t.version!==e.version?0:(n=t.version?t.version.toString():"undefined")in Xn?Xn[n](t,e):0;var n}),(function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:0}).then((function(){return 0}),(function(n){return Qn(n)?(e.opts.writeSourceCheckpoint=!1,t.last_seq):0}));throw n}))})).catch((function(e){if(404!==e.status)throw e;return 0}))};function ei(e,t,n){var i=n.doc_ids?n.doc_ids.sort(ft):"",r=n.filter?n.filter.toString():"",s="",o="",a="";return n.selector&&(a=JSON.stringify(n.selector)),n.filter&&n.query_params&&(s=JSON.stringify(function(e){return Object.keys(e).sort(ft).reduce((function(t,n){return t[n]=e[n],t}),{})}(n.query_params))),n.filter&&"_view"===n.filter&&(o=n.view.toString()),Promise.all([e.id(),t.id()]).then((function(e){var t=e[0]+e[1]+r+o+s+i+a;return new Promise((function(e){Ce(t,e)}))})).then((function(e){return"_local/"+(e=e.replace(/\//g,".").replace(/\+/g,"_"))}))}function ti(e,t,n,i,r){var s,a,c,l=[],u={seq:0,changes:[],docs:[]},d=!1,h=!1,f=!1,g=0,p=n.continuous||n.live||!1,m=n.batch_size||100,v=n.batches_limit||10,y=n.style||"all_docs",b=!1,w=n.doc_ids,_=n.selector,E=[],S=Oe();r=r||{ok:!0,start_time:(new Date).toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var x={};function A(){return c?Promise.resolve():ei(e,t,n).then((function(r){a=r;var s={};s=!1===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:"source"===n.checkpoint?{writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:"target"===n.checkpoint?{writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:{writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},c=new Yn(e,t,a,i,s)}))}function k(){if(E=[],0!==s.docs.length){var e=s.docs,o={timeout:n.timeout};return t.bulkDocs({docs:e,new_edits:!1},o).then((function(t){if(i.cancelled)throw T(),new Error("cancelled");var n=Object.create(null);t.forEach((function(e){e.error&&(n[e.id]=e)}));var s=Object.keys(n).length;r.doc_write_failures+=s,r.docs_written+=e.length-s,e.forEach((function(e){var t=n[e._id];if(t){r.errors.push(t);var s=(t.name||"").toLowerCase();if("unauthorized"!==s&&"forbidden"!==s)throw t;i.emit("denied",L(t))}else E.push(e)}))}),(function(t){throw r.doc_write_failures+=e.length,t}))}}function C(){if(s.error)throw new Error("There was a problem getting docs.");r.last_seq=g=s.seq;var e=L(r);return E.length&&(e.docs=E,"number"==typeof s.pending&&(e.pending=s.pending,delete s.pending),i.emit("change",e)),d=!0,c.writeCheckpoint(s.seq,S).then((function(){if(i.emit("checkpoint",{checkpoint:s.seq}),d=!1,i.cancelled)throw T(),new Error("cancelled");s=void 0,F()})).catch((function(e){throw R(e),e}))}function I(){return Wn(e,t,s.diffs,i).then((function(e){s.error=!e.ok,e.docs.forEach((function(e){delete s.diffs[e._id],r.docs_read++,s.docs.push(e)}))}))}function P(){var e;i.cancelled||s||(0!==l.length?(s=l.shift(),i.emit("checkpoint",{start_next_batch:s.seq}),(e={},s.changes.forEach((function(t){i.emit("checkpoint",{revs_diff:t}),"_user/"!==t.id&&(e[t.id]=t.changes.map((function(e){return e.rev})))})),t.revsDiff(e).then((function(e){if(i.cancelled)throw T(),new Error("cancelled");s.diffs=e}))).then(I).then(k).then(C).then(P).catch((function(e){B("batch processing terminated with error",e)}))):O(!0))}function O(e){0!==u.changes.length?(e||h||u.changes.length>=m)&&(l.push(u),u={seq:0,changes:[],docs:[]},"pending"!==i.state&&"stopped"!==i.state||(i.state="active",i.emit("active")),P()):0!==l.length||s||((p&&x.live||h)&&(i.state="pending",i.emit("paused")),h&&T())}function B(e,t){f||(t.message||(t.message=e),r.ok=!1,r.status="aborting",l=[],u={seq:0,changes:[],docs:[]},T(t))}function T(s){if(!(f||i.cancelled&&(r.status="cancelled",d)))if(r.status=r.status||"complete",r.end_time=(new Date).toISOString(),r.last_seq=g,f=!0,s){(s=ne(s)).result=r;var o=(s.name||"").toLowerCase();"unauthorized"===o||"forbidden"===o?(i.emit("error",s),i.removeAllListeners()):function(e,t,n,i){if(!1===e.retry)return t.emit("error",n),void t.removeAllListeners();if("function"!=typeof e.back_off_function&&(e.back_off_function=D),t.emit("requestError",n),"active"===t.state||"pending"===t.state){t.emit("paused",n),t.state="stopped";var r=function(){e.current_back_off=0};t.once("paused",(function(){t.removeListener("active",r)})),t.once("active",r)}e.current_back_off=e.current_back_off||0,e.current_back_off=e.back_off_function(e.current_back_off),setTimeout(i,e.current_back_off)}(n,i,s,(function(){ti(e,t,n,i)}))}else i.emit("complete",r),i.removeAllListeners()}function N(e,t,r){if(i.cancelled)return T();"number"==typeof t&&(u.pending=t),re(n)(e)&&(u.seq=e.seq||r,u.changes.push(e),i.emit("checkpoint",{pending_batch:u.seq}),o()((function(){O(0===l.length&&x.live)})))}function M(e){if(b=!1,i.cancelled)return T();if(e.results.length>0)x.since=e.results[e.results.length-1].seq,F(),O(!0);else{var t=function(){p?(x.live=!0,F()):h=!0,O(!0)};s||0!==e.results.length?t():(d=!0,c.writeCheckpoint(e.last_seq,S).then((function(){d=!1,r.last_seq=g=e.last_seq,t()})).catch(R))}}function q(e){if(b=!1,i.cancelled)return T();B("changes rejected",e)}function F(){if(!b&&!h&&l.length1)for(var n=1;n @@ -6,7 +6,7 @@ * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */(function(){var s="Expected a function",o="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",u="[object Boolean]",d="[object Date]",h="[object Error]",f="[object Function]",g="[object GeneratorFunction]",p="[object Map]",m="[object Number]",v="[object Object]",y="[object RegExp]",b="[object Set]",w="[object String]",_="[object Symbol]",E="[object WeakMap]",S="[object ArrayBuffer]",x="[object DataView]",L="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",C="[object Int16Array]",I="[object Int32Array]",P="[object Uint8Array]",O="[object Uint16Array]",B="[object Uint32Array]",T=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,M=/(__e\(.*?\)|\b__t\)) \+\n'';/g,q=/&(?:amp|lt|gt|quot|#39);/g,D=/[&<>"']/g,F=RegExp(q.source),j=RegExp(D.source),R=/<%-([\s\S]+?)%>/g,V=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,U=/^\w*$/,$=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Z=/[\\^$.*+?()[\]{}|]/g,G=RegExp(Z.source),W=/^\s+/,K=/\s/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,X=/\{\n\/\* \[wrapped with (.+)\] \*/,J=/,? & /,Q=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ee=/[()=,{}\[\]\/\s]/,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ie=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,se=/^0b[01]+$/i,oe=/^\[object .+?Constructor\]$/,ae=/^0o[0-7]+$/i,ce=/^(?:0|[1-9]\d*)$/,le=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ue=/($^)/,de=/['\n\r\u2028\u2029\\]/g,he="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",fe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",ge="[\\ud800-\\udfff]",pe="["+fe+"]",me="["+he+"]",ve="\\d+",ye="[\\u2700-\\u27bf]",be="[a-z\\xdf-\\xf6\\xf8-\\xff]",we="[^\\ud800-\\udfff"+fe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",_e="\\ud83c[\\udffb-\\udfff]",Ee="[^\\ud800-\\udfff]",Se="(?:\\ud83c[\\udde6-\\uddff]){2}",xe="[\\ud800-\\udbff][\\udc00-\\udfff]",Le="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+be+"|"+we+")",ke="(?:"+Le+"|"+we+")",Ce="(?:"+me+"|"+_e+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Ce+("(?:\\u200d(?:"+[Ee,Se,xe].join("|")+")[\\ufe0e\\ufe0f]?"+Ce+")*"),Pe="(?:"+[ye,Se,xe].join("|")+")"+Ie,Oe="(?:"+[Ee+me+"?",me,Se,xe,ge].join("|")+")",Be=RegExp("['’]","g"),Te=RegExp(me,"g"),Ne=RegExp(_e+"(?="+_e+")|"+Oe+Ie,"g"),Me=RegExp([Le+"?"+be+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[pe,Le,"$"].join("|")+")",ke+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[pe,Le+Ae,"$"].join("|")+")",Le+"?"+Ae+"+(?:['’](?:d|ll|m|re|s|t|ve))?",Le+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Pe].join("|"),"g"),qe=RegExp("[\\u200d\\ud800-\\udfff"+he+"\\ufe0e\\ufe0f]"),De=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Fe=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],je=-1,Re={};Re[L]=Re[A]=Re[k]=Re[C]=Re[I]=Re[P]=Re["[object Uint8ClampedArray]"]=Re[O]=Re[B]=!0,Re[c]=Re[l]=Re[S]=Re[u]=Re[x]=Re[d]=Re[h]=Re[f]=Re[p]=Re[m]=Re[v]=Re[y]=Re[b]=Re[w]=Re[E]=!1;var Ve={};Ve[c]=Ve[l]=Ve[S]=Ve[x]=Ve[u]=Ve[d]=Ve[L]=Ve[A]=Ve[k]=Ve[C]=Ve[I]=Ve[p]=Ve[m]=Ve[v]=Ve[y]=Ve[b]=Ve[w]=Ve[_]=Ve[P]=Ve["[object Uint8ClampedArray]"]=Ve[O]=Ve[B]=!0,Ve[h]=Ve[f]=Ve[E]=!1;var ze={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,Ue=parseInt,$e="object"==typeof e&&e&&e.Object===Object&&e,Ze="object"==typeof self&&self&&self.Object===Object&&self,Ge=$e||Ze||Function("return this")(),We=t&&!t.nodeType&&t,Ke=We&&"object"==typeof i&&i&&!i.nodeType&&i,Ye=Ke&&Ke.exports===We,Xe=Ye&&$e.process,Je=function(){try{var e=Ke&&Ke.require&&Ke.require("util").types;return e||Xe&&Xe.binding&&Xe.binding("util")}catch(e){}}(),Qe=Je&&Je.isArrayBuffer,et=Je&&Je.isDate,tt=Je&&Je.isMap,nt=Je&&Je.isRegExp,it=Je&&Je.isSet,rt=Je&&Je.isTypedArray;function st(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function ot(e,t,n,i){for(var r=-1,s=null==e?0:e.length;++r-1}function ht(e,t,n){for(var i=-1,r=null==e?0:e.length;++i-1;);return n}function Mt(e,t){for(var n=e.length;n--&&_t(t,e[n],0)>-1;);return n}function qt(e,t){for(var n=e.length,i=0;n--;)e[n]===t&&++i;return i}var Dt=At({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Ft=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function jt(e){return"\\"+ze[e]}function Rt(e){return qe.test(e)}function Vt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,i){n[++t]=[i,e]})),n}function zt(e,t){return function(n){return e(t(n))}}function Ht(e,t){for(var n=-1,i=e.length,r=0,s=[];++n",""":'"',"'":"'"});var Yt=function e(t){var n,i=(t=null==t?Ge:Yt.defaults(Ge.Object(),t,Yt.pick(Ge,Fe))).Array,r=t.Date,K=t.Error,he=t.Function,fe=t.Math,ge=t.Object,pe=t.RegExp,me=t.String,ve=t.TypeError,ye=i.prototype,be=he.prototype,we=ge.prototype,_e=t["__core-js_shared__"],Ee=be.toString,Se=we.hasOwnProperty,xe=0,Le=(n=/[^.]+$/.exec(_e&&_e.keys&&_e.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ae=we.toString,ke=Ee.call(ge),Ce=Ge._,Ie=pe("^"+Ee.call(Se).replace(Z,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Pe=Ye?t.Buffer:void 0,Oe=t.Symbol,Ne=t.Uint8Array,qe=Pe?Pe.allocUnsafe:void 0,ze=zt(ge.getPrototypeOf,ge),$e=ge.create,Ze=we.propertyIsEnumerable,We=ye.splice,Ke=Oe?Oe.isConcatSpreadable:void 0,Xe=Oe?Oe.iterator:void 0,Je=Oe?Oe.toStringTag:void 0,yt=function(){try{var e=es(ge,"defineProperty");return e({},"",{}),e}catch(e){}}(),At=t.clearTimeout!==Ge.clearTimeout&&t.clearTimeout,Xt=r&&r.now!==Ge.Date.now&&r.now,Jt=t.setTimeout!==Ge.setTimeout&&t.setTimeout,Qt=fe.ceil,en=fe.floor,tn=ge.getOwnPropertySymbols,nn=Pe?Pe.isBuffer:void 0,rn=t.isFinite,sn=ye.join,on=zt(ge.keys,ge),an=fe.max,cn=fe.min,ln=r.now,un=t.parseInt,dn=fe.random,hn=ye.reverse,fn=es(t,"DataView"),gn=es(t,"Map"),pn=es(t,"Promise"),mn=es(t,"Set"),vn=es(t,"WeakMap"),yn=es(ge,"create"),bn=vn&&new vn,wn={},_n=ks(fn),En=ks(gn),Sn=ks(pn),xn=ks(mn),Ln=ks(vn),An=Oe?Oe.prototype:void 0,kn=An?An.valueOf:void 0,Cn=An?An.toString:void 0;function In(e){if($o(e)&&!No(e)&&!(e instanceof Tn)){if(e instanceof Bn)return e;if(Se.call(e,"__wrapped__"))return Cs(e)}return new Bn(e)}var Pn=function(){function e(){}return function(t){if(!Uo(t))return{};if($e)return $e(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function On(){}function Bn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Tn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Nn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Xn(e,t,n,i,r,s){var o,a=1&t,l=2&t,h=4&t;if(n&&(o=r?n(e,i,r,s):n(e)),void 0!==o)return o;if(!Uo(e))return e;var E=No(e);if(E){if(o=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&Se.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!a)return yr(e,o)}else{var T=is(e),N=T==f||T==g;if(Fo(e))return hr(e,a);if(T==v||T==c||N&&!r){if(o=l||N?{}:ss(e),!a)return l?function(e,t){return br(e,ns(e),t)}(e,function(e,t){return e&&br(t,Ea(t),e)}(o,e)):function(e,t){return br(e,ts(e),t)}(e,Gn(o,e))}else{if(!Ve[T])return r?e:{};o=function(e,t,n){var i=e.constructor;switch(t){case S:return fr(e);case u:case d:return new i(+e);case x:return function(e,t){var n=t?fr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case L:case A:case k:case C:case I:case P:case"[object Uint8ClampedArray]":case O:case B:return gr(e,n);case p:return new i;case m:case w:return new i(e);case y:return function(e){var t=new e.constructor(e.source,ie.exec(e));return t.lastIndex=e.lastIndex,t}(e);case b:return new i;case _:return r=e,kn?ge(kn.call(r)):{}}var r}(e,T,a)}}s||(s=new Fn);var M=s.get(e);if(M)return M;s.set(e,o),Yo(e)?e.forEach((function(i){o.add(Xn(i,t,n,i,e,s))})):Zo(e)&&e.forEach((function(i,r){o.set(r,Xn(i,t,n,r,e,s))}));var q=E?void 0:(h?l?Gr:Zr:l?Ea:_a)(e);return at(q||e,(function(i,r){q&&(i=e[r=i]),Un(o,r,Xn(i,t,n,r,e,s))})),o}function Jn(e,t,n){var i=n.length;if(null==e)return!i;for(e=ge(e);i--;){var r=n[i],s=t[r],o=e[r];if(void 0===o&&!(r in e)||!s(o))return!1}return!0}function Qn(e,t,n){if("function"!=typeof e)throw new ve(s);return ws((function(){e.apply(void 0,n)}),t)}function ei(e,t,n,i){var r=-1,s=dt,o=!0,a=e.length,c=[],l=t.length;if(!a)return c;n&&(t=ft(t,Ot(n))),i?(s=ht,o=!1):t.length>=200&&(s=Tt,o=!1,t=new Dn(t));e:for(;++r-1},Mn.prototype.set=function(e,t){var n=this.__data__,i=$n(n,e);return i<0?(++this.size,n.push([e,t])):n[i][1]=t,this},qn.prototype.clear=function(){this.size=0,this.__data__={hash:new Nn,map:new(gn||Mn),string:new Nn}},qn.prototype.delete=function(e){var t=Jr(this,e).delete(e);return this.size-=t?1:0,t},qn.prototype.get=function(e){return Jr(this,e).get(e)},qn.prototype.has=function(e){return Jr(this,e).has(e)},qn.prototype.set=function(e,t){var n=Jr(this,e),i=n.size;return n.set(e,t),this.size+=n.size==i?0:1,this},Dn.prototype.add=Dn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Dn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.clear=function(){this.__data__=new Mn,this.size=0},Fn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Fn.prototype.get=function(e){return this.__data__.get(e)},Fn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Mn){var i=n.__data__;if(!gn||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new qn(i)}return n.set(e,t),this.size=n.size,this};var ti=Er(li),ni=Er(ui,!0);function ii(e,t){var n=!0;return ti(e,(function(e,i,r){return n=!!t(e,i,r)})),n}function ri(e,t,n){for(var i=-1,r=e.length;++i0&&n(a)?t>1?oi(a,t-1,n,i,r):gt(r,a):i||(r[r.length]=a)}return r}var ai=Sr(),ci=Sr(!0);function li(e,t){return e&&ai(e,t,_a)}function ui(e,t){return e&&ci(e,t,_a)}function di(e,t){return ut(t,(function(t){return Vo(e[t])}))}function hi(e,t){for(var n=0,i=(t=cr(t,e)).length;null!=e&&nt}function mi(e,t){return null!=e&&Se.call(e,t)}function vi(e,t){return null!=e&&t in ge(e)}function yi(e,t,n){for(var r=n?ht:dt,s=e[0].length,o=e.length,a=o,c=i(o),l=1/0,u=[];a--;){var d=e[a];a&&t&&(d=ft(d,Ot(t))),l=cn(d.length,l),c[a]=!n&&(t||s>=120&&d.length>=120)?new Dn(a&&d):void 0}d=e[0];var h=-1,f=c[0];e:for(;++h=a)return c;var l=n[i];return c*("desc"==l?-1:1)}}return e.index-t.index}(e,t,n)}))}function Ni(e,t,n){for(var i=-1,r=t.length,s={};++i-1;)a!==e&&We.call(a,c,1),We.call(e,c,1);return e}function qi(e,t){for(var n=e?t.length:0,i=n-1;n--;){var r=t[n];if(n==i||r!==s){var s=r;as(r)?We.call(e,r,1):er(e,r)}}return e}function Di(e,t){return e+en(dn()*(t-e+1))}function Fi(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=en(t/2))&&(e+=e)}while(t);return n}function ji(e,t){return _s(ps(e,t,Ga),e+"")}function Ri(e){return Rn(Pa(e))}function Vi(e,t){var n=Pa(e);return xs(n,Yn(t,0,n.length))}function zi(e,t,n,i){if(!Uo(e))return e;for(var r=-1,s=(t=cr(t,e)).length,o=s-1,a=e;null!=a&&++rs?0:s+t),(n=n>s?s:n)<0&&(n+=s),s=t>n?0:n-t>>>0,t>>>=0;for(var o=i(s);++r>>1,o=e[s];null!==o&&!Jo(o)&&(n?o<=t:o=200){var l=t?null:Fr(e);if(l)return Ut(l);o=!1,r=Tt,c=new Dn}else c=t?[]:a;e:for(;++i=i?e:Zi(e,t,n)}var dr=At||function(e){return Ge.clearTimeout(e)};function hr(e,t){if(t)return e.slice();var n=e.length,i=qe?qe(n):new e.constructor(n);return e.copy(i),i}function fr(e){var t=new e.constructor(e.byteLength);return new Ne(t).set(new Ne(e)),t}function gr(e,t){var n=t?fr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function pr(e,t){if(e!==t){var n=void 0!==e,i=null===e,r=e==e,s=Jo(e),o=void 0!==t,a=null===t,c=t==t,l=Jo(t);if(!a&&!l&&!s&&e>t||s&&o&&c&&!a&&!l||i&&o&&c||!n&&c||!r)return 1;if(!i&&!s&&!l&&e1?n[r-1]:void 0,o=r>2?n[2]:void 0;for(s=e.length>3&&"function"==typeof s?(r--,s):void 0,o&&cs(n[0],n[1],o)&&(s=r<3?void 0:s,r=1),t=ge(t);++i-1?r[s?t[o]:o]:void 0}}function Cr(e){return $r((function(t){var n=t.length,i=n,r=Bn.prototype.thru;for(e&&t.reverse();i--;){var o=t[i];if("function"!=typeof o)throw new ve(s);if(r&&!a&&"wrapper"==Kr(o))var a=new Bn([],!0)}for(i=a?i:n;++i1&&b.reverse(),d&&la))return!1;var l=s.get(e),u=s.get(t);if(l&&u)return l==t&&u==e;var d=-1,h=!0,f=2&n?new Dn:void 0;for(s.set(e,t),s.set(t,e);++d-1&&e%1==0&&e1?"& ":"")+t[i],t=t.join(n>2?", ":" "),e.replace(Y,"{\n/* [wrapped with "+t+"] */\n")}(i,function(e,t){return at(a,(function(n){var i="_."+n[0];t&n[1]&&!dt(e,i)&&e.push(i)})),e.sort()}(function(e){var t=e.match(X);return t?t[1].split(J):[]}(i),n)))}function Ss(e){var t=0,n=0;return function(){var i=ln(),r=16-(i-n);if(n=i,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function xs(e,t){var n=-1,i=e.length,r=i-1;for(t=void 0===t?i:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Ws(e,n)}));function to(e){var t=In(e);return t.__chain__=!0,t}function no(e,t){return t(e)}var io=$r((function(e){var t=e.length,n=t?e[0]:0,i=this.__wrapped__,r=function(t){return Kn(t,e)};return!(t>1||this.__actions__.length)&&i instanceof Tn&&as(n)?((i=i.slice(n,+n+(t?1:0))).__actions__.push({func:no,args:[r],thisArg:void 0}),new Bn(i,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(r)}));var ro=wr((function(e,t,n){Se.call(e,n)?++e[n]:Wn(e,n,1)}));var so=kr(Bs),oo=kr(Ts);function ao(e,t){return(No(e)?at:ti)(e,Xr(t,3))}function co(e,t){return(No(e)?ct:ni)(e,Xr(t,3))}var lo=wr((function(e,t,n){Se.call(e,n)?e[n].push(t):Wn(e,n,[t])}));var uo=ji((function(e,t,n){var r=-1,s="function"==typeof t,o=qo(e)?i(e.length):[];return ti(e,(function(e){o[++r]=s?st(t,e,n):bi(e,t,n)})),o})),ho=wr((function(e,t,n){Wn(e,n,t)}));function fo(e,t){return(No(e)?ft:Ci)(e,Xr(t,3))}var go=wr((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var po=ji((function(e,t){if(null==e)return[];var n=t.length;return n>1&&cs(e,t[0],t[1])?t=[]:n>2&&cs(t[0],t[1],t[2])&&(t=[t[0]]),Ti(e,oi(t,1),[])})),mo=Xt||function(){return Ge.Date.now()};function vo(e,t,n){return t=n?void 0:t,Rr(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function yo(e,t){var n;if("function"!=typeof t)throw new ve(s);return e=ra(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var bo=ji((function(e,t,n){var i=1;if(n.length){var r=Ht(n,Yr(bo));i|=32}return Rr(e,i,t,n,r)})),wo=ji((function(e,t,n){var i=3;if(n.length){var r=Ht(n,Yr(wo));i|=32}return Rr(t,i,e,n,r)}));function _o(e,t,n){var i,r,o,a,c,l,u=0,d=!1,h=!1,f=!0;if("function"!=typeof e)throw new ve(s);function g(t){var n=i,s=r;return i=r=void 0,u=t,a=e.apply(s,n)}function p(e){return u=e,c=ws(v,t),d?g(e):a}function m(e){var n=e-l;return void 0===l||n>=t||n<0||h&&e-u>=o}function v(){var e=mo();if(m(e))return y(e);c=ws(v,function(e){var n=t-(e-l);return h?cn(n,o-(e-u)):n}(e))}function y(e){return c=void 0,f&&i?g(e):(i=r=void 0,a)}function b(){var e=mo(),n=m(e);if(i=arguments,r=this,l=e,n){if(void 0===c)return p(l);if(h)return dr(c),c=ws(v,t),g(l)}return void 0===c&&(c=ws(v,t)),a}return t=oa(t)||0,Uo(n)&&(d=!!n.leading,o=(h="maxWait"in n)?an(oa(n.maxWait)||0,t):o,f="trailing"in n?!!n.trailing:f),b.cancel=function(){void 0!==c&&dr(c),u=0,i=l=r=c=void 0},b.flush=function(){return void 0===c?a:y(mo())},b}var Eo=ji((function(e,t){return Qn(e,1,t)})),So=ji((function(e,t,n){return Qn(e,oa(t)||0,n)}));function xo(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ve(s);var n=function(){var i=arguments,r=t?t.apply(this,i):i[0],s=n.cache;if(s.has(r))return s.get(r);var o=e.apply(this,i);return n.cache=s.set(r,o)||s,o};return n.cache=new(xo.Cache||qn),n}function Lo(e){if("function"!=typeof e)throw new ve(s);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}xo.Cache=qn;var Ao=lr((function(e,t){var n=(t=1==t.length&&No(t[0])?ft(t[0],Ot(Xr())):ft(oi(t,1),Ot(Xr()))).length;return ji((function(i){for(var r=-1,s=cn(i.length,n);++r=t})),To=wi(function(){return arguments}())?wi:function(e){return $o(e)&&Se.call(e,"callee")&&!Ze.call(e,"callee")},No=i.isArray,Mo=Qe?Ot(Qe):function(e){return $o(e)&&gi(e)==S};function qo(e){return null!=e&&Ho(e.length)&&!Vo(e)}function Do(e){return $o(e)&&qo(e)}var Fo=nn||oc,jo=et?Ot(et):function(e){return $o(e)&&gi(e)==d};function Ro(e){if(!$o(e))return!1;var t=gi(e);return t==h||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!Wo(e)}function Vo(e){if(!Uo(e))return!1;var t=gi(e);return t==f||t==g||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zo(e){return"number"==typeof e&&e==ra(e)}function Ho(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Uo(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function $o(e){return null!=e&&"object"==typeof e}var Zo=tt?Ot(tt):function(e){return $o(e)&&is(e)==p};function Go(e){return"number"==typeof e||$o(e)&&gi(e)==m}function Wo(e){if(!$o(e)||gi(e)!=v)return!1;var t=ze(e);if(null===t)return!0;var n=Se.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&Ee.call(n)==ke}var Ko=nt?Ot(nt):function(e){return $o(e)&&gi(e)==y};var Yo=it?Ot(it):function(e){return $o(e)&&is(e)==b};function Xo(e){return"string"==typeof e||!No(e)&&$o(e)&&gi(e)==w}function Jo(e){return"symbol"==typeof e||$o(e)&&gi(e)==_}var Qo=rt?Ot(rt):function(e){return $o(e)&&Ho(e.length)&&!!Re[gi(e)]};var ea=Mr(ki),ta=Mr((function(e,t){return e<=t}));function na(e){if(!e)return[];if(qo(e))return Xo(e)?Gt(e):yr(e);if(Xe&&e[Xe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Xe]());var t=is(e);return(t==p?Vt:t==b?Ut:Pa)(e)}function ia(e){return e?(e=oa(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function ra(e){var t=ia(e),n=t%1;return t==t?n?t-n:t:0}function sa(e){return e?Yn(ra(e),0,4294967295):0}function oa(e){if("number"==typeof e)return e;if(Jo(e))return NaN;if(Uo(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Uo(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Pt(e);var n=se.test(e);return n||ae.test(e)?Ue(e.slice(2),n?2:8):re.test(e)?NaN:+e}function aa(e){return br(e,Ea(e))}function ca(e){return null==e?"":Ji(e)}var la=_r((function(e,t){if(hs(t)||qo(t))br(t,_a(t),e);else for(var n in t)Se.call(t,n)&&Un(e,n,t[n])})),ua=_r((function(e,t){br(t,Ea(t),e)})),da=_r((function(e,t,n,i){br(t,Ea(t),e,i)})),ha=_r((function(e,t,n,i){br(t,_a(t),e,i)})),fa=$r(Kn);var ga=ji((function(e,t){e=ge(e);var n=-1,i=t.length,r=i>2?t[2]:void 0;for(r&&cs(t[0],t[1],r)&&(i=1);++n1),t})),br(e,Gr(e),n),i&&(n=Xn(n,7,Hr));for(var r=t.length;r--;)er(n,t[r]);return n}));var Aa=$r((function(e,t){return null==e?{}:function(e,t){return Ni(e,t,(function(t,n){return va(e,n)}))}(e,t)}));function ka(e,t){if(null==e)return{};var n=ft(Gr(e),(function(e){return[e]}));return t=Xr(t),Ni(e,n,(function(e,n){return t(e,n[0])}))}var Ca=jr(_a),Ia=jr(Ea);function Pa(e){return null==e?[]:Bt(e,_a(e))}var Oa=Lr((function(e,t,n){return t=t.toLowerCase(),e+(n?Ba(t):t)}));function Ba(e){return Ra(ca(e).toLowerCase())}function Ta(e){return(e=ca(e))&&e.replace(le,Dt).replace(Te,"")}var Na=Lr((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Ma=Lr((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),qa=xr("toLowerCase");var Da=Lr((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Fa=Lr((function(e,t,n){return e+(n?" ":"")+Ra(t)}));var ja=Lr((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Ra=xr("toUpperCase");function Va(e,t,n){return e=ca(e),void 0===(t=n?void 0:t)?function(e){return De.test(e)}(e)?function(e){return e.match(Me)||[]}(e):function(e){return e.match(Q)||[]}(e):e.match(t)||[]}var za=ji((function(e,t){try{return st(e,void 0,t)}catch(e){return Ro(e)?e:new K(e)}})),Ha=$r((function(e,t){return at(t,(function(t){t=As(t),Wn(e,t,bo(e[t],e))})),e}));function Ua(e){return function(){return e}}var $a=Cr(),Za=Cr(!0);function Ga(e){return e}function Wa(e){return xi("function"==typeof e?e:Xn(e,1))}var Ka=ji((function(e,t){return function(n){return bi(n,e,t)}})),Ya=ji((function(e,t){return function(n){return bi(e,n,t)}}));function Xa(e,t,n){var i=_a(t),r=di(t,i);null!=n||Uo(t)&&(r.length||!i.length)||(n=t,t=e,e=this,r=di(t,_a(t)));var s=!(Uo(n)&&"chain"in n&&!n.chain),o=Vo(e);return at(r,(function(n){var i=t[n];e[n]=i,o&&(e.prototype[n]=function(){var t=this.__chain__;if(s||t){var n=e(this.__wrapped__),r=n.__actions__=yr(this.__actions__);return r.push({func:i,args:arguments,thisArg:e}),n.__chain__=t,n}return i.apply(e,gt([this.value()],arguments))})})),e}function Ja(){}var Qa=Br(ft),ec=Br(lt),tc=Br(vt);function nc(e){return ls(e)?Lt(As(e)):function(e){return function(t){return hi(t,e)}}(e)}var ic=Nr(),rc=Nr(!0);function sc(){return[]}function oc(){return!1}var ac=Or((function(e,t){return e+t}),0),cc=Dr("ceil"),lc=Or((function(e,t){return e/t}),1),uc=Dr("floor");var dc,hc=Or((function(e,t){return e*t}),1),fc=Dr("round"),gc=Or((function(e,t){return e-t}),0);return In.after=function(e,t){if("function"!=typeof t)throw new ve(s);return e=ra(e),function(){if(--e<1)return t.apply(this,arguments)}},In.ary=vo,In.assign=la,In.assignIn=ua,In.assignInWith=da,In.assignWith=ha,In.at=fa,In.before=yo,In.bind=bo,In.bindAll=Ha,In.bindKey=wo,In.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return No(e)?e:[e]},In.chain=to,In.chunk=function(e,t,n){t=(n?cs(e,t,n):void 0===t)?1:an(ra(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var s=0,o=0,a=i(Qt(r/t));sr?0:r+n),(i=void 0===i||i>r?r:ra(i))<0&&(i+=r),i=n>i?0:sa(i);n>>0)?(e=ca(e))&&("string"==typeof t||null!=t&&!Ko(t))&&!(t=Ji(t))&&Rt(e)?ur(Gt(e),0,n):e.split(t,n):[]},In.spread=function(e,t){if("function"!=typeof e)throw new ve(s);return t=null==t?0:an(ra(t),0),ji((function(n){var i=n[t],r=ur(n,0,t);return i&>(r,i),st(e,this,r)}))},In.tail=function(e){var t=null==e?0:e.length;return t?Zi(e,1,t):[]},In.take=function(e,t,n){return e&&e.length?Zi(e,0,(t=n||void 0===t?1:ra(t))<0?0:t):[]},In.takeRight=function(e,t,n){var i=null==e?0:e.length;return i?Zi(e,(t=i-(t=n||void 0===t?1:ra(t)))<0?0:t,i):[]},In.takeRightWhile=function(e,t){return e&&e.length?nr(e,Xr(t,3),!1,!0):[]},In.takeWhile=function(e,t){return e&&e.length?nr(e,Xr(t,3)):[]},In.tap=function(e,t){return t(e),e},In.throttle=function(e,t,n){var i=!0,r=!0;if("function"!=typeof e)throw new ve(s);return Uo(n)&&(i="leading"in n?!!n.leading:i,r="trailing"in n?!!n.trailing:r),_o(e,t,{leading:i,maxWait:t,trailing:r})},In.thru=no,In.toArray=na,In.toPairs=Ca,In.toPairsIn=Ia,In.toPath=function(e){return No(e)?ft(e,As):Jo(e)?[e]:yr(Ls(ca(e)))},In.toPlainObject=aa,In.transform=function(e,t,n){var i=No(e),r=i||Fo(e)||Qo(e);if(t=Xr(t,4),null==n){var s=e&&e.constructor;n=r?i?new s:[]:Uo(e)&&Vo(s)?Pn(ze(e)):{}}return(r?at:li)(e,(function(e,i,r){return t(n,e,i,r)})),n},In.unary=function(e){return vo(e,1)},In.union=Us,In.unionBy=$s,In.unionWith=Zs,In.uniq=function(e){return e&&e.length?Qi(e):[]},In.uniqBy=function(e,t){return e&&e.length?Qi(e,Xr(t,2)):[]},In.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Qi(e,void 0,t):[]},In.unset=function(e,t){return null==e||er(e,t)},In.unzip=Gs,In.unzipWith=Ws,In.update=function(e,t,n){return null==e?e:tr(e,t,ar(n))},In.updateWith=function(e,t,n,i){return i="function"==typeof i?i:void 0,null==e?e:tr(e,t,ar(n),i)},In.values=Pa,In.valuesIn=function(e){return null==e?[]:Bt(e,Ea(e))},In.without=Ks,In.words=Va,In.wrap=function(e,t){return ko(ar(t),e)},In.xor=Ys,In.xorBy=Xs,In.xorWith=Js,In.zip=Qs,In.zipObject=function(e,t){return sr(e||[],t||[],Un)},In.zipObjectDeep=function(e,t){return sr(e||[],t||[],zi)},In.zipWith=eo,In.entries=Ca,In.entriesIn=Ia,In.extend=ua,In.extendWith=da,Xa(In,In),In.add=ac,In.attempt=za,In.camelCase=Oa,In.capitalize=Ba,In.ceil=cc,In.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=oa(n))==n?n:0),void 0!==t&&(t=(t=oa(t))==t?t:0),Yn(oa(e),t,n)},In.clone=function(e){return Xn(e,4)},In.cloneDeep=function(e){return Xn(e,5)},In.cloneDeepWith=function(e,t){return Xn(e,5,t="function"==typeof t?t:void 0)},In.cloneWith=function(e,t){return Xn(e,4,t="function"==typeof t?t:void 0)},In.conformsTo=function(e,t){return null==t||Jn(e,t,_a(t))},In.deburr=Ta,In.defaultTo=function(e,t){return null==e||e!=e?t:e},In.divide=lc,In.endsWith=function(e,t,n){e=ca(e),t=Ji(t);var i=e.length,r=n=void 0===n?i:Yn(ra(n),0,i);return(n-=t.length)>=0&&e.slice(n,r)==t},In.eq=Po,In.escape=function(e){return(e=ca(e))&&j.test(e)?e.replace(D,Ft):e},In.escapeRegExp=function(e){return(e=ca(e))&&G.test(e)?e.replace(Z,"\\$&"):e},In.every=function(e,t,n){var i=No(e)?lt:ii;return n&&cs(e,t,n)&&(t=void 0),i(e,Xr(t,3))},In.find=so,In.findIndex=Bs,In.findKey=function(e,t){return bt(e,Xr(t,3),li)},In.findLast=oo,In.findLastIndex=Ts,In.findLastKey=function(e,t){return bt(e,Xr(t,3),ui)},In.floor=uc,In.forEach=ao,In.forEachRight=co,In.forIn=function(e,t){return null==e?e:ai(e,Xr(t,3),Ea)},In.forInRight=function(e,t){return null==e?e:ci(e,Xr(t,3),Ea)},In.forOwn=function(e,t){return e&&li(e,Xr(t,3))},In.forOwnRight=function(e,t){return e&&ui(e,Xr(t,3))},In.get=ma,In.gt=Oo,In.gte=Bo,In.has=function(e,t){return null!=e&&rs(e,t,mi)},In.hasIn=va,In.head=Ms,In.identity=Ga,In.includes=function(e,t,n,i){e=qo(e)?e:Pa(e),n=n&&!i?ra(n):0;var r=e.length;return n<0&&(n=an(r+n,0)),Xo(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&_t(e,t,n)>-1},In.indexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=null==n?0:ra(n);return r<0&&(r=an(i+r,0)),_t(e,t,r)},In.inRange=function(e,t,n){return t=ia(t),void 0===n?(n=t,t=0):n=ia(n),function(e,t,n){return e>=cn(t,n)&&e=-9007199254740991&&e<=9007199254740991},In.isSet=Yo,In.isString=Xo,In.isSymbol=Jo,In.isTypedArray=Qo,In.isUndefined=function(e){return void 0===e},In.isWeakMap=function(e){return $o(e)&&is(e)==E},In.isWeakSet=function(e){return $o(e)&&"[object WeakSet]"==gi(e)},In.join=function(e,t){return null==e?"":sn.call(e,t)},In.kebabCase=Na,In.last=js,In.lastIndexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=i;return void 0!==n&&(r=(r=ra(n))<0?an(i+r,0):cn(r,i-1)),t==t?function(e,t,n){for(var i=n+1;i--;)if(e[i]===t)return i;return i}(e,t,r):wt(e,St,r,!0)},In.lowerCase=Ma,In.lowerFirst=qa,In.lt=ea,In.lte=ta,In.max=function(e){return e&&e.length?ri(e,Ga,pi):void 0},In.maxBy=function(e,t){return e&&e.length?ri(e,Xr(t,2),pi):void 0},In.mean=function(e){return xt(e,Ga)},In.meanBy=function(e,t){return xt(e,Xr(t,2))},In.min=function(e){return e&&e.length?ri(e,Ga,ki):void 0},In.minBy=function(e,t){return e&&e.length?ri(e,Xr(t,2),ki):void 0},In.stubArray=sc,In.stubFalse=oc,In.stubObject=function(){return{}},In.stubString=function(){return""},In.stubTrue=function(){return!0},In.multiply=hc,In.nth=function(e,t){return e&&e.length?Bi(e,ra(t)):void 0},In.noConflict=function(){return Ge._===this&&(Ge._=Ce),this},In.noop=Ja,In.now=mo,In.pad=function(e,t,n){e=ca(e);var i=(t=ra(t))?Zt(e):0;if(!t||i>=t)return e;var r=(t-i)/2;return Tr(en(r),n)+e+Tr(Qt(r),n)},In.padEnd=function(e,t,n){e=ca(e);var i=(t=ra(t))?Zt(e):0;return t&&it){var i=e;e=t,t=i}if(n||e%1||t%1){var r=dn();return cn(e+r*(t-e+He("1e-"+((r+"").length-1))),t)}return Di(e,t)},In.reduce=function(e,t,n){var i=No(e)?pt:kt,r=arguments.length<3;return i(e,Xr(t,4),n,r,ti)},In.reduceRight=function(e,t,n){var i=No(e)?mt:kt,r=arguments.length<3;return i(e,Xr(t,4),n,r,ni)},In.repeat=function(e,t,n){return t=(n?cs(e,t,n):void 0===t)?1:ra(t),Fi(ca(e),t)},In.replace=function(){var e=arguments,t=ca(e[0]);return e.length<3?t:t.replace(e[1],e[2])},In.result=function(e,t,n){var i=-1,r=(t=cr(t,e)).length;for(r||(r=1,e=void 0);++i9007199254740991)return[];var n=4294967295,i=cn(e,4294967295);e-=4294967295;for(var r=It(i,t=Xr(t));++n=s)return e;var a=n-Zt(i);if(a<1)return i;var c=o?ur(o,0,a).join(""):e.slice(0,a);if(void 0===r)return c+i;if(o&&(a+=c.length-a),Ko(r)){if(e.slice(a).search(r)){var l,u=c;for(r.global||(r=pe(r.source,ca(ie.exec(r))+"g")),r.lastIndex=0;l=r.exec(u);)var d=l.index;c=c.slice(0,void 0===d?a:d)}}else if(e.indexOf(Ji(r),a)!=a){var h=c.lastIndexOf(r);h>-1&&(c=c.slice(0,h))}return c+i},In.unescape=function(e){return(e=ca(e))&&F.test(e)?e.replace(q,Kt):e},In.uniqueId=function(e){var t=++xe;return ca(e)+t},In.upperCase=ja,In.upperFirst=Ra,In.each=ao,In.eachRight=co,In.first=Ms,Xa(In,(dc={},li(In,(function(e,t){Se.call(In.prototype,t)||(dc[t]=e)})),dc),{chain:!1}),In.VERSION="4.17.21",at(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){In[e].placeholder=In})),at(["drop","take"],(function(e,t){Tn.prototype[e]=function(n){n=void 0===n?1:an(ra(n),0);var i=this.__filtered__&&!t?new Tn(this):this.clone();return i.__filtered__?i.__takeCount__=cn(n,i.__takeCount__):i.__views__.push({size:cn(n,4294967295),type:e+(i.__dir__<0?"Right":"")}),i},Tn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),at(["filter","map","takeWhile"],(function(e,t){var n=t+1,i=1==n||3==n;Tn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Xr(e,3),type:n}),t.__filtered__=t.__filtered__||i,t}})),at(["head","last"],(function(e,t){var n="take"+(t?"Right":"");Tn.prototype[e]=function(){return this[n](1).value()[0]}})),at(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");Tn.prototype[e]=function(){return this.__filtered__?new Tn(this):this[n](1)}})),Tn.prototype.compact=function(){return this.filter(Ga)},Tn.prototype.find=function(e){return this.filter(e).head()},Tn.prototype.findLast=function(e){return this.reverse().find(e)},Tn.prototype.invokeMap=ji((function(e,t){return"function"==typeof e?new Tn(this):this.map((function(n){return bi(n,e,t)}))})),Tn.prototype.reject=function(e){return this.filter(Lo(Xr(e)))},Tn.prototype.slice=function(e,t){e=ra(e);var n=this;return n.__filtered__&&(e>0||t<0)?new Tn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=ra(t))<0?n.dropRight(-t):n.take(t-e)),n)},Tn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Tn.prototype.toArray=function(){return this.take(4294967295)},li(Tn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),i=/^(?:head|last)$/.test(t),r=In[i?"take"+("last"==t?"Right":""):t],s=i||/^find/.test(t);r&&(In.prototype[t]=function(){var t=this.__wrapped__,o=i?[1]:arguments,a=t instanceof Tn,c=o[0],l=a||No(t),u=function(e){var t=r.apply(In,gt([e],o));return i&&d?t[0]:t};l&&n&&"function"==typeof c&&1!=c.length&&(a=l=!1);var d=this.__chain__,h=!!this.__actions__.length,f=s&&!d,g=a&&!h;if(!s&&l){t=g?t:new Tn(this);var p=e.apply(t,o);return p.__actions__.push({func:no,args:[u],thisArg:void 0}),new Bn(p,d)}return f&&g?e.apply(this,o):(p=this.thru(u),f?i?p.value()[0]:p.value():p)})})),at(["pop","push","shift","sort","splice","unshift"],(function(e){var t=ye[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",i=/^(?:pop|shift)$/.test(e);In.prototype[e]=function(){var e=arguments;if(i&&!this.__chain__){var r=this.value();return t.apply(No(r)?r:[],e)}return this[n]((function(n){return t.apply(No(n)?n:[],e)}))}})),li(Tn.prototype,(function(e,t){var n=In[t];if(n){var i=n.name+"";Se.call(wn,i)||(wn[i]=[]),wn[i].push({name:t,func:n})}})),wn[Ir(void 0,2).name]=[{name:"wrapper",func:void 0}],Tn.prototype.clone=function(){var e=new Tn(this.__wrapped__);return e.__actions__=yr(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=yr(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=yr(this.__views__),e},Tn.prototype.reverse=function(){if(this.__filtered__){var e=new Tn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Tn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=No(e),i=t<0,r=n?e.length:0,s=function(e,t,n){var i=-1,r=n.length;for(;++i=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},In.prototype.plant=function(e){for(var t,n=this;n instanceof On;){var i=Cs(n);i.__index__=0,i.__values__=void 0,t?r.__wrapped__=i:t=i;var r=i;n=n.__wrapped__}return r.__wrapped__=e,t},In.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Tn){var t=e;return this.__actions__.length&&(t=new Tn(this)),(t=t.reverse()).__actions__.push({func:no,args:[Hs],thisArg:void 0}),new Bn(t,this.__chain__)}return this.thru(Hs)},In.prototype.toJSON=In.prototype.valueOf=In.prototype.value=function(){return ir(this.__wrapped__,this.__actions__)},In.prototype.first=In.prototype.head,Xe&&(In.prototype[Xe]=function(){return this}),In}();Ge._=Yt,void 0===(r=function(){return Yt}.call(t,n,t,i))||(i.exports=r)}).call(this)}).call(this,n(9),n(50)(e))},function(e,t){ + */(function(){var s="Expected a function",o="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",u="[object Boolean]",d="[object Date]",h="[object Error]",f="[object Function]",g="[object GeneratorFunction]",p="[object Map]",m="[object Number]",v="[object Object]",y="[object RegExp]",b="[object Set]",w="[object String]",_="[object Symbol]",E="[object WeakMap]",S="[object ArrayBuffer]",x="[object DataView]",L="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",C="[object Int16Array]",I="[object Int32Array]",P="[object Uint8Array]",O="[object Uint16Array]",B="[object Uint32Array]",T=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,M=/(__e\(.*?\)|\b__t\)) \+\n'';/g,q=/&(?:amp|lt|gt|quot|#39);/g,D=/[&<>"']/g,F=RegExp(q.source),j=RegExp(D.source),R=/<%-([\s\S]+?)%>/g,V=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,U=/^\w*$/,$=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Z=/[\\^$.*+?()[\]{}|]/g,G=RegExp(Z.source),W=/^\s+/,K=/\s/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,X=/\{\n\/\* \[wrapped with (.+)\] \*/,J=/,? & /,Q=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ee=/[()=,{}\[\]\/\s]/,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ie=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,se=/^0b[01]+$/i,oe=/^\[object .+?Constructor\]$/,ae=/^0o[0-7]+$/i,ce=/^(?:0|[1-9]\d*)$/,le=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ue=/($^)/,de=/['\n\r\u2028\u2029\\]/g,he="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",fe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",ge="[\\ud800-\\udfff]",pe="["+fe+"]",me="["+he+"]",ve="\\d+",ye="[\\u2700-\\u27bf]",be="[a-z\\xdf-\\xf6\\xf8-\\xff]",we="[^\\ud800-\\udfff"+fe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",_e="\\ud83c[\\udffb-\\udfff]",Ee="[^\\ud800-\\udfff]",Se="(?:\\ud83c[\\udde6-\\uddff]){2}",xe="[\\ud800-\\udbff][\\udc00-\\udfff]",Le="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+be+"|"+we+")",ke="(?:"+Le+"|"+we+")",Ce="(?:"+me+"|"+_e+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Ce+("(?:\\u200d(?:"+[Ee,Se,xe].join("|")+")[\\ufe0e\\ufe0f]?"+Ce+")*"),Pe="(?:"+[ye,Se,xe].join("|")+")"+Ie,Oe="(?:"+[Ee+me+"?",me,Se,xe,ge].join("|")+")",Be=RegExp("['’]","g"),Te=RegExp(me,"g"),Ne=RegExp(_e+"(?="+_e+")|"+Oe+Ie,"g"),Me=RegExp([Le+"?"+be+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[pe,Le,"$"].join("|")+")",ke+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[pe,Le+Ae,"$"].join("|")+")",Le+"?"+Ae+"+(?:['’](?:d|ll|m|re|s|t|ve))?",Le+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Pe].join("|"),"g"),qe=RegExp("[\\u200d\\ud800-\\udfff"+he+"\\ufe0e\\ufe0f]"),De=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Fe=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],je=-1,Re={};Re[L]=Re[A]=Re[k]=Re[C]=Re[I]=Re[P]=Re["[object Uint8ClampedArray]"]=Re[O]=Re[B]=!0,Re[c]=Re[l]=Re[S]=Re[u]=Re[x]=Re[d]=Re[h]=Re[f]=Re[p]=Re[m]=Re[v]=Re[y]=Re[b]=Re[w]=Re[E]=!1;var Ve={};Ve[c]=Ve[l]=Ve[S]=Ve[x]=Ve[u]=Ve[d]=Ve[L]=Ve[A]=Ve[k]=Ve[C]=Ve[I]=Ve[p]=Ve[m]=Ve[v]=Ve[y]=Ve[b]=Ve[w]=Ve[_]=Ve[P]=Ve["[object Uint8ClampedArray]"]=Ve[O]=Ve[B]=!0,Ve[h]=Ve[f]=Ve[E]=!1;var ze={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,Ue=parseInt,$e="object"==typeof e&&e&&e.Object===Object&&e,Ze="object"==typeof self&&self&&self.Object===Object&&self,Ge=$e||Ze||Function("return this")(),We=t&&!t.nodeType&&t,Ke=We&&"object"==typeof i&&i&&!i.nodeType&&i,Ye=Ke&&Ke.exports===We,Xe=Ye&&$e.process,Je=function(){try{var e=Ke&&Ke.require&&Ke.require("util").types;return e||Xe&&Xe.binding&&Xe.binding("util")}catch(e){}}(),Qe=Je&&Je.isArrayBuffer,et=Je&&Je.isDate,tt=Je&&Je.isMap,nt=Je&&Je.isRegExp,it=Je&&Je.isSet,rt=Je&&Je.isTypedArray;function st(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function ot(e,t,n,i){for(var r=-1,s=null==e?0:e.length;++r-1}function ht(e,t,n){for(var i=-1,r=null==e?0:e.length;++i-1;);return n}function Mt(e,t){for(var n=e.length;n--&&_t(t,e[n],0)>-1;);return n}function qt(e,t){for(var n=e.length,i=0;n--;)e[n]===t&&++i;return i}var Dt=At({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Ft=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function jt(e){return"\\"+ze[e]}function Rt(e){return qe.test(e)}function Vt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,i){n[++t]=[i,e]})),n}function zt(e,t){return function(n){return e(t(n))}}function Ht(e,t){for(var n=-1,i=e.length,r=0,s=[];++n",""":'"',"'":"'"});var Yt=function e(t){var n,i=(t=null==t?Ge:Yt.defaults(Ge.Object(),t,Yt.pick(Ge,Fe))).Array,r=t.Date,K=t.Error,he=t.Function,fe=t.Math,ge=t.Object,pe=t.RegExp,me=t.String,ve=t.TypeError,ye=i.prototype,be=he.prototype,we=ge.prototype,_e=t["__core-js_shared__"],Ee=be.toString,Se=we.hasOwnProperty,xe=0,Le=(n=/[^.]+$/.exec(_e&&_e.keys&&_e.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ae=we.toString,ke=Ee.call(ge),Ce=Ge._,Ie=pe("^"+Ee.call(Se).replace(Z,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Pe=Ye?t.Buffer:void 0,Oe=t.Symbol,Ne=t.Uint8Array,qe=Pe?Pe.allocUnsafe:void 0,ze=zt(ge.getPrototypeOf,ge),$e=ge.create,Ze=we.propertyIsEnumerable,We=ye.splice,Ke=Oe?Oe.isConcatSpreadable:void 0,Xe=Oe?Oe.iterator:void 0,Je=Oe?Oe.toStringTag:void 0,yt=function(){try{var e=es(ge,"defineProperty");return e({},"",{}),e}catch(e){}}(),At=t.clearTimeout!==Ge.clearTimeout&&t.clearTimeout,Xt=r&&r.now!==Ge.Date.now&&r.now,Jt=t.setTimeout!==Ge.setTimeout&&t.setTimeout,Qt=fe.ceil,en=fe.floor,tn=ge.getOwnPropertySymbols,nn=Pe?Pe.isBuffer:void 0,rn=t.isFinite,sn=ye.join,on=zt(ge.keys,ge),an=fe.max,cn=fe.min,ln=r.now,un=t.parseInt,dn=fe.random,hn=ye.reverse,fn=es(t,"DataView"),gn=es(t,"Map"),pn=es(t,"Promise"),mn=es(t,"Set"),vn=es(t,"WeakMap"),yn=es(ge,"create"),bn=vn&&new vn,wn={},_n=ks(fn),En=ks(gn),Sn=ks(pn),xn=ks(mn),Ln=ks(vn),An=Oe?Oe.prototype:void 0,kn=An?An.valueOf:void 0,Cn=An?An.toString:void 0;function In(e){if($o(e)&&!No(e)&&!(e instanceof Tn)){if(e instanceof Bn)return e;if(Se.call(e,"__wrapped__"))return Cs(e)}return new Bn(e)}var Pn=function(){function e(){}return function(t){if(!Uo(t))return{};if($e)return $e(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function On(){}function Bn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Tn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Nn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Xn(e,t,n,i,r,s){var o,a=1&t,l=2&t,h=4&t;if(n&&(o=r?n(e,i,r,s):n(e)),void 0!==o)return o;if(!Uo(e))return e;var E=No(e);if(E){if(o=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&Se.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!a)return yr(e,o)}else{var T=is(e),N=T==f||T==g;if(Fo(e))return hr(e,a);if(T==v||T==c||N&&!r){if(o=l||N?{}:ss(e),!a)return l?function(e,t){return br(e,ns(e),t)}(e,function(e,t){return e&&br(t,Ea(t),e)}(o,e)):function(e,t){return br(e,ts(e),t)}(e,Gn(o,e))}else{if(!Ve[T])return r?e:{};o=function(e,t,n){var i=e.constructor;switch(t){case S:return fr(e);case u:case d:return new i(+e);case x:return function(e,t){var n=t?fr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case L:case A:case k:case C:case I:case P:case"[object Uint8ClampedArray]":case O:case B:return gr(e,n);case p:return new i;case m:case w:return new i(e);case y:return function(e){var t=new e.constructor(e.source,ie.exec(e));return t.lastIndex=e.lastIndex,t}(e);case b:return new i;case _:return r=e,kn?ge(kn.call(r)):{}}var r}(e,T,a)}}s||(s=new Fn);var M=s.get(e);if(M)return M;s.set(e,o),Yo(e)?e.forEach((function(i){o.add(Xn(i,t,n,i,e,s))})):Zo(e)&&e.forEach((function(i,r){o.set(r,Xn(i,t,n,r,e,s))}));var q=E?void 0:(h?l?Gr:Zr:l?Ea:_a)(e);return at(q||e,(function(i,r){q&&(i=e[r=i]),Un(o,r,Xn(i,t,n,r,e,s))})),o}function Jn(e,t,n){var i=n.length;if(null==e)return!i;for(e=ge(e);i--;){var r=n[i],s=t[r],o=e[r];if(void 0===o&&!(r in e)||!s(o))return!1}return!0}function Qn(e,t,n){if("function"!=typeof e)throw new ve(s);return ws((function(){e.apply(void 0,n)}),t)}function ei(e,t,n,i){var r=-1,s=dt,o=!0,a=e.length,c=[],l=t.length;if(!a)return c;n&&(t=ft(t,Ot(n))),i?(s=ht,o=!1):t.length>=200&&(s=Tt,o=!1,t=new Dn(t));e:for(;++r-1},Mn.prototype.set=function(e,t){var n=this.__data__,i=$n(n,e);return i<0?(++this.size,n.push([e,t])):n[i][1]=t,this},qn.prototype.clear=function(){this.size=0,this.__data__={hash:new Nn,map:new(gn||Mn),string:new Nn}},qn.prototype.delete=function(e){var t=Jr(this,e).delete(e);return this.size-=t?1:0,t},qn.prototype.get=function(e){return Jr(this,e).get(e)},qn.prototype.has=function(e){return Jr(this,e).has(e)},qn.prototype.set=function(e,t){var n=Jr(this,e),i=n.size;return n.set(e,t),this.size+=n.size==i?0:1,this},Dn.prototype.add=Dn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Dn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.clear=function(){this.__data__=new Mn,this.size=0},Fn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Fn.prototype.get=function(e){return this.__data__.get(e)},Fn.prototype.has=function(e){return this.__data__.has(e)},Fn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Mn){var i=n.__data__;if(!gn||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new qn(i)}return n.set(e,t),this.size=n.size,this};var ti=Er(li),ni=Er(ui,!0);function ii(e,t){var n=!0;return ti(e,(function(e,i,r){return n=!!t(e,i,r)})),n}function ri(e,t,n){for(var i=-1,r=e.length;++i0&&n(a)?t>1?oi(a,t-1,n,i,r):gt(r,a):i||(r[r.length]=a)}return r}var ai=Sr(),ci=Sr(!0);function li(e,t){return e&&ai(e,t,_a)}function ui(e,t){return e&&ci(e,t,_a)}function di(e,t){return ut(t,(function(t){return Vo(e[t])}))}function hi(e,t){for(var n=0,i=(t=cr(t,e)).length;null!=e&&nt}function mi(e,t){return null!=e&&Se.call(e,t)}function vi(e,t){return null!=e&&t in ge(e)}function yi(e,t,n){for(var r=n?ht:dt,s=e[0].length,o=e.length,a=o,c=i(o),l=1/0,u=[];a--;){var d=e[a];a&&t&&(d=ft(d,Ot(t))),l=cn(d.length,l),c[a]=!n&&(t||s>=120&&d.length>=120)?new Dn(a&&d):void 0}d=e[0];var h=-1,f=c[0];e:for(;++h=a)return c;var l=n[i];return c*("desc"==l?-1:1)}}return e.index-t.index}(e,t,n)}))}function Ni(e,t,n){for(var i=-1,r=t.length,s={};++i-1;)a!==e&&We.call(a,c,1),We.call(e,c,1);return e}function qi(e,t){for(var n=e?t.length:0,i=n-1;n--;){var r=t[n];if(n==i||r!==s){var s=r;as(r)?We.call(e,r,1):er(e,r)}}return e}function Di(e,t){return e+en(dn()*(t-e+1))}function Fi(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=en(t/2))&&(e+=e)}while(t);return n}function ji(e,t){return _s(ps(e,t,Ga),e+"")}function Ri(e){return Rn(Pa(e))}function Vi(e,t){var n=Pa(e);return xs(n,Yn(t,0,n.length))}function zi(e,t,n,i){if(!Uo(e))return e;for(var r=-1,s=(t=cr(t,e)).length,o=s-1,a=e;null!=a&&++rs?0:s+t),(n=n>s?s:n)<0&&(n+=s),s=t>n?0:n-t>>>0,t>>>=0;for(var o=i(s);++r>>1,o=e[s];null!==o&&!Jo(o)&&(n?o<=t:o=200){var l=t?null:Fr(e);if(l)return Ut(l);o=!1,r=Tt,c=new Dn}else c=t?[]:a;e:for(;++i=i?e:Zi(e,t,n)}var dr=At||function(e){return Ge.clearTimeout(e)};function hr(e,t){if(t)return e.slice();var n=e.length,i=qe?qe(n):new e.constructor(n);return e.copy(i),i}function fr(e){var t=new e.constructor(e.byteLength);return new Ne(t).set(new Ne(e)),t}function gr(e,t){var n=t?fr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function pr(e,t){if(e!==t){var n=void 0!==e,i=null===e,r=e==e,s=Jo(e),o=void 0!==t,a=null===t,c=t==t,l=Jo(t);if(!a&&!l&&!s&&e>t||s&&o&&c&&!a&&!l||i&&o&&c||!n&&c||!r)return 1;if(!i&&!s&&!l&&e1?n[r-1]:void 0,o=r>2?n[2]:void 0;for(s=e.length>3&&"function"==typeof s?(r--,s):void 0,o&&cs(n[0],n[1],o)&&(s=r<3?void 0:s,r=1),t=ge(t);++i-1?r[s?t[o]:o]:void 0}}function Cr(e){return $r((function(t){var n=t.length,i=n,r=Bn.prototype.thru;for(e&&t.reverse();i--;){var o=t[i];if("function"!=typeof o)throw new ve(s);if(r&&!a&&"wrapper"==Kr(o))var a=new Bn([],!0)}for(i=a?i:n;++i1&&b.reverse(),d&&la))return!1;var l=s.get(e),u=s.get(t);if(l&&u)return l==t&&u==e;var d=-1,h=!0,f=2&n?new Dn:void 0;for(s.set(e,t),s.set(t,e);++d-1&&e%1==0&&e1?"& ":"")+t[i],t=t.join(n>2?", ":" "),e.replace(Y,"{\n/* [wrapped with "+t+"] */\n")}(i,function(e,t){return at(a,(function(n){var i="_."+n[0];t&n[1]&&!dt(e,i)&&e.push(i)})),e.sort()}(function(e){var t=e.match(X);return t?t[1].split(J):[]}(i),n)))}function Ss(e){var t=0,n=0;return function(){var i=ln(),r=16-(i-n);if(n=i,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function xs(e,t){var n=-1,i=e.length,r=i-1;for(t=void 0===t?i:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Ws(e,n)}));function to(e){var t=In(e);return t.__chain__=!0,t}function no(e,t){return t(e)}var io=$r((function(e){var t=e.length,n=t?e[0]:0,i=this.__wrapped__,r=function(t){return Kn(t,e)};return!(t>1||this.__actions__.length)&&i instanceof Tn&&as(n)?((i=i.slice(n,+n+(t?1:0))).__actions__.push({func:no,args:[r],thisArg:void 0}),new Bn(i,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(r)}));var ro=wr((function(e,t,n){Se.call(e,n)?++e[n]:Wn(e,n,1)}));var so=kr(Bs),oo=kr(Ts);function ao(e,t){return(No(e)?at:ti)(e,Xr(t,3))}function co(e,t){return(No(e)?ct:ni)(e,Xr(t,3))}var lo=wr((function(e,t,n){Se.call(e,n)?e[n].push(t):Wn(e,n,[t])}));var uo=ji((function(e,t,n){var r=-1,s="function"==typeof t,o=qo(e)?i(e.length):[];return ti(e,(function(e){o[++r]=s?st(t,e,n):bi(e,t,n)})),o})),ho=wr((function(e,t,n){Wn(e,n,t)}));function fo(e,t){return(No(e)?ft:Ci)(e,Xr(t,3))}var go=wr((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var po=ji((function(e,t){if(null==e)return[];var n=t.length;return n>1&&cs(e,t[0],t[1])?t=[]:n>2&&cs(t[0],t[1],t[2])&&(t=[t[0]]),Ti(e,oi(t,1),[])})),mo=Xt||function(){return Ge.Date.now()};function vo(e,t,n){return t=n?void 0:t,Rr(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function yo(e,t){var n;if("function"!=typeof t)throw new ve(s);return e=ra(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var bo=ji((function(e,t,n){var i=1;if(n.length){var r=Ht(n,Yr(bo));i|=32}return Rr(e,i,t,n,r)})),wo=ji((function(e,t,n){var i=3;if(n.length){var r=Ht(n,Yr(wo));i|=32}return Rr(t,i,e,n,r)}));function _o(e,t,n){var i,r,o,a,c,l,u=0,d=!1,h=!1,f=!0;if("function"!=typeof e)throw new ve(s);function g(t){var n=i,s=r;return i=r=void 0,u=t,a=e.apply(s,n)}function p(e){return u=e,c=ws(v,t),d?g(e):a}function m(e){var n=e-l;return void 0===l||n>=t||n<0||h&&e-u>=o}function v(){var e=mo();if(m(e))return y(e);c=ws(v,function(e){var n=t-(e-l);return h?cn(n,o-(e-u)):n}(e))}function y(e){return c=void 0,f&&i?g(e):(i=r=void 0,a)}function b(){var e=mo(),n=m(e);if(i=arguments,r=this,l=e,n){if(void 0===c)return p(l);if(h)return dr(c),c=ws(v,t),g(l)}return void 0===c&&(c=ws(v,t)),a}return t=oa(t)||0,Uo(n)&&(d=!!n.leading,o=(h="maxWait"in n)?an(oa(n.maxWait)||0,t):o,f="trailing"in n?!!n.trailing:f),b.cancel=function(){void 0!==c&&dr(c),u=0,i=l=r=c=void 0},b.flush=function(){return void 0===c?a:y(mo())},b}var Eo=ji((function(e,t){return Qn(e,1,t)})),So=ji((function(e,t,n){return Qn(e,oa(t)||0,n)}));function xo(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ve(s);var n=function(){var i=arguments,r=t?t.apply(this,i):i[0],s=n.cache;if(s.has(r))return s.get(r);var o=e.apply(this,i);return n.cache=s.set(r,o)||s,o};return n.cache=new(xo.Cache||qn),n}function Lo(e){if("function"!=typeof e)throw new ve(s);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}xo.Cache=qn;var Ao=lr((function(e,t){var n=(t=1==t.length&&No(t[0])?ft(t[0],Ot(Xr())):ft(oi(t,1),Ot(Xr()))).length;return ji((function(i){for(var r=-1,s=cn(i.length,n);++r=t})),To=wi(function(){return arguments}())?wi:function(e){return $o(e)&&Se.call(e,"callee")&&!Ze.call(e,"callee")},No=i.isArray,Mo=Qe?Ot(Qe):function(e){return $o(e)&&gi(e)==S};function qo(e){return null!=e&&Ho(e.length)&&!Vo(e)}function Do(e){return $o(e)&&qo(e)}var Fo=nn||oc,jo=et?Ot(et):function(e){return $o(e)&&gi(e)==d};function Ro(e){if(!$o(e))return!1;var t=gi(e);return t==h||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!Wo(e)}function Vo(e){if(!Uo(e))return!1;var t=gi(e);return t==f||t==g||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zo(e){return"number"==typeof e&&e==ra(e)}function Ho(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Uo(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function $o(e){return null!=e&&"object"==typeof e}var Zo=tt?Ot(tt):function(e){return $o(e)&&is(e)==p};function Go(e){return"number"==typeof e||$o(e)&&gi(e)==m}function Wo(e){if(!$o(e)||gi(e)!=v)return!1;var t=ze(e);if(null===t)return!0;var n=Se.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&Ee.call(n)==ke}var Ko=nt?Ot(nt):function(e){return $o(e)&&gi(e)==y};var Yo=it?Ot(it):function(e){return $o(e)&&is(e)==b};function Xo(e){return"string"==typeof e||!No(e)&&$o(e)&&gi(e)==w}function Jo(e){return"symbol"==typeof e||$o(e)&&gi(e)==_}var Qo=rt?Ot(rt):function(e){return $o(e)&&Ho(e.length)&&!!Re[gi(e)]};var ea=Mr(ki),ta=Mr((function(e,t){return e<=t}));function na(e){if(!e)return[];if(qo(e))return Xo(e)?Gt(e):yr(e);if(Xe&&e[Xe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Xe]());var t=is(e);return(t==p?Vt:t==b?Ut:Pa)(e)}function ia(e){return e?(e=oa(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function ra(e){var t=ia(e),n=t%1;return t==t?n?t-n:t:0}function sa(e){return e?Yn(ra(e),0,4294967295):0}function oa(e){if("number"==typeof e)return e;if(Jo(e))return NaN;if(Uo(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Uo(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Pt(e);var n=se.test(e);return n||ae.test(e)?Ue(e.slice(2),n?2:8):re.test(e)?NaN:+e}function aa(e){return br(e,Ea(e))}function ca(e){return null==e?"":Ji(e)}var la=_r((function(e,t){if(hs(t)||qo(t))br(t,_a(t),e);else for(var n in t)Se.call(t,n)&&Un(e,n,t[n])})),ua=_r((function(e,t){br(t,Ea(t),e)})),da=_r((function(e,t,n,i){br(t,Ea(t),e,i)})),ha=_r((function(e,t,n,i){br(t,_a(t),e,i)})),fa=$r(Kn);var ga=ji((function(e,t){e=ge(e);var n=-1,i=t.length,r=i>2?t[2]:void 0;for(r&&cs(t[0],t[1],r)&&(i=1);++n1),t})),br(e,Gr(e),n),i&&(n=Xn(n,7,Hr));for(var r=t.length;r--;)er(n,t[r]);return n}));var Aa=$r((function(e,t){return null==e?{}:function(e,t){return Ni(e,t,(function(t,n){return va(e,n)}))}(e,t)}));function ka(e,t){if(null==e)return{};var n=ft(Gr(e),(function(e){return[e]}));return t=Xr(t),Ni(e,n,(function(e,n){return t(e,n[0])}))}var Ca=jr(_a),Ia=jr(Ea);function Pa(e){return null==e?[]:Bt(e,_a(e))}var Oa=Lr((function(e,t,n){return t=t.toLowerCase(),e+(n?Ba(t):t)}));function Ba(e){return Ra(ca(e).toLowerCase())}function Ta(e){return(e=ca(e))&&e.replace(le,Dt).replace(Te,"")}var Na=Lr((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Ma=Lr((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),qa=xr("toLowerCase");var Da=Lr((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Fa=Lr((function(e,t,n){return e+(n?" ":"")+Ra(t)}));var ja=Lr((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Ra=xr("toUpperCase");function Va(e,t,n){return e=ca(e),void 0===(t=n?void 0:t)?function(e){return De.test(e)}(e)?function(e){return e.match(Me)||[]}(e):function(e){return e.match(Q)||[]}(e):e.match(t)||[]}var za=ji((function(e,t){try{return st(e,void 0,t)}catch(e){return Ro(e)?e:new K(e)}})),Ha=$r((function(e,t){return at(t,(function(t){t=As(t),Wn(e,t,bo(e[t],e))})),e}));function Ua(e){return function(){return e}}var $a=Cr(),Za=Cr(!0);function Ga(e){return e}function Wa(e){return xi("function"==typeof e?e:Xn(e,1))}var Ka=ji((function(e,t){return function(n){return bi(n,e,t)}})),Ya=ji((function(e,t){return function(n){return bi(e,n,t)}}));function Xa(e,t,n){var i=_a(t),r=di(t,i);null!=n||Uo(t)&&(r.length||!i.length)||(n=t,t=e,e=this,r=di(t,_a(t)));var s=!(Uo(n)&&"chain"in n&&!n.chain),o=Vo(e);return at(r,(function(n){var i=t[n];e[n]=i,o&&(e.prototype[n]=function(){var t=this.__chain__;if(s||t){var n=e(this.__wrapped__),r=n.__actions__=yr(this.__actions__);return r.push({func:i,args:arguments,thisArg:e}),n.__chain__=t,n}return i.apply(e,gt([this.value()],arguments))})})),e}function Ja(){}var Qa=Br(ft),ec=Br(lt),tc=Br(vt);function nc(e){return ls(e)?Lt(As(e)):function(e){return function(t){return hi(t,e)}}(e)}var ic=Nr(),rc=Nr(!0);function sc(){return[]}function oc(){return!1}var ac=Or((function(e,t){return e+t}),0),cc=Dr("ceil"),lc=Or((function(e,t){return e/t}),1),uc=Dr("floor");var dc,hc=Or((function(e,t){return e*t}),1),fc=Dr("round"),gc=Or((function(e,t){return e-t}),0);return In.after=function(e,t){if("function"!=typeof t)throw new ve(s);return e=ra(e),function(){if(--e<1)return t.apply(this,arguments)}},In.ary=vo,In.assign=la,In.assignIn=ua,In.assignInWith=da,In.assignWith=ha,In.at=fa,In.before=yo,In.bind=bo,In.bindAll=Ha,In.bindKey=wo,In.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return No(e)?e:[e]},In.chain=to,In.chunk=function(e,t,n){t=(n?cs(e,t,n):void 0===t)?1:an(ra(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var s=0,o=0,a=i(Qt(r/t));sr?0:r+n),(i=void 0===i||i>r?r:ra(i))<0&&(i+=r),i=n>i?0:sa(i);n>>0)?(e=ca(e))&&("string"==typeof t||null!=t&&!Ko(t))&&!(t=Ji(t))&&Rt(e)?ur(Gt(e),0,n):e.split(t,n):[]},In.spread=function(e,t){if("function"!=typeof e)throw new ve(s);return t=null==t?0:an(ra(t),0),ji((function(n){var i=n[t],r=ur(n,0,t);return i&>(r,i),st(e,this,r)}))},In.tail=function(e){var t=null==e?0:e.length;return t?Zi(e,1,t):[]},In.take=function(e,t,n){return e&&e.length?Zi(e,0,(t=n||void 0===t?1:ra(t))<0?0:t):[]},In.takeRight=function(e,t,n){var i=null==e?0:e.length;return i?Zi(e,(t=i-(t=n||void 0===t?1:ra(t)))<0?0:t,i):[]},In.takeRightWhile=function(e,t){return e&&e.length?nr(e,Xr(t,3),!1,!0):[]},In.takeWhile=function(e,t){return e&&e.length?nr(e,Xr(t,3)):[]},In.tap=function(e,t){return t(e),e},In.throttle=function(e,t,n){var i=!0,r=!0;if("function"!=typeof e)throw new ve(s);return Uo(n)&&(i="leading"in n?!!n.leading:i,r="trailing"in n?!!n.trailing:r),_o(e,t,{leading:i,maxWait:t,trailing:r})},In.thru=no,In.toArray=na,In.toPairs=Ca,In.toPairsIn=Ia,In.toPath=function(e){return No(e)?ft(e,As):Jo(e)?[e]:yr(Ls(ca(e)))},In.toPlainObject=aa,In.transform=function(e,t,n){var i=No(e),r=i||Fo(e)||Qo(e);if(t=Xr(t,4),null==n){var s=e&&e.constructor;n=r?i?new s:[]:Uo(e)&&Vo(s)?Pn(ze(e)):{}}return(r?at:li)(e,(function(e,i,r){return t(n,e,i,r)})),n},In.unary=function(e){return vo(e,1)},In.union=Us,In.unionBy=$s,In.unionWith=Zs,In.uniq=function(e){return e&&e.length?Qi(e):[]},In.uniqBy=function(e,t){return e&&e.length?Qi(e,Xr(t,2)):[]},In.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Qi(e,void 0,t):[]},In.unset=function(e,t){return null==e||er(e,t)},In.unzip=Gs,In.unzipWith=Ws,In.update=function(e,t,n){return null==e?e:tr(e,t,ar(n))},In.updateWith=function(e,t,n,i){return i="function"==typeof i?i:void 0,null==e?e:tr(e,t,ar(n),i)},In.values=Pa,In.valuesIn=function(e){return null==e?[]:Bt(e,Ea(e))},In.without=Ks,In.words=Va,In.wrap=function(e,t){return ko(ar(t),e)},In.xor=Ys,In.xorBy=Xs,In.xorWith=Js,In.zip=Qs,In.zipObject=function(e,t){return sr(e||[],t||[],Un)},In.zipObjectDeep=function(e,t){return sr(e||[],t||[],zi)},In.zipWith=eo,In.entries=Ca,In.entriesIn=Ia,In.extend=ua,In.extendWith=da,Xa(In,In),In.add=ac,In.attempt=za,In.camelCase=Oa,In.capitalize=Ba,In.ceil=cc,In.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=oa(n))==n?n:0),void 0!==t&&(t=(t=oa(t))==t?t:0),Yn(oa(e),t,n)},In.clone=function(e){return Xn(e,4)},In.cloneDeep=function(e){return Xn(e,5)},In.cloneDeepWith=function(e,t){return Xn(e,5,t="function"==typeof t?t:void 0)},In.cloneWith=function(e,t){return Xn(e,4,t="function"==typeof t?t:void 0)},In.conformsTo=function(e,t){return null==t||Jn(e,t,_a(t))},In.deburr=Ta,In.defaultTo=function(e,t){return null==e||e!=e?t:e},In.divide=lc,In.endsWith=function(e,t,n){e=ca(e),t=Ji(t);var i=e.length,r=n=void 0===n?i:Yn(ra(n),0,i);return(n-=t.length)>=0&&e.slice(n,r)==t},In.eq=Po,In.escape=function(e){return(e=ca(e))&&j.test(e)?e.replace(D,Ft):e},In.escapeRegExp=function(e){return(e=ca(e))&&G.test(e)?e.replace(Z,"\\$&"):e},In.every=function(e,t,n){var i=No(e)?lt:ii;return n&&cs(e,t,n)&&(t=void 0),i(e,Xr(t,3))},In.find=so,In.findIndex=Bs,In.findKey=function(e,t){return bt(e,Xr(t,3),li)},In.findLast=oo,In.findLastIndex=Ts,In.findLastKey=function(e,t){return bt(e,Xr(t,3),ui)},In.floor=uc,In.forEach=ao,In.forEachRight=co,In.forIn=function(e,t){return null==e?e:ai(e,Xr(t,3),Ea)},In.forInRight=function(e,t){return null==e?e:ci(e,Xr(t,3),Ea)},In.forOwn=function(e,t){return e&&li(e,Xr(t,3))},In.forOwnRight=function(e,t){return e&&ui(e,Xr(t,3))},In.get=ma,In.gt=Oo,In.gte=Bo,In.has=function(e,t){return null!=e&&rs(e,t,mi)},In.hasIn=va,In.head=Ms,In.identity=Ga,In.includes=function(e,t,n,i){e=qo(e)?e:Pa(e),n=n&&!i?ra(n):0;var r=e.length;return n<0&&(n=an(r+n,0)),Xo(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&_t(e,t,n)>-1},In.indexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=null==n?0:ra(n);return r<0&&(r=an(i+r,0)),_t(e,t,r)},In.inRange=function(e,t,n){return t=ia(t),void 0===n?(n=t,t=0):n=ia(n),function(e,t,n){return e>=cn(t,n)&&e=-9007199254740991&&e<=9007199254740991},In.isSet=Yo,In.isString=Xo,In.isSymbol=Jo,In.isTypedArray=Qo,In.isUndefined=function(e){return void 0===e},In.isWeakMap=function(e){return $o(e)&&is(e)==E},In.isWeakSet=function(e){return $o(e)&&"[object WeakSet]"==gi(e)},In.join=function(e,t){return null==e?"":sn.call(e,t)},In.kebabCase=Na,In.last=js,In.lastIndexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=i;return void 0!==n&&(r=(r=ra(n))<0?an(i+r,0):cn(r,i-1)),t==t?function(e,t,n){for(var i=n+1;i--;)if(e[i]===t)return i;return i}(e,t,r):wt(e,St,r,!0)},In.lowerCase=Ma,In.lowerFirst=qa,In.lt=ea,In.lte=ta,In.max=function(e){return e&&e.length?ri(e,Ga,pi):void 0},In.maxBy=function(e,t){return e&&e.length?ri(e,Xr(t,2),pi):void 0},In.mean=function(e){return xt(e,Ga)},In.meanBy=function(e,t){return xt(e,Xr(t,2))},In.min=function(e){return e&&e.length?ri(e,Ga,ki):void 0},In.minBy=function(e,t){return e&&e.length?ri(e,Xr(t,2),ki):void 0},In.stubArray=sc,In.stubFalse=oc,In.stubObject=function(){return{}},In.stubString=function(){return""},In.stubTrue=function(){return!0},In.multiply=hc,In.nth=function(e,t){return e&&e.length?Bi(e,ra(t)):void 0},In.noConflict=function(){return Ge._===this&&(Ge._=Ce),this},In.noop=Ja,In.now=mo,In.pad=function(e,t,n){e=ca(e);var i=(t=ra(t))?Zt(e):0;if(!t||i>=t)return e;var r=(t-i)/2;return Tr(en(r),n)+e+Tr(Qt(r),n)},In.padEnd=function(e,t,n){e=ca(e);var i=(t=ra(t))?Zt(e):0;return t&&it){var i=e;e=t,t=i}if(n||e%1||t%1){var r=dn();return cn(e+r*(t-e+He("1e-"+((r+"").length-1))),t)}return Di(e,t)},In.reduce=function(e,t,n){var i=No(e)?pt:kt,r=arguments.length<3;return i(e,Xr(t,4),n,r,ti)},In.reduceRight=function(e,t,n){var i=No(e)?mt:kt,r=arguments.length<3;return i(e,Xr(t,4),n,r,ni)},In.repeat=function(e,t,n){return t=(n?cs(e,t,n):void 0===t)?1:ra(t),Fi(ca(e),t)},In.replace=function(){var e=arguments,t=ca(e[0]);return e.length<3?t:t.replace(e[1],e[2])},In.result=function(e,t,n){var i=-1,r=(t=cr(t,e)).length;for(r||(r=1,e=void 0);++i9007199254740991)return[];var n=4294967295,i=cn(e,4294967295);e-=4294967295;for(var r=It(i,t=Xr(t));++n=s)return e;var a=n-Zt(i);if(a<1)return i;var c=o?ur(o,0,a).join(""):e.slice(0,a);if(void 0===r)return c+i;if(o&&(a+=c.length-a),Ko(r)){if(e.slice(a).search(r)){var l,u=c;for(r.global||(r=pe(r.source,ca(ie.exec(r))+"g")),r.lastIndex=0;l=r.exec(u);)var d=l.index;c=c.slice(0,void 0===d?a:d)}}else if(e.indexOf(Ji(r),a)!=a){var h=c.lastIndexOf(r);h>-1&&(c=c.slice(0,h))}return c+i},In.unescape=function(e){return(e=ca(e))&&F.test(e)?e.replace(q,Kt):e},In.uniqueId=function(e){var t=++xe;return ca(e)+t},In.upperCase=ja,In.upperFirst=Ra,In.each=ao,In.eachRight=co,In.first=Ms,Xa(In,(dc={},li(In,(function(e,t){Se.call(In.prototype,t)||(dc[t]=e)})),dc),{chain:!1}),In.VERSION="4.17.21",at(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){In[e].placeholder=In})),at(["drop","take"],(function(e,t){Tn.prototype[e]=function(n){n=void 0===n?1:an(ra(n),0);var i=this.__filtered__&&!t?new Tn(this):this.clone();return i.__filtered__?i.__takeCount__=cn(n,i.__takeCount__):i.__views__.push({size:cn(n,4294967295),type:e+(i.__dir__<0?"Right":"")}),i},Tn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),at(["filter","map","takeWhile"],(function(e,t){var n=t+1,i=1==n||3==n;Tn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Xr(e,3),type:n}),t.__filtered__=t.__filtered__||i,t}})),at(["head","last"],(function(e,t){var n="take"+(t?"Right":"");Tn.prototype[e]=function(){return this[n](1).value()[0]}})),at(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");Tn.prototype[e]=function(){return this.__filtered__?new Tn(this):this[n](1)}})),Tn.prototype.compact=function(){return this.filter(Ga)},Tn.prototype.find=function(e){return this.filter(e).head()},Tn.prototype.findLast=function(e){return this.reverse().find(e)},Tn.prototype.invokeMap=ji((function(e,t){return"function"==typeof e?new Tn(this):this.map((function(n){return bi(n,e,t)}))})),Tn.prototype.reject=function(e){return this.filter(Lo(Xr(e)))},Tn.prototype.slice=function(e,t){e=ra(e);var n=this;return n.__filtered__&&(e>0||t<0)?new Tn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=ra(t))<0?n.dropRight(-t):n.take(t-e)),n)},Tn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Tn.prototype.toArray=function(){return this.take(4294967295)},li(Tn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),i=/^(?:head|last)$/.test(t),r=In[i?"take"+("last"==t?"Right":""):t],s=i||/^find/.test(t);r&&(In.prototype[t]=function(){var t=this.__wrapped__,o=i?[1]:arguments,a=t instanceof Tn,c=o[0],l=a||No(t),u=function(e){var t=r.apply(In,gt([e],o));return i&&d?t[0]:t};l&&n&&"function"==typeof c&&1!=c.length&&(a=l=!1);var d=this.__chain__,h=!!this.__actions__.length,f=s&&!d,g=a&&!h;if(!s&&l){t=g?t:new Tn(this);var p=e.apply(t,o);return p.__actions__.push({func:no,args:[u],thisArg:void 0}),new Bn(p,d)}return f&&g?e.apply(this,o):(p=this.thru(u),f?i?p.value()[0]:p.value():p)})})),at(["pop","push","shift","sort","splice","unshift"],(function(e){var t=ye[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",i=/^(?:pop|shift)$/.test(e);In.prototype[e]=function(){var e=arguments;if(i&&!this.__chain__){var r=this.value();return t.apply(No(r)?r:[],e)}return this[n]((function(n){return t.apply(No(n)?n:[],e)}))}})),li(Tn.prototype,(function(e,t){var n=In[t];if(n){var i=n.name+"";Se.call(wn,i)||(wn[i]=[]),wn[i].push({name:t,func:n})}})),wn[Ir(void 0,2).name]=[{name:"wrapper",func:void 0}],Tn.prototype.clone=function(){var e=new Tn(this.__wrapped__);return e.__actions__=yr(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=yr(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=yr(this.__views__),e},Tn.prototype.reverse=function(){if(this.__filtered__){var e=new Tn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Tn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=No(e),i=t<0,r=n?e.length:0,s=function(e,t,n){var i=-1,r=n.length;for(;++i=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},In.prototype.plant=function(e){for(var t,n=this;n instanceof On;){var i=Cs(n);i.__index__=0,i.__values__=void 0,t?r.__wrapped__=i:t=i;var r=i;n=n.__wrapped__}return r.__wrapped__=e,t},In.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Tn){var t=e;return this.__actions__.length&&(t=new Tn(this)),(t=t.reverse()).__actions__.push({func:no,args:[Hs],thisArg:void 0}),new Bn(t,this.__chain__)}return this.thru(Hs)},In.prototype.toJSON=In.prototype.valueOf=In.prototype.value=function(){return ir(this.__wrapped__,this.__actions__)},In.prototype.first=In.prototype.head,Xe&&(In.prototype[Xe]=function(){return this}),In}();Ge._=Yt,void 0===(r=function(){return Yt}.call(t,n,t,i))||(i.exports=r)}).call(this)}).call(this,n(10),n(50)(e))},function(e,t){ /** * vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. * @@ -52,12 +52,12 @@ * vkbeautify.sqlmin(text);// minify SQL * */ -function n(e){var t=" ";if(isNaN(parseInt(e)))t=e;else switch(e){case 1:t=" ";break;case 2:t=" ";break;case 3:t=" ";break;case 4:t=" ";break;case 5:t=" ";break;case 6:t=" ";break;case 7:t=" ";break;case 8:t=" ";break;case 9:t=" ";break;case 10:t=" ";break;case 11:t=" ";break;case 12:t=" "}for(var n=["\n"],i=0;i<100;i++)n.push(n[i]+t);return n}function i(){this.step=" ",this.shift=n(this.step)}function r(e,t){return t-(e.replace(/\(/g,"").length-e.replace(/\)/g,"").length)}function s(e,t){return e.replace(/\s{1,}/g," ").replace(/ AND /gi,"~::~"+t+t+"AND ").replace(/ BETWEEN /gi,"~::~"+t+"BETWEEN ").replace(/ CASE /gi,"~::~"+t+"CASE ").replace(/ ELSE /gi,"~::~"+t+"ELSE ").replace(/ END /gi,"~::~"+t+"END ").replace(/ FROM /gi,"~::~FROM ").replace(/ GROUP\s{1,}BY/gi,"~::~GROUP BY ").replace(/ HAVING /gi,"~::~HAVING ").replace(/ IN /gi," IN ").replace(/ JOIN /gi,"~::~JOIN ").replace(/ CROSS~::~{1,}JOIN /gi,"~::~CROSS JOIN ").replace(/ INNER~::~{1,}JOIN /gi,"~::~INNER JOIN ").replace(/ LEFT~::~{1,}JOIN /gi,"~::~LEFT JOIN ").replace(/ RIGHT~::~{1,}JOIN /gi,"~::~RIGHT JOIN ").replace(/ ON /gi,"~::~"+t+"ON ").replace(/ OR /gi,"~::~"+t+t+"OR ").replace(/ ORDER\s{1,}BY/gi,"~::~ORDER BY ").replace(/ OVER /gi,"~::~"+t+"OVER ").replace(/\(\s{0,}SELECT /gi,"~::~(SELECT ").replace(/\)\s{0,}SELECT /gi,")~::~SELECT ").replace(/ THEN /gi," THEN~::~"+t).replace(/ UNION /gi,"~::~UNION~::~").replace(/ USING /gi,"~::~USING ").replace(/ WHEN /gi,"~::~"+t+"WHEN ").replace(/ WHERE /gi,"~::~WHERE ").replace(/ WITH /gi,"~::~WITH ").replace(/ ALL /gi," ALL ").replace(/ AS /gi," AS ").replace(/ ASC /gi," ASC ").replace(/ DESC /gi," DESC ").replace(/ DISTINCT /gi," DISTINCT ").replace(/ EXISTS /gi," EXISTS ").replace(/ NOT /gi," NOT ").replace(/ NULL /gi," NULL ").replace(/ LIKE /gi," LIKE ").replace(/\s{0,}SELECT /gi,"SELECT ").replace(/\s{0,}UPDATE /gi,"UPDATE ").replace(/ SET /gi," SET ").replace(/~::~{1,}/g,"~::~").split("~::~")}i.prototype.xml=function(e,t){var i=e.replace(/>\s{0,}<").replace(/-1?(a+=l[o]+i[c],s=!0,(i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1||i[c].search(/!DOCTYPE/)>-1)&&(s=!1)):i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1?(a+=i[c],s=!1):/^<\w/.exec(i[c-1])&&/^<\/\w/.exec(i[c])&&/^<[\w:\-\.\,]+/.exec(i[c-1])==/^<\/[\w:\-\.\,]+/.exec(i[c])[0].replace("/","")?(a+=i[c],s||o--):i[c].search(/<\w/)>-1&&-1==i[c].search(/<\//)&&-1==i[c].search(/\/>/)?a=a+=s?i[c]:l[o++]+i[c]:i[c].search(/<\w/)>-1&&i[c].search(/<\//)>-1?a=a+=s?i[c]:l[o]+i[c]:i[c].search(/<\//)>-1?a=a+=s?i[c]:l[--o]+i[c]:i[c].search(/\/>/)>-1?a=a+=s?i[c]:l[o]+i[c]:i[c].search(/<\?/)>-1||i[c].search(/xmlns\:/)>-1||i[c].search(/xmlns\=/)>-1?a+=l[o]+i[c]:a+=i[c];return"\n"==a[0]?a.slice(1):a},i.prototype.json=function(e,t){t=t||this.step;return"undefined"==typeof JSON?e:"string"==typeof e?JSON.stringify(JSON.parse(e),null,t):"object"==typeof e?JSON.stringify(e,null,t):e},i.prototype.css=function(e,t){var i=e.replace(/\s{1,}/g," ").replace(/\{/g,"{~::~").replace(/\}/g,"~::~}~::~").replace(/\;/g,";~::~").replace(/\/\*/g,"~::~/*").replace(/\*\//g,"*/~::~").replace(/~::~\s{0,}~::~/g,"~::~").split("~::~"),r=i.length,s=0,o="",a=0,c=t?n(t):this.shift;for(a=0;a/g,"").replace(/[ \r\n\t]{1,}xmlns/g," xmlns")).replace(/>\s{0,}<")},i.prototype.jsonmin=function(e){return"undefined"==typeof JSON?e:JSON.stringify(JSON.parse(e),null,0)},i.prototype.cssmin=function(e,t){return(t?e:e.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"")).replace(/\s{1,}/g," ").replace(/\{\s{1,}/g,"{").replace(/\}\s{1,}/g,"}").replace(/\;\s{1,}/g,";").replace(/\/\*\s{1,}/g,"/*").replace(/\*\/\s{1,}/g,"*/")},i.prototype.sqlmin=function(e){return e.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")")},e.exports=new i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renameHTML=t.newFolderHTML=t.uploadAreaHTML=void 0,t.uploadAreaHTML='
\n\n
\n
\n
Upload Files
\n
\n
\n \n
\n
\n\n
Unpaired Documents
\n\n
\n\n
\n
MEI
\n
\n
Name
\n
\n
\n
\n
\n \n
\n
\n
\n\n
\n
Images
\n
\n
Name
\n
\n
\n
\n
\n\n
\n\n
\n
Make Pair
\n
\n
\n\n
\n\n
Paired Folios
\n
\n
Name
\n
\n
\n
\n\n
\n
\n Upload\n
\n
\n
\n\n
\n\n \x3c!--\n
\n

Manuscripts

\n
\n
\n --\x3e\n\n
\n
',t.newFolderHTML='\n
\n
\n
\n
\n \n \n
\n
\n ',t.renameHTML='\n
\n
\n
\n
\n \n \n
\n
\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.groupingNotRecognized=void 0,t.groupingNotRecognized=function(){window.confirm("Neon does not recognize this neume grouping. Would you like to create a compound neume?")||document.getElementById("undo").click()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitStaffHandler=void 0;const i=n(5),r=n(4),s=n(23),o=n(15);t.SplitStaffHandler=class{constructor(e,t){this.handler=(e=>{const t=this.staff.id,n=(0,o.getSVGRelCoords)(e.clientX,e.clientY),a={action:"split",param:{elementId:t,x:n.x}};this.neonView.edit(a,this.neonView.view.getCurrentPageURI()).then(async e=>{e&&(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success"));const n=new s.default(this.neonView,".staff");this.splitDisable(),(0,r.selectAll)([document.querySelector("#"+t)],this.neonView,n);const o=document.getElementById("moreEdit");o&&(o.innerHTML="",o.parentElement.classList.add("hidden"))})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.staff=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click Where to Split")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitNeumeHandler=void 0;const i=n(5);t.SplitNeumeHandler=class{constructor(e,t){this.handler=(e=>{const t={action:"splitNeume",param:{elementId:this.neume.id,ncId:e.target.parentElement.id}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(async e=>{e?(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success")):(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action failed","error")),this.splitDisable()})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.neume=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click The Beginning of The Second Neume")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t){},function(e,t,n){"use strict";(function(e){t.test=function(){return"function"==typeof e.queueMicrotask},t.install=function(t){return function(){e.queueMicrotask(t)}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){var n=e.MutationObserver||e.WebKitMutationObserver;t.test=function(){return n},t.install=function(t){var i=0,r=new n(t),s=e.document.createTextNode("");return r.observe(s,{characterData:!0}),function(){s.data=i=++i%2}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){t.test=function(){return!e.setImmediate&&void 0!==e.MessageChannel},t.install=function(t){var n=new e.MessageChannel;return n.port1.onmessage=t,function(){n.port2.postMessage(0)}}}).call(this,n(9))},function(e,t,n){"use strict";(function(e){t.test=function(){return"document"in e&&"onreadystatechange"in e.document.createElement("script")},t.install=function(t){return function(){var n=e.document.createElement("script");return n.onreadystatechange=function(){t(),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},e.document.documentElement.appendChild(n),t}}}).call(this,n(9))},function(e,t,n){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},function(e,t,n){"use strict";var i=n(67),r=n(68);function s(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}t.parse=b,t.resolve=function(e,t){return b(e,!1,!0).resolve(t)},t.resolveObject=function(e,t){return e?b(e,!1,!0).resolveObject(t):t},t.format=function(e){r.isString(e)&&(e=b(e));return e instanceof s?e.format():s.prototype.format.call(e)},t.Url=s;var o=/^([a-z0-9.+-]+:)/i,a=/:[0-9]*$/,c=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,l=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),u=["'"].concat(l),d=["%","/","?",";","#"].concat(u),h=["/","?","#"],f=/^[+a-z0-9A-Z_-]{0,63}$/,g=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,p={javascript:!0,"javascript:":!0},m={javascript:!0,"javascript:":!0},v={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},y=n(69);function b(e,t,n){if(e&&r.isObject(e)&&e instanceof s)return e;var i=new s;return i.parse(e,t,n),i}s.prototype.parse=function(e,t,n){if(!r.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var s=e.indexOf("?"),a=-1!==s&&s127?T+="x":T+=B[N];if(!T.match(f)){var q=P.slice(0,k),D=P.slice(k+1),F=B.match(g);F&&(q.push(F[1]),D.unshift(F[2])),D.length&&(b="/"+D.join(".")+b),this.hostname=q.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),I||(this.hostname=i.toASCII(this.hostname));var j=this.port?":"+this.port:"",R=this.hostname||"";this.host=R+j,this.href+=this.host,I&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!p[E])for(k=0,O=u.length;k0)&&n.host.split("@"))&&(n.auth=I.shift(),n.host=n.hostname=I.shift());return n.search=e.search,n.query=e.query,r.isNull(n.pathname)&&r.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!S.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var L=S.slice(-1)[0],A=(n.host||e.host||S.length>1)&&("."===L||".."===L)||""===L,k=0,C=S.length;C>=0;C--)"."===(L=S[C])?S.splice(C,1):".."===L?(S.splice(C,1),k++):k&&(S.splice(C,1),k--);if(!_&&!E)for(;k--;k)S.unshift("..");!_||""===S[0]||S[0]&&"/"===S[0].charAt(0)||S.unshift(""),A&&"/"!==S.join("/").substr(-1)&&S.push("");var I,P=""===S[0]||S[0]&&"/"===S[0].charAt(0);x&&(n.hostname=n.host=P?"":S.length?S.shift():"",(I=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=I.shift(),n.host=n.hostname=I.shift()));return(_=_||n.host&&S.length)&&!P&&S.unshift(""),S.length?n.pathname=S.join("/"):(n.pathname=null,n.path=null),r.isNull(n.pathname)&&r.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},s.prototype.parseHost=function(){var e=this.host,t=a.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";var i=n(43),r=n(19);function s(e,t){this.id=e,this.ref=t}e.exports.SchemaScanResult=s,e.exports.scan=function(e,t){function n(e,t){if(t&&"object"==typeof t)if(t.$ref){var s=i.resolve(e,t.$ref);l[s]=l[s]?l[s]+1:0}else{var u=t.$id||t.id,d=u?i.resolve(e,u):e;if(d){if(d.indexOf("#")<0&&(d+="#"),c[d]){if(!r.deepCompareStrict(c[d],t))throw new Error("Schema <"+d+"> already exists with different definition");return c[d]}c[d]=t,"#"==d[d.length-1]&&(c[d.substring(0,d.length-1)]=t)}o(d+"/items",Array.isArray(t.items)?t.items:[t.items]),o(d+"/extends",Array.isArray(t.extends)?t.extends:[t.extends]),n(d+"/additionalItems",t.additionalItems),a(d+"/properties",t.properties),n(d+"/additionalProperties",t.additionalProperties),a(d+"/definitions",t.definitions),a(d+"/patternProperties",t.patternProperties),a(d+"/dependencies",t.dependencies),o(d+"/disallow",t.disallow),o(d+"/allOf",t.allOf),o(d+"/anyOf",t.anyOf),o(d+"/oneOf",t.oneOf),n(d+"/not",t.not)}}function o(e,t){if(Array.isArray(t))for(var i=0;i0&&l.infoListeners(),(0,i.unselect)())}function f(e){if("selByBBox"!==(0,i.getSelectionType)()||!document.getElementById("displayText").checked||"Enter"!==e.key)return;const t=document.querySelector(".syllable-highlighted");if(t){document.querySelector("span."+t.id).click()}}function g(e){if("selByBBox"!==(0,i.getSelectionType)()||"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"Tab"!==e.key&&e.shiftKey)return;e.preventDefault();const t=document.querySelector(".syllable-highlighted"),n=Array.from(document.querySelectorAll(".syllable")).filter(e=>null!==e.querySelector(".sylTextRect-display")),r=n.indexOf(t);if(("ArrowLeft"===e.key||"Tab"===e.key&&e.shiftKey)&&r>0){(0,i.unselect)();const e=n[r-1].querySelector(".sylTextRect-display");(0,i.selectAll)([e],c,a)}else if(("ArrowRight"===e.key||"Tab"===e.key&&!e.shiftKey)&&rr.lrx||n.yr.lry)}const r=(0,i.getStaffBBox)(e);return!(t.xr.lrx&&n.x>r.lrx||t.yr.lry+Math.abs(r.lry-n.y)*Math.tan(r.rotate)&&n.y>r.lry+Math.abs(r.lry-n.y)*Math.tan(r.rotate))}function y(e){if(c&&"insert"!==c.getUserMode()&&!e.shiftKey)if("use"===this.tagName&&"selByBBox"!==(0,i.getSelectionType)()){if(null===this.closest(".selected")){let e=[this];const n=/E9B[45678]/,r=/E9B[9ABC]/;if(this.getAttribute("xlink:href").match(r)){const t=this.closest(".nc"),i=this.closest(".neume"),r=Array.from(i.children).indexOf(t),s=i.children[r-1].children[0];console.assert(s.getAttribute("xlink:href").match(n),"First glyph of ligature unexpected!"),null===s.closest(".selected")&&e.unshift(s)}else if(this.getAttribute("xlink:href").match(n)){const t=this.closest(".nc"),n=this.closest(".neume"),i=Array.from(n.children).indexOf(t),s=n.children[i+1].children[0];console.assert(s.getAttribute("xlink:href").match(r),"Second glyph of ligature unexpected!"),null===s.closest(".selected")&&e.push(s)}t()&&(e=e.concat(Array.from(document.querySelectorAll(".selected")))),(0,i.selectAll)(e,c,a),a&&a.dragInit()}else if(t()){const e={selByStaff:".staff",selByNeume:".neume",selByNc:".nc",selByLayerElement:".accid"}[document.querySelector(".sel-by .is-active").id]||".syllable",t=[this.closest(e)];let n=[];n=Array.from(document.getElementsByClassName("selected")),n=n.filter(e=>!t.includes(e)),(0,i.selectAll)(n,c,a),a&&a.dragInit()}}else if("rect"===e.target.tagName&&"selByBBox"===(0,i.getSelectionType)())if(null===this.closest(".selected")){let n=[e.target];t()&&(n=n.concat(Array.from(document.getElementsByClassName("selected"))),n=n.map(e=>"rect"==e.tagName?e:e.querySelector(".sylTextRect-Display"))),(0,i.selectAll)(n,c,a),a&&a.dragInit()}else{let e=[];if(t()){const t=[this];e=Array.from(document.getElementsByClassName("selected")),e=e.map(e=>"rect"==e.tagName?e:e.querySelector(".sylTextRect-Display")),e=e.filter(e=>!t.includes(e)),(0,i.selectAll)(e,c,a),a&&a.dragInit()}}else{if("selByStaff"!==(0,i.getSelectionType)())return void l.infoListeners();t()||(0,i.unselect)();const n=(0,o.getStaffByCoords)(e.clientX,e.clientY);if(!n)return;n.classList.contains("selected")||((0,i.selectStaff)(n,a),(0,r.resize)(n,c,a),a&&a.dragInit()),n.dispatchEvent(new MouseEvent("mousedown",{screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,view:e.view}))}function t(){return window.navigator.userAgent.match(/Mac/)?e.metaKey:e.ctrlKey}}t.setSelectStrokeWidth=function(e){d=e},t.setSelectHelperObjects=function(e,t){a=t,c=e,l=c.info,u=c.view.zoomHandler},t.clickSelect=function(e){document.querySelectorAll(e).forEach(e=>{e.removeEventListener("mousedown",y),e.addEventListener("mousedown",y)}),document.body.removeEventListener("keydown",h),document.body.addEventListener("keydown",h),document.body.removeEventListener("keydown",f),document.body.addEventListener("keydown",f),document.body.removeEventListener("keydown",g),document.body.addEventListener("keydown",g),document.getElementById("container").addEventListener("contextmenu",e=>{e.preventDefault()}),document.querySelectorAll("use,rect,#moreEdit").forEach(e=>{e.removeEventListener("click",m),e.addEventListener("click",m)})},t.dragSelect=function(e){let t=0,n=0,r=!1,o=!1;const l=s.select(e);s.selectAll(e.replace(".active-page","").trim()).on(".drag",null);const h=s.drag().on("start",(function(){if(!c)return;const e=c.getUserMode();if("use"!==s.event.sourceEvent.target.nodeName&&"insert"!==e&&"rect"!==s.event.sourceEvent.target.nodeName){if(s.event.sourceEvent.shiftKey)r=!0,void 0!==u&&u.startDrag();else if(!document.getElementById("selByStaff").classList.contains("is-active")||(f=s.mouse(this),0===Array.from(document.getElementsByClassName("staff")).filter(e=>{const t=(0,i.getStaffBBox)(e),n=t.ulx,r=t.uly,s=t.lrx,o=t.lry,a=t.rotate;return f[0]>n&&f[0]r+(f[0]-n)*Math.tan(a)&&f[1]v(e,f,g));y.forEach(e=>{if("use"===e.tagName&&e.getAttribute("xlink:href").match(/E9B[456789ABC]/)){const t=e.closest(".neume"),n=Array.from(t.children).indexOf(e.closest(".nc"));if(e.getAttribute("xlink:href").match(/E9B[45678]/)){const e=t.children[n+1].querySelector("use");y.indexOf(e)<0&&y.push(e)}else{const e=t.children[n-1].querySelector("use");y.indexOf(e)<0&&y.push(e)}}}),(0,i.selectAll)(y,c,a),a&&a.dragInit(),s.selectAll("#selectRect").remove(),o=!1}r=!1}));l.call(h),a&&a.resetTo(h)}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeColumnLabel=t.checkOutOfBoundsGlyphs=t.convertToVerovio=t.isInvalidBBox=t.getSyllableText=t.convertToNeon=t.zip=void 0;const i=n(17),r=n(32),s=n(5);function o(e,t){for(const n of e.attributes)t.setAttribute(n.name,n.value)}function a(e){var t;const n=null===(t=e.querySelector("syl"))||void 0===t?void 0:t.childNodes[0];let i;return i=n?n.nodeValue:"◊",i}function c(e,t){const n=parseInt(t.getAttribute("lrx")),i=parseInt(t.getAttribute("lry")),r=parseInt(t.getAttribute("ulx")),s=parseInt(t.getAttribute("uly")),o=0===n&&0===i&&0===r&&0===s,a=n<0||i<0||r<0||s<0,c=e.querySelector(`*[facs="${"#"+t.getAttribute("xml:id")}"]`);return o||a||!c?[!0,c]:[!1]}function l(e,t,n){const i=e.getAttribute("precedes").replace("#","");let r;const s=n.find((e,t)=>e.getAttribute("xml:id")===i&&(r=t,!0));if(!s)return`- <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is missing the following part\n`;if(!s.hasAttribute("follows"))return`- The following syllable of <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is not linked to any syllable\n`;if(s.getAttribute("follows")!="#"+e.getAttribute("xml:id"))return`- The following syllable of <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is linked to the wrong syllable\n`;if(r!==t+1){const i=[a(e),...n.slice(t+1,r).map(e=>a(e))].join(" - ");return`- Unexpected syllable(s) inside toggle-linked <${e.tagName}> (${i}) with xml:id: ${e.getAttribute("xml:id")} is linked to the wrong syllable\n`}}function u(e,t){const n=e.getAttribute("follows").replace("#",""),i=t.find(e=>e.getAttribute("xml:id")===n);return i?i.hasAttribute("precedes")?i.getAttribute("precedes")!="#"+e.getAttribute("xml:id")?`- The preceding syllable of <${e.tagName}> (${a(i)}) with xml:id: ${e.getAttribute("xml:id")} is linked to the wrong syllable\n`:void 0:`- The preceding syllable of <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is not linked to any syllable\n`:`- <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is missing the preceding part\n`}function d(e){const t=e.querySelectorAll("nc");let n=0,i="";for(;nt.length?t.length:e.length);i++)n.push([e[i],t[i]]);return n},t.convertToNeon=function(e){const t=new DOMParser,n=new XMLSerializer,s=t.parseFromString(e,"text/xml"),o=s.documentElement;let a=0;const c=Array.from(o.querySelectorAll('section:not([type="neon-neume-line"])'));for(const e of c){e.querySelectorAll("pb").forEach(e=>e.remove());e.querySelectorAll("sb").forEach(e=>e.remove());const t=s.createElementNS("http://www.music-encoding.org/ns/mei","staff"),n=s.createElementNS("http://www.music-encoding.org/ns/mei","layer");t.setAttribute("n","1"),n.setAttribute("n","1"),t.appendChild(n);const r=o.querySelector("surface"),c=r.getAttribute("xml:id"),u=s.createElementNS("http://www.music-encoding.org/ns/mei","pb");u.setAttribute("xml:id","m-"+(0,i.uuidv4)()),u.setAttribute("facs","#"+c),n.appendChild(u);const d=Array.from(e.querySelectorAll('section[type="neon-neume-line"]'));let h=0,f=null;for(const e of d){h+=1;const t=e.querySelector("staff");if(!t){e.remove();continue}const o=t.querySelector("layer");if(t.hasAttribute("type")&&t.getAttribute("type")!="column"+a.toString()){a+=1;const e=s.createElementNS("http://www.music-encoding.org/ns/mei","cb");e.setAttribute("n",a.toString()),e.setAttribute("xml:id","m-"+(0,i.uuidv4)()),e.setAttribute("facs","#m-"+(0,i.uuidv4)()),n.appendChild(e),f&&l(f,e,r),f=e}const c=s.createElementNS("http://www.music-encoding.org/ns/mei","sb");c.setAttribute("n",h.toString()),c.setAttribute("facs",t.getAttribute("facs")),c.setAttribute("xml:id",t.getAttribute("xml:id"));let u=void 0;for(null!==n.lastElementChild&&"custos"===n.lastElementChild.tagName&&(u=n.removeChild(n.lastElementChild)),void 0!==u&&n.appendChild(u),n.appendChild(c);null!==o.firstElementChild;)n.appendChild(o.firstElementChild);e.remove()}f&&l(f,null,r),e.appendChild(t)}if(a){const e=o.querySelector("scoreDef"),t=s.createElementNS("http://www.music-encoding.org/ns/mei","colLayout");t.setAttribute("xml:id","m-"+(0,i.uuidv4)()),t.setAttribute("n",a.toString()),e.insertAdjacentElement("afterend",t)}return r.xml(n.serializeToString(s));function l(e,t,n){const i=function e(t,n,i=[]){if(t&&t!==n){if(t.hasAttribute("facs")&&i.push(t),t.children.length>0)for(const r of t.children)e(r,n,i);t.nextElementSibling&&e(t.nextElementSibling,n,i)}return i}(e.nextElementSibling,t),r=s.createElementNS("http://www.music-encoding.org/ns/mei","zone"),o=function(e,t){let n=1/0,i=0,r=0,s=1/0;return e.forEach(e=>{const o=Array.from(t.children).find(t=>t.getAttribute("xml:id")===e.getAttribute("facs").slice(1));n=Math.min(n,parseInt(o.getAttribute("lrx"))),i=Math.max(i,parseInt(o.getAttribute("lry"))),r=Math.max(r,parseInt(o.getAttribute("ulx"))),s=Math.min(s,parseInt(o.getAttribute("uly")))}),{lrx:n,lry:i,ulx:r,uly:s}}(i,n);r.setAttribute("lrx",o.lrx.toString()),r.setAttribute("lry",o.lry.toString()),r.setAttribute("ulx",o.ulx.toString()),r.setAttribute("uly",o.uly.toString()),r.setAttribute("xml:id",e.getAttribute("facs").slice(1)),n.insertBefore(r,n.firstElementChild)}},t.getSyllableText=a,t.isInvalidBBox=c,t.convertToVerovio=function(e){const t=(new DOMParser).parseFromString(e,"text/xml"),n=t.documentElement;let a=!1;n.querySelector("facsimile").setAttribute("type","transcription");const f=n.querySelector("surface");let g=!1;const p=Array.from(f.getElementsByTagName("zone"));let m="The following zones are invalid: \n\n";for(const e of p){const[t,i]=c(n,e);t&&(g=!0,m+=`- Zone with xml:id: ${e.getAttribute("xml:id")} `,i?(i.parentNode.removeChild(i),m+=`for <${i.tagName}> with xml:id: ${i.getAttribute("xml:id")}\n`):m+="is not linked with any glyphs\n",e.parentNode.removeChild(e))}g&&s.queueNotification("Removed invalid zones contained in this file","warning",m);const v=n.querySelector("colLayout");v&&(a=!0,v.parentNode.removeChild(v));const y=Array.from(n.getElementsByTagName("syllable"));let b=!1,w=!1,_=!1,E="The following divLine(s) are the only element inside the syllable(s): \n\n",S=!1,x="The following accid(s) are the only element inside the syllable(s): \n\n",L="The following syllable(s) have no neumes: \n\n",A="The following neume(s) have no neume components: \n\n";for(const e of y){0===e.getElementsByTagName("neume").length&&(b=!0,L+=`- <${e.tagName}> with xml:id: ${e.getAttribute("xml:id")}\n`,e.getElementsByTagName("divLine").length>0&&(_=!0,E+=`- <divLine> inside <syllable> with xml:id: ${e.getAttribute("xml:id")}\n`),e.getElementsByTagName("accid").length>0&&(S=!0,x+=`- <accid> inside <syllable> with xml:id: ${e.getAttribute("xml:id")}\n`));const n=e.getElementsByTagName("neume");for(const e of n){const n=Array.from(e.getElementsByTagName("nc"));if(0===n.length)w=!0,A+=`- <${e.tagName}> with xml:id: ${e.getAttribute("xml:id")}\n`;else for(const e of n)if(e.hasAttribute("curve")&&0===e.children.length){const n=t.createElementNS("http://www.music-encoding.org/ns/mei","liquescent");n.setAttribute("xml:id","m-"+(0,i.uuidv4)()),e.appendChild(n)}}}b&&s.queueNotification("This file contains syllable(s) without neume!","warning",L),w&&s.queueNotification("This file contains neume(s) without neume component!","warning",A),_&&s.queueNotification("This file contains divLine(s) inside empty syllable(s)!","warning",E),S&&s.queueNotification("This file contains accid(s) inside empty syllable(s)!","warning",x);const k=Array.from(n.getElementsByTagName("section"));for(const e of k){const n=Array.from(e.getElementsByTagName("staff"));for(const r of n){const n=t.createElementNS("http://www.music-encoding.org/ns/mei","pb");n.setAttribute("facs","#"+f.getAttribute("xml:id")),e.insertBefore(n,r);const s=r.querySelector("layer"),c=Array.from(s.getElementsByTagName("sb"));for(const e of c)if("layer"!==e.parentElement.tagName){const n=e.parentElement;let r=!1,s=!1;const o=Array.from(n.children),a=o.indexOf(e);for(const e of n.getElementsByTagName("neume")){const t=o.indexOf(e);ta&&(s=!0)}if(!r&&s)n.insertAdjacentElement("beforebegin",e);else if(r&&!s)n.insertAdjacentElement("afterend",e);else if(r&&s){const r=t.createElementNS("http://www.music-encoding.org/ns/mei","syllable");r.setAttribute("xml:id","m-"+(0,i.uuidv4)()),r.setAttribute("follows","#"+n.getAttribute("xml:id")),n.setAttribute("precedes","#"+r.getAttribute("xml:id"));const s=o.indexOf(e);for(const e of o){o.indexOf(e)>s&&r.appendChild(e)}n.insertAdjacentElement("afterend",e),e.insertAdjacentElement("afterend",r);for(const e of n.getElementsByTagName("custos"))n.insertAdjacentElement("afterend",e);for(const e of r.getElementsByTagName("clef"))r.insertAdjacentElement("beforebegin",e)}else console.warn("NONE BEHIND NONE AHEAD"),console.debug(n)}const l=Array.from(s.getElementsByTagName("sb")),u=Array.from(s.children);let d=0;for(let n=0;nn+1?l[n+1]:void 0,m=t.createElementNS("http://www.music-encoding.org/ns/mei","sb");m.setAttribute("xml:id","m-"+(0,i.uuidv4)()),m.setAttribute("facs",c.getAttribute("facs"));const v=t.createElementNS("http://www.music-encoding.org/ns/mei","section");v.setAttribute("type","neon-neume-line");const y=t.createElementNS("http://www.music-encoding.org/ns/mei","staff");o(c,y),y.setAttribute("n","1");const b=u.indexOf(c);if(a){if("cb"===u.at(b-1).tagName){d+=1;const e=u.at(b-1),t=e.getAttribute("facs"),n=Array.from(f.querySelectorAll("zone")).find(e=>e.getAttribute("xml:id")===t.slice(1));e.parentNode.removeChild(e),n.parentNode.removeChild(n)}y.setAttribute("type","column"+d.toString())}const w=t.createElementNS("http://www.music-encoding.org/ns/mei","layer");w.setAttribute("n","1"),w.setAttribute("xml:id","m-"+(0,i.uuidv4)()),v.appendChild(y),y.appendChild(w);const _=Array.from(s.children),E=_.slice(_.indexOf(c)+1,_.indexOf(g));for(const e of E)w.appendChild(e);if(!g){const e=h(_.at(-1),[]);for(const t of e){const e=p.find(e=>e.getAttribute("xml:id")==t.getAttribute("facs").slice(1));e&&p.length>1&&e.parentNode.removeChild(e)}}e.insertBefore(m,r),e.insertBefore(v,r)}r.remove()}}const C=Array.from(n.getElementsByTagName("syllable"));let I=!1,P="The following linked syllables are not encoded correctly: \n\n",O=!1,B="The following obliques are incomplete: \n\n";for(const e of n.querySelectorAll("syllable")){for(const t of e.querySelectorAll("clef"))e.insertAdjacentElement("beforebegin",t);for(const t of e.querySelectorAll("custos"))e.insertAdjacentElement("afterend",t);const t=d(e);t&&(O=!0,B+=t);const n=C.indexOf(e);if(e.hasAttribute("precedes")){const t=l(e,n,C);t&&(I=!0,P+=t)}if(e.hasAttribute("follows")){const t=u(e,C);t&&(I=!0,P+=t)}}O&&s.queueNotification("This file contains incomplete oblique(s)","error",B),I&&s.queueNotification("This file contains invalid linked syllable(s)","error",P);const T=new XMLSerializer;return r.xml(T.serializeToString(t))},t.checkOutOfBoundsGlyphs=function(e){const t=(new DOMParser).parseFromString(e,"text/xml").documentElement,n=Array.from(t.querySelectorAll("zone")),i=t.querySelector("surface"),r=Number(i.getAttribute("lrx")),o=Number(i.getAttribute("lry"));let a="The following glyphs are out of bounds: \n\n";n.some(e=>{const n=["ulx","uly","lrx","lry"].some(t=>function(e,t){const n=Number(e.getAttribute(t));return n<0||n>("lrx"==t||"ulx"==t?r:o)}(e,t));if(n){const n=t.querySelector(`*[facs="${"#"+e.getAttribute("xml:id")}"]`);a+=`- <${n.tagName}> with xml:id: ${n.getAttribute("xml:id")}\n`}return n})&&s.queueNotification("This folio contains glyph(s) placed out-of-bounds!","warning",a)},t.removeColumnLabel=function(e){const t=(new DOMParser).parseFromString(e,"text/xml").documentElement;for(const e of Array.from(t.getElementsByTagName("staff")))e.hasAttribute("type")&&e.removeAttribute("type");const n=new XMLSerializer;return r.xml(n.serializeToString(t))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.blankPage=t.sendForValidation=t.init=void 0;const i=n(13),r=fetch("/Neon/Neon-gh/assets/mei-all.rng");let s,o,a,c;function l(e){const t=e.data;if(null===t){c.textContent="VALID",c.style.color="#4bc14b";for(const e of c.children)e.remove()}else{let e="";t.forEach(t=>{e+=t+"\n"}),c.textContent="",c.style.color="red";const n=document.createElement("div");n.textContent="INVALID",n.style.cursor="pointer",c.appendChild(n),n.addEventListener("click",u.bind(this,e))}}function u(e){this.modal.setModalWindowView(i.ModalWindowView.ERROR_LOG,e),this.modal.openModalWindow()}t.init=async function(e){if(null!==document.getElementById("file-status")){const t=document.getElementById("mei_version");t.textContent="unknown",a=t;const n=document.getElementById("validation_status");n.textContent="unknown",c=n,s=new Worker("/Neon/Neon-gh/workers/Worker.js"),s.onmessage=l.bind(e)}},t.sendForValidation=async function(e){if(void 0===c||void 0===a)return;if(void 0===o){const e=await r;o=await e.text()}c.textContent="checking...",c.style.color="gray",s.postMessage({mei:e,schema:o}),a.textContent="checking...",a.style.color="gray",function(e){if(e)switch(e){case"unknown":a.textContent=e,a.style.color="gray";break;default:a.textContent=e,a.style.color="#68A7AD"}}(await async function(e){const t=(new DOMParser).parseFromString(e,"text/xml"),n=t.documentElement.getAttribute("meiversion");return n||"unknown"}(e))},t.blankPage=function(){if(void 0!==c&&void 0!==a){for(const e of c.children)e.remove();c.textContent="No MEI",c.style.color="color:gray",a.textContent="No MEI",a.style.color="color:gray"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.listenUnsavedChanges=t.setSavedStatus=void 0;let i=!0;t.setSavedStatus=function(e=!1){i=e,function(){const e=document.querySelector("#file-saved"),t=i?"/Neon/Neon-gh/assets/img/saved-icon.svg":"/Neon/Neon-gh/assets/img/unsaved-icon.svg";e.setAttribute("src",t);const n=i?"Your work is saved":"You have unsaved work";e.setAttribute("alt",n)}()},t.listenUnsavedChanges=function(){window.onbeforeunload=e=>{if(!i)return e.preventDefault(),"You have unsaved changes!"}}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){(function(i){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let i=0,r=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(i++,"%c"===e&&(r=i))}),t.splice(r,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==i&&"env"in i&&(e=i.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(79)(t);const{formatters:r}=e.exports;r.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,n(29))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initSelectionButtons=t.initInsertEditControls=t.bindInsertTabs=void 0;const i=n(8),r=n(18),s=n(4),o=n(3);function a(e,t){document.getElementById(e).classList.add("is-active"),document.getElementById(e).classList.contains("insertel")&&(t.insertActive(e),(0,o.setSettings)({insertMode:e}))}function c(e){document.querySelectorAll(e).forEach(e=>{e.classList.remove("is-active"),e.classList.remove("unfocused")})}t.bindInsertTabs=function(e){const t=Array.from(document.getElementsByClassName("insertTab")).map(e=>e.id);document.body.addEventListener("keydown",e=>{if(e.code.match(/^Digit\d$/)&&e.shiftKey)try{const t=Number(e.code[e.code.length-1])-1,n=document.getElementsByClassName("insertel");n[t].click()}catch(e){console.debug(e)}}),t.forEach(t=>{document.getElementById(t).addEventListener("click",()=>{c(".insertTab"),a(t,e),(0,o.setSettings)({insertTab:t}),document.getElementById("insert_data").innerHTML=i.insertTabHtml[t],function(e){const t=Array.from(document.getElementsByClassName("insertel"));t.map(e=>e.id).forEach(t=>{document.getElementById(t).addEventListener("click",()=>{c(".insertel"),a(t,e)})})}(e),c(".insertel");try{const{insertMode:t}=(0,o.getSettings)();a(t,e)}catch(t){a(document.getElementsByClassName("insertel")[0].id,e)}})})},t.initInsertEditControls=function(){const e=document.getElementById("insert_controls"),t=document.getElementById("insertMenu"),n=t.querySelector(".panel-heading-title"),i=document.getElementById("insertContents"),r=t.querySelector("svg > use"),s=document.getElementById("edit_controls"),a=document.getElementById("editMenu"),c=a.querySelector(".panel-heading-title"),l=document.getElementById("editContents"),u=a.querySelector("svg > use");e.addEventListener("click",()=>{c.classList.remove("focused"),n.classList.add("focused"),(0,o.setSettings)({userMode:"insert"}),document.querySelector(".insertel.is-active").click(),s.querySelector(".side-panel-btn.sel-by.is-active").classList.add("unfocused"),e.querySelector(".side-panel-btn.insertel.is-active").classList.remove("unfocused")}),s.addEventListener("click",()=>{n.classList.remove("focused"),c.classList.add("focused"),(0,o.setSettings)({userMode:"edit"}),e.querySelector(".side-panel-btn.insertel.is-active").classList.add("unfocused"),s.querySelector(".side-panel-btn.sel-by.is-active").classList.remove("unfocused")}),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),r.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),r.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),a.addEventListener("click",e=>{e.stopPropagation(),l.classList.contains("closed")?(l.classList.remove("closed"),l.style.padding="0.5em 0.75em",setTimeout(()=>{l.style.overflow="visible"},200),u.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(l.classList.add("closed"),l.style.overflow="hidden",setTimeout(()=>{l.style.padding="0px"},200),u.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})},t.initSelectionButtons=function(){const e=document.getElementById("selBySyllable"),t=document.getElementById("selByNeume"),n=document.getElementById("selByNc"),i=document.getElementById("selByStaff"),a=document.getElementById("selByLayerElement");e.addEventListener("click",(function(){if(!e.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selBySyllable"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),e.classList.add("is-active"),t.classList.remove("is-active"),n.classList.remove("is-active"),i.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("syllable")}catch(e){}}})),t.addEventListener("click",(function(){if(!t.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByNeume"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),t.classList.add("is-active"),n.classList.remove("is-active"),e.classList.remove("is-active"),i.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("neume")}catch(e){}}})),n.addEventListener("click",(function(){if(!n.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByNc"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),n.classList.add("is-active"),t.classList.remove("is-active"),e.classList.remove("is-active"),i.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("neume")}catch(e){}}})),i.addEventListener("click",(function(){if(!i.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByStaff"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),i.classList.add("is-active"),t.classList.remove("is-active"),n.classList.remove("is-active"),e.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("staff")}catch(e){}}})),a.addEventListener("click",(function(){if(!a.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByLayerElement"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),a.classList.add("is-active"),t.classList.remove("is-active"),n.classList.remove("is-active"),i.classList.remove("is-active"),e.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("layerElement")}catch(e){}}})),document.body.addEventListener("keydown",r=>{"1"===r.key&&e.click(),"2"===r.key&&t.click(),"3"===r.key&&n.click(),"4"===r.key&&i.click(),"5"===r.key&&a.click()})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),s=n(5),o=n(3);t.default=class{constructor(e,t){this.firstClick=!0,this.insertDisabled=function(){this.type="",this.removeInsertClickHandlers(),document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetInsertHandler),document.body.removeEventListener("click",this.clickawayHandler),this.firstClick=!0;try{document.getElementById("returnToEditMode").remove()}catch(e){}const e=document.getElementById("insert_controls"),t=document.getElementById("insertMenu").querySelector(".panel-heading-title"),n=document.getElementById("edit_controls"),i=document.getElementById("editMenu").querySelector(".panel-heading-title");t.classList.remove("focused"),i.classList.add("focused"),e.querySelector(".side-panel-btn.insertel.is-active").classList.add("unfocused"),n.querySelector(".side-panel-btn.sel-by.is-active").classList.remove("unfocused"),(0,o.setSettings)({userMode:"edit"})}.bind(this),this.clickawayHandler=function(e){const t=e.target;null===t.closest(".active-page")&&null===t.closest("#insert_controls")&&null===t.closest("#svg_group")&&(this.insertDisabled(),document.body.removeEventListener("keydown",this.staffHandler),document.body.removeEventListener("keydown",this.handler))}.bind(this),this.resetInsertHandler=function(e){"Shift"===e.key&&document.querySelector(this.selector).addEventListener("click","staff"===this.type?this.staffHandler:this.handler)}.bind(this),this.keydownListener=function(e){"Escape"===e.key?(this.insertDisabled(),document.body.removeEventListener("keydown",this.staffHandler),document.body.removeEventListener("keydown",this.handler)):"Shift"===e.key&&this.removeInsertClickHandlers()}.bind(this),this.handler=function(e){e.stopPropagation();const t=(0,r.getSVGRelCoords)(e.clientX,e.clientY);if((0,r.isOutOfSVGBounds)(t.x,t.y))return(0,s.queueNotification)("[FAIL] Glyph was placed out of bounds! Insertion failed.","error");const n={action:"insert",param:{elementType:this.type,staffId:"auto",ulx:t.x,uly:t.y}};null!==this.attributes&&(n.param.attributes=this.attributes,"F"===this.attributes.shape&&(n.param.ulx-=50)),this.neonView.edit(n,this.neonView.view.getCurrentPageURI()).then(()=>this.neonView.updateForCurrentPage()).then(()=>{document.querySelector(this.selector).addEventListener("click",this.handler)})}.bind(this),this.staffHandler=function(e){const t=(0,r.getSVGRelCoords)(e.clientX,e.clientY);if((0,r.isOutOfSVGBounds)(t.x,t.y))return(0,s.queueNotification)("Staff cannot be placed out of bounds!","error");const n=document.querySelector(".active-page > .definition-scale");if(this.firstClick)this.coord=t,i.select(n).append("circle").attr("cx",t.x).attr("cy",t.y).attr("r",10).attr("id","staff-circle").attr("fill","green"),this.firstClick=!1;else{let e,n;t.x{this.neonView.updateForCurrentPage(),this.firstClick=!0})}}.bind(this),this.removeInsertClickHandlers=function(){try{document.querySelector(this.selector).removeEventListener("click",this.staffHandler),document.querySelector(this.selector).removeEventListener("click",this.handler)}catch(e){}}.bind(this),this.neonView=e,this.selector=t}insertActive(e){const t=this.isInsertMode();switch(e){case"punctum":this.type="nc",this.attributes=null;break;case"diamond":this.type="nc",this.attributes={tilt:"se"};break;case"virga":this.type="nc",this.attributes={tilt:"s"};break;case"liquescentA":this.type="nc",this.attributes={curve:"a"};break;case"liquescentC":this.type="nc",this.attributes={curve:"c"};break;case"virgaReversed":this.type="nc",this.attributes={tilt:"n"};break;case"pes":case"clivis":case"scandicus":case"climacus":case"torculus":case"porrectus":case"pressus":const t=this.neonView.info.getContourByValue(e.charAt(0).toUpperCase()+e.slice(1));this.type="grouping",this.attributes={contour:t};break;case"cClef":case"fClef":this.type="clef",this.attributes={shape:e.charAt(0).toUpperCase()};break;case"custos":this.type="custos",this.attributes=null;break;case"divLineMaxima":this.type="divLine",this.attributes={form:"maxima"};break;case"staff":this.type="staff",this.attributes=null;break;case"flat":this.type="accid",this.attributes={accid:"f"};break;case"natural":this.type="accid",this.attributes={accid:"n"};break;default:return this.type="",this.attributes=null,void console.error("Invalid button for insertion: "+e+".")}this.removeInsertClickHandlers();try{"staff"===this.type?document.querySelector(this.selector).addEventListener("click",this.staffHandler):document.querySelector(this.selector).addEventListener("click",this.handler)}catch(e){}if(document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetInsertHandler),!t){const e=document.createElement("button");e.id="returnToEditMode",e.classList.add("side-panel-btn"),e.innerHTML="Return to Edit Mode",document.getElementById("redo").parentNode.appendChild(e),e.addEventListener("click",this.insertDisabled)}document.getElementById("editContents").addEventListener("click",this.clickawayHandler)}isInsertMode(){return""!==this.type}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.undoRedoPanel=t.navbarFinalize=t.navbarDropdownMEIActionsMenu=t.navbarDropdownFileMenu=void 0,t.navbarDropdownFileMenu=document.createElement("div"),t.navbarDropdownFileMenu.classList.add("navbar-item","has-dropdown","is-hoverable");const i=document.createElement("div");i.classList.add("navbar-btn"),i.innerHTML="
File
";const r=document.createElement("div");r.classList.add("navbar-dropdown"),r.id="navbar-dropdown-options";[["save","Save"],["export","Save and Export to File"],["getmei","Download MEI"]].forEach(e=>{const t=document.createElement("div");t.id=e[0],t.classList.add("navbar-dropdown-item"),t.textContent=e[1],r.appendChild(t)}),t.navbarDropdownFileMenu.appendChild(i),t.navbarDropdownFileMenu.appendChild(r),t.navbarDropdownMEIActionsMenu=document.createElement("div"),t.navbarDropdownMEIActionsMenu.classList.add("navbar-item","has-dropdown","is-hoverable");const s=document.createElement("div");s.classList.add("navbar-btn"),s.innerHTML="
MEI Actions
";const o=document.createElement("div");o.classList.add("navbar-dropdown"),o.id="navbar-dropdown-options";[["remove-empty-syls","Remove Empty Syllables"],["remove-empty-neumes","Remove Empty Neumes"],["revert","Revert"]].forEach(e=>{const t=document.createElement("div");t.id=e[0],t.classList.add("navbar-dropdown-item"),t.textContent=e[1],o.appendChild(t)}),t.navbarDropdownMEIActionsMenu.appendChild(s),t.navbarDropdownMEIActionsMenu.appendChild(o),t.navbarFinalize=' Finalize MEI ',t.undoRedoPanel='\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initUndoRedoPanel=t.initNavbar=void 0;const i=n(5),r=n(47);function s(e){const t=new Array;for(const n of e)n&&!n.getElementsByTagName("syl").length&&t.push({action:"setText",param:{elementId:n.getAttribute("xml:id"),text:""}});return t}t.initNavbar=function(e){const t=document.querySelectorAll(".navbar-item.has-dropdown.is-hoverable");Array.from(t).forEach(e=>{e.addEventListener("mouseover",()=>{})}),document.getElementById("save").addEventListener("click",()=>{e.save().then(()=>{i.queueNotification("Saved","success")})}),document.body.addEventListener("keydown",t=>{"s"===t.key&&e.save().then(()=>{i.queueNotification("Saved","success")})}),document.getElementById("export").addEventListener("click",()=>{e.export().then(t=>{const n=document.createElement("a");n.href=t,n.download=e.name+".jsonld",document.body.appendChild(n),n.click(),n.remove(),i.queueNotification("Saved","success")})}),document.getElementById("getmei").addEventListener("click",()=>{const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(t=>{const n="data:application/mei+xml;base64,"+window.btoa((0,r.convertToNeon)(t));document.getElementById("getmei").setAttribute("href",n),document.getElementById("getmei").setAttribute("download",e.view.getPageName()+".mei")})}),document.getElementById("remove-empty-syls").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(n=>{const r=(new DOMParser).parseFromString(n,"text/xml").documentElement,s=Array.from(r.getElementsByTagName("syllable"));let o=!1;const a=[];for(const e of s)if(0===e.getElementsByTagName("neume").length){const t={action:"remove",param:{elementId:e.getAttribute("xml:id")}};a.push(t),o=!0}if(o){const n={action:"chain",param:a};e.edit(n,t).then(t=>{t?(e.updateForCurrentPage(),i.queueNotification("Removed empty Syllables","success")):i.queueNotification("Failed to remove empty Syllables","error")})}else i.queueNotification("No empty syllables found","warning")})})),document.getElementById("remove-empty-neumes").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(n=>{const r=(new DOMParser).parseFromString(n,"text/xml").documentElement,s=Array.from(r.getElementsByTagName("neume"));let o=!1;const a=[];for(const e of s)if(0===e.getElementsByTagName("nc").length){const t={action:"remove",param:{elementId:e.getAttribute("xml:id")}};a.push(t),o=!0}if(o){const n={action:"chain",param:a};e.edit(n,t).then(t=>{t?(e.updateForCurrentPage(),i.queueNotification("Removed empty Neumes","success")):i.queueNotification("Failed to remove empty Neumes","error")})}else i.queueNotification("No empty Neumes found","warning")})})),document.getElementById("remove-out-of-bounds-glyphs").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(n=>{const r=(new DOMParser).parseFromString(n,"text/xml").documentElement,s=r.querySelector("surface"),o=Number(s.getAttribute("lrx")),a=Number(s.getAttribute("lry"));const c=Array.from(r.querySelectorAll("zone")).filter(e=>["ulx","uly","lrx","lry"].some(t=>function(e,t){const n=Number(e.getAttribute(t));return n<0||n>("lrx"==t||"ulx"==t?o:a)}(e,t))),l=new Map(c.map(e=>[e.getAttribute("xml:id"),e])),u=Array.from(r.querySelectorAll("nc, divLine, clef, accid")).filter(e=>{if(e.hasAttribute("facs")){const t=e.getAttribute("facs").slice(1);return l.has(t)}return!1});if(0===u.length)return i.queueNotification("There are no out-of-bound glyphs to remove.","warning");const d={action:"chain",param:u.map(e=>({action:"remove",param:{elementId:e.getAttribute("xml:id")}}))};e.edit(d,t).then(t=>{t?(e.updateForCurrentPage(),i.queueNotification("Successfully removed out-of-bounds syllables.","success")):i.queueNotification("Failed to remove out-of-bound syllables.","error")})})})),document.getElementById("untoggle-invalid-oblique").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(t=>{const n=(new DOMParser).parseFromString(t,"text/xml").documentElement,r=Array.from(n.getElementsByTagName("nc"));let s=!1;const o={action:"chain",param:[]},a=new Array;let c=0;for(;c{t?i.queueNotification("Untoggled invalid obliques","success"):i.queueNotification("Failed to untoggle invalid obliques","error"),e.updateForCurrentPage()})):i.queueNotification("No invalid obliques found","warning")})})),document.getElementById("untoggle-invalid-syls").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(t=>{const n=(new DOMParser).parseFromString(t,"text/xml").documentElement,r=Array.from(n.getElementsByTagName("syllable")),o=function(e){const t=[];for(let n=0;ne.getAttribute("xml:id")===r&&(s=t,!0));o||t.push(i),o.hasAttribute("follows")||t.push(i),o.getAttribute("follows")!="#"+i.getAttribute("xml:id")&&t.push(i),s!==n+1&&t.push(i)}if(i.hasAttribute("follows")){const n=i.getAttribute("follows").replace("#",""),r=e.find(e=>e.getAttribute("xml:id")===n);r||t.push(i),r.hasAttribute("precedes")||t.push(i),r.getAttribute("precedes")!="#"+i.getAttribute("xml:id")&&t.push(i)}}return t}(r);if(0===o.length)i.queueNotification("No invalid syllables found","warning");else{const t={action:"chain",param:[]},n=new Array;for(const e of o)if(e.hasAttribute("precedes")&&e.hasAttribute("follows")){const t=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("precedes").substring(1)),i=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("follows").substring(1));n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push({action:"set",param:{elementId:t.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push({action:"set",param:{elementId:i.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push(...s([e,t,i]))}else if(e.hasAttribute("precedes")){const t=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("precedes").substring(1));n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push({action:"set",param:{elementId:t.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push(...s([e,t]))}else if(e.hasAttribute("follows")){const t=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("follows").substring(1));n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push({action:"set",param:{elementId:t.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push(...s([e,t]))}t.param=n,e.edit(t,e.view.getCurrentPageURI()).then(t=>{t?i.queueNotification("Untoggled invalid syllables","success"):i.queueNotification("Failed to untoggle invalid syllables","error"),e.updateForCurrentPage()})}})})),document.getElementById("revert").addEventListener("click",(function(){window.confirm("Reverting will cause all changes to be lost. Press OK to continue.")&&e.deleteDb().then(()=>{window.location.reload()})}))},t.initUndoRedoPanel=function(e){function t(){e.undo().then(t=>{t?e.updateForCurrentPage():(i.queueNotification("There is nothing left to undo."),console.warn("Failed to undo action"))})}function n(){e.redo().then(t=>{t?e.updateForCurrentPage():(i.queueNotification("There is nothing left to redo."),console.warn("Failed to redo action"))})}document.getElementById("undo").addEventListener("click",t),document.body.addEventListener("keydown",e=>{"z"===e.key&&(e.ctrlKey||e.metaKey)&&t()}),document.getElementById("redo").addEventListener("click",n),document.body.addEventListener("keydown",e=>{("Z"===e.key||"z"===e.key&&e.shiftKey)&&(e.ctrlKey||e.metaKey)&&n()})}},,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(59),r=n(75),s=n(76),o=n(81),a=n(83),c=n(84),l=n(85),u=n(86),d=n(87),h=n(28),f=p("manifest"),g=p("storage");if(f){const e=`./samples/manifests/${f}.jsonld`;window.fetch(e).then(e=>{if(e.ok)return e.text();throw new Error(e.statusText)}).then(async e=>{let t;try{t=JSON.parse(e)}catch(t){return console.error(t),void console.debug(e)}let n;n=(await new Promise((e,n)=>{window.fetch(t.image).then(t=>{e(t.headers.get("Content-Type"))}).catch(e=>{n(e)})})).match(/image\/*/)?{manifest:t,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:o.default,NeumeEdit:c.default}:{manifest:t,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:s.default,NeumeEdit:a.default};new i.default(n).start()})}else{new h.default("Neon-User-Storage").getAttachment(g,"manifest").then(e=>new window.Response(e).json()).then(async e=>{let t;t=(await new Promise((t,n)=>{window.fetch(e.image).then(e=>{t(e.headers.get("Content-Type"))}).catch(e=>{n(e)})})).match(/image\/*/)?{manifest:e,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:o.default,NeumeEdit:c.default}:{manifest:e,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:s.default,NeumeEdit:a.default};new i.default(t).start()})}function p(e){let t;return window.location.search.substr(1).split("&").forEach(n=>{const i=n.split("=");i[0]===e&&(t=decodeURIComponent(i[1]))}),t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(60),r=n(48),s=n(62),o=n(73),a=n(13),c=n(74),l=n(49),u=n(3);t.default=class{constructor(e){(0,s.parseManifest)(e.manifest)||console.error("Unable to parse the manifest"),this.params=e,this.manifest=e.manifest}setupEdit(e){if(void 0!==e.TextView&&(this.textView=new e.TextView(this),void 0!==e.TextEdit&&(this.TextEdit=new e.TextEdit(this))),void 0!==e.NeumeEdit){this.NeumeEdit=new e.NeumeEdit(this),this.textView.updateBBoxVisibility();const{userMode:t,insertMode:n,selectionMode:i}=(0,u.getSettings)();switch(document.getElementById(n).classList.add("is-active"),document.getElementById(i).classList.add("is-active"),t){case"insert":document.getElementById(n).click();break;case"edit":default:document.getElementById(i).click()}}}start(){(0,o.default)(this).then(()=>(this.localSettings=new u.default(this.manifest["@id"]),this.view=new this.params.View(this,this.params.Display,this.manifest.image),this.name=this.manifest.title,this.core=new i.default(this.manifest),this.info=new this.params.Info(this),this.modal=new a.ModalWindow(this),r.init(this),(0,c.setDebugMode)(),(0,l.listenUnsavedChanges)(),this.setupEdit(this.params),this.core.initDb())).then(()=>this.updateForCurrentPage(!0)).then(()=>{this.view.onSVGLoad()})}updateForCurrentPage(e=!1){const t=this.view.getCurrentPage();return this.view.changePage(t,e)}redo(){return(0,l.setSavedStatus)(!1),this.core.redo(this.view.getCurrentPageURI())}undo(){return(0,l.setSavedStatus)(!1),this.core.undo(this.view.getCurrentPageURI())}getUserMode(){const{userMode:e}=(0,u.getSettings)();return e}edit(e,t){return this.core.edit(e,t)}getElementAttr(e,t){return this.core.getElementAttr(e,t)}export(){return new Promise((e,t)=>{this.core.updateDatabase().then(()=>{this.manifest.mei_annotations=this.core.getAnnotations(),this.manifest.timestamp=(new Date).toISOString();const t=new window.Blob([JSON.stringify(this.manifest,null,2)],{type:"application/ld+json"}),n=new FileReader;n.addEventListener("load",()=>{e(n.result)}),n.readAsDataURL(t)}).catch(e=>{t(e)})})}save(){return(0,l.setSavedStatus)(!0),this.core.updateDatabase()}deleteDb(){return this.core.deleteDb()}getPageURI(e){return void 0===e&&(e=this.view.getCurrentPageURI()),new Promise(t=>{this.core.getMEI(e).then(e=>{t("data:application/mei+xml;charset=utf-8,"+encodeURIComponent(e))})})}getPageMEI(e){return this.core.getMEI(e)}getPageSVG(e){return this.core.getSVG(e)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(47),r=n(48),s=n(61),o=n(17),a=n(28),c=n(49);t.default=class{constructor(e){this.verovioWrapper=new s.default,this.undoStacks=new Map,this.redoStacks=new Map,this.neonCache=new Map,this.parser=new DOMParser,this.db=new a.default("Neon"),this.blankPages=[],this.manifest=e,this.annotations=e.mei_annotations,this.lastPageLoaded=""}getAnnotations(){return this.annotations}async initDb(e=!1){return await new Promise((t,n)=>{this.db.get(this.manifest["@id"]).catch(e=>{if("not_found"===e.name){const e={_id:this.manifest["@id"],timestamp:this.manifest.timestamp,image:this.manifest.image,title:this.manifest.title,annotations:[]};return this.annotations.forEach(t=>{e.annotations.push(t.id)}),e}return console.error(e),n(e)}).then(async i=>{const r=/(.+[-+\u2212]\d\d)(\d\d)$/;if(new Date(i.timestamp).getTime()>(r.test(this.manifest.timestamp)?new Date(this.manifest.timestamp.replace(r,"$1:$2")).getTime():new Date(this.manifest.timestamp).getTime())&&!e){this.annotations=[];const e=i.annotations.map(e=>new Promise(t=>{this.db.get(e).then(e=>{this.annotations.push({id:e._id,type:"Annotation",body:e.body,target:e.target}),t("")}).catch(e=>{console.error(e),t("")})}));return await Promise.all(e),t(!1)}for(const e of this.annotations)await this.db.get(e.id).catch(t=>"not_found"===t.name?{_id:e.id}:(console.error(t),n(t))).then(t=>(t.body=e.body,t.target=e.target,this.db.put(t))).catch(e=>{n(e),console.error(e)});return this.db.put(i)}).then(()=>t(!0)).catch(e=>{n(e),console.error(e)})})}loadPage(e){return new Promise((t,n)=>{if(this.lastPageLoaded===e&&this.neonCache.has(e))t(this.neonCache.get(e));else if(this.neonCache.has(e))this.loadData(e,this.neonCache.get(e).mei).then(()=>{t(this.neonCache.get(e))});else if(this.blankPages.includes(e)){r.blankPage();const t=new Error("No MEI file for page "+e);t.name="missing_mei",n(t)}else{const s=this.annotations.find(t=>t.target===e);s?window.fetch(s.body).then(e=>{if(e.ok)return e.text();throw new Error(e.statusText)}).then(n=>{/]*\btype="neon-neume-line"[^>]*>/.test(n)||(n=(0,i.convertToVerovio)(n)),(0,i.checkOutOfBoundsGlyphs)(n),this.loadData(e,n).then(()=>{t(this.neonCache.get(e))})}).catch(e=>{n(e)}):(r.blankPage(),this.blankPages.push(e))}})}loadData(e,t,n=!1){return r.sendForValidation((0,i.removeColumnLabel)(t)),this.lastPageLoaded=e,new Promise(i=>{const r={id:(0,o.uuidv4)(),action:"renderData",mei:t};this.verovioWrapper.addEventListener("message",function s(o){if(o.data.id===r.id){const r=this.parser.parseFromString(o.data.svg,"image/svg+xml").documentElement;this.neonCache.set(e,{svg:r,mei:t,dirty:n}),o.target.removeEventListener("message",s),i()}}.bind(this)),this.verovioWrapper.postMessage(r)})}getSVG(e){return new Promise((t,n)=>{this.loadPage(e).then(e=>{t(e.svg)}).catch(e=>{n(e)})})}getMEI(e){return new Promise((t,n)=>{this.loadPage(e).then(e=>{t(e.mei)}).catch(e=>{n(e)})})}getElementAttr(e,t){return new Promise(n=>{this.loadPage(t).then(()=>{const t={id:(0,o.uuidv4)(),action:"getElementAttr",elementId:e};this.verovioWrapper.addEventListener("message",(function e(i){i.data.id===t.id&&(i.target.removeEventListener("message",e),n(i.data.attributes))})),this.verovioWrapper.postMessage(t)})})}edit(e,t){let n;return n=this.lastPageLoaded===t?Promise.resolve(this.neonCache.get(t)):this.loadPage(t),new Promise(i=>{n.then(n=>{n.svg=null;const r=n.mei,s={id:(0,o.uuidv4)(),action:"edit",editorAction:e};this.verovioWrapper.addEventListener("message",function e(n){if(n.data.id===s.id){if(n.data.result){this.undoStacks.has(t)||this.undoStacks.set(t,[]);const e=this.undoStacks.get(t);e.push(r)>10&&this.undoStacks.set(t,e.slice(1)),this.redoStacks.set(t,[])}n.target.removeEventListener("message",e),this.updateCache(t,!0).then(()=>{i(n.data.result)}),(0,c.setSavedStatus)(!1)}}.bind(this)),this.verovioWrapper.postMessage(s)})})}updateCache(e,t){return new Promise(n=>{let s,a;const c=new Promise(e=>{const t={id:(0,o.uuidv4)(),action:"getMEI"};this.verovioWrapper.addEventListener("message",(function n(o){o.data.id===t.id&&(s=o.data.mei,o.target.removeEventListener("message",n),r.sendForValidation((0,i.removeColumnLabel)(s)),e(""))})),this.verovioWrapper.postMessage(t)}),l=new Promise(e=>{const t={id:(0,o.uuidv4)(),action:"renderToSVG"};this.verovioWrapper.addEventListener("message",(function n(i){i.data.id===t.id&&(a=i.data.svg,i.target.removeEventListener("message",n),e(""))})),this.verovioWrapper.postMessage(t)});c.then(()=>l).then(()=>{const i=this.parser.parseFromString(a,"image/svg+xml").documentElement;this.neonCache.set(e,{mei:s,svg:i,dirty:t}),n()})})}info(e){let t;return t=this.lastPageLoaded===e?Promise.resolve():this.loadPage(e),new Promise(e=>{t.then(()=>{const t={id:(0,o.uuidv4)(),action:"editInfo"};this.verovioWrapper.addEventListener("message",(function n(i){i.data.id===t.id&&(i.target.removeEventListener("message",n),e(i.data.info))})),this.verovioWrapper.postMessage(t)})})}undo(e){return new Promise(async t=>{if(!this.undoStacks.has(e))return t(!1);const n=this.undoStacks.get(e).pop();if(!n)return t(!1);const i=await this.getMEI(e);return this.redoStacks.get(e).push(i),await this.loadData(e,n,!0),t(!0)})}redo(e){return new Promise(async t=>{if(!this.redoStacks.has(e))return t(!1);const n=this.redoStacks.get(e).pop();if(!n)return t(!1);const i=await this.getMEI(e);return this.undoStacks.get(e).push(i),await this.loadData(e,n,!0),t(!0)})}async updateDatabase(){let e=!1;for(const t of this.neonCache){const n=t[0],i=t[1];if(i.dirty){e=!0;const t=this.annotations.findIndex(e=>e.target===n);let r;this.annotations[t].body.match(/^data:/)?r="data:application/mei+xml;base64,"+window.btoa(i.mei):await window.fetch(this.annotations[t].body,{method:"PUT",headers:{"Content-Type":"application/mei+xml"},body:i.mei}).then(e=>{r=e.ok?this.annotations[t].body:"data:application/mei+xml;base64,"+window.btoa(i.mei)}).catch(e=>{console.error(e),console.warn("Falling back to data URI"),r="data:application/mei+xml;base64,"+window.btoa(i.mei)}),this.annotations[t].body=r,await this.db.get(this.annotations[t].id).then(e=>(e.body=r,this.db.put(e))).then(()=>{i.dirty=!1}).catch(e=>{console.error(e)})}}e&&await this.db.get(this.manifest["@id"]).then(e=>(e.timestamp=(new Date).toISOString(),this.db.put(e))).catch(e=>{console.error(e)})}async deleteDb(){const e=await this.db.get(this.manifest["@id"]).then(e=>e.annotations);e.push(this.manifest["@id"]);const t=e.map(e=>new Promise(t=>{this.db.get(e).then(e=>this.db.remove(e)).then(()=>t())}));return Promise.all(t)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{constructor(){this.verovioWorker=new Worker("/Neon/Neon-gh/workers/VerovioWorker.js")}addEventListener(e,t){return this.verovioWorker.addEventListener(e,t)}postMessage(e){return this.verovioWorker.postMessage(e)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.parseManifest=void 0;const i=n(63),r=n(64),s=n(65);t.parseManifest=function(e){const t=(0,s.validate)(e,i),n=t.instance;if(t.errors.length>0)return console.error(t.errors),!1;const o=n["@context"];return"https://ddmal.music.mcgill.ca/Neon/contexts/1/manifest.jsonld"===o||(o[0]===r[0]&&o[1].schema===r[1].schema&&o[1].title===r[1].title&&o[1].timestamp===r[1].timestamp&&o[1].image["@id"]===r[1].image["@id"]&&o[1].image["@type"]===r[1].image["@type"]&&o[1].mei_annotations["@id"]===r[1].mei_annotations["@id"]&&o[1].mei_annotations["@type"]===r[1].mei_annotations["@type"]&&o[1].mei_annotations["@container"]===r[1].mei_annotations["@container"]||(console.error("Context mismatch"),console.error(o),console.error(r),!1))}},function(e){e.exports=JSON.parse('{"type":"object","required":["@context","title","timestamp","image","mei_annotations"],"properties":{"@context":{"type":["array","string"]},"title":{"type":"string"},"timestamp":{"type":"string"},"image":{"type":"string"},"mei_annotations":{"type":"array","items":{"type":"object","required":["id","type","body","target"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"body":{"type":"string"},"target":{"type":"string"}}}}}}')},function(e){e.exports=JSON.parse('["http://www.w3.org/ns/anno.jsonld",{"schema":"http://schema.org/","title":"schema:name","timestamp":"schema:dateModified","image":{"@id":"schema:image","@type":"@id"},"mei_annotations":{"@id":"Annotation","@type":"@id","@container":"@list"}}]')},function(e,t,n){"use strict";var i=e.exports.Validator=n(66);e.exports.ValidatorResult=n(19).ValidatorResult,e.exports.ValidatorResultError=n(19).ValidatorResultError,e.exports.ValidationError=n(19).ValidationError,e.exports.SchemaError=n(19).SchemaError,e.exports.SchemaScanResult=n(44).SchemaScanResult,e.exports.scan=n(44).scan,e.exports.validate=function(e,t,n){return(new i).validate(e,t,n)}},function(e,t,n){"use strict";var i=n(43),r=n(72),s=n(19),o=n(44).scan,a=s.ValidatorResult,c=s.ValidatorResultError,l=s.SchemaError,u=s.SchemaContext,d=function e(){this.customFormats=Object.create(e.prototype.customFormats),this.schemas={},this.unresolvedRefs=[],this.types=Object.create(f),this.attributes=Object.create(r.validators)};function h(e){var t="string"==typeof e?e:e.$ref;return"string"==typeof t&&t}d.prototype.customFormats={},d.prototype.schemas=null,d.prototype.types=null,d.prototype.attributes=null,d.prototype.unresolvedRefs=null,d.prototype.addSchema=function(e,t){var n=this;if(!e)return null;var i=o(t||"/",e),r=t||e.$id||e.id;for(var s in i.id)this.schemas[s]=i.id[s];for(var s in i.ref)this.unresolvedRefs.push(s);return this.unresolvedRefs=this.unresolvedRefs.filter((function(e){return void 0===n.schemas[e]})),this.schemas[r]},d.prototype.addSubSchemaArray=function(e,t){if(Array.isArray(t))for(var n=0;n",e);var c=s.objectGetPath(n.schemas[a],o.substr(1));if(void 0===c)throw new l("no such schema "+o+" located in <"+a+">",e);return{subschema:c,switchSchema:t}},d.prototype.testType=function(e,t,n,i,r){if(void 0!==r){if(null===r)throw new l('Unexpected null in "type" keyword');if("function"==typeof this.types[r])return this.types[r].call(this,e);if(r&&"object"==typeof r){var s=this.validateSchema(e,r,n,i);return void 0===s||!(s&&s.errors.length)}return!0}};var f=d.prototype.types={};f.string=function(e){return"string"==typeof e},f.number=function(e){return"number"==typeof e&&isFinite(e)},f.integer=function(e){return"number"==typeof e&&e%1==0},f.boolean=function(e){return"boolean"==typeof e},f.array=function(e){return Array.isArray(e)},f.null=function(e){return null===e},f.date=function(e){return e instanceof Date},f.any=function(e){return!0},f.object=function(e){return e&&"object"==typeof e&&!Array.isArray(e)&&!(e instanceof Date)},e.exports=d},function(e,t,n){(function(e,i){var r;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(s){t&&t.nodeType,e&&e.nodeType;var o="object"==typeof i&&i;o.global!==o&&o.window!==o&&o.self;var a,c=2147483647,l=/^xn--/,u=/[^\x20-\x7E]/,d=/[\x2E\u3002\uFF0E\uFF61]/g,h={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=Math.floor,g=String.fromCharCode;function p(e){throw new RangeError(h[e])}function m(e,t){for(var n=e.length,i=[];n--;)i[n]=t(e[n]);return i}function v(e,t){var n=e.split("@"),i="";return n.length>1&&(i=n[0]+"@",e=n[1]),i+m((e=e.replace(d,".")).split("."),t).join(".")}function y(e){for(var t,n,i=[],r=0,s=e.length;r=55296&&t<=56319&&r65535&&(t+=g((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=g(e)})).join("")}function w(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function _(e,t,n){var i=0;for(e=n?f(e/700):e>>1,e+=f(e/t);e>455;i+=36)e=f(e/35);return f(i+36*e/(e+38))}function E(e){var t,n,i,r,s,o,a,l,u,d,h,g=[],m=e.length,v=0,y=128,w=72;for((n=e.lastIndexOf("-"))<0&&(n=0),i=0;i=128&&p("not-basic"),g.push(e.charCodeAt(i));for(r=n>0?n+1:0;r=m&&p("invalid-input"),((l=(h=e.charCodeAt(r++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:36)>=36||l>f((c-v)/o))&&p("overflow"),v+=l*o,!(l<(u=a<=w?1:a>=w+26?26:a-w));a+=36)o>f(c/(d=36-u))&&p("overflow"),o*=d;w=_(v-s,t=g.length+1,0==s),f(v/t)>c-y&&p("overflow"),y+=f(v/t),v%=t,g.splice(v++,0,y)}return b(g)}function S(e){var t,n,i,r,s,o,a,l,u,d,h,m,v,b,E,S=[];for(m=(e=y(e)).length,t=128,n=0,s=72,o=0;o=t&&hf((c-n)/(v=i+1))&&p("overflow"),n+=(a-t)*v,t=a,o=0;oc&&p("overflow"),h==t){for(l=n,u=36;!(l<(d=u<=s?1:u>=s+26?26:u-s));u+=36)E=l-d,b=36-d,S.push(g(w(d+E%b,0))),l=f(E/b);S.push(g(w(l,0))),s=_(n,v,i==r),n=0,++i}++n,++t}return S.join("")}a={version:"1.4.1",ucs2:{decode:y,encode:b},decode:E,encode:S,toASCII:function(e){return v(e,(function(e){return u.test(e)?"xn--"+S(e):e}))},toUnicode:function(e){return v(e,(function(e){return l.test(e)?E(e.slice(4).toLowerCase()):e}))}},void 0===(r=function(){return a}.call(t,n,t,e))||(e.exports=r)}()}).call(this,n(50)(e),n(9))},function(e,t,n){"use strict";e.exports={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,n){"use strict";t.decode=t.parse=n(70),t.encode=t.stringify=n(71)},function(e,t,n){"use strict";function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,n,s){t=t||"&",n=n||"=";var o={};if("string"!=typeof e||0===e.length)return o;var a=/\+/g;e=e.split(t);var c=1e3;s&&"number"==typeof s.maxKeys&&(c=s.maxKeys);var l=e.length;c>0&&l>c&&(l=c);for(var u=0;u=0?(d=p.substr(0,m),h=p.substr(m+1)):(d=p,h=""),f=decodeURIComponent(d),g=decodeURIComponent(h),i(o,f)?r(o[f])?o[f].push(g):o[f]=[o[f],g]:o[f]=g}return o};var r=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";var i=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}};e.exports=function(e,t,n,a){return t=t||"&",n=n||"=",null===e&&(e=void 0),"object"==typeof e?s(o(e),(function(o){var a=encodeURIComponent(i(o))+n;return r(e[o])?s(e[o],(function(e){return a+encodeURIComponent(i(e))})).join(t):a+encodeURIComponent(i(e[o]))})).join(t):a?encodeURIComponent(i(a))+n+encodeURIComponent(i(e)):""};var r=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};function s(e,t){if(e.map)return e.map(t);for(var n=[],i=0;i":e+""}}));s.addError({name:"type",argument:a,message:"is not of a type(s) "+a})}return s},a.anyOf=function(e,t,n,i){if(void 0===e)return null;var o=new r(e,t,n,i),a=new r(e,t,n,i);if(!Array.isArray(t.anyOf))throw new s("anyOf must be an array");if(!t.anyOf.some(c.bind(this,e,n,i,(function(e){a.importErrors(e)})))){var l=t.anyOf.map((function(e,t){var n=e.$id||e.id;return n?"<"+n+">":e.title&&JSON.stringify(e.title)||e.$ref&&"<"+e.$ref+">"||"[subschema "+t+"]"}));n.nestedErrors&&o.importErrors(a),o.addError({name:"anyOf",argument:l,message:"is not any of "+l.join(",")})}return o},a.allOf=function(e,t,n,i){if(void 0===e)return null;if(!Array.isArray(t.allOf))throw new s("allOf must be an array");var o=new r(e,t,n,i),a=this;return t.allOf.forEach((function(t,r){var s=a.validateSchema(e,t,n,i);if(!s.valid){var c=t.$id||t.id||t.title&&JSON.stringify(t.title)||t.$ref&&"<"+t.$ref+">"||"[subschema "+r+"]";o.addError({name:"allOf",argument:{id:c,length:s.errors.length,valid:s},message:"does not match allOf schema "+c+" with "+s.errors.length+" error[s]:"}),o.importErrors(s)}})),o},a.oneOf=function(e,t,n,i){if(void 0===e)return null;if(!Array.isArray(t.oneOf))throw new s("oneOf must be an array");var o=new r(e,t,n,i),a=new r(e,t,n,i),l=t.oneOf.filter(c.bind(this,e,n,i,(function(e){a.importErrors(e)}))).length,u=t.oneOf.map((function(e,t){return e.$id||e.id||e.title&&JSON.stringify(e.title)||e.$ref&&"<"+e.$ref+">"||"[subschema "+t+"]"}));return 1!==l&&(n.nestedErrors&&o.importErrors(a),o.addError({name:"oneOf",argument:u,message:"is not exactly one from "+u.join(",")})),o},a.if=function(e,t,n,s){if(void 0===e)return null;if(!i.isSchema(t.if))throw new Error('Expected "if" keyword to be a schema');var o,a=c.call(this,e,n,s,null,t.if),l=new r(e,t,n,s);if(a){if(void 0===t.then)return;if(!i.isSchema(t.then))throw new Error('Expected "then" keyword to be a schema');o=this.validateSchema(e,t.then,n,s.makeChild(t.then)),l.importErrors(o)}else{if(void 0===t.else)return;if(!i.isSchema(t.else))throw new Error('Expected "else" keyword to be a schema');o=this.validateSchema(e,t.else,n,s.makeChild(t.else)),l.importErrors(o)}return l},a.propertyNames=function(e,t,n,o){if(this.types.object(e)){var a=new r(e,t,n,o),c=void 0!==t.propertyNames?t.propertyNames:{};if(!i.isSchema(c))throw new s('Expected "propertyNames" to be a schema (object or boolean)');for(var u in e)if(void 0!==l(e,u)){var d=this.validateSchema(u,c,n,o.makeChild(c));a.importErrors(d)}return a}},a.properties=function(e,t,n,i){if(this.types.object(e)){var o=new r(e,t,n,i),a=t.properties||{};for(var c in a){var u=a[c];if(void 0!==u){if(null===u)throw new s('Unexpected null, expected schema in "properties"');"function"==typeof n.preValidateProperty&&n.preValidateProperty(e,c,u,n,i);var d=l(e,c),h=this.validateSchema(d,u,n,i.makeChild(u,c));h.instance!==o.instance[c]&&(o.instance[c]=h.instance),o.importErrors(h)}}return o}},a.patternProperties=function(e,t,n,i){if(this.types.object(e)){var o=new r(e,t,n,i),a=t.patternProperties||{};for(var c in e){var l=!0;for(var d in a){var h=a[d];if(void 0!==h){if(null===h)throw new s('Unexpected null, expected schema in "patternProperties"');try{var f=new RegExp(d,"u")}catch(e){f=new RegExp(d)}if(f.test(c)){l=!1,"function"==typeof n.preValidateProperty&&n.preValidateProperty(e,c,h,n,i);var g=this.validateSchema(e[c],h,n,i.makeChild(h,c));g.instance!==o.instance[c]&&(o.instance[c]=g.instance),o.importErrors(g)}}}l&&u.call(this,e,t,n,i,c,o)}return o}},a.additionalProperties=function(e,t,n,i){if(this.types.object(e)){if(t.patternProperties)return null;var s=new r(e,t,n,i);for(var o in e)u.call(this,e,t,n,i,o,s);return s}},a.minProperties=function(e,t,n,i){if(this.types.object(e)){var s=new r(e,t,n,i);return Object.keys(e).length>=t.minProperties||s.addError({name:"minProperties",argument:t.minProperties,message:"does not meet minimum property length of "+t.minProperties}),s}},a.maxProperties=function(e,t,n,i){if(this.types.object(e)){var s=new r(e,t,n,i);return Object.keys(e).length<=t.maxProperties||s.addError({name:"maxProperties",argument:t.maxProperties,message:"does not meet maximum property length of "+t.maxProperties}),s}},a.items=function(e,t,n,i){var s=this;if(this.types.array(e)&&void 0!==t.items){var o=new r(e,t,n,i);return e.every((function(e,r){if(Array.isArray(t.items))var a=void 0===t.items[r]?t.additionalItems:t.items[r];else a=t.items;if(void 0===a)return!0;if(!1===a)return o.addError({name:"items",message:"additionalItems not permitted"}),!1;var c=s.validateSchema(e,a,n,i.makeChild(a,r));return c.instance!==o.instance[r]&&(o.instance[r]=c.instance),o.importErrors(c),!0})),o}},a.contains=function(e,t,n,s){var o=this;if(this.types.array(e)&&void 0!==t.contains){if(!i.isSchema(t.contains))throw new Error('Expected "contains" keyword to be a schema');var a=new r(e,t,n,s);return!1===e.some((function(e,i){return 0===o.validateSchema(e,t.contains,n,s.makeChild(t.contains,i)).errors.length}))&&a.addError({name:"contains",argument:t.contains,message:"must contain an item matching given schema"}),a}},a.minimum=function(e,t,n,i){if(this.types.number(e)){var s=new r(e,t,n,i);return t.exclusiveMinimum&&!0===t.exclusiveMinimum?e>t.minimum||s.addError({name:"minimum",argument:t.minimum,message:"must be greater than "+t.minimum}):e>=t.minimum||s.addError({name:"minimum",argument:t.minimum,message:"must be greater than or equal to "+t.minimum}),s}},a.maximum=function(e,t,n,i){if(this.types.number(e)){var s=new r(e,t,n,i);return t.exclusiveMaximum&&!0===t.exclusiveMaximum?et.exclusiveMinimum||s.addError({name:"exclusiveMinimum",argument:t.exclusiveMinimum,message:"must be strictly greater than "+t.exclusiveMinimum}),s}},a.exclusiveMaximum=function(e,t,n,i){if("boolean"!=typeof t.exclusiveMaximum&&this.types.number(e)){var s=new r(e,t,n,i);return e=t.minLength||s.addError({name:"minLength",argument:t.minLength,message:"does not meet minimum length of "+t.minLength}),s}},a.maxLength=function(e,t,n,i){if(this.types.string(e)){var s=new r(e,t,n,i),o=e.match(/[\uDC00-\uDFFF]/g);return e.length-(o?o.length:0)<=t.maxLength||s.addError({name:"maxLength",argument:t.maxLength,message:"does not meet maximum length of "+t.maxLength}),s}},a.minItems=function(e,t,n,i){if(this.types.array(e)){var s=new r(e,t,n,i);return e.length>=t.minItems||s.addError({name:"minItems",argument:t.minItems,message:"does not meet minimum length of "+t.minItems}),s}},a.maxItems=function(e,t,n,i){if(this.types.array(e)){var s=new r(e,t,n,i);return e.length<=t.maxItems||s.addError({name:"maxItems",argument:t.maxItems,message:"does not meet maximum length of "+t.maxItems}),s}},a.uniqueItems=function(e,t,n,i){if(!0===t.uniqueItems&&this.types.array(e)){var s=new r(e,t,n,i);return e.every(h)||s.addError({name:"uniqueItems",message:"contains duplicate item"}),s}},a.dependencies=function(e,t,n,i){if(this.types.object(e)){var s=new r(e,t,n,i);for(var o in t.dependencies)if(void 0!==e[o]){var a=t.dependencies[o],c=i.makeChild(a,o);if("string"==typeof a&&(a=[a]),Array.isArray(a))a.forEach((function(t){void 0===e[t]&&s.addError({name:"dependencies",argument:c.propertyPath,message:"property "+t+" not found, required by "+c.propertyPath})}));else{var l=this.validateSchema(e,a,n,c);s.instance!==l.instance&&(s.instance=l.instance),l&&l.errors.length&&(s.addError({name:"dependencies",argument:c.propertyPath,message:"does not meet dependency required by "+c.propertyPath}),s.importErrors(l))}}return s}},a.enum=function(e,t,n,o){if(void 0===e)return null;if(!Array.isArray(t.enum))throw new s("enum expects an array",t);var a=new r(e,t,n,o);return t.enum.some(i.deepCompareStrict.bind(null,e))||a.addError({name:"enum",argument:t.enum,message:"is not one of enum values: "+t.enum.map(String).join(",")}),a},a.const=function(e,t,n,s){if(void 0===e)return null;var o=new r(e,t,n,s);return i.deepCompareStrict(t.const,e)||o.addError({name:"const",argument:t.const,message:"does not exactly match expected constant: "+t.const}),o},a.not=a.disallow=function(e,t,n,i){var s=this;if(void 0===e)return null;var o=new r(e,t,n,i),a=t.not||t.disallow;return a?(Array.isArray(a)||(a=[a]),a.forEach((function(r){if(s.testType(e,t,n,i,r)){var a=r&&(r.$id||r.id)||r;o.addError({name:"not",argument:a,message:"is of prohibited type "+a})}})),o):null},e.exports=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(13);t.default=async function(e){const t=await fetch("/Neon/Neon-gh/assets/template.html");document.body.innerHTML=await t.text(),document.getElementById("home-link").href="https://ddmal.music.mcgill.ca/Neon",document.getElementById("neon-version").textContent="bb863bf4\n",document.getElementById("neon-main-icon").src="/Neon/Neon-gh/assets/img/Neon_Icon_3.svg",Array.from(document.getElementsByClassName("external-link-icon")).forEach(e=>{e.src="/Neon/Neon-gh/assets/img/external-link.svg"}),document.getElementById("filename").innerText=e.manifest.title,document.title=e.manifest.title,document.getElementById("navbar-item-hotkeys").addEventListener("click",(function(){e.modal.setModalWindowView(i.ModalWindowView.HOTKEYS),e.modal.openModalWindow()})),document.querySelector("#debug-mode-tooltip-icon").setAttribute("src","/Neon/Neon-gh/assets/img/debug-tooltip-light.svg");const n=document.querySelector("#file-saved");n.setAttribute("src","/Neon/Neon-gh/assets/img/saved-icon.svg"),n.setAttribute("alt","Your work is saved")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateDebugModeStatus=t.setDebugMode=void 0;const i=n(26),r=n(3);function s(){const e=document.getElementById("debug-mode-checkbox");(0,r.setSettings)({debugMode:e.checked});const t=document.getElementById("display-errors").parentNode,n=document.querySelector("#error_log");e.checked?t.style.display="":(t.style.display="none",n.classList.remove("visible")),(0,i.updateErrorLogVisibility)()}t.setDebugMode=function(){const e=document.querySelector("#debug-mode-checkbox"),{debugMode:t}=(0,r.getSettings)();e.checked=t,(0,i.initErrorLog)(),s(),e.addEventListener("click",()=>{s()})},t.updateDebugModeStatus=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(12),r=n(3);t.default=class{constructor(e,t,n,i){this.view=e,this.meiClass=t,this.background=n,this.zoomHandler=i;document.getElementById("display_controls").innerHTML=function(e){let t='\n
\n
DISPLAY
\n \n \n \n
\n
\n
\n ';return void 0!==e&&(t+='\n
\n
\n
Zoom
\n \n \n
\n
\n \n 100\n
\n
'),t+='\n
\n
\n
Glyph Opacity
\n \n
\n
\n \n 100\n
\n
\n \n
\n
\n
Image Opacity
\n \n
\n
\n \n 100\n
\n
\n
\n \n
\n\n
Highlight Options:
\n \n
\n\n
\n
\n
Display Options:
\n\n
\n\n
\n\n
\n
\n
Display All
\n
\n
\n\n \n
\n\n
\n\n
\n
\n \n
',t}(this.zoomHandler),this.loadSettings(),this.view.addUpdateCallback(this.updateVisualization.bind(this))}setDisplayListeners(){this.zoomHandler&&i.setZoomControls(this.zoomHandler),i.initDisplayControls(this.meiClass,this.background)}loadSettings(){const{zoom:e,glyphOpacity:t,imageOpacity:n,highlightMode:i}=(0,r.getSettings)();document.querySelector("#zoomOutput")&&(document.querySelector("#zoomOutput").value=String(e),document.querySelector("#zoomSlider").value=String(e)),document.querySelector("#bgOpacityOutput").value=String(n),document.querySelector("#bgOpacitySlider").value=String(n),document.querySelector("#opacityOutput").value=String(t),document.querySelector("#opacitySlider").value=String(t);const s="none"===i?"Off":i[0].toUpperCase()+i.slice(1);document.querySelector("#highlight-type").textContent=" - "+s}updateVisualization(){i.setGlyphOpacityFromSlider(this.meiClass),i.setBgOpacityFromSlider(this.background),i.updateHighlight()}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(99);t.default=class{constructor(e,t,n){this.neonView=e,this.updateCallbacks=[],this.divaReady=!1,this.diva=new i.default("container",{objectData:n}),document.getElementById("container").style.minHeight="100%",this.indexMap=new Map,this.diva.disableDragScrollable(),this.displayPanel=new t(this,"neon-container","diva-viewer-canvas"),this.loadDelay=500,this.initDivaEvents(),document.querySelector(".diva-inner").style.cursor="auto",window.onresize=()=>{const e=window.innerHeight,t=window.innerWidth;window.setTimeout(()=>{e===window.innerHeight&&t===window.innerWidth&&this.changePage(this.getCurrentPage(),!1)},this.loadDelay)}}initDivaEvents(){i.default.Events.subscribe("ManifestDidLoad",this.parseManifest.bind(this),this.diva.settings.ID),i.default.Events.subscribe("ObjectDidLoad",this.didLoad.bind(this),this.diva.settings.ID),i.default.Events.subscribe("ActivePageDidChange",this.changePage.bind(this),this.diva.settings.ID),i.default.Events.subscribe("ZoomLevelDidChange",this.adjustZoom.bind(this),this.diva.settings.ID)}async changePage(e,t=!0){function n(e){if(e===this.getCurrentPage()){const t=this.indexMap.get(e);this.neonView.getPageSVG(t).then(t=>{this.updateSVG(t,e);const n="neon-container-"+e,i=document.getElementById(n);null!==i&&i.classList.add("active-page"),this.updateCallbacks.forEach(e=>e())}).catch(e=>{"not_found"!==e.name&&"missing_mei"!==e.name&&console.error(e)})}}const i=[e];Array.from(document.getElementsByClassName("active-page")).forEach(e=>{e.classList.remove("active-page")});for(const e of i)t?window.setTimeout(n.bind(this),this.loadDelay,e):n.bind(this)(e)}getCurrentPage(){return this.diva.getActivePageIndex()}getCurrentPageURI(){return this.indexMap.get(this.getCurrentPage())}adjustZoom(){new Promise(e=>{Array.from(document.getElementsByClassName("neon-container")).forEach(e=>{e.style.display="none"}),setTimeout(e,this.diva.settings.zoomDuration+100)}).then(()=>{this.changePage(this.diva.getActivePageIndex(),!0),Array.from(document.getElementsByClassName("neon-container")).forEach(e=>{const t=e.firstChild,n=parseInt(e.id.match(/\d+/)[0]);this.updateSVG(t,n),e.style.display=""})})}onSVGLoad(){this.setViewEventHandlers()}updateSVG(e,t){const n=document.getElementById("diva-1-inner"),i=this.diva.getPageDimensionsAtCurrentZoomLevel(t),r=this.diva.settings.viewHandler._viewerCore.getPageRegion(t,{includePadding:!0,incorporateViewport:!0}),s=window.getComputedStyle(n,null).getPropertyValue("margin-left"),o="neon-container-"+t.toString();let a=document.getElementById(o);for(null===a&&(a=document.createElement("div"),a.id=o,a.classList.add("neon-container"),n.appendChild(a));a.firstChild;)a.removeChild(a.firstChild);e.setAttribute("width",i.width.toString()),e.setAttribute("height",i.height.toString()),a.style.position="absolute",a.style.top=r.top+"px",a.style.left=r.left-parseInt(s)+"px",a.appendChild(e)}didLoad(){this.divaReady=!0,this.displayPanel.setDisplayListeners(),document.getElementById("loading").style.display="none"}addUpdateCallback(e){this.updateCallbacks.push(e)}removeUpdateCallback(e){const t=this.updateCallbacks.findIndex(t=>t===e);-1!==t&&this.updateCallbacks.splice(t,1)}setViewEventHandlers(){document.body.addEventListener("keydown",e=>{switch(e.key){case"h":for(const e of document.getElementsByClassName("neon-container"))e.style.visibility="hidden"}}),document.body.addEventListener("keyup",e=>{switch(e.key){case"h":for(const e of document.getElementsByClassName("neon-container"))e.style.visibility=""}})}parseManifest(e){this.indexMap.clear();for(const t of e.sequences)for(const e of t.canvases)this.indexMap.set(t.canvases.indexOf(e),e["@id"])}getPageName(){return this.diva.settings.manifest.itemTitle+" — "+this.diva.settings.manifest.pages[this.getCurrentPage()].l}}},function(e,t){var n,i,r,s;n=window.requestAnimationFrame,i="ontouchend"in document,r=function(){for(var e=1;e0||Math.abs(e.velocityY)>0)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),!1},dragStart:function(t){if(e._useTarget(t.target,t)&&e.elementFocused)return t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation(),!1},selectStart:function(t){return"function"==typeof e.settings.selectStart?e.settings.selectStart.apply(e,arguments):e._useTarget(t.target,t)?(t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation(),!1):void 0}},this._attachListeners()},s.prototype._inputmove=function(e,t){if((!this.lastMove||new Date>new Date(this.lastMove.getTime()+this.throttleTimeout))&&(this.lastMove=new Date,this.mouseDown&&(this.xpos||this.ypos))){var n=e-this.xpos,i=t-this.ypos;if(this.settings.invert&&(n*=-1,i*=-1),this.threshold>0){var r=Math.sqrt(n*n+i*i);if(this.threshold>r)return;this.threshold=0}this.elementFocused&&(this.elementFocused.blur(),this.elementFocused=null,this.el.focus()),this.settings.decelerate=!1,this.velocity=this.velocityY=0;var s=this.scrollLeft(),o=this.scrollTop();this.scrollLeft(this.settings.x?s-n:s),this.scrollTop(this.settings.y?o-i:o),this.prevXPos=this.xpos,this.prevYPos=this.ypos,this.xpos=e,this.ypos=t,this._calculateVelocities(),this._setMoveClasses(this.settings.movingClass),"function"==typeof this.settings.moved&&this.settings.moved.call(this,this.settings)}},s.prototype._calculateVelocities=function(){this.velocity=this._capVelocity(this.prevXPos-this.xpos,this.settings.maxvelocity),this.velocityY=this._capVelocity(this.prevYPos-this.ypos,this.settings.maxvelocity),this.settings.invert&&(this.velocity*=-1,this.velocityY*=-1)},s.prototype._end=function(){this.xpos&&this.prevXPos&&!1===this.settings.decelerate&&(this.settings.decelerate=!0,this._calculateVelocities(),this.xpos=this.prevXPos=this.mouseDown=!1,this._move())},s.prototype._useTarget=function(e,t){return"function"!=typeof this.settings.filterTarget||!1!==this.settings.filterTarget.call(this,e,t)},s.prototype._threshold=function(e,t){return"function"==typeof this.settings.threshold?this.settings.threshold.call(this,e,t):this.settings.threshold},s.prototype._start=function(e,t){this.mouseDown=!0,this.velocity=this.prevXPos=0,this.velocityY=this.prevYPos=0,this.xpos=e,this.ypos=t},s.prototype._resetMouse=function(){this.xpos=!1,this.ypos=!1,this.mouseDown=!1},s.prototype._decelerateVelocity=function(e,t){return 0===Math.floor(Math.abs(e))?0:e*t},s.prototype._capVelocity=function(e,t){var n=e;return e>0?e>t&&(n=t):e<0-t&&(n=0-t),n},s.prototype._setMoveClasses=function(e){var t=this.settings,n=this.el;n.classList.remove(t.movingClass.up),n.classList.remove(t.movingClass.down),n.classList.remove(t.movingClass.left),n.classList.remove(t.movingClass.right),n.classList.remove(t.deceleratingClass.up),n.classList.remove(t.deceleratingClass.down),n.classList.remove(t.deceleratingClass.left),n.classList.remove(t.deceleratingClass.right),this.velocity>0&&n.classList.add(e.right),this.velocity<0&&n.classList.add(e.left),this.velocityY>0&&n.classList.add(e.down),this.velocityY<0&&n.classList.add(e.up)},s.prototype._move=function(){var e=this._getScroller(),t=this,i=this.settings;i.x&&e.scrollWidth>0?(this.scrollLeft(this.scrollLeft()+this.velocity),Math.abs(this.velocity)>0&&(this.velocity=i.decelerate?t._decelerateVelocity(this.velocity,i.slowdown):this.velocity)):this.velocity=0,i.y&&e.scrollHeight>0?(this.scrollTop(this.scrollTop()+this.velocityY),Math.abs(this.velocityY)>0&&(this.velocityY=i.decelerate?t._decelerateVelocity(this.velocityY,i.slowdown):this.velocityY)):this.velocityY=0,t._setMoveClasses(i.deceleratingClass),"function"==typeof i.moved&&i.moved.call(this,i),Math.abs(this.velocity)>0||Math.abs(this.velocityY)>0?this.moving||(this.moving=!0,n((function(){t.moving=!1,t._move()}))):t.stop()},s.prototype._getScroller=function(){return this.el},s.prototype.scrollLeft=function(e){var t=this._getScroller();if("number"!=typeof e)return t.scrollLeft;t.scrollLeft=e,this.settings.scrollLeft=e},s.prototype.scrollTop=function(e){var t=this._getScroller();if("number"!=typeof e)return t.scrollTop;t.scrollTop=e,this.settings.scrollTop=e},s.prototype._attachListeners=function(){var e=this.el,t=this.settings;i&&(e.addEventListener("touchstart",t.events.touchStart,!1),e.addEventListener("touchend",t.events.inputEnd,!1),e.addEventListener("touchmove",t.events.touchMove,!1)),e.addEventListener("mousedown",t.events.inputDown,!1),e.addEventListener("mouseup",t.events.inputEnd,!1),e.addEventListener("mousemove",t.events.inputMove,!1),e.addEventListener("click",t.events.inputClick,!1),e.addEventListener("scroll",t.events.scroll,!1),e.addEventListener("selectstart",t.events.selectStart,!1),e.addEventListener("dragstart",t.events.dragStart,!1)},s.prototype._detachListeners=function(){var e=this.el,t=this.settings;i&&(e.removeEventListener("touchstart",t.events.touchStart,!1),e.removeEventListener("touchend",t.events.inputEnd,!1),e.removeEventListener("touchmove",t.events.touchMove,!1)),e.removeEventListener("mousedown",t.events.inputDown,!1),e.removeEventListener("mouseup",t.events.inputEnd,!1),e.removeEventListener("mousemove",t.events.inputMove,!1),e.removeEventListener("click",t.events.inputClick,!1),e.removeEventListener("scroll",t.events.scroll,!1),e.removeEventListener("selectstart",t.events.selectStart,!1),e.removeEventListener("dragstart",t.events.dragStart,!1)},window.VanillaKinetic=s},function(e,t,n){var i,r,s; +function n(e){var t=" ";if(isNaN(parseInt(e)))t=e;else switch(e){case 1:t=" ";break;case 2:t=" ";break;case 3:t=" ";break;case 4:t=" ";break;case 5:t=" ";break;case 6:t=" ";break;case 7:t=" ";break;case 8:t=" ";break;case 9:t=" ";break;case 10:t=" ";break;case 11:t=" ";break;case 12:t=" "}for(var n=["\n"],i=0;i<100;i++)n.push(n[i]+t);return n}function i(){this.step=" ",this.shift=n(this.step)}function r(e,t){return t-(e.replace(/\(/g,"").length-e.replace(/\)/g,"").length)}function s(e,t){return e.replace(/\s{1,}/g," ").replace(/ AND /gi,"~::~"+t+t+"AND ").replace(/ BETWEEN /gi,"~::~"+t+"BETWEEN ").replace(/ CASE /gi,"~::~"+t+"CASE ").replace(/ ELSE /gi,"~::~"+t+"ELSE ").replace(/ END /gi,"~::~"+t+"END ").replace(/ FROM /gi,"~::~FROM ").replace(/ GROUP\s{1,}BY/gi,"~::~GROUP BY ").replace(/ HAVING /gi,"~::~HAVING ").replace(/ IN /gi," IN ").replace(/ JOIN /gi,"~::~JOIN ").replace(/ CROSS~::~{1,}JOIN /gi,"~::~CROSS JOIN ").replace(/ INNER~::~{1,}JOIN /gi,"~::~INNER JOIN ").replace(/ LEFT~::~{1,}JOIN /gi,"~::~LEFT JOIN ").replace(/ RIGHT~::~{1,}JOIN /gi,"~::~RIGHT JOIN ").replace(/ ON /gi,"~::~"+t+"ON ").replace(/ OR /gi,"~::~"+t+t+"OR ").replace(/ ORDER\s{1,}BY/gi,"~::~ORDER BY ").replace(/ OVER /gi,"~::~"+t+"OVER ").replace(/\(\s{0,}SELECT /gi,"~::~(SELECT ").replace(/\)\s{0,}SELECT /gi,")~::~SELECT ").replace(/ THEN /gi," THEN~::~"+t).replace(/ UNION /gi,"~::~UNION~::~").replace(/ USING /gi,"~::~USING ").replace(/ WHEN /gi,"~::~"+t+"WHEN ").replace(/ WHERE /gi,"~::~WHERE ").replace(/ WITH /gi,"~::~WITH ").replace(/ ALL /gi," ALL ").replace(/ AS /gi," AS ").replace(/ ASC /gi," ASC ").replace(/ DESC /gi," DESC ").replace(/ DISTINCT /gi," DISTINCT ").replace(/ EXISTS /gi," EXISTS ").replace(/ NOT /gi," NOT ").replace(/ NULL /gi," NULL ").replace(/ LIKE /gi," LIKE ").replace(/\s{0,}SELECT /gi,"SELECT ").replace(/\s{0,}UPDATE /gi,"UPDATE ").replace(/ SET /gi," SET ").replace(/~::~{1,}/g,"~::~").split("~::~")}i.prototype.xml=function(e,t){var i=e.replace(/>\s{0,}<").replace(/-1?(a+=l[o]+i[c],s=!0,(i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1||i[c].search(/!DOCTYPE/)>-1)&&(s=!1)):i[c].search(/-->/)>-1||i[c].search(/\]>/)>-1?(a+=i[c],s=!1):/^<\w/.exec(i[c-1])&&/^<\/\w/.exec(i[c])&&/^<[\w:\-\.\,]+/.exec(i[c-1])==/^<\/[\w:\-\.\,]+/.exec(i[c])[0].replace("/","")?(a+=i[c],s||o--):i[c].search(/<\w/)>-1&&-1==i[c].search(/<\//)&&-1==i[c].search(/\/>/)?a=a+=s?i[c]:l[o++]+i[c]:i[c].search(/<\w/)>-1&&i[c].search(/<\//)>-1?a=a+=s?i[c]:l[o]+i[c]:i[c].search(/<\//)>-1?a=a+=s?i[c]:l[--o]+i[c]:i[c].search(/\/>/)>-1?a=a+=s?i[c]:l[o]+i[c]:i[c].search(/<\?/)>-1||i[c].search(/xmlns\:/)>-1||i[c].search(/xmlns\=/)>-1?a+=l[o]+i[c]:a+=i[c];return"\n"==a[0]?a.slice(1):a},i.prototype.json=function(e,t){t=t||this.step;return"undefined"==typeof JSON?e:"string"==typeof e?JSON.stringify(JSON.parse(e),null,t):"object"==typeof e?JSON.stringify(e,null,t):e},i.prototype.css=function(e,t){var i=e.replace(/\s{1,}/g," ").replace(/\{/g,"{~::~").replace(/\}/g,"~::~}~::~").replace(/\;/g,";~::~").replace(/\/\*/g,"~::~/*").replace(/\*\//g,"*/~::~").replace(/~::~\s{0,}~::~/g,"~::~").split("~::~"),r=i.length,s=0,o="",a=0,c=t?n(t):this.shift;for(a=0;a/g,"").replace(/[ \r\n\t]{1,}xmlns/g," xmlns")).replace(/>\s{0,}<")},i.prototype.jsonmin=function(e){return"undefined"==typeof JSON?e:JSON.stringify(JSON.parse(e),null,0)},i.prototype.cssmin=function(e,t){return(t?e:e.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"")).replace(/\s{1,}/g," ").replace(/\{\s{1,}/g,"{").replace(/\}\s{1,}/g,"}").replace(/\;\s{1,}/g,";").replace(/\/\*\s{1,}/g,"/*").replace(/\*\/\s{1,}/g,"*/")},i.prototype.sqlmin=function(e){return e.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")")},e.exports=new i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renameHTML=t.newFolderHTML=t.uploadAreaHTML=void 0,t.uploadAreaHTML='
\n\n
\n
\n
Upload Files
\n
\n
\n \n
\n
\n\n
Unpaired Documents
\n\n
\n\n
\n
MEI
\n
\n
Name
\n
\n
\n
\n
\n \n
\n
\n
\n\n
\n
Images
\n
\n
Name
\n
\n
\n
\n
\n\n
\n\n
\n
Make Pair
\n
\n
\n\n
\n\n
Paired Folios
\n
\n
Name
\n
\n
\n
\n\n
\n
\n Upload\n
\n
\n
\n\n
\n\n \x3c!--\n
\n

Manuscripts

\n
\n
\n --\x3e\n\n
\n
',t.newFolderHTML='\n
\n
\n
\n
\n \n \n
\n
\n ',t.renameHTML='\n
\n
\n
\n
\n \n \n
\n
\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.groupingNotRecognized=void 0,t.groupingNotRecognized=function(){window.confirm("Neon does not recognize this neume grouping. Would you like to create a compound neume?")||document.getElementById("undo").click()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitStaffHandler=void 0;const i=n(3),r=n(5),s=n(23),o=n(15);t.SplitStaffHandler=class{constructor(e,t){this.handler=(e=>{const t=this.staff.id,n=(0,o.getSVGRelCoords)(e.clientX,e.clientY),a={action:"split",param:{elementId:t,x:n.x}};this.neonView.edit(a,this.neonView.view.getCurrentPageURI()).then(async e=>{e&&(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success"));const n=new s.default(this.neonView,".staff");this.splitDisable(),(0,r.selectAll)([document.querySelector("#"+t)],this.neonView,n);const o=document.getElementById("moreEdit");o&&(o.innerHTML="",o.parentElement.classList.add("hidden"))})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.staff=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click Where to Split")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SplitNeumeHandler=void 0;const i=n(3);t.SplitNeumeHandler=class{constructor(e,t){this.handler=(e=>{const t={action:"splitNeume",param:{elementId:this.neume.id,ncId:e.target.parentElement.id}};this.neonView.edit(t,this.neonView.view.getCurrentPageURI()).then(async e=>{e?(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action successful","success")):(await this.neonView.updateForCurrentPage(),i.queueNotification("Split action failed","error")),this.splitDisable()})}).bind(this),this.keydownListener=(e=>{"Escape"===e.key?this.splitDisable():"Shift"===e.key&&document.body.removeEventListener("click",this.handler,{capture:!0})}).bind(this),this.clickawayHandler=(e=>{null===e.target.closest(".active-page")&&(this.splitDisable(),document.body.removeEventListener("click",this.handler,{capture:!0}))}).bind(this),this.resetHandler=(e=>{"Shift"===e.key&&document.body.addEventListener("click",this.handler,{capture:!0})}).bind(this),this.neonView=e,this.neume=t}startSplit(){this.splitDisable(),document.body.addEventListener("click",this.handler,{capture:!0}),document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetHandler),document.body.addEventListener("click",this.clickawayHandler),i.queueNotification("Click The Beginning of The Second Neume")}splitDisable(){document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetHandler),document.body.removeEventListener("click",this.clickawayHandler),document.body.removeEventListener("click",this.handler,{capture:!0})}}},function(e,t){},function(e,t,n){"use strict";(function(e){t.test=function(){return"function"==typeof e.queueMicrotask},t.install=function(t){return function(){e.queueMicrotask(t)}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){var n=e.MutationObserver||e.WebKitMutationObserver;t.test=function(){return n},t.install=function(t){var i=0,r=new n(t),s=e.document.createTextNode("");return r.observe(s,{characterData:!0}),function(){s.data=i=++i%2}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){t.test=function(){return!e.setImmediate&&void 0!==e.MessageChannel},t.install=function(t){var n=new e.MessageChannel;return n.port1.onmessage=t,function(){n.port2.postMessage(0)}}}).call(this,n(10))},function(e,t,n){"use strict";(function(e){t.test=function(){return"document"in e&&"onreadystatechange"in e.document.createElement("script")},t.install=function(t){return function(){var n=e.document.createElement("script");return n.onreadystatechange=function(){t(),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},e.document.documentElement.appendChild(n),t}}}).call(this,n(10))},function(e,t,n){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},function(e,t,n){"use strict";var i=n(67),r=n(68);function s(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}t.parse=b,t.resolve=function(e,t){return b(e,!1,!0).resolve(t)},t.resolveObject=function(e,t){return e?b(e,!1,!0).resolveObject(t):t},t.format=function(e){r.isString(e)&&(e=b(e));return e instanceof s?e.format():s.prototype.format.call(e)},t.Url=s;var o=/^([a-z0-9.+-]+:)/i,a=/:[0-9]*$/,c=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,l=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),u=["'"].concat(l),d=["%","/","?",";","#"].concat(u),h=["/","?","#"],f=/^[+a-z0-9A-Z_-]{0,63}$/,g=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,p={javascript:!0,"javascript:":!0},m={javascript:!0,"javascript:":!0},v={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},y=n(69);function b(e,t,n){if(e&&r.isObject(e)&&e instanceof s)return e;var i=new s;return i.parse(e,t,n),i}s.prototype.parse=function(e,t,n){if(!r.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var s=e.indexOf("?"),a=-1!==s&&s127?T+="x":T+=B[N];if(!T.match(f)){var q=P.slice(0,k),D=P.slice(k+1),F=B.match(g);F&&(q.push(F[1]),D.unshift(F[2])),D.length&&(b="/"+D.join(".")+b),this.hostname=q.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),I||(this.hostname=i.toASCII(this.hostname));var j=this.port?":"+this.port:"",R=this.hostname||"";this.host=R+j,this.href+=this.host,I&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!p[E])for(k=0,O=u.length;k0)&&n.host.split("@"))&&(n.auth=I.shift(),n.host=n.hostname=I.shift());return n.search=e.search,n.query=e.query,r.isNull(n.pathname)&&r.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!S.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var L=S.slice(-1)[0],A=(n.host||e.host||S.length>1)&&("."===L||".."===L)||""===L,k=0,C=S.length;C>=0;C--)"."===(L=S[C])?S.splice(C,1):".."===L?(S.splice(C,1),k++):k&&(S.splice(C,1),k--);if(!_&&!E)for(;k--;k)S.unshift("..");!_||""===S[0]||S[0]&&"/"===S[0].charAt(0)||S.unshift(""),A&&"/"!==S.join("/").substr(-1)&&S.push("");var I,P=""===S[0]||S[0]&&"/"===S[0].charAt(0);x&&(n.hostname=n.host=P?"":S.length?S.shift():"",(I=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=I.shift(),n.host=n.hostname=I.shift()));return(_=_||n.host&&S.length)&&!P&&S.unshift(""),S.length?n.pathname=S.join("/"):(n.pathname=null,n.path=null),r.isNull(n.pathname)&&r.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},s.prototype.parseHost=function(){var e=this.host,t=a.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";var i=n(43),r=n(19);function s(e,t){this.id=e,this.ref=t}e.exports.SchemaScanResult=s,e.exports.scan=function(e,t){function n(e,t){if(t&&"object"==typeof t)if(t.$ref){var s=i.resolve(e,t.$ref);l[s]=l[s]?l[s]+1:0}else{var u=t.$id||t.id,d=u?i.resolve(e,u):e;if(d){if(d.indexOf("#")<0&&(d+="#"),c[d]){if(!r.deepCompareStrict(c[d],t))throw new Error("Schema <"+d+"> already exists with different definition");return c[d]}c[d]=t,"#"==d[d.length-1]&&(c[d.substring(0,d.length-1)]=t)}o(d+"/items",Array.isArray(t.items)?t.items:[t.items]),o(d+"/extends",Array.isArray(t.extends)?t.extends:[t.extends]),n(d+"/additionalItems",t.additionalItems),a(d+"/properties",t.properties),n(d+"/additionalProperties",t.additionalProperties),a(d+"/definitions",t.definitions),a(d+"/patternProperties",t.patternProperties),a(d+"/dependencies",t.dependencies),o(d+"/disallow",t.disallow),o(d+"/allOf",t.allOf),o(d+"/anyOf",t.anyOf),o(d+"/oneOf",t.oneOf),n(d+"/not",t.not)}}function o(e,t){if(Array.isArray(t))for(var i=0;i0&&l.infoListeners(),(0,i.unselect)())}function f(e){if("selByBBox"!==(0,i.getSelectionType)()||!document.getElementById("displayText").checked||"Enter"!==e.key)return;const t=document.querySelector(".syllable-highlighted");if(t){document.querySelector("span."+t.id).click()}}function g(e){if("selByBBox"!==(0,i.getSelectionType)()||"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"Tab"!==e.key&&e.shiftKey)return;e.preventDefault();const t=document.querySelector(".syllable-highlighted"),n=Array.from(document.querySelectorAll(".syllable")).filter(e=>null!==e.querySelector(".sylTextRect-display")),r=n.indexOf(t);if(("ArrowLeft"===e.key||"Tab"===e.key&&e.shiftKey)&&r>0){(0,i.unselect)();const e=n[r-1].querySelector(".sylTextRect-display");(0,i.selectAll)([e],c,a)}else if(("ArrowRight"===e.key||"Tab"===e.key&&!e.shiftKey)&&rr.lrx||n.yr.lry)}const r=(0,i.getStaffBBox)(e);return!(t.xr.lrx&&n.x>r.lrx||t.yr.lry+Math.abs(r.lry-n.y)*Math.tan(r.rotate)&&n.y>r.lry+Math.abs(r.lry-n.y)*Math.tan(r.rotate))}function y(e){if(c&&"insert"!==c.getUserMode()&&!e.shiftKey)if("use"===this.tagName&&"selByBBox"!==(0,i.getSelectionType)()){if(null===this.closest(".selected")){let e=[this];const n=/E9B[45678]/,r=/E9B[9ABC]/;if(this.getAttribute("xlink:href").match(r)){const t=this.closest(".nc"),i=this.closest(".neume"),r=Array.from(i.children).indexOf(t),s=i.children[r-1].children[0];console.assert(s.getAttribute("xlink:href").match(n),"First glyph of ligature unexpected!"),null===s.closest(".selected")&&e.unshift(s)}else if(this.getAttribute("xlink:href").match(n)){const t=this.closest(".nc"),n=this.closest(".neume"),i=Array.from(n.children).indexOf(t),s=n.children[i+1].children[0];console.assert(s.getAttribute("xlink:href").match(r),"Second glyph of ligature unexpected!"),null===s.closest(".selected")&&e.push(s)}t()&&(e=e.concat(Array.from(document.querySelectorAll(".selected")))),(0,i.selectAll)(e,c,a),a&&a.dragInit()}else if(t()){const e={selByStaff:".staff",selByNeume:".neume",selByNc:".nc",selByLayerElement:".accid"}[document.querySelector(".sel-by .is-active").id]||".syllable",t=[this.closest(e)];let n=[];n=Array.from(document.getElementsByClassName("selected")),n=n.filter(e=>!t.includes(e)),(0,i.selectAll)(n,c,a),a&&a.dragInit()}}else if("rect"===e.target.tagName&&"selByBBox"===(0,i.getSelectionType)())if(null===this.closest(".selected")){let n=[e.target];t()&&(n=n.concat(Array.from(document.getElementsByClassName("selected"))),n=n.map(e=>"rect"==e.tagName?e:e.querySelector(".sylTextRect-Display"))),(0,i.selectAll)(n,c,a),a&&a.dragInit()}else{let e=[];if(t()){const t=[this];e=Array.from(document.getElementsByClassName("selected")),e=e.map(e=>"rect"==e.tagName?e:e.querySelector(".sylTextRect-Display")),e=e.filter(e=>!t.includes(e)),(0,i.selectAll)(e,c,a),a&&a.dragInit()}}else{if("selByStaff"!==(0,i.getSelectionType)())return void l.infoListeners();t()||(0,i.unselect)();const n=(0,o.getStaffByCoords)(e.clientX,e.clientY);if(!n)return;n.classList.contains("selected")||((0,i.selectStaff)(n,a),(0,r.resize)(n,c,a),a&&a.dragInit()),n.dispatchEvent(new MouseEvent("mousedown",{screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,view:e.view}))}function t(){return window.navigator.userAgent.match(/Mac/)?e.metaKey:e.ctrlKey}}t.setSelectStrokeWidth=function(e){d=e},t.setSelectHelperObjects=function(e,t){a=t,c=e,l=c.info,u=c.view.zoomHandler},t.clickSelect=function(e){document.querySelectorAll(e).forEach(e=>{e.removeEventListener("mousedown",y),e.addEventListener("mousedown",y)}),document.body.removeEventListener("keydown",h),document.body.addEventListener("keydown",h),document.body.removeEventListener("keydown",f),document.body.addEventListener("keydown",f),document.body.removeEventListener("keydown",g),document.body.addEventListener("keydown",g),document.getElementById("container").addEventListener("contextmenu",e=>{e.preventDefault()}),document.querySelectorAll("use,rect,#moreEdit").forEach(e=>{e.removeEventListener("click",m),e.addEventListener("click",m)})},t.dragSelect=function(e){let t=0,n=0,r=!1,o=!1;const l=s.select(e);s.selectAll(e.replace(".active-page","").trim()).on(".drag",null);const h=s.drag().on("start",(function(){if(!c)return;const e=c.getUserMode();if("use"!==s.event.sourceEvent.target.nodeName&&"insert"!==e&&"rect"!==s.event.sourceEvent.target.nodeName){if(s.event.sourceEvent.shiftKey)r=!0,void 0!==u&&u.startDrag();else if(!document.getElementById("selByStaff").classList.contains("is-active")||(f=s.mouse(this),0===Array.from(document.getElementsByClassName("staff")).filter(e=>{const t=(0,i.getStaffBBox)(e),n=t.ulx,r=t.uly,s=t.lrx,o=t.lry,a=t.rotate;return f[0]>n&&f[0]r+(f[0]-n)*Math.tan(a)&&f[1]v(e,f,g));y.forEach(e=>{if("use"===e.tagName&&e.getAttribute("xlink:href").match(/E9B[456789ABC]/)){const t=e.closest(".neume"),n=Array.from(t.children).indexOf(e.closest(".nc"));if(e.getAttribute("xlink:href").match(/E9B[45678]/)){const e=t.children[n+1].querySelector("use");y.indexOf(e)<0&&y.push(e)}else{const e=t.children[n-1].querySelector("use");y.indexOf(e)<0&&y.push(e)}}}),(0,i.selectAll)(y,c,a),a&&a.dragInit(),s.selectAll("#selectRect").remove(),o=!1}r=!1}));l.call(h),a&&a.resetTo(h)}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeColumnLabel=t.checkOutOfBoundsGlyphs=t.convertToVerovio=t.isInvalidBBox=t.getSyllableText=t.convertToNeon=t.zip=void 0;const i=n(17),r=n(32),s=n(3);function o(e,t){for(const n of e.attributes)t.setAttribute(n.name,n.value)}function a(e){var t;const n=null===(t=e.querySelector("syl"))||void 0===t?void 0:t.childNodes[0];let i;return i=n?n.nodeValue:"◊",i}function c(e,t){const n=parseInt(t.getAttribute("lrx")),i=parseInt(t.getAttribute("lry")),r=parseInt(t.getAttribute("ulx")),s=parseInt(t.getAttribute("uly")),o=0===n&&0===i&&0===r&&0===s,a=n<0||i<0||r<0||s<0,c=e.querySelector(`*[facs="${"#"+t.getAttribute("xml:id")}"]`);return o||a||!c?[!0,c]:[!1]}function l(e,t,n){const i=e.getAttribute("precedes").replace("#","");let r;const s=n.find((e,t)=>e.getAttribute("xml:id")===i&&(r=t,!0));if(!s)return`- <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is missing the following part\n`;if(!s.hasAttribute("follows"))return`- The following syllable of <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is not linked to any syllable\n`;if(s.getAttribute("follows")!="#"+e.getAttribute("xml:id"))return`- The following syllable of <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is linked to the wrong syllable\n`;if(r!==t+1){const i=[a(e),...n.slice(t+1,r).map(e=>a(e))].join(" - ");return`- Unexpected syllable(s) inside toggle-linked <${e.tagName}> (${i}) with xml:id: ${e.getAttribute("xml:id")} is linked to the wrong syllable\n`}}function u(e,t){const n=e.getAttribute("follows").replace("#",""),i=t.find(e=>e.getAttribute("xml:id")===n);return i?i.hasAttribute("precedes")?i.getAttribute("precedes")!="#"+e.getAttribute("xml:id")?`- The preceding syllable of <${e.tagName}> (${a(i)}) with xml:id: ${e.getAttribute("xml:id")} is linked to the wrong syllable\n`:void 0:`- The preceding syllable of <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is not linked to any syllable\n`:`- <${e.tagName}> (${a(e)}) with xml:id: ${e.getAttribute("xml:id")} is missing the preceding part\n`}function d(e){const t=e.querySelectorAll("nc");let n=0,i="";for(;nt.length?t.length:e.length);i++)n.push([e[i],t[i]]);return n},t.convertToNeon=function(e){const t=new DOMParser,n=new XMLSerializer,s=t.parseFromString(e,"text/xml"),o=s.documentElement;let a=0;const c=Array.from(o.querySelectorAll('section:not([type="neon-neume-line"])'));for(const e of c){e.querySelectorAll("pb").forEach(e=>e.remove());e.querySelectorAll("sb").forEach(e=>e.remove());const t=s.createElementNS("http://www.music-encoding.org/ns/mei","staff"),n=s.createElementNS("http://www.music-encoding.org/ns/mei","layer");t.setAttribute("n","1"),n.setAttribute("n","1"),t.appendChild(n);const r=o.querySelector("surface"),c=r.getAttribute("xml:id"),u=s.createElementNS("http://www.music-encoding.org/ns/mei","pb");u.setAttribute("xml:id","m-"+(0,i.uuidv4)()),u.setAttribute("facs","#"+c),n.appendChild(u);const d=Array.from(e.querySelectorAll('section[type="neon-neume-line"]'));let h=0,f=null;for(const e of d){h+=1;const t=e.querySelector("staff");if(!t){e.remove();continue}const o=t.querySelector("layer");if(t.hasAttribute("type")&&t.getAttribute("type")!="column"+a.toString()){a+=1;const e=s.createElementNS("http://www.music-encoding.org/ns/mei","cb");e.setAttribute("n",a.toString()),e.setAttribute("xml:id","m-"+(0,i.uuidv4)()),e.setAttribute("facs","#m-"+(0,i.uuidv4)()),n.appendChild(e),f&&l(f,e,r),f=e}const c=s.createElementNS("http://www.music-encoding.org/ns/mei","sb");c.setAttribute("n",h.toString()),c.setAttribute("facs",t.getAttribute("facs")),c.setAttribute("xml:id",t.getAttribute("xml:id"));let u=void 0;for(null!==n.lastElementChild&&"custos"===n.lastElementChild.tagName&&(u=n.removeChild(n.lastElementChild)),void 0!==u&&n.appendChild(u),n.appendChild(c);null!==o.firstElementChild;)n.appendChild(o.firstElementChild);e.remove()}f&&l(f,null,r),e.appendChild(t)}if(a){const e=o.querySelector("scoreDef"),t=s.createElementNS("http://www.music-encoding.org/ns/mei","colLayout");t.setAttribute("xml:id","m-"+(0,i.uuidv4)()),t.setAttribute("n",a.toString()),e.insertAdjacentElement("afterend",t)}return r.xml(n.serializeToString(s));function l(e,t,n){const i=function e(t,n,i=[]){if(t&&t!==n){if(t.hasAttribute("facs")&&i.push(t),t.children.length>0)for(const r of t.children)e(r,n,i);t.nextElementSibling&&e(t.nextElementSibling,n,i)}return i}(e.nextElementSibling,t),r=s.createElementNS("http://www.music-encoding.org/ns/mei","zone"),o=function(e,t){let n=1/0,i=0,r=0,s=1/0;return e.forEach(e=>{const o=Array.from(t.children).find(t=>t.getAttribute("xml:id")===e.getAttribute("facs").slice(1));n=Math.min(n,parseInt(o.getAttribute("lrx"))),i=Math.max(i,parseInt(o.getAttribute("lry"))),r=Math.max(r,parseInt(o.getAttribute("ulx"))),s=Math.min(s,parseInt(o.getAttribute("uly")))}),{lrx:n,lry:i,ulx:r,uly:s}}(i,n);r.setAttribute("lrx",o.lrx.toString()),r.setAttribute("lry",o.lry.toString()),r.setAttribute("ulx",o.ulx.toString()),r.setAttribute("uly",o.uly.toString()),r.setAttribute("xml:id",e.getAttribute("facs").slice(1)),n.insertBefore(r,n.firstElementChild)}},t.getSyllableText=a,t.isInvalidBBox=c,t.convertToVerovio=function(e){const t=(new DOMParser).parseFromString(e,"text/xml"),n=t.documentElement;let a=!1;n.querySelector("facsimile").setAttribute("type","transcription");const f=n.querySelector("surface");let g=!1;const p=Array.from(f.getElementsByTagName("zone"));let m="The following zones are invalid: \n\n";for(const e of p){const[t,i]=c(n,e);t&&(g=!0,m+=`- Zone with xml:id: ${e.getAttribute("xml:id")} `,i?(m+=`for <${i.tagName}> with xml:id: ${i.getAttribute("xml:id")}\n`,i.parentNode.removeChild(i)):m+="is not linked with any glyphs\n",e.parentNode.removeChild(e))}g&&s.queueNotification("Removed invalid zones contained in this file","warning",m);const v=n.querySelector("colLayout");v&&(a=!0,v.parentNode.removeChild(v));const y=Array.from(n.getElementsByTagName("syllable"));let b=!1,w=!1,_=!1,E="The following divLine(s) are the only element inside the syllable(s): \n\n",S=!1,x="The following accid(s) are the only element inside the syllable(s): \n\n",L="The following syllable(s) have no neumes: \n\n",A="The following neume(s) have no neume components: \n\n";for(const e of y){0===e.getElementsByTagName("neume").length&&(b=!0,L+=`- <${e.tagName}> with xml:id: ${e.getAttribute("xml:id")}\n`,e.getElementsByTagName("divLine").length>0&&(_=!0,E+=`- <divLine> inside <syllable> with xml:id: ${e.getAttribute("xml:id")}\n`),e.getElementsByTagName("accid").length>0&&(S=!0,x+=`- <accid> inside <syllable> with xml:id: ${e.getAttribute("xml:id")}\n`));const n=e.getElementsByTagName("neume");for(const e of n){const n=Array.from(e.getElementsByTagName("nc"));if(0===n.length)w=!0,A+=`- <${e.tagName}> with xml:id: ${e.getAttribute("xml:id")}\n`;else for(const e of n)if(e.hasAttribute("curve")&&0===e.children.length){const n=t.createElementNS("http://www.music-encoding.org/ns/mei","liquescent");n.setAttribute("xml:id","m-"+(0,i.uuidv4)()),e.appendChild(n)}}}b&&s.queueNotification("This file contains syllable(s) without neume!","warning",L),w&&s.queueNotification("This file contains neume(s) without neume component!","warning",A),_&&s.queueNotification("This file contains divLine(s) inside empty syllable(s)!","warning",E),S&&s.queueNotification("This file contains accid(s) inside empty syllable(s)!","warning",x);const k=Array.from(n.getElementsByTagName("section"));for(const e of k){const n=Array.from(e.getElementsByTagName("staff"));for(const r of n){const n=t.createElementNS("http://www.music-encoding.org/ns/mei","pb");n.setAttribute("facs","#"+f.getAttribute("xml:id")),e.insertBefore(n,r);const s=r.querySelector("layer"),c=Array.from(s.getElementsByTagName("sb"));for(const e of c)if("layer"!==e.parentElement.tagName){const n=e.parentElement;let r=!1,s=!1;const o=Array.from(n.children),a=o.indexOf(e);for(const e of n.getElementsByTagName("neume")){const t=o.indexOf(e);ta&&(s=!0)}if(!r&&s)n.insertAdjacentElement("beforebegin",e);else if(r&&!s)n.insertAdjacentElement("afterend",e);else if(r&&s){const r=t.createElementNS("http://www.music-encoding.org/ns/mei","syllable");r.setAttribute("xml:id","m-"+(0,i.uuidv4)()),r.setAttribute("follows","#"+n.getAttribute("xml:id")),n.setAttribute("precedes","#"+r.getAttribute("xml:id"));const s=o.indexOf(e);for(const e of o){o.indexOf(e)>s&&r.appendChild(e)}n.insertAdjacentElement("afterend",e),e.insertAdjacentElement("afterend",r);for(const e of n.getElementsByTagName("custos"))n.insertAdjacentElement("afterend",e);for(const e of r.getElementsByTagName("clef"))r.insertAdjacentElement("beforebegin",e)}else console.warn("NONE BEHIND NONE AHEAD"),console.debug(n)}const l=Array.from(s.getElementsByTagName("sb")),u=Array.from(s.children);let d=0;for(let n=0;nn+1?l[n+1]:void 0,m=t.createElementNS("http://www.music-encoding.org/ns/mei","sb");m.setAttribute("xml:id","m-"+(0,i.uuidv4)()),m.setAttribute("facs",c.getAttribute("facs"));const v=t.createElementNS("http://www.music-encoding.org/ns/mei","section");v.setAttribute("type","neon-neume-line");const y=t.createElementNS("http://www.music-encoding.org/ns/mei","staff");o(c,y),y.setAttribute("n","1");const b=u.indexOf(c);if(a){if("cb"===u.at(b-1).tagName){d+=1;const e=u.at(b-1),t=e.getAttribute("facs"),n=Array.from(f.querySelectorAll("zone")).find(e=>e.getAttribute("xml:id")===t.slice(1));e.parentNode.removeChild(e),n.parentNode.removeChild(n)}y.setAttribute("type","column"+d.toString())}const w=t.createElementNS("http://www.music-encoding.org/ns/mei","layer");w.setAttribute("n","1"),w.setAttribute("xml:id","m-"+(0,i.uuidv4)()),v.appendChild(y),y.appendChild(w);const _=Array.from(s.children),E=_.slice(_.indexOf(c)+1,_.indexOf(g));for(const e of E)w.appendChild(e);if(!g){const e=h(_.at(-1),[]);for(const t of e){const e=p.find(e=>e.getAttribute("xml:id")==t.getAttribute("facs").slice(1));e&&p.length>1&&e.parentNode.removeChild(e)}}e.insertBefore(m,r),e.insertBefore(v,r)}r.remove()}}const C=Array.from(n.getElementsByTagName("syllable"));let I=!1,P="The following linked syllables are not encoded correctly: \n\n",O=!1,B="The following obliques are incomplete: \n\n";for(const e of n.querySelectorAll("syllable")){for(const t of e.querySelectorAll("clef"))e.insertAdjacentElement("beforebegin",t);for(const t of e.querySelectorAll("custos"))e.insertAdjacentElement("afterend",t);const t=d(e);t&&(O=!0,B+=t);const n=C.indexOf(e);if(e.hasAttribute("precedes")){const t=l(e,n,C);t&&(I=!0,P+=t)}if(e.hasAttribute("follows")){const t=u(e,C);t&&(I=!0,P+=t)}}O&&s.queueNotification("This file contains incomplete oblique(s)","error",B),I&&s.queueNotification("This file contains invalid linked syllable(s)","error",P);const T=new XMLSerializer;return r.xml(T.serializeToString(t))},t.checkOutOfBoundsGlyphs=function(e){const t=(new DOMParser).parseFromString(e,"text/xml").documentElement,n=Array.from(t.querySelectorAll("zone")),i=t.querySelector("surface"),r=Number(i.getAttribute("lrx")),o=Number(i.getAttribute("lry"));let a="The following glyphs are out of bounds: \n\n";n.some(e=>{const n=["ulx","uly","lrx","lry"].some(t=>function(e,t){const n=Number(e.getAttribute(t));return n<0||n>("lrx"==t||"ulx"==t?r:o)}(e,t));if(n){const n=t.querySelector(`*[facs="${"#"+e.getAttribute("xml:id")}"]`);a+=`- <${n.tagName}> with xml:id: ${n.getAttribute("xml:id")}\n`}return n})&&s.queueNotification("This folio contains glyph(s) placed out-of-bounds!","warning",a)},t.removeColumnLabel=function(e){const t=(new DOMParser).parseFromString(e,"text/xml").documentElement;for(const e of Array.from(t.getElementsByTagName("staff")))e.hasAttribute("type")&&e.removeAttribute("type");const n=new XMLSerializer;return r.xml(n.serializeToString(t))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.blankPage=t.sendForValidation=t.init=void 0;const i=n(9),r=fetch("/Neon/Neon-gh/assets/mei-all.rng");let s,o,a,c;function l(e){const t=e.data;if(null===t){c.textContent="VALID",c.style.color="#4bc14b";for(const e of c.children)e.remove()}else{let e="";t.forEach(t=>{e+=t+"\n"}),c.textContent="",c.style.color="red";const n=document.createElement("div");n.textContent="INVALID",n.style.cursor="pointer",c.appendChild(n),n.addEventListener("click",u.bind(this,e))}}function u(e){this.modal.setModalWindowView(i.ModalWindowView.ERROR_LOG,e),this.modal.openModalWindow()}t.init=async function(e){if(null!==document.getElementById("file-status")){const t=document.getElementById("mei_version");t.textContent="unknown",a=t;const n=document.getElementById("validation_status");n.textContent="unknown",c=n,s=new Worker("/Neon/Neon-gh/workers/Worker.js"),s.onmessage=l.bind(e)}},t.sendForValidation=async function(e){if(void 0===c||void 0===a)return;if(void 0===o){const e=await r;o=await e.text()}c.textContent="checking...",c.style.color="gray",s.postMessage({mei:e,schema:o}),a.textContent="checking...",a.style.color="gray",function(e){if(e)switch(e){case"unknown":a.textContent=e,a.style.color="gray";break;default:a.textContent=e,a.style.color="#68A7AD"}}(await async function(e){const t=(new DOMParser).parseFromString(e,"text/xml"),n=t.documentElement.getAttribute("meiversion");return n||"unknown"}(e))},t.blankPage=function(){if(void 0!==c&&void 0!==a){for(const e of c.children)e.remove();c.textContent="No MEI",c.style.color="color:gray",a.textContent="No MEI",a.style.color="color:gray"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.listenUnsavedChanges=t.setSavedStatus=void 0;let i=!0;t.setSavedStatus=function(e=!1){i=e,function(){const e=document.querySelector("#file-saved"),t=i?"/Neon/Neon-gh/assets/img/saved-icon.svg":"/Neon/Neon-gh/assets/img/unsaved-icon.svg";e.setAttribute("src",t);const n=i?"Your work is saved":"You have unsaved work";e.setAttribute("alt",n)}()},t.listenUnsavedChanges=function(){window.onbeforeunload=e=>{if(!i)return e.preventDefault(),"You have unsaved changes!"}}},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){(function(i){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let i=0,r=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(i++,"%c"===e&&(r=i))}),t.splice(r,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==i&&"env"in i&&(e=i.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(79)(t);const{formatters:r}=e.exports;r.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,n(29))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initSelectionButtons=t.initInsertEditControls=t.bindInsertTabs=void 0;const i=n(8),r=n(18),s=n(5),o=n(4);function a(e,t){document.getElementById(e).classList.add("is-active"),document.getElementById(e).classList.contains("insertel")&&(t.insertActive(e),(0,o.setSettings)({insertMode:e}))}function c(e){document.querySelectorAll(e).forEach(e=>{e.classList.remove("is-active"),e.classList.remove("unfocused")})}t.bindInsertTabs=function(e){const t=Array.from(document.getElementsByClassName("insertTab")).map(e=>e.id);document.body.addEventListener("keydown",e=>{if(e.code.match(/^Digit\d$/)&&e.shiftKey)try{const t=Number(e.code[e.code.length-1])-1,n=document.getElementsByClassName("insertel");n[t].click()}catch(e){console.debug(e)}}),t.forEach(t=>{document.getElementById(t).addEventListener("click",()=>{c(".insertTab"),a(t,e),(0,o.setSettings)({insertTab:t}),document.getElementById("insert_data").innerHTML=i.insertTabHtml[t],function(e){const t=Array.from(document.getElementsByClassName("insertel"));t.map(e=>e.id).forEach(t=>{document.getElementById(t).addEventListener("click",()=>{c(".insertel"),a(t,e)})})}(e),c(".insertel");try{const{insertMode:t}=(0,o.getSettings)();a(t,e)}catch(t){a(document.getElementsByClassName("insertel")[0].id,e)}})})},t.initInsertEditControls=function(){const e=document.getElementById("insert_controls"),t=document.getElementById("insertMenu"),n=t.querySelector(".panel-heading-title"),i=document.getElementById("insertContents"),r=t.querySelector("svg > use"),s=document.getElementById("edit_controls"),a=document.getElementById("editMenu"),c=a.querySelector(".panel-heading-title"),l=document.getElementById("editContents"),u=a.querySelector("svg > use");e.addEventListener("click",()=>{c.classList.remove("focused"),n.classList.add("focused"),(0,o.setSettings)({userMode:"insert"}),document.querySelector(".insertel.is-active").click(),s.querySelector(".side-panel-btn.sel-by.is-active").classList.add("unfocused"),e.querySelector(".side-panel-btn.insertel.is-active").classList.remove("unfocused")}),s.addEventListener("click",()=>{n.classList.remove("focused"),c.classList.add("focused"),(0,o.setSettings)({userMode:"edit"}),e.querySelector(".side-panel-btn.insertel.is-active").classList.add("unfocused"),s.querySelector(".side-panel-btn.sel-by.is-active").classList.remove("unfocused")}),t.addEventListener("click",e=>{e.stopPropagation(),i.classList.contains("closed")?(i.classList.remove("closed"),i.style.padding="0.5em 0.75em",setTimeout(()=>{i.style.overflow="visible"},200),r.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(i.classList.add("closed"),i.style.overflow="hidden",setTimeout(()=>{i.style.padding="0px"},200),r.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))}),a.addEventListener("click",e=>{e.stopPropagation(),l.classList.contains("closed")?(l.classList.remove("closed"),l.style.padding="0.5em 0.75em",setTimeout(()=>{l.style.overflow="visible"},200),u.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-down")):(l.classList.add("closed"),l.style.overflow="hidden",setTimeout(()=>{l.style.padding="0px"},200),u.setAttribute("xlink:href","/Neon/Neon-gh/assets/img/icons.svg#dropdown-side"))})},t.initSelectionButtons=function(){const e=document.getElementById("selBySyllable"),t=document.getElementById("selByNeume"),n=document.getElementById("selByNc"),i=document.getElementById("selByStaff"),a=document.getElementById("selByLayerElement");e.addEventListener("click",(function(){if(!e.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selBySyllable"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),e.classList.add("is-active"),t.classList.remove("is-active"),n.classList.remove("is-active"),i.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("syllable")}catch(e){}}})),t.addEventListener("click",(function(){if(!t.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByNeume"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),t.classList.add("is-active"),n.classList.remove("is-active"),e.classList.remove("is-active"),i.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("neume")}catch(e){}}})),n.addEventListener("click",(function(){if(!n.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByNc"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),n.classList.add("is-active"),t.classList.remove("is-active"),e.classList.remove("is-active"),i.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("neume")}catch(e){}}})),i.addEventListener("click",(function(){if(!i.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByStaff"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),i.classList.add("is-active"),t.classList.remove("is-active"),n.classList.remove("is-active"),e.classList.remove("is-active"),a.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("staff")}catch(e){}}})),a.addEventListener("click",(function(){if(!a.classList.contains("is-active")){(0,o.setSettings)({selectionMode:"selByLayerElement"}),(0,s.unselect)(),document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden"),a.classList.add("is-active"),t.classList.remove("is-active"),n.classList.remove("is-active"),i.classList.remove("is-active"),e.classList.remove("is-active");try{document.getElementById("selByBBox").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,r.setGroupingHighlight)("layerElement")}catch(e){}}})),document.body.addEventListener("keydown",r=>{"1"===r.key&&e.click(),"2"===r.key&&t.click(),"3"===r.key&&n.click(),"4"===r.key&&i.click(),"5"===r.key&&a.click()})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(7),r=n(15),s=n(3),o=n(4);t.default=class{constructor(e,t){this.firstClick=!0,this.insertDisabled=function(){this.type="",this.removeInsertClickHandlers(),document.body.removeEventListener("keydown",this.keydownListener),document.body.removeEventListener("keyup",this.resetInsertHandler),document.body.removeEventListener("click",this.clickawayHandler),this.firstClick=!0;try{document.getElementById("returnToEditMode").remove()}catch(e){}const e=document.getElementById("insert_controls"),t=document.getElementById("insertMenu").querySelector(".panel-heading-title"),n=document.getElementById("edit_controls"),i=document.getElementById("editMenu").querySelector(".panel-heading-title");t.classList.remove("focused"),i.classList.add("focused"),e.querySelector(".side-panel-btn.insertel.is-active").classList.add("unfocused"),n.querySelector(".side-panel-btn.sel-by.is-active").classList.remove("unfocused"),(0,o.setSettings)({userMode:"edit"})}.bind(this),this.clickawayHandler=function(e){const t=e.target;null===t.closest(".active-page")&&null===t.closest("#insert_controls")&&null===t.closest("#svg_group")&&(this.insertDisabled(),document.body.removeEventListener("keydown",this.staffHandler),document.body.removeEventListener("keydown",this.handler))}.bind(this),this.resetInsertHandler=function(e){"Shift"===e.key&&document.querySelector(this.selector).addEventListener("click","staff"===this.type?this.staffHandler:this.handler)}.bind(this),this.keydownListener=function(e){"Escape"===e.key?(this.insertDisabled(),document.body.removeEventListener("keydown",this.staffHandler),document.body.removeEventListener("keydown",this.handler)):"Shift"===e.key&&this.removeInsertClickHandlers()}.bind(this),this.handler=function(e){e.stopPropagation();const t=(0,r.getSVGRelCoords)(e.clientX,e.clientY);if((0,r.isOutOfSVGBounds)(t.x,t.y))return(0,s.queueNotification)("[FAIL] Glyph was placed out of bounds! Insertion failed.","error");const n={action:"insert",param:{elementType:this.type,staffId:"auto",ulx:t.x,uly:t.y}};null!==this.attributes&&(n.param.attributes=this.attributes,"F"===this.attributes.shape&&(n.param.ulx-=50)),this.neonView.edit(n,this.neonView.view.getCurrentPageURI()).then(()=>this.neonView.updateForCurrentPage()).then(()=>{document.querySelector(this.selector).addEventListener("click",this.handler)})}.bind(this),this.staffHandler=function(e){const t=(0,r.getSVGRelCoords)(e.clientX,e.clientY);if((0,r.isOutOfSVGBounds)(t.x,t.y))return(0,s.queueNotification)("Staff cannot be placed out of bounds!","error");const n=document.querySelector(".active-page > .definition-scale");if(this.firstClick)this.coord=t,i.select(n).append("circle").attr("cx",t.x).attr("cy",t.y).attr("r",10).attr("id","staff-circle").attr("fill","green"),this.firstClick=!1;else{let e,n;t.x{this.neonView.updateForCurrentPage(),this.firstClick=!0})}}.bind(this),this.removeInsertClickHandlers=function(){try{document.querySelector(this.selector).removeEventListener("click",this.staffHandler),document.querySelector(this.selector).removeEventListener("click",this.handler)}catch(e){}}.bind(this),this.neonView=e,this.selector=t}insertActive(e){const t=this.isInsertMode();switch(e){case"punctum":this.type="nc",this.attributes=null;break;case"diamond":this.type="nc",this.attributes={tilt:"se"};break;case"virga":this.type="nc",this.attributes={tilt:"s"};break;case"liquescentA":this.type="nc",this.attributes={curve:"a"};break;case"liquescentC":this.type="nc",this.attributes={curve:"c"};break;case"virgaReversed":this.type="nc",this.attributes={tilt:"n"};break;case"pes":case"clivis":case"scandicus":case"climacus":case"torculus":case"porrectus":case"pressus":const t=this.neonView.info.getContourByValue(e.charAt(0).toUpperCase()+e.slice(1));this.type="grouping",this.attributes={contour:t};break;case"cClef":case"fClef":this.type="clef",this.attributes={shape:e.charAt(0).toUpperCase()};break;case"custos":this.type="custos",this.attributes=null;break;case"divLineMaxima":this.type="divLine",this.attributes={form:"maxima"};break;case"staff":this.type="staff",this.attributes=null;break;case"flat":this.type="accid",this.attributes={accid:"f"};break;case"natural":this.type="accid",this.attributes={accid:"n"};break;default:return this.type="",this.attributes=null,void console.error("Invalid button for insertion: "+e+".")}this.removeInsertClickHandlers();try{"staff"===this.type?document.querySelector(this.selector).addEventListener("click",this.staffHandler):document.querySelector(this.selector).addEventListener("click",this.handler)}catch(e){}if(document.body.addEventListener("keydown",this.keydownListener),document.body.addEventListener("keyup",this.resetInsertHandler),!t){const e=document.createElement("button");e.id="returnToEditMode",e.classList.add("side-panel-btn"),e.innerHTML="Return to Edit Mode",document.getElementById("redo").parentNode.appendChild(e),e.addEventListener("click",this.insertDisabled)}document.getElementById("editContents").addEventListener("click",this.clickawayHandler)}isInsertMode(){return""!==this.type}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.undoRedoPanel=t.navbarFinalize=t.navbarDropdownMEIActionsMenu=t.navbarDropdownFileMenu=void 0,t.navbarDropdownFileMenu=document.createElement("div"),t.navbarDropdownFileMenu.classList.add("navbar-item","has-dropdown","is-hoverable");const i=document.createElement("div");i.classList.add("navbar-btn"),i.innerHTML="
File
";const r=document.createElement("div");r.classList.add("navbar-dropdown"),r.id="navbar-dropdown-options";[["save","Save"],["export","Save and Export to File"],["getmei","Download MEI"]].forEach(e=>{const t=document.createElement("div");t.id=e[0],t.classList.add("navbar-dropdown-item"),t.textContent=e[1],r.appendChild(t)}),t.navbarDropdownFileMenu.appendChild(i),t.navbarDropdownFileMenu.appendChild(r),t.navbarDropdownMEIActionsMenu=document.createElement("div"),t.navbarDropdownMEIActionsMenu.classList.add("navbar-item","has-dropdown","is-hoverable");const s=document.createElement("div");s.classList.add("navbar-btn"),s.innerHTML="
MEI Actions
";const o=document.createElement("div");o.classList.add("navbar-dropdown"),o.id="navbar-dropdown-options";[["remove-empty-syls","Remove Empty Syllables"],["remove-empty-neumes","Remove Empty Neumes"],["revert","Revert"]].forEach(e=>{const t=document.createElement("div");t.id=e[0],t.classList.add("navbar-dropdown-item"),t.textContent=e[1],o.appendChild(t)}),t.navbarDropdownMEIActionsMenu.appendChild(s),t.navbarDropdownMEIActionsMenu.appendChild(o),t.navbarFinalize=' Finalize MEI ',t.undoRedoPanel='\n '},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initUndoRedoPanel=t.initNavbar=void 0;const i=n(3),r=n(47);function s(e){const t=new Array;for(const n of e)n&&!n.getElementsByTagName("syl").length&&t.push({action:"setText",param:{elementId:n.getAttribute("xml:id"),text:""}});return t}t.initNavbar=function(e){const t=document.querySelectorAll(".navbar-item.has-dropdown.is-hoverable");Array.from(t).forEach(e=>{e.addEventListener("mouseover",()=>{})}),document.getElementById("save").addEventListener("click",()=>{e.save().then(()=>{i.queueNotification("Saved","success")})}),document.body.addEventListener("keydown",t=>{"s"===t.key&&e.save().then(()=>{i.queueNotification("Saved","success")})}),document.getElementById("export").addEventListener("click",()=>{e.export().then(t=>{const n=document.createElement("a");n.href=t,n.download=e.name+".jsonld",document.body.appendChild(n),n.click(),n.remove(),i.queueNotification("Saved","success")})}),document.getElementById("getmei").addEventListener("click",()=>{const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(t=>{const n="data:application/mei+xml;base64,"+window.btoa((0,r.convertToNeon)(t));document.getElementById("getmei").setAttribute("href",n),document.getElementById("getmei").setAttribute("download",e.view.getPageName()+".mei")})}),document.getElementById("remove-empty-syls").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(n=>{const r=(new DOMParser).parseFromString(n,"text/xml").documentElement,s=Array.from(r.getElementsByTagName("syllable"));let o=!1;const a=[];for(const e of s)if(0===e.getElementsByTagName("neume").length){const t={action:"remove",param:{elementId:e.getAttribute("xml:id")}};a.push(t),o=!0}if(o){const n={action:"chain",param:a};e.edit(n,t).then(t=>{t?(e.updateForCurrentPage(),i.queueNotification("Removed empty Syllables","success")):i.queueNotification("Failed to remove empty Syllables","error")})}else i.queueNotification("No empty syllables found","warning")})})),document.getElementById("remove-empty-neumes").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(n=>{const r=(new DOMParser).parseFromString(n,"text/xml").documentElement,s=Array.from(r.getElementsByTagName("neume"));let o=!1;const a=[];for(const e of s)if(0===e.getElementsByTagName("nc").length){const t={action:"remove",param:{elementId:e.getAttribute("xml:id")}};a.push(t),o=!0}if(o){const n={action:"chain",param:a};e.edit(n,t).then(t=>{t?(e.updateForCurrentPage(),i.queueNotification("Removed empty Neumes","success")):i.queueNotification("Failed to remove empty Neumes","error")})}else i.queueNotification("No empty Neumes found","warning")})})),document.getElementById("remove-out-of-bounds-glyphs").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(n=>{const r=(new DOMParser).parseFromString(n,"text/xml").documentElement,s=r.querySelector("surface"),o=Number(s.getAttribute("lrx")),a=Number(s.getAttribute("lry"));const c=Array.from(r.querySelectorAll("zone")).filter(e=>["ulx","uly","lrx","lry"].some(t=>function(e,t){const n=Number(e.getAttribute(t));return n<0||n>("lrx"==t||"ulx"==t?o:a)}(e,t))),l=new Map(c.map(e=>[e.getAttribute("xml:id"),e])),u=Array.from(r.querySelectorAll("nc, divLine, clef, accid")).filter(e=>{if(e.hasAttribute("facs")){const t=e.getAttribute("facs").slice(1);return l.has(t)}return!1});if(0===u.length)return i.queueNotification("There are no out-of-bound glyphs to remove.","warning");const d={action:"chain",param:u.map(e=>({action:"remove",param:{elementId:e.getAttribute("xml:id")}}))};e.edit(d,t).then(t=>{t?(e.updateForCurrentPage(),i.queueNotification("Successfully removed out-of-bounds syllables.","success")):i.queueNotification("Failed to remove out-of-bound syllables.","error")})})})),document.getElementById("untoggle-invalid-oblique").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(t=>{const n=(new DOMParser).parseFromString(t,"text/xml").documentElement,r=Array.from(n.getElementsByTagName("nc"));let s=!1;const o={action:"chain",param:[]},a=new Array;let c=0;for(;c{t?i.queueNotification("Untoggled invalid obliques","success"):i.queueNotification("Failed to untoggle invalid obliques","error"),e.updateForCurrentPage()})):i.queueNotification("No invalid obliques found","warning")})})),document.getElementById("untoggle-invalid-syls").addEventListener("click",(function(){const t=e.view.getCurrentPageURI();e.getPageMEI(t).then(t=>{const n=(new DOMParser).parseFromString(t,"text/xml").documentElement,r=Array.from(n.getElementsByTagName("syllable")),o=function(e){const t=[];for(let n=0;ne.getAttribute("xml:id")===r&&(s=t,!0));o||t.push(i),o.hasAttribute("follows")||t.push(i),o.getAttribute("follows")!="#"+i.getAttribute("xml:id")&&t.push(i),s!==n+1&&t.push(i)}if(i.hasAttribute("follows")){const n=i.getAttribute("follows").replace("#",""),r=e.find(e=>e.getAttribute("xml:id")===n);r||t.push(i),r.hasAttribute("precedes")||t.push(i),r.getAttribute("precedes")!="#"+i.getAttribute("xml:id")&&t.push(i)}}return t}(r);if(0===o.length)i.queueNotification("No invalid syllables found","warning");else{const t={action:"chain",param:[]},n=new Array;for(const e of o)if(e.hasAttribute("precedes")&&e.hasAttribute("follows")){const t=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("precedes").substring(1)),i=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("follows").substring(1));n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push({action:"set",param:{elementId:t.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push({action:"set",param:{elementId:i.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push(...s([e,t,i]))}else if(e.hasAttribute("precedes")){const t=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("precedes").substring(1));n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push({action:"set",param:{elementId:t.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push(...s([e,t]))}else if(e.hasAttribute("follows")){const t=r.find(t=>t.getAttribute("xml:id")===e.getAttribute("follows").substring(1));n.push({action:"set",param:{elementId:e.getAttribute("xml:id"),attrType:"follows",attrValue:""}}),n.push({action:"set",param:{elementId:t.getAttribute("xml:id"),attrType:"precedes",attrValue:""}}),n.push(...s([e,t]))}t.param=n,e.edit(t,e.view.getCurrentPageURI()).then(t=>{t?i.queueNotification("Untoggled invalid syllables","success"):i.queueNotification("Failed to untoggle invalid syllables","error"),e.updateForCurrentPage()})}})})),document.getElementById("revert").addEventListener("click",(function(){window.confirm("Reverting will cause all changes to be lost. Press OK to continue.")&&e.deleteDb().then(()=>{window.location.reload()})}))},t.initUndoRedoPanel=function(e){function t(){e.undo().then(t=>{t?e.updateForCurrentPage():(i.queueNotification("There is nothing left to undo."),console.warn("Failed to undo action"))})}function n(){e.redo().then(t=>{t?e.updateForCurrentPage():(i.queueNotification("There is nothing left to redo."),console.warn("Failed to redo action"))})}document.getElementById("undo").addEventListener("click",t),document.body.addEventListener("keydown",e=>{"z"===e.key&&(e.ctrlKey||e.metaKey)&&t()}),document.getElementById("redo").addEventListener("click",n),document.body.addEventListener("keydown",e=>{("Z"===e.key||"z"===e.key&&e.shiftKey)&&(e.ctrlKey||e.metaKey)&&n()})}},,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(59),r=n(75),s=n(76),o=n(81),a=n(83),c=n(84),l=n(85),u=n(86),d=n(87),h=n(28),f=p("manifest"),g=p("storage");if(f){const e=`./samples/manifests/${f}.jsonld`;window.fetch(e).then(e=>{if(e.ok)return e.text();throw new Error(e.statusText)}).then(async e=>{let t;try{t=JSON.parse(e)}catch(t){return console.error(t),void console.debug(e)}let n;n=(await new Promise((e,n)=>{window.fetch(t.image).then(t=>{e(t.headers.get("Content-Type"))}).catch(e=>{n(e)})})).match(/image\/*/)?{manifest:t,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:o.default,NeumeEdit:c.default}:{manifest:t,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:s.default,NeumeEdit:a.default};new i.default(n).start()})}else{new h.default("Neon-User-Storage").getAttachment(g,"manifest").then(e=>new window.Response(e).json()).then(async e=>{let t;t=(await new Promise((t,n)=>{window.fetch(e.image).then(e=>{t(e.headers.get("Content-Type"))}).catch(e=>{n(e)})})).match(/image\/*/)?{manifest:e,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:o.default,NeumeEdit:c.default}:{manifest:e,Display:r.default,Info:l.default,TextView:u.default,TextEdit:d.default,View:s.default,NeumeEdit:a.default};new i.default(t).start()})}function p(e){let t;return window.location.search.substr(1).split("&").forEach(n=>{const i=n.split("=");i[0]===e&&(t=decodeURIComponent(i[1]))}),t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(60),r=n(48),s=n(62),o=n(73),a=n(9),c=n(74),l=n(49),u=n(4);t.default=class{constructor(e){(0,s.parseManifest)(e.manifest)||console.error("Unable to parse the manifest"),this.params=e,this.manifest=e.manifest}setupEdit(e){if(void 0!==e.TextView&&(this.textView=new e.TextView(this),void 0!==e.TextEdit&&(this.TextEdit=new e.TextEdit(this))),void 0!==e.NeumeEdit){this.NeumeEdit=new e.NeumeEdit(this),this.textView.updateBBoxVisibility();const{userMode:t,insertMode:n,selectionMode:i}=(0,u.getSettings)();switch(document.getElementById(n).classList.add("is-active"),document.getElementById(i).classList.add("is-active"),t){case"insert":document.getElementById(n).click();break;case"edit":default:document.getElementById(i).click()}}}start(){(0,o.default)(this).then(()=>(this.localSettings=new u.default(this.manifest["@id"]),this.view=new this.params.View(this,this.params.Display,this.manifest.image),this.name=this.manifest.title,this.core=new i.default(this.manifest),this.info=new this.params.Info(this),this.modal=new a.ModalWindow(this),r.init(this),(0,c.setDebugMode)(),(0,l.listenUnsavedChanges)(),this.setupEdit(this.params),this.core.initDb())).then(()=>this.updateForCurrentPage(!0)).then(()=>{this.view.onSVGLoad()})}updateForCurrentPage(e=!1){const t=this.view.getCurrentPage();return this.view.changePage(t,e)}redo(){return(0,l.setSavedStatus)(!1),this.core.redo(this.view.getCurrentPageURI())}undo(){return(0,l.setSavedStatus)(!1),this.core.undo(this.view.getCurrentPageURI())}getUserMode(){const{userMode:e}=(0,u.getSettings)();return e}edit(e,t){return this.core.edit(e,t)}getElementAttr(e,t){return this.core.getElementAttr(e,t)}export(){return new Promise((e,t)=>{this.core.updateDatabase().then(()=>{this.manifest.mei_annotations=this.core.getAnnotations(),this.manifest.timestamp=(new Date).toISOString();const t=new window.Blob([JSON.stringify(this.manifest,null,2)],{type:"application/ld+json"}),n=new FileReader;n.addEventListener("load",()=>{e(n.result)}),n.readAsDataURL(t)}).catch(e=>{t(e)})})}save(){return(0,l.setSavedStatus)(!0),this.core.updateDatabase()}deleteDb(){return this.core.deleteDb()}getPageURI(e){return void 0===e&&(e=this.view.getCurrentPageURI()),new Promise(t=>{this.core.getMEI(e).then(e=>{t("data:application/mei+xml;charset=utf-8,"+encodeURIComponent(e))})})}getPageMEI(e){return this.core.getMEI(e)}getPageSVG(e){return this.core.getSVG(e)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(47),r=n(48),s=n(61),o=n(17),a=n(28),c=n(49);t.default=class{constructor(e){this.verovioWrapper=new s.default,this.undoStacks=new Map,this.redoStacks=new Map,this.neonCache=new Map,this.parser=new DOMParser,this.db=new a.default("Neon"),this.blankPages=[],this.manifest=e,this.annotations=e.mei_annotations,this.lastPageLoaded=""}getAnnotations(){return this.annotations}async initDb(e=!1){return await new Promise((t,n)=>{this.db.get(this.manifest["@id"]).catch(e=>{if("not_found"===e.name){const e={_id:this.manifest["@id"],timestamp:this.manifest.timestamp,image:this.manifest.image,title:this.manifest.title,annotations:[]};return this.annotations.forEach(t=>{e.annotations.push(t.id)}),e}return console.error(e),n(e)}).then(async i=>{const r=/(.+[-+\u2212]\d\d)(\d\d)$/;if(new Date(i.timestamp).getTime()>(r.test(this.manifest.timestamp)?new Date(this.manifest.timestamp.replace(r,"$1:$2")).getTime():new Date(this.manifest.timestamp).getTime())&&!e){this.annotations=[];const e=i.annotations.map(e=>new Promise(t=>{this.db.get(e).then(e=>{this.annotations.push({id:e._id,type:"Annotation",body:e.body,target:e.target}),t("")}).catch(e=>{console.error(e),t("")})}));return await Promise.all(e),t(!1)}for(const e of this.annotations)await this.db.get(e.id).catch(t=>"not_found"===t.name?{_id:e.id}:(console.error(t),n(t))).then(t=>(t.body=e.body,t.target=e.target,this.db.put(t))).catch(e=>{n(e),console.error(e)});return this.db.put(i)}).then(()=>t(!0)).catch(e=>{n(e),console.error(e)})})}loadPage(e){return new Promise((t,n)=>{if(this.lastPageLoaded===e&&this.neonCache.has(e))t(this.neonCache.get(e));else if(this.neonCache.has(e))this.loadData(e,this.neonCache.get(e).mei).then(()=>{t(this.neonCache.get(e))});else if(this.blankPages.includes(e)){r.blankPage();const t=new Error("No MEI file for page "+e);t.name="missing_mei",n(t)}else{const s=this.annotations.find(t=>t.target===e);s?window.fetch(s.body).then(e=>{if(e.ok)return e.text();throw new Error(e.statusText)}).then(n=>{/]*\btype="neon-neume-line"[^>]*>/.test(n)||(n=(0,i.convertToVerovio)(n)),(0,i.checkOutOfBoundsGlyphs)(n),this.loadData(e,n).then(()=>{t(this.neonCache.get(e))})}).catch(e=>{n(e)}):(r.blankPage(),this.blankPages.push(e))}})}loadData(e,t,n=!1){return r.sendForValidation((0,i.removeColumnLabel)(t)),this.lastPageLoaded=e,new Promise(i=>{const r={id:(0,o.uuidv4)(),action:"renderData",mei:t};this.verovioWrapper.addEventListener("message",function s(o){if(o.data.id===r.id){const r=this.parser.parseFromString(o.data.svg,"image/svg+xml").documentElement;this.neonCache.set(e,{svg:r,mei:t,dirty:n}),o.target.removeEventListener("message",s),i()}}.bind(this)),this.verovioWrapper.postMessage(r)})}getSVG(e){return new Promise((t,n)=>{this.loadPage(e).then(e=>{t(e.svg)}).catch(e=>{n(e)})})}getMEI(e){return new Promise((t,n)=>{this.loadPage(e).then(e=>{t(e.mei)}).catch(e=>{n(e)})})}getElementAttr(e,t){return new Promise(n=>{this.loadPage(t).then(()=>{const t={id:(0,o.uuidv4)(),action:"getElementAttr",elementId:e};this.verovioWrapper.addEventListener("message",(function e(i){i.data.id===t.id&&(i.target.removeEventListener("message",e),n(i.data.attributes))})),this.verovioWrapper.postMessage(t)})})}edit(e,t){let n;return n=this.lastPageLoaded===t?Promise.resolve(this.neonCache.get(t)):this.loadPage(t),new Promise(i=>{n.then(n=>{n.svg=null;const r=n.mei,s={id:(0,o.uuidv4)(),action:"edit",editorAction:e};this.verovioWrapper.addEventListener("message",function e(n){if(n.data.id===s.id){if(n.data.result){this.undoStacks.has(t)||this.undoStacks.set(t,[]);const e=this.undoStacks.get(t);e.push(r)>10&&this.undoStacks.set(t,e.slice(1)),this.redoStacks.set(t,[])}n.target.removeEventListener("message",e),this.updateCache(t,!0).then(()=>{i(n.data.result)}),(0,c.setSavedStatus)(!1)}}.bind(this)),this.verovioWrapper.postMessage(s)})})}updateCache(e,t){return new Promise(n=>{let s,a;const c=new Promise(e=>{const t={id:(0,o.uuidv4)(),action:"getMEI"};this.verovioWrapper.addEventListener("message",(function n(o){o.data.id===t.id&&(s=o.data.mei,o.target.removeEventListener("message",n),r.sendForValidation((0,i.removeColumnLabel)(s)),e(""))})),this.verovioWrapper.postMessage(t)}),l=new Promise(e=>{const t={id:(0,o.uuidv4)(),action:"renderToSVG"};this.verovioWrapper.addEventListener("message",(function n(i){i.data.id===t.id&&(a=i.data.svg,i.target.removeEventListener("message",n),e(""))})),this.verovioWrapper.postMessage(t)});c.then(()=>l).then(()=>{const i=this.parser.parseFromString(a,"image/svg+xml").documentElement;this.neonCache.set(e,{mei:s,svg:i,dirty:t}),n()})})}info(e){let t;return t=this.lastPageLoaded===e?Promise.resolve():this.loadPage(e),new Promise(e=>{t.then(()=>{const t={id:(0,o.uuidv4)(),action:"editInfo"};this.verovioWrapper.addEventListener("message",(function n(i){i.data.id===t.id&&(i.target.removeEventListener("message",n),e(i.data.info))})),this.verovioWrapper.postMessage(t)})})}undo(e){return new Promise(async t=>{if(!this.undoStacks.has(e))return t(!1);const n=this.undoStacks.get(e).pop();if(!n)return t(!1);const i=await this.getMEI(e);return this.redoStacks.get(e).push(i),await this.loadData(e,n,!0),t(!0)})}redo(e){return new Promise(async t=>{if(!this.redoStacks.has(e))return t(!1);const n=this.redoStacks.get(e).pop();if(!n)return t(!1);const i=await this.getMEI(e);return this.undoStacks.get(e).push(i),await this.loadData(e,n,!0),t(!0)})}async updateDatabase(){let e=!1;for(const t of this.neonCache){const n=t[0],i=t[1];if(i.dirty){e=!0;const t=this.annotations.findIndex(e=>e.target===n);let r;this.annotations[t].body.match(/^data:/)?r="data:application/mei+xml;base64,"+window.btoa(i.mei):await window.fetch(this.annotations[t].body,{method:"PUT",headers:{"Content-Type":"application/mei+xml"},body:i.mei}).then(e=>{r=e.ok?this.annotations[t].body:"data:application/mei+xml;base64,"+window.btoa(i.mei)}).catch(e=>{console.error(e),console.warn("Falling back to data URI"),r="data:application/mei+xml;base64,"+window.btoa(i.mei)}),this.annotations[t].body=r,await this.db.get(this.annotations[t].id).then(e=>(e.body=r,this.db.put(e))).then(()=>{i.dirty=!1}).catch(e=>{console.error(e)})}}e&&await this.db.get(this.manifest["@id"]).then(e=>(e.timestamp=(new Date).toISOString(),this.db.put(e))).catch(e=>{console.error(e)})}async deleteDb(){const e=await this.db.get(this.manifest["@id"]).then(e=>e.annotations);e.push(this.manifest["@id"]);const t=e.map(e=>new Promise(t=>{this.db.get(e).then(e=>this.db.remove(e)).then(()=>t())}));return Promise.all(t)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=class{constructor(){this.verovioWorker=new Worker("/Neon/Neon-gh/workers/VerovioWorker.js")}addEventListener(e,t){return this.verovioWorker.addEventListener(e,t)}postMessage(e){return this.verovioWorker.postMessage(e)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.parseManifest=void 0;const i=n(63),r=n(64),s=n(65);t.parseManifest=function(e){const t=(0,s.validate)(e,i),n=t.instance;if(t.errors.length>0)return console.error(t.errors),!1;const o=n["@context"];return"https://ddmal.music.mcgill.ca/Neon/contexts/1/manifest.jsonld"===o||(o[0]===r[0]&&o[1].schema===r[1].schema&&o[1].title===r[1].title&&o[1].timestamp===r[1].timestamp&&o[1].image["@id"]===r[1].image["@id"]&&o[1].image["@type"]===r[1].image["@type"]&&o[1].mei_annotations["@id"]===r[1].mei_annotations["@id"]&&o[1].mei_annotations["@type"]===r[1].mei_annotations["@type"]&&o[1].mei_annotations["@container"]===r[1].mei_annotations["@container"]||(console.error("Context mismatch"),console.error(o),console.error(r),!1))}},function(e){e.exports=JSON.parse('{"type":"object","required":["@context","title","timestamp","image","mei_annotations"],"properties":{"@context":{"type":["array","string"]},"title":{"type":"string"},"timestamp":{"type":"string"},"image":{"type":"string"},"mei_annotations":{"type":"array","items":{"type":"object","required":["id","type","body","target"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"body":{"type":"string"},"target":{"type":"string"}}}}}}')},function(e){e.exports=JSON.parse('["http://www.w3.org/ns/anno.jsonld",{"schema":"http://schema.org/","title":"schema:name","timestamp":"schema:dateModified","image":{"@id":"schema:image","@type":"@id"},"mei_annotations":{"@id":"Annotation","@type":"@id","@container":"@list"}}]')},function(e,t,n){"use strict";var i=e.exports.Validator=n(66);e.exports.ValidatorResult=n(19).ValidatorResult,e.exports.ValidatorResultError=n(19).ValidatorResultError,e.exports.ValidationError=n(19).ValidationError,e.exports.SchemaError=n(19).SchemaError,e.exports.SchemaScanResult=n(44).SchemaScanResult,e.exports.scan=n(44).scan,e.exports.validate=function(e,t,n){return(new i).validate(e,t,n)}},function(e,t,n){"use strict";var i=n(43),r=n(72),s=n(19),o=n(44).scan,a=s.ValidatorResult,c=s.ValidatorResultError,l=s.SchemaError,u=s.SchemaContext,d=function e(){this.customFormats=Object.create(e.prototype.customFormats),this.schemas={},this.unresolvedRefs=[],this.types=Object.create(f),this.attributes=Object.create(r.validators)};function h(e){var t="string"==typeof e?e:e.$ref;return"string"==typeof t&&t}d.prototype.customFormats={},d.prototype.schemas=null,d.prototype.types=null,d.prototype.attributes=null,d.prototype.unresolvedRefs=null,d.prototype.addSchema=function(e,t){var n=this;if(!e)return null;var i=o(t||"/",e),r=t||e.$id||e.id;for(var s in i.id)this.schemas[s]=i.id[s];for(var s in i.ref)this.unresolvedRefs.push(s);return this.unresolvedRefs=this.unresolvedRefs.filter((function(e){return void 0===n.schemas[e]})),this.schemas[r]},d.prototype.addSubSchemaArray=function(e,t){if(Array.isArray(t))for(var n=0;n",e);var c=s.objectGetPath(n.schemas[a],o.substr(1));if(void 0===c)throw new l("no such schema "+o+" located in <"+a+">",e);return{subschema:c,switchSchema:t}},d.prototype.testType=function(e,t,n,i,r){if(void 0!==r){if(null===r)throw new l('Unexpected null in "type" keyword');if("function"==typeof this.types[r])return this.types[r].call(this,e);if(r&&"object"==typeof r){var s=this.validateSchema(e,r,n,i);return void 0===s||!(s&&s.errors.length)}return!0}};var f=d.prototype.types={};f.string=function(e){return"string"==typeof e},f.number=function(e){return"number"==typeof e&&isFinite(e)},f.integer=function(e){return"number"==typeof e&&e%1==0},f.boolean=function(e){return"boolean"==typeof e},f.array=function(e){return Array.isArray(e)},f.null=function(e){return null===e},f.date=function(e){return e instanceof Date},f.any=function(e){return!0},f.object=function(e){return e&&"object"==typeof e&&!Array.isArray(e)&&!(e instanceof Date)},e.exports=d},function(e,t,n){(function(e,i){var r;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(s){t&&t.nodeType,e&&e.nodeType;var o="object"==typeof i&&i;o.global!==o&&o.window!==o&&o.self;var a,c=2147483647,l=/^xn--/,u=/[^\x20-\x7E]/,d=/[\x2E\u3002\uFF0E\uFF61]/g,h={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=Math.floor,g=String.fromCharCode;function p(e){throw new RangeError(h[e])}function m(e,t){for(var n=e.length,i=[];n--;)i[n]=t(e[n]);return i}function v(e,t){var n=e.split("@"),i="";return n.length>1&&(i=n[0]+"@",e=n[1]),i+m((e=e.replace(d,".")).split("."),t).join(".")}function y(e){for(var t,n,i=[],r=0,s=e.length;r=55296&&t<=56319&&r65535&&(t+=g((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=g(e)})).join("")}function w(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function _(e,t,n){var i=0;for(e=n?f(e/700):e>>1,e+=f(e/t);e>455;i+=36)e=f(e/35);return f(i+36*e/(e+38))}function E(e){var t,n,i,r,s,o,a,l,u,d,h,g=[],m=e.length,v=0,y=128,w=72;for((n=e.lastIndexOf("-"))<0&&(n=0),i=0;i=128&&p("not-basic"),g.push(e.charCodeAt(i));for(r=n>0?n+1:0;r=m&&p("invalid-input"),((l=(h=e.charCodeAt(r++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:36)>=36||l>f((c-v)/o))&&p("overflow"),v+=l*o,!(l<(u=a<=w?1:a>=w+26?26:a-w));a+=36)o>f(c/(d=36-u))&&p("overflow"),o*=d;w=_(v-s,t=g.length+1,0==s),f(v/t)>c-y&&p("overflow"),y+=f(v/t),v%=t,g.splice(v++,0,y)}return b(g)}function S(e){var t,n,i,r,s,o,a,l,u,d,h,m,v,b,E,S=[];for(m=(e=y(e)).length,t=128,n=0,s=72,o=0;o=t&&hf((c-n)/(v=i+1))&&p("overflow"),n+=(a-t)*v,t=a,o=0;oc&&p("overflow"),h==t){for(l=n,u=36;!(l<(d=u<=s?1:u>=s+26?26:u-s));u+=36)E=l-d,b=36-d,S.push(g(w(d+E%b,0))),l=f(E/b);S.push(g(w(l,0))),s=_(n,v,i==r),n=0,++i}++n,++t}return S.join("")}a={version:"1.4.1",ucs2:{decode:y,encode:b},decode:E,encode:S,toASCII:function(e){return v(e,(function(e){return u.test(e)?"xn--"+S(e):e}))},toUnicode:function(e){return v(e,(function(e){return l.test(e)?E(e.slice(4).toLowerCase()):e}))}},void 0===(r=function(){return a}.call(t,n,t,e))||(e.exports=r)}()}).call(this,n(50)(e),n(10))},function(e,t,n){"use strict";e.exports={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,n){"use strict";t.decode=t.parse=n(70),t.encode=t.stringify=n(71)},function(e,t,n){"use strict";function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,n,s){t=t||"&",n=n||"=";var o={};if("string"!=typeof e||0===e.length)return o;var a=/\+/g;e=e.split(t);var c=1e3;s&&"number"==typeof s.maxKeys&&(c=s.maxKeys);var l=e.length;c>0&&l>c&&(l=c);for(var u=0;u=0?(d=p.substr(0,m),h=p.substr(m+1)):(d=p,h=""),f=decodeURIComponent(d),g=decodeURIComponent(h),i(o,f)?r(o[f])?o[f].push(g):o[f]=[o[f],g]:o[f]=g}return o};var r=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";var i=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}};e.exports=function(e,t,n,a){return t=t||"&",n=n||"=",null===e&&(e=void 0),"object"==typeof e?s(o(e),(function(o){var a=encodeURIComponent(i(o))+n;return r(e[o])?s(e[o],(function(e){return a+encodeURIComponent(i(e))})).join(t):a+encodeURIComponent(i(e[o]))})).join(t):a?encodeURIComponent(i(a))+n+encodeURIComponent(i(e)):""};var r=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};function s(e,t){if(e.map)return e.map(t);for(var n=[],i=0;i":e+""}}));s.addError({name:"type",argument:a,message:"is not of a type(s) "+a})}return s},a.anyOf=function(e,t,n,i){if(void 0===e)return null;var o=new r(e,t,n,i),a=new r(e,t,n,i);if(!Array.isArray(t.anyOf))throw new s("anyOf must be an array");if(!t.anyOf.some(c.bind(this,e,n,i,(function(e){a.importErrors(e)})))){var l=t.anyOf.map((function(e,t){var n=e.$id||e.id;return n?"<"+n+">":e.title&&JSON.stringify(e.title)||e.$ref&&"<"+e.$ref+">"||"[subschema "+t+"]"}));n.nestedErrors&&o.importErrors(a),o.addError({name:"anyOf",argument:l,message:"is not any of "+l.join(",")})}return o},a.allOf=function(e,t,n,i){if(void 0===e)return null;if(!Array.isArray(t.allOf))throw new s("allOf must be an array");var o=new r(e,t,n,i),a=this;return t.allOf.forEach((function(t,r){var s=a.validateSchema(e,t,n,i);if(!s.valid){var c=t.$id||t.id||t.title&&JSON.stringify(t.title)||t.$ref&&"<"+t.$ref+">"||"[subschema "+r+"]";o.addError({name:"allOf",argument:{id:c,length:s.errors.length,valid:s},message:"does not match allOf schema "+c+" with "+s.errors.length+" error[s]:"}),o.importErrors(s)}})),o},a.oneOf=function(e,t,n,i){if(void 0===e)return null;if(!Array.isArray(t.oneOf))throw new s("oneOf must be an array");var o=new r(e,t,n,i),a=new r(e,t,n,i),l=t.oneOf.filter(c.bind(this,e,n,i,(function(e){a.importErrors(e)}))).length,u=t.oneOf.map((function(e,t){return e.$id||e.id||e.title&&JSON.stringify(e.title)||e.$ref&&"<"+e.$ref+">"||"[subschema "+t+"]"}));return 1!==l&&(n.nestedErrors&&o.importErrors(a),o.addError({name:"oneOf",argument:u,message:"is not exactly one from "+u.join(",")})),o},a.if=function(e,t,n,s){if(void 0===e)return null;if(!i.isSchema(t.if))throw new Error('Expected "if" keyword to be a schema');var o,a=c.call(this,e,n,s,null,t.if),l=new r(e,t,n,s);if(a){if(void 0===t.then)return;if(!i.isSchema(t.then))throw new Error('Expected "then" keyword to be a schema');o=this.validateSchema(e,t.then,n,s.makeChild(t.then)),l.importErrors(o)}else{if(void 0===t.else)return;if(!i.isSchema(t.else))throw new Error('Expected "else" keyword to be a schema');o=this.validateSchema(e,t.else,n,s.makeChild(t.else)),l.importErrors(o)}return l},a.propertyNames=function(e,t,n,o){if(this.types.object(e)){var a=new r(e,t,n,o),c=void 0!==t.propertyNames?t.propertyNames:{};if(!i.isSchema(c))throw new s('Expected "propertyNames" to be a schema (object or boolean)');for(var u in e)if(void 0!==l(e,u)){var d=this.validateSchema(u,c,n,o.makeChild(c));a.importErrors(d)}return a}},a.properties=function(e,t,n,i){if(this.types.object(e)){var o=new r(e,t,n,i),a=t.properties||{};for(var c in a){var u=a[c];if(void 0!==u){if(null===u)throw new s('Unexpected null, expected schema in "properties"');"function"==typeof n.preValidateProperty&&n.preValidateProperty(e,c,u,n,i);var d=l(e,c),h=this.validateSchema(d,u,n,i.makeChild(u,c));h.instance!==o.instance[c]&&(o.instance[c]=h.instance),o.importErrors(h)}}return o}},a.patternProperties=function(e,t,n,i){if(this.types.object(e)){var o=new r(e,t,n,i),a=t.patternProperties||{};for(var c in e){var l=!0;for(var d in a){var h=a[d];if(void 0!==h){if(null===h)throw new s('Unexpected null, expected schema in "patternProperties"');try{var f=new RegExp(d,"u")}catch(e){f=new RegExp(d)}if(f.test(c)){l=!1,"function"==typeof n.preValidateProperty&&n.preValidateProperty(e,c,h,n,i);var g=this.validateSchema(e[c],h,n,i.makeChild(h,c));g.instance!==o.instance[c]&&(o.instance[c]=g.instance),o.importErrors(g)}}}l&&u.call(this,e,t,n,i,c,o)}return o}},a.additionalProperties=function(e,t,n,i){if(this.types.object(e)){if(t.patternProperties)return null;var s=new r(e,t,n,i);for(var o in e)u.call(this,e,t,n,i,o,s);return s}},a.minProperties=function(e,t,n,i){if(this.types.object(e)){var s=new r(e,t,n,i);return Object.keys(e).length>=t.minProperties||s.addError({name:"minProperties",argument:t.minProperties,message:"does not meet minimum property length of "+t.minProperties}),s}},a.maxProperties=function(e,t,n,i){if(this.types.object(e)){var s=new r(e,t,n,i);return Object.keys(e).length<=t.maxProperties||s.addError({name:"maxProperties",argument:t.maxProperties,message:"does not meet maximum property length of "+t.maxProperties}),s}},a.items=function(e,t,n,i){var s=this;if(this.types.array(e)&&void 0!==t.items){var o=new r(e,t,n,i);return e.every((function(e,r){if(Array.isArray(t.items))var a=void 0===t.items[r]?t.additionalItems:t.items[r];else a=t.items;if(void 0===a)return!0;if(!1===a)return o.addError({name:"items",message:"additionalItems not permitted"}),!1;var c=s.validateSchema(e,a,n,i.makeChild(a,r));return c.instance!==o.instance[r]&&(o.instance[r]=c.instance),o.importErrors(c),!0})),o}},a.contains=function(e,t,n,s){var o=this;if(this.types.array(e)&&void 0!==t.contains){if(!i.isSchema(t.contains))throw new Error('Expected "contains" keyword to be a schema');var a=new r(e,t,n,s);return!1===e.some((function(e,i){return 0===o.validateSchema(e,t.contains,n,s.makeChild(t.contains,i)).errors.length}))&&a.addError({name:"contains",argument:t.contains,message:"must contain an item matching given schema"}),a}},a.minimum=function(e,t,n,i){if(this.types.number(e)){var s=new r(e,t,n,i);return t.exclusiveMinimum&&!0===t.exclusiveMinimum?e>t.minimum||s.addError({name:"minimum",argument:t.minimum,message:"must be greater than "+t.minimum}):e>=t.minimum||s.addError({name:"minimum",argument:t.minimum,message:"must be greater than or equal to "+t.minimum}),s}},a.maximum=function(e,t,n,i){if(this.types.number(e)){var s=new r(e,t,n,i);return t.exclusiveMaximum&&!0===t.exclusiveMaximum?et.exclusiveMinimum||s.addError({name:"exclusiveMinimum",argument:t.exclusiveMinimum,message:"must be strictly greater than "+t.exclusiveMinimum}),s}},a.exclusiveMaximum=function(e,t,n,i){if("boolean"!=typeof t.exclusiveMaximum&&this.types.number(e)){var s=new r(e,t,n,i);return e=t.minLength||s.addError({name:"minLength",argument:t.minLength,message:"does not meet minimum length of "+t.minLength}),s}},a.maxLength=function(e,t,n,i){if(this.types.string(e)){var s=new r(e,t,n,i),o=e.match(/[\uDC00-\uDFFF]/g);return e.length-(o?o.length:0)<=t.maxLength||s.addError({name:"maxLength",argument:t.maxLength,message:"does not meet maximum length of "+t.maxLength}),s}},a.minItems=function(e,t,n,i){if(this.types.array(e)){var s=new r(e,t,n,i);return e.length>=t.minItems||s.addError({name:"minItems",argument:t.minItems,message:"does not meet minimum length of "+t.minItems}),s}},a.maxItems=function(e,t,n,i){if(this.types.array(e)){var s=new r(e,t,n,i);return e.length<=t.maxItems||s.addError({name:"maxItems",argument:t.maxItems,message:"does not meet maximum length of "+t.maxItems}),s}},a.uniqueItems=function(e,t,n,i){if(!0===t.uniqueItems&&this.types.array(e)){var s=new r(e,t,n,i);return e.every(h)||s.addError({name:"uniqueItems",message:"contains duplicate item"}),s}},a.dependencies=function(e,t,n,i){if(this.types.object(e)){var s=new r(e,t,n,i);for(var o in t.dependencies)if(void 0!==e[o]){var a=t.dependencies[o],c=i.makeChild(a,o);if("string"==typeof a&&(a=[a]),Array.isArray(a))a.forEach((function(t){void 0===e[t]&&s.addError({name:"dependencies",argument:c.propertyPath,message:"property "+t+" not found, required by "+c.propertyPath})}));else{var l=this.validateSchema(e,a,n,c);s.instance!==l.instance&&(s.instance=l.instance),l&&l.errors.length&&(s.addError({name:"dependencies",argument:c.propertyPath,message:"does not meet dependency required by "+c.propertyPath}),s.importErrors(l))}}return s}},a.enum=function(e,t,n,o){if(void 0===e)return null;if(!Array.isArray(t.enum))throw new s("enum expects an array",t);var a=new r(e,t,n,o);return t.enum.some(i.deepCompareStrict.bind(null,e))||a.addError({name:"enum",argument:t.enum,message:"is not one of enum values: "+t.enum.map(String).join(",")}),a},a.const=function(e,t,n,s){if(void 0===e)return null;var o=new r(e,t,n,s);return i.deepCompareStrict(t.const,e)||o.addError({name:"const",argument:t.const,message:"does not exactly match expected constant: "+t.const}),o},a.not=a.disallow=function(e,t,n,i){var s=this;if(void 0===e)return null;var o=new r(e,t,n,i),a=t.not||t.disallow;return a?(Array.isArray(a)||(a=[a]),a.forEach((function(r){if(s.testType(e,t,n,i,r)){var a=r&&(r.$id||r.id)||r;o.addError({name:"not",argument:a,message:"is of prohibited type "+a})}})),o):null},e.exports=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(9);t.default=async function(e){const t=await fetch("/Neon/Neon-gh/assets/template.html");document.body.innerHTML=await t.text(),document.getElementById("home-link").href="https://ddmal.music.mcgill.ca/Neon",document.getElementById("neon-version").textContent="1bf9764f\n",document.getElementById("neon-main-icon").src="/Neon/Neon-gh/assets/img/Neon_Icon_3.svg",Array.from(document.getElementsByClassName("external-link-icon")).forEach(e=>{e.src="/Neon/Neon-gh/assets/img/external-link.svg"}),document.getElementById("filename").innerText=e.manifest.title,document.title=e.manifest.title,document.getElementById("navbar-item-hotkeys").addEventListener("click",(function(){e.modal.setModalWindowView(i.ModalWindowView.HOTKEYS),e.modal.openModalWindow()})),document.querySelector("#debug-mode-tooltip-icon").setAttribute("src","/Neon/Neon-gh/assets/img/debug-tooltip-light.svg");const n=document.querySelector("#file-saved");n.setAttribute("src","/Neon/Neon-gh/assets/img/saved-icon.svg"),n.setAttribute("alt","Your work is saved")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateDebugModeStatus=t.setDebugMode=void 0;const i=n(26),r=n(4);function s(){const e=document.getElementById("debug-mode-checkbox");(0,r.setSettings)({debugMode:e.checked});const t=document.getElementById("display-errors").parentNode,n=document.querySelector("#error_log");e.checked?t.style.display="":(t.style.display="none",n.classList.remove("visible")),(0,i.updateErrorLogVisibility)()}t.setDebugMode=function(){const e=document.querySelector("#debug-mode-checkbox"),{debugMode:t}=(0,r.getSettings)();e.checked=t,(0,i.initErrorLog)(),s(),e.addEventListener("click",()=>{s()})},t.updateDebugModeStatus=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(13),r=n(4);t.default=class{constructor(e,t,n,i){this.view=e,this.meiClass=t,this.background=n,this.zoomHandler=i;document.getElementById("display_controls").innerHTML=function(e){let t='\n
\n
DISPLAY
\n \n \n \n
\n
\n
\n ';return void 0!==e&&(t+='\n
\n
\n
Zoom
\n \n \n
\n
\n \n 100\n
\n
'),t+='\n
\n
\n
Glyph Opacity
\n \n
\n
\n \n 100\n
\n
\n \n
\n
\n
Image Opacity
\n \n
\n
\n \n 100\n
\n
\n
\n \n
\n\n
Highlight Options:
\n \n
\n\n
\n
\n
Display Options:
\n\n
\n\n
\n\n
\n
\n
Display All
\n
\n
\n\n \n
\n\n
\n\n
\n
\n \n
',t}(this.zoomHandler),this.loadSettings(),this.view.addUpdateCallback(this.updateVisualization.bind(this))}setDisplayListeners(){this.zoomHandler&&i.setZoomControls(this.zoomHandler),i.initDisplayControls(this.meiClass,this.background)}loadSettings(){const{zoom:e,glyphOpacity:t,imageOpacity:n,highlightMode:i}=(0,r.getSettings)();document.querySelector("#zoomOutput")&&(document.querySelector("#zoomOutput").value=String(e),document.querySelector("#zoomSlider").value=String(e)),document.querySelector("#bgOpacityOutput").value=String(n),document.querySelector("#bgOpacitySlider").value=String(n),document.querySelector("#opacityOutput").value=String(t),document.querySelector("#opacitySlider").value=String(t);const s="none"===i?"Off":i[0].toUpperCase()+i.slice(1);document.querySelector("#highlight-type").textContent=" - "+s}updateVisualization(){i.setGlyphOpacityFromSlider(this.meiClass),i.setBgOpacityFromSlider(this.background),i.updateHighlight()}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(99);t.default=class{constructor(e,t,n){this.neonView=e,this.updateCallbacks=[],this.divaReady=!1,this.diva=new i.default("container",{objectData:n}),document.getElementById("container").style.minHeight="100%",this.indexMap=new Map,this.diva.disableDragScrollable(),this.displayPanel=new t(this,"neon-container","diva-viewer-canvas"),this.loadDelay=500,this.initDivaEvents(),document.querySelector(".diva-inner").style.cursor="auto",window.onresize=()=>{const e=window.innerHeight,t=window.innerWidth;window.setTimeout(()=>{e===window.innerHeight&&t===window.innerWidth&&this.changePage(this.getCurrentPage(),!1)},this.loadDelay)}}initDivaEvents(){i.default.Events.subscribe("ManifestDidLoad",this.parseManifest.bind(this),this.diva.settings.ID),i.default.Events.subscribe("ObjectDidLoad",this.didLoad.bind(this),this.diva.settings.ID),i.default.Events.subscribe("ActivePageDidChange",this.changePage.bind(this),this.diva.settings.ID),i.default.Events.subscribe("ZoomLevelDidChange",this.adjustZoom.bind(this),this.diva.settings.ID)}async changePage(e,t=!0){function n(e){if(e===this.getCurrentPage()){const t=this.indexMap.get(e);this.neonView.getPageSVG(t).then(t=>{this.updateSVG(t,e);const n="neon-container-"+e,i=document.getElementById(n);null!==i&&i.classList.add("active-page"),this.updateCallbacks.forEach(e=>e())}).catch(e=>{"not_found"!==e.name&&"missing_mei"!==e.name&&console.error(e)})}}const i=[e];Array.from(document.getElementsByClassName("active-page")).forEach(e=>{e.classList.remove("active-page")});for(const e of i)t?window.setTimeout(n.bind(this),this.loadDelay,e):n.bind(this)(e)}getCurrentPage(){return this.diva.getActivePageIndex()}getCurrentPageURI(){return this.indexMap.get(this.getCurrentPage())}adjustZoom(){new Promise(e=>{Array.from(document.getElementsByClassName("neon-container")).forEach(e=>{e.style.display="none"}),setTimeout(e,this.diva.settings.zoomDuration+100)}).then(()=>{this.changePage(this.diva.getActivePageIndex(),!0),Array.from(document.getElementsByClassName("neon-container")).forEach(e=>{const t=e.firstChild,n=parseInt(e.id.match(/\d+/)[0]);this.updateSVG(t,n),e.style.display=""})})}onSVGLoad(){this.setViewEventHandlers()}updateSVG(e,t){const n=document.getElementById("diva-1-inner"),i=this.diva.getPageDimensionsAtCurrentZoomLevel(t),r=this.diva.settings.viewHandler._viewerCore.getPageRegion(t,{includePadding:!0,incorporateViewport:!0}),s=window.getComputedStyle(n,null).getPropertyValue("margin-left"),o="neon-container-"+t.toString();let a=document.getElementById(o);for(null===a&&(a=document.createElement("div"),a.id=o,a.classList.add("neon-container"),n.appendChild(a));a.firstChild;)a.removeChild(a.firstChild);e.setAttribute("width",i.width.toString()),e.setAttribute("height",i.height.toString()),a.style.position="absolute",a.style.top=r.top+"px",a.style.left=r.left-parseInt(s)+"px",a.appendChild(e)}didLoad(){this.divaReady=!0,this.displayPanel.setDisplayListeners(),document.getElementById("loading").style.display="none"}addUpdateCallback(e){this.updateCallbacks.push(e)}removeUpdateCallback(e){const t=this.updateCallbacks.findIndex(t=>t===e);-1!==t&&this.updateCallbacks.splice(t,1)}setViewEventHandlers(){document.body.addEventListener("keydown",e=>{switch(e.key){case"h":for(const e of document.getElementsByClassName("neon-container"))e.style.visibility="hidden"}}),document.body.addEventListener("keyup",e=>{switch(e.key){case"h":for(const e of document.getElementsByClassName("neon-container"))e.style.visibility=""}})}parseManifest(e){this.indexMap.clear();for(const t of e.sequences)for(const e of t.canvases)this.indexMap.set(t.canvases.indexOf(e),e["@id"])}getPageName(){return this.diva.settings.manifest.itemTitle+" — "+this.diva.settings.manifest.pages[this.getCurrentPage()].l}}},function(e,t){var n,i,r,s;n=window.requestAnimationFrame,i="ontouchend"in document,r=function(){for(var e=1;e0||Math.abs(e.velocityY)>0)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),!1},dragStart:function(t){if(e._useTarget(t.target,t)&&e.elementFocused)return t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation(),!1},selectStart:function(t){return"function"==typeof e.settings.selectStart?e.settings.selectStart.apply(e,arguments):e._useTarget(t.target,t)?(t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation(),!1):void 0}},this._attachListeners()},s.prototype._inputmove=function(e,t){if((!this.lastMove||new Date>new Date(this.lastMove.getTime()+this.throttleTimeout))&&(this.lastMove=new Date,this.mouseDown&&(this.xpos||this.ypos))){var n=e-this.xpos,i=t-this.ypos;if(this.settings.invert&&(n*=-1,i*=-1),this.threshold>0){var r=Math.sqrt(n*n+i*i);if(this.threshold>r)return;this.threshold=0}this.elementFocused&&(this.elementFocused.blur(),this.elementFocused=null,this.el.focus()),this.settings.decelerate=!1,this.velocity=this.velocityY=0;var s=this.scrollLeft(),o=this.scrollTop();this.scrollLeft(this.settings.x?s-n:s),this.scrollTop(this.settings.y?o-i:o),this.prevXPos=this.xpos,this.prevYPos=this.ypos,this.xpos=e,this.ypos=t,this._calculateVelocities(),this._setMoveClasses(this.settings.movingClass),"function"==typeof this.settings.moved&&this.settings.moved.call(this,this.settings)}},s.prototype._calculateVelocities=function(){this.velocity=this._capVelocity(this.prevXPos-this.xpos,this.settings.maxvelocity),this.velocityY=this._capVelocity(this.prevYPos-this.ypos,this.settings.maxvelocity),this.settings.invert&&(this.velocity*=-1,this.velocityY*=-1)},s.prototype._end=function(){this.xpos&&this.prevXPos&&!1===this.settings.decelerate&&(this.settings.decelerate=!0,this._calculateVelocities(),this.xpos=this.prevXPos=this.mouseDown=!1,this._move())},s.prototype._useTarget=function(e,t){return"function"!=typeof this.settings.filterTarget||!1!==this.settings.filterTarget.call(this,e,t)},s.prototype._threshold=function(e,t){return"function"==typeof this.settings.threshold?this.settings.threshold.call(this,e,t):this.settings.threshold},s.prototype._start=function(e,t){this.mouseDown=!0,this.velocity=this.prevXPos=0,this.velocityY=this.prevYPos=0,this.xpos=e,this.ypos=t},s.prototype._resetMouse=function(){this.xpos=!1,this.ypos=!1,this.mouseDown=!1},s.prototype._decelerateVelocity=function(e,t){return 0===Math.floor(Math.abs(e))?0:e*t},s.prototype._capVelocity=function(e,t){var n=e;return e>0?e>t&&(n=t):e<0-t&&(n=0-t),n},s.prototype._setMoveClasses=function(e){var t=this.settings,n=this.el;n.classList.remove(t.movingClass.up),n.classList.remove(t.movingClass.down),n.classList.remove(t.movingClass.left),n.classList.remove(t.movingClass.right),n.classList.remove(t.deceleratingClass.up),n.classList.remove(t.deceleratingClass.down),n.classList.remove(t.deceleratingClass.left),n.classList.remove(t.deceleratingClass.right),this.velocity>0&&n.classList.add(e.right),this.velocity<0&&n.classList.add(e.left),this.velocityY>0&&n.classList.add(e.down),this.velocityY<0&&n.classList.add(e.up)},s.prototype._move=function(){var e=this._getScroller(),t=this,i=this.settings;i.x&&e.scrollWidth>0?(this.scrollLeft(this.scrollLeft()+this.velocity),Math.abs(this.velocity)>0&&(this.velocity=i.decelerate?t._decelerateVelocity(this.velocity,i.slowdown):this.velocity)):this.velocity=0,i.y&&e.scrollHeight>0?(this.scrollTop(this.scrollTop()+this.velocityY),Math.abs(this.velocityY)>0&&(this.velocityY=i.decelerate?t._decelerateVelocity(this.velocityY,i.slowdown):this.velocityY)):this.velocityY=0,t._setMoveClasses(i.deceleratingClass),"function"==typeof i.moved&&i.moved.call(this,i),Math.abs(this.velocity)>0||Math.abs(this.velocityY)>0?this.moving||(this.moving=!0,n((function(){t.moving=!1,t._move()}))):t.stop()},s.prototype._getScroller=function(){return this.el},s.prototype.scrollLeft=function(e){var t=this._getScroller();if("number"!=typeof e)return t.scrollLeft;t.scrollLeft=e,this.settings.scrollLeft=e},s.prototype.scrollTop=function(e){var t=this._getScroller();if("number"!=typeof e)return t.scrollTop;t.scrollTop=e,this.settings.scrollTop=e},s.prototype._attachListeners=function(){var e=this.el,t=this.settings;i&&(e.addEventListener("touchstart",t.events.touchStart,!1),e.addEventListener("touchend",t.events.inputEnd,!1),e.addEventListener("touchmove",t.events.touchMove,!1)),e.addEventListener("mousedown",t.events.inputDown,!1),e.addEventListener("mouseup",t.events.inputEnd,!1),e.addEventListener("mousemove",t.events.inputMove,!1),e.addEventListener("click",t.events.inputClick,!1),e.addEventListener("scroll",t.events.scroll,!1),e.addEventListener("selectstart",t.events.selectStart,!1),e.addEventListener("dragstart",t.events.dragStart,!1)},s.prototype._detachListeners=function(){var e=this.el,t=this.settings;i&&(e.removeEventListener("touchstart",t.events.touchStart,!1),e.removeEventListener("touchend",t.events.inputEnd,!1),e.removeEventListener("touchmove",t.events.touchMove,!1)),e.removeEventListener("mousedown",t.events.inputDown,!1),e.removeEventListener("mouseup",t.events.inputEnd,!1),e.removeEventListener("mousemove",t.events.inputMove,!1),e.removeEventListener("click",t.events.inputClick,!1),e.removeEventListener("scroll",t.events.scroll,!1),e.removeEventListener("selectstart",t.events.selectStart,!1),e.removeEventListener("dragstart",t.events.dragStart,!1)},window.VanillaKinetic=s},function(e,t,n){var i,r,s; /** * @fileoverview dragscroll - scroll area by dragging * @version 0.0.8 * * @license MIT, see http://github.com/asvd/dragscroll * @copyright 2015 asvd - */r=[t],void 0===(s="function"==typeof(i=function(e){var t,n,i=window,r=document,s=[],o=function(e,o){for(e=0;e{if("%%"===n)return"%";o++;const s=t.formatters[r];if("function"==typeof s){const t=e[o];n=s.call(i,t),e.splice(o,1),o--}return n}),t.formatArgs.call(i,e);(i.log||t.log).apply(i,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=i,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(r!==t.namespaces&&(r=t.namespaces,s=t.enabled(e)),s),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function i(e,n){const i=t(this.namespace+(void 0===n?":":n)+e);return i.log=this.log,i}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map(e=>"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const i=("string"==typeof e?e:"").split(/[\s,]+/),r=i.length;for(n=0;n{t[n]=e[n]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t=1.5*n;return Math.round(e/n)+" "+i+(r?"s":"")}e.exports=function(e,t){t=t||{};var a=typeof e;if("string"===a&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var o=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*o;case"weeks":case"week":case"w":return 6048e5*o;case"days":case"day":case"d":return o*s;case"hours":case"hour":case"hrs":case"hr":case"h":return o*r;case"minutes":case"minute":case"mins":case"min":case"m":return o*i;case"seconds":case"second":case"secs":case"sec":case"s":return o*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return o;default:return}}(e);if("number"===a&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=s)return o(e,t,s,"day");if(t>=r)return o(e,t,r,"hour");if(t>=i)return o(e,t,i,"minute");if(t>=n)return o(e,t,n,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=s)return Math.round(e/s)+"d";if(t>=r)return Math.round(e/r)+"h";if(t>=i)return Math.round(e/i)+"m";if(t>=n)return Math.round(e/n)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(12),r=n(82),s=n(7),o=n(3);t.default=class{constructor(e,t,n){this.neonView=e,this.container=document.getElementById("container"),this.updateCallbacks=new Array(0),this.group=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.group.id="svg_group",this.group.setAttribute("height",window.innerHeight.toString()),this.group.setAttribute("width","100%"),this.bg=document.createElementNS("http://www.w3.org/2000/svg","image"),this.bg.id="bgimg",this.bg.classList.add("background"),this.bg.setAttribute("x","0"),this.bg.setAttribute("y","0");const i=new FileReader;fetch(n).then(e=>{if(e.ok)return i.addEventListener("load",()=>{this.bg.setAttributeNS("http://www.w3.org/1999/xlink","href",i.result.toString());const e=this.bg.getBBox();if(!this.group.hasAttribute("viewBox")){let{viewBox:t}=(0,o.getSettings)();t||(t="0 0 "+e.width.toString()+" "+e.height.toString()),this.group.setAttribute("viewBox",t)}}),e.blob()}).then(e=>{i.readAsDataURL(e)}),this.svg=document.createElementNS("http://www.w3.org/svg","svg"),this.svg.id="mei_output",this.svg.classList.add("neon-container","active-page"),this.group.appendChild(this.bg),this.group.appendChild(this.svg),this.container.appendChild(this.group),this.zoomHandler=new r.default,this.displayPanel=new t(this,"neon-container","background",this.zoomHandler),this.pageURI=n,document.getElementById("loading").style.display="none"}onSVGLoad(){this.setViewEventHandlers(),this.displayPanel.setDisplayListeners()}updateSVG(e){this.group.replaceChild(e,this.svg),this.svg=e,this.svg.id="mei_output",this.svg.classList.add("neon-container","active-page");const t=parseInt(this.svg.getAttribute("height")),n=parseInt(this.svg.getAttribute("width"));this.bg.setAttribute("height",t.toString()),this.bg.setAttribute("width",n.toString());const{viewBox:r}=(0,o.getSettings)();r?this.group.setAttribute("viewBox",r):this.group.setAttribute("viewBox","0 0 "+n+" "+t),(0,i.updateHighlight)(),this.resetTransformations(),this.updateCallbacks.forEach(e=>e())}async changePage(e,t){const n=await this.neonView.getPageSVG(this.getCurrentPageURI());this.updateSVG(n)}addUpdateCallback(e){this.updateCallbacks.push(e)}removeUpdateCallback(e){const t=this.updateCallbacks.findIndex(t=>t===e);-1!==t&&this.updateCallbacks.splice(t,1)}resetTransformations(){this.displayPanel.zoomHandler.restoreTransformation(),(0,i.setGlyphOpacityFromSlider)(),(0,i.setBgOpacityFromSlider)()}getCurrentPage(){return 0}getCurrentPageURI(){return this.pageURI}setViewEventHandlers(){document.body.addEventListener("keydown",e=>{switch(e.key){case"Shift":s.select("#svg_group").on(".drag",null),s.select("#svg_group").call(s.drag().on("start",this.displayPanel.zoomHandler.startDrag.bind(this.displayPanel.zoomHandler)).on("drag",this.displayPanel.zoomHandler.dragging.bind(this.displayPanel.zoomHandler)));break;case"h":document.getElementById("mei_output").setAttribute("visibility","hidden")}}),document.body.addEventListener("keyup",e=>{switch(e.key){case"Shift":s.select("#svg_group").on(".drag",null),"viewer"!==this.neonView.getUserMode()&&this.neonView.NeumeEdit.setSelectListeners();break;case"h":document.getElementById("mei_output").setAttribute("visibility","visible")}}),s.select("#container").on("touchstart",()=>{2===s.event.touches.length&&(this.displayPanel.zoomHandler.startDrag(),s.select("#container").on("touchmove",this.displayPanel.zoomHandler.dragging.bind(this.displayPanel.zoomHandler)),s.select("#container").on("touchend",()=>{s.select("#container").on("touchmove",null)}))}),s.select("#container").on("wheel",this.displayPanel.zoomHandler.scrollZoom.bind(this.displayPanel.zoomHandler),!1),window.onresize=()=>{const e=window.innerHeight,t=document.getElementById("container");e>Number(t.getAttribute("height"))&&t.setAttribute("height",e.toString())}}getPageName(){return this.neonView.name}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.ZoomHandler=t.ViewBox=void 0;const i=n(7),r=n(3);class s{constructor(e,t){this.minX=0,this.minY=0,this.width=e,this.height=t,this.imageWidth=e,this.imageHeight=t}set(e,t,n,i){this.minX=e,this.minY=t,this.width=n,this.height=i}get(){return this.minX.toString()+" "+this.minY.toString()+" "+this.width+" "+this.height}zoomTo(e){const t=this.imageHeight/e,n=this.imageWidth/e;this.width=n,this.height=t}getZoom(){return this.imageWidth/this.width}translate(e,t){this.minX+=e,this.minY+=t}}t.ViewBox=s;class o{resetZoomAndPan(e=!0){const t=document.getElementById("bgimg");this.viewBox=new s(parseInt(t.getAttribute("width")),parseInt(t.getAttribute("height"))),e&&(this.updateSVGViewBox(),(0,r.setSettings)({zoom:100}))}zoomTo(e){this.setViewBox(),this.viewBox.zoomTo(e),this.updateSVGViewBox(),(0,r.setSettings)({zoom:Math.floor(100*e)})}translate(e,t){this.setViewBox(),this.viewBox.translate(e,t),this.updateSVGViewBox()}restoreTransformation(){void 0===this.viewBox?this.resetZoomAndPan(!1):this.updateSVGViewBox()}setViewBox(){if(void 0===this.viewBox){const e=document.getElementById("bgimg");this.viewBox=new s(parseInt(e.getAttribute("width")),parseInt(e.getAttribute("height")))}const e=document.getElementById("svg_group").getAttribute("viewBox").split(" ");this.viewBox.set(parseInt(e[0]),parseInt(e[1]),parseInt(e[2]),parseInt(e[3]))}updateSVGViewBox(){const e=this.viewBox.get();document.getElementById("svg_group").setAttribute("viewBox",e),(0,r.setSettings)({viewBox:e})}startDrag(){const e=document.getElementById("svg_group");this.dragCoordinates=e.createSVGPoint(),"touchstart"===i.event.type?(this.dragCoordinates.x=i.event.touches[0].screenX,this.dragCoordinates.y=i.event.touches[0].screenY):(this.dragCoordinates.x=i.event.x,this.dragCoordinates.y=i.event.y),this.matrix=e.getScreenCTM().inverse()}dragging(){const e=document.getElementById("svg_group"),t=e.createSVGPoint();"touchmove"===i.event.type?(t.x=i.event.touches[0].screenX,t.y=i.event.touches[0].screenY):"wheel"===i.event.type&&!1===i.event.shiftKey?(void 0===this.matrix&&(this.matrix=e.getScreenCTM().inverse()),void 0===this.dragCoordinates&&(this.dragCoordinates=e.createSVGPoint()),this.dragCoordinates.x=i.event.x,this.dragCoordinates.y=i.event.y,t.x=this.dragCoordinates.x-i.event.deltaX,t.y=this.dragCoordinates.y-i.event.deltaY,i.event.preventDefault()):(t.x=i.event.x,t.y=i.event.y);const n=t.matrixTransform(this.matrix),r=this.dragCoordinates.matrixTransform(this.matrix);this.translate(-n.x+r.x,-n.y+r.y),this.dragCoordinates=t}scrollZoom(){if("wheel"!==i.event.type)return;if(!i.event.shiftKey)return void this.dragging();const e=document.getElementById("zoomSlider");this.setViewBox();let t=this.viewBox.getZoom()-i.event.deltaX/100;tparseInt(e.getAttribute("max"))/100&&(t=4),this.zoomTo(t),e.value=(100*t).toString(),document.getElementById("zoomOutput").value=String(Math.round(100*t))}}t.ZoomHandler=o,t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(52),r=n(45),s=n(53),o=n(14),a=n(12),c=n(23),l=n(8),u=n(54),d=n(3);t.default=class{constructor(e){this.neonView=e,this.initEditMode()}initEditMode(){document.getElementById("insert_controls").innerHTML+=l.insertControlsPanel,document.getElementById("edit_controls").innerHTML+=l.editControlsPanel,document.getElementById("undoRedo_controls").innerHTML=u.undoRedoPanel,this.dragHandler=new c.default(this.neonView,".active-page > svg"),this.insertHandler=new s.default(this.neonView,".active-page > svg"),(0,i.bindInsertTabs)(this.insertHandler);const{insertTab:e}=(0,d.getSettings)();document.getElementById(e).click(),r.setSelectHelperObjects(this.neonView,this.dragHandler),this.setSelectListeners(),o.initNeonView(this.neonView),(0,i.initInsertEditControls)(),r.setSelectStrokeWidth(1),(0,i.initSelectionButtons)(),(0,a.setHighlightSelectionControls)(),this.neonView.view.addUpdateCallback(this.setSelectListeners.bind(this))}getUserMode(){const{userMode:e}=(0,d.getSettings)();return e}setSelectListeners(){r.clickSelect(".active-page > svg > svg, .active-page > svg > svg use, .active-page > svg > svg rect"),r.dragSelect(".active-page svg")}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(52),r=n(12),s=n(55),o=n(45),a=n(53),c=n(14),l=n(23),u=n(8),d=n(54),h=n(55),f=n(3);t.default=class{constructor(e){this.neonView=e,this.initEditMode()}initEditMode(){(0,h.initNavbar)(this.neonView),document.getElementById("insert_controls").innerHTML+=u.insertControlsPanel,document.getElementById("edit_controls").innerHTML+=u.editControlsPanel,document.getElementById("undoRedo_controls").innerHTML=d.undoRedoPanel,this.dragHandler=new l.default(this.neonView,"#svg_group"),this.insertHandler=new a.default(this.neonView,"#svg_group"),(0,i.bindInsertTabs)(this.insertHandler);const{insertTab:e}=(0,f.getSettings)();document.getElementById(e).click(),o.setSelectHelperObjects(this.neonView,this.dragHandler),this.setSelectListeners(),c.initNeonView(this.neonView),(0,i.initInsertEditControls)(),(0,i.initSelectionButtons)(),(0,s.initUndoRedoPanel)(this.neonView),(0,r.setHighlightOption)("selection"),this.neonView.view.addUpdateCallback(this.setSelectListeners.bind(this))}getUserMode(){const{userMode:e}=(0,f.getSettings)();return e}setSelectListeners(){o.clickSelect("#svg_group, #svg_group use, #svg_group rect"),o.dragSelect("#svg_group")}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(3),r=n(12),s=new Map([["","Punctum"],["u","Pes"],["d","Clivis"],["uu","Scandicus"],["ud","Torculus"],["du","Porrectus"],["s","Distropha"],["ss","Tristopha"],["sd","Pressus"],["dd","Climacus"],["ddu","ClimacusResupinus"],["udu","TorculusResupinus"],["dud","PorrectusFlexus"],["udd","PesSubpunctis"],["uud","ScandicusFlexus"],["uudd","ScandicusSubpunctis"],["dudd","PorrectusSubpunctis"]]);function o(){const e=document.getElementById("element_info"),t=document.getElementById("displayInfo");(0,i.setSettings)({displayInfo:t.checked}),t.checked?e.setAttribute("style",""):e.setAttribute("style","display: none"),(0,r.updateDisplayAllBtn)()}function a(){document.getElementById("element_info").innerHTML='
\n
Element Info
\n
Hover over any element to see its metadata
\n
',document.getElementById("element_info").setAttribute("style","display: none"),function(){const{displayInfo:e}=(0,i.getSettings)();document.querySelector("#displayInfo").checked=e}(),o(),document.getElementById("displayInfo").addEventListener("click",o)}t.default=class{constructor(e){this.neonView=e;const t=document.getElementById("display-single-container"),n=document.createElement("label");n.classList.add("checkbox-container","side-panel-btn"),n.textContent="Info";const i=document.createElement("input");i.id="displayInfo",i.classList.add("checkbox"),i.type="checkbox",i.checked=!1,n.appendChild(i),t.prepend(n),this.neonView.view.addUpdateCallback(this.resetInfoListeners.bind(this)),a(),this.resetInfoListeners()}infoListeners(){try{document.getElementsByClassName("active-page")[0].querySelectorAll(".neume,.custos,.clef,.accid,.divLine,.staff").forEach(e=>{e.addEventListener("mouseover",t=>{e.classList.contains("staff")||(this.isHoveringChild=!0),this.updateInfo(t)})}),document.getElementsByClassName("active-page")[0].querySelectorAll(".neume,.custos,.clef,.accid,.divLine").forEach(e=>{e.addEventListener("mouseleave",()=>{this.isHoveringChild=!1})})}catch(e){}}stopListeners(){document.querySelectorAll(".neume,.custos,.clef,.accid,.divLine,.staff").forEach(e=>{e.removeEventListener("mouseover",this.updateInfo.bind(this))}),document.querySelectorAll(".neume, .custos, .clef, .accid, .divLine").forEach(e=>{e.removeEventListener("mouseleave",()=>{this.isHoveringChild=!1})})}resetInfoListeners(){this.stopListeners(),this.infoListeners()}async updateInfo(e){const t=e.currentTarget.id;if(""===t)return Array.from(document.getElementById("element_info").children).forEach(e=>{e.remove()}),void console.log("No id!");const n=document.getElementById(t),i=n.getAttribute("class").match(/neume|clef|custos|staff|accid|divLine/)[0];let r,s="";switch(i){case"neume":{const e=n.querySelectorAll(".nc");if(1===e.length){const t=await this.neonView.getElementAttr(e[0].id,this.neonView.view.getCurrentPageURI());if("a"===t.curve||"c"===t.curve){let t=await this.getPitches(e);t=t.trim().toUpperCase(),s="Shape: Liquescent\r\nPitch(es): "+t;break}}let t=await this.getContour(e);if(1===e.length){const t=await this.neonView.getElementAttr(e[0].id,this.neonView.view.getCurrentPageURI());if("s"===t.tilt){let t=await this.getPitches(e);t=t.trim().toUpperCase(),s="Shape: Virga \r\nPitch(es): "+t;break}if("n"===t.tilt){let t=await this.getPitches(e);t=t.trim().toUpperCase(),s="Shape: Reversed Virga \r\nPitch(es): "+t;break}}if("Clivis"===t){(await this.neonView.getElementAttr(e[0].id,this.neonView.view.getCurrentPageURI())).ligated&&(t="Ligature")}let i=await this.getPitches(e);i=i.trim().toUpperCase(),s="Shape: "+(void 0===t?"Compound":t)+"\r\nPitch(es): "+i;break}case"custos":r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI()),s+="Pitch: "+r.pname.toUpperCase()+r.oct;break;case"accid":{r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI());let e="";"F"==r.accid.toUpperCase()?e="Flat":"N"==r.accid.toUpperCase()&&(e="Natural"),s+="Accid Type: "+e;break}case"clef":{const e=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI());if(e["dis.place"]&&void 0!==e.dis){s+="Octave Displacement: "+((e,t)=>("above"===e?"+":"-")+String(Math.floor(Number(t)/7)))(e["dis.place"],e.dis)+"\r\n"}else s+="Octave Displacement: None\r\n";s+="Shape: "+e.shape+"\r\nLine: "+e.line;break}case"divLine":r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI()),s+="DivLine Type: "+r.form;break;case"staff":if(this.isHoveringChild)return;r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI()),r.type&&(s+="Column: "+r.type.replace(/^column/,""));break;default:s+="nothing"}s=`Element Type: ${i.charAt(0).toUpperCase()+i.slice(1)}\n${s}`,this.updateInfoModule(s)}async getPitches(e){let t="";for(const n of e){const e=await this.neonView.getElementAttr(n.id,this.neonView.view.getCurrentPageURI());t+=e.pname+e.oct+" "}return t}async getContour(e){let t="",n=null;for(const i of e){const e=await this.neonView.getElementAttr(i.id,this.neonView.view.getCurrentPageURI());null!==n&&(n.oct>e.oct?t+="d":n.octthis.pitchNameToNum(e.pname)?t+="d":t+="s"),n=e}return void 0===s.get(t)&&console.warn("Unknown contour: "+t),s.get(t)}updateInfoModule(e){document.getElementsByClassName("info-bubble-body")[0].innerText=e,document.getElementById("displayInfo").checked&&(document.getElementsByClassName("info-bubble-container")[0].style.display="")}pitchNameToNum(e){switch(e){case"c":return 1;case"d":return 2;case"e":return 3;case"f":return 4;case"g":return 5;case"a":return 6;case"b":return 7;default:console.log("Unknown pitch name")}}getContourByValue(e){for(const[t,n]of s.entries())if(n===e)return t}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(5),r=n(4),s=n(12),o=n(3);t.default=class{constructor(e){this.neonView=e,this.notificationSent=!1;const t=document.getElementById("display-single-container"),n=document.createElement("label"),i=document.createElement("label"),r=document.createElement("input"),s=document.createElement("input");r.classList.add("checkbox"),s.classList.add("checkbox"),n.classList.add("checkbox-container","side-panel-btn"),i.classList.add("checkbox-container","side-panel-btn"),n.textContent="Text",i.textContent="BBoxes",r.id="displayText",r.type="checkbox",s.id="displayBBox",s.type="checkbox",r.checked=!1,s.checked=!1,n.appendChild(r),i.appendChild(s),t.prepend(i),t.prepend(n),this.loadSettings(),this.setTextViewControls(),this.neonView.view.addUpdateCallback(this.updateTextViewVisibility.bind(this)),this.neonView.view.addUpdateCallback(this.updateBBoxVisibility.bind(this))}setTextViewControls(){this.updateTextViewVisibility(),this.updateBBoxVisibility(),document.getElementById("displayText").addEventListener("click",()=>{this.updateTextViewVisibility(),(0,s.updateDisplayAllBtn)()}),document.getElementById("displayBBox").addEventListener("click",()=>{this.updateBBoxVisibility(),(0,s.updateDisplayAllBtn)()})}loadSettings(){const{displayText:e,displayBBox:t}=(0,o.getSettings)();document.querySelector("#displayText").checked=e,document.querySelector("#displayBBox").checked=t}updateBBoxVisibility(){var e;const t=document.getElementById("displayBBox");if((0,o.setSettings)({displayBBox:t.checked}),t.checked){if(document.querySelectorAll(".sylTextRect").forEach(e=>{e.classList.add("sylTextRect-display"),e.classList.remove("sylTextRect")}),document.querySelectorAll(".syl.selected .sylTextRect-display").forEach(e=>{e.style.fill="red"}),"viewer"!==this.neonView.getUserMode()&&void 0!==this.neonView.TextEdit){this.neonView.TextEdit.initSelectByBBoxButton(),this.neonView.TextEdit.initBBoxCircleSlider();const{circleSize:e}=(0,o.getSettings)();document.querySelector("#circleOutput").value=String(e),document.querySelector("#circleSlider").value=String(e)}}else{(null===(e=document.getElementById("selByBBox"))||void 0===e?void 0:e.classList.contains("is-active"))&&((0,r.unselect)(),document.getElementById("selByBBox").classList.remove("is-active"),document.getElementById("selBySyllable").classList.add("is-active"),(0,o.setSettings)({selectionMode:"selBySyllable"})),document.querySelectorAll(".sylTextRect-display").forEach(e=>{e.classList.add("sylTextRect"),e.classList.remove("sylTextRect-display")}),document.querySelectorAll(".syl.selected .sylTextRect").forEach(e=>{e.style.fill="none"});try{document.getElementById("selByBBox").style.display="none"}catch(e){}try{document.getElementById("bbox-circle-slider").style.display="none"}catch(e){}}(0,s.updateHighlight)()}updateTextViewVisibility(){const e=document.getElementById("displayText");if((0,o.setSettings)({displayText:e.checked}),e.checked){const e=document.getElementById("syl_text");e.style.display="",e.innerHTML=`
\n
Syllables on this page
\n
${this.getSylText()}
\n
`;e.querySelectorAll("span").forEach(e=>{const t=document.getElementById(e.classList[0]),n=t.querySelector(".syl"),i=n.querySelector("text"),r=n.querySelector("rect");0===i.classList.length&&i.classList.add("text"),e.addEventListener("mouseover",()=>{t.classList.contains("syllable-highlighted")||(t.classList.add("selected"),t.querySelectorAll(".neume").forEach(e=>{e.classList.add("selected")}),null!==r&&(r.style.fill="#d00"))}),e.addEventListener("mouseleave",()=>{t.classList.contains("syllable-highlighted")||(t.classList.remove("selected"),t.querySelectorAll(".neume").forEach(e=>{e.classList.remove("selected")}),null!==r&&("rgb(0, 0, 0)"!==t.style.fill?r.style.fill=t.getAttribute("fill"):r.style.fill="blue"))})}),"viewer"!==this.neonView.getUserMode()&&void 0!==this.neonView.TextEdit&&this.neonView.TextEdit.initTextEdit()}else document.getElementById("syl_text").style.display="none"}getSylText(){let e="";return document.querySelectorAll(".active-page .syllable").forEach(t=>{if(null!==t.querySelector(".syl")){const n=t.querySelector(".syl");e+=``,""===n.textContent.trim()?e+="◊ ":Array.from(n.children[0].children[0].children).forEach(t=>{e+=""!==t.textContent?t.textContent:"◊ "}),e+=" "}}),this.notificationSent||(i.queueNotification("Blank syllables are represented by ◊!"),this.notificationSent=!0),e.replace(/\ue551/g,"-")}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(4),r=n(23),s=n(45),o=n(18),a=n(13),c=n(3),l=n(12);function u(){if(!document.getElementById("selByBBox").classList.contains("is-active")){(0,i.unselect)(),(0,c.setSettings)({selectionMode:"selByBBox"});try{document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden")}catch(e){}document.getElementById("selByBBox").classList.add("is-active");try{document.getElementById("selByNc").classList.remove("is-active"),document.getElementById("selByNeume").classList.remove("is-active"),document.getElementById("selByStaff").classList.remove("is-active"),document.getElementById("selBySyllable").classList.remove("is-active"),document.getElementById("selByLayerElement").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,o.setGroupingHighlight)("syllable")}catch(e){}}this.addBBoxListeners()}t.default=class{constructor(e){this.neonView=e,this.initTextEdit()}initTextEdit(){const e=document.getElementById("syl_text").querySelectorAll("span"),t=this.neonView.modal;e.forEach(e=>{function n(){e.classList.add("selected-to-edit"),t.setModalWindowView(a.ModalWindowView.EDIT_TEXT),t.openModalWindow()}e.removeEventListener("click",n),e.addEventListener("click",n)}),document.addEventListener("keydown",e=>{if(e.shiftKey&&"T"===e.key){const e=document.querySelector(".text-select");e&&e.scrollIntoView({behavior:"smooth"})}})}initSelectByBBoxButton(){if(void 0!==this.neonView.NeumeEdit){const e=document.getElementById("selByBBox");if(e)return void(e.style.display="");const t=document.getElementById("selection-mode-btns-container"),n=document.createElement("button");n.classList.add("side-panel-btn","sel-by"),n.id="selByBBox",n.textContent="BBox",t.appendChild(n),n.addEventListener("click",u.bind(this)),document.body.addEventListener("keydown",e=>{"6"===e.key&&""===document.getElementById("selByBBox").style.display&&u.bind(this)()}),this.neonView.view.addUpdateCallback(this.addBBoxListeners.bind(this))}else{const e=document.getElementById("undo").closest(".control"),t=document.createElement("p");t.classList.add("control");const n=document.createElement("button");n.classList.add("side-panel-btn","sel-by"),n.id="selByBBox",n.textContent="BBox",t.appendChild(n),e.appendChild(t),n.classList.add("is-active"),n.style.display="none",this.addBBoxListeners(),this.neonView.view.addUpdateCallback(this.addBBoxListeners.bind(this))}}addBBoxListeners(){document.getElementById("selByBBox").classList.contains("is-active")&&((0,i.unselect)(),void 0===this.neonView.NeumeEdit&&(this.dragHandler=new r.default(this.neonView,".sylTextRect-display"),(0,s.setSelectHelperObjects)(this.neonView,this.dragHandler),"SingleView"===this.neonView.view.constructor.name?((0,s.clickSelect)("#mei_output, #mei_output rect"),(0,s.dragSelect)("#svg_group")):((0,s.clickSelect)(".active-page > svg > svg, .active-page > svg > svg rect"),(0,s.dragSelect)(".active-page svg"))))}initBBoxCircleSlider(){const e=document.getElementById("bbox-circle-slider");if(e)return void(e.style.display="");const t=document.getElementById("display-slider-section"),n=document.createElement("div");n.classList.add("slider-and-slider-actions-container","display-panel"),n.style.cursor="default",n.id="bbox-circle-slider",n.innerHTML='\n
\n
BBox Circle
\n \n
\n
\n \n 25\n
',t.appendChild(n),void 0===this.neonView.NeumeEdit&&(n.style.display="none"),(0,l.setCircleSizeControls)()}}},,,,,,,,,,,,function(e,t,n){"use strict";n.r(t);n(77),n(78);function i(e){const t=document.createElement(e),n=Array.prototype.slice.call(arguments,1);for(;n.length;){r(t,n.shift())}return t}function r(e,t){if(null!=t)if("object"!=typeof t&&"function"!=typeof t)e.appendChild(document.createTextNode(t));else if(t instanceof window.Node)e.appendChild(t);else if(t instanceof Array){const n=t.length;for(let i=0;i0;let s=i.length;for(;s--;)if(i[s]===e[1])return this._cache[n][r].splice(s,1),!0}return!1}unsubscribeAll(e){if(e){const t=Object.keys(this._cache);let n,i=t.length;for(;i--;)n=t[i],void 0!==this._cache[n][e]&&delete this._cache[n][e]}else this._cache={}}}};var d={onDoubleClick:function(e,t){e.addEventListener("dblclick",(function(e){e.ctrlKey||t(e,g(e.currentTarget,e))}));const n=f(500);e.addEventListener("contextmenu",(function(e){e.preventDefault(),e.ctrlKey&&(n.isTriggered()?(n.reset(),t(e,g(e.currentTarget,e))):n.trigger())}))},onPinch:function(e,t){let n=0;e.addEventListener("touchstart",(function(e){e.preventDefault(),2===e.originalEvent.touches.length&&(n=h(e.originalEvent.touches[0].clientX,e.originalEvent.touches[0].clientY,e.originalEvent.touches[1].clientX,e.originalEvent.touches[1].clientY))})),e.addEventListener("touchmove",(function(e){if(e.preventDefault(),2===e.originalEvent.touches.length){const i=e.originalEvent.touches,r=h(i[0].clientX,i[0].clientY,i[1].clientX,i[1].clientY),s=r-n;if(Math.abs(s)>0){const s={pageX:(i[0].clientX+i[1].clientX)/2,pageY:(i[0].clientY+i[1].clientY)/2};t(e,g(e.currentTarget,s),n,r)}}}))},onDoubleTap:function(e,t){const n=f(250);let i=null;e.addEventListener("touchend",e=>{if(e.preventDefault(),n.isTriggered()){n.reset();const r={pageX:e.originalEvent.changedTouches[0].clientX,pageY:e.originalEvent.changedTouches[0].clientY};h(i.pageX,i.pageY,r.pageX,r.pageY)<50&&t(e,g(e.currentTarget,r)),i=null}else i={pageX:e.originalEvent.changedTouches[0].clientX,pageY:e.originalEvent.changedTouches[0].clientY},n.trigger()})}};function h(e,t,n,i){return Math.sqrt((n-e)*(n-e)+(i-t)*(i-t))}function f(e){let t=!1,n=null;return{trigger(){t=!0,i(),n=setTimeout((function(){t=!1,n=null}),e)},isTriggered:()=>t,reset(){t=!1,i()}};function i(){null!==n&&(clearTimeout(n),n=null)}}function g(e,t){const n=e.getBoundingClientRect();return{left:t.pageX-n.left,top:t.pageY-n.top}}var p=n(31);class m{constructor(e,t){this.page=e,this._viewerCore=t,this._innerElement=this._viewerCore.getSettings().innerElement,this._pageToolsElem=null,this.labelWidth=0}mount(){null===this._pageToolsElem&&(this._buttons=this._initializePageToolButtons(),this._pageToolsElem=i("div",{class:"diva-page-tools-wrapper"},i("div",{class:"diva-page-tools"},this._buttons)),this._pageLabelsElem=i("div",{class:"diva-page-labels-wrapper"},i("div",{class:"diva-page-labels"},this._viewerCore.settings.manifest.pages[this.page].l))),this.refresh(),this._innerElement.appendChild(this._pageToolsElem),this._innerElement.appendChild(this._pageLabelsElem)}_initializePageToolButtons(){const e=this._viewerCore.getSettings(),t=this._viewerCore.getPublicInstance(),n=this.page;return this._viewerCore.getPageTools().map(i=>{const r=i.pageToolsIcon.cloneNode(!0);return r.addEventListener("click",r=>{i.handleClick.call(i,r,e,t,n)},!1),r.addEventListener("touchend",r=>{r.preventDefault(),i.handleClick.call(i,r,e,t,n)},!1),r})}unmount(){this._innerElement.removeChild(this._pageToolsElem),this._innerElement.removeChild(this._pageLabelsElem)}refresh(){const e=this._viewerCore.getPageRegion(this.page,{includePadding:!0,incorporateViewport:!0});let t=window.getComputedStyle(this._innerElement,null).getPropertyValue("margin-left");this._pageToolsElem.style.top=e.top+"px",this._pageToolsElem.style.left=e.left-parseInt(t)+"px",this._pageLabelsElem.style.top=e.top+"px",this._pageLabelsElem.style.left=e.right-parseInt(t)-this.labelWidth-5+"px"}}class v{constructor(e){if(this._viewerCore=e,this._viewerState=e.getInternalState(),this._overlays=[],this._viewerCore.getPageTools().length){const t=e.getSettings().numPages;for(let n=0;n{const n=t.getPageDimensions(e),s=t.getPageOffset(e,{includePadding:!0}),o=s.left+n.width/2,a=s.top+n.height/2,c=Math.max(Math.abs(r-o)-n.width/2,0),l=Math.max(Math.abs(i-a)-n.height/2,0);return-(c*c+l*l)});return null!=s?s:null}(e,this._viewerCore.getCurrentLayout(),this._viewerCore.getViewport());let i=this._viewerState.viewport.intersectionTolerance;this._viewerState.viewport.intersectionTolerance=0;let r=e.filter(e=>this._viewerState.renderer.isPageVisible(e));this._viewerState.viewport.intersectionTolerance=i,null!==n&&this._viewerCore.setCurrentPages(n,r),null!==t&&this._viewerCore.publish("ViewerDidJump",t),this._handleZoomLevelChange()}_handleZoomLevelChange(){const e=this._viewerState,t=e.options.zoomLevel;e.oldZoomLevel!==t&&e.oldZoomLevel>=0&&(e.oldZoomLevel{this._viewerCore.removePageOverlay(e)},this)}}class y{constructor(e){this._viewerCore=e}onDoubleClick(e,t){const n=this._viewerCore.getPagePositionAtViewportOffset(t),i=this._viewerCore.getCurrentLayout(),r=this._viewerCore.getViewport(),s=i.getPageToViewportCenterOffset(n.anchorPage,r);this._viewerCore.reload({inGrid:!1,goDirectlyTo:n.anchorPage,horizontalOffset:s.x+n.offset.left,verticalOffset:s.y+n.offset.top})}onPinch(){this._viewerCore.reload({inGrid:!1})}onViewWillLoad(){}onViewDidLoad(){}onViewDidUpdate(e,t){if(0===e.length)return;let n=this._viewerCore.viewerState.viewport.intersectionTolerance;this._viewerCore.viewerState.viewport.intersectionTolerance=0;let i=e.filter(e=>this._viewerCore.viewerState.renderer.isPageVisible(e));if(this._viewerCore.viewerState.viewport.intersectionTolerance=n,null!==t)return void this._viewerCore.setCurrentPages(t,i);const r=this._viewerCore.getCurrentLayout(),s=[];e.forEach(e=>{const t=r.getPageInfo(e).group;0!==s.length&&t===s[s.length-1]||s.push(t)});const o=this._viewerCore.getViewport();let a;a=1===s.length||s[0].region.top>=o.top?s[0]:s[1].region.bottom<=o.bottom?s[1]:function(e,t){const n=t.top+t.height/2;return Object(p.maxBy)(e,e=>{const t=e.region.top+e.dimensions.height/2;return-Math.abs(n-t)})}(s,o);const c=this._viewerCore.getSettings().activePageIndex;a.pages.some(e=>e.index===c)||this._viewerCore.setCurrentPages(a.pages[0].index,i)}destroy(){}}class b{constructor(){this._pages={},this._renderedPages=[],this._renderedPageMap={}}addOverlay(e){(this._pages[e.page]||(this._pages[e.page]=[])).push(e),this._renderedPageMap[e.page]&&e.mount()}removeOverlay(e){const t=e.page,n=this._pages[t];if(!n)return;const i=n.indexOf(e);-1!==i&&(this._renderedPageMap[t]&&n[i].unmount(),n.splice(i,1),0===n.length&&delete this._pages[t])}updateOverlays(e){const t=this._renderedPages,n={};e.map(e=>{n[e]=!0,this._renderedPageMap[e]||(this._renderedPageMap[e]=!0,this._invokeOnOverlays(e,e=>{e.mount()}))}),t.map(e=>{n[e]?this._invokeOnOverlays(e,e=>{e.refresh()}):(delete this._renderedPageMap[e],this._invokeOnOverlays(e,e=>{e.unmount()}))}),this._renderedPages=e}_invokeOnOverlays(e,t){const n=this._pages[e];n&&n.map(e=>t(e))}}class w{constructor(e,t){this._rows=e,this._cols=t,this._map=new Array(e).fill(null).map(()=>new Array(t).fill(!1))}isLoaded(e,t){return e>=this._rows||t>=this._cols||this._map[e][t]}set(e,t,n){this._map[e][t]=n}}class _{constructor(e){this._levels=e;const t=this._urlsToTiles={};e.forEach(e=>{e.tiles.forEach(n=>{t[n.url]={zoomLevel:e.zoomLevel,row:n.row,col:n.col}})}),this.clear()}clear(){const e=this._loadedByLevel={};this._levels.forEach(t=>{e[t.zoomLevel]=new w(t.rows,t.cols)})}getTiles(e){const t=[],n=this._levels[0].zoomLevel,i=new w(this._levels[0].rows,this._levels[0].cols);let r;if(null===e)r=0;else{const t=Math.ceil(e);r=function(e,t){const n=e.length;for(let i=0;ie.zoomLevel<=t)}this._levels.slice(0,r+1).reverse().concat(this._levels.slice(r+1)).forEach(e=>{const r=this._loadedByLevel[e.zoomLevel];let s=e.tiles.filter(e=>r.isLoaded(e.row,e.col));const o=Math.pow(2,n-e.zoomLevel);s=s.filter(e=>{let t=!1;const n=e.row*o,r=e.col*o;for(let e=0;e{s.push.apply(s,e)}),s}updateFromCache(e){this.clear(),this._levels.forEach(t=>{const n=this._loadedByLevel[t.zoomLevel];t.tiles.forEach(t=>{e.has(t.url)&&n.set(t.row,t.col,!0)})},this)}updateWithLoadedUrls(e){e.forEach(e=>{const t=this._urlsToTiles[e];this._loadedByLevel[t.zoomLevel].set(t.row,t.col,!0)},this)}}class E{constructor(e,t){const n=function(e,t){const n=null===t?e.pageLayouts:function(e,t){const n=Math.pow(2,t-e.maxZoomLevel);return e.pageLayouts.map(e=>({dimensions:x(e.dimensions,n),pages:e.pages.map(e=>({index:e.index,groupOffset:{top:Math.floor(e.groupOffset.top*n),left:Math.floor(e.groupOffset.left*n)},dimensions:x(e.dimensions,n)}))}))}(e,t),i=function(e,t){let n,i;const r=e.padding.document;e.verticallyOriented?(n="width",i=r.left+r.right):(n="height",i=r.top+r.bottom);return i+t.reduce((e,t)=>Math.max(t.dimensions[n],e),0)}(e,n);let r=e.verticallyOriented?e.padding.document.top:e.padding.document.left;const s=[],o={top:e.padding.page.top,left:e.padding.page.left};let a,c;n.forEach((t,n)=>{let a,c;e.verticallyOriented?(a=r,c=(i-t.dimensions.width)/2):(a=(i-t.dimensions.height)/2,c=r);const l={top:a,bottom:a+o.top+t.dimensions.height,left:c,right:c+o.left+t.dimensions.width};s.push({index:n,dimensions:t.dimensions,pages:t.pages,region:l,padding:o}),r=e.verticallyOriented?l.bottom:l.right}),e.verticallyOriented?(a=r+o.top,c=i):(a=i,c=r+o.left);return{dimensions:{height:a,width:c},pageGroups:s}}(e,t);this.dimensions=n.dimensions,this.pageGroups=n.pageGroups,this._pageLookup=function(e){const t={};return e.forEach(e=>{e.pages.forEach(n=>{t[n.index]={index:n.index,group:e,dimensions:n.dimensions,groupOffset:n.groupOffset}})}),t}(n.pageGroups)}getPageInfo(e){return this._pageLookup[e]||null}getPageDimensions(e){if(!this._pageLookup||!this._pageLookup[e])return null;const t=S(this._pageLookup[e]);return{height:t.bottom-t.top,width:t.right-t.left}}getPageOffset(e,t){const n=this.getPageRegion(e,t);return n?{top:n.top,left:n.left}:null}getPageRegion(e,t){const n=this._pageLookup[e];if(!n)return null;const i=S(n),r=n.group.padding;return t&&t.includePadding?{top:i.top+r.top,left:i.left+r.left,bottom:i.bottom,right:i.right}:{top:i.top,left:i.left,bottom:i.bottom+r.top,right:i.right}}getPageToViewportCenterOffset(e,t){const n=t.left,i=t.right-t.left,r=this.getPageOffset(e),s=n-r.left+parseInt(i/2,10),o=t.top,a=t.bottom-t.top;return{x:s,y:o-r.top+parseInt(a/2,10)}}}function S(e){const t=e.groupOffset.top+e.group.region.top,n=t+e.dimensions.height,i=e.groupOffset.left+e.group.region.left;return{top:t,bottom:n,left:i,right:i+e.dimensions.width}}function x(e,t){return{height:Math.floor(e.height*t),width:Math.floor(e.width*t)}}const L=n(51)("diva:ImageCache");class A{constructor(e){e=e||{maxKeys:100},this.maxKeys=e.maxKeys||100,this._held={},this._urls={},this._lru=[]}get(e){const t=this._urls[e];return t?t.img:null}has(e){return!!this._urls[e]}put(e,t){let n=this._urls[e];n?(n.img=t,this._promote(n)):(n={img:t,url:e},this._urls[e]=n,this._tryEvict(1),this._lru.unshift(n))}_promote(e){const t=this._lru.indexOf(e);this._lru.splice(t,1),this._lru.unshift(e)}_tryEvict(e){const t=this.maxKeys-e;if(this._lru.length<=t)return;let n=this._lru.length-1;for(;;){const e=this._lru[n];if(!this._held[e.url]&&(L("Evicting image %s",e.url),this._lru.splice(n,1),delete this._urls[e.url],this._lru.length<=t))break;if(0===n){L.enabled&&L("Cache overfull by %s (all entries are being held)",this._lru.length-t);break}n--}}acquire(e){this._held[e]=(this._held[e]||0)+1,this._promote(this._urls[e])}release(e){this._held[e]>1?this._held[e]--:delete this._held[e],this._tryEvict(0)}}class k{constructor(e){this._url=e.url,this._callback=e.load,this._errorCallback=e.error,this.timeoutTime=e.timeoutTime||0,this._aborted=this._complete=!1,this._crossOrigin=e.settings.imageCrossOrigin,this.timeout=setTimeout(()=>{this._image=new Image,this._image.crossOrigin=this._crossOrigin,this._image.onload=this._handleLoad.bind(this),this._image.onerror=this._handleError.bind(this),this._image.src=e.url},this.timeoutTime)}abort(){clearTimeout(this.timeout),this._image&&(this._image.onload=this._image.onerror=null,this._image.src=""),this._aborted=!0}_handleLoad(){this._aborted?console.error("ImageRequestHandler invoked on cancelled request for "+this._url):this._complete?console.error("ImageRequestHandler invoked on completed request for "+this._url):(this._complete=!0,this._callback(this._image))}_handleError(){this._errorCallback(this._image)}}var C={animate:function(e){const t=e.duration,n=e.parameters,i=e.onUpdate,r=e.onEnd,s=I(),o=s+t,a={},c={},l=Object.keys(n);l.forEach(e=>{const t=n[e];a[e]=function(e,t,n){return i=>e+(t-e)*n(i)}(t.from,t.to,t.easing||P)});let u=requestAnimationFrame((function e(){const n=I();(function(e){l.forEach(t=>{c[t]=a[t](e)})})(Math.min((n-s)/t,1)),i(c),nperformance.now():()=>Date.now();class O{constructor(e,t){this._viewport=e.viewport,this._outerElement=e.outerElement,this._documentElement=e.innerElement,this._settings=e.settings,this._hooks=t||{},this._canvas=i("canvas",{class:"diva-viewer-canvas"}),this._ctx=this._canvas.getContext("2d"),this.layout=null,this._sourceResolver=null,this._renderedPages=null,this._config=null,this._zoomLevel=null,this._compositeImages=null,this._renderedTiles=null,this._animation=null,this._cache=new A,this._pendingRequests={}}static getCompatibilityErrors(){return"undefined"!=typeof HTMLCanvasElement?null:["Your browser lacks support for the ",i("pre","canvas")," element. Please upgrade your browser."]}load(e,t,n){if(this._clearAnimation(),this._hooks.onViewWillLoad&&this._hooks.onViewWillLoad(),this._sourceResolver=n,this._config=e,this._compositeImages={},this._setLayoutToZoomLevel(t.zoomLevel),!this.layout.getPageInfo(t.anchorPage))throw new Error("invalid page: "+t.anchorPage);this._canvas.width===this._viewport.width&&this._canvas.height===this._viewport.height||(this._canvas.width=this._viewport.width,this._canvas.height=this._viewport.height),this.goto(t.anchorPage,t.verticalOffset,t.horizontalOffset),this._canvas.parentNode!==this._outerElement&&this._outerElement.insertBefore(this._canvas,this._outerElement.firstChild),this._hooks.onViewDidLoad&&this._hooks.onViewDidLoad()}_setViewportPosition(e){if(e.zoomLevel!==this._zoomLevel){if(null===this._zoomLevel)throw new TypeError("The current view is not zoomable");if(null===e.zoomLevel)throw new TypeError("The current view requires a zoom level");this._setLayoutToZoomLevel(e.zoomLevel)}this._goto(e.anchorPage,e.verticalOffset,e.horizontalOffset)}_setLayoutToZoomLevel(e){this.layout=new E(this._config,e),this._zoomLevel=e,s(this._documentElement,{style:{height:this.layout.dimensions.height+"px",width:this.layout.dimensions.width+"px"}}),this._viewport.setInnerDimensions(this.layout.dimensions)}adjust(){this._clearAnimation(),this._render(),this._hooks.onViewDidUpdate&&this._hooks.onViewDidUpdate(this._renderedPages.slice(),null)}_render(){const e=[];this.layout.pageGroups.forEach(t=>{if(!this._viewport.intersectsRegion(t.region))return;const n=t.pages.filter((function(e){return this.isPageVisible(e.index)}),this).map(e=>e.index);e.push.apply(e,n)},this),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._paintOutline(e),e.forEach(e=>{if(!this._compositeImages[e]){const t=this.layout.getPageInfo(e),n=this._sourceResolver.getAllZoomLevelsForPage(t),i=new _(n);i.updateFromCache(this._cache),this._compositeImages[e]=i}},this),this._initiateTileRequests(e);const t=T(this._renderedPages||[],e);t.removed.forEach(e=>{delete this._compositeImages[e]},this),this._renderedPages=e,this._paint(),this._hooks.onPageWillLoad&&t.added.forEach(e=>{this._hooks.onPageWillLoad(e)},this)}_paint(){const e=[];this._renderedPages.forEach(t=>{this._compositeImages[t].getTiles(this._zoomLevel).forEach(n=>{const i=B(n,this._zoomLevel);this._isTileVisible(t,i)&&(e.push(n.url),this._drawTile(t,i,this._cache.get(n.url)))})});const t=this._cache,n=T(this._renderedTiles||[],e);n.added.forEach(e=>{t.acquire(e)}),n.removed.forEach(e=>{t.release(e)}),n.removed&&this._renderedPages.forEach(e=>{this._compositeImages[e].updateFromCache(this._cache)},this),this._renderedTiles=e}_paintOutline(e){e.forEach(e=>{let t=this.layout.getPageInfo(e),n=this._getImageOffset(e),i=Math.max(0,(this._viewport.width-this.layout.dimensions.width)/2),r=Math.max(0,(this._viewport.height-this.layout.dimensions.height)/2),s=n.left-this._viewport.left+i,o=n.top-this._viewport.top+r,a=s<0?-s:0,c=o<0?-o:0,l=Math.max(0,s),u=Math.max(0,o),d=t.dimensions.width-a,h=t.dimensions.height-c;this._ctx.strokeStyle="#AAA",this._ctx.strokeRect(l+.5,u+.5,d,h)})}_initiateTileRequests(e){const t={},n=(e,n)=>{const i=this._compositeImages[n];t[e.url]=new k({url:e.url,timeoutTime:250,settings:this._settings,load:t=>{delete this._pendingRequests[e.url],this._cache.put(e.url,t),i===this._compositeImages[n]?(i.updateWithLoadedUrls([e.url]),this._isTileForSourceVisible(n,e)&&this._paint()):this._isTileForSourceVisible(n,e)&&this._paint()},error:()=>{delete this._pendingRequests[e.url]}})};for(let i=0;i{this._setViewportPosition(t(e)),this._hooks.onZoomLevelWillChange(e.zoomLevel),n&&n()},onEnd:t=>{e.onEnd&&e.onEnd(t),this._hooks.onViewDidUpdate&&!t.interrupted&&this._hooks.onViewDidUpdate(this._renderedPages.slice(),null)}})}_clearAnimation(){this._animation&&(this._animation.cancel(),this._animation=null)}isPageVisible(e){if(!this.layout)return!1;return!!this.layout.getPageInfo(e)&&this._viewport.intersectsRegion(this.layout.getPageRegion(e))}getRenderedPages(){return this._renderedPages.slice()}destroy(){this._clearAnimation(),Object.keys(this._pendingRequests).forEach(e=>{const t=this._pendingRequests[e];delete this._pendingRequests[e],t.abort()},this),this._canvas.parentNode.removeChild(this._canvas)}}function B(e,t){let n;return n=null===t?1:Math.pow(2,t-e.zoomLevel),{sourceZoomLevel:e.zoomLevel,scaleRatio:n,row:e.row,col:e.col,dimensions:{width:e.dimensions.width*n,height:e.dimensions.height*n},offset:{left:e.offset.left*n,top:e.offset.top*n},url:e.url}}function T(e,t){if(e===t)return{added:[],removed:[]};const n=e.filter(e=>-1===t.indexOf(e));return{added:t.filter(t=>-1===e.indexOf(t)),removed:n}}function N(e,t){const n=t.getMaxPageDimensions(e);return{width:Math.floor(n.width),height:Math.floor(n.height)}}function M(e){return function(e){const t=e.manifest,n=[];let i=null,r=[];const s=()=>{for(let e=0,t=r.length;e{const c={index:a,dimensions:N(a,t),paged:!t.paged||o.paged};(e.showNonPagedPages||c.paged)&&(c.paged?0===a||o.facingPages?(n.push([c]),s()):null===i?i=c:(n.push([i,c]),i=null,s()):r.push(c))}),null!==i&&(n.push([i]),s());return n}(e).map(t=>function(e,t){const n=e.verticallyOriented;if(2===t.length)return function(e,t,n){const i=e.dimensions,r=t.dimensions,s=Math.max(i.height,r.height);let o,a,c;if(n){const e=Math.max(i.width,r.width);o=2*e,a=e-i.width,c=e}else o=i.width+r.width,a=0,c=i.width;return{dimensions:{height:s,width:o},pages:[{index:e.index,dimensions:i,groupOffset:{top:0,left:a}},{index:t.index,dimensions:r,groupOffset:{top:0,left:c}}]}}(t[0],t[1],n);const i=t[0],r=i.dimensions;let s;s=i.paged?0===i.index&&n?r.width:0:n?r.width/2:0;const o=n&&!e.manifest.pages[i.index].facingPages;return{dimensions:{height:r.height,width:o?2*r.width:r.width},pages:[{index:i.index,groupOffset:{top:0,left:s},dimensions:r}]}}(e,t))}function q(e){const t=e.viewport.width,n=e.manifest,i=e.pagesPerRow,r=e.fixedHeightGrid,s=e.fixedPadding,o=e.showNonPagedPages,a=(t-s*(i+1))/i,c=a,l=r?s+n.minRatio*a:s+n.maxRatio*a,u=[];let d=[];const h={height:l,width:t};return n.pages.forEach((e,t)=>{if(!o&&n.paged&&!e.paged)return;const a=(e=>{const t=e.d[e.d.length-1],n=t.h/t.w;let i,o;return r?(i=(l-s)/n,o=l-s):(i=c,o=i*n),{width:Math.round(i),height:Math.round(o)}})(e);let f=Math.floor(d.length*(s+c)+s);r&&(f+=(c-a.width)/2),d.push({index:t,dimensions:a,groupOffset:{top:0,left:f}}),d.length===i&&(u.push({dimensions:h,pages:d}),d=[])}),d.length>0&&u.push({dimensions:h,pages:d}),u}function D(e){if(e.inGrid)return q(F(e,["manifest","viewport","pagesPerRow","fixedHeightGrid","fixedPadding","showNonPagedPages"]));{const t=F(e,["manifest","verticallyOriented","showNonPagedPages"]);return e.inBookLayout?M(t):function(e){const t=e.manifest,n=[];return t.pages.forEach((i,r)=>{if(!e.showNonPagedPages&&t.paged&&!i.paged)return;const s=N(r,t);n.push({dimensions:s,pages:[{index:r,groupOffset:{top:0,left:0},dimensions:s}]})}),n}(t)}}function F(e,t){const n={};return t.forEach((function(t){n[t]=e[t]})),n}function j(e){const t={};return e.forEach(e=>{!function(e,t){Object.keys(t).forEach(n=>{Object.defineProperty(e,n,{get:()=>t[n],set:()=>{throw new TypeError("Cannot set settings."+n)}})})}(t,e)}),t}class R{constructor(e){this.whitelistedKeys=e.whitelistedKeys||[],this.additionalProperties=e.additionalProperties||[],this.validations=e.validations}isValid(e,t,n){let i=null;if(this.validations.some((t,n)=>t.key===e&&(i=n,!0)),null===i)return!0;const r={};r[e]=t;const s=V(n,r,this);return!this._runValidation(i,t,s)}validate(e){this._validateOptions({},e)}getValidatedOptions(e,t){const n=Object.assign({},t);return this._validateOptions(e,n),n}_validateOptions(e,t){const n=V(e,t,this);this._applyValidations(t,n)}_applyValidations(e,t){this.validations.forEach((n,i)=>{if(!e.hasOwnProperty(n.key))return;const r=e[n.key],s=this._runValidation(i,r,t);s&&(s.warningSuppressed||function(e,t,n){console.warn("Invalid value for "+e+": "+t+". Using "+n+" instead.")}(n.key,r,s.value),e[n.key]=s.value)},this)}_runValidation(e,t,n){const i=this.validations[e];n.index=e;let r=!1;const s={suppressWarning:()=>{r=!0}},o=i.validate(t,n.proxy,s);return void 0===o||o===t?null:{value:o,warningSuppressed:r}}}function V(e,t,n){const i={proxy:{},index:null},r=z.bind(null,e,t),s={};return n.whitelistedKeys.forEach(e=>{s[e]={get:r.bind(null,e)}}),n.additionalProperties.forEach(e=>{s[e.key]={get:e.get}}),n.validations.forEach((e,t)=>{s[e.key]={get:()=>{if(t=n}hasHorizontalOverlap(e){const t=this.left-this.intersectionTolerance,n=this.right+this.intersectionTolerance;return Z(e.left,t,n)||Z(e.right,t,n)||e.left<=t&&e.right>=n}invalidate(){this._width=this.outer.clientWidth,this._height=this.outer.clientHeight,this._top=this.outer.scrollTop,this._left=this.outer.scrollLeft}setInnerDimensions(e){this._innerDimensions=e,e&&(this._top=G(this._top,0,e.height-this._height),this._left=G(this._left,0,e.width-this._width))}}function U(e,t){const n="_"+e,i="scroll"+e.charAt(0).toUpperCase()+e.slice(1);return{get:function(){return this[n]},set:function(e){let r;if(this._innerDimensions){r=G(e,0,this._innerDimensions[t]-this[t])}else r=W(e,0);this[n]=this.outer[i]=r}}}function $(e){return{get:function(){return this["_"+e]}}}function Z(e,t,n){return e>=t&&e<=n}function G(e,t,n){return W(function(e,t){return Math.min(e,t)}(e,n),t)}function W(e,t){return Math.max(e,t)}Object.defineProperties(H.prototype,{top:U("top","height"),left:U("left","width"),width:$("width"),height:$("height"),bottom:{get:function(){return this._top+this._height}},right:{get:function(){return this._left+this._width}}});const K=n(51)("diva:ViewerCore");function Y(){return Y.counter++}Y.counter=1;const X=[{key:"goDirectlyTo",validate:(e,t)=>{if(e<0||e>=t.manifest.pages.length)return 0}},{key:"minPagesPerRow",validate:e=>Math.max(2,e)},{key:"maxPagesPerRow",validate:(e,t)=>Math.max(e,t.minPagesPerRow)},{key:"pagesPerRow",validate:(e,t)=>{if(et.maxPagesPerRow)return t.maxPagesPerRow}},{key:"maxZoomLevel",validate:(e,t,n)=>{if(n.suppressWarning(),e<0||e>t.manifest.maxZoom)return t.manifest.maxZoom}},{key:"minZoomLevel",validate:(e,t,n)=>e>t.manifest.maxZoom?(n.suppressWarning(),0):e<0||e>t.maxZoomLevel?0:void 0},{key:"zoomLevel",validate:(e,t,n)=>e>t.manifest.maxZoom?(n.suppressWarning(),0):et.maxZoomLevel?t.minZoomLevel:void 0}];class J{constructor(e,t,n){this.parentObject=e,this.publicInstance=n,this.viewerState={currentPageIndices:[0],activePageIndex:0,horizontalOffset:0,horizontalPadding:0,ID:null,initialKeyScroll:!1,initialSpaceScroll:!1,innerElement:null,innerObject:{},isActiveDiva:!0,isScrollable:!0,isZooming:!1,loaded:!1,manifest:null,mobileWebkit:!1,numPages:0,oldZoomLevel:-1,options:t,outerElement:null,outerObject:{},pageOverlays:new b,pageTools:[],parentObject:this.parentObject,pendingManifestRequest:null,pluginInstances:[],renderer:null,resizeTimer:-1,scrollbarWidth:0,selector:"",throbberTimeoutID:-1,toolbar:null,verticalOffset:0,verticalPadding:0,viewHandler:null,viewport:null,viewportElement:null,viewportObject:null,zoomDuration:400},this.settings=j([t,this.viewerState]);const r=Y();this.viewerState.ID="diva-"+r+"-",this.viewerState.selector=this.settings.ID,Object.defineProperties(this.settings,{panelHeight:{get:()=>this.viewerState.viewport.height},panelWidth:{get:()=>this.viewerState.viewport.width}}),this.optionsValidator=new R({additionalProperties:[{key:"manifest",get:()=>this.viewerState.manifest}],validations:X}),this.viewerState.scrollbarWidth=function(){let e=document.createElement("p");e.style.width="100%",e.style.height="200px";let t=document.createElement("div");t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.visibility="hidden",t.style.width="200px",t.style.height="150px",t.style.overflow="hidden",t.appendChild(e),document.body.appendChild(t);let n=e.offsetWidth;t.style.overflow="scroll";let i=e.offsetWidth;return n===i&&(i=t.clientWidth),document.body.removeChild(t),n-i}(),this.viewerState.mobileWebkit=void 0!==window.orientation,null===t.hashParamSuffix&&(t.hashParamSuffix=1===r?"":r+"");const s=i("div",this.elemAttrs("inner",{class:"diva-inner"})),o=i("div",this.elemAttrs("viewport"),s),a=i("div",this.elemAttrs("outer"),o,i("div",this.elemAttrs("throbber"),[i("div",{class:"cube cube1"}),i("div",{class:"cube cube2"}),i("div",{class:"cube cube3"}),i("div",{class:"cube cube4"}),i("div",{class:"cube cube5"}),i("div",{class:"cube cube6"}),i("div",{class:"cube cube7"}),i("div",{class:"cube cube8"}),i("div",{class:"cube cube9"})]));this.viewerState.innerElement=s,this.viewerState.viewportElement=o,this.viewerState.outerElement=a,this.viewerState.innerObject=s,this.viewerState.viewportObject=o,this.viewerState.outerObject=a,this.settings.parentObject.append(a),this.viewerState.viewport=new H(this.viewerState.viewportElement,{intersectionTolerance:this.settings.viewportMargin}),this.boundScrollFunction=this.scrollFunction.bind(this),this.boundEscapeListener=this.escapeListener.bind(this),this.initPlugins(),this.handleEvents(),this.showThrobber()}isValidOption(e,t){return this.optionsValidator.isValid(e,t,this.viewerState.options)}elemAttrs(e,t){const n={id:this.settings.ID+e,class:"diva-"+e};return t?Object.assign(n,t):n}getPageData(e,t){return this.settings.manifest.pages[e].d[this.settings.zoomLevel][t]}clearViewer(){this.viewerState.viewport.top=0,clearTimeout(this.viewerState.resizeTimer)}hasChangedOption(e,t){return t in e&&e[t]!==this.settings[t]}escapeListener(e){27===e.keyCode&&this.publicInstance.leaveFullscreenMode()}reloadViewer(e){const t=[];if(e=this.optionsValidator.getValidatedOptions(this.settings,e),this.hasChangedOption(e,"zoomLevel")&&(this.viewerState.oldZoomLevel=this.settings.zoomLevel,this.viewerState.options.zoomLevel=e.zoomLevel,t.push(["ZoomLevelDidChange",e.zoomLevel])),this.hasChangedOption(e,"pagesPerRow")&&(this.viewerState.options.pagesPerRow=e.pagesPerRow,t.push(["GridRowNumberDidChange",e.pagesPerRow])),this.hasChangedOption(e,"verticallyOriented")&&(this.viewerState.options.verticallyOriented=e.verticallyOriented),this.hasChangedOption(e,"showNonPagedPages")&&(this.viewerState.options.showNonPagedPages=e.showNonPagedPages),"goDirectlyTo"in e?(this.viewerState.options.goDirectlyTo=e.goDirectlyTo,"verticalOffset"in e&&(this.viewerState.verticalOffset=e.verticalOffset),"horizontalOffset"in e&&(this.viewerState.horizontalOffset=e.horizontalOffset)):this.viewerState.options.goDirectlyTo=this.settings.activePageIndex,(this.hasChangedOption(e,"inGrid")||this.hasChangedOption(e,"inBookLayout"))&&("inGrid"in e&&(this.viewerState.options.inGrid=e.inGrid),"inBookLayout"in e&&(this.viewerState.options.inBookLayout=e.inBookLayout),t.push(["ViewDidSwitch",this.settings.inGrid])),this.hasChangedOption(e,"inFullscreen")&&(this.viewerState.options.inFullscreen=e.inFullscreen,this.prepareModeChange(e),t.push(["ModeDidSwitch",this.settings.inFullscreen])),this.clearViewer(),this.updateViewHandlerAndRendering(),this.viewerState.renderer){const e={pageLayouts:D(this.settings),padding:this.getPadding(),maxZoomLevel:this.settings.inGrid?null:this.viewerState.manifest.maxZoom,verticallyOriented:this.settings.verticallyOriented||this.settings.inGrid},t={zoomLevel:this.settings.inGrid?null:this.settings.zoomLevel,anchorPage:this.settings.goDirectlyTo,verticalOffset:this.viewerState.verticalOffset,horizontalOffset:this.viewerState.horizontalOffset},n=this.getCurrentSourceProvider();if(K.enabled){const t=Object.keys(e).filter((function(e){return"pageLayouts"!==e&&"padding"!==e})).map((function(t){const n=e[t];return t+": "+JSON.stringify(n)})).join(", ");K("reload with %s",t)}this.viewerState.renderer.load(e,t,n)}return t.forEach(e=>{this.publish.apply(this,e)}),!0}prepareModeChange(e){const t=e.inFullscreen?"add":"remove";this.viewerState.outerObject.classList[t]("diva-fullscreen"),document.body.classList[t]("diva-hide-scrollbar"),this.settings.parentObject.classList[t]("diva-full-width");const n=this.settings.panelHeight,i=this.settings.panelWidth;if(this.viewerState.viewport.invalidate(),!this.viewerState.loaded&&!this.settings.inGrid&&!("verticalOffset"in e)){const e=this.settings.panelHeight,t=this.settings.panelWidth;this.viewerState.verticalOffset+=(n-e)/2,this.viewerState.horizontalOffset+=(i-t)/2}e.inFullscreen?document.addEventListener("keyup",this.boundEscapeListener):document.removeEventListener("keyup",this.boundEscapeListener)}updateViewHandlerAndRendering(){const e=this.settings.inGrid?y:v;!this.viewerState.viewHandler||this.viewerState.viewHandler instanceof e||(this.viewerState.viewHandler.destroy(),this.viewerState.viewHandler=null),this.viewerState.viewHandler||(this.viewerState.viewHandler=new e(this)),this.viewerState.renderer||this.initializeRenderer()}initializeRenderer(){const e=O.getCompatibilityErrors();if(e)this.showError(e);else{const e={viewport:this.viewerState.viewport,outerElement:this.viewerState.outerElement,innerElement:this.viewerState.innerElement,settings:this.settings},t={onViewWillLoad:()=>{this.viewerState.viewHandler.onViewWillLoad()},onViewDidLoad:()=>{this.updatePageOverlays(),this.viewerState.viewHandler.onViewDidLoad()},onViewDidUpdate:(e,t)=>{this.updatePageOverlays(),this.viewerState.viewHandler.onViewDidUpdate(e,t)},onViewDidTransition:()=>{this.updatePageOverlays()},onPageWillLoad:e=>{this.publish("PageWillLoad",e)},onZoomLevelWillChange:e=>{this.publish("ZoomLevelWillChange",e)}};this.viewerState.renderer=new O(e,t)}}getCurrentSourceProvider(){if(this.settings.inGrid){const e={getAllZoomLevelsForPage:t=>[e.getBestZoomLevelForPage(t)],getBestZoomLevelForPage:e=>({zoomLevel:1,rows:1,cols:1,tiles:[{url:this.settings.manifest.getPageImageURL(e.index,{width:e.dimensions.width}),zoomLevel:1,row:0,col:0,dimensions:e.dimensions,offset:{top:0,left:0}}]})};return e}const e={width:this.settings.tileWidth,height:this.settings.tileHeight};return{getBestZoomLevelForPage:t=>this.settings.manifest.getPageImageTiles(t.index,Math.ceil(this.settings.zoomLevel),e),getAllZoomLevelsForPage:t=>{const n=[],i=this.viewerState.manifest.maxZoom;for(let r=0;r<=i;r++)n.push(this.settings.manifest.getPageImageTiles(t.index,r,e));return n.reverse(),n}}}getPadding(){let e,t,n,i;return this.settings.inGrid?(n=this.settings.fixedPadding,e=t=i=0):(e=this.settings.verticallyOriented?this.viewerState.verticalPadding:0,t=this.settings.verticallyOriented?0:this.viewerState.horizontalPadding,n=this.settings.verticallyOriented?0:this.viewerState.verticalPadding,i=this.settings.verticallyOriented?this.viewerState.horizontalPadding:0),{document:{top:n,bottom:n,left:i,right:i},page:{top:e,bottom:0,left:t,right:0}}}updatePageOverlays(){this.viewerState.pageOverlays.updateOverlays(this.viewerState.renderer.getRenderedPages())}handleZoom(e,t){if(!this.isValidOption("zoomLevel",e))return!1;if(this.viewerState.viewportObject.removeEventListener("scroll",this.boundScrollFunction),!t){const e=this.viewerState.viewport,n=this.viewerState.renderer.layout.getPageRegion(this.settings.activePageIndex);t={anchorPage:this.settings.activePageIndex,offset:{left:e.width/2-(n.left-e.left),top:e.height/2-(n.top-e.top)}}}const n=this.viewerState.renderer.layout.getPageRegion(t.anchorPage),i=n.left+t.offset.left-(this.settings.viewport.left+this.settings.viewport.width/2),r=n.top+t.offset.top-(this.settings.viewport.top+this.settings.viewport.height/2),s=(e,n)=>{const s=Math.pow(2,e-n),o=t.offset.left*s-i,a=t.offset.top*s-r;return{zoomLevel:e,anchorPage:t.anchorPage,verticalOffset:a,horizontalOffset:o}};this.viewerState.options.zoomLevel=e;let o=this.viewerState.oldZoomLevel;this.viewerState.oldZoomLevel=this.settings.zoomLevel;const a=s(e,o);this.viewerState.options.goDirectlyTo=a.anchorPage,this.viewerState.verticalOffset=a.verticalOffset,this.viewerState.horizontalOffset=a.horizontalOffset,this.viewerState.renderer.transitionViewportPosition({duration:this.settings.zoomDuration,parameters:{zoomLevel:{from:o,to:e}},getPosition:e=>s(e.zoomLevel,o),onEnd:t=>{this.viewerState.viewportObject.addEventListener("scroll",this.boundScrollFunction),t.interrupted&&(this.viewerState.oldZoomLevel=e)}});let c=document.getElementById(this.settings.selector+"zoom-in-button"),l=document.getElementById(this.settings.selector+"zoom-out-button");return c.disabled=!0,l.disabled=!0,setTimeout(()=>{c.disabled=!1,l.disabled=!1},this.settings.zoomDuration),this.publish("ZoomLevelDidChange",e),!0}getYOffset(e,t){let n=void 0===e?this.settings.activePageIndex:e;return"center"===t||"centre"===t?parseInt(this.getPageData(n,"h")/2,10):"bottom"===t?parseInt(this.getPageData(n,"h")-this.settings.panelHeight/2,10):parseInt(this.settings.panelHeight/2,10)}getXOffset(e,t){let n=void 0===e?this.settings.activePageIndex:e;return"left"===t?parseInt(this.settings.panelWidth/2,10):"right"===t?parseInt(this.getPageData(n,"w")-this.settings.panelWidth/2,10):parseInt(this.getPageData(n,"w")/2,10)}updatePanelSize(){return this.viewerState.viewport.invalidate(),this.viewerState.renderer&&(this.updateOffsets(),this.viewerState.renderer.goto(this.settings.activePageIndex,this.viewerState.verticalOffset,this.viewerState.horizontalOffset)),!0}updateOffsets(){const e=this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.activePageIndex,this.viewerState.viewport);e&&(this.viewerState.horizontalOffset=e.x,this.viewerState.verticalOffset=e.y)}bindMouseEvents(){this.viewerState.viewportObject.classList.add("dragscroll"),d.onDoubleClick(this.viewerState.viewportObject,(e,t)=>{K("Double click at %s, %s",t.left,t.top),this.viewerState.viewHandler.onDoubleClick(e,t)})}onResize(){this.updatePanelSize(),clearTimeout(this.viewerState.resizeTimer),this.viewerState.resizeTimer=setTimeout(()=>{const e=this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.activePageIndex,this.viewerState.viewport);e?this.reloadViewer({goDirectlyTo:this.settings.activePageIndex,verticalOffset:e.y,horizontalOffset:e.x}):this.reloadViewer({goDirectlyTo:this.settings.activePageIndex})},200)}bindTouchEvents(){this.settings.blockMobileMove&&document.body.addEventListener("touchmove",e=>(e.originalEvent.preventDefault(),!1)),d.onPinch(this.viewerState.viewportObject,(function(e,t,n,i){K("Pinch %s at %s, %s",i-n,t.left,t.top),this.viewerState.viewHandler.onPinch(e,t,n,i)})),d.onDoubleTap(this.viewerState.viewportObject,(function(e,t){K("Double tap at %s, %s",t.left,t.top),this.viewerState.viewHandler.onDoubleClick(e,t)}))}scrollFunction(){const e=this.viewerState.viewport.top,t=this.viewerState.viewport.left;let n;this.viewerState.viewport.invalidate();const i=this.viewerState.viewport.top,r=this.viewerState.viewport.left;n=this.settings.verticallyOriented||this.settings.inGrid?i-e:r-t,this.viewerState.renderer.adjust();const s=this.settings.verticallyOriented||this.settings.inGrid?i:r;this.publish("ViewerDidScroll",s),n>0?this.publish("ViewerDidScrollDown",s):n<0&&this.publish("ViewerDidScrollUp",s),this.updateOffsets()}handleEvents(){this.viewerState.innerObject.addEventListener("mousedown",()=>{this.viewerState.innerObject.classList.add("diva-grabbing")}),this.viewerState.innerObject.addEventListener("mouseup",()=>{this.viewerState.innerObject.classList.remove("diva-grabbing")}),this.bindMouseEvents(),this.viewerState.viewportObject.addEventListener("scroll",this.boundScrollFunction);document.addEventListener("keydown.diva",e=>{if(!this.viewerState.isActiveDiva)return!0;if(this.settings.enableSpaceScroll&&!e.shiftKey&&32===e.keyCode||this.settings.enableKeyScroll&&34===e.keyCode)return this.viewerState.viewport.top+=this.settings.panelHeight,!1;if(this.settings.enableSpaceScroll||32!==e.keyCode||e.preventDefault(),this.settings.enableKeyScroll){if(e.shiftKey||e.ctrlKey||e.metaKey)return!0;switch(e.keyCode){case 33:return this.viewerState.viewport.top-=this.settings.panelHeight,!1;case 38:return this.viewerState.viewport.top-=this.settings.arrowScrollAmount,!1;case 40:return this.viewerState.viewport.top+=this.settings.arrowScrollAmount,!1;case 37:return this.viewerState.viewport.left-=this.settings.arrowScrollAmount,!1;case 39:return this.viewerState.viewport.left+=this.settings.arrowScrollAmount,!1;case 36:return this.viewerState.viewport.top=0,!1;case 35:return this.settings.verticallyOriented?this.viewerState.viewport.top=1/0:this.viewerState.viewport.left=1/0,!1;default:return!0}}return!0}),u.Events.subscribe("ViewerDidTerminate",(function(){document.removeEventListener("keydown.diva")}),this.settings.ID),window.addEventListener("resize",this.onResize.bind(this),!1),u.Events.subscribe("ViewerDidTerminate",(function(){window.removeEventListener("resize",this.onResize,!1)}),this.settings.ID),"onorientationchange"in window&&(window.addEventListener("orientationchange",this.onResize,!1),u.Events.subscribe("ViewerDidTerminate",(function(){window.removeEventListener("orientationchange",this.onResize,!1)}),this.settings.ID)),u.Events.subscribe("PanelSizeDidChange",this.updatePanelSize,this.settings.ID),u.Events.subscribe("ViewerDidTerminate",()=>{this.viewerState.renderer&&this.viewerState.renderer.destroy(),clearTimeout(this.viewerState.resizeTimer)},this.settings.ID)}initPlugins(){if(!this.settings.hasOwnProperty("plugins"))return null;this.viewerState.pluginInstances=this.settings.plugins.map(e=>{const t=new e(this);return t.isPageTool&&this.viewerState.pageTools.push(t),t})}showThrobber(){this.hideThrobber(),this.viewerState.throbberTimeoutID=setTimeout(()=>{let e=document.getElementById(this.settings.selector+"throbber");e&&(e.style.display="block")},this.settings.throbberTimeout)}hideThrobber(){clearTimeout(this.viewerState.throbberTimeoutID);let e=document.getElementById(this.settings.selector+"throbber");e&&(e.style.display="none")}showError(e){const t=i("div",this.elemAttrs("error"),[i("button",this.elemAttrs("error-close",{"aria-label":"Close dialog"})),i("p",i("strong","Error")),i("div",e)]);this.viewerState.outerObject.appendChild(t),document.getElementById(this.settings.selector+"error-close").addEventListener("click",()=>{t.parentNode.removeChild(t)})}setManifest(e,t){if(this.viewerState.manifest=e,this.hideThrobber(),this.viewerState.numPages=this.settings.manifest.pages.length,this.optionsValidator.validate(this.viewerState.options),this.publish("NumberOfPagesDidChange",this.settings.numPages),this.settings.adaptivePadding>0){const e=Math.floor((this.settings.minZoomLevel+this.settings.maxZoomLevel)/2);this.viewerState.horizontalPadding=parseInt(this.settings.manifest.getAverageWidth(e)*this.settings.adaptivePadding,10),this.viewerState.verticalPadding=parseInt(this.settings.manifest.getAverageHeight(e)*this.settings.adaptivePadding,10)}else this.viewerState.horizontalPadding=this.settings.fixedPadding,this.viewerState.verticalPadding=this.settings.fixedPadding;let n,r;this.viewerState.pageTools.length&&(this.viewerState.verticalPadding=Math.max(40,this.viewerState.verticalPadding)),this.settings.manifest.paged&&(this.viewerState.options.inBookLayout=!0),this.publish("ObjectDidLoad",this.settings),this.updatePanelSize();let s=!1,o=!1;if(null==t.goDirectlyTo?(t.goDirectlyTo=this.settings.goDirectlyTo,n=r=!0):(n=null==t.horizontalOffset||isNaN(t.horizontalOffset),r=null==t.verticalOffset||isNaN(t.verticalOffset)),n&&(0===t.goDirectlyTo&&this.settings.inBookLayout&&this.settings.verticallyOriented?t.horizontalOffset=this.viewerState.horizontalPadding:(o=!0,t.horizontalOffset=this.getXOffset(t.goDirectlyTo,"center"))),r&&(s=!0,t.verticalOffset=this.getYOffset(t.goDirectlyTo,"top")),this.reloadViewer(t),this.updatePanelSize(),this.settings.enableAutoTitle){let e=document.getElementById(this.settings.selector+"title");e?e.innerHTML=this.settings.manifest.itemTitle:this.settings.parentObject.insertBefore(i("div",this.elemAttrs("title"),[this.settings.manifest.itemTitle]),this.settings.parentObject.firstChild)}this.settings.verticallyOriented?this.viewerState.innerElement.style.minWidth=this.settings.panelWidth+"px":this.viewerState.innerElement.style.minHeight=this.settings.panelHeight+"px",(s||o)&&(s&&(this.viewerState.verticalOffset=this.getYOffset(this.settings.activePageIndex,"top")),o&&(this.viewerState.horizontalOffset=this.getXOffset(this.settings.activePageIndex,"center")),this.viewerState.renderer.goto(this.settings.activePageIndex,this.viewerState.verticalOffset,this.viewerState.horizontalOffset)),this.viewerState.loaded=!0,this.publish("ViewerDidLoad",this.settings)}publish(e){const t=Array.prototype.slice.call(arguments,1);u.Events.publish(e,t,this.publicInstance)}getSettings(){return this.settings}getInternalState(){return this.viewerState}getPublicInstance(){return this.publicInstance}getPageTools(){return this.viewerState.pageTools}getCurrentLayout(){return this.viewerState.renderer?this.viewerState.renderer.layout:null}getViewport(){const e=this.viewerState.viewport;return{top:e.top,left:e.left,bottom:e.bottom,right:e.right,width:e.width,height:e.height}}addPageOverlay(e){this.viewerState.pageOverlays.addOverlay(e)}removePageOverlay(e){this.viewerState.pageOverlays.removeOverlay(e)}getPageRegion(e,t){const n=this.viewerState.renderer.layout,i=n.getPageRegion(e,t);if(t&&t.incorporateViewport){const e=this.settings.verticallyOriented?"width":"height";if(this.viewerState.viewport[e]>n.dimensions[e]){const t=(this.viewerState.viewport[e]-n.dimensions[e])/2;return this.settings.verticallyOriented?{top:i.top,bottom:i.bottom,left:i.left+t,right:i.right+t}:{top:i.top+t,bottom:i.bottom+t,left:i.left,right:i.right}}}return i}getPagePositionAtViewportOffset(e){const t=e.left+this.viewerState.viewport.left,n=e.top+this.viewerState.viewport.top,i=this.viewerState.renderer.getRenderedPages(),r=i.length;for(let e=0;e=t&&s.top<=n&&s.bottom>=n)return{anchorPage:r,offset:{left:t-s.left,top:n-s.top}}}const s=this.viewerState.renderer.layout.getPageRegion(this.settings.activePageIndex);return{anchorPage:this.settings.activePageIndex,offset:{left:t-s.left,top:n-s.top}}}setCurrentPages(e,t){!function(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&this.publish("VisiblePageHasAlternateViews",e)):this.viewerState.activePageIndex!==e&&(this.viewerState.activePageIndex=e,this.publish("ActivePageDidChange",e))}getPageName(e){return this.viewerState.manifest.pages[e].f}reload(e){this.reloadViewer(e)}zoom(e,t){return this.handleZoom(e,t)}enableScrollable(){this.viewerState.isScrollable||(this.bindMouseEvents(),this.enableDragScrollable(),this.viewerState.options.enableKeyScroll=this.viewerState.initialKeyScroll,this.viewerState.options.enableSpaceScroll=this.viewerState.initialSpaceScroll,this.viewerState.viewportElement.style.overflow="auto",this.viewerState.isScrollable=!0)}enableDragScrollable(){this.viewerState.viewportObject.hasAttribute("nochilddrag")&&this.viewerState.viewportObject.removeAttribute("nochilddrag")}disableScrollable(){this.viewerState.isScrollable&&(this.disableDragScrollable(),this.viewerState.outerObject.dblclick=null,this.viewerState.outerObject.contextmenu=null,this.viewerState.viewportElement.style.overflow="hidden",this.viewerState.initialKeyScroll=this.settings.enableKeyScroll,this.viewerState.initialSpaceScroll=this.settings.enableSpaceScroll,this.viewerState.options.enableKeyScroll=!1,this.viewerState.options.enableSpaceScroll=!1,this.viewerState.isScrollable=!1)}disableDragScrollable(){this.viewerState.viewportObject.hasAttribute("nochilddrag")||this.viewerState.viewportObject.setAttribute("nochilddrag","")}clear(){this.clearViewer()}setPendingManifestRequest(e){this.viewerState.pendingManifestRequest=e}destroy(){this.publish("ViewerWillTerminate",this.settings),this.settings.pendingManifestRequest&&this.settings.pendingManifestRequest.abort(),document.body.removeClass("diva-hide-scrollbar"),this.settings.parentObject.parent().empty().removeData("diva"),this.settings.parentObject.parent().removeAttr("style").removeAttr("class"),this.publish("ViewerDidTerminate",this.settings),u.Events.unsubscribeAll(this.settings.ID)}}function Q(e){let t,n=e.label,i="object"==typeof n?n[Object.keys(n)[0]][0]:n,r=e.value;return t=Array.isArray(r)?r.map(e=>e[Object.keys(e)[0]]):"object"==typeof r?r[Object.keys(r)[0]]:r,Array.isArray(t)&&(t=t.join(", ")),{label:i,value:t}}const ee=(e,t)=>{const n=Math.max(e,t);return n<128?0:Math.ceil(Math.log((n+1)/257)/Math.log(2))},te=(e,t)=>e/Math.pow(2,t),ne=(e,t)=>e.map(e=>{const n=e.width,i=e.height,r=re(e),s="/"!==r.url.slice(-1)?r.url+"/":r.url,o=new Array(t+1);for(let e=0;e"http://iiif.io/api/presentation/2/context.json"===e||Array.isArray(e)&&e.includes("http://iiif.io/api/presentation/2/context.json")?2:Array.isArray(e)&&e.includes("http://iiif.io/api/presentation/3/context.json")?3:2)(t),i=e.sequences?e.sequences[0]:null,r=i?i.canvases:e.items,s=r.length,o=new Array(r.length);let a,c,l,u,d,h,f,g,p,m,v,y,b,w,_,E,S,x=[],L=100,A=0,k=100;for(let e=0;e1.1?"default":"native";return encodeURI(r.url+"full/"+i+"/0/"+s+".jpg")}getTileImageURL(e,t,n){const i=e.pages[t];let r,s;r=n.row===n.rowCount-1?i.d[n.zoomLevel].h-(n.rowCount-1)*n.tileDimensions.height:n.tileDimensions.height,s=n.col===n.colCount-1?i.d[n.zoomLevel].w-(n.colCount-1)*n.tileDimensions.width:n.tileDimensions.width;const o=Math.pow(2,e.maxZoom-n.zoomLevel);let a=n.col*n.tileDimensions.width*o,c=n.row*n.tileDimensions.height*o;i.hasOwnProperty("xoffset")&&(a+=i.xoffset,c+=i.yoffset);const l=[a,c,s*o,r*o].join(","),u=i.api>1.1?"default":"native";return encodeURI(i.url+l+"/"+s+","+r+"/0/"+u+".jpg")}}class oe{constructor(e,t){this.pages=e.pgs,this.maxZoom=e.max_zoom,this.maxRatio=e.dims.max_ratio,this.minRatio=e.dims.min_ratio,this.itemTitle=e.item_title,this.metadata=e.metadata,this.paged=!!e.paged,this._maxWidths=e.dims.max_w,this._maxHeights=e.dims.max_h,this._averageWidths=e.dims.a_wid,this._averageHeights=e.dims.a_hei,this._totalHeights=e.dims.t_hei,this._totalWidths=e.dims.t_wid,this._urlAdapter=t}static fromIIIF(e){const t=ie(e);return new oe(t,new se)}isPageValid(e,t){return!(!t&&this.paged&&!this.pages[e].paged)&&(e>=0&&e{this.viewer.setZoomLevel(this.settings.zoomLevel-1)},e),this.createButton("zoom-in-button","Zoom In",()=>{this.viewer.setZoomLevel(this.settings.zoomLevel+1)},t),this.createLabel("diva-zoom-label","zoom-label","Zoom level: ","zoom-level",this.settings.zoomLevel+1)],r=function(){document.getElementById(this.settings.ID+"zoom-level").textContent=this.settings.zoomLevel+1};return this._subscribe("ZoomLevelDidChange",r),this._subscribe("ViewerDidLoad",r),i("div",{id:this.settings.ID+"zoom-controls",style:"display: none"},n)}createGridControls(){let e=this._createGridMoreIcon(),t=this._createGridFewerIcon(),n=[this.createButton("grid-out-button","Fewer",()=>{this.viewer.setGridPagesPerRow(this.settings.pagesPerRow-1)},t),this.createButton("grid-in-button","More",()=>{this.viewer.setGridPagesPerRow(this.settings.pagesPerRow+1)},e),this.createLabel("diva-grid-label","grid-label","Pages per row: ","pages-per-row",this.settings.pagesPerRow)];return this._subscribe("GridRowNumberDidChange",(function(){document.getElementById(this.settings.ID+"pages-per-row").textContent=this.settings.pagesPerRow})),i("div",{id:this.settings.ID+"grid-controls",style:"display:none"},n)}createPageLabel(){const e=i("span",{id:this.settings.ID+"current-page"}),t=()=>{let t=this.viewer.getCurrentPageIndices(),n=t[0],i=t[t.length-1],r=this.settings.manifest.pages[n].l,s=this.settings.manifest.pages[i].l;n!==i?this.settings.enableIndexAsLabel?e.textContent=n+" - "+i:e.textContent=r+" - "+s:this.settings.enableIndexAsLabel?e.textContent=n:e.textContent=r};return this._subscribe("VisiblePageDidChange",t),this._subscribe("ViewerDidLoad",t),this._subscribe("ViewDidSwitch",t),i("span",{class:"diva-page-label diva-label"},e)}createGotoPageForm(){const e=i("input",{id:this.settings.ID+"goto-page-input",class:"diva-input diva-goto-page-input",autocomplete:"off",type:"text","aria-label":"Page Input"}),t=i("input",{id:this.settings.ID+"goto-page-submit",class:"diva-button diva-button-text",type:"submit",value:"Go"}),n=i("div",{id:this.settings.ID+"input-suggestions",class:"diva-input-suggestions"}),r=i("form",{id:this.settings.ID+"goto-page",class:"diva-goto-form"},e,t,n);var s,o,a;return r.addEventListener("submit",t=>{t.preventDefault();const i=e.value;if(this.settings.onGotoSubmit&&"function"==typeof this.settings.onGotoSubmit){const e=this.settings.onGotoSubmit(i);this.viewer.gotoPageByIndex(e)||window.alert("No page could be found with that label or page number")}else this.viewer.gotoPageByLabel(i)||window.alert("No page could be found with that label or page number");return n.style.display="none",!1}),["input","focus"].forEach(t=>{e.addEventListener(t,()=>{n.innerHTML="";const t=e.value;let r=0;if(this.settings.enableGotoSuggestions&&t){const e=this.settings.manifest.pages;for(let s=0,o=e.length;s-1){const t=i("div",{class:"diva-input-suggestion"},e[s].l);n.appendChild(t),r++}r>0&&(n.style.display="block")}else n.style.display="none"})}),e.addEventListener("keydown",t=>{let n;if(13===t.keyCode){const t=document.getElementsByClassName("active")[0];void 0!==t&&(e.value=t.innerText)}if(38===t.keyCode){n=document.getElementsByClassName("active")[0];const e=n?n.previousSibling:void 0;if(void 0!==e)n.classList.remove("active"),null!==e&&e.classList.add("active");else{let e=document.getElementsByClassName("diva-input-suggestion").length-1;document.getElementsByClassName("diva-input-suggestion")[e].classList.add("active")}}else if(40===t.keyCode){n=document.getElementsByClassName("active")[0];const e=n?n.nextSibling:void 0;void 0!==e?(n.classList.remove("active"),null!==e&&e.classList.add("active")):document.getElementsByClassName("diva-input-suggestion")[0].classList.add("active")}}),s="mousedown",o=".diva-input-suggestion",a=function(){e.value=this.textContent,n.style.display="none";let t=new Event("submit",{cancelable:!0});r.dispatchEvent(t)},n.addEventListener(s,(function(e){for(var t=e.target;t&&t!==this;)t.matches(o)&&a.call(t,e),t=t.parentNode})),e.addEventListener("blur",()=>{n.style.display="none"}),r}createViewMenu(){const e=i("div",this._elemAttrs("view-options")),t=this._createGridViewIcon(),n=this._createBookViewIcon(),r=this._createPageViewIcon(),s=this.createButton("view-icon","Change view",()=>{e.style.display="none"===e.style.display?"block":"none"}),o=t=>{this.viewer.changeView(t),e.style.display="none"},a=()=>{this.settings.inGrid?(s.appendChild(t),s.className="diva-grid-icon diva-view-icon diva-button"):this.settings.inBookLayout?(s.appendChild(n),s.className="diva-book-icon diva-view-icon diva-button"):(s.appendChild(r),s.className="diva-document-icon diva-view-icon diva-button");const i=document.createDocumentFragment();for((this.settings.inGrid||this.settings.inBookLayout)&&i.appendChild(this.createButton("document-icon","Document View",o.bind(null,"document"),r)),!this.settings.inGrid&&this.settings.inBookLayout||i.appendChild(this.createButton("book-icon","Book View",o.bind(null,"book"),n)),this.settings.inGrid||i.appendChild(this.createButton("grid-icon","Grid View",o.bind(null,"grid"),t));e.firstChild;)e.removeChild(e.firstChild);e.appendChild(i)};return document.addEventListener("mouseup",t=>{e!==t.target&&(e.style.display="none")}),this._subscribe("ViewDidSwitch",a),this._subscribe("ObjectDidLoad",a),i("div",this._elemAttrs("view-menu"),s,e)}createFullscreenButton(){let e=this._createFullscreenIcon();return this.createButton("fullscreen-icon","Toggle fullscreen mode",()=>{this.viewer.toggleFullscreenMode()},e)}toggleZoomGridControls(){this.settings.inGrid?(document.getElementById(this.settings.ID+"zoom-controls").style.display="none",document.getElementById(this.settings.ID+"grid-controls").style.display="block"):(document.getElementById(this.settings.ID+"zoom-controls").style.display="block",document.getElementById(this.settings.ID+"grid-controls").style.display="none")}render(){this._subscribe("ViewDidSwitch",this.toggleZoomGridControls),this._subscribe("ObjectDidLoad",this.toggleZoomGridControls);let e=[this.createZoomButtons(),this.createGridControls()],t=[this.createPageLabel(),this.createViewMenu()];this.settings.enableFullscreen&&t.push(this.createFullscreenButton()),this.settings.enableGotoPage&&t.splice(1,0,this.createGotoPageForm());let n=this.viewer.viewerState.pluginInstances;for(let i=0,s=n.length;i{let t=document.createElementNS("http://www.w3.org/2000/svg","path");t.setAttributeNS(null,"d",e),n.appendChild(t)}),t.appendChild(n),t}_createZoomOutIcon(){return this._createToolbarIcon(["M19.5,23c-0.275,0-0.5-0.225-0.5-0.5v-1c0-0.275,0.225-0.5,0.5-0.5h7c0.275,0,0.5,0.225,0.5,0.5v1c0,0.275-0.225,0.5-0.5,0.5H19.5z","M37.219,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.422,33.722,37.422,34.054,37.219,34.257z M29.568,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.555,28.818,29.568,25.805,29.568,22.099z"])}_createZoomInIcon(){return this._createToolbarIcon(["M37.469,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.672,33.722,37.672,34.054,37.469,34.257z M29.818,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.805,28.818,29.818,25.805,29.818,22.099z M26.5,21H24v-2.5c0-0.275-0.225-0.5-0.5-0.5h-1c-0.275,0-0.5,0.225-0.5,0.5V21h-2.5c-0.275,0-0.5,0.225-0.5,0.5v1c0,0.275,0.225,0.5,0.5,0.5H22v2.5c0,0.275,0.225,0.5,0.5,0.5h1c0.275,0,0.5-0.225,0.5-0.5V23h2.5c0.275,0,0.5-0.225,0.5-0.5v-1C27,21.225,26.775,21,26.5,21z"])}_createGridMoreIcon(){return this._createToolbarIcon(["M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z"])}_createGridFewerIcon(){return this._createToolbarIcon(["M25.5,35c-0.275,0-0.5-0.225-0.5-0.5v-9c0-0.275,0.225-0.5,0.5-0.5h9c0.275,0,0.5,0.225,0.5,0.5v9c0,0.275-0.225,0.5-0.5,0.5H25.5z M22.5,35c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z M34.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H34.5z M22.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z"])}_createGridViewIcon(){return this._createToolbarIcon(["M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z"])}_createBookViewIcon(){return this._createToolbarIcon(["M35,16.8v-1.323c0,0-2.292-1.328-5.74-1.328c-3.448,0-5.26,1.25-5.26,1.25s-1.813-1.25-5.26-1.25c-3.448,0-5.74,1.328-5.74,1.328V16.8l-1,0.531v0.021v15.687c0,0,4.531-1.578,6.999-1.578c2.468,0,5.001,0.885,5.001,0.885s2.532-0.885,5-0.885c0.306,0,0.643,0.024,1,0.066v4.325l1.531-2.016L33,35.852v-3.72c2,0.43,3,0.906,3,0.906V17.352v-0.021L35,16.8z M23,29.03c-1-0.292-2.584-0.679-3.981-0.679c-2.246,0-3.019,0.404-4.019,0.699V16.634c0,0,1.125-0.699,4.019-0.699c1.694,0,2.981,0.417,3.981,1.126V29.03z M33,29.051c-1-0.295-1.773-0.699-4.02-0.699c-1.396,0-2.981,0.387-3.98,0.679V17.06c1-0.709,2.286-1.126,3.98-1.126c2.895,0,4.02,0.699,4.02,0.699V29.051z"])}_createPageViewIcon(){return this._createToolbarIcon(["M29.425,29h4.47L29,33.934v-4.47C29,29.19,29.151,29,29.425,29z M34,14.563V28h-5.569C28.157,28,28,28.196,28,28.47V34H14.497C14.223,34,14,33.71,14,33.437V14.563C14,14.29,14.223,14,14.497,14h18.9C33.672,14,34,14.29,34,14.563z M25.497,26.497C25.497,26.223,25.275,26,25,26h-7c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,27.777,17.725,28,18,28h7c0.275,0,0.497-0.223,0.497-0.497V26.497z M30.497,22.497C30.497,22.223,30.275,22,30,22H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,23.777,17.725,24,18,24h12c0.275,0,0.497-0.223,0.497-0.497V22.497z M30.497,18.497C30.497,18.223,30.275,18,30,18H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,19.777,17.725,20,18,20h12c0.275,0,0.497-0.223,0.497-0.497V18.497z"])}_createFullscreenIcon(){return this._createToolbarIcon(["M35,12H13c-0.55,0-1,0.45-1,1v22c0,0.55,0.45,1,1,1h22c0.55,0,1-0.45,1-1V13C36,12.45,35.55,12,35,12z M34,34H14V14h20V34z","M17,21.75v-4.5c0-0.138,0.112-0.25,0.25-0.25h4.5c0.138,0,0.17,0.08,0.073,0.177l-1.616,1.616l1.823,1.823c0.097,0.097,0.097,0.256,0,0.354l-1.061,1.06c-0.097,0.097-0.256,0.097-0.354,0l-1.823-1.823l-1.616,1.616C17.08,21.92,17,21.888,17,21.75z M20.97,25.97c-0.097-0.097-0.256-0.097-0.354,0l-1.823,1.823l-1.616-1.616C17.08,26.08,17,26.112,17,26.25v4.5c0,0.138,0.112,0.25,0.25,0.25h4.5c0.138,0,0.17-0.08,0.073-0.177l-1.616-1.616l1.823-1.823c0.097-0.097,0.097-0.256,0-0.354L20.97,25.97z M30.75,17h-4.5c-0.138,0-0.17,0.08-0.073,0.177l1.616,1.616l-1.823,1.823c-0.097,0.097-0.097,0.256,0,0.354l1.061,1.06c0.097,0.097,0.256,0.097,0.354,0l1.823-1.823l1.616,1.616C30.92,21.92,31,21.888,31,21.75v-4.5C31,17.112,30.888,17,30.75,17z M30.823,26.177l-1.616,1.616l-1.823-1.823c-0.097-0.097-0.256-0.097-0.354,0l-1.061,1.06c-0.097,0.097-0.097,0.256,0,0.354l1.823,1.823l-1.616,1.616C26.08,30.92,26.112,31,26.25,31h4.5c0.138,0,0.25-0.112,0.25-0.25v-4.5C31,26.112,30.92,26.08,30.823,26.177z M26,22.5c0-0.275-0.225-0.5-0.5-0.5h-3c-0.275,0-0.5,0.225-0.5,0.5v3c0,0.275,0.225,0.5,0.5,0.5h3c0.275,0,0.5-0.225,0.5-0.5V22.5z"])}}var le={get:ue,update:function(e,t){const n=ue(e),i=window.location.hash;if(n!==t)if("string"==typeof n){const r=i.indexOf("&"+e+"=")>0?i.indexOf("&"+e+"="):i.indexOf("#"+e+"="),s=r+e.length+2+n.length,o=0===r?"#":"&";window.location.replace(i.substring(0,r)+o+e+"="+t+i.substring(s))}else 0===i.length?window.location.replace("#"+e+"="+t):window.location.replace(i+"&"+e+"="+t)}};function ue(e){const t=window.location.hash;if(""!==t){let n=t.indexOf("&"+e+"=")>0?t.indexOf("&"+e+"="):t.indexOf("#"+e+"=");if(n>=0){n+=e.length+2;const i=t.indexOf("&",n);return i>n?decodeURIComponent(t.substring(n,i)):i<0?decodeURIComponent(t.substring(n)):""}return!1}return!1}class de{constructor(e,t){if(!(e instanceof HTMLElement)&&(this.element=document.getElementById(e),null===this.element))throw new a;if(!t.objectData)throw new l("You must supply either a URL or a literal object to the `objectData` key.");this.options=Object.assign({adaptivePadding:.05,arrowScrollAmount:40,blockMobileMove:!1,objectData:"",enableAutoTitle:!0,enableFilename:!0,enableFullscreen:!0,enableGotoPage:!0,enableGotoSuggestions:!0,enableGridIcon:!0,enableGridControls:"buttons",enableImageTitles:!0,enableIndexAsLabel:!1,enableKeyScroll:!0,enableLinkIcon:!0,enableNonPagedVisibilityIcon:!0,enableSpaceScroll:!1,enableToolbar:!0,enableZoomControls:"buttons",fillParentHeight:!0,fixedPadding:10,fixedHeightGrid:!0,goDirectlyTo:0,hashParamSuffix:null,imageCrossOrigin:"anonymous",inFullscreen:!1,inBookLayout:!1,inGrid:!1,maxPagesPerRow:8,maxZoomLevel:-1,minPagesPerRow:2,minZoomLevel:0,onGotoSubmit:null,pageAliases:{},pageAliasFunction:function(){return!1},pageLoadTimeout:200,pagesPerRow:5,requestHeaders:{Accept:"application/json"},showNonPagedPages:!1,throbberTimeout:100,tileHeight:256,tileWidth:256,toolbarParentObject:null,verticallyOriented:!0,viewportMargin:200,zoomLevel:2},t);const n=i("div",{class:"diva-wrapper"+(this.options.fillParentHeight?" diva-wrapper-flexbox":"")});this.element.appendChild(n),this.options.toolbarParentObject=this.options.toolbarParentObject||n;const r=new J(n,this.options,this);this.viewerState=r.getInternalState(),this.settings=r.getSettings(),this.toolbar=this.settings.enableToolbar?new ce(this):null,n.id=this.settings.ID+"wrapper",this.divaState={viewerCore:r,toolbar:this.toolbar};let s=u.Events.subscribe("ObjectDidLoad",()=>{null!==this.toolbar&&this.toolbar.render(),u.Events.unsubscribe(s)});this.hashState=this._getHashParamState(),this._loadOrFetchObjectData()}_loadOrFetchObjectData(){if("object"==typeof this.settings.objectData)setTimeout(()=>{this._loadObjectData(this.settings.objectData,this.hashState)},0);else{const e=fetch(this.settings.objectData,{headers:this.settings.requestHeaders}).then(e=>{if(!e.ok){u.Events.publish("ManifestFetchError",[e],this),this._ajaxError(e);let t=new Error(e.statusText);throw t.response=e,t}return e.json()}).then(e=>{this._loadObjectData(e,this.hashState)});this.divaState.viewerCore.setPendingManifestRequest(e)}}_showError(e){this.divaState.viewerCore.showError(e)}_ajaxError(e){const t=["Invalid objectData setting. Error code: "+e.status+" "+e.statusText];if(0===this.settings.objectData.lastIndexOf("http",0)){const e=this.settings.objectData.replace(/https?:\/\//i,"").split(/[/?#]/)[0];window.location.hostname!==e&&t.push(i("p","Attempted to access cross-origin data without CORS."),i("p","You may need to update your server configuration to support CORS. For help, see the ",i("a",{href:"https://github.com/DDMAL/diva.js/wiki/Installation#a-note-about-cross-site-requests",target:"_blank"},"cross-site request documentation.")))}this._showError(t)}_loadObjectData(e,t){let n;if(!e.hasOwnProperty("@context")&&(-1===e["@context"].indexOf("iiif")||-1===e["@context"].indexOf("shared-canvas")))throw new c("This does not appear to be a IIIF Manifest.");u.Events.publish("ManifestDidLoad",[e],this),n=oe.fromIIIF(e);const i=t?this._getLoadOptionsForState(t,n):{};this.divaState.viewerCore.setManifest(n,i)}_getHashParamState(){const e={};return["f","v","z","n","i","p","y","x"].forEach(t=>{const n=le.get(t+this.settings.hashParamSuffix);!1!==n&&(e[t]=n)}),"true"===e.f?e.f=!0:"false"===e.f&&(e.f=!1),["z","n","p","x","y"].forEach(t=>{t in e&&(e[t]=parseInt(e[t],10))}),e}_getLoadOptionsForState(e,t){t=t||this.settings.manifest;const n="v"in e?this._getViewState(e.v):{};"f"in e&&(n.inFullscreen=e.f),"z"in e&&(n.zoomLevel=e.z),"n"in e&&(n.pagesPerRow=e.n);let i=this._getPageIndexForManifest(t,e.i);if(i>=0&&i=0&&io)return-1;if(ts)return-1;const a=document.getElementsByClassName("diva-page");let c=a.length;for(;c--;){const n=a[c],i=n.getBoundingClientRect();if(!(ei.right)&&!(ti.bottom))return n.getAttribute("data-index")}return-1}_reloadViewer(e){return this.divaState.viewerCore.reload(e)}_getCurrentURL(){return location.protocol+"//"+location.host+location.pathname+location.search+"#"+this._getURLHash()}activate(){this.viewerState.isActiveDiva=!0}changeObject(e){this.viewerState.loaded=!1,this.divaState.viewerCore.clear(),this.viewerState.renderer&&this.viewerState.renderer.destroy(),this.viewerState.options.objectData=e,this._loadOrFetchObjectData()}changeView(e){this._changeView(e)}deactivate(){this.viewerState.isActiveDiva=!1}destroy(){this.divaState.viewerCore.destroy()}disableScrollable(){this.divaState.viewerCore.disableScrollable()}enableScrollable(){this.divaState.viewerCore.enableScrollable()}disableDragScrollable(){this.divaState.viewerCore.disableDragScrollable()}enableDragScrollable(){this.divaState.viewerCore.enableDragScrollable()}enterFullscreenMode(){return!this.settings.inFullscreen&&(this._toggleFullscreen(),!0)}enterGridView(){return!this.settings.inGrid&&(this._changeView("grid"),!0)}getAllPageURIs(){return this.settings.manifest.pages.map(e=>e.f)}getCurrentCanvas(){return this.settings.manifest.pages[this.settings.activePageIndex].canvas}getCurrentPageDimensionsAtCurrentZoomLevel(){return this.getPageDimensionsAtCurrentZoomLevel(this.settings.activePageIndex)}getCurrentPageFilename(){return console.warn("This method will be deprecated in the next version of Diva. Please use getCurrentPageURI instead."),this.settings.manifest.pages[this.settings.activePageIndex].f}getCurrentPageIndices(){return this.settings.currentPageIndices}getActivePageIndex(){return this.settings.activePageIndex}getCurrentPageOffset(){return this.getPageOffset(this.settings.activePageIndex)}getCurrentPageURI(){return this.settings.manifest.pages[this.settings.activePageIndex].f}getCurrentURL(){return this._getCurrentURL()}getFilenames(){return console.warn("This will be removed in the next version of Diva. Use getAllPageURIs instead."),this.settings.manifest.pages.map(e=>e.f)}getGridPagesPerRow(){return this.settings.pagesPerRow}getInstanceId(){return this.settings.ID}getInstanceSelector(){return this.divaState.viewerCore.selector}getItemTitle(){return this.settings.manifest.itemTitle}getMaxZoomLevel(){return this.settings.maxZoomLevel}getMaxZoomLevelForPage(e){return!!this._checkLoaded()&&this.settings.manifest.pages[e].m}getMinZoomLevel(){return this.settings.minZoomLevel}getNumberOfPages(){return!!this._checkLoaded()&&this.settings.numPages}getOtherImages(e){return this.settings.manifest.pages[e].otherImages}getPageDimensions(e){return this._checkLoaded()?this.divaState.viewerCore.getCurrentLayout().getPageDimensions(e):null}getPageDimensionsAtCurrentZoomLevel(e){let t=parseInt(e,10);if(!this._isPageIndexValid(t))throw new Error("Invalid Page Index");return this.divaState.viewerCore.getCurrentLayout().getPageDimensions(t)}getPageDimensionsAtZoomLevel(e,t){if(!this._checkLoaded())return!1;t>this.settings.maxZoomLevel&&(t=this.settings.maxZoomLevel);const n=this.settings.manifest.pages[parseInt(e,10)].d[parseInt(t,10)];return{width:n.w,height:n.h}}getPageImageURL(e,t){return this.settings.manifest.getPageImageURL(e,t)}getPageIndexForPageXYValues(e,t){return this._getPageIndexForPageXYValues(e,t)}getPageOffset(e,t){const n=this.divaState.viewerCore.getPageRegion(e,t);return{top:n.top,left:n.left}}getSettings(){return this.settings}getState(){return this._getState()}getZoomLevel(){return this.settings.zoomLevel}gotoPageByIndex(e,t,n){return this._gotoPageByIndex(e,t,n)}gotoPageByLabel(e,t,n){const i=this.settings.manifest.pages;let r=e.toLowerCase();for(let e=0,s=i.length;e-1)return this._gotoPageByIndex(e,t,n);const s=parseInt(e,10)-1;return this._gotoPageByIndex(s,t,n)}gotoPageByName(e,t,n){console.warn("This method will be removed in the next version of Diva.js. Use gotoPageByURI instead.");const i=this._getPageIndex(e);return this._gotoPageByIndex(i,t,n)}gotoPageByURI(e,t,n){const i=this._getPageIndex(e);return this._gotoPageByIndex(i,t,n)}hasOtherImages(e){return!0===this.settings.manifest.pages[e].otherImages}hideNonPagedPages(){this._reloadViewer({showNonPagedPages:!1})}isInFullscreen(){return this.settings.inFullscreen}isPageIndexValid(e){return this._isPageIndexValid(e)}isPageInViewport(e){return this.viewerState.renderer.isPageVisible(e)}isReady(){return this.viewerState.loaded}isRegionInViewport(e,t,n,i,r){const s=this.divaState.viewerCore.getCurrentLayout();if(!s)return!1;const o=s.getPageOffset(e),a=o.top+n,c=o.left+t;return this.viewerState.viewport.intersectsRegion({top:a,bottom:a+r,left:c,right:c+i})}isVerticallyOriented(){return this.settings.verticallyOriented}leaveFullscreenMode(){return!!this.settings.inFullscreen&&(this._toggleFullscreen(),!0)}leaveGridView(){return!!this.settings.inGrid&&(this._reloadViewer({inGrid:!1}),!0)}setGridPagesPerRow(e){return!!this.divaState.viewerCore.isValidOption("pagesPerRow",e)&&this._reloadViewer({inGrid:!0,pagesPerRow:e})}setState(e){this._reloadViewer(this._getLoadOptionsForState(e))}setZoomLevel(e){return this.settings.inGrid&&this._reloadViewer({inGrid:!1}),this.divaState.viewerCore.zoom(e)}showNonPagedPages(){this._reloadViewer({showNonPagedPages:!0})}toggleFullscreenMode(){this._toggleFullscreen()}toggleNonPagedPagesVisibility(){this._reloadViewer({showNonPagedPages:!this.settings.showNonPagedPages})}toggleOrientation(){return this._togglePageLayoutOrientation()}translateFromMaxZoomLevel(e){const t=this.settings.maxZoomLevel-this.settings.zoomLevel;return e/Math.pow(2,t)}translateToMaxZoomLevel(e){const t=this.settings.maxZoomLevel-this.settings.zoomLevel;return 0===t?e:e*Math.pow(2,t)}zoomIn(){return this.setZoomLevel(this.settings.zoomLevel+1)}zoomOut(){return this.setZoomLevel(this.settings.zoomLevel-1)}}de.Events=u.Events;var he;t.default=de;"undefined"!=typeof window&&((he=window).Diva=he.Diva||de)}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ltbWVkaWF0ZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0xvY2FsU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL1NlbGVjdFRvb2xzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Ob3RpZmljYXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FyZ3NhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJkM1wiIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L0NvbnRlbnRzLnRzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Nb2RhbFdpbmRvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db29yZGluYXRlcy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3BhcmstbWQ1L3NwYXJrLW1kNS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvcmFuZG9tLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db2xvci50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanNvbnNjaGVtYS9saWIvaGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnV2dXplbGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRHJhZ0hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvR3JvdXBpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0Vycm9yTG9nLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9SZXNpemUudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3BvdWNoZGIvbGliL2luZGV4LWJyb3dzZXIuZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdmtiZWF1dGlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL0Rhc2hib2FyZENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dhcm5pbmdzLnRzIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L1N0YWZmVG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvTmV1bWVUb29scy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9xdWV1ZU1pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9tdXRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9tZXNzYWdlQ2hhbm5lbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9zdGF0ZUNoYW5nZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi90aW1lb3V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91cmwvdXJsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qc29uc2NoZW1hL2xpYi9zY2FuLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9TZWxlY3QudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0NvbnZlcnRNZWkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1ZhbGlkYXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL1Vuc2F2ZWQudHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvQ29udHJvbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvSW5zZXJ0SGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRWRpdENvbnRlbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9FZGl0Q29udHJvbHMudHMiLCJ3ZWJwYWNrOi8vLy4vZGVwbG95bWVudC9zY3JpcHRzL2VkaXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvTmVvblZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL05lb25Db3JlLnRzIiwid2VicGFjazovLy8uL3NyYy9WZXJvdmlvV3JhcHBlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvTmVvbk1hbmlmZXN0LnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qc29uc2NoZW1hL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanNvbnNjaGVtYS9saWIvdmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub2RlLWxpYnMtYnJvd3Nlci9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VybC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pzb25zY2hlbWEvbGliL2F0dHJpYnV0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvdGVtcGxhdGUvVGVtcGxhdGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0RlYnVnTW9kZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGlzcGxheVBhbmVsL0Rpc3BsYXlQYW5lbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGl2YVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL3ZhbmlsbGEua2luZXRpYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdXRpbHMvZHJhZ3Njcm9sbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9TaW5nbGVWaWV3L1NpbmdsZVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpbmdsZVZpZXcvWm9vbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9EaXZhRWRpdE1vZGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvU2luZ2xlRWRpdE1vZGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0luZm9Nb2R1bGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1RleHRWaWV3LnRzIiwid2VicGFjazovLy8uL3NyYy9UZXh0RWRpdE1vZGUudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL2VsdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZXhjZXB0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZGl2YS1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZ2VzdHVyZS1ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3BhZ2UtdG9vbHMtb3ZlcmxheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZG9jdW1lbnQtaGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZ3JpZC1oYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLW92ZXJsYXktbWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdGlsZS1jb3ZlcmFnZS1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL2NvbXBvc2l0ZS1pbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZG9jdW1lbnQtbGF5b3V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9pbWFnZS1jYWNoZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvaW1hZ2UtcmVxdWVzdC1oYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9pbnRlcnBvbGF0ZS1hbmltYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3JlbmRlcmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLWxheW91dHMvcGFnZS1kaW1lbnNpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLWxheW91dHMvYm9vay1sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3BhZ2UtbGF5b3V0cy9ncmlkLWxheW91dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvcGFnZS1sYXlvdXRzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLWxheW91dHMvc2luZ2xlcy1sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3NldHRpbmdzLXZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3ZhbGlkYXRpb24tcnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy92aWV3cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdmlld2VyLWNvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL2dldC1zY3JvbGxiYXItd2lkdGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL3BhcnNlLWxhYmVsLXZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYXJzZS1paWlmLW1hbmlmZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9paWlmLXNvdXJjZS1hZGFwdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9pbWFnZS1tYW5pZmVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdG9vbGJhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdXRpbHMvaGFzaC1wYXJhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL2RpdmEuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJSZWZsZWN0T3duS2V5cyIsIlIiLCJSZWZsZWN0IiwiUmVmbGVjdEFwcGx5IiwiYXBwbHkiLCJ0YXJnZXQiLCJyZWNlaXZlciIsImFyZ3MiLCJGdW5jdGlvbiIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiY29uY2F0IiwiTnVtYmVySXNOYU4iLCJOdW1iZXIiLCJpc05hTiIsIkV2ZW50RW1pdHRlciIsImluaXQiLCJ0aGlzIiwib25jZSIsImVtaXR0ZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImVycm9yTGlzdGVuZXIiLCJlcnIiLCJyZW1vdmVMaXN0ZW5lciIsInJlc29sdmVyIiwic2xpY2UiLCJhcmd1bWVudHMiLCJldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIiLCJoYW5kbGVyIiwiZmxhZ3MiLCJvbiIsImFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyIiwiX2V2ZW50cyIsInVuZGVmaW5lZCIsIl9ldmVudHNDb3VudCIsIl9tYXhMaXN0ZW5lcnMiLCJkZWZhdWx0TWF4TGlzdGVuZXJzIiwiY2hlY2tMaXN0ZW5lciIsImxpc3RlbmVyIiwiVHlwZUVycm9yIiwiX2dldE1heExpc3RlbmVycyIsInRoYXQiLCJfYWRkTGlzdGVuZXIiLCJ0eXBlIiwicHJlcGVuZCIsImV2ZW50cyIsImV4aXN0aW5nIiwid2FybmluZyIsIm5ld0xpc3RlbmVyIiwiZW1pdCIsInVuc2hpZnQiLCJwdXNoIiwibGVuZ3RoIiwid2FybmVkIiwidyIsIkVycm9yIiwiU3RyaW5nIiwiY291bnQiLCJjb25zb2xlIiwid2FybiIsIm9uY2VXcmFwcGVyIiwiZmlyZWQiLCJ3cmFwRm4iLCJfb25jZVdyYXAiLCJzdGF0ZSIsIndyYXBwZWQiLCJfbGlzdGVuZXJzIiwidW53cmFwIiwiZXZsaXN0ZW5lciIsImFyciIsInJldCIsIkFycmF5IiwidW53cmFwTGlzdGVuZXJzIiwiYXJyYXlDbG9uZSIsImxpc3RlbmVyQ291bnQiLCJjb3B5IiwiYWRkRXZlbnRMaXN0ZW5lciIsIndyYXBMaXN0ZW5lciIsImFyZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZXQiLCJSYW5nZUVycm9yIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJkb0Vycm9yIiwiZXJyb3IiLCJlciIsIm1lc3NhZ2UiLCJjb250ZXh0IiwibGVuIiwibGlzdGVuZXJzIiwiYWRkTGlzdGVuZXIiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdCIsInBvc2l0aW9uIiwib3JpZ2luYWxMaXN0ZW5lciIsInNoaWZ0IiwiaW5kZXgiLCJwb3AiLCJzcGxpY2VPbmUiLCJvZmYiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJrZXlzIiwicmF3TGlzdGVuZXJzIiwiZXZlbnROYW1lcyIsImN0b3IiLCJzdXBlckN0b3IiLCJzdXBlcl8iLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiVGVtcEN0b3IiLCJkcmFpbmluZyIsImN1cnJlbnRRdWV1ZSIsInNjaGVkdWxlRHJhaW4iLCJ0eXBlcyIsInF1ZXVlSW5kZXgiLCJxdWV1ZSIsInNjaGVkdWxlZCIsImNsZWFuVXBOZXh0VGljayIsIm5leHRUaWNrIiwidGltZW91dCIsInNldFRpbWVvdXQiLCJydW4iLCJjbGVhclRpbWVvdXQiLCJ0ZXN0IiwiaW5zdGFsbCIsIkl0ZW0iLCJmdW4iLCJhcnJheSIsInRhc2siLCJsb2NhbFNldHRpbmdzIiwiREVGQVVMVF9TRVRUSU5HUyIsInpvb20iLCJnbHlwaE9wYWNpdHkiLCJpbWFnZU9wYWNpdHkiLCJjaXJjbGVTaXplIiwiaGlnaGxpZ2h0TW9kZSIsInVzZXJNb2RlIiwiaW5zZXJ0TW9kZSIsImluc2VydFRhYiIsInNlbGVjdGlvbk1vZGUiLCJkZWJ1Z01vZGUiLCJkaXNwbGF5QkJveCIsImRpc3BsYXlUZXh0IiwiZGlzcGxheUluZm8iLCJkaXNwbGF5RXJyTG9nIiwidmlld0JveCIsInNldHRpbmdzIiwicGFyYW1zIiwiZm9saW9JZCIsImlkIiwibG9hZCIsInN0b3JlZCIsIkpTT04iLCJwYXJzZSIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzeW5jIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImdldFNlbGVjdGlvblR5cGUiLCJlbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwidW5zZWxlY3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsInNlbGVjdGVkIiwiY2xhc3NMaXN0IiwicmVtb3ZlIiwiY29udGFpbnMiLCJyZW1vdmVBdHRyaWJ1dGUiLCJDb2xvciIsInVuaGlnaGxpZ2h0Iiwic3R5bGUiLCJmaWxsIiwiZnJvbSIsImRpdkxpbmUiLCJzdHJva2UiLCJzZXRBdHRyaWJ1dGUiLCJuZXVtZSIsInN5bFJlY3QiLCJwYXJlbnRFbGVtZW50IiwiYWRkIiwiZDMiLCJzZWxlY3RBbGwiLCJlbCIsImNvbG9yIiwiZm9udFdlaWdodCIsImdldEVsZW1lbnRCeUlkIiwiU2VsZWN0T3B0aW9ucyIsImVuZE9wdGlvbnNTZWxlY3Rpb24iLCJHcm91cGluZyIsImVuZEdyb3VwaW5nU2VsZWN0aW9uIiwiaW5uZXJIVE1MIiwidXBkYXRlSGlnaGxpZ2h0Iiwic2VsZWN0U3RhZmYiLCJzdGFmZiIsImRyYWdIYW5kbGVyIiwiaGlnaGxpZ2h0IiwidHJpZ2dlclNpbmdsZVN0YWZmQWN0aW9ucyIsImluaXRHcm91cGluZ0xpc3RlbmVycyIsImRyYWdJbml0Iiwic2VsZWN0TGF5ZXJFbGVtZW50IiwibGF5ZXJFbGVtZW50Iiwic2VsZWN0IiwibmVlZHNIaWdobGlnaHRVcGRhdGUiLCJzeWxJZCIsImVsZW0iLCJjbG9zZXN0Iiwic3BhbiIsImFzeW5jIiwiaXNMaWdhdHVyZSIsIm5jIiwibmVvblZpZXciLCJhdHRyaWJ1dGVzIiwiZ2V0RWxlbWVudEF0dHIiLCJ2aWV3IiwiZ2V0Q3VycmVudFBhZ2VVUkkiLCJCb29sZWFuIiwibGlnYXRlZCIsImVsZW1lbnRzSGF2ZUNvcnJlY3RUeXBlIiwic2VsZWN0aW9uVHlwZSIsImVsZW1lbnRzIiwic2hhcmVkU2Vjb25kTGV2ZWxQYXJlbnQiLCJ0ZW1wRWxlbWVudHMiLCJzZWNvbmRQYXJlbnQiLCJzZWxlY3RCQm94IiwiYmJveCIsInN5bCIsInJlc2l6ZSIsInF1ZXJ5U2VsZWN0b3IiLCJ0cmlnZ2VyQkJveEFjdGlvbnMiLCJwYXJlbnQiLCJwcmV2TmMiLCJwcmV2aW91c1NpYmxpbmciLCJuZXh0TmMiLCJuZXh0U2libGluZyIsInRyaWdnZXJHcm91cGluZyIsInRyaWdnZXJOY0FjdGlvbnMiLCJhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSIsInNvcnRlZEVsZW1lbnRzIiwiaiIsImlzU2FtZU5vZGUiLCJmaXJzdEVsZW0iLCJzZWNvbmRFbGVtIiwiaW5kZXgxIiwiaW5kZXhPZiIsImluZGV4MiIsIk1hdGgiLCJhYnMiLCJmaWx0ZXIiLCJyZWZlcmVuY2VQYXJlbnRTdGFmZiIsInJlZmVyZW5jZVBhcmVudFN5bGxhYmxlIiwiZWxlbWVudHNBcnJheSIsImFub3RoZXJTdGFmZiIsInVseCIsInVseSIsImxyeCIsImxyeSIsInJvdGF0ZSIsInBhdGgiLCJjb29yZGluYXRlcyIsImdldEF0dHJpYnV0ZSIsIm1hdGNoIiwibWFwIiwiYXRhbiIsIm1pbiIsIm1heCIsIm5vdE5ldW1lcyIsIm5uIiwic2VsZWN0aW9uQ2xhc3MiLCJjb250YWluc0xheWVyRWxlbWVudHMiLCJjb250YWluc05jIiwiZ3JvdXBzVG9TZWxlY3QiLCJTZXQiLCJncm91cGluZyIsImZvbGxvd3MiLCJwcmVjZWRlcyIsImhhcyIsImdyb3VwIiwiZ3JvdXBzIiwidmFsdWVzIiwidHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zIiwic2l6ZSIsInRyaWdnZXJMYXllckVsZW1lbnRBY3Rpb25zIiwidHJpZ2dlckRlZmF1bHRBY3Rpb25zIiwidHJpZ2dlclN5bGxhYmxlQWN0aW9ucyIsImlzTGlua2FibGUiLCJpc0dyb3VwYWJsZSIsInRyaWdnZXJOZXVtZUFjdGlvbnMiLCJjaGlsZHJlbiIsImZpcnN0TkMiLCJzZWNvbmROQyIsImZpcnN0TkNYIiwieCIsImJhc2VWYWwiLCJzZWNvbmROQ1giLCJmaXJzdE5DWSIsInkiLCJzZWNvbmROQ1kiLCJnIiwidHJpZ2dlckRlZmF1bHRTeWxBY3Rpb25zIiwibm90aWZpY2F0aW9ucyIsImN1cnJlbnRNb2RlTWVzc2FnZSIsIm5vdGlmaWNhdGlvbkljb24iLCJkZWZhdWx0Iiwic3VjY2VzcyIsIk5vdGlmaWNhdGlvbiIsImxvZ0luZm8iLCJkaXNwbGF5ZWQiLCJ1dWlkdjQiLCJpc01vZGVNZXNzYWdlIiwic2VhcmNoIiwidGltZW91dElEIiwiY2xlYXJOb3RpZmljYXRpb24iLCJjdXJyZW50SWQiLCJzdGFydE5vdGlmaWNhdGlvbiIsIm5vdGlmaWNhdGlvbiIsImdldElkIiwibm90aWZpY2F0aW9uQ29udGVudCIsIm5ld05vdGlmaWNhdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmQiLCJkaXNwbGF5IiwiZGlzcGxheU5vdGlmaWNhdGlvbiIsInNldFRpbWVvdXRJZCIsInF1ZXVlTm90aWZpY2F0aW9uIiwicmVjb3JkTm90aWZpY2F0aW9uIiwiaW5zZXJ0VGFiSHRtbCIsInByaW1pdGl2ZVRhYiIsImdyb3VwaW5nVGFiIiwic3lzdGVtVGFiIiwiaW5zZXJ0Q29udHJvbHNQYW5lbCIsImVkaXRDb250cm9sc1BhbmVsIiwibmNBY3Rpb25Db250ZW50cyIsImRlZmF1bHROZXVtZUFjdGlvbkNvbnRlbnRzIiwibmV1bWVBY3Rpb25Db250ZW50cyIsImRlZmF1bHRBY3Rpb25Db250ZW50cyIsImRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyIsImN1c3Rvc0FjdGlvbkNvbnRlbnRzIiwibGF5ZXJFbGVtZW50T3V0QWN0aW9uQ29udGVudHMiLCJsYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzIiwiYWNjaWRBY3Rpb25Db250ZW50cyIsInN0YWZmU3BsaXRBY3Rpb25Db250ZW50cyIsInN0YWZmTWVyZ2VBY3Rpb25Db250ZW50cyIsImNvbHVtbkFjdGlvbkNvbnRlbnRzIiwiY2xlZkFjdGlvbkNvbnRlbnRzIiwiZGl2TGluZUFjdGlvbkNvbnRlbnRzIiwiYmJveEFjdGlvbkNvbnRlbnRzIiwiZ3JvdXBpbmdNZW51IiwibGlnYXR1cmVOYyIsImxpZ2F0dXJlIiwic3BsaXRTeWxsYWJsZSIsImVkaXRUZXh0TW9kYWwiLCJob3RrZXlzTW9kYWwiLCJzeWxsYWJsZUFjdGlvbnNDb250ZW50IiwiZXJyb3JMb2dzUGFuZWxDb250ZW50cyIsImUiLCJieXRlVG9IZXgiLCJ0b1N0cmluZyIsInN1YnN0ciIsIm9mZnNldCIsInV1aWQiLCJ0b0xvd2VyQ2FzZSIsImxhc3RHbHlwaE9wYWNpdHkiLCJsYXN0SW1hZ2VPcGFjaXR5IiwibGFzdENpcmNsZVNpemUiLCJzZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyIiwibWVpQ2xhc3NOYW1lIiwib3BhY2l0eU91dHB1dCIsInNldFNldHRpbmdzIiwiaGlkZUdseXBoSW1nIiwib3BhY2l0eSIsInNldEJnT3BhY2l0eUZyb21TbGlkZXIiLCJiYWNrZ3JvdW5kIiwiYmdPcGFjaXR5T3V0cHV0IiwiaGlkZUJnSW1nIiwiYmciLCJ1cGRhdGVIaWdobGlnaHRPcHRpb24iLCJvcHRpb24iLCJkcm9wZG93biIsImhpZ2hsaWdodFR5cGUiLCJ0ZXh0Q29udGVudCIsInVuc2V0R3JvdXBpbmdIaWdobGlnaHQiLCJ0b1VwcGVyQ2FzZSIsInNldEdyb3VwaW5nSGlnaGxpZ2h0Iiwic2V0SGlnaGxpZ2h0T3B0aW9uIiwiaGlnaGxpZ2h0Q2xpY2thd2F5IiwiYm9keSIsInNldEhpZ2hsaWdodENvbnRyb2xzIiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwidG9nZ2xlIiwibG9hZEhpZ2hsaWdodFNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJ6b29tSGFuZGxlciIsInpvb21TbGlkZXIiLCJ6b29tT3V0cHV0Iiwiem9vbVRvIiwicmVzZXRab29tQW5kUGFuIiwiZGlzYWJsZWQiLCJjdXJyZW50Wm9vbSIsInBhcnNlSW50IiwicHJldmVudERlZmF1bHQiLCJuZXdab29tIiwiY2lyY2xlU2xpZGVyIiwiY2lyY2xlT3V0cHV0IiwiY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlciIsInJlc2l6ZVBvaW50cyIsImVtcHR5IiwiYXR0ciIsImhpZ2hsaWdodFNlbGVjdGlvbiIsImhpZ2hsaWdodElkIiwiZGlzcGxheUFsbEJ0biIsImRpc3BsYXlCQm94ZXMiLCJjaGVja2VkIiwib3BhY2l0eVNsaWRlciIsImlucHV0Q2hhbmdlT3BhY2l0eSIsInRvZ2dsZU9wYWNpdHlCdG4iLCJuZXdPcGFjaXR5Iiwicm91bmQiLCJzZXRHbHlwaE9wYWNpdHlDb250cm9scyIsImJnT3BhY2l0eVNsaWRlciIsImJnSW5wdXRDaGFuZ2VIYW5kbGVyIiwidG9nZ2xlQmdPcGFjaXR5QnRuIiwic2V0QmdPcGFjaXR5Q29udHJvbHMiLCJtZXRhS2V5Iiwic2VsZWN0QWxsQnRuIiwib3B0aW9ucyIsImNsaWNrIiwic2V0RGlzcGxheUFsbExpc3RlbmVyIiwiZGlzcGxheUNvbnRlbnRzIiwidG9nZ2xlRGlzcGxheSIsInBhZGRpbmciLCJvdmVyZmxvdyIsIk1vZGFsV2luZG93VmlldyIsIk1vZGFsV2luZG93U3RhdGUiLCJvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyIsImhpZGVNb2RhbFdpbmRvdyIsInVwZGF0ZVN5bFRleHQiLCJmb2N1c01vZGFsV2luZG93Iiwib3JpZyIsInJlcGxhY2UiLCJ0cmltIiwidXBkYXRlZFN5bFRleHQiLCJlZGl0b3JBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbSIsImVsZW1lbnRJZCIsImVudHJpZXMiLCJjbGFzc05hbWUiLCJ0ZXh0IiwiZWRpdCIsInRoZW4iLCJyZXNwb25zZSIsInVwZGF0ZUZvckN1cnJlbnRQYWdlIiwidXBkYXRlU2VsZWN0ZWRCQm94Iiwia2V5ZG93bkxpc3RlbmVyIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwibW9kYWxXaW5kb3dWaWV3IiwiRURJVF9URVhUIiwiRE9DVU1FTlRfVVBMT0FEIiwiTkVXX0ZPTERFUiIsIlJFTkFNRSIsImZvY3VzIiwibW9kYWxXaW5kb3dTdGF0ZSIsIkNMT1NFRCIsInNldHVwRXZlbnRMaXN0ZW5lcnMiLCJjb250ZW50Iiwic2V0TW9kYWxXaW5kb3dDb250ZW50IiwiSE9US0VZUyIsIk1PVkVfVE8iLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJPUEVOIiwicmVtb3ZlRXZlbnRMaXN0ZW5lcnMiLCJjb250YWluZXIiLCJ0aXRsZSIsImlubmVyVGV4dCIsInJlbW92ZVN5bWJvbCIsIkVSUk9SX0xPRyIsImVuY29kZVVSSSIsInVwbG9hZEFyZWFIVE1MIiwibmV3Rm9sZGVySFRNTCIsInJlbmFtZUhUTUwiLCJiYm94SWQiLCJmaW5kIiwiZGlzcGxheVJlY3QiLCJ1bnNldEluY2xpbmF0dW1BY3Rpb24iLCJhdHRyVHlwZSIsImF0dHJWYWx1ZSIsInVuc2V0VmlyZ2FBY3Rpb24iLCJ1bnNldFZpcmdhUmV2ZXJzZWRBY3Rpb24iLCJ1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24iLCJ1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uIiwiY3VydmUiLCJkZWxldGVCdXR0b25IYW5kbGVyIiwicmVtb3ZlSGFuZGxlciIsIm1vcmVFZGl0IiwiZXh0cmFFZGl0IiwidG9SZW1vdmUiLCJjaGFpbkFjdGlvbiIsImNoYW5nZVN0YWZmSGFuZGxlciIsInRvQ2hhbmdlIiwiaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIiLCJ0b0luc2VydCIsInJlc3VsdCIsIm1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyIiwidG9Nb3ZlIiwibWF0Y2hIZWlnaHRIYW5kbGVyIiwiYWRkRGVsZXRlTGlzdGVuZXIiLCJkZWwiLCJhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyIiwiY2hhbmdlU3RhZmYiLCJ1cGRhdGVDb2x1bW5JbmZvIiwiY29sSW5wdXQiLCJzdGF2ZXMiLCJjb2xJbmZvIiwiaGFzQ29sdW1uIiwiam9pbiIsInN0YWZmQ29sIiwiYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyIiwiZGVjcmVtZW50QnV0dG9uIiwiaW5jcmVtZW50QnV0dG9uIiwiY29uZmlybUJ1dHRvbiIsInVwZGF0ZU51bWJlciIsImNoYW5nZSIsImN1cnJlbnRWYWx1ZSIsInRvU2V0Q29sdW1uIiwic2V0RWRpdENvbnRyb2xzIiwiZWRpdFR5cGUiLCJjb250ZW50cyIsInBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24iLCJ0cmlnZ2VyU3RhZmZTcGxpdE1vZGUiLCJTcGxpdFN0YWZmSGFuZGxlciIsInN0YXJ0U3BsaXQiLCJpbml0T3B0aW9uc0xpc3RlbmVycyIsImRyb3AiLCJvcHRpb25zQ2xpY2thd2F5Iiwib3RoZXIiLCJpbml0TmVvblZpZXciLCJDb250ZW50cyIsInVuc2V0SW5jbGluYXR1bSIsInVuc2V0VmlyZ2EiLCJ1bnNldFZpcmdhUmV2ZXJzZWQiLCJ1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UiLCJ1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlIiwic2V0SW5jbGluYXR1bSIsInNldFZpcmdhIiwic2V0VmlyZ2FSZXZlcnNlZCIsInNldExpcXVlc2NlbnRDbG9ja3dpc2UiLCJzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSIsInRyaWdnZXJDaGFuZ2VHcm91cCIsImNvbnRvdXIiLCJjaGFuZ2VHcm91cGluZ0FjdGlvbiIsIlNwbGl0TmV1bWVIYW5kbGVyIiwiaW5mbyIsImdldENvbnRvdXJCeVZhbHVlIiwiZXh0cmFBY3Rpb25zSFRNTCIsImFjY2lkT3B0aW9uc0xpc3RlbmVyIiwiaW5jcmVtZW50T2N0YXZlIiwiZGlyZWN0aW9uIiwic2hhcGUiLCJjbGVmT3B0aW9uc0xpc3RlbmVyIiwiZGl2TGluZU9wdGlvbnNMaXN0ZW5lciIsIm1lcmdlU3RhdmVzIiwicG9pbnRzIiwiZ2V0U3RhZmZCQm94IiwieV9jaGFuZ2UiLCJ0YW4iLCJnZXRTVkdSZWxDb29yZHMiLCJjbGllbnRYIiwiY2xpZW50WSIsInB0IiwiRE9NUG9pbnQiLCJwYWdlTWFyZ2luIiwibWF0cml4VHJhbnNmb3JtIiwiZ2V0U2NyZWVuQ1RNIiwiaW52ZXJzZSIsImdldFN0YWZmSWRCeUNvb3JkcyIsInN0YWZmQkJveGVzIiwic3RhZmZJZCIsImJnSW1nIiwicmVjdCIsInRhZ05hbWUiLCJnZXRCQm94IiwicGFyZW50Tm9kZSIsIndpZHRoIiwiaGVpZ2h0IiwiaGV4X2NociIsIm1kNWN5Y2xlIiwiayIsImEiLCJiIiwibWQ1YmxrIiwibWQ1YmxrcyIsImNoYXJDb2RlQXQiLCJtZDVibGtfYXJyYXkiLCJtZDUxIiwidGFpbCIsInRtcCIsImxvIiwiaGkiLCJzdWJzdHJpbmciLCJyaGV4IiwiaGV4IiwidG9VdGY4Iiwic3RyIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJoZXhUb0JpbmFyeVN0cmluZyIsImJ5dGVzIiwiZnJvbUNoYXJDb2RlIiwiU3BhcmtNRDUiLCJyZXNldCIsIkFycmF5QnVmZmVyIiwiY2xhbXAiLCJ2YWwiLCJ0byIsIm51bSIsInRhcmdldEFycmF5Iiwic291cmNlQXJyYXkiLCJieXRlTGVuZ3RoIiwiYmVnaW4iLCJlbmQiLCJVaW50OEFycmF5IiwiYXBwZW5kQmluYXJ5IiwiX2J1ZmYiLCJfbGVuZ3RoIiwiX2hhc2giLCJyYXciLCJidWZmIiwiX2ZpbmlzaCIsImdldFN0YXRlIiwiaGFzaCIsInNldFN0YXRlIiwiZGVzdHJveSIsImhhc2hCaW5hcnkiLCJmaXJzdCIsInNlY29uZCIsInJldHVyblVJbnQ4QXJyYXkiLCJidWZmZXIiLCJzdWJhcnJheSIsInV0ZjhTdHIyQXJyYXlCdWZmZXIiLCJtZDUxX2FycmF5IiwiZmFjdG9yeSIsInVpbnQ4VG9VdWlkIiwiZGF0YSIsImNiIiwicHJldmlvdXMiLCJjdXJyZW50IiwicGFkU3RhcnQiLCJyZWR1Y2UiLCJjcnlwdG8iLCJvY3RldHMiLCJtb2RpZmllcnMiLCJnZXRSYW5kb21WYWx1ZXMiLCJDb2xvclBhbGV0dGUiLCJyZWN0cyIsInVuc2V0U3RhZmZIaWdobGlnaHQiLCJjaGlsZCIsImNjaGlsZCIsInNldFN0YWZmSGlnaGxpZ2h0Iiwic3RhZmZDb2xvciIsImNvbHVtbk51bSIsImNvbHVtbiIsInNldENvbHVtbkhpZ2hsaWdodCIsImdyb3VwQ29sb3IiLCJkaXZMaW5lQ2hpbGRyZW4iLCJ1cmkiLCJWYWxpZGF0aW9uRXJyb3IiLCJpbnN0YW5jZSIsInNjaGVtYSIsImFyZ3VtZW50IiwiaXNBcnJheSIsInN1bSIsIml0ZW0iLCJtYWtlU3VmZml4IiwiJGlkIiwic3RhY2siLCJWYWxpZGF0b3JSZXN1bHQiLCJjdHgiLCJwcm9wZXJ0eVBhdGgiLCJlcnJvcnMiLCJ0aHJvd0Vycm9yIiwidGhyb3dGaXJzdCIsInRocm93QWxsIiwiZGlzYWJsZUZvcm1hdCIsInN0cmluZ2l6ZXIiLCJ2IiwiVmFsaWRhdG9yUmVzdWx0RXJyb3IiLCJjYXB0dXJlU3RhY2tUcmFjZSIsImFkZEVycm9yIiwiZGV0YWlsIiwiaW1wb3J0RXJyb3JzIiwicmVzIiwidmFsaWRhdG9yVHlwZSIsIlNjaGVtYUVycm9yIiwibXNnIiwiU2NoZW1hQ29udGV4dCIsImJhc2UiLCJzY2hlbWFzIiwibWFrZUNoaWxkIiwicHJvcGVydHlOYW1lIiwiRk9STUFUX1JFR0VYUFMiLCJpbnB1dCIsInBhcnNlRmxvYXQiLCJSZWdFeHAiLCJyZWdleHAiLCJyZWdleCIsInBhdHRlcm4iLCJpcHY0IiwiaXNGb3JtYXQiLCJmb3JtYXQiLCJ2YWxpZGF0b3IiLCJjdXN0b21Gb3JtYXRzIiwiZGVlcE1lcmdlciIsImRzdCIsImRlZXBNZXJnZSIsImNvcHlpc3QiLCJzcmMiLCJjb3B5aXN0V2l0aERlZXBNZXJnZSIsInBhdGhFbmNvZGVyIiwiZGVlcENvbXBhcmVTdHJpY3QiLCJldmVyeSIsImFLZXlzIiwiYktleXMiLCJvYmplY3RHZXRQYXRoIiwicGFydHMiLCJzcGxpdCIsImRlY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVBhdGgiLCJnZXREZWNpbWFsUGxhY2VzIiwibnVtYmVyIiwiZGVjaW1hbFBsYWNlcyIsImRlY2ltYWxQYXJ0cyIsImlzU2NoZW1hIiwicm5kczgiLCJybmciLCJtc0NyeXB0byIsIm9iaiIsIm1ldGFTdGFjayIsImxhc3RNZXRhRWxlbWVudCIsImxhc3RFbGVtZW50SW5kZXgiLCJuZXh0IiwiYXJyYXlQcmVmaXgiLCJvYmpQcmVmaXgiLCJwcmVmaXgiLCJjb2xsYXRpb25JbmRleCIsInBhcnNlZE51bSIsIm51bUNoYXIiLCJwYXJzZWRTdHJpbmciLCJsYXN0Q2giLCJudW1Db25zZWN1dGl2ZVNsYXNoZXMiLCJjaCIsImFycmF5RWxlbWVudCIsIm9iakVsZW1lbnQiLCJidWYiLCJybmRzIiwicmFuZG9tIiwic2VsZWN0b3IiLCJkcmFnU3RhcnRDb29yZHMiLCJkcmFnQmVoYXZpb3VyIiwiZHJhZyIsImV2ZW50IiwiZHgiLCJkeSIsInNvdXJjZUV2ZW50IiwiZHJhZ2dpbmciLCJkcmFnRW5kZWQiLCJzZWxlY3Rpb24iLCJub01vdmVQcmVjZWRlcyIsImhhc0F0dHJpYnV0ZSIsIm1vdmVFbGVtZW50cyIsImJib3hlcyIsInhEaWZmIiwieURpZmYiLCJpc0N1cnNvck91dE9mQm91bmRzIiwiaXNEcmFnT3V0T2ZCb3VuZHMiLCJyZXR1cm5FbGVtZW50cyIsInBhcmFtQXJyYXkiLCJkcmFnQWN0aW9uIiwidG9SZXNlbGVjdCIsInJlc2VsZWN0IiwicmVzZWxlY3RlZCIsInJlc2V0VG9BY3Rpb24iLCJlbmRYIiwiZW5kWSIsImlzT3V0T2ZTVkdCb3VuZHMiLCJnbHlwaFNlbGVjdG9yIiwic2VsZWN0aW9uQkJveCIsImFjYyIsImdldEdseXBoQkJveCIsImN1cnIiLCJNQVhfVkFMVUUiLCJNSU5fVkFMVUUiLCJTZWxlY3RUb29scyIsInNoYXJlZExvZ2ljYWxQYXJlbnQiLCJhcmVBZGphY2VudCIsImNvbnRhaW5zTGlua2VkIiwiaXNMaW5rZWQiLCJjYW5CZUxpbmtlZCIsInNvcnQiLCJzdGFmZkEiLCJzdGFmZkIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzeWxsYWJsZXMiLCJjdXJyZW50U3lsbGFibGVJbmRleCIsImN1cnJlbnRTdGFmZiIsIm5leHRTdGFmZiIsImN1cnJlbnRTdGFmZkluZGV4IiwidW5saW5rZWRFbGVtZW50cyIsImZpcnN0VW5saW5rZWQiLCJET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkciLCJpZHgiLCJzeWxsYWJsZSIsImF0IiwibmV4dFN5bGxhYmxlSWQiLCJuZXh0U3lsbGFibGVJZHgiLCJuZXh0U3lsbGFibGUiLCJwcmV2U3lsbGFibGVJZCIsInByZXZTeWxsYWJsZSIsImhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZSIsInN5c3RlbXMiLCJlbGVtZW50SWRzIiwiZ3JvdXBpbmdBY3Rpb24iLCJnZXRDaGlsZHJlbklkcyIsImdldElkcyIsInRvZ2dsZUxpbmtlZFN5bGxhYmxlcyIsImdyb3VwVHlwZSIsIm5ldW1lUGFyZW50IiwibmNzIiwiZ2V0Q29udG91ciIsIldhcm5pbmdzIiwiZ3JvdXBpbmdOb3RSZWNvZ25pemVkIiwiZ2V0U1ZHR3JhcGhpY3NFbGVtZW50QnlJZCIsIlNWR0dyYXBoaWNzRWxlbWVudCIsInVubGluayIsImZpcnN0U3lsbGFibGUiLCJzZWNvbmRTeWxsYWJsZSIsInVubGlua2VkRWxlbWVudCIsImdldFRvZ2dsZVN5bGxhYmxlSWRzIiwibG9nIiwiaWRzIiwiY2hpbGRyZW5JZHMiLCJjcmVhdGVMb2dNZXNzYWdlIiwibm90aWYiLCJub3RpZkRpdiIsInJlbW92ZUJ0biIsIm9uY2xpY2siLCJpbmZvQnRuIiwibW9kYWxXaW5kb3ciLCJNb2RhbFdpbmRvdyIsInNldE1vZGFsV2luZG93VmlldyIsIm9wZW5Nb2RhbFdpbmRvdyIsIm9wZW5FcnJvckxvZ1dpbmRvdyIsImluaXRFcnJvckxvZ0NvbnRyb2xzIiwiZXJyb3JQYW5lbCIsImhlYWRpbmciLCJkcm9wZG93bkljb24iLCJpbml0RGlzcGxheUxpc3RlbmVyIiwiY2hlY2tib3hlc0NvbnRhaW5lciIsImVycm9yc0xhYmVsIiwiZXJvcnJzQnRuIiwiYXBwZW5kQ2hpbGQiLCJ1cGRhdGVFcnJvckxvZ1Zpc2liaWxpdHkiLCJub3RpZlBhbmVsIiwiUG9pbnROYW1lcyIsIlRvcExlZnQiLCJUb3AiLCJUb3BSaWdodCIsIlJpZ2h0IiwiQm90dG9tUmlnaHQiLCJCb3R0b20iLCJCb3R0b21MZWZ0IiwiTGVmdCIsImdldFBvaW50cyIsInNpbiIsImluaXRpYWxVbHgiLCJpbml0aWFsTHJ4IiwiaW5pdGlhbFBvaW50IiwiaW5pdGlhbFVseSIsImluaXRpYWxMcnkiLCJpbml0aWFsWSIsImluaXRpYWxSZWN0WSIsInBvbHlMZW4iLCJpbml0aWFsUm90YXRlIiwicmVkcmF3IiwicG9pbnRTdHJpbmciLCJfZWxlbSIsInRleHRSZWN0IiwicG9pbnROYW1lIiwicG9pbnQiLCJwb2ludFN0cmluZ1JpZ2h0IiwicG9pbnRTdHJpbmdMZWZ0IiwiZHJhd0luaXRpYWxSZWN0Iiwid2hpY2hQb2ludCIsIl8iLCJ2aWV3cG9ydEVsZW1lbnQiLCJyZXNpemVTdGFydCIsInJlc2l6ZURyYWciLCJyZXNpemVFbmQiLCJyb3RhdGVTdGFydCIsInRlbXAiLCJtb3VzZSIsInRlbXBSb3RhdGUiLCJyb3RhdGVFbmQiLCJjdXJyZW50UG9pbnQiLCJ3aGljaCIsIlBJIiwiRXhwb3J0ZWRTZXQiLCJFeHBvcnRlZE1hcCIsIm1hbmdsZSIsInVubWFuZ2xlIiwiTWFwJDEiLCJfc3RvcmUiLCJTZXQkMSIsImNsb25lQmluYXJ5T2JqZWN0IiwiY2xvbmVBcnJheUJ1ZmZlciIsIndlYmtpdFNsaWNlIiwibWFuZ2xlZCIsImRlbGV0ZSIsIk1hcCIsInByb3AiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJzcGVjaWVzIiwic3VwcG9ydHNNYXBBbmRTZXQiLCJmdW5jVG9TdHJpbmciLCJvYmplY3RDdG9yU3RyaW5nIiwiY2xvbmUiLCJuZXdPYmplY3QiLCJEYXRlIiwiaXNGaW5pdGUiLCJ0b0lTT1N0cmluZyIsIkJsb2IiLCJpc0JpbmFyeU9iamVjdCIsInByb3RvIiwiQ3RvciIsImlzUGxhaW5PYmplY3QiLCJjYWxsZWQiLCJ0b1Byb21pc2UiLCJmdW5jIiwic2VsZiIsInVzZWRDQiIsInByb21pc2UiLCJmdWxmaWxsIiwicmVzcCIsImNhbGxiYWNrIiwibWVzZyIsImFkYXB0ZXJGdW4iLCJfY2xvc2VkIiwiX2Rlc3Ryb3llZCIsImxvZ0FyZ3MiLCJvcmlnQ2FsbGJhY2siLCJyZXNwb25zZUFyZ3MiLCJsb2dBcGlDYWxsIiwidGFza3F1ZXVlIiwiaXNSZWFkeSIsImFkZFRhc2siLCJmYWlsZWQiLCJwaWNrIiwiaGFzTG9jYWwiLCJpZGVudGl0eUZ1bmN0aW9uIiwiZm9ybWF0UmVzdWx0Rm9yT3BlblJldnNHZXQiLCJvayIsImJ1bGtHZXQiLCJkYiIsIm9wdHMiLCJyZXF1ZXN0cyIsImRvY3MiLCJyZXF1ZXN0c0J5SWQiLCJyZXF1ZXN0IiwibnVtRG9jcyIsIm51bURvbmUiLCJwZXJEb2NSZXN1bHRzIiwiY2hlY2tEb25lIiwicmVzdWx0cyIsImFsbFJlcXVlc3RzIiwibmV4dEJhdGNoIiwidXBUbyIsImJhdGNoIiwiZG9jSWQiLCJkb2NJZHgiLCJkb2NSZXF1ZXN0cyIsImRvY09wdHMiLCJvcGVuX3JldnMiLCJyZXYiLCJmb3JtYXRSZXN1bHQiLCJwcm9jZXNzQmF0Y2giLCJoYXNMb2NhbFN0b3JhZ2UiLCJDaGFuZ2VzIiwiYXR0YWNoQnJvd3NlckV2ZW50cyIsImd1YXJkZWRDb25zb2xlIiwibWV0aG9kIiwiZGVmYXVsdEJhY2tPZmYiLCJtYXhUaW1lb3V0IiwicmFuZG9tTnVtYmVyIiwiZXhwbGFpbkVycm9yIiwic3RhdHVzIiwiZGJOYW1lIiwiaW5wcm9ncmVzcyIsImV2ZW50RnVuY3Rpb24iLCJjaGFuZ2VzT3B0cyIsImNoYW5nZXMiLCJzZXEiLCJzaW5jZSIsImNhbmNlbGxlZCIsIm9uQ2hhbmdlIiwibm90aWZ5TG9jYWxXaW5kb3dzIiwibm90aWZ5IiwiJGluamVjdF9PYmplY3RfYXNzaWduIiwiYXNzaWduIiwibmV4dFNvdXJjZSIsIm5leHRLZXkiLCJQb3VjaEVycm9yIiwicmVhc29uIiwiTUlTU0lOR19CVUxLX0RPQ1MiLCJNSVNTSU5HX0RPQyIsIlJFVl9DT05GTElDVCIsIklOVkFMSURfSUQiLCJNSVNTSU5HX0lEIiwiUkVTRVJWRURfSUQiLCJVTktOT1dOX0VSUk9SIiwiQkFEX0FSRyIsIlFVRVJZX1BBUlNFX0VSUk9SIiwiRE9DX1ZBTElEQVRJT04iLCJCQURfUkVRVUVTVCIsIk5PVF9BTl9PQkpFQ1QiLCJJREJfRVJST1IiLCJJTlZBTElEX1JFViIsIk1JU1NJTkdfU1RVQiIsImNyZWF0ZUVycm9yIiwiQ3VzdG9tUG91Y2hFcnJvciIsIm5hbWVzIiwiZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZSIsImZpbHRlckNoYW5nZSIsInJlcSIsImhhc0ZpbHRlciIsInF1ZXJ5IiwicXVlcnlfcGFyYW1zIiwiZG9jIiwiZmlsdGVyUmV0dXJuIiwidHJ5RmlsdGVyIiwiaW5jbHVkZV9kb2NzIiwiYXR0YWNobWVudHMiLCJhdHQiLCJfYXR0YWNobWVudHMiLCJzdHViIiwiZmxhdHRlbiIsImFycnMiLCJpbnZhbGlkSWRFcnJvciIsImlzUmVtb3RlIiwiX3JlbW90ZSIsInBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lIiwibm9ybWFsaXplRGVzaWduRG9jRnVuY3Rpb25OYW1lIiwibm9ybWFsaXplZCIsInFQYXJzZXIiLCJwYXJzZXIiLCJwYXJzZVVyaSIsImV4ZWMiLCJlbmNvZGVkIiwiJDAiLCIkMSIsIiQyIiwic2NvcGVFdmFsIiwic291cmNlIiwic2NvcGUiLCJ1cHNlcnQiLCJkaWZmRnVuIiwiY2F0Y2giLCJkb2NSZXYiLCJfcmV2IiwibmV3RG9jIiwiX2lkIiwicHV0IiwidXBkYXRlZCIsInRyeUFuZFB1dCIsInRoaXNBdG9iIiwiYXRvYiIsInRoaXNCdG9hIiwiYnRvYSIsImNyZWF0ZUJsb2IiLCJwcm9wZXJ0aWVzIiwiYnVpbGRlciIsIkJsb2JCdWlsZGVyIiwiTVNCbG9iQnVpbGRlciIsIk1vekJsb2JCdWlsZGVyIiwiV2ViS2l0QmxvYkJ1aWxkZXIiLCJnZXRCbG9iIiwiYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlciIsImJpbiIsImJpblN0cmluZ1RvQmx1ZmZlciIsImJpblN0cmluZyIsImI2NFRvQmx1ZmZlciIsImI2NCIsInJlYWRBc0JpbmFyeVN0cmluZyIsImJsb2IiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwiaGFzQmluYXJ5U3RyaW5nIiwib25sb2FkZW5kIiwiYmluYXJ5IiwiYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyIsInJlYWRBc0FycmF5QnVmZmVyIiwiYmxvYlRvQmluYXJ5U3RyaW5nIiwiYmxvYk9yQnVmZmVyIiwiYmxvYlRvQmFzZTY0IiwiYmFzZTY0Iiwic2V0SW1tZWRpYXRlU2hpbSIsInNldEltbWVkaWF0ZSIsImFwcGVuZEJsb2IiLCJzdGFydCIsInNsaWNlQmxvYiIsImFycmF5QnVmZmVyIiwiYXBwZW5kU3RyaW5nIiwic3RyaW5nIiwiYmluYXJ5TWQ1IiwiaW5wdXRJc1N0cmluZyIsImNodW5rU2l6ZSIsImNodW5rcyIsImNlaWwiLCJjdXJyZW50Q2h1bmsiLCJsb2FkTmV4dENodW5rIiwiZG9uZSIsInJhd1RvQmFzZTY0Iiwic3RyaW5nTWQ1IiwicmV2JCQxIiwiZGV0ZXJtaW5pc3RpY19yZXZzIiwibXV0YXRlYWJsZURvYyIsIl9yZXZfdHJlZSIsIndpbm5pbmdSZXYiLCJtZXRhZGF0YSIsIndpbm5pbmdJZCIsIndpbm5pbmdQb3MiLCJ3aW5uaW5nRGVsZXRlZCIsIm5vZGUiLCJ0b1Zpc2l0IiwicmV2X3RyZWUiLCJ0cmVlIiwiYnJhbmNoZXMiLCJwb3MiLCJkZWxldGVkIiwidHJhdmVyc2VSZXZUcmVlIiwicmV2cyIsIm5ld0N0eCIsInNvcnRCeVBvcyIsImNvbGxlY3RMZWF2ZXMiLCJsZWF2ZXMiLCJpc0xlYWYiLCJyZXZlcnNlIiwiY29sbGVjdENvbmZsaWN0cyIsIndpbiIsImNvbmZsaWN0cyIsImxlYWYiLCJyb290VG9MZWFmIiwicGF0aHMiLCJoaXN0b3J5Iiwic29ydEJ5UG9zJDEiLCJpbnNlcnRTb3J0ZWQiLCJjb21wYXJhdG9yIiwibWlkIiwibG93IiwiaGlnaCIsImJpbmFyeVNlYXJjaCIsInNwbGljZSIsInBhdGhUb1RyZWUiLCJudW1TdGVtbWVkIiwicm9vdCIsImN1cnJlbnRMZWFmIiwiY29tcGFyZVRyZWUiLCJtZXJnZVRyZWUiLCJpbl90cmVlMSIsImluX3RyZWUyIiwidHJlZTEiLCJ0cmVlMiIsIm1lcmdlZCIsImRvTWVyZ2UiLCJkb250RXhwYW5kIiwicmVzdHJlZSIsImJyYW5jaCIsInQxIiwidDIiLCJkaWZmIiwiY2FuZGlkYXRlUGFyZW50cyIsInRyZWVzIiwicGFyZW50SWR4IiwiZWxlbWVudHNMZW4iLCJtZXJnZSIsImRlcHRoIiwibmV3VHJlZSIsInN0ZW1tZWQiLCJzdGVtbWVkUmV2cyIsInJldkhhc2giLCJzdGVtIiwiZ2V0VHJlZXMiLCJpc0RlbGV0ZWQiLCJpc0xvY2FsSWQiLCJDaGFuZ2VzJDEiLCJjb21wbGV0ZSIsImVlIiwib25EZXN0cm95IiwiY2FuY2VsIiwicGVuZGluZyIsImxhc3RTZXEiLCJpc0NhbmNlbGxlZCIsInRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lciIsInZhbGlkYXRlQ2hhbmdlcyIsInByb2Nlc3NDaGFuZ2UiLCJjaGFuZ2VMaXN0IiwiX2NvbmZsaWN0cyIsImNvbXBhcmUiLCJsZWZ0IiwicmlnaHQiLCJ5YW5rRXJyb3IiLCJjb21wYXJlQnlJZFRoZW5SZXYiLCJpZENvbXBhcmUiLCJfcmV2aXNpb25zIiwiQWJzdHJhY3RQb3VjaERCIiwiVGFza1F1ZXVlIiwiUG91Y2hEQiIsIl9fb3B0cyIsImF1dG9fY29tcGFjdGlvbiIsImJhY2tlbmQiLCJhZGFwdGVyIiwiYWRhcHRlcnMiLCJwcmVmZXJyZWRBZGFwdGVycyIsImFkYXB0ZXJOYW1lIiwidXNlX3ByZWZpeCIsInBhcnNlQWRhcHRlciIsIl9hZGFwdGVyIiwidmFsaWQiLCJ2aWV3X2FkYXB0ZXIiLCJmYWlsIiwib25EZXN0cm95ZWQiLCJmcm9tX2NvbnN0cnVjdG9yIiwib25DbG9zZWQiLCJwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24iLCJyZWFkeSIsIl9jaGFuZ2VzRmlsdGVyUGx1Z2luIiwidmFsaWRhdGUiLCJkb0NoYW5nZXMiLCJjb250aW51b3VzIiwibGl2ZSIsIm5vcm1hbGl6ZSIsInNob3VsZEZpbHRlciIsImRlc2NlbmRpbmciLCJsaW1pdCIsIm5ld1Byb21pc2UiLCJfY2hhbmdlcyIsInVwZGF0ZV9zZXEiLCJwb3N0IiwiYnVsa0RvY3MiLCJfcHV0TG9jYWwiLCJfZGVsZXRlZCIsIl9yZW1vdmVMb2NhbCIsIm9sZFJldklkIiwibmV3UmV2TnVtIiwibmV3UmV2SWQiLCJwdXREb2MiLCJfcHV0IiwibmV3X2VkaXRzIiwiZm9yY2UiLCJwdXRBdHRhY2htZW50IiwiYXR0YWNobWVudElkIiwiYXBpIiwiY3JlYXRlQXR0YWNobWVudCIsInByZXZyZXZwb3MiLCJjb250ZW50X3R5cGUiLCJyZXZwb3MiLCJyZW1vdmVBdHRhY2htZW50IiwiZG9jT3JJZCIsIm9wdHNPclJldiIsIndhc19kZWxldGUiLCJyZXZzRGlmZiIsIm1pc3NpbmciLCJhZGRUb01pc3NpbmciLCJyZXZJZCIsIl9nZXRSZXZpc2lvblRyZWUiLCJtaXNzaW5nRm9ySWQiLCJwcm9jZXNzRG9jIiwibWlzc2luZ09iaiIsImNvbXBhY3REb2N1bWVudCIsIm1heEhlaWdodCIsInJldlRyZWUiLCJlZGdlcyIsInBybnQiLCJlZGdlIiwiY29tcHV0ZUhlaWdodCIsImNhbmRpZGF0ZXMiLCJfZG9Db21wYWN0aW9uIiwiY29tcGFjdCIsIl9jb21wYWN0aW9uUXVldWUiLCJkb05leHRDb21wYWN0aW9uIiwibGFzdF9zZXEiLCJfY29tcGFjdCIsInJldHVybl9kb2NzIiwicHJvbWlzZXMiLCJyb3ciLCJhbGwiLCJfZ2V0TG9jYWwiLCJmaW5pc2hPcGVuUmV2cyIsImxhdGVzdCIsIl9nZXQiLCJyZXZzX2luZm8iLCJzcGxpdHRlZFJldiIsInJldk5vIiwiY3VycmVudFBhdGgiLCJoYXNoSW5kZXgiLCJpbmRleE9mUmV2IiwiaG93TWFueSIsIl9yZXZzX2luZm8iLCJfZ2V0QXR0YWNobWVudCIsImdldEF0dGFjaG1lbnQiLCJhbGxEb2NzIiwic2tpcCIsInN0YXJ0X2tleSIsInN0YXJ0a2V5IiwiZW5kX2tleSIsImVuZGtleSIsImluY29tcGF0aWJsZU9wdCIsImFsbERvY3NLZXlzUGFyc2UiLCJfYWxsRG9jcyIsImNsb3NlIiwiX2Nsb3NlIiwiX2luZm8iLCJkYl9uYW1lIiwiX3R5cGUiLCJhdHRhY2htZW50RXJyb3IiLCJjaGFyQXQiLCJhdHRhY2htZW50TmFtZUVycm9yIiwiYXR0cyIsImNsZWFuRG9jcyIsIl9idWxrRG9jcyIsInJlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UiLCJkZXBlbmRlbnREYiIsImRiT3B0aW9ucyIsImRlcERCIiwiZGVwZW5kZW50RGJzIiwidXNlUHJlZml4IiwiZGVzdHJveURiIiwiX2Rlc3Ryb3kiLCJsb2NhbERvYyIsImRlbGV0ZWRNYXAiLCJ0cnVlTmFtZSIsImV4ZWN1dGUiLCJBYm9ydENvbnRyb2xsZXIiLCJhYm9ydCIsImYkMSIsImZldGNoIiwiaCIsIkhlYWRlcnMiLCJldmVudEVtaXR0ZXIiLCJQb3VjaCIsImRlc3RydWN0TGlzdGVuZXJzIiwiX2Rlc3RydWN0aW9uTGlzdGVuZXJzIiwiZGJMaXN0Iiwic2V0VXBFdmVudEVtaXR0ZXIiLCJhZGRUb1ByZWZlcnJlZEFkYXB0ZXJzIiwicGx1Z2luIiwiX19kZWZhdWx0cyIsImRlZmF1bHRzIiwiZGVmYXVsdE9wdHMiLCJQb3VjaEFsdCIsInVybCIsImdldEZpZWxkRnJvbURvYyIsInBhcnNlZEZpZWxkIiwicGFyc2VGaWVsZCIsImZpZWxkTmFtZSIsImZpZWxkcyIsImNvbWJpbmF0aW9uRmllbGRzIiwiaXNDb21iaW5hdGlvbmFsRmllbGQiLCJmaWVsZCIsImdldEtleSIsIm1lcmdlQW5kZWRTZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCIkb3IiLCIkbm9yIiwibWF0Y2hlciIsIiRlcSIsImxvbmdlc3QiLCJmaWVsZE1hdGNoZXJzIiwib3BlcmF0b3IiLCIkZ3RlIiwiJGd0IiwibWVyZ2VHdEd0ZSIsIiRsdGUiLCIkbHQiLCJtZXJnZUx0THRlIiwiJG5lIiwibWVyZ2VOZSIsIm1lcmdlRXEiLCIkcmVnZXgiLCJtZXJnZVJlZ2V4IiwibWFzc2FnZVNlbGVjdG9yIiwid2FzQW5kZWQiLCJpc0FuZEluU2VsZWN0b3IiLCJpc0FuZCIsIm1lcmdlQW5kZWRTZWxlY3RvcnNOZXN0ZWQiLCJvck9yTm9yIiwic3ViU2VsZWN0b3IiLCJjb2xsYXRlIiwibm9ybWFsaXplS2V5IiwiYWkiLCJiaSIsInN0cmluZ0NvbGxhdGUiLCJhcnJheUNvbGxhdGUiLCJhayIsImJrIiwib2JqZWN0Q29sbGF0ZSIsIkluZmluaXR5Iiwib3JpZ0tleSIsInRvSlNPTiIsImluZGV4aWZ5IiwiZXhwRm9ybWF0IiwidG9FeHBvbmVudGlhbCIsIm1hZ25pdHVkZSIsIm5lZyIsIm1hZ1N0cmluZyIsInBhZFdpdGgiLCJ1cFRvTGVuZ3RoIiwidGFyZ2V0TGVuZ3RoIiwicGFkIiwiZmFjdG9yIiwiZmFjdG9yU3RyIiwidG9GaXhlZCIsIm51bVRvSW5kZXhhYmxlU3RyaW5nIiwidG9JbmRleGFibGVTdHJpbmciLCJvYmpLZXkiLCJwYXJzZU51bWJlciIsIm9yaWdpbmFsSWR4IiwibnVtQXNTdHJpbmciLCJtYWdBc1N0cmluZyIsImZpbHRlckluTWVtb3J5RmllbGRzIiwicm93cyIsInJlcXVlc3REZWYiLCJpbk1lbW9yeUZpZWxkcyIsInJvd0ZpbHRlciIsImZpZWxkU29ydGVyIiwiZ2V0RmllbGRWYWx1ZXNBc0FycmF5Iiwic29ydGluZyIsImFSb3ciLCJiUm93IiwiY29sbGF0aW9uIiwiY3JlYXRlRmllbGRTb3J0ZXIiLCJkb2NGaWVsZFZhbHVlIiwic29tZSIsIm9yTWF0Y2hlcnMiLCJtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yIiwibWF0Y2hTZWxlY3RvciIsIm1heWJlVXNlck9wZXJhdG9yIiwidXNlclZhbHVlIiwic3ViUGFyc2VkRmllbGQiLCJzdWJEb2NGaWVsZFZhbHVlIiwidXNlck9wZXJhdG9yIiwibWF0Y2hlcnMiLCJmaWVsZEV4aXN0cyIsImZpZWxkSXNOb3RVbmRlZmluZWQiLCJhcnJheUNvbnRhaW5zVmFsdWUiLCJkb2NGaWVsZFZhbHVlSXRlbSIsIm1vZEZpZWxkIiwibmVWYWx1ZSIsImFycmF5U2l6ZSIsImFycmF5Q29udGFpbnNBbGxWYWx1ZXMiLCJyZWdleFZhbHVlIiwicmVnZXhNYXRjaCIsInR5cGVNYXRjaCIsImZpbHRlck5hbWUiLCJjaGFuZ2VzSGFuZGxlciIsImRvY19pZHMiLCJ2aWV3TmFtZSIsImRkb2MiLCJtYXBGdW4iLCJ2aWV3cyIsInJvd3NNYXRjaGVkIiwibWF0Y2hlc1NlbGVjdG9yIiwiZmlsdGVyRnVuIiwiZmlsdGVycyIsInRvT2JqZWN0IiwidmVyc2lvbiIsInJlc2VydmVkV29yZHMiLCJkYXRhV29yZHMiLCJwYXJzZVJldmlzaW9uSW5mbyIsInBhcnNlRG9jIiwibmV3RWRpdHMiLCJkYk9wdHMiLCJuUmV2TnVtIiwicmV2SW5mbyIsInJldmlzaW9ucyIsInJldmlzaW9uSWRzIiwibWFrZVJldlRyZWVGcm9tUmV2aXNpb25zIiwic3BlY2lhbEtleSIsInByZXByb2Nlc3NTdHJpbmciLCJibG9iVHlwZSIsImFzQmluYXJ5IiwicGFyc2VCYXNlNjQiLCJkaWdlc3QiLCJwcmVwcm9jZXNzQXR0YWNobWVudCIsIm1kNSIsInByZXByb2Nlc3NCbG9iIiwidXBkYXRlRG9jIiwicmV2TGltaXQiLCJwcmV2IiwiZG9jSW5mbyIsIndyaXRlRG9jIiwic3BsaXRSZXYiLCJ0YXJnZXRQb3MiLCJ0YXJnZXRJZCIsInJldkV4aXN0cyIsInByZXZpb3VzV2lubmluZ1JldiIsInByZXZpb3VzbHlEZWxldGVkIiwiaXNSb290IiwibmV3UmV2IiwicmV2X21hcCIsIndpbm5pbmdSZXYkJDEiLCJ3aW5uaW5nUmV2SXNEZWxldGVkIiwiZGVsdGEiLCJwcm9jZXNzRG9jcyIsImRvY0luZm9zIiwiZmV0Y2hlZERvY3MiLCJ0eCIsIm92ZXJhbGxDYWxsYmFjayIsImlkc1RvRG9jcyIsImRvY3NEb25lIiwiZG9jc1RvRG8iLCJjaGVja0FsbERvY3NEb25lIiwiY3VycmVudERvYyIsInJlc3VsdHNJZHgiLCJkb2NXcml0dGVuIiwibmV4dERvYyIsInJvb3RJc01pc3NpbmciLCJpbnNlcnREb2MiLCJET0NfU1RPUkUiLCJNRVRBX1NUT1JFIiwic2FmZUpzb25TdHJpbmdpZnkiLCJqc29uIiwiaWRiRXJyb3IiLCJlbmNvZGVNZXRhZGF0YSIsImRlbGV0ZWRPckxvY2FsIiwiZGVjb2RlTWV0YWRhdGEiLCJzdG9yZWRPYmplY3QiLCJzYWZlSnNvblBhcnNlIiwiZGVjb2RlRG9jIiwiX2RvY19pZF9yZXYiLCJsYXN0SW5kZXhPZiIsInJlYWRCbG9iRGF0YSIsImFzQmxvYiIsImZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeSIsInR4biIsImF0dE9iaiIsIm9iamVjdFN0b3JlIiwib25zdWNjZXNzIiwiZmV0Y2hBdHRhY2htZW50IiwicG9zdFByb2Nlc3NBdHRhY2htZW50cyIsImF0dE5hbWVzIiwiY29tcGFjdFJldnMiLCJwb3NzaWJseU9ycGhhbmVkRGlnZXN0cyIsInNlcVN0b3JlIiwiYXR0U3RvcmUiLCJhdHRBbmRTZXFTdG9yZSIsIklEQktleVJhbmdlIiwiYm91bmQiLCJkZWxldGVPcnBoYW5lZEF0dGFjaG1lbnRzIiwib3BlbkN1cnNvciIsIm9ubHkiLCJjdXJzb3IiLCJkaWdlc3RTZXEiLCJwcmltYXJ5S2V5IiwiY29udGludWUiLCJvcGVuVHJhbnNhY3Rpb25TYWZlbHkiLCJpZGIiLCJzdG9yZXMiLCJ0cmFuc2FjdGlvbiIsImlkYkJ1bGtEb2NzIiwiZG9jU3RvcmUiLCJieVNlcVN0b3JlIiwiYXR0YWNoU3RvcmUiLCJhdHRhY2hBbmRTZXFTdG9yZSIsIm1ldGFTdG9yZSIsImRvY0luZm9FcnJvciIsIm1ldGFEb2MiLCJhbGxEb2NzUHJvY2Vzc2VkIiwiZG9jQ291bnREZWx0YSIsInByZWNvbmRpdGlvbkVycm9yZWQiLCJfbWV0YSIsImJsb2JTdXBwb3J0Iiwib25BbGxEb2NzUHJvY2Vzc2VkIiwidXBkYXRlRG9jQ291bnRJZlJlYWR5IiwiZG9jQ291bnQiLCJuZXdSZXZJc0RlbGV0ZWQiLCJpc1VwZGF0ZSIsImNvbGxlY3RSZXN1bHRzIiwiZmluaXNoRG9jIiwiYXR0YWNobWVudFNhdmVkIiwibmV3QXR0Iiwic2F2ZUF0dGFjaG1lbnQiLCJ3cml0ZUF0dGFjaG1lbnRzIiwiYWZ0ZXJQdXREb2MiLCJyZXZzVG9EZWxldGUiLCJjb21wYWN0VHJlZSIsIm1ldGFkYXRhVG9TdG9yZSIsImFmdGVyUHV0TWV0YWRhdGEiLCJhdHRzQWRkZWQiLCJhdHRzVG9BZGQiLCJvbmVycm9yIiwiaW5zZXJ0QXR0YWNobWVudE1hcHBpbmdzIiwicHV0UmVxIiwib3ZlcmFsbEVyciIsImRvY3YiLCJyZWN2IiwicHJvY2Vzc2VkQXR0YWNobWVudCIsInByZXByb2Nlc3NBdHRhY2htZW50cyIsInR4blJlc3VsdCIsIm9uYWJvcnQiLCJvbnRpbWVvdXQiLCJvbmNvbXBsZXRlIiwiZmluaXNoIiwiZGlnZXN0cyIsImZpbGVuYW1lIiwidmVyaWZ5QXR0YWNobWVudCIsImF0dEVyciIsInZlcmlmeUF0dGFjaG1lbnRzIiwibnVtRmV0Y2hlZCIsInJldnNfbGltaXQiLCJyZWFkTWV0YWRhdGEiLCJmZXRjaEV4aXN0aW5nRG9jcyIsInN0YXJ0VHJhbnNhY3Rpb24iLCJydW5CYXRjaGVkQ3Vyc29yIiwia2V5UmFuZ2UiLCJiYXRjaFNpemUiLCJvbkJhdGNoIiwia2V5c0JhdGNoIiwidmFsdWVzQmF0Y2giLCJwc2V1ZG9DdXJzb3IiLCJvbkdldEFsbCIsIm9uR2V0QWxsS2V5cyIsIm9uQ3Vyc29yIiwiZ2V0QWxsIiwiZ2V0QWxsS2V5cyIsIm5ld0tleVJhbmdlIiwibGFzdEtleSIsInVwcGVyIiwidXBwZXJPcGVuIiwiY29kZSIsImxvd2VyQm91bmQiLCJpZGJBbGxEb2NzIiwia2V5UmFuZ2VFcnJvciIsImluY2x1c2l2ZUVuZCIsImluY2x1c2l2ZV9lbmQiLCJ1cHBlckJvdW5kIiwiY3JlYXRlS2V5UmFuZ2UiLCJvblJlc3VsdHNSZWFkeSIsInVwZGF0ZVNlcSIsIm9uU3VjY2VzcyIsImRvY0lkUmV2SW5kZXgiLCJhbGxEb2NzSW5uZXIiLCJmZXRjaERvY0FzeW5jaHJvbm91c2x5IiwiYmF0Y2hWYWx1ZXMiLCJiYXRjaFZhbHVlIiwiYmF0Y2hLZXlzIiwicmV0dXJuVmFsIiwidG90YWxfcm93cyIsIm1heEtleSIsImFsbERvY3NLZXlzIiwicnVubmluZyIsImFwcGx5TmV4dCIsImRvY0lkcyIsIm51bVJlc3VsdHMiLCJkb2NJZHNUb01ldGFkYXRhIiwib25HZXRNZXRhZGF0YSIsImRvY0lkUmV2Iiwib2JqZWN0U3RvcmVzIiwid2lubmluZ0RvY3MiLCJtZXRhZGF0YXMiLCJmZXRjaFdpbm5pbmdEb2NBbmRNZXRhZGF0YSIsIndpbm5pbmdEb2MiLCJwcm9jZXNzTWV0YWRhdGFBbmRXaW5uaW5nRG9jIiwib25CYXRjaERvbmUiLCJmaWx0ZXJlZCIsImJsb2JTdXBwb3J0UHJvbWlzZSIsImNhY2hlZERCcyIsIm9wZW5SZXFMaXN0IiwiSWRiUG91Y2giLCJ0cnlDb2RlIiwiZW5xdWV1ZVRhc2siLCJ0aGlzQ2FsbGJhY2siLCJpZGJHbG9iYWxGYWlsdXJlRXJyb3IiLCJlbnJpY2hDYWxsYmFja0Vycm9yIiwiYWRkRGVsZXRlZE9yTG9jYWxJbmRleCIsImNyZWF0ZUluZGV4IiwidW5pcXVlIiwibWlncmF0ZUxvY2FsU3RvcmUiLCJsb2NhbFN0b3JlIiwibG9jYWwiLCJyYW5nZSIsInNlcUN1cnNvciIsIm1pZ3JhdGVBdHRzQW5kU2VxcyIsImRpZ2VzdE1hcCIsIm1pZ3JhdGVNZXRhZGF0YSIsIm9uR2V0TWV0YWRhdGFTZXEiLCJtZXRhZGF0YVNlcSIsImZldGNoTWV0YWRhdGFTZXEiLCJpbnN0YW5jZUlkIiwicmVxT3B0cyIsImhpc3RvcnlOb2RlIiwiYXR0YWNoSWQiLCJhdHRhY2htZW50IiwiYmxvYkRhdGEiLCJkb2NfY291bnQiLCJpZGJfYXR0YWNobWVudF9mb3JtYXQiLCJvbGRSZXYiLCJvU3RvcmUiLCJvbGREb2MiLCJvcGVuUmVxIiwiaW5kZXhlZERCIiwiZGVsZXRlRGF0YWJhc2UiLCJjYWNoZWQiLCJnbG9iYWwiLCJvcGVuIiwib251cGdyYWRlbmVlZGVkIiwib2xkVmVyc2lvbiIsImNyZWF0ZU9iamVjdFN0b3JlIiwia2V5UGF0aCIsImF1dG9JbmNyZW1lbnQiLCJjcmVhdGVTY2hlbWEiLCJjdXJyZW50VGFyZ2V0IiwiY3JlYXRlTG9jYWxTdG9yZVNjaGVtYSIsImFkZEF0dGFjaEFuZFNlcVN0b3JlIiwibWlncmF0aW9ucyIsIm1pZ3JhdGlvbiIsIm9udmVyc2lvbmNoYW5nZSIsInN0b3JlZE1ldGFEb2MiLCJjb21wbGV0ZVNldHVwIiwic3RvcmVNZXRhRG9jSWZSZWFkeSIsImluc3RhbmNlS2V5IiwiY291bnREb2NzIiwiYmxvYiQkMSIsIm1hdGNoZWRDaHJvbWUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJtYXRjaGVkRWRnZSIsImNoZWNrQmxvYlN1cHBvcnQiLCJzdXBwb3J0c0J1bGtHZXRNYXAiLCJyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlciIsImVuY29kZURvY0lkIiwicHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEiLCJnZXRIb3N0IiwicHJvdG9jb2wiLCJoYXNVcmxQcmVmaXgiLCJ1c2VyIiwicGFzc3dvcmQiLCJhdXRoIiwidXNlcm5hbWUiLCJnZW5EQlVybCIsImdlblVybCIsInBhdGhEZWwiLCJob3N0IiwicG9ydCIsInBhcmFtc1RvU3RyIiwiSHR0cFBvdWNoIiwiZGJVcmwiLCJzZXR1cFByb21pc2UiLCJvdXJGZXRjaCIsImhlYWRlcnMiLCJjcmVkZW50aWFscyIsIm5BdXRoIiwidG9rZW4iLCJ1YSIsImlzSUUiLCJpc1RyaWRlbnQiLCJpc0VkZ2UiLCJpc0dFVCIsInNob3VsZENhY2hlQnVzdCIsIm5vdyIsImFkYXB0ZXJGdW4kJDEiLCJzZXR1cCIsImZldGNoSlNPTiIsInNraXBfc2V0dXAiLCJlbmNvZGVBdHRhY2htZW50SWQiLCJ1dWlkJCQxIiwicGluZyIsImNvbXBhY3RfcnVubmluZyIsImludGVydmFsIiwiZG9CdWxrR2V0IiwiZG9CdWxrR2V0U2hpbSIsIm51bUJhdGNoZXMiLCJvblJlc3VsdCIsImJhdGNoTnVtIiwic3ViT3B0cyIsInN1cHBvcnRzQnVsa0dldCIsImZldGNoQXR0YWNobWVudHMiLCJmaWxlbmFtZXMiLCJwcm9taXNlRmFjdG9yaWVzIiwiZG9OZXh0IiwicnVuTmV4dEJhdGNoIiwib25FcnJvciIsInRoaXNFcnIiLCJwb29sIiwidHlwZUZpZWxkRGVzY3JpcHRvciIsIl9fcHJvdG9fXyIsImZldGNoRGF0YSIsImRvY09yRG9jcyIsImNvbnRlbnRUeXBlIiwicHJvY2VzcyIsImJyb3dzZXIiLCJwYXJhbVN0ciIsImJhdGNoX3NpemUiLCJoZWFydGJlYXQiLCJyZXF1ZXN0VGltZW91dCIsImxlZnRUb0ZldGNoIiwiZmVlZCIsInNlcV9pbnRlcnZhbCIsInBhcmFtX25hbWUiLCJsYXN0RmV0Y2hlZFNlcSIsImNvbnRyb2xsZXIiLCJhYm9ydGVkIiwiZmV0Y2hPcHRzIiwic2lnbmFsIiwiZmV0Y2hlZCIsInJhd19yZXN1bHRzX2xlbmd0aCIsImZpbmlzaGVkIiwiUXVlcnlQYXJzZUVycm9yIiwiTm90Rm91bmRFcnJvciIsIkJ1aWx0SW5FcnJvciIsInByb21pc2VkQ2FsbGJhY2siLCJzZXF1ZW50aWFsaXplIiwicHJvbWlzZUZhY3RvcnkiLCJ1bmlxIiwidGhlU2V0IiwibWFwVG9LZXlzQXJyYXkiLCJjcmVhdGVCdWlsdEluRXJyb3IiLCJqTGVuIiwiak51bSIsImV2YWxGdW5jdGlvbldpdGhFdmFsIiwiVGFza1F1ZXVlJDEiLCJjcmVhdGVWaWV3Iiwic291cmNlREIiLCJyZWR1Y2VGdW4iLCJ0ZW1wb3JhcnkiLCJsb2NhbERvY05hbWUiLCJjYWNoZWRWaWV3cyIsInZpZXdTaWduYXR1cmUiLCJjcmVhdGVWaWV3U2lnbmF0dXJlIiwiX2NhY2hlZFZpZXdzIiwicHJvbWlzZUZvclZpZXciLCJkZXBEYk5hbWUiLCJmdWxsVmlld05hbWUiLCJkZXBEYnMiLCJsYXN0U2VxRG9jIiwicGVyc2lzdGVudFF1ZXVlcyIsInRlbXBWaWV3UXVldWUiLCJwYXJzZVZpZXdOYW1lIiwiZW1pdEVycm9yIiwiYnVpbHRJblJlZHVjZSIsInN1bXNxciIsIl9zdW1zcXIiLCJhYnN0cmFjdCIsIm1hcHBlciIsInJlZHVjZXIiLCJkZG9jVmFsaWRhdG9yIiwidHJ5TWFwIiwidHJ5UmVkdWNlIiwicmVyZWR1Y2UiLCJvdXRwdXQiLCJzb3J0QnlLZXlUaGVuVmFsdWUiLCJrZXlDb21wYXJlIiwic2xpY2VSZXN1bHRzIiwicm93VG9Eb2NJZCIsInBvc3Rwcm9jZXNzQXR0YWNobWVudHMiLCJhZGRIdHRwUGFyYW0iLCJwYXJhbU5hbWUiLCJhc0pzb24iLCJjb2VyY2VJbnRlZ2VyIiwiaW50ZWdlckNhbmRpZGF0ZSIsImFzTnVtYmVyIiwiY2hlY2tRdWVyeVBhcnNlRXJyb3IiLCJzdGFydGtleU5hbWUiLCJlbmRrZXlOYW1lIiwiZ3JvdXBfbGV2ZWwiLCJvcHRpb25OYW1lIiwiY2hlY2tQb3NpdGl2ZUludGVnZXIiLCJkZWZhdWx0c1RvIiwiZ2V0RG9jc1RvUGVyc2lzdCIsImRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzIiwibWV0YURvY0lkIiwiZGVmYXVsdE1ldGFEb2MiLCJkb2NEYXRhIiwiaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzIiwiaXNHZW5PbmUiLCJnZXRLZXlWYWx1ZURvY3MiLCJrdkRvY3NSZXMiLCJrdkRvY3MiLCJvbGRLZXlzIiwia2V5VmFsdWUiLCJuZXdLZXlzIiwia3ZEb2MiLCJwcm9jZXNzS2V5VmFsdWVEb2NzIiwiZ2V0UXVldWUiLCJ1cGRhdGVWaWV3IiwibWFwUmVzdWx0cyIsImN1cnJlbnRTZXEiLCJsaXN0T2ZEb2NzVG9QZXJzaXN0IiwiZG9jc1RvUGVyc2lzdCIsInNhdmVLZXlWYWx1ZXMiLCJpbmRleGVkX2RvY3MiLCJwcm9ncmVzcyIsInByb2Nlc3NOZXh0QmF0Y2giLCJjaGFuZ2VzX2JhdGNoX3NpemUiLCJjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMiLCJjcmVhdGVEb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyIsInJlc3VsdHNfY291bnQiLCJlbWl0dGVkS2V5VmFsdWUiLCJjb21wbGV4S2V5IiwidXBkYXRlVmlld0luUXVldWUiLCJxdWVyeVZpZXciLCJ0b3RhbFJvd3MiLCJzaG91bGRSZWR1Y2UiLCJmZXRjaEZyb21WaWV3Iiwidmlld09wdHMiLCJleHBlY3RlZEtleXMiLCJwYXJzZWRLZXlBbmREb2NJZCIsInBhcnNlZFN0ciIsInBhcnNlSW5kZXhhYmxlU3RyaW5nIiwib25NYXBSZXN1bHRzUmVhZHkiLCJmaW5hbFJlc3VsdHMiLCJzaG91bGRHcm91cCIsImx2bCIsIlBPU0lUSVZFX0lORklOSVRZIiwibGFzdCIsImdyb3VwS2V5IiwicmVkdWNlVHJ5IiwicmVkdWNlVmlldyIsImFsbERvY3NSZXMiLCJkb2NJZHNUb0RvY3MiLCJmZXRjaFByb21pc2VzIiwia2V5U3RhcnQiLCJrZXlFbmQiLCJxdWVyeVZpZXdJblF1ZXVlIiwicXVlcnlQcm9taXNlZCIsIl9xdWVyeSIsImN1c3RvbVF1ZXJ5Iiwia2V5c0FzU3RyaW5nIiwiaHR0cFF1ZXJ5IiwidXBkYXRlVmlld09wdHMiLCJ2aWV3X3VwZGF0ZV9jaGFuZ2VzX2JhdGNoX3NpemUiLCJmaW5hbFByb21pc2VGYWN0b3J5IiwiZGVzaWduRG9jTmFtZSIsInN0YWxlIiwiY29lcmNlT3B0aW9ucyIsInZpZXdDbGVhbnVwIiwiX3ZpZXdDbGVhbnVwIiwiY3VzdG9tVmlld0NsZWFudXAiLCJodHRwVmlld0NsZWFudXAiLCJkb2NzVG9WaWV3cyIsInZpZXdzVG9TdGF0dXMiLCJkZG9jTmFtZSIsInZpZXdEQk5hbWVzIiwic3RhdHVzSXNHb29kIiwidmlld0RCTmFtZSIsImRlc3Ryb3lQcm9taXNlcyIsImxvY2FsVmlld0NsZWFudXAiLCJjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZSIsIm9yaWdNYXAiLCJyZWR1Y2VGdW5TdHJpbmciLCJidWlsdEluIiwiZ2V0QnVpbHRJbiIsIm1hcHJlZHVjZSIsImlzR2VuT25lJDEiLCJnZXREb2NBdHRhY2htZW50cyIsImdldERvY3MiLCJkaWZmcyIsInJlc3VsdERvY3MiLCJmZXRjaFJldmlzaW9uT25lRG9jcyIsImhhc0NvbmZsaWN0cyIsImJ1bGtHZXRPcHRzIiwibWlzc2luZ1JldiIsImNyZWF0ZUJ1bGtHZXRPcHRzIiwiYnVsa0dldFJlc3BvbnNlIiwiYnVsa0dldEluZm8iLCJyZW1vdGVEb2MiLCJkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cyIsImZpbGVIYXNDaGFuZ2VkIiwiZ2V0RG9jQXR0YWNobWVudHNGcm9tVGFyZ2V0T3JTb3VyY2UiLCJ1cGRhdGVDaGVja3BvaW50IiwiY2hlY2twb2ludCIsInNlc3Npb24iLCJyZXR1cm5WYWx1ZSIsInNlc3Npb25faWQiLCJyZXBsaWNhdG9yIiwiQ2hlY2twb2ludGVyIiwid3JpdGVDaGVja3BvaW50IiwidXBkYXRlVGFyZ2V0IiwidXBkYXRlU291cmNlIiwid3JpdGVUYXJnZXRDaGVja3BvaW50Iiwid3JpdGVTb3VyY2VDaGVja3BvaW50IiwiaXNGb3JiaWRkZW5FcnJvciIsImNvbXBhcmlzb25zIiwidGFyZ2V0RG9jIiwic291cmNlRG9jIiwic3JjRG9jIiwidGd0RG9jIiwiY29tcGFyZVJlcGxpY2F0aW9uSGlzdG9yeSIsInNvdXJjZUhpc3RvcnkiLCJ0YXJnZXRIaXN0b3J5IiwiUyIsInNvdXJjZVJlc3QiLCJUIiwidGFyZ2V0UmVzdCIsImhhc1Nlc3Npb25JZCIsImNvbXBhcmVSZXBsaWNhdGlvbkxvZ3MiLCJzZXNzaW9uSWQiLCJwcm9wcyIsInJlc3QiLCJmbG9vciIsImdldENoZWNrcG9pbnQiLCJnZW5lcmF0ZVJlcGxpY2F0aW9uSWQiLCJxdWVyeVBhcmFtcyIsImZpbHRlclZpZXdOYW1lIiwic29ydE9iamVjdFByb3BlcnRpZXNCeUtleSIsInF1ZXJ5RGF0YSIsIm1kNXN1bSIsInJlcGxpY2F0ZSIsImN1cnJlbnRCYXRjaCIsInJlcElkIiwiY2hlY2twb2ludGVyIiwiYmF0Y2hlcyIsInBlbmRpbmdCYXRjaCIsIndyaXRpbmdDaGVja3BvaW50IiwiY2hhbmdlc0NvbXBsZXRlZCIsInJlcGxpY2F0aW9uQ29tcGxldGVkIiwiYmF0Y2hlc19saW1pdCIsImNoYW5nZXNQZW5kaW5nIiwiY2hhbmdlZERvY3MiLCJzdGFydF90aW1lIiwiZG9jc19yZWFkIiwiZG9jc193cml0dGVuIiwiZG9jX3dyaXRlX2ZhaWx1cmVzIiwiaW5pdENoZWNrcG9pbnRlciIsImNoZWNrcG9pbnRPcHRzIiwid3JpdGVEb2NzIiwiYnVsa09wdHMiLCJjb21wbGV0ZVJlcGxpY2F0aW9uIiwiZXJyb3JzQnlJZCIsImVycm9yc05vIiwiZXJyb3JOYW1lIiwiZmluaXNoQmF0Y2giLCJvdXRSZXN1bHQiLCJnZXRDaGFuZ2VzIiwib25DaGVja3BvaW50RXJyb3IiLCJnZXRCYXRjaERvY3MiLCJnb3QiLCJzdGFydE5leHRCYXRjaCIsImFib3J0UmVwbGljYXRpb24iLCJwcm9jZXNzUGVuZGluZ0JhdGNoIiwiaW1tZWRpYXRlJCQxIiwiZmF0YWxFcnJvciIsImVuZF90aW1lIiwicmV0cnkiLCJiYWNrX29mZl9mdW5jdGlvbiIsImJhY2tPZmZTZXQiLCJjdXJyZW50X2JhY2tfb2ZmIiwiYmFja09mZiIsIm9uQ2hhbmdlc0NvbXBsZXRlIiwib25DaGFuZ2VzRXJyb3IiLCJfYWJvcnRDaGFuZ2VzIiwiYWJvcnRDaGFuZ2VzIiwic3RhcnRDaGFuZ2VzIiwiX2FkZGVkTGlzdGVuZXJzIiwiUmVwbGljYXRpb24iLCJ0b1BvdWNoIiwiUG91Y2hDb25zdHJ1Y3RvciIsInJlcGxpY2F0ZVdyYXBwZXIiLCJyZXBsaWNhdGVSZXQiLCJTeW5jIiwiY2FuY2VsZWQiLCJvcHRzUHVzaCIsIm9wdHNQdWxsIiwicHVsbCIsInB1bGxDaGFuZ2UiLCJwdXNoQ2hhbmdlIiwicHVzaERlbmllZCIsInB1bGxEZW5pZWQiLCJwdXNoUGF1c2VkIiwicHVsbFBhdXNlZCIsInB1c2hBY3RpdmUiLCJwdWxsQWN0aXZlIiwicmVtb3ZlZCIsInJlbW92ZUFsbCIsImFkZE9uZUxpc3RlbmVyIiwib3V0IiwiY2xlYW51cCIsIl9yZWFkeUNhbGxlZCIsInJlcGxpY2F0ZU1ldGhvZHMiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwiZGVmYXVsdFNldFRpbW91dCIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJydW5UaW1lb3V0IiwiZHJhaW5RdWV1ZSIsIm1hcmtlciIsInJ1bkNsZWFyVGltZW91dCIsIm5vb3AiLCJlbnYiLCJhcmd2IiwidmVyc2lvbnMiLCJiaW5kaW5nIiwiY3dkIiwiY2hkaXIiLCJkaXIiLCJ1bWFzayIsIkZVTkNfRVJST1JfVEVYVCIsIlBMQUNFSE9MREVSIiwid3JhcEZsYWdzIiwiYXJnc1RhZyIsImFycmF5VGFnIiwiYm9vbFRhZyIsImRhdGVUYWciLCJlcnJvclRhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJvYmplY3RUYWciLCJyZWdleHBUYWciLCJzZXRUYWciLCJzdHJpbmdUYWciLCJzeW1ib2xUYWciLCJ3ZWFrTWFwVGFnIiwiYXJyYXlCdWZmZXJUYWciLCJkYXRhVmlld1RhZyIsImZsb2F0MzJUYWciLCJmbG9hdDY0VGFnIiwiaW50OFRhZyIsImludDE2VGFnIiwiaW50MzJUYWciLCJ1aW50OFRhZyIsInVpbnQxNlRhZyIsInVpbnQzMlRhZyIsInJlRW1wdHlTdHJpbmdMZWFkaW5nIiwicmVFbXB0eVN0cmluZ01pZGRsZSIsInJlRW1wdHlTdHJpbmdUcmFpbGluZyIsInJlRXNjYXBlZEh0bWwiLCJyZVVuZXNjYXBlZEh0bWwiLCJyZUhhc0VzY2FwZWRIdG1sIiwicmVIYXNVbmVzY2FwZWRIdG1sIiwicmVFc2NhcGUiLCJyZUV2YWx1YXRlIiwicmVJbnRlcnBvbGF0ZSIsInJlSXNEZWVwUHJvcCIsInJlSXNQbGFpblByb3AiLCJyZVByb3BOYW1lIiwicmVSZWdFeHBDaGFyIiwicmVIYXNSZWdFeHBDaGFyIiwicmVUcmltU3RhcnQiLCJyZVdoaXRlc3BhY2UiLCJyZVdyYXBDb21tZW50IiwicmVXcmFwRGV0YWlscyIsInJlU3BsaXREZXRhaWxzIiwicmVBc2NpaVdvcmQiLCJyZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycyIsInJlRXNjYXBlQ2hhciIsInJlRXNUZW1wbGF0ZSIsInJlRmxhZ3MiLCJyZUlzQmFkSGV4IiwicmVJc0JpbmFyeSIsInJlSXNIb3N0Q3RvciIsInJlSXNPY3RhbCIsInJlSXNVaW50IiwicmVMYXRpbiIsInJlTm9NYXRjaCIsInJlVW5lc2NhcGVkU3RyaW5nIiwicnNDb21ib1JhbmdlIiwicnNDb21ib01hcmtzUmFuZ2UiLCJyc0JyZWFrUmFuZ2UiLCJyc01hdGhPcFJhbmdlIiwicnNBc3RyYWwiLCJyc0JyZWFrIiwicnNDb21ibyIsInJzRGlnaXRzIiwicnNEaW5nYmF0IiwicnNMb3dlciIsInJzTWlzYyIsInJzRml0eiIsInJzTm9uQXN0cmFsIiwicnNSZWdpb25hbCIsInJzU3VyclBhaXIiLCJyc1VwcGVyIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJlT3B0TW9kIiwicnNTZXEiLCJyc0Vtb2ppIiwicnNTeW1ib2wiLCJyZUFwb3MiLCJyZUNvbWJvTWFyayIsInJlVW5pY29kZSIsInJlVW5pY29kZVdvcmQiLCJyZUhhc1VuaWNvZGUiLCJyZUhhc1VuaWNvZGVXb3JkIiwiY29udGV4dFByb3BzIiwidGVtcGxhdGVDb3VudGVyIiwidHlwZWRBcnJheVRhZ3MiLCJjbG9uZWFibGVUYWdzIiwic3RyaW5nRXNjYXBlcyIsImZyZWVQYXJzZUZsb2F0IiwiZnJlZVBhcnNlSW50IiwiZnJlZUdsb2JhbCIsImZyZWVTZWxmIiwiZnJlZUV4cG9ydHMiLCJub2RlVHlwZSIsImZyZWVNb2R1bGUiLCJtb2R1bGVFeHBvcnRzIiwiZnJlZVByb2Nlc3MiLCJub2RlVXRpbCIsInJlcXVpcmUiLCJub2RlSXNBcnJheUJ1ZmZlciIsImlzQXJyYXlCdWZmZXIiLCJub2RlSXNEYXRlIiwiaXNEYXRlIiwibm9kZUlzTWFwIiwiaXNNYXAiLCJub2RlSXNSZWdFeHAiLCJpc1JlZ0V4cCIsIm5vZGVJc1NldCIsImlzU2V0Iiwibm9kZUlzVHlwZWRBcnJheSIsImlzVHlwZWRBcnJheSIsInRoaXNBcmciLCJhcnJheUFnZ3JlZ2F0b3IiLCJzZXR0ZXIiLCJpdGVyYXRlZSIsImFjY3VtdWxhdG9yIiwiYXJyYXlFYWNoIiwiYXJyYXlFYWNoUmlnaHQiLCJhcnJheUV2ZXJ5IiwicHJlZGljYXRlIiwiYXJyYXlGaWx0ZXIiLCJyZXNJbmRleCIsImFycmF5SW5jbHVkZXMiLCJiYXNlSW5kZXhPZiIsImFycmF5SW5jbHVkZXNXaXRoIiwiYXJyYXlNYXAiLCJhcnJheVB1c2giLCJhcnJheVJlZHVjZSIsImluaXRBY2N1bSIsImFycmF5UmVkdWNlUmlnaHQiLCJhcnJheVNvbWUiLCJhc2NpaVNpemUiLCJiYXNlUHJvcGVydHkiLCJiYXNlRmluZEtleSIsImNvbGxlY3Rpb24iLCJlYWNoRnVuYyIsImJhc2VGaW5kSW5kZXgiLCJmcm9tSW5kZXgiLCJmcm9tUmlnaHQiLCJzdHJpY3RJbmRleE9mIiwiYmFzZUlzTmFOIiwiYmFzZUluZGV4T2ZXaXRoIiwiYmFzZU1lYW4iLCJiYXNlU3VtIiwiYmFzZVByb3BlcnR5T2YiLCJiYXNlUmVkdWNlIiwiYmFzZVRpbWVzIiwiYmFzZVRyaW0iLCJ0cmltbWVkRW5kSW5kZXgiLCJiYXNlVW5hcnkiLCJiYXNlVmFsdWVzIiwiY2FjaGVIYXMiLCJjYWNoZSIsImNoYXJzU3RhcnRJbmRleCIsInN0clN5bWJvbHMiLCJjaHJTeW1ib2xzIiwiY2hhcnNFbmRJbmRleCIsImNvdW50SG9sZGVycyIsInBsYWNlaG9sZGVyIiwiZGVidXJyTGV0dGVyIiwiZXNjYXBlSHRtbENoYXIiLCJlc2NhcGVTdHJpbmdDaGFyIiwiY2hyIiwiaGFzVW5pY29kZSIsIm1hcFRvQXJyYXkiLCJvdmVyQXJnIiwidHJhbnNmb3JtIiwicmVwbGFjZUhvbGRlcnMiLCJzZXRUb0FycmF5Iiwic2V0VG9QYWlycyIsInN0cmluZ1NpemUiLCJsYXN0SW5kZXgiLCJ1bmljb2RlU2l6ZSIsInN0cmluZ1RvQXJyYXkiLCJ1bmljb2RlVG9BcnJheSIsImFzY2lpVG9BcnJheSIsInVuZXNjYXBlSHRtbENoYXIiLCJydW5JbkNvbnRleHQiLCJ1aWQiLCJhcnJheVByb3RvIiwiZnVuY1Byb3RvIiwib2JqZWN0UHJvdG8iLCJjb3JlSnNEYXRhIiwiaWRDb3VudGVyIiwibWFza1NyY0tleSIsIklFX1BST1RPIiwibmF0aXZlT2JqZWN0VG9TdHJpbmciLCJvbGREYXNoIiwicmVJc05hdGl2ZSIsIkJ1ZmZlciIsImFsbG9jVW5zYWZlIiwiZ2V0UHJvdG90eXBlIiwib2JqZWN0Q3JlYXRlIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJzcHJlYWRhYmxlU3ltYm9sIiwiaXNDb25jYXRTcHJlYWRhYmxlIiwic3ltSXRlcmF0b3IiLCJpdGVyYXRvciIsInN5bVRvU3RyaW5nVGFnIiwiZ2V0TmF0aXZlIiwiY3R4Q2xlYXJUaW1lb3V0IiwiY3R4Tm93IiwiY3R4U2V0VGltZW91dCIsIm5hdGl2ZUNlaWwiLCJuYXRpdmVGbG9vciIsIm5hdGl2ZUdldFN5bWJvbHMiLCJuYXRpdmVJc0J1ZmZlciIsImlzQnVmZmVyIiwibmF0aXZlSXNGaW5pdGUiLCJuYXRpdmVKb2luIiwibmF0aXZlS2V5cyIsIm5hdGl2ZU1heCIsIm5hdGl2ZU1pbiIsIm5hdGl2ZU5vdyIsIm5hdGl2ZVBhcnNlSW50IiwibmF0aXZlUmFuZG9tIiwibmF0aXZlUmV2ZXJzZSIsIkRhdGFWaWV3IiwiV2Vha01hcCIsIm5hdGl2ZUNyZWF0ZSIsIm1ldGFNYXAiLCJyZWFsTmFtZXMiLCJkYXRhVmlld0N0b3JTdHJpbmciLCJ0b1NvdXJjZSIsIm1hcEN0b3JTdHJpbmciLCJwcm9taXNlQ3RvclN0cmluZyIsInNldEN0b3JTdHJpbmciLCJ3ZWFrTWFwQ3RvclN0cmluZyIsInN5bWJvbFByb3RvIiwic3ltYm9sVmFsdWVPZiIsInZhbHVlT2YiLCJzeW1ib2xUb1N0cmluZyIsImxvZGFzaCIsImlzT2JqZWN0TGlrZSIsIkxhenlXcmFwcGVyIiwiTG9kYXNoV3JhcHBlciIsIndyYXBwZXJDbG9uZSIsImJhc2VDcmVhdGUiLCJpc09iamVjdCIsImJhc2VMb2Rhc2giLCJjaGFpbkFsbCIsIl9fd3JhcHBlZF9fIiwiX19hY3Rpb25zX18iLCJfX2NoYWluX18iLCJfX2luZGV4X18iLCJfX3ZhbHVlc19fIiwiX19kaXJfXyIsIl9fZmlsdGVyZWRfXyIsIl9faXRlcmF0ZWVzX18iLCJfX3Rha2VDb3VudF9fIiwiX192aWV3c19fIiwiSGFzaCIsImNsZWFyIiwiZW50cnkiLCJMaXN0Q2FjaGUiLCJNYXBDYWNoZSIsIlNldENhY2hlIiwiX19kYXRhX18iLCJTdGFjayIsImFycmF5TGlrZUtleXMiLCJpbmhlcml0ZWQiLCJpc0FyciIsImlzQXJnIiwiaXNBcmd1bWVudHMiLCJpc0J1ZmYiLCJpc1R5cGUiLCJza2lwSW5kZXhlcyIsImlzSW5kZXgiLCJhcnJheVNhbXBsZSIsImJhc2VSYW5kb20iLCJhcnJheVNhbXBsZVNpemUiLCJzaHVmZmxlU2VsZiIsImNvcHlBcnJheSIsImJhc2VDbGFtcCIsImFycmF5U2h1ZmZsZSIsImFzc2lnbk1lcmdlVmFsdWUiLCJlcSIsImJhc2VBc3NpZ25WYWx1ZSIsImFzc2lnblZhbHVlIiwib2JqVmFsdWUiLCJhc3NvY0luZGV4T2YiLCJiYXNlQWdncmVnYXRvciIsImJhc2VFYWNoIiwiYmFzZUFzc2lnbiIsImNvcHlPYmplY3QiLCJiYXNlQXQiLCJsb3dlciIsImJhc2VDbG9uZSIsImJpdG1hc2siLCJjdXN0b21pemVyIiwiaXNEZWVwIiwiaXNGbGF0IiwiaXNGdWxsIiwiaW5pdENsb25lQXJyYXkiLCJ0YWciLCJnZXRUYWciLCJpc0Z1bmMiLCJjbG9uZUJ1ZmZlciIsImluaXRDbG9uZU9iamVjdCIsImdldFN5bWJvbHNJbiIsImNvcHlTeW1ib2xzSW4iLCJrZXlzSW4iLCJiYXNlQXNzaWduSW4iLCJnZXRTeW1ib2xzIiwiY29weVN5bWJvbHMiLCJkYXRhVmlldyIsImJ5dGVPZmZzZXQiLCJjbG9uZURhdGFWaWV3IiwiY2xvbmVUeXBlZEFycmF5IiwiY2xvbmVSZWdFeHAiLCJzeW1ib2wiLCJpbml0Q2xvbmVCeVRhZyIsInN0YWNrZWQiLCJzdWJWYWx1ZSIsImdldEFsbEtleXNJbiIsImJhc2VDb25mb3Jtc1RvIiwiYmFzZURlbGF5Iiwid2FpdCIsImJhc2VEaWZmZXJlbmNlIiwiaW5jbHVkZXMiLCJpc0NvbW1vbiIsInZhbHVlc0xlbmd0aCIsIm91dGVyIiwiY29tcHV0ZWQiLCJ2YWx1ZXNJbmRleCIsInRlbXBsYXRlU2V0dGluZ3MiLCJnZXRNYXBEYXRhIiwicGFpcnMiLCJMQVJHRV9BUlJBWV9TSVpFIiwiY3JlYXRlQmFzZUVhY2giLCJiYXNlRm9yT3duIiwiYmFzZUVhY2hSaWdodCIsImJhc2VGb3JPd25SaWdodCIsImJhc2VFdmVyeSIsImJhc2VFeHRyZW11bSIsImlzU3ltYm9sIiwiYmFzZUZpbHRlciIsImJhc2VGbGF0dGVuIiwiaXNTdHJpY3QiLCJpc0ZsYXR0ZW5hYmxlIiwiYmFzZUZvciIsImNyZWF0ZUJhc2VGb3IiLCJiYXNlRm9yUmlnaHQiLCJiYXNlRnVuY3Rpb25zIiwiaXNGdW5jdGlvbiIsImJhc2VHZXQiLCJjYXN0UGF0aCIsInRvS2V5IiwiYmFzZUdldEFsbEtleXMiLCJrZXlzRnVuYyIsInN5bWJvbHNGdW5jIiwiYmFzZUdldFRhZyIsImlzT3duIiwidW5tYXNrZWQiLCJnZXRSYXdUYWciLCJvYmplY3RUb1N0cmluZyIsImJhc2VHdCIsImJhc2VIYXMiLCJiYXNlSGFzSW4iLCJiYXNlSW50ZXJzZWN0aW9uIiwiYXJyYXlzIiwib3RoTGVuZ3RoIiwib3RoSW5kZXgiLCJjYWNoZXMiLCJtYXhMZW5ndGgiLCJzZWVuIiwiYmFzZUludm9rZSIsImJhc2VJc0FyZ3VtZW50cyIsImJhc2VJc0VxdWFsIiwiZXF1YWxGdW5jIiwib2JqSXNBcnIiLCJvdGhJc0FyciIsIm9ialRhZyIsIm90aFRhZyIsIm9iaklzT2JqIiwib3RoSXNPYmoiLCJpc1NhbWVUYWciLCJlcXVhbEFycmF5cyIsImNvbnZlcnQiLCJpc1BhcnRpYWwiLCJlcXVhbEJ5VGFnIiwib2JqSXNXcmFwcGVkIiwib3RoSXNXcmFwcGVkIiwib2JqVW53cmFwcGVkIiwib3RoVW53cmFwcGVkIiwib2JqUHJvcHMiLCJvYmpMZW5ndGgiLCJvYmpTdGFja2VkIiwib3RoU3RhY2tlZCIsInNraXBDdG9yIiwib3RoVmFsdWUiLCJjb21wYXJlZCIsIm9iakN0b3IiLCJvdGhDdG9yIiwiZXF1YWxPYmplY3RzIiwiYmFzZUlzRXF1YWxEZWVwIiwiYmFzZUlzTWF0Y2giLCJtYXRjaERhdGEiLCJub0N1c3RvbWl6ZXIiLCJzcmNWYWx1ZSIsIkNPTVBBUkVfUEFSVElBTF9GTEFHIiwiYmFzZUlzTmF0aXZlIiwiYmFzZUl0ZXJhdGVlIiwiaWRlbnRpdHkiLCJiYXNlTWF0Y2hlc1Byb3BlcnR5IiwiYmFzZU1hdGNoZXMiLCJiYXNlS2V5cyIsImlzUHJvdG90eXBlIiwiYmFzZUtleXNJbiIsIm5hdGl2ZUtleXNJbiIsImlzUHJvdG8iLCJiYXNlTHQiLCJiYXNlTWFwIiwiaXNBcnJheUxpa2UiLCJnZXRNYXRjaERhdGEiLCJtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSIsImlzS2V5IiwiaXNTdHJpY3RDb21wYXJhYmxlIiwiaGFzSW4iLCJiYXNlTWVyZ2UiLCJzcmNJbmRleCIsIm1lcmdlRnVuYyIsInNhZmVHZXQiLCJuZXdWYWx1ZSIsImlzVHlwZWQiLCJpc0FycmF5TGlrZU9iamVjdCIsInRvUGxhaW5PYmplY3QiLCJiYXNlTWVyZ2VEZWVwIiwiYmFzZU50aCIsImJhc2VPcmRlckJ5IiwiaXRlcmF0ZWVzIiwib3JkZXJzIiwiZ2V0SXRlcmF0ZWUiLCJjb21wYXJlciIsImJhc2VTb3J0QnkiLCJvYmpDcml0ZXJpYSIsImNyaXRlcmlhIiwib3RoQ3JpdGVyaWEiLCJvcmRlcnNMZW5ndGgiLCJjb21wYXJlQXNjZW5kaW5nIiwib3JkZXIiLCJjb21wYXJlTXVsdGlwbGUiLCJiYXNlUGlja0J5IiwiYmFzZVNldCIsImJhc2VQdWxsQWxsIiwiYmFzZVB1bGxBdCIsImluZGV4ZXMiLCJiYXNlVW5zZXQiLCJiYXNlUmVwZWF0IiwiYmFzZVJlc3QiLCJzZXRUb1N0cmluZyIsIm92ZXJSZXN0IiwiYmFzZVNhbXBsZSIsImJhc2VTYW1wbGVTaXplIiwibmVzdGVkIiwiYmFzZVNldERhdGEiLCJiYXNlU2V0VG9TdHJpbmciLCJjb25zdGFudCIsImJhc2VTaHVmZmxlIiwiYmFzZVNsaWNlIiwiYmFzZVNvbWUiLCJiYXNlU29ydGVkSW5kZXgiLCJyZXRIaWdoZXN0IiwiTUFYX0FSUkFZX0xFTkdUSCIsImJhc2VTb3J0ZWRJbmRleEJ5IiwidmFsSXNOYU4iLCJ2YWxJc051bGwiLCJ2YWxJc1N5bWJvbCIsInZhbElzVW5kZWZpbmVkIiwib3RoSXNEZWZpbmVkIiwib3RoSXNOdWxsIiwib3RoSXNSZWZsZXhpdmUiLCJvdGhJc1N5bWJvbCIsInNldExvdyIsImJhc2VTb3J0ZWRVbmlxIiwiYmFzZVRvTnVtYmVyIiwiYmFzZVRvU3RyaW5nIiwiYmFzZVVuaXEiLCJjcmVhdGVTZXQiLCJzZWVuSW5kZXgiLCJiYXNlVXBkYXRlIiwidXBkYXRlciIsImJhc2VXaGlsZSIsImlzRHJvcCIsImJhc2VXcmFwcGVyVmFsdWUiLCJhY3Rpb25zIiwiYmFzZVhvciIsImJhc2VaaXBPYmplY3QiLCJhc3NpZ25GdW5jIiwidmFsc0xlbmd0aCIsImNhc3RBcnJheUxpa2VPYmplY3QiLCJjYXN0RnVuY3Rpb24iLCJzdHJpbmdUb1BhdGgiLCJjYXN0UmVzdCIsImNhc3RTbGljZSIsInR5cGVkQXJyYXkiLCJ2YWxJc0RlZmluZWQiLCJ2YWxJc1JlZmxleGl2ZSIsImNvbXBvc2VBcmdzIiwicGFydGlhbHMiLCJob2xkZXJzIiwiaXNDdXJyaWVkIiwiYXJnc0luZGV4IiwiYXJnc0xlbmd0aCIsImhvbGRlcnNMZW5ndGgiLCJsZWZ0SW5kZXgiLCJsZWZ0TGVuZ3RoIiwicmFuZ2VMZW5ndGgiLCJpc1VuY3VycmllZCIsImNvbXBvc2VBcmdzUmlnaHQiLCJob2xkZXJzSW5kZXgiLCJyaWdodEluZGV4IiwicmlnaHRMZW5ndGgiLCJpc05ldyIsImNyZWF0ZUFnZ3JlZ2F0b3IiLCJpbml0aWFsaXplciIsImNyZWF0ZUFzc2lnbmVyIiwiYXNzaWduZXIiLCJzb3VyY2VzIiwiZ3VhcmQiLCJpc0l0ZXJhdGVlQ2FsbCIsIml0ZXJhYmxlIiwiY3JlYXRlQ2FzZUZpcnN0IiwibWV0aG9kTmFtZSIsInRyYWlsaW5nIiwiY3JlYXRlQ29tcG91bmRlciIsIndvcmRzIiwiZGVidXJyIiwiY3JlYXRlQ3RvciIsInRoaXNCaW5kaW5nIiwiY3JlYXRlRmluZCIsImZpbmRJbmRleEZ1bmMiLCJjcmVhdGVGbG93IiwiZmxhdFJlc3QiLCJmdW5jcyIsInByZXJlcSIsInRocnUiLCJ3cmFwcGVyIiwiZ2V0RnVuY05hbWUiLCJmdW5jTmFtZSIsImdldERhdGEiLCJpc0xhemlhYmxlIiwicGxhbnQiLCJjcmVhdGVIeWJyaWQiLCJwYXJ0aWFsc1JpZ2h0IiwiaG9sZGVyc1JpZ2h0IiwiYXJnUG9zIiwiYXJ5IiwiYXJpdHkiLCJpc0FyeSIsImlzQmluZCIsImlzQmluZEtleSIsImlzRmxpcCIsImdldEhvbGRlciIsImhvbGRlcnNDb3VudCIsIm5ld0hvbGRlcnMiLCJjcmVhdGVSZWN1cnJ5IiwiZm4iLCJyZW9yZGVyIiwiY3JlYXRlSW52ZXJ0ZXIiLCJ0b0l0ZXJhdGVlIiwiYmFzZUludmVydGVyIiwiY3JlYXRlTWF0aE9wZXJhdGlvbiIsImRlZmF1bHRWYWx1ZSIsImNyZWF0ZU92ZXIiLCJhcnJheUZ1bmMiLCJjcmVhdGVQYWRkaW5nIiwiY2hhcnMiLCJjaGFyc0xlbmd0aCIsImNyZWF0ZVJhbmdlIiwic3RlcCIsInRvRmluaXRlIiwiYmFzZVJhbmdlIiwiY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbiIsInRvTnVtYmVyIiwid3JhcEZ1bmMiLCJpc0N1cnJ5IiwibmV3RGF0YSIsInNldERhdGEiLCJzZXRXcmFwVG9TdHJpbmciLCJjcmVhdGVSb3VuZCIsInByZWNpc2lvbiIsInRvSW50ZWdlciIsInBhaXIiLCJjcmVhdGVUb1BhaXJzIiwiYmFzZVRvUGFpcnMiLCJjcmVhdGVXcmFwIiwic3JjQml0bWFzayIsIm5ld0JpdG1hc2siLCJpc0NvbWJvIiwibWVyZ2VEYXRhIiwiY3JlYXRlQ3VycnkiLCJjcmVhdGVQYXJ0aWFsIiwiY3JlYXRlQmluZCIsImN1c3RvbURlZmF1bHRzQXNzaWduSW4iLCJjdXN0b21EZWZhdWx0c01lcmdlIiwiY3VzdG9tT21pdENsb25lIiwiYXJyTGVuZ3RoIiwiYXJyU3RhY2tlZCIsImFyclZhbHVlIiwib3RoZXJGdW5jIiwiZ2V0VmFsdWUiLCJzdHViQXJyYXkiLCJoYXNQYXRoIiwiaGFzRnVuYyIsImlzTGVuZ3RoIiwiY3RvclN0cmluZyIsImlzTWFza2FibGUiLCJzdHViRmFsc2UiLCJvdGhlckFyZ3MiLCJvbGRBcnJheSIsInNob3J0T3V0IiwicmVmZXJlbmNlIiwiZGV0YWlscyIsImluc2VydFdyYXBEZXRhaWxzIiwidXBkYXRlV3JhcERldGFpbHMiLCJnZXRXcmFwRGV0YWlscyIsImxhc3RDYWxsZWQiLCJzdGFtcCIsInJlbWFpbmluZyIsInJhbmQiLCJtZW1vaXplIiwibWVtb2l6ZUNhcHBlZCIsInF1b3RlIiwic3ViU3RyaW5nIiwiZGlmZmVyZW5jZSIsImRpZmZlcmVuY2VCeSIsImRpZmZlcmVuY2VXaXRoIiwiZmluZEluZGV4IiwiZmluZExhc3RJbmRleCIsImhlYWQiLCJpbnRlcnNlY3Rpb24iLCJtYXBwZWQiLCJpbnRlcnNlY3Rpb25CeSIsImludGVyc2VjdGlvbldpdGgiLCJwdWxsQWxsIiwicHVsbEF0IiwidW5pb24iLCJ1bmlvbkJ5IiwidW5pb25XaXRoIiwidW56aXAiLCJ1bnppcFdpdGgiLCJ3aXRob3V0IiwieG9yIiwieG9yQnkiLCJ4b3JXaXRoIiwiemlwIiwiemlwV2l0aCIsImNoYWluIiwiaW50ZXJjZXB0b3IiLCJ3cmFwcGVyQXQiLCJjb3VudEJ5IiwiZmluZExhc3QiLCJmb3JFYWNoUmlnaHQiLCJncm91cEJ5IiwiaW52b2tlTWFwIiwia2V5QnkiLCJwYXJ0aXRpb24iLCJzb3J0QnkiLCJiZWZvcmUiLCJiaW5kS2V5IiwiV1JBUF9CSU5EX0ZMQUciLCJkZWJvdW5jZSIsImxhc3RBcmdzIiwibGFzdFRoaXMiLCJtYXhXYWl0IiwidGltZXJJZCIsImxhc3RDYWxsVGltZSIsImxhc3RJbnZva2VUaW1lIiwibGVhZGluZyIsIm1heGluZyIsImludm9rZUZ1bmMiLCJ0aW1lIiwibGVhZGluZ0VkZ2UiLCJ0aW1lckV4cGlyZWQiLCJzaG91bGRJbnZva2UiLCJ0aW1lU2luY2VMYXN0Q2FsbCIsInRyYWlsaW5nRWRnZSIsInRpbWVXYWl0aW5nIiwicmVtYWluaW5nV2FpdCIsImRlYm91bmNlZCIsImlzSW52b2tpbmciLCJmbHVzaCIsImRlZmVyIiwiZGVsYXkiLCJtZW1vaXplZCIsIkNhY2hlIiwibmVnYXRlIiwib3ZlckFyZ3MiLCJ0cmFuc2Zvcm1zIiwiZnVuY3NMZW5ndGgiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0IiwicmVhcmciLCJndCIsImd0ZSIsImlzRXJyb3IiLCJpc0ludGVnZXIiLCJpc051bWJlciIsImlzU3RyaW5nIiwibHQiLCJsdGUiLCJ0b0FycmF5IiwiaXRlcmF0b3JUb0FycmF5IiwicmVtYWluZGVyIiwidG9MZW5ndGgiLCJpc0JpbmFyeSIsImFzc2lnbkluIiwiYXNzaWduSW5XaXRoIiwiYXNzaWduV2l0aCIsInByb3BzSW5kZXgiLCJwcm9wc0xlbmd0aCIsImRlZmF1bHRzRGVlcCIsIm1lcmdlV2l0aCIsImludmVydCIsImludmVydEJ5IiwiaW52b2tlIiwib21pdCIsIkNMT05FX0RFRVBfRkxBRyIsImJhc2VQaWNrIiwicGlja0J5IiwidG9QYWlycyIsInRvUGFpcnNJbiIsImNhbWVsQ2FzZSIsIndvcmQiLCJjYXBpdGFsaXplIiwidXBwZXJGaXJzdCIsImtlYmFiQ2FzZSIsImxvd2VyQ2FzZSIsImxvd2VyRmlyc3QiLCJzbmFrZUNhc2UiLCJzdGFydENhc2UiLCJ1cHBlckNhc2UiLCJoYXNVbmljb2RlV29yZCIsInVuaWNvZGVXb3JkcyIsImFzY2lpV29yZHMiLCJhdHRlbXB0IiwiYmluZEFsbCIsIm1ldGhvZE5hbWVzIiwiZmxvdyIsImZsb3dSaWdodCIsIm1ldGhvZE9mIiwibWl4aW4iLCJvdmVyIiwib3ZlckV2ZXJ5Iiwib3ZlclNvbWUiLCJiYXNlUHJvcGVydHlEZWVwIiwicmFuZ2VSaWdodCIsImF1Z2VuZCIsImFkZGVuZCIsImRpdmlkZSIsImRpdmlkZW5kIiwiZGl2aXNvciIsIm11bHRpcGx5IiwibXVsdGlwbGllciIsIm11bHRpcGxpY2FuZCIsInN1YnRyYWN0IiwibWludWVuZCIsInN1YnRyYWhlbmQiLCJhZnRlciIsImNhc3RBcnJheSIsImNodW5rIiwiY29uZCIsImNvbmZvcm1zIiwiYmFzZUNvbmZvcm1zIiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwiZHJvcFJpZ2h0IiwiZHJvcFJpZ2h0V2hpbGUiLCJkcm9wV2hpbGUiLCJiYXNlRmlsbCIsImZsYXRNYXAiLCJmbGF0TWFwRGVlcCIsImZsYXRNYXBEZXB0aCIsImZsYXR0ZW5EZWVwIiwiZmxhdHRlbkRlcHRoIiwiZmxpcCIsImZyb21QYWlycyIsImZ1bmN0aW9ucyIsImZ1bmN0aW9uc0luIiwiaW5pdGlhbCIsIm1hcEtleXMiLCJtYXBWYWx1ZXMiLCJtYXRjaGVzIiwibWF0Y2hlc1Byb3BlcnR5IiwibnRoQXJnIiwib21pdEJ5Iiwib3JkZXJCeSIsInByb3BlcnR5T2YiLCJwdWxsQWxsQnkiLCJwdWxsQWxsV2l0aCIsInNhbXBsZVNpemUiLCJzZXRXaXRoIiwic2h1ZmZsZSIsInNvcnRlZFVuaXEiLCJzb3J0ZWRVbmlxQnkiLCJzZXBhcmF0b3IiLCJzcHJlYWQiLCJ0YWtlIiwidGFrZVJpZ2h0IiwidGFrZVJpZ2h0V2hpbGUiLCJ0YWtlV2hpbGUiLCJ0YXAiLCJ0aHJvdHRsZSIsInRvUGF0aCIsImlzQXJyTGlrZSIsInVuYXJ5IiwidW5pcUJ5IiwidW5pcVdpdGgiLCJ1bnNldCIsInVwZGF0ZSIsInVwZGF0ZVdpdGgiLCJ2YWx1ZXNJbiIsIndyYXAiLCJ6aXBPYmplY3QiLCJ6aXBPYmplY3REZWVwIiwiZW50cmllc0luIiwiZXh0ZW5kIiwiZXh0ZW5kV2l0aCIsImNsb25lRGVlcCIsImNsb25lRGVlcFdpdGgiLCJjbG9uZVdpdGgiLCJjb25mb3Jtc1RvIiwiZGVmYXVsdFRvIiwiZW5kc1dpdGgiLCJlc2NhcGUiLCJlc2NhcGVSZWdFeHAiLCJmaW5kS2V5IiwiZmluZExhc3RLZXkiLCJmb3JJbiIsImZvckluUmlnaHQiLCJmb3JPd24iLCJmb3JPd25SaWdodCIsImluUmFuZ2UiLCJiYXNlSW5SYW5nZSIsImlzQm9vbGVhbiIsImlzRWxlbWVudCIsImlzRW1wdHkiLCJpc0VxdWFsIiwiaXNFcXVhbFdpdGgiLCJpc01hdGNoIiwiaXNNYXRjaFdpdGgiLCJpc05hdGl2ZSIsImlzTmlsIiwiaXNOdWxsIiwiaXNTYWZlSW50ZWdlciIsImlzVW5kZWZpbmVkIiwiaXNXZWFrTWFwIiwiaXNXZWFrU2V0Iiwic3RyaWN0TGFzdEluZGV4T2YiLCJtYXhCeSIsIm1lYW4iLCJtZWFuQnkiLCJtaW5CeSIsInN0dWJPYmplY3QiLCJzdHViU3RyaW5nIiwic3R1YlRydWUiLCJudGgiLCJub0NvbmZsaWN0Iiwic3RyTGVuZ3RoIiwicGFkRW5kIiwicmFkaXgiLCJmbG9hdGluZyIsInJlZHVjZVJpZ2h0IiwicmVwZWF0Iiwic2FtcGxlIiwic29ydGVkSW5kZXgiLCJzb3J0ZWRJbmRleEJ5Iiwic29ydGVkSW5kZXhPZiIsInNvcnRlZExhc3RJbmRleCIsInNvcnRlZExhc3RJbmRleEJ5Iiwic29ydGVkTGFzdEluZGV4T2YiLCJzdGFydHNXaXRoIiwic3VtQnkiLCJ0ZW1wbGF0ZSIsImlzRXNjYXBpbmciLCJpc0V2YWx1YXRpbmciLCJpbXBvcnRzIiwiaW1wb3J0c0tleXMiLCJpbXBvcnRzVmFsdWVzIiwiaW50ZXJwb2xhdGUiLCJyZURlbGltaXRlcnMiLCJldmFsdWF0ZSIsInNvdXJjZVVSTCIsImVzY2FwZVZhbHVlIiwiaW50ZXJwb2xhdGVWYWx1ZSIsImVzVGVtcGxhdGVWYWx1ZSIsImV2YWx1YXRlVmFsdWUiLCJ2YXJpYWJsZSIsInRpbWVzIiwidG9Mb3dlciIsInRvU2FmZUludGVnZXIiLCJ0b1VwcGVyIiwidHJpbUVuZCIsInRyaW1TdGFydCIsInRydW5jYXRlIiwib21pc3Npb24iLCJuZXdFbmQiLCJ1bmlxdWVJZCIsImVhY2giLCJlYWNoUmlnaHQiLCJWRVJTSU9OIiwiaXNGaWx0ZXIiLCJ0YWtlTmFtZSIsImRyb3BOYW1lIiwiY2hlY2tJdGVyYXRlZSIsImlzVGFrZXIiLCJsb2Rhc2hGdW5jIiwicmV0VW53cmFwcGVkIiwiaXNMYXp5IiwidXNlTGF6eSIsImlzSHlicmlkIiwiaXNVbndyYXBwZWQiLCJvbmx5TGF6eSIsImNoYWluTmFtZSIsImlzUmlnaHQiLCJnZXRWaWV3IiwiaXRlckxlbmd0aCIsInRha2VDb3VudCIsIml0ZXJJbmRleCIsImNvbW1pdCIsImNyZWF0ZVNoaWZ0QXJyIiwic3BhY2UiLCJpeCIsInZrYmVhdXRpZnkiLCJpc1N1YnF1ZXJ5IiwicGFyZW50aGVzaXNMZXZlbCIsInNwbGl0X3NxbCIsInRhYiIsInhtbCIsImFyIiwiaW5Db21tZW50IiwiZGVlcCIsImNzcyIsInNxbCIsImFyX2J5X3F1b3RlIiwieG1sbWluIiwicHJlc2VydmVDb21tZW50cyIsImpzb25taW4iLCJjc3NtaW4iLCJzcWxtaW4iLCJjb25maXJtIiwic3BsaXREaXNhYmxlIiwiY2FwdHVyZSIsImNsaWNrYXdheUhhbmRsZXIiLCJyZXNldEhhbmRsZXIiLCJuY0lkIiwicXVldWVNaWNyb3Rhc2siLCJNdXRhdGlvbiIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwiaGFuZGxlIiwib2JzZXJ2ZXIiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJjaGFyYWN0ZXJEYXRhIiwiTWVzc2FnZUNoYW5uZWwiLCJjaGFubmVsIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJwb3J0MiIsInBvc3RNZXNzYWdlIiwic2NyaXB0RWwiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVDaGlsZCIsImRvY3VtZW50RWxlbWVudCIsInB1bnljb2RlIiwidXRpbCIsIlVybCIsInNsYXNoZXMiLCJob3N0bmFtZSIsInBhdGhuYW1lIiwiaHJlZiIsInVybFBhcnNlIiwicmVsYXRpdmUiLCJyZXNvbHZlT2JqZWN0IiwicHJvdG9jb2xQYXR0ZXJuIiwicG9ydFBhdHRlcm4iLCJzaW1wbGVQYXRoUGF0dGVybiIsInVud2lzZSIsImF1dG9Fc2NhcGUiLCJub25Ib3N0Q2hhcnMiLCJob3N0RW5kaW5nQ2hhcnMiLCJob3N0bmFtZVBhcnRQYXR0ZXJuIiwiaG9zdG5hbWVQYXJ0U3RhcnQiLCJ1bnNhZmVQcm90b2NvbCIsImhvc3RsZXNzUHJvdG9jb2wiLCJzbGFzaGVkUHJvdG9jb2wiLCJxdWVyeXN0cmluZyIsInBhcnNlUXVlcnlTdHJpbmciLCJzbGFzaGVzRGVub3RlSG9zdCIsInUiLCJxdWVyeUluZGV4Iiwic3BsaXR0ZXIiLCJ1U3BsaXQiLCJzaW1wbGVQYXRoIiwibG93ZXJQcm90byIsImF0U2lnbiIsImhvc3RFbmQiLCJoZWMiLCJwYXJzZUhvc3QiLCJpcHY2SG9zdG5hbWUiLCJob3N0cGFydHMiLCJwYXJ0IiwibmV3cGFydCIsInZhbGlkUGFydHMiLCJub3RIb3N0IiwiYml0IiwidG9BU0NJSSIsImFlIiwiZXNjIiwicW0iLCJyZWwiLCJ0a2V5cyIsInRrIiwidGtleSIsInJrZXlzIiwicmsiLCJya2V5IiwicmVsUGF0aCIsImlzU291cmNlQWJzIiwiaXNSZWxBYnMiLCJtdXN0RW5kQWJzIiwicmVtb3ZlQWxsRG90cyIsInNyY1BhdGgiLCJwc3ljaG90aWMiLCJpc051bGxPclVuZGVmaW5lZCIsImF1dGhJbkhvc3QiLCJoYXNUcmFpbGluZ1NsYXNoIiwidXAiLCJpc0Fic29sdXRlIiwidXJpbGliIiwiaGVscGVycyIsIlNjaGVtYVNjYW5SZXN1bHQiLCJmb3VuZCIsInJlZiIsInNjYW4iLCJzY2FuU2NoZW1hIiwiYmFzZXVyaSIsIiRyZWYiLCJyZXNvbHZlZFVyaSIsIm91ckJhc2UiLCJzY2FuQXJyYXkiLCJpdGVtcyIsImV4dGVuZHMiLCJhZGRpdGlvbmFsSXRlbXMiLCJzY2FuT2JqZWN0IiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJkZWZpbml0aW9ucyIsInBhdHRlcm5Qcm9wZXJ0aWVzIiwiZGVwZW5kZW5jaWVzIiwiZGlzYWxsb3ciLCJhbGxPZiIsImFueU9mIiwib25lT2YiLCJub3QiLCJzdHJva2VXaWR0aCIsImVzY2FwZUtleUxpc3RlbmVyIiwiaW5mb0xpc3RlbmVycyIsImVudGVyS2V5TGlzdGVuZXIiLCJhcnJvd0tleUxpc3RlbmVyIiwic2hpZnRLZXkiLCJiYm94U3lsbGFibGVzIiwiaW5kIiwic2VsZWN0ZWRTeWxUZXh0Iiwic2Nyb2xsSW50b1ZpZXciLCJiZWhhdmlvciIsImlzU2VsQnlCQm94Iiwic2VsQnlCQm94Iiwic3RvcFByb3BIYW5kbGVyIiwiaXNFbGVtZW50SW5SZWN0IiwidWwiLCJsciIsImdldEJCb3hDb29yZHMiLCJib3giLCJjbGlja0hhbmRsZXIiLCJnZXRVc2VyTW9kZSIsImZpcnN0TGlnYXR1cmVIYWxmIiwic2Vjb25kTGlnYXR1cmVIYWxmIiwibmNJbmRleCIsImZpcnN0VXNlIiwiYXNzZXJ0Iiwic2Vjb25kVXNlIiwiaXNNdWx0aVNlbGVjdCIsInNlbGVjdGVkQ2xhc3MiLCJzZWxCeVN0YWZmIiwic2VsQnlOZXVtZSIsInNlbEJ5TmMiLCJzZWxCeUxheWVyRWxlbWVudCIsImdldFN0YWZmQnlDb29yZHMiLCJkaXNwYXRjaEV2ZW50IiwiTW91c2VFdmVudCIsInNjcmVlblgiLCJzY3JlZW5ZIiwiY3RybEtleSIsImFsdEtleSIsIm52IiwiZGgiLCJzZWwiLCJpbml0aWFsWCIsInBhbm5pbmciLCJkcmFnU2VsZWN0aW5nIiwiY2FudmFzIiwiZHJhZ1NlbGVjdEFjdGlvbiIsIm5vZGVOYW1lIiwic3RhcnREcmFnIiwiaW5pdGlhbFAiLCJjdXJyZW50UHQiLCJjdXJYIiwiY3VyWSIsIm5ld1giLCJuZXdZIiwiY3VycmVudFdpZHRoIiwiY3VycmVudEhlaWdodCIsInVwZGF0ZVJlY3QiLCJzZWxlY3RSZWN0IiwicngiLCJyeSIsImx4IiwibHkiLCJzZWxlY3RlZEVsZW1lbnRzIiwiZ2V0RWxlbWVudHNCeVNlbGVjdG9yIiwicmVzZXRUbyIsImNvcHlBdHRyaWJ1dGVzIiwiZ2V0U3lsbGFibGVUZXh0IiwiY2hpbGROb2RlcyIsInN5bFRleHQiLCJub2RlVmFsdWUiLCJpc0ludmFsaWRCQm94IiwibWVpIiwiem9uZSIsImlzQWxsWmVybyIsImhhc05lZ2F0aXZlQ29vcmRpbmF0ZXMiLCJjaGVja1ByZWNlZGVzU3lsbGFibGUiLCJzeWxzVGV4dCIsImNoZWNrRm9sbG93c1N5bGxhYmxlIiwiY2hlY2tPYmxpcXVlIiwibmNJZHgiLCJjb2xsZWN0RmFjc0NoaWxkcmVuIiwiYXJyYXkxIiwiYXJyYXkyIiwic3RhZmZCYXNlZE1laSIsIkRPTVBhcnNlciIsInNlcmlhbGl6ZXIiLCJYTUxTZXJpYWxpemVyIiwibWVpRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwibkNvbCIsInNlY3Rpb25zIiwic2VjdGlvbiIsInBiIiwic2IiLCJuZXdTdGFmZiIsImNyZWF0ZUVsZW1lbnROUyIsIm5ld0xheWVyIiwic3VyZmFjZSIsInN1cmZhY2VJZCIsIm5lb25OZXVtZUxpbmVTZWN0aW9ucyIsIm5TdGFmZiIsImxhc3RDYiIsIm5lb25OZXVtZUxpbmVTZWN0aW9uIiwibGF5ZXIiLCJjYWxjdWxhdGVBbmRBZGRab25lIiwiY3VzdG9zIiwibGFzdEVsZW1lbnRDaGlsZCIsImZpcnN0RWxlbWVudENoaWxkIiwic2NvcmVEZWYiLCJjb2xMYXlvdXQiLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJzZXJpYWxpemVUb1N0cmluZyIsInN0YXJ0RWxlbWVudCIsImVuZEVsZW1lbnQiLCJlbGVtZW50c0JldHdlZW4iLCJjb2xsZWN0QWxsRWxlbWVudHNXaXRoRmFjcyIsIm5leHRFbGVtZW50U2libGluZyIsIkJCb3giLCJjYWxjdWxhdGVCQm94IiwiaW5zZXJ0QmVmb3JlIiwic2JCYXNlZE1laSIsImhhc0NvbHMiLCJoYXNJbnZhbGlkQkJveCIsInpvbmVzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbnZhbGlkWm9uZXNJbmZvIiwiaXNJbnZhbGlkIiwiaGFzRW1wdHlTeWxsYWJsZSIsImhhc0VtcHR5TmV1bWUiLCJoYXNJbnZhbGlkRGl2TGluZSIsImludmFsaWREaXZMaW5lSW5mbyIsImhhc0ludmFsaWRBY2NpZCIsImludmFsaWRBY2NpZEluZm8iLCJlbXB0eVN5bGxhYmxlSW5mbyIsImVtcHR5TmV1bWVJbmZvIiwibmV1bWVzIiwibGlxIiwib3JpZ2luYWxTdGF2ZXMiLCJuZXdQYiIsInNiQXJyYXkiLCJvcmlnU3lsbGFibGUiLCJuZXVtZUJlaGluZCIsIm5ldW1lQWhlYWQiLCJjaGlsZEFycmF5Iiwic2JJbmRleCIsIm5ld1N5bGxhYmxlIiwiY2xlZiIsImRlYnVnIiwic2JzIiwibGF5ZXJDaGlsZHJlbiIsImN1cnJlbnRTYiIsIm5leHRTYiIsIm5ld1NiIiwibmV3U2VjdGlvbiIsImN1cnJlbnRJZHgiLCJjYkZhY3MiLCJjYlpvbmUiLCJjaGlsZHJlbkFycmF5IiwiZmFjc0NoaWxkcmVuIiwieiIsIm5ld1N5bGxhYmxlcyIsImludmFsaWRMaW5rZWQiLCJpbnZhbGlkTGlua2VkSW5mbyIsImludmFsaWRPYmxpcXVlIiwiaW52YWxpZE9ibGlxdWVJbmZvIiwib2JsaXF1ZUluZm8iLCJzeWxsYWJsZUlkeCIsIm1laVN0cmluZyIsImRpbWVuc2lvbnMiLCJtZWlMcngiLCJtZWlMcnkiLCJpc091dE9mQm91bmRzIiwiY29vcmQiLCJpc0F0dHJPdXRPZkJvdW5kcyIsIm1laUZvclZhbGlkYXRpb24iLCJzY2hlbWFSZXNwb25zZSIsIndvcmtlciIsInZlcnNpb25GaWVsZCIsInN0YXR1c0ZpZWxkIiwidXBkYXRlU3RhdHVzVUkiLCJsaW5lIiwic3RhdHVzT25DbGljayIsIm1vZGFsIiwibWVpVmVyc2lvbiIsIm1laVN0YXR1cyIsIldvcmtlciIsIm1laURhdGEiLCJ1cGRhdGVWZXJzaW9uVUkiLCJnZXRNZWlWZXJzaW9uIiwic2F2ZWQiLCJpbmRpY2F0b3IiLCJhbHRNZXNzYWdlIiwidXBkYXRlSW5kaWNhdG9yIiwib25iZWZvcmV1bmxvYWQiLCJ3ZWJwYWNrUG9seWZpbGwiLCJkZXByZWNhdGUiLCJmb3JtYXRBcmdzIiwidXNlQ29sb3JzIiwibmFtZXNwYWNlIiwiaHVtYW5pemUiLCJsYXN0QyIsInNhdmUiLCJuYW1lc3BhY2VzIiwic3RvcmFnZSIsInJlbW92ZUl0ZW0iLCJERUJVRyIsIl9fbndqcyIsIldlYmtpdEFwcGVhcmFuY2UiLCJmaXJlYnVnIiwiZXhjZXB0aW9uIiwidGFibGUiLCJsb2NhbHN0b3JhZ2UiLCJjb2xvcnMiLCJmb3JtYXR0ZXJzIiwiYWN0aXZhdGUiLCJpbnNlcnRIYW5kbGVyIiwiaW5zZXJ0QWN0aXZlIiwiZGVhY3RpdmF0ZSIsInRhYklkcyIsImluc2VydE9wdGlvbnMiLCJpbnNlcnRFbGVtZW50cyIsImJpbmRFbGVtZW50cyIsImluc2VydFBhbmVsIiwiaW5zZXJ0SGVhZGluZyIsImluc2VydEhlYWRpbmdUaXRsZSIsImluc2VydENvbnRlbnRzIiwiaW5zZXJ0RHJvcGRvd25JY29uIiwiZWRpdFBhbmVsIiwiZWRpdEhlYWRpbmciLCJkaXNwbGF5SGVhZGluZ1RpdGxlIiwiZWRpdENvbnRlbnRzIiwiZWRpdERyb3Bkb3duSWNvbiIsInNlbEJ5U3lsbGFibGUiLCJmaXJzdENsaWNrIiwiaW5zZXJ0RGlzYWJsZWQiLCJyZW1vdmVJbnNlcnRDbGlja0hhbmRsZXJzIiwicmVzZXRJbnNlcnRIYW5kbGVyIiwic3RhZmZIYW5kbGVyIiwiZWxlbWVudFR5cGUiLCJidXR0b25JZCIsImFscmVhZHlJbkluc2VydE1vZGUiLCJpc0luc2VydE1vZGUiLCJ0aWx0IiwiZm9ybSIsImFjY2lkIiwiZWRpdE1vZGVCdXR0b24iLCJuYXZiYXJEcm9wZG93bkZpbGVNZW51IiwiZmlsZURyb3Bkb3duQnRuIiwiZmlsZU5hdmJhckNvbnRlbnRzIiwibmF2YmFyRHJvcGRvd25NRUlBY3Rpb25zTWVudSIsIm1laUFjdGlvbnNEcm9wZG93bkJ0biIsIm1laUFjdGlvbnNOYXZiYXJDb250ZW50cyIsIm5hdmJhckZpbmFsaXplIiwidW5kb1JlZG9QYW5lbCIsImFkZFN5bEFjdGlvbiIsIm5hdmJhckRyb3Bkb3ducyIsImRyb3BEb3duIiwiZXhwb3J0IiwibWFuaWZlc3QiLCJsaW5rIiwiZG93bmxvYWQiLCJnZXRQYWdlTUVJIiwiY29udmVydFRvTmVvbiIsImdldFBhZ2VOYW1lIiwiaGFzRW1wdHlTeWxsYWJsZXMiLCJyZW1vdmVTeWxsYWJsZUFjdGlvbnMiLCJjaGFpblJlbW92ZUFjdGlvbiIsImhhc0VtcHR5TmV1bWVzIiwicmVtb3ZlTmV1bWVBY3Rpb25zIiwib3V0T2ZCb3VuZFpvbmVzIiwiem9uZU1hcCIsIm91dE9mQm91bmRHbHlwaHMiLCJnbHlwaCIsImZhY3NJZCIsImhhc0ludmFsaWRPYmxpcXVlIiwiaW52YWxpZFN5bGxhYmxlcyIsImdldEludmFsaWRTeWxsYWJsZXMiLCJwcmVjZWRlc1N5bGxhYmxlIiwiZm9sbG93c1N5bGxhYmxlIiwiZGVsZXRlRGIiLCJsb2NhdGlvbiIsInJlbG9hZCIsInVuZG9IYW5kbGVyIiwidW5kbyIsInJlZG9IYW5kbGVyIiwicmVkbyIsImdldEdldFBhcmFtIiwibWFuaWZlc3RMb2NhdGlvbiIsInN0YXR1c1RleHQiLCJpbWFnZSIsIkRpc3BsYXkiLCJJbmZvIiwiVGV4dFZpZXciLCJUZXh0RWRpdCIsIlZpZXciLCJOZXVtZUVkaXQiLCJSZXNwb25zZSIsInBhcnNlTWFuaWZlc3QiLCJ0ZXh0VmlldyIsInVwZGF0ZUJCb3hWaXNpYmlsaXR5IiwiY29yZSIsIlZhbGlkYXRpb24iLCJzZXREZWJ1Z01vZGUiLCJsaXN0ZW5VbnNhdmVkQ2hhbmdlcyIsInNldHVwRWRpdCIsImluaXREYiIsIm9uU1ZHTG9hZCIsInBhZ2VObyIsImdldEN1cnJlbnRQYWdlIiwiY2hhbmdlUGFnZSIsInNldFNhdmVkU3RhdHVzIiwicGFnZVVSSSIsImVsZW1lbnRJRCIsInVwZGF0ZURhdGFiYXNlIiwiZ2V0QW5ub3RhdGlvbnMiLCJ0aW1lc3RhbXAiLCJyZWFkQXNEYXRhVVJMIiwiZ2V0TUVJIiwiZ2V0U1ZHIiwidmVyb3Zpb1dyYXBwZXIiLCJ1bmRvU3RhY2tzIiwicmVkb1N0YWNrcyIsIm5lb25DYWNoZSIsImJsYW5rUGFnZXMiLCJhbm5vdGF0aW9ucyIsIm1laV9hbm5vdGF0aW9ucyIsImxhc3RQYWdlTG9hZGVkIiwiYW5ub3RhdGlvbiIsInRpbWVab25lUmVnZXhwIiwiZ2V0VGltZSIsIm5ld0Fubm90YXRpb24iLCJsb2FkRGF0YSIsImJsYW5rUGFnZSIsImNvbnZlcnRUb1Zlcm92aW8iLCJjaGVja091dE9mQm91bmRzR2x5cGhzIiwiZGlydHkiLCJzZW5kRm9yVmFsaWRhdGlvbiIsInJlbW92ZUNvbHVtbkxhYmVsIiwic3ZnIiwibG9hZFBhZ2UiLCJjdXJyZW50TUVJIiwidW5kb1N0YWNrIiwidXBkYXRlQ2FjaGUiLCJzdmdUZXh0IiwibWVpUHJvbWlzZSIsInN2Z1Byb21pc2UiLCJ1cGRhdGVUaW1lc3RhbXAiLCJ2ZXJvdmlvV29ya2VyIiwiTmVvblNjaGVtYSIsIk5lb25Db250ZXh0IiwibWFuaWZlc3RTdHJpbmciLCJWYWxpZGF0b3IiLCJhdHRyaWJ1dGUiLCJ1bnJlc29sdmVkUmVmcyIsInZhbGlkYXRvcnMiLCJzaG91bGRSZXNvbHZlIiwiYWRkU2NoZW1hIiwib3VyVXJpIiwiYWRkU3ViU2NoZW1hQXJyYXkiLCJhZGRTdWJTY2hlbWEiLCJhZGRTdWJTY2hlbWFPYmplY3QiLCJzZXRTY2hlbWFzIiwiZ2V0U2NoZW1hIiwidXJuIiwic2NoIiwicmVxdWlyZWQiLCJ2YWxpZGF0ZVNjaGVtYSIsInNjaGVtYW9iaiIsInNjaGVtYVRyYXZlcnNlciIsInN1cGVyUmVzb2x2ZSIsInN3aXRjaFNjaGVtYSIsInJlc29sdmVkIiwic3ViY3R4Iiwic3Vic2NoZW1hIiwic2tpcEF0dHJpYnV0ZXMiLCJpZ25vcmVQcm9wZXJ0aWVzIiwidmFsaWRhdG9yRXJyIiwiYWxsb3dVbmtub3duQXR0cmlidXRlcyIsInJld3JpdGUiLCJwYXJzZWQiLCJmcmFnbWVudCIsInRlc3RUeXBlIiwiaW50ZWdlciIsImJvb2xlYW4iLCJkYXRlIiwiYW55IiwibWF4SW50IiwicmVnZXhQdW55Y29kZSIsInJlZ2V4Tm9uQVNDSUkiLCJyZWdleFNlcGFyYXRvcnMiLCJzdHJpbmdGcm9tQ2hhckNvZGUiLCJtYXBEb21haW4iLCJ1Y3MyZGVjb2RlIiwiZXh0cmEiLCJjb3VudGVyIiwidWNzMmVuY29kZSIsImRpZ2l0VG9CYXNpYyIsImRpZ2l0IiwiZmxhZyIsImFkYXB0IiwibnVtUG9pbnRzIiwiZmlyc3RUaW1lIiwiYmFzZU1pbnVzVE1pbiIsImRlY29kZSIsImJhc2ljIiwib2xkaSIsImJhc2VNaW51c1QiLCJjb2RlUG9pbnQiLCJpbnB1dExlbmd0aCIsImJpYXMiLCJlbmNvZGUiLCJoYW5kbGVkQ1BDb3VudCIsImJhc2ljTGVuZ3RoIiwicSIsImhhbmRsZWRDUENvdW50UGx1c09uZSIsInFNaW51c1QiLCJxcyIsInNlcCIsIm1heEtleXMiLCJrc3RyIiwidnN0ciIsInhzIiwic3RyaW5naWZ5UHJpbWl0aXZlIiwib2JqZWN0S2V5cyIsImtzIiwiZiIsInRlc3RTY2hlbWFOb1Rocm93IiwiZ2V0RW51bWVyYWJsZVByb3BlcnR5IiwidGVzdEFkZGl0aW9uYWxQcm9wZXJ0eSIsInByZVZhbGlkYXRlUHJvcGVydHkiLCJpbm5lciIsIm5lc3RlZEVycm9ycyIsImlmIiwiaWZWYWxpZCIsImVsc2UiLCJwcm9wZXJ0eU5hbWVzIiwiX2UiLCJtaW5Qcm9wZXJ0aWVzIiwibWF4UHJvcGVydGllcyIsIm1pbmltdW0iLCJleGNsdXNpdmVNaW5pbXVtIiwibWF4aW11bSIsImV4Y2x1c2l2ZU1heGltdW0iLCJ2YWxpZGF0ZU11bHRpcGxlT2ZPckRpdmlzYmxlQnkiLCJ2YWxpZGF0aW9uVHlwZSIsImVycm9yTWVzc2FnZSIsInZhbGlkYXRpb25Bcmd1bWVudCIsImluc3RhbmNlRGVjaW1hbHMiLCJkaXZpc29yRGVjaW1hbHMiLCJtYXhEZWNpbWFscyIsInBvdyIsInRlc3RBcnJheXMiLCJtdWx0aXBsZU9mIiwiZGl2aXNpYmxlQnkiLCJtaW5MZW5ndGgiLCJoc3AiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJkZXAiLCJjaGlsZENvbnRleHQiLCJub3RUeXBlcyIsInNjaGVtYUlkIiwidXBkYXRlRGVidWdNb2RlU3RhdHVzIiwiZGVidWdNb2RlQ2hlY2tib3giLCJlcnJvckxvZ0xhYmVsIiwiaW5pdEVycm9yTG9nIiwibWVpQ2xhc3MiLCJoYW5kbGVab29tIiwiZGlzcGxheUNvbnRyb2xzUGFuZWwiLCJsb2FkU2V0dGluZ3MiLCJhZGRVcGRhdGVDYWxsYmFjayIsInVwZGF0ZVZpc3VhbGl6YXRpb24iLCJEaXNwbGF5Q29udHJvbHMiLCJzZXRab29tQ29udHJvbHMiLCJpbml0RGlzcGxheUNvbnRyb2xzIiwidXBkYXRlQ2FsbGJhY2tzIiwiZGl2YVJlYWR5IiwiZGl2YSIsIm9iamVjdERhdGEiLCJtaW5IZWlnaHQiLCJpbmRleE1hcCIsImRpc2FibGVEcmFnU2Nyb2xsYWJsZSIsImRpc3BsYXlQYW5lbCIsImxvYWREZWxheSIsImluaXREaXZhRXZlbnRzIiwib25yZXNpemUiLCJpbm5lckhlaWdodCIsImlubmVyV2lkdGgiLCJFdmVudHMiLCJzdWJzY3JpYmUiLCJJRCIsImRpZExvYWQiLCJhZGp1c3Rab29tIiwicGFnZUluZGV4IiwiY2hlY2tBbmRMb2FkIiwicGFnZSIsImdldFBhZ2VTVkciLCJ1cGRhdGVTVkciLCJjb250YWluZXJJZCIsInBhZ2VJbmRleGVzIiwiZ2V0QWN0aXZlUGFnZUluZGV4Iiwiem9vbUR1cmF0aW9uIiwiZmlyc3RDaGlsZCIsInNldFZpZXdFdmVudEhhbmRsZXJzIiwiZ2V0UGFnZURpbWVuc2lvbnNBdEN1cnJlbnRab29tTGV2ZWwiLCJ2aWV3SGFuZGxlciIsIl92aWV3ZXJDb3JlIiwiZ2V0UGFnZVJlZ2lvbiIsImluY2x1ZGVQYWRkaW5nIiwiaW5jb3Jwb3JhdGVWaWV3cG9ydCIsIm1hcmdpbkxlZnQiLCJnZXRDb21wdXRlZFN0eWxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsInRvcCIsInNldERpc3BsYXlMaXN0ZW5lcnMiLCJ2aXNpYmlsaXR5Iiwic2VxdWVuY2UiLCJzZXF1ZW5jZXMiLCJjYW52YXNlcyIsIml0ZW1UaXRsZSIsInBhZ2VzIiwiX3JhZiIsIl9pc1RvdWNoIiwiX2V4dGVuZCIsIlZhbmlsbGFLaW5ldGljIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiREVGQVVMVFMiLCJBQ1RJVkVfQ0xBU1MiLCJfaW5pdEVsZW1lbnRzIiwiX1ZhbmlsbGFLaW5ldGljIiwiZGVjZWxlcmF0ZSIsInRyaWdnZXJIYXJkd2FyZSIsInRocmVzaG9sZCIsInNsb3dkb3duIiwibWF4dmVsb2NpdHkiLCJ0aHJvdHRsZUZQUyIsIm1vdmluZ0NsYXNzIiwiZG93biIsImRlY2VsZXJhdGluZ0NsYXNzIiwidmVsb2NpdHkiLCJ2ZWxvY2l0eVkiLCJfbW92ZSIsInN0b3AiLCJzdG9wcGVkIiwiZGV0YWNoIiwiX2RldGFjaExpc3RlbmVycyIsImF0dGFjaCIsIl9hdHRhY2hMaXN0ZW5lcnMiLCJ4cG9zIiwicHJldlhQb3MiLCJ5cG9zIiwicHJldllQb3MiLCJtb3VzZURvd24iLCJ0aHJvdHRsZVRpbWVvdXQiLCJsYXN0TW92ZSIsImVsZW1lbnRGb2N1c2VkIiwiZG9jdW1lbnRSZXNldEhhbmRsZXIiLCJfcmVzZXRNb3VzZSIsImh0bWwiLCJfaW5pdEV2ZW50cyIsInByZWZpeGVzIiwic3R5bGVzIiwidG91Y2hTdGFydCIsInRvdWNoIiwiX3VzZVRhcmdldCIsIm9yaWdpbmFsRXZlbnQiLCJ0b3VjaGVzIiwiX3RocmVzaG9sZCIsIl9zdGFydCIsInRvdWNoTW92ZSIsIl9pbnB1dG1vdmUiLCJpbnB1dERvd24iLCJpbnB1dEVuZCIsIl9lbmQiLCJpbnB1dE1vdmUiLCJzY3JvbGwiLCJtb3ZlZCIsImlucHV0Q2xpY2siLCJkcmFnU3RhcnQiLCJzZWxlY3RTdGFydCIsIm1vdmVkWCIsIm1vdmVkWSIsInNxcnQiLCJibHVyIiwic2Nyb2xsTGVmdCIsInNjcm9sbFRvcCIsIl9jYWxjdWxhdGVWZWxvY2l0aWVzIiwiX3NldE1vdmVDbGFzc2VzIiwiX2NhcFZlbG9jaXR5IiwiZmlsdGVyVGFyZ2V0IiwiX2RlY2VsZXJhdGVWZWxvY2l0eSIsIm5ld1ZlbG9jaXR5IiwiY2xhc3NlcyIsInNjcm9sbGVyIiwiX2dldFNjcm9sbGVyIiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJtb3ZpbmciLCJuZXdTY3JvbGxYIiwibmV3U2Nyb2xsWSIsIl93aW5kb3ciLCJfZG9jdW1lbnQiLCJkcmFnZ2VkIiwibWQiLCJtdSIsIm1tIiwibGFzdENsaWVudFgiLCJsYXN0Q2xpZW50WSIsInB1c2hlZCIsImNvbnQiLCJlbGVtZW50RnJvbVBvaW50IiwicGFnZVgiLCJwYWdlWSIsInJlYWR5U3RhdGUiLCJyZXNldERyYWdzY3JvbGwiLCJjcmVhdGVEZWJ1ZyIsInByZXZUaW1lIiwibmFtZXNwYWNlc0NhY2hlIiwiZW5hYmxlZENhY2hlIiwiZW5hYmxlT3ZlcnJpZGUiLCJlbmFibGVkIiwibXMiLCJjb2VyY2UiLCJmb3JtYXR0ZXIiLCJzZWxlY3RDb2xvciIsImRlbGltaXRlciIsIm5ld0RlYnVnIiwidG9OYW1lc3BhY2UiLCJkaXNhYmxlIiwic2tpcHMiLCJlbmFibGUiLCJwbHVyYWwiLCJtc0FicyIsImlzUGx1cmFsIiwibG9uZyIsImZtdExvbmciLCJmbXRTaG9ydCIsInBhbmVsIiwic2V0QXR0cmlidXRlTlMiLCJyZXBsYWNlQ2hpbGQiLCJyZXNldFRyYW5zZm9ybWF0aW9ucyIsIl9wYWdlIiwiX2RlbGF5IiwicmVzdG9yZVRyYW5zZm9ybWF0aW9uIiwic2V0U2VsZWN0TGlzdGVuZXJzIiwic2Nyb2xsWm9vbSIsIm5ld0hlaWdodCIsIlZpZXdCb3giLCJpbWFnZVdpZHRoIiwiaW1hZ2VIZWlnaHQiLCJtaW5YIiwibWluWSIsInpvb21IZWlnaHQiLCJ6b29tV2lkdGgiLCJab29tSGFuZGxlciIsInJlc2V0U2V0dGluZ3MiLCJiZ2ltZyIsInVwZGF0ZVNWR1ZpZXdCb3giLCJzZXRWaWV3Qm94IiwidHJhbnNsYXRlIiwicmF3Vmlld0JveCIsInZpZXdCb3hTdHJpbmciLCJkcmFnQ29vcmRpbmF0ZXMiLCJjcmVhdGVTVkdQb2ludCIsIm1hdHJpeCIsIm5ld0Nvb3JkaW5hdGVzIiwiZGVsdGFYIiwiZGVsdGFZIiwibmV3VHJhbnNmb3JtIiwiZHJhZ1RyYW5zZm9ybSIsInNsaWRlciIsIm5ld0siLCJnZXRab29tIiwiaW5pdEVkaXRNb2RlIiwiYmluZEluc2VydFRhYnMiLCJTZWxlY3QiLCJzZXRTZWxlY3RIZWxwZXJPYmplY3RzIiwiaW5pdEluc2VydEVkaXRDb250cm9scyIsInNldFNlbGVjdFN0cm9rZVdpZHRoIiwiaW5pdFNlbGVjdGlvbkJ1dHRvbnMiLCJzZXRIaWdobGlnaHRTZWxlY3Rpb25Db250cm9scyIsImNsaWNrU2VsZWN0IiwiZHJhZ1NlbGVjdCIsImluaXROYXZiYXIiLCJpbml0VW5kb1JlZG9QYW5lbCIsIm5ldW1lR3JvdXBzIiwidXBkYXRlSW5mb1Zpc2liaWxpdHkiLCJlbGVtZW50SW5mbyIsInVwZGF0ZURpc3BsYXlBbGxCdG4iLCJzZXRJbmZvQ29udHJvbHMiLCJsYWJlbCIsInJlc2V0SW5mb0xpc3RlbmVycyIsImlzSG92ZXJpbmdDaGlsZCIsInVwZGF0ZUluZm8iLCJzdG9wTGlzdGVuZXJzIiwiZWxlbWVudENsYXNzIiwicGl0Y2hlcyIsImdldFBpdGNoZXMiLCJkaXMiLCJkaXNwbGFjZSIsInVwZGF0ZUluZm9Nb2R1bGUiLCJwaXRjaE5hbWVUb051bSIsInBuYW1lIiwibm90aWZpY2F0aW9uU2VudCIsInRleHRMYWJlbCIsImJib3hMYWJlbCIsInRleHRCdXR0b24iLCJiYm94QnV0dG9uIiwic2V0VGV4dFZpZXdDb250cm9scyIsInVwZGF0ZVRleHRWaWV3VmlzaWJpbGl0eSIsImluaXRTZWxlY3RCeUJCb3hCdXR0b24iLCJpbml0QkJveENpcmNsZVNsaWRlciIsImdldFN5bFRleHQiLCJpbml0VGV4dEVkaXQiLCJseXJpY3MiLCJzZWxCeUJCb3hMaXN0ZW5lciIsImFkZEJCb3hMaXN0ZW5lcnMiLCJzcGFucyIsInNlbGVjdFN5bFRleHQiLCJibG9jayIsImJ1dHRvbiIsInNsaWRlclNlY3Rpb24iLCJjaXJjbGVTbGlkZXJDb250YWluZXIiLCJzZXRDaXJjbGVTaXplQ29udHJvbHMiLCJlbHQiLCJoYW5kbGVFbHRDb25zdHJ1Y3RvckFyZyIsImNoaWxkQ291bnQiLCJzZXRET01BdHRyaWJ1dGVzIiwic2V0U3R5bGUiLCJjc3NQcm9wIiwiY3NzVGV4dCIsIkRpdmFQYXJlbnRFbGVtZW50Tm90Rm91bmRFeGNlcHRpb24iLCJOb3RBbklJSUZNYW5pZmVzdEV4Y2VwdGlvbiIsIk9iamVjdERhdGFOb3RTdXBwbGllZEV4Y2VwdGlvbiIsIl9jYWNoZSIsInRvcGljIiwidGhpc1RvcGljIiwidGhpc1RvcGljR2xvYmFsIiwiZ2xvYmFsQ291bnQiLCJnZXRJbnN0YW5jZUlkIiwiaW5zdGFuY2VJRCIsInRoaXNUb3BpY0luc3RhbmNlIiwic2NvcGVkQ291bnQiLCJjb21wbGV0ZWx5IiwidG9waWNBcnJheSIsInRvcGljcyIsIm9uRG91YmxlQ2xpY2siLCJnZXRSZWxhdGl2ZU9mZnNldCIsInRyYWNrZXIiLCJjcmVhdGVEb3VibGVFdmVudFRyYWNrZXIiLCJpc1RyaWdnZXJlZCIsInRyaWdnZXIiLCJvblBpbmNoIiwic3RhcnREaXN0YW5jZSIsImRpc3RhbmNlIiwibW92ZURpc3RhbmNlIiwiem9vbURlbHRhIiwidG91Y2hDZW50ZXIiLCJvbkRvdWJsZVRhcCIsImZpcnN0VGFwIiwic2Vjb25kVGFwIiwiY2hhbmdlZFRvdWNoZXMiLCJ4MSIsInkxIiwieDIiLCJ5MiIsInRpbWVvdXREdXJhdGlvbiIsInRyaWdnZXJlZCIsInRpbWVvdXRJZCIsInJlc2V0VGltZW91dCIsInBhZ2VDb29yZHMiLCJib3VuZHMiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ2aWV3ZXJDb3JlIiwiX2lubmVyRWxlbWVudCIsImlubmVyRWxlbWVudCIsIl9wYWdlVG9vbHNFbGVtIiwibGFiZWxXaWR0aCIsIl9idXR0b25zIiwiX2luaXRpYWxpemVQYWdlVG9vbEJ1dHRvbnMiLCJjbGFzcyIsIl9wYWdlTGFiZWxzRWxlbSIsInJlZnJlc2giLCJwdWJsaWNJbnN0YW5jZSIsImdldFB1YmxpY0luc3RhbmNlIiwiZ2V0UGFnZVRvb2xzIiwicGFnZVRvb2xzSWNvbiIsImNsb25lTm9kZSIsImhhbmRsZUNsaWNrIiwiX3ZpZXdlclN0YXRlIiwiZ2V0SW50ZXJuYWxTdGF0ZSIsIl9vdmVybGF5cyIsIm51bVBhZ2VzIiwib3ZlcmxheSIsImFkZFBhZ2VPdmVybGF5IiwiZHVtbXlMYWJlbCIsImNsaWVudFdpZHRoIiwiY29vcmRzIiwibmV3Wm9vbUxldmVsIiwiem9vbUxldmVsIiwiZ2V0UGFnZVBvc2l0aW9uQXRWaWV3cG9ydE9mZnNldCIsImVuZERpc3RhbmNlIiwidmlld2VyU3RhdGUiLCJtaW5ab29tTGV2ZWwiLCJtYXhab29tTGV2ZWwiLCJjZW50ZXJPZmZzZXQiLCJnZXRDdXJyZW50TGF5b3V0IiwiZ2V0UGFnZVRvVmlld3BvcnRDZW50ZXJPZmZzZXQiLCJhbmNob3JQYWdlIiwidmlld3BvcnQiLCJzY2FsZVJhdGlvIiwiZ29EaXJlY3RseVRvIiwiaG9yaXpvbnRhbE9mZnNldCIsInZlcnRpY2FsT2Zmc2V0IiwicHVibGlzaCIsIl9oYW5kbGVab29tTGV2ZWxDaGFuZ2UiLCJjdXJyZW50UGFnZUluZGV4IiwiYWN0aXZlUGFnZUluZGV4IiwiZmlsZU5hbWUiLCJyZW5kZXJlZFBhZ2VzIiwidGFyZ2V0UGFnZSIsImN1cnJlbnRQYWdlIiwibGF5b3V0IiwiY2VudGVyWSIsImNlbnRlclgiLCJjZW50ZXJQYWdlIiwiZGltcyIsImdldFBhZ2VEaW1lbnNpb25zIiwiaW1hZ2VPZmZzZXQiLCJnZXRQYWdlT2Zmc2V0IiwibWlkWCIsIm1pZFkiLCJnZXRDZW50ZXJtb3N0UGFnZSIsImdldFZpZXdwb3J0IiwiaW50ZXJzZWN0aW9uVG9sZXJhbmNlIiwidmlzaWJsZVBhZ2VzIiwicmVuZGVyZXIiLCJpc1BhZ2VWaXNpYmxlIiwic2V0Q3VycmVudFBhZ2VzIiwib2xkWm9vbUxldmVsIiwicmVtb3ZlUGFnZU92ZXJsYXkiLCJHcmlkSGFuZGxlciIsInBhZ2VUb1ZpZXdwb3J0Q2VudGVyT2Zmc2V0IiwiaW5HcmlkIiwiZ2V0UGFnZUluZm8iLCJjaG9zZW5Hcm91cCIsInJlZ2lvbiIsImJvdHRvbSIsInZpZXdwb3J0TWlkZGxlIiwiZ3JvdXBNaWRkbGUiLCJnZXRDZW50ZXJtb3N0R3JvdXAiLCJQYWdlT3ZlcmxheU1hbmFnZXIiLCJfcGFnZXMiLCJfcmVuZGVyZWRQYWdlcyIsIl9yZW5kZXJlZFBhZ2VNYXAiLCJtb3VudCIsIm92ZXJsYXlzQnlQYWdlIiwib3ZlcmxheUluZGV4IiwidW5tb3VudCIsInByZXZpb3VzbHlSZW5kZXJlZCIsIm5ld1JlbmRlcmVkTWFwIiwiX2ludm9rZU9uT3ZlcmxheXMiLCJvdmVybGF5cyIsIlRpbGVDb3ZlcmFnZU1hcCIsImNvbHMiLCJfcm93cyIsIl9jb2xzIiwiX21hcCIsImNvbCIsImxldmVscyIsIl9sZXZlbHMiLCJ1cmxzVG9UaWxlcyIsIl91cmxzVG9UaWxlcyIsImxldmVsIiwidGlsZXMiLCJ0aWxlIiwibG9hZGVkQnlMZXZlbCIsIl9sb2FkZWRCeUxldmVsIiwiYmFzZVpvb21MZXZlbCIsInRvUmVuZGVyQnlMZXZlbCIsImhpZ2hlc3Rab29tTGV2ZWwiLCJjb3ZlcmVkIiwiYmVzdExldmVsSW5kZXgiLCJjZWlsTGV2ZWwiLCJsb2FkZWQiLCJhZGRpdGlvbmFsVGlsZXMiLCJpc0xvYWRlZCIsImlzTmVlZGVkIiwiaGlnaFJlc1JvdyIsImhpZ2hSZXNDb2wiLCJieUxldmVsIiwidXJscyIsIkRvY3VtZW50TGF5b3V0IiwiY29uZmlnIiwiY29tcHV0ZWRMYXlvdXQiLCJzY2FsZWRMYXlvdXRzIiwicGFnZUxheW91dHMiLCJzY2FsZURpbWVuc2lvbnMiLCJncm91cE9mZnNldCIsImdldFNjYWxlZFBhZ2VMYXlvdXRzIiwiZG9jdW1lbnRTZWNvbmRhcnlFeHRlbnQiLCJzZWNvbmRhcnlEaW0iLCJzZWNvbmRhcnlQYWRkaW5nIiwiZG9jUGFkZGluZyIsInZlcnRpY2FsbHlPcmllbnRlZCIsIm1heERpbSIsImdldEV4dGVudEFsb25nU2Vjb25kYXJ5QXhpcyIsInByaW1hcnlEb2NQb3NpdGlvbiIsInBhZ2VHcm91cHMiLCJwYWdlUGFkZGluZyIsImdldENvbXB1dGVkTGF5b3V0IiwiX3BhZ2VMb29rdXAiLCJwYWdlTG9va3VwIiwiZ2V0UGFnZUxvb2t1cCIsImdldFBhZ2VSZWdpb25Gcm9tUGFnZUluZm8iLCJwYWdlSW5mbyIsImVsZW1lbnRXaWR0aCIsImVsZW1lbnRIZWlnaHQiLCJJbWFnZUNhY2hlIiwiX2hlbGQiLCJfdXJscyIsIl9scnUiLCJyZWNvcmQiLCJpbWciLCJfcHJvbW90ZSIsIl90cnlFdmljdCIsImV4dHJhQ2FwYWNpdHkiLCJhbGxvd2VkRW50cnlDb3VudCIsImV2aWN0aW9uSW5kZXgiLCJJbWFnZVJlcXVlc3RIYW5kbGVyIiwiX3VybCIsIl9jYWxsYmFjayIsIl9lcnJvckNhbGxiYWNrIiwidGltZW91dFRpbWUiLCJfYWJvcnRlZCIsIl9jb21wbGV0ZSIsIl9jcm9zc09yaWdpbiIsImltYWdlQ3Jvc3NPcmlnaW4iLCJfaW1hZ2UiLCJJbWFnZSIsImNyb3NzT3JpZ2luIiwib25sb2FkIiwiX2hhbmRsZUxvYWQiLCJfaGFuZGxlRXJyb3IiLCJhbmltYXRlIiwiZHVyYXRpb25NcyIsImR1cmF0aW9uIiwicGFyYW1ldGVycyIsIm9uVXBkYXRlIiwib25FbmQiLCJ0d2VlbkZucyIsInBhcmFtS2V5cyIsImVhc2luZyIsImVsYXBzZWQiLCJpbk91dEN1YmljRWFzaW5nIiwicmVxdWVzdElkIiwidXBkYXRlVmFsdWVzIiwiaGFuZGxlQW5pbWF0aW9uQ29tcGxldGlvbiIsImludGVycnVwdGVkIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJsaW5lYXIiLCJjdWJpYyIsInBlcmZvcm1hbmNlIiwiaG9va3MiLCJfdmlld3BvcnQiLCJfb3V0ZXJFbGVtZW50Iiwib3V0ZXJFbGVtZW50IiwiX2RvY3VtZW50RWxlbWVudCIsIl9zZXR0aW5ncyIsIl9ob29rcyIsIl9jYW52YXMiLCJfY3R4IiwiZ2V0Q29udGV4dCIsIl9zb3VyY2VSZXNvbHZlciIsIl9jb25maWciLCJfem9vbUxldmVsIiwiX2NvbXBvc2l0ZUltYWdlcyIsIl9yZW5kZXJlZFRpbGVzIiwiX2FuaW1hdGlvbiIsIl9wZW5kaW5nUmVxdWVzdHMiLCJIVE1MQ2FudmFzRWxlbWVudCIsInZpZXdwb3J0UG9zaXRpb24iLCJzb3VyY2VSZXNvbHZlciIsIl9jbGVhckFuaW1hdGlvbiIsIm9uVmlld1dpbGxMb2FkIiwiX3NldExheW91dFRvWm9vbUxldmVsIiwiZ290byIsIm9uVmlld0RpZExvYWQiLCJfZ290byIsInNldElubmVyRGltZW5zaW9ucyIsIl9yZW5kZXIiLCJvblZpZXdEaWRVcGRhdGUiLCJuZXdSZW5kZXJlZFBhZ2VzIiwiaW50ZXJzZWN0c1JlZ2lvbiIsImNsZWFyUmVjdCIsIl9wYWludE91dGxpbmUiLCJ6b29tTGV2ZWxzIiwiZ2V0QWxsWm9vbUxldmVsc0ZvclBhZ2UiLCJjb21wb3NpdGUiLCJ1cGRhdGVGcm9tQ2FjaGUiLCJfaW5pdGlhdGVUaWxlUmVxdWVzdHMiLCJmaW5kQ2hhbmdlcyIsIl9wYWludCIsIm9uUGFnZVdpbGxMb2FkIiwiYWRkZWQiLCJyZW5kZXJlZFRpbGVzIiwiZ2V0VGlsZXMiLCJzY2FsZWQiLCJnZXRTY2FsZWRUaWxlUmVjb3JkIiwiX2lzVGlsZVZpc2libGUiLCJfZHJhd1RpbGUiLCJhY3F1aXJlIiwicmVsZWFzZSIsInBhZ2VPZmZzZXQiLCJfZ2V0SW1hZ2VPZmZzZXQiLCJ2aWV3cG9ydFBhZGRpbmdYIiwidmlld3BvcnRQYWRkaW5nWSIsInZpZXdwb3J0T2Zmc2V0WCIsInZpZXdwb3J0T2Zmc2V0WSIsImRlc3RYT2Zmc2V0IiwiZGVzdFlPZmZzZXQiLCJjYW52YXNYIiwiY2FudmFzWSIsImRlc3RXaWR0aCIsImRlc3RIZWlnaHQiLCJzdHJva2VTdHlsZSIsInN0cm9rZVJlY3QiLCJuZXdQZW5kaW5nUmVxdWVzdHMiLCJpbml0aWF0ZVJlcXVlc3QiLCJ1cGRhdGVXaXRoTG9hZGVkVXJscyIsIl9pc1RpbGVGb3JTb3VyY2VWaXNpYmxlIiwiZ2V0QmVzdFpvb21MZXZlbEZvclBhZ2UiLCJzY2FsZWRUaWxlIiwidGlsZU9mZnNldCIsIl9nZXRUaWxlVG9Eb2N1bWVudE9mZnNldCIsInNvdXJjZVhPZmZzZXQiLCJzb3VyY2VZT2Zmc2V0IiwiZGVzdEltZ1dpZHRoIiwiZGVzdEltZ0hlaWdodCIsInNvdXJjZVdpZHRoIiwic291cmNlSGVpZ2h0IiwiZHJhd0ltYWdlIiwidGlsZVNvdXJjZSIsImdldFBvc2l0aW9uIiwib25WaWV3RGlkVHJhbnNpdGlvbiIsIl9zZXRWaWV3cG9ydFBvc2l0aW9uIiwib25ab29tTGV2ZWxXaWxsQ2hhbmdlIiwic2NhbGVGYWN0b3IiLCJzb3VyY2Vab29tTGV2ZWwiLCJuZXdBcnJheSIsIm9sZEVudHJ5IiwibmV3RW50cnkiLCJnZXRNYXhQYWdlRGltZW5zaW9ucyIsImdldEJvb2tMYXlvdXRHcm91cHMiLCJ2aWV3ZXJDb25maWciLCJwYWdlc0J5R3JvdXAiLCJsZWZ0UGFnZSIsIm5vblBhZ2VkUGFnZXMiLCJfYWRkTm9uUGFnZWRQYWdlcyIsIm5sZW4iLCJwYWdlUmVjb3JkIiwicGFnZWQiLCJzaG93Tm9uUGFnZWRQYWdlcyIsImZhY2luZ1BhZ2VzIiwiZ2V0R3JvdXBpbmdzIiwicmlnaHRQYWdlIiwibGVmdERpbXMiLCJyaWdodERpbXMiLCJmaXJzdExlZnRPZmZzZXQiLCJzZWNvbmRMZWZ0T2Zmc2V0IiwibWlkV2lkdGgiLCJnZXRGYWNpbmdQYWdlR3JvdXAiLCJwYWdlRGltcyIsImxlZnRPZmZzZXQiLCJzaG91bGRCZUhvcml6b250YWxseUFkanVzdGVkIiwiZ2V0R3JvdXBMYXlvdXRzRnJvbVBhZ2VHcm91cGluZyIsImdldEdyaWRMYXlvdXRHcm91cHMiLCJ2aWV3cG9ydFdpZHRoIiwicGFnZXNQZXJSb3ciLCJmaXhlZEhlaWdodEdyaWQiLCJmaXhlZFBhZGRpbmciLCJwYWdlV2lkdGgiLCJncmlkUGFnZVdpZHRoIiwicm93SGVpZ2h0IiwibWluUmF0aW8iLCJtYXhSYXRpbyIsImN1cnJlbnRQYWdlcyIsInJvd0RpbWVuc2lvbnMiLCJwYWdlRGltZW5zIiwicGFnZURhdGEiLCJwYWdlRGltZW5EYXRhIiwiaGVpZ2h0VG9XaWR0aFJhdGlvIiwicGFnZUhlaWdodCIsImdldEdyaWRQYWdlRGltZW5zaW9ucyIsImdldFBhZ2VMYXlvdXRzIiwicGx1Y2siLCJpbkJvb2tMYXlvdXQiLCJnZXRTaW5nbGVzTGF5b3V0R3JvdXBzIiwiY3JlYXRlU2V0dGluZ3NWaWV3IiwicmVnaXN0ZXJNaXhpbiIsIlZhbGlkYXRpb25SdW5uZXIiLCJ3aGl0ZWxpc3RlZEtleXMiLCJ2YWxpZGF0aW9ucyIsInZhbGlkYXRpb25JbmRleCIsInZhbGlkYXRpb24iLCJkdW1teUNoYW5nZXMiLCJwcm94aWVyIiwiY3JlYXRlU2V0dGluZ3NQcm94aWVyIiwiX3J1blZhbGlkYXRpb24iLCJfdmFsaWRhdGVPcHRpb25zIiwiY2xvbmVkIiwic2V0dGluZ3NQcm94aWVyIiwiX2FwcGx5VmFsaWRhdGlvbnMiLCJjb3JyZWN0ZWQiLCJ3YXJuaW5nU3VwcHJlc3NlZCIsIm9yaWdpbmFsIiwiZW1pdFdhcm5pbmciLCJzdXBwcmVzc1dhcm5pbmciLCJvdXRwdXRWYWx1ZSIsInByb3h5IiwicnVubmVyIiwibG9va3VwIiwibG9va3VwVmFsdWUiLCJ3aGl0ZWxpc3RlZCIsImFkZGl0aW9uYWwiLCJjdXJyZW50S2V5IiwiZGVmaW5lUHJvcGVydGllcyIsImV4dGVuc2lvbiIsIlZpZXdwb3J0IiwiX3RvcCIsIl9sZWZ0IiwiX3dpZHRoIiwiX2hlaWdodCIsIl9pbm5lckRpbWVuc2lvbnMiLCJpbnZhbGlkYXRlIiwiaGFzSG9yaXpvbnRhbE92ZXJsYXAiLCJoYXNWZXJ0aWNhbE92ZXJsYXAiLCJmYWxsc0JldHdlZW4iLCJjbGllbnRIZWlnaHQiLCJnZXRDb29yZGluYXRlRGVzY3JpcHRvciIsImFzc29jaWF0ZWREaW1lbnNpb24iLCJwcml2YXRlUHJvcCIsImNsYW1wTWluIiwiZ2V0RGltZW5zaW9uRGVzY3JpcHRvciIsImRpbWVuIiwiY2xhbXBNYXgiLCJnZW5lcmF0ZUlkIiwib3B0aW9uc1ZhbGlkYXRpb25zIiwibWluUGFnZXNQZXJSb3ciLCJtYXhQYWdlc1BlclJvdyIsIm1heFpvb20iLCJwYXJlbnRPYmplY3QiLCJjdXJyZW50UGFnZUluZGljZXMiLCJob3Jpem9udGFsUGFkZGluZyIsImluaXRpYWxLZXlTY3JvbGwiLCJpbml0aWFsU3BhY2VTY3JvbGwiLCJpbm5lck9iamVjdCIsImlzQWN0aXZlRGl2YSIsImlzU2Nyb2xsYWJsZSIsImlzWm9vbWluZyIsIm1vYmlsZVdlYmtpdCIsIm91dGVyT2JqZWN0IiwicGFnZU92ZXJsYXlzIiwicGFnZVRvb2xzIiwicGVuZGluZ01hbmlmZXN0UmVxdWVzdCIsInBsdWdpbkluc3RhbmNlcyIsInJlc2l6ZVRpbWVyIiwic2Nyb2xsYmFyV2lkdGgiLCJ0aHJvYmJlclRpbWVvdXRJRCIsInRvb2xiYXIiLCJ2ZXJ0aWNhbFBhZGRpbmciLCJ2aWV3cG9ydE9iamVjdCIsImlkTnVtYmVyIiwicGFuZWxIZWlnaHQiLCJwYW5lbFdpZHRoIiwib3B0aW9uc1ZhbGlkYXRvciIsIncxIiwib2Zmc2V0V2lkdGgiLCJ3MiIsImdldFNjcm9sbGJhcldpZHRoIiwib3JpZW50YXRpb24iLCJoYXNoUGFyYW1TdWZmaXgiLCJpbm5lckVsZW0iLCJlbGVtQXR0cnMiLCJ2aWV3cG9ydEVsZW0iLCJvdXRlckVsZW0iLCJ2aWV3cG9ydE1hcmdpbiIsImJvdW5kU2Nyb2xsRnVuY3Rpb24iLCJzY3JvbGxGdW5jdGlvbiIsImJvdW5kRXNjYXBlTGlzdGVuZXIiLCJlc2NhcGVMaXN0ZW5lciIsImluaXRQbHVnaW5zIiwiaGFuZGxlRXZlbnRzIiwic2hvd1Rocm9iYmVyIiwiaXNWYWxpZCIsImlkZW50IiwiYXR0cnMiLCJrZXlDb2RlIiwibGVhdmVGdWxsc2NyZWVuTW9kZSIsIm5ld09wdGlvbnMiLCJxdWV1ZWRFdmVudHMiLCJnZXRWYWxpZGF0ZWRPcHRpb25zIiwiaGFzQ2hhbmdlZE9wdGlvbiIsImluRnVsbHNjcmVlbiIsInByZXBhcmVNb2RlQ2hhbmdlIiwiY2xlYXJWaWV3ZXIiLCJ1cGRhdGVWaWV3SGFuZGxlckFuZFJlbmRlcmluZyIsInJlbmRlcmVyQ29uZmlnIiwiZ2V0UGFkZGluZyIsInNvdXJjZVByb3ZpZGVyIiwiZ2V0Q3VycmVudFNvdXJjZVByb3ZpZGVyIiwic2VyaWFsaXplZCIsImNoYW5nZUNsYXNzIiwic3RvcmVkSGVpZ2h0Iiwic3RvcmVkV2lkdGgiLCJuZXdXaWR0aCIsIkhhbmRsZXIiLCJpbml0aWFsaXplUmVuZGVyZXIiLCJjb21wYXRFcnJvcnMiLCJnZXRDb21wYXRpYmlsaXR5RXJyb3JzIiwic2hvd0Vycm9yIiwidXBkYXRlUGFnZU92ZXJsYXlzIiwiZ3JpZFNvdXJjZVByb3ZpZGVyIiwiZ2V0UGFnZUltYWdlVVJMIiwidGlsZURpbWVuc2lvbnMiLCJ0aWxlV2lkdGgiLCJ0aWxlSGVpZ2h0IiwiZ2V0UGFnZUltYWdlVGlsZXMiLCJsZXZlbENvdW50IiwidG9wUGFkZGluZyIsImxlZnRQYWRkaW5nIiwiZG9jVlBhZGRpbmciLCJkb2NIUGFkZGluZyIsInVwZGF0ZU92ZXJsYXlzIiwiZ2V0UmVuZGVyZWRQYWdlcyIsImZvY2FsUG9pbnQiLCJpc1ZhbGlkT3B0aW9uIiwiY3VycmVudFJlZ2lvbiIsInBhZ2VSZWdpb24iLCJmb2NhbFhUb0NlbnRlciIsImZvY2FsWVRvQ2VudGVyIiwiZ2V0UG9zaXRpb25Gb3Jab29tTGV2ZWwiLCJpbml0Wm9vbSIsInpvb21SYXRpbyIsImluaXRpYWxab29tTGV2ZWwiLCJlbmRQb3NpdGlvbiIsInRyYW5zaXRpb25WaWV3cG9ydFBvc2l0aW9uIiwiem9vbUluQnV0dG9uIiwiem9vbU91dEJ1dHRvbiIsImFuY2hvciIsInBpZHgiLCJnZXRQYWdlRGF0YSIsInVwZGF0ZU9mZnNldHMiLCJ1cGRhdGVQYW5lbFNpemUiLCJyZWxvYWRWaWV3ZXIiLCJibG9ja01vYmlsZU1vdmUiLCJwcmV2aW91c1RvcFNjcm9sbCIsInByZXZpb3VzTGVmdFNjcm9sbCIsIm5ld1Njcm9sbFRvcCIsIm5ld1Njcm9sbExlZnQiLCJhZGp1c3QiLCJwcmltYXJ5U2Nyb2xsIiwiYmluZE1vdXNlRXZlbnRzIiwiZW5hYmxlU3BhY2VTY3JvbGwiLCJlbmFibGVLZXlTY3JvbGwiLCJhcnJvd1Njcm9sbEFtb3VudCIsIm9uUmVzaXplIiwicGx1Z2lucyIsImlzUGFnZVRvb2wiLCJoaWRlVGhyb2JiZXIiLCJ0aGIiLCJ0aHJvYmJlclRpbWVvdXQiLCJlcnJvckVsZW1lbnQiLCJsb2FkT3B0aW9ucyIsImFkYXB0aXZlUGFkZGluZyIsImdldEF2ZXJhZ2VXaWR0aCIsImdldEF2ZXJhZ2VIZWlnaHQiLCJuZWVkc1hDb29yZCIsIm5lZWRzWUNvb3JkIiwiYW5jaG9yZWRWZXJ0aWNhbGx5IiwiYW5jaG9yZWRIb3Jpem9udGFsbHkiLCJnZXRYT2Zmc2V0IiwiZ2V0WU9mZnNldCIsImVuYWJsZUF1dG9UaXRsZSIsIm1pbldpZHRoIiwiYWRkT3ZlcmxheSIsInJlbW92ZU92ZXJsYXkiLCJkb2NPZmZzZXQiLCJkb2NDb29yZHMiLCJwYWdlQ291bnQiLCJhY3RpdmVQYWdlIiwiYXJyYXlzRXF1YWwiLCJvdGhlckltYWdlcyIsImVuYWJsZURyYWdTY3JvbGxhYmxlIiwiZGJsY2xpY2siLCJjb250ZXh0bWVudSIsInJlbW92ZUNsYXNzIiwicmVtb3ZlRGF0YSIsInJlbW92ZUF0dHIiLCJ1bnN1YnNjcmliZUFsbCIsInBhcnNlTGFiZWxWYWx1ZSIsImdldE1heFpvb21MZXZlbCIsImxhcmdlc3REaW1lbnNpb24iLCJpbmNvcnBvcmF0ZVpvb20iLCJpbWFnZURpbWVuc2lvbiIsInpvb21EaWZmZXJlbmNlIiwiZ2V0T3RoZXJJbWFnZURhdGEiLCJsb3dlc3RNYXhab29tIiwiaXRtIiwicGFyc2VJbWFnZUluZm8iLCJpbCIsInBhcnNlSUlJRk1hbmlmZXN0IiwiZ2V0SUlJRlByZXNlbnRhdGlvblZlcnNpb24iLCJudW1DYW52YXNlcyIsInRoaXNDYW52YXMiLCJ0aGlzUmVzb3VyY2UiLCJ0aGlzSW1hZ2UiLCJzZWNvbmRhcnlJbWFnZXMiLCJpbWFnZUFQSVZlcnNpb24iLCJpbWFnZUxhYmVsIiwiem9vbURpbWVuc2lvbnMiLCJ3aWR0aEF0Q3VycmVudFpvb21MZXZlbCIsImhlaWdodEF0Q3VycmVudFpvb21MZXZlbCIsIm16IiwicmF0aW8iLCJ0b3RhbFdpZHRocyIsInRvdGFsSGVpZ2h0cyIsIm1heFdpZHRocyIsIm1heEhlaWdodHMiLCJpbWFnZXMiLCJyZXNvdXJjZSIsInNlcnZpY2UiLCJpc1BhZ2VkIiwidmlld2luZ0hpbnQiLCJpc0ZhY2luZyIsInhvZmZzZXQiLCJ5b2Zmc2V0IiwiYXZlcmFnZVdpZHRocyIsImF2ZXJhZ2VIZWlnaHRzIiwiYV93aWQiLCJhX2hlaSIsIm1heF93IiwibWF4X2giLCJtYXhfcmF0aW8iLCJtaW5fcmF0aW8iLCJ0X2hlaSIsInRfd2lkIiwiaXRlbV90aXRsZSIsIm1heF96b29tIiwicGdzIiwiYmVoYXZpb3VyIiwiZnJhZ21lbnRSZWdleCIsInh5d2giLCJzdHJpcFVSTCIsInVybEFycmF5IiwiaW1hZ2VJbmZvIiwiSUlJRlNvdXJjZUFkYXB0ZXIiLCJkaW1lbnMiLCJxdWFsaXR5Iiwicm93Q291bnQiLCJjb2xDb3VudCIsInVybEFkYXB0ZXIiLCJfbWF4V2lkdGhzIiwiX21heEhlaWdodHMiLCJfYXZlcmFnZVdpZHRocyIsIl9hdmVyYWdlSGVpZ2h0cyIsIl90b3RhbEhlaWdodHMiLCJfdG90YWxXaWR0aHMiLCJfdXJsQWRhcHRlciIsImlpaWZNYW5pZmVzdCIsIm1heERpbXMiLCJ0YXJnZXRab29tTGV2ZWwiLCJnZXRUaWxlSW1hZ2VVUkwiLCJ6b29tZWRQcm9wZXJ0eUdldHRlciIsInByaXZhdGVOYW1lIiwiZ2V0TWF4V2lkdGgiLCJnZXRNYXhIZWlnaHQiLCJnZXRUb3RhbFdpZHRoIiwiZ2V0VG90YWxIZWlnaHQiLCJ2aWV3ZXIiLCJpY29uIiwiaW5uZXJOYW1lIiwiaW5uZXJWYWx1ZSIsInpvb21PdXRJY29uIiwiX2NyZWF0ZVpvb21PdXRJY29uIiwiem9vbUluSWNvbiIsIl9jcmVhdGVab29tSW5JY29uIiwiem9vbUJ1dHRvbnMiLCJjcmVhdGVCdXR0b24iLCJzZXRab29tTGV2ZWwiLCJjcmVhdGVMYWJlbCIsIl9zdWJzY3JpYmUiLCJncmlkTW9yZUljb24iLCJfY3JlYXRlR3JpZE1vcmVJY29uIiwiZ3JpZEZld2VySWNvbiIsIl9jcmVhdGVHcmlkRmV3ZXJJY29uIiwiZ3JpZEJ1dHRvbnMiLCJzZXRHcmlkUGFnZXNQZXJSb3ciLCJ1cGRhdGVDdXJyZW50UGFnZSIsImluZGljZXMiLCJnZXRDdXJyZW50UGFnZUluZGljZXMiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJzdGFydExhYmVsIiwiZW5kTGFiZWwiLCJlbmFibGVJbmRleEFzTGFiZWwiLCJnb3RvUGFnZUlucHV0IiwiYXV0b2NvbXBsZXRlIiwiZ290b1BhZ2VTdWJtaXQiLCJpbnB1dFN1Z2dlc3Rpb25zIiwiZ290b0Zvcm0iLCJkZXNpcmVkUGFnZUxhYmVsIiwib25Hb3RvU3VibWl0IiwiZ290b1BhZ2VCeUluZGV4IiwiYWxlcnQiLCJnb3RvUGFnZUJ5TGFiZWwiLCJudW1TdWdnZXN0aW9ucyIsImVuYWJsZUdvdG9TdWdnZXN0aW9ucyIsIm5ld0lucHV0U3VnZ2VzdGlvbiIsImFjdGl2ZSIsInByZXZFbCIsIm5leHRFbCIsInN1Ym1pdEV2ZW50IiwiRXZlbnQiLCJjYW5jZWxhYmxlIiwidmlld09wdGlvbnNMaXN0IiwiX2VsZW1BdHRycyIsImdyaWRWaWV3SWNvbiIsIl9jcmVhdGVHcmlkVmlld0ljb24iLCJib29rVmlld0ljb24iLCJfY3JlYXRlQm9va1ZpZXdJY29uIiwicGFnZVZpZXdJY29uIiwiX2NyZWF0ZVBhZ2VWaWV3SWNvbiIsImNoYW5nZVZpZXdCdXR0b24iLCJzZWxlY3RWaWV3IiwiY2hhbmdlVmlldyIsInVwZGF0ZVZpZXdNZW51Iiwidmlld09wdGlvbnMiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiZnVsbHNjcmVlbkljb24iLCJfY3JlYXRlRnVsbHNjcmVlbkljb24iLCJ0b2dnbGVGdWxsc2NyZWVuTW9kZSIsInRvZ2dsZVpvb21HcmlkQ29udHJvbHMiLCJsZWZ0VG9vbHMiLCJjcmVhdGVab29tQnV0dG9ucyIsImNyZWF0ZUdyaWRDb250cm9scyIsInJpZ2h0VG9vbHMiLCJjcmVhdGVQYWdlTGFiZWwiLCJjcmVhdGVWaWV3TWVudSIsImVuYWJsZUZ1bGxzY3JlZW4iLCJjcmVhdGVGdWxsc2NyZWVuQnV0dG9uIiwiZW5hYmxlR290b1BhZ2UiLCJjcmVhdGVHb3RvUGFnZUZvcm0iLCJ0b29sYmFyU2lkZSIsInRvb2xiYXJJY29uIiwiY3JlYXRlSWNvbiIsImhhbmRsZVBsdWdpbkNsaWNrIiwidG9vbHMiLCJ0b29sYmFyUGFyZW50T2JqZWN0IiwicEVsIiwiX2NyZWF0ZVRvb2xiYXJJY29uIiwiZ2V0SGFzaFBhcmFtIiwib3JpZ2luYWxWYWx1ZSIsInN0YXJ0VGhpbmciLCJIVE1MRWxlbWVudCIsImVuYWJsZUZpbGVuYW1lIiwiZW5hYmxlR3JpZEljb24iLCJlbmFibGVHcmlkQ29udHJvbHMiLCJlbmFibGVJbWFnZVRpdGxlcyIsImVuYWJsZUxpbmtJY29uIiwiZW5hYmxlTm9uUGFnZWRWaXNpYmlsaXR5SWNvbiIsImVuYWJsZVRvb2xiYXIiLCJlbmFibGVab29tQ29udHJvbHMiLCJmaWxsUGFyZW50SGVpZ2h0IiwicGFnZUFsaWFzZXMiLCJwYWdlQWxpYXNGdW5jdGlvbiIsInBhZ2VMb2FkVGltZW91dCIsInJlcXVlc3RIZWFkZXJzIiwid3JhcHBlckVsZW1lbnQiLCJkaXZhU3RhdGUiLCJyZW5kZXIiLCJ1bnN1YnNjcmliZSIsImhhc2hTdGF0ZSIsIl9nZXRIYXNoUGFyYW1TdGF0ZSIsIl9sb2FkT3JGZXRjaE9iamVjdERhdGEiLCJfbG9hZE9iamVjdERhdGEiLCJfYWpheEVycm9yIiwic2V0UGVuZGluZ01hbmlmZXN0UmVxdWVzdCIsImpzb25Ib3N0IiwiX3Nob3dFcnJvciIsInJlc3BvbnNlRGF0YSIsImZyb21JSUlGIiwiX2dldExvYWRPcHRpb25zRm9yU3RhdGUiLCJzZXRNYW5pZmVzdCIsIl9nZXRWaWV3U3RhdGUiLCJfZ2V0UGFnZUluZGV4Rm9yTWFuaWZlc3QiLCJucCIsImhhc2hQYXJhbXMiLCJfZ2V0U3RhdGUiLCJoYXNoU3RyaW5nQnVpbGRlciIsIl9yZWxvYWRWaWV3ZXIiLCJob3ZlciIsInRvZ2dsZU9wYWNpdHkiLCJkZXN0aW5hdGlvblZpZXciLCJ4QW5jaG9yIiwieUFuY2hvciIsIl9pc1BhZ2VJbmRleFZhbGlkIiwieE9mZnNldCIsInlPZmZzZXQiLCJpc1BhZ2VWYWxpZCIsIm91dGVyT2Zmc2V0Iiwib3V0ZXJUb3AiLCJvdXRlckxlZnQiLCJvdXRlckJvdHRvbSIsIm91dGVyUmlnaHQiLCJjdXJQYWdlSWR4IiwiY3VyUGFnZSIsImN1ck9mZnNldCIsIl9nZXRVUkxIYXNoIiwiX2NoYW5nZVZpZXciLCJkaXNhYmxlU2Nyb2xsYWJsZSIsImVuYWJsZVNjcm9sbGFibGUiLCJfdG9nZ2xlRnVsbHNjcmVlbiIsInBnIiwiX2dldEN1cnJlbnRVUkwiLCJwYWdlSWR4IiwiX2NoZWNrTG9hZGVkIiwicGdBdFpvb20iLCJfZ2V0UGFnZUluZGV4Rm9yUGFnZVhZVmFsdWVzIiwiX2dvdG9QYWdlQnlJbmRleCIsImxsYyIsIl9nZXRQYWdlSW5kZXgiLCJ0b3BPZmZzZXQiLCJfdG9nZ2xlUGFnZUxheW91dE9yaWVudGF0aW9uIiwiRGl2YSJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBS2ZGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixF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Q0FFcEIsSUFBUSxJQUFNLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQzFFLElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUMxRSxJQUFRLElBQU0sSUFBUSxJQUN0QixJQUFRLElBQU0sSUFBUSxJQUN0QixJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQ2hELElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFDaEQsSUFBUSxJQUFNLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUNoRCxJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQ2hELElBQVEsSUFBTSxJQUFRLElBQ3RCLElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUMxRSxJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFDMUUsSUFBUSxJQUFNLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUNoRCxJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQ2hELElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUNuQyxJQUFRLEtBQU0sSUFBUSxLQUN0QixJQUFRLEtBQU0sSUFBUSxLQUN0QixJQUFRLEtBRVIsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUMxQixJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDdkUsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDdkUsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDdEYsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3RGLElBQVUsSUFBTSxJQUFVLElBQzFCLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsS0FBTSxJQUFVLEtBQzFCLElBQVUsS0FBTSxJQUFVLEtBQzFCLElBQVUsS0FBTSxJQUFVLE1Bb3VCeEJnQixHQUFpQmhCLEdBaHVCSCxDQUNoQixJQUFLLFFBQ0wsSUFBSyxPQUNMLElBQUssT0FDTCxJQUFLLFNBQ0wsSUFBSyxVQW91QlAsU0FBU2lCLEdBQWlCQyxHQUN4QixNQUFPLEtBQU8zRSxHQUFjMkUsR0FzQjlCLFNBQVNDLEdBQVczb0MsR0FDbEIsT0FBT3lqQyxHQUFhNWhFLEtBQUttK0IsR0FzQzNCLFNBQVM0b0MsR0FBV2orRCxHQUNsQixJQUFJMUssR0FBUyxFQUNUNFosRUFBU3hiLE1BQU1zTSxFQUFJbUIsTUFLdkIsT0FIQW5CLEVBQUluRyxTQUFRLFNBQVM1TCxFQUFPTSxHQUMxQjJnQixJQUFTNVosR0FBUyxDQUFDL0csRUFBS04sTUFFbkJpaEIsRUFXVCxTQUFTZ3ZELEdBQVEzekMsRUFBTTR6QyxHQUNyQixPQUFPLFNBQVNscUUsR0FDZCxPQUFPczJCLEVBQUs0ekMsRUFBVWxxRSxLQWExQixTQUFTbXFFLEdBQWU5bUUsRUFBT3FtRSxHQU03QixJQUxBLElBQUlyb0UsR0FBUyxFQUNUL0MsRUFBUytFLEVBQU0vRSxPQUNmK29FLEVBQVcsRUFDWHBzRCxFQUFTLEtBRUo1WixFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBUXFKLEVBQU1oQyxHQUNkckgsSUFBVTB2RSxHQUFlMXZFLElBQVV1bEUsSUFDckNsOEQsRUFBTWhDLEdBQVNrK0QsRUFDZnRrRCxFQUFPb3NELEtBQWNobUUsR0FHekIsT0FBTzRaLEVBVVQsU0FBU212RCxHQUFXbHFFLEdBQ2xCLElBQUltQixHQUFTLEVBQ1Q0WixFQUFTeGIsTUFBTVMsRUFBSWdOLE1BS3ZCLE9BSEFoTixFQUFJMEYsU0FBUSxTQUFTNUwsR0FDbkJpaEIsSUFBUzVaLEdBQVNySCxLQUViaWhCLEVBVVQsU0FBU292RCxHQUFXbnFFLEdBQ2xCLElBQUltQixHQUFTLEVBQ1Q0WixFQUFTeGIsTUFBTVMsRUFBSWdOLE1BS3ZCLE9BSEFoTixFQUFJMEYsU0FBUSxTQUFTNUwsR0FDbkJpaEIsSUFBUzVaLEdBQVMsQ0FBQ3JILEVBQU9BLE1BRXJCaWhCLEVBb0RULFNBQVNxdkQsR0FBV2xwQyxHQUNsQixPQUFPMm9DLEdBQVczb0MsR0FpRHBCLFNBQXFCQSxHQUNuQixJQUFJbm1CLEVBQVMwcEQsR0FBVTRGLFVBQVksRUFDbkMsS0FBTzVGLEdBQVUxaEUsS0FBS20rQixNQUNsQm5tQixFQUVKLE9BQU9BLEVBckRIdXZELENBQVlwcEMsR0FDWjJtQyxHQUFVM21DLEdBVWhCLFNBQVNxcEMsR0FBY3JwQyxHQUNyQixPQUFPMm9DLEdBQVczb0MsR0FtRHBCLFNBQXdCQSxHQUN0QixPQUFPQSxFQUFPdDFCLE1BQU02NEQsS0FBYyxHQW5EOUIrRixDQUFldHBDLEdBN2tCckIsU0FBc0JBLEdBQ3BCLE9BQU9BLEVBQU9wWSxNQUFNLElBNmtCaEIyaEQsQ0FBYXZwQyxHQVduQixTQUFTNG5DLEdBQWdCNW5DLEdBR3ZCLElBRkEsSUFBSS8vQixFQUFRKy9CLEVBQU85aUMsT0FFWitDLEtBQVc2Z0UsRUFBYWovRCxLQUFLbStCLEVBQU9xTixPQUFPcHRDLE1BQ2xELE9BQU9BLEVBVVQsSUFBSXVwRSxHQUFtQmhDLEdBMzhCSCxDQUNsQixRQUFTLElBQ1QsT0FBUSxJQUNSLE9BQVEsSUFDUixTQUFVLElBQ1YsUUFBUyxNQTRnQ1gsSUFzM2VJbDFDLEdBdDNlZSxTQUFVbTNDLEVBQWFscUUsR0FJeEMsSUE2Qk1tcUUsRUE3QkZyckUsR0FISmtCLEVBQXFCLE1BQVhBLEVBQWtCNmpDLEdBQU85USxHQUFFK2MsU0FBU2pNLEdBQUsvcUMsU0FBVWtILEVBQVMreUIsR0FBRStELEtBQUsrTSxHQUFNdWdDLE1BRy9EdGxFLE1BQ2hCbTJCLEVBQU9qMUIsRUFBUWkxQixLQUNmbjNCLEVBQVFrQyxFQUFRbEMsTUFDaEJsRCxHQUFXb0YsRUFBUXBGLFNBQ25Cd1AsR0FBT3BLLEVBQVFvSyxLQUNmdFIsR0FBU2tILEVBQVFsSCxPQUNqQml1QixHQUFTL21CLEVBQVErbUIsT0FDakJocEIsR0FBU2lDLEVBQVFqQyxPQUNqQmpCLEdBQVlrRCxFQUFRbEQsVUFHcEJzdEUsR0FBYXRyRSxFQUFNOUUsVUFDbkJxd0UsR0FBWXp2RSxHQUFTWixVQUNyQnN3RSxHQUFjeHhFLEdBQU9rQixVQUdyQnV3RSxHQUFhdnFFLEVBQVEsc0JBR3JCNjBCLEdBQWV3MUMsR0FBVWw1RCxTQUd6QmxYLEdBQWlCcXdFLEdBQVlyd0UsZUFHN0J1d0UsR0FBWSxFQUdaQyxJQUNFTixFQUFNLFNBQVNsdEMsS0FBS3N0QyxJQUFjQSxHQUFXeHBFLE1BQVF3cEUsR0FBV3hwRSxLQUFLMnBFLFVBQVksS0FDdkUsaUJBQW1CUCxFQUFPLEdBUXRDUSxHQUF1QkwsR0FBWW41RCxTQUduQzJqQixHQUFtQkQsR0FBYXQ4QixLQUFLTyxJQUdyQzh4RSxHQUFVL21DLEdBQUs5USxFQUdmODNDLEdBQWE5akQsR0FBTyxJQUN0QjhOLEdBQWF0OEIsS0FBSzBCLElBQWdCcWMsUUFBUThxRCxFQUFjLFFBQ3ZEOXFELFFBQVEseURBQTBELFNBQVcsS0FJNUV3MEQsR0FBUzlGLEdBQWdCaGxFLEVBQVE4cUUsWUFyOUNuQ3R1RSxFQXM5Q0VyRCxHQUFTNkcsRUFBUTdHLE9BQ2pCMG9CLEdBQWE3aEIsRUFBUTZoQixXQUNyQmtwRCxHQUFjRCxHQUFTQSxHQUFPQyxpQkF4OUNoQ3Z1RSxFQXk5Q0V3dUUsR0FBZTFCLEdBQVF4d0UsR0FBTzJHLGVBQWdCM0csSUFDOUNteUUsR0FBZW55RSxHQUFPWSxPQUN0Qnd4RSxHQUF1QlosR0FBWVkscUJBQ25DeG5DLEdBQVMwbUMsR0FBVzFtQyxPQUNwQnluQyxHQUFtQmh5RSxHQUFTQSxHQUFPaXlFLHdCQTc5Q3JDNXVFLEVBODlDRTZ1RSxHQUFjbHlFLEdBQVNBLEdBQU9teUUsY0E5OUNoQzl1RSxFQSs5Q0UrdUUsR0FBaUJweUUsR0FBU0EsR0FBT0MsaUJBLzlDbkNvRCxFQWkrQ0V6RCxHQUFrQixXQUNwQixJQUNFLElBQUk0OEIsRUFBTzYxQyxHQUFVMXlFLEdBQVEsa0JBRTdCLE9BREE2OEIsRUFBSyxHQUFJLEdBQUksSUFDTkEsRUFDUCxNQUFPMWtCLEtBTFUsR0FTakJ3NkQsR0FBa0J6ckUsRUFBUXFDLGVBQWlCd2hDLEdBQUt4aEMsY0FBZ0JyQyxFQUFRcUMsYUFDeEVxcEUsR0FBU3oyQyxHQUFRQSxFQUFLeTBCLE1BQVE3bEIsR0FBSzVPLEtBQUt5MEIsS0FBT3owQixFQUFLeTBCLElBQ3BEaWlCLEdBQWdCM3JFLEVBQVFtQyxhQUFlMGhDLEdBQUsxaEMsWUFBY25DLEVBQVFtQyxXQUdsRXlwRSxHQUFheGhFLEdBQUswMkIsS0FDbEIrcUMsR0FBY3poRSxHQUFLc3VELE1BQ25Cb1QsR0FBbUJoekUsR0FBT2dDLHNCQUMxQml4RSxHQUFpQmpCLEdBQVNBLEdBQU9rQixjQWwvQ25DeHZFLEVBbS9DRXl2RSxHQUFpQmpzRSxFQUFRazFCLFNBQ3pCZzNDLEdBQWE5QixHQUFXanZELEtBQ3hCZ3hELEdBQWE3QyxHQUFReHdFLEdBQU9pSSxLQUFNakksSUFDbENzekUsR0FBWWhpRSxHQUFLbUIsSUFDakI4Z0UsR0FBWWppRSxHQUFLa0IsSUFDakJnaEUsR0FBWXIzQyxFQUFLeTBCLElBQ2pCNmlCLEdBQWlCdnNFLEVBQVE4VCxTQUN6QjA0RCxHQUFlcGlFLEdBQUsrZixPQUNwQnNpRCxHQUFnQnJDLEdBQVd6bkMsUUFHM0IrcEMsR0FBV2xCLEdBQVV4ckUsRUFBUyxZQUM5QncwQixHQUFNZzNDLEdBQVV4ckUsRUFBUyxPQUN6QnZFLEdBQVUrdkUsR0FBVXhyRSxFQUFTLFdBQzdCOEwsR0FBTTAvRCxHQUFVeHJFLEVBQVMsT0FDekIyc0UsR0FBVW5CLEdBQVV4ckUsRUFBUyxXQUM3QjRzRSxHQUFlcEIsR0FBVTF5RSxHQUFRLFVBR2pDK3pFLEdBQVVGLElBQVcsSUFBSUEsR0FHekJHLEdBQVksR0FHWkMsR0FBcUJDLEdBQVNOLElBQzlCTyxHQUFnQkQsR0FBU3g0QyxJQUN6QjA0QyxHQUFvQkYsR0FBU3Z4RSxJQUM3QjB4RSxHQUFnQkgsR0FBU2xoRSxJQUN6QnNoRSxHQUFvQkosR0FBU0wsSUFHN0JVLEdBQWNsMEUsR0FBU0EsR0FBT2EsZUFuaERoQ3dDLEVBb2hERTh3RSxHQUFnQkQsR0FBY0EsR0FBWUUsYUFwaEQ1Qy93RSxFQXFoREVneEUsR0FBaUJILEdBQWNBLEdBQVlsOEQsY0FyaEQ3QzNVLEVBOG9ERixTQUFTaXhFLEdBQU9wMEUsR0FDZCxHQUFJcTBFLEdBQWFyMEUsS0FBV3lyQixHQUFRenJCLE1BQVlBLGFBQWlCczBFLElBQWMsQ0FDN0UsR0FBSXQwRSxhQUFpQnUwRSxHQUNuQixPQUFPdjBFLEVBRVQsR0FBSVksR0FBZTFCLEtBQUtjLEVBQU8sZUFDN0IsT0FBT3cwRSxHQUFheDBFLEdBR3hCLE9BQU8sSUFBSXUwRSxHQUFjdjBFLEdBVzNCLElBQUl5MEUsR0FBYyxXQUNoQixTQUFTaDBFLEtBQ1QsT0FBTyxTQUFTdzdCLEdBQ2QsSUFBS3k0QyxHQUFTejRDLEdBQ1osTUFBTyxHQUVULEdBQUkyMUMsR0FDRixPQUFPQSxHQUFhMzFDLEdBRXRCeDdCLEVBQU9FLFVBQVlzN0IsRUFDbkIsSUFBSWhiLEVBQVMsSUFBSXhnQixFQUVqQixPQURBQSxFQUFPRSxlQTdxRFR3QyxFQThxRFM4ZCxHQVpNLEdBcUJqQixTQUFTMHpELE1BV1QsU0FBU0osR0FBY3YwRSxFQUFPNDBFLEdBQzVCM3lFLEtBQUs0eUUsWUFBYzcwRSxFQUNuQmlDLEtBQUs2eUUsWUFBYyxHQUNuQjd5RSxLQUFLOHlFLFlBQWNILEVBQ25CM3lFLEtBQUsreUUsVUFBWSxFQUNqQi95RSxLQUFLZ3pFLGdCQXZzREw5eEUsRUF1eERGLFNBQVNteEUsR0FBWXQwRSxHQUNuQmlDLEtBQUs0eUUsWUFBYzcwRSxFQUNuQmlDLEtBQUs2eUUsWUFBYyxHQUNuQjd5RSxLQUFLaXpFLFFBQVUsRUFDZmp6RSxLQUFLa3pFLGNBQWUsRUFDcEJsekUsS0FBS216RSxjQUFnQixHQUNyQm56RSxLQUFLb3pFLGNBOXREYyxXQSt0RG5CcHpFLEtBQUtxekUsVUFBWSxHQWdIbkIsU0FBU0MsR0FBSy8zRCxHQUNaLElBQUluVyxHQUFTLEVBQ1QvQyxFQUFvQixNQUFYa1osRUFBa0IsRUFBSUEsRUFBUWxaLE9BRzNDLElBREFyQyxLQUFLdXpFLFVBQ0ludUUsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSW14RSxFQUFRajRELEVBQVFuVyxHQUNwQnBGLEtBQUtpRSxJQUFJdXZFLEVBQU0sR0FBSUEsRUFBTSxLQWlHN0IsU0FBU0MsR0FBVWw0RCxHQUNqQixJQUFJblcsR0FBUyxFQUNUL0MsRUFBb0IsTUFBWGtaLEVBQWtCLEVBQUlBLEVBQVFsWixPQUczQyxJQURBckMsS0FBS3V6RSxVQUNJbnVFLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUlteEUsRUFBUWo0RCxFQUFRblcsR0FDcEJwRixLQUFLaUUsSUFBSXV2RSxFQUFNLEdBQUlBLEVBQU0sS0E4RzdCLFNBQVNFLEdBQVNuNEQsR0FDaEIsSUFBSW5XLEdBQVMsRUFDVC9DLEVBQW9CLE1BQVhrWixFQUFrQixFQUFJQSxFQUFRbFosT0FHM0MsSUFEQXJDLEtBQUt1ekUsVUFDSW51RSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJbXhFLEVBQVFqNEQsRUFBUW5XLEdBQ3BCcEYsS0FBS2lFLElBQUl1dkUsRUFBTSxHQUFJQSxFQUFNLEtBaUc3QixTQUFTRyxHQUFTNWlFLEdBQ2hCLElBQUkzTCxHQUFTLEVBQ1QvQyxFQUFtQixNQUFWME8sRUFBaUIsRUFBSUEsRUFBTzFPLE9BR3pDLElBREFyQyxLQUFLNHpFLFNBQVcsSUFBSUYsS0FDWHR1RSxFQUFRL0MsR0FDZnJDLEtBQUs0SyxJQUFJbUcsRUFBTzNMLElBNkNwQixTQUFTeXVFLEdBQU10NEQsR0FDYixJQUFJc00sRUFBTzduQixLQUFLNHpFLFNBQVcsSUFBSUgsR0FBVWw0RCxHQUN6Q3ZiLEtBQUtpUixLQUFPNFcsRUFBSzVXLEtBcUduQixTQUFTNmlFLEdBQWMvMUUsRUFBT2cyRSxHQUM1QixJQUFJQyxFQUFReHFELEdBQVF6ckIsR0FDaEJrMkUsR0FBU0QsR0FBU0UsR0FBWW4yRSxHQUM5Qm8yRSxHQUFVSCxJQUFVQyxHQUFTdkQsR0FBUzN5RSxHQUN0Q3EyRSxHQUFVSixJQUFVQyxJQUFVRSxHQUFVMUosR0FBYTFzRSxHQUNyRHMyRSxFQUFjTCxHQUFTQyxHQUFTRSxHQUFVQyxFQUMxQ3AxRCxFQUFTcTFELEVBQWN4SCxHQUFVOXVFLEVBQU1zRSxPQUFRSSxJQUFVLEdBQ3pESixFQUFTMmMsRUFBTzNjLE9BRXBCLElBQUssSUFBSWhFLEtBQU9OLEdBQ1RnMkUsSUFBYXAxRSxHQUFlMUIsS0FBS2MsRUFBT00sSUFDdkNnMkUsSUFFUSxVQUFQaDJFLEdBRUM4MUUsSUFBa0IsVUFBUDkxRSxHQUEwQixVQUFQQSxJQUU5QisxRSxJQUFrQixVQUFQLzFFLEdBQTBCLGNBQVBBLEdBQThCLGNBQVBBLElBRXREaTJFLEdBQVFqMkUsRUFBS2dFLEtBRWxCMmMsRUFBTzVjLEtBQUsvRCxHQUdoQixPQUFPMmdCLEVBVVQsU0FBU3UxRCxHQUFZbnRFLEdBQ25CLElBQUkvRSxFQUFTK0UsRUFBTS9FLE9BQ25CLE9BQU9BLEVBQVMrRSxFQUFNb3RFLEdBQVcsRUFBR255RSxFQUFTLFNBajVFN0NuQixFQTQ1RUYsU0FBU3V6RSxHQUFnQnJ0RSxFQUFPN0ksR0FDOUIsT0FBT20yRSxHQUFZQyxHQUFVdnRFLEdBQVF3dEUsR0FBVXIyRSxFQUFHLEVBQUc2SSxFQUFNL0UsU0FVN0QsU0FBU3d5RSxHQUFhenRFLEdBQ3BCLE9BQU9zdEUsR0FBWUMsR0FBVXZ0RSxJQVkvQixTQUFTMHRFLEdBQWlCdDJFLEVBQVFILEVBQUtOLFNBcDdFckNtRCxJQXE3RUtuRCxJQUF3QmczRSxHQUFHdjJFLEVBQU9ILEdBQU1OLFNBcjdFN0NtRCxJQXM3RUtuRCxLQUF5Qk0sS0FBT0csS0FDbkN3MkUsR0FBZ0J4MkUsRUFBUUgsRUFBS04sR0FjakMsU0FBU2szRSxHQUFZejJFLEVBQVFILEVBQUtOLEdBQ2hDLElBQUltM0UsRUFBVzEyRSxFQUFPSCxHQUNoQk0sR0FBZTFCLEtBQUt1QixFQUFRSCxJQUFRMDJFLEdBQUdHLEVBQVVuM0UsVUF2OEV2RG1ELElBdzhFS25ELEdBQXlCTSxLQUFPRyxJQUNuQ3cyRSxHQUFnQngyRSxFQUFRSCxFQUFLTixHQVlqQyxTQUFTbzNFLEdBQWEvdEUsRUFBTy9JLEdBRTNCLElBREEsSUFBSWdFLEVBQVMrRSxFQUFNL0UsT0FDWkEsS0FDTCxHQUFJMHlFLEdBQUczdEUsRUFBTS9FLEdBQVEsR0FBSWhFLEdBQ3ZCLE9BQU9nRSxFQUdYLE9BQVEsRUFjVixTQUFTK3lFLEdBQWVuSixFQUFZckIsRUFBUUMsRUFBVUMsR0FJcEQsT0FIQXVLLEdBQVNwSixHQUFZLFNBQVNsdUUsRUFBT00sRUFBSzR0RSxHQUN4Q3JCLEVBQU9FLEVBQWEvc0UsRUFBTzhzRSxFQUFTOXNFLEdBQVFrdUUsTUFFdkNuQixFQVlULFNBQVN3SyxHQUFXOTJFLEVBQVF5akMsR0FDMUIsT0FBT3pqQyxHQUFVKzJFLEdBQVd0ekMsRUFBUXg4QixHQUFLdzhCLEdBQVN6akMsR0F5QnBELFNBQVN3MkUsR0FBZ0J4MkUsRUFBUUgsRUFBS04sR0FDekIsYUFBUE0sR0FBc0JaLEdBQ3hCQSxHQUFlZSxFQUFRSCxFQUFLLENBQzFCLGNBQWdCLEVBQ2hCLFlBQWMsRUFDZCxNQUFTTixFQUNULFVBQVksSUFHZFMsRUFBT0gsR0FBT04sRUFZbEIsU0FBU3kzRSxHQUFPaDNFLEVBQVFtcEMsR0FNdEIsSUFMQSxJQUFJdmlDLEdBQVMsRUFDVC9DLEVBQVNzbEMsRUFBTXRsQyxPQUNmMmMsRUFBU3hiLEVBQU1uQixHQUNmcXZDLEVBQWlCLE1BQVZsekMsSUFFRjRHLEVBQVEvQyxHQUNmMmMsRUFBTzVaLEdBQVNzc0MsT0FoakZsQnh3QyxFQWdqRnFDdkQsR0FBSWEsRUFBUW1wQyxFQUFNdmlDLElBRXZELE9BQU80WixFQVlULFNBQVM0MUQsR0FBVXpuRCxFQUFRc29ELEVBQU96dkIsR0FTaEMsT0FSSTc0QixHQUFXQSxTQS9qRmZqc0IsSUFna0ZNOGtELElBQ0Y3NEIsRUFBU0EsR0FBVTY0QixFQUFRNzRCLEVBQVM2NEIsUUFqa0Z4QzlrRCxJQW1rRk11MEUsSUFDRnRvRCxFQUFTQSxHQUFVc29ELEVBQVF0b0QsRUFBU3NvRCxJQUdqQ3RvRCxFQW1CVCxTQUFTdW9ELEdBQVUzM0UsRUFBTzQzRSxFQUFTQyxFQUFZdjNFLEVBQUtHLEVBQVFxckIsR0FDMUQsSUFBSTdLLEVBQ0E2MkQsRUFya0ZjLEVBcWtGTEYsRUFDVEcsRUFya0ZjLEVBcWtGTEgsRUFDVEksRUFya0ZpQixFQXFrRlJKLEVBS2IsR0FISUMsSUFDRjUyRCxFQUFTeGdCLEVBQVNvM0UsRUFBVzczRSxFQUFPTSxFQUFLRyxFQUFRcXJCLEdBQVMrckQsRUFBVzczRSxTQWptRnZFbUQsSUFtbUZJOGQsRUFDRixPQUFPQSxFQUVULElBQUt5ekQsR0FBUzEwRSxHQUNaLE9BQU9BLEVBRVQsSUFBSWkyRSxFQUFReHFELEdBQVF6ckIsR0FDcEIsR0FBSWkyRSxHQUVGLEdBREFoMUQsRUE2OEdKLFNBQXdCNVgsR0FDdEIsSUFBSS9FLEVBQVMrRSxFQUFNL0UsT0FDZjJjLEVBQVMsSUFBSTVYLEVBQU1yQixZQUFZMUQsR0FHL0JBLEdBQTZCLGlCQUFaK0UsRUFBTSxJQUFrQnpJLEdBQWUxQixLQUFLbUssRUFBTyxXQUN0RTRYLEVBQU81WixNQUFRZ0MsRUFBTWhDLE1BQ3JCNFosRUFBT3VNLE1BQVFua0IsRUFBTW1rQixPQUV2QixPQUFPdk0sRUF0OUdJZzNELENBQWVqNEUsSUFDbkI4M0UsRUFDSCxPQUFPbEIsR0FBVTUyRSxFQUFPaWhCLE9BRXJCLENBQ0wsSUFBSWkzRCxFQUFNQyxHQUFPbjRFLEdBQ2JvNEUsRUFBU0YsR0FBT3BTLEdBQVdvUyxHQUFPblMsRUFFdEMsR0FBSTRNLEdBQVMzeUUsR0FDWCxPQUFPcTRFLEdBQVlyNEUsRUFBTzgzRSxHQUU1QixHQUFJSSxHQUFPaFMsR0FBYWdTLEdBQU96UyxHQUFZMlMsSUFBVzMzRSxHQUVwRCxHQURBd2dCLEVBQVU4MkQsR0FBVUssRUFBVSxHQUFLRSxHQUFnQnQ0RSxJQUM5QzgzRSxFQUNILE9BQU9DLEVBK25FZixTQUF1Qjd6QyxFQUFRempDLEdBQzdCLE9BQU8rMkUsR0FBV3R6QyxFQUFRcTBDLEdBQWFyMEMsR0FBU3pqQyxHQS9uRXRDKzNFLENBQWN4NEUsRUFuSDFCLFNBQXNCUyxFQUFReWpDLEdBQzVCLE9BQU96akMsR0FBVSsyRSxHQUFXdHpDLEVBQVF1MEMsR0FBT3YwQyxHQUFTempDLEdBa0hyQmk0RSxDQUFhejNELEVBQVFqaEIsSUFrbkV0RCxTQUFxQmtrQyxFQUFRempDLEdBQzNCLE9BQU8rMkUsR0FBV3R6QyxFQUFReTBDLEdBQVd6MEMsR0FBU3pqQyxHQWxuRXBDbTRFLENBQVk1NEUsRUFBT3UzRSxHQUFXdDJELEVBQVFqaEIsUUFFdkMsQ0FDTCxJQUFLa3JFLEdBQWNnTixHQUNqQixPQUFPejNFLEVBQVNULEVBQVEsR0FFMUJpaEIsRUE0OUdOLFNBQXdCeGdCLEVBQVF5M0UsRUFBS0osR0FDbkMsSUFBSTU3QyxFQUFPejdCLEVBQU91SCxZQUNsQixPQUFRa3dFLEdBQ04sS0FBSzFSLEVBQ0gsT0FBT3pyQyxHQUFpQnQ2QixHQUUxQixLQUFLa2xFLEVBQ0wsS0FBS0MsRUFDSCxPQUFPLElBQUkxcEMsR0FBTXo3QixHQUVuQixLQUFLZ21FLEVBQ0gsT0E1bkROLFNBQXVCb1MsRUFBVWYsR0FDL0IsSUFBSXR1RCxFQUFTc3VELEVBQVMvOEMsR0FBaUI4OUMsRUFBU3J2RCxRQUFVcXZELEVBQVNydkQsT0FDbkUsT0FBTyxJQUFJcXZELEVBQVM3d0UsWUFBWXdoQixFQUFRcXZELEVBQVNDLFdBQVlELEVBQVN4d0QsWUEwbkQzRDB3RCxDQUFjdDRFLEVBQVFxM0UsR0FFL0IsS0FBS3BSLEVBQVksS0FBS0MsRUFDdEIsS0FBS0MsRUFBUyxLQUFLQyxFQUFVLEtBQUtDLEVBQ2xDLEtBQUtDLEVBQVUsSUE1L0xDLDZCQTQvTHFCLEtBQUtDLEVBQVcsS0FBS0MsRUFDeEQsT0FBTytSLEdBQWdCdjRFLEVBQVFxM0UsR0FFakMsS0FBSzlSLEVBQ0gsT0FBTyxJQUFJOXBDLEVBRWIsS0FBSytwQyxFQUNMLEtBQUtJLEVBQ0gsT0FBTyxJQUFJbnFDLEVBQUt6N0IsR0FFbEIsS0FBSzBsRSxFQUNILE9BL25ETixTQUFxQng0QyxHQUNuQixJQUFJMU0sRUFBUyxJQUFJME0sRUFBTzNsQixZQUFZMmxCLEVBQU91VyxPQUFRd2tDLEdBQVE5a0MsS0FBS2pXLElBRWhFLE9BREExTSxFQUFPc3ZELFVBQVk1aUQsRUFBTzRpRCxVQUNuQnR2RCxFQTRuRElnNEQsQ0FBWXg0RSxHQUVyQixLQUFLMmxFLEVBQ0gsT0FBTyxJQUFJbHFDLEVBRWIsS0FBS29xQyxFQUNILE9BeG5EZTRTLEVBd25ESXo0RSxFQXZuRGhCd3pFLEdBQWdCeDBFLEdBQU93MEUsR0FBYy8wRSxLQUFLZzZFLElBQVcsR0FEOUQsSUFBcUJBLEVBcDRETkMsQ0FBZW41RSxFQUFPazRFLEVBQUtKLElBSXhDaHNELElBQVVBLEVBQVEsSUFBSWdxRCxJQUN0QixJQUFJc0QsRUFBVXR0RCxFQUFNbHNCLElBQUlJLEdBQ3hCLEdBQUlvNUUsRUFDRixPQUFPQSxFQUVUdHRELEVBQU01bEIsSUFBSWxHLEVBQU9paEIsR0FFYnVyRCxHQUFNeHNFLEdBQ1JBLEVBQU00TCxTQUFRLFNBQVN5dEUsR0FDckJwNEQsRUFBT3BVLElBQUk4cUUsR0FBVTBCLEVBQVV6QixFQUFTQyxFQUFZd0IsRUFBVXI1RSxFQUFPOHJCLE9BRTlEc2dELEdBQU1wc0UsSUFDZkEsRUFBTTRMLFNBQVEsU0FBU3l0RSxFQUFVLzRFLEdBQy9CMmdCLEVBQU8vYSxJQUFJNUYsRUFBS3EzRSxHQUFVMEIsRUFBVXpCLEVBQVNDLEVBQVl2M0UsRUFBS04sRUFBTzhyQixPQUl6RSxJQUlJcXpDLEVBQVE4VyxPQTFwRlo5eUUsR0FzcEZlNjBFLEVBQ1ZELEVBQVN1QixHQUFleHhCLEdBQ3hCaXdCLEVBQVNVLEdBQVMvd0UsSUFFa0IxSCxHQVN6QyxPQVJBZ3RFLEdBQVU3TixHQUFTbi9ELEdBQU8sU0FBU3E1RSxFQUFVLzRFLEdBQ3ZDNitELElBRUZrYSxFQUFXcjVFLEVBRFhNLEVBQU0rNEUsSUFJUm5DLEdBQVlqMkQsRUFBUTNnQixFQUFLcTNFLEdBQVUwQixFQUFVekIsRUFBU0MsRUFBWXYzRSxFQUFLTixFQUFPOHJCLE9BRXpFN0ssRUF5QlQsU0FBU3M0RCxHQUFlOTRFLEVBQVF5akMsRUFBUWk3QixHQUN0QyxJQUFJNzZELEVBQVM2NkQsRUFBTTc2RCxPQUNuQixHQUFjLE1BQVY3RCxFQUNGLE9BQVE2RCxFQUdWLElBREE3RCxFQUFTaEIsR0FBT2dCLEdBQ1Q2RCxLQUFVLENBQ2YsSUFBSWhFLEVBQU02K0QsRUFBTTc2RCxHQUNaNm9FLEVBQVlqcEMsRUFBTzVqQyxHQUNuQk4sRUFBUVMsRUFBT0gsR0FFbkIsUUF2c0ZGNkMsSUF1c0ZPbkQsS0FBeUJNLEtBQU9HLEtBQWEwc0UsRUFBVW50RSxHQUMxRCxPQUFPLEVBR1gsT0FBTyxFQWFULFNBQVN3NUUsR0FBVWw5QyxFQUFNbTlDLEVBQU1uNEUsR0FDN0IsR0FBbUIsbUJBQVJnN0IsRUFDVCxNQUFNLElBQUk3NEIsR0FBVTZoRSxHQUV0QixPQUFPeDhELElBQVcsV0FBYXd6QixFQUFLbjdCLFdBNXRGcENnQyxFQTR0RnFEN0IsS0FBVW00RSxHQWNqRSxTQUFTQyxHQUFlcndFLEVBQU8ySixFQUFRODVELEVBQVU5aUMsR0FDL0MsSUFBSTNpQyxHQUFTLEVBQ1RzeUUsRUFBV3JNLEdBQ1hzTSxHQUFXLEVBQ1h0MUUsRUFBUytFLEVBQU0vRSxPQUNmMmMsRUFBUyxHQUNUNDRELEVBQWU3bUUsRUFBTzFPLE9BRTFCLElBQUtBLEVBQ0gsT0FBTzJjLEVBRUw2ckQsSUFDRjk1RCxFQUFTeTZELEdBQVN6NkQsRUFBUWk4RCxHQUFVbkMsS0FFbEM5aUMsR0FDRjJ2QyxFQUFXbk0sR0FDWG9NLEdBQVcsR0FFSjVtRSxFQUFPMU8sUUF0dkZHLE1BdXZGakJxMUUsRUFBV3hLLEdBQ1h5SyxHQUFXLEVBQ1g1bUUsRUFBUyxJQUFJNGlFLEdBQVM1aUUsSUFFeEI4bUUsRUFDQSxPQUFTenlFLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUl0RSxFQUFRcUosRUFBTWhDLEdBQ2QweUUsRUFBdUIsTUFBWmpOLEVBQW1COXNFLEVBQVE4c0UsRUFBUzlzRSxHQUduRCxHQURBQSxFQUFTZ3FDLEdBQXdCLElBQVZocUMsRUFBZUEsRUFBUSxFQUMxQzQ1RSxHQUFZRyxHQUFhQSxFQUFVLENBRXJDLElBREEsSUFBSUMsRUFBY0gsRUFDWEcsS0FDTCxHQUFJaG5FLEVBQU9nbkUsS0FBaUJELEVBQzFCLFNBQVNELEVBR2I3NEQsRUFBTzVjLEtBQUtyRSxRQUVKMjVFLEVBQVMzbUUsRUFBUSttRSxFQUFVL3ZDLElBQ25DL29CLEVBQU81YyxLQUFLckUsR0FHaEIsT0FBT2loQixFQWprQ1RtekQsR0FBTzZGLGlCQUFtQixDQVF4QixPQUFVeFMsRUFRVixTQUFZQyxFQVFaLFlBQWVDLEVBUWYsU0FBWSxHQVFaLFFBQVcsQ0FRVCxFQUFLeU0sS0FLVEEsR0FBT3p6RSxVQUFZZzBFLEdBQVdoMEUsVUFDOUJ5ekUsR0FBT3p6RSxVQUFVcUgsWUFBY29zRSxHQUUvQkcsR0FBYzV6RSxVQUFZOHpFLEdBQVdFLEdBQVdoMEUsV0FDaEQ0ekUsR0FBYzV6RSxVQUFVcUgsWUFBY3VzRSxHQXNIdENELEdBQVkzekUsVUFBWTh6RSxHQUFXRSxHQUFXaDBFLFdBQzlDMnpFLEdBQVkzekUsVUFBVXFILFlBQWNzc0UsR0FvR3BDaUIsR0FBSzUwRSxVQUFVNjBFLE1BdkVmLFdBQ0V2ekUsS0FBSzR6RSxTQUFXdEMsR0FBZUEsR0FBYSxNQUFRLEdBQ3BEdHhFLEtBQUtpUixLQUFPLEdBc0VkcWlFLEdBQUs1MEUsVUFBa0IsT0F6RHZCLFNBQW9CTCxHQUNsQixJQUFJMmdCLEVBQVNoZixLQUFLNFEsSUFBSXZTLFdBQWUyQixLQUFLNHpFLFNBQVN2MUUsR0FFbkQsT0FEQTJCLEtBQUtpUixNQUFRK04sRUFBUyxFQUFJLEVBQ25CQSxHQXVEVHMwRCxHQUFLNTBFLFVBQVVmLElBM0NmLFNBQWlCVSxHQUNmLElBQUl3cEIsRUFBTzduQixLQUFLNHpFLFNBQ2hCLEdBQUl0QyxHQUFjLENBQ2hCLElBQUl0eUQsRUFBUzZJLEVBQUt4cEIsR0FDbEIsTUFwN0RlLDhCQW83RFIyZ0IsT0FsOERUOWQsRUFrOERpRDhkLEVBRWpELE9BQU9yZ0IsR0FBZTFCLEtBQUs0cUIsRUFBTXhwQixHQUFPd3BCLEVBQUt4cEIsUUFwOEQ3QzZDLEdBMCtERm95RSxHQUFLNTBFLFVBQVVrUyxJQTFCZixTQUFpQnZTLEdBQ2YsSUFBSXdwQixFQUFPN25CLEtBQUs0ekUsU0FDaEIsT0FBT3RDLFFBbDlEUHB3RSxJQWs5RHVCMm1CLEVBQUt4cEIsR0FBc0JNLEdBQWUxQixLQUFLNHFCLEVBQU14cEIsSUF5QjlFaTFFLEdBQUs1MEUsVUFBVXVGLElBWmYsU0FBaUI1RixFQUFLTixHQUNwQixJQUFJOHBCLEVBQU83bkIsS0FBSzR6RSxTQUdoQixPQUZBNXpFLEtBQUtpUixNQUFRalIsS0FBSzRRLElBQUl2UyxHQUFPLEVBQUksRUFDakN3cEIsRUFBS3hwQixHQUFRaXpFLFNBbCtEYnB3RSxJQWsrRDZCbkQsRUFwOURaLDRCQW85RG9EQSxFQUM5RGlDLE1BeUhUeXpFLEdBQVUvMEUsVUFBVTYwRSxNQXBGcEIsV0FDRXZ6RSxLQUFLNHpFLFNBQVcsR0FDaEI1ekUsS0FBS2lSLEtBQU8sR0FtRmR3aUUsR0FBVS8wRSxVQUFrQixPQXZFNUIsU0FBeUJMLEdBQ3ZCLElBQUl3cEIsRUFBTzduQixLQUFLNHpFLFNBQ1p4dUUsRUFBUSt2RSxHQUFhdHRELEVBQU14cEIsR0FFL0IsUUFBSStHLEVBQVEsS0FJUkEsR0FEWXlpQixFQUFLeGxCLE9BQVMsRUFFNUJ3bEIsRUFBS3hpQixNQUVMK2lDLEdBQU9uckMsS0FBSzRxQixFQUFNemlCLEVBQU8sS0FFekJwRixLQUFLaVIsTUFDQSxJQTBEVHdpRSxHQUFVLzBFLFVBQVVmLElBOUNwQixTQUFzQlUsR0FDcEIsSUFBSXdwQixFQUFPN25CLEtBQUs0ekUsU0FDWnh1RSxFQUFRK3ZFLEdBQWF0dEQsRUFBTXhwQixHQUUvQixPQUFPK0csRUFBUSxPQXBqRWZsRSxFQW9qRStCMm1CLEVBQUt6aUIsR0FBTyxJQTJDN0NxdUUsR0FBVS8wRSxVQUFVa1MsSUEvQnBCLFNBQXNCdlMsR0FDcEIsT0FBTzgyRSxHQUFhbjFFLEtBQUs0ekUsU0FBVXYxRSxJQUFRLEdBK0I3Q28xRSxHQUFVLzBFLFVBQVV1RixJQWxCcEIsU0FBc0I1RixFQUFLTixHQUN6QixJQUFJOHBCLEVBQU83bkIsS0FBSzR6RSxTQUNaeHVFLEVBQVErdkUsR0FBYXR0RCxFQUFNeHBCLEdBUS9CLE9BTkkrRyxFQUFRLEtBQ1JwRixLQUFLaVIsS0FDUDRXLEVBQUt6bEIsS0FBSyxDQUFDL0QsRUFBS04sS0FFaEI4cEIsRUFBS3ppQixHQUFPLEdBQUtySCxFQUVaaUMsTUEyR1QwekUsR0FBU2gxRSxVQUFVNjBFLE1BdEVuQixXQUNFdnpFLEtBQUtpUixLQUFPLEVBQ1pqUixLQUFLNHpFLFNBQVcsQ0FDZCxLQUFRLElBQUlOLEdBQ1osSUFBTyxJQUFLcDZDLElBQU91NkMsSUFDbkIsT0FBVSxJQUFJSCxLQWtFbEJJLEdBQVNoMUUsVUFBa0IsT0FyRDNCLFNBQXdCTCxHQUN0QixJQUFJMmdCLEVBQVNpNUQsR0FBV2o0RSxLQUFNM0IsR0FBYSxPQUFFQSxHQUU3QyxPQURBMkIsS0FBS2lSLE1BQVErTixFQUFTLEVBQUksRUFDbkJBLEdBbURUMDBELEdBQVNoMUUsVUFBVWYsSUF2Q25CLFNBQXFCVSxHQUNuQixPQUFPNDVFLEdBQVdqNEUsS0FBTTNCLEdBQUtWLElBQUlVLElBdUNuQ3ExRSxHQUFTaDFFLFVBQVVrUyxJQTNCbkIsU0FBcUJ2UyxHQUNuQixPQUFPNDVFLEdBQVdqNEUsS0FBTTNCLEdBQUt1UyxJQUFJdlMsSUEyQm5DcTFFLEdBQVNoMUUsVUFBVXVGLElBZG5CLFNBQXFCNUYsRUFBS04sR0FDeEIsSUFBSThwQixFQUFPb3dELEdBQVdqNEUsS0FBTTNCLEdBQ3hCNFMsRUFBTzRXLEVBQUs1VyxLQUloQixPQUZBNFcsRUFBSzVqQixJQUFJNUYsRUFBS04sR0FDZGlDLEtBQUtpUixNQUFRNFcsRUFBSzVXLE1BQVFBLEVBQU8sRUFBSSxFQUM5QmpSLE1BMkRUMnpFLEdBQVNqMUUsVUFBVWtNLElBQU0rb0UsR0FBU2oxRSxVQUFVMEQsS0FuQjVDLFNBQXFCckUsR0FFbkIsT0FEQWlDLEtBQUs0ekUsU0FBUzN2RSxJQUFJbEcsRUExdEVELDZCQTJ0RVZpQyxNQWtCVDJ6RSxHQUFTajFFLFVBQVVrUyxJQU5uQixTQUFxQjdTLEdBQ25CLE9BQU9pQyxLQUFLNHpFLFNBQVNoakUsSUFBSTdTLElBdUczQjgxRSxHQUFNbjFFLFVBQVU2MEUsTUEzRWhCLFdBQ0V2ekUsS0FBSzR6RSxTQUFXLElBQUlILEdBQ3BCenpFLEtBQUtpUixLQUFPLEdBMEVkNGlFLEdBQU1uMUUsVUFBa0IsT0E5RHhCLFNBQXFCTCxHQUNuQixJQUFJd3BCLEVBQU83bkIsS0FBSzR6RSxTQUNaNTBELEVBQVM2SSxFQUFhLE9BQUV4cEIsR0FHNUIsT0FEQTJCLEtBQUtpUixLQUFPNFcsRUFBSzVXLEtBQ1YrTixHQTBEVDYwRCxHQUFNbjFFLFVBQVVmLElBOUNoQixTQUFrQlUsR0FDaEIsT0FBTzJCLEtBQUs0ekUsU0FBU2oyRSxJQUFJVSxJQThDM0J3MUUsR0FBTW4xRSxVQUFVa1MsSUFsQ2hCLFNBQWtCdlMsR0FDaEIsT0FBTzJCLEtBQUs0ekUsU0FBU2hqRSxJQUFJdlMsSUFrQzNCdzFFLEdBQU1uMUUsVUFBVXVGLElBckJoQixTQUFrQjVGLEVBQUtOLEdBQ3JCLElBQUk4cEIsRUFBTzduQixLQUFLNHpFLFNBQ2hCLEdBQUkvckQsYUFBZ0I0ckQsR0FBVyxDQUM3QixJQUFJeUUsRUFBUXJ3RCxFQUFLK3JELFNBQ2pCLElBQUsxNkMsSUFBUWcvQyxFQUFNNzFFLE9BQVM4MUUsSUFHMUIsT0FGQUQsRUFBTTkxRSxLQUFLLENBQUMvRCxFQUFLTixJQUNqQmlDLEtBQUtpUixPQUFTNFcsRUFBSzVXLEtBQ1pqUixLQUVUNm5CLEVBQU83bkIsS0FBSzR6RSxTQUFXLElBQUlGLEdBQVN3RSxHQUl0QyxPQUZBcndELEVBQUs1akIsSUFBSTVGLEVBQUtOLEdBQ2RpQyxLQUFLaVIsS0FBTzRXLEVBQUs1VyxLQUNWalIsTUFzY1QsSUFBSXExRSxHQUFXK0MsR0FBZUMsSUFVMUJDLEdBQWdCRixHQUFlRyxJQUFpQixHQVdwRCxTQUFTQyxHQUFVdk0sRUFBWWYsR0FDN0IsSUFBSWxzRCxHQUFTLEVBS2IsT0FKQXEyRCxHQUFTcEosR0FBWSxTQUFTbHVFLEVBQU9xSCxFQUFPNm1FLEdBRTFDLE9BREFqdEQsSUFBV2tzRCxFQUFVbnRFLEVBQU9xSCxFQUFPNm1FLE1BRzlCanRELEVBYVQsU0FBU3k1RCxHQUFhcnhFLEVBQU95akUsRUFBVTlpQyxHQUlyQyxJQUhBLElBQUkzaUMsR0FBUyxFQUNUL0MsRUFBUytFLEVBQU0vRSxTQUVWK0MsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSXRFLEVBQVFxSixFQUFNaEMsR0FDZDRpQixFQUFVNmlELEVBQVM5c0UsR0FFdkIsR0FBZSxNQUFYaXFCLFNBLzBGTjltQixJQSswRjBCNDJFLEVBQ2Y5dkQsR0FBWUEsSUFBWTB3RCxHQUFTMXdELEdBQ2xDK2YsRUFBVy9mLEVBQVM4dkQsSUFFMUIsSUFBSUEsRUFBVzl2RCxFQUNYaEosRUFBU2poQixFQUdqQixPQUFPaWhCLEVBdUNULFNBQVMyNUQsR0FBVzFNLEVBQVlmLEdBQzlCLElBQUlsc0QsRUFBUyxHQU1iLE9BTEFxMkQsR0FBU3BKLEdBQVksU0FBU2x1RSxFQUFPcUgsRUFBTzZtRSxHQUN0Q2YsRUFBVW50RSxFQUFPcUgsRUFBTzZtRSxJQUMxQmp0RCxFQUFPNWMsS0FBS3JFLE1BR1RpaEIsRUFjVCxTQUFTNDVELEdBQVl4eEUsRUFBT3dpQyxFQUFPc2hDLEVBQVcyTixFQUFVNzVELEdBQ3RELElBQUk1WixHQUFTLEVBQ1QvQyxFQUFTK0UsRUFBTS9FLE9BS25CLElBSEE2b0UsSUFBY0EsRUFBWTROLElBQzFCOTVELElBQVdBLEVBQVMsTUFFWDVaLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUl0RSxFQUFRcUosRUFBTWhDLEdBQ2R3a0MsRUFBUSxHQUFLc2hDLEVBQVVudEUsR0FDckI2ckMsRUFBUSxFQUVWZ3ZDLEdBQVk3NkUsRUFBTzZyQyxFQUFRLEVBQUdzaEMsRUFBVzJOLEVBQVU3NUQsR0FFbkR5c0QsR0FBVXpzRCxFQUFRamhCLEdBRVY4NkUsSUFDVjc1RCxFQUFPQSxFQUFPM2MsUUFBVXRFLEdBRzVCLE9BQU9paEIsRUFjVCxJQUFJKzVELEdBQVVDLEtBWVZDLEdBQWVELElBQWMsR0FVakMsU0FBU1gsR0FBVzc1RSxFQUFRcXNFLEdBQzFCLE9BQU9yc0UsR0FBVXU2RSxHQUFRdjZFLEVBQVFxc0UsRUFBVXBsRSxJQVc3QyxTQUFTOHlFLEdBQWdCLzVFLEVBQVFxc0UsR0FDL0IsT0FBT3JzRSxHQUFVeTZFLEdBQWF6NkUsRUFBUXFzRSxFQUFVcGxFLElBWWxELFNBQVN5ekUsR0FBYzE2RSxFQUFRMCtELEdBQzdCLE9BQU9pTyxHQUFZak8sR0FBTyxTQUFTNytELEdBQ2pDLE9BQU84NkUsR0FBVzM2RSxFQUFPSCxPQVk3QixTQUFTKzZFLEdBQVE1NkUsRUFBUWtSLEdBTXZCLElBSEEsSUFBSXRLLEVBQVEsRUFDUi9DLEdBSEpxTixFQUFPMnBFLEdBQVMzcEUsRUFBTWxSLElBR0o2RCxPQUVELE1BQVY3RCxHQUFrQjRHLEVBQVEvQyxHQUMvQjdELEVBQVNBLEVBQU84NkUsR0FBTTVwRSxFQUFLdEssT0FFN0IsT0FBUUEsR0FBU0EsR0FBUy9DLEVBQVU3RCxPQTMvRnBDMEMsRUF5Z0dGLFNBQVNxNEUsR0FBZS82RSxFQUFRZzdFLEVBQVVDLEdBQ3hDLElBQUl6NkQsRUFBU3c2RCxFQUFTaDdFLEdBQ3RCLE9BQU9nckIsR0FBUWhyQixHQUFVd2dCLEVBQVN5c0QsR0FBVXpzRCxFQUFReTZELEVBQVlqN0UsSUFVbEUsU0FBU2s3RSxHQUFXMzdFLEdBQ2xCLE9BQWEsTUFBVEEsT0F0aEdKbUQsSUF1aEdTbkQsRUFuN0ZNLHFCQVJMLGdCQTY3RkZreUUsSUFBa0JBLE1BQWtCenlFLEdBQU9PLEdBMjNGckQsU0FBbUJBLEdBQ2pCLElBQUk0N0UsRUFBUWg3RSxHQUFlMUIsS0FBS2MsRUFBT2t5RSxJQUNuQ2dHLEVBQU1sNEUsRUFBTWt5RSxJQUVoQixJQUNFbHlFLEVBQU1reUUsU0F6NUxSL3VFLEVBMDVMRSxJQUFJMDRFLEdBQVcsRUFDZixNQUFPamtFLElBRVQsSUFBSXFKLEVBQVNxd0QsR0FBcUJweUUsS0FBS2MsR0FDbkM2N0UsSUFDRUQsRUFDRjU3RSxFQUFNa3lFLElBQWtCZ0csU0FFakJsNEUsRUFBTWt5RSxLQUdqQixPQUFPanhELEVBMzRGSDY2RCxDQUFVOTdFLEdBKzVHaEIsU0FBd0JBLEdBQ3RCLE9BQU9zeEUsR0FBcUJweUUsS0FBS2MsR0EvNUc3Qis3RSxDQUFlLzdFLEdBWXJCLFNBQVNnOEUsR0FBT2g4RSxFQUFPa2pCLEdBQ3JCLE9BQU9sakIsRUFBUWtqQixFQVdqQixTQUFTKzRELEdBQVF4N0UsRUFBUUgsR0FDdkIsT0FBaUIsTUFBVkcsR0FBa0JHLEdBQWUxQixLQUFLdUIsRUFBUUgsR0FXdkQsU0FBUzQ3RSxHQUFVejdFLEVBQVFILEdBQ3pCLE9BQWlCLE1BQVZHLEdBQWtCSCxLQUFPYixHQUFPZ0IsR0EwQnpDLFNBQVMwN0UsR0FBaUJDLEVBQVF0UCxFQUFVOWlDLEdBUzFDLElBUkEsSUFBSTJ2QyxFQUFXM3ZDLEVBQWF3akMsR0FBb0JGLEdBQzVDaHBFLEVBQVM4M0UsRUFBTyxHQUFHOTNFLE9BQ25CKzNFLEVBQVlELEVBQU85M0UsT0FDbkJnNEUsRUFBV0QsRUFDWEUsRUFBUzkyRSxFQUFNNDJFLEdBQ2ZHLEVBQVk5aUMsSUFDWno0QixFQUFTLEdBRU5xN0QsS0FBWSxDQUNqQixJQUFJanpFLEVBQVEreUUsRUFBT0UsR0FDZkEsR0FBWXhQLElBQ2R6akUsRUFBUW9rRSxHQUFTcGtFLEVBQU80bEUsR0FBVW5DLEtBRXBDMFAsRUFBWXhKLEdBQVUzcEUsRUFBTS9FLE9BQVFrNEUsR0FDcENELEVBQU9ELElBQWF0eUMsSUFBZThpQyxHQUFheG9FLEdBQVUsS0FBTytFLEVBQU0vRSxRQUFVLEtBQzdFLElBQUlzeEUsR0FBUzBHLEdBQVlqekUsUUExbUcvQmxHLEVBNm1HQWtHLEVBQVEreUUsRUFBTyxHQUVmLElBQUkvMEUsR0FBUyxFQUNUbzFFLEVBQU9GLEVBQU8sR0FFbEJ6QyxFQUNBLE9BQVN6eUUsRUFBUS9DLEdBQVUyYyxFQUFPM2MsT0FBU2s0RSxHQUFXLENBQ3BELElBQUl4OEUsRUFBUXFKLEVBQU1oQyxHQUNkMHlFLEVBQVdqTixFQUFXQSxFQUFTOXNFLEdBQVNBLEVBRzVDLEdBREFBLEVBQVNncUMsR0FBd0IsSUFBVmhxQyxFQUFlQSxFQUFRLElBQ3hDeThFLEVBQ0V0TixHQUFTc04sRUFBTTFDLEdBQ2ZKLEVBQVMxNEQsRUFBUTg0RCxFQUFVL3ZDLElBQzVCLENBRUwsSUFEQXN5QyxFQUFXRCxJQUNGQyxHQUFVLENBQ2pCLElBQUlsTixFQUFRbU4sRUFBT0QsR0FDbkIsS0FBTWxOLEVBQ0VELEdBQVNDLEVBQU8ySyxHQUNoQkosRUFBU3lDLEVBQU9FLEdBQVd2QyxFQUFVL3ZDLElBRTNDLFNBQVM4dkMsRUFHVDJDLEdBQ0ZBLEVBQUtwNEUsS0FBSzAxRSxHQUVaOTRELEVBQU81YyxLQUFLckUsSUFHaEIsT0FBT2loQixFQStCVCxTQUFTeTdELEdBQVdqOEUsRUFBUWtSLEVBQU1yUSxHQUdoQyxJQUFJZzdCLEVBQWlCLE9BRHJCNzdCLEVBQVNzUCxHQUFPdFAsRUFEaEJrUixFQUFPMnBFLEdBQVMzcEUsRUFBTWxSLEtBRU1BLEVBQVNBLEVBQU84NkUsR0FBTXZoQixHQUFLcm9ELEtBQ3ZELE9BQWUsTUFBUjJxQixPQS9xR1BuNUIsRUErcUdrQ2hDLEdBQU1tN0IsRUFBTTc3QixFQUFRYSxHQVV4RCxTQUFTcTdFLEdBQWdCMzhFLEdBQ3ZCLE9BQU9xMEUsR0FBYXIwRSxJQUFVMjdFLEdBQVczN0UsSUFBVXlsRSxFQXVDckQsU0FBU21YLEdBQVk1OEUsRUFBT2tqQixFQUFPMDBELEVBQVNDLEVBQVkvckQsR0FDdEQsT0FBSTlyQixJQUFVa2pCLElBR0QsTUFBVGxqQixHQUEwQixNQUFUa2pCLElBQW1CbXhELEdBQWFyMEUsS0FBV3EwRSxHQUFhbnhELEdBQ3BFbGpCLEdBQVVBLEdBQVNrakIsR0FBVUEsRUFtQnhDLFNBQXlCemlCLEVBQVF5aUIsRUFBTzAwRCxFQUFTQyxFQUFZZ0YsRUFBVy93RCxHQUN0RSxJQUFJZ3hELEVBQVdyeEQsR0FBUWhyQixHQUNuQnM4RSxFQUFXdHhELEdBQVF2SSxHQUNuQjg1RCxFQUFTRixFQUFXcFgsRUFBV3lTLEdBQU8xM0UsR0FDdEN3OEUsRUFBU0YsRUFBV3JYLEVBQVd5UyxHQUFPajFELEdBS3RDZzZELEdBSEpGLEVBQVNBLEdBQVV2WCxFQUFVUyxFQUFZOFcsSUFHaEI5VyxFQUNyQmlYLEdBSEpGLEVBQVNBLEdBQVV4WCxFQUFVUyxFQUFZK1csSUFHaEIvVyxFQUNyQmtYLEVBQVlKLEdBQVVDLEVBRTFCLEdBQUlHLEdBQWF6SyxHQUFTbHlFLEdBQVMsQ0FDakMsSUFBS2t5RSxHQUFTenZELEdBQ1osT0FBTyxFQUVUNDVELEdBQVcsRUFDWEksR0FBVyxFQUViLEdBQUlFLElBQWNGLEVBRWhCLE9BREFweEQsSUFBVUEsRUFBUSxJQUFJZ3FELElBQ2RnSCxHQUFZcFEsR0FBYWpzRSxHQUM3QjQ4RSxHQUFZNThFLEVBQVF5aUIsRUFBTzAwRCxFQUFTQyxFQUFZZ0YsRUFBVy93RCxHQTgxRW5FLFNBQW9CcnJCLEVBQVF5aUIsRUFBT2cxRCxFQUFLTixFQUFTQyxFQUFZZ0YsRUFBVy93RCxHQUN0RSxPQUFRb3NELEdBQ04sS0FBS3pSLEVBQ0gsR0FBS2htRSxFQUFPNG5CLFlBQWNuRixFQUFNbUYsWUFDM0I1bkIsRUFBT3E0RSxZQUFjNTFELEVBQU00MUQsV0FDOUIsT0FBTyxFQUVUcjRFLEVBQVNBLEVBQU8rb0IsT0FDaEJ0RyxFQUFRQSxFQUFNc0csT0FFaEIsS0FBS2c5QyxFQUNILFFBQUsvbEUsRUFBTzRuQixZQUFjbkYsRUFBTW1GLGFBQzNCdzBELEVBQVUsSUFBSXIwRCxHQUFXL25CLEdBQVMsSUFBSStuQixHQUFXdEYsS0FLeEQsS0FBS3lpRCxFQUNMLEtBQUtDLEVBQ0wsS0FBS0ssRUFHSCxPQUFPK1EsSUFBSXYyRSxHQUFTeWlCLEdBRXRCLEtBQUsyaUQsRUFDSCxPQUFPcGxFLEVBQU9uQixNQUFRNGpCLEVBQU01akIsTUFBUW1CLEVBQU9pRyxTQUFXd2MsRUFBTXhjLFFBRTlELEtBQUt5L0QsRUFDTCxLQUFLRSxFQUlILE9BQU81bEUsR0FBV3lpQixFQUFRLEdBRTVCLEtBQUs4aUQsRUFDSCxJQUFJc1gsRUFBVXROLEdBRWhCLEtBQUs1SixFQUNILElBQUltWCxFQXhuTGUsRUF3bkxIM0YsRUFHaEIsR0FGQTBGLElBQVlBLEVBQVVsTixJQUVsQjN2RSxFQUFPeVMsTUFBUWdRLEVBQU1oUSxPQUFTcXFFLEVBQ2hDLE9BQU8sRUFHVCxJQUFJbkUsRUFBVXR0RCxFQUFNbHNCLElBQUlhLEdBQ3hCLEdBQUkyNEUsRUFDRixPQUFPQSxHQUFXbDJELEVBRXBCMDBELEdBbG9McUIsRUFxb0xyQjlyRCxFQUFNNWxCLElBQUl6RixFQUFReWlCLEdBQ2xCLElBQUlqQyxFQUFTbzhELEdBQVlDLEVBQVE3OEUsR0FBUzY4RSxFQUFRcDZELEdBQVEwMEQsRUFBU0MsRUFBWWdGLEVBQVcvd0QsR0FFMUYsT0FEQUEsRUFBYyxPQUFFcnJCLEdBQ1R3Z0IsRUFFVCxLQUFLcWxELEVBQ0gsR0FBSTJOLEdBQ0YsT0FBT0EsR0FBYy8wRSxLQUFLdUIsSUFBV3d6RSxHQUFjLzBFLEtBQUtna0IsR0FHOUQsT0FBTyxFQTM1RURzNkQsQ0FBVy84RSxFQUFReWlCLEVBQU84NUQsRUFBUXBGLEVBQVNDLEVBQVlnRixFQUFXL3dELEdBRXhFLEtBdnZHdUIsRUF1dkdqQjhyRCxHQUFpQyxDQUNyQyxJQUFJNkYsRUFBZVAsR0FBWXQ4RSxHQUFlMUIsS0FBS3VCLEVBQVEsZUFDdkRpOUUsRUFBZVAsR0FBWXY4RSxHQUFlMUIsS0FBS2drQixFQUFPLGVBRTFELEdBQUl1NkQsR0FBZ0JDLEVBQWMsQ0FDaEMsSUFBSUMsRUFBZUYsRUFBZWg5RSxFQUFPVCxRQUFVUyxFQUMvQ205RSxFQUFlRixFQUFleDZELEVBQU1sakIsUUFBVWtqQixFQUdsRCxPQURBNEksSUFBVUEsRUFBUSxJQUFJZ3FELElBQ2YrRyxFQUFVYyxFQUFjQyxFQUFjaEcsRUFBU0MsRUFBWS9yRCxJQUd0RSxJQUFLc3hELEVBQ0gsT0FBTyxFQUdULE9BREF0eEQsSUFBVUEsRUFBUSxJQUFJZ3FELElBMDVFeEIsU0FBc0JyMUUsRUFBUXlpQixFQUFPMDBELEVBQVNDLEVBQVlnRixFQUFXL3dELEdBQ25FLElBQUl5eEQsRUFqcUxtQixFQWlxTFAzRixFQUNaaUcsRUFBVy8xQixHQUFXcm5ELEdBQ3RCcTlFLEVBQVlELEVBQVN2NUUsT0FFckIrM0UsRUFEV3YwQixHQUFXNWtDLEdBQ0Q1ZSxPQUV6QixHQUFJdzVFLEdBQWF6QixJQUFja0IsRUFDN0IsT0FBTyxFQUVULElBQUlsMkUsRUFBUXkyRSxFQUNaLEtBQU96MkUsS0FBUyxDQUNkLElBQUkvRyxFQUFNdTlFLEVBQVN4MkUsR0FDbkIsS0FBTWsyRSxFQUFZajlFLEtBQU80aUIsRUFBUXRpQixHQUFlMUIsS0FBS2drQixFQUFPNWlCLElBQzFELE9BQU8sRUFJWCxJQUFJeTlFLEVBQWFqeUQsRUFBTWxzQixJQUFJYSxHQUN2QnU5RSxFQUFhbHlELEVBQU1sc0IsSUFBSXNqQixHQUMzQixHQUFJNjZELEdBQWNDLEVBQ2hCLE9BQU9ELEdBQWM3NkQsR0FBUzg2RCxHQUFjdjlFLEVBRTlDLElBQUl3Z0IsR0FBUyxFQUNiNkssRUFBTTVsQixJQUFJekYsRUFBUXlpQixHQUNsQjRJLEVBQU01bEIsSUFBSWdkLEVBQU96aUIsR0FFakIsSUFBSXc5RSxFQUFXVixFQUNmLE9BQVNsMkUsRUFBUXkyRSxHQUFXLENBQzFCeDlFLEVBQU11OUUsRUFBU3gyRSxHQUNmLElBQUk4dkUsRUFBVzEyRSxFQUFPSCxHQUNsQjQ5RSxFQUFXaDdELEVBQU01aUIsR0FFckIsR0FBSXUzRSxFQUNGLElBQUlzRyxFQUFXWixFQUNYMUYsRUFBV3FHLEVBQVUvRyxFQUFVNzJFLEVBQUs0aUIsRUFBT3ppQixFQUFRcXJCLEdBQ25EK3JELEVBQVdWLEVBQVUrRyxFQUFVNTlFLEVBQUtHLEVBQVF5aUIsRUFBTzRJLEdBR3pELFVBbnVMRjNvQixJQW11TFFnN0UsRUFDR2hILElBQWErRyxHQUFZckIsRUFBVTFGLEVBQVUrRyxFQUFVdEcsRUFBU0MsRUFBWS9yRCxHQUM3RXF5RCxHQUNELENBQ0xsOUQsR0FBUyxFQUNULE1BRUZnOUQsSUFBYUEsRUFBa0IsZUFBUDM5RSxHQUUxQixHQUFJMmdCLElBQVdnOUQsRUFBVSxDQUN2QixJQUFJRyxFQUFVMzlFLEVBQU91SCxZQUNqQnEyRSxFQUFVbjdELEVBQU1sYixZQUdoQm8yRSxHQUFXQyxLQUNWLGdCQUFpQjU5RSxNQUFVLGdCQUFpQnlpQixJQUN6QixtQkFBWGs3RCxHQUF5QkEsYUFBbUJBLEdBQ2pDLG1CQUFYQyxHQUF5QkEsYUFBbUJBLElBQ3ZEcDlELEdBQVMsR0FLYixPQUZBNkssRUFBYyxPQUFFcnJCLEdBQ2hCcXJCLEVBQWMsT0FBRTVJLEdBQ1RqQyxFQXY5RUFxOUQsQ0FBYTc5RSxFQUFReWlCLEVBQU8wMEQsRUFBU0MsRUFBWWdGLEVBQVcvd0QsR0EzRDVEeXlELENBQWdCditFLEVBQU9rakIsRUFBTzAwRCxFQUFTQyxFQUFZK0UsR0FBYTl3RCxJQW1GekUsU0FBUzB5RCxHQUFZLzlFLEVBQVF5akMsRUFBUXU2QyxFQUFXNUcsR0FDOUMsSUFBSXh3RSxFQUFRbzNFLEVBQVVuNkUsT0FDbEJBLEVBQVMrQyxFQUNUcTNFLEdBQWdCN0csRUFFcEIsR0FBYyxNQUFWcDNFLEVBQ0YsT0FBUTZELEVBR1YsSUFEQTdELEVBQVNoQixHQUFPZ0IsR0FDVDRHLEtBQVMsQ0FDZCxJQUFJeWlCLEVBQU8yMEQsRUFBVXAzRSxHQUNyQixHQUFLcTNFLEdBQWdCNTBELEVBQUssR0FDbEJBLEVBQUssS0FBT3JwQixFQUFPcXBCLEVBQUssTUFDdEJBLEVBQUssS0FBTXJwQixHQUVuQixPQUFPLEVBR1gsT0FBUzRHLEVBQVEvQyxHQUFRLENBRXZCLElBQUloRSxHQURKd3BCLEVBQU8yMEQsRUFBVXAzRSxJQUNGLEdBQ1g4dkUsRUFBVzEyRSxFQUFPSCxHQUNsQnErRSxFQUFXNzBELEVBQUssR0FFcEIsR0FBSTQwRCxHQUFnQjUwRCxFQUFLLElBQ3ZCLFFBcDFHSjNtQixJQW8xR1FnMEUsS0FBNEI3MkUsS0FBT0csR0FDckMsT0FBTyxNQUVKLENBQ0wsSUFBSXFyQixFQUFRLElBQUlncUQsR0FDaEIsR0FBSStCLEVBQ0YsSUFBSTUyRCxFQUFTNDJELEVBQVdWLEVBQVV3SCxFQUFVcitFLEVBQUtHLEVBQVF5akMsRUFBUXBZLEdBRW5FLFVBNTFHSjNvQixJQTQxR1U4ZCxFQUNFMjdELEdBQVkrQixFQUFVeEgsRUFBVXlILEVBQStDL0csRUFBWS9yRCxHQUMzRjdLLEdBRU4sT0FBTyxHQUliLE9BQU8sRUFXVCxTQUFTNDlELEdBQWE3K0UsR0FDcEIsU0FBSzAwRSxHQUFTMTBFLEtBMDVGRXM4QixFQTE1RmlCdDhCLEVBMjVGeEJveEUsSUFBZUEsTUFBYzkwQyxNQXg1RnhCOCtDLEdBQVdwN0UsR0FBU3d4RSxHQUFhM0ksSUFDaEM1L0QsS0FBSzBxRSxHQUFTM3pFLElBczVGL0IsSUFBa0JzOEIsRUExMkZsQixTQUFTd2lELEdBQWE5K0UsR0FHcEIsTUFBb0IsbUJBQVRBLEVBQ0ZBLEVBRUksTUFBVEEsRUFDSysrRSxHQUVXLGlCQUFULytFLEVBQ0Z5ckIsR0FBUXpyQixHQUNYZy9FLEdBQW9CaC9FLEVBQU0sR0FBSUEsRUFBTSxJQUNwQ2kvRSxHQUFZai9FLEdBRVhVLEdBQVNWLEdBVWxCLFNBQVNrL0UsR0FBU3orRSxHQUNoQixJQUFLMCtFLEdBQVkxK0UsR0FDZixPQUFPcXlFLEdBQVdyeUUsR0FFcEIsSUFBSXdnQixFQUFTLEdBQ2IsSUFBSyxJQUFJM2dCLEtBQU9iLEdBQU9nQixHQUNqQkcsR0FBZTFCLEtBQUt1QixFQUFRSCxJQUFlLGVBQVBBLEdBQ3RDMmdCLEVBQU81YyxLQUFLL0QsR0FHaEIsT0FBTzJnQixFQVVULFNBQVNtK0QsR0FBVzMrRSxHQUNsQixJQUFLaTBFLEdBQVNqMEUsR0FDWixPQTA5RkosU0FBc0JBLEdBQ3BCLElBQUl3Z0IsRUFBUyxHQUNiLEdBQWMsTUFBVnhnQixFQUNGLElBQUssSUFBSUgsS0FBT2IsR0FBT2dCLEdBQ3JCd2dCLEVBQU81YyxLQUFLL0QsR0FHaEIsT0FBTzJnQixFQWorRkVvK0QsQ0FBYTUrRSxHQUV0QixJQUFJNitFLEVBQVVILEdBQVkxK0UsR0FDdEJ3Z0IsRUFBUyxHQUViLElBQUssSUFBSTNnQixLQUFPRyxHQUNELGVBQVBILElBQXlCZy9FLEdBQVkxK0UsR0FBZTFCLEtBQUt1QixFQUFRSCxLQUNyRTJnQixFQUFPNWMsS0FBSy9ELEdBR2hCLE9BQU8yZ0IsRUFZVCxTQUFTcytELEdBQU92L0UsRUFBT2tqQixHQUNyQixPQUFPbGpCLEVBQVFrakIsRUFXakIsU0FBU3M4RCxHQUFRdFIsRUFBWXBCLEdBQzNCLElBQUl6bEUsR0FBUyxFQUNUNFosRUFBU3crRCxHQUFZdlIsR0FBY3pvRSxFQUFNeW9FLEVBQVc1cEUsUUFBVSxHQUtsRSxPQUhBZ3pFLEdBQVNwSixHQUFZLFNBQVNsdUUsRUFBT00sRUFBSzR0RSxHQUN4Q2p0RCxJQUFTNVosR0FBU3lsRSxFQUFTOXNFLEVBQU9NLEVBQUs0dEUsTUFFbENqdEQsRUFVVCxTQUFTZytELEdBQVkvNkMsR0FDbkIsSUFBSXU2QyxFQUFZaUIsR0FBYXg3QyxHQUM3QixPQUF3QixHQUFwQnU2QyxFQUFVbjZFLFFBQWVtNkUsRUFBVSxHQUFHLEdBQ2pDa0IsR0FBd0JsQixFQUFVLEdBQUcsR0FBSUEsRUFBVSxHQUFHLElBRXhELFNBQVNoK0UsR0FDZCxPQUFPQSxJQUFXeWpDLEdBQVVzNkMsR0FBWS85RSxFQUFReWpDLEVBQVF1NkMsSUFZNUQsU0FBU08sR0FBb0JydEUsRUFBTWd0RSxHQUNqQyxPQUFJaUIsR0FBTWp1RSxJQUFTa3VFLEdBQW1CbEIsR0FDN0JnQixHQUF3QnBFLEdBQU01cEUsR0FBT2d0RSxHQUV2QyxTQUFTbCtFLEdBQ2QsSUFBSTAyRSxFQUFXdjNFLEdBQUlhLEVBQVFrUixHQUMzQixZQXpoSEZ4TyxJQXloSFVnMEUsR0FBMEJBLElBQWF3SCxFQUMzQ21CLEdBQU1yL0UsRUFBUWtSLEdBQ2RpckUsR0FBWStCLEVBQVV4SCxFQUFVeUgsSUFleEMsU0FBU21CLEdBQVV0L0UsRUFBUXlqQyxFQUFRODdDLEVBQVVuSSxFQUFZL3JELEdBQ25EcnJCLElBQVd5akMsR0FHZjgyQyxHQUFROTJDLEdBQVEsU0FBU3k2QyxFQUFVcitFLEdBRWpDLEdBREF3ckIsSUFBVUEsRUFBUSxJQUFJZ3FELElBQ2xCcEIsR0FBU2lLLElBK0JqQixTQUF1QmwrRSxFQUFReWpDLEVBQVE1akMsRUFBSzAvRSxFQUFVQyxFQUFXcEksRUFBWS9yRCxHQUMzRSxJQUFJcXJELEVBQVcrSSxHQUFRei9FLEVBQVFILEdBQzNCcStFLEVBQVd1QixHQUFRaDhDLEVBQVE1akMsR0FDM0I4NEUsRUFBVXR0RCxFQUFNbHNCLElBQUkrK0UsR0FFeEIsR0FBSXZGLEVBRUYsWUFEQXJDLEdBQWlCdDJFLEVBQVFILEVBQUs4NEUsR0FHaEMsSUFBSStHLEVBQVd0SSxFQUNYQSxFQUFXVixFQUFVd0gsRUFBV3IrRSxFQUFNLEdBQUtHLEVBQVF5akMsRUFBUXBZLFFBemxIL0Qzb0IsRUE0bEhJeTJFLE9BNWxISnoyRSxJQTRsSGVnOUUsRUFFZixHQUFJdkcsRUFBVSxDQUNaLElBQUkzRCxFQUFReHFELEdBQVFrekQsR0FDaEJ2SSxHQUFVSCxHQUFTdEQsR0FBU2dNLEdBQzVCeUIsR0FBV25LLElBQVVHLEdBQVUxSixHQUFhaVMsR0FFaER3QixFQUFXeEIsRUFDUDFJLEdBQVNHLEdBQVVnSyxFQUNqQjMwRCxHQUFRMHJELEdBQ1ZnSixFQUFXaEosRUFFSmtKLEdBQWtCbEosR0FDekJnSixFQUFXdkosR0FBVU8sR0FFZGYsR0FDUHdELEdBQVcsRUFDWHVHLEVBQVc5SCxHQUFZc0csR0FBVSxJQUUxQnlCLEdBQ1B4RyxHQUFXLEVBQ1h1RyxFQUFXbkgsR0FBZ0IyRixHQUFVLElBR3JDd0IsRUFBVyxHQUdOaGtELEdBQWN3aUQsSUFBYXhJLEdBQVl3SSxJQUM5Q3dCLEVBQVdoSixFQUNQaEIsR0FBWWdCLEdBQ2RnSixFQUFXRyxHQUFjbkosR0FFakJ6QyxHQUFTeUMsS0FBYWlFLEdBQVdqRSxLQUN6Q2dKLEVBQVc3SCxHQUFnQnFHLEtBSTdCL0UsR0FBVyxFQUdYQSxJQUVGOXRELEVBQU01bEIsSUFBSXk0RSxFQUFVd0IsR0FDcEJGLEVBQVVFLEVBQVV4QixFQUFVcUIsRUFBVW5JLEVBQVkvckQsR0FDcERBLEVBQWMsT0FBRTZ5RCxJQUVsQjVILEdBQWlCdDJFLEVBQVFILEVBQUs2L0UsR0F6RjFCSSxDQUFjOS9FLEVBQVF5akMsRUFBUTVqQyxFQUFLMC9FLEVBQVVELEdBQVdsSSxFQUFZL3JELE9BRWpFLENBQ0gsSUFBSXEwRCxFQUFXdEksRUFDWEEsRUFBV3FJLEdBQVF6L0UsRUFBUUgsR0FBTXErRSxFQUFXcitFLEVBQU0sR0FBS0csRUFBUXlqQyxFQUFRcFksUUFyakgvRTNvQixXQXdqSFFnOUUsSUFDRkEsRUFBV3hCLEdBRWI1SCxHQUFpQnQyRSxFQUFRSCxFQUFLNi9FLE1BRS9CMUgsSUF3RkwsU0FBUytILEdBQVFuM0UsRUFBTzdJLEdBQ3RCLElBQUk4RCxFQUFTK0UsRUFBTS9FLE9BQ25CLEdBQUtBLEVBSUwsT0FBT2l5RSxHQURQLzFFLEdBQUtBLEVBQUksRUFBSThELEVBQVMsRUFDSkEsR0FBVStFLEVBQU03SSxRQTNwSGxDMkMsRUF1cUhGLFNBQVNzOUUsR0FBWXZTLEVBQVl3UyxFQUFXQyxHQUV4Q0QsRUFERUEsRUFBVXA4RSxPQUNBbXBFLEdBQVNpVCxHQUFXLFNBQVM1VCxHQUN2QyxPQUFJcmhELEdBQVFxaEQsR0FDSCxTQUFTOXNFLEdBQ2QsT0FBT3E3RSxHQUFRcjdFLEVBQTJCLElBQXBCOHNFLEVBQVN4b0UsT0FBZXdvRSxFQUFTLEdBQUtBLElBR3pEQSxLQUdHLENBQUNpUyxJQUdmLElBQUkxM0UsR0FBUyxFQVViLE9BVEFxNUUsRUFBWWpULEdBQVNpVCxFQUFXelIsR0FBVTJSLE9BbnhGOUMsU0FBb0J2M0UsRUFBT3czRSxHQUN6QixJQUFJdjhFLEVBQVMrRSxFQUFNL0UsT0FHbkIsSUFEQStFLEVBQU1vcUIsS0FBS290RCxHQUNKdjhFLEtBQ0wrRSxFQUFNL0UsR0FBVStFLEVBQU0vRSxHQUFRdEUsTUFFaEMsT0FBT3FKLEVBcXhGRXkzRSxDQVBNdEIsR0FBUXRSLEdBQVksU0FBU2x1RSxFQUFPTSxFQUFLNHRFLEdBSXBELE1BQU8sQ0FBRSxTQUhNVCxHQUFTaVQsR0FBVyxTQUFTNVQsR0FDMUMsT0FBT0EsRUFBUzlzRSxNQUVhLFFBQVdxSCxFQUFPLE1BQVNySCxPQUdsQyxTQUFTUyxFQUFReWlCLEdBQ3pDLE9BMDRCSixTQUF5QnppQixFQUFReWlCLEVBQU95OUQsR0FDdEMsSUFBSXQ1RSxHQUFTLEVBQ1QwNUUsRUFBY3RnRixFQUFPdWdGLFNBQ3JCQyxFQUFjLzlELEVBQU04OUQsU0FDcEIxOEUsRUFBU3k4RSxFQUFZejhFLE9BQ3JCNDhFLEVBQWVQLEVBQU9yOEUsT0FFMUIsT0FBUytDLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUkyYyxFQUFTa2dFLEdBQWlCSixFQUFZMTVFLEdBQVE0NUUsRUFBWTU1RSxJQUM5RCxHQUFJNFosRUFBUSxDQUNWLEdBQUk1WixHQUFTNjVFLEVBQ1gsT0FBT2pnRSxFQUVULElBQUltZ0UsRUFBUVQsRUFBT3Q1RSxHQUNuQixPQUFPNFosR0FBbUIsUUFBVG1nRSxHQUFtQixFQUFJLElBVTVDLE9BQU8zZ0YsRUFBTzRHLE1BQVE2YixFQUFNN2IsTUFsNkJuQmc2RSxDQUFnQjVnRixFQUFReWlCLEVBQU95OUQsTUE0QjFDLFNBQVNXLEdBQVc3Z0YsRUFBUW1wQyxFQUFPdWpDLEdBS2pDLElBSkEsSUFBSTlsRSxHQUFTLEVBQ1QvQyxFQUFTc2xDLEVBQU10bEMsT0FDZjJjLEVBQVMsS0FFSjVaLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUlxTixFQUFPaTRCLEVBQU12aUMsR0FDYnJILEVBQVFxN0UsR0FBUTU2RSxFQUFRa1IsR0FFeEJ3N0QsRUFBVW50RSxFQUFPMlIsSUFDbkI0dkUsR0FBUXRnRSxFQUFRcTZELEdBQVMzcEUsRUFBTWxSLEdBQVNULEdBRzVDLE9BQU9paEIsRUEyQlQsU0FBU3VnRSxHQUFZbjRFLEVBQU8ySixFQUFRODVELEVBQVU5aUMsR0FDNUMsSUFBSW41QixFQUFVbTVCLEVBQWF5a0MsR0FBa0JsQixHQUN6Q2xtRSxHQUFTLEVBQ1QvQyxFQUFTME8sRUFBTzFPLE9BQ2hCbTRFLEVBQU9wekUsRUFRWCxJQU5JQSxJQUFVMkosSUFDWkEsRUFBUzRqRSxHQUFVNWpFLElBRWpCODVELElBQ0YyUCxFQUFPaFAsR0FBU3BrRSxFQUFPNGxFLEdBQVVuQyxPQUUxQnpsRSxFQUFRL0MsR0FLZixJQUpBLElBQUkrcEUsRUFBWSxFQUNacnVFLEVBQVFnVCxFQUFPM0wsR0FDZjB5RSxFQUFXak4sRUFBV0EsRUFBUzlzRSxHQUFTQSxHQUVwQ3F1RSxFQUFZeDlELEVBQVE0ckUsRUFBTTFDLEVBQVUxTCxFQUFXcmtDLEtBQWdCLEdBQ2pFeXlDLElBQVNwekUsR0FDWGdoQyxHQUFPbnJDLEtBQUt1OUUsRUFBTXBPLEVBQVcsR0FFL0Joa0MsR0FBT25yQyxLQUFLbUssRUFBT2dsRSxFQUFXLEdBR2xDLE9BQU9obEUsRUFZVCxTQUFTbzRFLEdBQVdwNEUsRUFBT3E0RSxHQUl6QixJQUhBLElBQUlwOUUsRUFBUytFLEVBQVFxNEUsRUFBUXA5RSxPQUFTLEVBQ2xDaXNFLEVBQVlqc0UsRUFBUyxFQUVsQkEsS0FBVSxDQUNmLElBQUkrQyxFQUFRcTZFLEVBQVFwOUUsR0FDcEIsR0FBSUEsR0FBVWlzRSxHQUFhbHBFLElBQVUyaUIsRUFBVSxDQUM3QyxJQUFJQSxFQUFXM2lCLEVBQ1hrdkUsR0FBUWx2RSxHQUNWZ2pDLEdBQU9uckMsS0FBS21LLEVBQU9oQyxFQUFPLEdBRTFCczZFLEdBQVV0NEUsRUFBT2hDLElBSXZCLE9BQU9nQyxFQVlULFNBQVNvdEUsR0FBV2lCLEVBQU96dkIsR0FDekIsT0FBT3l2QixFQUFRbEYsR0FBWVcsTUFBa0JsckIsRUFBUXl2QixFQUFRLElBa0MvRCxTQUFTa0ssR0FBV3g2QyxFQUFRNW1DLEdBQzFCLElBQUl5Z0IsRUFBUyxHQUNiLElBQUttbUIsR0FBVTVtQyxFQUFJLEdBQUtBLEVBOXlITCxpQkEreUhqQixPQUFPeWdCLEVBSVQsR0FDTXpnQixFQUFJLElBQ055Z0IsR0FBVW1tQixJQUVaNW1DLEVBQUlneUUsR0FBWWh5RSxFQUFJLE1BRWxCNG1DLEdBQVVBLFNBRUw1bUMsR0FFVCxPQUFPeWdCLEVBV1QsU0FBUzRnRSxHQUFTdmxELEVBQU0wSyxHQUN0QixPQUFPODZDLEdBQVlDLEdBQVN6bEQsRUFBTTBLLEVBQU8rM0MsSUFBV3ppRCxFQUFPLElBVTdELFNBQVMwbEQsR0FBVzlULEdBQ2xCLE9BQU9zSSxHQUFZeGpFLEdBQU9rN0QsSUFXNUIsU0FBUytULEdBQWUvVCxFQUFZMXRFLEdBQ2xDLElBQUk2SSxFQUFRMkosR0FBT2s3RCxHQUNuQixPQUFPeUksR0FBWXR0RSxFQUFPd3RFLEdBQVVyMkUsRUFBRyxFQUFHNkksRUFBTS9FLFNBYWxELFNBQVNpOUUsR0FBUTlnRixFQUFRa1IsRUFBTTNSLEVBQU82M0UsR0FDcEMsSUFBS25ELEdBQVNqMEUsR0FDWixPQUFPQSxFQVNULElBTEEsSUFBSTRHLEdBQVMsRUFDVC9DLEdBSEpxTixFQUFPMnBFLEdBQVMzcEUsRUFBTWxSLElBR0o2RCxPQUNkaXNFLEVBQVlqc0UsRUFBUyxFQUNyQjQ5RSxFQUFTemhGLEVBRUksTUFBVnloRixLQUFvQjc2RSxFQUFRL0MsR0FBUSxDQUN6QyxJQUFJaEUsRUFBTWk3RSxHQUFNNXBFLEVBQUt0SyxJQUNqQjg0RSxFQUFXbmdGLEVBRWYsR0FBWSxjQUFSTSxHQUErQixnQkFBUkEsR0FBaUMsY0FBUkEsRUFDbEQsT0FBT0csRUFHVCxHQUFJNEcsR0FBU2twRSxFQUFXLENBQ3RCLElBQUk0RyxFQUFXK0ssRUFBTzVoRixRQTU3SDFCNkMsS0E2N0hJZzlFLEVBQVd0SSxFQUFhQSxFQUFXVixFQUFVNzJFLEVBQUs0aEYsUUE3N0h0RC8rRSxLQSs3SE1nOUUsRUFBV3pMLEdBQVN5QyxHQUNoQkEsRUFDQ1osR0FBUTVrRSxFQUFLdEssRUFBUSxJQUFNLEdBQUssSUFHekM2dkUsR0FBWWdMLEVBQVE1aEYsRUFBSzYvRSxHQUN6QitCLEVBQVNBLEVBQU81aEYsR0FFbEIsT0FBT0csRUFXVCxJQUFJMGhGLEdBQWUzTyxHQUFxQixTQUFTbDNDLEVBQU14UyxHQUVyRCxPQURBMHBELEdBQVF0dEUsSUFBSW8yQixFQUFNeFMsR0FDWHdTLEdBRm9CeWlELEdBYXpCcUQsR0FBbUIxaUYsR0FBNEIsU0FBUzQ4QixFQUFNOEssR0FDaEUsT0FBTzFuQyxHQUFlNDhCLEVBQU0sV0FBWSxDQUN0QyxjQUFnQixFQUNoQixZQUFjLEVBQ2QsTUFBUytsRCxHQUFTajdDLEdBQ2xCLFVBQVksS0FMd0IyM0MsR0FnQnhDLFNBQVN1RCxHQUFZcFUsR0FDbkIsT0FBT3lJLEdBQVkzakUsR0FBT2s3RCxJQVk1QixTQUFTcVUsR0FBVWw1RSxFQUFPMjlCLEVBQU96ZSxHQUMvQixJQUFJbGhCLEdBQVMsRUFDVC9DLEVBQVMrRSxFQUFNL0UsT0FFZjBpQyxFQUFRLElBQ1ZBLEdBQVNBLEVBQVExaUMsRUFBUyxFQUFLQSxFQUFTMGlDLElBRTFDemUsRUFBTUEsRUFBTWprQixFQUFTQSxFQUFTaWtCLEdBQ3BCLElBQ1JBLEdBQU9qa0IsR0FFVEEsRUFBUzBpQyxFQUFRemUsRUFBTSxFQUFNQSxFQUFNeWUsSUFBVyxFQUM5Q0EsS0FBVyxFQUdYLElBREEsSUFBSS9sQixFQUFTeGIsRUFBTW5CLEtBQ1YrQyxFQUFRL0MsR0FDZjJjLEVBQU81WixHQUFTZ0MsRUFBTWhDLEVBQVEyL0IsR0FFaEMsT0FBTy9sQixFQVlULFNBQVN1aEUsR0FBU3RVLEVBQVlmLEdBQzVCLElBQUlsc0QsRUFNSixPQUpBcTJELEdBQVNwSixHQUFZLFNBQVNsdUUsRUFBT3FILEVBQU82bUUsR0FFMUMsUUFEQWp0RCxFQUFTa3NELEVBQVVudEUsRUFBT3FILEVBQU82bUUsU0FHMUJqdEQsRUFlWCxTQUFTd2hFLEdBQWdCcDVFLEVBQU9ySixFQUFPMGlGLEdBQ3JDLElBQUl4NEMsRUFBTSxFQUNOQyxFQUFnQixNQUFUOWdDLEVBQWdCNmdDLEVBQU03Z0MsRUFBTS9FLE9BRXZDLEdBQW9CLGlCQUFUdEUsR0FBcUJBLEdBQVVBLEdBQVNtcUMsR0FuL0gzQnc0QyxXQW0vSDBELENBQ2hGLEtBQU96NEMsRUFBTUMsR0FBTSxDQUNqQixJQUFJRixFQUFPQyxFQUFNQyxJQUFVLEVBQ3ZCNHZDLEVBQVcxd0UsRUFBTTRnQyxHQUVKLE9BQWI4dkMsSUFBc0JZLEdBQVNaLEtBQzlCMkksRUFBYzNJLEdBQVkvNUUsRUFBVSs1RSxFQUFXLzVFLEdBQ2xEa3FDLEVBQU1ELEVBQU0sRUFFWkUsRUFBT0YsRUFHWCxPQUFPRSxFQUVULE9BQU95NEMsR0FBa0J2NUUsRUFBT3JKLEVBQU8rK0UsR0FBVTJELEdBZ0JuRCxTQUFTRSxHQUFrQnY1RSxFQUFPckosRUFBTzhzRSxFQUFVNFYsR0FDakQsSUFBSXg0QyxFQUFNLEVBQ05DLEVBQWdCLE1BQVQ5Z0MsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3JDLEdBQWEsSUFBVDZsQyxFQUNGLE9BQU8sRUFTVCxJQUxBLElBQUkwNEMsR0FESjdpRixFQUFROHNFLEVBQVM5c0UsS0FDUUEsRUFDckI4aUYsRUFBc0IsT0FBVjlpRixFQUNaK2lGLEVBQWNwSSxHQUFTMzZFLEdBQ3ZCZ2pGLE9BN2xJSjcvRSxJQTZsSXFCbkQsRUFFZGtxQyxFQUFNQyxHQUFNLENBQ2pCLElBQUlGLEVBQU11b0MsSUFBYXRvQyxFQUFNQyxHQUFRLEdBQ2pDNHZDLEVBQVdqTixFQUFTempFLEVBQU00Z0MsSUFDMUJnNUMsT0FsbUlOOS9FLElBa21JcUI0MkUsRUFDZm1KLEVBQXlCLE9BQWJuSixFQUNab0osRUFBaUJwSixHQUFhQSxFQUM5QnFKLEVBQWN6SSxHQUFTWixHQUUzQixHQUFJOEksRUFDRixJQUFJUSxFQUFTWCxHQUFjUyxPQUUzQkUsRUFEU0wsRUFDQUcsSUFBbUJULEdBQWNPLEdBQ2pDSCxFQUNBSyxHQUFrQkYsSUFBaUJQLElBQWVRLEdBQ2xESCxFQUNBSSxHQUFrQkYsSUFBaUJDLElBQWNSLElBQWVVLElBQ2hFRixJQUFhRSxJQUdiVixFQUFjM0ksR0FBWS81RSxFQUFVKzVFLEVBQVcvNUUsR0FFdERxakYsRUFDRm41QyxFQUFNRCxFQUFNLEVBRVpFLEVBQU9GLEVBR1gsT0FBTytvQyxHQUFVN29DLEVBMWpJQ3c0QyxZQXNrSXBCLFNBQVNXLEdBQWVqNkUsRUFBT3lqRSxHQU03QixJQUxBLElBQUl6bEUsR0FBUyxFQUNUL0MsRUFBUytFLEVBQU0vRSxPQUNmK29FLEVBQVcsRUFDWHBzRCxFQUFTLEtBRUo1WixFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBUXFKLEVBQU1oQyxHQUNkMHlFLEVBQVdqTixFQUFXQSxFQUFTOXNFLEdBQVNBLEVBRTVDLElBQUtxSCxJQUFVMnZFLEdBQUcrQyxFQUFVMEMsR0FBTyxDQUNqQyxJQUFJQSxFQUFPMUMsRUFDWDk0RCxFQUFPb3NELEtBQXdCLElBQVZydEUsRUFBYyxFQUFJQSxHQUczQyxPQUFPaWhCLEVBV1QsU0FBU3NpRSxHQUFhdmpGLEdBQ3BCLE1BQW9CLGlCQUFUQSxFQUNGQSxFQUVMMjZFLEdBQVMzNkUsR0F4bUlQLEtBMm1JRUEsRUFXVixTQUFTd2pGLEdBQWF4akYsR0FFcEIsR0FBb0IsaUJBQVRBLEVBQ1QsT0FBT0EsRUFFVCxHQUFJeXJCLEdBQVF6ckIsR0FFVixPQUFPeXRFLEdBQVN6dEUsRUFBT3dqRixJQUFnQixHQUV6QyxHQUFJN0ksR0FBUzM2RSxHQUNYLE9BQU9tMEUsR0FBaUJBLEdBQWVqMUUsS0FBS2MsR0FBUyxHQUV2RCxJQUFJaWhCLEVBQVVqaEIsRUFBUSxHQUN0QixNQUFrQixLQUFWaWhCLEdBQWtCLEVBQUlqaEIsSUF0b0luQixJQXNvSTBDLEtBQU9paEIsRUFZOUQsU0FBU3dpRSxHQUFTcDZFLEVBQU95akUsRUFBVTlpQyxHQUNqQyxJQUFJM2lDLEdBQVMsRUFDVHN5RSxFQUFXck0sR0FDWGhwRSxFQUFTK0UsRUFBTS9FLE9BQ2ZzMUUsR0FBVyxFQUNYMzRELEVBQVMsR0FDVHc3RCxFQUFPeDdELEVBRVgsR0FBSStvQixFQUNGNHZDLEdBQVcsRUFDWEQsRUFBV25NLFFBRVIsR0FBSWxwRSxHQWp0SVUsSUFpdElrQixDQUNuQyxJQUFJNEIsRUFBTTRtRSxFQUFXLEtBQU80VyxHQUFVcjZFLEdBQ3RDLEdBQUluRCxFQUNGLE9BQU9rcUUsR0FBV2xxRSxHQUVwQjB6RSxHQUFXLEVBQ1hELEVBQVd4SyxHQUNYc04sRUFBTyxJQUFJN0csUUFHWDZHLEVBQU8zUCxFQUFXLEdBQUs3ckQsRUFFekI2NEQsRUFDQSxPQUFTenlFLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUl0RSxFQUFRcUosRUFBTWhDLEdBQ2QweUUsRUFBV2pOLEVBQVdBLEVBQVM5c0UsR0FBU0EsRUFHNUMsR0FEQUEsRUFBU2dxQyxHQUF3QixJQUFWaHFDLEVBQWVBLEVBQVEsRUFDMUM0NUUsR0FBWUcsR0FBYUEsRUFBVSxDQUVyQyxJQURBLElBQUk0SixFQUFZbEgsRUFBS240RSxPQUNkcS9FLEtBQ0wsR0FBSWxILEVBQUtrSCxLQUFlNUosRUFDdEIsU0FBU0QsRUFHVGhOLEdBQ0YyUCxFQUFLcDRFLEtBQUswMUUsR0FFWjk0RCxFQUFPNWMsS0FBS3JFLFFBRUoyNUUsRUFBUzhDLEVBQU0xQyxFQUFVL3ZDLEtBQzdCeXlDLElBQVN4N0QsR0FDWHc3RCxFQUFLcDRFLEtBQUswMUUsR0FFWjk0RCxFQUFPNWMsS0FBS3JFLElBR2hCLE9BQU9paEIsRUFXVCxTQUFTMGdFLEdBQVVsaEYsRUFBUWtSLEdBR3pCLE9BQWlCLE9BRGpCbFIsRUFBU3NQLEdBQU90UCxFQURoQmtSLEVBQU8ycEUsR0FBUzNwRSxFQUFNbFIsYUFFVUEsRUFBTzg2RSxHQUFNdmhCLEdBQUtyb0QsS0FhcEQsU0FBU2l5RSxHQUFXbmpGLEVBQVFrUixFQUFNa3lFLEVBQVNoTSxHQUN6QyxPQUFPMEosR0FBUTlnRixFQUFRa1IsRUFBTWt5RSxFQUFReEksR0FBUTU2RSxFQUFRa1IsSUFBUWttRSxHQWMvRCxTQUFTaU0sR0FBVXo2RSxFQUFPOGpFLEVBQVc0VyxFQUFRelYsR0FJM0MsSUFIQSxJQUFJaHFFLEVBQVMrRSxFQUFNL0UsT0FDZitDLEVBQVFpbkUsRUFBWWhxRSxHQUFVLEdBRTFCZ3FFLEVBQVlqbkUsTUFBWUEsRUFBUS9DLElBQ3RDNm9FLEVBQVU5akUsRUFBTWhDLEdBQVFBLEVBQU9nQyxLQUVqQyxPQUFPMDZFLEVBQ0h4QixHQUFVbDVFLEVBQVFpbEUsRUFBWSxFQUFJam5FLEVBQVNpbkUsRUFBWWpuRSxFQUFRLEVBQUkvQyxHQUNuRWkrRSxHQUFVbDVFLEVBQVFpbEUsRUFBWWpuRSxFQUFRLEVBQUksRUFBS2luRSxFQUFZaHFFLEVBQVMrQyxHQWExRSxTQUFTMjhFLEdBQWlCaGtGLEVBQU9pa0YsR0FDL0IsSUFBSWhqRSxFQUFTamhCLEVBSWIsT0FISWloQixhQUFrQnF6RCxLQUNwQnJ6RCxFQUFTQSxFQUFPamhCLFNBRVgydEUsR0FBWXNXLEdBQVMsU0FBU2hqRSxFQUFRNUQsR0FDM0MsT0FBT0EsRUFBT2lmLEtBQUtuN0IsTUFBTWtjLEVBQU9zdkQsUUFBU2UsR0FBVSxDQUFDenNELEdBQVM1RCxFQUFPL2IsU0FDbkUyZixHQWFMLFNBQVNpakUsR0FBUTlILEVBQVF0UCxFQUFVOWlDLEdBQ2pDLElBQUkxbEMsRUFBUzgzRSxFQUFPOTNFLE9BQ3BCLEdBQUlBLEVBQVMsRUFDWCxPQUFPQSxFQUFTbS9FLEdBQVNySCxFQUFPLElBQU0sR0FLeEMsSUFIQSxJQUFJLzBFLEdBQVMsRUFDVDRaLEVBQVN4YixFQUFNbkIsS0FFVitDLEVBQVEvQyxHQUlmLElBSEEsSUFBSStFLEVBQVEreUUsRUFBTy8wRSxHQUNmaTFFLEdBQVksSUFFUEEsRUFBV2g0RSxHQUNkZzRFLEdBQVlqMUUsSUFDZDRaLEVBQU81WixHQUFTcXlFLEdBQWV6NEQsRUFBTzVaLElBQVVnQyxFQUFPK3lFLEVBQU9FLEdBQVd4UCxFQUFVOWlDLElBSXpGLE9BQU95NUMsR0FBUzVJLEdBQVk1NUQsRUFBUSxHQUFJNnJELEVBQVU5aUMsR0FZcEQsU0FBU202QyxHQUFjaGxCLEVBQU9uc0QsRUFBUW94RSxHQU1wQyxJQUxBLElBQUkvOEUsR0FBUyxFQUNUL0MsRUFBUzY2RCxFQUFNNzZELE9BQ2YrL0UsRUFBYXJ4RSxFQUFPMU8sT0FDcEIyYyxFQUFTLEtBRUo1WixFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBUXFILEVBQVFnOUUsRUFBYXJ4RSxFQUFPM0wsUUFyM0kxQ2xFLEVBczNJRWloRixFQUFXbmpFLEVBQVFrK0MsRUFBTTkzRCxHQUFRckgsR0FFbkMsT0FBT2loQixFQVVULFNBQVNxakUsR0FBb0J0a0YsR0FDM0IsT0FBT3FnRixHQUFrQnJnRixHQUFTQSxFQUFRLEdBVTVDLFNBQVN1a0YsR0FBYXZrRixHQUNwQixNQUF1QixtQkFBVEEsRUFBc0JBLEVBQVErK0UsR0FXOUMsU0FBU3pELEdBQVN0N0UsRUFBT1MsR0FDdkIsT0FBSWdyQixHQUFRenJCLEdBQ0hBLEVBRUY0L0UsR0FBTTUvRSxFQUFPUyxHQUFVLENBQUNULEdBQVN3a0YsR0FBYTFzRSxHQUFTOVgsSUFZaEUsSUFBSXlrRixHQUFXNUMsR0FXZixTQUFTNkMsR0FBVXI3RSxFQUFPMjlCLEVBQU96ZSxHQUMvQixJQUFJamtCLEVBQVMrRSxFQUFNL0UsT0FFbkIsT0FEQWlrQixPQXQ3SUFwbEIsSUFzN0lNb2xCLEVBQW9CamtCLEVBQVNpa0IsR0FDMUJ5ZSxHQUFTemUsR0FBT2prQixFQUFVK0UsRUFBUWs1RSxHQUFVbDVFLEVBQU8yOUIsRUFBT3plLEdBU3JFLElBQUl2ZixHQUFlb3BFLElBQW1CLFNBQVN6bkUsR0FDN0MsT0FBTzYvQixHQUFLeGhDLGFBQWEyQixJQVczQixTQUFTMHRFLEdBQVk3dUQsRUFBUXN1RCxHQUMzQixHQUFJQSxFQUNGLE9BQU90dUQsRUFBTzdtQixRQUVoQixJQUFJMkIsRUFBU2tsQixFQUFPbGxCLE9BQ2hCMmMsRUFBU3l3RCxHQUFjQSxHQUFZcHRFLEdBQVUsSUFBSWtsQixFQUFPeGhCLFlBQVkxRCxHQUd4RSxPQURBa2xCLEVBQU8zakIsS0FBS29iLEdBQ0xBLEVBVVQsU0FBUzhaLEdBQWlCbU0sR0FDeEIsSUFBSWptQixFQUFTLElBQUlpbUIsRUFBWWwvQixZQUFZay9CLEVBQVk3ZSxZQUVyRCxPQURBLElBQUlHLEdBQVd2SCxHQUFRL2EsSUFBSSxJQUFJc2lCLEdBQVcwZSxJQUNuQ2ptQixFQWdEVCxTQUFTKzNELEdBQWdCMkwsRUFBWTdNLEdBQ25DLElBQUl0dUQsRUFBU3N1RCxFQUFTLzhDLEdBQWlCNHBELEVBQVduN0QsUUFBVW03RCxFQUFXbjdELE9BQ3ZFLE9BQU8sSUFBSW03RCxFQUFXMzhFLFlBQVl3aEIsRUFBUW03RCxFQUFXN0wsV0FBWTZMLEVBQVdyZ0YsUUFXOUUsU0FBUzY4RSxHQUFpQm5oRixFQUFPa2pCLEdBQy9CLEdBQUlsakIsSUFBVWtqQixFQUFPLENBQ25CLElBQUkwaEUsT0FoaUpOemhGLElBZ2lKcUJuRCxFQUNmOGlGLEVBQXNCLE9BQVY5aUYsRUFDWjZrRixFQUFpQjdrRixHQUFVQSxFQUMzQitpRixFQUFjcEksR0FBUzM2RSxHQUV2QmlqRixPQXJpSk45L0UsSUFxaUpxQitmLEVBQ2ZnZ0UsRUFBc0IsT0FBVmhnRSxFQUNaaWdFLEVBQWlCamdFLEdBQVVBLEVBQzNCa2dFLEVBQWN6SSxHQUFTejNELEdBRTNCLElBQU1nZ0UsSUFBY0UsSUFBZ0JMLEdBQWUvaUYsRUFBUWtqQixHQUN0RDYvRCxHQUFlRSxHQUFnQkUsSUFBbUJELElBQWNFLEdBQ2hFTixHQUFhRyxHQUFnQkUsSUFDNUJ5QixHQUFnQnpCLElBQ2pCMEIsRUFDSCxPQUFPLEVBRVQsSUFBTS9CLElBQWNDLElBQWdCSyxHQUFlcGpGLEVBQVFrakIsR0FDdERrZ0UsR0FBZXdCLEdBQWdCQyxJQUFtQi9CLElBQWNDLEdBQ2hFRyxHQUFhMEIsR0FBZ0JDLElBQzVCNUIsR0FBZ0I0QixJQUNqQjFCLEVBQ0gsT0FBUSxFQUdaLE9BQU8sRUF1RFQsU0FBUzJCLEdBQVl4akYsRUFBTXlqRixFQUFVQyxFQUFTQyxHQVU1QyxJQVRBLElBQUlDLEdBQWEsRUFDYkMsRUFBYTdqRixFQUFLZ0QsT0FDbEI4Z0YsRUFBZ0JKLEVBQVExZ0YsT0FDeEIrZ0YsR0FBYSxFQUNiQyxFQUFhUCxFQUFTemdGLE9BQ3RCaWhGLEVBQWN4UyxHQUFVb1MsRUFBYUMsRUFBZSxHQUNwRG5rRSxFQUFTeGIsRUFBTTYvRSxFQUFhQyxHQUM1QkMsR0FBZVAsSUFFVkksRUFBWUMsR0FDbkJya0UsRUFBT29rRSxHQUFhTixFQUFTTSxHQUUvQixPQUFTSCxFQUFZRSxJQUNmSSxHQUFlTixFQUFZQyxLQUM3QmxrRSxFQUFPK2pFLEVBQVFFLElBQWM1akYsRUFBSzRqRixJQUd0QyxLQUFPSyxLQUNMdGtFLEVBQU9va0UsS0FBZS9qRixFQUFLNGpGLEtBRTdCLE9BQU9qa0UsRUFjVCxTQUFTd2tFLEdBQWlCbmtGLEVBQU15akYsRUFBVUMsRUFBU0MsR0FXakQsSUFWQSxJQUFJQyxHQUFhLEVBQ2JDLEVBQWE3akYsRUFBS2dELE9BQ2xCb2hGLEdBQWdCLEVBQ2hCTixFQUFnQkosRUFBUTFnRixPQUN4QnFoRixHQUFjLEVBQ2RDLEVBQWNiLEVBQVN6Z0YsT0FDdkJpaEYsRUFBY3hTLEdBQVVvUyxFQUFhQyxFQUFlLEdBQ3BEbmtFLEVBQVN4YixFQUFNOC9FLEVBQWNLLEdBQzdCSixHQUFlUCxJQUVWQyxFQUFZSyxHQUNuQnRrRSxFQUFPaWtFLEdBQWE1akYsRUFBSzRqRixHQUczQixJQURBLElBQUlsdEUsRUFBU2t0RSxJQUNKUyxFQUFhQyxHQUNwQjNrRSxFQUFPakosRUFBUzJ0RSxHQUFjWixFQUFTWSxHQUV6QyxPQUFTRCxFQUFlTixJQUNsQkksR0FBZU4sRUFBWUMsS0FDN0Jsa0UsRUFBT2pKLEVBQVNndEUsRUFBUVUsSUFBaUJwa0YsRUFBSzRqRixNQUdsRCxPQUFPamtFLEVBV1QsU0FBUzIxRCxHQUFVMXlDLEVBQVE3NkIsR0FDekIsSUFBSWhDLEdBQVMsRUFDVC9DLEVBQVM0L0IsRUFBTzUvQixPQUdwQixJQURBK0UsSUFBVUEsRUFBUTVELEVBQU1uQixNQUNmK0MsRUFBUS9DLEdBQ2YrRSxFQUFNaEMsR0FBUzY4QixFQUFPNzhCLEdBRXhCLE9BQU9nQyxFQWFULFNBQVNtdUUsR0FBV3R6QyxFQUFRaTdCLEVBQU8xK0QsRUFBUW8zRSxHQUN6QyxJQUFJZ08sR0FBU3BsRixFQUNiQSxJQUFXQSxFQUFTLElBS3BCLElBSEEsSUFBSTRHLEdBQVMsRUFDVC9DLEVBQVM2NkQsRUFBTTc2RCxTQUVWK0MsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSWhFLEVBQU02K0QsRUFBTTkzRCxHQUVaODRFLEVBQVd0SSxFQUNYQSxFQUFXcDNFLEVBQU9ILEdBQU00akMsRUFBTzVqQyxHQUFNQSxFQUFLRyxFQUFReWpDLFFBcnRKeEQvZ0MsV0F3dEpNZzlFLElBQ0ZBLEVBQVdqOEMsRUFBTzVqQyxJQUVoQnVsRixFQUNGNU8sR0FBZ0J4MkUsRUFBUUgsRUFBSzYvRSxHQUU3QmpKLEdBQVl6MkUsRUFBUUgsRUFBSzYvRSxHQUc3QixPQUFPMS9FLEVBbUNULFNBQVNxbEYsR0FBaUJqWixFQUFRa1osR0FDaEMsT0FBTyxTQUFTN1gsRUFBWXBCLEdBQzFCLElBQUl4d0MsRUFBTzdRLEdBQVF5aUQsR0FBY3RCLEdBQWtCeUssR0FDL0N0SyxFQUFjZ1osRUFBY0EsSUFBZ0IsR0FFaEQsT0FBT3pwRCxFQUFLNHhDLEVBQVlyQixFQUFRK1QsR0FBWTlULEVBQVUsR0FBSUMsSUFXOUQsU0FBU2laLEdBQWVDLEdBQ3RCLE9BQU9wRSxJQUFTLFNBQVNwaEYsRUFBUXlsRixHQUMvQixJQUFJNytFLEdBQVMsRUFDVC9DLEVBQVM0aEYsRUFBUTVoRixPQUNqQnV6RSxFQUFhdnpFLEVBQVMsRUFBSTRoRixFQUFRNWhGLEVBQVMsUUF4eEpqRG5CLEVBeXhKTWdqRixFQUFRN2hGLEVBQVMsRUFBSTRoRixFQUFRLFFBenhKbkMvaUYsRUFveUpFLElBVEEwMEUsRUFBY29PLEVBQVMzaEYsT0FBUyxHQUEwQixtQkFBZHV6RSxHQUN2Q3Z6RSxJQUFVdXpFLFFBNXhKakIxMEUsRUEreEpNZ2pGLEdBQVNDLEdBQWVGLEVBQVEsR0FBSUEsRUFBUSxHQUFJQyxLQUNsRHRPLEVBQWF2ekUsRUFBUyxPQWh5SjFCbkIsRUFneUowQzAwRSxFQUN0Q3Z6RSxFQUFTLEdBRVg3RCxFQUFTaEIsR0FBT2dCLEtBQ1A0RyxFQUFRL0MsR0FBUSxDQUN2QixJQUFJNC9CLEVBQVNnaUQsRUFBUTcrRSxHQUNqQjY4QixHQUNGK2hELEVBQVN4bEYsRUFBUXlqQyxFQUFRNzhCLEVBQU93d0UsR0FHcEMsT0FBT3AzRSxLQVlYLFNBQVM0NUUsR0FBZWxNLEVBQVVHLEdBQ2hDLE9BQU8sU0FBU0osRUFBWXBCLEdBQzFCLEdBQWtCLE1BQWRvQixFQUNGLE9BQU9BLEVBRVQsSUFBS3VSLEdBQVl2UixHQUNmLE9BQU9DLEVBQVNELEVBQVlwQixHQU05QixJQUpBLElBQUl4b0UsRUFBUzRwRSxFQUFXNXBFLE9BQ3BCK0MsRUFBUWluRSxFQUFZaHFFLEdBQVUsRUFDOUIraEYsRUFBVzVtRixHQUFPeXVFLElBRWRJLEVBQVlqbkUsTUFBWUEsRUFBUS9DLEtBQ2EsSUFBL0N3b0UsRUFBU3VaLEVBQVNoL0UsR0FBUUEsRUFBT2cvRSxLQUl2QyxPQUFPblksR0FXWCxTQUFTK00sR0FBYzNNLEdBQ3JCLE9BQU8sU0FBUzd0RSxFQUFRcXNFLEVBQVUyTyxHQU1oQyxJQUxBLElBQUlwMEUsR0FBUyxFQUNUZy9FLEVBQVc1bUYsR0FBT2dCLEdBQ2xCMCtELEVBQVFzYyxFQUFTaDdFLEdBQ2pCNkQsRUFBUzY2RCxFQUFNNzZELE9BRVpBLEtBQVUsQ0FDZixJQUFJaEUsRUFBTTYrRCxFQUFNbVAsRUFBWWhxRSxJQUFXK0MsR0FDdkMsSUFBK0MsSUFBM0N5bEUsRUFBU3VaLEVBQVMvbEYsR0FBTUEsRUFBSytsRixHQUMvQixNQUdKLE9BQU81bEYsR0FnQ1gsU0FBUzZsRixHQUFnQkMsR0FDdkIsT0FBTyxTQUFTbi9DLEdBR2QsSUFBSWtvQyxFQUFhUyxHQUZqQjNvQyxFQUFTdHZCLEdBQVNzdkIsSUFHZHFwQyxHQUFjcnBDLFFBcDRKcEJqa0MsRUF1NEpNMnNFLEVBQU1SLEVBQ05BLEVBQVcsR0FDWGxvQyxFQUFPcU4sT0FBTyxHQUVkK3hDLEVBQVdsWCxFQUNYb1YsR0FBVXBWLEVBQVksR0FBR3h0RCxLQUFLLElBQzlCc2xCLEVBQU96a0MsTUFBTSxHQUVqQixPQUFPbXRFLEVBQUl5VyxLQUFnQkMsR0FXL0IsU0FBU0MsR0FBaUI3cEQsR0FDeEIsT0FBTyxTQUFTd0ssR0FDZCxPQUFPdW1DLEdBQVkrWSxHQUFNQyxHQUFPdi9DLEdBQVFucUIsUUFBUXd0RCxHQUFRLEtBQU03dEMsRUFBVSxLQVk1RSxTQUFTZ3FELEdBQVcxcUQsR0FDbEIsT0FBTyxXQUlMLElBQUk1NkIsRUFBT3NCLFVBQ1gsT0FBUXRCLEVBQUtnRCxRQUNYLEtBQUssRUFBRyxPQUFPLElBQUk0M0IsRUFDbkIsS0FBSyxFQUFHLE9BQU8sSUFBSUEsRUFBSzU2QixFQUFLLElBQzdCLEtBQUssRUFBRyxPQUFPLElBQUk0NkIsRUFBSzU2QixFQUFLLEdBQUlBLEVBQUssSUFDdEMsS0FBSyxFQUFHLE9BQU8sSUFBSTQ2QixFQUFLNTZCLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLElBQy9DLEtBQUssRUFBRyxPQUFPLElBQUk0NkIsRUFBSzU2QixFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLElBQ3hELEtBQUssRUFBRyxPQUFPLElBQUk0NkIsRUFBSzU2QixFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssSUFDakUsS0FBSyxFQUFHLE9BQU8sSUFBSTQ2QixFQUFLNTZCLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLElBQzFFLEtBQUssRUFBRyxPQUFPLElBQUk0NkIsRUFBSzU2QixFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLElBRXJGLElBQUl1bEYsRUFBY3BTLEdBQVd2NEMsRUFBS3Y3QixXQUM5QnNnQixFQUFTaWIsRUFBSy82QixNQUFNMGxGLEVBQWF2bEYsR0FJckMsT0FBT296RSxHQUFTenpELEdBQVVBLEVBQVM0bEUsR0FnRHZDLFNBQVNDLEdBQVdDLEdBQ2xCLE9BQU8sU0FBUzdZLEVBQVlmLEVBQVdrQixHQUNyQyxJQUFJZ1ksRUFBVzVtRixHQUFPeXVFLEdBQ3RCLElBQUt1UixHQUFZdlIsR0FBYSxDQUM1QixJQUFJcEIsRUFBVzhULEdBQVl6VCxFQUFXLEdBQ3RDZSxFQUFheG1FLEdBQUt3bUUsR0FDbEJmLEVBQVksU0FBUzdzRSxHQUFPLE9BQU93c0UsRUFBU3VaLEVBQVMvbEYsR0FBTUEsRUFBSytsRixJQUVsRSxJQUFJaC9FLEVBQVEwL0UsRUFBYzdZLEVBQVlmLEVBQVdrQixHQUNqRCxPQUFPaG5FLEdBQVMsRUFBSWcvRSxFQUFTdlosRUFBV29CLEVBQVc3bUUsR0FBU0EsUUF0L0o5RGxFLEdBaWdLRixTQUFTNmpGLEdBQVcxWSxHQUNsQixPQUFPMlksSUFBUyxTQUFTQyxHQUN2QixJQUFJNWlGLEVBQVM0aUYsRUFBTTVpRixPQUNmK0MsRUFBUS9DLEVBQ1I2aUYsRUFBUzVTLEdBQWM1ekUsVUFBVXltRixLQUtyQyxJQUhJOVksR0FDRjRZLEVBQU01OUMsVUFFRGppQyxLQUFTLENBQ2QsSUFBSWkxQixFQUFPNHFELEVBQU03L0UsR0FDakIsR0FBbUIsbUJBQVJpMUIsRUFDVCxNQUFNLElBQUk3NEIsR0FBVTZoRSxHQUV0QixHQUFJNmhCLElBQVdFLEdBQWdDLFdBQXJCQyxHQUFZaHJELEdBQ3BDLElBQUkrcUQsRUFBVSxJQUFJOVMsR0FBYyxJQUFJLEdBSXhDLElBREFsdEUsRUFBUWdnRixFQUFVaGdGLEVBQVEvQyxJQUNqQitDLEVBQVEvQyxHQUFRLENBR3ZCLElBQUlpakYsRUFBV0QsR0FGZmhyRCxFQUFPNHFELEVBQU03L0UsSUFHVHlpQixFQUFtQixXQUFaeTlELEVBQXdCQyxHQUFRbHJELFFBeGhLL0NuNUIsRUE4aEtNa2tGLEVBSkV2OUQsR0FBUTI5RCxHQUFXMzlELEVBQUssS0FDWCxLQUFYQSxFQUFLLEtBQ0pBLEVBQUssR0FBR3hsQixRQUFxQixHQUFYd2xCLEVBQUssR0FFbEJ1OUQsRUFBUUMsR0FBWXg5RCxFQUFLLEtBQUszb0IsTUFBTWttRixFQUFTdjlELEVBQUssSUFFbEMsR0FBZndTLEVBQUtoNEIsUUFBZW1qRixHQUFXbnJELEdBQ3RDK3FELEVBQVFFLEtBQ1JGLEVBQVFELEtBQUs5cUQsR0FHckIsT0FBTyxXQUNMLElBQUloN0IsRUFBT3NCLFVBQ1A1QyxFQUFRc0IsRUFBSyxHQUVqQixHQUFJK2xGLEdBQTBCLEdBQWYvbEYsRUFBS2dELFFBQWVtbkIsR0FBUXpyQixHQUN6QyxPQUFPcW5GLEVBQVFLLE1BQU0xbkYsR0FBT0EsUUFLOUIsSUFIQSxJQUFJcUgsRUFBUSxFQUNSNFosRUFBUzNjLEVBQVM0aUYsRUFBTTcvRSxHQUFPbEcsTUFBTWMsS0FBTVgsR0FBUXRCLElBRTlDcUgsRUFBUS9DLEdBQ2YyYyxFQUFTaW1FLEVBQU03L0UsR0FBT25JLEtBQUsrQyxLQUFNZ2YsR0FFbkMsT0FBT0EsTUF3QmIsU0FBUzBtRSxHQUFhcnJELEVBQU1zN0MsRUFBU2pMLEVBQVNvWSxFQUFVQyxFQUFTNEMsRUFBZUMsRUFBY0MsRUFBUUMsRUFBS0MsR0FDekcsSUFBSUMsRUFwaUtZLElBb2lLSnJRLEVBQ1JzUSxFQTVpS2EsRUE0aUtKdFEsRUFDVHVRLEVBNWlLaUIsRUE0aUtMdlEsRUFDWnFOLEVBQXNCLEdBQVZyTixFQUNad1EsRUF0aUthLElBc2lLSnhRLEVBQ1QxN0MsRUFBT2lzRCxPQWhsS1hobEYsRUFnbEttQ3lqRixHQUFXdHFELEdBNkM5QyxPQTNDQSxTQUFTK3FELElBS1AsSUFKQSxJQUFJL2lGLEVBQVMxQixVQUFVMEIsT0FDbkJoRCxFQUFPbUUsRUFBTW5CLEdBQ2IrQyxFQUFRL0MsRUFFTCtDLEtBQ0wvRixFQUFLK0YsR0FBU3pFLFVBQVV5RSxHQUUxQixHQUFJNDlFLEVBQ0YsSUFBSXZWLEVBQWMyWSxHQUFVaEIsR0FDeEJpQixFQUFlN1ksR0FBYW51RSxFQUFNb3VFLEdBU3hDLEdBUElxVixJQUNGempGLEVBQU93akYsR0FBWXhqRixFQUFNeWpGLEVBQVVDLEVBQVNDLElBRTFDMkMsSUFDRnRtRixFQUFPbWtGLEdBQWlCbmtGLEVBQU1zbUYsRUFBZUMsRUFBYzVDLElBRTdEM2dGLEdBQVVna0YsRUFDTnJELEdBQWEzZ0YsRUFBUzBqRixFQUFPLENBQy9CLElBQUlPLEVBQWFwWSxHQUFlN3VFLEVBQU1vdUUsR0FDdEMsT0FBTzhZLEdBQ0xsc0QsRUFBTXM3QyxFQUFTK1AsR0FBY04sRUFBUTNYLFlBQWEvQyxFQUNsRHJyRSxFQUFNaW5GLEVBQVlULEVBQVFDLEVBQUtDLEVBQVExakYsR0FHM0MsSUFBSXVpRixFQUFjcUIsRUFBU3ZiLEVBQVUxcUUsS0FDakN3bUYsRUFBS04sRUFBWXRCLEVBQVl2cUQsR0FBUUEsRUFjekMsT0FaQWg0QixFQUFTaEQsRUFBS2dELE9BQ1Z3akYsRUFDRnhtRixFQUFPb25GLEdBQVFwbkYsRUFBTXdtRixHQUNaTSxHQUFVOWpGLEVBQVMsR0FDNUJoRCxFQUFLZ29DLFVBRUgyK0MsR0FBU0YsRUFBTXpqRixJQUNqQmhELEVBQUtnRCxPQUFTeWpGLEdBRVo5bEYsTUFBUUEsT0FBU3VvQyxJQUFRdm9DLGdCQUFnQm9sRixJQUMzQ29CLEVBQUt2c0QsR0FBUTBxRCxHQUFXNkIsSUFFbkJBLEVBQUd0bkYsTUFBTTBsRixFQUFhdmxGLElBYWpDLFNBQVNxbkYsR0FBZTliLEVBQVErYixHQUM5QixPQUFPLFNBQVNub0YsRUFBUXFzRSxHQUN0QixPQWgvREosU0FBc0Jyc0UsRUFBUW9zRSxFQUFRQyxFQUFVQyxHQUk5QyxPQUhBdU4sR0FBVzc1RSxHQUFRLFNBQVNULEVBQU9NLEVBQUtHLEdBQ3RDb3NFLEVBQU9FLEVBQWFELEVBQVM5c0UsR0FBUU0sRUFBS0csTUFFckNzc0UsRUE0K0RFOGIsQ0FBYXBvRixFQUFRb3NFLEVBQVErYixFQUFXOWIsR0FBVyxLQVk5RCxTQUFTZ2MsR0FBb0JoeEMsRUFBVWl4QyxHQUNyQyxPQUFPLFNBQVMvb0YsRUFBT2tqQixHQUNyQixJQUFJakMsRUFDSixRQXpwS0Y5ZCxJQXlwS01uRCxRQXpwS05tRCxJQXlwSzZCK2YsRUFDekIsT0FBTzZsRSxFQUtULFFBL3BLRjVsRixJQTRwS01uRCxJQUNGaWhCLEVBQVNqaEIsUUE3cEtibUQsSUErcEtNK2YsRUFBcUIsQ0FDdkIsUUFocUtKL2YsSUFncUtROGQsRUFDRixPQUFPaUMsRUFFVyxpQkFBVGxqQixHQUFxQyxpQkFBVGtqQixHQUNyQ2xqQixFQUFRd2pGLEdBQWF4akYsR0FDckJrakIsRUFBUXNnRSxHQUFhdGdFLEtBRXJCbGpCLEVBQVF1akYsR0FBYXZqRixHQUNyQmtqQixFQUFRcWdFLEdBQWFyZ0UsSUFFdkJqQyxFQUFTNjJCLEVBQVM5M0MsRUFBT2tqQixHQUUzQixPQUFPakMsR0FXWCxTQUFTK25FLEdBQVdDLEdBQ2xCLE9BQU9oQyxJQUFTLFNBQVN2RyxHQUV2QixPQURBQSxFQUFZalQsR0FBU2lULEVBQVd6UixHQUFVMlIsT0FDbkNpQixJQUFTLFNBQVN2Z0YsR0FDdkIsSUFBSXFyRSxFQUFVMXFFLEtBQ2QsT0FBT2duRixFQUFVdkksR0FBVyxTQUFTNVQsR0FDbkMsT0FBTzNyRSxHQUFNMnJFLEVBQVVILEVBQVNyckUsWUFleEMsU0FBUzRuRixHQUFjNWtGLEVBQVE2a0YsR0FHN0IsSUFBSUMsR0FGSkQsT0E3c0tBaG1GLElBNnNLUWdtRixFQUFzQixJQUFNM0YsR0FBYTJGLElBRXpCN2tGLE9BQ3hCLEdBQUk4a0YsRUFBYyxFQUNoQixPQUFPQSxFQUFjeEgsR0FBV3VILEVBQU83a0YsR0FBVTZrRixFQUVuRCxJQUFJbG9FLEVBQVMyZ0UsR0FBV3VILEVBQU81VyxHQUFXanVFLEVBQVNnc0UsR0FBVzZZLEtBQzlELE9BQU9wWixHQUFXb1osR0FDZHpFLEdBQVVqVSxHQUFjeHZELEdBQVMsRUFBRzNjLEdBQVF3ZCxLQUFLLElBQ2pEYixFQUFPdGUsTUFBTSxFQUFHMkIsR0E2Q3RCLFNBQVMra0YsR0FBWS9hLEdBQ25CLE9BQU8sU0FBU3RuQyxFQUFPemUsRUFBSytnRSxHQWExQixPQVpJQSxHQUF1QixpQkFBUkEsR0FBb0JsRCxHQUFlcC9DLEVBQU96ZSxFQUFLK2dFLEtBQ2hFL2dFLEVBQU0rZ0UsT0F0d0tWbm1GLEdBeXdLRTZqQyxFQUFRdWlELEdBQVN2aUQsUUF6d0tuQjdqQyxJQTB3S01vbEIsR0FDRkEsRUFBTXllLEVBQ05BLEVBQVEsR0FFUnplLEVBQU1naEUsR0FBU2hoRSxHQTU3Q3JCLFNBQW1CeWUsRUFBT3plLEVBQUsrZ0UsRUFBTWhiLEdBS25DLElBSkEsSUFBSWpuRSxHQUFTLEVBQ1QvQyxFQUFTeXVFLEdBQVVSLElBQVlocUQsRUFBTXllLElBQVVzaUQsR0FBUSxJQUFLLEdBQzVEcm9FLEVBQVN4YixFQUFNbkIsR0FFWkEsS0FDTDJjLEVBQU9xdEQsRUFBWWhxRSxJQUFXK0MsR0FBUzIvQixFQUN2Q0EsR0FBU3NpRCxFQUVYLE9BQU9yb0UsRUFzN0NFdW9FLENBQVV4aUQsRUFBT3plLEVBRHhCK2dFLE9BaHhLRm5tRixJQWd4S1NtbUYsRUFBc0J0aUQsRUFBUXplLEVBQU0sR0FBSyxFQUFLZ2hFLEdBQVNELEdBQzNCaGIsSUFXdkMsU0FBU21iLEdBQTBCM3hDLEdBQ2pDLE9BQU8sU0FBUzkzQyxFQUFPa2pCLEdBS3JCLE1BSnNCLGlCQUFUbGpCLEdBQXFDLGlCQUFUa2pCLElBQ3ZDbGpCLEVBQVEwcEYsR0FBUzFwRixHQUNqQmtqQixFQUFRd21FLEdBQVN4bUUsSUFFWjQwQixFQUFTOTNDLEVBQU9rakIsSUFxQjNCLFNBQVNzbEUsR0FBY2xzRCxFQUFNczdDLEVBQVMrUixFQUFVamEsRUFBYS9DLEVBQVNvWSxFQUFVQyxFQUFTOEMsRUFBUUMsRUFBS0MsR0FDcEcsSUFBSTRCLEVBcnhLYyxFQXF4S0poUyxFQU1kQSxHQUFZZ1MsRUF6eEtRLEdBQ00sR0FKRixHQTZ4S3hCaFMsS0FBYWdTLEVBenhLYSxHQUROLE9BNnhLbEJoUyxJQUFXLEdBRWIsSUFBSWlTLEVBQVUsQ0FDWnZ0RCxFQUFNczdDLEVBQVNqTCxFQVZDaWQsRUFBVTdFLE9BM3pLNUI1aEYsRUF5ektpQnltRixFQUFVNUUsT0F6ekszQjdoRixFQTR6S3VCeW1GLE9BNXpLdkJ6bUYsRUE0eks2QzRoRixFQUZ2QjZFLE9BMXpLdEJ6bUYsRUEweks0QzZoRixFQVl6QjhDLEVBQVFDLEVBQUtDLEdBRzVCL21FLEVBQVMwb0UsRUFBU3hvRixXQXowS3RCZ0MsRUF5MEt1QzBtRixHQUt2QyxPQUpJcEMsR0FBV25yRCxJQUNid3RELEdBQVE3b0UsRUFBUTRvRSxHQUVsQjVvRSxFQUFPeXVELFlBQWNBLEVBQ2RxYSxHQUFnQjlvRSxFQUFRcWIsRUFBTXM3QyxHQVV2QyxTQUFTb1MsR0FBWXpELEdBQ25CLElBQUlqcUQsRUFBT3ZyQixHQUFLdzFFLEdBQ2hCLE9BQU8sU0FBU24zRCxFQUFRNjZELEdBR3RCLEdBRkE3NkQsRUFBU3M2RCxHQUFTdDZELElBQ2xCNjZELEVBQXlCLE1BQWJBLEVBQW9CLEVBQUlqWCxHQUFVa1gsR0FBVUQsR0FBWSxPQUNuRHJYLEdBQWV4akQsR0FBUyxDQUd2QyxJQUFJKzZELEdBQVFyeUUsR0FBU3NYLEdBQVUsS0FBS0osTUFBTSxLQUkxQyxTQURBbTdELEdBQVFyeUUsR0FGSXdrQixFQUFLNnRELEVBQUssR0FBSyxNQUFRQSxFQUFLLEdBQUtGLEtBRW5CLEtBQUtqN0QsTUFBTSxNQUN2QixHQUFLLE1BQVFtN0QsRUFBSyxHQUFLRixJQUV2QyxPQUFPM3RELEVBQUtsTixJQVdoQixJQUFJczBELEdBQWNqeEUsSUFBUSxFQUFJMjlELEdBQVcsSUFBSTM5RCxHQUFJLENBQUMsRUFBRSxLQUFLLElBeHpLNUMsSUF3ektzRSxTQUFTTyxHQUMxRixPQUFPLElBQUlQLEdBQUlPLElBRDJENnhELEdBVzVFLFNBQVN1bEIsR0FBYzNPLEdBQ3JCLE9BQU8sU0FBU2g3RSxHQUNkLElBQUl5M0UsRUFBTUMsR0FBTzEzRSxHQUNqQixPQUFJeTNFLEdBQU9sUyxFQUNGZ0ssR0FBV3Z2RSxHQUVoQnkzRSxHQUFPOVIsRUFDRmlLLEdBQVc1dkUsR0FuNkkxQixTQUFxQkEsRUFBUTArRCxHQUMzQixPQUFPc08sR0FBU3RPLEdBQU8sU0FBUzcrRCxHQUM5QixNQUFPLENBQUNBLEVBQUtHLEVBQU9ILE9BbTZJWCtwRixDQUFZNXBGLEVBQVFnN0UsRUFBU2g3RSxLQTZCeEMsU0FBUzZwRixHQUFXaHVELEVBQU1zN0MsRUFBU2pMLEVBQVNvWSxFQUFVQyxFQUFTOEMsRUFBUUMsRUFBS0MsR0FDMUUsSUFBSUcsRUFsNEtpQixFQWs0S0x2USxFQUNoQixJQUFLdVEsR0FBNEIsbUJBQVI3ckQsRUFDdkIsTUFBTSxJQUFJNzRCLEdBQVU2aEUsR0FFdEIsSUFBSWhoRSxFQUFTeWdGLEVBQVdBLEVBQVN6Z0YsT0FBUyxFQVMxQyxHQVJLQSxJQUNIc3pFLElBQVcsR0FDWG1OLEVBQVdDLE9BMTZLYjdoRixHQTQ2S0E0a0YsT0E1NktBNWtGLElBNDZLTTRrRixFQUFvQkEsRUFBTWhWLEdBQVVtWCxHQUFVbkMsR0FBTSxHQUMxREMsT0E3NktBN2tGLElBNjZLUTZrRixFQUFzQkEsRUFBUWtDLEdBQVVsQyxHQUNoRDFqRixHQUFVMGdGLEVBQVVBLEVBQVExZ0YsT0FBUyxFQXg0S1gsR0EwNEt0QnN6RSxFQUFtQyxDQUNyQyxJQUFJZ1EsRUFBZ0I3QyxFQUNoQjhDLEVBQWU3QyxFQUVuQkQsRUFBV0MsT0FwN0tiN2hGLEVBczdLQSxJQUFJMm1CLEVBQU9xK0QsT0F0N0tYaGxGLEVBczdLbUNxa0YsR0FBUWxyRCxHQUV2Q3V0RCxFQUFVLENBQ1p2dEQsRUFBTXM3QyxFQUFTakwsRUFBU29ZLEVBQVVDLEVBQVM0QyxFQUFlQyxFQUMxREMsRUFBUUMsRUFBS0MsR0FrQmYsR0FmSWwrRCxHQTI2Qk4sU0FBbUJBLEVBQU1vYSxHQUN2QixJQUFJMHpDLEVBQVU5dEQsRUFBSyxHQUNmeWdFLEVBQWFybUQsRUFBTyxHQUNwQnNtRCxFQUFhNVMsRUFBVTJTLEVBQ3ZCM1EsRUFBVzRRLEVBQWEsSUFFeEJDLEVBdjBNWSxLQXcwTVpGLEdBNTBNYyxHQTQwTW1CM1MsR0F4ME1yQixLQXkwTVoyUyxHQXgwTWMsS0F3ME1tQjNTLEdBQWdDOXRELEVBQUssR0FBR3hsQixRQUFVNC9CLEVBQU8sSUFDNUUsS0FBZHFtRCxHQUFxRHJtRCxFQUFPLEdBQUc1L0IsUUFBVTQvQixFQUFPLElBOTBNbEUsR0E4ME0wRTB6QyxFQUc1RixJQUFNZ0MsSUFBWTZRLEVBQ2hCLE9BQU8zZ0UsRUFyMU1RLEVBdzFNYnlnRSxJQUNGemdFLEVBQUssR0FBS29hLEVBQU8sR0FFakJzbUQsR0EzMU1lLEVBMjFNRDVTLEVBQTJCLEVBejFNbkIsR0E0MU14QixJQUFJNTNFLEVBQVFra0MsRUFBTyxHQUNuQixHQUFJbGtDLEVBQU8sQ0FDVCxJQUFJK2tGLEVBQVdqN0QsRUFBSyxHQUNwQkEsRUFBSyxHQUFLaTdELEVBQVdELEdBQVlDLEVBQVUva0YsRUFBT2trQyxFQUFPLElBQU1sa0MsRUFDL0Q4cEIsRUFBSyxHQUFLaTdELEVBQVc1VSxHQUFlcm1ELEVBQUssR0FBSXk3QyxHQUFlcmhDLEVBQU8sSUFHckVsa0MsRUFBUWtrQyxFQUFPLE1BRWI2Z0QsRUFBV2o3RCxFQUFLLEdBQ2hCQSxFQUFLLEdBQUtpN0QsRUFBV1UsR0FBaUJWLEVBQVUva0YsRUFBT2trQyxFQUFPLElBQU1sa0MsRUFDcEU4cEIsRUFBSyxHQUFLaTdELEVBQVc1VSxHQUFlcm1ELEVBQUssR0FBSXk3QyxHQUFlcmhDLEVBQU8sS0FHckVsa0MsRUFBUWtrQyxFQUFPLE1BRWJwYSxFQUFLLEdBQUs5cEIsR0F2Mk1JLElBMDJNWnVxRixJQUNGemdFLEVBQUssR0FBZ0IsTUFBWEEsRUFBSyxHQUFhb2EsRUFBTyxHQUFLOHVDLEdBQVVscEQsRUFBSyxHQUFJb2EsRUFBTyxLQUdyRCxNQUFYcGEsRUFBSyxLQUNQQSxFQUFLLEdBQUtvYSxFQUFPLElBR25CcGEsRUFBSyxHQUFLb2EsRUFBTyxHQUNqQnBhLEVBQUssR0FBSzBnRSxFQTU5QlJFLENBQVViLEVBQVMvL0QsR0FFckJ3UyxFQUFPdXRELEVBQVEsR0FDZmpTLEVBQVVpUyxFQUFRLEdBQ2xCbGQsRUFBVWtkLEVBQVEsR0FDbEI5RSxFQUFXOEUsRUFBUSxHQUNuQjdFLEVBQVU2RSxFQUFRLEtBQ2xCN0IsRUFBUTZCLEVBQVEsUUFyOEtoQjFtRixJQXE4S3FCMG1GLEVBQVEsR0FDeEIxQixFQUFZLEVBQUk3ckQsRUFBS2g0QixPQUN0Qnl1RSxHQUFVOFcsRUFBUSxHQUFLdmxGLEVBQVEsS0FFWCxHQUFWc3pFLElBQ1pBLElBQVcsSUFFUkEsR0E1NktZLEdBNDZLREEsRUFHZDMyRCxFQTU2S2dCLEdBMjZLUDIyRCxHQTE2S2EsSUEwNktpQkEsRUFwZ0IzQyxTQUFxQnQ3QyxFQUFNczdDLEVBQVNvUSxHQUNsQyxJQUFJOXJELEVBQU8wcUQsR0FBV3RxRCxHQXdCdEIsT0F0QkEsU0FBUytxRCxJQU1QLElBTEEsSUFBSS9pRixFQUFTMUIsVUFBVTBCLE9BQ25CaEQsRUFBT21FLEVBQU1uQixHQUNiK0MsRUFBUS9DLEVBQ1JvckUsRUFBYzJZLEdBQVVoQixHQUVyQmhnRixLQUNML0YsRUFBSytGLEdBQVN6RSxVQUFVeUUsR0FFMUIsSUFBSTI5RSxFQUFXMWdGLEVBQVMsR0FBS2hELEVBQUssS0FBT291RSxHQUFlcHVFLEVBQUtnRCxFQUFTLEtBQU9vckUsRUFDekUsR0FDQVMsR0FBZTd1RSxFQUFNb3VFLEdBR3pCLElBREFwckUsR0FBVTBnRixFQUFRMWdGLFFBQ0wwakYsRUFDWCxPQUFPUSxHQUNMbHNELEVBQU1zN0MsRUFBUytQLEdBQWNOLEVBQVEzWCxpQkE3OUozQ3ZzRSxFQTg5Sk03QixFQUFNMGpGLE9BOTlKWjdoRixTQTg5SjJDNmtGLEVBQVExakYsR0FFakQsSUFBSW1rRixFQUFNeG1GLE1BQVFBLE9BQVN1b0MsSUFBUXZvQyxnQkFBZ0JvbEYsRUFBV25yRCxFQUFPSSxFQUNyRSxPQUFPbjdCLEdBQU1zbkYsRUFBSXhtRixLQUFNWCxJQThlZHFwRixDQUFZcnVELEVBQU1zN0MsRUFBU29RLEdBMTZLbEIsSUEyNktScFEsR0FBMkMsSUFBWEEsR0FBcURvTixFQUFRMWdGLE9BRzlGcWpGLEdBQWF4bUYsV0FuOUt4QmdDLEVBbTlLeUMwbUYsR0E5TzNDLFNBQXVCdnRELEVBQU1zN0MsRUFBU2pMLEVBQVNvWSxHQUM3QyxJQUFJbUQsRUF0c0thLEVBc3NLSnRRLEVBQ1QxN0MsRUFBTzBxRCxHQUFXdHFELEdBa0J0QixPQWhCQSxTQUFTK3FELElBUVAsSUFQQSxJQUFJbkMsR0FBYSxFQUNiQyxFQUFhdmlGLFVBQVUwQixPQUN2QitnRixHQUFhLEVBQ2JDLEVBQWFQLEVBQVN6Z0YsT0FDdEJoRCxFQUFPbUUsRUFBTTYvRSxFQUFhSCxHQUMxQnNELEVBQU14bUYsTUFBUUEsT0FBU3VvQyxJQUFRdm9DLGdCQUFnQm9sRixFQUFXbnJELEVBQU9JLElBRTVEK29ELEVBQVlDLEdBQ25CaGtGLEVBQUsrakYsR0FBYU4sRUFBU00sR0FFN0IsS0FBT0YsS0FDTDdqRixFQUFLK2pGLEtBQWV6aUYsWUFBWXNpRixHQUVsQyxPQUFPL2pGLEdBQU1zbkYsRUFBSVAsRUFBU3ZiLEVBQVUxcUUsS0FBTVgsSUEwTmpDc3BGLENBQWN0dUQsRUFBTXM3QyxFQUFTakwsRUFBU29ZLFFBSi9DLElBQUk5akUsRUFobUJSLFNBQW9CcWIsRUFBTXM3QyxFQUFTakwsR0FDakMsSUFBSXViLEVBOTBKYSxFQTgwSkp0USxFQUNUMTdDLEVBQU8wcUQsR0FBV3RxRCxHQU10QixPQUpBLFNBQVMrcUQsSUFDUCxJQUFJb0IsRUFBTXhtRixNQUFRQSxPQUFTdW9DLElBQVF2b0MsZ0JBQWdCb2xGLEVBQVduckQsRUFBT0ksRUFDckUsT0FBT21zRCxFQUFHdG5GLE1BQU0rbUYsRUFBU3ZiLEVBQVUxcUUsS0FBTVcsWUEwbEI1QmlvRixDQUFXdnVELEVBQU1zN0MsRUFBU2pMLEdBU3pDLE9BQU9vZCxJQURNamdFLEVBQU9xNEQsR0FBYzJILElBQ0o3b0UsRUFBUTRvRSxHQUFVdnRELEVBQU1zN0MsR0FleEQsU0FBU2tULEdBQXVCM1QsRUFBVXdILEVBQVVyK0UsRUFBS0csR0FDdkQsWUF0K0tBMEMsSUFzK0tJZzBFLEdBQ0NILEdBQUdHLEVBQVVsRyxHQUFZM3dFLE1BQVVNLEdBQWUxQixLQUFLdUIsRUFBUUgsR0FDM0RxK0UsRUFFRnhILEVBaUJULFNBQVM0VCxHQUFvQjVULEVBQVV3SCxFQUFVcitFLEVBQUtHLEVBQVF5akMsRUFBUXBZLEdBT3BFLE9BTkk0b0QsR0FBU3lDLElBQWF6QyxHQUFTaUssS0FFakM3eUQsRUFBTTVsQixJQUFJeTRFLEVBQVV4SCxHQUNwQjRJLEdBQVU1SSxFQUFVd0gsT0EvL0t0Qng3RSxFQSsvSzJDNG5GLEdBQXFCai9ELEdBQzlEQSxFQUFjLE9BQUU2eUQsSUFFWHhILEVBWVQsU0FBUzZULEdBQWdCaHJGLEdBQ3ZCLE9BQU9tOEIsR0FBY244QixRQS9nTHJCbUQsRUErZ0wwQ25ELEVBZ0I1QyxTQUFTcTlFLEdBQVloMEUsRUFBTzZaLEVBQU8wMEQsRUFBU0MsRUFBWWdGLEVBQVcvd0QsR0FDakUsSUFBSXl4RCxFQXBnTG1CLEVBb2dMUDNGLEVBQ1pxVCxFQUFZNWhGLEVBQU0vRSxPQUNsQiszRSxFQUFZbjVELEVBQU01ZSxPQUV0QixHQUFJMm1GLEdBQWE1TyxLQUFla0IsR0FBYWxCLEVBQVk0TyxHQUN2RCxPQUFPLEVBR1QsSUFBSUMsRUFBYXAvRCxFQUFNbHNCLElBQUl5SixHQUN2QjIwRSxFQUFhbHlELEVBQU1sc0IsSUFBSXNqQixHQUMzQixHQUFJZ29FLEdBQWNsTixFQUNoQixPQUFPa04sR0FBY2hvRSxHQUFTODZELEdBQWMzMEUsRUFFOUMsSUFBSWhDLEdBQVMsRUFDVDRaLEdBQVMsRUFDVHc3RCxFQWxoTHFCLEVBa2hMYjdFLEVBQW9DLElBQUloQyxRQS9pTHBEenlFLEVBcWpMQSxJQUpBMm9CLEVBQU01bEIsSUFBSW1ELEVBQU82WixHQUNqQjRJLEVBQU01bEIsSUFBSWdkLEVBQU83WixLQUdSaEMsRUFBUTRqRixHQUFXLENBQzFCLElBQUlFLEVBQVc5aEYsRUFBTWhDLEdBQ2pCNjJFLEVBQVdoN0QsRUFBTTdiLEdBRXJCLEdBQUl3d0UsRUFDRixJQUFJc0csRUFBV1osRUFDWDFGLEVBQVdxRyxFQUFVaU4sRUFBVTlqRixFQUFPNmIsRUFBTzdaLEVBQU95aUIsR0FDcEQrckQsRUFBV3NULEVBQVVqTixFQUFVNzJFLEVBQU9nQyxFQUFPNlosRUFBTzRJLEdBRTFELFFBOWpMRjNvQixJQThqTE1nN0UsRUFBd0IsQ0FDMUIsR0FBSUEsRUFDRixTQUVGbDlELEdBQVMsRUFDVCxNQUdGLEdBQUl3N0QsR0FDRixJQUFLM08sR0FBVTVxRCxHQUFPLFNBQVNnN0QsRUFBVTVCLEdBQ25DLElBQUtuTixHQUFTc04sRUFBTUgsS0FDZjZPLElBQWFqTixHQUFZckIsRUFBVXNPLEVBQVVqTixFQUFVdEcsRUFBU0MsRUFBWS9yRCxJQUMvRSxPQUFPMndELEVBQUtwNEUsS0FBS2k0RSxNQUVqQixDQUNOcjdELEdBQVMsRUFDVCxZQUVHLEdBQ0RrcUUsSUFBYWpOLElBQ1hyQixFQUFVc08sRUFBVWpOLEVBQVV0RyxFQUFTQyxFQUFZL3JELEdBQ3BELENBQ0w3SyxHQUFTLEVBQ1QsT0FLSixPQUZBNkssRUFBYyxPQUFFemlCLEdBQ2hCeWlCLEVBQWMsT0FBRTVJLEdBQ1RqQyxFQTBLVCxTQUFTZ21FLEdBQVMzcUQsR0FDaEIsT0FBT3dsRCxHQUFZQyxHQUFTemxELE9BcndMNUJuNUIsRUFxd0w2QzgvQixJQUFVM0csRUFBTyxJQVVoRSxTQUFTd3JCLEdBQVdybkQsR0FDbEIsT0FBTys2RSxHQUFlLzZFLEVBQVFpSCxHQUFNaXhFLElBV3RDLFNBQVNXLEdBQWE3NEUsR0FDcEIsT0FBTys2RSxHQUFlLzZFLEVBQVFnNEUsR0FBUUYsSUFVeEMsSUFBSWlQLEdBQVdoVSxHQUFpQixTQUFTbDNDLEdBQ3ZDLE9BQU9rM0MsR0FBUTV6RSxJQUFJMDhCLElBREl1b0MsR0FXekIsU0FBU3lpQixHQUFZaHJELEdBS25CLElBSkEsSUFBSXJiLEVBQVVxYixFQUFLaDlCLEtBQU8sR0FDdEIrSixFQUFRb3FFLEdBQVV4eUQsR0FDbEIzYyxFQUFTMUQsR0FBZTFCLEtBQUt1MEUsR0FBV3h5RCxHQUFVNVgsRUFBTS9FLE9BQVMsRUFFOURBLEtBQVUsQ0FDZixJQUFJd2xCLEVBQU96Z0IsRUFBTS9FLEdBQ2I4bUYsRUFBWXRoRSxFQUFLd1MsS0FDckIsR0FBaUIsTUFBYjh1RCxHQUFxQkEsR0FBYTl1RCxFQUNwQyxPQUFPeFMsRUFBS3hxQixLQUdoQixPQUFPMmhCLEVBVVQsU0FBU29uRSxHQUFVL3JELEdBRWpCLE9BRGExN0IsR0FBZTFCLEtBQUtrMUUsR0FBUSxlQUFpQkEsR0FBUzkzQyxHQUNyRG96QyxZQWNoQixTQUFTa1IsS0FDUCxJQUFJMy9ELEVBQVNtekQsR0FBT3RILFVBQVlBLEdBRWhDLE9BREE3ckQsRUFBU0EsSUFBVzZyRCxHQUFXZ1MsR0FBZTc5RCxFQUN2Q3JlLFVBQVUwQixPQUFTMmMsRUFBT3JlLFVBQVUsR0FBSUEsVUFBVSxJQUFNcWUsRUFXakUsU0FBU2k1RCxHQUFXbm9FLEVBQUt6UixHQUN2QixJQWdZaUJOLEVBQ2I2RCxFQWpZQWltQixFQUFPL1gsRUFBSThqRSxTQUNmLE9BaVlnQixXQURaaHlFLFNBRGE3RCxFQS9YQU0sS0FpWW1CLFVBQVJ1RCxHQUE0QixVQUFSQSxHQUE0QixXQUFSQSxFQUNyRCxjQUFWN0QsRUFDVSxPQUFWQSxHQWxZRDhwQixFQUFtQixpQkFBUHhwQixFQUFrQixTQUFXLFFBQ3pDd3BCLEVBQUsvWCxJQVVYLFNBQVMydEUsR0FBYWovRSxHQUlwQixJQUhBLElBQUl3Z0IsRUFBU3ZaLEdBQUtqSCxHQUNkNkQsRUFBUzJjLEVBQU8zYyxPQUViQSxLQUFVLENBQ2YsSUFBSWhFLEVBQU0yZ0IsRUFBTzNjLEdBQ2J0RSxFQUFRUyxFQUFPSCxHQUVuQjJnQixFQUFPM2MsR0FBVSxDQUFDaEUsRUFBS04sRUFBTzYvRSxHQUFtQjcvRSxJQUVuRCxPQUFPaWhCLEVBV1QsU0FBU2t4RCxHQUFVMXhFLEVBQVFILEdBQ3pCLElBQUlOLEVBbHhKUixTQUFrQlMsRUFBUUgsR0FDeEIsT0FBaUIsTUFBVkcsT0F4bkNMMEMsRUF3bkNrQzFDLEVBQU9ILEdBaXhKN0IrcUYsQ0FBUzVxRixFQUFRSCxHQUM3QixPQUFPdStFLEdBQWE3K0UsR0FBU0EsT0ExNEw3Qm1ELEVBKzZMRixJQUFJdzFFLEdBQWNsRyxHQUErQixTQUFTaHlFLEdBQ3hELE9BQWMsTUFBVkEsRUFDSyxJQUVUQSxFQUFTaEIsR0FBT2dCLEdBQ1Qyc0UsR0FBWXFGLEdBQWlCaHlFLElBQVMsU0FBU3k0RSxHQUNwRCxPQUFPckgsR0FBcUIzeUUsS0FBS3VCLEVBQVF5NEUsUUFOUm9TLEdBaUJqQy9TLEdBQWdCOUYsR0FBK0IsU0FBU2h5RSxHQUUxRCxJQURBLElBQUl3Z0IsRUFBUyxHQUNOeGdCLEdBQ0xpdEUsR0FBVXpzRCxFQUFRMDNELEdBQVdsNEUsSUFDN0JBLEVBQVNreEUsR0FBYWx4RSxHQUV4QixPQUFPd2dCLEdBTjhCcXFFLEdBZ0JuQ25ULEdBQVN3RCxHQTJFYixTQUFTNFAsR0FBUTlxRixFQUFRa1IsRUFBTTY1RSxHQU83QixJQUpBLElBQUlua0YsR0FBUyxFQUNUL0MsR0FISnFOLEVBQU8ycEUsR0FBUzNwRSxFQUFNbFIsSUFHSjZELE9BQ2QyYyxHQUFTLElBRUo1WixFQUFRL0MsR0FBUSxDQUN2QixJQUFJaEUsRUFBTWk3RSxHQUFNNXBFLEVBQUt0SyxJQUNyQixLQUFNNFosRUFBbUIsTUFBVnhnQixHQUFrQitxRixFQUFRL3FGLEVBQVFILElBQy9DLE1BRUZHLEVBQVNBLEVBQU9ILEdBRWxCLE9BQUkyZ0IsS0FBWTVaLEdBQVMvQyxFQUNoQjJjLEtBRVQzYyxFQUFtQixNQUFWN0QsRUFBaUIsRUFBSUEsRUFBTzZELFNBQ2xCbW5GLEdBQVNubkYsSUFBV2l5RSxHQUFRajJFLEVBQUtnRSxLQUNqRG1uQixHQUFRaHJCLElBQVcwMUUsR0FBWTExRSxJQTZCcEMsU0FBUzYzRSxHQUFnQjczRSxHQUN2QixNQUFxQyxtQkFBdEJBLEVBQU91SCxhQUE4Qm0zRSxHQUFZMStFLEdBRTVELEdBREFnMEUsR0FBVzlDLEdBQWFseEUsSUE4RTlCLFNBQVNzNkUsR0FBYy82RSxHQUNyQixPQUFPeXJCLEdBQVF6ckIsSUFBVW0yRSxHQUFZbjJFLE9BQ2hDOHhFLElBQW9COXhFLEdBQVNBLEVBQU04eEUsS0FXMUMsU0FBU3lFLEdBQVF2MkUsRUFBT3NFLEdBQ3RCLElBQUlULFNBQWM3RCxFQUdsQixTQUZBc0UsRUFBbUIsTUFBVkEsRUFobk1VLGlCQWduTTBCQSxLQUdsQyxVQUFSVCxHQUNVLFVBQVJBLEdBQW9Ca2xFLEdBQVM5L0QsS0FBS2pKLEtBQ2hDQSxHQUFTLEdBQUtBLEVBQVEsR0FBSyxHQUFLQSxFQUFRc0UsRUFhakQsU0FBUzhoRixHQUFlcG1GLEVBQU9xSCxFQUFPNUcsR0FDcEMsSUFBS2kwRSxHQUFTajBFLEdBQ1osT0FBTyxFQUVULElBQUlvRCxTQUFjd0QsRUFDbEIsU0FBWSxVQUFSeEQsRUFDSzQ3RSxHQUFZaC9FLElBQVc4MUUsR0FBUWx2RSxFQUFPNUcsRUFBTzZELFFBQ3JDLFVBQVJULEdBQW9Cd0QsS0FBUzVHLElBRTdCdTJFLEdBQUd2MkUsRUFBTzRHLEdBQVFySCxHQWE3QixTQUFTNC9FLEdBQU01L0UsRUFBT1MsR0FDcEIsR0FBSWdyQixHQUFRenJCLEdBQ1YsT0FBTyxFQUVULElBQUk2RCxTQUFjN0QsRUFDbEIsUUFBWSxVQUFSNkQsR0FBNEIsVUFBUkEsR0FBNEIsV0FBUkEsR0FDL0IsTUFBVDdELElBQWlCMjZFLEdBQVMzNkUsTUFHdkI2bkUsRUFBYzUrRCxLQUFLakosS0FBVzRuRSxFQUFhMytELEtBQUtqSixJQUMxQyxNQUFWUyxHQUFrQlQsS0FBU1AsR0FBT2dCLElBeUJ2QyxTQUFTZ25GLEdBQVduckQsR0FDbEIsSUFBSWlyRCxFQUFXRCxHQUFZaHJELEdBQ3ZCcFosRUFBUWt4RCxHQUFPbVQsR0FFbkIsR0FBb0IsbUJBQVRya0UsS0FBeUJxa0UsS0FBWWpULEdBQVkzekUsV0FDMUQsT0FBTyxFQUVULEdBQUkyN0IsSUFBU3BaLEVBQ1gsT0FBTyxFQUVULElBQUk0RyxFQUFPMDlELEdBQVF0a0UsR0FDbkIsUUFBUzRHLEdBQVF3UyxJQUFTeFMsRUFBSyxJQTdTNUJ1cEQsSUFBWThFLEdBQU8sSUFBSTlFLEdBQVMsSUFBSXZyRCxZQUFZLE1BQVEyK0MsR0FDeER0ckMsSUFBT2c5QyxHQUFPLElBQUloOUMsS0FBUTZxQyxHQUMxQjVqRSxJQXYzTFUsb0JBdTNMQysxRSxHQUFPLzFFLEdBQVFDLFlBQzFCb1EsSUFBTzBsRSxHQUFPLElBQUkxbEUsS0FBUTJ6RCxHQUMxQmtOLElBQVc2RSxHQUFPLElBQUk3RSxLQUFZL00sS0FDckM0UixHQUFTLFNBQVNuNEUsR0FDaEIsSUFBSWloQixFQUFTMDZELEdBQVczN0UsR0FDcEJrOEIsRUFBT2piLEdBQVVpbEQsRUFBWWxtRSxFQUFNZ0ksaUJBMTlMekM3RSxFQTI5TE11b0YsRUFBYXh2RCxFQUFPeTNDLEdBQVN6M0MsR0FBUSxHQUV6QyxHQUFJd3ZELEVBQ0YsT0FBUUEsR0FDTixLQUFLaFksR0FBb0IsT0FBT2pOLEVBQ2hDLEtBQUttTixHQUFlLE9BQU81TixFQUMzQixLQUFLNk4sR0FBbUIsTUFuNExqQixtQkFvNExQLEtBQUtDLEdBQWUsT0FBTzFOLEVBQzNCLEtBQUsyTixHQUFtQixPQUFPeE4sRUFHbkMsT0FBT3RsRCxJQStTWCxJQUFJMHFFLEdBQWF6YSxHQUFha0ssR0FBYXdRLEdBUzNDLFNBQVN6TSxHQUFZbi9FLEdBQ25CLElBQUlrOEIsRUFBT2w4QixHQUFTQSxFQUFNZ0ksWUFHMUIsT0FBT2hJLEtBRnFCLG1CQUFSazhCLEdBQXNCQSxFQUFLdjdCLFdBQWNzd0UsSUFhL0QsU0FBUzRPLEdBQW1CNy9FLEdBQzFCLE9BQU9BLEdBQVVBLElBQVUwMEUsR0FBUzEwRSxHQVl0QyxTQUFTMi9FLEdBQXdCci9FLEVBQUtxK0UsR0FDcEMsT0FBTyxTQUFTbCtFLEdBQ2QsT0FBYyxNQUFWQSxJQUdHQSxFQUFPSCxLQUFTcStFLFNBL3pNekJ4N0UsSUFnME1LdzdFLEdBQTJCcitFLEtBQU9iLEdBQU9nQixNQXNJaEQsU0FBU3NoRixHQUFTemxELEVBQU0wSyxFQUFPa3BDLEdBRTdCLE9BREFscEMsRUFBUStyQyxRQXY4TVI1dkUsSUF1OE1rQjZqQyxFQUF1QjFLLEVBQUtoNEIsT0FBUyxFQUFLMGlDLEVBQU8sR0FDNUQsV0FNTCxJQUxBLElBQUkxbEMsRUFBT3NCLFVBQ1B5RSxHQUFTLEVBQ1QvQyxFQUFTeXVFLEdBQVV6eEUsRUFBS2dELE9BQVMwaUMsRUFBTyxHQUN4QzM5QixFQUFRNUQsRUFBTW5CLEtBRVQrQyxFQUFRL0MsR0FDZitFLEVBQU1oQyxHQUFTL0YsRUFBSzBsQyxFQUFRMy9CLEdBRTlCQSxHQUFTLEVBRVQsSUFEQSxJQUFJd2tGLEVBQVlwbUYsRUFBTXVoQyxFQUFRLEtBQ3JCMy9CLEVBQVEyL0IsR0FDZjZrRCxFQUFVeGtGLEdBQVMvRixFQUFLK0YsR0FHMUIsT0FEQXdrRixFQUFVN2tELEdBQVNrcEMsRUFBVTdtRSxHQUN0QmxJLEdBQU1tN0IsRUFBTXI2QixLQUFNNHBGLElBWTdCLFNBQVM5N0UsR0FBT3RQLEVBQVFrUixHQUN0QixPQUFPQSxFQUFLck4sT0FBUyxFQUFJN0QsRUFBUzQ2RSxHQUFRNTZFLEVBQVE4aEYsR0FBVTV3RSxFQUFNLEdBQUksSUFheEUsU0FBUysyRSxHQUFRci9FLEVBQU9xNEUsR0FLdEIsSUFKQSxJQUFJdUosRUFBWTVoRixFQUFNL0UsT0FDbEJBLEVBQVMwdUUsR0FBVTBPLEVBQVFwOUUsT0FBUTJtRixHQUNuQ2EsRUFBV2xWLEdBQVV2dEUsR0FFbEIvRSxLQUFVLENBQ2YsSUFBSStDLEVBQVFxNkUsRUFBUXA5RSxHQUNwQitFLEVBQU0vRSxHQUFVaXlFLEdBQVFsdkUsRUFBTzRqRixHQUFhYSxFQUFTemtGLFFBeC9NdkRsRSxFQTAvTUEsT0FBT2tHLEVBV1QsU0FBUzYyRSxHQUFRei9FLEVBQVFILEdBQ3ZCLElBQVksZ0JBQVJBLEdBQWdELG1CQUFoQkcsRUFBT0gsS0FJaEMsYUFBUEEsRUFJSixPQUFPRyxFQUFPSCxHQWlCaEIsSUFBSXdwRixHQUFVaUMsR0FBUzVKLElBVW5CcjVFLEdBQWF3cEUsSUFBaUIsU0FBU2gyQyxFQUFNbTlDLEdBQy9DLE9BQU9qdkMsR0FBSzFoQyxXQUFXd3pCLEVBQU1tOUMsSUFXM0JxSSxHQUFjaUssR0FBUzNKLElBWTNCLFNBQVMySCxHQUFnQjFDLEVBQVMyRSxFQUFXcFUsR0FDM0MsSUFBSTF6QyxFQUFVOG5ELEVBQVksR0FDMUIsT0FBT2xLLEdBQVl1RixFQTFickIsU0FBMkJuakQsRUFBUStuRCxHQUNqQyxJQUFJM25GLEVBQVMybkYsRUFBUTNuRixPQUNyQixJQUFLQSxFQUNILE9BQU80L0IsRUFFVCxJQUFJcXNDLEVBQVlqc0UsRUFBUyxFQUd6QixPQUZBMm5GLEVBQVExYixJQUFjanNFLEVBQVMsRUFBSSxLQUFPLElBQU0ybkYsRUFBUTFiLEdBQ3hEMGIsRUFBVUEsRUFBUW5xRSxLQUFLeGQsRUFBUyxFQUFJLEtBQU8sS0FDcEM0L0IsRUFBT2puQixRQUFRa3JELEVBQWUsdUJBQXlCOGpCLEVBQVUsVUFrYjVDQyxDQUFrQmhvRCxFQXFIaEQsU0FBMkIrbkQsRUFBU3JVLEdBT2xDLE9BTkE1SyxHQUFVeEgsR0FBVyxTQUFTMmtCLEdBQzVCLElBQUlucUYsRUFBUSxLQUFPbXFGLEVBQUssR0FDbkJ2UyxFQUFVdVMsRUFBSyxLQUFRN2MsR0FBYzJlLEVBQVNqc0YsSUFDakRpc0YsRUFBUTVuRixLQUFLckUsTUFHVmlzRixFQUFReDRELE9BNUh1QzA0RCxDQXRqQnhELFNBQXdCam9ELEdBQ3RCLElBQUlweUIsRUFBUW95QixFQUFPcHlCLE1BQU1zMkQsR0FDekIsT0FBT3QyRCxFQUFRQSxFQUFNLEdBQUdrZCxNQUFNcTVDLEdBQWtCLEdBb2pCd0IrakIsQ0FBZWxvRCxHQUFTMHpDLEtBWWxHLFNBQVNtVSxHQUFTenZELEdBQ2hCLElBQUkzM0IsRUFBUSxFQUNSMG5GLEVBQWEsRUFFakIsT0FBTyxXQUNMLElBQUlDLEVBQVFyWixLQUNSc1osRUFwaU5LLElBb2lObUJELEVBQVFELEdBR3BDLEdBREFBLEVBQWFDLEVBQ1RDLEVBQVksR0FDZCxLQUFNNW5GLEdBemlORSxJQTBpTk4sT0FBTy9CLFVBQVUsUUFHbkIrQixFQUFRLEVBRVYsT0FBTzIzQixFQUFLbjdCLFdBL2xOZGdDLEVBK2xOK0JQLFlBWWpDLFNBQVMrekUsR0FBWXR0RSxFQUFPNkosR0FDMUIsSUFBSTdMLEdBQVMsRUFDVC9DLEVBQVMrRSxFQUFNL0UsT0FDZmlzRSxFQUFZanNFLEVBQVMsRUFHekIsSUFEQTRPLE9BaG5OQS9QLElBZ25OTytQLEVBQXFCNU8sRUFBUzRPLElBQzVCN0wsRUFBUTZMLEdBQU0sQ0FDckIsSUFBSXM1RSxFQUFPL1YsR0FBV3B2RSxFQUFPa3BFLEdBQ3pCdndFLEVBQVFxSixFQUFNbWpGLEdBRWxCbmpGLEVBQU1takYsR0FBUW5qRixFQUFNaEMsR0FDcEJnQyxFQUFNaEMsR0FBU3JILEVBR2pCLE9BREFxSixFQUFNL0UsT0FBUzRPLEVBQ1I3SixFQVVULElBQUltN0UsR0F2VEosU0FBdUJsb0QsR0FDckIsSUFBSXJiLEVBQVN3ckUsR0FBUW53RCxHQUFNLFNBQVNoOEIsR0FJbEMsT0FoME1pQixNQTZ6TWI4dUUsRUFBTWw4RCxNQUNSazhELEVBQU1vRyxRQUVEbDFFLEtBR0w4dUUsRUFBUW51RCxFQUFPbXVELE1BQ25CLE9BQU9udUQsRUE4U1V5ckUsRUFBYyxTQUFTdGxELEdBQ3hDLElBQUlubUIsRUFBUyxHQU9iLE9BTjZCLEtBQXpCbW1CLEVBQU96Z0IsV0FBVyxJQUNwQjFGLEVBQU81YyxLQUFLLElBRWQraUMsRUFBT25xQixRQUFRNnFELEdBQVksU0FBU2gyRCxFQUFPc2QsRUFBUXU5RCxFQUFPQyxHQUN4RDNyRSxFQUFPNWMsS0FBS3NvRixFQUFRQyxFQUFVM3ZFLFFBQVF1ckQsR0FBYyxNQUFTcDVDLEdBQVV0ZCxNQUVsRW1QLEtBVVQsU0FBU3M2RCxHQUFNdjdFLEdBQ2IsR0FBb0IsaUJBQVRBLEdBQXFCMjZFLEdBQVMzNkUsR0FDdkMsT0FBT0EsRUFFVCxJQUFJaWhCLEVBQVVqaEIsRUFBUSxHQUN0QixNQUFrQixLQUFWaWhCLEdBQWtCLEVBQUlqaEIsSUFqbU5uQixJQWltTjBDLEtBQU9paEIsRUFVOUQsU0FBUzB5RCxHQUFTcjNDLEdBQ2hCLEdBQVksTUFBUkEsRUFBYyxDQUNoQixJQUNFLE9BQU9kLEdBQWF0OEIsS0FBS285QixHQUN6QixNQUFPMWtCLElBQ1QsSUFDRSxPQUFRMGtCLEVBQU8sR0FDZixNQUFPMWtCLEtBRVgsTUFBTyxHQTRCVCxTQUFTNDhELEdBQWE2UyxHQUNwQixHQUFJQSxhQUFtQi9TLEdBQ3JCLE9BQU8rUyxFQUFRM3JELFFBRWpCLElBQUl6YSxFQUFTLElBQUlzekQsR0FBYzhTLEVBQVF4UyxZQUFhd1MsRUFBUXRTLFdBSTVELE9BSEE5ekQsRUFBTzZ6RCxZQUFjOEIsR0FBVXlRLEVBQVF2UyxhQUN2Qzd6RCxFQUFPK3pELFVBQWFxUyxFQUFRclMsVUFDNUIvekQsRUFBT2cwRCxXQUFhb1MsRUFBUXBTLFdBQ3JCaDBELEVBc0lULElBQUk0ckUsR0FBYWhMLElBQVMsU0FBU3g0RSxFQUFPMkosR0FDeEMsT0FBT3F0RSxHQUFrQmgzRSxHQUNyQnF3RSxHQUFlcndFLEVBQU93eEUsR0FBWTduRSxFQUFRLEVBQUdxdEUsSUFBbUIsSUFDaEUsTUE2QkZ5TSxHQUFlakwsSUFBUyxTQUFTeDRFLEVBQU8ySixHQUMxQyxJQUFJODVELEVBQVc5UyxHQUFLaG5ELEdBSXBCLE9BSElxdEUsR0FBa0J2VCxLQUNwQkEsT0ExM05GM3BFLEdBNDNOT2s5RSxHQUFrQmgzRSxHQUNyQnF3RSxHQUFlcndFLEVBQU93eEUsR0FBWTduRSxFQUFRLEVBQUdxdEUsSUFBbUIsR0FBT08sR0FBWTlULEVBQVUsSUFDN0YsTUEwQkZpZ0IsR0FBaUJsTCxJQUFTLFNBQVN4NEUsRUFBTzJKLEdBQzVDLElBQUlnM0IsRUFBYWd3QixHQUFLaG5ELEdBSXRCLE9BSElxdEUsR0FBa0JyMkMsS0FDcEJBLE9BMzVORjdtQyxHQTY1Tk9rOUUsR0FBa0JoM0UsR0FDckJxd0UsR0FBZXJ3RSxFQUFPd3hFLEdBQVk3bkUsRUFBUSxFQUFHcXRFLElBQW1CLFFBOTVOcEVsOUUsRUE4NU5zRjZtQyxHQUNsRixNQXNPTixTQUFTZ2pELEdBQVUzakYsRUFBTzhqRSxFQUFXa0IsR0FDbkMsSUFBSS9wRSxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLElBQUtBLEVBQ0gsT0FBUSxFQUVWLElBQUkrQyxFQUFxQixNQUFiZ25FLEVBQW9CLEVBQUk2YixHQUFVN2IsR0FJOUMsT0FISWhuRSxFQUFRLElBQ1ZBLEVBQVEwckUsR0FBVXp1RSxFQUFTK0MsRUFBTyxJQUU3QittRSxHQUFjL2tFLEVBQU91M0UsR0FBWXpULEVBQVcsR0FBSTlsRSxHQXNDekQsU0FBUzRsRixHQUFjNWpGLEVBQU84akUsRUFBV2tCLEdBQ3ZDLElBQUkvcEUsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxJQUFLQSxFQUNILE9BQVEsRUFFVixJQUFJK0MsRUFBUS9DLEVBQVMsRUFPckIsWUFoc09BbkIsSUEwck9Ja3JFLElBQ0ZobkUsRUFBUTZpRixHQUFVN2IsR0FDbEJobkUsRUFBUWduRSxFQUFZLEVBQ2hCMEUsR0FBVXp1RSxFQUFTK0MsRUFBTyxHQUMxQjJyRSxHQUFVM3JFLEVBQU8vQyxFQUFTLElBRXpCOHBFLEdBQWMva0UsRUFBT3UzRSxHQUFZelQsRUFBVyxHQUFJOWxFLEdBQU8sR0FpQmhFLFNBQVM0N0IsR0FBUTU1QixHQUVmLE9BRHNCLE1BQVRBLEVBQWdCLEVBQUlBLEVBQU0vRSxRQUN2QnUyRSxHQUFZeHhFLEVBQU8sR0FBSyxHQWdHMUMsU0FBUzZqRixHQUFLN2pGLEdBQ1osT0FBUUEsR0FBU0EsRUFBTS9FLE9BQVUrRSxFQUFNLFFBcHpPdkNsRyxFQTgzT0YsSUFBSWdxRixHQUFldEwsSUFBUyxTQUFTekYsR0FDbkMsSUFBSWdSLEVBQVMzZixHQUFTMk8sRUFBUWtJLElBQzlCLE9BQVE4SSxFQUFPOW9GLFFBQVU4b0YsRUFBTyxLQUFPaFIsRUFBTyxHQUMxQ0QsR0FBaUJpUixHQUNqQixNQTBCRkMsR0FBaUJ4TCxJQUFTLFNBQVN6RixHQUNyQyxJQUFJdFAsRUFBVzlTLEdBQUtvaUIsR0FDaEJnUixFQUFTM2YsR0FBUzJPLEVBQVFrSSxJQU85QixPQUxJeFgsSUFBYTlTLEdBQUtvekIsR0FDcEJ0Z0IsT0FqNk9GM3BFLEVBbTZPRWlxRixFQUFPOWxGLE1BRUQ4bEYsRUFBTzlvRixRQUFVOG9GLEVBQU8sS0FBT2hSLEVBQU8sR0FDMUNELEdBQWlCaVIsRUFBUXhNLEdBQVk5VCxFQUFVLElBQy9DLE1Bd0JGd2dCLEdBQW1CekwsSUFBUyxTQUFTekYsR0FDdkMsSUFBSXB5QyxFQUFhZ3dCLEdBQUtvaUIsR0FDbEJnUixFQUFTM2YsR0FBUzJPLEVBQVFrSSxJQU05QixPQUpBdDZDLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0FuOE8vQzdtQyxJQXE4T0VpcUYsRUFBTzlsRixNQUVEOGxGLEVBQU85b0YsUUFBVThvRixFQUFPLEtBQU9oUixFQUFPLEdBQzFDRCxHQUFpQmlSLE9BeDhPckJqcUYsRUF3OE93QzZtQyxHQUNwQyxNQW9DTixTQUFTZ3dCLEdBQUszd0QsR0FDWixJQUFJL0UsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxPQUFPQSxFQUFTK0UsRUFBTS9FLEVBQVMsUUEvK08vQm5CLEVBc2tQRixJQUFJa2dFLEdBQU93ZSxHQUFTMEwsSUFzQnBCLFNBQVNBLEdBQVFsa0YsRUFBTzJKLEdBQ3RCLE9BQVEzSixHQUFTQSxFQUFNL0UsUUFBVTBPLEdBQVVBLEVBQU8xTyxPQUM5Q2s5RSxHQUFZbjRFLEVBQU8ySixHQUNuQjNKLEVBcUZOLElBQUlta0YsR0FBU3ZHLElBQVMsU0FBUzU5RSxFQUFPcTRFLEdBQ3BDLElBQUlwOUUsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUNuQzJjLEVBQVN3MkQsR0FBT3B1RSxFQUFPcTRFLEdBTTNCLE9BSkFELEdBQVdwNEUsRUFBT29rRSxHQUFTaVUsR0FBUyxTQUFTcjZFLEdBQzNDLE9BQU9rdkUsR0FBUWx2RSxFQUFPL0MsSUFBVytDLEVBQVFBLEtBQ3hDb3NCLEtBQUswdEQsS0FFRGxnRSxLQTJFVCxTQUFTcW9CLEdBQVFqZ0MsR0FDZixPQUFnQixNQUFUQSxFQUFnQkEsRUFBUStwRSxHQUFjbDBFLEtBQUttSyxHQWthcEQsSUFBSW9rRixHQUFRNUwsSUFBUyxTQUFTekYsR0FDNUIsT0FBT3FILEdBQVM1SSxHQUFZdUIsRUFBUSxFQUFHaUUsSUFBbUIsT0EwQnhEcU4sR0FBVTdMLElBQVMsU0FBU3pGLEdBQzlCLElBQUl0UCxFQUFXOVMsR0FBS29pQixHQUlwQixPQUhJaUUsR0FBa0J2VCxLQUNwQkEsT0F4c1FGM3BFLEdBMHNRT3NnRixHQUFTNUksR0FBWXVCLEVBQVEsRUFBR2lFLElBQW1CLEdBQU9PLEdBQVk5VCxFQUFVLE9Bd0JyRjZnQixHQUFZOUwsSUFBUyxTQUFTekYsR0FDaEMsSUFBSXB5QyxFQUFhZ3dCLEdBQUtvaUIsR0FFdEIsT0FEQXB5QyxFQUFrQyxtQkFBZEEsRUFBMkJBLE9BcHVRL0M3bUMsRUFxdVFPc2dGLEdBQVM1SSxHQUFZdUIsRUFBUSxFQUFHaUUsSUFBbUIsUUFydVExRGw5RSxFQXF1UTRFNm1DLE1BZ0c5RSxTQUFTNGpELEdBQU12a0YsR0FDYixJQUFNQSxJQUFTQSxFQUFNL0UsT0FDbkIsTUFBTyxHQUVULElBQUlBLEVBQVMsRUFPYixPQU5BK0UsRUFBUStqRSxHQUFZL2pFLEdBQU8sU0FBU3lKLEdBQ2xDLEdBQUl1dEUsR0FBa0J2dEUsR0FFcEIsT0FEQXhPLEVBQVN5dUUsR0FBVWpnRSxFQUFNeE8sT0FBUUEsSUFDMUIsS0FHSndxRSxHQUFVeHFFLEdBQVEsU0FBUytDLEdBQ2hDLE9BQU9vbUUsR0FBU3BrRSxFQUFPMmtFLEdBQWEzbUUsT0F5QnhDLFNBQVN3bUYsR0FBVXhrRixFQUFPeWpFLEdBQ3hCLElBQU16akUsSUFBU0EsRUFBTS9FLE9BQ25CLE1BQU8sR0FFVCxJQUFJMmMsRUFBUzJzRSxHQUFNdmtGLEdBQ25CLE9BQWdCLE1BQVp5akUsRUFDSzdyRCxFQUVGd3NELEdBQVN4c0QsR0FBUSxTQUFTbk8sR0FDL0IsT0FBTzNSLEdBQU0yckUsT0FuM1FmM3BFLEVBbTNRb0MyUCxNQXdCdEMsSUFBSWc3RSxHQUFVak0sSUFBUyxTQUFTeDRFLEVBQU8ySixHQUNyQyxPQUFPcXRFLEdBQWtCaDNFLEdBQ3JCcXdFLEdBQWVyd0UsRUFBTzJKLEdBQ3RCLE1BcUJGKzZFLEdBQU1sTSxJQUFTLFNBQVN6RixHQUMxQixPQUFPOEgsR0FBUTlXLEdBQVlnUCxFQUFRaUUsUUEwQmpDMk4sR0FBUW5NLElBQVMsU0FBU3pGLEdBQzVCLElBQUl0UCxFQUFXOVMsR0FBS29pQixHQUlwQixPQUhJaUUsR0FBa0J2VCxLQUNwQkEsT0FqOFFGM3BFLEdBbThRTytnRixHQUFROVcsR0FBWWdQLEVBQVFpRSxJQUFvQk8sR0FBWTlULEVBQVUsT0F3QjNFbWhCLEdBQVVwTSxJQUFTLFNBQVN6RixHQUM5QixJQUFJcHlDLEVBQWFnd0IsR0FBS29pQixHQUV0QixPQURBcHlDLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0E3OVEvQzdtQyxFQTg5UU8rZ0YsR0FBUTlXLEdBQVlnUCxFQUFRaUUsU0E5OVFuQ2w5RSxFQTg5UWtFNm1DLE1BbUJoRWtrRCxHQUFNck0sR0FBUytMLElBNkRuQixJQUFJTyxHQUFVdE0sSUFBUyxTQUFTekYsR0FDOUIsSUFBSTkzRSxFQUFTODNFLEVBQU85M0UsT0FDaEJ3b0UsRUFBV3hvRSxFQUFTLEVBQUk4M0UsRUFBTzkzRSxFQUFTLFFBaGpSNUNuQixFQW1qUkEsT0FEQTJwRSxFQUE4QixtQkFBWkEsR0FBMEJzUCxFQUFPOTBFLE1BQU93bEUsUUFsalIxRDNwRSxFQW1qUk8wcUYsR0FBVXpSLEVBQVF0UCxNQWtDM0IsU0FBU3NoQixHQUFNcHVGLEdBQ2IsSUFBSWloQixFQUFTbXpELEdBQU9wMEUsR0FFcEIsT0FEQWloQixFQUFPOHpELFdBQVksRUFDWjl6RCxFQXNEVCxTQUFTbW1FLEdBQUtwbkYsRUFBT3F1RixHQUNuQixPQUFPQSxFQUFZcnVGLEdBbUJyQixJQUFJc3VGLEdBQVlySCxJQUFTLFNBQVNyOUMsR0FDaEMsSUFBSXRsQyxFQUFTc2xDLEVBQU10bEMsT0FDZjBpQyxFQUFRMWlDLEVBQVNzbEMsRUFBTSxHQUFLLEVBQzVCNXBDLEVBQVFpQyxLQUFLNHlFLFlBQ2J3WixFQUFjLFNBQVM1dEYsR0FBVSxPQUFPZzNFLEdBQU9oM0UsRUFBUW1wQyxJQUUzRCxRQUFJdGxDLEVBQVMsR0FBS3JDLEtBQUs2eUUsWUFBWXh3RSxTQUM3QnRFLGFBQWlCczBFLElBQWlCaUMsR0FBUXZ2QyxLQUdoRGhuQyxFQUFRQSxFQUFNMkMsTUFBTXFrQyxHQUFRQSxHQUFTMWlDLEVBQVMsRUFBSSxLQUM1Q3d3RSxZQUFZendFLEtBQUssQ0FDckIsS0FBUStpRixHQUNSLEtBQVEsQ0FBQ2lILEdBQ1QsYUFoclJGbHJGLElBa3JSTyxJQUFJb3hFLEdBQWN2MEUsRUFBT2lDLEtBQUs4eUUsV0FBV3FTLE1BQUssU0FBUy85RSxHQUk1RCxPQUhJL0UsSUFBVytFLEVBQU0vRSxRQUNuQitFLEVBQU1oRixVQXByUlZsQixHQXNyUlNrRyxNQVpBcEgsS0FBS21sRixLQUFLaUgsTUErUHJCLElBQUlFLEdBQVV6SSxJQUFpQixTQUFTN2tFLEVBQVFqaEIsRUFBT00sR0FDakRNLEdBQWUxQixLQUFLK2hCLEVBQVEzZ0IsS0FDNUIyZ0IsRUFBTzNnQixHQUVUMjJFLEdBQWdCaDJELEVBQVEzZ0IsRUFBSyxNQXVJakMsSUFBSXVmLEdBQU9pbkUsR0FBV2tHLElBcUJsQndCLEdBQVcxSCxHQUFXbUcsSUEyRzFCLFNBQVNyaEYsR0FBUXNpRSxFQUFZcEIsR0FFM0IsT0FEV3JoRCxHQUFReWlELEdBQWNsQixHQUFZc0ssSUFDakNwSixFQUFZMFMsR0FBWTlULEVBQVUsSUF1QmhELFNBQVMyaEIsR0FBYXZnQixFQUFZcEIsR0FFaEMsT0FEV3JoRCxHQUFReWlELEdBQWNqQixHQUFpQnNOLElBQ3RDck0sRUFBWTBTLEdBQVk5VCxFQUFVLElBMEJoRCxJQUFJNGhCLEdBQVU1SSxJQUFpQixTQUFTN2tFLEVBQVFqaEIsRUFBT00sR0FDakRNLEdBQWUxQixLQUFLK2hCLEVBQVEzZ0IsR0FDOUIyZ0IsRUFBTzNnQixHQUFLK0QsS0FBS3JFLEdBRWpCaTNFLEdBQWdCaDJELEVBQVEzZ0IsRUFBSyxDQUFDTixPQXNFbEMsSUFBSTJ1RixHQUFZOU0sSUFBUyxTQUFTM1QsRUFBWXY4RCxFQUFNclEsR0FDbEQsSUFBSStGLEdBQVMsRUFDVCt3RSxFQUF3QixtQkFBUnptRSxFQUNoQnNQLEVBQVN3K0QsR0FBWXZSLEdBQWN6b0UsRUFBTXlvRSxFQUFXNXBFLFFBQVUsR0FLbEUsT0FIQWd6RSxHQUFTcEosR0FBWSxTQUFTbHVFLEdBQzVCaWhCLElBQVM1WixHQUFTK3dFLEVBQVNqM0UsR0FBTXdRLEVBQU0zUixFQUFPc0IsR0FBUW83RSxHQUFXMThFLEVBQU8yUixFQUFNclEsTUFFekUyZixLQStCTDJ0RSxHQUFROUksSUFBaUIsU0FBUzdrRSxFQUFRamhCLEVBQU9NLEdBQ25EMjJFLEdBQWdCaDJELEVBQVEzZ0IsRUFBS04sTUE2Qy9CLFNBQVMrUixHQUFJbThELEVBQVlwQixHQUV2QixPQURXcmhELEdBQVF5aUQsR0FBY1QsR0FBVytSLElBQ2hDdFIsRUFBWTBTLEdBQVk5VCxFQUFVLElBa0ZoRCxJQUFJK2hCLEdBQVkvSSxJQUFpQixTQUFTN2tFLEVBQVFqaEIsRUFBT00sR0FDdkQyZ0IsRUFBTzNnQixFQUFNLEVBQUksR0FBRytELEtBQUtyRSxNQUN4QixXQUFhLE1BQU8sQ0FBQyxHQUFJLE9BbVM1QixJQUFJOHVGLEdBQVNqTixJQUFTLFNBQVMzVCxFQUFZd1MsR0FDekMsR0FBa0IsTUFBZHhTLEVBQ0YsTUFBTyxHQUVULElBQUk1cEUsRUFBU284RSxFQUFVcDhFLE9BTXZCLE9BTElBLEVBQVMsR0FBSzhoRixHQUFlbFksRUFBWXdTLEVBQVUsR0FBSUEsRUFBVSxJQUNuRUEsRUFBWSxHQUNIcDhFLEVBQVMsR0FBSzhoRixHQUFlMUYsRUFBVSxHQUFJQSxFQUFVLEdBQUlBLEVBQVUsTUFDNUVBLEVBQVksQ0FBQ0EsRUFBVSxLQUVsQkQsR0FBWXZTLEVBQVkyTSxHQUFZNkYsRUFBVyxHQUFJLE9BcUJ4RHJ3QixHQUFNZ2lCLElBQVUsV0FDbEIsT0FBTzduQyxHQUFLNU8sS0FBS3kwQixPQTBEbkIsU0FBUzAzQixHQUFJenJELEVBQU05N0IsRUFBRzJsRixHQUdwQixPQUZBM2xGLEVBQUkybEYsT0E1MVRKaGpGLEVBNDFUd0IzQyxFQUVqQjhwRixHQUFXaHVELEVBdnpURixTQXZDaEJuNUIsdUJBNjFUQTNDLEVBQUs4N0IsR0FBYSxNQUFMOTdCLEVBQWE4N0IsRUFBS2g0QixPQUFTOUQsR0FxQjFDLFNBQVN1dUYsR0FBT3Z1RixFQUFHODdCLEdBQ2pCLElBQUlyYixFQUNKLEdBQW1CLG1CQUFScWIsRUFDVCxNQUFNLElBQUk3NEIsR0FBVTZoRSxHQUd0QixPQURBOWtFLEVBQUkwcEYsR0FBVTFwRixHQUNQLFdBT0wsUUFOTUEsRUFBSSxJQUNSeWdCLEVBQVNxYixFQUFLbjdCLE1BQU1jLEtBQU1XLFlBRXhCcEMsR0FBSyxJQUNQODdCLE9BNzNUSm41QixHQSszVFM4ZCxHQXVDWCxJQUFJMWdCLEdBQU9zaEYsSUFBUyxTQUFTdmxELEVBQU1xd0MsRUFBU29ZLEdBQzFDLElBQUluTixFQXY0VGEsRUF3NFRqQixHQUFJbU4sRUFBU3pnRixPQUFRLENBQ25CLElBQUkwZ0YsRUFBVTdVLEdBQWU0VSxFQUFVc0QsR0FBVTluRixLQUNqRHEzRSxHQXI0VGtCLEdBdTRUcEIsT0FBTzBTLEdBQVdodUQsRUFBTXM3QyxFQUFTakwsRUFBU29ZLEVBQVVDLE1BZ0RsRGdLLEdBQVVuTixJQUFTLFNBQVNwaEYsRUFBUUgsRUFBS3lrRixHQUMzQyxJQUFJbk4sRUFBVXFYLEVBQ2QsR0FBSWxLLEVBQVN6Z0YsT0FBUSxDQUNuQixJQUFJMGdGLEVBQVU3VSxHQUFlNFUsRUFBVXNELEdBQVUyRyxLQUNqRHBYLEdBMzdUa0IsR0E2N1RwQixPQUFPMFMsR0FBV2hxRixFQUFLczNFLEVBQVNuM0UsRUFBUXNrRixFQUFVQyxNQXNKcEQsU0FBU2tLLEdBQVM1eUQsRUFBTW05QyxFQUFNdDlELEdBQzVCLElBQUlnekUsRUFDQUMsRUFDQUMsRUFDQXB1RSxFQUNBcXVFLEVBQ0FDLEVBQ0FDLEVBQWlCLEVBQ2pCQyxHQUFVLEVBQ1ZDLEdBQVMsRUFDVGxKLEdBQVcsRUFFZixHQUFtQixtQkFBUmxxRCxFQUNULE1BQU0sSUFBSTc0QixHQUFVNmhFLEdBVXRCLFNBQVNxcUIsRUFBV0MsR0FDbEIsSUFBSXR1RixFQUFPNnRGLEVBQ1B4aUIsRUFBVXlpQixFQUtkLE9BSEFELEVBQVdDLE9BbnBVYmpzRixFQW9wVUVxc0YsRUFBaUJJLEVBQ2pCM3VFLEVBQVNxYixFQUFLbjdCLE1BQU13ckUsRUFBU3JyRSxHQUkvQixTQUFTdXVGLEVBQVlELEdBTW5CLE9BSkFKLEVBQWlCSSxFQUVqQk4sRUFBVXhtRixHQUFXZ25GLEVBQWNyVyxHQUU1QmdXLEVBQVVFLEVBQVdDLEdBQVEzdUUsRUFhdEMsU0FBUzh1RSxFQUFhSCxHQUNwQixJQUFJSSxFQUFvQkosRUFBT0wsRUFNL0IsWUFuclVGcHNGLElBbXJVVW9zRixHQUErQlMsR0FBcUJ2VyxHQUN6RHVXLEVBQW9CLEdBQU9OLEdBTkpFLEVBQU9KLEdBTThCSCxFQUdqRSxTQUFTUyxJQUNQLElBQUlGLEVBQU92L0IsS0FDWCxHQUFJMC9CLEVBQWFILEdBQ2YsT0FBT0ssRUFBYUwsR0FHdEJOLEVBQVV4bUYsR0FBV2duRixFQTNCdkIsU0FBdUJGLEdBQ3JCLElBRUlNLEVBQWN6VyxHQUZNbVcsRUFBT0wsR0FJL0IsT0FBT0csRUFDSDFjLEdBQVVrZCxFQUFhYixHQUpETyxFQUFPSixJQUs3QlUsRUFvQitCQyxDQUFjUCxJQUduRCxTQUFTSyxFQUFhTCxHQUtwQixPQUpBTixPQWpzVUZuc0YsRUFxc1VNcWpGLEdBQVkySSxFQUNQUSxFQUFXQyxJQUVwQlQsRUFBV0MsT0F4c1VianNGLEVBeXNVUzhkLEdBZVQsU0FBU212RSxJQUNQLElBQUlSLEVBQU92L0IsS0FDUGdnQyxFQUFhTixFQUFhSCxHQU05QixHQUpBVCxFQUFXdnNGLFVBQ1h3c0YsRUFBV250RixLQUNYc3RGLEVBQWVLLEVBRVhTLEVBQVksQ0FDZCxRQWp1VUpsdEYsSUFpdVVRbXNGLEVBQ0YsT0FBT08sRUFBWU4sR0FFckIsR0FBSUcsRUFJRixPQUZBMW1GLEdBQWFzbUYsR0FDYkEsRUFBVXhtRixHQUFXZ25GLEVBQWNyVyxHQUM1QmtXLEVBQVdKLEdBTXRCLFlBOXVVRnBzRixJQTJ1VU1tc0YsSUFDRkEsRUFBVXhtRixHQUFXZ25GLEVBQWNyVyxJQUU5Qng0RCxFQUlULE9BM0dBdzRELEVBQU9pUSxHQUFTalEsSUFBUyxFQUNyQi9FLEdBQVN2NEQsS0FDWHN6RSxJQUFZdHpFLEVBQVFzekUsUUFFcEJKLEdBREFLLEVBQVMsWUFBYXZ6RSxHQUNINDJELEdBQVUyVyxHQUFTdnRFLEVBQVFrekUsVUFBWSxFQUFHNVYsR0FBUTRWLEVBQ3JFN0ksRUFBVyxhQUFjcnFFLElBQVlBLEVBQVFxcUUsU0FBV0EsR0FvRzFENEosRUFBVTFqRCxPQXBDVixnQkE1c1VBdnBDLElBNnNVTW1zRixHQUNGdG1GLEdBQWFzbUYsR0FFZkUsRUFBaUIsRUFDakJMLEVBQVdJLEVBQWVILEVBQVdFLE9BanRVdkNuc0YsR0FpdlVBaXRGLEVBQVVFLE1BN0JWLFdBQ0UsWUFydFVGbnRGLElBcXRVU21zRixFQUF3QnJ1RSxFQUFTZ3ZFLEVBQWE1L0IsT0E2QmhEKy9CLEVBcUJULElBQUlHLEdBQVExTyxJQUFTLFNBQVN2bEQsRUFBTWg3QixHQUNsQyxPQUFPazRFLEdBQVVsOUMsRUFBTSxFQUFHaDdCLE1Bc0J4Qmt2RixHQUFRM08sSUFBUyxTQUFTdmxELEVBQU1tOUMsRUFBTW40RSxHQUN4QyxPQUFPazRFLEdBQVVsOUMsRUFBTW90RCxHQUFTalEsSUFBUyxFQUFHbjRFLE1BcUU5QyxTQUFTbXJGLEdBQVFud0QsRUFBTTU1QixHQUNyQixHQUFtQixtQkFBUjQ1QixHQUFtQyxNQUFaNTVCLEdBQXVDLG1CQUFaQSxFQUMzRCxNQUFNLElBQUllLEdBQVU2aEUsR0FFdEIsSUFBSW1yQixFQUFXLFdBQ2IsSUFBSW52RixFQUFPc0IsVUFDUHRDLEVBQU1vQyxFQUFXQSxFQUFTdkIsTUFBTWMsS0FBTVgsR0FBUUEsRUFBSyxHQUNuRDh0RSxFQUFRcWhCLEVBQVNyaEIsTUFFckIsR0FBSUEsRUFBTXY4RCxJQUFJdlMsR0FDWixPQUFPOHVFLEVBQU14dkUsSUFBSVUsR0FFbkIsSUFBSTJnQixFQUFTcWIsRUFBS243QixNQUFNYyxLQUFNWCxHQUU5QixPQURBbXZGLEVBQVNyaEIsTUFBUUEsRUFBTWxwRSxJQUFJNUYsRUFBSzJnQixJQUFXbXVELEVBQ3BDbnVELEdBR1QsT0FEQXd2RSxFQUFTcmhCLE1BQVEsSUFBS3FkLEdBQVFpRSxPQUFTL2EsSUFDaEM4YSxFQTBCVCxTQUFTRSxHQUFPeGpCLEdBQ2QsR0FBd0IsbUJBQWJBLEVBQ1QsTUFBTSxJQUFJMXBFLEdBQVU2aEUsR0FFdEIsT0FBTyxXQUNMLElBQUloa0UsRUFBT3NCLFVBQ1gsT0FBUXRCLEVBQUtnRCxRQUNYLEtBQUssRUFBRyxPQUFRNm9FLEVBQVVqdUUsS0FBSytDLE1BQy9CLEtBQUssRUFBRyxPQUFRa3JFLEVBQVVqdUUsS0FBSytDLEtBQU1YLEVBQUssSUFDMUMsS0FBSyxFQUFHLE9BQVE2ckUsRUFBVWp1RSxLQUFLK0MsS0FBTVgsRUFBSyxHQUFJQSxFQUFLLElBQ25ELEtBQUssRUFBRyxPQUFRNnJFLEVBQVVqdUUsS0FBSytDLEtBQU1YLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLElBRTlELE9BQVE2ckUsRUFBVWhzRSxNQUFNYyxLQUFNWCxJQWxDbENtckYsR0FBUWlFLE1BQVEvYSxHQTJGaEIsSUFBSWliLEdBQVduTSxJQUFTLFNBQVNub0QsRUFBTXUwRCxHQUtyQyxJQUFJQyxHQUpKRCxFQUFtQyxHQUFyQkEsRUFBV3ZzRixRQUFlbW5CLEdBQVFvbEUsRUFBVyxJQUN2RHBqQixHQUFTb2pCLEVBQVcsR0FBSTVoQixHQUFVMlIsT0FDbENuVCxHQUFTb04sR0FBWWdXLEVBQVksR0FBSTVoQixHQUFVMlIsUUFFdEJ0OEUsT0FDN0IsT0FBT3U5RSxJQUFTLFNBQVN2Z0YsR0FJdkIsSUFIQSxJQUFJK0YsR0FBUyxFQUNUL0MsRUFBUzB1RSxHQUFVMXhFLEVBQUtnRCxPQUFRd3NGLEtBRTNCenBGLEVBQVEvQyxHQUNmaEQsRUFBSytGLEdBQVN3cEYsRUFBV3hwRixHQUFPbkksS0FBSytDLEtBQU1YLEVBQUsrRixJQUVsRCxPQUFPbEcsR0FBTW03QixFQUFNcjZCLEtBQU1YLFNBcUN6Qnl2RixHQUFVbFAsSUFBUyxTQUFTdmxELEVBQU15b0QsR0FFcEMsT0FBT3VGLEdBQVdodUQsRUFuK1VFLFFBckNwQm41QixFQXdnVnNENGhGLEVBRHhDNVUsR0FBZTRVLEVBQVVzRCxHQUFVMEksU0FvQy9DQyxHQUFlblAsSUFBUyxTQUFTdmxELEVBQU15b0QsR0FFekMsT0FBT3VGLEdBQVdodUQsRUF2Z1ZRLFFBdEMxQm41QixFQTZpVjRENGhGLEVBRDlDNVUsR0FBZTRVLEVBQVVzRCxHQUFVMkksU0EwQi9DQyxHQUFRaEssSUFBUyxTQUFTM3FELEVBQU1vbEQsR0FDbEMsT0FBTzRJLEdBQVdodUQsRUEvaFZBLFNBeENsQm41QixnQkF1a1YwRXUrRSxNQWlhNUUsU0FBUzFLLEdBQUdoM0UsRUFBT2tqQixHQUNqQixPQUFPbGpCLElBQVVrakIsR0FBVWxqQixHQUFVQSxHQUFTa2pCLEdBQVVBLEVBMEIxRCxJQUFJZ3VFLEdBQUt6SCxHQUEwQnpOLElBeUIvQm1WLEdBQU0xSCxJQUEwQixTQUFTenBGLEVBQU9rakIsR0FDbEQsT0FBT2xqQixHQUFTa2pCLEtBcUJkaXpELEdBQWN3RyxHQUFnQixXQUFhLE9BQU8vNUUsVUFBcEIsSUFBc0MrNUUsR0FBa0IsU0FBUzM4RSxHQUNqRyxPQUFPcTBFLEdBQWFyMEUsSUFBVVksR0FBZTFCLEtBQUtjLEVBQU8sWUFDdEQ2eEUsR0FBcUIzeUUsS0FBS2MsRUFBTyxXQTBCbEN5ckIsR0FBVWhtQixFQUFNZ21CLFFBbUJoQnVnRCxHQUFnQkQsR0FBb0JrRCxHQUFVbEQsSUE3NVBsRCxTQUEyQi9yRSxHQUN6QixPQUFPcTBFLEdBQWFyMEUsSUFBVTI3RSxHQUFXMzdFLElBQVV3bUUsR0F1N1ByRCxTQUFTaVosR0FBWXovRSxHQUNuQixPQUFnQixNQUFUQSxHQUFpQnlyRixHQUFTenJGLEVBQU1zRSxVQUFZODJFLEdBQVdwN0UsR0E0QmhFLFNBQVNxZ0YsR0FBa0JyZ0YsR0FDekIsT0FBT3EwRSxHQUFhcjBFLElBQVV5L0UsR0FBWXovRSxHQTBDNUMsSUFBSTJ5RSxHQUFXRCxJQUFrQmtaLEdBbUI3QjFmLEdBQVNELEdBQWFnRCxHQUFVaEQsSUF4Z1FwQyxTQUFvQmpzRSxHQUNsQixPQUFPcTBFLEdBQWFyMEUsSUFBVTI3RSxHQUFXMzdFLElBQVU0bEUsR0ErcVFyRCxTQUFTd3JCLEdBQVFweEYsR0FDZixJQUFLcTBFLEdBQWFyMEUsR0FDaEIsT0FBTyxFQUVULElBQUlrNEUsRUFBTXlELEdBQVczN0UsR0FDckIsT0FBT2s0RSxHQUFPclMsR0E5eVdGLHlCQTh5V2NxUyxHQUNDLGlCQUFqQmw0RSxFQUFNMEcsU0FBNEMsaUJBQWQxRyxFQUFNVixPQUFxQjY4QixHQUFjbjhCLEdBa0R6RixTQUFTbzdFLEdBQVdwN0UsR0FDbEIsSUFBSzAwRSxHQUFTMTBFLEdBQ1osT0FBTyxFQUlULElBQUlrNEUsRUFBTXlELEdBQVczN0UsR0FDckIsT0FBT2s0RSxHQUFPcFMsR0FBV29TLEdBQU9uUyxHQTMyV3JCLDBCQTIyVytCbVMsR0EvMVcvQixrQkErMVdrREEsRUE2Qi9ELFNBQVNtWixHQUFVcnhGLEdBQ2pCLE1BQXVCLGlCQUFUQSxHQUFxQkEsR0FBU2txRixHQUFVbHFGLEdBNkJ4RCxTQUFTeXJGLEdBQVN6ckYsR0FDaEIsTUFBdUIsaUJBQVRBLEdBQ1pBLEdBQVMsR0FBS0EsRUFBUSxHQUFLLEdBQUtBLEdBajhXZixpQkE2OVdyQixTQUFTMDBFLEdBQVMxMEUsR0FDaEIsSUFBSTZELFNBQWM3RCxFQUNsQixPQUFnQixNQUFUQSxJQUEwQixVQUFSNkQsR0FBNEIsWUFBUkEsR0EyQi9DLFNBQVN3d0UsR0FBYXIwRSxHQUNwQixPQUFnQixNQUFUQSxHQUFpQyxpQkFBVEEsRUFvQmpDLElBQUlvc0UsR0FBUUQsR0FBWThDLEdBQVU5QyxJQTV4UWxDLFNBQW1CbnNFLEdBQ2pCLE9BQU9xMEUsR0FBYXIwRSxJQUFVbTRFLEdBQU9uNEUsSUFBVWdtRSxHQTYrUWpELFNBQVNzckIsR0FBU3R4RixHQUNoQixNQUF1QixpQkFBVEEsR0FDWHEwRSxHQUFhcjBFLElBQVUyN0UsR0FBVzM3RSxJQUFVaW1FLEVBK0JqRCxTQUFTOXBDLEdBQWNuOEIsR0FDckIsSUFBS3EwRSxHQUFhcjBFLElBQVUyN0UsR0FBVzM3RSxJQUFVa21FLEVBQy9DLE9BQU8sRUFFVCxJQUFJanFDLEVBQVEwMUMsR0FBYTN4RSxHQUN6QixHQUFjLE9BQVZpOEIsRUFDRixPQUFPLEVBRVQsSUFBSUMsRUFBT3Q3QixHQUFlMUIsS0FBSys4QixFQUFPLGdCQUFrQkEsRUFBTWowQixZQUM5RCxNQUFzQixtQkFBUmswQixHQUFzQkEsYUFBZ0JBLEdBQ2xEVixHQUFhdDhCLEtBQUtnOUIsSUFBU1QsR0FvQi9CLElBQUk2d0MsR0FBV0QsR0FBZTRDLEdBQVU1QyxJQTU5UXhDLFNBQXNCcnNFLEdBQ3BCLE9BQU9xMEUsR0FBYXIwRSxJQUFVMjdFLEdBQVczN0UsSUFBVW1tRSxHQTZnUnJELElBQUlxRyxHQUFRRCxHQUFZMEMsR0FBVTFDLElBbmdSbEMsU0FBbUJ2c0UsR0FDakIsT0FBT3EwRSxHQUFhcjBFLElBQVVtNEUsR0FBT240RSxJQUFVb21FLEdBcWhSakQsU0FBU21yQixHQUFTdnhGLEdBQ2hCLE1BQXVCLGlCQUFUQSxJQUNWeXJCLEdBQVF6ckIsSUFBVXEwRSxHQUFhcjBFLElBQVUyN0UsR0FBVzM3RSxJQUFVcW1FLEVBb0JwRSxTQUFTc1UsR0FBUzM2RSxHQUNoQixNQUF1QixpQkFBVEEsR0FDWHEwRSxHQUFhcjBFLElBQVUyN0UsR0FBVzM3RSxJQUFVc21FLEVBb0JqRCxJQUFJb0csR0FBZUQsR0FBbUJ3QyxHQUFVeEMsSUF2alJoRCxTQUEwQnpzRSxHQUN4QixPQUFPcTBFLEdBQWFyMEUsSUFDbEJ5ckYsR0FBU3pyRixFQUFNc0UsV0FBYTJtRSxHQUFlMFEsR0FBVzM3RSxLQTZvUjFELElBQUl3eEYsR0FBSy9ILEdBQTBCbEssSUF5Qi9Ca1MsR0FBTWhJLElBQTBCLFNBQVN6cEYsRUFBT2tqQixHQUNsRCxPQUFPbGpCLEdBQVNrakIsS0EwQmxCLFNBQVN3dUUsR0FBUTF4RixHQUNmLElBQUtBLEVBQ0gsTUFBTyxHQUVULEdBQUl5L0UsR0FBWXovRSxHQUNkLE9BQU91eEYsR0FBU3Z4RixHQUFTeXdFLEdBQWN6d0UsR0FBUzQyRSxHQUFVNTJFLEdBRTVELEdBQUlneUUsSUFBZWh5RSxFQUFNZ3lFLElBQ3ZCLE9BdjhWTixTQUF5QkMsR0FJdkIsSUFIQSxJQUFJbm9ELEVBQ0E3SSxFQUFTLEtBRUo2SSxFQUFPbW9ELEVBQVNsaUQsUUFBUTZYLE1BQy9CM21CLEVBQU81YyxLQUFLeWxCLEVBQUs5cEIsT0FFbkIsT0FBT2loQixFQWc4Vkkwd0UsQ0FBZ0IzeEYsRUFBTWd5RSxPQUUvQixJQUFJa0csRUFBTUMsR0FBT240RSxHQUdqQixPQUZXazRFLEdBQU9sUyxFQUFTZ0ssR0FBY2tJLEdBQU85UixFQUFTZ0ssR0FBYXA5RCxJQUUxRGhULEdBMEJkLFNBQVN1cEYsR0FBU3ZwRixHQUNoQixPQUFLQSxHQUdMQSxFQUFRMHBGLEdBQVMxcEYsTUF6a1lOLEtBMGtZZUEsS0Exa1lmLElBRUcsdUJBeWtZQUEsRUFBUSxHQUFLLEVBQUksR0FHeEJBLEdBQVVBLEVBQVFBLEVBQVEsRUFQZCxJQUFWQSxFQUFjQSxFQUFRLEVBb0NqQyxTQUFTa3FGLEdBQVVscUYsR0FDakIsSUFBSWloQixFQUFTc29FLEdBQVN2cEYsR0FDbEI0eEYsRUFBWTN3RSxFQUFTLEVBRXpCLE9BQU9BLEdBQVdBLEVBQVUyd0UsRUFBWTN3RSxFQUFTMndFLEVBQVkzd0UsRUFBVSxFQThCekUsU0FBUzR3RSxHQUFTN3hGLEdBQ2hCLE9BQU9BLEVBQVE2MkUsR0FBVXFULEdBQVVscUYsR0FBUSxFQXhvWXhCLFlBd29ZK0MsRUEwQnBFLFNBQVMwcEYsR0FBUzFwRixHQUNoQixHQUFvQixpQkFBVEEsRUFDVCxPQUFPQSxFQUVULEdBQUkyNkUsR0FBUzM2RSxHQUNYLE9BMXFZSSxJQTRxWU4sR0FBSTAwRSxHQUFTMTBFLEdBQVEsQ0FDbkIsSUFBSWtqQixFQUFnQyxtQkFBakJsakIsRUFBTWswRSxRQUF3QmwwRSxFQUFNazBFLFVBQVlsMEUsRUFDbkVBLEVBQVEwMEUsR0FBU3h4RCxHQUFVQSxFQUFRLEdBQU1BLEVBRTNDLEdBQW9CLGlCQUFUbGpCLEVBQ1QsT0FBaUIsSUFBVkEsRUFBY0EsR0FBU0EsRUFFaENBLEVBQVErdUUsR0FBUy91RSxHQUNqQixJQUFJOHhGLEVBQVdscEIsR0FBVzMvRCxLQUFLakosR0FDL0IsT0FBUTh4RixHQUFZaHBCLEdBQVU3L0QsS0FBS2pKLEdBQy9CcXJFLEdBQWFyckUsRUFBTTJDLE1BQU0sR0FBSW12RixFQUFXLEVBQUksR0FDM0NucEIsR0FBVzEvRCxLQUFLakosR0F2cllmLEtBdXJZK0JBLEVBMkJ2QyxTQUFTc2dGLEdBQWN0Z0YsR0FDckIsT0FBT3czRSxHQUFXeDNFLEVBQU95NEUsR0FBT3o0RSxJQXNEbEMsU0FBUzhYLEdBQVM5WCxHQUNoQixPQUFnQixNQUFUQSxFQUFnQixHQUFLd2pGLEdBQWF4akYsR0FxQzNDLElBQUk0Z0MsR0FBU29sRCxJQUFlLFNBQVN2bEYsRUFBUXlqQyxHQUMzQyxHQUFJaTdDLEdBQVlqN0MsSUFBV3U3QyxHQUFZdjdDLEdBQ3JDc3pDLEdBQVd0ekMsRUFBUXg4QixHQUFLdzhCLEdBQVN6akMsUUFHbkMsSUFBSyxJQUFJSCxLQUFPNGpDLEVBQ1Z0akMsR0FBZTFCLEtBQUtnbEMsRUFBUTVqQyxJQUM5QjQyRSxHQUFZejJFLEVBQVFILEVBQUs0akMsRUFBTzVqQyxPQW9DbEN5eEYsR0FBVy9MLElBQWUsU0FBU3ZsRixFQUFReWpDLEdBQzdDc3pDLEdBQVd0ekMsRUFBUXUwQyxHQUFPdjBDLEdBQVN6akMsTUFnQ2pDdXhGLEdBQWVoTSxJQUFlLFNBQVN2bEYsRUFBUXlqQyxFQUFRODdDLEVBQVVuSSxHQUNuRUwsR0FBV3R6QyxFQUFRdTBDLEdBQU92MEMsR0FBU3pqQyxFQUFRbzNFLE1BK0J6Q29hLEdBQWFqTSxJQUFlLFNBQVN2bEYsRUFBUXlqQyxFQUFRODdDLEVBQVVuSSxHQUNqRUwsR0FBV3R6QyxFQUFReDhCLEdBQUt3OEIsR0FBU3pqQyxFQUFRbzNFLE1Bb0J2Q3BqRCxHQUFLd3lELEdBQVN4UCxJQThEbEIsSUFBSWhoQyxHQUFXb3JDLElBQVMsU0FBU3BoRixFQUFReWxGLEdBQ3ZDemxGLEVBQVNoQixHQUFPZ0IsR0FFaEIsSUFBSTRHLEdBQVMsRUFDVC9DLEVBQVM0aEYsRUFBUTVoRixPQUNqQjZoRixFQUFRN2hGLEVBQVMsRUFBSTRoRixFQUFRLFFBL2laakMvaUYsRUFxalpBLElBSklnakYsR0FBU0MsR0FBZUYsRUFBUSxHQUFJQSxFQUFRLEdBQUlDLEtBQ2xEN2hGLEVBQVMsS0FHRitDLEVBQVEvQyxHQU1mLElBTEEsSUFBSTQvQixFQUFTZ2lELEVBQVE3K0UsR0FDakI4M0QsRUFBUXNaLEdBQU92MEMsR0FDZmd1RCxHQUFjLEVBQ2RDLEVBQWNoekIsRUFBTTc2RCxTQUVmNHRGLEVBQWFDLEdBQWEsQ0FDakMsSUFBSTd4RixFQUFNNitELEVBQU0reUIsR0FDWmx5RixFQUFRUyxFQUFPSCxTQTdqWnZCNkMsSUEralpRbkQsR0FDQ2czRSxHQUFHaDNFLEVBQU9peEUsR0FBWTN3RSxNQUFVTSxHQUFlMUIsS0FBS3VCLEVBQVFILE1BQy9ERyxFQUFPSCxHQUFPNGpDLEVBQU81akMsSUFLM0IsT0FBT0csS0FzQkwyeEYsR0FBZXZRLElBQVMsU0FBU3ZnRixHQUVuQyxPQURBQSxFQUFLK0MsVUE3bFpMbEIsRUE2bFpxQjRuRixJQUNkNXBGLEdBQU1reEYsUUE5bFpibHZGLEVBOGxabUM3QixNQWdTckMsU0FBUzFCLEdBQUlhLEVBQVFrUixFQUFNbzNFLEdBQ3pCLElBQUk5bkUsRUFBbUIsTUFBVnhnQixPQS8zWmIwQyxFQSszWjBDazRFLEdBQVE1NkUsRUFBUWtSLEdBQzFELFlBaDRaQXhPLElBZzRaTzhkLEVBQXVCOG5FLEVBQWU5bkUsRUE0RC9DLFNBQVM2K0QsR0FBTXIvRSxFQUFRa1IsR0FDckIsT0FBaUIsTUFBVmxSLEdBQWtCOHFGLEdBQVE5cUYsRUFBUWtSLEVBQU11cUUsSUFxQmpELElBQUlvVyxHQUFTM0osSUFBZSxTQUFTMW5FLEVBQVFqaEIsRUFBT00sR0FDckMsTUFBVE4sR0FDeUIsbUJBQWxCQSxFQUFNOFgsV0FDZjlYLEVBQVFzeEUsR0FBcUJweUUsS0FBS2MsSUFHcENpaEIsRUFBT2poQixHQUFTTSxJQUNmK2hGLEdBQVN0RCxLQTRCUndULEdBQVc1SixJQUFlLFNBQVMxbkUsRUFBUWpoQixFQUFPTSxHQUN2QyxNQUFUTixHQUN5QixtQkFBbEJBLEVBQU04WCxXQUNmOVgsRUFBUXN4RSxHQUFxQnB5RSxLQUFLYyxJQUdoQ1ksR0FBZTFCLEtBQUsraEIsRUFBUWpoQixHQUM5QmloQixFQUFPamhCLEdBQU9xRSxLQUFLL0QsR0FFbkIyZ0IsRUFBT2poQixHQUFTLENBQUNNLEtBRWxCc2dGLElBb0JDNFIsR0FBUzNRLEdBQVNuRixJQThCdEIsU0FBU2gxRSxHQUFLakgsR0FDWixPQUFPZy9FLEdBQVloL0UsR0FBVXMxRSxHQUFjdDFFLEdBQVV5K0UsR0FBU3orRSxHQTBCaEUsU0FBU2c0RSxHQUFPaDRFLEdBQ2QsT0FBT2cvRSxHQUFZaC9FLEdBQVVzMUUsR0FBY3QxRSxHQUFRLEdBQVEyK0UsR0FBVzMrRSxHQXVHeEUsSUFBSW1yQyxHQUFRbzZDLElBQWUsU0FBU3ZsRixFQUFReWpDLEVBQVE4N0MsR0FDbERELEdBQVV0L0UsRUFBUXlqQyxFQUFRODdDLE1Ba0N4QnFTLEdBQVlyTSxJQUFlLFNBQVN2bEYsRUFBUXlqQyxFQUFRODdDLEVBQVVuSSxHQUNoRWtJLEdBQVV0L0UsRUFBUXlqQyxFQUFRODdDLEVBQVVuSSxNQXVCbEM0YSxHQUFPeEwsSUFBUyxTQUFTeG1GLEVBQVFtcEMsR0FDbkMsSUFBSTNvQixFQUFTLEdBQ2IsR0FBYyxNQUFWeGdCLEVBQ0YsT0FBT3dnQixFQUVULElBQUk2MkQsR0FBUyxFQUNibHVDLEVBQVE2akMsR0FBUzdqQyxHQUFPLFNBQVNqNEIsR0FHL0IsT0FGQUEsRUFBTzJwRSxHQUFTM3BFLEVBQU1sUixHQUN0QnEzRSxJQUFXQSxFQUFTbm1FLEVBQUtyTixPQUFTLEdBQzNCcU4sS0FFVDZsRSxHQUFXLzJFLEVBQVE2NEUsR0FBYTc0RSxHQUFTd2dCLEdBQ3JDNjJELElBQ0Y3MkQsRUFBUzAyRCxHQUFVMTJELEVBQVF5eEUsRUFBd0QxSCxLQUdyRixJQURBLElBQUkxbUYsRUFBU3NsQyxFQUFNdGxDLE9BQ1pBLEtBQ0xxOUUsR0FBVTFnRSxFQUFRMm9CLEVBQU10bEMsSUFFMUIsT0FBTzJjLEtBNENULElBQUl3YyxHQUFPd3BELElBQVMsU0FBU3htRixFQUFRbXBDLEdBQ25DLE9BQWlCLE1BQVZucEMsRUFBaUIsR0FubVQxQixTQUFrQkEsRUFBUW1wQyxHQUN4QixPQUFPMDNDLEdBQVc3Z0YsRUFBUW1wQyxHQUFPLFNBQVM1cEMsRUFBTzJSLEdBQy9DLE9BQU9tdUUsR0FBTXIvRSxFQUFRa1IsTUFpbVRNZ2hGLENBQVNseUYsRUFBUW1wQyxNQXFCaEQsU0FBU2dwRCxHQUFPbnlGLEVBQVEwc0UsR0FDdEIsR0FBYyxNQUFWMXNFLEVBQ0YsTUFBTyxHQUVULElBQUkwK0QsRUFBUXNPLEdBQVM2TCxHQUFhNzRFLElBQVMsU0FBUzI2QixHQUNsRCxNQUFPLENBQUNBLE1BR1YsT0FEQSt4QyxFQUFZeVQsR0FBWXpULEdBQ2pCbVUsR0FBVzdnRixFQUFRMCtELEdBQU8sU0FBU24vRCxFQUFPMlIsR0FDL0MsT0FBT3c3RCxFQUFVbnRFLEVBQU8yUixFQUFLLE9BNElqQyxJQUFJa2hGLEdBQVV6SSxHQUFjMWlGLElBMEJ4Qm9yRixHQUFZMUksR0FBYzNSLElBNEs5QixTQUFTemxFLEdBQU92UyxHQUNkLE9BQWlCLE1BQVZBLEVBQWlCLEdBQUt5dUUsR0FBV3p1RSxFQUFRaUgsR0FBS2pILElBa052RCxJQUFJc3lGLEdBQVl0TSxJQUFpQixTQUFTeGxFLEVBQVEreEUsRUFBTTNyRixHQUV0RCxPQURBMnJGLEVBQU9BLEVBQUs5NkUsY0FDTCtJLEdBQVU1WixFQUFRNHJGLEdBQVdELEdBQVFBLE1Ba0I5QyxTQUFTQyxHQUFXN3JELEdBQ2xCLE9BQU84ckQsR0FBV3A3RSxHQUFTc3ZCLEdBQVFsdkIsZUFxQnJDLFNBQVN5dUUsR0FBT3YvQyxHQUVkLE9BREFBLEVBQVN0dkIsR0FBU3N2QixLQUNEQSxFQUFPbnFCLFFBQVErckQsR0FBUzJHLElBQWMxeUQsUUFBUXl0RCxHQUFhLElBc0g5RSxJQUFJeW9CLEdBQVkxTSxJQUFpQixTQUFTeGxFLEVBQVEreEUsRUFBTTNyRixHQUN0RCxPQUFPNFosR0FBVTVaLEVBQVEsSUFBTSxJQUFNMnJGLEVBQUs5NkUsaUJBdUJ4Q2s3RSxHQUFZM00sSUFBaUIsU0FBU3hsRSxFQUFRK3hFLEVBQU0zckYsR0FDdEQsT0FBTzRaLEdBQVU1WixFQUFRLElBQU0sSUFBTTJyRixFQUFLOTZFLGlCQW9CeENtN0UsR0FBYS9NLEdBQWdCLGVBME5qQyxJQUFJZ04sR0FBWTdNLElBQWlCLFNBQVN4bEUsRUFBUSt4RSxFQUFNM3JGLEdBQ3RELE9BQU80WixHQUFVNVosRUFBUSxJQUFNLElBQU0yckYsRUFBSzk2RSxpQkFnRTVDLElBQUlxN0UsR0FBWTlNLElBQWlCLFNBQVN4bEUsRUFBUSt4RSxFQUFNM3JGLEdBQ3RELE9BQU80WixHQUFVNVosRUFBUSxJQUFNLElBQU02ckYsR0FBV0YsTUFzaUJsRCxJQUFJUSxHQUFZL00sSUFBaUIsU0FBU3hsRSxFQUFRK3hFLEVBQU0zckYsR0FDdEQsT0FBTzRaLEdBQVU1WixFQUFRLElBQU0sSUFBTTJyRixFQUFLejVFLGlCQW9CeEMyNUUsR0FBYTVNLEdBQWdCLGVBcUJqQyxTQUFTSSxHQUFNdC9DLEVBQVF2WixFQUFTczRELEdBSTlCLE9BSEEvK0MsRUFBU3R2QixHQUFTc3ZCLFFBLzZkbEJqa0MsS0FnN2RBMHFCLEVBQVVzNEQsT0FoN2RWaGpGLEVBZzdkOEIwcUIsR0FueWJsQyxTQUF3QnVaLEdBQ3RCLE9BQU8wakMsR0FBaUI3aEUsS0FBS20rQixHQXF5YmxCcXNELENBQWVyc0QsR0ExamI1QixTQUFzQkEsR0FDcEIsT0FBT0EsRUFBT3QxQixNQUFNODRELEtBQWtCLEdBeWpiRjhvQixDQUFhdHNELEdBenJjbkQsU0FBb0JBLEdBQ2xCLE9BQU9BLEVBQU90MUIsTUFBTXcyRCxJQUFnQixHQXdyY3VCcXJCLENBQVd2c0QsR0FFN0RBLEVBQU90MUIsTUFBTStiLElBQVksR0EyQmxDLElBQUkrbEUsR0FBVS9SLElBQVMsU0FBU3ZsRCxFQUFNaDdCLEdBQ3BDLElBQ0UsT0FBT0gsR0FBTW03QixPQWw5ZGZuNUIsRUFrOWRnQzdCLEdBQzlCLE1BQU9zVyxHQUNQLE9BQU93NUUsR0FBUXg1RSxHQUFLQSxFQUFJLElBQUluVCxFQUFNbVQsT0E4QmxDaThFLEdBQVU1TSxJQUFTLFNBQVN4bUYsRUFBUXF6RixHQUt0QyxPQUpBOW1CLEdBQVU4bUIsR0FBYSxTQUFTeHpGLEdBQzlCQSxFQUFNaTdFLEdBQU1qN0UsR0FDWjIyRSxHQUFnQngyRSxFQUFRSCxFQUFLQyxHQUFLRSxFQUFPSCxHQUFNRyxPQUUxQ0EsS0FxR1QsU0FBUzRoRixHQUFTcmlGLEdBQ2hCLE9BQU8sV0FDTCxPQUFPQSxHQWtEWCxJQUFJK3pGLEdBQU8vTSxLQXVCUGdOLEdBQVloTixJQUFXLEdBa0IzQixTQUFTakksR0FBUy8rRSxHQUNoQixPQUFPQSxFQTZDVCxTQUFTOHNFLEdBQVN4d0MsR0FDaEIsT0FBT3dpRCxHQUE0QixtQkFBUnhpRCxFQUFxQkEsRUFBT3E3QyxHQUFVcjdDLEVBanRlL0MsSUF3emVwQixJQUFJb0QsR0FBU21pRCxJQUFTLFNBQVNsd0UsRUFBTXJRLEdBQ25DLE9BQU8sU0FBU2IsR0FDZCxPQUFPaThFLEdBQVdqOEUsRUFBUWtSLEVBQU1yUSxPQTJCaEMyeUYsR0FBV3BTLElBQVMsU0FBU3BoRixFQUFRYSxHQUN2QyxPQUFPLFNBQVNxUSxHQUNkLE9BQU8rcUUsR0FBV2o4RSxFQUFRa1IsRUFBTXJRLE9Bd0NwQyxTQUFTNHlGLEdBQU16ekYsRUFBUXlqQyxFQUFRL25CLEdBQzdCLElBQUlnakQsRUFBUXozRCxHQUFLdzhCLEdBQ2I0dkQsRUFBYzNZLEdBQWNqM0MsRUFBUWk3QixHQUV6QixNQUFYaGpELEdBQ0V1NEQsR0FBU3h3QyxLQUFZNHZELEVBQVl4dkYsU0FBVzY2RCxFQUFNNzZELFVBQ3RENlgsRUFBVStuQixFQUNWQSxFQUFTempDLEVBQ1RBLEVBQVN3QixLQUNUNnhGLEVBQWMzWSxHQUFjajNDLEVBQVF4OEIsR0FBS3c4QixLQUUzQyxJQUFJa3FELElBQVUxWixHQUFTdjRELElBQVksVUFBV0EsSUFBY0EsRUFBUWl5RSxPQUNoRWhXLEVBQVNnRCxHQUFXMzZFLEdBcUJ4QixPQW5CQXVzRSxHQUFVOG1CLEdBQWEsU0FBU3ZOLEdBQzlCLElBQUlqcUQsRUFBTzRILEVBQU9xaUQsR0FDbEI5bEYsRUFBTzhsRixHQUFjanFELEVBQ2pCODdDLElBQ0YzM0UsRUFBT0UsVUFBVTRsRixHQUFjLFdBQzdCLElBQUkzUixFQUFXM3lFLEtBQUs4eUUsVUFDcEIsR0FBSXFaLEdBQVN4WixFQUFVLENBQ3JCLElBQUkzekQsRUFBU3hnQixFQUFPd0IsS0FBSzR5RSxhQUNyQm9QLEVBQVVoakUsRUFBTzZ6RCxZQUFjOEIsR0FBVTMwRSxLQUFLNnlFLGFBSWxELE9BRkFtUCxFQUFRNS9FLEtBQUssQ0FBRSxLQUFRaTRCLEVBQU0sS0FBUTE1QixVQUFXLFFBQVduQyxJQUMzRHdnQixFQUFPOHpELFVBQVlILEVBQ1ozekQsRUFFVCxPQUFPcWIsRUFBS243QixNQUFNVixFQUFRaXRFLEdBQVUsQ0FBQ3pyRSxLQUFLakMsU0FBVTRDLGlCQUtuRG5DLEVBbUNULFNBQVNva0UsTUFpRFQsSUFBSXN2QixHQUFPbkwsR0FBV3ZiLElBOEJsQjJtQixHQUFZcEwsR0FBVzliLElBaUN2Qm1uQixHQUFXckwsR0FBV2xiLElBd0IxQixTQUFTcHRFLEdBQVNpUixHQUNoQixPQUFPaXVFLEdBQU1qdUUsR0FBUXE4RCxHQUFhdU4sR0FBTTVwRSxJQWgzWDFDLFNBQTBCQSxHQUN4QixPQUFPLFNBQVNsUixHQUNkLE9BQU80NkUsR0FBUTU2RSxFQUFRa1IsSUE4Mlh3QjJpRixDQUFpQjNpRixHQXVFcEUsSUFBSTI1QyxHQUFRKzlCLEtBc0NSa0wsR0FBYWxMLElBQVksR0FvQjdCLFNBQVNpQyxLQUNQLE1BQU8sR0FnQlQsU0FBU00sS0FDUCxPQUFPLEVBK0pULElBQUkvK0UsR0FBTWk4RSxJQUFvQixTQUFTMEwsRUFBUUMsR0FDN0MsT0FBT0QsRUFBU0MsSUFDZixHQXVCQ2h0RCxHQUFPdWlELEdBQVksUUFpQm5CMEssR0FBUzVMLElBQW9CLFNBQVM2TCxFQUFVQyxHQUNsRCxPQUFPRCxFQUFXQyxJQUNqQixHQXVCQ3YxQixHQUFRMnFCLEdBQVksU0F3S3hCLElBZ2FNOWxELEdBaGFGMndELEdBQVcvTCxJQUFvQixTQUFTZ00sRUFBWUMsR0FDdEQsT0FBT0QsRUFBYUMsSUFDbkIsR0F1QkNwNUUsR0FBUXF1RSxHQUFZLFNBaUJwQmdMLEdBQVdsTSxJQUFvQixTQUFTbU0sRUFBU0MsR0FDbkQsT0FBT0QsRUFBVUMsSUFDaEIsR0FnbUJILE9BMWlCQTlnQixHQUFPK2dCLE1BcDZNUCxTQUFlMzBGLEVBQUc4N0IsR0FDaEIsR0FBbUIsbUJBQVJBLEVBQ1QsTUFBTSxJQUFJNzRCLEdBQVU2aEUsR0FHdEIsT0FEQTlrRSxFQUFJMHBGLEdBQVUxcEYsR0FDUCxXQUNMLEtBQU1BLEVBQUksRUFDUixPQUFPODdCLEVBQUtuN0IsTUFBTWMsS0FBTVcsYUE4NU05Qnd4RSxHQUFPMlQsSUFBTUEsR0FDYjNULEdBQU94ekMsT0FBU0EsR0FDaEJ3ekMsR0FBTzJkLFNBQVdBLEdBQ2xCM2QsR0FBTzRkLGFBQWVBLEdBQ3RCNWQsR0FBTzZkLFdBQWFBLEdBQ3BCN2QsR0FBTzMvQyxHQUFLQSxHQUNaMi9DLEdBQU8yYSxPQUFTQSxHQUNoQjNhLEdBQU83ekUsS0FBT0EsR0FDZDZ6RSxHQUFPeWYsUUFBVUEsR0FDakJ6ZixHQUFPNGEsUUFBVUEsR0FDakI1YSxHQUFPZ2hCLFVBbDhLUCxXQUNFLElBQUt4eUYsVUFBVTBCLE9BQ2IsTUFBTyxHQUVULElBQUl0RSxFQUFRNEMsVUFBVSxHQUN0QixPQUFPNm9CLEdBQVF6ckIsR0FBU0EsRUFBUSxDQUFDQSxJQTg3S25DbzBFLEdBQU9nYSxNQUFRQSxHQUNmaGEsR0FBT2loQixNQXBnVFAsU0FBZWhzRixFQUFPNkosRUFBTWl6RSxHQUV4Qmp6RSxHQURHaXpFLEVBQVFDLEdBQWUvOEUsRUFBTzZKLEVBQU1pekUsUUE1dU56Q2hqRixJQTR1TmtEK1AsR0FDekMsRUFFQTYvRCxHQUFVbVgsR0FBVWgzRSxHQUFPLEdBRXBDLElBQUk1TyxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLElBQUtBLEdBQVU0TyxFQUFPLEVBQ3BCLE1BQU8sR0FNVCxJQUpBLElBQUk3TCxFQUFRLEVBQ1JnbUUsRUFBVyxFQUNYcHNELEVBQVN4YixFQUFNOHNFLEdBQVdqdUUsRUFBUzRPLElBRWhDN0wsRUFBUS9DLEdBQ2IyYyxFQUFPb3NELEtBQWNrVixHQUFVbDVFLEVBQU9oQyxFQUFRQSxHQUFTNkwsR0FFekQsT0FBTytOLEdBby9TVG16RCxHQUFPamlDLFFBbCtTUCxTQUFpQjlvQyxHQU1mLElBTEEsSUFBSWhDLEdBQVMsRUFDVC9DLEVBQWtCLE1BQVQrRSxFQUFnQixFQUFJQSxFQUFNL0UsT0FDbkMrb0UsRUFBVyxFQUNYcHNELEVBQVMsS0FFSjVaLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUl0RSxFQUFRcUosRUFBTWhDLEdBQ2RySCxJQUNGaWhCLEVBQU9vc0QsS0FBY3J0RSxHQUd6QixPQUFPaWhCLEdBdTlTVG16RCxHQUFPenlFLE9BOTdTUCxXQUNFLElBQUkyQyxFQUFTMUIsVUFBVTBCLE9BQ3ZCLElBQUtBLEVBQ0gsTUFBTyxHQU1ULElBSkEsSUFBSWhELEVBQU9tRSxFQUFNbkIsRUFBUyxHQUN0QitFLEVBQVF6RyxVQUFVLEdBQ2xCeUUsRUFBUS9DLEVBRUwrQyxLQUNML0YsRUFBSytGLEVBQVEsR0FBS3pFLFVBQVV5RSxHQUU5QixPQUFPcW1FLEdBQVVqaUQsR0FBUXBpQixHQUFTdXRFLEdBQVV2dEUsR0FBUyxDQUFDQSxHQUFRd3hFLEdBQVl2NUUsRUFBTSxLQW03U2xGOHlFLEdBQU9raEIsS0EzdENQLFNBQWNuYixHQUNaLElBQUk3MUUsRUFBa0IsTUFBVDYxRSxFQUFnQixFQUFJQSxFQUFNNzFFLE9BQ25Dc2tGLEVBQWFoSSxLQVNqQixPQVBBekcsRUFBUzcxRSxFQUFjbXBFLEdBQVMwTSxHQUFPLFNBQVNnUSxHQUM5QyxHQUFzQixtQkFBWEEsRUFBSyxHQUNkLE1BQU0sSUFBSTFtRixHQUFVNmhFLEdBRXRCLE1BQU8sQ0FBQ3NqQixFQUFXdUIsRUFBSyxJQUFLQSxFQUFLLE9BSmxCLEdBT1h0SSxJQUFTLFNBQVN2Z0YsR0FFdkIsSUFEQSxJQUFJK0YsR0FBUyxJQUNKQSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJNmxGLEVBQU9oUSxFQUFNOXlFLEdBQ2pCLEdBQUlsRyxHQUFNZ3BGLEVBQUssR0FBSWxvRixLQUFNWCxHQUN2QixPQUFPSCxHQUFNZ3BGLEVBQUssR0FBSWxvRixLQUFNWCxRQTRzQ3BDOHlFLEdBQU9taEIsU0E5cUNQLFNBQWtCcnhELEdBQ2hCLE9BejVZRixTQUFzQkEsR0FDcEIsSUFBSWk3QixFQUFRejNELEdBQUt3OEIsR0FDakIsT0FBTyxTQUFTempDLEdBQ2QsT0FBTzg0RSxHQUFlOTRFLEVBQVF5akMsRUFBUWk3QixJQXM1WWpDcTJCLENBQWE3ZCxHQUFVenpDLEVBL2llWixLQTZ0Z0JwQmt3QyxHQUFPaU8sU0FBV0EsR0FDbEJqTyxHQUFPbWEsUUFBVUEsR0FDakJuYSxHQUFPL3pFLE9BdHVIUCxTQUFnQk0sRUFBV3drQyxHQUN6QixJQUFJbGtCLEVBQVN3ekQsR0FBVzl6RSxHQUN4QixPQUFxQixNQUFkd2tDLEVBQXFCbGtCLEVBQVNzMkQsR0FBV3QyRCxFQUFRa2tCLElBcXVIMURpdkMsR0FBT3FoQixNQXp1TVAsU0FBU0EsRUFBTW41RCxFQUFNMHJELEVBQU83QixHQUUxQixJQUFJbGxFLEVBQVNxcEUsR0FBV2h1RCxFQTcrVE4sT0FuQ2xCbjVCLDhCQStnVUE2a0YsRUFBUTdCLE9BL2dVUmhqRixFQStnVTRCNmtGLEdBRzVCLE9BREEvbUUsRUFBT3l1RCxZQUFjK2xCLEVBQU0vbEIsWUFDcEJ6dUQsR0FzdU1UbXpELEdBQU9zaEIsV0E3ck1QLFNBQVNBLEVBQVdwNUQsRUFBTTByRCxFQUFPN0IsR0FFL0IsSUFBSWxsRSxFQUFTcXBFLEdBQVdodUQsRUF6aFVBLFFBcEN4Qm41Qiw4QkE0alVBNmtGLEVBQVE3QixPQTVqVVJoakYsRUE0alU0QjZrRixHQUc1QixPQURBL21FLEVBQU95dUQsWUFBY2dtQixFQUFXaG1CLFlBQ3pCenVELEdBMHJNVG16RCxHQUFPOGEsU0FBV0EsR0FDbEI5YSxHQUFPMzlCLFNBQVdBLEdBQ2xCMjlCLEdBQU9nZSxhQUFlQSxHQUN0QmhlLEdBQU9tYyxNQUFRQSxHQUNmbmMsR0FBT29jLE1BQVFBLEdBQ2ZwYyxHQUFPeVksV0FBYUEsR0FDcEJ6WSxHQUFPMFksYUFBZUEsR0FDdEIxWSxHQUFPMlksZUFBaUJBLEdBQ3hCM1ksR0FBT3B4RCxLQXQwU1AsU0FBYzNaLEVBQU83SSxFQUFHMmxGLEdBQ3RCLElBQUk3aEYsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxPQUFLQSxFQUlFaStFLEdBQVVsNUUsR0FEakI3SSxFQUFLMmxGLFFBaDhOTGhqRixJQWc4TmMzQyxFQUFtQixFQUFJMHBGLEdBQVUxcEYsSUFDbkIsRUFBSSxFQUFJQSxFQUFHOEQsR0FIOUIsSUFvMFNYOHZFLEdBQU91aEIsVUFyeVNQLFNBQW1CdHNGLEVBQU83SSxFQUFHMmxGLEdBQzNCLElBQUk3aEYsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxPQUFLQSxFQUtFaStFLEdBQVVsNUUsRUFBTyxHQUR4QjdJLEVBQUk4RCxHQURKOUQsRUFBSzJsRixRQWwrTkxoakYsSUFrK05jM0MsRUFBbUIsRUFBSTBwRixHQUFVMXBGLEtBRWhCLEVBQUksRUFBSUEsR0FKOUIsSUFteVNYNHpFLEdBQU93aEIsZUF6dlNQLFNBQXdCdnNGLEVBQU84akUsR0FDN0IsT0FBUTlqRSxHQUFTQSxFQUFNL0UsT0FDbkJ3L0UsR0FBVXo2RSxFQUFPdTNFLEdBQVl6VCxFQUFXLElBQUksR0FBTSxHQUNsRCxJQXV2U05pSCxHQUFPeWhCLFVBanRTUCxTQUFtQnhzRixFQUFPOGpFLEdBQ3hCLE9BQVE5akUsR0FBU0EsRUFBTS9FLE9BQ25Cdy9FLEdBQVV6NkUsRUFBT3UzRSxHQUFZelQsRUFBVyxJQUFJLEdBQzVDLElBK3NTTmlILEdBQU8vbkUsS0EvcVNQLFNBQWNoRCxFQUFPckosRUFBT2duQyxFQUFPemUsR0FDakMsSUFBSWprQixFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLE9BQUtBLEdBR0QwaUMsR0FBeUIsaUJBQVRBLEdBQXFCby9DLEdBQWUvOEUsRUFBT3JKLEVBQU9nbkMsS0FDcEVBLEVBQVEsRUFDUnplLEVBQU1qa0IsR0F6dklWLFNBQWtCK0UsRUFBT3JKLEVBQU9nbkMsRUFBT3plLEdBQ3JDLElBQUlqa0IsRUFBUytFLEVBQU0vRSxPQVduQixLQVRBMGlDLEVBQVFrakQsR0FBVWxqRCxJQUNOLElBQ1ZBLEdBQVNBLEVBQVExaUMsRUFBUyxFQUFLQSxFQUFTMGlDLElBRTFDemUsT0EzMkZBcGxCLElBMjJGT29sQixHQUFxQkEsRUFBTWprQixFQUFVQSxFQUFTNGxGLEdBQVUzaEUsSUFDckQsSUFDUkEsR0FBT2prQixHQUVUaWtCLEVBQU15ZSxFQUFRemUsRUFBTSxFQUFJc3BFLEdBQVN0cEUsR0FDMUJ5ZSxFQUFRemUsR0FDYmxmLEVBQU0yOUIsS0FBV2huQyxFQUVuQixPQUFPcUosRUE0dUlBeXNGLENBQVN6c0YsRUFBT3JKLEVBQU9nbkMsRUFBT3plLElBTjVCLElBNnFTWDZyRCxHQUFPbmpFLE9BM3ZPUCxTQUFnQmk5RCxFQUFZZixHQUUxQixPQURXMWhELEdBQVF5aUQsR0FBY2QsR0FBY3dOLElBQ25DMU0sRUFBWTBTLEdBQVl6VCxFQUFXLEtBMHZPakRpSCxHQUFPMmhCLFFBdnFPUCxTQUFpQjduQixFQUFZcEIsR0FDM0IsT0FBTytOLEdBQVk5b0UsR0FBSW04RCxFQUFZcEIsR0FBVyxJQXVxT2hEc0gsR0FBTzRoQixZQWhwT1AsU0FBcUI5bkIsRUFBWXBCLEdBQy9CLE9BQU8rTixHQUFZOW9FLEdBQUltOEQsRUFBWXBCLEdBaGtTeEIsTUFndGdCYnNILEdBQU82aEIsYUF4bk9QLFNBQXNCL25CLEVBQVlwQixFQUFVamhDLEdBRTFDLE9BREFBLE9BbHBTQTFvQyxJQWtwU1Ewb0MsRUFBc0IsRUFBSXErQyxHQUFVcitDLEdBQ3JDZ3ZDLEdBQVk5b0UsR0FBSW04RCxFQUFZcEIsR0FBV2poQyxJQXVuT2hEdW9DLEdBQU9ueEMsUUFBVUEsR0FDakJteEMsR0FBTzhoQixZQXZpU1AsU0FBcUI3c0YsR0FFbkIsT0FEc0IsTUFBVEEsRUFBZ0IsRUFBSUEsRUFBTS9FLFFBQ3ZCdTJFLEdBQVl4eEUsRUE3cU9qQixLQTZxT29DLElBc2lTakQrcUUsR0FBTytoQixhQS9nU1AsU0FBc0I5c0YsRUFBT3dpQyxHQUUzQixPQURzQixNQUFUeGlDLEVBQWdCLEVBQUlBLEVBQU0vRSxRQUtoQ3UyRSxHQUFZeHhFLEVBRG5Cd2lDLE9BbHdPQTFvQyxJQWt3T1Ewb0MsRUFBc0IsRUFBSXErQyxHQUFVcitDLElBRm5DLElBNmdTWHVvQyxHQUFPZ2lCLEtBejlMUCxTQUFjOTVELEdBQ1osT0FBT2d1RCxHQUFXaHVELEVBNXdVRCxNQXF1Z0JuQjgzQyxHQUFPMmYsS0FBT0EsR0FDZDNmLEdBQU80ZixVQUFZQSxHQUNuQjVmLEdBQU9paUIsVUEzL1JQLFNBQW1CbGMsR0FLakIsSUFKQSxJQUFJOXlFLEdBQVMsRUFDVC9DLEVBQWtCLE1BQVQ2MUUsRUFBZ0IsRUFBSUEsRUFBTTcxRSxPQUNuQzJjLEVBQVMsS0FFSjVaLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUk2bEYsRUFBT2hRLEVBQU05eUUsR0FDakI0WixFQUFPa3BFLEVBQUssSUFBTUEsRUFBSyxHQUV6QixPQUFPbHBFLEdBbS9SVG16RCxHQUFPa2lCLFVBMzhHUCxTQUFtQjcxRixHQUNqQixPQUFpQixNQUFWQSxFQUFpQixHQUFLMDZFLEdBQWMxNkUsRUFBUWlILEdBQUtqSCxLQTI4RzFEMnpFLEdBQU9taUIsWUFqN0dQLFNBQXFCOTFGLEdBQ25CLE9BQWlCLE1BQVZBLEVBQWlCLEdBQUswNkUsR0FBYzE2RSxFQUFRZzRFLEdBQU9oNEUsS0FpN0c1RDJ6RSxHQUFPc2EsUUFBVUEsR0FDakJ0YSxHQUFPb2lCLFFBNTZSUCxTQUFpQm50RixHQUVmLE9BRHNCLE1BQVRBLEVBQWdCLEVBQUlBLEVBQU0vRSxRQUN2QmkrRSxHQUFVbDVFLEVBQU8sR0FBSSxHQUFLLElBMjZSNUMrcUUsR0FBTytZLGFBQWVBLEdBQ3RCL1ksR0FBT2laLGVBQWlCQSxHQUN4QmpaLEdBQU9rWixpQkFBbUJBLEdBQzFCbFosR0FBT2tlLE9BQVNBLEdBQ2hCbGUsR0FBT21lLFNBQVdBLEdBQ2xCbmUsR0FBT3VhLFVBQVlBLEdBQ25CdmEsR0FBT3RILFNBQVdBLEdBQ2xCc0gsR0FBT3dhLE1BQVFBLEdBQ2Z4YSxHQUFPMXNFLEtBQU9BLEdBQ2Qwc0UsR0FBT3FFLE9BQVNBLEdBQ2hCckUsR0FBT3JpRSxJQUFNQSxHQUNicWlFLEdBQU9xaUIsUUExckdQLFNBQWlCaDJGLEVBQVFxc0UsR0FDdkIsSUFBSTdyRCxFQUFTLEdBTWIsT0FMQTZyRCxFQUFXOFQsR0FBWTlULEVBQVUsR0FFakN3TixHQUFXNzVFLEdBQVEsU0FBU1QsRUFBT00sRUFBS0csR0FDdEN3MkUsR0FBZ0JoMkQsRUFBUTZyRCxFQUFTOXNFLEVBQU9NLEVBQUtHLEdBQVNULE1BRWpEaWhCLEdBb3JHVG16RCxHQUFPc2lCLFVBcnBHUCxTQUFtQmoyRixFQUFRcXNFLEdBQ3pCLElBQUk3ckQsRUFBUyxHQU1iLE9BTEE2ckQsRUFBVzhULEdBQVk5VCxFQUFVLEdBRWpDd04sR0FBVzc1RSxHQUFRLFNBQVNULEVBQU9NLEVBQUtHLEdBQ3RDdzJFLEdBQWdCaDJELEVBQVEzZ0IsRUFBS3dzRSxFQUFTOXNFLEVBQU9NLEVBQUtHLE9BRTdDd2dCLEdBK29HVG16RCxHQUFPdWlCLFFBcGhDUCxTQUFpQnp5RCxHQUNmLE9BQU8rNkMsR0FBWXRILEdBQVV6ekMsRUF4dmVYLEtBNHdnQnBCa3dDLEdBQU93aUIsZ0JBaC9CUCxTQUF5QmpsRixFQUFNZ3RFLEdBQzdCLE9BQU9LLEdBQW9CcnRFLEVBQU1nbUUsR0FBVWdILEVBN3hlekIsS0E2d2dCcEJ2SyxHQUFPcVksUUFBVUEsR0FDakJyWSxHQUFPeG9DLE1BQVFBLEdBQ2Z3b0MsR0FBT2llLFVBQVlBLEdBQ25CamUsR0FBTzEwQyxPQUFTQSxHQUNoQjAwQyxHQUFPNmYsU0FBV0EsR0FDbEI3ZixHQUFPOGYsTUFBUUEsR0FDZjlmLEdBQU91YyxPQUFTQSxHQUNoQnZjLEdBQU95aUIsT0F6ekJQLFNBQWdCcjJGLEdBRWQsT0FEQUEsRUFBSTBwRixHQUFVMXBGLEdBQ1BxaEYsSUFBUyxTQUFTdmdGLEdBQ3ZCLE9BQU9rL0UsR0FBUWwvRSxFQUFNZCxPQXV6QnpCNHpFLEdBQU9xZSxLQUFPQSxHQUNkcmUsR0FBTzBpQixPQW5oR1AsU0FBZ0JyMkYsRUFBUTBzRSxHQUN0QixPQUFPeWxCLEdBQU9ueUYsRUFBUWt3RixHQUFPL1AsR0FBWXpULE1BbWhHM0NpSCxHQUFPbHlFLEtBNzNMUCxTQUFjbzZCLEdBQ1osT0FBT3l5RCxHQUFPLEVBQUd6eUQsSUE2M0xuQjgzQyxHQUFPMmlCLFFBcjROUCxTQUFpQjdvQixFQUFZd1MsRUFBV0MsRUFBUXdGLEdBQzlDLE9BQWtCLE1BQWRqWSxFQUNLLElBRUp6aUQsR0FBUWkxRCxLQUNYQSxFQUF5QixNQUFiQSxFQUFvQixHQUFLLENBQUNBLElBR25DajFELEdBRExrMUQsRUFBU3dGLE9BajdTVGhqRixFQWk3UzZCdzlFLEtBRTNCQSxFQUFtQixNQUFWQSxFQUFpQixHQUFLLENBQUNBLElBRTNCRixHQUFZdlMsRUFBWXdTLEVBQVdDLEtBMjNONUN2TSxHQUFPK2YsS0FBT0EsR0FDZC9mLEdBQU93YyxTQUFXQSxHQUNsQnhjLEdBQU9nZ0IsVUFBWUEsR0FDbkJoZ0IsR0FBT2lnQixTQUFXQSxHQUNsQmpnQixHQUFPMmMsUUFBVUEsR0FDakIzYyxHQUFPNGMsYUFBZUEsR0FDdEI1YyxHQUFPeWEsVUFBWUEsR0FDbkJ6YSxHQUFPMzJDLEtBQU9BLEdBQ2QyMkMsR0FBT3dlLE9BQVNBLEdBQ2hCeGUsR0FBTzF6RSxTQUFXQSxHQUNsQjB6RSxHQUFPNGlCLFdBL3JCUCxTQUFvQnYyRixHQUNsQixPQUFPLFNBQVNrUixHQUNkLE9BQWlCLE1BQVZsUixPQTduZlQwQyxFQTZuZnNDazRFLEdBQVE1NkUsRUFBUWtSLEtBOHJCeER5aUUsR0FBTy9RLEtBQU9BLEdBQ2QrUSxHQUFPbVosUUFBVUEsR0FDakJuWixHQUFPNmlCLFVBcHNSUCxTQUFtQjV0RixFQUFPMkosRUFBUTg1RCxHQUNoQyxPQUFRempFLEdBQVNBLEVBQU0vRSxRQUFVME8sR0FBVUEsRUFBTzFPLE9BQzlDazlFLEdBQVluNEUsRUFBTzJKLEVBQVE0dEUsR0FBWTlULEVBQVUsSUFDakR6akUsR0Frc1JOK3FFLEdBQU84aUIsWUF4cVJQLFNBQXFCN3RGLEVBQU8ySixFQUFRZzNCLEdBQ2xDLE9BQVEzZ0MsR0FBU0EsRUFBTS9FLFFBQVUwTyxHQUFVQSxFQUFPMU8sT0FDOUNrOUUsR0FBWW40RSxFQUFPMkosT0F4cFB2QjdQLEVBd3BQMEM2bUMsR0FDdEMzZ0MsR0FzcVJOK3FFLEdBQU9vWixPQUFTQSxHQUNoQnBaLEdBQU85b0IsTUFBUUEsR0FDZjhvQixHQUFPbWdCLFdBQWFBLEdBQ3BCbmdCLEdBQU82YyxNQUFRQSxHQUNmN2MsR0FBTzl4RSxPQXh2TlAsU0FBZ0I0ckUsRUFBWWYsR0FFMUIsT0FEVzFoRCxHQUFReWlELEdBQWNkLEdBQWN3TixJQUNuQzFNLEVBQVl5aUIsR0FBTy9QLEdBQVl6VCxFQUFXLE1BdXZOeERpSCxHQUFPcm9FLE9Bem1SUCxTQUFnQjFDLEVBQU84akUsR0FDckIsSUFBSWxzRCxFQUFTLEdBQ2IsSUFBTTVYLElBQVNBLEVBQU0vRSxPQUNuQixPQUFPMmMsRUFFVCxJQUFJNVosR0FBUyxFQUNUcTZFLEVBQVUsR0FDVnA5RSxFQUFTK0UsRUFBTS9FLE9BR25CLElBREE2b0UsRUFBWXlULEdBQVl6VCxFQUFXLEtBQzFCOWxFLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUl0RSxFQUFRcUosRUFBTWhDLEdBQ2Q4bEUsRUFBVW50RSxFQUFPcUgsRUFBT2dDLEtBQzFCNFgsRUFBTzVjLEtBQUtyRSxHQUNaMGhGLEVBQVFyOUUsS0FBS2dELElBSWpCLE9BREFvNkUsR0FBV3A0RSxFQUFPcTRFLEdBQ1h6Z0UsR0F3bFJUbXpELEdBQU9oVixLQWx1TFAsU0FBYzlpQyxFQUFNMEssR0FDbEIsR0FBbUIsbUJBQVIxSyxFQUNULE1BQU0sSUFBSTc0QixHQUFVNmhFLEdBR3RCLE9BQU91YyxHQUFTdmxELEVBRGhCMEssT0F2bVZBN2pDLElBdW1WUTZqQyxFQUFzQkEsRUFBUWtqRCxHQUFVbGpELEtBK3RMbERvdEMsR0FBTzlxQyxRQUFVQSxHQUNqQjhxQyxHQUFPK2lCLFdBaHROUCxTQUFvQmpwQixFQUFZMXRFLEVBQUcybEYsR0FPakMsT0FMRTNsRixHQURHMmxGLEVBQVFDLEdBQWVsWSxFQUFZMXRFLEVBQUcybEYsUUF4blQzQ2hqRixJQXduVG9EM0MsR0FDOUMsRUFFQTBwRixHQUFVMXBGLElBRUxpckIsR0FBUXlpRCxHQUFjd0ksR0FBa0J1TCxJQUN2Qy9ULEVBQVkxdEUsSUEwc04xQjR6RSxHQUFPbHVFLElBdjZGUCxTQUFhekYsRUFBUWtSLEVBQU0zUixHQUN6QixPQUFpQixNQUFWUyxFQUFpQkEsRUFBUzhnRixHQUFROWdGLEVBQVFrUixFQUFNM1IsSUF1NkZ6RG8wRSxHQUFPZ2pCLFFBNTRGUCxTQUFpQjMyRixFQUFRa1IsRUFBTTNSLEVBQU82M0UsR0FFcEMsT0FEQUEsRUFBa0MsbUJBQWRBLEVBQTJCQSxPQTk3YS9DMTBFLEVBKzdhaUIsTUFBVjFDLEVBQWlCQSxFQUFTOGdGLEdBQVE5Z0YsRUFBUWtSLEVBQU0zUixFQUFPNjNFLElBMjRGaEV6RCxHQUFPaWpCLFFBMXJOUCxTQUFpQm5wQixHQUVmLE9BRFd6aUQsR0FBUXlpRCxHQUFjNEksR0FBZXdMLElBQ3BDcFUsSUF5ck5ka0csR0FBT3p4RSxNQWhqUlAsU0FBZTBHLEVBQU8yOUIsRUFBT3plLEdBQzNCLElBQUlqa0IsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxPQUFLQSxHQUdEaWtCLEdBQXFCLGlCQUFQQSxHQUFtQjY5RCxHQUFlLzhFLEVBQU8yOUIsRUFBT3plLElBQ2hFeWUsRUFBUSxFQUNSemUsRUFBTWprQixJQUdOMGlDLEVBQWlCLE1BQVRBLEVBQWdCLEVBQUlrakQsR0FBVWxqRCxHQUN0Q3plLE9BdHlQRnBsQixJQXN5UFFvbEIsRUFBb0Jqa0IsRUFBUzRsRixHQUFVM2hFLElBRXhDZzZELEdBQVVsNUUsRUFBTzI5QixFQUFPemUsSUFWdEIsSUE4aVJYNnJELEdBQU8wYSxPQUFTQSxHQUNoQjFhLEdBQU9rakIsV0F4M1FQLFNBQW9CanVGLEdBQ2xCLE9BQVFBLEdBQVNBLEVBQU0vRSxPQUNuQmcvRSxHQUFlajZFLEdBQ2YsSUFzM1FOK3FFLEdBQU9takIsYUFuMlFQLFNBQXNCbHVGLEVBQU95akUsR0FDM0IsT0FBUXpqRSxHQUFTQSxFQUFNL0UsT0FDbkJnL0UsR0FBZWo2RSxFQUFPdTNFLEdBQVk5VCxFQUFVLElBQzVDLElBaTJRTnNILEdBQU9wbEQsTUE1aEVQLFNBQWVvWSxFQUFRb3dELEVBQVdqb0QsR0FLaEMsT0FKSUEsR0FBeUIsaUJBQVRBLEdBQXFCNjJDLEdBQWVoL0MsRUFBUW93RCxFQUFXam9ELEtBQ3pFaW9ELEVBQVlqb0QsT0FyemNkcHNDLElBdXpjQW9zQyxPQXZ6Y0Fwc0MsSUF1emNRb3NDLEVBeHZjVyxXQXd2YzhCQSxJQUFVLElBSTNEbkksRUFBU3R2QixHQUFTc3ZCLE1BRVEsaUJBQWJvd0QsR0FDTyxNQUFiQSxJQUFzQmxyQixHQUFTa3JCLE9BRXBDQSxFQUFZaFUsR0FBYWdVLEtBQ1B6bkIsR0FBVzNvQyxHQUNwQnM5QyxHQUFValUsR0FBY3JwQyxHQUFTLEVBQUdtSSxHQUd4Q25JLEVBQU9wWSxNQUFNd29FLEVBQVdqb0QsR0FadEIsSUF1aEVYNmtDLEdBQU9xakIsT0Fuc0xQLFNBQWdCbjdELEVBQU0wSyxHQUNwQixHQUFtQixtQkFBUjFLLEVBQ1QsTUFBTSxJQUFJNzRCLEdBQVU2aEUsR0FHdEIsT0FEQXQrQixFQUFpQixNQUFUQSxFQUFnQixFQUFJK3JDLEdBQVVtWCxHQUFVbGpELEdBQVEsR0FDakQ2NkMsSUFBUyxTQUFTdmdGLEdBQ3ZCLElBQUkrSCxFQUFRL0gsRUFBSzBsQyxHQUNiNmtELEVBQVluSCxHQUFVcGpGLEVBQU0sRUFBRzBsQyxHQUtuQyxPQUhJMzlCLEdBQ0Zxa0UsR0FBVW1lLEVBQVd4aUYsR0FFaEJsSSxHQUFNbTdCLEVBQU1yNkIsS0FBTTRwRixPQXdyTDdCelgsR0FBT3R0RCxLQWwxUVAsU0FBY3pkLEdBQ1osSUFBSS9FLEVBQWtCLE1BQVQrRSxFQUFnQixFQUFJQSxFQUFNL0UsT0FDdkMsT0FBT0EsRUFBU2krRSxHQUFVbDVFLEVBQU8sRUFBRy9FLEdBQVUsSUFpMVFoRDh2RSxHQUFPc2pCLEtBcnpRUCxTQUFjcnVGLEVBQU83SSxFQUFHMmxGLEdBQ3RCLE9BQU05OEUsR0FBU0EsRUFBTS9FLE9BSWRpK0UsR0FBVWw1RSxFQUFPLEdBRHhCN0ksRUFBSzJsRixRQWppUUxoakYsSUFpaVFjM0MsRUFBbUIsRUFBSTBwRixHQUFVMXBGLElBQ2hCLEVBQUksRUFBSUEsR0FIOUIsSUFvelFYNHpFLEdBQU91akIsVUFyeFFQLFNBQW1CdHVGLEVBQU83SSxFQUFHMmxGLEdBQzNCLElBQUk3aEYsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxPQUFLQSxFQUtFaStFLEdBQVVsNUUsR0FEakI3SSxFQUFJOEQsR0FESjlELEVBQUsybEYsUUFua1FMaGpGLElBbWtRYzNDLEVBQW1CLEVBQUkwcEYsR0FBVTFwRixLQUVuQixFQUFJLEVBQUlBLEVBQUc4RCxHQUo5QixJQW14UVg4dkUsR0FBT3dqQixlQXp1UVAsU0FBd0J2dUYsRUFBTzhqRSxHQUM3QixPQUFROWpFLEdBQVNBLEVBQU0vRSxPQUNuQncvRSxHQUFVejZFLEVBQU91M0UsR0FBWXpULEVBQVcsSUFBSSxHQUFPLEdBQ25ELElBdXVRTmlILEdBQU95akIsVUFqc1FQLFNBQW1CeHVGLEVBQU84akUsR0FDeEIsT0FBUTlqRSxHQUFTQSxFQUFNL0UsT0FDbkJ3L0UsR0FBVXo2RSxFQUFPdTNFLEdBQVl6VCxFQUFXLElBQ3hDLElBK3JRTmlILEdBQU8wakIsSUFwdVBQLFNBQWE5M0YsRUFBT3F1RixHQUVsQixPQURBQSxFQUFZcnVGLEdBQ0xBLEdBbXVQVG8wRSxHQUFPMmpCLFNBOW9MUCxTQUFrQno3RCxFQUFNbTlDLEVBQU10OUQsR0FDNUIsSUFBSXN6RSxHQUFVLEVBQ1ZqSixHQUFXLEVBRWYsR0FBbUIsbUJBQVJscUQsRUFDVCxNQUFNLElBQUk3NEIsR0FBVTZoRSxHQU10QixPQUpJb1AsR0FBU3Y0RCxLQUNYc3pFLEVBQVUsWUFBYXR6RSxJQUFZQSxFQUFRc3pFLFFBQVVBLEVBQ3JEakosRUFBVyxhQUFjcnFFLElBQVlBLEVBQVFxcUUsU0FBV0EsR0FFbkQwSSxHQUFTNXlELEVBQU1tOUMsRUFBTSxDQUMxQixRQUFXZ1csRUFDWCxRQUFXaFcsRUFDWCxTQUFZK00sS0Fpb0xoQnBTLEdBQU9nVCxLQUFPQSxHQUNkaFQsR0FBT3NkLFFBQVVBLEdBQ2pCdGQsR0FBT3llLFFBQVVBLEdBQ2pCemUsR0FBTzBlLFVBQVlBLEdBQ25CMWUsR0FBTzRqQixPQXJmUCxTQUFnQmg0RixHQUNkLE9BQUl5ckIsR0FBUXpyQixHQUNIeXRFLEdBQVN6dEUsRUFBT3U3RSxJQUVsQlosR0FBUzM2RSxHQUFTLENBQUNBLEdBQVM0MkUsR0FBVTROLEdBQWExc0UsR0FBUzlYLE1Ba2ZyRW8wRSxHQUFPa00sY0FBZ0JBLEdBQ3ZCbE0sR0FBT2xFLFVBMTBGUCxTQUFtQnp2RSxFQUFRcXNFLEVBQVVDLEdBQ25DLElBQUlrSixFQUFReHFELEdBQVFockIsR0FDaEJ3M0YsRUFBWWhpQixHQUFTdEQsR0FBU2x5RSxJQUFXaXNFLEdBQWFqc0UsR0FHMUQsR0FEQXFzRSxFQUFXOFQsR0FBWTlULEVBQVUsR0FDZCxNQUFmQyxFQUFxQixDQUN2QixJQUFJN3dDLEVBQU96N0IsR0FBVUEsRUFBT3VILFlBRTFCK2tFLEVBREVrckIsRUFDWWhpQixFQUFRLElBQUkvNUMsRUFBTyxHQUUxQnc0QyxHQUFTajBFLElBQ0YyNkUsR0FBV2wvQyxHQUFRdTRDLEdBQVc5QyxHQUFhbHhFLElBRzNDLEdBTWxCLE9BSEN3M0YsRUFBWWpyQixHQUFZc04sSUFBWTc1RSxHQUFRLFNBQVNULEVBQU9xSCxFQUFPNUcsR0FDbEUsT0FBT3FzRSxFQUFTQyxFQUFhL3NFLEVBQU9xSCxFQUFPNUcsTUFFdENzc0UsR0F1ekZUcUgsR0FBTzhqQixNQXJuTFAsU0FBZTU3RCxHQUNiLE9BQU95ckQsR0FBSXpyRCxFQUFNLElBcW5MbkI4M0MsR0FBT3FaLE1BQVFBLEdBQ2ZyWixHQUFPc1osUUFBVUEsR0FDakJ0WixHQUFPdVosVUFBWUEsR0FDbkJ2WixHQUFPemdCLEtBem1RUCxTQUFjdHFELEdBQ1osT0FBUUEsR0FBU0EsRUFBTS9FLE9BQVVtL0UsR0FBU3A2RSxHQUFTLElBeW1RckQrcUUsR0FBTytqQixPQS9rUVAsU0FBZ0I5dUYsRUFBT3lqRSxHQUNyQixPQUFRempFLEdBQVNBLEVBQU0vRSxPQUFVbS9FLEdBQVNwNkUsRUFBT3UzRSxHQUFZOVQsRUFBVSxJQUFNLElBK2tRL0VzSCxHQUFPZ2tCLFNBeGpRUCxTQUFrQi91RixFQUFPMmdDLEdBRXZCLE9BREFBLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0E5eVEvQzdtQyxFQSt5UVFrRyxHQUFTQSxFQUFNL0UsT0FBVW0vRSxHQUFTcDZFLE9BL3lRMUNsRyxFQSt5UTRENm1DLEdBQWMsSUF1alE1RW9xQyxHQUFPaWtCLE1BaHlGUCxTQUFlNTNGLEVBQVFrUixHQUNyQixPQUFpQixNQUFWbFIsR0FBd0JraEYsR0FBVWxoRixFQUFRa1IsSUFneUZuRHlpRSxHQUFPd1osTUFBUUEsR0FDZnhaLEdBQU95WixVQUFZQSxHQUNuQnpaLEdBQU9ra0IsT0Fwd0ZQLFNBQWdCNzNGLEVBQVFrUixFQUFNa3lFLEdBQzVCLE9BQWlCLE1BQVZwakYsRUFBaUJBLEVBQVNtakYsR0FBV25qRixFQUFRa1IsRUFBTTR5RSxHQUFhVixLQW93RnpFelAsR0FBT21rQixXQXp1RlAsU0FBb0I5M0YsRUFBUWtSLEVBQU1reUUsRUFBU2hNLEdBRXpDLE9BREFBLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0Fsb2IvQzEwRSxFQW1vYmlCLE1BQVYxQyxFQUFpQkEsRUFBU21qRixHQUFXbmpGLEVBQVFrUixFQUFNNHlFLEdBQWFWLEdBQVVoTSxJQXd1Rm5GekQsR0FBT3BoRSxPQUFTQSxHQUNoQm9oRSxHQUFPb2tCLFNBaHJGUCxTQUFrQi8zRixHQUNoQixPQUFpQixNQUFWQSxFQUFpQixHQUFLeXVFLEdBQVd6dUUsRUFBUWc0RSxHQUFPaDRFLEtBZ3JGekQyekUsR0FBTzBaLFFBQVVBLEdBQ2pCMVosR0FBT3NTLE1BQVFBLEdBQ2Z0UyxHQUFPcWtCLEtBM21MUCxTQUFjejRGLEVBQU9xbkYsR0FDbkIsT0FBTzBKLEdBQVF4TSxHQUFhOEMsR0FBVXJuRixJQTJtTHhDbzBFLEdBQU8yWixJQUFNQSxHQUNiM1osR0FBTzRaLE1BQVFBLEdBQ2Y1WixHQUFPNlosUUFBVUEsR0FDakI3WixHQUFPOFosSUFBTUEsR0FDYjlaLEdBQU9za0IsVUFqM1BQLFNBQW1CdjVCLEVBQU9uc0QsR0FDeEIsT0FBT214RSxHQUFjaGxCLEdBQVMsR0FBSW5zRCxHQUFVLEdBQUlra0UsS0FpM1BsRDlDLEdBQU91a0IsY0EvMVBQLFNBQXVCeDVCLEVBQU9uc0QsR0FDNUIsT0FBT214RSxHQUFjaGxCLEdBQVMsR0FBSW5zRCxHQUFVLEdBQUl1dUUsS0ErMVBsRG5OLEdBQU8rWixRQUFVQSxHQUdqQi9aLEdBQU81MkQsUUFBVXExRSxHQUNqQnplLEdBQU93a0IsVUFBWTlGLEdBQ25CMWUsR0FBT3lrQixPQUFTOUcsR0FDaEIzZCxHQUFPMGtCLFdBQWE5RyxHQUdwQmtDLEdBQU05ZixHQUFRQSxJQUtkQSxHQUFPdm5FLElBQU1BLEdBQ2J1bkUsR0FBT3dmLFFBQVVBLEdBQ2pCeGYsR0FBTzJlLFVBQVlBLEdBQ25CM2UsR0FBTzZlLFdBQWFBLEdBQ3BCN2UsR0FBTzNzQyxLQUFPQSxHQUNkMnNDLEdBQU9yc0QsTUFwckZQLFNBQWVxSCxFQUFRc29ELEVBQU96dkIsR0FhNUIsWUFsdWJBOWtELElBc3RiSThrRCxJQUNGQSxFQUFReXZCLEVBQ1JBLE9BeHRiRnYwRSxZQTB0Ykk4a0QsSUFFRkEsR0FEQUEsRUFBUXloQyxHQUFTemhDLEtBQ0NBLEVBQVFBLEVBQVEsUUE1dGJwQzlrRCxJQTh0Ykl1MEUsSUFFRkEsR0FEQUEsRUFBUWdTLEdBQVNoUyxLQUNDQSxFQUFRQSxFQUFRLEdBRTdCYixHQUFVNlMsR0FBU3Q2RCxHQUFTc29ELEVBQU96dkIsSUF3cUY1Q21zQixHQUFPMTRDLE1BN2pMUCxTQUFlMTdCLEdBQ2IsT0FBTzIzRSxHQUFVMzNFLEVBcnpWSSxJQWszZ0J2Qm8wRSxHQUFPMmtCLFVBcGdMUCxTQUFtQi80RixHQUNqQixPQUFPMjNFLEdBQVUzM0UsRUFBTzB5RixJQW9nTDFCdGUsR0FBTzRrQixjQXIrS1AsU0FBdUJoNUYsRUFBTzYzRSxHQUU1QixPQUFPRixHQUFVMzNFLEVBQU8weUYsRUFEeEI3YSxFQUFrQyxtQkFBZEEsRUFBMkJBLE9BeDZWL0MxMEUsSUE2NGdCRml4RSxHQUFPNmtCLFVBN2hMUCxTQUFtQmo1RixFQUFPNjNFLEdBRXhCLE9BQU9GLEdBQVUzM0UsRUF6MVZJLEVBdzFWckI2M0UsRUFBa0MsbUJBQWRBLEVBQTJCQSxPQWozVi9DMTBFLElBODRnQkZpeEUsR0FBTzhrQixXQTE4S1AsU0FBb0J6NEYsRUFBUXlqQyxHQUMxQixPQUFpQixNQUFWQSxHQUFrQnExQyxHQUFlOTRFLEVBQVF5akMsRUFBUXg4QixHQUFLdzhCLEtBMDhLL0Rrd0MsR0FBT3VTLE9BQVNBLEdBQ2hCdlMsR0FBTytrQixVQTF4Q1AsU0FBbUJuNUYsRUFBTytvRixHQUN4QixPQUFpQixNQUFUL29GLEdBQWlCQSxHQUFVQSxFQUFTK29GLEVBQWUvb0YsR0EweEM3RG8wRSxHQUFPc2dCLE9BQVNBLEdBQ2hCdGdCLEdBQU9nbEIsU0F6OUVQLFNBQWtCaHlELEVBQVFobUMsRUFBUThGLEdBQ2hDa2dDLEVBQVN0dkIsR0FBU3N2QixHQUNsQmhtQyxFQUFTb2lGLEdBQWFwaUYsR0FFdEIsSUFBSWtELEVBQVM4aUMsRUFBTzlpQyxPQUtoQmlrQixFQUpKcmhCLE9BOTdiQS9ELElBODdiVytELEVBQ1A1QyxFQUNBdXlFLEdBQVVxVCxHQUFVaGpGLEdBQVcsRUFBRzVDLEdBSXRDLE9BREE0QyxHQUFZOUYsRUFBT2tELFNBQ0EsR0FBSzhpQyxFQUFPemtDLE1BQU11RSxFQUFVcWhCLElBQVFubkIsR0ErOEV6RGd6RSxHQUFPNEMsR0FBS0EsR0FDWjVDLEdBQU9pbEIsT0FqN0VQLFNBQWdCanlELEdBRWQsT0FEQUEsRUFBU3R2QixHQUFTc3ZCLEtBQ0FvZ0MsRUFBbUJ2K0QsS0FBS20rQixHQUN0Q0EsRUFBT25xQixRQUFRcXFELEVBQWlCc0ksSUFDaEN4b0MsR0E4NkVOZ3RDLEdBQU9rbEIsYUE1NUVQLFNBQXNCbHlELEdBRXBCLE9BREFBLEVBQVN0dkIsR0FBU3N2QixLQUNBNGdDLEVBQWdCLytELEtBQUttK0IsR0FDbkNBLEVBQU9ucUIsUUFBUThxRCxFQUFjLFFBQzdCM2dDLEdBeTVFTmd0QyxHQUFPemxELE1BNTdPUCxTQUFldS9DLEVBQVlmLEVBQVdnWixHQUNwQyxJQUFJN3BELEVBQU83USxHQUFReWlELEdBQWNoQixHQUFhdU4sR0FJOUMsT0FISTBMLEdBQVNDLEdBQWVsWSxFQUFZZixFQUFXZ1osS0FDakRoWixPQTc5UkZocUUsR0ErOVJPbTVCLEVBQUs0eEMsRUFBWTBTLEdBQVl6VCxFQUFXLEtBdzdPakRpSCxHQUFPdjBELEtBQU9BLEdBQ2R1MEQsR0FBTzRZLFVBQVlBLEdBQ25CNVksR0FBT21sQixRQXJ4SFAsU0FBaUI5NEYsRUFBUTBzRSxHQUN2QixPQUFPYyxHQUFZeHRFLEVBQVFtZ0YsR0FBWXpULEVBQVcsR0FBSW1OLEtBcXhIeERsRyxHQUFPb2EsU0FBV0EsR0FDbEJwYSxHQUFPNlksY0FBZ0JBLEdBQ3ZCN1ksR0FBT29sQixZQWp2SFAsU0FBcUIvNEYsRUFBUTBzRSxHQUMzQixPQUFPYyxHQUFZeHRFLEVBQVFtZ0YsR0FBWXpULEVBQVcsR0FBSXFOLEtBaXZIeERwRyxHQUFPL1UsTUFBUUEsR0FDZitVLEdBQU94b0UsUUFBVUEsR0FDakJ3b0UsR0FBT3FhLGFBQWVBLEdBQ3RCcmEsR0FBT3FsQixNQXJ0SFAsU0FBZWg1RixFQUFRcXNFLEdBQ3JCLE9BQWlCLE1BQVZyc0UsRUFDSEEsRUFDQXU2RSxHQUFRdjZFLEVBQVFtZ0YsR0FBWTlULEVBQVUsR0FBSTJMLEtBbXRIaERyRSxHQUFPc2xCLFdBdHJIUCxTQUFvQmo1RixFQUFRcXNFLEdBQzFCLE9BQWlCLE1BQVZyc0UsRUFDSEEsRUFDQXk2RSxHQUFhejZFLEVBQVFtZ0YsR0FBWTlULEVBQVUsR0FBSTJMLEtBb3JIckRyRSxHQUFPdWxCLE9BcnBIUCxTQUFnQmw1RixFQUFRcXNFLEdBQ3RCLE9BQU9yc0UsR0FBVTY1RSxHQUFXNzVFLEVBQVFtZ0YsR0FBWTlULEVBQVUsS0FxcEg1RHNILEdBQU93bEIsWUF4bkhQLFNBQXFCbjVGLEVBQVFxc0UsR0FDM0IsT0FBT3JzRSxHQUFVKzVFLEdBQWdCLzVFLEVBQVFtZ0YsR0FBWTlULEVBQVUsS0F3bkhqRXNILEdBQU94MEUsSUFBTUEsR0FDYncwRSxHQUFPOGMsR0FBS0EsR0FDWjljLEdBQU8rYyxJQUFNQSxHQUNiL2MsR0FBT3ZoRSxJQXpnSFAsU0FBYXBTLEVBQVFrUixHQUNuQixPQUFpQixNQUFWbFIsR0FBa0I4cUYsR0FBUTlxRixFQUFRa1IsRUFBTXNxRSxLQXlnSGpEN0gsR0FBTzBMLE1BQVFBLEdBQ2YxTCxHQUFPOFksS0FBT0EsR0FDZDlZLEdBQU8ySyxTQUFXQSxHQUNsQjNLLEdBQU91RixTQTVwT1AsU0FBa0J6TCxFQUFZbHVFLEVBQU9xdUUsRUFBVzhYLEdBQzlDalksRUFBYXVSLEdBQVl2UixHQUFjQSxFQUFhbDdELEdBQU9rN0QsR0FDM0RHLEVBQWFBLElBQWM4WCxFQUFTK0QsR0FBVTdiLEdBQWEsRUFFM0QsSUFBSS9wRSxFQUFTNHBFLEVBQVc1cEUsT0FJeEIsT0FISStwRSxFQUFZLElBQ2RBLEVBQVkwRSxHQUFVenVFLEVBQVMrcEUsRUFBVyxJQUVyQ2tqQixHQUFTcmpCLEdBQ1hHLEdBQWEvcEUsR0FBVTRwRSxFQUFXcjlELFFBQVE3USxFQUFPcXVFLElBQWMsSUFDN0QvcEUsR0FBVWlwRSxHQUFZVyxFQUFZbHVFLEVBQU9xdUUsSUFBYyxHQW1wT2hFK0YsR0FBT3ZqRSxRQTlsU1AsU0FBaUJ4SCxFQUFPckosRUFBT3F1RSxHQUM3QixJQUFJL3BFLEVBQWtCLE1BQVQrRSxFQUFnQixFQUFJQSxFQUFNL0UsT0FDdkMsSUFBS0EsRUFDSCxPQUFRLEVBRVYsSUFBSStDLEVBQXFCLE1BQWJnbkUsRUFBb0IsRUFBSTZiLEdBQVU3YixHQUk5QyxPQUhJaG5FLEVBQVEsSUFDVkEsRUFBUTByRSxHQUFVenVFLEVBQVMrQyxFQUFPLElBRTdCa21FLEdBQVlsa0UsRUFBT3JKLEVBQU9xSCxJQXNsU25DK3NFLEdBQU95bEIsUUFscUZQLFNBQWlCenFFLEVBQVE0WCxFQUFPemUsR0FTOUIsT0FSQXllLEVBQVF1aUQsR0FBU3ZpRCxRQTV3YmpCN2pDLElBNndiSW9sQixHQUNGQSxFQUFNeWUsRUFDTkEsRUFBUSxHQUVSemUsRUFBTWdoRSxHQUFTaGhFLEdBcnNWbkIsU0FBcUI2RyxFQUFRNFgsRUFBT3plLEdBQ2xDLE9BQU82RyxHQUFVNGpELEdBQVVoc0MsRUFBT3plLElBQVE2RyxFQUFTMmpELEdBQVUvckMsRUFBT3plLEdBdXNWN0R1eEUsQ0FEUDFxRSxFQUFTczZELEdBQVN0NkQsR0FDUzRYLEVBQU96ZSxJQTBwRnBDNnJELEdBQU9vZSxPQUFTQSxHQUNoQnBlLEdBQU8rQixZQUFjQSxHQUNyQi9CLEdBQU8zb0QsUUFBVUEsR0FDakIyb0QsR0FBT3BJLGNBQWdCQSxHQUN2Qm9JLEdBQU9xTCxZQUFjQSxHQUNyQnJMLEdBQU9pTSxrQkFBb0JBLEdBQzNCak0sR0FBTzJsQixVQXR3S1AsU0FBbUIvNUYsR0FDakIsT0FBaUIsSUFBVkEsSUFBNEIsSUFBVkEsR0FDdEJxMEUsR0FBYXIwRSxJQUFVMjdFLEdBQVczN0UsSUFBVTJsRSxHQXF3S2pEeU8sR0FBT3pCLFNBQVdBLEdBQ2xCeUIsR0FBT2xJLE9BQVNBLEdBQ2hCa0ksR0FBTzRsQixVQTdzS1AsU0FBbUJoNkYsR0FDakIsT0FBT3EwRSxHQUFhcjBFLElBQTZCLElBQW5CQSxFQUFNeXJFLFdBQW1CdHZDLEdBQWNuOEIsSUE2c0t2RW8wRSxHQUFPNmxCLFFBenFLUCxTQUFpQmo2RixHQUNmLEdBQWEsTUFBVEEsRUFDRixPQUFPLEVBRVQsR0FBSXkvRSxHQUFZei9FLEtBQ1h5ckIsR0FBUXpyQixJQUEwQixpQkFBVEEsR0FBNEMsbUJBQWhCQSxFQUFNcXFDLFFBQzFEc29DLEdBQVMzeUUsSUFBVTBzRSxHQUFhMXNFLElBQVVtMkUsR0FBWW4yRSxJQUMxRCxPQUFRQSxFQUFNc0UsT0FFaEIsSUFBSTR6RSxFQUFNQyxHQUFPbjRFLEdBQ2pCLEdBQUlrNEUsR0FBT2xTLEdBQVVrUyxHQUFPOVIsRUFDMUIsT0FBUXBtRSxFQUFNa1QsS0FFaEIsR0FBSWlzRSxHQUFZbi9FLEdBQ2QsT0FBUWsvRSxHQUFTbC9FLEdBQU9zRSxPQUUxQixJQUFLLElBQUloRSxLQUFPTixFQUNkLEdBQUlZLEdBQWUxQixLQUFLYyxFQUFPTSxHQUM3QixPQUFPLEVBR1gsT0FBTyxHQXFwS1Q4ekUsR0FBTzhsQixRQXRuS1AsU0FBaUJsNkYsRUFBT2tqQixHQUN0QixPQUFPMDVELEdBQVk1OEUsRUFBT2tqQixJQXNuSzVCa3hELEdBQU8rbEIsWUFubEtQLFNBQXFCbjZGLEVBQU9rakIsRUFBTzIwRCxHQUVqQyxJQUFJNTJELEdBREo0MkQsRUFBa0MsbUJBQWRBLEVBQTJCQSxPQXgyVy9DMTBFLEdBeTJXMEIwMEUsRUFBVzczRSxFQUFPa2pCLFFBejJXNUMvZixFQTAyV0EsWUExMldBQSxJQTAyV084ZCxFQUF1QjI3RCxHQUFZNThFLEVBQU9rakIsT0ExMldqRC9mLEVBMDJXbUUwMEUsS0FBZ0I1MkQsR0FpbEtyRm16RCxHQUFPZ2QsUUFBVUEsR0FDakJoZCxHQUFPdjRDLFNBMWhLUCxTQUFrQjc3QixHQUNoQixNQUF1QixpQkFBVEEsR0FBcUI0eUUsR0FBZTV5RSxJQTBoS3BEbzBFLEdBQU9nSCxXQUFhQSxHQUNwQmhILEdBQU9pZCxVQUFZQSxHQUNuQmpkLEdBQU9xWCxTQUFXQSxHQUNsQnJYLEdBQU9oSSxNQUFRQSxHQUNmZ0ksR0FBT2dtQixRQTExSlAsU0FBaUIzNUYsRUFBUXlqQyxHQUN2QixPQUFPempDLElBQVd5akMsR0FBVXM2QyxHQUFZLzlFLEVBQVF5akMsRUFBUXc3QyxHQUFheDdDLEtBMDFKdkVrd0MsR0FBT2ltQixZQXZ6SlAsU0FBcUI1NUYsRUFBUXlqQyxFQUFRMnpDLEdBRW5DLE9BREFBLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0E1b1gvQzEwRSxFQTZvWE9xN0UsR0FBWS85RSxFQUFReWpDLEVBQVF3N0MsR0FBYXg3QyxHQUFTMnpDLElBc3pKM0R6RCxHQUFPdHlFLE1BdnhKUCxTQUFlOUIsR0FJYixPQUFPc3hGLEdBQVN0eEYsSUFBVUEsSUFBVUEsR0FveEp0Q28wRSxHQUFPa21CLFNBdnZKUCxTQUFrQnQ2RixHQUNoQixHQUFJMnJGLEdBQVczckYsR0FDYixNQUFNLElBQUl5RSxFQXRzWE0sbUVBd3NYbEIsT0FBT282RSxHQUFhNytFLElBb3ZKdEJvMEUsR0FBT21tQixNQXhzSlAsU0FBZXY2RixHQUNiLE9BQWdCLE1BQVRBLEdBd3NKVG8wRSxHQUFPb21CLE9BanVKUCxTQUFnQng2RixHQUNkLE9BQWlCLE9BQVZBLEdBaXVKVG8wRSxHQUFPa2QsU0FBV0EsR0FDbEJsZCxHQUFPTSxTQUFXQSxHQUNsQk4sR0FBT0MsYUFBZUEsR0FDdEJELEdBQU9qNEMsY0FBZ0JBLEdBQ3ZCaTRDLEdBQU85SCxTQUFXQSxHQUNsQjhILEdBQU9xbUIsY0FybEpQLFNBQXVCejZGLEdBQ3JCLE9BQU9xeEYsR0FBVXJ4RixJQUFVQSxJQTl6WFIsa0JBOHpYc0NBLEdBOXpYdEMsa0JBbTVnQnJCbzBFLEdBQU81SCxNQUFRQSxHQUNmNEgsR0FBT21kLFNBQVdBLEdBQ2xCbmQsR0FBT3VHLFNBQVdBLEdBQ2xCdkcsR0FBTzFILGFBQWVBLEdBQ3RCMEgsR0FBT3NtQixZQW4vSVAsU0FBcUIxNkYsR0FDbkIsWUEvOVhBbUQsSUErOVhPbkQsR0FtL0lUbzBFLEdBQU91bUIsVUEvOUlQLFNBQW1CMzZGLEdBQ2pCLE9BQU9xMEUsR0FBYXIwRSxJQUFVbTRFLEdBQU9uNEUsSUFBVXVtRSxHQSs5SWpENk4sR0FBT3dtQixVQTM4SVAsU0FBbUI1NkYsR0FDakIsT0FBT3EwRSxHQUFhcjBFLElBbjZYUCxvQkFtNlhpQjI3RSxHQUFXMzdFLElBMjhJM0NvMEUsR0FBT3R5RCxLQXovUlAsU0FBY3pZLEVBQU9tdUYsR0FDbkIsT0FBZ0IsTUFBVG51RixFQUFnQixHQUFLd3BFLEdBQVczekUsS0FBS21LLEVBQU9tdUYsSUF5L1JyRHBqQixHQUFPK2UsVUFBWUEsR0FDbkIvZSxHQUFPcGEsS0FBT0EsR0FDZG9hLEdBQU9weUIsWUFoOVJQLFNBQXFCMzRDLEVBQU9ySixFQUFPcXVFLEdBQ2pDLElBQUkvcEUsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxJQUFLQSxFQUNILE9BQVEsRUFFVixJQUFJK0MsRUFBUS9DLEVBS1osWUFqaFBBbkIsSUE2Z1BJa3JFLElBRUZobkUsR0FEQUEsRUFBUTZpRixHQUFVN2IsSUFDRixFQUFJMEUsR0FBVXp1RSxFQUFTK0MsRUFBTyxHQUFLMnJFLEdBQVUzckUsRUFBTy9DLEVBQVMsSUFFeEV0RSxHQUFVQSxFQXJ2TXJCLFNBQTJCcUosRUFBT3JKLEVBQU9xdUUsR0FFdkMsSUFEQSxJQUFJaG5FLEVBQVFnbkUsRUFBWSxFQUNqQmhuRSxLQUNMLEdBQUlnQyxFQUFNaEMsS0FBV3JILEVBQ25CLE9BQU9xSCxFQUdYLE9BQU9BLEVBK3VNRHd6RixDQUFrQnh4RixFQUFPckosRUFBT3FILEdBQ2hDK21FLEdBQWMva0UsRUFBT21sRSxHQUFXbm5FLEdBQU8sSUFxOFI3QytzRSxHQUFPZ2YsVUFBWUEsR0FDbkJoZixHQUFPaWYsV0FBYUEsR0FDcEJqZixHQUFPb2QsR0FBS0EsR0FDWnBkLEdBQU9xZCxJQUFNQSxHQUNicmQsR0FBT2xpRSxJQWhmUCxTQUFhN0ksR0FDWCxPQUFRQSxHQUFTQSxFQUFNL0UsT0FDbkJvMkUsR0FBYXJ4RSxFQUFPMDFFLEdBQVUvQyxTQTkrZmxDNzRFLEdBNjlnQkZpeEUsR0FBTzBtQixNQXBkUCxTQUFlenhGLEVBQU95akUsR0FDcEIsT0FBUXpqRSxHQUFTQSxFQUFNL0UsT0FDbkJvMkUsR0FBYXJ4RSxFQUFPdTNFLEdBQVk5VCxFQUFVLEdBQUlrUCxTQTNnZ0JsRDc0RSxHQTg5Z0JGaXhFLEdBQU8ybUIsS0FqY1AsU0FBYzF4RixHQUNaLE9BQU9xbEUsR0FBU3JsRSxFQUFPMDFFLEtBaWN6QjNLLEdBQU80bUIsT0F2YVAsU0FBZ0IzeEYsRUFBT3lqRSxHQUNyQixPQUFPNEIsR0FBU3JsRSxFQUFPdTNFLEdBQVk5VCxFQUFVLEtBdWEvQ3NILEdBQU9uaUUsSUFsWlAsU0FBYTVJLEdBQ1gsT0FBUUEsR0FBU0EsRUFBTS9FLE9BQ25CbzJFLEdBQWFyeEUsRUFBTzAxRSxHQUFVUSxTQWhsZ0JsQ3A4RSxHQWkrZ0JGaXhFLEdBQU82bUIsTUF0WFAsU0FBZTV4RixFQUFPeWpFLEdBQ3BCLE9BQVF6akUsR0FBU0EsRUFBTS9FLE9BQ25CbzJFLEdBQWFyeEUsRUFBT3UzRSxHQUFZOVQsRUFBVSxHQUFJeVMsU0E3bWdCbERwOEUsR0FrK2dCRml4RSxHQUFPa1gsVUFBWUEsR0FDbkJsWCxHQUFPd1gsVUFBWUEsR0FDbkJ4WCxHQUFPOG1CLFdBenRCUCxXQUNFLE1BQU8sSUF5dEJUOW1CLEdBQU8rbUIsV0F6c0JQLFdBQ0UsTUFBTyxJQXlzQlQvbUIsR0FBT2duQixTQXpyQlAsV0FDRSxPQUFPLEdBeXJCVGhuQixHQUFPeWdCLFNBQVdBLEdBQ2xCemdCLEdBQU9pbkIsSUE3N1JQLFNBQWFoeUYsRUFBTzdJLEdBQ2xCLE9BQVE2SSxHQUFTQSxFQUFNL0UsT0FBVWs4RSxHQUFRbjNFLEVBQU82Z0YsR0FBVTFwRixTQTVpUDFEMkMsR0F5K2dCRml4RSxHQUFPa25CLFdBbGlDUCxXQUlFLE9BSEk5d0QsR0FBSzlRLElBQU16M0IsT0FDYnVvQyxHQUFLOVEsRUFBSTYzQyxJQUVKdHZFLE1BK2hDVG15RSxHQUFPdlAsS0FBT0EsR0FDZHVQLEdBQU8vakIsSUFBTUEsR0FDYitqQixHQUFPOTVCLElBajVFUCxTQUFhbFQsRUFBUTlpQyxFQUFRNmtGLEdBQzNCL2hELEVBQVN0dkIsR0FBU3N2QixHQUdsQixJQUFJbTBELEdBRkpqM0YsRUFBUzRsRixHQUFVNWxGLElBRU1nc0UsR0FBV2xwQyxHQUFVLEVBQzlDLElBQUs5aUMsR0FBVWkzRixHQUFhajNGLEVBQzFCLE9BQU84aUMsRUFFVCxJQUFJNkMsR0FBTzNsQyxFQUFTaTNGLEdBQWEsRUFDakMsT0FDRXJTLEdBQWMxVyxHQUFZdm9DLEdBQU1rL0MsR0FDaEMvaEQsRUFDQThoRCxHQUFjM1csR0FBV3RvQyxHQUFNay9DLElBczRFbkMvVSxHQUFPb25CLE9BMzJFUCxTQUFnQnAwRCxFQUFROWlDLEVBQVE2a0YsR0FDOUIvaEQsRUFBU3R2QixHQUFTc3ZCLEdBR2xCLElBQUltMEQsR0FGSmozRixFQUFTNGxGLEdBQVU1bEYsSUFFTWdzRSxHQUFXbHBDLEdBQVUsRUFDOUMsT0FBUTlpQyxHQUFVaTNGLEVBQVlqM0YsRUFDekI4aUMsRUFBUzhoRCxHQUFjNWtGLEVBQVNpM0YsRUFBV3BTLEdBQzVDL2hELEdBcTJFTmd0QyxHQUFPbHFELFNBMzBFUCxTQUFrQmtkLEVBQVE5aUMsRUFBUTZrRixHQUNoQy9oRCxFQUFTdHZCLEdBQVNzdkIsR0FHbEIsSUFBSW0wRCxHQUZKajNGLEVBQVM0bEYsR0FBVTVsRixJQUVNZ3NFLEdBQVdscEMsR0FBVSxFQUM5QyxPQUFROWlDLEdBQVVpM0YsRUFBWWozRixFQUN6QjRrRixHQUFjNWtGLEVBQVNpM0YsRUFBV3BTLEdBQVMvaEQsRUFDNUNBLEdBcTBFTmd0QyxHQUFPMzVELFNBMXlFUCxTQUFrQjJzQixFQUFRcTBELEVBQU90VixHQU0vQixPQUxJQSxHQUFrQixNQUFUc1YsRUFDWEEsRUFBUSxFQUNDQSxJQUNUQSxHQUFTQSxHQUVKdm9CLEdBQWVwN0QsR0FBU3N2QixHQUFRbnFCLFFBQVFnckQsRUFBYSxJQUFLd3pCLEdBQVMsSUFxeUU1RXJuQixHQUFPdGpELE9BMXJGUCxTQUFnQjRtRCxFQUFPenZCLEVBQU95ekMsR0EyQjVCLEdBMUJJQSxHQUErQixrQkFBWkEsR0FBeUJ0VixHQUFlMU8sRUFBT3p2QixFQUFPeXpDLEtBQzNFenpDLEVBQVF5ekMsT0F4emJWdjRGLFlBMHpiSXU0RixJQUNrQixrQkFBVHp6QyxHQUNUeXpDLEVBQVd6ekMsRUFDWEEsT0E3emJKOWtELEdBK3piMkIsa0JBQVR1MEUsSUFDZGdrQixFQUFXaGtCLEVBQ1hBLE9BajBiSnYwRSxhQW8wYkl1MEUsUUFwMGJKdjBFLElBbzBiMkI4a0QsR0FDekJ5dkIsRUFBUSxFQUNSenZCLEVBQVEsSUFHUnl2QixFQUFRNlIsR0FBUzdSLFFBejBibkJ2MEUsSUEwMGJNOGtELEdBQ0ZBLEVBQVF5dkIsRUFDUkEsRUFBUSxHQUVSenZCLEVBQVFzaEMsR0FBU3RoQyxJQUdqQnl2QixFQUFRenZCLEVBQU8sQ0FDakIsSUFBSWp1QixFQUFPMDlDLEVBQ1hBLEVBQVF6dkIsRUFDUkEsRUFBUWp1QixFQUVWLEdBQUkwaEUsR0FBWWhrQixFQUFRLEdBQUt6dkIsRUFBUSxFQUFHLENBQ3RDLElBQUl1a0MsRUFBT3JaLEtBQ1gsT0FBT0gsR0FBVTBFLEVBQVM4VSxHQUFRdmtDLEVBQVF5dkIsRUFBUXRNLEdBQWUsUUFBVW9oQixFQUFPLElBQUlsb0YsT0FBUyxLQUFPMmpELEdBRXhHLE9BQU93dUIsR0FBV2lCLEVBQU96dkIsSUF1cEYzQm1zQixHQUFPanFELE9BNStOUCxTQUFnQitqRCxFQUFZcEIsRUFBVUMsR0FDcEMsSUFBSXp3QyxFQUFPN1EsR0FBUXlpRCxHQUFjUCxHQUFja0IsR0FDM0NqQixFQUFZaHJFLFVBQVUwQixPQUFTLEVBRW5DLE9BQU9nNEIsRUFBSzR4QyxFQUFZMFMsR0FBWTlULEVBQVUsR0FBSUMsRUFBYWEsRUFBVzBKLEtBeStONUVsRCxHQUFPdW5CLFlBaDlOUCxTQUFxQnp0QixFQUFZcEIsRUFBVUMsR0FDekMsSUFBSXp3QyxFQUFPN1EsR0FBUXlpRCxHQUFjTCxHQUFtQmdCLEdBQ2hEakIsRUFBWWhyRSxVQUFVMEIsT0FBUyxFQUVuQyxPQUFPZzRCLEVBQUs0eEMsRUFBWTBTLEdBQVk5VCxFQUFVLEdBQUlDLEVBQWFhLEVBQVcyTSxLQTY4TjVFbkcsR0FBT3duQixPQS93RVAsU0FBZ0J4MEQsRUFBUTVtQyxFQUFHMmxGLEdBTXpCLE9BSkUzbEYsR0FERzJsRixFQUFRQyxHQUFlaC9DLEVBQVE1bUMsRUFBRzJsRixRQXJ1Y3ZDaGpGLElBcXVjZ0QzQyxHQUMxQyxFQUVBMHBGLEdBQVUxcEYsR0FFVG9oRixHQUFXOXBFLEdBQVNzdkIsR0FBUzVtQyxJQTB3RXRDNHpFLEdBQU9uM0QsUUFwdkVQLFdBQ0UsSUFBSTNiLEVBQU9zQixVQUNQd2tDLEVBQVN0dkIsR0FBU3hXLEVBQUssSUFFM0IsT0FBT0EsRUFBS2dELE9BQVMsRUFBSThpQyxFQUFTQSxFQUFPbnFCLFFBQVEzYixFQUFLLEdBQUlBLEVBQUssS0FpdkVqRTh5RSxHQUFPbnpELE9BdG9HUCxTQUFnQnhnQixFQUFRa1IsRUFBTW8zRSxHQUc1QixJQUFJMWhGLEdBQVMsRUFDVC9DLEdBSEpxTixFQUFPMnBFLEdBQVMzcEUsRUFBTWxSLElBR0o2RCxPQU9sQixJQUpLQSxJQUNIQSxFQUFTLEVBQ1Q3RCxPQXgzYUYwQyxLQTAzYVNrRSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBa0IsTUFBVlMsT0EzM2FkMEMsRUEyM2EyQzFDLEVBQU84NkUsR0FBTTVwRSxFQUFLdEssVUEzM2E3RGxFLElBNDNhTW5ELElBQ0ZxSCxFQUFRL0MsRUFDUnRFLEVBQVErb0YsR0FFVnRvRixFQUFTMjZFLEdBQVdwN0UsR0FBU0EsRUFBTWQsS0FBS3VCLEdBQVVULEVBRXBELE9BQU9TLEdBb25HVDJ6RSxHQUFPejRELE1BQVFBLEdBQ2Z5NEQsR0FBT3ZELGFBQWVBLEVBQ3RCdUQsR0FBT3luQixPQTE1TlAsU0FBZ0IzdEIsR0FFZCxPQURXemlELEdBQVF5aUQsR0FBY3NJLEdBQWN3TCxJQUNuQzlULElBeTVOZGtHLEdBQU9saEUsS0EvME5QLFNBQWNnN0QsR0FDWixHQUFrQixNQUFkQSxFQUNGLE9BQU8sRUFFVCxHQUFJdVIsR0FBWXZSLEdBQ2QsT0FBT3FqQixHQUFTcmpCLEdBQWNvQyxHQUFXcEMsR0FBY0EsRUFBVzVwRSxPQUVwRSxJQUFJNHpFLEVBQU1DLEdBQU9qSyxHQUNqQixPQUFJZ0ssR0FBT2xTLEdBQVVrUyxHQUFPOVIsRUFDbkI4SCxFQUFXaDdELEtBRWJnc0UsR0FBU2hSLEdBQVk1cEUsUUFxME45Qjh2RSxHQUFPa2YsVUFBWUEsR0FDbkJsZixHQUFPdDRCLEtBL3hOUCxTQUFjb3lCLEVBQVlmLEVBQVdnWixHQUNuQyxJQUFJN3BELEVBQU83USxHQUFReWlELEdBQWNKLEdBQVkwVSxHQUk3QyxPQUhJMkQsR0FBU0MsR0FBZWxZLEVBQVlmLEVBQVdnWixLQUNqRGhaLE9BL3RURmhxRSxHQWl1VE9tNUIsRUFBSzR4QyxFQUFZMFMsR0FBWXpULEVBQVcsS0EyeE5qRGlILEdBQU8wbkIsWUFoc1JQLFNBQXFCenlGLEVBQU9ySixHQUMxQixPQUFPeWlGLEdBQWdCcDVFLEVBQU9ySixJQWdzUmhDbzBFLEdBQU8ybkIsY0FwcVJQLFNBQXVCMXlGLEVBQU9ySixFQUFPOHNFLEdBQ25DLE9BQU84VixHQUFrQnY1RSxFQUFPckosRUFBTzRnRixHQUFZOVQsRUFBVSxLQW9xUi9Ec0gsR0FBTzRuQixjQWpwUlAsU0FBdUIzeUYsRUFBT3JKLEdBQzVCLElBQUlzRSxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLEdBQUlBLEVBQVEsQ0FDVixJQUFJK0MsRUFBUW83RSxHQUFnQnA1RSxFQUFPckosR0FDbkMsR0FBSXFILEVBQVEvQyxHQUFVMHlFLEdBQUczdEUsRUFBTWhDLEdBQVFySCxHQUNyQyxPQUFPcUgsRUFHWCxPQUFRLEdBMG9SVitzRSxHQUFPNm5CLGdCQXJuUlAsU0FBeUI1eUYsRUFBT3JKLEdBQzlCLE9BQU95aUYsR0FBZ0JwNUUsRUFBT3JKLEdBQU8sSUFxblJ2Q28wRSxHQUFPOG5CLGtCQXpsUlAsU0FBMkI3eUYsRUFBT3JKLEVBQU84c0UsR0FDdkMsT0FBTzhWLEdBQWtCdjVFLEVBQU9ySixFQUFPNGdGLEdBQVk5VCxFQUFVLElBQUksSUF5bFJuRXNILEdBQU8rbkIsa0JBdGtSUCxTQUEyQjl5RixFQUFPckosR0FFaEMsR0FEc0IsTUFBVHFKLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUMzQixDQUNWLElBQUkrQyxFQUFRbzdFLEdBQWdCcDVFLEVBQU9ySixHQUFPLEdBQVEsRUFDbEQsR0FBSWczRSxHQUFHM3RFLEVBQU1oQyxHQUFRckgsR0FDbkIsT0FBT3FILEVBR1gsT0FBUSxHQStqUlYrc0UsR0FBT21mLFVBQVlBLEdBQ25CbmYsR0FBT2dvQixXQTNvRVAsU0FBb0JoMUQsRUFBUWhtQyxFQUFROEYsR0FPbEMsT0FOQWtnQyxFQUFTdHZCLEdBQVNzdkIsR0FDbEJsZ0MsRUFBdUIsTUFBWkEsRUFDUCxFQUNBMnZFLEdBQVVxVCxHQUFVaGpGLEdBQVcsRUFBR2tnQyxFQUFPOWlDLFFBRTdDbEQsRUFBU29pRixHQUFhcGlGLEdBQ2ZnbUMsRUFBT3prQyxNQUFNdUUsRUFBVUEsRUFBVzlGLEVBQU9rRCxTQUFXbEQsR0Fxb0U3RGd6RSxHQUFPNGdCLFNBQVdBLEdBQ2xCNWdCLEdBQU8xb0QsSUF6VVAsU0FBYXJpQixHQUNYLE9BQVFBLEdBQVNBLEVBQU0vRSxPQUNuQnFxRSxHQUFRdGxFLEVBQU8wMUUsSUFDZixHQXVVTjNLLEdBQU9pb0IsTUE3U1AsU0FBZWh6RixFQUFPeWpFLEdBQ3BCLE9BQVF6akUsR0FBU0EsRUFBTS9FLE9BQ25CcXFFLEdBQVF0bEUsRUFBT3UzRSxHQUFZOVQsRUFBVSxJQUNyQyxHQTJTTnNILEdBQU9rb0IsU0E3aEVQLFNBQWtCbDFELEVBQVFqckIsRUFBU2dxRSxHQUlqQyxJQUFJMzdFLEVBQVc0cEUsR0FBTzZGLGlCQUVsQmtNLEdBQVNDLEdBQWVoL0MsRUFBUWpyQixFQUFTZ3FFLEtBQzNDaHFFLE9Bai9jRmhaLEdBbS9jQWlrQyxFQUFTdHZCLEdBQVNzdkIsR0FDbEJqckIsRUFBVTYxRSxHQUFhLEdBQUk3MUUsRUFBUzNSLEVBQVVzZ0YsSUFFOUMsSUFJSXlSLEVBQ0FDLEVBTEFDLEVBQVV6SyxHQUFhLEdBQUk3MUUsRUFBUXNnRixRQUFTanlGLEVBQVNpeUYsUUFBUzNSLElBQzlENFIsRUFBY2gxRixHQUFLKzBGLEdBQ25CRSxFQUFnQnp0QixHQUFXdXRCLEVBQVNDLEdBSXBDcjFGLEVBQVEsRUFDUnUxRixFQUFjemdGLEVBQVF5Z0YsYUFBZTN6QixHQUNyQy9rQyxFQUFTLFdBR1QyNEQsRUFBZW52RSxJQUNoQnZSLEVBQVFrOUUsUUFBVXB3QixJQUFXL2tDLE9BQVMsSUFDdkMwNEQsRUFBWTE0RCxPQUFTLEtBQ3BCMDRELElBQWdCajFCLEVBQWdCYyxHQUFlUSxJQUFXL2tDLE9BQVMsS0FDbkUvbkIsRUFBUTJnRixVQUFZN3pCLElBQVcva0MsT0FBUyxLQUN6QyxLQU1FNjRELEVBQVksa0JBQ2JuOEYsR0FBZTFCLEtBQUtpZCxFQUFTLGNBQ3pCQSxFQUFRNGdGLFVBQVksSUFBSTkvRSxRQUFRLE1BQU8sS0FDdkMsNkJBQStCK3RELEdBQW1CLEtBQ25ELEtBRU41akMsRUFBT25xQixRQUFRNC9FLEdBQWMsU0FBUy9xRixFQUFPa3JGLEVBQWFDLEVBQWtCQyxFQUFpQkMsRUFBZW5sRixHQXNCMUcsT0FyQkFpbEYsSUFBcUJBLEVBQW1CQyxHQUd4Q2g1RCxHQUFVa0QsRUFBT3prQyxNQUFNMEUsRUFBTzJRLEdBQVFpRixRQUFRaXNELEdBQW1CMkcsSUFHN0RtdEIsSUFDRlQsR0FBYSxFQUNicjRELEdBQVUsWUFBYzg0RCxFQUFjLFVBRXBDRyxJQUNGWCxHQUFlLEVBQ2Z0NEQsR0FBVSxPQUFTaTVELEVBQWdCLGVBRWpDRixJQUNGLzRELEdBQVUsaUJBQW1CKzRELEVBQW1CLCtCQUVsRDUxRixFQUFRMlEsRUFBU2xHLEVBQU14TixPQUloQndOLEtBR1RveUIsR0FBVSxPQUlWLElBQUlrNUQsRUFBV3g4RixHQUFlMUIsS0FBS2lkLEVBQVMsYUFBZUEsRUFBUWloRixTQUNuRSxHQUFLQSxHQUtBLEdBQUk3MEIsR0FBMkJ0L0QsS0FBS20wRixHQUN2QyxNQUFNLElBQUkzNEYsRUEzaWRtQiwyREFzaWQ3QnkvQixFQUFTLGlCQUFtQkEsRUFBUyxRQVN2Q0EsR0FBVXM0RCxFQUFldDRELEVBQU9qbkIsUUFBUWlxRCxFQUFzQixJQUFNaGpDLEdBQ2pFam5CLFFBQVFrcUQsRUFBcUIsTUFDN0JscUQsUUFBUW1xRCxFQUF1QixPQUdsQ2xqQyxFQUFTLGFBQWVrNUQsR0FBWSxPQUFTLFNBQzFDQSxFQUNHLEdBQ0Esd0JBRUoscUJBQ0NiLEVBQ0ksbUJBQ0EsS0FFSkMsRUFDRyx1RkFFQSxPQUVKdDRELEVBQ0EsZ0JBRUYsSUFBSWpqQixFQUFTMnlFLElBQVEsV0FDbkIsT0FBT3J5RixHQUFTbTdGLEVBQWFLLEVBQVksVUFBWTc0RCxHQUNsRC9pQyxXQW5sZExnQyxFQW1sZHNCdzVGLE1BTXRCLEdBREExN0UsRUFBT2lqQixPQUFTQSxFQUNaa3RELEdBQVFud0UsR0FDVixNQUFNQSxFQUVSLE9BQU9BLEdBNDZEVG16RCxHQUFPaXBCLE1BcHNCUCxTQUFlNzhGLEVBQUdzc0UsR0FFaEIsSUFEQXRzRSxFQUFJMHBGLEdBQVUxcEYsSUFDTixHQUFLQSxFQTV3Zk0saUJBNndmakIsTUFBTyxHQUVULElBQUk2RyxFQTF3ZmUsV0Eyd2ZmL0MsRUFBUzB1RSxHQUFVeHlFLEVBM3dmSixZQTh3Zm5CQSxHQTl3Zm1CLFdBaXhmbkIsSUFEQSxJQUFJeWdCLEVBQVM2dEQsR0FBVXhxRSxFQUh2QndvRSxFQUFXOFQsR0FBWTlULE1BSWR6bEUsRUFBUTdHLEdBQ2Zzc0UsRUFBU3psRSxHQUVYLE9BQU80WixHQXNyQlRtekQsR0FBT21WLFNBQVdBLEdBQ2xCblYsR0FBTzhWLFVBQVlBLEdBQ25COVYsR0FBT3lkLFNBQVdBLEdBQ2xCemQsR0FBT2twQixRQXg1RFAsU0FBaUJ0OUYsR0FDZixPQUFPOFgsR0FBUzlYLEdBQU9rWSxlQXc1RHpCazhELEdBQU9zVixTQUFXQSxHQUNsQnRWLEdBQU9tcEIsY0FwdUlQLFNBQXVCdjlGLEdBQ3JCLE9BQU9BLEVBQ0g2MkUsR0FBVXFULEdBQVVscUYsSUFsdllMLG1DQW12WUosSUFBVkEsRUFBY0EsRUFBUSxHQWt1STdCbzBFLEdBQU90OEQsU0FBV0EsR0FDbEJzOEQsR0FBT29wQixRQW40RFAsU0FBaUJ4OUYsR0FDZixPQUFPOFgsR0FBUzlYLEdBQU91WixlQW00RHpCNjZELEdBQU9sM0QsS0ExMkRQLFNBQWNrcUIsRUFBUStoRCxFQUFPaEQsR0FFM0IsSUFEQS8rQyxFQUFTdHZCLEdBQVNzdkIsTUFDSCsrQyxRQXpxZGZoakYsSUF5cWR3QmdtRixHQUN0QixPQUFPcGEsR0FBUzNuQyxHQUVsQixJQUFLQSxLQUFZK2hELEVBQVEzRixHQUFhMkYsSUFDcEMsT0FBTy9oRCxFQUVULElBQUlrb0MsRUFBYW1CLEdBQWNycEMsR0FDM0Jtb0MsRUFBYWtCLEdBQWMwWSxHQUkvQixPQUFPekUsR0FBVXBWLEVBSExELEdBQWdCQyxFQUFZQyxHQUM5QkMsR0FBY0YsRUFBWUMsR0FBYyxHQUVUenRELEtBQUssS0E4MURoRHN5RCxHQUFPcXBCLFFBeDBEUCxTQUFpQnIyRCxFQUFRK2hELEVBQU9oRCxHQUU5QixJQURBLytDLEVBQVN0dkIsR0FBU3N2QixNQUNIKytDLFFBNXNkZmhqRixJQTRzZHdCZ21GLEdBQ3RCLE9BQU8vaEQsRUFBT3prQyxNQUFNLEVBQUdxc0UsR0FBZ0I1bkMsR0FBVSxHQUVuRCxJQUFLQSxLQUFZK2hELEVBQVEzRixHQUFhMkYsSUFDcEMsT0FBTy9oRCxFQUVULElBQUlrb0MsRUFBYW1CLEdBQWNycEMsR0FHL0IsT0FBT3M5QyxHQUFVcFYsRUFBWSxFQUZuQkUsR0FBY0YsRUFBWW1CLEdBQWMwWSxJQUFVLEdBRXZCcm5FLEtBQUssS0E4ekQ1Q3N5RCxHQUFPc3BCLFVBeHlEUCxTQUFtQnQyRCxFQUFRK2hELEVBQU9oRCxHQUVoQyxJQURBLytDLEVBQVN0dkIsR0FBU3N2QixNQUNIKytDLFFBN3VkZmhqRixJQTZ1ZHdCZ21GLEdBQ3RCLE9BQU8vaEQsRUFBT25xQixRQUFRZ3JELEVBQWEsSUFFckMsSUFBSzdnQyxLQUFZK2hELEVBQVEzRixHQUFhMkYsSUFDcEMsT0FBTy9oRCxFQUVULElBQUlrb0MsRUFBYW1CLEdBQWNycEMsR0FHL0IsT0FBT3M5QyxHQUFVcFYsRUFGTEQsR0FBZ0JDLEVBQVltQixHQUFjMFksS0FFbEJybkUsS0FBSyxLQTh4RDNDc3lELEdBQU91cEIsU0F0dkRQLFNBQWtCdjJELEVBQVFqckIsR0FDeEIsSUFBSTdYLEVBbnZkbUIsR0FvdmRuQnM1RixFQW52ZHFCLE1BcXZkekIsR0FBSWxwQixHQUFTdjRELEdBQVUsQ0FDckIsSUFBSXE3RSxFQUFZLGNBQWVyN0UsRUFBVUEsRUFBUXE3RSxVQUFZQSxFQUM3RGx6RixFQUFTLFdBQVk2WCxFQUFVK3RFLEdBQVUvdEUsRUFBUTdYLFFBQVVBLEVBQzNEczVGLEVBQVcsYUFBY3poRixFQUFVcW5FLEdBQWFybkUsRUFBUXloRixVQUFZQSxFQUl0RSxJQUFJckMsR0FGSm4wRCxFQUFTdHZCLEdBQVNzdkIsSUFFSzlpQyxPQUN2QixHQUFJeXJFLEdBQVczb0MsR0FBUyxDQUN0QixJQUFJa29DLEVBQWFtQixHQUFjcnBDLEdBQy9CbTBELEVBQVlqc0IsRUFBV2hyRSxPQUV6QixHQUFJQSxHQUFVaTNGLEVBQ1osT0FBT24wRCxFQUVULElBQUk3ZSxFQUFNamtCLEVBQVNnc0UsR0FBV3N0QixHQUM5QixHQUFJcjFFLEVBQU0sRUFDUixPQUFPcTFFLEVBRVQsSUFBSTM4RSxFQUFTcXVELEVBQ1RvVixHQUFVcFYsRUFBWSxFQUFHL21ELEdBQUt6RyxLQUFLLElBQ25Dc2xCLEVBQU96a0MsTUFBTSxFQUFHNGxCLEdBRXBCLFFBenpkQXBsQixJQXl6ZElxMEYsRUFDRixPQUFPdjJFLEVBQVMyOEUsRUFLbEIsR0FISXR1QixJQUNGL21ELEdBQVF0SCxFQUFPM2MsT0FBU2lrQixHQUV0QitqRCxHQUFTa3JCLElBQ1gsR0FBSXB3RCxFQUFPemtDLE1BQU00bEIsR0FBS3hULE9BQU95aUYsR0FBWSxDQUN2QyxJQUFJMWxGLEVBQ0FvVixFQUFZakcsRUFNaEIsSUFKS3UyRSxFQUFVM3FDLFNBQ2IycUMsRUFBWTlwRSxHQUFPOHBFLEVBQVV0ekQsT0FBUXBzQixHQUFTNHdELEdBQVE5a0MsS0FBSzR6RCxJQUFjLE1BRTNFQSxFQUFVam5CLFVBQVksRUFDZHorRCxFQUFRMGxGLEVBQVU1ekQsS0FBSzFjLElBQzdCLElBQUkyMkUsRUFBUy9yRixFQUFNekssTUFFckI0WixFQUFTQSxFQUFPdGUsTUFBTSxPQTMwZDFCUSxJQTIwZDZCMDZGLEVBQXVCdDFFLEVBQU1zMUUsU0FFbkQsR0FBSXoyRCxFQUFPdjJCLFFBQVEyeUUsR0FBYWdVLEdBQVlqdkUsSUFBUUEsRUFBSyxDQUM5RCxJQUFJbGhCLEVBQVE0WixFQUFPK2dDLFlBQVl3MUMsR0FDM0Jud0YsR0FBUyxJQUNYNFosRUFBU0EsRUFBT3RlLE1BQU0sRUFBRzBFLElBRzdCLE9BQU80WixFQUFTMjhFLEdBa3NEbEJ4cEIsR0FBTzdzRCxTQTVxRFAsU0FBa0I2ZixHQUVoQixPQURBQSxFQUFTdHZCLEdBQVNzdkIsS0FDQW1nQyxFQUFpQnQrRCxLQUFLbStCLEdBQ3BDQSxFQUFPbnFCLFFBQVFvcUQsRUFBZXVKLElBQzlCeHBDLEdBeXFETmd0QyxHQUFPMHBCLFNBdnBCUCxTQUFrQjV0RSxHQUNoQixJQUFJdmxCLElBQU93bUUsR0FDWCxPQUFPcjVELEdBQVNvWSxHQUFVdmxCLEdBc3BCNUJ5cEUsR0FBT29mLFVBQVlBLEdBQ25CcGYsR0FBTzhlLFdBQWFBLEdBR3BCOWUsR0FBTzJwQixLQUFPbnlGLEdBQ2R3b0UsR0FBTzRwQixVQUFZdlAsR0FDbkJyYSxHQUFPL3FELE1BQVE2akUsR0FFZmdILEdBQU05ZixJQUNBbHdDLEdBQVMsR0FDYm8yQyxHQUFXbEcsSUFBUSxTQUFTOTNDLEVBQU1pcUQsR0FDM0IzbEYsR0FBZTFCLEtBQUtrMUUsR0FBT3p6RSxVQUFXNGxGLEtBQ3pDcmlELEdBQU9xaUQsR0FBY2pxRCxNQUdsQjRILElBQ0gsQ0FBRSxPQUFTLElBV2pCa3dDLEdBQU82cEIsUUEvaWhCSyxVQWtqaEJaanhCLEdBQVUsQ0FBQyxPQUFRLFVBQVcsUUFBUyxhQUFjLFVBQVcsaUJBQWlCLFNBQVN1WixHQUN4Rm5TLEdBQU9tUyxHQUFZN1csWUFBYzBFLE1BSW5DcEgsR0FBVSxDQUFDLE9BQVEsU0FBUyxTQUFTdVosRUFBWWwvRSxHQUMvQ2l0RSxHQUFZM3pFLFVBQVU0bEYsR0FBYyxTQUFTL2xGLEdBQzNDQSxPQTVqaEJGMkMsSUE0amhCTTNDLEVBQWtCLEVBQUl1eUUsR0FBVW1YLEdBQVUxcEYsR0FBSSxHQUVsRCxJQUFJeWdCLEVBQVVoZixLQUFLa3pFLGVBQWlCOXRFLEVBQ2hDLElBQUlpdEUsR0FBWXJ5RSxNQUNoQkEsS0FBS3k1QixRQVVULE9BUkl6YSxFQUFPazBELGFBQ1RsMEQsRUFBT28wRCxjQUFnQnJDLEdBQVV4eUUsRUFBR3lnQixFQUFPbzBELGVBRTNDcDBELEVBQU9xMEQsVUFBVWp4RSxLQUFLLENBQ3BCLEtBQVEydUUsR0FBVXh5RSxFQXZnaEJMLFlBd2doQmIsS0FBUStsRixHQUFjdGxFLEVBQU9pMEQsUUFBVSxFQUFJLFFBQVUsTUFHbERqMEQsR0FHVHF6RCxHQUFZM3pFLFVBQVU0bEYsRUFBYSxTQUFXLFNBQVMvbEYsR0FDckQsT0FBT3lCLEtBQUtxbkMsVUFBVWk5QyxHQUFZL2xGLEdBQUc4b0MsY0FLekMwakMsR0FBVSxDQUFDLFNBQVUsTUFBTyxjQUFjLFNBQVN1WixFQUFZbC9FLEdBQzdELElBQUl4RCxFQUFPd0QsRUFBUSxFQUNmNjJGLEVBamloQmUsR0FpaWhCSnI2RixHQS9oaEJHLEdBK2hoQnlCQSxFQUUzQ3l3RSxHQUFZM3pFLFVBQVU0bEYsR0FBYyxTQUFTelosR0FDM0MsSUFBSTdyRCxFQUFTaGYsS0FBS3k1QixRQU1sQixPQUxBemEsRUFBT20wRCxjQUFjL3dFLEtBQUssQ0FDeEIsU0FBWXU4RSxHQUFZOVQsRUFBVSxHQUNsQyxLQUFRanBFLElBRVZvZCxFQUFPazBELGFBQWVsMEQsRUFBT2swRCxjQUFnQitvQixFQUN0Q2o5RSxNQUtYK3JELEdBQVUsQ0FBQyxPQUFRLFNBQVMsU0FBU3VaLEVBQVlsL0UsR0FDL0MsSUFBSTgyRixFQUFXLFFBQVU5MkYsRUFBUSxRQUFVLElBRTNDaXRFLEdBQVkzekUsVUFBVTRsRixHQUFjLFdBQ2xDLE9BQU90a0YsS0FBS2s4RixHQUFVLEdBQUduK0YsUUFBUSxPQUtyQ2d0RSxHQUFVLENBQUMsVUFBVyxTQUFTLFNBQVN1WixFQUFZbC9FLEdBQ2xELElBQUkrMkYsRUFBVyxRQUFVLzJGLEVBQVEsR0FBSyxTQUV0Q2l0RSxHQUFZM3pFLFVBQVU0bEYsR0FBYyxXQUNsQyxPQUFPdGtGLEtBQUtrekUsYUFBZSxJQUFJYixHQUFZcnlFLE1BQVFBLEtBQUttOEYsR0FBVSxPQUl0RTlwQixHQUFZM3pFLFVBQVV3eEMsUUFBVSxXQUM5QixPQUFPbHdDLEtBQUtnUCxPQUFPOHRFLEtBR3JCekssR0FBWTN6RSxVQUFVa2YsS0FBTyxTQUFTc3RELEdBQ3BDLE9BQU9sckUsS0FBS2dQLE9BQU9rOEQsR0FBVytmLFFBR2hDNVksR0FBWTN6RSxVQUFVNnRGLFNBQVcsU0FBU3JoQixHQUN4QyxPQUFPbHJFLEtBQUtxbkMsVUFBVXpwQixLQUFLc3RELElBRzdCbUgsR0FBWTN6RSxVQUFVZ3VGLFVBQVk5TSxJQUFTLFNBQVNsd0UsRUFBTXJRLEdBQ3hELE1BQW1CLG1CQUFScVEsRUFDRixJQUFJMmlFLEdBQVlyeUUsTUFFbEJBLEtBQUs4UCxLQUFJLFNBQVMvUixHQUN2QixPQUFPMDhFLEdBQVcxOEUsRUFBTzJSLEVBQU1yUSxTQUluQ2d6RSxHQUFZM3pFLFVBQVUyQixPQUFTLFNBQVM2cUUsR0FDdEMsT0FBT2xyRSxLQUFLZ1AsT0FBTzAvRSxHQUFPL1AsR0FBWXpULE1BR3hDbUgsR0FBWTN6RSxVQUFVZ0MsTUFBUSxTQUFTcWtDLEVBQU96ZSxHQUM1Q3llLEVBQVFrakQsR0FBVWxqRCxHQUVsQixJQUFJL2xCLEVBQVNoZixLQUNiLE9BQUlnZixFQUFPazBELGVBQWlCbnVDLEVBQVEsR0FBS3plLEVBQU0sR0FDdEMsSUFBSStyRCxHQUFZcnpELElBRXJCK2xCLEVBQVEsRUFDVi9sQixFQUFTQSxFQUFPMDJFLFdBQVczd0QsR0FDbEJBLElBQ1QvbEIsRUFBU0EsRUFBTytCLEtBQUtna0IsU0F2cGhCdkI3akMsSUF5cGhCSW9sQixJQUVGdEgsR0FEQXNILEVBQU0yaEUsR0FBVTNoRSxJQUNELEVBQUl0SCxFQUFPMDBFLFdBQVdwdEUsR0FBT3RILEVBQU95MkUsS0FBS252RSxFQUFNeWUsSUFFekQvbEIsSUFHVHF6RCxHQUFZM3pFLFVBQVVpM0YsZUFBaUIsU0FBU3pxQixHQUM5QyxPQUFPbHJFLEtBQUtxbkMsVUFBVXV1RCxVQUFVMXFCLEdBQVc3akMsV0FHN0NnckMsR0FBWTN6RSxVQUFVK3dGLFFBQVUsV0FDOUIsT0FBT3p2RixLQUFLeTFGLEtBdG1oQk8sYUEwbWhCckJwZCxHQUFXaEcsR0FBWTN6RSxXQUFXLFNBQVMyN0IsRUFBTWlxRCxHQUMvQyxJQUFJOFgsRUFBZ0IscUNBQXFDcDFGLEtBQUtzOUUsR0FDMUQrWCxFQUFVLGtCQUFrQnIxRixLQUFLczlFLEdBQ2pDZ1ksRUFBYW5xQixHQUFPa3FCLEVBQVcsUUFBd0IsUUFBZC9YLEVBQXVCLFFBQVUsSUFBT0EsR0FDakZpWSxFQUFlRixHQUFXLFFBQVFyMUYsS0FBS3M5RSxHQUV0Q2dZLElBR0xucUIsR0FBT3p6RSxVQUFVNGxGLEdBQWMsV0FDN0IsSUFBSXZtRixFQUFRaUMsS0FBSzR5RSxZQUNidnpFLEVBQU9nOUYsRUFBVSxDQUFDLEdBQUsxN0YsVUFDdkI2N0YsRUFBU3orRixhQUFpQnMwRSxHQUMxQnhILEVBQVd4ckUsRUFBSyxHQUNoQm85RixFQUFVRCxHQUFVaHpFLEdBQVF6ckIsR0FFNUJxdUYsRUFBYyxTQUFTcnVGLEdBQ3pCLElBQUlpaEIsRUFBU3M5RSxFQUFXcDlGLE1BQU1pekUsR0FBUTFHLEdBQVUsQ0FBQzF0RSxHQUFRc0IsSUFDekQsT0FBUWc5RixHQUFXMXBCLEVBQVkzekQsRUFBTyxHQUFLQSxHQUd6Q3k5RSxHQUFXTCxHQUFvQyxtQkFBWnZ4QixHQUE2QyxHQUFuQkEsRUFBU3hvRSxTQUV4RW02RixFQUFTQyxHQUFVLEdBRXJCLElBQUk5cEIsRUFBVzN5RSxLQUFLOHlFLFVBQ2hCNHBCLElBQWExOEYsS0FBSzZ5RSxZQUFZeHdFLE9BQzlCczZGLEVBQWNKLElBQWlCNXBCLEVBQy9CaXFCLEVBQVdKLElBQVdFLEVBRTFCLElBQUtILEdBQWdCRSxFQUFTLENBQzVCMStGLEVBQVE2K0YsRUFBVzcrRixFQUFRLElBQUlzMEUsR0FBWXJ5RSxNQUMzQyxJQUFJZ2YsRUFBU3FiLEVBQUtuN0IsTUFBTW5CLEVBQU9zQixHQUUvQixPQURBMmYsRUFBTzZ6RCxZQUFZendFLEtBQUssQ0FBRSxLQUFRK2lGLEdBQU0sS0FBUSxDQUFDaUgsR0FBYyxhQTFzaEJuRWxyRixJQTJzaEJXLElBQUlveEUsR0FBY3R6RCxFQUFRMnpELEdBRW5DLE9BQUlncUIsR0FBZUMsRUFDVnZpRSxFQUFLbjdCLE1BQU1jLEtBQU1YLElBRTFCMmYsRUFBU2hmLEtBQUttbEYsS0FBS2lILEdBQ1p1USxFQUFlTixFQUFVcjlFLEVBQU9qaEIsUUFBUSxHQUFLaWhCLEVBQU9qaEIsUUFBV2loQixRQUsxRStyRCxHQUFVLENBQUMsTUFBTyxPQUFRLFFBQVMsT0FBUSxTQUFVLFlBQVksU0FBU3VaLEdBQ3hFLElBQUlqcUQsRUFBT3kwQyxHQUFXd1YsR0FDbEJ1WSxFQUFZLDBCQUEwQjcxRixLQUFLczlFLEdBQWMsTUFBUSxPQUNqRWlZLEVBQWUsa0JBQWtCdjFGLEtBQUtzOUUsR0FFMUNuUyxHQUFPenpFLFVBQVU0bEYsR0FBYyxXQUM3QixJQUFJamxGLEVBQU9zQixVQUNYLEdBQUk0N0YsSUFBaUJ2OEYsS0FBSzh5RSxVQUFXLENBQ25DLElBQUkvMEUsRUFBUWlDLEtBQUtqQyxRQUNqQixPQUFPczhCLEVBQUtuN0IsTUFBTXNxQixHQUFRenJCLEdBQVNBLEVBQVEsR0FBSXNCLEdBRWpELE9BQU9XLEtBQUs2OEYsSUFBVyxTQUFTOStGLEdBQzlCLE9BQU9zOEIsRUFBS243QixNQUFNc3FCLEdBQVF6ckIsR0FBU0EsRUFBUSxHQUFJc0IsVUFNckRnNUUsR0FBV2hHLEdBQVkzekUsV0FBVyxTQUFTMjdCLEVBQU1pcUQsR0FDL0MsSUFBSWdZLEVBQWFucUIsR0FBT21TLEdBQ3hCLEdBQUlnWSxFQUFZLENBQ2QsSUFBSWorRixFQUFNaStGLEVBQVdqL0YsS0FBTyxHQUN2QnNCLEdBQWUxQixLQUFLdTBFLEdBQVduekUsS0FDbENtekUsR0FBVW56RSxHQUFPLElBRW5CbXpFLEdBQVVuekUsR0FBSytELEtBQUssQ0FBRSxLQUFRa2lGLEVBQVksS0FBUWdZLFFBSXREOXFCLEdBQVVrVSxRQW52aEJSeGtGLEVBaUNxQixHQWt0aEIrQjdELE1BQVEsQ0FBQyxDQUM3RCxLQUFRLFVBQ1IsVUFydmhCQTZELElBeXZoQkZteEUsR0FBWTN6RSxVQUFVKzZCLE1BaDlkdEIsV0FDRSxJQUFJemEsRUFBUyxJQUFJcXpELEdBQVlyeUUsS0FBSzR5RSxhQU9sQyxPQU5BNXpELEVBQU82ekQsWUFBYzhCLEdBQVUzMEUsS0FBSzZ5RSxhQUNwQzd6RCxFQUFPaTBELFFBQVVqekUsS0FBS2l6RSxRQUN0QmowRCxFQUFPazBELGFBQWVsekUsS0FBS2t6RSxhQUMzQmwwRCxFQUFPbTBELGNBQWdCd0IsR0FBVTMwRSxLQUFLbXpFLGVBQ3RDbjBELEVBQU9vMEQsY0FBZ0JwekUsS0FBS296RSxjQUM1QnAwRCxFQUFPcTBELFVBQVlzQixHQUFVMzBFLEtBQUtxekUsV0FDM0JyMEQsR0F5OGRUcXpELEdBQVkzekUsVUFBVTJvQyxRQTk3ZHRCLFdBQ0UsR0FBSXJuQyxLQUFLa3pFLGFBQWMsQ0FDckIsSUFBSWwwRCxFQUFTLElBQUlxekQsR0FBWXJ5RSxNQUM3QmdmLEVBQU9pMEQsU0FBVyxFQUNsQmowRCxFQUFPazBELGNBQWUsT0FFdEJsMEQsRUFBU2hmLEtBQUt5NUIsU0FDUHc1QyxVQUFZLEVBRXJCLE9BQU9qMEQsR0FzN2RUcXpELEdBQVkzekUsVUFBVVgsTUEzNmR0QixXQUNFLElBQUlxSixFQUFRcEgsS0FBSzR5RSxZQUFZNzBFLFFBQ3pCb2xFLEVBQU1uakUsS0FBS2l6RSxRQUNYZSxFQUFReHFELEdBQVFwaUIsR0FDaEIwMUYsRUFBVTM1QixFQUFNLEVBQ2hCNmxCLEVBQVloVixFQUFRNXNFLEVBQU0vRSxPQUFTLEVBQ25DeUssRUE4cElOLFNBQWlCaTRCLEVBQU96ZSxFQUFLc29FLEdBQzNCLElBQUl4cEYsR0FBUyxFQUNUL0MsRUFBU3VzRixFQUFXdnNGLE9BRXhCLE9BQVMrQyxFQUFRL0MsR0FBUSxDQUN2QixJQUFJd2xCLEVBQU8rbUUsRUFBV3hwRixHQUNsQjZMLEVBQU80VyxFQUFLNVcsS0FFaEIsT0FBUTRXLEVBQUtqbUIsTUFDWCxJQUFLLE9BQWFtakMsR0FBUzl6QixFQUFNLE1BQ2pDLElBQUssWUFBYXFWLEdBQU9yVixFQUFNLE1BQy9CLElBQUssT0FBYXFWLEVBQU15cUQsR0FBVXpxRCxFQUFLeWUsRUFBUTl6QixHQUFPLE1BQ3RELElBQUssWUFBYTh6QixFQUFRK3JDLEdBQVUvckMsRUFBT3plLEVBQU1yVixJQUdyRCxNQUFPLENBQUUsTUFBUzh6QixFQUFPLElBQU96ZSxHQTdxSXJCeTJFLENBQVEsRUFBRy9ULEVBQVdocEYsS0FBS3F6RSxXQUNsQ3R1QyxFQUFRajRCLEVBQUtpNEIsTUFDYnplLEVBQU14WixFQUFLd1osSUFDWGprQixFQUFTaWtCLEVBQU15ZSxFQUNmMy9CLEVBQVEwM0YsRUFBVXgyRSxFQUFPeWUsRUFBUSxFQUNqQzA1QyxFQUFZeitFLEtBQUttekUsY0FDakI2cEIsRUFBYXZlLEVBQVVwOEUsT0FDdkIrb0UsRUFBVyxFQUNYNnhCLEVBQVlsc0IsR0FBVTF1RSxFQUFRckMsS0FBS296RSxlQUV2QyxJQUFLWSxJQUFXOG9CLEdBQVc5VCxHQUFhM21GLEdBQVU0NkYsR0FBYTU2RixFQUM3RCxPQUFPMC9FLEdBQWlCMzZFLEVBQU9wSCxLQUFLNnlFLGFBRXRDLElBQUk3ekQsRUFBUyxHQUViNjRELEVBQ0EsS0FBT3gxRSxLQUFZK29FLEVBQVc2eEIsR0FBVyxDQU12QyxJQUhBLElBQUlDLEdBQWEsRUFDYm4vRixFQUFRcUosRUFIWmhDLEdBQVMrOUQsS0FLQSs1QixFQUFZRixHQUFZLENBQy9CLElBQUluMUUsRUFBTzQyRCxFQUFVeWUsR0FDakJyeUIsRUFBV2hqRCxFQUFLZ2pELFNBQ2hCanBFLEVBQU9pbUIsRUFBS2ptQixLQUNaazJFLEVBQVdqTixFQUFTOXNFLEdBRXhCLEdBN3pEWSxHQTZ6RFI2RCxFQUNGN0QsRUFBUSs1RSxPQUNILElBQUtBLEVBQVUsQ0FDcEIsR0FqMERhLEdBaTBEVGwyRSxFQUNGLFNBQVNpMkUsRUFFVCxNQUFNQSxHQUlaNzRELEVBQU9vc0QsS0FBY3J0RSxFQUV2QixPQUFPaWhCLEdBZzRkVG16RCxHQUFPenpFLFVBQVU4ekIsR0FBSzY1RCxHQUN0QmxhLEdBQU96ekUsVUFBVXl0RixNQTFpUWpCLFdBQ0UsT0FBT0EsR0FBTW5zRixPQTBpUWZteUUsR0FBT3p6RSxVQUFVeStGLE9BN2dRakIsV0FDRSxPQUFPLElBQUk3cUIsR0FBY3R5RSxLQUFLakMsUUFBU2lDLEtBQUs4eUUsWUE2Z1E5Q1gsR0FBT3p6RSxVQUFVb3ZCLEtBcC9QakIsZ0JBN3dSRTVzQixJQTh3UklsQixLQUFLZ3pFLGFBQ1BoekUsS0FBS2d6RSxXQUFheWMsR0FBUXp2RixLQUFLakMsVUFFakMsSUFBSTRuQyxFQUFPM2xDLEtBQUsreUUsV0FBYS95RSxLQUFLZ3pFLFdBQVczd0UsT0FHN0MsTUFBTyxDQUFFLEtBQVFzakMsRUFBTSxNQUZYQSxPQWx4Ulp6a0MsRUFreFIrQmxCLEtBQUtnekUsV0FBV2h6RSxLQUFLK3lFLGVBZy9QdERaLEdBQU96ekUsVUFBVSttRixNQTc3UGpCLFNBQXNCMW5GLEdBSXBCLElBSEEsSUFBSWloQixFQUNBbFIsRUFBUzlOLEtBRU44TixhQUFrQjRrRSxJQUFZLENBQ25DLElBQUlqNUMsRUFBUTg0QyxHQUFhemtFLEdBQ3pCMnJCLEVBQU1zNUMsVUFBWSxFQUNsQnQ1QyxFQUFNdTVDLGdCQTUwUlI5eEUsRUE2MFJNOGQsRUFDRitJLEVBQVM2cUQsWUFBY241QyxFQUV2QnphLEVBQVN5YSxFQUVYLElBQUkxUixFQUFXMFIsRUFDZjNyQixFQUFTQSxFQUFPOGtFLFlBR2xCLE9BREE3cUQsRUFBUzZxRCxZQUFjNzBFLEVBQ2hCaWhCLEdBNjZQVG16RCxHQUFPenpFLFVBQVUyb0MsUUF0NVBqQixXQUNFLElBQUl0cEMsRUFBUWlDLEtBQUs0eUUsWUFDakIsR0FBSTcwRSxhQUFpQnMwRSxHQUFhLENBQ2hDLElBQUludkUsRUFBVW5GLEVBVWQsT0FUSWlDLEtBQUs2eUUsWUFBWXh3RSxTQUNuQmEsRUFBVSxJQUFJbXZFLEdBQVlyeUUsUUFFNUJrRCxFQUFVQSxFQUFRbWtDLFdBQ1Z3ckMsWUFBWXp3RSxLQUFLLENBQ3ZCLEtBQVEraUYsR0FDUixLQUFRLENBQUM5OUMsSUFDVCxhQXgzUkpubUMsSUEwM1JTLElBQUlveEUsR0FBY3B2RSxFQUFTbEQsS0FBSzh5RSxXQUV6QyxPQUFPOXlFLEtBQUttbEYsS0FBSzk5QyxLQXc0UG5COHFDLEdBQU96ekUsVUFBVWk1QyxPQUFTdzZCLEdBQU96ekUsVUFBVXV6RSxRQUFVRSxHQUFPenpFLFVBQVVYLE1BdjNQdEUsV0FDRSxPQUFPZ2tGLEdBQWlCL2hGLEtBQUs0eUUsWUFBYTV5RSxLQUFLNnlFLGNBeTNQakRWLEdBQU96ekUsVUFBVTBvQixNQUFRK3FELEdBQU96ekUsVUFBVXVzRixLQUV0Q2xiLEtBQ0ZvQyxHQUFPenpFLFVBQVVxeEUsSUFqK1BuQixXQUNFLE9BQU8vdkUsT0FrK1BGbXlFLEdBTUR2RCxHQVFOcm1DLEdBQUs5USxFQUFJQSxRQTF4aEJQdjJCLEtBOHhoQkYsYUFDRSxPQUFPdTJCLElBQ1IsZ0NBYUh4NkIsS0FBSytDLFE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzd2hCUCxTQUFTbzlGLEVBQWUvVixHQUV2QixJQUFJZ1csRUFBUSxPQUVaLEdBQUt4OUYsTUFBTTJZLFNBQVM2dUUsSUFDbkJnVyxFQUFRaFcsT0FFUixPQUFPQSxHQUNOLEtBQUssRUFBR2dXLEVBQVEsSUFBSyxNQUNyQixLQUFLLEVBQUdBLEVBQVEsS0FBTSxNQUN0QixLQUFLLEVBQUdBLEVBQVEsTUFBTyxNQUN2QixLQUFLLEVBQUdBLEVBQVEsT0FBUSxNQUN4QixLQUFLLEVBQUdBLEVBQVEsUUFBUyxNQUN6QixLQUFLLEVBQUdBLEVBQVEsU0FBVSxNQUMxQixLQUFLLEVBQUdBLEVBQVEsVUFBVyxNQUMzQixLQUFLLEVBQUdBLEVBQVEsV0FBWSxNQUM1QixLQUFLLEVBQUdBLEVBQVEsWUFBYSxNQUM3QixLQUFLLEdBQUlBLEVBQVEsYUFBYyxNQUMvQixLQUFLLEdBQUlBLEVBQVEsY0FBZSxNQUNoQyxLQUFLLEdBQUlBLEVBQVEsZUFLbkIsSUFEQSxJQUFJbDRGLEVBQVEsQ0FBQyxNQUNMbTRGLEVBQUcsRUFBRUEsRUFBRyxJQUFJQSxJQUNuQm40RixFQUFNL0MsS0FBSytDLEVBQU1tNEYsR0FBSUQsR0FFdEIsT0FBT2w0RixFQUdSLFNBQVNvNEYsSUFDUnY5RixLQUFLcW5GLEtBQU8sT0FDWnJuRixLQUFLbUYsTUFBUWk0RixFQUFlcDlGLEtBQUtxbkYsTUF1SGxDLFNBQVNtVyxFQUFXbjRFLEVBQUtvNEUsR0FDeEIsT0FBUUEsR0FBb0JwNEUsRUFBSXJLLFFBQVEsTUFBTSxJQUFJM1ksT0FBU2dqQixFQUFJckssUUFBUSxNQUFNLElBQUkzWSxRQUdsRixTQUFTcTdGLEVBQVVyNEUsRUFBS3M0RSxHQUV2QixPQUFPdDRFLEVBQUlySyxRQUFRLFVBQVUsS0FFekJBLFFBQVEsVUFBVSxPQUFPMmlGLEVBQUlBLEVBQUksUUFDakMzaUYsUUFBUSxjQUFjLE9BQU8yaUYsRUFBSSxZQUNqQzNpRixRQUFRLFdBQVcsT0FBTzJpRixFQUFJLFNBQzlCM2lGLFFBQVEsV0FBVyxPQUFPMmlGLEVBQUksU0FDOUIzaUYsUUFBUSxVQUFVLE9BQU8yaUYsRUFBSSxRQUM3QjNpRixRQUFRLFdBQVcsYUFDbkJBLFFBQVEsbUJBQW1CLGlCQUMzQkEsUUFBUSxhQUFhLGVBRXJCQSxRQUFRLFNBQVMsUUFFakJBLFFBQVEsV0FBVyxhQUNuQkEsUUFBUSx3QkFBd0IsbUJBQ2hDQSxRQUFRLHdCQUF3QixtQkFDaENBLFFBQVEsdUJBQXVCLGtCQUMvQkEsUUFBUSx3QkFBd0IsbUJBRWhDQSxRQUFRLFNBQVMsT0FBTzJpRixFQUFJLE9BQzVCM2lGLFFBQVEsU0FBUyxPQUFPMmlGLEVBQUlBLEVBQUksT0FDaEMzaUYsUUFBUSxtQkFBbUIsaUJBQzNCQSxRQUFRLFdBQVcsT0FBTzJpRixFQUFJLFNBRTlCM2lGLFFBQVEsb0JBQW9CLGdCQUM1QkEsUUFBUSxvQkFBb0IsZ0JBRTVCQSxRQUFRLFdBQVcsWUFBWTJpRixHQUMvQjNpRixRQUFRLFlBQVksaUJBQ3BCQSxRQUFRLFlBQVksY0FDcEJBLFFBQVEsV0FBVyxPQUFPMmlGLEVBQUksU0FDOUIzaUYsUUFBUSxZQUFZLGNBQ3BCQSxRQUFRLFdBQVcsYUFLbkJBLFFBQVEsVUFBVSxTQUNsQkEsUUFBUSxTQUFTLFFBQ2pCQSxRQUFRLFVBQVUsU0FDbEJBLFFBQVEsV0FBVyxVQUNuQkEsUUFBUSxlQUFlLGNBQ3ZCQSxRQUFRLGFBQWEsWUFDckJBLFFBQVEsVUFBVSxTQUNsQkEsUUFBUSxXQUFXLFVBQ25CQSxRQUFRLFdBQVcsVUFDbkJBLFFBQVEsa0JBQWtCLFdBQzFCQSxRQUFRLGtCQUFrQixXQUMxQkEsUUFBUSxVQUFVLFNBRWxCQSxRQUFRLFlBQVksUUFDcEIrUixNQUFNLFFBN0tYd3dFLEVBQVc3K0YsVUFBVWsvRixJQUFNLFNBQVNuaUYsRUFBSzRyRSxHQUV4QyxJQUFJd1csRUFBS3BpRixFQUFLVCxRQUFRLFlBQVksTUFDN0JBLFFBQVEsS0FBSyxTQUNiQSxRQUFRLGNBQWMsY0FDdEJBLFFBQVEsY0FBYyxjQUN0QitSLE1BQU0sUUFDVnBvQixFQUFNazVGLEVBQUd4N0YsT0FDVHk3RixHQUFZLEVBQ1pDLEVBQU8sRUFDUDE0RSxFQUFNLEdBQ05pNEUsRUFBSyxFQUNMbjRGLEVBQVFraUYsRUFBTytWLEVBQWUvVixHQUFRcm5GLEtBQUttRixNQUUzQyxJQUFJbTRGLEVBQUcsRUFBRUEsRUFBRzM0RixFQUFJMjRGLElBRVpPLEVBQUdQLEdBQUl4cUYsT0FBTyxPQUFTLEdBQ3pCdVMsR0FBT2xnQixFQUFNNDRGLEdBQU1GLEVBQUdQLEdBQ3RCUSxHQUFZLEdBRVRELEVBQUdQLEdBQUl4cUYsT0FBTyxRQUFVLEdBQUsrcUYsRUFBR1AsR0FBSXhxRixPQUFPLFFBQVUsR0FBSytxRixFQUFHUCxHQUFJeHFGLE9BQU8sYUFBZSxLQUN6RmdyRixHQUFZLElBSVhELEVBQUdQLEdBQUl4cUYsT0FBTyxRQUFVLEdBQUsrcUYsRUFBR1AsR0FBSXhxRixPQUFPLFFBQVUsR0FDdkR1UyxHQUFPdzRFLEVBQUdQLEdBQ1ZRLEdBQVksR0FHVCxPQUFPbjhELEtBQUtrOEQsRUFBR1AsRUFBRyxLQUFPLFNBQVMzN0QsS0FBS2s4RCxFQUFHUCxLQUM3QyxpQkFBaUIzN0QsS0FBS2s4RCxFQUFHUCxFQUFHLEtBQU8sbUJBQW1CMzdELEtBQUtrOEQsRUFBR1AsSUFBSyxHQUFHdGlGLFFBQVEsSUFBSSxLQUNsRnFLLEdBQU93NEUsRUFBR1AsR0FDTlEsR0FBV0MsS0FHYkYsRUFBR1AsR0FBSXhxRixPQUFPLFFBQVUsSUFBOEIsR0FBekIrcUYsRUFBR1AsR0FBSXhxRixPQUFPLFNBQXlDLEdBQXpCK3FGLEVBQUdQLEdBQUl4cUYsT0FBTyxPQUMzRXVTLEVBQWlEQSxHQUExQ3k0RSxFQUFpREQsRUFBR1AsR0FBakNuNEYsRUFBTTQ0RixLQUFRRixFQUFHUCxHQUd6Q08sRUFBR1AsR0FBSXhxRixPQUFPLFFBQVUsR0FBSytxRixFQUFHUCxHQUFJeHFGLE9BQU8sUUFBVSxFQUN2RHVTLEVBQStDQSxHQUF4Q3k0RSxFQUErQ0QsRUFBR1AsR0FBL0JuNEYsRUFBTTQ0RixHQUFNRixFQUFHUCxHQUd2Q08sRUFBR1AsR0FBSXhxRixPQUFPLFFBQVUsRUFDMUJ1UyxFQUFpREEsR0FBMUN5NEUsRUFBaURELEVBQUdQLEdBQWpDbjRGLElBQVE0NEYsR0FBTUYsRUFBR1AsR0FHekNPLEVBQUdQLEdBQUl4cUYsT0FBTyxRQUFVLEVBQzFCdVMsRUFBK0NBLEdBQXhDeTRFLEVBQStDRCxFQUFHUCxHQUEvQm40RixFQUFNNDRGLEdBQU1GLEVBQUdQLEdBR3ZDTyxFQUFHUCxHQUFJeHFGLE9BQU8sUUFBVSxHQUl2QitxRixFQUFHUCxHQUFJeHFGLE9BQU8sWUFBYyxHQUFNK3FGLEVBQUdQLEdBQUl4cUYsT0FBTyxZQUFjLEVBSGpFdVMsR0FBT2xnQixFQUFNNDRGLEdBQU1GLEVBQUdQLEdBUXRCajRFLEdBQU93NEUsRUFBR1AsR0FJYixNQUFtQixNQUFWajRFLEVBQUksR0FBY0EsRUFBSTNrQixNQUFNLEdBQUsya0IsR0FHM0NrNEUsRUFBVzcrRixVQUFVNGdELEtBQU8sU0FBUzdqQyxFQUFLNHJFLEdBRXJDQSxFQUFPQSxHQUFjcm5GLEtBQUtxbkYsS0FFOUIsTUFBb0Isb0JBQVR4K0UsS0FBOEI0UyxFQUVwQixpQkFBVEEsRUFBMkI1UyxLQUFLTyxVQUFVUCxLQUFLQyxNQUFNMlMsR0FBTyxLQUFNNHJFLEdBQ3pELGlCQUFUNXJFLEVBQTJCNVMsS0FBS08sVUFBVXFTLEVBQU0sS0FBTTRyRSxHQUUzRDVyRSxHQUdSOGhGLEVBQVc3K0YsVUFBVXMvRixJQUFNLFNBQVN2aUYsRUFBTTRyRSxHQUV6QyxJQUFJd1csRUFBS3BpRixFQUFLVCxRQUFRLFVBQVUsS0FDNUJBLFFBQVEsTUFBTSxTQUNkQSxRQUFRLE1BQU0sYUFDZEEsUUFBUSxNQUFNLFNBQ2RBLFFBQVEsUUFBUSxVQUNoQkEsUUFBUSxRQUFRLFVBQ2hCQSxRQUFRLGtCQUFrQixRQUMxQitSLE1BQU0sUUFDVHBvQixFQUFNazVGLEVBQUd4N0YsT0FDVDA3RixFQUFPLEVBQ1AxNEUsRUFBTSxHQUNOaTRFLEVBQUssRUFDTG40RixFQUFRa2lGLEVBQU8rVixFQUFlL1YsR0FBUXJuRixLQUFLbUYsTUFFM0MsSUFBSW00RixFQUFHLEVBQUVBLEVBQUczNEYsRUFBSTI0RixJQUVYLEtBQUszN0QsS0FBS2s4RCxFQUFHUCxJQUNoQmo0RSxHQUFPbGdCLEVBQU00NEYsS0FBUUYsRUFBR1AsR0FFckIsS0FBSzM3RCxLQUFLazhELEVBQUdQLElBQ2hCajRFLEdBQU9sZ0IsSUFBUTQ0RixHQUFNRixFQUFHUCxJQUVyQixPQUFPMzdELEtBQUtrOEQsRUFBR1AsSUFDbEJqNEUsR0FBT2xnQixFQUFNNDRGLEdBQU1GLEVBQUdQLElBTXhCLE9BQU9qNEUsRUFBSXJLLFFBQVEsVUFBVSxLQWlFL0J1aUYsRUFBVzcrRixVQUFVdS9GLElBQU0sU0FBU3hpRixFQUFLNHJFLEdBRXhDLElBQUk2VyxFQUFjemlGLEVBQUtULFFBQVEsVUFBVSxLQUNsQ0EsUUFBUSxPQUFPLFNBQ2YrUixNQUFNLFFBQ1pwb0IsRUFBTXU1RixFQUFZNzdGLE9BQ2xCdzdGLEVBQUssR0FDTEUsRUFBTyxFQUNQSixFQUFNMzlGLEtBQUtxbkYsS0FHWG9XLEVBQW1CLEVBQ25CcDRFLEVBQU0sR0FDTmk0RSxFQUFLLEVBQ0xuNEYsRUFBUWtpRixFQUFPK1YsRUFBZS9WLEdBQVFybkYsS0FBS21GLE1BRTNDLElBQUltNEYsRUFBRyxFQUFFQSxFQUFHMzRGLEVBQUkyNEYsSUFFZE8sRUFERVAsRUFBRyxFQUNBTyxFQUFHbitGLE9BQU93K0YsRUFBWVosSUFFdEJPLEVBQUduK0YsT0FBT2crRixFQUFVUSxFQUFZWixHQUFLSyxJQUs1QyxJQURBaDVGLEVBQU1rNUYsRUFBR3g3RixPQUNMaTdGLEVBQUcsRUFBRUEsRUFBRzM0RixFQUFJMjRGLElBQU0sQ0FFckJHLEVBQW1CRCxFQUFXSyxFQUFHUCxHQUFLRyxHQUVsQywyQkFBMkI5N0QsS0FBS2s4RCxFQUFHUCxNQUN0Q08sRUFBR1AsR0FBTU8sRUFBR1AsR0FBSXRpRixRQUFRLE1BQU0sTUFBTTJpRixFQUFJQSxJQUdyQyx3QkFBd0JoOEQsS0FBS2s4RCxFQUFHUCxNQUNuQ08sRUFBR1AsR0FBTU8sRUFBR1AsR0FBSXRpRixRQUFRLE1BQU0sTUFBTTJpRixFQUFJQSxJQUdyQyw2QkFBNkJoOEQsS0FBS2s4RCxFQUFHUCxJQUV4Q2o0RSxHQUFPbGdCLElBRFA0NEYsR0FDbUJGLEVBQUdQLEdBRW5CLEtBQUszN0QsS0FBS2s4RCxFQUFHUCxLQUNiRyxFQUFpQixHQUFLTSxHQUN4QkEsSUFFRDE0RSxHQUFPdzRFLEVBQUdQLEtBR1ZqNEUsR0FBT2xnQixFQUFNNDRGLEdBQU1GLEVBQUdQLEdBQ25CRyxFQUFpQixHQUFLTSxHQUN4QkEsS0FPSCxPQURBMTRFLEVBQU1BLEVBQUlySyxRQUFRLFVBQVUsSUFBSUEsUUFBUSxVQUFVLE9BS3BEdWlGLEVBQVc3K0YsVUFBVXkvRixPQUFTLFNBQVMxaUYsRUFBTTJpRixHQUs1QyxPQUhVQSxFQUFtQjNpRixFQUNsQkEsRUFBS1QsUUFBUSx5REFBeUQsSUFDdkVBLFFBQVEsc0JBQXVCLFdBQzdCQSxRQUFRLFlBQVksT0FHakN1aUYsRUFBVzcrRixVQUFVMi9GLFFBQVUsU0FBUzVpRixHQUV2QyxNQUFvQixvQkFBVDVTLEtBQThCNFMsRUFFbEM1UyxLQUFLTyxVQUFVUCxLQUFLQyxNQUFNMlMsR0FBTyxLQUFNLElBSS9DOGhGLEVBQVc3K0YsVUFBVTQvRixPQUFTLFNBQVM3aUYsRUFBTTJpRixHQUs1QyxPQUhVQSxFQUFtQjNpRixFQUNsQkEsRUFBS1QsUUFBUSwrQ0FBK0MsS0FFNURBLFFBQVEsVUFBVSxLQUN4QkEsUUFBUSxZQUFZLEtBQ3BCQSxRQUFRLFlBQVksS0FDcEJBLFFBQVEsWUFBWSxLQUNwQkEsUUFBUSxjQUFjLE1BQ3RCQSxRQUFRLGNBQWMsT0FHNUJ1aUYsRUFBVzcrRixVQUFVNi9GLE9BQVMsU0FBUzlpRixHQUN0QyxPQUFPQSxFQUFLVCxRQUFRLFVBQVUsS0FBS0EsUUFBUSxXQUFXLEtBQUtBLFFBQVEsV0FBVyxNQUcvRW5lLEVBQU9ELFFBQVUsSUFBSTJnRyxHLG1JQzlWUixFQUFBLy9FLGVBQ1gsczhFQTZFVyxFQUFBQyxjQUFnQixzUkFXaEIsRUFBQUMsV0FBYSx3Uiw2R0NwRjFCLG1DQUNRM1UsT0FBT3kxRixRQUFRLDRGQUNuQmoxRixTQUFTMkIsZUFBZSxRQUFRaVAsVSx5R0NQcEMsYUFHQSxPQUNBLFFBQ0EsUUFHQSwwQkFPRSxZQUFheE4sRUFBb0JqQixHQTZCakMsS0FBQTdLLFNBQVkrVyxJQUdWLE1BQU1sUCxFQUFLMUksS0FBSzBMLE1BQU1oRCxHQUNoQjA0QyxHQUFTLElBQUFwK0IsaUJBQWdCcEwsRUFBSXFMLFFBQVNyTCxFQUFJc0wsU0FDMUMvSCxFQUE0QixDQUNoQ0MsT0FBUSxRQUNSQyxNQUFPLENBQ0xDLFVBQVc1UyxFQUNYa0osRUFBR3d2QyxFQUFPeHZDLElBSWQ1UixLQUFLMk0sU0FBUytPLEtBQUtQLEVBQWNuYixLQUFLMk0sU0FBU0csS0FBS0MscUJBQXFCNE8sS0FBS25QLE1BQU93UyxJQUMvRUEsVUFDSWhmLEtBQUsyTSxTQUFTa1AsdUJBQ3BCcEosRUFBYW1CLGtCQUFrQiwwQkFBMkIsWUFFNUQsTUFBTWpJLEVBQWMsSUFBSSxVQUFZM0wsS0FBSzJNLFNBQVUsVUFDbkQzTSxLQUFLeStGLGdCQUNMLElBQUEzekYsV0FBVSxDQUFDdkIsU0FBU3FFLGNBQWMsSUFBSWxGLElBQVExSSxLQUFLMk0sU0FBVWhCLEdBRTdELE1BQU02UyxFQUFXalYsU0FBUzJCLGVBQWUsWUFDckNzVCxJQUNGQSxFQUFTalQsVUFBWSxHQUNyQmlULEVBQVM3VCxjQUFjZCxVQUFVZSxJQUFJLGVBR3hDdE0sS0FBSzBCLE1BR1IsS0FBQStiLGlCQUFvQm5FLElBQ0YsV0FBWkEsRUFBSXZaLElBQ04yQixLQUFLeStGLGVBQ2dCLFVBQVo3bUYsRUFBSXZaLEtBQ2JrTCxTQUFTbU8sS0FBSzFULG9CQUFvQixRQUFTaEUsS0FBS2EsUUFBUyxDQUFFNjlGLFNBQVMsTUFFckVwZ0csS0FBSzBCLE1BR1IsS0FBQTIrRixrQkFBcUIvbUYsSUFFb0IsT0FEeEJBLEVBQUl6WSxPQUNSbU4sUUFBUSxrQkFDakJ0TSxLQUFLeStGLGVBQ0xsMUYsU0FBU21PLEtBQUsxVCxvQkFBb0IsUUFBU2hFLEtBQUthLFFBQVMsQ0FBRTY5RixTQUFTLE9BRXJFcGdHLEtBQUswQixNQUdSLEtBQUE0K0YsY0FBaUJobkYsSUFDQyxVQUFaQSxFQUFJdlosS0FDTmtMLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFFBQVM3RCxLQUFLYSxRQUFTLENBQUU2OUYsU0FBUyxNQUVsRXBnRyxLQUFLMEIsTUFqRk5BLEtBQUsyTSxTQUFXQSxFQUNoQjNNLEtBQUswTCxNQUFRQSxFQU1mLGFBQ0UxTCxLQUFLeStGLGVBRUxsMUYsU0FBU21PLEtBQUs3VCxpQkFBaUIsUUFBUzdELEtBQUthLFFBQVMsQ0FBRTY5RixTQUFTLElBR2pFbjFGLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFVBQVc3RCxLQUFLK2IsaUJBQy9DeFMsU0FBU21PLEtBQUs3VCxpQkFBaUIsUUFBUzdELEtBQUs0K0YsY0FDN0NyMUYsU0FBU21PLEtBQUs3VCxpQkFBaUIsUUFBUzdELEtBQUsyK0Ysa0JBRTdDbHNGLEVBQWFtQixrQkFBa0Isd0JBR2pDLGVBQ0VySyxTQUFTbU8sS0FBSzFULG9CQUFvQixVQUFXaEUsS0FBSytiLGlCQUNsRHhTLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFFBQVNoRSxLQUFLNCtGLGNBQ2hEcjFGLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFFBQVNoRSxLQUFLMitGLGtCQUNoRHAxRixTQUFTbU8sS0FBSzFULG9CQUFvQixRQUFTaEUsS0FBS2EsUUFBUyxDQUFFNjlGLFNBQVMsTyx5R0N4Q3hFLGFBS0EsMEJBT0UsWUFBYS94RixFQUFvQmxDLEdBNkJqQyxLQUFBNUosU0FBWStXLElBQ1YsTUFPTXVELEVBQWlDLENBQ3JDQyxPQUFRLGFBQ1JDLE1BQU8sQ0FDTEMsVUFWT3RiLEtBQUt5SyxNQUFNL0IsR0FXbEJtMkYsS0FQUWpuRixFQUFJelksT0FBdUJ3TCxjQUN2QmpDLEtBVWhCMUksS0FBSzJNLFNBQVMrTyxLQUFLUCxFQUFjbmIsS0FBSzJNLFNBQVNHLEtBQUtDLHFCQUFxQjRPLEtBQUtuUCxNQUFPd1MsSUFDL0VBLFNBQ0loZixLQUFLMk0sU0FBU2tQLHVCQUNwQnBKLEVBQWFtQixrQkFBa0IsMEJBQTJCLG1CQUdwRDVULEtBQUsyTSxTQUFTa1AsdUJBQ3BCcEosRUFBYW1CLGtCQUFrQixzQkFBdUIsVUFJeEQ1VCxLQUFLeStGLG1CQU9ObmdHLEtBQUswQixNQUdSLEtBQUErYixpQkFBb0JuRSxJQUNGLFdBQVpBLEVBQUl2WixJQUNOMkIsS0FBS3krRixlQUNnQixVQUFaN21GLEVBQUl2WixLQUNia0wsU0FBU21PLEtBQUsxVCxvQkFBb0IsUUFBU2hFLEtBQUthLFFBQVMsQ0FBRTY5RixTQUFTLE1BRXJFcGdHLEtBQUswQixNQUdSLEtBQUEyK0Ysa0JBQXFCL21GLElBRW9CLE9BRHhCQSxFQUFJelksT0FDUm1OLFFBQVEsa0JBQ2pCdE0sS0FBS3krRixlQUNMbDFGLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFFBQVNoRSxLQUFLYSxRQUFTLENBQUU2OUYsU0FBUyxPQUVyRXBnRyxLQUFLMEIsTUFHUixLQUFBNCtGLGNBQWlCaG5GLElBQ0MsVUFBWkEsRUFBSXZaLEtBQ05rTCxTQUFTbU8sS0FBSzdULGlCQUFpQixRQUFTN0QsS0FBS2EsUUFBUyxDQUFFNjlGLFNBQVMsTUFFbEVwZ0csS0FBSzBCLE1BdkZOQSxLQUFLMk0sU0FBV0EsRUFDaEIzTSxLQUFLeUssTUFBUUEsRUFNZixhQUNFekssS0FBS3krRixlQUVMbDFGLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFFBQVM3RCxLQUFLYSxRQUFTLENBQUU2OUYsU0FBUyxJQUdqRW4xRixTQUFTbU8sS0FBSzdULGlCQUFpQixVQUFXN0QsS0FBSytiLGlCQUMvQ3hTLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFFBQVM3RCxLQUFLNCtGLGNBQzdDcjFGLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFFBQVM3RCxLQUFLMitGLGtCQUU3Q2xzRixFQUFhbUIsa0JBQWtCLDJDQUdqQyxlQUNFckssU0FBU21PLEtBQUsxVCxvQkFBb0IsVUFBV2hFLEtBQUsrYixpQkFDbER4UyxTQUFTbU8sS0FBSzFULG9CQUFvQixRQUFTaEUsS0FBSzQrRixjQUNoRHIxRixTQUFTbU8sS0FBSzFULG9CQUFvQixRQUFTaEUsS0FBSzIrRixrQkFDaERwMUYsU0FBU21PLEtBQUsxVCxvQkFBb0IsUUFBU2hFLEtBQUthLFFBQVMsQ0FBRTY5RixTQUFTLE8sOENDckN4RSxZQUNBOWhHLEVBQVFvSyxLQUFPLFdBQ2IsTUFBd0MsbUJBQTFCNGpELEVBQU9rMEMsZ0JBR3ZCbGlHLEVBQVFxSyxRQUFVLFNBQVVvekIsR0FDMUIsT0FBTyxXQUNMdXdCLEVBQU9rMEMsZUFBZXprRSxPLCtDQ1AxQixZQUtBLElBQUkwa0UsRUFBV24wQyxFQUFPbzBDLGtCQUFvQnAwQyxFQUFPcTBDLHVCQUVqRHJpRyxFQUFRb0ssS0FBTyxXQUNiLE9BQU8rM0YsR0FHVG5pRyxFQUFRcUssUUFBVSxTQUFVaTRGLEdBQzFCLElBQUkva0UsRUFBUyxFQUNUZ2xFLEVBQVcsSUFBSUosRUFBU0csR0FDeEI1MUYsRUFBVXNoRCxFQUFPcmhELFNBQVM2MUYsZUFBZSxJQUk3QyxPQUhBRCxFQUFTRSxRQUFRLzFGLEVBQVMsQ0FDeEJnMkYsZUFBZSxJQUVWLFdBQ0xoMkYsRUFBUXVlLEtBQVFzUyxJQUFXQSxFQUFTLE0sK0NDbkJ4QyxZQUVBdjlCLEVBQVFvSyxLQUFPLFdBQ2IsT0FBSTRqRCxFQUFPL2xCLG1CQUs2QixJQUExQitsQixFQUFPMjBDLGdCQUd2QjNpRyxFQUFRcUssUUFBVSxTQUFVb3pCLEdBQzFCLElBQUltbEUsRUFBVSxJQUFJNTBDLEVBQU8yMEMsZUFFekIsT0FEQUMsRUFBUUMsTUFBTUMsVUFBWXJsRSxFQUNuQixXQUNMbWxFLEVBQVFHLE1BQU1DLFlBQVksTywrQ0NmOUIsWUFFQWhqRyxFQUFRb0ssS0FBTyxXQUNiLE1BQU8sYUFBYzRqRCxHQUFVLHVCQUF3QkEsRUFBT3JoRCxTQUFTZ0ssY0FBYyxXQUd2RjNXLEVBQVFxSyxRQUFVLFNBQVVpNEYsR0FDMUIsT0FBTyxXQUlMLElBQUlXLEVBQVdqMUMsRUFBT3JoRCxTQUFTZ0ssY0FBYyxVQVU3QyxPQVRBc3NGLEVBQVNDLG1CQUFxQixXQUM1QlosSUFFQVcsRUFBU0MsbUJBQXFCLEtBQzlCRCxFQUFTNzdFLFdBQVcrN0UsWUFBWUYsR0FDaENBLEVBQVcsTUFFYmoxQyxFQUFPcmhELFNBQVN5MkYsZ0JBQWdCeHFFLFlBQVlxcUUsR0FFckNYLE0sOENDcEJYdGlHLEVBQVFvSyxLQUFPLFdBQ2IsT0FBTyxHQUdUcEssRUFBUXFLLFFBQVUsU0FBVWpKLEdBQzFCLE9BQU8sV0FDTDZJLFdBQVc3SSxFQUFHLE0sNkJDZ0JsQixJQUFJaWlHLEVBQVcsRUFBUSxJQUNuQkMsRUFBTyxFQUFRLElBU25CLFNBQVNDLElBQ1BuZ0csS0FBSzBzRCxTQUFXLEtBQ2hCMXNELEtBQUtvZ0csUUFBVSxLQUNmcGdHLEtBQUs4c0QsS0FBTyxLQUNaOXNELEtBQUttdEQsS0FBTyxLQUNabnRELEtBQUtvdEQsS0FBTyxLQUNacHRELEtBQUtxZ0csU0FBVyxLQUNoQnJnRyxLQUFLZ25CLEtBQU8sS0FDWmhuQixLQUFLOFMsT0FBUyxLQUNkOVMsS0FBS3NnQyxNQUFRLEtBQ2J0Z0MsS0FBS3NnRyxTQUFXLEtBQ2hCdGdHLEtBQUswUCxLQUFPLEtBQ1oxUCxLQUFLdWdHLEtBQU8sS0FuQmQzakcsRUFBUWtNLE1BQVEwM0YsRUFDaEI1akcsRUFBUXdELFFBMFpSLFNBQW9CNmhDLEVBQVF3K0QsR0FDMUIsT0FBT0QsRUFBU3YrRCxHQUFRLEdBQU8sR0FBTTdoQyxRQUFRcWdHLElBMVovQzdqRyxFQUFROGpHLGNBaWFSLFNBQTBCeitELEVBQVF3K0QsR0FDaEMsT0FBS3grRCxFQUNFdStELEVBQVN2K0QsR0FBUSxHQUFPLEdBQU15K0QsY0FBY0QsR0FEL0JBLEdBamF0QjdqRyxFQUFRbXZCLE9Bc1ZSLFNBQW1CMkIsR0FLYnd5RSxFQUFLNVEsU0FBUzVoRSxLQUFNQSxFQUFNOHlFLEVBQVM5eUUsSUFDdkMsT0FBTUEsYUFBZXl5RSxFQUNkenlFLEVBQUkzQixTQUR1Qm8wRSxFQUFJemhHLFVBQVVxdEIsT0FBTzl1QixLQUFLeXdCLElBMVY5RDl3QixFQUFRdWpHLElBQU1BLEVBcUJkLElBQUlRLEVBQWtCLG9CQUNsQkMsRUFBYyxXQUdkQyxFQUFvQixxQ0FPcEJDLEVBQVMsQ0FBQyxJQUFLLElBQUssSUFBSyxLQUFNLElBQUssS0FBS3BoRyxPQUhoQyxDQUFDLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxLQUFNLEtBQU0sT0FNL0NxaEcsRUFBYSxDQUFDLEtBQU1yaEcsT0FBT29oRyxHQUszQkUsRUFBZSxDQUFDLElBQUssSUFBSyxJQUFLLElBQUssS0FBS3RoRyxPQUFPcWhHLEdBQ2hERSxFQUFrQixDQUFDLElBQUssSUFBSyxLQUU3QkMsRUFBc0IseUJBQ3RCQyxFQUFvQiwrQkFFcEJDLEVBQWlCLENBQ2YsWUFBYyxFQUNkLGVBQWUsR0FHakJDLEVBQW1CLENBQ2pCLFlBQWMsRUFDZCxlQUFlLEdBR2pCQyxFQUFrQixDQUNoQixNQUFRLEVBQ1IsT0FBUyxFQUNULEtBQU8sRUFDUCxRQUFVLEVBQ1YsTUFBUSxFQUNSLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEdBRVhDLEVBQWMsRUFBUSxJQUUxQixTQUFTZixFQUFTN3JELEVBQUs2c0QsRUFBa0JDLEdBQ3ZDLEdBQUk5c0QsR0FBT3VyRCxFQUFLenRCLFNBQVM5OUIsSUFBUUEsYUFBZXdyRCxFQUFLLE9BQU94ckQsRUFFNUQsSUFBSStzRCxFQUFJLElBQUl2QixFQUVaLE9BREF1QixFQUFFNTRGLE1BQU02ckMsRUFBSzZzRCxFQUFrQkMsR0FDeEJDLEVBR1R2QixFQUFJemhHLFVBQVVvSyxNQUFRLFNBQVM2ckMsRUFBSzZzRCxFQUFrQkMsR0FDcEQsSUFBS3ZCLEVBQUs1USxTQUFTMzZDLEdBQ2pCLE1BQU0sSUFBSW56QyxVQUFVLGdEQUFrRG16QyxHQU14RSxJQUFJZ3RELEVBQWFodEQsRUFBSS9sQyxRQUFRLEtBQ3pCZ3pGLEdBQ3FCLElBQWhCRCxHQUFxQkEsRUFBYWh0RCxFQUFJL2xDLFFBQVEsS0FBUSxJQUFNLElBQ2pFaXpGLEVBQVNsdEQsRUFBSTVuQixNQUFNNjBFLEdBRXZCQyxFQUFPLEdBQUtBLEVBQU8sR0FBRzdtRixRQURMLE1BQ3lCLEtBRzFDLElBQUltaUQsRUFGSnhvQixFQUFNa3RELEVBQU9oaUYsS0FBSytoRixHQVFsQixHQUZBemtDLEVBQU9BLEVBQUtsaUQsUUFFUHdtRixHQUErQyxJQUExQjlzRCxFQUFJNW5CLE1BQU0sS0FBSzFxQixPQUFjLENBRXJELElBQUl5L0YsRUFBYWpCLEVBQWtCbC9ELEtBQUt3N0IsR0FDeEMsR0FBSTJrQyxFQWVGLE9BZEE5aEcsS0FBSzBQLEtBQU95dEQsRUFDWm45RCxLQUFLdWdHLEtBQU9wakMsRUFDWm45RCxLQUFLc2dHLFNBQVd3QixFQUFXLEdBQ3ZCQSxFQUFXLElBQ2I5aEcsS0FBSzhTLE9BQVNndkYsRUFBVyxHQUV2QjloRyxLQUFLc2dDLE1BREhraEUsRUFDV0QsRUFBWXo0RixNQUFNOUksS0FBSzhTLE9BQU9nRCxPQUFPLElBRXJDOVYsS0FBSzhTLE9BQU9nRCxPQUFPLElBRXpCMHJGLElBQ1R4aEcsS0FBSzhTLE9BQVMsR0FDZDlTLEtBQUtzZ0MsTUFBUSxJQUVSdGdDLEtBSVgsSUFBSWc2QixFQUFRMm1FLEVBQWdCaC9ELEtBQUt3N0IsR0FDakMsR0FBSW5qQyxFQUFPLENBRVQsSUFBSStuRSxHQURKL25FLEVBQVFBLEVBQU0sSUFDUy9qQixjQUN2QmpXLEtBQUswc0QsU0FBV3ExQyxFQUNoQjVrQyxFQUFPQSxFQUFLcm5ELE9BQU9ra0IsRUFBTTMzQixRQU8zQixHQUFJby9GLEdBQXFCem5FLEdBQVNtakMsRUFBS3R0RCxNQUFNLHdCQUF5QixDQUNwRSxJQUFJdXdGLEVBQWdDLE9BQXRCampDLEVBQUtybkQsT0FBTyxFQUFHLElBQ3pCc3FGLEdBQWFwbUUsR0FBU3FuRSxFQUFpQnJuRSxLQUN6Q21qQyxFQUFPQSxFQUFLcm5ELE9BQU8sR0FDbkI5VixLQUFLb2dHLFNBQVUsR0FJbkIsSUFBS2lCLEVBQWlCcm5FLEtBQ2pCb21FLEdBQVlwbUUsSUFBVXNuRSxFQUFnQnRuRSxJQUFVLENBbUJuRCxJQURBLElBU0k4eUIsRUFBTWsxQyxFQVROQyxHQUFXLEVBQ05ubEcsRUFBSSxFQUFHQSxFQUFJbWtHLEVBQWdCNStGLE9BQVF2RixJQUFLLEVBRWxDLEtBRFRvbEcsRUFBTS9rQyxFQUFLdnVELFFBQVFxeUYsRUFBZ0Jua0csUUFDUCxJQUFibWxHLEdBQWtCQyxFQUFNRCxLQUN6Q0EsRUFBVUMsSUFpQkUsS0FUZEYsR0FGZSxJQUFiQyxFQUVPOWtDLEVBQUtwZCxZQUFZLEtBSWpCb2QsRUFBS3BkLFlBQVksSUFBS2tpRCxNQU0vQm4xQyxFQUFPcVEsRUFBS3o4RCxNQUFNLEVBQUdzaEcsR0FDckI3a0MsRUFBT0EsRUFBS3o4RCxNQUFNc2hHLEVBQVMsR0FDM0JoaUcsS0FBSzhzRCxLQUFPOS9CLG1CQUFtQjgvQixJQUlqQ20xQyxHQUFXLEVBQ1gsSUFBU25sRyxFQUFJLEVBQUdBLEVBQUlra0csRUFBYTMrRixPQUFRdkYsSUFBSyxDQUM1QyxJQUFJb2xHLEdBQ1MsS0FEVEEsRUFBTS9rQyxFQUFLdnVELFFBQVFveUYsRUFBYWxrRyxRQUNKLElBQWJtbEcsR0FBa0JDLEVBQU1ELEtBQ3pDQSxFQUFVQyxJQUdHLElBQWJELElBQ0ZBLEVBQVU5a0MsRUFBSzk2RCxRQUVqQnJDLEtBQUttdEQsS0FBT2dRLEVBQUt6OEQsTUFBTSxFQUFHdWhHLEdBQzFCOWtDLEVBQU9BLEVBQUt6OEQsTUFBTXVoRyxHQUdsQmppRyxLQUFLbWlHLFlBSUxuaUcsS0FBS3FnRyxTQUFXcmdHLEtBQUtxZ0csVUFBWSxHQUlqQyxJQUFJK0IsRUFBb0MsTUFBckJwaUcsS0FBS3FnRyxTQUFTLElBQ2UsTUFBNUNyZ0csS0FBS3FnRyxTQUFTcmdHLEtBQUtxZ0csU0FBU2grRixPQUFTLEdBR3pDLElBQUsrL0YsRUFFSCxJQURBLElBQUlDLEVBQVlyaUcsS0FBS3FnRyxTQUFTdHpFLE1BQU0sTUFDcEJod0IsR0FBUEQsRUFBSSxFQUFPdWxHLEVBQVVoZ0csUUFBUXZGLEVBQUlDLEVBQUdELElBQUssQ0FDaEQsSUFBSXdsRyxFQUFPRCxFQUFVdmxHLEdBQ3JCLEdBQUt3bEcsSUFDQUEsRUFBS3p5RixNQUFNcXhGLEdBQXNCLENBRXBDLElBREEsSUFBSXFCLEVBQVUsR0FDTGgwRixFQUFJLEVBQUc4VixFQUFJaStFLEVBQUtqZ0csT0FBUWtNLEVBQUk4VixFQUFHOVYsSUFDbEMrekYsRUFBSzU5RSxXQUFXblcsR0FBSyxJQUl2QmcwRixHQUFXLElBRVhBLEdBQVdELEVBQUsvekYsR0FJcEIsSUFBS2cwRixFQUFRMXlGLE1BQU1xeEYsR0FBc0IsQ0FDdkMsSUFBSXNCLEVBQWFILEVBQVUzaEcsTUFBTSxFQUFHNUQsR0FDaEMybEcsRUFBVUosRUFBVTNoRyxNQUFNNUQsRUFBSSxHQUM5QjRsRyxFQUFNSixFQUFLenlGLE1BQU1zeEYsR0FDakJ1QixJQUNGRixFQUFXcGdHLEtBQUtzZ0csRUFBSSxJQUNwQkQsRUFBUXRnRyxRQUFRdWdHLEVBQUksS0FFbEJELEVBQVFwZ0csU0FDVjg2RCxFQUFPLElBQU1zbEMsRUFBUTVpRixLQUFLLEtBQU9zOUMsR0FFbkNuOUQsS0FBS3FnRyxTQUFXbUMsRUFBVzNpRixLQUFLLEtBQ2hDLFFBTUo3ZixLQUFLcWdHLFNBQVNoK0YsT0FqTkQsSUFrTmZyQyxLQUFLcWdHLFNBQVcsR0FHaEJyZ0csS0FBS3FnRyxTQUFXcmdHLEtBQUtxZ0csU0FBU3BxRixjQUczQm1zRixJQUtIcGlHLEtBQUtxZ0csU0FBV0osRUFBUzBDLFFBQVEzaUcsS0FBS3FnRyxXQUd4QyxJQUFJemhHLEVBQUlvQixLQUFLb3RELEtBQU8sSUFBTXB0RCxLQUFLb3RELEtBQU8sR0FDbEN2WixFQUFJN3pDLEtBQUtxZ0csVUFBWSxHQUN6QnJnRyxLQUFLbXRELEtBQU90WixFQUFJajFDLEVBQ2hCb0IsS0FBS3VnRyxNQUFRdmdHLEtBQUttdEQsS0FJZGkxQyxJQUNGcGlHLEtBQUtxZ0csU0FBV3JnRyxLQUFLcWdHLFNBQVN2cUYsT0FBTyxFQUFHOVYsS0FBS3FnRyxTQUFTaCtGLE9BQVMsR0FDL0MsTUFBWjg2RCxFQUFLLEtBQ1BBLEVBQU8sSUFBTUEsSUFPbkIsSUFBS2lrQyxFQUFlVyxHQUtsQixJQUFTamxHLEVBQUksRUFBR0MsRUFBSWdrRyxFQUFXMStGLE9BQVF2RixFQUFJQyxFQUFHRCxJQUFLLENBQ2pELElBQUk4bEcsRUFBSzdCLEVBQVdqa0csR0FDcEIsSUFBMEIsSUFBdEJxZ0UsRUFBS3Z1RCxRQUFRZzBGLEdBQWpCLENBRUEsSUFBSUMsRUFBTXQ5RSxtQkFBbUJxOUUsR0FDekJDLElBQVFELElBQ1ZDLEVBQU16TCxPQUFPd0wsSUFFZnpsQyxFQUFPQSxFQUFLcHdDLE1BQU02MUUsR0FBSS9pRixLQUFLZ2pGLElBTS9CLElBQUk3N0UsRUFBT20yQyxFQUFLdnVELFFBQVEsTUFDVixJQUFWb1ksSUFFRmhuQixLQUFLZ25CLEtBQU9tMkMsRUFBS3JuRCxPQUFPa1IsR0FDeEJtMkMsRUFBT0EsRUFBS3o4RCxNQUFNLEVBQUdzbUIsSUFFdkIsSUFBSTg3RSxFQUFLM2xDLEVBQUt2dUQsUUFBUSxLQW9CdEIsSUFuQlksSUFBUmswRixHQUNGOWlHLEtBQUs4UyxPQUFTcXFELEVBQUtybkQsT0FBT2d0RixHQUMxQjlpRyxLQUFLc2dDLE1BQVE2OEIsRUFBS3JuRCxPQUFPZ3RGLEVBQUssR0FDMUJ0QixJQUNGeGhHLEtBQUtzZ0MsTUFBUWloRSxFQUFZejRGLE1BQU05SSxLQUFLc2dDLFFBRXRDNjhCLEVBQU9BLEVBQUt6OEQsTUFBTSxFQUFHb2lHLElBQ1p0QixJQUVUeGhHLEtBQUs4UyxPQUFTLEdBQ2Q5UyxLQUFLc2dDLE1BQVEsSUFFWDY4QixJQUFNbjlELEtBQUtzZ0csU0FBV25qQyxHQUN0Qm1rQyxFQUFnQlMsSUFDaEIvaEcsS0FBS3FnRyxXQUFhcmdHLEtBQUtzZ0csV0FDekJ0Z0csS0FBS3NnRyxTQUFXLEtBSWR0Z0csS0FBS3NnRyxVQUFZdGdHLEtBQUs4UyxPQUFRLENBQzVCbFUsRUFBSW9CLEtBQUtzZ0csVUFBWSxHQUF6QixJQUNJemhHLEVBQUltQixLQUFLOFMsUUFBVSxHQUN2QjlTLEtBQUswUCxLQUFPOVEsRUFBSUMsRUFLbEIsT0FEQW1CLEtBQUt1Z0csS0FBT3ZnRyxLQUFLK3JCLFNBQ1YvckIsTUFjVG1nRyxFQUFJemhHLFVBQVVxdEIsT0FBUyxXQUNyQixJQUFJK2dDLEVBQU85c0QsS0FBSzhzRCxNQUFRLEdBQ3BCQSxJQUVGQSxHQURBQSxFQUFPdm5DLG1CQUFtQnVuQyxJQUNkOXhDLFFBQVEsT0FBUSxLQUM1Qjh4QyxHQUFRLEtBR1YsSUFBSUosRUFBVzFzRCxLQUFLMHNELFVBQVksR0FDNUI0ekMsRUFBV3RnRyxLQUFLc2dHLFVBQVksR0FDNUJ0NUUsRUFBT2huQixLQUFLZ25CLE1BQVEsR0FDcEJtbUMsR0FBTyxFQUNQN3NCLEVBQVEsR0FFUnRnQyxLQUFLbXRELEtBQ1BBLEVBQU9MLEVBQU85c0QsS0FBS210RCxLQUNWbnRELEtBQUtxZ0csV0FDZGx6QyxFQUFPTCxJQUF3QyxJQUFoQzlzRCxLQUFLcWdHLFNBQVN6eEYsUUFBUSxLQUNqQzVPLEtBQUtxZ0csU0FDTCxJQUFNcmdHLEtBQUtxZ0csU0FBVyxLQUN0QnJnRyxLQUFLb3RELE9BQ1BELEdBQVEsSUFBTW50RCxLQUFLb3RELE9BSW5CcHRELEtBQUtzZ0MsT0FDTDQvRCxFQUFLenRCLFNBQVN6eUUsS0FBS3NnQyxRQUNuQjlpQyxPQUFPaUksS0FBS3pGLEtBQUtzZ0MsT0FBT2orQixTQUMxQmkrQixFQUFRaWhFLEVBQVluNEYsVUFBVXBKLEtBQUtzZ0MsUUFHckMsSUFBSXh0QixFQUFTOVMsS0FBSzhTLFFBQVd3dEIsR0FBVSxJQUFNQSxHQUFXLEdBc0J4RCxPQXBCSW9zQixHQUFvQyxNQUF4QkEsRUFBUzUyQyxRQUFRLEtBQVk0MkMsR0FBWSxLQUlyRDFzRCxLQUFLb2dHLFdBQ0gxekMsR0FBWTQwQyxFQUFnQjUwQyxNQUF1QixJQUFUUyxHQUM5Q0EsRUFBTyxNQUFRQSxHQUFRLElBQ25CbXpDLEdBQW1DLE1BQXZCQSxFQUFTOXRELE9BQU8sS0FBWTh0RCxFQUFXLElBQU1BLElBQ25EbnpDLElBQ1ZBLEVBQU8sSUFHTG5tQyxHQUEyQixNQUFuQkEsRUFBS3dyQixPQUFPLEtBQVl4ckIsRUFBTyxJQUFNQSxHQUM3Q2xVLEdBQStCLE1BQXJCQSxFQUFPMC9CLE9BQU8sS0FBWTEvQixFQUFTLElBQU1BLEdBT2hENDVDLEVBQVdTLEdBTGxCbXpDLEVBQVdBLEVBQVN0bEYsUUFBUSxTQUFTLFNBQVNuTCxHQUM1QyxPQUFPMFYsbUJBQW1CMVYsUUFFNUJpRCxFQUFTQSxFQUFPa0ksUUFBUSxJQUFLLFFBRWdCZ00sR0FPL0NtNUUsRUFBSXpoRyxVQUFVMEIsUUFBVSxTQUFTcWdHLEdBQy9CLE9BQU96Z0csS0FBSzBnRyxjQUFjRixFQUFTQyxHQUFVLEdBQU8sSUFBTzEwRSxVQVE3RG8wRSxFQUFJemhHLFVBQVVnaUcsY0FBZ0IsU0FBU0QsR0FDckMsR0FBSVAsRUFBSzVRLFNBQVNtUixHQUFXLENBQzNCLElBQUlzQyxFQUFNLElBQUk1QyxFQUNkNEMsRUFBSWo2RixNQUFNMjNGLEdBQVUsR0FBTyxHQUMzQkEsRUFBV3NDLEVBS2IsSUFGQSxJQUFJL2pGLEVBQVMsSUFBSW1oRixFQUNiNkMsRUFBUXhsRyxPQUFPaUksS0FBS3pGLE1BQ2ZpakcsRUFBSyxFQUFHQSxFQUFLRCxFQUFNM2dHLE9BQVE0Z0csSUFBTSxDQUN4QyxJQUFJQyxFQUFPRixFQUFNQyxHQUNqQmprRixFQUFPa2tGLEdBQVFsakcsS0FBS2tqRyxHQVF0QixHQUhBbGtGLEVBQU9nSSxLQUFPeTVFLEVBQVN6NUUsS0FHRCxLQUFsQnk1RSxFQUFTRixLQUVYLE9BREF2aEYsRUFBT3VoRixLQUFPdmhGLEVBQU8rTSxTQUNkL00sRUFJVCxHQUFJeWhGLEVBQVNMLFVBQVlLLEVBQVMvekMsU0FBVSxDQUcxQyxJQURBLElBQUl5MkMsRUFBUTNsRyxPQUFPaUksS0FBS2c3RixHQUNmMkMsRUFBSyxFQUFHQSxFQUFLRCxFQUFNOWdHLE9BQVErZ0csSUFBTSxDQUN4QyxJQUFJQyxFQUFPRixFQUFNQyxHQUNKLGFBQVRDLElBQ0Zya0YsRUFBT3FrRixHQUFRNUMsRUFBUzRDLElBVTVCLE9BTkkvQixFQUFnQnRpRixFQUFPMHRDLFdBQ3ZCMXRDLEVBQU9xaEYsV0FBYXJoRixFQUFPc2hGLFdBQzdCdGhGLEVBQU90UCxLQUFPc1AsRUFBT3NoRixTQUFXLEtBR2xDdGhGLEVBQU91aEYsS0FBT3ZoRixFQUFPK00sU0FDZC9NLEVBR1QsR0FBSXloRixFQUFTL3pDLFVBQVkrekMsRUFBUy96QyxXQUFhMXRDLEVBQU8wdEMsU0FBVSxDQVM5RCxJQUFLNDBDLEVBQWdCYixFQUFTL3pDLFVBQVcsQ0FFdkMsSUFEQSxJQUFJam5ELEVBQU9qSSxPQUFPaUksS0FBS2c3RixHQUNkbDJFLEVBQUksRUFBR0EsRUFBSTlrQixFQUFLcEQsT0FBUWtvQixJQUFLLENBQ3BDLElBQUlsRyxFQUFJNWUsRUFBSzhrQixHQUNidkwsRUFBT3FGLEdBQUtvOEUsRUFBU3A4RSxHQUd2QixPQURBckYsRUFBT3VoRixLQUFPdmhGLEVBQU8rTSxTQUNkL00sRUFJVCxHQURBQSxFQUFPMHRDLFNBQVcrekMsRUFBUy96QyxTQUN0Qit6QyxFQUFTdHpDLE1BQVNrMEMsRUFBaUJaLEVBQVMvekMsVUFTL0MxdEMsRUFBT3NoRixTQUFXRyxFQUFTSCxhQVQrQixDQUUxRCxJQURBLElBQUlnRCxHQUFXN0MsRUFBU0gsVUFBWSxJQUFJdnpFLE1BQU0sS0FDdkN1MkUsRUFBUWpoRyxVQUFZbytGLEVBQVN0ekMsS0FBT20yQyxFQUFRbitGLFdBQzlDczdGLEVBQVN0ekMsT0FBTXN6QyxFQUFTdHpDLEtBQU8sSUFDL0JzekMsRUFBU0osV0FBVUksRUFBU0osU0FBVyxJQUN6QixLQUFmaUQsRUFBUSxJQUFXQSxFQUFRbmhHLFFBQVEsSUFDbkNtaEcsRUFBUWpoRyxPQUFTLEdBQUdpaEcsRUFBUW5oRyxRQUFRLElBQ3hDNmMsRUFBT3NoRixTQUFXZ0QsRUFBUXpqRixLQUFLLEtBV2pDLEdBUEFiLEVBQU9sTSxPQUFTMnRGLEVBQVMzdEYsT0FDekJrTSxFQUFPc2hCLE1BQVFtZ0UsRUFBU25nRSxNQUN4QnRoQixFQUFPbXVDLEtBQU9zekMsRUFBU3R6QyxNQUFRLEdBQy9CbnVDLEVBQU84dEMsS0FBTzJ6QyxFQUFTM3pDLEtBQ3ZCOXRDLEVBQU9xaEYsU0FBV0ksRUFBU0osVUFBWUksRUFBU3R6QyxLQUNoRG51QyxFQUFPb3VDLEtBQU9xekMsRUFBU3J6QyxLQUVuQnB1QyxFQUFPc2hGLFVBQVl0aEYsRUFBT2xNLE9BQVEsQ0FDcEMsSUFBSWxVLEVBQUlvZ0IsRUFBT3NoRixVQUFZLEdBQ3ZCemhHLEVBQUltZ0IsRUFBT2xNLFFBQVUsR0FDekJrTSxFQUFPdFAsS0FBTzlRLEVBQUlDLEVBSXBCLE9BRkFtZ0IsRUFBT29oRixRQUFVcGhGLEVBQU9vaEYsU0FBV0ssRUFBU0wsUUFDNUNwaEYsRUFBT3VoRixLQUFPdmhGLEVBQU8rTSxTQUNkL00sRUFHVCxJQUFJdWtGLEVBQWV2a0YsRUFBT3NoRixVQUEwQyxNQUE5QnRoRixFQUFPc2hGLFNBQVM5dEQsT0FBTyxHQUN6RGd4RCxFQUNJL0MsRUFBU3R6QyxNQUNUc3pDLEVBQVNILFVBQTRDLE1BQWhDRyxFQUFTSCxTQUFTOXRELE9BQU8sR0FFbERpeEQsRUFBY0QsR0FBWUQsR0FDWHZrRixFQUFPbXVDLE1BQVFzekMsRUFBU0gsU0FDdkNvRCxFQUFnQkQsRUFDaEJFLEVBQVUza0YsRUFBT3NoRixVQUFZdGhGLEVBQU9zaEYsU0FBU3Z6RSxNQUFNLE1BQVEsR0FFM0Q2MkUsR0FEQU4sRUFBVTdDLEVBQVNILFVBQVlHLEVBQVNILFNBQVN2ekUsTUFBTSxNQUFRLEdBQ25EL04sRUFBTzB0QyxXQUFhNDBDLEVBQWdCdGlGLEVBQU8wdEMsV0EyQjNELEdBcEJJazNDLElBQ0Y1a0YsRUFBT3FoRixTQUFXLEdBQ2xCcmhGLEVBQU9vdUMsS0FBTyxLQUNWcHVDLEVBQU9tdUMsT0FDVSxLQUFmdzJDLEVBQVEsR0FBV0EsRUFBUSxHQUFLM2tGLEVBQU9tdUMsS0FDdEN3MkMsRUFBUXhoRyxRQUFRNmMsRUFBT211QyxPQUU5Qm51QyxFQUFPbXVDLEtBQU8sR0FDVnN6QyxFQUFTL3pDLFdBQ1grekMsRUFBU0osU0FBVyxLQUNwQkksRUFBU3J6QyxLQUFPLEtBQ1pxekMsRUFBU3R6QyxPQUNRLEtBQWZtMkMsRUFBUSxHQUFXQSxFQUFRLEdBQUs3QyxFQUFTdHpDLEtBQ3hDbTJDLEVBQVFuaEcsUUFBUXMrRixFQUFTdHpDLE9BRWhDc3pDLEVBQVN0ekMsS0FBTyxNQUVsQnMyQyxFQUFhQSxJQUE4QixLQUFmSCxFQUFRLElBQTRCLEtBQWZLLEVBQVEsS0FHdkRILEVBRUZ4a0YsRUFBT211QyxLQUFRc3pDLEVBQVN0ekMsTUFBMEIsS0FBbEJzekMsRUFBU3R6QyxLQUMzQnN6QyxFQUFTdHpDLEtBQU9udUMsRUFBT211QyxLQUNyQ251QyxFQUFPcWhGLFNBQVlJLEVBQVNKLFVBQWtDLEtBQXRCSSxFQUFTSixTQUMvQkksRUFBU0osU0FBV3JoRixFQUFPcWhGLFNBQzdDcmhGLEVBQU9sTSxPQUFTMnRGLEVBQVMzdEYsT0FDekJrTSxFQUFPc2hCLE1BQVFtZ0UsRUFBU25nRSxNQUN4QnFqRSxFQUFVTCxPQUVMLEdBQUlBLEVBQVFqaEcsT0FHWnNoRyxJQUFTQSxFQUFVLElBQ3hCQSxFQUFRdCtGLE1BQ1JzK0YsRUFBVUEsRUFBUWprRyxPQUFPNGpHLEdBQ3pCdGtGLEVBQU9sTSxPQUFTMnRGLEVBQVMzdEYsT0FDekJrTSxFQUFPc2hCLE1BQVFtZ0UsRUFBU25nRSxXQUNuQixJQUFLNC9ELEVBQUsyRCxrQkFBa0JwRCxFQUFTM3RGLFFBQVMsQ0FJbkQsR0FBSTh3RixFQUNGNWtGLEVBQU9xaEYsU0FBV3JoRixFQUFPbXVDLEtBQU93MkMsRUFBUXgrRixTQUlwQzIrRixLQUFhOWtGLEVBQU9tdUMsTUFBUW51QyxFQUFPbXVDLEtBQUt2K0MsUUFBUSxLQUFPLElBQzFDb1EsRUFBT211QyxLQUFLcGdDLE1BQU0sUUFFakMvTixFQUFPOHRDLEtBQU9nM0MsRUFBVzMrRixRQUN6QjZaLEVBQU9tdUMsS0FBT251QyxFQUFPcWhGLFNBQVd5RCxFQUFXMytGLFNBVy9DLE9BUkE2WixFQUFPbE0sT0FBUzJ0RixFQUFTM3RGLE9BQ3pCa00sRUFBT3NoQixNQUFRbWdFLEVBQVNuZ0UsTUFFbkI0L0QsRUFBSzNILE9BQU92NUUsRUFBT3NoRixXQUFjSixFQUFLM0gsT0FBT3Y1RSxFQUFPbE0sVUFDdkRrTSxFQUFPdFAsTUFBUXNQLEVBQU9zaEYsU0FBV3RoRixFQUFPc2hGLFNBQVcsS0FDcEN0aEYsRUFBT2xNLE9BQVNrTSxFQUFPbE0sT0FBUyxLQUVqRGtNLEVBQU91aEYsS0FBT3ZoRixFQUFPK00sU0FDZC9NLEVBR1QsSUFBSzJrRixFQUFRdGhHLE9BV1gsT0FSQTJjLEVBQU9zaEYsU0FBVyxLQUVkdGhGLEVBQU9sTSxPQUNUa00sRUFBT3RQLEtBQU8sSUFBTXNQLEVBQU9sTSxPQUUzQmtNLEVBQU90UCxLQUFPLEtBRWhCc1AsRUFBT3VoRixLQUFPdmhGLEVBQU8rTSxTQUNkL00sRUFjVCxJQVJBLElBQUkrNEMsRUFBTzRyQyxFQUFRampHLE9BQU8sR0FBRyxHQUN6QnFqRyxHQUNDL2tGLEVBQU9tdUMsTUFBUXN6QyxFQUFTdHpDLE1BQVF3MkMsRUFBUXRoRyxPQUFTLEtBQ3hDLE1BQVQwMUQsR0FBeUIsT0FBVEEsSUFBMkIsS0FBVEEsRUFJbkNpc0MsRUFBSyxFQUNBbG5HLEVBQUk2bUcsRUFBUXRoRyxPQUFRdkYsR0FBSyxFQUFHQSxJQUV0QixPQURiaTdELEVBQU80ckMsRUFBUTdtRyxJQUViNm1HLEVBQVF2N0QsT0FBT3RyQyxFQUFHLEdBQ0EsT0FBVGk3RCxHQUNUNHJDLEVBQVF2N0QsT0FBT3RyQyxFQUFHLEdBQ2xCa25HLEtBQ1NBLElBQ1RMLEVBQVF2N0QsT0FBT3RyQyxFQUFHLEdBQ2xCa25HLEtBS0osSUFBS1AsSUFBZUMsRUFDbEIsS0FBT00sSUFBTUEsRUFDWEwsRUFBUXhoRyxRQUFRLE9BSWhCc2hHLEdBQTZCLEtBQWZFLEVBQVEsSUFDcEJBLEVBQVEsSUFBK0IsTUFBekJBLEVBQVEsR0FBR254RCxPQUFPLElBQ3BDbXhELEVBQVF4aEcsUUFBUSxJQUdkNGhHLEdBQXNELE1BQWpDSixFQUFROWpGLEtBQUssS0FBSy9KLFFBQVEsSUFDakQ2dEYsRUFBUXZoRyxLQUFLLElBR2YsSUFVTTBoRyxFQVZGRyxFQUE0QixLQUFmTixFQUFRLElBQ3BCQSxFQUFRLElBQStCLE1BQXpCQSxFQUFRLEdBQUdueEQsT0FBTyxHQUdqQ294RCxJQUNGNWtGLEVBQU9xaEYsU0FBV3JoRixFQUFPbXVDLEtBQU84MkMsRUFBYSxHQUNiTixFQUFRdGhHLE9BQVNzaEcsRUFBUXgrRixRQUFVLElBSS9EMitGLEtBQWE5a0YsRUFBT211QyxNQUFRbnVDLEVBQU9tdUMsS0FBS3YrQyxRQUFRLEtBQU8sSUFDMUNvUSxFQUFPbXVDLEtBQUtwZ0MsTUFBTSxRQUVqQy9OLEVBQU84dEMsS0FBT2czQyxFQUFXMytGLFFBQ3pCNlosRUFBT211QyxLQUFPbnVDLEVBQU9xaEYsU0FBV3lELEVBQVczK0YsVUF5Qi9DLE9BckJBcytGLEVBQWFBLEdBQWV6a0YsRUFBT211QyxNQUFRdzJDLEVBQVF0aEcsVUFFaEM0aEcsR0FDakJOLEVBQVF4aEcsUUFBUSxJQUdid2hHLEVBQVF0aEcsT0FJWDJjLEVBQU9zaEYsU0FBV3FELEVBQVE5akYsS0FBSyxNQUgvQmIsRUFBT3NoRixTQUFXLEtBQ2xCdGhGLEVBQU90UCxLQUFPLE1BTVh3d0YsRUFBSzNILE9BQU92NUUsRUFBT3NoRixXQUFjSixFQUFLM0gsT0FBT3Y1RSxFQUFPbE0sVUFDdkRrTSxFQUFPdFAsTUFBUXNQLEVBQU9zaEYsU0FBV3RoRixFQUFPc2hGLFNBQVcsS0FDcEN0aEYsRUFBT2xNLE9BQVNrTSxFQUFPbE0sT0FBUyxLQUVqRGtNLEVBQU84dEMsS0FBTzJ6QyxFQUFTM3pDLE1BQVE5dEMsRUFBTzh0QyxLQUN0Qzl0QyxFQUFPb2hGLFFBQVVwaEYsRUFBT29oRixTQUFXSyxFQUFTTCxRQUM1Q3BoRixFQUFPdWhGLEtBQU92aEYsRUFBTytNLFNBQ2QvTSxHQUdUbWhGLEVBQUl6aEcsVUFBVXlqRyxVQUFZLFdBQ3hCLElBQUloMUMsRUFBT250RCxLQUFLbXRELEtBQ1pDLEVBQU93ekMsRUFBWWovRCxLQUFLd3JCLEdBQ3hCQyxJQUVXLE9BRGJBLEVBQU9BLEVBQUssTUFFVnB0RCxLQUFLb3RELEtBQU9BLEVBQUt0M0MsT0FBTyxJQUUxQnEzQyxFQUFPQSxFQUFLcjNDLE9BQU8sRUFBR3EzQyxFQUFLOXFELE9BQVMrcUQsRUFBSy9xRCxTQUV2QzhxRCxJQUFNbnRELEtBQUtxZ0csU0FBV2x6QyxLLDZCQ3h0QjVCLElBQUkrMkMsRUFBUyxFQUFRLElBQ2pCQyxFQUFVLEVBQVEsSUFHdEIsU0FBU0MsRUFBaUJDLEVBQU9DLEdBQy9CdGtHLEtBQUswSSxHQUFLMjdGLEVBQ1Zya0csS0FBS3NrRyxJQUFNQSxFQUhiem5HLEVBQU9ELFFBQVF3bkcsaUJBQW1CQSxFQVlsQ3ZuRyxFQUFPRCxRQUFRMm5HLEtBQU8sU0FBY3I1RSxFQUFNNUIsR0FDeEMsU0FBU2s3RSxFQUFXQyxFQUFTbjdFLEdBQzNCLEdBQUlBLEdBQXlCLGlCQUFSQSxFQUVyQixHQUFHQSxFQUFPbzdFLEtBQVYsQ0FDRSxJQUFJQyxFQUFjVCxFQUFPOWpHLFFBQVFxa0csRUFBU243RSxFQUFPbzdFLE1BQ2pESixFQUFJSyxHQUFlTCxFQUFJSyxHQUFlTCxFQUFJSyxHQUFhLEVBQUksTUFGN0QsQ0FLQSxJQUFJajhGLEVBQUs0Z0IsRUFBT00sS0FBT04sRUFBTzVnQixHQUMxQms4RixFQUFVbDhGLEVBQUt3N0YsRUFBTzlqRyxRQUFRcWtHLEVBQVMvN0YsR0FBTSs3RixFQUNqRCxHQUFJRyxFQUFTLENBR1gsR0FER0EsRUFBUWgyRixRQUFRLEtBQUssSUFBR2cyRixHQUFXLEtBQ25DUCxFQUFNTyxHQUFTLENBQ2hCLElBQUlULEVBQVExM0Usa0JBQWtCNDNFLEVBQU1PLEdBQVV0N0UsR0FDNUMsTUFBTSxJQUFJOW1CLE1BQU0sV0FBV29pRyxFQUFRLDhDQUVyQyxPQUFPUCxFQUFNTyxHQUVmUCxFQUFNTyxHQUFXdDdFLEVBRWEsS0FBM0JzN0UsRUFBUUEsRUFBUXZpRyxPQUFPLEtBQ3hCZ2lHLEVBQU1PLEVBQVEzL0UsVUFBVSxFQUFHMi9FLEVBQVF2aUcsT0FBTyxJQUFNaW5CLEdBR3BEdTdFLEVBQVVELEVBQVEsU0FBV3BoRyxNQUFNZ21CLFFBQVFGLEVBQU93N0UsT0FBT3g3RSxFQUFPdzdFLE1BQU0sQ0FBQ3g3RSxFQUFPdzdFLFFBQzlFRCxFQUFVRCxFQUFRLFdBQWFwaEcsTUFBTWdtQixRQUFRRixFQUFPeTdFLFNBQVN6N0UsRUFBT3k3RSxRQUFRLENBQUN6N0UsRUFBT3k3RSxVQUNwRlAsRUFBV0ksRUFBUSxtQkFBb0J0N0UsRUFBTzA3RSxpQkFDOUNDLEVBQVdMLEVBQVEsY0FBZXQ3RSxFQUFPNFosWUFDekNzaEUsRUFBV0ksRUFBUSx3QkFBeUJ0N0UsRUFBTzQ3RSxzQkFDbkRELEVBQVdMLEVBQVEsZUFBZ0J0N0UsRUFBTzY3RSxhQUMxQ0YsRUFBV0wsRUFBUSxxQkFBc0J0N0UsRUFBTzg3RSxtQkFDaERILEVBQVdMLEVBQVEsZ0JBQWlCdDdFLEVBQU8rN0UsY0FDM0NSLEVBQVVELEVBQVEsWUFBYXQ3RSxFQUFPZzhFLFVBQ3RDVCxFQUFVRCxFQUFRLFNBQVV0N0UsRUFBT2k4RSxPQUNuQ1YsRUFBVUQsRUFBUSxTQUFVdDdFLEVBQU9rOEUsT0FDbkNYLEVBQVVELEVBQVEsU0FBVXQ3RSxFQUFPbThFLE9BQ25DakIsRUFBV0ksRUFBUSxPQUFRdDdFLEVBQU9vOEUsTUFFcEMsU0FBU2IsRUFBVUosRUFBU3Q1RSxHQUMxQixHQUFJM25CLE1BQU1nbUIsUUFBUTJCLEdBQ2xCLElBQUksSUFBSXJ1QixFQUFFLEVBQUdBLEVBQUVxdUIsRUFBUTlvQixPQUFRdkYsSUFDN0IwbkcsRUFBV0MsRUFBUSxJQUFJM25HLEVBQUdxdUIsRUFBUXJ1QixJQUd0QyxTQUFTbW9HLEVBQVdSLEVBQVN0NUUsR0FDM0IsR0FBSUEsR0FBMkIsaUJBQVRBLEVBQ3RCLElBQUksSUFBSXZzQixLQUFLdXNCLEVBQ1hxNUUsRUFBV0MsRUFBUSxJQUFJN2xHLEVBQUd1c0IsRUFBUXZzQixJQUl0QyxJQUFJeWxHLEVBQVEsR0FDUkMsRUFBTSxHQUVWLE9BREFFLEVBQVd0NUUsRUFBTTVCLEdBQ1YsSUFBSTg2RSxFQUFpQkMsRUFBT0MsSyxnS0N2RXJDLGFBQ0EsUUFNQSxPQUNBLFFBRUEsSUFBSTM0RixFQUEwQmdCLEVBQW9CdVYsRUFBcUJqSyxFQUNuRTB0RixFQUFjLEVBb0JsQixTQUFTQyxFQUFtQmh1RixHQUNWLFdBQVpBLEVBQUl2WixNQUNGa0wsU0FBU0MsdUJBQXVCLFlBQVluSCxPQUFTLEdBQ3ZENmYsRUFBSzJqRixpQkFFUCxJQUFBcDhGLGFBTUosU0FBU3E4RixFQUFrQmx1RixHQUV6QixHQUEyQixlQUF2QixJQUFBdk8sc0JBQ0dFLFNBQVMyQixlQUFlLGVBQW9DbU8sU0FDbEQsVUFBWnpCLEVBQUl2WixJQUVQLE9BRUYsTUFBTXVMLEVBQVdMLFNBQVNxRSxjQUFjLHlCQUd4QyxHQUFJaEUsRUFBVSxDQUNDTCxTQUFTcUUsY0FBYyxRQUFVaEUsRUFBU2xCLElBS2xEeVIsU0FJVCxTQUFTNHJGLEVBQWtCbnVGLEdBQ3pCLEdBQTJCLGVBQXZCLElBQUF2TyxxQkFBbUQsY0FBWnVPLEVBQUl2WixLQUFtQyxlQUFadVosRUFBSXZaLEtBQW9DLFFBQVp1WixFQUFJdlosS0FBaUJ1WixFQUFJb3VGLFNBQ3pILE9BQ0ZwdUYsRUFBSWEsaUJBRUosTUFBTTdPLEVBQVdMLFNBQVNxRSxjQUFjLHlCQUlsQ3E0RixFQUhZemlHLE1BQU02RyxLQUFLZCxTQUFTRyxpQkFBaUIsY0FHdkJzRixPQUFPdEIsR0FBcUQsT0FBOUNBLEVBQUlFLGNBQWMseUJBQzFEczRGLEVBQU1ELEVBQWNyM0YsUUFBUWhGLEdBRWxDLElBQWlCLGNBQVpnTyxFQUFJdlosS0FBb0MsUUFBWnVaLEVBQUl2WixLQUFpQnVaLEVBQUlvdUYsV0FBY0UsRUFBTSxFQUFHLEVBQy9FLElBQUF6OEYsWUFFQSxNQUFNZ0UsRUFBT3c0RixFQUFjQyxFQUFNLEdBQUd0NEYsY0FBYyx5QkFDbEQsSUFBQTlDLFdBQVUsQ0FBQzJDLEdBQTZCZCxFQUFVaEIsUUFDN0MsSUFBaUIsZUFBWmlNLEVBQUl2WixLQUFxQyxRQUFadVosRUFBSXZaLE1BQWtCdVosRUFBSW91RixXQUFjRSxFQUFNRCxFQUFjNWpHLE9BQVMsRUFBRyxFQUMvRyxJQUFBb0gsWUFFQSxNQUFNZ0UsRUFBT3c0RixFQUFjQyxFQUFNLEdBQUd0NEYsY0FBYyx5QkFDbEQsSUFBQTlDLFdBQVUsQ0FBQzJDLEdBQTZCZCxFQUFVaEIsR0FJcEQsTUFBTXc2RixFQUFrQjU4RixTQUFTcUUsY0FBYyxnQkFDM0N1NEYsR0FDRkEsRUFBZ0JDLGVBQWUsQ0FBRUMsU0FBVSxXQUkvQyxTQUFTQyxJQUNQLE1BQU1DLEVBQVloOUYsU0FBUzJCLGVBQWUsYUFDMUMsUUFBSXE3RixHQUNLQSxFQUFVMThGLFVBQVVFLFNBQVMsYUFLeEMsU0FBU3k4RixFQUFpQjV1RixHQUFvQkEsRUFBSUMsa0JBa0NsRCxTQUFTNHVGLEVBQWdCMTdGLEVBQXdCMjdGLEVBQVdDLEdBQzFELEdBQUlMLEtBQWdDLFFBQWZ2N0YsRUFBRytZLFFBQW1CLENBQ3pDLE1BQU1yVyxFQS9CVixTQUF3QjFDLEdBQ3RCLEdBQUl1N0YsSUFBZSxDQUNqQixNQUFNajNGLEVBQU16UCxPQUFPbUwsRUFBRzZFLGFBQWEsTUFBT04sRUFBTTFQLE9BQU9tTCxFQUFHNkUsYUFBYSxNQUt2RSxNQUFPLENBQUVQLE1BQUtDLE1BQUtDLElBSFBGLEVBQU16UCxPQUFRbUwsRUFBRzZFLGFBQWEsU0FBU2xQLE1BQU0sR0FBSSxJQUdyQzhPLElBRlpGLEVBQU0xUCxPQUFRbUwsRUFBRzZFLGFBQWEsVUFBVWxQLE1BQU0sR0FBSSxLQUtoRSxHQUFtQixRQUFmcUssRUFBRytZLFFBQW1CLENBQ3hCLE1BQU1ELEVBQVE5WSxFQUFHaVosV0FBMkJELFVBRTVDLE1BQU8sQ0FDTDFVLElBQUt3VSxFQUFLalMsRUFDVnRDLElBQUt1VSxFQUFLN1IsRUFDVnpDLElBQUtzVSxFQUFLalMsRUFBSWlTLEVBQUtJLE1BQ25CelUsSUFBS3FVLEVBQUs3UixFQUFJNlIsRUFBS0ssUUFJdkIsT0FBTyxJQUFBckIsY0FBYTlYLEdBVUw2N0YsQ0FBYzc3RixHQUszQixRQUFTNDdGLEVBQUcvMEYsRUFBSW5FLEVBQUs0QixLQUFPcTNGLEVBQUc5MEYsRUFBSW5FLEVBQUs4QixLQUFPbzNGLEVBQUczMEYsRUFBSXZFLEVBQUs2QixLQUFPbzNGLEVBQUcxMEYsRUFBSXZFLEVBQUsrQixLQUloRixNQUFNcTNGLEdBQU0sSUFBQWhrRixjQUFhOVgsR0FDekIsUUFBVTI3RixFQUFHOTBGLEVBQUlpMUYsRUFBSXgzRixLQUFPczNGLEVBQUcvMEYsRUFBSWkxRixFQUFJeDNGLEtBQVNxM0YsRUFBRzkwRixFQUFJaTFGLEVBQUl0M0YsS0FBT28zRixFQUFHLzBGLEVBQUlpMUYsRUFBSXQzRixLQUNwRW0zRixFQUFHMTBGLEVBQUs2MEYsRUFBSXYzRixJQUFNUixLQUFLQyxJQUFJODNGLEVBQUl4M0YsSUFBTXEzRixFQUFHOTBGLEdBQUs5QyxLQUFLaVUsSUFBSThqRixFQUFJcDNGLFNBQ3pEazNGLEVBQUczMEYsRUFBSzYwRixFQUFJdjNGLElBQU1SLEtBQUtDLElBQUk4M0YsRUFBSXgzRixJQUFNcTNGLEVBQUc5MEYsR0FBSzlDLEtBQUtpVSxJQUFJOGpGLEVBQUlwM0YsU0FDM0RpM0YsRUFBRzEwRixFQUFLNjBGLEVBQUlyM0YsSUFBTVYsS0FBS0MsSUFBSTgzRixFQUFJcjNGLElBQU1tM0YsRUFBRzMwRixHQUFLbEQsS0FBS2lVLElBQUk4akYsRUFBSXAzRixTQUN6RGszRixFQUFHMzBGLEVBQUs2MEYsRUFBSXIzRixJQUFNVixLQUFLQyxJQUFJODNGLEVBQUlyM0YsSUFBTW0zRixFQUFHMzBGLEdBQUtsRCxLQUFLaVUsSUFBSThqRixFQUFJcDNGLFNBc0N0RSxTQUFTcTNGLEVBQXdDbHZGLEdBRS9DLEdBQUtqTCxHQUF1QyxXQUEzQkEsRUFBU282RixnQkFBOEJudkYsRUFBSW91RixTQVM1RCxHQUFxQixRQUFqQmhtRyxLQUFLOGpCLFNBQTRDLGVBQXZCLElBQUF6YSxxQkFDNUIsR0FBa0MsT0FBOUJySixLQUFLc00sUUFBUSxhQUF1QixDQUN0QyxJQUFJa2pCLEVBQWtDLENBQUN4dkIsTUFHdkMsTUFBTWduRyxFQUFvQixhQUNwQkMsRUFBcUIsWUFDM0IsR0FBSWpuRyxLQUFLNFAsYUFBYSxjQUFjQyxNQUFNbzNGLEdBQXFCLENBRTdELE1BQU12NkYsRUFBSzFNLEtBQUtzTSxRQUFRLE9BQ2xCN0IsRUFBUXpLLEtBQUtzTSxRQUFRLFVBQ3JCNDZGLEVBQVUxakcsTUFBTTZHLEtBQUtJLEVBQU0rRyxVQUFVNUMsUUFBUWxDLEdBQzdDeTZGLEVBQVcxOEYsRUFBTStHLFNBQVMwMUYsRUFBVSxHQUFHMTFGLFNBQVMsR0FDdEQ3TyxRQUFReWtHLE9BQU9ELEVBQVN2M0YsYUFBYSxjQUFjQyxNQUFNbTNGLEdBQW9CLHVDQUV2QyxPQUFsQ0csRUFBUzc2RixRQUFRLGNBQ25Ca2pCLEVBQVVydEIsUUFBUWdsRyxRQUVmLEdBQUlubkcsS0FBSzRQLGFBQWEsY0FBY0MsTUFBTW0zRixHQUFvQixDQUVuRSxNQUFNdDZGLEVBQUsxTSxLQUFLc00sUUFBUSxPQUNsQjdCLEVBQVF6SyxLQUFLc00sUUFBUSxVQUNyQjQ2RixFQUFVMWpHLE1BQU02RyxLQUFLSSxFQUFNK0csVUFBVTVDLFFBQVFsQyxHQUM3QzI2RixFQUFZNThGLEVBQU0rRyxTQUFTMDFGLEVBQVUsR0FBRzExRixTQUFTLEdBQ3ZEN08sUUFBUXlrRyxPQUFPQyxFQUFVejNGLGFBQWEsY0FBY0MsTUFBTW8zRixHQUFxQix3Q0FFeEMsT0FBbkNJLEVBQVUvNkYsUUFBUSxjQUNwQmtqQixFQUFVcHRCLEtBQUtpbEcsR0FJZkMsTUFDRjkzRSxFQUFZQSxFQUFVOXZCLE9BQU84RCxNQUFNNkcsS0FBS2QsU0FBU0csaUJBQWlCLGlCQUdwRSxJQUFBb0IsV0FBVTBrQixFQUFXN2lCLEVBQVVoQixHQUUzQkEsR0FDRkEsRUFBWUksZ0JBSWQsR0FBSXU3RixJQUFpQixDQUNuQixNQU9NQyxFQU5jLENBQ2xCQyxXQUFZLFNBQ1pDLFdBQVksU0FDWkMsUUFBUyxNQUNUQyxrQkFBbUIsVUFMQ3ArRixTQUFTcUUsY0FBYyxzQkFBc0JsRixLQU9mLFlBQzlDb0IsRUFBUyxDQUFDOUosS0FBS3NNLFFBQVFpN0YsSUFFN0IsSUFBSS8zRSxFQUFZLEdBQ2hCQSxFQUFZaHNCLE1BQU02RyxLQUFLZCxTQUFTQyx1QkFBdUIsYUFDdkRnbUIsRUFBWUEsRUFBVXhnQixPQUFRakUsSUFBUWpCLEVBQU80dEUsU0FBUzNzRSxLQUV0RCxJQUFBRCxXQUFVMGtCLEVBQVc3aUIsRUFBVWhCLEdBRTNCQSxHQUNGQSxFQUFZSSxpQkFJYixHQUE0QyxTQUF2QzZMLEVBQUl6WSxPQUF1QjJrQixTQUE2QyxlQUF2QixJQUFBemEsb0JBQzNELEdBQWtDLE9BQTlCckosS0FBS3NNLFFBQVEsYUFBdUIsQ0FDdEMsSUFBSWtqQixFQUFZLENBQUM1WCxFQUFJelksUUFDakJtb0csTUFDRjkzRSxFQUFZQSxFQUFVOXZCLE9BQU84RCxNQUFNNkcsS0FBS2QsU0FBU0MsdUJBQXVCLGNBQ3hFZ21CLEVBQVlBLEVBQVUxZixJQUFNL0UsR0FDUixRQUFkQSxFQUFHK1ksUUFDRS9ZLEVBRUZBLEVBQUc2QyxjQUFjLDJCQUc1QixJQUFBOUMsV0FBVTBrQixFQUFXN2lCLEVBQVVoQixHQUMzQkEsR0FDRkEsRUFBWUksZUFFVCxDQUNMLElBQUl5akIsRUFBWSxHQUNoQixHQUFJODNFLElBQWlCLENBQ25CLE1BQU14OUYsRUFBUyxDQUFDOUosTUFDaEJ3dkIsRUFBWWhzQixNQUFNNkcsS0FBS2QsU0FBU0MsdUJBQXVCLGFBQ3ZEZ21CLEVBQVlBLEVBQVUxZixJQUFNL0UsR0FDUixRQUFkQSxFQUFHK1ksUUFDRS9ZLEVBRUZBLEVBQUc2QyxjQUFjLHlCQUUxQjRoQixFQUFZQSxFQUFVeGdCLE9BQVNqRSxJQUNyQmpCLEVBQU80dEUsU0FBUzNzRSxLQUUxQixJQUFBRCxXQUFVMGtCLEVBQVc3aUIsRUFBVWhCLEdBQzNCQSxHQUNGQSxFQUFZSSxnQkFJYixDQUNMLEdBQTJCLGdCQUF2QixJQUFBMUMsb0JBRUYsWUFEQTZZLEVBQUsyakYsZ0JBS0Z5QixNQUNILElBQUE3OUYsWUFHRixNQUFNaUMsR0FBUSxJQUFBazhGLGtCQUFpQmh3RixFQUFJcUwsUUFBU3JMLEVBQUlzTCxTQUVoRCxJQUFLeFgsRUFBTyxPQUVQQSxFQUFNN0IsVUFBVUUsU0FBUyxlQUU1QixJQUFBMEIsYUFBWUMsRUFBT0MsSUFDbkIsSUFBQWdDLFFBQU9qQyxFQUFPaUIsRUFBVWhCLEdBQ3BCQSxHQUNGQSxFQUFZSSxZQUloQkwsRUFBTW04RixjQUFjLElBQUlDLFdBQVcsWUFBYSxDQUM5Q0MsUUFBU253RixFQUFJbXdGLFFBQ2JDLFFBQVNwd0YsRUFBSW93RixRQUNiL2tGLFFBQVNyTCxFQUFJcUwsUUFDYkMsUUFBU3RMLEVBQUlzTCxRQUNiK2tGLFFBQVNyd0YsRUFBSXF3RixRQUNiakMsU0FBVXB1RixFQUFJb3VGLFNBQ2RrQyxPQUFRdHdGLEVBQUlzd0YsT0FDWmx1RixRQUFTcEMsRUFBSW9DLFFBQ2JsTixLQUFNOEssRUFBSTlLLFFBMUlkLFNBQVN3NkYsSUFDUCxPQUFPditGLE9BQU9rakQsVUFBVUMsVUFBVXI4QyxNQUFNLE9BQVMrSCxFQUFJb0MsUUFBVXBDLEVBQUlxd0YsU0FwTHZFLGdDQUFzQ2hrRixHQUNwQzBoRixFQUFjMWhGLEdBTWhCLGtDQUF3Q2trRixFQUFjQyxHQUNwRHo4RixFQUFjeThGLEVBQ2R6N0YsRUFBV3c3RixFQUNYam1GLEVBQU92VixFQUFTdVYsS0FDaEJqSyxFQUFjdEwsRUFBU0csS0FBS21MLGFBbUk5Qix1QkFBNkI2VyxHQUMzQnZsQixTQUFTRyxpQkFBaUJvbEIsR0FBVW5sQixRQUFRMCtGLElBQzFDQSxFQUFJcmtHLG9CQUFvQixZQUFhOGlHLEdBQ3JDdUIsRUFBSXhrRyxpQkFBaUIsWUFBYWlqRyxLQUlwQ3Y5RixTQUFTbU8sS0FBSzFULG9CQUFvQixVQUFXNGhHLEdBQzdDcjhGLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFVBQVcraEcsR0FFMUNyOEYsU0FBU21PLEtBQUsxVCxvQkFBb0IsVUFBVzhoRyxHQUM3Q3Y4RixTQUFTbU8sS0FBSzdULGlCQUFpQixVQUFXaWlHLEdBRTFDdjhGLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFVBQVcraEcsR0FDN0N4OEYsU0FBU21PLEtBQUs3VCxpQkFBaUIsVUFBV2tpRyxHQUUxQ3g4RixTQUFTMkIsZUFBZSxhQUNyQnJILGlCQUFpQixjQUFnQitULElBQVVBLEVBQUlhLG1CQUVsRGxQLFNBQVNHLGlCQUFpQixzQkFBc0JDLFFBQVEwK0YsSUFDdERBLEVBQUlya0csb0JBQW9CLFFBQVN3aUcsR0FDakM2QixFQUFJeGtHLGlCQUFpQixRQUFTMmlHLE1BbUtsQyxzQkFBNEIxM0UsR0FDMUIsSUFBSXc1RSxFQUFXLEVBQ1gzeEUsRUFBVyxFQUNYNHhFLEdBQVUsRUFDVkMsR0FBZ0IsRUFHcEIsTUFBTUMsRUFBUzU5RixFQUFHcUIsT0FBTzRpQixHQXVLekJqa0IsRUFBR0MsVUFBVWdrQixFQUFTOVQsUUFBUSxlQUFnQixJQUFJQyxRQUMvQ2xhLEdBQUcsUUFBUyxNQUNmLE1BQU0ybkcsRUFBbUI3OUYsRUFBR29rQixPQUN6Qmx1QixHQUFHLFNBbElOLFdBQ0UsSUFBSzRMLEVBQVUsT0FDZixNQUFNOUUsRUFBVzhFLEVBQVNvNkYsY0FDMUIsR0FBNkMsUUFBekNsOEYsRUFBR3FrQixNQUFNRyxZQUFZbHdCLE9BQU93cEcsVUFBbUMsV0FBYjlnRyxHQUFrRSxTQUF6Q2dELEVBQUdxa0IsTUFBTUcsWUFBWWx3QixPQUFPd3BHLFVBQ3pHLEdBQUs5OUYsRUFBR3FrQixNQUFNRyxZQUFZMjJFLFNBV3hCdUMsR0FBVSxPQUNVcm5HLElBQWhCK1csR0FDRkEsRUFBWTJ3RixpQkFaZCxJQUFLci9GLFNBQVMyQixlQUFlLGNBQWNyQixVQUFVRSxTQUFTLGVBdkMxQ29aLEVBd0NGdFksRUFBR210QixNQUFNaDRCLE1BMUJILElBYmJ3RCxNQUFNNkcsS0FBS2QsU0FBU0MsdUJBQXVCLFVBQ2xDd0YsT0FBUXRELElBQzlCLE1BQU0rQixHQUFPLElBQUFvVixjQUFhblgsR0FDcEIyRCxFQUFNNUIsRUFBSzRCLElBQ1hDLEVBQU03QixFQUFLNkIsSUFDWEMsRUFBTTlCLEVBQUs4QixJQUNYQyxFQUFNL0IsRUFBSytCLElBQ1hDLEVBQVNoQyxFQUFLZ0MsT0FFcEIsT0FBUTBULEVBQUcsR0FBSzlULEdBQU84VCxFQUFHLEdBQUs1VCxHQUM1QjRULEVBQUcsR0FBTTdULEdBQU82VCxFQUFHLEdBQUs5VCxHQUFPUCxLQUFLaVUsSUFBSXRULElBQ3hDMFQsRUFBRyxHQUFNM1QsR0FBT0QsRUFBTTRULEVBQUcsSUFBTXJVLEtBQUtpVSxJQUFJdFQsS0FFNUJwTixRQTBCc0IsRUFDakMsSUFBQW9ILFlBQ0ErK0YsR0FBZ0IsRUFDaEIsTUFBTUssRUFBV2grRixFQUFHbXRCLE1BQU1oNEIsTUFDMUJzb0csRUFBV08sRUFBUyxHQUNwQmx5RSxFQUFXa3lFLEVBQVMsR0F2QlR4NUYsRUF3QkZpNUYsRUF4QmVoNUYsRUF3QkxxbkIsRUF2QnpCOHhFLEVBQU9qMUYsT0FBTyxRQUNYd0YsS0FBSyxJQUFLM0osR0FDVjJKLEtBQUssSUFBSzFKLEdBQ1YwSixLQUFLLFFBQVMsR0FDZEEsS0FBSyxTQUFVLEdBQ2ZBLEtBQUssS0FBTSxjQUNYQSxLQUFLLFNBQVUsU0FDZkEsS0FBSyxlQUFnQjJzRixHQUNyQjNzRixLQUFLLE9BQVEsY0F1QkxuTyxFQUFHcWtCLE1BQU1HLFlBQVkyMkUsV0FDOUJ1QyxHQUFVLE9BQ1VybkcsSUFBaEIrVyxHQUNGQSxFQUFZMndGLGFBbkNsQixJQUFtQnY1RixFQUFhQyxFQXRCTjZULEtBcUt2QnBpQixHQUFHLFFBOUVOLFdBQ0UsSUFBS3duRyxHQUFXQyxFQUFlLENBQzdCLE1BQU1NLEVBQVlqK0YsRUFBR210QixNQUFNaDRCLE1BQ3JCK29HLEVBQU9ELEVBQVUsR0FDakJFLEVBQU9GLEVBQVUsSUF0QjNCLFNBQXFCRyxFQUFjQyxFQUFjQyxFQUFzQkMsR0FDckV2K0YsRUFBR3FCLE9BQU8sZUFDUDhNLEtBQUssSUFBS2l3RixHQUNWandGLEtBQUssSUFBS2t3RixHQUNWbHdGLEtBQUssUUFBU213RixHQUNkbndGLEtBQUssU0FBVW93RixHQXdCaEJDLENBTGFOLEVBQU9ULEVBQVdTLEVBQU9ULEVBQ3pCVSxFQUFPcnlFLEVBQVdxeUUsRUFBT3J5RSxFQUN4Qm95RSxFQUFPVCxFQUFXQSxFQUFXUyxFQUFPQSxFQUFPVCxFQUMxQ1UsRUFBT3J5RSxFQUFXQSxFQUFXcXlFLEVBQU9BLEVBQU9yeUUsUUFHakQ0eEUsUUFDV3JuRyxJQUFoQitXLEdBQ0ZBLEVBQVlxWCxjQWlFZnZ1QixHQUFHLE9BNUROLFdBQ0UsSUFBS3duRyxHQUFXQyxFQUFlLENBQzdCLE1BQU1jLEVBQWEvL0YsU0FBUzJCLGVBQWUsY0FDckNxK0YsRUFBSy93RixTQUFTOHdGLEVBQVcxNUYsYUFBYSxNQUN0QzQ1RixFQUFLaHhGLFNBQVM4d0YsRUFBVzE1RixhQUFhLE1BQ3RDNjVGLEVBQUtGLEVBQUsvd0YsU0FBUzh3RixFQUFXMTVGLGFBQWEsVUFDM0M4NUYsRUFBS0YsRUFBS2h4RixTQUFTOHdGLEVBQVcxNUYsYUFBYSxXQUczQzIyQixFQUFPa2lFLEVBQU9saUUsT0FDcEIsSUFBSW1nRSxFQUFLLElBQUl0akYsU0FBU21tRixFQUFJQyxHQUFLN0MsRUFBSyxJQUFJdmpGLFNBQVNxbUYsRUFBSUMsR0FDckQsTUFBTXo3QixFQUFZMW5DLEVBQUtoakIsZUFBZUMsVUFDbkNvdkUsU0FBVTZWLEVBQU92OEYsT0FBTyxXQUFXcTZCLE9BQThCaGpCLGdCQUNqRUMsVUFDSGtqRixFQUFLQSxFQUFHcGpGLGdCQUFnQjJxRCxHQUN4QjA0QixFQUFLQSxFQUFHcmpGLGdCQUFnQjJxRCxHQUd4QixNQUVNMDdCLEVBakRWLFNBQWdDNzZFLEdBQzlCLE9BQUl2bEIsU0FBUzJCLGVBQWUsY0FBY3JCLFVBQVVFLFNBQVMsYUFDcER2RyxNQUFNNkcsS0FBS2QsU0FBU0csaUJBQWlCb2xCLEVBQVcsU0FBV0EsRUFBVyxZQUUzRXczRSxJQUNLOWlHLE1BQU02RyxLQUFLZCxTQUFTRyxpQkFBaUJvbEIsRUFBVywwQkFFbER0ckIsTUFBTTZHLEtBQUtkLFNBQVNHLGlCQUFpQm9sQixFQUFXLFNBd0NwQzg2RSxDQUFzQjk2RSxHQUVMOWYsT0FBT2pFLEdBQU0wN0YsRUFBZ0IxN0YsRUFBSTI3RixFQUFJQyxJQUd2RWdELEVBQWlCaGdHLFFBQVNMLElBQ3hCLEdBQXdCLFFBQXBCQSxFQUFRd2EsU0FBcUJ4YSxFQUFRc0csYUFBYSxjQUFjQyxNQUFNLGtCQUFtQixDQUMzRixNQUFNcEYsRUFBUW5CLEVBQVFnRCxRQUFRLFVBQ3hCNDZGLEVBQVUxakcsTUFBTTZHLEtBQUtJLEVBQU0rRyxVQUFVNUMsUUFBUXRGLEVBQVFnRCxRQUFRLFFBQ25FLEdBQUloRCxFQUFRc0csYUFBYSxjQUFjQyxNQUFNLGNBQWUsQ0FFMUQsTUFDTXczRixFQURXNThGLEVBQU0rRyxTQUFTMDFGLEVBQVUsR0FDZnQ1RixjQUFjLE9BQ3JDKzdGLEVBQWlCLzZGLFFBQVF5NEYsR0FBYSxHQUN4Q3NDLEVBQWlCdm5HLEtBQUtpbEcsT0FFbkIsQ0FFTCxNQUNNRixFQURVMThGLEVBQU0rRyxTQUFTMDFGLEVBQVUsR0FDaEJ0NUYsY0FBYyxPQUNuQys3RixFQUFpQi82RixRQUFRdTRGLEdBQVksR0FDdkN3QyxFQUFpQnZuRyxLQUFLK2tHLFFBSzlCLElBQUFyOEYsV0FBVTYrRixFQUFrQmg5RixFQUFVaEIsR0FFbENBLEdBQ0ZBLEVBQVlJLFdBRWRsQixFQUFHQyxVQUFVLGVBQWVoQixTQUM1QjArRixHQUFnQixFQUVsQkQsR0FBVSxLQVNaRSxFQUFPeHJHLEtBQUt5ckcsR0FDUi84RixHQUNGQSxFQUFZaytGLFFBQVFuQixLLDhNQy9nQnhCLGNBQ0EsUUFDQSxPQWtCQSxTQUFTb0IsRUFBZXg5RSxFQUFjSCxHQUNwQyxJQUFLLE1BQU1uVCxLQUFRc1QsRUFBSTFmLFdBQ3JCdWYsRUFBSTNoQixhQUFhd08sRUFBSzNiLEtBQU0yYixFQUFLamIsT0E2TXJDLFNBQWdCZ3NHLEVBQWdCeDNFLEcsTUFDOUIsTUFBTTdrQixFQUFtQyxRQUE3QixFQUFBNmtCLEVBQVMza0IsY0FBYyxjQUFNLGVBQUVvOEYsV0FBVyxHQUN0RCxJQUFJQyxFQU9KLE9BTEVBLEVBREV2OEYsRUFDUUEsRUFBSXc4RixVQUVKLElBR0xELEVBTVQsU0FBZ0JFLEVBQ2RDLEVBQ0FDLEdBRUEsTUFBTTk2RixFQUFNaUosU0FBUzZ4RixFQUFLejZGLGFBQWEsUUFDakNKLEVBQU1nSixTQUFTNnhGLEVBQUt6NkYsYUFBYSxRQUNqQ1AsRUFBTW1KLFNBQVM2eEYsRUFBS3o2RixhQUFhLFFBQ2pDTixFQUFNa0osU0FBUzZ4RixFQUFLejZGLGFBQWEsUUFFakMwNkYsRUFBb0IsSUFBUi82RixHQUFxQixJQUFSQyxHQUFxQixJQUFSSCxHQUFxQixJQUFSQyxFQUNuRGk3RixFQUF5Qmg3RixFQUFNLEdBQUtDLEVBQU0sR0FBS0gsRUFBTSxHQUFLQyxFQUFNLEVBRWhFaEcsRUFBVThnRyxFQUFJeDhGLGNBQ2xCLFdBQVcsSUFBTXk4RixFQUFLejZGLGFBQWEsZUFFckMsT0FBSTA2RixHQUFhQyxJQUEyQmpoRyxFQUFnQixFQUFDLEVBQU1BLEdBQzVELEVBQUMsR0EwYVYsU0FBU2toRyxFQUNQajRFLEVBQ0FELEVBQ0FSLEdBR0EsTUFBTVcsRUFBaUJGLEVBQVMzaUIsYUFBYSxZQUFZb0wsUUFBUSxJQUFLLElBR3RFLElBQUkwWCxFQUNKLE1BQU1DLEVBQWViLEVBQVVsVSxLQUFLLENBQUN0VSxFQUFTZ3BCLElBQ3hDaHBCLEVBQVFzRyxhQUFhLFlBQWM2aUIsSUFDckNDLEVBQWtCSixHQUNYLElBT1gsSUFBS0ssRUFDSCxNQUFPLFNBQVNKLEVBQVN6TyxnQkFBZ0JpbUYsRUFDdkN4M0Usb0JBQ2lCQSxFQUFTM2lCLGFBQzFCLDRDQUtKLElBQUsraUIsRUFBYWpELGFBQWEsV0FDN0IsTUFBTyxtQ0FDTDZDLEVBQVN6TyxnQkFDRmltRixFQUFnQngzRSxvQkFBMkJBLEVBQVMzaUIsYUFDM0QsNENBS0osR0FDRStpQixFQUFhL2lCLGFBQWEsWUFDMUIsSUFBTTJpQixFQUFTM2lCLGFBQWEsVUFFNUIsTUFBTyxtQ0FDTDJpQixFQUFTek8sZ0JBQ0ZpbUYsRUFBZ0J4M0Usb0JBQTJCQSxFQUFTM2lCLGFBQzNELDhDQU9KLEdBQUk4aUIsSUFBb0JKLEVBQU0sRUFBRyxDQUMvQixNQUtNbTRFLEVBQVcsQ0FMRFYsRUFBZ0J4M0UsTUFDTFQsRUFDeEJweEIsTUFBTTR4QixFQUFNLEVBQUdJLEdBQ2Y1aUIsSUFBS3lpQixHQUFhdzNFLEVBQWdCeDNFLEtBRWExUyxLQUFLLE9BQ3ZELE1BQU8scURBQ0wwUyxFQUFTek8sZ0JBQ0YybUYsbUJBQTBCbDRFLEVBQVMzaUIsYUFDMUMsK0NBS04sU0FBUzg2RixFQUFxQm40RSxFQUFtQlQsR0FDL0MsTUFBTWMsRUFBaUJMLEVBQVMzaUIsYUFBYSxXQUFXb0wsUUFBUSxJQUFLLElBQy9ENlgsRUFBZWYsRUFBVWxVLEtBQzVCMlUsR0FBYUEsRUFBUzNpQixhQUFhLFlBQWNnakIsR0FJcEQsT0FBS0MsRUFTQUEsRUFBYW5ELGFBQWEsWUFVN0JtRCxFQUFhampCLGFBQWEsYUFDMUIsSUFBTTJpQixFQUFTM2lCLGFBQWEsVUFFckIsbUNBQ0wyaUIsRUFBU3pPLGdCQUNGaW1GLEVBQ1BsM0Usb0JBQ2lCTixFQUFTM2lCLGFBQzFCLG1EQVRKLEVBUlMsbUNBQ0wyaUIsRUFBU3pPLGdCQUNGaW1GLEVBQWdCeDNFLG9CQUEyQkEsRUFBUzNpQixhQUMzRCw0Q0FaSyxTQUFTMmlCLEVBQVN6TyxnQkFBZ0JpbUYsRUFDdkN4M0Usb0JBQ2lCQSxFQUFTM2lCLGFBQzFCLDRDQTRCTixTQUFTKzZGLEVBQWFwNEUsR0FDcEIsTUFBTWdCLEVBQU1oQixFQUFTN29CLGlCQUFpQixNQUN0QyxJQUFJa2hHLEVBQVEsRUFDUjFvRixFQUFPLEdBQ1gsS0FBTzBvRixFQUFRcjNFLEVBQUlseEIsUUFDYmt4QixFQUFJcTNFLEdBQU9oN0YsYUFBYSxjQUV2Qmc3RixFQUFRcjNFLEVBQUlseEIsT0FBUyxJQUFNa3hCLEVBQUlxM0UsRUFBUSxHQUFHaDdGLGFBQWEsWUFDeERnN0YsR0FBU3IzRSxFQUFJbHhCLE9BQVMsS0FJdEI2ZixHQUFRLDhCQUE4QjZuRixFQUNwQ3gzRSxvQkFDaUJBLEVBQVMzaUIsYUFBYSxlQUUzQ2c3RixHQUFTLEdBRVhBLEdBQVMsRUFHWCxPQUFPMW9GLEVBb0JULFNBQVMyb0YsRUFBb0J2aEcsRUFBa0JsQyxHQUN6Q2tDLEVBQVFvbUIsYUFBYSxTQUFTdG9CLEVBQU1oRixLQUFLa0gsR0FDN0MsSUFBSyxNQUFNb2YsS0FBU3BmLEVBQVFrSSxTQUUxQnE1RixFQUFvQm5pRixFQUFPdGhCLEdBRTdCLE9BQU9BLEVBN3pCVCxlQUF1QjBqRyxFQUFrQkMsR0FDdkMsTUFBTS9yRixFQUFTLEdBQ2YsSUFDRSxJQUFJbGlCLEVBQUksRUFDUkEsR0FBS2d1RyxFQUFPem9HLE9BQVMwb0csRUFBTzFvRyxPQUFTMG9HLEVBQU8xb0csT0FBU3lvRyxFQUFPem9HLFFBQzVEdkYsSUFFQWtpQixFQUFPNWMsS0FBSyxDQUFDMG9HLEVBQU9odUcsR0FBSWl1RyxFQUFPanVHLEtBRWpDLE9BQU9raUIsR0FTVCx5QkFBOEJnc0YsR0FDNUIsTUFBTXZwRSxFQUFTLElBQUl3cEUsVUFDYkMsRUFBYSxJQUFJQyxjQUNqQkMsRUFBUzNwRSxFQUFPNHBFLGdCQUFnQkwsRUFBZSxZQUMvQ1osRUFBTWdCLEVBQU9wTCxnQkFDbkIsSUFBSXNMLEVBQU8sRUFFWCxNQUFNQyxFQUFXL25HLE1BQU02RyxLQUNyQisvRixFQUFJMWdHLGlCQUFpQiwwQ0FFdkIsSUFBSyxNQUFNOGhHLEtBQVdELEVBQVUsQ0FFbEJDLEVBQVE5aEcsaUJBQWlCLE1BQ2pDQyxRQUFTOGhHLEdBQU9BLEVBQUczaEcsVUFDWDBoRyxFQUFROWhHLGlCQUFpQixNQUNqQ0MsUUFBUytoRyxHQUFPQSxFQUFHNWhHLFVBRXZCLE1BQU02aEcsRUFBV1AsRUFBT1EsZ0JBQ3RCLHVDQUNBLFNBRUlDLEVBQVdULEVBQU9RLGdCQUN0Qix1Q0FDQSxTQUVGRCxFQUFTbmhHLGFBQWEsSUFBSyxLQUMzQnFoRyxFQUFTcmhHLGFBQWEsSUFBSyxLQUMzQm1oRyxFQUFTbjJFLFlBQVlxMkUsR0FHckIsTUFBTUMsRUFBVTFCLEVBQUl4OEYsY0FBYyxXQUM1Qm0rRixFQUFZRCxFQUFRbDhGLGFBQWEsVUFDakM2N0YsRUFBS0wsRUFBT1EsZ0JBQ2hCLHVDQUNBLE1BRUZILEVBQUdqaEcsYUFBYSxTQUFVLE1BQU8sSUFBQW9JLFdBQ2pDNjRGLEVBQUdqaEcsYUFBYSxPQUFRLElBQU11aEcsR0FDOUJGLEVBQVNyMkUsWUFBWWkyRSxHQUVyQixNQUFNTyxFQUF3QnhvRyxNQUFNNkcsS0FDbENtaEcsRUFBUTloRyxpQkFBaUIsb0NBRTNCLElBQUl1aUcsRUFBUyxFQUNUQyxFQUFrQixLQUV0QixJQUFLLE1BQU1DLEtBQXdCSCxFQUF1QixDQUN4REMsR0FBVSxFQUNWLE1BQU12Z0csRUFBUXlnRyxFQUFxQnYrRixjQUFjLFNBQ2pELElBQUtsQyxFQUFPLENBQ1Z5Z0csRUFBcUJyaUcsU0FDckIsU0FFRixNQUFNc2lHLEVBQVExZ0csRUFBTWtDLGNBQWMsU0FJbEMsR0FDRWxDLEVBQU1na0IsYUFBYSxTQUNuQmhrQixFQUFNa0UsYUFBYSxTQUFXLFNBQVcwN0YsRUFBS3oxRixXQUM5QyxDQUNBeTFGLEdBQVEsRUFDUixNQUFNeGpGLEVBQUtzakYsRUFBT1EsZ0JBQ2hCLHVDQUNBLE1BRUY5akYsRUFBR3RkLGFBQWEsSUFBSzhnRyxFQUFLejFGLFlBQzFCaVMsRUFBR3RkLGFBQWEsU0FBVSxNQUFPLElBQUFvSSxXQUNqQ2tWLEVBQUd0ZCxhQUFhLE9BQVEsT0FBUSxJQUFBb0ksV0FDaENpNUYsRUFBU3IyRSxZQUFZMU4sR0FHakJva0YsR0FDRkcsRUFBb0JILEVBQVFwa0YsRUFBSWdrRixHQUVsQ0ksRUFBU3BrRixFQUdYLE1BQU00akYsRUFBS04sRUFBT1EsZ0JBQ2hCLHVDQUNBLE1BRUZGLEVBQUdsaEcsYUFBYSxJQUFLeWhHLEVBQU9wMkYsWUFDNUI2MUYsRUFBR2xoRyxhQUFhLE9BQVFrQixFQUFNa0UsYUFBYSxTQUMzQzg3RixFQUFHbGhHLGFBQWEsU0FBVWtCLEVBQU1rRSxhQUFhLFdBRzdDLElBQUkwOEYsT0FBa0JwckcsRUFZdEIsSUFWZ0MsT0FBOUIycUcsRUFBU1Usa0JBQzZCLFdBQXRDVixFQUFTVSxpQkFBaUJ6b0YsVUFFMUJ3b0YsRUFBU1QsRUFBUzlMLFlBQVk4TCxFQUFTVSx3QkFHMUJyckcsSUFBWG9yRyxHQUFzQlQsRUFBU3IyRSxZQUFZODJFLEdBQy9DVCxFQUFTcjJFLFlBQVlrMkUsR0FHYyxPQUE1QlUsRUFBTUksbUJBQ1hYLEVBQVNyMkUsWUFBWTQyRSxFQUFNSSxtQkFFN0JMLEVBQXFCcmlHLFNBSW5Cb2lHLEdBQ0ZHLEVBQW9CSCxFQUFRLEtBQU1KLEdBRXBDTixFQUFRaDJFLFlBQVltMkUsR0FJdEIsR0FBSUwsRUFBTSxDQUNSLE1BQU1tQixFQUFXckMsRUFBSXg4RixjQUFjLFlBQzdCOCtGLEVBQVl0QixFQUFPUSxnQkFDdkIsdUNBQ0EsYUFFRmMsRUFBVWxpRyxhQUFhLFNBQVUsTUFBTyxJQUFBb0ksV0FDeEM4NUYsRUFBVWxpRyxhQUFhLElBQUs4Z0csRUFBS3oxRixZQUNqQzQyRixFQUFTRSxzQkFBc0IsV0FBWUQsR0FHN0MsT0FBT25QLEVBQVdLLElBQUlzTixFQUFXMEIsa0JBQWtCeEIsSUFFbkQsU0FBU2lCLEVBQ1BRLEVBQ0FDLEVBQ0FoQixHQUdBLE1BQU1pQixFQXFCUixTQUFTQyxFQUNQMWpHLEVBQ0F3akcsRUFDQUMsRUFBa0IsSUFFbEIsR0FBSXpqRyxHQUFXQSxJQUFZd2pHLEVBQVksQ0FJckMsR0FGSXhqRyxFQUFRb21CLGFBQWEsU0FBU3E5RSxFQUFnQjNxRyxLQUFLa0gsR0FFbkRBLEVBQVFrSSxTQUFTblAsT0FBUyxFQUM1QixJQUFLLE1BQU1xbUIsS0FBU3BmLEVBQVFrSSxTQUMxQnc3RixFQUEyQnRrRixFQUFPb2tGLEVBQVlDLEdBSTlDempHLEVBQVEyakcsb0JBQ1ZELEVBQ0UxakcsRUFBUTJqRyxtQkFDUkgsRUFDQUMsR0FLTixPQUFPQSxFQTdDaUJDLENBQ3RCSCxFQUFhSSxtQkFDYkgsR0FJSXpDLEVBQU9lLEVBQU9RLGdCQUNsQix1Q0FDQSxRQUVJc0IsRUFzQ1IsU0FBdUI5L0YsRUFBcUIwK0YsR0FDMUMsSUFBSXY4RixFQUFNa29DLElBQ05qb0MsRUFBTSxFQUNOSCxFQUFNLEVBQ05DLEVBQU1tb0MsSUFhVixPQVhBcnFDLEVBQVN6RCxRQUFTTCxJQUNoQixNQUFNK2dHLEVBQU83bUcsTUFBTTZHLEtBQUt5aEcsRUFBUXQ2RixVQUFVb00sS0FDdkN5c0YsR0FDQ0EsRUFBS3o2RixhQUFhLFlBQWN0RyxFQUFRc0csYUFBYSxRQUFRbFAsTUFBTSxJQUV2RTZPLEVBQU1ULEtBQUtrQixJQUFJVCxFQUFLaUosU0FBUzZ4RixFQUFLejZGLGFBQWEsU0FDL0NKLEVBQU1WLEtBQUttQixJQUFJVCxFQUFLZ0osU0FBUzZ4RixFQUFLejZGLGFBQWEsU0FDL0NQLEVBQU1QLEtBQUttQixJQUFJWixFQUFLbUosU0FBUzZ4RixFQUFLejZGLGFBQWEsU0FDL0NOLEVBQU1SLEtBQUtrQixJQUFJVixFQUFLa0osU0FBUzZ4RixFQUFLejZGLGFBQWEsV0FHMUMsQ0FBRUwsTUFBS0MsTUFBS0gsTUFBS0MsT0F2RFg2OUYsQ0FBY0osRUFBaUJqQixHQUM1Q3pCLEVBQUs3L0YsYUFBYSxNQUFPMGlHLEVBQUszOUYsSUFBSXNHLFlBQ2xDdzBGLEVBQUs3L0YsYUFBYSxNQUFPMGlHLEVBQUsxOUYsSUFBSXFHLFlBQ2xDdzBGLEVBQUs3L0YsYUFBYSxNQUFPMGlHLEVBQUs3OUYsSUFBSXdHLFlBQ2xDdzBGLEVBQUs3L0YsYUFBYSxNQUFPMGlHLEVBQUs1OUYsSUFBSXVHLFlBQ2xDdzBGLEVBQUs3L0YsYUFBYSxTQUFVcWlHLEVBQWFqOUYsYUFBYSxRQUFRbFAsTUFBTSxJQUdwRW9yRyxFQUFRc0IsYUFBYS9DLEVBQU15QixFQUFRVSxxQkFtRHZDLG9CQWVBLGtCQTRCQSw0QkFBaUNhLEdBQy9CLE1BQ01qQyxHQURTLElBQUlILFdBQ0dJLGdCQUFnQmdDLEVBQVksWUFDNUNqRCxFQUFNZ0IsRUFBT3BMLGdCQUNuQixJQUFJc04sR0FBVSxFQUVJbEQsRUFBSXg4RixjQUFjLGFBQzFCcEQsYUFBYSxPQUFRLGlCQUkvQixNQUFNc2hHLEVBQVUxQixFQUFJeDhGLGNBQWMsV0FDbEMsSUFBSTIvRixHQUFpQixFQUNyQixNQUFNQyxFQUFRaHFHLE1BQU02RyxLQUFLeWhHLEVBQVEyQixxQkFBcUIsU0FDdEQsSUFBSUMsRUFBbUIsd0NBQ3ZCLElBQUssTUFBTXJELEtBQVFtRCxFQUFPLENBQ3hCLE1BQU9HLEVBQVdya0csR0FBVzZnRyxFQUFjQyxFQUFLQyxHQUM1Q3NELElBQ0ZKLEdBQWlCLEVBQ2pCRyxHQUFvQix1QkFBdUJyRCxFQUFLejZGLGFBQWEsYUFFekR0RyxHQUNGQSxFQUFRMGEsV0FBVys3RSxZQUFZejJGLEdBQy9Cb2tHLEdBQW9CLFdBQ2xCcGtHLEVBQVF3YSw0QkFDV3hhLEVBQVFzRyxhQUFhLGVBRTFDODlGLEdBQW9CLGtDQUV0QnJELEVBQUtybUYsV0FBVys3RSxZQUFZc0ssSUFHNUJrRCxHQUNGOTZGLEVBQWFtQixrQkFDWCwrQ0FDQSxVQUNBODVGLEdBTUosTUFBTWhCLEVBQVl0QyxFQUFJeDhGLGNBQWMsYUFDaEM4K0YsSUFDRlksR0FBVSxFQUNWWixFQUFVMW9GLFdBQVcrN0UsWUFBWTJNLElBTW5DLE1BQU01NkUsRUFBWXR1QixNQUFNNkcsS0FBSysvRixFQUFJcUQscUJBQXFCLGFBQ3RELElBQUlHLEdBQW1CLEVBQ25CQyxHQUFnQixFQUNoQkMsR0FBb0IsRUFDcEJDLEVBQ0YsNkVBQ0VDLEdBQWtCLEVBQ2xCQyxFQUNGLDJFQUNFQyxFQUFvQixpREFDcEJDLEVBQWlCLHdEQUNyQixJQUFLLE1BQU01N0UsS0FBWVQsRUFBVyxDQUNzQixJQUFsRFMsRUFBU2s3RSxxQkFBcUIsU0FBU3ByRyxTQUN6Q3VyRyxHQUFtQixFQUNuQk0sR0FBcUIsU0FDbkIzN0UsRUFBU3pPLDRCQUNVeU8sRUFBUzNpQixhQUFhLGNBQ3ZDMmlCLEVBQVNrN0UscUJBQXFCLFdBQVdwckcsT0FBUyxJQUNwRHlyRyxHQUFvQixFQUNwQkMsR0FBc0IsMERBQTBEeDdFLEVBQVMzaUIsYUFDdkYsZUFHQTJpQixFQUFTazdFLHFCQUFxQixTQUFTcHJHLE9BQVMsSUFDbEQyckcsR0FBa0IsRUFDbEJDLEdBQW9CLHdEQUF3RDE3RSxFQUFTM2lCLGFBQ25GLGdCQU1OLE1BQU13K0YsRUFBUzc3RSxFQUFTazdFLHFCQUFxQixTQUM3QyxJQUFLLE1BQU1oakcsS0FBUzJqRyxFQUFRLENBQzFCLE1BQU03NkUsRUFBTS92QixNQUFNNkcsS0FBS0ksRUFBTWdqRyxxQkFBcUIsT0FDbEQsR0FBbUIsSUFBZmw2RSxFQUFJbHhCLE9BQ053ckcsR0FBZ0IsRUFDaEJNLEdBQWtCLFNBQ2hCMWpHLEVBQU1xWiw0QkFDYXJaLEVBQU1tRixhQUFhLG1CQUl4QyxJQUFLLE1BQU1sRCxLQUFNNm1CLEVBQ2YsR0FBSTdtQixFQUFHZ2pCLGFBQWEsVUFBbUMsSUFBdkJoakIsRUFBRzhFLFNBQVNuUCxPQUFjLENBQ3hELE1BQU1nc0csRUFBTWpELEVBQU9RLGdCQUNqQix1Q0FDQSxjQUVGeUMsRUFBSTdqRyxhQUFhLFNBQVUsTUFBTyxJQUFBb0ksV0FDbENsRyxFQUFHOG9CLFlBQVk2NEUsS0FPckJULEdBQ0ZuN0YsRUFBYW1CLGtCQUNYLGdEQUNBLFVBQ0FzNkYsR0FHQUwsR0FDRnA3RixFQUFhbUIsa0JBQ1gsdURBQ0EsVUFDQXU2RixHQUdBTCxHQUNGcjdGLEVBQWFtQixrQkFDWCwwREFDQSxVQUNBbTZGLEdBR0FDLEdBQ0Z2N0YsRUFBYW1CLGtCQUNYLHdEQUNBLFVBQ0FxNkYsR0FLSixNQUFNMUMsRUFBVy9uRyxNQUFNNkcsS0FBSysvRixFQUFJcUQscUJBQXFCLFlBQ3JELElBQUssTUFBTWpDLEtBQVdELEVBQVUsQ0FHOUIsTUFBTStDLEVBQWlCOXFHLE1BQU02RyxLQUFLbWhHLEVBQVFpQyxxQkFBcUIsVUFDL0QsSUFBSyxNQUFNL2hHLEtBQVM0aUcsRUFBZ0IsQ0FFbEMsTUFBTUMsRUFBUW5ELEVBQU9RLGdCQUNuQix1Q0FDQSxNQUVGMkMsRUFBTS9qRyxhQUFhLE9BQVEsSUFBTXNoRyxFQUFRbDhGLGFBQWEsV0FDdEQ0N0YsRUFBUTRCLGFBQWFtQixFQUFPN2lHLEdBRTVCLE1BQU0wZ0csRUFBUTFnRyxFQUFNa0MsY0FBYyxTQUU1QjRnRyxFQUFVaHJHLE1BQU02RyxLQUFLK2hHLEVBQU1xQixxQkFBcUIsT0FHdEQsSUFBSyxNQUFNL0IsS0FBTThDLEVBQ2YsR0FBaUMsVUFBN0I5QyxFQUFHL2dHLGNBQWNtWixRQUFxQixDQUN4QyxNQUFNMnFGLEVBQXdCL0MsRUFBRy9nRyxjQUNqQyxJQUFJK2pHLEdBQWMsRUFDaEJDLEdBQWEsRUFDZixNQUFNQyxFQUFhcHJHLE1BQU02RyxLQUFLb2tHLEVBQWFqOUYsVUFDckNxOUYsRUFBVUQsRUFBV2hnRyxRQUFRODhGLEdBQ25DLElBQUssTUFBTWpoRyxLQUFTZ2tHLEVBQWFoQixxQkFBcUIsU0FBVSxDQUM5RCxNQUFNdkgsRUFBTTBJLEVBQVdoZ0csUUFBUW5FLEdBQzNCeTdGLEVBQU0ySSxFQUNSSCxHQUFjLEVBQ0x4SSxFQUFNMkksSUFDZkYsR0FBYSxHQU1qQixJQUFLRCxHQUFlQyxFQUNsQkYsRUFBYTlCLHNCQUFzQixjQUFlakIsUUFDN0MsR0FBSWdELElBQWdCQyxFQUN6QkYsRUFBYTlCLHNCQUFzQixXQUFZakIsUUFDMUMsR0FBSWdELEdBQWVDLEVBQVksQ0FFcEMsTUFBTUcsRUFBYzFELEVBQU9RLGdCQUN6Qix1Q0FDQSxZQUVGa0QsRUFBWXRrRyxhQUFhLFNBQVUsTUFBTyxJQUFBb0ksV0FDMUNrOEYsRUFBWXRrRyxhQUNWLFVBQ0EsSUFBTWlrRyxFQUFhNytGLGFBQWEsV0FFbEM2K0YsRUFBYWprRyxhQUNYLFdBQ0EsSUFBTXNrRyxFQUFZbC9GLGFBQWEsV0FHakMsTUFBTWkvRixFQUFVRCxFQUFXaGdHLFFBQVE4OEYsR0FFbkMsSUFBSyxNQUFNaGpGLEtBQVNrbUYsRUFBWSxDQUNoQkEsRUFBV2hnRyxRQUFROFosR0FDckJtbUYsR0FDVkMsRUFBWXQ1RSxZQUFZOU0sR0FJNUIrbEYsRUFBYTlCLHNCQUFzQixXQUFZakIsR0FDL0NBLEVBQUdpQixzQkFBc0IsV0FBWW1DLEdBR3JDLElBQUssTUFBTXhDLEtBQVVtQyxFQUFhaEIscUJBQXFCLFVBQ3JEZ0IsRUFBYTlCLHNCQUFzQixXQUFZTCxHQUlqRCxJQUFLLE1BQU15QyxLQUFRRCxFQUFZckIscUJBQXFCLFFBQ2xEcUIsRUFBWW5DLHNCQUFzQixjQUFlb0MsUUFHbkRwc0csUUFBUUMsS0FBSywwQkFDYkQsUUFBUXFzRyxNQUFNUCxHQUtwQixNQUFNUSxFQUFNenJHLE1BQU02RyxLQUFLK2hHLEVBQU1xQixxQkFBcUIsT0FDNUN5QixFQUFnQjFyRyxNQUFNNkcsS0FBSytoRyxFQUFNNTZGLFVBQ3ZDLElBQUk4NUYsRUFBTyxFQUNYLElBQUssSUFBSXh1RyxFQUFJLEVBQUdBLEVBQUlteUcsRUFBSTVzRyxPQUFRdkYsSUFBSyxDQUNuQyxNQUFNcXlHLEVBQVlGLEVBQUlueUcsR0FDaEJzeUcsRUFBU0gsRUFBSTVzRyxPQUFTdkYsRUFBSSxFQUFJbXlHLEVBQUlueUcsRUFBSSxRQUFLb0UsRUFFM0NtdUcsRUFBUWpFLEVBQU9RLGdCQUNuQix1Q0FDQSxNQUVGeUQsRUFBTTdrRyxhQUFhLFNBQVUsTUFBTyxJQUFBb0ksV0FDcEN5OEYsRUFBTTdrRyxhQUFhLE9BQVEya0csRUFBVXYvRixhQUFhLFNBRWxELE1BQU0wL0YsRUFBYWxFLEVBQU9RLGdCQUN4Qix1Q0FDQSxXQUVGMEQsRUFBVzlrRyxhQUFhLE9BQVEsbUJBRWhDLE1BQU1taEcsRUFBV1AsRUFBT1EsZ0JBQ3RCLHVDQUNBLFNBRUY5QixFQUFlcUYsRUFBV3hELEdBQzFCQSxFQUFTbmhHLGFBQWEsSUFBSyxLQUMzQixNQUFNK2tHLEVBQWFMLEVBQWN0Z0csUUFBUXVnRyxHQUN6QyxHQUFJN0IsRUFBUyxDQUNYLEdBQWlELE9BQTdDNEIsRUFBYzE4RSxHQUFHKzhFLEVBQWEsR0FBR3pyRixRQUFrQixDQUNyRHduRixHQUFRLEVBRVIsTUFBTXhqRixFQUFLb25GLEVBQWMxOEUsR0FBRys4RSxFQUFhLEdBQ25DQyxFQUFTMW5GLEVBQUdsWSxhQUFhLFFBQ3pCNi9GLEVBQVNqc0csTUFBTTZHLEtBQUt5aEcsRUFBUXBpRyxpQkFBaUIsU0FBU2tVLEtBQ3pEeXNGLEdBQVNBLEVBQUt6NkYsYUFBYSxZQUFjNC9GLEVBQU85dUcsTUFBTSxJQUV6RG9uQixFQUFHOUQsV0FBVys3RSxZQUFZajRFLEdBQzFCMm5GLEVBQU96ckYsV0FBVys3RSxZQUFZMFAsR0FFaEM5RCxFQUFTbmhHLGFBQWEsT0FBUSxTQUFXOGdHLEVBQUt6MUYsWUFHaEQsTUFBTWcyRixFQUFXVCxFQUFPUSxnQkFDdEIsdUNBQ0EsU0FFRkMsRUFBU3JoRyxhQUFhLElBQUssS0FDM0JxaEcsRUFBU3JoRyxhQUFhLFNBQVUsTUFBTyxJQUFBb0ksV0FDdkMwOEYsRUFBVzk1RSxZQUFZbTJFLEdBQ3ZCQSxFQUFTbjJFLFlBQVlxMkUsR0FFckIsTUFBTTZELEVBQWdCbHNHLE1BQU02RyxLQUFLK2hHLEVBQU01NkYsVUFDakNtakUsRUFBWSs2QixFQUFjaHZHLE1BQzlCZ3ZHLEVBQWM5Z0csUUFBUXVnRyxHQUFhLEVBQ25DTyxFQUFjOWdHLFFBQVF3Z0csSUFHeEIsSUFBSyxNQUFNMW1GLEtBQVNpc0QsRUFDbEJrM0IsRUFBU3IyRSxZQUFZOU0sR0FLdkIsSUFBSzBtRixFQUFRLENBQ1gsTUFDTU8sRUFBZTlFLEVBREQ2RSxFQUFjbDlFLElBQUksR0FDZ0IsSUFDdEQsSUFBSyxNQUFNOUosS0FBU2luRixFQUFjLENBQ2hDLE1BQU10RixFQUFPbUQsRUFBTTV2RixLQUNoQmd5RixHQUNDQSxFQUFFaGdHLGFBQWEsV0FBYThZLEVBQU05WSxhQUFhLFFBQVFsUCxNQUFNLElBRTdEMnBHLEdBQVFtRCxFQUFNbnJHLE9BQVMsR0FDekJnb0csRUFBS3JtRixXQUFXKzdFLFlBQVlzSyxJQUtsQ21CLEVBQVE0QixhQUFhaUMsRUFBTzNqRyxHQUM1QjgvRixFQUFRNEIsYUFBYWtDLEVBQVk1akcsR0FFbkNBLEVBQU01QixVQUtWLE1BQU0rbEcsRUFBZXJzRyxNQUFNNkcsS0FBSysvRixFQUFJcUQscUJBQXFCLGFBQ3pELElBQUlxQyxHQUFnQixFQUNoQkMsRUFDRixpRUFDRUMsR0FBaUIsRUFDakJDLEVBQXFCLDhDQUN6QixJQUFLLE1BQU0xOUUsS0FBWTYzRSxFQUFJMWdHLGlCQUFpQixZQUFhLENBQ3ZELElBQUssTUFBTXFsRyxLQUFReDhFLEVBQVM3b0IsaUJBQWlCLFFBQzNDNm9CLEVBQVNvNkUsc0JBQXNCLGNBQWVvQyxHQUVoRCxJQUFLLE1BQU16QyxLQUFVLzVFLEVBQVM3b0IsaUJBQWlCLFVBQzdDNm9CLEVBQVNvNkUsc0JBQXNCLFdBQVlMLEdBSzdDLE1BQU00RCxFQUFjdkYsRUFBYXA0RSxHQUM3QjI5RSxJQUNGRixHQUFpQixFQUNqQkMsR0FBc0JDLEdBS3hCLE1BQU1DLEVBQWNOLEVBQWFqaEcsUUFBUTJqQixHQUl6QyxHQUFJQSxFQUFTN0MsYUFBYSxZQUFhLENBQ3JDLE1BQU14TixFQUFPc29GLEVBQXNCajRFLEVBQVU0OUUsRUFBYU4sR0FDdEQzdEYsSUFDRjR0RixHQUFnQixFQUNoQkMsR0FBcUI3dEYsR0FJekIsR0FBSXFRLEVBQVM3QyxhQUFhLFdBQVksQ0FDcEMsTUFBTXhOLEVBQU93b0YsRUFBcUJuNEUsRUFBVXM5RSxHQUN4QzN0RixJQUNGNHRGLEdBQWdCLEVBQ2hCQyxHQUFxQjd0RixJQUl2Qjh0RixHQUNGdjlGLEVBQWFtQixrQkFDWCwyQ0FDQSxRQUNBcThGLEdBR0FILEdBQ0ZyOUYsRUFBYW1CLGtCQUNYLGdEQUNBLFFBQ0FtOEYsR0FJSixNQUFNN0UsRUFBYSxJQUFJQyxjQUN2QixPQUFPNU4sRUFBV0ssSUFBSXNOLEVBQVcwQixrQkFBa0J4QixLQUdyRCxrQ0FBdUNnRixHQUNyQyxNQUVNaEcsR0FGUyxJQUFJYSxXQUNHSSxnQkFBZ0IrRSxFQUFXLFlBQzlCcFEsZ0JBR2J3TixFQUFRaHFHLE1BQU02RyxLQUFLKy9GLEVBQUkxZ0csaUJBQWlCLFNBQ3hDMm1HLEVBQWFqRyxFQUFJeDhGLGNBQWMsV0FDL0IwaUcsRUFBUzF3RyxPQUFPeXdHLEVBQVd6Z0csYUFBYSxRQUM1QzJnRyxFQUFTM3dHLE9BQU95d0csRUFBV3pnRyxhQUFhLFFBUTFDLElBQUlzUyxFQUFPLCtDQUVZc3JGLEVBQU0zekQsS0FBTXd3RCxJQUNqQyxNQUFNbUcsRUFBZ0IsQ0FBQyxNQUFPLE1BQU8sTUFBTyxPQUFPMzJELEtBQU03Z0MsR0FUM0QsU0FBMkJxeEYsRUFBZXJ4RixHQUN4QyxNQUFNeTNGLEVBQVE3d0csT0FBT3lxRyxFQUFLejZGLGFBQWFvSixJQUV2QyxPQUFPeTNGLEVBQVEsR0FBS0EsR0FEQyxPQUFSejNGLEdBQXlCLE9BQVJBLEVBQWdCczNGLEVBQVNDLEdBUXJERyxDQUFrQnJHLEVBQU1yeEYsSUFFMUIsR0FBSXczRixFQUFlLENBQ2pCLE1BQU1sbkcsRUFBVThnRyxFQUFJeDhGLGNBQ2xCLFdBQVcsSUFBTXk4RixFQUFLejZGLGFBQWEsZUFFckNzUyxHQUFRLFNBQVM1WSxFQUFRd2EsNEJBQTRCeGEsRUFBUXNHLGFBQzNELGNBR0osT0FBTzRnRyxLQUlQLzlGLEVBQWFtQixrQkFDWCxxREFDQSxVQUNBc08sSUF1SU4sNkJBQWtDa29GLEdBQ2hDLE1BRU11RyxHQUZTLElBQUkxRixXQUNHSSxnQkFBZ0JqQixFQUFLLFlBQ1hwSyxnQkFFaEMsSUFBSyxNQUFNdDBGLEtBQVNsSSxNQUFNNkcsS0FDeEJzbUcsRUFBaUJsRCxxQkFBcUIsVUFFbEMvaEcsRUFBTWdrQixhQUFhLFNBQ3JCaGtCLEVBQU0xQixnQkFBZ0IsUUFJMUIsTUFBTWtoRyxFQUFhLElBQUlDLGNBQ3ZCLE9BQU81TixFQUFXSyxJQUFJc04sRUFBVzBCLGtCQUFrQitELE0sNEhDM3pCckQsY0FFTUMsRUFBaUJoOUQsTUFBTSxvQ0FDN0IsSUFBSWk5RCxFQUFnQnZuRixFQUFnQnduRixFQUErQkMsRUFLbkUsU0FBU0MsRUFBZ0J2c0csR0FDdkIsTUFBTXdsQixFQUFTeGxCLEVBQVFvakIsS0FDdkIsR0FBZSxPQUFYb0MsRUFBaUIsQ0FDbkI4bUYsRUFBWTM1RixZQUFjLFFBQzFCMjVGLEVBQVk1bUcsTUFBTWEsTUFBUSxVQUMxQixJQUFLLE1BQU0wZCxLQUFTcW9GLEVBQVl2L0YsU0FDOUJrWCxFQUFNNWUsYUFFSCxDQUNMLElBQUlvcUIsRUFBTSxHQUNWakssRUFBT3RnQixRQUFRc25HLElBQ2IvOEUsR0FBTys4RSxFQUFPLE9BRWhCRixFQUFZMzVGLFlBQWMsR0FDMUIyNUYsRUFBWTVtRyxNQUFNYSxNQUFRLE1BRTFCLE1BQU04eUIsRUFBU3YwQixTQUFTZ0ssY0FBYyxPQUd0Q3VxQixFQUFPMW1CLFlBQWMsVUFDckIwbUIsRUFBTzN6QixNQUFNaTNDLE9BQVMsVUFDdEIydkQsRUFBWXY3RSxZQUFZc0ksR0FFeEJBLEVBQU9qNkIsaUJBQWlCLFFBQVNxdEcsRUFBYzV5RyxLQUFLMEIsS0FBTWswQixLQXFCOUQsU0FBU2c5RSxFQUFjaDlFLEdBQ3JCbDBCLEtBQUtteEcsTUFBTXQ4RSxtQkFBbUIsRUFBQXBhLGdCQUFnQjZDLFVBQVc0VyxHQUN6RGwwQixLQUFLbXhHLE1BQU1yOEUsa0JBT2IsT0FBT3RvQixlQUFxQkcsR0FFMUIsR0FBc0IsT0FEQXBELFNBQVMyQixlQUFlLGVBQ2xCLENBQzFCLE1BQU1rbUcsRUFBYTduRyxTQUFTMkIsZUFBZSxlQUMzQ2ttRyxFQUFXaDZGLFlBQWMsVUFDekIwNUYsRUFBZU0sRUFFZixNQUFNQyxFQUFZOW5HLFNBQVMyQixlQUFlLHFCQUMxQ21tRyxFQUFVajZGLFlBQWMsVUFDeEIyNUYsRUFBY00sRUFDZFIsRUFBUyxJQUFJUyxPQUFPLG1DQUNwQlQsRUFBT25SLFVBQVlzUixFQUFlMXlHLEtBQUtxTyxLQVEzQyxvQkFBT0gsZUFBa0Mra0csR0FDdkMsUUFBb0Jyd0csSUFBaEI2dkcsUUFBOEM3dkcsSUFBakI0dkcsRUFDL0IsT0FFRixRQUFlNXZHLElBQVhvb0IsRUFBc0IsQ0FDeEIsTUFBTTFOLFFBQWlCZzFGLEVBQ3ZCdG5GLFFBQWUxTixFQUFTSCxPQUUxQnMxRixFQUFZMzVGLFlBQWMsY0FDMUIyNUYsRUFBWTVtRyxNQUFNYSxNQUFRLE9BQzFCNmxHLEVBQU9qUixZQUFZLENBQ2pCd0ssSUFBS21ILEVBQ0xqb0YsT0FBUUEsSUFHVnduRixFQUFhMTVGLFlBQWMsY0FDM0IwNUYsRUFBYTNtRyxNQUFNYSxNQUFRLE9BN0Q3QixTQUEwQjh3QyxHQUN4QixHQUFLQSxFQUlMLE9BQVFBLEdBQ04sSUFBSyxVQUNIZzFELEVBQWExNUYsWUFBYzBrQyxFQUMzQmcxRCxFQUFhM21HLE1BQU1hLE1BQVEsT0FDM0IsTUFFRixRQUNFOGxHLEVBQWExNUYsWUFBYzBrQyxFQUMzQmcxRCxFQUFhM21HLE1BQU1hLE1BQVEsV0FrRC9Cd21HLE9BcUJGaGxHLGVBQTZCK2tHLEdBQzNCLE1BQ01uRyxHQURTLElBQUlILFdBQ0dJLGdCQUFnQmtHLEVBQVMsWUFHekNILEVBRk1oRyxFQUFPcEwsZ0JBRUlwd0YsYUFBYSxjQUNwQyxPQUFJd2hHLEdBR0ssVUEvQmdCSyxDQUFjRixLQU96Qyx1QkFDRSxRQUFvQnJ3RyxJQUFoQjZ2RyxRQUE4Qzd2RyxJQUFqQjR2RyxFQUFqQyxDQUlBLElBQUssTUFBTXBvRixLQUFTcW9GLEVBQVl2L0YsU0FDOUJrWCxFQUFNNWUsU0FFUmluRyxFQUFZMzVGLFlBQWMsU0FDMUIyNUYsRUFBWTVtRyxNQUFNYSxNQUFRLGFBRTFCOGxHLEVBQWExNUYsWUFBYyxTQUMzQjA1RixFQUFhM21HLE1BQU1hLE1BQVEsZ0IsNkhDbkg3QixJQUFJMG1HLEdBQVEsRUFxQlosMEJBQWdDNXpFLEdBQWtCLEdBQ2hENHpFLEVBQVE1ekUsRUFoQlYsV0FDRSxNQUFNNnpFLEVBQVlwb0csU0FBU3FFLGNBQThCLGVBQ25EOEIsRUFBT2dpRyxFQUFPLDBDQUFpRCw0Q0FDckVDLEVBQVVubkcsYUFBYSxNQUFPa0YsR0FFOUIsTUFBTWtpRyxFQUFhRixFQUFPLHFCQUF1Qix3QkFDakRDLEVBQVVubkcsYUFBYSxNQUFPb25HLEdBVzlCQyxJQU9GLGtDQUNFOW9HLE9BQU8rb0csZUFBa0JuOEYsSUFDdkIsSUFBSys3RixFQUVILE9BREEvN0YsRUFBRThDLGlCQUNLLCtCLGNDcENiNWIsRUFBT0QsUUFBVSxTQUFTQyxHQW9CekIsT0FuQktBLEVBQU9rMUcsa0JBQ1hsMUcsRUFBT20xRyxVQUFZLGFBQ25CbjFHLEVBQU84cUMsTUFBUSxHQUVWOXFDLEVBQU8yVSxXQUFVM1UsRUFBTzJVLFNBQVcsSUFDeENoVSxPQUFPQyxlQUFlWixFQUFRLFNBQVUsQ0FDdkNhLFlBQVksRUFDWkMsSUFBSyxXQUNKLE9BQU9kLEVBQU9FLEtBR2hCUyxPQUFPQyxlQUFlWixFQUFRLEtBQU0sQ0FDbkNhLFlBQVksRUFDWkMsSUFBSyxXQUNKLE9BQU9kLEVBQU9DLEtBR2hCRCxFQUFPazFHLGdCQUFrQixHQUVuQmwxRyxJLGlCQ3BCUixZQU1BRCxFQUFRcTFHLFdBMklSLFNBQW9CNXlHLEdBUW5CLEdBUEFBLEVBQUssSUFBTVcsS0FBS2t5RyxVQUFZLEtBQU8sSUFDbENseUcsS0FBS215RyxXQUNKbnlHLEtBQUtreUcsVUFBWSxNQUFRLEtBQzFCN3lHLEVBQUssSUFDSlcsS0FBS2t5RyxVQUFZLE1BQVEsS0FDMUIsSUFBTXIxRyxFQUFPRCxRQUFRdzFHLFNBQVNweUcsS0FBS3NwQyxPQUUvQnRwQyxLQUFLa3lHLFVBQ1QsT0FHRCxNQUFNLzBHLEVBQUksVUFBWTZDLEtBQUtnTCxNQUMzQjNMLEVBQUsrb0MsT0FBTyxFQUFHLEVBQUdqckMsRUFBRyxrQkFLckIsSUFBSWlJLEVBQVEsRUFDUml0RyxFQUFRLEVBQ1poekcsRUFBSyxHQUFHMmIsUUFBUSxjQUFlbkwsSUFDaEIsT0FBVkEsSUFHSnpLLElBQ2MsT0FBVnlLLElBR0h3aUcsRUFBUWp0RyxNQUlWL0YsRUFBSytvQyxPQUFPaXFFLEVBQU8sRUFBR2wxRyxJQTFLdkJQLEVBQVEwMUcsS0E2TFIsU0FBY0MsR0FDYixJQUNLQSxFQUNIMzFHLEVBQVE0MUcsUUFBUXJwRyxRQUFRLFFBQVNvcEcsR0FFakMzMUcsRUFBUTQxRyxRQUFRQyxXQUFXLFNBRTNCLE1BQU9sdUcsTUFuTVYzSCxFQUFRK0wsS0ErTVIsV0FDQyxJQUFJL0ssRUFDSixJQUNDQSxFQUFJaEIsRUFBUTQxRyxRQUFRdnBHLFFBQVEsU0FDM0IsTUFBTzFFLEtBTUozRyxRQUF3QixJQUFac3lELEdBQTJCLFFBQVNBLElBQ3BEdHlELEVBQUlzeUQsRUFBUTJTLElBQUk2dkMsT0FHakIsT0FBTzkwRyxHQTVOUmhCLEVBQVFzMUcsVUF5R1IsV0FJQyxHQUFzQixvQkFBWG5wRyxRQUEwQkEsT0FBT21uRCxVQUFvQyxhQUF4Qm5uRCxPQUFPbW5ELFFBQVF0dUQsTUFBdUJtSCxPQUFPbW5ELFFBQVF5aUQsUUFDNUcsT0FBTyxFQUlSLEdBQXlCLG9CQUFkMW1ELFdBQTZCQSxVQUFVQyxXQUFhRCxVQUFVQyxVQUFVajJDLGNBQWNwRyxNQUFNLHlCQUN0RyxPQUFPLEVBS1IsTUFBNEIsb0JBQWJ0RyxVQUE0QkEsU0FBU3kyRixpQkFBbUJ6MkYsU0FBU3kyRixnQkFBZ0I3MUYsT0FBU1osU0FBU3kyRixnQkFBZ0I3MUYsTUFBTXlvRyxrQkFFcEgsb0JBQVg3cEcsUUFBMEJBLE9BQU9wRyxVQUFZb0csT0FBT3BHLFFBQVFrd0csU0FBWTlwRyxPQUFPcEcsUUFBUW13RyxXQUFhL3BHLE9BQU9wRyxRQUFRb3dHLFFBR3JHLG9CQUFkOW1ELFdBQTZCQSxVQUFVQyxXQUFhRCxVQUFVQyxVQUFVajJDLGNBQWNwRyxNQUFNLG1CQUFxQjJJLFNBQVNpVCxPQUFPcVcsR0FBSSxLQUFPLElBRTlILG9CQUFkbXFCLFdBQTZCQSxVQUFVQyxXQUFhRCxVQUFVQyxVQUFVajJDLGNBQWNwRyxNQUFNLHVCQTlIdEdqVCxFQUFRNDFHLFFBeU9SLFdBQ0MsSUFHQyxPQUFPeHBHLGFBQ04sTUFBT3pFLEtBOU9ReXVHLEdBQ2xCcDJHLEVBQVFzcUIsUUFBVSxNQUNqQixJQUFJNWtCLEdBQVMsRUFFYixNQUFPLEtBQ0RBLElBQ0pBLEdBQVMsRUFDVEssUUFBUUMsS0FBSyw0SUFORSxHQWVsQmhHLEVBQVFxMkcsT0FBUyxDQUNoQixVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxXQXNGRHIyRyxFQUFRczNCLElBQU12eEIsUUFBUXFzRyxPQUFTcnNHLFFBQVF1eEIsS0FBTyxTQWtFOUNyM0IsRUFBT0QsUUFBVSxFQUFRLEdBQVIsQ0FBb0JBLEdBRXJDLE1BQU0sV0FBQ3MyRyxHQUFjcjJHLEVBQU9ELFFBTTVCczJHLEVBQVcza0csRUFBSSxTQUFVZ2MsR0FDeEIsSUFDQyxPQUFPMWhCLEtBQUtPLFVBQVVtaEIsR0FDckIsTUFBT2htQixHQUNSLE1BQU8sK0JBQWlDQSxFQUFNRSxZLHdLQ3hRaEQsYUFDQSxRQUNBLE9BRUEsT0E2SUEsU0FBUzB1RyxFQUFVenFHLEVBQVkwcUcsR0FDVDdwRyxTQUFTMkIsZUFBZXhDLEdBQ2hDbUIsVUFBVWUsSUFBSSxhQUN0QnJCLFNBQVMyQixlQUFleEMsR0FBSW1CLFVBQVVFLFNBQVMsY0FDakRxcEcsRUFBY0MsYUFBYTNxRyxJQUMzQixJQUFBOE4sYUFBWSxDQUFFMU8sV0FBWVksS0FROUIsU0FBUzRxRyxFQUFZMXhHLEdBQ0oySCxTQUFTRyxpQkFBaUI5SCxHQUNsQytILFFBQVFvQixJQUNiQSxFQUFHbEIsVUFBVUMsT0FBTyxhQUNwQmlCLEVBQUdsQixVQUFVQyxPQUFPLGVBeEp4QiwwQkFBZ0NzcEcsR0FDOUIsTUFDTUcsRUFEd0IvdkcsTUFBTTZHLEtBQUtkLFNBQVNDLHVCQUF1QixjQUNyQ3NHLElBQUs2dEYsR0FBaUJBLEVBQUlqMUYsSUFFOURhLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFVBQVkrVCxJQUN6QyxHQUFJQSxFQUFJc3VDLEtBQUtyMkMsTUFBTSxjQUFnQitILEVBQUlvdUYsU0FDckMsSUFDRSxNQUFNNWdHLEVBQVF4RixPQUFPZ1ksRUFBSXN1QyxLQUFLdHVDLEVBQUlzdUMsS0FBSzdqRCxPQUFTLElBQU0sRUFDaERteEcsRUFBZ0JqcUcsU0FBU0MsdUJBQXVCLFlBQy9CZ3FHLEVBQWNwdUcsR0FDQStVLFFBQ3JDLE1BQU94RSxHQUNQaFQsUUFBUXFzRyxNQUFNcjVGLE1BS3BCNDlGLEVBQU81cEcsUUFBU2cwRixJQUNkcDBGLFNBQVMyQixlQUFleXlGLEdBQUs5NUYsaUJBQWlCLFFBQVMsS0FDckR5dkcsRUFBVyxjQUNYSCxFQUFTeFYsRUFBS3lWLElBQ2QsSUFBQTU4RixhQUFZLENBQUV6TyxVQUFXNDFGLElBQ3pCcDBGLFNBQVMyQixlQUFlLGVBQWVLLFVBQVk0VixFQUFTck4sY0FBYzZwRixHQXlJaEYsU0FBdUJ5VixHQUNyQixNQUFNSyxFQUFpQmp3RyxNQUFNNkcsS0FBS2QsU0FBU0MsdUJBQXVCLGFBQy9DaXFHLEVBQWUzakcsSUFBSS9FLEdBQU1BLEVBQUdyQyxJQUNwQ2lCLFFBQVFvQixJQUNqQnhCLFNBQVMyQixlQUFlSCxHQUFJbEgsaUJBQWlCLFFBQVMsS0FDcER5dkcsRUFBVyxhQUNYSCxFQUFTcG9HLEVBQUlxb0csT0E5SWJNLENBQWFOLEdBQ2JFLEVBQVcsYUFDWCxJQUNFLE1BQU0sV0FBRXhyRyxJQUFlLElBQUFrUSxlQUN2Qm03RixFQUFTcnJHLEVBQVlzckcsR0FDckIsTUFBT3o5RixHQUVQdzlGLEVBRG9CNXBHLFNBQVNDLHVCQUF1QixZQUFZLEdBQzNDZCxHQUFJMHFHLFNBU2pDLG9DQUVFLE1BQU1PLEVBQWNwcUcsU0FBUzJCLGVBQWUsbUJBQ3RDMG9HLEVBQWdCcnFHLFNBQVMyQixlQUFlLGNBQ3hDMm9HLEVBQXFCRCxFQUFjaG1HLGNBQWMsd0JBQ2pEa21HLEVBQWlCdnFHLFNBQVMyQixlQUFlLGtCQUN6QzZvRyxFQUFxQkgsRUFBY2htRyxjQUFjLGFBRWpEb21HLEVBQVl6cUcsU0FBUzJCLGVBQWUsaUJBQ3BDK29HLEVBQWMxcUcsU0FBUzJCLGVBQWUsWUFDdENncEcsRUFBc0JELEVBQVlybUcsY0FBYyx3QkFDaER1bUcsRUFBZTVxRyxTQUFTMkIsZUFBZSxnQkFDdkNrcEcsRUFBbUJILEVBQVlybUcsY0FBYyxhQUtuRCtsRyxFQUFZOXZHLGlCQUFpQixRQUFTLEtBQ3BDcXdHLEVBQW9CcnFHLFVBQVVDLE9BQU8sV0FDckMrcEcsRUFBbUJocUcsVUFBVWUsSUFBSSxZQUVqQyxJQUFBNEwsYUFBWSxDQUFFM08sU0FBVSxXQUVIMEIsU0FBU3FFLGNBQWMsdUJBQXdCdU0sUUFDcEU2NUYsRUFBVXBtRyxjQUFjLG9DQUFvQy9ELFVBQVVlLElBQUksYUFDMUUrb0csRUFBWS9sRyxjQUFjLHNDQUFzQy9ELFVBQVVDLE9BQU8sZUFLbkZrcUcsRUFBVW53RyxpQkFBaUIsUUFBUyxLQUNsQ2d3RyxFQUFtQmhxRyxVQUFVQyxPQUFPLFdBQ3BDb3FHLEVBQW9CcnFHLFVBQVVlLElBQUksWUFFbEMsSUFBQTRMLGFBQVksQ0FBRTNPLFNBQVUsU0FFeEI4ckcsRUFBWS9sRyxjQUFjLHNDQUFzQy9ELFVBQVVlLElBQUksYUFDOUVvcEcsRUFBVXBtRyxjQUFjLG9DQUFvQy9ELFVBQVVDLE9BQU8sZUFJL0U4cEcsRUFBYy92RyxpQkFBaUIsUUFBVThSLElBQ3ZDQSxFQUFFa0Msa0JBRUVpOEYsRUFBZWpxRyxVQUFVRSxTQUFTLFdBRXBDK3BHLEVBQWVqcUcsVUFBVUMsT0FBTyxVQUNoQ2dxRyxFQUFlM3BHLE1BQU1vUSxRQUFVLGVBQy9CMVQsV0FBVyxLQUNUaXRHLEVBQWUzcEcsTUFBTXFRLFNBQVcsV0FDL0IsS0FDSHU1RixFQUFtQnZwRyxhQUFhLGFBQWMsc0RBSzlDc3BHLEVBQWVqcUcsVUFBVWUsSUFBSSxVQUM3QmtwRyxFQUFlM3BHLE1BQU1xUSxTQUFXLFNBQ2hDM1QsV0FBVyxLQUNUaXRHLEVBQWUzcEcsTUFBTW9RLFFBQVUsT0FDOUIsS0FDSHc1RixFQUFtQnZwRyxhQUFhLGFBQWMsdURBSWxEeXBHLEVBQVlwd0csaUJBQWlCLFFBQVU4UixJQUNyQ0EsRUFBRWtDLGtCQUVFczhGLEVBQWF0cUcsVUFBVUUsU0FBUyxXQUVsQ29xRyxFQUFhdHFHLFVBQVVDLE9BQU8sVUFDOUJxcUcsRUFBYWhxRyxNQUFNb1EsUUFBVSxlQUM3QjFULFdBQVcsS0FDVHN0RyxFQUFhaHFHLE1BQU1xUSxTQUFXLFdBQzdCLEtBQ0g0NUYsRUFBaUI1cEcsYUFBYSxhQUFjLHNEQUs1QzJwRyxFQUFhdHFHLFVBQVVlLElBQUksVUFDM0J1cEcsRUFBYWhxRyxNQUFNcVEsU0FBVyxTQUM5QjNULFdBQVcsS0FDVHN0RyxFQUFhaHFHLE1BQU1vUSxRQUFVLE9BQzVCLEtBQ0g2NUYsRUFBaUI1cEcsYUFBYSxhQUFjLHdEQWlEbEQsa0NBQ0UsTUFBTTZwRyxFQUFnQjlxRyxTQUFTMkIsZUFBZSxpQkFDeEN1OEYsRUFBYWwrRixTQUFTMkIsZUFBZSxjQUNyQ3c4RixFQUFVbitGLFNBQVMyQixlQUFlLFdBQ2xDczhGLEVBQWFqK0YsU0FBUzJCLGVBQWUsY0FDckN5OEYsRUFBb0JwK0YsU0FBUzJCLGVBQWUscUJBRWxEbXBHLEVBQWN4d0csaUJBQWlCLFNBZS9CLFdBQ0UsSUFBS3d3RyxFQUFjeHFHLFVBQVVFLFNBQVMsYUFBYyxFQUNsRCxJQUFBeU0sYUFBWSxDQUFFeE8sY0FBZSxtQkFFN0IsSUFBQXlCLFlBQ0FGLFNBQVMyQixlQUFlLFlBQVlLLFVBQVksR0FDaERoQyxTQUFTMkIsZUFBZSxhQUFhSyxVQUFZLEdBQ2pEaEMsU0FBUzJCLGVBQWUsWUFBWVAsY0FBY2QsVUFBVWUsSUFBSSxVQUNoRXJCLFNBQVMyQixlQUFlLGFBQWFQLGNBQWNkLFVBQVVlLElBQUksVUFDakV5cEcsRUFBY3hxRyxVQUFVZSxJQUFJLGFBRTVCNjhGLEVBQVc1OUYsVUFBVUMsT0FBTyxhQUM1QjQ5RixFQUFRNzlGLFVBQVVDLE9BQU8sYUFDekIwOUYsRUFBVzM5RixVQUFVQyxPQUFPLGFBQzVCNjlGLEVBQWtCOTlGLFVBQVVDLE9BQU8sYUFDbkMsSUFDRVAsU0FBUzJCLGVBQWUsYUFBYXJCLFVBQVVDLE9BQU8sYUFDdEQsTUFBTzZMLElBQ1QsSUFDMkQsd0JBQXJEcE0sU0FBU3FFLGNBQWMsdUJBQXVCbEYsS0FDaEQsSUFBQTZPLHNCQUFxQixZQUV2QixNQUFPNUIsU0FwQ2I4eEYsRUFBVzVqRyxpQkFBaUIsU0F3QzVCLFdBQ0UsSUFBSzRqRyxFQUFXNTlGLFVBQVVFLFNBQVMsYUFBYyxFQUMvQyxJQUFBeU0sYUFBWSxDQUFFeE8sY0FBZSxnQkFFN0IsSUFBQXlCLFlBQ0FGLFNBQVMyQixlQUFlLFlBQVlLLFVBQVksR0FDaERoQyxTQUFTMkIsZUFBZSxhQUFhSyxVQUFZLEdBQ2pEaEMsU0FBUzJCLGVBQWUsWUFBWVAsY0FBY2QsVUFBVWUsSUFBSSxVQUNoRXJCLFNBQVMyQixlQUFlLGFBQWFQLGNBQWNkLFVBQVVlLElBQUksVUFDakU2OEYsRUFBVzU5RixVQUFVZSxJQUFJLGFBQ3pCODhGLEVBQVE3OUYsVUFBVUMsT0FBTyxhQUN6QnVxRyxFQUFjeHFHLFVBQVVDLE9BQU8sYUFDL0IwOUYsRUFBVzM5RixVQUFVQyxPQUFPLGFBQzVCNjlGLEVBQWtCOTlGLFVBQVVDLE9BQU8sYUFDbkMsSUFDRVAsU0FBUzJCLGVBQWUsYUFBYXJCLFVBQVVDLE9BQU8sYUFDdEQsTUFBTzZMLElBQ1QsSUFDMkQsd0JBQXJEcE0sU0FBU3FFLGNBQWMsdUJBQXVCbEYsS0FDaEQsSUFBQTZPLHNCQUFxQixTQUV2QixNQUFPNUIsU0E1RGIreEYsRUFBUTdqRyxpQkFBaUIsU0FnRXpCLFdBQ0UsSUFBSzZqRyxFQUFRNzlGLFVBQVVFLFNBQVMsYUFBYyxFQUM1QyxJQUFBeU0sYUFBWSxDQUFFeE8sY0FBZSxhQUU3QixJQUFBeUIsWUFDQUYsU0FBUzJCLGVBQWUsWUFBWUssVUFBWSxHQUNoRGhDLFNBQVMyQixlQUFlLGFBQWFLLFVBQVksR0FDakRoQyxTQUFTMkIsZUFBZSxZQUFZUCxjQUFjZCxVQUFVZSxJQUFJLFVBQ2hFckIsU0FBUzJCLGVBQWUsYUFBYVAsY0FBY2QsVUFBVWUsSUFBSSxVQUNqRTg4RixFQUFRNzlGLFVBQVVlLElBQUksYUFDdEI2OEYsRUFBVzU5RixVQUFVQyxPQUFPLGFBQzVCdXFHLEVBQWN4cUcsVUFBVUMsT0FBTyxhQUMvQjA5RixFQUFXMzlGLFVBQVVDLE9BQU8sYUFDNUI2OUYsRUFBa0I5OUYsVUFBVUMsT0FBTyxhQUNuQyxJQUNFUCxTQUFTMkIsZUFBZSxhQUFhckIsVUFBVUMsT0FBTyxhQUN0RCxNQUFPNkwsSUFDVCxJQUMyRCx3QkFBckRwTSxTQUFTcUUsY0FBYyx1QkFBdUJsRixLQUNoRCxJQUFBNk8sc0JBQXFCLFNBRXZCLE1BQU81QixTQXBGYjZ4RixFQUFXM2pHLGlCQUFpQixTQXdGNUIsV0FDRSxJQUFLMmpHLEVBQVczOUYsVUFBVUUsU0FBUyxhQUFjLEVBQy9DLElBQUF5TSxhQUFZLENBQUV4TyxjQUFlLGdCQUU3QixJQUFBeUIsWUFDQUYsU0FBUzJCLGVBQWUsWUFBWUssVUFBWSxHQUNoRGhDLFNBQVMyQixlQUFlLGFBQWFLLFVBQVksR0FDakRoQyxTQUFTMkIsZUFBZSxZQUFZUCxjQUFjZCxVQUFVZSxJQUFJLFVBQ2hFckIsU0FBUzJCLGVBQWUsYUFBYVAsY0FBY2QsVUFBVWUsSUFBSSxVQUNqRTQ4RixFQUFXMzlGLFVBQVVlLElBQUksYUFDekI2OEYsRUFBVzU5RixVQUFVQyxPQUFPLGFBQzVCNDlGLEVBQVE3OUYsVUFBVUMsT0FBTyxhQUN6QnVxRyxFQUFjeHFHLFVBQVVDLE9BQU8sYUFDL0I2OUYsRUFBa0I5OUYsVUFBVUMsT0FBTyxhQUNuQyxJQUNFUCxTQUFTMkIsZUFBZSxhQUFhckIsVUFBVUMsT0FBTyxhQUN0RCxNQUFPNkwsSUFDVCxJQUMyRCx3QkFBckRwTSxTQUFTcUUsY0FBYyx1QkFBdUJsRixLQUNoRCxJQUFBNk8sc0JBQXFCLFNBRXZCLE1BQU81QixTQTVHYmd5RixFQUFrQjlqRyxpQkFBaUIsU0FnSG5DLFdBQ0UsSUFBSzhqRyxFQUFrQjk5RixVQUFVRSxTQUFTLGFBQWMsRUFDdEQsSUFBQXlNLGFBQVksQ0FBRXhPLGNBQWUsdUJBRTdCLElBQUF5QixZQUNBRixTQUFTMkIsZUFBZSxZQUFZSyxVQUFZLEdBQ2hEaEMsU0FBUzJCLGVBQWUsYUFBYUssVUFBWSxHQUNqRGhDLFNBQVMyQixlQUFlLFlBQVlQLGNBQWNkLFVBQVVlLElBQUksVUFDaEVyQixTQUFTMkIsZUFBZSxhQUFhUCxjQUFjZCxVQUFVZSxJQUFJLFVBQ2pFKzhGLEVBQWtCOTlGLFVBQVVlLElBQUksYUFDaEM2OEYsRUFBVzU5RixVQUFVQyxPQUFPLGFBQzVCNDlGLEVBQVE3OUYsVUFBVUMsT0FBTyxhQUN6QjA5RixFQUFXMzlGLFVBQVVDLE9BQU8sYUFDNUJ1cUcsRUFBY3hxRyxVQUFVQyxPQUFPLGFBQy9CLElBQ0VQLFNBQVMyQixlQUFlLGFBQWFyQixVQUFVQyxPQUFPLGFBQ3RELE1BQU82TCxJQUNULElBQzJELHdCQUFyRHBNLFNBQVNxRSxjQUFjLHVCQUF1QmxGLEtBQ2hELElBQUE2TyxzQkFBcUIsZ0JBRXZCLE1BQU81QixTQW5JYnBNLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFVBQVkrVCxJQUN6QixNQUFaQSxFQUFJdlosS0FBYWcyRyxFQUFjbDZGLFFBQ25CLE1BQVp2QyxFQUFJdlosS0FBYW9wRyxFQUFXdHRGLFFBQ2hCLE1BQVp2QyxFQUFJdlosS0FBYXFwRyxFQUFRdnRGLFFBQ2IsTUFBWnZDLEVBQUl2WixLQUFhbXBHLEVBQVdydEYsUUFDaEIsTUFBWnZDLEVBQUl2WixLQUFhc3BHLEVBQWtCeHRGLFksK0ZDek0zQyxhQUNBLFFBQ0EsT0FDQSxPQWdUMEIsRUFBQTVILFFBM1MxQixNQVlFLFlBQWE1RixFQUFvQjA3RixHQVZqQyxLQUFBaU0sWUFBYSxFQTRIYixLQUFBQyxlQUFpQixXQUNmdjBHLEtBQUs0QixLQUFPLEdBQ1o1QixLQUFLdzBHLDRCQUNManJHLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFVBQVdoRSxLQUFLK2IsaUJBQ2xEeFMsU0FBU21PLEtBQUsxVCxvQkFBb0IsUUFBU2hFLEtBQUt5MEcsb0JBQ2hEbHJHLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFFBQVNoRSxLQUFLMitGLGtCQUVoRDMrRixLQUFLczBHLFlBQWEsRUFDbEIsSUFDRS9xRyxTQUFTMkIsZUFBZSxvQkFBb0JwQixTQUM1QyxNQUFPNkwsSUFJVCxNQUFNZytGLEVBQWNwcUcsU0FBUzJCLGVBQWUsbUJBRXRDMm9HLEVBRGdCdHFHLFNBQVMyQixlQUFlLGNBQ0wwQyxjQUFjLHdCQUVqRG9tRyxFQUFZenFHLFNBQVMyQixlQUFlLGlCQUVwQ2dwRyxFQURjM3FHLFNBQVMyQixlQUFlLFlBQ0owQyxjQUFjLHdCQUV0RGltRyxFQUFtQmhxRyxVQUFVQyxPQUFPLFdBQ3BDb3FHLEVBQW9CcnFHLFVBQVVlLElBQUksV0FFbEMrb0csRUFBWS9sRyxjQUFjLHNDQUFzQy9ELFVBQVVlLElBQUksYUFDOUVvcEcsRUFBVXBtRyxjQUFjLG9DQUFvQy9ELFVBQVVDLE9BQU8sY0FFN0UsSUFBQTBNLGFBQVksQ0FBRTNPLFNBQVUsVUFFdkJ2SixLQUFLMEIsTUFNUixLQUFBMitGLGlCQUFtQixTQUE0Qi9tRixHQUM3QyxNQUFNelksRUFBU3lZLEVBQUl6WSxPQUNvQixPQUFuQ0EsRUFBT21OLFFBQVEsaUJBQ3NCLE9BQXZDbk4sRUFBT21OLFFBQVEscUJBQ2tCLE9BQWpDbk4sRUFBT21OLFFBQVEsZ0JBQ2Z0TSxLQUFLdTBHLGlCQUNMaHJHLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFVBQ2hDaEUsS0FBSzAwRyxjQUNQbnJHLFNBQVNtTyxLQUFLMVQsb0JBQW9CLFVBQ2hDaEUsS0FBS2EsV0FFUnZDLEtBQUswQixNQUtSLEtBQUF5MEcsbUJBQXFCLFNBQThCNzhGLEdBQ2pDLFVBQVpBLEVBQUl2WixLQUNOa0wsU0FBU3FFLGNBQWM1TixLQUFLOHVCLFVBQ3pCanJCLGlCQUFpQixRQUF1QixVQUFkN0QsS0FBSzRCLEtBQzlCNUIsS0FBSzAwRyxhQUFlMTBHLEtBQUthLFVBRTlCdkMsS0FBSzBCLE1BTVIsS0FBQStiLGdCQUFrQixTQUEyQm5FLEdBQzNCLFdBQVpBLEVBQUl2WixLQUNOMkIsS0FBS3UwRyxpQkFDTGhyRyxTQUFTbU8sS0FBSzFULG9CQUFvQixVQUFXaEUsS0FBSzAwRyxjQUNsRG5yRyxTQUFTbU8sS0FBSzFULG9CQUFvQixVQUFXaEUsS0FBS2EsVUFDN0IsVUFBWitXLEVBQUl2WixLQUNiMkIsS0FBS3cwRyw2QkFFTmwyRyxLQUFLMEIsTUFLUixLQUFBYSxRQUFVLFNBQW1CK1csR0FDM0JBLEVBQUlDLGtCQUdKLE1BQU11cEMsR0FBUyxJQUFBcCtCLGlCQUFnQnBMLEVBQUlxTCxRQUFTckwsRUFBSXNMLFNBQ2hELElBQUksSUFBQXdOLGtCQUFpQjB3QixFQUFPeHZDLEVBQUd3dkMsRUFBT3B2QyxHQUNwQyxPQUFPLElBQUE0QixtQkFBa0IsMkRBQTRELFNBRXZGLE1BQU11SCxFQUE2QixDQUNqQ0MsT0FBUSxTQUNSQyxNQUFPLENBQ0xzNUYsWUFBYTMwRyxLQUFLNEIsS0FDbEIraEIsUUFBUyxPQUNUdFUsSUFBSyt4QyxFQUFPeHZDLEVBQ1p0QyxJQUFLOHhDLEVBQU9wdkMsSUFJUSxPQUFwQmhTLEtBQUs0TSxhQUNQdU8sRUFBYUUsTUFBTXpPLFdBQWE1TSxLQUFLNE0sV0FDSixNQUE3QjVNLEtBQUs0TSxXQUFrQixRQUN6QnVPLEVBQW9CLE1BQU8sS0FBSyxLQUlwQ25iLEtBQUsyTSxTQUFTK08sS0FBS1AsRUFBY25iLEtBQUsyTSxTQUFTRyxLQUFLQyxxQkFBcUI0TyxLQUFLLElBQ3JFM2IsS0FBSzJNLFNBQVNrUCx3QkFDcEJGLEtBQUssS0FDTnBTLFNBQVNxRSxjQUFjNU4sS0FBSzh1QixVQUFVanJCLGlCQUFpQixRQUFTN0QsS0FBS2EsWUFFdEV2QyxLQUFLMEIsTUFLUixLQUFBMDBHLGFBQWUsU0FBd0I5OEYsR0FDckMsTUFBTXdwQyxHQUFTLElBQUFwK0IsaUJBQWdCcEwsRUFBSXFMLFFBQVNyTCxFQUFJc0wsU0FFaEQsSUFBSSxJQUFBd04sa0JBQWlCMHdCLEVBQU94dkMsRUFBR3d2QyxFQUFPcHZDLEdBQ3BDLE9BQU8sSUFBQTRCLG1CQUFrQix3Q0FBeUMsU0FHcEUsTUFBTXNKLEVBQVkzVCxTQUFTcUUsY0FBYyxvQ0FFekMsR0FBSTVOLEtBQUtzMEcsV0FDUHQwRyxLQUFLeXdHLE1BQVFydkQsRUFDYnYyQyxFQUFHcUIsT0FBT2dSLEdBQVcxSixPQUFPLFVBQVV3RixLQUFLLEtBQU1vb0MsRUFBT3h2QyxHQUNyRG9ILEtBQUssS0FBTW9vQyxFQUFPcHZDLEdBQ2xCZ0gsS0FBSyxJQUFLLElBQ1ZBLEtBQUssS0FBTSxnQkFDWEEsS0FBSyxPQUFRLFNBQ2hCaFosS0FBS3MwRyxZQUFhLE1BQ2IsQ0FDTCxJQUFJNU4sRUFBV0MsRUFDWHZsRCxFQUFPeHZDLEVBQUk1UixLQUFLeXdHLE1BQU03K0YsR0FBS3d2QyxFQUFPcHZDLEVBQUloUyxLQUFLeXdHLE1BQU16K0YsR0FDbkQwMEYsRUFBS3RsRCxFQUNMdWxELEVBQUszbUcsS0FBS3l3RyxRQUVWL0osRUFBSzFtRyxLQUFLeXdHLE1BQ1Y5SixFQUFLdmxELEdBRVA3M0MsU0FBUzJCLGVBQWUsZ0JBQWdCcEIsU0FDeEMsTUFBTXNSLEVBQXVCLENBQzNCQSxPQUFRLFNBQ1JDLE1BQU8sQ0FDTHM1RixZQUFhLFFBQ2JoeEYsUUFBUyxPQUNUdFUsSUFBS3EzRixFQUFHOTBGLEVBQ1J0QyxJQUFLbzNGLEVBQUcxMEYsRUFDUnpDLElBQUtvM0YsRUFBRy8wRixFQUNScEMsSUFBS20zRixFQUFHMzBGLElBSVpoUyxLQUFLMk0sU0FBUytPLEtBQUtOLEVBQVFwYixLQUFLMk0sU0FBU0csS0FBS0MscUJBQXFCNE8sS0FBSyxLQUN0RTNiLEtBQUsyTSxTQUFTa1AsdUJBQ2Q3YixLQUFLczBHLFlBQWEsTUFHckJoMkcsS0FBSzBCLE1BS1IsS0FBQXcwRywwQkFBNEIsV0FDMUIsSUFDRWpyRyxTQUFTcUUsY0FBYzVOLEtBQUs4dUIsVUFBVTlxQixvQkFBb0IsUUFBU2hFLEtBQUswMEcsY0FDeEVuckcsU0FBU3FFLGNBQWM1TixLQUFLOHVCLFVBQVU5cUIsb0JBQW9CLFFBQVNoRSxLQUFLYSxTQUN4RSxNQUFPOFUsTUFDUnJYLEtBQUswQixNQXZSTkEsS0FBSzJNLFNBQVdBLEVBQ2hCM00sS0FBSzh1QixTQUFXdTVFLEVBUWxCLGFBQWN1TSxHQUNaLE1BQU1DLEVBQXNCNzBHLEtBQUs4MEcsZUFDakMsT0FBUUYsR0FDTixJQUFLLFVBQ0g1MEcsS0FBSzRCLEtBQU8sS0FDWjVCLEtBQUs0TSxXQUFhLEtBQ2xCLE1BQ0YsSUFBSyxVQUNINU0sS0FBSzRCLEtBQU8sS0FDWjVCLEtBQUs0TSxXQUFhLENBQUVtb0csS0FBTSxNQUMxQixNQUNGLElBQUssUUFDSC8wRyxLQUFLNEIsS0FBTyxLQUNaNUIsS0FBSzRNLFdBQWEsQ0FBRW1vRyxLQUFNLEtBQzFCLE1BRUYsSUFBSyxjQUNILzBHLEtBQUs0QixLQUFPLEtBQ1o1QixLQUFLNE0sV0FBYSxDQUFFeVIsTUFBTyxLQUMzQixNQUNGLElBQUssY0FDSHJlLEtBQUs0QixLQUFPLEtBQ1o1QixLQUFLNE0sV0FBYSxDQUFFeVIsTUFBTyxLQUMzQixNQUNGLElBQUssZ0JBQ0hyZSxLQUFLNEIsS0FBTyxLQUNaNUIsS0FBSzRNLFdBQWEsQ0FBRW1vRyxLQUFNLEtBQzFCLE1BQ0YsSUFBSyxNQUNMLElBQUssU0FDTCxJQUFLLFlBQ0wsSUFBSyxXQUNMLElBQUssV0FDTCxJQUFLLFlBQ0wsSUFBSyxVQUNILE1BQU1oekYsRUFBVS9oQixLQUFLMk0sU0FBU3VWLEtBQUtDLGtCQUNqQ3l5RixFQUFTcGlFLE9BQU8sR0FBR2w3QixjQUFnQnM5RixFQUFTbDBHLE1BQU0sSUFFcERWLEtBQUs0QixLQUFPLFdBQ1o1QixLQUFLNE0sV0FBYSxDQUFFbVYsUUFBU0EsR0FDN0IsTUFDRixJQUFLLFFBQ0wsSUFBSyxRQUNIL2hCLEtBQUs0QixLQUFPLE9BQ1o1QixLQUFLNE0sV0FBYSxDQUFFNFYsTUFBT295RixFQUFTcGlFLE9BQU8sR0FBR2w3QixlQUM5QyxNQUNGLElBQUssU0FDSHRYLEtBQUs0QixLQUFPLFNBQ1o1QixLQUFLNE0sV0FBYSxLQUNsQixNQUNGLElBQUssZ0JBQ0g1TSxLQUFLNEIsS0FBTyxVQUNaNUIsS0FBSzRNLFdBQWEsQ0FBRW9vRyxLQUFNLFVBQzFCLE1BQ0YsSUFBSyxRQUNIaDFHLEtBQUs0QixLQUFPLFFBQ1o1QixLQUFLNE0sV0FBYSxLQUNsQixNQUNGLElBQUssT0FDSDVNLEtBQUs0QixLQUFPLFFBQ1o1QixLQUFLNE0sV0FBYSxDQUFFcW9HLE1BQU8sS0FDM0IsTUFDRixJQUFLLFVBQ0hqMUcsS0FBSzRCLEtBQU8sUUFDWjVCLEtBQUs0TSxXQUFhLENBQUVxb0csTUFBTyxLQUMzQixNQUNGLFFBSUUsT0FIQWoxRyxLQUFLNEIsS0FBTyxHQUNaNUIsS0FBSzRNLFdBQWEsVUFDbEJqSyxRQUFRNEIsTUFBTSxpQ0FBbUNxd0csRUFBVyxLQUloRTUwRyxLQUFLdzBHLDRCQUNMLElBQ29CLFVBQWR4MEcsS0FBSzRCLEtBQ1AySCxTQUFTcUUsY0FBYzVOLEtBQUs4dUIsVUFDekJqckIsaUJBQWlCLFFBQVM3RCxLQUFLMDBHLGNBRWxDbnJHLFNBQVNxRSxjQUFjNU4sS0FBSzh1QixVQUN6QmpyQixpQkFBaUIsUUFBUzdELEtBQUthLFNBRXBDLE1BQU84VSxJQU9ULEdBSkFwTSxTQUFTbU8sS0FBSzdULGlCQUFpQixVQUFXN0QsS0FBSytiLGlCQUMvQ3hTLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFFBQVM3RCxLQUFLeTBHLHFCQUd4Q0ksRUFBcUIsQ0FDeEIsTUFBTUssRUFBaUIzckcsU0FBU2dLLGNBQWMsVUFDOUMyaEcsRUFBZXhzRyxHQUFLLG1CQUNwQndzRyxFQUFlcnJHLFVBQVVlLElBQUksa0JBQzdCc3FHLEVBQWUzcEcsVUFBWSxzQkFDM0JoQyxTQUFTMkIsZUFBZSxRQUFROFksV0FBV3dSLFlBQVkwL0UsR0FDdkRBLEVBQWVyeEcsaUJBQWlCLFFBQVM3RCxLQUFLdTBHLGdCQUdoRGhyRyxTQUFTMkIsZUFBZSxnQkFBZ0JySCxpQkFBaUIsUUFBUzdELEtBQUsyK0Ysa0JBOEt6RSxlQUNFLE1BQXNCLEtBQWQzK0YsS0FBSzRCLFEsOEtDNVNKLEVBQUF1ekcsdUJBQXlDNXJHLFNBQVNnSyxjQUFjLE9BQzdFLEVBQUE0aEcsdUJBQXVCdHJHLFVBQVVlLElBQUksY0FBZSxlQUFnQixnQkFDcEUsTUFBTXdxRyxFQUFrQjdyRyxTQUFTZ0ssY0FBYyxPQUMvQzZoRyxFQUFnQnZyRyxVQUFVZSxJQUFJLGNBQzlCd3FHLEVBQWdCN3BHLFVBQVksa0JBQzVCLE1BQU04cEcsRUFBcUI5ckcsU0FBU2dLLGNBQWMsT0FDbEQ4aEcsRUFBbUJ4ckcsVUFBVWUsSUFBSSxtQkFDakN5cUcsRUFBbUIzc0csR0FBSywwQkFFSyxDQUMzQixDQUFDLE9BQVEsUUFDVCxDQUFDLFNBQVUsMkJBQ1gsQ0FBQyxTQUFVLGlCQUdRaUIsUUFBUStTLElBQzNCLE1BQU1nTixFQUFPbmdCLFNBQVNnSyxjQUFjLE9BQ3BDbVcsRUFBS2hoQixHQUFLZ1UsRUFBUSxHQUNsQmdOLEVBQUs3ZixVQUFVZSxJQUFJLHdCQUNuQjhlLEVBQUt0UyxZQUFjc0YsRUFBUSxHQUMzQjI0RixFQUFtQjcvRSxZQUFZOUwsS0FHakMsRUFBQXlyRix1QkFBdUIzL0UsWUFBWTQvRSxHQUNuQyxFQUFBRCx1QkFBdUIzL0UsWUFBWTYvRSxHQUd0QixFQUFBQyw2QkFBK0MvckcsU0FBU2dLLGNBQWMsT0FDbkYsRUFBQStoRyw2QkFBNkJ6ckcsVUFBVWUsSUFBSSxjQUFlLGVBQWdCLGdCQUMxRSxNQUFNMnFHLEVBQXdCaHNHLFNBQVNnSyxjQUFjLE9BQ3JEZ2lHLEVBQXNCMXJHLFVBQVVlLElBQUksY0FDcEMycUcsRUFBc0JocUcsVUFBWSx5QkFDbEMsTUFBTWlxRyxFQUEyQmpzRyxTQUFTZ0ssY0FBYyxPQUN4RGlpRyxFQUF5QjNyRyxVQUFVZSxJQUFJLG1CQUN2QzRxRyxFQUF5QjlzRyxHQUFLLDBCQUNLLENBQ2pDLENBQUMsb0JBQXFCLDBCQUN0QixDQUFDLHNCQUF1Qix1QkFDeEIsQ0FBQyxTQUFVLFdBR2NpQixRQUFRK1MsSUFDakMsTUFBTWdOLEVBQU9uZ0IsU0FBU2dLLGNBQWMsT0FDcENtVyxFQUFLaGhCLEdBQUtnVSxFQUFRLEdBQ2xCZ04sRUFBSzdmLFVBQVVlLElBQUksd0JBQ25COGUsRUFBS3RTLFlBQWNzRixFQUFRLEdBQzNCODRGLEVBQXlCaGdGLFlBQVk5TCxLQUd2QyxFQUFBNHJGLDZCQUE2QjkvRSxZQUFZKy9FLEdBQ3pDLEVBQUFELDZCQUE2QjkvRSxZQUFZZ2dGLEdBSzVCLEVBQUFDLGVBQ1QsMERBS1MsRUFBQUMsY0FDWCxvSCxzSENuRUYsYUFFQSxRQWlrQkEsU0FBU0MsRUFBYTdqRixHQUNwQixNQUFNelcsRUFBUSxJQUFJN1gsTUFFbEIsSUFBSyxNQUFNK3VCLEtBQVlULEVBQ2pCUyxJQUFhQSxFQUFTazdFLHFCQUFxQixPQUFPcHJHLFFBQ3BEZ1osRUFBTWpaLEtBQUssQ0FDVGdaLE9BQVEsVUFDUkMsTUFBTyxDQUNMQyxVQUFXaVgsRUFBUzNpQixhQUFhLFVBQ2pDNkwsS0FBTSxNQU1kLE9BQU9KLEVBMWtCVCxzQkFBMkIxTyxHQUV6QixNQUFNaXBHLEVBQWtCcnNHLFNBQVNHLGlCQUMvQiwwQ0FFRmxHLE1BQU02RyxLQUFLdXJHLEdBQWlCanNHLFFBQVNrc0csSUFDbkNBLEVBQVNoeUcsaUJBQWlCLFlBQWEsVUFNekMwRixTQUFTMkIsZUFBZSxRQUFRckgsaUJBQWlCLFFBQVMsS0FDeEQ4SSxFQUFTMmxHLE9BQU8zMkYsS0FBSyxLQUNuQmxKLEVBQWFtQixrQkFBa0IsUUFBUyxlQUc1Q3JLLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFVBQVkrVCxJQUN6QixNQUFaQSxFQUFJdlosS0FDTnNPLEVBQVMybEcsT0FBTzMyRixLQUFLLEtBQ25CbEosRUFBYW1CLGtCQUFrQixRQUFTLGVBSzlDckssU0FBUzJCLGVBQWUsVUFBVXJILGlCQUFpQixRQUFTLEtBQzFEOEksRUFBU21wRyxTQUFTbjZGLEtBQU1vNkYsSUFDdEIsTUFBTUMsRUFBMEJ6c0csU0FBU2dLLGNBQWMsS0FDdkR5aUcsRUFBS3pWLEtBQU93VixFQUNaQyxFQUFLQyxTQUFXdHBHLEVBQVN0UCxLQUFPLFVBQ2hDa00sU0FBU21PLEtBQUs4ZCxZQUFZd2dGLEdBQzFCQSxFQUFLNzdGLFFBQ0w2N0YsRUFBS2xzRyxTQUNMMkksRUFBYW1CLGtCQUFrQixRQUFTLGVBTTVDckssU0FBUzJCLGVBQWUsVUFBVXJILGlCQUFpQixRQUFTLEtBQzFELE1BQU1zbEIsRUFBTXhjLEVBQVNHLEtBQUtDLG9CQUMxQkosRUFBU3VwRyxXQUFXL3NGLEdBQUt4TixLQUFNeXVGLElBQzdCLE1BQU12aUYsRUFDSixtQ0FBcUM5ZSxPQUFPaTZCLE1BQUssSUFBQW16RSxlQUFjL0wsSUFDakU3Z0csU0FBUzJCLGVBQWUsVUFBVVYsYUFBYSxPQUFRcWQsR0FDdkR0ZSxTQUNHMkIsZUFBZSxVQUNmVixhQUFhLFdBQVltQyxFQUFTRyxLQUFLc3BHLGNBQWdCLFlBTTlEN3NHLFNBQ0cyQixlQUFlLHFCQUNmckgsaUJBQWlCLFNBQVMsV0FDekIsTUFBTXNsQixFQUFNeGMsRUFBU0csS0FBS0Msb0JBRTFCSixFQUFTdXBHLFdBQVcvc0YsR0FBS3hOLEtBQU15MEYsSUFDN0IsTUFFTWhHLEdBRlMsSUFBSWEsV0FDR0ksZ0JBQWdCK0UsRUFBVyxZQUM5QnBRLGdCQUNibHVFLEVBQVl0dUIsTUFBTTZHLEtBQUsrL0YsRUFBSXFELHFCQUFxQixhQUd0RCxJQUFJNEksR0FBb0IsRUFDeEIsTUFBTUMsRUFBd0IsR0FDOUIsSUFBSyxNQUFNL2pGLEtBQVlULEVBRXJCLEdBQXNELElBQWxEUyxFQUFTazdFLHFCQUFxQixTQUFTcHJHLE9BQWMsQ0FDdkQsTUFBTXFjLEVBQXlCLENBQzdCdEQsT0FBUSxTQUNSQyxNQUFPLENBQ0xDLFVBQVdpWCxFQUFTM2lCLGFBQWEsWUFJckMwbUcsRUFBc0JsMEcsS0FBS3NjLEdBQzNCMjNGLEdBQW9CLEVBS3hCLEdBQUtBLEVBRUUsQ0FFTCxNQUFNRSxFQUFrQyxDQUN0Q243RixPQUFRLFFBQ1JDLE1BQU9pN0YsR0FLVDNwRyxFQUFTK08sS0FBSzY2RixFQUFtQnB0RixHQUFLeE4sS0FBTXFELElBQ3RDQSxHQUNGclMsRUFBU2tQLHVCQUNUcEosRUFBYW1CLGtCQUNYLDBCQUNBLFlBR0ZuQixFQUFhbUIsa0JBQ1gsbUNBQ0EsZ0JBcEJObkIsRUFBYW1CLGtCQUFrQiwyQkFBNEIsZ0JBNkJuRXJLLFNBQ0cyQixlQUFlLHVCQUNmckgsaUJBQWlCLFNBQVMsV0FDekIsTUFBTXNsQixFQUFNeGMsRUFBU0csS0FBS0Msb0JBRTFCSixFQUFTdXBHLFdBQVcvc0YsR0FBS3hOLEtBQU15MEYsSUFDN0IsTUFFTWhHLEdBRlMsSUFBSWEsV0FDR0ksZ0JBQWdCK0UsRUFBVyxZQUM5QnBRLGdCQUNib08sRUFBUzVxRyxNQUFNNkcsS0FBSysvRixFQUFJcUQscUJBQXFCLFVBR25ELElBQUkrSSxHQUFpQixFQUNyQixNQUFNQyxFQUFxQixHQUMzQixJQUFLLE1BQU1oc0csS0FBUzJqRyxFQUVsQixHQUFnRCxJQUE1QzNqRyxFQUFNZ2pHLHFCQUFxQixNQUFNcHJHLE9BQWMsQ0FDakQsTUFBTXFjLEVBQXlCLENBQzdCdEQsT0FBUSxTQUNSQyxNQUFPLENBQ0xDLFVBQVc3USxFQUFNbUYsYUFBYSxZQUlsQzZtRyxFQUFtQnIwRyxLQUFLc2MsR0FDeEI4M0YsR0FBaUIsRUFLckIsR0FBS0EsRUFFRSxDQUVMLE1BQU1ELEVBQWtDLENBQ3RDbjdGLE9BQVEsUUFDUkMsTUFBT283RixHQUtUOXBHLEVBQVMrTyxLQUFLNjZGLEVBQW1CcHRGLEdBQUt4TixLQUFNcUQsSUFDdENBLEdBQ0ZyUyxFQUFTa1AsdUJBQ1RwSixFQUFhbUIsa0JBQWtCLHVCQUF3QixZQUV2RG5CLEVBQWFtQixrQkFDWCxnQ0FDQSxnQkFqQk5uQixFQUFhbUIsa0JBQWtCLHdCQUF5QixnQkF5QmhFckssU0FDRzJCLGVBQWUsK0JBQ2ZySCxpQkFBaUIsU0FBUyxXQUN6QixNQUFNc2xCLEVBQU14YyxFQUFTRyxLQUFLQyxvQkFDMUJKLEVBQVN1cEcsV0FBVy9zRixHQUFLeE4sS0FBTXkwRixJQUU3QixNQUVNaEcsR0FGUyxJQUFJYSxXQUNHSSxnQkFBZ0IrRSxFQUFXLFlBQzlCcFEsZ0JBR2JxUSxFQUFhakcsRUFBSXg4RixjQUFjLFdBQy9CMGlHLEVBQVMxd0csT0FBT3l3RyxFQUFXemdHLGFBQWEsUUFDNUMyZ0csRUFBUzN3RyxPQUFPeXdHLEVBQVd6Z0csYUFBYSxRQVUxQyxNQUNNOG1HLEVBRFFsekcsTUFBTTZHLEtBQUsrL0YsRUFBSTFnRyxpQkFBaUIsU0FDaEJzRixPQUFRcTdGLEdBQ3BDLENBQUMsTUFBTyxNQUFPLE1BQU8sT0FBT3h3RCxLQUFNN2dDLEdBVnJDLFNBQTJCcXhGLEVBQWVyeEYsR0FDeEMsTUFBTXkzRixFQUFRN3dHLE9BQU95cUcsRUFBS3o2RixhQUFhb0osSUFFdkMsT0FBT3kzRixFQUFRLEdBQUtBLEdBREMsT0FBUnozRixHQUF5QixPQUFSQSxFQUFnQnMzRixFQUFTQyxHQVNyREcsQ0FBa0JyRyxFQUFNcnhGLEtBR3RCMjlGLEVBQVUsSUFBSXo5RSxJQUNsQnc5RSxFQUFnQjVtRyxJQUFLdTZGLEdBQVMsQ0FBQ0EsRUFBS3o2RixhQUFhLFVBQVd5NkYsS0FPeER1TSxFQUhTcHpHLE1BQU02RyxLQUNuQisvRixFQUFJMWdHLGlCQUFpQiw2QkFFU3NGLE9BQVE2bkcsSUFDdEMsR0FBSUEsRUFBTW5uRixhQUFhLFFBQVMsQ0FDOUIsTUFBTW9uRixFQUFTRCxFQUFNam5HLGFBQWEsUUFBUWxQLE1BQU0sR0FDaEQsT0FBT2kyRyxFQUFRL2xHLElBQUlrbUcsR0FHckIsT0FBTyxJQUtULEdBQWdDLElBQTVCRixFQUFpQnYwRyxPQUNuQixPQUFPb1EsRUFBYW1CLGtCQUNsQiw4Q0FDQSxXQUtKLE1BU00rSyxFQUE0QixDQUNoQ3ZELE9BQVEsUUFDUkMsTUFYb0N1N0YsRUFBaUI5bUcsSUFBSyttRyxJQUNuRCxDQUNMejdGLE9BQVEsU0FDUkMsTUFBTyxDQUNMQyxVQUFXdTdGLEVBQU1qbkcsYUFBYSxlQVVwQ2pELEVBQVMrTyxLQUFLaUQsRUFBYXdLLEdBQUt4TixLQUFNcUQsSUFDaENBLEdBQ0ZyUyxFQUFTa1AsdUJBQ1RwSixFQUFhbUIsa0JBQ1gsZ0RBQ0EsWUFHRm5CLEVBQWFtQixrQkFDWCwyQ0FDQSxnQkFPWnJLLFNBQ0cyQixlQUFlLDRCQUNmckgsaUJBQWlCLFNBQVMsV0FDekIsTUFBTXNsQixFQUFNeGMsRUFBU0csS0FBS0Msb0JBQzFCSixFQUFTdXBHLFdBQVcvc0YsR0FBS3hOLEtBQU15MEYsSUFFN0IsTUFFTWhHLEdBRlMsSUFBSWEsV0FDR0ksZ0JBQWdCK0UsRUFBVyxZQUM5QnBRLGdCQUNienNFLEVBQU0vdkIsTUFBTTZHLEtBQUsrL0YsRUFBSXFELHFCQUFxQixPQUVoRCxJQUFJc0osR0FBb0IsRUFDeEIsTUFBTXA0RixFQUE0QixDQUNoQ3ZELE9BQVEsUUFDUkMsTUFBTyxJQUVIQSxFQUFRLElBQUk3WCxNQUNsQixJQUFJb25HLEVBQVEsRUFDWixLQUFPQSxFQUFRcjNFLEVBQUlseEIsUUFDYmt4QixFQUFJcTNFLEdBQU9oN0YsYUFBYSxjQUV2Qmc3RixFQUFRcjNFLEVBQUlseEIsT0FBUyxJQUNuQmt4QixFQUFJcTNFLEVBQVEsR0FBR2g3RixhQUFhLFlBQy9CZzdGLEdBQVNyM0UsRUFBSWx4QixPQUFTLEtBSXRCMDBHLEdBQW9CLEVBQ3BCMTdGLEVBQU1qWixLQUFLLENBQ1RnWixPQUFRLE1BQ1JDLE1BQU8sQ0FDTEMsVUFBV2lZLEVBQUlxM0UsR0FBT2g3RixhQUFhLFVBQ25DbU8sU0FBVSxVQUNWQyxVQUFXLE9BSWpCNHNGLEdBQVMsR0FFWEEsR0FBUyxFQUdObU0sR0FNSHA0RixFQUFZdEQsTUFBUUEsRUFDcEIxTyxFQUNHK08sS0FBS2lELEVBQWFoUyxFQUFTRyxLQUFLQyxxQkFDaEM0TyxLQUFNcUQsSUFDREEsRUFDRnZNLEVBQWFtQixrQkFDWCw2QkFDQSxXQUdGbkIsRUFBYW1CLGtCQUNYLHNDQUNBLFNBR0pqSCxFQUFTa1AsMEJBcEJicEosRUFBYW1CLGtCQUNYLDRCQUNBLGdCQXdCVnJLLFNBQ0cyQixlQUFlLHlCQUNmckgsaUJBQWlCLFNBQVMsV0FDekIsTUFBTXNsQixFQUFNeGMsRUFBU0csS0FBS0Msb0JBQzFCSixFQUFTdXBHLFdBQVcvc0YsR0FBS3hOLEtBQU15MEYsSUFFN0IsTUFFTWhHLEdBRlMsSUFBSWEsV0FDR0ksZ0JBQWdCK0UsRUFBVyxZQUM5QnBRLGdCQUNibHVFLEVBQVl0dUIsTUFBTTZHLEtBQUsrL0YsRUFBSXFELHFCQUFxQixhQUVoRHVKLEVBNlBkLFNBQTZCbGxGLEdBQzNCLE1BQU1rbEYsRUFBOEIsR0FDcEMsSUFBSyxJQUFJMWtGLEVBQU0sRUFBR0EsRUFBTVIsRUFBVXp2QixPQUFRaXdCLElBQU8sQ0FDL0MsTUFBTUMsRUFBV1QsRUFBVVUsR0FBR0YsR0FDOUIsR0FBSUMsRUFBUzdDLGFBQWEsWUFBYSxDQUVyQyxNQUFNK0MsRUFBaUJGLEVBQVMzaUIsYUFBYSxZQUFZb0wsUUFBUSxJQUFLLElBR3RFLElBQUkwWCxFQUNKLE1BQU1DLEVBQWViLEVBQVVsVSxLQUFLLENBQUN0VSxFQUFTZ3BCLElBQ3hDaHBCLEVBQVFzRyxhQUFhLFlBQWM2aUIsSUFDckNDLEVBQWtCSixHQUNYLElBT05LLEdBQ0hxa0YsRUFBaUI1MEcsS0FBS213QixHQUluQkksRUFBYWpELGFBQWEsWUFDN0JzbkYsRUFBaUI1MEcsS0FBS213QixHQUt0QkksRUFBYS9pQixhQUFhLFlBQzFCLElBQU0yaUIsRUFBUzNpQixhQUFhLFdBRTVCb25HLEVBQWlCNTBHLEtBQUttd0IsR0FNcEJHLElBQW9CSixFQUFNLEdBQzVCMGtGLEVBQWlCNTBHLEtBQUttd0IsR0FHMUIsR0FBSUEsRUFBUzdDLGFBQWEsV0FBWSxDQUNwQyxNQUFNa0QsRUFBaUJMLEVBQVMzaUIsYUFBYSxXQUFXb0wsUUFBUSxJQUFLLElBQy9ENlgsRUFBZWYsRUFBVWxVLEtBQzVCMlUsR0FBYUEsRUFBUzNpQixhQUFhLFlBQWNnakIsR0FJL0NDLEdBQ0hta0YsRUFBaUI1MEcsS0FBS213QixHQUluQk0sRUFBYW5ELGFBQWEsYUFDN0JzbkYsRUFBaUI1MEcsS0FBS213QixHQUt0Qk0sRUFBYWpqQixhQUFhLGFBQzFCLElBQU0yaUIsRUFBUzNpQixhQUFhLFdBRTVCb25HLEVBQWlCNTBHLEtBQUttd0IsSUFJNUIsT0FBT3lrRixFQWxVd0JDLENBQW9CbmxGLEdBRTdDLEdBQWdDLElBQTVCa2xGLEVBQWlCMzBHLE9BQ25Cb1EsRUFBYW1CLGtCQUNYLDZCQUNBLGVBRUcsQ0FDTCxNQUFNK0ssRUFBNEIsQ0FDaEN2RCxPQUFRLFFBQ1JDLE1BQU8sSUFFSEEsRUFBUSxJQUFJN1gsTUFDbEIsSUFBSyxNQUFNK3VCLEtBQVl5a0YsRUFDckIsR0FDRXprRixFQUFTN0MsYUFBYSxhQUN0QjZDLEVBQVM3QyxhQUFhLFdBQ3RCLENBQ0EsTUFBTXduRixFQUFtQnBsRixFQUFVbFUsS0FDaEN0VSxHQUNDQSxFQUFRc0csYUFBYSxZQUNyQjJpQixFQUFTM2lCLGFBQWEsWUFBWXFWLFVBQVUsSUFFMUNreUYsRUFBa0JybEYsRUFBVWxVLEtBQy9CdFUsR0FDQ0EsRUFBUXNHLGFBQWEsWUFDckIyaUIsRUFBUzNpQixhQUFhLFdBQVdxVixVQUFVLElBRy9DNUosRUFBTWpaLEtBQUssQ0FDVGdaLE9BQVEsTUFDUkMsTUFBTyxDQUNMQyxVQUFXaVgsRUFBUzNpQixhQUFhLFVBQ2pDbU8sU0FBVSxXQUNWQyxVQUFXLE1BR2YzQyxFQUFNalosS0FBSyxDQUNUZ1osT0FBUSxNQUNSQyxNQUFPLENBQ0xDLFVBQVdpWCxFQUFTM2lCLGFBQWEsVUFDakNtTyxTQUFVLFVBQ1ZDLFVBQVcsTUFHZjNDLEVBQU1qWixLQUFLLENBQ1RnWixPQUFRLE1BQ1JDLE1BQU8sQ0FDTEMsVUFBVzQ3RixFQUFpQnRuRyxhQUFhLFVBQ3pDbU8sU0FBVSxVQUNWQyxVQUFXLE1BR2YzQyxFQUFNalosS0FBSyxDQUNUZ1osT0FBUSxNQUNSQyxNQUFPLENBQ0xDLFVBQVc2N0YsRUFBZ0J2bkcsYUFBYSxVQUN4Q21PLFNBQVUsV0FDVkMsVUFBVyxNQUlmM0MsRUFBTWpaLFFBQ0R1ekcsRUFBYSxDQUFDcGpGLEVBQVUya0YsRUFBa0JDLFVBRTFDLEdBQUk1a0YsRUFBUzdDLGFBQWEsWUFBYSxDQUM1QyxNQUFNd25GLEVBQW1CcGxGLEVBQVVsVSxLQUNoQ3RVLEdBQ0NBLEVBQVFzRyxhQUFhLFlBQ3JCMmlCLEVBQVMzaUIsYUFBYSxZQUFZcVYsVUFBVSxJQUdoRDVKLEVBQU1qWixLQUFLLENBQ1RnWixPQUFRLE1BQ1JDLE1BQU8sQ0FDTEMsVUFBV2lYLEVBQVMzaUIsYUFBYSxVQUNqQ21PLFNBQVUsV0FDVkMsVUFBVyxNQUdmM0MsRUFBTWpaLEtBQUssQ0FDVGdaLE9BQVEsTUFDUkMsTUFBTyxDQUNMQyxVQUFXNDdGLEVBQWlCdG5HLGFBQWEsVUFDekNtTyxTQUFVLFVBQ1ZDLFVBQVcsTUFHZjNDLEVBQU1qWixRQUFRdXpHLEVBQWEsQ0FBQ3BqRixFQUFVMmtGLFVBQ2pDLEdBQUkza0YsRUFBUzdDLGFBQWEsV0FBWSxDQUMzQyxNQUFNeW5GLEVBQWtCcmxGLEVBQVVsVSxLQUMvQnRVLEdBQ0NBLEVBQVFzRyxhQUFhLFlBQ3JCMmlCLEVBQVMzaUIsYUFBYSxXQUFXcVYsVUFBVSxJQUcvQzVKLEVBQU1qWixLQUFLLENBQ1RnWixPQUFRLE1BQ1JDLE1BQU8sQ0FDTEMsVUFBV2lYLEVBQVMzaUIsYUFBYSxVQUNqQ21PLFNBQVUsVUFDVkMsVUFBVyxNQUdmM0MsRUFBTWpaLEtBQUssQ0FDVGdaLE9BQVEsTUFDUkMsTUFBTyxDQUNMQyxVQUFXNjdGLEVBQWdCdm5HLGFBQWEsVUFDeENtTyxTQUFVLFdBQ1ZDLFVBQVcsTUFHZjNDLEVBQU1qWixRQUFRdXpHLEVBQWEsQ0FBQ3BqRixFQUFVNGtGLEtBSTFDeDRGLEVBQVl0RCxNQUFRQSxFQUNwQjFPLEVBQ0crTyxLQUFLaUQsRUFBYWhTLEVBQVNHLEtBQUtDLHFCQUNoQzRPLEtBQU1xRCxJQUNEQSxFQUNGdk0sRUFBYW1CLGtCQUNYLDhCQUNBLFdBR0ZuQixFQUFhbUIsa0JBQ1gsdUNBQ0EsU0FHSmpILEVBQVNrUCwrQkFPckJ0UyxTQUFTMkIsZUFBZSxVQUFVckgsaUJBQWlCLFNBQVMsV0FFeERrRixPQUFPeTFGLFFBQ0wsdUVBR0Y3eEYsRUFBU3lxRyxXQUFXejdGLEtBQUssS0FDdkI1UyxPQUFPc3VHLFNBQVNDLGVBMkN4Qiw2QkFBa0MzcUcsR0FJaEMsU0FBUzRxRyxJQUNQNXFHLEVBQVM2cUcsT0FBTzc3RixLQUFNcUQsSUFDaEJBLEVBQ0ZyUyxFQUFTa1Asd0JBRVRwSixFQUFhbUIsa0JBQWtCLGtDQUMvQmpSLFFBQVFDLEtBQUssNEJBUW5CLFNBQVM2MEcsSUFDUDlxRyxFQUFTK3FHLE9BQU8vN0YsS0FBTXFELElBQ2hCQSxFQUNGclMsRUFBU2tQLHdCQUVUcEosRUFBYW1CLGtCQUFrQixrQ0FDL0JqUixRQUFRQyxLQUFLLDRCQUtuQjJHLFNBQVMyQixlQUFlLFFBQVFySCxpQkFBaUIsUUFBUzB6RyxHQUMxRGh1RyxTQUFTbU8sS0FBSzdULGlCQUFpQixVQUFZK1QsSUFDekIsTUFBWkEsRUFBSXZaLE1BQWdCdVosRUFBSXF3RixTQUFXcndGLEVBQUlvQyxVQUN6Q3U5RixNQUlKaHVHLFNBQVMyQixlQUFlLFFBQVFySCxpQkFBaUIsUUFBUzR6RyxHQUMxRGx1RyxTQUFTbU8sS0FBSzdULGlCQUFpQixVQUFZK1QsS0FFMUIsTUFBWkEsRUFBSXZaLEtBQTRCLE1BQVp1WixFQUFJdlosS0FBZXVaLEVBQUlvdUYsWUFDM0NwdUYsRUFBSXF3RixTQUFXcndGLEVBQUlvQyxVQUVwQnk5RixRLGdGQzlqQk4sY0FDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBR0EsUUFFTXA2RyxFQUFPczZHLEVBQVksWUFDbkJuRixFQUFVbUYsRUFBWSxXQUU1QixHQUFJdDZHLEVBQU0sQ0FDUixNQUFNdTZHLEVBQW1CLHVCQUF1QnY2RyxXQUNoRDBMLE9BQU82cUMsTUFBTWdrRSxHQUFrQmo4RixLQUFLQyxJQUNsQyxHQUFJQSxFQUFTZ2dCLEdBQ1gsT0FBT2hnQixFQUFTSCxPQUVoQixNQUFNLElBQUlqWixNQUFNb1osRUFBU2k4RixjQUUxQmw4RixLQUFLblAsTUFBTWlQLElBQ1osSUFBSXM2RixFQUNKLElBQ0VBLEVBQVdsdEcsS0FBS0MsTUFBTTJTLEdBQ3RCLE1BQU85RixHQUdQLE9BRkFoVCxRQUFRNEIsTUFBTW9SLFFBQ2RoVCxRQUFRcXNHLE1BQU12ekYsR0FZaEIsSUFBSWpULEVBRUZBLFNBVjhCLElBQUlySSxRQUFRLENBQUNDLEVBQVNDLEtBQ3BEMEksT0FBTzZxQyxNQUFNbWlFLEVBQVMrQixPQUFPbjhGLEtBQUtDLElBQ2hDeGIsRUFBZ0J3YixFQUFTOHhDLFFBQVEvdkQsSUFBSSxtQkFDcEMwa0MsTUFBTTloQyxJQUNQRixFQUFPRSxRQUtHc1AsTUFBTSxZQUNULENBQ1BrbUcsU0FBVUEsRUFDVmdDLFFBQVMsVUFDVEMsS0FBTSxVQUNOQyxTQUFVLFVBQ1ZDLFNBQVUsVUFDVkMsS0FBTSxVQUNOQyxVQUFXLFdBR0osQ0FDUHJDLFNBQVVBLEVBQ1ZnQyxRQUFTLFVBQ1RDLEtBQU0sVUFDTkMsU0FBVSxVQUNWQyxTQUFVLFVBQ1ZDLEtBQU0sVUFDTkMsVUFBVyxXQUlGLElBQUksVUFBUzV2RyxHQUNyQnU4QixjQUVGLENBQ00sSUFBSSxVQUFRLHFCQUNwQnlNLGNBQWNnaEUsRUFBUyxZQUFZNzJGLEtBQUtxb0IsR0FDbEMsSUFBSWo3QixPQUFPc3ZHLFNBQVNyMEUsR0FBTXNiLFFBQ2hDM2pDLEtBQUtuUCxNQUFNdXBHLElBU1osSUFBSXZ0RyxFQUVGQSxTQVY4QixJQUFJckksUUFBUSxDQUFDQyxFQUFTQyxLQUNwRDBJLE9BQU82cUMsTUFBTW1pRSxFQUFTK0IsT0FBT244RixLQUFLQyxJQUNoQ3hiLEVBQWdCd2IsRUFBUzh4QyxRQUFRL3ZELElBQUksbUJBQ3BDMGtDLE1BQU05aEMsSUFDUEYsRUFBT0UsUUFLR3NQLE1BQU0sWUFDVCxDQUNQa21HLFNBQVVBLEVBQ1ZnQyxRQUFTLFVBQ1RDLEtBQU0sVUFDTkMsU0FBVSxVQUNWQyxTQUFVLFVBQ1ZDLEtBQU0sVUFDTkMsVUFBVyxXQUdKLENBQ1ByQyxTQUFVQSxFQUNWZ0MsUUFBUyxVQUNUQyxLQUFNLFVBQ05DLFNBQVUsVUFDVkMsU0FBVSxVQUNWQyxLQUFNLFVBQ05DLFVBQVcsV0FJRixJQUFJLFVBQVM1dkcsR0FDckJ1OEIsVUFJVCxTQUFTNHlFLEVBQVl0akQsR0FDbkIsSUFBSXIxQyxFQVdKLE9BVEFqVyxPQUFPc3VHLFNBQVN2a0csT0FDYmdELE9BQU8sR0FDUGlYLE1BQU0sS0FDTnBqQixRQUFTK2YsSUFDUixNQUFNNUUsRUFBTTRFLEVBQUtxRCxNQUFNLEtBQ25CakksRUFBSSxLQUFPdXZDLElBQ2JyMUMsRUFBU2dPLG1CQUFtQmxJLEVBQUksT0FHL0I5RixJLCtGQ3pIVCxjQUNBLFFBQ0EsUUFDQSxRQUNBLFFBV0EsUUFDQSxRQUNBLE9BbU9xQixFQUFBek0sUUE1TnJCLE1BNEJFLFlBQWEvSixJQUNOLElBQUE4dkcsZUFBYzl2RyxFQUFPdXRHLFdBQ3hCcHpHLFFBQVE0QixNQUFNLGdDQUdoQnZFLEtBQUt3SSxPQUFTQSxFQUNkeEksS0FBSysxRyxTQUFXdnRHLEVBQU91dEcsU0FNekIsVUFBVXZ0RyxHQVFSLFFBTndCdEgsSUFBcEJzSCxFQUFPeXZHLFdBQ1RqNEcsS0FBS3U0RyxTQUFXLElBQUkvdkcsRUFBT3l2RyxTQUFTajRHLFdBQ1prQixJQUFwQnNILEVBQU8wdkcsV0FDVGw0RyxLQUFLazRHLFNBQVcsSUFBSTF2RyxFQUFPMHZHLFNBQVNsNEcsYUFHZmtCLElBQXJCc0gsRUFBTzR2RyxVQUF5QixDQUNsQ3A0RyxLQUFLbzRHLFVBQVksSUFBSTV2RyxFQUFPNHZHLFVBQVVwNEcsTUFDdENBLEtBQUt1NEcsU0FBU0MsdUJBQ2QsTUFBTSxTQUFFM3dHLEVBQVEsV0FBRUMsRUFBVSxjQUFFRSxJQUFrQixJQUFBZ1EsZUFHaEQsT0FGQXpPLFNBQVMyQixlQUFlcEQsR0FBWStCLFVBQVVlLElBQUksYUFDbERyQixTQUFTMkIsZUFBZWxELEdBQWU2QixVQUFVZSxJQUFJLGFBQzdDL0MsR0FDTixJQUFLLFNBQ0gwQixTQUFTMkIsZUFBZXBELEdBQVlxUyxRQUNwQyxNQUNGLElBQUssT0FDTCxRQUNFNVEsU0FBUzJCLGVBQWVsRCxHQUFlbVMsVUFTL0MsU0FTRSxhQUFRbmEsTUFBTTJiLEtBQUssS0FFakIzYixLQUFLc0gsY0FBZ0IsSUFBSSxVQUFjdEgsS0FBSysxRyxTQUFTLFFBQ3JELzFHLEtBQUs4TSxLQUFPLElBQUk5TSxLQUFLd0ksT0FBTzJ2RyxLQUFLbjRHLEtBQU1BLEtBQUt3SSxPQUFPdXZHLFFBQVMvM0csS0FBSysxRyxTQUFTK0IsT0FDMUU5M0csS0FBSzNDLEtBQU8yQyxLQUFLKzFHLFNBQVM1NEYsTUFDMUJuZCxLQUFLeTRHLEtBQU8sSUFBSSxVQUFTejRHLEtBQUsrMUcsVUFDOUIvMUcsS0FBS2tpQixLQUFPLElBQUlsaUIsS0FBS3dJLE9BQU93dkcsS0FBS2g0RyxNQUNqQ0EsS0FBS214RyxNQUFRLElBQUksRUFBQXY4RSxZQUFZNTBCLE1BQzdCMDRHLEVBQVczNEcsS0FBS0MsT0FDaEIsSUFBQTI0RyxpQkFDQSxJQUFBQyx3QkFFQTU0RyxLQUFLNjRHLFVBQVU3NEcsS0FBS3dJLFFBQ2J4SSxLQUFLeTRHLEtBQUtLLFdBQ2hCbjlGLEtBQUssSUFFQzNiLEtBQUs2YixzQkFBcUIsSUFDaENGLEtBQUssS0FFTjNiLEtBQUs4TSxLQUFLaXNHLGNBUWQscUJBQXNCeHFCLEdBQVEsR0FDNUIsTUFBTXlxQixFQUFTaDVHLEtBQUs4TSxLQUFLbXNHLGlCQUN6QixPQUFPajVHLEtBQUs4TSxLQUFLb3NHLFdBQVdGLEVBQVF6cUIsR0FNdEMsT0FFRSxPQURBLElBQUE0cUIsaUJBQWUsR0FDUm41RyxLQUFLeTRHLEtBQUtmLEtBQUsxM0csS0FBSzhNLEtBQUtDLHFCQU1sQyxPQUVFLE9BREEsSUFBQW9zRyxpQkFBZSxHQUNSbjVHLEtBQUt5NEcsS0FBS2pCLEtBQUt4M0csS0FBSzhNLEtBQUtDLHFCQU9sQyxjQUNFLE1BQU0sU0FBRWxGLElBQWEsSUFBQW1RLGVBQ3JCLE9BQU9uUSxFQVFULEtBQU11VCxFQUFzQmcrRixHQUMxQixPQUFPcDVHLEtBQUt5NEcsS0FBSy84RixLQUFLTixFQUFRZytGLEdBUWhDLGVBQWdCQyxFQUFtQkQsR0FDakMsT0FBT3A1RyxLQUFLeTRHLEtBQUs1ckcsZUFBZXdzRyxFQUFXRCxHQU83QyxTQUNFLE9BQU8sSUFBS2o1RyxRQUFRLENBQUNDLEVBQVNDLEtBQzVCTCxLQUFLeTRHLEtBQUthLGlCQUFpQjM5RixLQUFLLEtBQzlCM2IsS0FBSysxRyxTQUEwQixnQkFBSS8xRyxLQUFLeTRHLEtBQUtjLGlCQUM3Q3Y1RyxLQUFLKzFHLFNBQVN5RCxXQUFZLElBQUs3L0UsTUFBUUUsY0FDdkMsTUFBTWhTLEVBQU8sSUFBSTllLE9BQU8rd0IsS0FBSyxDQUFDanhCLEtBQUtPLFVBQVVwSixLQUFLKzFHLFNBQVUsS0FBTSxJQUFLLENBQUVuMEcsS0FBTSx3QkFDekVxaUMsRUFBUyxJQUFJQyxXQUNuQkQsRUFBT3BnQyxpQkFBaUIsT0FBUSxLQUM5QnpELEVBQVE2akMsRUFBT2psQixVQUVqQmlsQixFQUFPdzFFLGNBQWM1eEYsS0FDcEJ3YSxNQUFNOWhDLElBQVNGLEVBQU9FLE9BTzdCLE9BRUUsT0FEQSxJQUFBNDRHLGlCQUFlLEdBQ1JuNUcsS0FBS3k0RyxLQUFLYSxpQkFNbkIsV0FDRSxPQUFPdDVHLEtBQUt5NEcsS0FBS3JCLFdBUW5CLFdBQVk0QixHQUlWLFlBSGU5M0csSUFBWDgzRyxJQUNGQSxFQUFTaDVHLEtBQUs4TSxLQUFLQyxxQkFFZCxJQUFJNU0sUUFBU0MsSUFDbEJKLEtBQUt5NEcsS0FBS2lCLE9BQU9WLEdBQVFyOUYsS0FBTXl1RixJQUM3QmhxRyxFQUFRLDBDQUE0Q21sQixtQkFBbUI2a0YsUUFTN0UsV0FBWTRPLEdBQ1YsT0FBT2g1RyxLQUFLeTRHLEtBQUtpQixPQUFPVixHQU8xQixXQUFZQSxHQUNWLE9BQU9oNUcsS0FBS3k0RyxLQUFLa0IsT0FBT1gsTSwrRkNoUDVCLGNBQ0EsUUFDQSxRQUVBLFFBRUEsUUFDQSxRQStqQnFCLEVBQUF6bUcsUUE5aUJyQixNQXVCRSxZQUFhd2pHLEdBQ1gvMUcsS0FBSzQ1RyxlQUFpQixJQUFJLFVBTzFCNTVHLEtBQUs2NUcsV0FBYSxJQUFJM2dGLElBTXRCbDVCLEtBQUs4NUcsV0FBYSxJQUFJNWdGLElBRXRCbDVCLEtBQUsrNUcsVUFBWSxJQUFJN2dGLElBRXJCbDVCLEtBQUt5aEMsT0FBUyxJQUFJd3BFLFVBRWxCanJHLEtBQUs4N0IsR0FBSyxJQUFJLFVBQVEsUUFFdEI5N0IsS0FBS2c2RyxXQUFhLEdBR2xCaDZHLEtBQUsrMUcsU0FBV0EsRUFDaEIvMUcsS0FBS2k2RyxZQUFjbEUsRUFBU21FLGdCQUM1Qmw2RyxLQUFLbTZHLGVBQWlCLEdBaEN4QixpQkFBcUMsT0FBT242RyxLQUFLaTZHLFlBeUNqRCxhQUFjNXJFLEdBQVEsR0F3RnBCLGFBcEZ1QixJQUFJbHVDLFFBQWlCLENBQUNDLEVBQVNDLEtBQ3BETCxLQUFLODdCLEdBQUduK0IsSUFBSXFDLEtBQUsrMUcsU0FBUyxRQUFRMXpFLE1BQU05aEMsSUFDdEMsR0FBaUIsY0FBYkEsRUFBSWxELEtBQXNCLENBRTVCLE1BQU1takMsRUFBTSxDQUNWaUMsSUFBS3ppQyxLQUFLKzFHLFNBQVMsT0FDbkJ5RCxVQUFXeDVHLEtBQUsrMUcsU0FBU3lELFVBQ3pCMUIsTUFBTzkzRyxLQUFLKzFHLFNBQVMrQixNQUNyQjM2RixNQUFPbmQsS0FBSysxRyxTQUFTNTRGLE1BQ3JCODhGLFlBQWEsSUFLZixPQUhBajZHLEtBQUtpNkcsWUFBWXR3RyxRQUFReXdHLElBQ3ZCNTVFLEVBQUl5NUUsWUFBWTczRyxLQUFLZzRHLEVBQVcxeEcsTUFFM0I4M0IsRUFHUCxPQURBNzlCLFFBQVE0QixNQUFNaEUsR0FDUEYsRUFBT0UsS0FFZm9iLEtBQUtuUCxNQUFPZzBCLElBRWIsTUFNTTY1RSxFQUFpQiw0QkFJdkIsR0FWZ0IsSUFBSzFnRixLQUFLNkcsRUFBSWc1RSxXQUFZYyxXQU96QkQsRUFBZXJ6RyxLQUFLaEgsS0FBSysxRyxTQUFTeUQsV0FDakQsSUFBSzcvRSxLQUFLMzVCLEtBQUsrMUcsU0FBU3lELFVBQVV4K0YsUUFBUXEvRixFQUFnQixVQUFXQyxVQUNuRSxJQUFLM2dGLEtBQUszNUIsS0FBSysxRyxTQUFTeUQsV0FBWWMsYUFFakNqc0UsRUFBTyxDQUVWcnVDLEtBQUtpNkcsWUFBYyxHQUNuQixNQUFNenBFLEVBQVdoUSxFQUFJeTVFLFlBQVlucUcsSUFBS3BILEdBQzdCLElBQUl2SSxRQUFTMHFCLElBQ2xCN3FCLEtBQUs4N0IsR0FBR24rQixJQUFJK0ssR0FBSWlULEtBQU15K0YsSUFDcEJwNkcsS0FBS2k2RyxZQUFZNzNHLEtBQUssQ0FDcEJzRyxHQUFJMHhHLEVBQVczM0UsSUFDZjdnQyxLQUFNLGFBQ044VixLQUFNMGlHLEVBQVcxaUcsS0FDakJ2WSxPQUFRaTdHLEVBQVdqN0csU0FFckIwckIsRUFBSSxNQUNId1gsTUFBTTloQyxJQUNQb0MsUUFBUTRCLE1BQU1oRSxHQUNkc3FCLEVBQUksU0FLVixhQURNMXFCLFFBQVF1d0MsSUFBSUYsR0FDWHB3QyxHQUFRLEdBR25CLElBQUssTUFBTWc2RyxLQUFjcDZHLEtBQUtpNkcsa0JBRXRCajZHLEtBQUs4N0IsR0FBR24rQixJQUFJeThHLEVBQVcxeEcsSUFBSTI1QixNQUFNOWhDLEdBQ3BCLGNBQWJBLEVBQUlsRCxLQUNDLENBQ0xvbEMsSUFBSzIzRSxFQUFXMXhHLEtBR2xCL0YsUUFBUTRCLE1BQU1oRSxHQUNQRixFQUFPRSxLQUVmb2IsS0FBTTQrRixJQUNQQSxFQUFjN2lHLEtBQU8waUcsRUFBVzFpRyxLQUNoQzZpRyxFQUFjcDdHLE9BQVNpN0csRUFBV2o3RyxPQUMzQmEsS0FBSzg3QixHQUFHNEcsSUFBSTYzRSxLQUNsQmw0RSxNQUFNOWhDLElBQ1BGLEVBQU9FLEdBQ1BvQyxRQUFRNEIsTUFBTWhFLEtBR2xCLE9BQU9QLEtBQUs4N0IsR0FBRzRHLElBQUlsQyxLQUNsQjdrQixLQUFLLElBQ0N2YixHQUFRLElBQ2RpaUMsTUFBTTloQyxJQUNQRixFQUFPRSxHQUNQb0MsUUFBUTRCLE1BQU1oRSxPQVlwQixTQUFVNjRHLEdBQ1IsT0FBTyxJQUFJajVHLFFBQVEsQ0FBQ0MsRUFBU0MsS0FFM0IsR0FBSUwsS0FBS202RyxpQkFBbUJmLEdBQVdwNUcsS0FBSys1RyxVQUFVbnBHLElBQUl3b0csR0FDeERoNUcsRUFBUUosS0FBSys1RyxVQUFVcDhHLElBQUl5N0csU0FDdEIsR0FBSXA1RyxLQUFLKzVHLFVBQVVucEcsSUFBSXdvRyxHQUM1QnA1RyxLQUFLdzZHLFNBQVNwQixFQUFTcDVHLEtBQUsrNUcsVUFBVXA4RyxJQUFJeTdHLEdBQVNoUCxLQUFLenVGLEtBQUssS0FDM0R2YixFQUFRSixLQUFLKzVHLFVBQVVwOEcsSUFBSXk3RyxXQUd4QixHQUFJcDVHLEtBQUtnNkcsV0FBV3RpQyxTQUFTMGhDLEdBQVUsQ0FDNUNWLEVBQVcrQixZQUNYLE1BQU05a0csRUFBSSxJQUFJblQsTUFBTSx3QkFBMEI0MkcsR0FDOUN6akcsRUFBRXRZLEtBQU8sY0FDVGdELEVBQU9zVixPQUNGLENBRUwsTUFBTXlrRyxFQUFhcDZHLEtBQUtpNkcsWUFBWXI4RixLQUFLdlIsR0FDaENBLEVBQUtsTixTQUFXaTZHLEdBRXJCZ0IsRUFDRnJ4RyxPQUFPNnFDLE1BQU13bUUsRUFBVzFpRyxNQUFNaUUsS0FBS0MsSUFDakMsR0FBSUEsRUFBU2dnQixHQUNYLE9BQU9oZ0IsRUFBU0gsT0FFaEIsTUFBTSxJQUFJalosTUFBTW9aLEVBQVNpOEYsY0FFMUJsOEYsS0FBS2tNLElBRUQsZ0RBQWdEN2dCLEtBQUs2Z0IsS0FDeERBLEdBQU8sSUFBQTZ5RixrQkFBaUI3eUYsS0FHMUIsSUFBQTh5Rix3QkFBdUI5eUYsR0FDdkI3bkIsS0FBS3c2RyxTQUFTcEIsRUFBU3Z4RixHQUFNbE0sS0FBSyxLQUNoQ3ZiLEVBQVFKLEtBQUsrNUcsVUFBVXA4RyxJQUFJeTdHLFFBRTVCLzJFLE1BQU05aEMsSUFDUEYsRUFBT0UsTUFLVG00RyxFQUFXK0IsWUFDWHo2RyxLQUFLZzZHLFdBQVc1M0csS0FBS2czRyxPQVk3QixTQUFVQSxFQUFpQnZ4RixFQUFjK3lGLEdBQVEsR0FZL0MsT0FYQWxDLEVBQVdtQyxtQkFBa0IsSUFBQUMsbUJBQWtCanpGLElBQy9DN25CLEtBQUttNkcsZUFBaUJmLEVBVWYsSUFBSWo1RyxRQUFTQyxJQUNsQixNQUFNcUUsRUFBMEIsQ0FDOUJpRSxJQUFJLElBQUFrSyxVQUNKd0ksT0FBUSxhQUNSZ3ZGLElBQUt2aUYsR0FpQlA3bkIsS0FBSzQ1RyxlQUFlLzFHLGlCQUFpQixVQWZyQyxTQUFTcTdGLEVBQVF0bkYsR0FDZixHQUFJQSxFQUFJaVEsS0FBS25mLEtBQU9qRSxFQUFRaUUsR0FBSSxDQUM5QixNQUFNcXlHLEVBQU0vNkcsS0FBS3loQyxPQUFPNHBFLGdCQUN0Qnp6RixFQUFJaVEsS0FBS2t6RixJQUNULGlCQUNBL2EsZ0JBQ0ZoZ0csS0FBSys1RyxVQUFVOTFHLElBQUltMUcsRUFBUyxDQUMxQjJCLElBQUtBLEVBQ0wzUSxJQUFLdmlGLEVBQ0wreUYsTUFBT0EsSUFFVGhqRyxFQUFJelksT0FBTzZFLG9CQUFvQixVQUFXazdGLEdBQzFDOStGLE1BR21EOUIsS0FBSzBCLE9BQzVEQSxLQUFLNDVHLGVBQWVoYSxZQUFZbjdGLEtBUXBDLE9BQVEyMEcsR0FDTixPQUFPLElBQUlqNUcsUUFBUSxDQUFDQyxFQUFTQyxLQUMzQkwsS0FBS2c3RyxTQUFTNUIsR0FBU3o5RixLQUFNNjNELElBQzNCcHpFLEVBQVFvekUsRUFBTXVuQyxPQUNiMTRFLE1BQU85aEMsSUFBVUYsRUFBT0UsT0FRL0IsT0FBUTY0RyxHQUNOLE9BQU8sSUFBSWo1RyxRQUFRLENBQUNDLEVBQVNDLEtBQzNCTCxLQUFLZzdHLFNBQVM1QixHQUFTejlGLEtBQU02M0QsSUFDM0JwekUsRUFBUW96RSxFQUFNNDJCLE9BQ2IvbkUsTUFBTzloQyxJQUFVRixFQUFPRSxPQVMvQixlQUFnQithLEVBQW1CODlGLEdBQ2pDLE9BQU8sSUFBSWo1RyxRQUFTQyxJQUNsQkosS0FBS2c3RyxTQUFTNUIsR0FBU3o5RixLQUFLLEtBQzFCLE1BQU1sWCxFQUEwQixDQUM5QmlFLElBQUksSUFBQWtLLFVBQ0p3SSxPQUFRLGlCQUNSRSxVQUFXQSxHQUVidGIsS0FBSzQ1RyxlQUFlLzFHLGlCQUFpQixXQUFXLFNBQVNxN0YsRUFBUXRuRixHQUMzREEsRUFBSWlRLEtBQUtuZixLQUFPakUsRUFBUWlFLEtBQzFCa1AsRUFBSXpZLE9BQU82RSxvQkFBb0IsVUFBV2s3RixHQUMxQzkrRixFQUFRd1gsRUFBSWlRLEtBQUtqYixnQkFHckI1TSxLQUFLNDVHLGVBQWVoYSxZQUFZbjdGLE9BVXRDLEtBQU0wVyxFQUE0QmkrRixHQUNoQyxJQUFJNStFLEVBTUosT0FKRUEsRUFERXg2QixLQUFLbTZHLGlCQUFtQmYsRUFDaEJqNUcsUUFBUUMsUUFBUUosS0FBSys1RyxVQUFVcDhHLElBQUl5N0csSUFFbkNwNUcsS0FBS2c3RyxTQUFTNUIsR0FFbkIsSUFBSWo1RyxRQUFTQyxJQUNsQm82QixFQUFRN2UsS0FBSzYzRCxJQUdYQSxFQUFNdW5DLElBQU0sS0FFWixNQUFNRSxFQUFhem5DLEVBQU00MkIsSUFDbkIzbEcsRUFBMEIsQ0FDOUJpRSxJQUFJLElBQUFrSyxVQUNKd0ksT0FBUSxPQUNSRCxhQUFjQSxHQTBCaEJuYixLQUFLNDVHLGVBQWUvMUcsaUJBQWlCLFVBeEJyQyxTQUFTcTdGLEVBQXdCdG5GLEdBQy9CLEdBQUlBLEVBQUlpUSxLQUFLbmYsS0FBT2pFLEVBQVFpRSxHQUFJLENBQzlCLEdBQUlrUCxFQUFJaVEsS0FBSzdJLE9BQVEsQ0FDZGhmLEtBQUs2NUcsV0FBV2pwRyxJQUFJd29HLElBQ3ZCcDVHLEtBQUs2NUcsV0FBVzUxRyxJQUFJbTFHLEVBQVMsSUFNL0IsTUFBTThCLEVBQVlsN0csS0FBSzY1RyxXQUFXbDhHLElBQUl5N0csR0FDMUI4QixFQUFVOTRHLEtBQUs2NEcsR0FFakIsSUFDUmo3RyxLQUFLNjVHLFdBQVc1MUcsSUFBSW0xRyxFQUFTOEIsRUFBVXg2RyxNQUFNLElBRy9DVixLQUFLODVHLFdBQVc3MUcsSUFBSW0xRyxFQUFTLElBRS9CeGhHLEVBQUl6WSxPQUFPNkUsb0JBQW9CLFVBQVdrN0YsR0FDMUNsL0YsS0FBS203RyxZQUFZL0IsR0FBUyxHQUFNejlGLEtBQUssS0FBUXZiLEVBQVF3WCxFQUFJaVEsS0FBSzdJLFdBQzlELElBQUFtNkYsaUJBQWUsS0FHb0M3NkcsS0FBSzBCLE9BQzVEQSxLQUFLNDVHLGVBQWVoYSxZQUFZbjdGLE9BVXRDLFlBQWEyMEcsRUFBaUJ3QixHQUM1QixPQUFPLElBQUl6NkcsUUFBU0MsSUFFbEIsSUFBSWdxRyxFQUFhZ1IsRUFDakIsTUFBTUMsRUFBYSxJQUFJbDdHLFFBQVNDLElBQzlCLE1BQU1xRSxFQUEwQixDQUM5QmlFLElBQUksSUFBQWtLLFVBQ0p3SSxPQUFRLFVBRVZwYixLQUFLNDVHLGVBQWUvMUcsaUJBQWlCLFdBQVcsU0FBU3E3RixFQUFRdG5GLEdBQzNEQSxFQUFJaVEsS0FBS25mLEtBQU9qRSxFQUFRaUUsS0FDMUIwaEcsRUFBTXh5RixFQUFJaVEsS0FBS3VpRixJQUNmeHlGLEVBQUl6WSxPQUFPNkUsb0JBQW9CLFVBQVdrN0YsR0FDMUN3WixFQUFXbUMsbUJBQWtCLElBQUFDLG1CQUFrQjFRLElBQy9DaHFHLEVBQVEsUUFHWkosS0FBSzQ1RyxlQUFlaGEsWUFBWW43RixLQUU1QjYyRyxFQUFhLElBQUluN0csUUFBU0MsSUFDOUIsTUFBTXFFLEVBQTBCLENBQzlCaUUsSUFBSSxJQUFBa0ssVUFDSndJLE9BQVEsZUFFVnBiLEtBQUs0NUcsZUFBZS8xRyxpQkFBaUIsV0FBVyxTQUFTcTdGLEVBQVF0bkYsR0FDM0RBLEVBQUlpUSxLQUFLbmYsS0FBT2pFLEVBQVFpRSxLQUMxQjB5RyxFQUFVeGpHLEVBQUlpUSxLQUFLa3pGLElBQ25CbmpHLEVBQUl6WSxPQUFPNkUsb0JBQW9CLFVBQVdrN0YsR0FDMUM5K0YsRUFBUSxRQUdaSixLQUFLNDVHLGVBQWVoYSxZQUFZbjdGLEtBR2xDNDJHLEVBQVcxL0YsS0FBSyxJQUFlMi9GLEdBQWUzL0YsS0FBSyxLQUNqRCxNQUFNby9GLEVBQU0vNkcsS0FBS3loQyxPQUFPNHBFLGdCQUN0QitQLEVBQ0EsaUJBQ0FwYixnQkFDRmhnRyxLQUFLKzVHLFVBQVU5MUcsSUFBSW0xRyxFQUFTLENBQzFCaFAsSUFBS0EsRUFDTDJRLElBQUtBLEVBQ0xILE1BQU9BLElBRVR4NkcsUUFTTixLQUFNZzVHLEdBQ0osSUFBSTUrRSxFQU1KLE9BSkVBLEVBREV4NkIsS0FBS202RyxpQkFBbUJmLEVBQ2hCajVHLFFBQVFDLFVBRVJKLEtBQUtnN0csU0FBUzVCLEdBRW5CLElBQUlqNUcsUUFBU0MsSUFDbEJvNkIsRUFBUTdlLEtBQUssS0FDWCxNQUFNbFgsRUFBMEIsQ0FDOUJpRSxJQUFJLElBQUFrSyxVQUNKd0ksT0FBUSxZQUVWcGIsS0FBSzQ1RyxlQUFlLzFHLGlCQUFpQixXQUFXLFNBQVNxN0YsRUFBUXRuRixHQUMzREEsRUFBSWlRLEtBQUtuZixLQUFPakUsRUFBUWlFLEtBQzFCa1AsRUFBSXpZLE9BQU82RSxvQkFBb0IsVUFBV2s3RixHQUMxQzkrRixFQUFRd1gsRUFBSWlRLEtBQUszRixVQUdyQmxpQixLQUFLNDVHLGVBQWVoYSxZQUFZbjdGLE9BVXRDLEtBQU0yMEcsR0FDSixPQUFPLElBQUlqNUcsUUFBUXFNLE1BQU9wTSxJQUN4QixJQUFLSixLQUFLNjVHLFdBQVdqcEcsSUFBSXdvRyxHQUN2QixPQUFPaDVHLEdBQVEsR0FFakIsTUFBTTZDLEVBQVFqRCxLQUFLNjVHLFdBQVdsOEcsSUFBSXk3RyxHQUFTL3pHLE1BQzNDLElBQUtwQyxFQUFPLE9BQU83QyxHQUFRLEdBRTNCLE1BQU1ncUcsUUFBWXBxRyxLQUFLMDVHLE9BQU9OLEdBSTlCLE9BSEFwNUcsS0FBSzg1RyxXQUFXbjhHLElBQUl5N0csR0FBU2gzRyxLQUFLZ29HLFNBQzVCcHFHLEtBQUt3NkcsU0FBU3BCLEVBQVNuMkcsR0FBTyxHQUU3QjdDLEdBQVEsS0FTbkIsS0FBTWc1RyxHQUNKLE9BQU8sSUFBSWo1RyxRQUFRcU0sTUFBT3BNLElBQ3hCLElBQUtKLEtBQUs4NUcsV0FBV2xwRyxJQUFJd29HLEdBQ3ZCLE9BQU9oNUcsR0FBUSxHQUVqQixNQUFNNkMsRUFBUWpELEtBQUs4NUcsV0FBV244RyxJQUFJeTdHLEdBQVMvekcsTUFDM0MsSUFBS3BDLEVBQU8sT0FBTzdDLEdBQVEsR0FFM0IsTUFBTWdxRyxRQUFZcHFHLEtBQUswNUcsT0FBT04sR0FJOUIsT0FIQXA1RyxLQUFLNjVHLFdBQVdsOEcsSUFBSXk3RyxHQUFTaDNHLEtBQUtnb0csU0FDNUJwcUcsS0FBS3c2RyxTQUFTcEIsRUFBU24yRyxHQUFPLEdBRTdCN0MsR0FBUSxLQVNuQix1QkFFRSxJQUFJbTdHLEdBQWtCLEVBQ3RCLElBQUssTUFBTXJ6QixLQUFRbG9GLEtBQUsrNUcsVUFBVyxDQUNqQyxNQUFNMTdHLEVBQU02cEYsRUFBSyxHQUNYbnFGLEVBQVFtcUYsRUFBSyxHQUNuQixHQUFJbnFGLEVBQU02OEcsTUFBTyxDQUNmVyxHQUFrQixFQUNsQixNQUFNbjJHLEVBQVFwRixLQUFLaTZHLFlBQVlsdkIsVUFBVTErRSxHQUFpQkEsRUFBS2xOLFNBQVdkLEdBTzFFLElBQUk4cUIsRUFDQ25wQixLQUFLaTZHLFlBQVk3MEcsR0FBT3NTLEtBQUs3SCxNQUFNLFVBbUJ0Q3NaLEVBQU0sbUNBQXFDcGdCLE9BQU9pNkIsS0FBS2psQyxFQUFNcXNHLFdBbEJ2RHJoRyxPQUFPNnFDLE1BQU01ekMsS0FBS2k2RyxZQUFZNzBHLEdBQU9zUyxLQUN6QyxDQUNFK2xCLE9BQVEsTUFDUml3QixRQUFTLENBQUUsZUFBZ0IsdUJBQzNCaDJDLEtBQU0zWixFQUFNcXNHLE1BRWR6dUYsS0FBS0MsSUFFSHVOLEVBREV2TixFQUFTZ2dCLEdBQ0w1N0IsS0FBS2k2RyxZQUFZNzBHLEdBQU9zUyxLQUV4QixtQ0FBcUMzTyxPQUFPaTZCLEtBQUtqbEMsRUFBTXFzRyxPQUU5RC9uRSxNQUFNOWhDLElBQ1BvQyxRQUFRNEIsTUFBTWhFLEdBQ2RvQyxRQUFRQyxLQUFLLDRCQUNidW1CLEVBQU0sbUNBQXFDcGdCLE9BQU9pNkIsS0FBS2psQyxFQUFNcXNHLE9BTWpFcHFHLEtBQUtpNkcsWUFBWTcwRyxHQUFPc1MsS0FBT3lSLFFBQ3pCbnBCLEtBQUs4N0IsR0FBR24rQixJQUFJcUMsS0FBS2k2RyxZQUFZNzBHLEdBQU9zRCxJQUFJaVQsS0FBTTZrQixJQUNsREEsRUFBSTlvQixLQUFPeVIsRUFDSm5wQixLQUFLODdCLEdBQUc0RyxJQUFJbEMsS0FDbEI3a0IsS0FBSyxLQUNONWQsRUFBTTY4RyxPQUFRLElBQ2J2NEUsTUFBTTloQyxJQUNQb0MsUUFBUTRCLE1BQU1oRSxNQUtoQmc3RyxTQUNJdjdHLEtBQUs4N0IsR0FBR24rQixJQUFJcUMsS0FBSysxRyxTQUFTLFFBQVFwNkYsS0FBTTZrQixJQUM1Q0EsRUFBSWc1RSxXQUFZLElBQUs3L0UsTUFBUUUsY0FDdEI3NUIsS0FBSzg3QixHQUFHNEcsSUFBSWxDLEtBQ2xCNkIsTUFBTTloQyxJQUNQb0MsUUFBUTRCLE1BQU1oRSxLQU1wQixpQkFFRSxNQUFNMDVHLFFBQW9CajZHLEtBQUs4N0IsR0FBR24rQixJQUFJcUMsS0FBSysxRyxTQUFTLFFBQ2pEcDZGLEtBQU02a0IsR0FBc0JBLEVBQUl5NUUsYUFDbkNBLEVBQVk3M0csS0FBS3BDLEtBQUsrMUcsU0FBUyxRQUUvQixNQUFNdmxFLEVBQVd5cEUsRUFBWW5xRyxJQUFLcEgsR0FDekIsSUFBSXZJLFFBQWMwcUIsSUFDdkI3cUIsS0FBSzg3QixHQUFHbitCLElBQUkrSyxHQUNUaVQsS0FBSzZrQixHQUFnQnhnQyxLQUFLODdCLEdBQUdoeUIsT0FBTzAyQixJQUNwQzdrQixLQUFLLElBQU1rUCxRQUdsQixPQUFPMXFCLFFBQVF1d0MsSUFBSUYsTSw4RUM3akJ2QixnQkFFRSxjQUVJeHdDLEtBQUt3N0csY0FBZ0IsSUFBSWxLLE9BQ3ZCLDBDQVlOLGlCQUNFMXZHLEVBQ0FmLEdBRUEsT0FBT2IsS0FBS3c3RyxjQUFjMzNHLGlCQUFpQmpDLEVBQU1mLEdBTW5ELFlBQVk0RCxHQUNWLE9BQU96RSxLQUFLdzdHLGNBQWM1YixZQUFZbjdGLE0scUdDL0IxQyxNQUFNZzNHLEVBQWEsRUFBUSxJQUNyQkMsRUFBYyxFQUFRLElBQzVCLFFBT0EseUJBQStCQyxHQUM3QixNQUFNbi9FLEdBQVUsSUFBQXVRLFVBQVM0dUUsRUFBZ0JGLEdBQ25DcHlGLEVBQVdtVCxFQUFRblQsU0FDekIsR0FBSW1ULEVBQVF2UyxPQUFPNW5CLE9BQVMsRUFFMUIsT0FEQU0sUUFBUTRCLE1BQU1pNEIsRUFBUXZTLFNBQ2YsRUFFVCxNQUFNdmxCLEVBQVUya0IsRUFBUyxZQUN6QixNQUFnQixrRUFBWjNrQixJQUdDQSxFQUFRLEtBQU9nM0csRUFBWSxJQUMzQmgzRyxFQUFRLEdBQVcsU0FBTWczRyxFQUFZLEdBQVcsUUFDaERoM0csRUFBUSxHQUFVLFFBQU1nM0csRUFBWSxHQUFVLE9BQzlDaDNHLEVBQVEsR0FBYyxZQUFNZzNHLEVBQVksR0FBYyxXQUN0RGgzRyxFQUFRLEdBQVUsTUFBRSxTQUFXZzNHLEVBQVksR0FBVSxNQUFFLFFBQ3ZEaDNHLEVBQVEsR0FBVSxNQUFFLFdBQWFnM0csRUFBWSxHQUFVLE1BQUUsVUFDekRoM0csRUFBUSxHQUFvQixnQkFBRSxTQUFXZzNHLEVBQVksR0FBb0IsZ0JBQUUsUUFDM0VoM0csRUFBUSxHQUFvQixnQkFBRSxXQUFhZzNHLEVBQVksR0FBb0IsZ0JBQUUsVUFDN0VoM0csRUFBUSxHQUFvQixnQkFBRSxnQkFBa0JnM0csRUFBWSxHQUFvQixnQkFBRSxnQkFHckYvNEcsUUFBUTRCLE1BQU0sb0JBQ2Q1QixRQUFRNEIsTUFBTUcsR0FDZC9CLFFBQVE0QixNQUFNbTNHLElBQ1AsTSxveEJDbENYLElBQUlFLEVBQVkvK0csRUFBT0QsUUFBUWcvRyxVQUFZLEVBQVEsSUFFbkQvK0csRUFBT0QsUUFBUWt0QixnQkFBa0IsRUFBUSxJQUFhQSxnQkFDdERqdEIsRUFBT0QsUUFBUTR0QixxQkFBdUIsRUFBUSxJQUFhQSxxQkFDM0QzdEIsRUFBT0QsUUFBUXdzQixnQkFBa0IsRUFBUSxJQUFhQSxnQkFDdER2c0IsRUFBT0QsUUFBUW11QixZQUFjLEVBQVEsSUFBYUEsWUFDbERsdUIsRUFBT0QsUUFBUXduRyxpQkFBbUIsRUFBUSxJQUFVQSxpQkFDcER2bkcsRUFBT0QsUUFBUTJuRyxLQUFPLEVBQVEsSUFBVUEsS0FFeEMxbkcsRUFBT0QsUUFBUW13QyxTQUFXLFNBQVUxakIsRUFBVUMsRUFBUXBQLEdBRXBELE9BRFEsSUFBSTBoRyxHQUNIN3VFLFNBQVMxakIsRUFBVUMsRUFBUXBQLEssNkJDWHRDLElBQUlncUYsRUFBUyxFQUFRLElBRWpCMlgsRUFBWSxFQUFRLElBQ3BCMVgsRUFBVSxFQUFRLElBQ2xCSyxFQUFhLEVBQVEsSUFBVUQsS0FDL0J6NkUsRUFBa0JxNkUsRUFBUXI2RSxnQkFDMUJVLEVBQXVCMjVFLEVBQVEzNUUscUJBQy9CTyxFQUFjbzVFLEVBQVFwNUUsWUFDdEJFLEVBQWdCazVFLEVBQVFsNUUsY0FTeEIyd0YsRUFBWSxTQUFTQSxJQUd2QjU3RyxLQUFLaXNCLGNBQWdCenVCLE9BQU9ZLE9BQU93OUcsRUFBVWw5RyxVQUFVdXRCLGVBQ3ZEanNCLEtBQUttckIsUUFBVSxHQUNmbnJCLEtBQUs4N0csZUFBaUIsR0FHdEI5N0csS0FBS3NHLE1BQVE5SSxPQUFPWSxPQUFPa0ksR0FDM0J0RyxLQUFLNE0sV0FBYXBQLE9BQU9ZLE9BQU95OUcsRUFBVUUsYUF1SDVDLFNBQVNDLEVBQWMxeUYsR0FDckIsSUFBSWc3RSxFQUF5QixpQkFBWGg3RSxFQUF1QkEsRUFBU0EsRUFBT283RSxLQUN6RCxNQUFnQixpQkFBTEosR0FBc0JBLEVBckhuQ3NYLEVBQVVsOUcsVUFBVXV0QixjQUFnQixHQUdwQzJ2RixFQUFVbDlHLFVBQVV5c0IsUUFBVSxLQUM5Qnl3RixFQUFVbDlHLFVBQVU0SCxNQUFRLEtBQzVCczFHLEVBQVVsOUcsVUFBVWtPLFdBQWEsS0FDakNndkcsRUFBVWw5RyxVQUFVbzlHLGVBQWlCLEtBUXJDRixFQUFVbDlHLFVBQVV1OUcsVUFBWSxTQUFvQjN5RixFQUFRNEIsR0FDMUQsSUFBSW9QLEVBQU90NkIsS0FDWCxJQUFLc3BCLEVBQ0gsT0FBTyxLQUVULElBQUlpN0UsRUFBT0MsRUFBV3Q1RSxHQXZDSixJQXVDeUI1QixHQUN2QzR5RixFQUFTaHhGLEdBQVE1QixFQUFPTSxLQUFPTixFQUFPNWdCLEdBQzFDLElBQUksSUFBSXlnQixLQUFPbzdFLEVBQUs3N0YsR0FDbEIxSSxLQUFLbXJCLFFBQVFoQyxHQUFPbzdFLEVBQUs3N0YsR0FBR3lnQixHQUU5QixJQUFJLElBQUlBLEtBQU9vN0UsRUFBS0QsSUFFbEJ0a0csS0FBSzg3RyxlQUFlMTVHLEtBQUsrbUIsR0FNM0IsT0FIQW5wQixLQUFLODdHLGVBQWlCOTdHLEtBQUs4N0csZUFBZTlzRyxRQUFPLFNBQVNtYSxHQUN4RCxZQUFrQyxJQUFwQm1SLEVBQUtuUCxRQUFRaEMsTUFFdEJucEIsS0FBS21yQixRQUFRK3dGLElBR3RCTixFQUFVbDlHLFVBQVV5OUcsa0JBQW9CLFNBQTJCMVgsRUFBU3Q1RSxHQUMxRSxHQUFJM25CLE1BQU1nbUIsUUFBUTJCLEdBQ2xCLElBQUksSUFBSXJ1QixFQUFFLEVBQUdBLEVBQUVxdUIsRUFBUTlvQixPQUFRdkYsSUFDN0JrRCxLQUFLbzhHLGFBQWEzWCxFQUFTdDVFLEVBQVFydUIsS0FJdkM4K0csRUFBVWw5RyxVQUFVMjlHLG1CQUFxQixTQUEyQjVYLEVBQVN0NUUsR0FDM0UsR0FBSUEsR0FBMkIsaUJBQVRBLEVBQ3RCLElBQUksSUFBSXZzQixLQUFLdXNCLEVBQ1huckIsS0FBS284RyxhQUFhM1gsRUFBU3Q1RSxFQUFRdnNCLEtBVXZDZzlHLEVBQVVsOUcsVUFBVTQ5RyxXQUFhLFNBQXFCbnhGLEdBQ3BEbnJCLEtBQUttckIsUUFBVUEsR0FPakJ5d0YsRUFBVWw5RyxVQUFVNjlHLFVBQVksU0FBb0JDLEdBQ2xELE9BQU94OEcsS0FBS21yQixRQUFRcXhGLElBV3RCWixFQUFVbDlHLFVBQVVxdUMsU0FBVyxTQUFtQjFqQixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQzNFLEdBQXNCLGtCQUFYVCxHQUEwQyxpQkFBWEEsR0FBbUMsT0FBWEEsRUFDaEUsTUFBTSxJQUFJeUIsRUFBWSxnREFFbkI3USxJQUNIQSxFQUFVLElBSVosSUFrQkk4RSxFQWxCQXRXLEVBQUs0Z0IsRUFBT00sS0FBT04sRUFBTzVnQixHQUMxQndpQixFQUFPZzVFLEVBQU85akcsUUFBUThaLEVBQVFnUixNQXpHaEIsSUF5R3FDeGlCLEdBQUksSUFDM0QsSUFBSXFoQixFQUFJLEVBQ05BLEVBQU0sSUFBSWtCLEVBQWMzQixFQUFRcFAsRUFBUyxHQUFJZ1IsRUFBTTF0QixPQUFPWSxPQUFPNEIsS0FBS21yQixXQUM3REEsUUFBUUQsS0FDZm5CLEVBQUlvQixRQUFRRCxHQUFRNUIsR0FFdEIsSUFBSSs2RSxFQUFRRyxFQUFXdDVFLEVBQU01QixHQUM3QixJQUFJLElBQUkvcUIsS0FBSzhsRyxFQUFNMzdGLEdBQUcsQ0FDcEIsSUFBSSt6RyxFQUFNcFksRUFBTTM3RixHQUFHbkssR0FDbkJ3ckIsRUFBSW9CLFFBQVE1c0IsR0FBS2srRyxHQUdyQixHQUFHdmlHLEVBQVF3aUcsZUFBdUJ4N0csSUFBWG1vQixFQUdyQixPQUZJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsSUFDckRXLFNBQVMsaUNBQ1QxTCxFQUdULEtBRElBLEVBQVNoZixLQUFLMjhHLGVBQWV0ekYsRUFBVUMsRUFBUXBQLEVBQVM2UCxJQUUxRCxNQUFNLElBQUl2bkIsTUFBTSxvQkFDWixHQUFHMFgsRUFBUWtRLFVBQVlwTCxFQUFPaUwsT0FBTzVuQixPQUN6QyxNQUFNLElBQUltb0IsRUFBcUJ4TCxHQUVqQyxPQUFPQSxHQXNCVDQ4RixFQUFVbDlHLFVBQVVpK0csZUFBaUIsU0FBeUJ0ekYsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUN2RixJQUFJL0ssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FHNUQsR0FBbUIsa0JBQVRULEdBQ0ksSUFBVEEsRUFFREEsRUFBUyxJQUNPLElBQVRBLElBRVBBLEVBQVMsQ0FBQzFuQixLQUFNLFVBRWQsSUFBSTBuQixFQUVSLE1BQU0sSUFBSTltQixNQUFNLHVCQUdsQixHQUFJOG1CLEVBQWdCLFFBQ2xCLEdBQUk5bEIsTUFBTWdtQixRQUFRRixFQUFnQixTQUFJLENBQ3BDLElBQUlzekYsRUFBWSxDQUFDdHpGLE9BQVFBLEVBQVFTLElBQUtBLEdBQ3RDVCxFQUFnQixRQUFFM2YsUUFBUTNKLEtBQUs2OEcsZ0JBQWdCditHLEtBQUswQixLQUFNNDhHLElBQzFEdHpGLEVBQVNzekYsRUFBVXR6RixPQUNuQnN6RixFQUFVdHpGLE9BQVMsS0FDbkJzekYsRUFBVTd5RixJQUFNLEtBQ2hCNnlGLEVBQVksVUFFWnR6RixFQUFTNjZFLEVBQVEvM0UsVUFBVTlDLEVBQVF0cEIsS0FBSzg4RyxhQUFheHpGLEVBQWdCLFFBQUdTLElBSzVFLElBQUlnekYsRUFBZWYsRUFBYzF5RixHQUNqQyxHQUFJeXpGLEVBQWMsQ0FDaEIsSUFBSUMsRUFBV2g5RyxLQUFLSSxRQUFRa3BCLEVBQVF5ekYsRUFBY2h6RixHQUM5Q2t6RixFQUFTLElBQUloeUYsRUFBYyt4RixFQUFTRSxVQUFXaGpHLEVBQVM2UCxFQUFJcmEsS0FBTXN0RyxFQUFTRCxhQUFjaHpGLEVBQUlvQixTQUNqRyxPQUFPbnJCLEtBQUsyOEcsZUFBZXR6RixFQUFVMnpGLEVBQVNFLFVBQVdoakcsRUFBUytpRyxHQUdwRSxJQUFJRSxFQUFpQmpqRyxHQUFXQSxFQUFRaWpHLGdCQUFrQixHQUUxRCxJQUFLLElBQUk5K0csS0FBT2lyQixFQUNkLElBQUt1eUYsRUFBVXVCLGlCQUFpQi8rRyxJQUFROCtHLEVBQWV2dUcsUUFBUXZRLEdBQU8sRUFBRyxDQUN2RSxJQUFJZy9HLEVBQWUsS0FDZnJ4RixFQUFZaHNCLEtBQUs0TSxXQUFXdk8sR0FDaEMsR0FBSTJ0QixFQUNGcXhGLEVBQWVyeEYsRUFBVS91QixLQUFLK0MsS0FBTXFwQixFQUFVQyxFQUFRcFAsRUFBUzZQLFFBQzFELElBQXVDLElBQW5DN1AsRUFBUW9qRyx1QkFFakIsTUFBTSxJQUFJdnlGLEVBQVksMEJBQTRCMXNCLEVBQUtpckIsR0FFckQrekYsR0FDRnIrRixFQUFPNEwsYUFBYXl5RixHQUsxQixHQUE4QixtQkFBbkJuakcsRUFBUXFqRyxRQUF1QixDQUN4QyxJQUFJeC9HLEVBQVFtYyxFQUFRcWpHLFFBQVF0Z0gsS0FBSytDLEtBQU1xcEIsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUNsRS9LLEVBQU9xSyxTQUFXdHJCLEVBRXBCLE9BQU9paEIsR0FTVDQ4RixFQUFVbDlHLFVBQVVtK0csZ0JBQWtCLFNBQTBCRCxFQUFXLzlHLEdBQ3pFKzlHLEVBQVV0ekYsT0FBUzY2RSxFQUFRLzNFLFVBQVV3d0YsRUFBVXR6RixPQUFRdHBCLEtBQUs4OEcsYUFBYWorRyxFQUFHKzlHLEVBQVU3eUYsT0FTeEY2eEYsRUFBVWw5RyxVQUFVbytHLGFBQWUsU0FBdUJ4ekYsRUFBUVMsR0FDaEUsSUFBSXU2RSxFQUFNMFgsRUFBYzF5RixHQUN4QixPQUFHZzdFLEVBQ010a0csS0FBS0ksUUFBUWtwQixFQUFRZzdFLEVBQUt2NkUsR0FBS216RixVQUVqQzV6RixHQVdUc3lGLEVBQVVsOUcsVUFBVTBCLFFBQVUsU0FBa0JrcEIsRUFBUXl6RixFQUFjaHpGLEdBR3BFLEdBRkFnekYsRUFBZWh6RixFQUFJM3BCLFFBQVEyOEcsR0FFdkJoekYsRUFBSW9CLFFBQVE0eEYsR0FDZCxNQUFPLENBQUNHLFVBQVduekYsRUFBSW9CLFFBQVE0eEYsR0FBZUEsYUFBY0EsR0FHOUQsSUFBSVMsRUFBU3RaLEVBQU9wN0YsTUFBTWkwRyxHQUN0QlUsRUFBV0QsR0FBVUEsRUFBT3gyRixLQUM1QnpkLEVBQVdrMEcsR0FBWUEsRUFBU3A3RyxRQUFVMDZHLEVBQWFqbkcsT0FBTyxFQUFHaW5HLEVBQWExNkcsT0FBU283RyxFQUFTcDdHLFFBQ3BHLElBQUtrSCxJQUFhd2dCLEVBQUlvQixRQUFRNWhCLEdBQzVCLE1BQU0sSUFBSXdoQixFQUFZLG1CQUFxQmd5RixFQUFlLElBQUt6ekYsR0FFakUsSUFBSTR6RixFQUFZL1ksRUFBUXQzRSxjQUFjOUMsRUFBSW9CLFFBQVE1aEIsR0FBV2swRyxFQUFTM25HLE9BQU8sSUFDN0UsUUFBZTVVLElBQVpnOEcsRUFDRCxNQUFNLElBQUlueUYsRUFBWSxrQkFBb0IweUYsRUFBVyxnQkFBa0JsMEcsRUFBVyxJQUFLK2YsR0FFekYsTUFBTyxDQUFDNHpGLFVBQVdBLEVBQVdILGFBQWNBLElBYTlDbkIsRUFBVWw5RyxVQUFVZy9HLFNBQVcsU0FBdUJyMEYsRUFBVUMsRUFBUXBQLEVBQVM2UCxFQUFLbm9CLEdBQ3BGLFFBQVVWLElBQVBVLEVBQUgsQ0FFTSxHQUFVLE9BQVBBLEVBQ1AsTUFBTSxJQUFJbXBCLEVBQVkscUNBRXhCLEdBQStCLG1CQUFwQi9xQixLQUFLc0csTUFBTTFFLEdBQ3BCLE9BQU81QixLQUFLc0csTUFBTTFFLEdBQU0zRSxLQUFLK0MsS0FBTXFwQixHQUVyQyxHQUFJem5CLEdBQXVCLGlCQUFSQSxFQUFrQixDQUNuQyxJQUFJaXBCLEVBQU03cUIsS0FBSzI4RyxlQUFldHpGLEVBQVV6bkIsRUFBTXNZLEVBQVM2UCxHQUN2RCxZQUFlN29CLElBQVIycEIsS0FBdUJBLEdBQU9BLEVBQUlaLE9BQU81bkIsUUFHbEQsT0FBTyxJQUdULElBQUlpRSxFQUFRczFHLEVBQVVsOUcsVUFBVTRILE1BQVEsR0FDeENBLEVBQU02K0IsT0FBUyxTQUFxQjliLEdBQ2xDLE1BQTBCLGlCQUFaQSxHQUVoQi9pQixFQUFNNm1CLE9BQVMsU0FBcUI5RCxHQUVsQyxNQUEwQixpQkFBWkEsR0FBd0J1USxTQUFTdlEsSUFFakQvaUIsRUFBTXEzRyxRQUFVLFNBQXNCdDBGLEdBQ3BDLE1BQTJCLGlCQUFaQSxHQUF5QkEsRUFBVyxHQUFNLEdBRTNEL2lCLEVBQU1zM0csUUFBVSxTQUFzQnYwRixHQUNwQyxNQUEwQixrQkFBWkEsR0FFaEIvaUIsRUFBTWMsTUFBUSxTQUFvQmlpQixHQUNoQyxPQUFPN2xCLE1BQU1nbUIsUUFBUUgsSUFFdkIvaUIsRUFBWSxLQUFJLFNBQW1CK2lCLEdBQ2pDLE9BQW9CLE9BQWJBLEdBRVQvaUIsRUFBTXUzRyxLQUFPLFNBQW1CeDBGLEdBQzlCLE9BQU9BLGFBQW9Cc1EsTUFFN0JyekIsRUFBTXczRyxJQUFNLFNBQWtCejBGLEdBQzVCLE9BQU8sR0FFVC9pQixFQUFNOUgsT0FBUyxTQUFxQjZxQixHQUVsQyxPQUFPQSxHQUFpQyxpQkFBYkEsSUFBNEI3bEIsTUFBTWdtQixRQUFRSCxNQUFnQkEsYUFBb0JzUSxPQUczRzk4QixFQUFPRCxRQUFVZy9HLEcsaUJDL1VqQix1RUFDRSxTQUFTcnpFLEdBR3NDM3JDLEdBQzlDQSxFQUFRNHNFLFNBQ29DM3NFLEdBQzVDQSxFQUFPMnNFLFNBSFQsSUFJSUgsRUFBOEIsaUJBQVZ6ZSxHQUFzQkEsRUFFN0N5ZSxFQUFXemUsU0FBV3llLEdBQ3RCQSxFQUFXdGdFLFNBQVdzZ0UsR0FDdEJBLEVBQVcvdUMsS0FVWixJQUFJMmxFLEVBR0o4ZCxFQUFTLFdBYVRDLEVBQWdCLFFBQ2hCQyxFQUFnQixlQUNoQkMsRUFBa0IsNEJBR2xCajBGLEVBQVMsQ0FDUixTQUFZLGtEQUNaLFlBQWEsaURBQ2IsZ0JBQWlCLGlCQUtsQm16QyxFQUFRdHVELEtBQUtzdUQsTUFDYitnRCxFQUFxQjE3RyxPQUFPaWpCLGFBYTVCLFNBQVNuaEIsRUFBTTNDLEdBQ2QsTUFBTSxJQUFJc0MsV0FBVytsQixFQUFPcm9CLElBVzdCLFNBQVNrTyxFQUFJMUksRUFBT28vRSxHQUduQixJQUZBLElBQUlua0YsRUFBUytFLEVBQU0vRSxPQUNmMmMsRUFBUyxHQUNOM2MsS0FDTjJjLEVBQU8zYyxHQUFVbWtGLEVBQUdwL0UsRUFBTS9FLElBRTNCLE9BQU8yYyxFQWFSLFNBQVNvL0YsRUFBVWo1RSxFQUFRcWhELEdBQzFCLElBQUkxNUQsRUFBUXFZLEVBQU9wWSxNQUFNLEtBQ3JCL04sRUFBUyxHQVdiLE9BVkk4TixFQUFNenFCLE9BQVMsSUFHbEIyYyxFQUFTOE4sRUFBTSxHQUFLLElBQ3BCcVksRUFBU3JZLEVBQU0sSUFNVDlOLEVBRE9sUCxHQUZkcTFCLEVBQVNBLEVBQU9ucUIsUUFBUWtqRyxFQUFpQixNQUNyQm54RixNQUFNLEtBQ0F5NUQsR0FBSTNtRSxLQUFLLEtBaUJwQyxTQUFTdytGLEVBQVdsNUUsR0FNbkIsSUFMQSxJQUdJcG5DLEVBQ0F1Z0gsRUFKQXhxRCxFQUFTLEdBQ1R5cUQsRUFBVSxFQUNWbDhHLEVBQVM4aUMsRUFBTzlpQyxPQUdiazhHLEVBQVVsOEcsSUFDaEJ0RSxFQUFRb25DLEVBQU96Z0IsV0FBVzY1RixPQUNiLE9BQVV4Z0gsR0FBUyxPQUFVd2dILEVBQVVsOEcsRUFHM0IsUUFBWCxPQURiaThHLEVBQVFuNUUsRUFBT3pnQixXQUFXNjVGLE9BRXpCenFELEVBQU8xeEQsT0FBZSxLQUFSckUsSUFBa0IsS0FBZSxLQUFSdWdILEdBQWlCLFFBSXhEeHFELEVBQU8xeEQsS0FBS3JFLEdBQ1p3Z0gsS0FHRHpxRCxFQUFPMXhELEtBQUtyRSxHQUdkLE9BQU8rMUQsRUFXUixTQUFTMHFELEVBQVdwM0csR0FDbkIsT0FBTzBJLEVBQUkxSSxHQUFPLFNBQVNySixHQUMxQixJQUFJKzFELEVBQVMsR0FPYixPQU5JLzFELEVBQVEsUUFFWCsxRCxHQUFVcXFELEdBRFZwZ0gsR0FBUyxTQUM4QixHQUFLLEtBQVEsT0FDcERBLEVBQVEsTUFBaUIsS0FBUkEsR0FFbEIrMUQsR0FBVXFxRCxFQUFtQnBnSCxNQUUzQjhoQixLQUFLLElBb0NULFNBQVM0K0YsRUFBYUMsRUFBT0MsR0FHNUIsT0FBT0QsRUFBUSxHQUFLLElBQU1BLEVBQVEsTUFBZ0IsR0FBUkMsSUFBYyxHQVF6RCxTQUFTQyxFQUFNemdFLEVBQU8wZ0UsRUFBV0MsR0FDaEMsSUFBSXo2RixFQUFJLEVBR1IsSUFGQTg1QixFQUFRMmdFLEVBQVkxaEQsRUFBTWpmLEVBMUxwQixLQTBMb0NBLEdBQVMsRUFDbkRBLEdBQVNpZixFQUFNamYsRUFBUTBnRSxHQUNPMWdFLEVBQVE0Z0UsSUFBMkIxNkYsR0FoTTNELEdBaU1MODVCLEVBQVFpZixFQUFNamYsRUEzS0FqekIsSUE2S2YsT0FBT2t5QyxFQUFNLzRDLEVBQUksR0FBc0I4NUIsR0FBU0EsRUFoTTFDLEtBME1QLFNBQVM2Z0UsRUFBT3p6RixHQUVmLElBRUl5MkMsRUFJQWk5QyxFQUNBMXdHLEVBQ0FuSixFQUNBODVHLEVBQ0EzOEcsRUFDQThoQixFQUNBcTZGLEVBQ0ExZ0gsRUFFQW1oSCxFQXJFaUJDLEVBc0RqQnRyRCxFQUFTLEdBQ1R1ckQsRUFBYzl6RixFQUFNbHBCLE9BRXBCdkYsRUFBSSxFQUNKeUIsRUE3TU0sSUE4TU4rZ0gsRUEvTVMsR0FvT2IsS0FMQUwsRUFBUTF6RixFQUFNdzBCLFlBN05ILE1BOE5DLElBQ1hrL0QsRUFBUSxHQUdKMXdHLEVBQUksRUFBR0EsRUFBSTB3RyxJQUFTMXdHLEVBRXBCZ2QsRUFBTTdHLFdBQVduVyxJQUFNLEtBQzFCaEssRUFBTSxhQUVQdXZELEVBQU8xeEQsS0FBS21wQixFQUFNN0csV0FBV25XLElBTTlCLElBQUtuSixFQUFRNjVHLEVBQVEsRUFBSUEsRUFBUSxFQUFJLEVBQUc3NUcsRUFBUWk2RyxHQUF3QyxDQU92RixJQUFLSCxFQUFPcGlILEVBQUd5RixFQUFJLEVBQUc4aEIsRUEzUGpCLEdBNlBBamYsR0FBU2k2RyxHQUNaOTZHLEVBQU0sbUJBR1BtNkcsR0F4R21CVSxFQXdHRTd6RixFQUFNN0csV0FBV3RmLE1Bdkd4QixHQUFLLEdBQ2JnNkcsRUFBWSxHQUVoQkEsRUFBWSxHQUFLLEdBQ2JBLEVBQVksR0FFaEJBLEVBQVksR0FBSyxHQUNiQSxFQUFZLEdBaktkLFNBbVFpQlYsRUFBUXRoRCxHQUFPMmdELEVBQVNqaEgsR0FBS3lGLEtBQ2pEZ0MsRUFBTSxZQUdQekgsR0FBSzRoSCxFQUFRbjhHLElBR1RtOEcsR0FGSjFnSCxFQUFJcW1CLEdBQUtpN0YsRUF2UUwsRUF1UW9CajdGLEdBQUtpN0YsRUF0UXpCLE1Bc1E4Q2o3RixFQUFJaTdGLElBYkhqN0YsR0EzUC9DLEdBK1FBOWhCLEVBQUk2NkQsRUFBTTJnRCxHQURkb0IsRUE5UUksR0E4UWdCbmhILEtBRW5CdUcsRUFBTSxZQUdQaEMsR0FBSzQ4RyxFQUtORyxFQUFPVixFQUFNOWhILEVBQUlvaUgsRUFEakJsOUMsRUFBTWxPLEVBQU96eEQsT0FBUyxFQUNjLEdBQVI2OEcsR0FJeEI5aEQsRUFBTXRnRSxFQUFJa2xFLEdBQU8rN0MsRUFBU3gvRyxHQUM3QmdHLEVBQU0sWUFHUGhHLEdBQUs2K0QsRUFBTXRnRSxFQUFJa2xFLEdBQ2ZsbEUsR0FBS2tsRSxFQUdMbE8sRUFBTzFyQixPQUFPdHJDLElBQUssRUFBR3lCLEdBSXZCLE9BQU9pZ0gsRUFBVzFxRCxHQVVuQixTQUFTeXJELEVBQU9oMEYsR0FDZixJQUFJaHRCLEVBQ0E0L0MsRUFDQXFoRSxFQUNBQyxFQUNBSCxFQUNBL3dHLEVBQ0FyUixFQUNBd2lILEVBQ0FyN0YsRUFDQXJtQixFQUNBcWlCLEVBR0FnL0YsRUFFQU0sRUFDQVIsRUFDQVMsRUFOQTlyRCxFQUFTLEdBb0JiLElBUkF1ckQsR0FIQTl6RixFQUFROHlGLEVBQVc5eUYsSUFHQ2xwQixPQUdwQjlELEVBdlVVLElBd1VWNC9DLEVBQVEsRUFDUm1oRSxFQTFVYSxHQTZVUi93RyxFQUFJLEVBQUdBLEVBQUk4d0csSUFBZTl3RyxHQUM5QjhSLEVBQWVrTCxFQUFNaGQsSUFDRixLQUNsQnVsRCxFQUFPMXhELEtBQUsrN0csRUFBbUI5OUYsSUFlakMsSUFYQW0vRixFQUFpQkMsRUFBYzNyRCxFQUFPenhELE9BTWxDbzlHLEdBQ0gzckQsRUFBTzF4RCxLQXpWRyxLQTZWSm85RyxFQUFpQkgsR0FBYSxDQUlwQyxJQUFLbmlILEVBQUk2Z0gsRUFBUXh2RyxFQUFJLEVBQUdBLEVBQUk4d0csSUFBZTl3RyxHQUMxQzhSLEVBQWVrTCxFQUFNaGQsS0FDRGhRLEdBQUs4aEIsRUFBZW5qQixJQUN2Q0EsRUFBSW1qQixHQWNOLElBUEluakIsRUFBSXFCLEVBQUk2K0QsR0FBTzJnRCxFQUFTNS9ELElBRDVCd2hFLEVBQXdCSCxFQUFpQixLQUV4Q2o3RyxFQUFNLFlBR1A0NUMsSUFBVWpoRCxFQUFJcUIsR0FBS29oSCxFQUNuQnBoSCxFQUFJckIsRUFFQ3FSLEVBQUksRUFBR0EsRUFBSTh3RyxJQUFlOXdHLEVBTzlCLElBTkE4UixFQUFla0wsRUFBTWhkLElBRUZoUSxLQUFPNC9DLEVBQVE0L0QsR0FDakN4NUcsRUFBTSxZQUdIOGIsR0FBZ0I5aEIsRUFBRyxDQUV0QixJQUFLbWhILEVBQUl2aEUsRUFBTzk1QixFQWxZYixLQW9ZRXE3RixHQURKMWhILEVBQUlxbUIsR0FBS2k3RixFQWxZUCxFQWtZc0JqN0YsR0FBS2k3RixFQWpZM0IsTUFpWWdEajdGLEVBQUlpN0YsSUFEVGo3RixHQWxZM0MsR0F1WUZ1N0YsRUFBVUYsRUFBSTFoSCxFQUNkbWhILEVBeFlFLEdBd1lrQm5oSCxFQUNwQjgxRCxFQUFPMXhELEtBQ04rN0csRUFBbUJNLEVBQWF6Z0gsRUFBSTRoSCxFQUFVVCxFQUFZLEtBRTNETyxFQUFJdGlELEVBQU13aUQsRUFBVVQsR0FHckJyckQsRUFBTzF4RCxLQUFLKzdHLEVBQW1CTSxFQUFhaUIsRUFBRyxLQUMvQ0osRUFBT1YsRUFBTXpnRSxFQUFPd2hFLEVBQXVCSCxHQUFrQkMsR0FDN0R0aEUsRUFBUSxJQUNOcWhFLElBSUZyaEUsSUFDQTUvQyxFQUdILE9BQU91MUQsRUFBT2owQyxLQUFLLElBNENwQm9nRixFQUFXLENBTVYsUUFBVyxRQVFYLEtBQVEsQ0FDUCxPQUFVb2UsRUFDVixPQUFVRyxHQUVYLE9BQVVRLEVBQ1YsT0FBVU8sRUFDVixRQS9CRCxTQUFpQmgwRixHQUNoQixPQUFPNnlGLEVBQVU3eUYsR0FBTyxTQUFTNFosR0FDaEMsT0FBTzg0RSxFQUFjajNHLEtBQUttK0IsR0FDdkIsT0FBU282RSxFQUFPcDZFLEdBQ2hCQSxNQTRCSixVQW5ERCxTQUFtQjVaLEdBQ2xCLE9BQU82eUYsRUFBVTd5RixHQUFPLFNBQVM0WixHQUNoQyxPQUFPNjRFLEVBQWNoM0csS0FBS20rQixHQUN2QjY1RSxFQUFPNzVFLEVBQU96a0MsTUFBTSxHQUFHdVYsZUFDdkJrdkIsWUE0REgsS0FGRCxhQUNDLE9BQU84NkQsR0FDUCw4QkFuZ0JGLEssdURDQ0RwakcsRUFBT0QsUUFBVSxDQUNmMHlGLFNBQVUsU0FBU3ZyRixHQUNqQixNQUF1QixpQkFBVixHQUVmMHVFLFNBQVUsU0FBUzF1RSxHQUNqQixNQUF1QixpQkFBVixHQUE4QixPQUFSQSxHQUVyQ3cwRixPQUFRLFNBQVN4MEYsR0FDZixPQUFlLE9BQVJBLEdBRVQ4L0Ysa0JBQW1CLFNBQVM5L0YsR0FDMUIsT0FBYyxNQUFQQSxLLDZCQ1hYbkgsRUFBUW9pSCxPQUFTcGlILEVBQVFrTSxNQUFRLEVBQVEsSUFDekNsTSxFQUFRMmlILE9BQVMzaUgsRUFBUXdNLFVBQVksRUFBUSxLLDZCQ3VCN0MsU0FBU3pLLEVBQWUrdUIsRUFBS3lMLEdBQzNCLE9BQU8zN0IsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLeXdCLEVBQUt5TCxHQUduRHQ4QixFQUFPRCxRQUFVLFNBQVNpakgsRUFBSUMsRUFBSy9xQyxFQUFJNzZELEdBQ3JDNGxHLEVBQU1BLEdBQU8sSUFDYi9xQyxFQUFLQSxHQUFNLElBQ1gsSUFBSXJuRCxFQUFNLEdBRVYsR0FBa0IsaUJBQVBteUYsR0FBaUMsSUFBZEEsRUFBR3g5RyxPQUMvQixPQUFPcXJCLEVBR1QsSUFBSWhDLEVBQVMsTUFDYm0wRixFQUFLQSxFQUFHOXlGLE1BQU0reUYsR0FFZCxJQUFJQyxFQUFVLElBQ1Y3bEcsR0FBc0MsaUJBQXBCQSxFQUFRNmxHLFVBQzVCQSxFQUFVN2xHLEVBQVE2bEcsU0FHcEIsSUFBSXA3RyxFQUFNazdHLEVBQUd4OUcsT0FFVDA5RyxFQUFVLEdBQUtwN0csRUFBTW83RyxJQUN2QnA3RyxFQUFNbzdHLEdBR1IsSUFBSyxJQUFJampILEVBQUksRUFBR0EsRUFBSTZILElBQU83SCxFQUFHLENBQzVCLElBRUlrakgsRUFBTUMsRUFBTTU3RixFQUFHa0csRUFGZjNZLEVBQUlpdUcsRUFBRy9pSCxHQUFHa2UsUUFBUTBRLEVBQVEsT0FDMUI0RyxFQUFNMWdCLEVBQUVoRCxRQUFRbW1FLEdBR2hCemlELEdBQU8sR0FDVDB0RixFQUFPcHVHLEVBQUVrRSxPQUFPLEVBQUd3YyxHQUNuQjJ0RixFQUFPcnVHLEVBQUVrRSxPQUFPd2MsRUFBTSxLQUV0QjB0RixFQUFPcHVHLEVBQ1BxdUcsRUFBTyxJQUdUNTdGLEVBQUkySSxtQkFBbUJnekYsR0FDdkJ6MUYsRUFBSXlDLG1CQUFtQml6RixHQUVsQnRoSCxFQUFlK3VCLEVBQUtySixHQUVkbUYsRUFBUWtFLEVBQUlySixJQUNyQnFKLEVBQUlySixHQUFHamlCLEtBQUttb0IsR0FFWm1ELEVBQUlySixHQUFLLENBQUNxSixFQUFJckosR0FBSWtHLEdBSmxCbUQsRUFBSXJKLEdBQUtrRyxFQVFiLE9BQU9tRCxHQUdULElBQUlsRSxFQUFVaG1CLE1BQU1nbUIsU0FBVyxTQUFVMDJGLEdBQ3ZDLE1BQThDLG1CQUF2QzFpSCxPQUFPa0IsVUFBVW1YLFNBQVM1WSxLQUFLaWpILEssNkJDM0R4QyxJQUFJQyxFQUFxQixTQUFTNTFGLEdBQ2hDLGNBQWVBLEdBQ2IsSUFBSyxTQUNILE9BQU9BLEVBRVQsSUFBSyxVQUNILE9BQU9BLEVBQUksT0FBUyxRQUV0QixJQUFLLFNBQ0gsT0FBT3FQLFNBQVNyUCxHQUFLQSxFQUFJLEdBRTNCLFFBQ0UsTUFBTyxLQUliMXRCLEVBQU9ELFFBQVUsU0FBUzh3QixFQUFLb3lGLEVBQUsvcUMsRUFBSTEzRSxHQU90QyxPQU5BeWlILEVBQU1BLEdBQU8sSUFDYi9xQyxFQUFLQSxHQUFNLElBQ0MsT0FBUnJuRCxJQUNGQSxPQUFNeHNCLEdBR1csaUJBQVJ3c0IsRUFDRjVkLEVBQUlzd0csRUFBVzF5RixJQUFNLFNBQVNySixHQUNuQyxJQUFJZzhGLEVBQUs5NkYsbUJBQW1CNDZGLEVBQW1COTdGLElBQU0wd0QsRUFDckQsT0FBSXZyRCxFQUFRa0UsRUFBSXJKLElBQ1B2VSxFQUFJNGQsRUFBSXJKLElBQUksU0FBU2tHLEdBQzFCLE9BQU84MUYsRUFBSzk2RixtQkFBbUI0NkYsRUFBbUI1MUYsT0FDakQxSyxLQUFLaWdHLEdBRURPLEVBQUs5NkYsbUJBQW1CNDZGLEVBQW1CenlGLEVBQUlySixRQUV2RHhFLEtBQUtpZ0csR0FJTHppSCxFQUNFa29CLG1CQUFtQjQ2RixFQUFtQjlpSCxJQUFTMDNFLEVBQy9DeHZELG1CQUFtQjQ2RixFQUFtQnp5RixJQUYzQixJQUtwQixJQUFJbEUsRUFBVWhtQixNQUFNZ21CLFNBQVcsU0FBVTAyRixHQUN2QyxNQUE4QyxtQkFBdkMxaUgsT0FBT2tCLFVBQVVtWCxTQUFTNVksS0FBS2lqSCxJQUd4QyxTQUFTcHdHLEVBQUtvd0csRUFBSUksR0FDaEIsR0FBSUosRUFBR3B3RyxJQUFLLE9BQU9vd0csRUFBR3B3RyxJQUFJd3dHLEdBRTFCLElBREEsSUFBSXoxRixFQUFNLEdBQ0QvdEIsRUFBSSxFQUFHQSxFQUFJb2pILEVBQUc3OUcsT0FBUXZGLElBQzdCK3RCLEVBQUl6b0IsS0FBS2srRyxFQUFFSixFQUFHcGpILEdBQUlBLElBRXBCLE9BQU8rdEIsRUFHVCxJQUFJdTFGLEVBQWE1aUgsT0FBT2lJLE1BQVEsU0FBVWlvQixHQUN4QyxJQUFJN0MsRUFBTSxHQUNWLElBQUssSUFBSXhzQixLQUFPcXZCLEVBQ1Zsd0IsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLeXdCLEVBQUtydkIsSUFBTXdzQixFQUFJem9CLEtBQUsvRCxHQUUvRCxPQUFPd3NCLEksNkJDakZULElBQUlzNUUsRUFBVSxFQUFRLElBR2xCcjZFLEVBQWtCcTZFLEVBQVFyNkUsZ0JBRTFCaUIsRUFBY281RSxFQUFRcDVFLFlBRXRCOHdGLEVBQVksQ0FFaEIsaUJBQTZCLENBRTNCLElBQU0sRUFDTixTQUFXLEVBQ1gsYUFBZSxFQUNmLE9BQVMsRUFFVCxpQkFBbUIsRUFDbkIsTUFBUSxFQUNSLE1BQVEsRUFFUixTQUFXLEVBQ1gsTUFBUSxFQUNSLFNBQVcsSUFNVEUsRUFBYUYsRUFBVUUsV0FBYSxHQWdDeEMsU0FBU3dFLEVBQWtCbDNGLEVBQVVuUCxFQUFTNlAsRUFBSzRRLEVBQVVyUixHQUMzRCxJQUFJWSxFQUFhaFEsRUFBUWdRLFdBQ3JCRSxFQUFXbFEsRUFBUWtRLFNBQ3ZCbFEsRUFBUWdRLFlBQWEsRUFDckJoUSxFQUFRa1EsVUFBVyxFQUNuQixJQUFJUyxFQUFNN3FCLEtBQUsyOEcsZUFBZXR6RixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBT3pELE9BTkE3UCxFQUFRZ1EsV0FBYUEsRUFDckJoUSxFQUFRa1EsU0FBV0EsR0FFZFMsRUFBSXloQixPQUFTM1IsYUFBb0JyN0IsVUFDcENxN0IsRUFBUzlQLEdBRUpBLEVBQUl5aEIsTUFnSmIsU0FBU2swRSxFQUFzQmhpSCxFQUFRSCxHQUdyQyxHQUFHYixPQUFPbUIsZUFBZTFCLEtBQUt1QixFQUFRSCxHQUFNLE9BQU9HLEVBQU9ILEdBRTFELEdBQUtBLEtBQU9HLEVBQ1osS0FBUUEsRUFBU2hCLE9BQU8yRyxlQUFlM0YsSUFDckMsR0FBR2hCLE9BQU9veUUscUJBQXFCM3lFLEtBQUt1QixFQUFRSCxHQUFNLE9BQU9HLEVBQU9ILEdBaUVwRSxTQUFTb2lILEVBQXdCcDNGLEVBQVVDLEVBQVFwUCxFQUFTNlAsRUFBS3RyQixFQUFVdWdCLEdBQ3pFLEdBQUloZixLQUFLc0csTUFBTTlILE9BQU82cUIsTUFDbEJDLEVBQU80WixpQkFBOENoaUMsSUFBaENvb0IsRUFBTzRaLFdBQVd6a0MsSUFHM0MsSUFBb0MsSUFBaEM2cUIsRUFBTzQ3RSxxQkFDVGxtRixFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sdUJBQ05rc0IsU0FBVTlxQixFQUNWZ0csUUFBUyxrREFBb0RvRSxLQUFLTyxVQUFVM0ssU0FFekUsQ0FDTCxJQUFJeW1HLEVBQXVCNTdFLEVBQU80N0Usc0JBQXdCLEdBRWhCLG1CQUEvQmhyRixFQUFRd21HLHFCQUNqQnhtRyxFQUFRd21HLG9CQUFvQnIzRixFQUFVNXFCLEVBQVV5bUcsRUFBc0JockYsRUFBUzZQLEdBR2pGLElBQUljLEVBQU03cUIsS0FBSzI4RyxlQUFldHpGLEVBQVM1cUIsR0FBV3ltRyxFQUFzQmhyRixFQUFTNlAsRUFBSXFCLFVBQVU4NUUsRUFBc0J6bUcsSUFDbEhvc0IsRUFBSXhCLFdBQWFySyxFQUFPcUssU0FBUzVxQixLQUFXdWdCLEVBQU9xSyxTQUFTNXFCLEdBQVlvc0IsRUFBSXhCLFVBQy9FckssRUFBTzRMLGFBQWFDLElBOVF4Qmt4RixFQUFXbjZHLEtBQU8sU0FBdUJ5bkIsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUVsRSxRQUFpQjdvQixJQUFibW9CLEVBQ0YsT0FBTyxLQUVULElBQUlySyxFQUFTLElBQUk4SyxFQUFnQlQsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUN4RHpqQixFQUFROUMsTUFBTWdtQixRQUFRRixFQUFPMW5CLE1BQVEwbkIsRUFBTzFuQixLQUFPLENBQUMwbkIsRUFBTzFuQixNQUMvRCxJQUFLMEUsRUFBTXV6QyxLQUFLNzVDLEtBQUswOUcsU0FBU3AvRyxLQUFLMEIsS0FBTXFwQixFQUFVQyxFQUFRcFAsRUFBUzZQLElBQU8sQ0FDekUsSUFBSS9rQixFQUFPc0IsRUFBTXdKLEtBQUksU0FBVXlhLEdBQzdCLEdBQUlBLEVBQUosQ0FDQSxJQUFJN2hCLEVBQUs2aEIsRUFBRVgsS0FBT1csRUFBRTdoQixHQUNwQixPQUFPQSxFQUFNLElBQU1BLEVBQUssSUFBUTZoQixFQUFFLE9BRXBDdkwsRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLE9BQ05rc0IsU0FBVXZrQixFQUNWUCxRQUFTLHVCQUF5Qk8sSUFHdEMsT0FBT2dhLEdBMEJUKzhGLEVBQVd2VyxNQUFRLFNBQXdCbjhFLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FFcEUsUUFBaUI3b0IsSUFBYm1vQixFQUNGLE9BQU8sS0FFVCxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDeEQ0MkYsRUFBUSxJQUFJNzJGLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQzNELElBQUt2bUIsTUFBTWdtQixRQUFRRixFQUFPazhFLE9BQ3hCLE1BQU0sSUFBSXo2RSxFQUFZLDBCQUV4QixJQUFLekIsRUFBT2s4RSxNQUFNM3JELEtBQ2hCMG1FLEVBQWtCamlILEtBQ2hCMEIsS0FBTXFwQixFQUFVblAsRUFBUzZQLEdBQUssU0FBU2MsR0FBSzgxRixFQUFNLzFGLGFBQWFDLE9BQzdELENBQ0osSUFBSTdsQixFQUFPc2tCLEVBQU9rOEUsTUFBTTExRixLQUFJLFNBQVV5YSxFQUFHenRCLEdBQ3ZDLElBQUk0TCxFQUFLNmhCLEVBQUVYLEtBQU9XLEVBQUU3aEIsR0FDcEIsT0FBR0EsRUFBVyxJQUFNQSxFQUFLLElBQ2xCNmhCLEVBQUVwTixPQUFTdFUsS0FBS08sVUFBVW1oQixFQUFFcE4sUUFBWW9OLEVBQVEsTUFBTSxJQUFNQSxFQUFRLEtBQUksS0FBUyxjQUFjenRCLEVBQUUsT0FFdEdvZCxFQUFRMG1HLGNBQ1Y1aEcsRUFBTzRMLGFBQWErMUYsR0FFdEIzaEcsRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLFFBQ05rc0IsU0FBVXZrQixFQUNWUCxRQUFTLGlCQUFtQk8sRUFBSzZhLEtBQUssT0FHMUMsT0FBT2IsR0FXVCs4RixFQUFXeFcsTUFBUSxTQUF3Qmw4RSxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBRXBFLFFBQWlCN29CLElBQWJtb0IsRUFDRixPQUFPLEtBRVQsSUFBSzdsQixNQUFNZ21CLFFBQVFGLEVBQU9pOEUsT0FDeEIsTUFBTSxJQUFJeDZFLEVBQVksMEJBRXhCLElBQUkvTCxFQUFTLElBQUk4SyxFQUFnQlQsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUN4RHVRLEVBQU90NkIsS0FjWCxPQWJBc3BCLEVBQU9pOEUsTUFBTTU3RixTQUFRLFNBQVM0Z0IsRUFBR3p0QixHQUMvQixJQUFJd3ZDLEVBQVFoUyxFQUFLcWlGLGVBQWV0ekYsRUFBVWtCLEVBQUdyUSxFQUFTNlAsR0FDdEQsSUFBSXVpQixFQUFNQSxNQUFNLENBQ2QsSUFDSXRoQixFQURLVCxFQUFFWCxLQUFPVyxFQUFFN2hCLElBQ0g2aEIsRUFBRXBOLE9BQVN0VSxLQUFLTyxVQUFVbWhCLEVBQUVwTixRQUFZb04sRUFBUSxNQUFNLElBQU1BLEVBQVEsS0FBSSxLQUFTLGNBQWN6dEIsRUFBRSxJQUNsSGtpQixFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sUUFDTmtzQixTQUFVLENBQUU3Z0IsR0FBSXNpQixFQUFLM29CLE9BQVFpcUMsRUFBTXJpQixPQUFPNW5CLE9BQVFpcUMsTUFBT0EsR0FDekQ3bkMsUUFBUywrQkFBaUN1bUIsRUFBTSxTQUFXc2hCLEVBQU1yaUIsT0FBTzVuQixPQUFTLGVBRW5GMmMsRUFBTzRMLGFBQWEwaEIsT0FHakJ0dEIsR0FXVCs4RixFQUFXdFcsTUFBUSxTQUF3QnA4RSxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBRXBFLFFBQWlCN29CLElBQWJtb0IsRUFDRixPQUFPLEtBRVQsSUFBSzdsQixNQUFNZ21CLFFBQVFGLEVBQU9tOEUsT0FDeEIsTUFBTSxJQUFJMTZFLEVBQVksMEJBRXhCLElBQUkvTCxFQUFTLElBQUk4SyxFQUFnQlQsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUN4RDQyRixFQUFRLElBQUk3MkYsRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDdkRybkIsRUFBUTRtQixFQUFPbThFLE1BQU16MkYsT0FDdkJ1eEcsRUFBa0JqaUgsS0FDaEIwQixLQUFNcXBCLEVBQVVuUCxFQUFTNlAsR0FBSyxTQUFTYyxHQUFNODFGLEVBQU0vMUYsYUFBYUMsT0FDOUR4b0IsT0FDRjJDLEVBQU9za0IsRUFBT204RSxNQUFNMzFGLEtBQUksU0FBVXlhLEVBQUd6dEIsR0FFdkMsT0FEU3l0QixFQUFFWCxLQUFPVyxFQUFFN2hCLElBQ042aEIsRUFBRXBOLE9BQVN0VSxLQUFLTyxVQUFVbWhCLEVBQUVwTixRQUFZb04sRUFBUSxNQUFNLElBQU1BLEVBQVEsS0FBSSxLQUFTLGNBQWN6dEIsRUFBRSxPQVlqSCxPQVZZLElBQVI0RixJQUNFd1gsRUFBUTBtRyxjQUNWNWhHLEVBQU80TCxhQUFhKzFGLEdBRXRCM2hHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxRQUNOa3NCLFNBQVV2a0IsRUFDVlAsUUFBUywyQkFBNkJPLEVBQUs2YSxLQUFLLFFBRzdDYixHQVdUKzhGLEVBQVc4RSxHQUFLLFNBQXFCeDNGLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FFOUQsUUFBaUI3b0IsSUFBYm1vQixFQUF3QixPQUFPLEtBQ25DLElBQUs4NkUsRUFBUTcyRSxTQUFTaEUsRUFBT3UzRixJQUFLLE1BQU0sSUFBSXIrRyxNQUFNLHdDQUNsRCxJQUVJcW9CLEVBRkFpMkYsRUFBVVAsRUFBa0J0akgsS0FBSytDLEtBQU1xcEIsRUFBVW5QLEVBQVM2UCxFQUFLLEtBQU1ULEVBQU91M0YsSUFDNUU3aEcsRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FFNUQsR0FBRysyRixFQUFRLENBQ1QsUUFBb0I1L0csSUFBaEJvb0IsRUFBTzNOLEtBQW9CLE9BQy9CLElBQUt3b0YsRUFBUTcyRSxTQUFTaEUsRUFBTzNOLE1BQU8sTUFBTSxJQUFJblosTUFBTSwwQ0FDcERxb0IsRUFBTTdxQixLQUFLMjhHLGVBQWV0ekYsRUFBVUMsRUFBTzNOLEtBQU16QixFQUFTNlAsRUFBSXFCLFVBQVU5QixFQUFPM04sT0FDL0VxRCxFQUFPNEwsYUFBYUMsT0FDakIsQ0FDSCxRQUFvQjNwQixJQUFoQm9vQixFQUFPeTNGLEtBQW9CLE9BQy9CLElBQUs1YyxFQUFRNzJFLFNBQVNoRSxFQUFPeTNGLE1BQU8sTUFBTSxJQUFJditHLE1BQU0sMENBQ3BEcW9CLEVBQU03cUIsS0FBSzI4RyxlQUFldHpGLEVBQVVDLEVBQU95M0YsS0FBTTdtRyxFQUFTNlAsRUFBSXFCLFVBQVU5QixFQUFPeTNGLE9BQy9FL2hHLEVBQU80TCxhQUFhQyxHQUV0QixPQUFPN0wsR0FzQlQrOEYsRUFBV2lGLGNBQWdCLFNBQWdDMzNGLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDcEYsR0FBSS9wQixLQUFLc0csTUFBTTlILE9BQU82cUIsR0FBdEIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDeERtekYsT0FBbUNoOEcsSUFBdkJvb0IsRUFBTzAzRixjQUE0QjEzRixFQUFPMDNGLGNBQWdCLEdBQzFFLElBQUk3YyxFQUFRNzJFLFNBQVM0dkYsR0FBWSxNQUFNLElBQUlueUYsRUFBWSwrREFFdkQsSUFBSyxJQUFJdHNCLEtBQVk0cUIsRUFDbkIsUUFBaURub0IsSUFBOUNzL0csRUFBc0JuM0YsRUFBVTVxQixHQUF3QixDQUN6RCxJQUFJb3NCLEVBQU03cUIsS0FBSzI4RyxlQUFlbCtHLEVBQVV5K0csRUFBV2hqRyxFQUFTNlAsRUFBSXFCLFVBQVU4eEYsSUFDMUVsK0YsRUFBTzRMLGFBQWFDLEdBSXhCLE9BQU83TCxJQVdUKzhGLEVBQVc3NEUsV0FBYSxTQUE2QjdaLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDOUUsR0FBSS9wQixLQUFLc0csTUFBTTlILE9BQU82cUIsR0FBdEIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDeERtWixFQUFhNVosRUFBTzRaLFlBQWMsR0FDdEMsSUFBSyxJQUFJemtDLEtBQVl5a0MsRUFBWSxDQUMvQixJQUFJZzZFLEVBQVloNkUsRUFBV3prQyxHQUMzQixRQUFleUMsSUFBWmc4RyxFQUFILENBRU0sR0FBZSxPQUFaQSxFQUNQLE1BQU0sSUFBSW55RixFQUFZLG9EQUVrQixtQkFBL0I3USxFQUFRd21HLHFCQUNqQnhtRyxFQUFRd21HLG9CQUFvQnIzRixFQUFVNXFCLEVBQVV5K0csRUFBV2hqRyxFQUFTNlAsR0FFdEUsSUFBSW9QLEVBQU9xbkYsRUFBc0JuM0YsRUFBVTVxQixHQUN2Q29zQixFQUFNN3FCLEtBQUsyOEcsZUFBZXhqRixFQUFNK2pGLEVBQVdoakcsRUFBUzZQLEVBQUlxQixVQUFVOHhGLEVBQVd6K0csSUFDOUVvc0IsRUFBSXhCLFdBQWFySyxFQUFPcUssU0FBUzVxQixLQUFXdWdCLEVBQU9xSyxTQUFTNXFCLEdBQVlvc0IsRUFBSXhCLFVBQy9FckssRUFBTzRMLGFBQWFDLElBRXRCLE9BQU83TCxJQTBDVCs4RixFQUFXM1csa0JBQW9CLFNBQW9DLzdFLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDNUYsR0FBSS9wQixLQUFLc0csTUFBTTlILE9BQU82cUIsR0FBdEIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDeERxN0UsRUFBb0I5N0UsRUFBTzg3RSxtQkFBcUIsR0FFcEQsSUFBSyxJQUFJM21HLEtBQVk0cUIsRUFBVSxDQUM3QixJQUFJcmlCLEdBQU8sRUFDWCxJQUFLLElBQUk0a0IsS0FBV3c1RSxFQUFtQixDQUNyQyxJQUFJOFgsRUFBWTlYLEVBQWtCeDVFLEdBQ2xDLFFBQWUxcUIsSUFBWmc4RyxFQUFILENBRU0sR0FBZSxPQUFaQSxFQUNQLE1BQU0sSUFBSW55RixFQUFZLDJEQUV4QixJQUNFLElBQUlXLEVBQVMsSUFBSUQsT0FBT0csRUFBUyxLQUNqQyxNQUFNcTFGLEdBR052MUYsRUFBUyxJQUFJRCxPQUFPRyxHQUV0QixHQUFLRixFQUFPMWtCLEtBQUt2SSxHQUFqQixDQUdBdUksR0FBTyxFQUVtQyxtQkFBL0JrVCxFQUFRd21HLHFCQUNqQnhtRyxFQUFRd21HLG9CQUFvQnIzRixFQUFVNXFCLEVBQVV5K0csRUFBV2hqRyxFQUFTNlAsR0FHdEUsSUFBSWMsRUFBTTdxQixLQUFLMjhHLGVBQWV0ekYsRUFBUzVxQixHQUFXeStHLEVBQVdoakcsRUFBUzZQLEVBQUlxQixVQUFVOHhGLEVBQVd6K0csSUFDNUZvc0IsRUFBSXhCLFdBQWFySyxFQUFPcUssU0FBUzVxQixLQUFXdWdCLEVBQU9xSyxTQUFTNXFCLEdBQVlvc0IsRUFBSXhCLFVBQy9FckssRUFBTzRMLGFBQWFDLEtBRWxCN2pCLEdBQ0Z5NUcsRUFBdUJ4akgsS0FBSytDLEtBQU1xcEIsRUFBVUMsRUFBUXBQLEVBQVM2UCxFQUFLdHJCLEVBQVV1Z0IsR0FJaEYsT0FBT0EsSUFXVCs4RixFQUFXN1cscUJBQXVCLFNBQXVDNzdFLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDbEcsR0FBSS9wQixLQUFLc0csTUFBTTlILE9BQU82cUIsR0FBdEIsQ0FFQSxHQUFJQyxFQUFPODdFLGtCQUNULE9BQU8sS0FFVCxJQUFJcG1GLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQzVELElBQUssSUFBSXRyQixLQUFZNHFCLEVBQ25CbzNGLEVBQXVCeGpILEtBQUsrQyxLQUFNcXBCLEVBQVVDLEVBQVFwUCxFQUFTNlAsRUFBS3RyQixFQUFVdWdCLEdBRTlFLE9BQU9BLElBU1QrOEYsRUFBV21GLGNBQWdCLFNBQWdDNzNGLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDcEYsR0FBSy9wQixLQUFLc0csTUFBTTlILE9BQU82cUIsR0FBdkIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FTNUQsT0FSV3ZzQixPQUFPaUksS0FBSzRqQixHQUNaaG5CLFFBQVVpbkIsRUFBTzQzRixlQUMxQmxpRyxFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sZ0JBQ05rc0IsU0FBVUQsRUFBTzQzRixjQUNqQno4RyxRQUFTLDRDQUE4QzZrQixFQUFPNDNGLGdCQUczRGxpRyxJQVNUKzhGLEVBQVdvRixjQUFnQixTQUFnQzkzRixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ3BGLEdBQUsvcEIsS0FBS3NHLE1BQU05SCxPQUFPNnFCLEdBQXZCLENBQ0EsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBUzVELE9BUld2c0IsT0FBT2lJLEtBQUs0akIsR0FDWmhuQixRQUFVaW5CLEVBQU82M0YsZUFDMUJuaUcsRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLGdCQUNOa3NCLFNBQVVELEVBQU82M0YsY0FDakIxOEcsUUFBUyw0Q0FBOEM2a0IsRUFBTzYzRixnQkFHM0RuaUcsSUFXVCs4RixFQUFXalgsTUFBUSxTQUF3Qno3RSxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ3BFLElBQUl1USxFQUFPdDZCLEtBQ1gsR0FBS0EsS0FBS3NHLE1BQU1jLE1BQU1paUIsU0FDSG5vQixJQUFmb29CLEVBQU93N0UsTUFBWCxDQUNBLElBQUk5bEYsRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FzQjVELE9BckJBVixFQUFTcUQsT0FBTSxTQUFVM3VCLEVBQU9qQixHQUM5QixHQUFHMEcsTUFBTWdtQixRQUFRRixFQUFPdzdFLE9BQ3RCLElBQUlBLE9BQTJCNWpHLElBQWxCb29CLEVBQU93N0UsTUFBTWhvRyxHQUFpQndzQixFQUFPMDdFLGdCQUFrQjE3RSxFQUFPdzdFLE1BQU1ob0csUUFFN0Vnb0csRUFBUXg3RSxFQUFPdzdFLE1BRXJCLFFBQWM1akcsSUFBVjRqRyxFQUNGLE9BQU8sRUFFVCxJQUFjLElBQVZBLEVBS0YsT0FKQTlsRixFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sUUFDTm9ILFFBQVMsbUNBRUosRUFFVCxJQUFJb21CLEVBQU15UCxFQUFLcWlGLGVBQWU1K0csRUFBTyttRyxFQUFPNXFGLEVBQVM2UCxFQUFJcUIsVUFBVTA1RSxFQUFPaG9HLElBRzFFLE9BRkcrdEIsRUFBSXhCLFdBQWFySyxFQUFPcUssU0FBU3ZzQixLQUFJa2lCLEVBQU9xSyxTQUFTdnNCLEdBQUsrdEIsRUFBSXhCLFVBQ2pFckssRUFBTzRMLGFBQWFDLElBQ2IsS0FFRjdMLElBV1QrOEYsRUFBV2h5RyxTQUFXLFNBQTJCc2YsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUMxRSxJQUFJdVEsRUFBT3Q2QixLQUNYLEdBQUtBLEtBQUtzRyxNQUFNYyxNQUFNaWlCLFNBQ0Fub0IsSUFBbEJvb0IsRUFBT3ZmLFNBQVgsQ0FDQSxJQUFLbzZGLEVBQVE3MkUsU0FBU2hFLEVBQU92ZixVQUFXLE1BQU0sSUFBSXZILE1BQU0sOENBQ3hELElBQUl3YyxFQUFTLElBQUk4SyxFQUFnQlQsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQVk1RCxPQVBXLElBSkNWLEVBQVN3d0IsTUFBSyxTQUFVOTdDLEVBQU9qQixHQUV6QyxPQUEyQixJQURqQnc5QixFQUFLcWlGLGVBQWU1K0csRUFBT3VyQixFQUFPdmYsU0FBVW1RLEVBQVM2UCxFQUFJcUIsVUFBVTlCLEVBQU92ZixTQUFVak4sSUFDbkZtdEIsT0FBTzVuQixXQUdsQjJjLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxXQUNOa3NCLFNBQVVELEVBQU92ZixTQUNqQnRGLFFBQVMsK0NBR051YSxJQVNUKzhGLEVBQVdxRixRQUFVLFNBQTBCLzNGLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDeEUsR0FBSy9wQixLQUFLc0csTUFBTTZtQixPQUFPOUQsR0FBdkIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FrQjVELE9BakJJVCxFQUFPKzNGLG1CQUFnRCxJQUE1Qi8zRixFQUFPKzNGLGlCQUMvQmg0RixFQUFXQyxFQUFPODNGLFNBQ3JCcGlHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxVQUNOa3NCLFNBQVVELEVBQU84M0YsUUFDakIzOEcsUUFBUyx3QkFBMEI2a0IsRUFBTzgzRixVQUl6Qy8zRixHQUFZQyxFQUFPODNGLFNBQ3RCcGlHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxVQUNOa3NCLFNBQVVELEVBQU84M0YsUUFDakIzOEcsUUFBUyxvQ0FBc0M2a0IsRUFBTzgzRixVQUlyRHBpRyxJQVNUKzhGLEVBQVd1RixRQUFVLFNBQTBCajRGLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDeEUsR0FBSy9wQixLQUFLc0csTUFBTTZtQixPQUFPOUQsR0FBdkIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FrQjVELE9BakJJVCxFQUFPaTRGLG1CQUFnRCxJQUE1Qmo0RixFQUFPaTRGLGlCQUMvQmw0RixFQUFXQyxFQUFPZzRGLFNBQ3JCdGlHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxVQUNOa3NCLFNBQVVELEVBQU9nNEYsUUFDakI3OEcsUUFBUyxxQkFBdUI2a0IsRUFBT2c0RixVQUl0Q2o0RixHQUFZQyxFQUFPZzRGLFNBQ3RCdGlHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxVQUNOa3NCLFNBQVVELEVBQU9nNEYsUUFDakI3OEcsUUFBUyxpQ0FBbUM2a0IsRUFBT2c0RixVQUlsRHRpRyxJQVNUKzhGLEVBQVdzRixpQkFBbUIsU0FBbUNoNEYsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUUxRixHQUFzQyxrQkFBNUJULEVBQU8rM0Ysa0JBQ1pyaEgsS0FBS3NHLE1BQU02bUIsT0FBTzlELEdBQXZCLENBQ0EsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBUzVELE9BUllWLEVBQVdDLEVBQU8rM0Ysa0JBRTVCcmlHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxtQkFDTmtzQixTQUFVRCxFQUFPKzNGLGlCQUNqQjU4RyxRQUFTLGlDQUFtQzZrQixFQUFPKzNGLG1CQUdoRHJpRyxJQVNUKzhGLEVBQVd3RixpQkFBbUIsU0FBbUNsNEYsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUUxRixHQUFzQyxrQkFBNUJULEVBQU9pNEYsa0JBQ1p2aEgsS0FBS3NHLE1BQU02bUIsT0FBTzlELEdBQXZCLENBQ0EsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBUzVELE9BUllWLEVBQVdDLEVBQU9pNEYsa0JBRTVCdmlHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxtQkFDTmtzQixTQUFVRCxFQUFPaTRGLGlCQUNqQjk4RyxRQUFTLDhCQUFnQzZrQixFQUFPaTRGLG1CQUc3Q3ZpRyxJQVdULElBQUl3aUcsRUFBaUMsU0FBeUNuNEYsRUFBVUMsRUFBUXBQLEVBQVM2UCxFQUFLMDNGLEVBQWdCQyxHQUM1SCxHQUFLMWhILEtBQUtzRyxNQUFNNm1CLE9BQU85RCxHQUF2QixDQUVBLElBQUlzNEYsRUFBcUJyNEYsRUFBT200RixHQUNoQyxHQUEwQixHQUF0QkUsRUFDRixNQUFNLElBQUk1MkYsRUFBWTAyRixFQUFpQixtQkFHekMsSUFBSXppRyxFQUFTLElBQUk4SyxFQUFnQlQsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUV4RDYzRixFQUFtQnpkLEVBQVFqM0UsaUJBQWlCN0QsR0FDNUN3NEYsRUFBa0IxZCxFQUFRajNFLGlCQUFpQnkwRixHQUUzQ0csRUFBY2h6RyxLQUFLbUIsSUFBSTJ4RyxFQUFtQkMsR0FDMUNodkIsRUFBYS9qRixLQUFLaXpHLElBQUksR0FBSUQsR0FVOUIsT0FSSWh6RyxLQUFLNEssTUFBTTJQLEVBQVd3cEUsR0FBYy9qRixLQUFLNEssTUFBTWlvRyxFQUFxQjl1QixJQUFnQixHQUN0Rjd6RSxFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU1va0gsRUFDTmw0RixTQUFXbzRGLEVBQ1hsOUcsUUFBU2k5RyxFQUFlNzRHLEtBQUtPLFVBQVV1NEcsS0FJcEMzaUcsSUF5TVQsU0FBU2dqRyxFQUFZejNGLEVBQUd6dEIsRUFBR3duQixHQUN6QixJQUFJL1YsRUFBRzVKLEVBQU0yZixFQUFFamlCLE9BQ2YsSUFBS2tNLEVBQUl6UixFQUFJLEVBQVF5UixFQUFJNUosRUFBSzRKLElBQzVCLEdBQUk0MUYsRUFBUTEzRSxrQkFBa0JsQyxFQUFHakcsRUFBRS9WLElBQ2pDLE9BQU8sRUFHWCxPQUFPLEVBdk1Ud3RHLEVBQVdrRyxXQUFhLFNBQTZCNTRGLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDOUUsT0FBT3kzRixFQUErQnZrSCxLQUFLK0MsS0FBTXFwQixFQUFVQyxFQUFRcFAsRUFBUzZQLEVBQUssYUFBYyx5Q0FTakdneUYsRUFBV21HLFlBQWMsU0FBOEI3NEYsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUNoRixPQUFPeTNGLEVBQStCdmtILEtBQUsrQyxLQUFNcXBCLEVBQVVDLEVBQVFwUCxFQUFTNlAsRUFBSyxjQUFlLHVDQVNsR2d5RixFQUFXVyxTQUFXLFNBQTJCcnpGLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDMUUsSUFBSS9LLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBa0I1RCxZQWpCaUI3b0IsSUFBYm1vQixJQUE4QyxJQUFwQkMsRUFBT296RixTQUVuQzE5RixFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sV0FDTm9ILFFBQVMsZ0JBRUZ6RSxLQUFLc0csTUFBTTlILE9BQU82cUIsSUFBYTdsQixNQUFNZ21CLFFBQVFGLEVBQU9vekYsV0FDN0RwekYsRUFBT296RixTQUFTL3lHLFNBQVEsU0FBU3BMLFFBQ1MyQyxJQUFyQ3MvRyxFQUFzQm4zRixFQUFVOXFCLElBQ2pDeWdCLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxXQUNOa3NCLFNBQVVockIsRUFDVmtHLFFBQVMscUJBQXVCb0UsS0FBS08sVUFBVTdLLFFBS2hEeWdCLEdBU1QrOEYsRUFBV253RixRQUFVLFNBQTBCdkMsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUN4RSxHQUFLL3BCLEtBQUtzRyxNQUFNNitCLE9BQU85YixHQUF2QixDQUNBLElBQUlySyxFQUFTLElBQUk4SyxFQUFnQlQsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUN4RDZCLEVBQVV0QyxFQUFPc0MsUUFDckIsSUFDRSxJQUFJRixFQUFTLElBQUlELE9BQU9HLEVBQVMsS0FDakMsTUFBTXExRixHQUdOdjFGLEVBQVMsSUFBSUQsT0FBT0csR0FTdEIsT0FQS3ZDLEVBQVN4WixNQUFNNmIsSUFDbEIxTSxFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sVUFDTmtzQixTQUFVRCxFQUFPc0MsUUFDakJubkIsUUFBUywwQkFBNEJvRSxLQUFLTyxVQUFVa2dCLEVBQU9zQyxRQUFRL1YsY0FHaEVtSixJQXdCVCs4RixFQUFXaHdGLE9BQVMsU0FBeUIxQyxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ3RFLFFBQWU3b0IsSUFBWG1vQixFQUFKLENBQ0EsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBUTVELE9BUEsvSyxFQUFPcUwsZUFBa0I4NUUsRUFBUXI0RSxTQUFTekMsRUFBVUMsRUFBT3lDLE9BQVEvckIsT0FDdEVnZixFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sU0FDTmtzQixTQUFVRCxFQUFPeUMsT0FDakJ0bkIsUUFBUywyQkFBNkJvRSxLQUFLTyxVQUFVa2dCLEVBQU95QyxRQUFVLFlBR25FL00sSUFTVCs4RixFQUFXb0csVUFBWSxTQUE0Qjk0RixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQzVFLEdBQUsvcEIsS0FBS3NHLE1BQU02K0IsT0FBTzliLEdBQXZCLENBQ0EsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ3hEcTRGLEVBQU0vNEYsRUFBU3haLE1BQU0sb0JBU3pCLE9BUmF3WixFQUFTaG5CLFFBQVUrL0csRUFBTUEsRUFBSS8vRyxPQUFTLElBQ25DaW5CLEVBQU82NEYsV0FDckJuakcsRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLFlBQ05rc0IsU0FBVUQsRUFBTzY0RixVQUNqQjE5RyxRQUFTLG1DQUFxQzZrQixFQUFPNjRGLFlBR2xEbmpHLElBU1QrOEYsRUFBV3hoQyxVQUFZLFNBQTRCbHhELEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDNUUsR0FBSy9wQixLQUFLc0csTUFBTTYrQixPQUFPOWIsR0FBdkIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FFeERxNEYsRUFBTS80RixFQUFTeFosTUFBTSxvQkFTekIsT0FSYXdaLEVBQVNobkIsUUFBVSsvRyxFQUFNQSxFQUFJLy9HLE9BQVMsSUFDbkNpbkIsRUFBT2l4RCxXQUNyQnY3RCxFQUFPMEwsU0FBUyxDQUNkcnRCLEtBQU0sWUFDTmtzQixTQUFVRCxFQUFPaXhELFVBQ2pCOTFFLFFBQVMsbUNBQXFDNmtCLEVBQU9peEQsWUFHbER2N0QsSUFTVCs4RixFQUFXc0csU0FBVyxTQUEyQmg1RixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQzFFLEdBQUsvcEIsS0FBS3NHLE1BQU1jLE1BQU1paUIsR0FBdEIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FRNUQsT0FQTVYsRUFBU2huQixRQUFVaW5CLEVBQU8rNEYsVUFDOUJyakcsRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLFdBQ05rc0IsU0FBVUQsRUFBTys0RixTQUNqQjU5RyxRQUFTLG1DQUFxQzZrQixFQUFPKzRGLFdBR2xEcmpHLElBU1QrOEYsRUFBV3VHLFNBQVcsU0FBMkJqNUYsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUMxRSxHQUFLL3BCLEtBQUtzRyxNQUFNYyxNQUFNaWlCLEdBQXRCLENBQ0EsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBUTVELE9BUE1WLEVBQVNobkIsUUFBVWluQixFQUFPZzVGLFVBQzlCdGpHLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxXQUNOa3NCLFNBQVVELEVBQU9nNUYsU0FDakI3OUcsUUFBUyxtQ0FBcUM2a0IsRUFBT2c1RixXQUdsRHRqRyxJQTBCVCs4RixFQUFXd0csWUFBYyxTQUE4Qmw1RixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ2hGLElBQXlCLElBQXJCVCxFQUFPaTVGLGFBQ052aUgsS0FBS3NHLE1BQU1jLE1BQU1paUIsR0FBdEIsQ0FDQSxJQUFJckssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FPNUQsT0FOS1YsRUFBU3FELE1BQU1zMUYsSUFDbEJoakcsRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLGNBQ05vSCxRQUFTLDRCQUdOdWEsSUFXVCs4RixFQUFXMVcsYUFBZSxTQUErQmg4RSxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ2xGLEdBQUsvcEIsS0FBS3NHLE1BQU05SCxPQUFPNnFCLEdBQXZCLENBQ0EsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQzVELElBQUssSUFBSXRyQixLQUFZNnFCLEVBQU8rN0UsYUFDMUIsUUFBMkJua0csSUFBdkJtb0IsRUFBUzVxQixHQUFiLENBR0EsSUFBSStqSCxFQUFNbDVGLEVBQU8rN0UsYUFBYTVtRyxHQUMxQmdrSCxFQUFlMTRGLEVBQUlxQixVQUFVbzNGLEVBQUsvakgsR0FJdEMsR0FIa0IsaUJBQVArakgsSUFDVEEsRUFBTSxDQUFDQSxJQUVMaC9HLE1BQU1nbUIsUUFBUWc1RixHQUNoQkEsRUFBSTc0RyxTQUFRLFNBQVV3dkIsUUFDR2o0QixJQUFuQm1vQixFQUFTOFAsSUFDWG5hLEVBQU8wTCxTQUFTLENBR2RydEIsS0FBTSxlQUNOa3NCLFNBQVVrNUYsRUFBYXo0RixhQUN2QnZsQixRQUFTLFlBQWMwMEIsRUFBTywyQkFBNkJzcEYsRUFBYXo0RixzQkFJekUsQ0FDTCxJQUFJYSxFQUFNN3FCLEtBQUsyOEcsZUFBZXR6RixFQUFVbTVGLEVBQUt0b0csRUFBU3VvRyxHQUNuRHpqRyxFQUFPcUssV0FBYXdCLEVBQUl4QixXQUFVckssRUFBT3FLLFNBQVd3QixFQUFJeEIsVUFDdkR3QixHQUFPQSxFQUFJWixPQUFPNW5CLFNBQ3BCMmMsRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLGVBQ05rc0IsU0FBVWs1RixFQUFhejRGLGFBQ3ZCdmxCLFFBQVMsd0NBQTBDZytHLEVBQWF6NEYsZUFFbEVoTCxFQUFPNEwsYUFBYUMsS0FJMUIsT0FBTzdMLElBVVQrOEYsRUFBaUIsS0FBSSxTQUF1QjF5RixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ3JFLFFBQWlCN29CLElBQWJtb0IsRUFDRixPQUFPLEtBRVQsSUFBSzdsQixNQUFNZ21CLFFBQVFGLEVBQWEsTUFDOUIsTUFBTSxJQUFJeUIsRUFBWSx3QkFBeUJ6QixHQUVqRCxJQUFJdEssRUFBUyxJQUFJOEssRUFBZ0JULEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FRNUQsT0FQS1QsRUFBYSxLQUFFdXdCLEtBQUtzcUQsRUFBUTEzRSxrQkFBa0JudUIsS0FBSyxLQUFNK3FCLEtBQzVEckssRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLE9BQ05rc0IsU0FBVUQsRUFBYSxLQUN2QjdrQixRQUFTLDhCQUFnQzZrQixFQUFhLEtBQUV4WixJQUFJck4sUUFBUW9kLEtBQUssT0FHdEViLEdBVVQrOEYsRUFBa0IsTUFBSSxTQUF1QjF5RixFQUFVQyxFQUFRcFAsRUFBUzZQLEdBQ3RFLFFBQWlCN29CLElBQWJtb0IsRUFDRixPQUFPLEtBRVQsSUFBSXJLLEVBQVMsSUFBSThLLEVBQWdCVCxFQUFVQyxFQUFRcFAsRUFBUzZQLEdBUTVELE9BUEtvNkUsRUFBUTEzRSxrQkFBa0JuRCxFQUFjLE1BQUdELElBQzlDckssRUFBTzBMLFNBQVMsQ0FDZHJ0QixLQUFNLFFBQ05rc0IsU0FBVUQsRUFBYyxNQUN4QjdrQixRQUFTLDZDQUErQzZrQixFQUFjLFFBR25FdEssR0FXVCs4RixFQUFXclcsSUFBTXFXLEVBQVd6VyxTQUFXLFNBQXNCajhFLEVBQVVDLEVBQVFwUCxFQUFTNlAsR0FDdEYsSUFBSXVRLEVBQU90NkIsS0FDWCxRQUFja0IsSUFBWG1vQixFQUFzQixPQUFPLEtBQ2hDLElBQUlySyxFQUFTLElBQUk4SyxFQUFnQlQsRUFBVUMsRUFBUXBQLEVBQVM2UCxHQUN4RDI0RixFQUFXcDVGLEVBQU9vOEUsS0FBT3A4RSxFQUFPZzhFLFNBQ3BDLE9BQUlvZCxHQUNBbC9HLE1BQU1nbUIsUUFBUWs1RixLQUFXQSxFQUFTLENBQUNBLElBQ3ZDQSxFQUFTLzRHLFNBQVEsU0FBVS9ILEdBQ3pCLEdBQUkwNEIsRUFBS29qRixTQUFTcjBGLEVBQVVDLEVBQVFwUCxFQUFTNlAsRUFBS25vQixHQUFPLENBQ3ZELElBQ0krZ0gsRUFESy9nSCxJQUFTQSxFQUFLZ29CLEtBQU9ob0IsRUFBSzhHLEtBQ2Q5RyxFQUNyQm9kLEVBQU8wTCxTQUFTLENBQ2RydEIsS0FBTSxNQUNOa3NCLFNBQVVvNUYsRUFDVmwrRyxRQUFTLHlCQUEyQmsrRyxRQUluQzNqRyxHQWJjLE1BZ0J2Qm5pQixFQUFPRCxRQUFVaS9HLEcsK0ZDaDlCakIsY0FnQ29CLEVBQUF0cEcsUUE5QnBCL0YsZUFBd0JHLEdBRXRCLE1BQU1pUCxRQUFpQmc0QixNQUFNLHNDQUM3QnJxQyxTQUFTbU8sS0FBS25NLGdCQUFrQnFRLEVBQVNILE9BQ3hDbFMsU0FBUzJCLGVBQWUsYUFBbUNxMUYsS0FBTyxxQ0FDbkVoM0YsU0FBUzJCLGVBQWUsZ0JBQWdCa00sWUFBYyxhQUNsQzdOLFNBQVMyQixlQUFlLGtCQUFtQm9oQixJQUFNLDJDQUNyRTlvQixNQUFNNkcsS0FBS2QsU0FBU0MsdUJBQXVCLHVCQUF1QkcsUUFBU29CLElBQ3JEQSxFQUFJdWhCLElBQU0sK0NBR2hDL2lCLFNBQVMyQixlQUFlLFlBQVlrUyxVQUFZelEsRUFBU29wRyxTQUFTNTRGLE1BQ2xFNVQsU0FBUzRULE1BQVF4USxFQUFTb3BHLFNBQVM1NEYsTUFHbkM1VCxTQUFTMkIsZUFBZSx1QkFBdUJySCxpQkFBaUIsU0FBUyxXQUN2RThJLEVBQVN3a0csTUFBTXQ4RSxtQkFBbUIsRUFBQXBhLGdCQUFnQm1DLFNBQ2xEalEsRUFBU3drRyxNQUFNcjhFLHFCQUlRdnJCLFNBQVNxRSxjQUEyQiw0QkFDNUNwRCxhQUFhLE1BQU8sb0RBR3JDLE1BQU1tbkcsRUFBWXBvRyxTQUFTcUUsY0FBOEIsZUFDekQrakcsRUFBVW5uRyxhQUFhLE1BQU8sMkNBQzlCbW5HLEVBQVVubkcsYUFBYSxNQUFPLHdCLDRIQzlCaEMsY0FDQSxPQW1CQSxTQUFnQm80RyxJQUNkLE1BQU1DLEVBQW9CdDVHLFNBQVMyQixlQUFlLHdCQUNsRCxJQUFBc0wsYUFBWSxDQUFFdk8sVUFBVzQ2RyxFQUFrQnhwRyxVQUUzQyxNQUFNeXBHLEVBQWlCdjVHLFNBQVMyQixlQUFlLGtCQUFrQjhZLFdBQzNEMFIsRUFBYW5zQixTQUFTcUUsY0FBYyxjQUN0Q2kxRyxFQUFrQnhwRyxRQUNwQnlwRyxFQUFjMzRHLE1BQU1zSixRQUFVLElBRzlCcXZHLEVBQWMzNEcsTUFBTXNKLFFBQVUsT0FDOUJpaUIsRUFBVzdyQixVQUFVQyxPQUFPLGFBRzlCLElBQUEyckIsNEJBL0JGLDBCQUNFLE1BQU1vdEYsRUFBb0J0NUcsU0FBU3FFLGNBQWdDLHlCQUU3RCxVQUFFM0YsSUFBYyxJQUFBK1AsZUFFdEI2cUcsRUFBa0J4cEcsUUFBVXBSLEdBRTVCLElBQUE4NkcsZ0JBRUFILElBRUFDLEVBQWtCaC9HLGlCQUFpQixRQUFTLEtBQzFDKytHLE9BS0osMkIsK0ZDcEJBLGNBR0EsT0E4TnlCLEVBQUFyd0csUUE5RXpCLE1BYUUsWUFBYXpGLEVBQXFCczlGLEVBQ2hDeHpGLEVBQW9CcUIsR0FDcEJqWSxLQUFLOE0sS0FBT0EsRUFDWjlNLEtBQUtnakgsU0FBVzVZLEVBQ2hCcHFHLEtBQUs0VyxXQUFhQSxFQUNsQjVXLEtBQUtpWSxZQUFjQSxFQUVFMU8sU0FBUzJCLGVBQWUsb0JBQ2hDSyxVQTlKakIsU0FBK0IwM0csR0FDN0IsSUFBSXhpRyxFQUFXLHljQWlJZixZQXRIbUJ2ZixJQUFmK2hILElBQ0Z4aUcsR0FBWSxtbkNBd0JkQSxHQUFZLG1nSUE2RkxBLEVBNEJvQnlpRyxDQUFxQmxqSCxLQUFLaVksYUFFbkRqWSxLQUFLbWpILGVBRUxuakgsS0FBSzhNLEtBQUtzMkcsa0JBQWtCcGpILEtBQUtxakgsb0JBQW9CL2tILEtBQUswQixPQU01RCxzQkFDTUEsS0FBS2lZLGFBRVBxckcsRUFBZ0JDLGdCQUFnQnZqSCxLQUFLaVksYUFFdkNxckcsRUFBZ0JFLG9CQUFvQnhqSCxLQUFLZ2pILFNBQVVoakgsS0FBSzRXLFlBUzFELGVBQ0UsTUFBTSxLQUFFcFAsRUFBSSxhQUFFQyxFQUFZLGFBQUVDLEVBQVksY0FBRUUsSUFBa0IsSUFBQW9RLGVBR3hEek8sU0FBU3FFLGNBQWdDLGlCQUMzQ3JFLFNBQVNxRSxjQUFnQyxlQUFlN1AsTUFBUTBFLE9BQU8rRSxHQUN2RStCLFNBQVNxRSxjQUFnQyxlQUFlN1AsTUFBUTBFLE9BQU8rRSxJQUl6RStCLFNBQVNxRSxjQUFnQyxvQkFBb0I3UCxNQUFRMEUsT0FBT2lGLEdBQzVFNkIsU0FBU3FFLGNBQWdDLG9CQUFvQjdQLE1BQVEwRSxPQUFPaUYsR0FHNUU2QixTQUFTcUUsY0FBZ0Msa0JBQWtCN1AsTUFBUTBFLE9BQU9nRixHQUMxRThCLFNBQVNxRSxjQUFnQyxrQkFBa0I3UCxNQUFRMEUsT0FBT2dGLEdBSTFFLE1BQU1nVSxFQUF5QixTQUFsQjdULEVBQTJCLE1BQVFBLEVBQWMsR0FBRzBQLGNBQWdCMVAsRUFBY2xILE1BQU0sR0FDckc2SSxTQUFTcUUsY0FBYyxtQkFBbUJ3SixZQUFjLE1BQVNxRSxFQU1uRSxzQkFDRTZuRyxFQUFnQmp0RywwQkFBMEJyVyxLQUFLZ2pILFVBQy9DTSxFQUFnQjNzRyx1QkFBdUIzVyxLQUFLNFcsWUFDNUMwc0csRUFBZ0I5M0cscUIsK0ZDeE5wQixjQTZQcUIsRUFBQStHLFFBdlByQixNQWlCRSxZQUFhNUYsRUFBb0JvckcsRUFBK0JoQyxHQUM5RC8xRyxLQUFLMk0sU0FBV0EsRUFDaEIzTSxLQUFLeWpILGdCQUFrQixHQUN2QnpqSCxLQUFLMGpILFdBQVksRUFDakIxakgsS0FBSzJqSCxLQUFPLElBQUksVUFBSyxZQUFhLENBQ2hDQyxXQUFZN04sSUFFZHhzRyxTQUFTMkIsZUFBZSxhQUFhZixNQUFNMDVHLFVBQVksT0FDdkQ3akgsS0FBSzhqSCxTQUFXLElBQUk1cUYsSUFDcEJsNUIsS0FBSzJqSCxLQUFLSSx3QkFDVi9qSCxLQUFLZ2tILGFBQWUsSUFBSWpNLEVBQVEvM0csS0FBTSxpQkFBa0Isc0JBQ3hEQSxLQUFLaWtILFVBQVksSUFDakJqa0gsS0FBS2trSCxpQkFDSjM2RyxTQUFTcUUsY0FBYyxlQUErQnpELE1BQU1pM0MsT0FBUyxPQUV0RXI0QyxPQUFPbzdHLFNBQVcsS0FDaEIsTUFBTWpnRyxFQUFTbmIsT0FBT3E3RyxZQUNoQm5nRyxFQUFRbGIsT0FBT3M3RyxXQUVyQnQ3RyxPQUFPbEMsV0FBVyxLQUNYcWQsSUFBV25iLE9BQU9xN0csYUFBaUJuZ0csSUFBVWxiLE9BQU9zN0csWUFDdkRya0gsS0FBS2s1RyxXQUFXbDVHLEtBQUtpNUcsa0JBQWtCLElBRXhDajVHLEtBQUtpa0gsWUFPWixpQkFDRSxVQUFLSyxPQUFPQyxVQUFVLGtCQUFtQnZrSCxLQUFLczRHLGNBQWNoNkcsS0FBSzBCLE1BQU9BLEtBQUsyakgsS0FBS3A3RyxTQUFTaThHLElBQzNGLFVBQUtGLE9BQU9DLFVBQVUsZ0JBQWlCdmtILEtBQUt5a0gsUUFBUW5tSCxLQUFLMEIsTUFBT0EsS0FBSzJqSCxLQUFLcDdHLFNBQVNpOEcsSUFDbkYsVUFBS0YsT0FBT0MsVUFBVSxzQkFBdUJ2a0gsS0FBS2s1RyxXQUFXNTZHLEtBQUswQixNQUFPQSxLQUFLMmpILEtBQUtwN0csU0FBU2k4RyxJQUM1RixVQUFLRixPQUFPQyxVQUFVLHFCQUFzQnZrSCxLQUFLMGtILFdBQVdwbUgsS0FBSzBCLE1BQU9BLEtBQUsyakgsS0FBS3A3RyxTQUFTaThHLElBUTdGLGlCQUFrQkcsRUFBbUJwMkIsR0FBUSxHQUMzQyxTQUFTcTJCLEVBQWNDLEdBQ3JCLEdBQUlBLElBQVM3a0gsS0FBS2k1RyxpQkFBa0IsQ0FDbEMsTUFBTUcsRUFBVXA1RyxLQUFLOGpILFNBQVNubUgsSUFBSWtuSCxHQUNsQzdrSCxLQUFLMk0sU0FBU200RyxXQUFXMUwsR0FBU3o5RixLQUFNby9GLElBQ3RDLzZHLEtBQUsra0gsVUFBVWhLLEVBQUs4SixHQUNwQixNQUFNRyxFQUFjLGtCQUFvQkgsRUFDbEMzbkcsRUFBWTNULFNBQVMyQixlQUFlODVHLEdBQ3hCLE9BQWQ5bkcsR0FDRkEsRUFBVXJULFVBQVVlLElBQUksZUFFMUI1SyxLQUFLeWpILGdCQUFnQjk1RyxRQUFTZ3hCLEdBQXVCQSxPQUNwRDBILE1BQU85aEMsSUFDUyxjQUFiQSxFQUFJbEQsTUFBcUMsZ0JBQWJrRCxFQUFJbEQsTUFDbENzRixRQUFRNEIsTUFBTWhFLE1BTXRCLE1BQU0wa0gsRUFBYyxDQUFDTixHQUNyQm5oSCxNQUFNNkcsS0FBS2QsU0FBU0MsdUJBQXVCLGdCQUFnQkcsUUFBUTBDLElBQ2pFQSxFQUFLeEMsVUFBVUMsT0FBTyxpQkFFeEIsSUFBSyxNQUFNKzZHLEtBQVFJLEVBQ2IxMkIsRUFDRnhsRixPQUFPbEMsV0FBVys5RyxFQUFhdG1ILEtBQUswQixNQUFRQSxLQUFjLFVBQUc2a0gsR0FFN0RELEVBQWF0bUgsS0FBSzBCLEtBQWxCNGtILENBQXdCQyxHQVE5QixpQkFDRSxPQUFPN2tILEtBQUsyakgsS0FBS3VCLHFCQU1uQixvQkFDRSxPQUFPbGxILEtBQUs4akgsU0FBU25tSCxJQUFJcUMsS0FBS2k1RyxrQkFNaEMsYUFDRSxJQUFLOTRHLFFBQVNDLElBQ1pvRCxNQUFNNkcsS0FBS2QsU0FBU0MsdUJBQXVCLG1CQUN4Q0csUUFBUzBDLElBQXdCQSxFQUFLbEMsTUFBTXNKLFFBQVUsU0FDekQ1TSxXQUFXekcsRUFBU0osS0FBSzJqSCxLQUFLcDdHLFNBQVM0OEcsYUFBZSxPQUNwRHhwRyxLQUFLLEtBQ1AzYixLQUFLazVHLFdBQVdsNUcsS0FBSzJqSCxLQUFLdUIsc0JBQXNCLEdBQ2hEMWhILE1BQU02RyxLQUFLZCxTQUFTQyx1QkFBdUIsbUJBQ3hDRyxRQUFTMEMsSUFDUixNQUFNMHVHLEVBQU0xdUcsRUFBSys0RyxXQUNYcE0sRUFBU3hnRyxTQUFTbk0sRUFBSzNELEdBQUdtSCxNQUFNLE9BQU8sSUFDN0M3UCxLQUFLK2tILFVBQVVoSyxFQUFLL0IsR0FDcEIzc0csRUFBS2xDLE1BQU1zSixRQUFVLE9BSzdCLFlBQ0V6VCxLQUFLcWxILHVCQVFQLFVBQVd0SyxFQUFvQi9CLEdBQzdCLE1BQU0ySCxFQUFRcDNHLFNBQVMyQixlQUFlLGdCQUNoQ21sRyxFQUFhcndHLEtBQUsyakgsS0FBSzJCLG9DQUFvQ3RNLEdBQzNEampHLEVBQVMvVixLQUFLMmpILEtBQUtwN0csU0FBU2c5RyxZQUFZQyxZQUFZQyxjQUFjek0sRUFBUSxDQUM5RTBNLGdCQUFnQixFQUNoQkMscUJBQXFCLElBRWpCQyxFQUFhNzhHLE9BQU84OEcsaUJBQWlCbEYsRUFBTyxNQUMvQ21GLGlCQUFpQixlQUVkZCxFQUFjLGtCQUFvQmhNLEVBQU9uakcsV0FDL0MsSUFBSXFILEVBQVkzVCxTQUFTMkIsZUFBZTg1RyxHQVF4QyxJQVBrQixPQUFkOW5HLElBQ0ZBLEVBQVkzVCxTQUFTZ0ssY0FBYyxPQUNuQzJKLEVBQVV4VSxHQUFLczhHLEVBQ2Y5bkcsRUFBVXJULFVBQVVlLElBQUksa0JBQ3hCKzFHLEVBQU1uckYsWUFBWXRZLElBR2JBLEVBQVVrb0csWUFDZmxvRyxFQUFVNmlGLFlBQVk3aUYsRUFBVWtvRyxZQUdsQ3JLLEVBQUl2d0csYUFBYSxRQUFTNmxHLEVBQVdwc0YsTUFBTXBPLFlBQzNDa2xHLEVBQUl2d0csYUFBYSxTQUFVNmxHLEVBQVduc0YsT0FBT3JPLFlBQzdDcUgsRUFBVS9TLE1BQU1sRixTQUFXLFdBQzNCaVksRUFBVS9TLE1BQU00N0csSUFBU2h3RyxFQUFPZ3dHLElBQVYsS0FDdEI3b0csRUFBVS9TLE1BQU1naEMsS0FBVXAxQixFQUFPbzFCLEtBQU8zeUIsU0FBU290RyxHQUExQixLQUV2QjFvRyxFQUFVc1ksWUFBWXVsRixHQU14QixVQUNFLzZHLEtBQUswakgsV0FBWSxFQUNqQjFqSCxLQUFLZ2tILGFBQWFnQyxzQkFDbEJ6OEcsU0FBUzJCLGVBQWUsV0FBV2YsTUFBTXNKLFFBQVUsT0FPckQsa0JBQW1CcVUsR0FDakI5bkIsS0FBS3lqSCxnQkFBZ0JyaEgsS0FBSzBsQixHQU81QixxQkFBc0JBLEdBQ3BCLE1BQU0xaUIsRUFBUXBGLEtBQUt5akgsZ0JBQWdCMTRCLFVBQVcxK0UsR0FDckNBLElBQVN5YixJQUVILElBQVgxaUIsR0FDRnBGLEtBQUt5akgsZ0JBQWdCcjdFLE9BQU9oakMsRUFBTyxHQU92Qyx1QkFDRW1FLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFVBQVkrVCxJQUN6QyxPQUFRQSxFQUFJdlosS0FDVixJQUFLLElBQ0gsSUFBSyxNQUFNNmUsS0FBYTNULFNBQVNDLHVCQUF1QixrQkFDdEQwVCxFQUFVL1MsTUFBTTg3RyxXQUFhLFlBT3JDMThHLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFFBQVUrVCxJQUN2QyxPQUFRQSxFQUFJdlosS0FDVixJQUFLLElBQ0gsSUFBSyxNQUFNNmUsS0FBYTNULFNBQVNDLHVCQUF1QixrQkFDdEQwVCxFQUFVL1MsTUFBTTg3RyxXQUFhLE1BWXZDLGNBQWVsUSxHQUNiLzFHLEtBQUs4akgsU0FBU3Z3QyxRQUNkLElBQUssTUFBTTJ5QyxLQUFZblEsRUFBU29RLFVBQzlCLElBQUssTUFBTTFkLEtBQVV5ZCxFQUFTRSxTQUM1QnBtSCxLQUFLOGpILFNBQVM3L0csSUFBSWlpSCxFQUFTRSxTQUFTeDNHLFFBQVE2NUYsR0FBU0EsRUFBTyxRQVFsRSxjQUdFLE9BRnVCem9HLEtBQUsyakgsS0FBS3A3RyxTQUFTd3RHLFNBQVNzUSxVQUUzQixNQURQcm1ILEtBQUsyakgsS0FBS3A3RyxTQUFTd3RHLFNBQVN1USxNQUFNdG1ILEtBQUtpNUcsa0JBQWtCbDhHLEssY0NyTzlFLElBQ1F3cEgsRUFFQUMsRUFHQUMsRUFXQUMsRUFoQkFILEVBQU94OUcsT0FBTzQ5RyxzQkFFZEgsRUFBVyxlQUFnQmo5RyxTQUczQms5RyxFQUFVLFdBQ1YsSUFBSyxJQUFJM3BILEVBQUUsRUFBR0EsRUFBRTZELFVBQVUwQixPQUFRdkYsSUFDOUIsSUFBSyxJQUFJdUIsS0FBT3NDLFVBQVU3RCxHQUNsQjZELFVBQVU3RCxHQUFHNkIsZUFBZU4sS0FDNUJzQyxVQUFVLEdBQUd0QyxHQUFPc0MsVUFBVTdELEdBQUd1QixJQUk3QyxPQUFPc0MsVUFBVSxLQUdqQitsSCxFQUFpQixTQUFTcDlHLEVBQVNmLEdBUW5DLE9BUEF2SSxLQUFLdUksU0FBV2srRyxFQUFRLEdBQUlDLEVBQWVFLFNBQVVyK0csR0FDckR2SSxLQUFLK0ssR0FBV3pCLEVBQ2hCdEosS0FBSzZtSCxhQUFlLGlCQUVwQjdtSCxLQUFLOG1ILGdCQUVMOW1ILEtBQUsrSyxHQUFHZzhHLGdCQUFrQi9tSCxLQUNuQkEsT0FHSTRtSCxTQUFXLENBQ3RCeGxFLE9BQVEsT0FDUjRsRSxZQUFZLEVBQ1pDLGlCQUFpQixFQUNqQkMsVUFBVyxFQUNYbDFHLEdBQUcsRUFDSEosR0FBRyxFQUNIdTFHLFNBQVUsR0FDVkMsWUFBYSxHQUNiQyxZQUFhLEdBQ2JoM0IsUUFBUSxFQUNSaTNCLFlBQWEsQ0FDVHRqQixHQUFJLG9CQUNKdWpCLEtBQU0sc0JBQ05wOEUsS0FBTSxzQkFDTkMsTUFBTyx3QkFFWG84RSxrQkFBbUIsQ0FDZnhqQixHQUFJLDBCQUNKdWpCLEtBQU0sNEJBQ05wOEUsS0FBTSw0QkFDTkMsTUFBTywrQkFLZnM3RSxFQUFlaG9ILFVBQVVxbUMsTUFBUSxTQUFTN3FCLEdBQ3RDbGEsS0FBS3VJLFNBQVdrK0csRUFBUXptSCxLQUFLdUksU0FBVTJSLEdBQ3ZDbGEsS0FBS3luSCxTQUFXdnRHLEVBQVF1dEcsVUFBWXpuSCxLQUFLeW5ILFNBQ3pDem5ILEtBQUswbkgsVUFBWXh0RyxFQUFRd3RHLFdBQWExbkgsS0FBSzBuSCxVQUMzQzFuSCxLQUFLdUksU0FBU3krRyxZQUFhLEVBQzNCaG5ILEtBQUsybkgsU0FHVGpCLEVBQWVob0gsVUFBVTRuQixJQUFNLFdBQzNCdG1CLEtBQUt1SSxTQUFTeStHLFlBQWEsR0FHL0JOLEVBQWVob0gsVUFBVWtwSCxLQUFPLFdBQzVCNW5ILEtBQUt5bkgsU0FBVyxFQUNoQnpuSCxLQUFLMG5ILFVBQVksRUFDakIxbkgsS0FBS3VJLFNBQVN5K0csWUFBYSxFQUNVLG1CQUExQmhuSCxLQUFLdUksU0FBU3MvRyxTQUNyQjduSCxLQUFLdUksU0FBU3MvRyxRQUFRNXFILEtBQUsrQyxPQUluQzBtSCxFQUFlaG9ILFVBQVVvcEgsT0FBUyxXQUM5QjluSCxLQUFLK25ILG1CQUNML25ILEtBQUsrSyxHQUFHbEIsVUFBVUMsT0FBTzlKLEtBQUs2bUgsY0FDOUI3bUgsS0FBSytLLEdBQUdaLE1BQU1pM0MsT0FBUyxJQUczQnNsRSxFQUFlaG9ILFVBQVVzcEgsT0FBUyxXQUMxQmhvSCxLQUFLK0ssR0FBR2xCLFVBQVVFLFNBQVMvSixLQUFLNm1ILGdCQUdwQzdtSCxLQUFLaW9ILG1CQUNMam9ILEtBQUsrSyxHQUFHbEIsVUFBVWUsSUFBSTVLLEtBQUs2bUgsY0FDM0I3bUgsS0FBSytLLEdBQUdaLE1BQU1pM0MsT0FBU3BoRCxLQUFLdUksU0FBUzY0QyxTQUt6Q3NsRSxFQUFlaG9ILFVBQVVvb0gsY0FBZ0IsV0FDckM5bUgsS0FBSytLLEdBQUdsQixVQUFVZSxJQUFJNUssS0FBSzZtSCxjQUUzQkosRUFBUXptSCxLQUFNLENBQ1Zrb0gsS0FBTSxLQUNOQyxVQUFVLEVBQ1ZDLEtBQU0sS0FDTkMsVUFBVSxFQUNWQyxXQUFXLEVBQ1hDLGdCQUFpQixJQUFPdm9ILEtBQUt1SSxTQUFTOCtHLFlBQ3RDbUIsU0FBVSxLQUNWQyxlQUFnQixPQUdwQnpvSCxLQUFLeW5ILFNBQVcsRUFDaEJ6bkgsS0FBSzBuSCxVQUFZLEVBRWpCLElBQUlobUgsRUFBTzFCLEtBQ1hBLEtBQUswb0gscUJBQXVCLFdBQ3hCaG5ILEVBQUtpbkgsWUFBWXpwSCxNQUFNd0MsSUFJM0IsSUFBSWtuSCxFQUFPci9HLFNBQVN5MkYsZ0JBUXBCLEdBUEE0b0IsRUFBSy9rSCxpQkFBaUIsVUFBVzdELEtBQUswb0gsc0JBQXNCLEdBQzVERSxFQUFLL2tILGlCQUFpQixRQUFTN0QsS0FBSzBvSCxzQkFBc0IsR0FFMUQxb0gsS0FBSzZvSCxjQUVMN29ILEtBQUsrSyxHQUFHWixNQUFNaTNDLE9BQVNwaEQsS0FBS3VJLFNBQVM2NEMsT0FFakNwaEQsS0FBS3VJLFNBQVMwK0csZ0JBT2QsSUFOQSxJQUFJNkIsRUFBVyxDQUFDLEdBQUksT0FBUSxXQUFZLFNBQ3BDQyxFQUFTLENBQ1QsVUFBYSxxQkFDYixZQUFlLE9BQ2Ysc0JBQXVCLFVBRWxCanNILEVBQUUsRUFBR0EsRUFBRWdzSCxFQUFTem1ILE9BQVF2RixJQUFLLENBQ2xDLElBQUlteEIsRUFBUzY2RixFQUFTaHNILEdBQ3RCLElBQUssSUFBSXVCLEtBQU8wcUgsRUFDUkEsRUFBT3BxSCxlQUFlTixLQUN0QjJCLEtBQUsrSyxHQUFHWixNQUFNOGpCLEVBQU81dkIsR0FBTzBxSCxFQUFPMXFILE1BT3ZEcW9ILEVBQWVob0gsVUFBVW1xSCxZQUFjLFdBQ25DLElBQUl2dUYsRUFBT3Q2QixLQUNYQSxLQUFLdUksU0FBU3pHLE9BQVMsQ0FDbkJrbkgsV0FBWSxTQUFTcnpHLEdBQ2pCLElBQUlzekcsRUFDQTN1RixFQUFLNHVGLFdBQVd2ekcsRUFBRXhXLE9BQVF3VyxLQUMxQnN6RyxFQUFRdHpHLEVBQUV3ekcsY0FBY0MsUUFBUSxHQUNoQzl1RixFQUFLNHNGLFVBQVk1c0YsRUFBSyt1RixXQUFXMXpHLEVBQUV4VyxPQUFRd1csR0FDM0Mya0IsRUFBS2d2RixPQUFPTCxFQUFNaG1HLFFBQVNnbUcsRUFBTS9sRyxTQUNqQ3ZOLEVBQUVrQyxvQkFHVjB4RyxVQUFXLFNBQVM1ekcsR0FDaEIsSUFBSXN6RyxFQUNBM3VGLEVBQUtndUYsWUFDTFcsRUFBUXR6RyxFQUFFd3pHLGNBQWNDLFFBQVEsR0FDaEM5dUYsRUFBS2t2RixXQUFXUCxFQUFNaG1HLFFBQVNnbUcsRUFBTS9sRyxTQUNqQ3ZOLEVBQUU4QyxnQkFDRjlDLEVBQUU4QyxtQkFJZGd4RyxVQUFXLFNBQVM5ekcsR0FDWjJrQixFQUFLNHVGLFdBQVd2ekcsRUFBRXhXLE9BQVF3VyxLQUMxQjJrQixFQUFLNHNGLFVBQVk1c0YsRUFBSyt1RixXQUFXMXpHLEVBQUV4VyxPQUFRd1csR0FDM0Mya0IsRUFBS2d2RixPQUFPM3pHLEVBQUVzTixRQUFTdE4sRUFBRXVOLFNBQ3pCb1gsRUFBS211RixlQUFpQjl5RyxFQUFFeFcsT0FDRSxRQUF0QndXLEVBQUV4VyxPQUFPd3BHLFVBQ1RoekYsRUFBRThDLGlCQUVOOUMsRUFBRWtDLG9CQUdWNnhHLFNBQVUsU0FBUy96RyxHQUNYMmtCLEVBQUs0dUYsV0FBV3Z6RyxFQUFFeFcsT0FBUXdXLEtBQzFCMmtCLEVBQUtxdkYsT0FDTHJ2RixFQUFLbXVGLGVBQWlCLEtBQ2xCOXlHLEVBQUU4QyxnQkFDRjlDLEVBQUU4QyxtQkFJZG14RyxVQUFXLFNBQVNqMEcsR0FDWjJrQixFQUFLZ3VGLFlBQ0xodUYsRUFBS2t2RixXQUFXN3pHLEVBQUVzTixRQUFTdE4sRUFBRXVOLFNBQ3pCdk4sRUFBRThDLGdCQUNGOUMsRUFBRThDLG1CQUlkb3hHLE9BQVEsU0FBU2wwRyxHQUNzQixtQkFBeEIya0IsRUFBSy94QixTQUFTdWhILE9BQ3JCeHZGLEVBQUsveEIsU0FBU3VoSCxNQUFNN3NILEtBQUtxOUIsRUFBTUEsRUFBSy94QixVQUVwQ29OLEVBQUU4QyxnQkFDRjlDLEVBQUU4QyxrQkFHVnN4RyxXQUFZLFNBQVNwMEcsR0FDakIsR0FBSTdHLEtBQUtDLElBQUl1ckIsRUFBS210RixVQUFZLEdBQUszNEcsS0FBS0MsSUFBSXVyQixFQUFLb3RGLFdBQWEsRUFLMUQsT0FKQS94RyxFQUFFOEMsaUJBQ0U5QyxFQUFFa0MsaUJBQ0ZsQyxFQUFFa0MsbUJBRUMsR0FHZm15RyxVQUFXLFNBQVNyMEcsR0FDaEIsR0FBSTJrQixFQUFLNHVGLFdBQVd2ekcsRUFBRXhXLE9BQVF3VyxJQUFNMmtCLEVBQUttdUYsZUFPckMsT0FOSTl5RyxFQUFFOEMsZ0JBQ0Y5QyxFQUFFOEMsaUJBRUY5QyxFQUFFa0MsaUJBQ0ZsQyxFQUFFa0MsbUJBRUMsR0FHZm95RyxZQUFhLFNBQVN0MEcsR0FDbEIsTUFBeUMsbUJBQTlCMmtCLEVBQUsveEIsU0FBUzBoSCxZQUNkM3ZGLEVBQUsveEIsU0FBUzBoSCxZQUFZL3FILE1BQU1vN0IsRUFBTTM1QixXQUV4QzI1QixFQUFLNHVGLFdBQVd2ekcsRUFBRXhXLE9BQVF3VyxJQUMzQkEsRUFBRThDLGdCQUNGOUMsRUFBRThDLGlCQUVGOUMsRUFBRWtDLGlCQUNGbEMsRUFBRWtDLG1CQUVDLFFBUE4sSUFZYjdYLEtBQUtpb0gsb0JBR1R2QixFQUFlaG9ILFVBQVU4cUgsV0FBYSxTQUFTdm1HLEVBQVNDLEdBQ3BELEtBQUtsakIsS0FBS3dvSCxVQUFZLElBQUk3dUYsS0FBUyxJQUFJQSxLQUFLMzVCLEtBQUt3b0gsU0FBU2xPLFVBQVl0NkcsS0FBS3VvSCxvQkFDdkV2b0gsS0FBS3dvSCxTQUFXLElBQUk3dUYsS0FFaEIzNUIsS0FBS3NvSCxZQUFjdG9ILEtBQUtrb0gsTUFBUWxvSCxLQUFLb29ILE9BQU8sQ0FDNUMsSUFBSThCLEVBQVVqbkcsRUFBVWpqQixLQUFLa29ILEtBQ3pCaUMsRUFBVWpuRyxFQUFVbGpCLEtBQUtvb0gsS0FLN0IsR0FKSXBvSCxLQUFLdUksU0FBUzhuRixTQUNkNjVCLElBQVcsRUFDWEMsSUFBVyxHQUVYbnFILEtBQUtrbkgsVUFBVSxFQUFHLENBQ2xCLElBQUk0QyxFQUFRaDdHLEtBQUtzN0csS0FBS0YsRUFBT0EsRUFBU0MsRUFBT0EsR0FDN0MsR0FBSW5xSCxLQUFLa25ILFVBQVU0QyxFQUNmLE9BR0E5cEgsS0FBS2tuSCxVQUFZLEVBR3JCbG5ILEtBQUt5b0gsaUJBQ0x6b0gsS0FBS3lvSCxlQUFlNEIsT0FDcEJycUgsS0FBS3lvSCxlQUFpQixLQUN0QnpvSCxLQUFLK0ssR0FBR3VSLFNBR1p0YyxLQUFLdUksU0FBU3krRyxZQUFhLEVBQzNCaG5ILEtBQUt5bkgsU0FBV3puSCxLQUFLMG5ILFVBQVksRUFFakMsSUFBSTRDLEVBQWF0cUgsS0FBS3NxSCxhQUNsQkMsRUFBWXZxSCxLQUFLdXFILFlBRXJCdnFILEtBQUtzcUgsV0FBV3RxSCxLQUFLdUksU0FBU3FKLEVBQUkwNEcsRUFBYUosRUFBU0ksR0FDeER0cUgsS0FBS3VxSCxVQUFVdnFILEtBQUt1SSxTQUFTeUosRUFBSXU0RyxFQUFZSixFQUFTSSxHQUV0RHZxSCxLQUFLbW9ILFNBQVdub0gsS0FBS2tvSCxLQUNyQmxvSCxLQUFLcW9ILFNBQVdyb0gsS0FBS29vSCxLQUNyQnBvSCxLQUFLa29ILEtBQU9qbEcsRUFDWmpqQixLQUFLb29ILEtBQU9sbEcsRUFFWmxqQixLQUFLd3FILHVCQUNMeHFILEtBQUt5cUgsZ0JBQWdCenFILEtBQUt1SSxTQUFTKytHLGFBRUEsbUJBQXhCdG5ILEtBQUt1SSxTQUFTdWhILE9BQ3JCOXBILEtBQUt1SSxTQUFTdWhILE1BQU03c0gsS0FBSytDLEtBQU1BLEtBQUt1SSxZQU1wRG0rRyxFQUFlaG9ILFVBQVU4ckgscUJBQXVCLFdBQzVDeHFILEtBQUt5bkgsU0FBV3puSCxLQUFLMHFILGFBQWExcUgsS0FBS21vSCxTQUFXbm9ILEtBQUtrb0gsS0FBTWxvSCxLQUFLdUksU0FBUzYrRyxhQUMzRXBuSCxLQUFLMG5ILFVBQVkxbkgsS0FBSzBxSCxhQUFhMXFILEtBQUtxb0gsU0FBV3JvSCxLQUFLb29ILEtBQU1wb0gsS0FBS3VJLFNBQVM2K0csYUFDeEVwbkgsS0FBS3VJLFNBQVM4bkYsU0FDZHJ3RixLQUFLeW5ILFdBQWEsRUFDbEJ6bkgsS0FBSzBuSCxZQUFjLElBSTNCaEIsRUFBZWhvSCxVQUFVaXJILEtBQU8sV0FDeEIzcEgsS0FBS2tvSCxNQUFRbG9ILEtBQUttb0gsV0FBeUMsSUFBN0Jub0gsS0FBS3VJLFNBQVN5K0csYUFDNUNobkgsS0FBS3VJLFNBQVN5K0csWUFBYSxFQUMzQmhuSCxLQUFLd3FILHVCQUNMeHFILEtBQUtrb0gsS0FBT2xvSCxLQUFLbW9ILFNBQVdub0gsS0FBS3NvSCxXQUFZLEVBQzdDdG9ILEtBQUsybkgsVUFJYmpCLEVBQWVob0gsVUFBVXdxSCxXQUFhLFNBQVMvcEgsRUFBUSt2QixHQUNuRCxNQUEwQyxtQkFBL0JsdkIsS0FBS3VJLFNBQVNvaUgsZUFDMkMsSUFBekQzcUgsS0FBS3VJLFNBQVNvaUgsYUFBYTF0SCxLQUFLK0MsS0FBTWIsRUFBUSt2QixJQU03RHczRixFQUFlaG9ILFVBQVUycUgsV0FBYSxTQUFTbHFILEVBQVErdkIsR0FDbkQsTUFBdUMsbUJBQTVCbHZCLEtBQUt1SSxTQUFTMitHLFVBQ2RsbkgsS0FBS3VJLFNBQVMyK0csVUFBVWpxSCxLQUFLK0MsS0FBTWIsRUFBUSt2QixHQUUvQ2x2QixLQUFLdUksU0FBUzIrRyxXQUd6QlIsRUFBZWhvSCxVQUFVNHFILE9BQVMsU0FBU3JtRyxFQUFTQyxHQUNoRGxqQixLQUFLc29ILFdBQVksRUFDakJ0b0gsS0FBS3luSCxTQUFXem5ILEtBQUttb0gsU0FBVyxFQUNoQ25vSCxLQUFLMG5ILFVBQVkxbkgsS0FBS3FvSCxTQUFXLEVBQ2pDcm9ILEtBQUtrb0gsS0FBT2psRyxFQUNaampCLEtBQUtvb0gsS0FBT2xsRyxHQUdoQndqRyxFQUFlaG9ILFVBQVVpcUgsWUFBYyxXQUNuQzNvSCxLQUFLa29ILE1BQU8sRUFDWmxvSCxLQUFLb29ILE1BQU8sRUFDWnBvSCxLQUFLc29ILFdBQVksR0FHckI1QixFQUFlaG9ILFVBQVVrc0gsb0JBQXNCLFNBQVNuRCxFQUFVTixHQUM5RCxPQUEwQyxJQUFuQ3I0RyxLQUFLc3VELE1BQU10dUQsS0FBS0MsSUFBSTA0RyxJQUFtQixFQUN4Q0EsRUFBV04sR0FHckJULEVBQWVob0gsVUFBVWdzSCxhQUFlLFNBQVNqRCxFQUFVeDNHLEdBQ3ZELElBQUk0NkcsRUFBY3BELEVBVWxCLE9BVElBLEVBQVcsRUFDUEEsRUFBV3gzRyxJQUNYNDZHLEVBQWM1NkcsR0FHZHczRyxFQUFZLEVBQUl4M0csSUFDaEI0NkcsRUFBZSxFQUFJNTZHLEdBR3BCNDZHLEdBR1huRSxFQUFlaG9ILFVBQVUrckgsZ0JBQWtCLFNBQVNLLEdBSWhELElBQUl2aUgsRUFBV3ZJLEtBQUt1SSxTQUNoQndDLEVBQUsvSyxLQUFLK0ssR0FFZEEsRUFBR2xCLFVBQVVDLE9BQU92QixFQUFTKytHLFlBQVl0akIsSUFDekNqNUYsRUFBR2xCLFVBQVVDLE9BQU92QixFQUFTKytHLFlBQVlDLE1BQ3pDeDhHLEVBQUdsQixVQUFVQyxPQUFPdkIsRUFBUysrRyxZQUFZbjhFLE1BQ3pDcGdDLEVBQUdsQixVQUFVQyxPQUFPdkIsRUFBUysrRyxZQUFZbDhFLE9BQ3pDcmdDLEVBQUdsQixVQUFVQyxPQUFPdkIsRUFBU2kvRyxrQkFBa0J4akIsSUFDL0NqNUYsRUFBR2xCLFVBQVVDLE9BQU92QixFQUFTaS9HLGtCQUFrQkQsTUFDL0N4OEcsRUFBR2xCLFVBQVVDLE9BQU92QixFQUFTaS9HLGtCQUFrQnI4RSxNQUMvQ3BnQyxFQUFHbEIsVUFBVUMsT0FBT3ZCLEVBQVNpL0csa0JBQWtCcDhFLE9BRTNDcHJDLEtBQUt5bkgsU0FBVyxHQUNoQjE4RyxFQUFHbEIsVUFBVWUsSUFBSWtnSCxFQUFRMS9FLE9BRXpCcHJDLEtBQUt5bkgsU0FBVyxHQUNoQjE4RyxFQUFHbEIsVUFBVWUsSUFBSWtnSCxFQUFRMy9FLE1BRXpCbnJDLEtBQUswbkgsVUFBWSxHQUNqQjM4RyxFQUFHbEIsVUFBVWUsSUFBSWtnSCxFQUFRdkQsTUFFekJ2bkgsS0FBSzBuSCxVQUFZLEdBQ2pCMzhHLEVBQUdsQixVQUFVZSxJQUFJa2dILEVBQVE5bUIsS0FJakMwaUIsRUFBZWhvSCxVQUFVaXBILE1BQVEsV0FDN0IsSUFBSW9ELEVBQVcvcUgsS0FBS2dySCxlQUNoQjF3RixFQUFPdDZCLEtBQ1B1SSxFQUFXdkksS0FBS3VJLFNBRWhCQSxFQUFTcUosR0FBS201RyxFQUFTRSxZQUFjLEdBQ3JDanJILEtBQUtzcUgsV0FBV3RxSCxLQUFLc3FILGFBQWV0cUgsS0FBS3luSCxVQUNyQzM0RyxLQUFLQyxJQUFJL08sS0FBS3luSCxVQUFZLElBQzFCem5ILEtBQUt5bkgsU0FBV2wvRyxFQUFTeStHLFdBQ3JCMXNGLEVBQUtzd0Ysb0JBQW9CNXFILEtBQUt5bkgsU0FBVWwvRyxFQUFTNCtHLFVBQVlubkgsS0FBS3luSCxXQUkxRXpuSCxLQUFLeW5ILFNBQVcsRUFHaEJsL0csRUFBU3lKLEdBQUsrNEcsRUFBU0csYUFBZSxHQUN0Q2xySCxLQUFLdXFILFVBQVV2cUgsS0FBS3VxSCxZQUFjdnFILEtBQUswbkgsV0FDbkM1NEcsS0FBS0MsSUFBSS9PLEtBQUswbkgsV0FBYSxJQUMzQjFuSCxLQUFLMG5ILFVBQVluL0csRUFBU3krRyxXQUN0QjFzRixFQUFLc3dGLG9CQUFvQjVxSCxLQUFLMG5ILFVBQVduL0csRUFBUzQrRyxVQUFZbm5ILEtBQUswbkgsWUFJM0UxbkgsS0FBSzBuSCxVQUFZLEVBR3JCcHRGLEVBQUttd0YsZ0JBQWdCbGlILEVBQVNpL0csbUJBRUEsbUJBQW5Cai9HLEVBQVN1aEgsT0FDaEJ2aEgsRUFBU3VoSCxNQUFNN3NILEtBQUsrQyxLQUFNdUksR0FHMUJ1RyxLQUFLQyxJQUFJL08sS0FBS3luSCxVQUFZLEdBQUszNEcsS0FBS0MsSUFBSS9PLEtBQUswbkgsV0FBYSxFQUNyRDFuSCxLQUFLbXJILFNBQ05uckgsS0FBS21ySCxRQUFTLEVBRWQ1RSxHQUFLLFdBQ0Rqc0YsRUFBSzZ3RixRQUFTLEVBQ2Q3d0YsRUFBS3F0RixZQUticnRGLEVBQUtzdEYsUUFJYmxCLEVBQWVob0gsVUFBVXNzSCxhQUFlLFdBR3BDLE9BQU9ockgsS0FBSytLLElBR2hCMjdHLEVBQWVob0gsVUFBVTRySCxXQUFhLFNBQVNuL0UsR0FDM0MsSUFBSTQvRSxFQUFXL3FILEtBQUtnckgsZUFDcEIsR0FBb0IsaUJBQVQ3L0UsRUFLUCxPQUFPNC9FLEVBQVNULFdBSmhCUyxFQUFTVCxXQUFhbi9FLEVBQ3RCbnJDLEtBQUt1SSxTQUFTK2hILFdBQWFuL0UsR0FPbkN1N0UsRUFBZWhvSCxVQUFVNnJILFVBQVksU0FBU3hFLEdBQzFDLElBQUlnRixFQUFXL3FILEtBQUtnckgsZUFDcEIsR0FBbUIsaUJBQVJqRixFQUtQLE9BQU9nRixFQUFTUixVQUpoQlEsRUFBU1IsVUFBWXhFLEVBQ3JCL2xILEtBQUt1SSxTQUFTZ2lILFVBQVl4RSxHQU9sQ1csRUFBZWhvSCxVQUFVdXBILGlCQUFtQixXQUN4QyxJQUFJbDlHLEVBQUsvSyxLQUFLK0ssR0FDVnhDLEVBQVd2SSxLQUFLdUksU0FFaEJpK0csSUFDQXo3RyxFQUFHbEgsaUJBQWlCLGFBQWMwRSxFQUFTekcsT0FBT2tuSCxZQUFZLEdBQzlEaitHLEVBQUdsSCxpQkFBaUIsV0FBWTBFLEVBQVN6RyxPQUFPNG5ILFVBQVUsR0FDMUQzK0csRUFBR2xILGlCQUFpQixZQUFhMEUsRUFBU3pHLE9BQU95bkgsV0FBVyxJQUdoRXgrRyxFQUFHbEgsaUJBQWlCLFlBQWEwRSxFQUFTekcsT0FBTzJuSCxXQUFXLEdBQzVEMStHLEVBQUdsSCxpQkFBaUIsVUFBVzBFLEVBQVN6RyxPQUFPNG5ILFVBQVUsR0FDekQzK0csRUFBR2xILGlCQUFpQixZQUFhMEUsRUFBU3pHLE9BQU84bkgsV0FBVyxHQUU1RDcrRyxFQUFHbEgsaUJBQWlCLFFBQVMwRSxFQUFTekcsT0FBT2lvSCxZQUFZLEdBQ3pEaC9HLEVBQUdsSCxpQkFBaUIsU0FBVTBFLEVBQVN6RyxPQUFPK25ILFFBQVEsR0FDdEQ5K0csRUFBR2xILGlCQUFpQixjQUFlMEUsRUFBU3pHLE9BQU9tb0gsYUFBYSxHQUNoRWwvRyxFQUFHbEgsaUJBQWlCLFlBQWEwRSxFQUFTekcsT0FBT2tvSCxXQUFXLElBR2hFdEQsRUFBZWhvSCxVQUFVcXBILGlCQUFtQixXQUN4QyxJQUFJaDlHLEVBQUsvSyxLQUFLK0ssR0FDVnhDLEVBQVd2SSxLQUFLdUksU0FFaEJpK0csSUFDQXo3RyxFQUFHL0csb0JBQW9CLGFBQWN1RSxFQUFTekcsT0FBT2tuSCxZQUFZLEdBQ2pFaitHLEVBQUcvRyxvQkFBb0IsV0FBWXVFLEVBQVN6RyxPQUFPNG5ILFVBQVUsR0FDN0QzK0csRUFBRy9HLG9CQUFvQixZQUFhdUUsRUFBU3pHLE9BQU95bkgsV0FBVyxJQUduRXgrRyxFQUFHL0csb0JBQW9CLFlBQWF1RSxFQUFTekcsT0FBTzJuSCxXQUFXLEdBQy9EMStHLEVBQUcvRyxvQkFBb0IsVUFBV3VFLEVBQVN6RyxPQUFPNG5ILFVBQVUsR0FDNUQzK0csRUFBRy9HLG9CQUFvQixZQUFhdUUsRUFBU3pHLE9BQU84bkgsV0FBVyxHQUUvRDcrRyxFQUFHL0csb0JBQW9CLFFBQVN1RSxFQUFTekcsT0FBT2lvSCxZQUFZLEdBQzVEaC9HLEVBQUcvRyxvQkFBb0IsU0FBVXVFLEVBQVN6RyxPQUFPK25ILFFBQVEsR0FDekQ5K0csRUFBRy9HLG9CQUFvQixjQUFldUUsRUFBU3pHLE9BQU9tb0gsYUFBYSxHQUNuRWwvRyxFQUFHL0csb0JBQW9CLFlBQWF1RSxFQUFTekcsT0FBT2tvSCxXQUFXLElBSW5FamhILE9BQU8yOUcsZUFBaUJBLEcsZ0JDN2dCNUI7Ozs7Ozs7R0FXUSxFQUFPLENBQUMsUUFBbUIsMEJBQVAsRUFVcEIsU0FBVTlwSCxHQUVkLElBUUl3dUgsRUFBWUMsRUFSWkMsRUFBVXZpSCxPQUNWd2lILEVBQVloaUgsU0FTWmlpSCxFQUFVLEdBRVY1bEcsRUFBUSxTQUFVOW9CLEVBQUdpTyxHQUVyQixJQUFLak8sRUFBSSxFQUFHQSxFQUFJMHVILEVBQVFucEgsU0FHcEIwSSxHQURBQSxFQUFLeWdILEVBQVExdUgsTUFDTG9nQixXQUFhblMsR0FDQyxvQkFkZCxZQWMyQkEsRUFBRzBnSCxHQUFJLEdBQzFDSCxFQUEyQixvQkFoQnJCLFVBZ0JnQ3ZnSCxFQUFHMmdILEdBQUksR0FDN0NKLEVBQTJCLG9CQWxCbkIsWUFrQmdDdmdILEVBQUc0Z0gsR0FBSSxHQU9uRCxJQURBSCxFQUFVLEdBQUc5cUgsTUFBTXpELEtBQUtzdUgsRUFBVS9oSCx1QkFBdUIsZUFDcEQxTSxFQUFJLEVBQUdBLEVBQUkwdUgsRUFBUW5wSCxTQUVwQixTQUFXMEksRUFBSTZnSCxFQUFhQyxFQUFhQyxFQUFRZixFQUFVZ0IsSUFFdERBLEVBQU9oaEgsRUFBR21TLFdBQWFuUyxHQUFvQixpQkEzQnhDLFlBNkJBZ2hILEVBQUtOLEdBQUssU0FBVTkxRyxHQUVYNUssRUFBRzJrQixhQUFhLGdCQUFrQjY3RixFQUFVUyxpQkFBaUJyMkcsRUFBRXMyRyxNQUFPdDJHLEVBQUV1MkcsU0FBV0gsSUFFcEZELEVBQVMsRUFDVEYsRUFBY2oyRyxFQUFFc04sUUFDaEI0b0csRUFBY2wyRyxFQUFFdU4sUUFFaEJ2TixFQUFFOEMsbUJBRVAsR0FHUDZ5RyxFQUF3QixpQkEzQ3RCLFVBMkNpQ1MsRUFBS0wsR0FBSyxXQUVyQ0ksRUFBUyxHQUNWLEdBRVBSLEVBQXdCLGlCQWpEcEIsWUFpRGlDUyxFQUFLSixHQUFLLFNBQVVoMkcsR0FFN0NtMkcsS0FFQ2YsRUFBV2hnSCxFQUFHZ2dILFVBQVloZ0gsR0FBSXUvRyxZQUMzQmMsR0FBZVEsR0FBZUEsRUFBY2oyRyxFQUFFc04sU0FDbEQ4bkcsRUFBU1IsV0FDTGMsR0FBZVEsR0FBZUEsRUFBY2wyRyxFQUFFdU4sU0FDOUNuWSxJQUFPd2dILEVBQVU3ekcsUUFFaEJxekcsRUFBV1EsRUFBVXZyQixpQkFBaUJzcUIsWUFBY2MsRUFDckRMLEVBQVNSLFdBQWFjLEtBRy9CLEdBcENYLENBcUNHRyxFQUFRMXVILE9BS1UsYUFBekJ5dUgsRUFBVVksV0FFVnZtRyxJQUlBMGxHLEVBQXdCLGlCQUFFLE9BQVExbEcsRUFBTyxHQUc3Q2hwQixFQUFRZ3BCLE1BQVFBLEVBQ2hCN2MsT0FBT3FqSCxnQkFBa0J4bUcsSUE3Rk0sZ0MsZ0JDc1FuQy9vQixFQUFPRCxRQTNRUCxTQUFlaW1FLEdBcURkLFNBQVN3cEQsRUFBWWxhLEdBQ3BCLElBQUltYSxFQUVBQyxFQUNBQyxFQUZBQyxFQUFpQixLQUlyQixTQUFTemQsS0FBUzN2RyxHQUVqQixJQUFLMnZHLEVBQU0wZCxRQUNWLE9BR0QsTUFBTXB5RixFQUFPMDBFLEVBR1BqK0UsRUFBT254QixPQUFPLElBQUkrNUIsTUFDbEJnekYsRUFBSzU3RixHQUFRdTdGLEdBQVl2N0YsR0FDL0J1SixFQUFLZ1AsS0FBT3FqRixFQUNacnlGLEVBQUsraUIsS0FBT2l2RSxFQUNaaHlGLEVBQUt2SixLQUFPQSxFQUNadTdGLEVBQVd2N0YsRUFFWDF4QixFQUFLLEdBQUtndEgsRUFBWU8sT0FBT3Z0SCxFQUFLLElBRVgsaUJBQVpBLEVBQUssSUFFZkEsRUFBSzhDLFFBQVEsTUFJZCxJQUFJaUQsRUFBUSxFQUNaL0YsRUFBSyxHQUFLQSxFQUFLLEdBQUcyYixRQUFRLGdCQUFpQixDQUFDbkwsRUFBT2tjLEtBRWxELEdBQWMsT0FBVmxjLEVBQ0gsTUFBTyxJQUVSekssSUFDQSxNQUFNeW5ILEVBQVlSLEVBQVluWixXQUFXbm5GLEdBQ3pDLEdBQXlCLG1CQUFkOGdHLEVBQTBCLENBQ3BDLE1BQU05bUcsRUFBTTFtQixFQUFLK0YsR0FDakJ5SyxFQUFRZzlHLEVBQVU1dkgsS0FBS3E5QixFQUFNdlUsR0FHN0IxbUIsRUFBSytvQyxPQUFPaGpDLEVBQU8sR0FDbkJBLElBRUQsT0FBT3lLLElBSVJ3OEcsRUFBWXBhLFdBQVdoMUcsS0FBS3E5QixFQUFNajdCLElBRXBCaTdCLEVBQUtwRyxLQUFPbTRGLEVBQVluNEYsS0FDaENoMUIsTUFBTW83QixFQUFNajdCLEdBaUNuQixPQTlCQTJ2RyxFQUFNbUQsVUFBWUEsRUFDbEJuRCxFQUFNa0QsVUFBWW1hLEVBQVluYSxZQUM5QmxELEVBQU1oa0csTUFBUXFoSCxFQUFZUyxZQUFZM2EsR0FDdENuRCxFQUFNcFksT0FBU0EsRUFDZm9ZLEVBQU05bkYsUUFBVW1sRyxFQUFZbmxHLFFBRTVCMXBCLE9BQU9DLGVBQWV1eEcsRUFBTyxVQUFXLENBQ3ZDdHhHLFlBQVksRUFDWnVJLGNBQWMsRUFDZHRJLElBQUssSUFDbUIsT0FBbkI4dUgsRUFDSUEsR0FFSkYsSUFBb0JGLEVBQVk5WixhQUNuQ2dhLEVBQWtCRixFQUFZOVosV0FDOUJpYSxFQUFlSCxFQUFZSyxRQUFRdmEsSUFHN0JxYSxHQUVSdm9ILElBQUtzbUIsSUFDSmtpRyxFQUFpQmxpRyxLQUthLG1CQUFyQjhoRyxFQUFZdHNILE1BQ3RCc3NILEVBQVl0c0gsS0FBS2l2RyxHQUdYQSxFQUdSLFNBQVNwWSxFQUFPdWIsRUFBVzRhLEdBQzFCLE1BQU1DLEVBQVdYLEVBQVlyc0gsS0FBS215RyxnQkFBa0MsSUFBZDRhLEVBQTRCLElBQU1BLEdBQWE1YSxHQUVyRyxPQURBNmEsRUFBUzk0RixJQUFNbDBCLEtBQUtrMEIsSUFDYjg0RixFQXlGUixTQUFTQyxFQUFZdmhHLEdBQ3BCLE9BQU9BLEVBQU83VixXQUNab1AsVUFBVSxFQUFHeUcsRUFBTzdWLFdBQVd4VCxPQUFTLEdBQ3hDMlksUUFBUSxVQUFXLEtBMkJ0QixPQXZRQXF4RyxFQUFZcmQsTUFBUXFkLEVBQ3BCQSxFQUFZOTVHLFFBQVU4NUcsRUFDdEJBLEVBQVlPLE9Bb1BaLFNBQWdCN21HLEdBQ2YsR0FBSUEsYUFBZXZqQixNQUNsQixPQUFPdWpCLEVBQUk4RCxPQUFTOUQsRUFBSXRoQixRQUV6QixPQUFPc2hCLEdBdlBSc21HLEVBQVlhLFFBd0xaLFdBQ0MsTUFBTTNhLEVBQWEsSUFDZjhaLEVBQVlwc0YsTUFBTW53QixJQUFJbTlHLE1BQ3RCWixFQUFZYyxNQUFNcjlHLElBQUltOUcsR0FBYW45RyxJQUFJcWlHLEdBQWEsSUFBTUEsSUFDNUR0eUYsS0FBSyxLQUVQLE9BREF3c0csRUFBWWUsT0FBTyxJQUNaN2EsR0E3TFI4WixFQUFZZSxPQXNKWixTQUFnQjdhLEdBT2YsSUFBSXoxRyxFQU5KdXZILEVBQVkvWixLQUFLQyxHQUNqQjhaLEVBQVk5WixXQUFhQSxFQUV6QjhaLEVBQVlwc0YsTUFBUSxHQUNwQm9zRixFQUFZYyxNQUFRLEdBR3BCLE1BQU1wZ0csR0FBK0IsaUJBQWZ3bEYsRUFBMEJBLEVBQWEsSUFBSXhsRixNQUFNLFVBQ2pFcG9CLEVBQU1vb0IsRUFBTTFxQixPQUVsQixJQUFLdkYsRUFBSSxFQUFHQSxFQUFJNkgsRUFBSzdILElBQ2Zpd0IsRUFBTWp3QixLQU9XLE9BRnRCeTFHLEVBQWF4bEYsRUFBTWp3QixHQUFHa2UsUUFBUSxNQUFPLFFBRXRCLEdBQ2RxeEcsRUFBWWMsTUFBTS9xSCxLQUFLLElBQUlxcEIsT0FBTyxJQUFNOG1GLEVBQVc3eEcsTUFBTSxHQUFLLE1BRTlEMnJILEVBQVlwc0YsTUFBTTc5QixLQUFLLElBQUlxcEIsT0FBTyxJQUFNOG1GLEVBQWEsUUEzS3hEOFosRUFBWUssUUFzTVosU0FBaUJydkgsR0FDaEIsR0FBOEIsTUFBMUJBLEVBQUtBLEVBQUtnRixPQUFTLEdBQ3RCLE9BQU8sRUFHUixJQUFJdkYsRUFDQTZILEVBRUosSUFBSzdILEVBQUksRUFBRzZILEVBQU0wbkgsRUFBWWMsTUFBTTlxSCxPQUFRdkYsRUFBSTZILEVBQUs3SCxJQUNwRCxHQUFJdXZILEVBQVljLE1BQU1yd0gsR0FBR2tLLEtBQUszSixHQUM3QixPQUFPLEVBSVQsSUFBS1AsRUFBSSxFQUFHNkgsRUFBTTBuSCxFQUFZcHNGLE1BQU01OUIsT0FBUXZGLEVBQUk2SCxFQUFLN0gsSUFDcEQsR0FBSXV2SCxFQUFZcHNGLE1BQU1uakMsR0FBR2tLLEtBQUszSixHQUM3QixPQUFPLEVBSVQsT0FBTyxHQXpOUmd2SCxFQUFZamEsU0FBVyxFQUFRLElBQy9CaWEsRUFBWW5sRyxRQTBQWixXQUNDdmtCLFFBQVFDLEtBQUssMElBelBkcEYsT0FBT2lJLEtBQUtvOUQsR0FBS2w1RCxRQUFRdEwsSUFDeEJndUgsRUFBWWh1SCxHQUFPd2tFLEVBQUl4a0UsS0FPeEJndUgsRUFBWXBzRixNQUFRLEdBQ3BCb3NGLEVBQVljLE1BQVEsR0FPcEJkLEVBQVluWixXQUFhLEdBa0J6Qm1aLEVBQVlTLFlBVlosU0FBcUIzYSxHQUNwQixJQUFJbnJGLEVBQU8sRUFFWCxJQUFLLElBQUlscUIsRUFBSSxFQUFHQSxFQUFJcTFHLEVBQVU5dkcsT0FBUXZGLElBQ3JDa3FCLEdBQVNBLEdBQVEsR0FBS0EsRUFBUW1yRixFQUFVenRGLFdBQVc1bkIsR0FDbkRrcUIsR0FBUSxFQUdULE9BQU9xbEcsRUFBWXBaLE9BQU9ua0csS0FBS0MsSUFBSWlZLEdBQVFxbEcsRUFBWXBaLE9BQU81d0csU0E0Ti9EZ3FILEVBQVllLE9BQU9mLEVBQVkxakgsUUFFeEIwakgsSSxjQzFRUixJQUFJeHRILEVBQUksSUFDSjNCLEVBQUkyQixJQUNKZzFDLEVBQVEsR0FBSjMyQyxFQUNKRSxFQUFRLEdBQUp5MkMsRUF1SlIsU0FBU3c1RSxFQUFPVixFQUFJVyxFQUFPL3VILEVBQUdsQixHQUM1QixJQUFJa3dILEVBQVdELEdBQWEsSUFBSi91SCxFQUN4QixPQUFPdVEsS0FBSzRLLE1BQU1pekcsRUFBS3B1SCxHQUFLLElBQU1sQixHQUFRa3dILEVBQVcsSUFBTSxJQXZJN0Qxd0gsRUFBT0QsUUFBVSxTQUFTbXBCLEVBQUs3TCxHQUM3QkEsRUFBVUEsR0FBVyxHQUNyQixJQUFJdFksU0FBY21rQixFQUNsQixHQUFhLFdBQVRua0IsR0FBcUJta0IsRUFBSTFqQixPQUFTLEVBQ3BDLE9Ba0JKLFNBQWVnakIsR0FFYixJQURBQSxFQUFNNWlCLE9BQU80aUIsSUFDTGhqQixPQUFTLElBQ2YsT0FFRixJQUFJd04sRUFBUSxtSUFBbUk4eEIsS0FDN0l0YyxHQUVGLElBQUt4VixFQUNILE9BRUYsSUFBSXRSLEVBQUlpdEIsV0FBVzNiLEVBQU0sSUFFekIsUUFEWUEsRUFBTSxJQUFNLE1BQU1vRyxlQUU1QixJQUFLLFFBQ0wsSUFBSyxPQUNMLElBQUssTUFDTCxJQUFLLEtBQ0wsSUFBSyxJQUNILE9BekRFN1ksU0F5REttQixFQUNULElBQUssUUFDTCxJQUFLLE9BQ0wsSUFBSyxJQUNILE9BOURFbkIsT0E4REttQixFQUNULElBQUssT0FDTCxJQUFLLE1BQ0wsSUFBSyxJQUNILE9BQU9BLEVBQUluQixFQUNiLElBQUssUUFDTCxJQUFLLE9BQ0wsSUFBSyxNQUNMLElBQUssS0FDTCxJQUFLLElBQ0gsT0FBT21CLEVBQUlzMUMsRUFDYixJQUFLLFVBQ0wsSUFBSyxTQUNMLElBQUssT0FDTCxJQUFLLE1BQ0wsSUFBSyxJQUNILE9BQU90MUMsRUFBSXJCLEVBQ2IsSUFBSyxVQUNMLElBQUssU0FDTCxJQUFLLE9BQ0wsSUFBSyxNQUNMLElBQUssSUFDSCxPQUFPcUIsRUFBSU0sRUFDYixJQUFLLGVBQ0wsSUFBSyxjQUNMLElBQUssUUFDTCxJQUFLLE9BQ0wsSUFBSyxLQUNILE9BQU9OLEVBQ1QsUUFDRSxRQXZFS3VLLENBQU1pZCxHQUNSLEdBQWEsV0FBVG5rQixHQUFxQmc0QixTQUFTN1QsR0FDdkMsT0FBTzdMLEVBQVFzekcsS0EwR25CLFNBQWlCYixHQUNmLElBQUlXLEVBQVF4K0csS0FBS0MsSUFBSTQ5RyxHQUNyQixHQUFJVyxHQUFTbHdILEVBQ1gsT0FBT2l3SCxFQUFPVixFQUFJVyxFQUFPbHdILEVBQUcsT0FFOUIsR0FBSWt3SCxHQUFTejVFLEVBQ1gsT0FBT3c1RSxFQUFPVixFQUFJVyxFQUFPejVFLEVBQUcsUUFFOUIsR0FBSXk1RSxHQUFTcHdILEVBQ1gsT0FBT213SCxFQUFPVixFQUFJVyxFQUFPcHdILEVBQUcsVUFFOUIsR0FBSW93SCxHQUFTenVILEVBQ1gsT0FBT3d1SCxFQUFPVixFQUFJVyxFQUFPenVILEVBQUcsVUFFOUIsT0FBTzh0SCxFQUFLLE1BeEhZYyxDQUFRMW5HLEdBaUZsQyxTQUFrQjRtRyxHQUNoQixJQUFJVyxFQUFReCtHLEtBQUtDLElBQUk0OUcsR0FDckIsR0FBSVcsR0FBU2x3SCxFQUNYLE9BQU8wUixLQUFLNEssTUFBTWl6RyxFQUFLdnZILEdBQUssSUFFOUIsR0FBSWt3SCxHQUFTejVFLEVBQ1gsT0FBTy9rQyxLQUFLNEssTUFBTWl6RyxFQUFLOTRFLEdBQUssSUFFOUIsR0FBSXk1RSxHQUFTcHdILEVBQ1gsT0FBTzRSLEtBQUs0SyxNQUFNaXpHLEVBQUt6dkgsR0FBSyxJQUU5QixHQUFJb3dILEdBQVN6dUgsRUFDWCxPQUFPaVEsS0FBSzRLLE1BQU1pekcsRUFBSzl0SCxHQUFLLElBRTlCLE9BQU84dEgsRUFBSyxLQS9GMkJlLENBQVMzbkcsR0FFaEQsTUFBTSxJQUFJdmpCLE1BQ1Isd0RBQ0VxRyxLQUFLTyxVQUFVMmMsTSwrRkNuQ3JCLGNBR0EsUUFHQSxPQUNBLE9BcU91QixFQUFBeFQsUUFoT3ZCLE1BY0UsWUFBYTVGLEVBQW9CZ2hILEVBQTZCN1YsR0FDNUQ5M0csS0FBSzJNLFNBQVdBLEVBQ2hCM00sS0FBS2tkLFVBQVkzVCxTQUFTMkIsZUFBZSxhQUN6Q2xMLEtBQUt5akgsZ0JBQWtCLElBQUlqZ0gsTUFBTSxHQUVqQ3hELEtBQUs2USxNQUFRdEgsU0FBU3FpRyxnQkFBZ0IsNkJBQThCLE9BQ3BFNXJHLEtBQUs2USxNQUFNbkksR0FBSyxZQUNoQjFJLEtBQUs2USxNQUFNckcsYUFBYSxTQUFVekIsT0FBT3E3RyxZQUFZdnVHLFlBQ3JEN1YsS0FBSzZRLE1BQU1yRyxhQUFhLFFBQVMsUUFFakN4SyxLQUFLK1csR0FBS3hOLFNBQVNxaUcsZ0JBQWdCLDZCQUE4QixTQUNqRTVyRyxLQUFLK1csR0FBR3JPLEdBQUssUUFDYjFJLEtBQUsrVyxHQUFHbE4sVUFBVWUsSUFBSSxjQUN0QjVLLEtBQUsrVyxHQUFHdk0sYUFBYSxJQUFLLEtBQzFCeEssS0FBSytXLEdBQUd2TSxhQUFhLElBQUssS0FFMUIsTUFBTXk1QixFQUFTLElBQUlDLFdBQ25CMFAsTUFBTWtrRSxHQUFPbjhGLEtBQUtxRCxJQUNoQixHQUFJQSxFQUFPNGMsR0F1QlQsT0F0QkFxSSxFQUFPcGdDLGlCQUFpQixPQUFRLEtBQzlCN0QsS0FBSytXLEdBQUc2MkcsZUFBZSwrQkFBZ0MsT0FBUTNwRixFQUFPamxCLE9BQU9uSixZQUM3RSxNQUFNcEksRUFBT3pOLEtBQUsrVyxHQUFHZ04sVUFDckIsSUFBSy9qQixLQUFLNlEsTUFBTTZlLGFBQWEsV0FBWSxDQVl2QyxJQUFJLFFBQUVwbkIsSUFBWSxJQUFBMFAsZUFDYjFQLElBQ0hBLEVBQVUsT0FBU21GLEVBQUt3VyxNQUFNcE8sV0FBYSxJQUFNcEksRUFBS3lXLE9BQU9yTyxZQUUvRDdWLEtBQUs2USxNQUFNckcsYUFBYSxVQUFXbEMsTUFHaEMwVyxFQUFPZ2xCLFNBRWZyb0IsS0FBS3FvQixJQUNOQyxFQUFPdzFFLGNBQWN6MUUsS0FJdkJoa0MsS0FBSys2RyxJQUFNeHhHLFNBQVNxaUcsZ0JBQWdCLHdCQUF5QixPQUM3RDVyRyxLQUFLKzZHLElBQUlyeUcsR0FBSyxhQUNkMUksS0FBSys2RyxJQUFJbHhHLFVBQVVlLElBQUksaUJBQWtCLGVBRXpDNUssS0FBSzZRLE1BQU0ya0IsWUFBWXgxQixLQUFLK1csSUFDNUIvVyxLQUFLNlEsTUFBTTJrQixZQUFZeDFCLEtBQUsrNkcsS0FDNUIvNkcsS0FBS2tkLFVBQVVzWSxZQUFZeDFCLEtBQUs2USxPQUVoQzdRLEtBQUtpWSxZQUFjLElBQUksVUFDdkJqWSxLQUFLZ2tILGFBQWUsSUFBSTJKLEVBQU0zdEgsS0FBTSxpQkFBa0IsYUFBY0EsS0FBS2lZLGFBRXpFalksS0FBS281RyxRQUFVdEIsRUFFZnZ1RyxTQUFTMkIsZUFBZSxXQUFXZixNQUFNc0osUUFBVSxPQUdyRCxZQUNFelQsS0FBS3FsSCx1QkFDTHJsSCxLQUFLZ2tILGFBQWFnQyxzQkFPcEIsVUFBV2pMLEdBQ1QvNkcsS0FBSzZRLE1BQU1nOUcsYUFBYTlTLEVBQUsvNkcsS0FBSys2RyxLQUNsQy82RyxLQUFLKzZHLElBQU1BLEVBQ1gvNkcsS0FBSys2RyxJQUFJcnlHLEdBQUssYUFDZDFJLEtBQUsrNkcsSUFBSWx4RyxVQUFVZSxJQUFJLGlCQUFrQixlQUN6QyxNQUFNc1osRUFBUzFMLFNBQVN4WSxLQUFLKzZHLElBQUluckcsYUFBYSxXQUN4Q3FVLEVBQVF6TCxTQUFTeFksS0FBSys2RyxJQUFJbnJHLGFBQWEsVUFFN0M1UCxLQUFLK1csR0FBR3ZNLGFBQWEsU0FBVTBaLEVBQU9yTyxZQUN0QzdWLEtBQUsrVyxHQUFHdk0sYUFBYSxRQUFTeVosRUFBTXBPLFlBRXBDLE1BQU0sUUFBRXZOLElBQVksSUFBQTBQLGVBQ2YxUCxFQUdIdEksS0FBSzZRLE1BQU1yRyxhQUFhLFVBQVdsQyxHQUZuQ3RJLEtBQUs2USxNQUFNckcsYUFBYSxVQUFXLE9BQVN5WixFQUFRLElBQU1DLElBSTVELElBQUExWSxtQkFDQXhMLEtBQUs4dEgsdUJBQ0w5dEgsS0FBS3lqSCxnQkFBZ0I5NUcsUUFBUWd4QixHQUFZQSxLQU8zQyxpQkFBa0JvekYsRUFBZUMsR0FDL0IsTUFBTWpULFFBQVkvNkcsS0FBSzJNLFNBQVNtNEcsV0FBVzlrSCxLQUFLK00scUJBQ2hEL00sS0FBSytrSCxVQUFVaEssR0FPakIsa0JBQW1CanpGLEdBQ2pCOW5CLEtBQUt5akgsZ0JBQWdCcmhILEtBQUswbEIsR0FPNUIscUJBQXNCQSxHQUNwQixNQUFNMWlCLEVBQVFwRixLQUFLeWpILGdCQUFnQjE0QixVQUFXMStFLEdBQ3JDQSxJQUFTeWIsSUFFSCxJQUFYMWlCLEdBQ0ZwRixLQUFLeWpILGdCQUFnQnI3RSxPQUFPaGpDLEVBQU8sR0FPdkMsdUJBQ0VwRixLQUFLZ2tILGFBQWEvckcsWUFBWWcyRyx5QkFDOUIsSUFBQTUzRyw4QkFDQSxJQUFBTSwwQkFNRixpQkFDRSxPQUFPLEVBTVQsb0JBQ0UsT0FBTzNXLEtBQUtvNUcsUUFNZCx1QkFDRTd2RyxTQUFTbU8sS0FBSzdULGlCQUFpQixVQUFZK1QsSUFDekMsT0FBUUEsRUFBSXZaLEtBQ1YsSUFBSyxRQUNId00sRUFBR3FCLE9BQU8sY0FBY25MLEdBQUcsUUFBUyxNQUNwQzhKLEVBQUdxQixPQUFPLGNBQWNqUCxLQUN0QjROLEVBQUdva0IsT0FBT2x1QixHQUFHLFFBQVNmLEtBQUtna0gsYUFBYS9yRyxZQUFZMndGLFVBQVV0cUcsS0FBSzBCLEtBQUtna0gsYUFBYS9yRyxjQUNsRmxYLEdBQUcsT0FBUWYsS0FBS2drSCxhQUFhL3JHLFlBQVlxWCxTQUFTaHhCLEtBQUswQixLQUFLZ2tILGFBQWEvckcsZUFFOUUsTUFDRixJQUFLLElBQ0gxTyxTQUFTMkIsZUFBZSxjQUFjVixhQUFhLGFBQWMsYUFLdkVqQixTQUFTbU8sS0FBSzdULGlCQUFpQixRQUFVK1QsSUFDdkMsT0FBUUEsRUFBSXZaLEtBQ1YsSUFBSyxRQUNId00sRUFBR3FCLE9BQU8sY0FBY25MLEdBQUcsUUFBUyxNQUNBLFdBQWhDZixLQUFLMk0sU0FBU282RixlQUNoQi9tRyxLQUFLMk0sU0FBU3lyRyxVQUFVOFYscUJBRTFCLE1BQ0YsSUFBSyxJQUNIM2tILFNBQVMyQixlQUFlLGNBQWNWLGFBQWEsYUFBYyxjQU12RUssRUFBR3FCLE9BQU8sY0FBY25MLEdBQUcsYUFBYyxLQUNQLElBQTVCOEosRUFBR3FrQixNQUFNazZGLFFBQVEvbUgsU0FDbkJyQyxLQUFLZ2tILGFBQWEvckcsWUFBWTJ3RixZQUM5Qi85RixFQUFHcUIsT0FBTyxjQUFjbkwsR0FBRyxZQUFhZixLQUFLZ2tILGFBQWEvckcsWUFBWXFYLFNBQVNoeEIsS0FBSzBCLEtBQUtna0gsYUFBYS9yRyxjQUN0R3BOLEVBQUdxQixPQUFPLGNBQWNuTCxHQUFHLFdBQVksS0FDckM4SixFQUFHcUIsT0FBTyxjQUFjbkwsR0FBRyxZQUFhLFdBSTlDOEosRUFBR3FCLE9BQU8sY0FBY25MLEdBQUcsUUFBU2YsS0FBS2drSCxhQUFhL3JHLFlBQVlrMkcsV0FBVzd2SCxLQUFLMEIsS0FBS2drSCxhQUFhL3JHLGNBQWMsR0FFbEhsUCxPQUFPbzdHLFNBQVcsS0FDaEIsTUFBTWlLLEVBQVlybEgsT0FBT3E3RyxZQUNuQmxuRyxFQUFZM1QsU0FBUzJCLGVBQWUsYUFDdENrakgsRUFBWXh1SCxPQUFPc2QsRUFBVXROLGFBQWEsWUFDNUNzTixFQUFVMVMsYUFBYSxTQUFVNGpILEVBQVV2NEcsYUFRakQsY0FDRSxPQUFPN1YsS0FBSzJNLFNBQVN0UCxRLHVIQ3hPekIsYUFDQSxPQUVBLE1BQWFneEgsRUFlWCxZQUFhQyxFQUFvQkMsR0FDL0J2dUgsS0FBS3d1SCxLQUFPLEVBQ1p4dUgsS0FBS3l1SCxLQUFPLEVBQ1p6dUgsS0FBS2lrQixNQUFRcXFHLEVBQ2J0dUgsS0FBS2trQixPQUFTcXFHLEVBRWR2dUgsS0FBS3N1SCxXQUFhQSxFQUNsQnR1SCxLQUFLdXVILFlBQWNBLEVBVXJCLElBQUtDLEVBQWNDLEVBQWN4cUcsRUFBZUMsR0FDOUNsa0IsS0FBS3d1SCxLQUFPQSxFQUNaeHVILEtBQUt5dUgsS0FBT0EsRUFDWnp1SCxLQUFLaWtCLE1BQVFBLEVBQ2Jqa0IsS0FBS2trQixPQUFTQSxFQUloQixNQUNFLE9BQU9sa0IsS0FBS3d1SCxLQUFLMzRHLFdBQWEsSUFBTTdWLEtBQUt5dUgsS0FBSzU0RyxXQUFhLElBQ3pEN1YsS0FBS2lrQixNQUFRLElBQU1qa0IsS0FBS2trQixPQUk1QixPQUFRRyxHQUNOLE1BQU1xcUcsRUFBYzF1SCxLQUFLdXVILFlBQWNscUcsRUFDakNzcUcsRUFBYTN1SCxLQUFLc3VILFdBQWFqcUcsRUFFckNya0IsS0FBS2lrQixNQUFRMHFHLEVBQ2IzdUgsS0FBS2trQixPQUFTd3FHLEVBSWhCLFVBQ0UsT0FBTzF1SCxLQUFLc3VILFdBQWF0dUgsS0FBS2lrQixNQVFoQyxVQUFXNEwsRUFBZUMsR0FDeEI5dkIsS0FBS3d1SCxNQUFRMytGLEVBQ2I3dkIsS0FBS3l1SCxNQUFRMytGLEdBbEVqQixZQXNFQSxNQUFhOCtGLEVBUVgsZ0JBQWlCQyxHQUFnQixHQUMvQixNQUFNQyxFQUFRdmxILFNBQVMyQixlQUFlLFNBQ3RDbEwsS0FBS3NJLFFBQVUsSUFBSStsSCxFQUFRNzFHLFNBQVNzMkcsRUFBTWwvRyxhQUFhLFVBQVc0SSxTQUFTczJHLEVBQU1sL0csYUFBYSxZQUUxRmkvRyxJQUNGN3VILEtBQUsrdUgsb0JBQ0wsSUFBQXY0RyxhQUFZLENBQUVoUCxLQUFNLE9BT3hCLE9BQVE2YyxHQUNOcmtCLEtBQUtndkgsYUFDTGh2SCxLQUFLc0ksUUFBUThQLE9BQU9pTSxHQUNwQnJrQixLQUFLK3VILG9CQUVMLElBQUF2NEcsYUFBWSxDQUFFaFAsS0FBTXNILEtBQUtzdUQsTUFBVSxJQUFKLzRDLEtBUWpDLFVBQVd3TCxFQUFlQyxHQUN4Qjl2QixLQUFLZ3ZILGFBQ0xodkgsS0FBS3NJLFFBQVEybUgsVUFBVXAvRixFQUFPQyxHQUM5Qjl2QixLQUFLK3VILG1CQU1QLDZCQUN1Qjd0SCxJQUFqQmxCLEtBQUtzSSxRQUNQdEksS0FBS3FZLGlCQUFnQixHQUVyQnJZLEtBQUsrdUgsbUJBT1QsYUFDRSxRQUFxQjd0SCxJQUFqQmxCLEtBQUtzSSxRQUF1QixDQUM5QixNQUFNd21ILEVBQVF2bEgsU0FBUzJCLGVBQWUsU0FDdENsTCxLQUFLc0ksUUFBVSxJQUFJK2xILEVBQVE3MUcsU0FBU3MyRyxFQUFNbC9HLGFBQWEsVUFBVzRJLFNBQVNzMkcsRUFBTWwvRyxhQUFhLFlBRWhHLE1BQU1zL0csRUFBYTNsSCxTQUFTMkIsZUFBZSxhQUN4QzBFLGFBQWEsV0FDYm1kLE1BQU0sS0FDVC9zQixLQUFLc0ksUUFBUXJFLElBQ1h1VSxTQUFTMDJHLEVBQVcsSUFDcEIxMkcsU0FBUzAyRyxFQUFXLElBQ3BCMTJHLFNBQVMwMkcsRUFBVyxJQUNwQjEyRyxTQUFTMDJHLEVBQVcsS0FPeEIsbUJBQ0UsTUFBTUMsRUFBZ0JudkgsS0FBS3NJLFFBQVEzSyxNQUNuQzRMLFNBQVMyQixlQUFlLGFBQWFWLGFBQWEsVUFBVzJrSCxJQUM3RCxJQUFBMzRHLGFBQVksQ0FBRWxPLFFBQVM2bUgsSUFHekIsWUFDRSxNQUFNdCtHLEVBQVF0SCxTQUFTMkIsZUFBZSxhQUN0Q2xMLEtBQUtvdkgsZ0JBQWtCditHLEVBQU13K0csaUJBQ1AsZUFBbEJ4a0gsRUFBR3FrQixNQUFNdHRCLE1BRVg1QixLQUFLb3ZILGdCQUFnQng5RyxFQUFJL0csRUFBR3FrQixNQUFNazZGLFFBQVEsR0FBR3JoQixRQUM3Qy9uRyxLQUFLb3ZILGdCQUFnQnA5RyxFQUFJbkgsRUFBR3FrQixNQUFNazZGLFFBQVEsR0FBR3BoQixVQUc3Q2hvRyxLQUFLb3ZILGdCQUFnQng5RyxFQUFJL0csRUFBR3FrQixNQUFNdGQsRUFDbEM1UixLQUFLb3ZILGdCQUFnQnA5RyxFQUFJbkgsRUFBR3FrQixNQUFNbGQsR0FHcENoUyxLQUFLc3ZILE9BQVN6K0csRUFBTTBTLGVBQWVDLFVBR3JDLFdBQ0UsTUFBTTNTLEVBQVF0SCxTQUFTMkIsZUFBZSxhQUNoQ3FrSCxFQUFpQjErRyxFQUFNdytHLGlCQUVQLGNBQWxCeGtILEVBQUdxa0IsTUFBTXR0QixNQUNYMnRILEVBQWUzOUcsRUFBSS9HLEVBQUdxa0IsTUFBTWs2RixRQUFRLEdBQUdyaEIsUUFDdkN3bkIsRUFBZXY5RyxFQUFJbkgsRUFBR3FrQixNQUFNazZGLFFBQVEsR0FBR3BoQixTQUNaLFVBQWxCbjlGLEVBQUdxa0IsTUFBTXR0QixPQUEwQyxJQUF0QmlKLEVBQUdxa0IsTUFBTTgyRSxlQUMzQjlrRyxJQUFoQmxCLEtBQUtzdkgsU0FDUHR2SCxLQUFLc3ZILE9BQVN6K0csRUFBTTBTLGVBQWVDLGdCQUVSdGlCLElBQXpCbEIsS0FBS292SCxrQkFDUHB2SCxLQUFLb3ZILGdCQUFrQnYrRyxFQUFNdytHLGtCQUUvQnJ2SCxLQUFLb3ZILGdCQUFnQng5RyxFQUFJL0csRUFBR3FrQixNQUFNdGQsRUFDbEM1UixLQUFLb3ZILGdCQUFnQnA5RyxFQUFJbkgsRUFBR3FrQixNQUFNbGQsRUFDbEN1OUcsRUFBZTM5RyxFQUFJNVIsS0FBS292SCxnQkFBZ0J4OUcsRUFBSS9HLEVBQUdxa0IsTUFBTXNnRyxPQUNyREQsRUFBZXY5RyxFQUFJaFMsS0FBS292SCxnQkFBZ0JwOUcsRUFBSW5ILEVBQUdxa0IsTUFBTXVnRyxPQUNyRDVrSCxFQUFHcWtCLE1BQU16VyxtQkFFVDgyRyxFQUFlMzlHLEVBQUkvRyxFQUFHcWtCLE1BQU10ZCxFQUM1QjI5RyxFQUFldjlHLEVBQUluSCxFQUFHcWtCLE1BQU1sZCxHQUU5QixNQUFNMDlHLEVBQWVILEVBQWVqc0csZ0JBQWdCdGpCLEtBQUtzdkgsUUFDbkRLLEVBQWdCM3ZILEtBQUtvdkgsZ0JBQWdCOXJHLGdCQUFnQnRqQixLQUFLc3ZILFFBQ2hFdHZILEtBQUtpdkgsV0FBV1MsRUFBYTk5RyxFQUFJKzlHLEVBQWMvOUcsR0FBSTg5RyxFQUFhMTlHLEVBQUkyOUcsRUFBYzM5RyxHQUNsRmhTLEtBQUtvdkgsZ0JBQWtCRyxFQUd6QixhQUNFLEdBQXNCLFVBQWxCMWtILEVBQUdxa0IsTUFBTXR0QixLQUFrQixPQUMvQixJQUFLaUosRUFBR3FrQixNQUFNODJFLFNBRVosWUFEQWhtRyxLQUFLc3ZCLFdBR1AsTUFBTXNnRyxFQUFTcm1ILFNBQVMyQixlQUFlLGNBQ3ZDbEwsS0FBS2d2SCxhQUVMLElBQUlhLEVBRE03dkgsS0FBS3NJLFFBQVF3bkgsVUFDUmpsSCxFQUFHcWtCLE1BQU1zZ0csT0FBUyxJQUM3QkssRUFBT3IzRyxTQUFTbzNHLEVBQU9oZ0gsYUFBYSxRQUFVLE1BQUtpZ0gsRUFBTyxLQUMxREEsRUFBT3IzRyxTQUFTbzNHLEVBQU9oZ0gsYUFBYSxRQUFVLE1BQUtpZ0gsRUFBTyxHQUM5RDd2SCxLQUFLb1ksT0FBT3kzRyxHQUdaRCxFQUFPN3hILE9BQWdCLElBQVA4eEgsR0FBWWg2RyxXQUMzQnRNLFNBQVMyQixlQUFlLGNBQW9Dbk4sTUFBUTBFLE9BQU9xTSxLQUFLNEssTUFBYSxJQUFQbTJHLEtBNUkzRixnQkFnSndCLEVBQUF0OUcsUUFBQSxHLCtGQ3pOeEIsY0FDQSxRQUNBLFFBRUEsUUFDQSxRQUNBLFFBRUEsT0FDQSxRQUNBLE9BK0NxQixFQUFBQSxRQTVDckIsTUFJRSxZQUFhNUYsR0FDWDNNLEtBQUsyTSxTQUFXQSxFQUNoQjNNLEtBQUsrdkgsZUFHUCxlQUNFeG1ILFNBQVMyQixlQUFlLG1CQUFtQkssV0FBYTRWLEVBQVNqTixvQkFDakUzSyxTQUFTMkIsZUFBZSxpQkFBaUJLLFdBQWE0VixFQUFTaE4sa0JBQy9ENUssU0FBUzJCLGVBQWUscUJBQXFCSyxVQUFZLEVBQUFtcUcsY0FFekQxMUcsS0FBSzJMLFlBQWMsSUFBSSxVQUFZM0wsS0FBSzJNLFNBQVUsc0JBQ2xEM00sS0FBS296RyxjQUFnQixJQUFJLFVBQWNwekcsS0FBSzJNLFNBQVUsdUJBQ3RELElBQUFxakgsZ0JBQWVod0gsS0FBS296RyxlQUNwQixNQUFNLFVBQUVyckcsSUFBYyxJQUFBaVEsZUFDdEJ6TyxTQUFTMkIsZUFBZW5ELEdBQVdvUyxRQUNuQzgxRyxFQUFPQyx1QkFBdUJsd0gsS0FBSzJNLFNBQVUzTSxLQUFLMkwsYUFDbEQzTCxLQUFLa3VILHFCQUNML2lILEVBQWMrVixhQUFhbGhCLEtBQUsyTSxXQUNoQyxJQUFBd2pILDBCQUNBRixFQUFPRyxxQkFBcUIsSUFDNUIsSUFBQUMseUJBQ0EsSUFBQUMsaUNBQ0F0d0gsS0FBSzJNLFNBQVNHLEtBQUtzMkcsa0JBQWtCcGpILEtBQUtrdUgsbUJBQW1CNXZILEtBQUswQixPQU9wRSxjQUNFLE1BQU0sU0FBRTZILElBQWEsSUFBQW1RLGVBQ3JCLE9BQU9uUSxFQUdULHFCQUNFb29ILEVBQU9NLFlBQVkseUZBQ25CTixFQUFPTyxXQUFXLHVCLCtGQ3JEdEIsY0FDQSxRQUNBLFFBQ0EsUUFDQSxRQUVBLFFBQ0EsUUFFQSxPQUNBLFFBQ0EsUUFDQSxPQTZEMkIsRUFBQWorRyxRQXREM0IsTUFRRSxZQUFhNUYsR0FDWDNNLEtBQUsyTSxTQUFXQSxFQUNoQjNNLEtBQUsrdkgsZUFNUCxnQkFFRSxJQUFBVSxZQUFXendILEtBQUsyTSxVQUNoQnBELFNBQVMyQixlQUFlLG1CQUFtQkssV0FBYTRWLEVBQVNqTixvQkFDakUzSyxTQUFTMkIsZUFBZSxpQkFBaUJLLFdBQWE0VixFQUFTaE4sa0JBQy9ENUssU0FBUzJCLGVBQWUscUJBQXFCSyxVQUFZLEVBQUFtcUcsY0FFekQxMUcsS0FBSzJMLFlBQWMsSUFBSSxVQUFZM0wsS0FBSzJNLFNBQVUsY0FDbEQzTSxLQUFLb3pHLGNBQWdCLElBQUksVUFBY3B6RyxLQUFLMk0sU0FBVSxlQUN0RCxJQUFBcWpILGdCQUFlaHdILEtBQUtvekcsZUFDcEIsTUFBTSxVQUFFcnJHLElBQWMsSUFBQWlRLGVBQ3RCek8sU0FBUzJCLGVBQWVuRCxHQUFXb1MsUUFDbkM4MUcsRUFBT0MsdUJBQXVCbHdILEtBQUsyTSxTQUFVM00sS0FBSzJMLGFBQ2xEM0wsS0FBS2t1SCxxQkFFTC9pSCxFQUFjK1YsYUFBYWxoQixLQUFLMk0sV0FDaEMsSUFBQXdqSCwyQkFDQSxJQUFBRSx5QkFDQSxJQUFBSyxtQkFBa0Ixd0gsS0FBSzJNLFdBQ3ZCLElBQUE2SyxvQkFBbUIsYUFDbkJ4WCxLQUFLMk0sU0FBU0csS0FBS3MyRyxrQkFBa0JwakgsS0FBS2t1SCxtQkFBbUI1dkgsS0FBSzBCLE9BT3BFLGNBQ0UsTUFBTSxTQUFFNkgsSUFBYSxJQUFBbVEsZUFDckIsT0FBT25RLEVBR1QscUJBQ0Vvb0gsRUFBT00sWUFBWSwrQ0FDbkJOLEVBQU9PLFdBQVcsaUIsK0ZDaEV0QixhQUNBLFFBS01HLEVBQWMsSUFBSXozRixJQUN0QixDQUFDLENBQUMsR0FBSSxXQUFZLENBQUMsSUFBSyxPQUFRLENBQUMsSUFBSyxVQUFXLENBQUMsS0FBTSxhQUFjLENBQUMsS0FBTSxZQUFhLENBQUMsS0FBTSxhQUFjLENBQUMsSUFBSyxhQUFjLENBQUMsS0FBTSxhQUN4SSxDQUFDLEtBQU0sV0FBWSxDQUFDLEtBQU0sWUFBYSxDQUFDLE1BQU8scUJBQXNCLENBQUMsTUFBTyxxQkFBc0IsQ0FBQyxNQUFPLG1CQUMzRyxDQUFDLE1BQU8saUJBQWtCLENBQUMsTUFBTyxtQkFBb0IsQ0FBQyxPQUFRLHVCQUF3QixDQUFDLE9BQVEseUJBZ0JwRyxTQUFTMDNGLElBQ1AsTUFBTUMsRUFBY3RuSCxTQUFTMkIsZUFBZSxnQkFDdEM5QyxFQUFjbUIsU0FBUzJCLGVBQWUsZ0JBRzVDLElBQUFzTCxhQUFZLENBQUVwTyxZQUFhQSxFQUFZaVIsVUFFbkNqUixFQUFZaVIsUUFDZHczRyxFQUFZcm1ILGFBQWEsUUFBUyxJQUlsQ3FtSCxFQUFZcm1ILGFBQWEsUUFBUyxrQkFFcEMsSUFBQXNtSCx1QkFjRixTQUFTQyxJQXhDYXhuSCxTQUFTMkIsZUFBZSxnQkFDaENLLFVBQ1YseU1BSUZoQyxTQUFTMkIsZUFBZSxnQkFBZ0JWLGFBQWEsUUFBUyxpQkEwQmhFLFdBQ0UsTUFBTSxZQUFFcEMsSUFBZ0IsSUFBQTRQLGVBQ3hCek8sU0FBU3FFLGNBQWdDLGdCQUFnQnlMLFFBQVVqUixFQVFuRSs2RyxHQUNBeU4sSUFDQXJuSCxTQUFTMkIsZUFBZSxlQUFlckgsaUJBQWlCLFFBQVMrc0gsR0EwVDVDLEVBQUFyK0csUUFwVHZCLE1BUUUsWUFBYTVGLEdBQ1gzTSxLQUFLMk0sU0FBV0EsRUFFaEIsTUFBTTBvQixFQUFzQjlyQixTQUFTMkIsZUFBZSw0QkFDOUM4bEgsRUFBUXpuSCxTQUFTZ0ssY0FBYyxTQUNyQ3k5RyxFQUFNbm5ILFVBQVVlLElBQUkscUJBQXNCLGtCQUMxQ29tSCxFQUFNNTVHLFlBQWMsT0FDcEIsTUFBTW1VLEVBQVFoaUIsU0FBU2dLLGNBQWMsU0FDckNnWSxFQUFNN2lCLEdBQUssY0FDWDZpQixFQUFNMWhCLFVBQVVlLElBQUksWUFDcEIyZ0IsRUFBTTNwQixLQUFPLFdBQ2IycEIsRUFBTWxTLFNBQVUsRUFDaEIyM0csRUFBTXg3RixZQUFZakssR0FDbEI4SixFQUFvQnh6QixRQUFRbXZILEdBRTVCaHhILEtBQUsyTSxTQUFTRyxLQUFLczJHLGtCQUFrQnBqSCxLQUFLaXhILG1CQUFtQjN5SCxLQUFLMEIsT0FDbEUrd0gsSUFDQS93SCxLQUFLaXhILHFCQU9QLGdCQUNFLElBQ0UxbkgsU0FBU0MsdUJBQXVCLGVBQWUsR0FDNUNFLGlCQUFpQiwrQ0FDakJDLFFBQVE0OEIsSUFDUEEsRUFBSzFpQyxpQkFBaUIsWUFBY3FyQixJQUM3QnFYLEVBQUsxOEIsVUFBVUUsU0FBUyxXQUFVL0osS0FBS2t4SCxpQkFBa0IsR0FDOURseEgsS0FBS214SCxXQUFXamlHLE9BSXRCM2xCLFNBQVNDLHVCQUF1QixlQUFlLEdBQzVDRSxpQkFBaUIsd0NBQ2pCQyxRQUFRNDhCLElBQ1BBLEVBQUsxaUMsaUJBQWlCLGFBQWMsS0FDbEM3RCxLQUFLa3hILGlCQUFrQixNQUc3QixNQUFPdjdHLEtBTVgsZ0JBQ0VwTSxTQUFTRyxpQkFBaUIsK0NBQStDQyxRQUFRNDhCLElBQy9FQSxFQUFLdmlDLG9CQUFvQixZQUFhaEUsS0FBS214SCxXQUFXN3lILEtBQUswQixTQUU3RHVKLFNBQVNHLGlCQUFpQiw0Q0FBNENDLFFBQVE0OEIsSUFDNUVBLEVBQUt2aUMsb0JBQW9CLGFBQWMsS0FDckNoRSxLQUFLa3hILGlCQUFrQixNQVE3QixxQkFDRWx4SCxLQUFLb3hILGdCQUNMcHhILEtBQUs2bEcsZ0JBT1AsaUJBQWtCMzJFLEdBR2hCLE1BQU14bUIsRUFBTXdtQixFQUFNazhCLGNBQThCMWlELEdBQ2hELEdBQVcsS0FBUEEsRUFLRixPQUpBbEYsTUFBTTZHLEtBQUtkLFNBQVMyQixlQUFlLGdCQUFnQnNHLFVBQVU3SCxRQUFRK2UsSUFDbkVBLEVBQU01ZSxnQkFFUm5ILFFBQVF1eEIsSUFBSSxVQUlkLE1BQU01cUIsRUFBVUMsU0FBUzJCLGVBQWV4QyxHQUVsQzJvSCxFQUFlL25ILEVBQVFzRyxhQUFhLFNBQVNDLE1BRG5DLHlDQUNrRCxHQUNsRSxJQUNJakQsRUFEQThLLEVBQU8sR0FJWCxPQUFRMjVHLEdBQ04sSUFBSyxRQUFTLENBRVosTUFBTTk5RixFQUFNanFCLEVBQVFJLGlCQUFpQixPQUNyQyxHQUFtQixJQUFmNnBCLEVBQUlseEIsT0FBYyxDQUNwQixNQUFNMlcsUUFBeUJoWixLQUFLMk0sU0FBU0UsZUFBZTBtQixFQUFJLEdBQUc3cUIsR0FBSTFJLEtBQUsyTSxTQUFTRyxLQUFLQyxxQkFDMUYsR0FBbUIsTUFBZmlNLEVBQUtxRixPQUFnQyxNQUFmckYsRUFBS3FGLE1BQWUsQ0FDNUMsSUFBSWl6RyxRQUFnQnR4SCxLQUFLdXhILFdBQVdoK0YsR0FFcEMrOUYsRUFBVUEsRUFBUXIyRyxPQUFPM0QsY0FDekJJLEVBQU8sbUNBQ2lCNDVHLEVBQ3hCLE9BSUosSUFBSXZ2RyxRQUFnQi9oQixLQUFLd3pCLFdBQVdELEdBQ3BDLEdBQW1CLElBQWZBLEVBQUlseEIsT0FBYyxDQUNwQixNQUFNMlcsUUFBeUJoWixLQUFLMk0sU0FBU0UsZUFBZTBtQixFQUFJLEdBQUc3cUIsR0FBSTFJLEtBQUsyTSxTQUFTRyxLQUFLQyxxQkFDMUYsR0FBaUIsTUFBZGlNLEVBQUsrN0YsS0FBYyxDQUNwQixJQUFJdWMsUUFBZ0J0eEgsS0FBS3V4SCxXQUFXaCtGLEdBRXBDKzlGLEVBQVVBLEVBQVFyMkcsT0FBTzNELGNBQ3pCSSxFQUFPLCtCQUNpQjQ1RyxFQUN4QixNQUVHLEdBQWlCLE1BQWR0NEcsRUFBSys3RixLQUFhLENBQ3hCLElBQUl1YyxRQUFnQnR4SCxLQUFLdXhILFdBQVdoK0YsR0FFcEMrOUYsRUFBVUEsRUFBUXIyRyxPQUFPM0QsY0FDekJJLEVBQU8sd0NBQ2lCNDVHLEVBQ3hCLE9BR0osR0FBZ0IsV0FBWnZ2RyxFQUFzQixRQUNPL2hCLEtBQUsyTSxTQUFTRSxlQUFlMG1CLEVBQUksR0FBRzdxQixHQUFJMUksS0FBSzJNLFNBQVNHLEtBQUtDLHNCQUNqRkUsVUFDUDhVLEVBQVUsWUFHZCxJQUFJdXZHLFFBQWdCdHhILEtBQUt1eEgsV0FBV2grRixHQUVwQys5RixFQUFVQSxFQUFRcjJHLE9BQU8zRCxjQUN6QkksRUFBTyxnQkFBeUJ4VyxJQUFaNmdCLEVBQXdCLFdBQWFBLEdBQWxELGtCQUNpQnV2RyxFQUN4QixNQUVGLElBQUssU0FDSDFrSCxRQUFtQjVNLEtBQUsyTSxTQUFTRSxlQUFlbkUsRUFBSTFJLEtBQUsyTSxTQUFTRyxLQUFLQyxxQkFDdkUySyxHQUFRLFVBQWE5SyxFQUFtQixNQUFFMEssY0FBZ0IxSyxFQUFnQixJQUMxRSxNQUVGLElBQUssUUFBUyxDQUNaQSxRQUFtQjVNLEtBQUsyTSxTQUFTRSxlQUFlbkUsRUFBSTFJLEtBQUsyTSxTQUFTRyxLQUFLQyxxQkFDdkUsSUFBSW5MLEVBQU8sR0FDZ0MsS0FBdENnTCxFQUFtQixNQUFFMEssY0FDeEIxVixFQUFPLE9BRXNDLEtBQXRDZ0wsRUFBbUIsTUFBRTBLLGdCQUM1QjFWLEVBQU8sV0FFVDhWLEdBQVEsZUFBaUI5VixFQUN6QixNQUVGLElBQUssT0FBUSxDQUNYLE1BQU1vWCxRQUFhaFosS0FBSzJNLFNBQVNFLGVBQWVuRSxFQUFJMUksS0FBSzJNLFNBQVNHLEtBQUtDLHFCQUl2RSxHQUFJaU0sRUFBSyxtQkFBNkI5WCxJQUFiOFgsRUFBS3c0RyxJQUFtQixDQVUvQzk1RyxHQUFRLHdCQU5PLEVBQUMrNUcsRUFBa0JELEtBQ1AsVUFBYkMsRUFBdUIsSUFBTSxLQUMxQmh2SCxPQUFPcU0sS0FBS3N1RCxNQUFNeDlELE9BQU80eEgsR0FBTyxJQUlmemxHLENBQU8vUyxFQUFLLGFBQWNBLEVBQUt3NEcsS0FBTyxZQUd4RTk1RyxHQUFRLGdDQUdWQSxHQUFRLFVBQVlzQixFQUFLd0osTUFBakIsYUFBNkN4SixFQUFLaTRGLEtBRTFELE1BRUYsSUFBSyxVQUNIcmtHLFFBQW1CNU0sS0FBSzJNLFNBQVNFLGVBQWVuRSxFQUFJMUksS0FBSzJNLFNBQVNHLEtBQUtDLHFCQUN2RTJLLEdBQVEsaUJBQW1COUssRUFBaUIsS0FDNUMsTUFFRixJQUFLLFFBQ0gsR0FBSTVNLEtBQUtreEgsZ0JBQWlCLE9BQzFCdGtILFFBQW1CNU0sS0FBSzJNLFNBQVNFLGVBQWVuRSxFQUFJMUksS0FBSzJNLFNBQVNHLEtBQUtDLHFCQUNuRUgsRUFBaUIsT0FBRzhLLEdBQVEsV0FBYTlLLEVBQWlCLEtBQUVvTyxRQUFRLFVBQVcsS0FDbkYsTUFFRixRQUNFdEQsR0FBUSxVQUlaQSxFQUFPLGlCQUFpQjI1RyxFQUFhNytFLE9BQU8sR0FBR2w3QixjQUFnQis1RyxFQUFhM3dILE1BQU0sT0FBT2dYLElBQ3pGMVgsS0FBSzB4SCxpQkFBaUJoNkcsR0FReEIsaUJBQWtCNmIsR0FDaEIsSUFBSSs5RixFQUFVLEdBQ2QsSUFBSyxNQUFNNWtILEtBQU02bUIsRUFBSyxDQUNwQixNQUFNM21CLFFBQStCNU0sS0FBSzJNLFNBQVNFLGVBQWVILEVBQUdoRSxHQUFJMUksS0FBSzJNLFNBQVNHLEtBQUtDLHFCQUM1RnVrSCxHQUFXMWtILEVBQWtCLE1BQUlBLEVBQWdCLElBQUksSUFFdkQsT0FBTzBrSCxFQU9ULGlCQUFrQi85RixHQUNoQixJQUFJeFIsRUFBVSxHQUNWZ0csRUFBdUIsS0FDM0IsSUFBSyxNQUFNcmIsS0FBTTZtQixFQUFLLENBQ3BCLE1BQU0zbUIsUUFBK0I1TSxLQUFLMk0sU0FBU0UsZUFBZUgsRUFBR2hFLEdBQUkxSSxLQUFLMk0sU0FBU0csS0FBS0MscUJBQzNFLE9BQWJnYixJQUNFQSxFQUFjLElBQUluYixFQUFnQixJQUNwQ21WLEdBQVcsSUFDRmdHLEVBQWMsSUFBSW5iLEVBQWdCLEtBR3ZDNU0sS0FBSzJ4SCxlQUFlNXBHLEVBQWdCLE9BQUsvbkIsS0FBSzJ4SCxlQUFlL2tILEVBQWtCLE9BRm5GbVYsR0FBVyxJQUlBL2hCLEtBQUsyeEgsZUFBZTVwRyxFQUFnQixPQUFLL25CLEtBQUsyeEgsZUFBZS9rSCxFQUFrQixPQUN4Rm1WLEdBQVcsSUFFWEEsR0FBVyxLQUlqQmdHLEVBQVduYixFQUtiLFlBSGlDMUwsSUFBN0J5dkgsRUFBWWh6SCxJQUFJb2tCLElBQ2xCcGYsUUFBUUMsS0FBSyxvQkFBc0JtZixHQUU5QjR1RyxFQUFZaHpILElBQUlva0IsR0FPekIsaUJBQWtCckssR0FDRG5PLFNBQVNDLHVCQUF1QixvQkFBb0IsR0FBSTRULFVBQVkxRixFQUU5RW5PLFNBQVMyQixlQUFlLGVBQW9DbU8sVUFDOUQ5UCxTQUFTQyx1QkFBdUIseUJBQXlCLEdBQW1CVyxNQUFNc0osUUFBVSxJQVNqRyxlQUFnQm0rRyxHQUNkLE9BQVFBLEdBQ04sSUFBSyxJQUNILE9BQU8sRUFDVCxJQUFLLElBQ0gsT0FBTyxFQUNULElBQUssSUFDSCxPQUFPLEVBQ1QsSUFBSyxJQUNILE9BQU8sRUFDVCxJQUFLLElBQ0gsT0FBTyxFQUNULElBQUssSUFDSCxPQUFPLEVBQ1QsSUFBSyxJQUNILE9BQU8sRUFDVCxRQUNFanZILFFBQVF1eEIsSUFBSSx1QkFTbEIsa0JBQW1CbjJCLEdBRWpCLElBQUssTUFBT2d1SCxFQUFNeGhHLEtBQU1vbUcsRUFBWXAxRyxVQUNsQyxHQUFJZ1AsSUFBTXhzQixFQUNSLE9BQU9ndUgsSywrRkNsWGYsYUFFQSxPQUNBLFFBRUEsT0F1T3FCLEVBQUF4NUcsUUFsT3JCLE1BUUUsWUFBYTVGLEdBQ1gzTSxLQUFLMk0sU0FBV0EsRUFDaEIzTSxLQUFLNnhILGtCQUFtQixFQUd4QixNQUFNeDhGLEVBQXNCOXJCLFNBQVMyQixlQUFlLDRCQUM5QzRtSCxFQUFZdm9ILFNBQVNnSyxjQUFjLFNBQ25DdytHLEVBQVl4b0gsU0FBU2dLLGNBQWMsU0FDbkN5K0csRUFBYXpvSCxTQUFTZ0ssY0FBYyxTQUNwQzArRyxFQUFhMW9ILFNBQVNnSyxjQUFjLFNBQzFDeStHLEVBQVdub0gsVUFBVWUsSUFBSSxZQUN6QnFuSCxFQUFXcG9ILFVBQVVlLElBQUksWUFDekJrbkgsRUFBVWpvSCxVQUFVZSxJQUFJLHFCQUFzQixrQkFDOUNtbkgsRUFBVWxvSCxVQUFVZSxJQUFJLHFCQUFzQixrQkFDOUNrbkgsRUFBVTE2RyxZQUFjLE9BQ3hCMjZHLEVBQVUzNkcsWUFBYyxTQUN4QjQ2RyxFQUFXdHBILEdBQUssY0FDaEJzcEgsRUFBV3B3SCxLQUFPLFdBQ2xCcXdILEVBQVd2cEgsR0FBSyxjQUNoQnVwSCxFQUFXcndILEtBQU8sV0FDbEJvd0gsRUFBVzM0RyxTQUFVLEVBQ3JCNDRHLEVBQVc1NEcsU0FBVSxFQUNyQnk0RyxFQUFVdDhGLFlBQVl3OEYsR0FDdEJELEVBQVV2OEYsWUFBWXk4RixHQUN0QjU4RixFQUFvQnh6QixRQUFRa3dILEdBQzVCMThGLEVBQW9CeHpCLFFBQVFpd0gsR0FFNUI5eEgsS0FBS21qSCxlQUNMbmpILEtBQUtreUgsc0JBQ0xseUgsS0FBSzJNLFNBQVNHLEtBQUtzMkcsa0JBQWtCcGpILEtBQUtteUgseUJBQXlCN3pILEtBQUswQixPQUN4RUEsS0FBSzJNLFNBQVNHLEtBQUtzMkcsa0JBQWtCcGpILEtBQUt3NEcscUJBQXFCbDZHLEtBQUswQixPQU10RSxzQkFDRUEsS0FBS215SCwyQkFDTG55SCxLQUFLdzRHLHVCQUVManZHLFNBQVMyQixlQUFlLGVBQWVySCxpQkFBaUIsUUFBUyxLQUMvRDdELEtBQUtteUgsNEJBQ0wsSUFBQXJCLHlCQUdGdm5ILFNBQVMyQixlQUFlLGVBQWVySCxpQkFBaUIsUUFBUyxLQUMvRDdELEtBQUt3NEcsd0JBQ0wsSUFBQXNZLHlCQUlKLGVBQ0UsTUFBTSxZQUFFM29ILEVBQVcsWUFBRUQsSUFBZ0IsSUFBQThQLGVBQ3JDek8sU0FBU3FFLGNBQWdDLGdCQUFnQnlMLFFBQVVsUixFQUNuRW9CLFNBQVNxRSxjQUFnQyxnQkFBZ0J5TCxRQUFVblIsRUFNckUsdUIsTUFFRSxNQUFNa1IsRUFBZ0I3UCxTQUFTMkIsZUFBZSxlQUs5QyxJQUZBLElBQUFzTCxhQUFZLENBQUV0TyxZQUFha1IsRUFBY0MsVUFFckNELEVBQWNDLFNBUWhCLEdBUEE5UCxTQUFTRyxpQkFBaUIsZ0JBQWdCQyxRQUFRa2EsSUFDaERBLEVBQUtoYSxVQUFVZSxJQUFJLHVCQUNuQmlaLEVBQUtoYSxVQUFVQyxPQUFPLGlCQUV4QlAsU0FBU0csaUJBQWlCLHNDQUN2QkMsUUFBU2thLElBQXdCQSxFQUFLMVosTUFBTUMsS0FBTyxRQUVsQixXQUFoQ3BLLEtBQUsyTSxTQUFTbzZGLG9CQUF5RDdsRyxJQUEzQmxCLEtBQUsyTSxTQUFTdXJHLFNBQXdCLENBQ3BGbDRHLEtBQUsyTSxTQUFTdXJHLFNBQVNrYSx5QkFDdkJweUgsS0FBSzJNLFNBQVN1ckcsU0FBU21hLHVCQUN2QixNQUFNLFdBQUUxcUgsSUFBZSxJQUFBcVEsZUFDdkJ6TyxTQUFTcUUsY0FBZ0MsaUJBQWlCN1AsTUFBUTBFLE9BQU9rRixHQUN6RTRCLFNBQVNxRSxjQUFnQyxpQkFBaUI3UCxNQUFRMEUsT0FBT2tGLFFBR3hFLEVBQ3FDLFFBQXBDLEVBQUE0QixTQUFTMkIsZUFBZSxvQkFBWSxlQUFFckIsVUFBVUUsU0FBUyxpQkFDM0QsSUFBQU4sWUFDQUYsU0FBUzJCLGVBQWUsYUFBYXJCLFVBQVVDLE9BQU8sYUFDdERQLFNBQVMyQixlQUFlLGlCQUFpQnJCLFVBQVVlLElBQUksY0FDdkQsSUFBQTRMLGFBQVksQ0FBRXhPLGNBQWdCLG1CQUdoQ3VCLFNBQVNHLGlCQUFpQix3QkFBd0JDLFFBQVFrYSxJQUN4REEsRUFBS2hhLFVBQVVlLElBQUksZUFDbkJpWixFQUFLaGEsVUFBVUMsT0FBTyx5QkFHeEJQLFNBQVNHLGlCQUFpQiw4QkFBOEJDLFFBQVNrYSxJQUMvREEsRUFBSzFaLE1BQU1DLEtBQU8sU0FHcEIsSUFDRWIsU0FBUzJCLGVBQWUsYUFBYWYsTUFBTXNKLFFBQVUsT0FFdkQsTUFBT2tDLElBQ1AsSUFDRXBNLFNBQVMyQixlQUFlLHNCQUFzQmYsTUFBTXNKLFFBQVUsT0FFaEUsTUFBT2tDLE1BR1QsSUFBQW5LLG1CQU9GLDJCQUVFLE1BQU1yRCxFQUFjb0IsU0FBUzJCLGVBQWUsZUFLNUMsSUFGQSxJQUFBc0wsYUFBWSxDQUFFck8sWUFBYUEsRUFBWWtSLFVBRW5DbFIsRUFBWWtSLFFBQVMsQ0FDdkIsTUFBTTR3RixFQUFVMWdHLFNBQVMyQixlQUFlLFlBQ3hDKytGLEVBQVE5L0YsTUFBTXNKLFFBQVUsR0FDeEJ3MkYsRUFBUTErRixVQUNOLHdKQUVrQ3ZMLEtBQUtzeUgscUNBRTNCcm9CLEVBQVF2Z0csaUJBQWlCLFFBQ2pDQyxRQUFRNEMsSUFDWixNQUFNZ21CLEVBQVdocEIsU0FBUzJCLGVBQWVxQixFQUFLMUMsVUFBVSxJQUNsRDZELEVBQU02a0IsRUFBUzNrQixjQUFjLFFBQzdCNk4sRUFBTy9OLEVBQUlFLGNBQWMsUUFDekJpVyxFQUFPblcsRUFBSUUsY0FBYyxRQUNELElBQTFCNk4sRUFBSzVSLFVBQVV4SCxRQUNqQm9aLEVBQUs1UixVQUFVZSxJQUFJLFFBR3JCMkIsRUFBSzFJLGlCQUFpQixZQUFhLEtBQzdCMHVCLEVBQVMxb0IsVUFBVUUsU0FBUywwQkFHaEN3b0IsRUFBUzFvQixVQUFVZSxJQUFJLFlBQ3ZCMm5CLEVBQVM3b0IsaUJBQWlCLFVBQVVDLFFBQVFjLElBQzFDQSxFQUFNWixVQUFVZSxJQUFJLGNBRVQsT0FBVGlaLElBQ0ZBLEVBQUsxWixNQUFNQyxLQUFPLFdBTXRCbUMsRUFBSzFJLGlCQUFpQixhQUFjLEtBQzlCMHVCLEVBQVMxb0IsVUFBVUUsU0FBUywwQkFHaEN3b0IsRUFBUzFvQixVQUFVQyxPQUFPLFlBQzFCeW9CLEVBQVM3b0IsaUJBQWlCLFVBQVVDLFFBQVFjLElBQzFDQSxFQUFNWixVQUFVQyxPQUFPLGNBRVosT0FBVCtaLElBQzBCLGlCQUF4QjBPLEVBQVNwb0IsTUFBTUMsS0FDakJ5WixFQUFLMVosTUFBTUMsS0FBT21vQixFQUFTM2lCLGFBQWEsUUFFeENpVSxFQUFLMVosTUFBTUMsS0FBTyxhQVFVLFdBQWhDcEssS0FBSzJNLFNBQVNvNkYsb0JBQXlEN2xHLElBQTNCbEIsS0FBSzJNLFNBQVN1ckcsVUFDNURsNEcsS0FBSzJNLFNBQVN1ckcsU0FBU3FhLG9CQU96QmhwSCxTQUFTMkIsZUFBZSxZQUFZZixNQUFNc0osUUFBVSxPQU94RCxhQUNFLElBQUkrK0csRUFBUyxHQXFCYixPQW5Ca0JqcEgsU0FBU0csaUJBQWlCLDBCQUNsQ0MsUUFBUTRvQixJQUNoQixHQUF1QyxPQUFuQ0EsRUFBUzNrQixjQUFjLFFBQWtCLENBQzNDLE1BQU1GLEVBQU02a0IsRUFBUzNrQixjQUFjLFFBQ25DNGtILEdBQVUsZ0JBQWdCamdHLEVBQVM3cEIsMkJBQ0osS0FBM0JnRixFQUFJMEosWUFBWTZELE9BQ2xCdTNHLEdBQVUsWUFFVmh2SCxNQUFNNkcsS0FBS3FELEVBQUk4RCxTQUFTLEdBQUdBLFNBQVMsR0FBR0EsVUFBVTdILFFBQVE4UixJQUN2RCsyRyxHQUErQixLQUFyQi8yRyxFQUFLckUsWUFBcUJxRSxFQUFLckUsWUFBYyxjQUczRG83RyxHQUFVLGNBR1R4eUgsS0FBSzZ4SCxtQkFDUnAvRyxFQUFhbUIsa0JBQWtCLHlDQUMvQjVULEtBQUs2eEgsa0JBQW1CLEdBRW5CVyxFQUFPeDNHLFFBcEJJLFVBb0JlLFEsOEVDeE9yQyxhQUNBLFFBRUEsUUFLQSxRQUVBLFFBQ0EsT0FDQSxRQWFBLFNBQVN5M0csSUFDUCxJQUFLbHBILFNBQVMyQixlQUFlLGFBQWFyQixVQUFVRSxTQUFTLGFBQWMsRUFDekUsSUFBQU4sYUFDQSxJQUFBK00sYUFBWSxDQUFFeE8sY0FBZSxjQUM3QixJQUNFdUIsU0FBUzJCLGVBQWUsWUFBWUssVUFBWSxHQUNoRGhDLFNBQVMyQixlQUFlLGFBQWFLLFVBQVksR0FDakRoQyxTQUFTMkIsZUFBZSxZQUFZUCxjQUFjZCxVQUFVZSxJQUFJLFVBQ2hFckIsU0FDRzJCLGVBQWUsYUFDZlAsY0FBY2QsVUFBVWUsSUFBSSxVQUMvQixNQUFPK0ssSUFDVHBNLFNBQVMyQixlQUFlLGFBQWFyQixVQUFVZSxJQUFJLGFBQ25ELElBQ0VyQixTQUFTMkIsZUFBZSxXQUFXckIsVUFBVUMsT0FBTyxhQUNwRFAsU0FBUzJCLGVBQWUsY0FBY3JCLFVBQVVDLE9BQU8sYUFDdkRQLFNBQVMyQixlQUFlLGNBQWNyQixVQUFVQyxPQUFPLGFBQ3ZEUCxTQUFTMkIsZUFBZSxpQkFBaUJyQixVQUFVQyxPQUFPLGFBQzFEUCxTQUNHMkIsZUFBZSxxQkFDZnJCLFVBQVVDLE9BQU8sYUFDcEIsTUFBTzZMLElBQ1QsSUFHSSx3QkFEQXBNLFNBQVNxRSxjQUFjLHVCQUF1QmxGLEtBRzlDLElBQUE2TyxzQkFBcUIsWUFFdkIsTUFBTzVCLEtBRVgzVixLQUFLMHlILG1CQU1QLGdCQVFFLFlBQVkvbEgsR0FDVjNNLEtBQUsyTSxTQUFXQSxFQUNoQjNNLEtBQUt1eUgsZUFNUCxlQUNFLE1BQU1JLEVBQVFwcEgsU0FBUzJCLGVBQWUsWUFBWXhCLGlCQUFpQixRQUM3RHluRyxFQUFRbnhHLEtBQUsyTSxTQUFTd2tHLE1BQzVCd2hCLEVBQU1ocEgsUUFBUzRDLElBQ2IsU0FBU3FtSCxJQUNQcm1ILEVBQUsxQyxVQUFVZSxJQUFJLG9CQUNuQnVtRyxFQUFNdDhFLG1CQUFtQixFQUFBcGEsZ0JBQWdCeUIsV0FDekNpMUYsRUFBTXI4RSxrQkFHUnZvQixFQUFLdkksb0JBQW9CLFFBQVM0dUgsR0FDbENybUgsRUFBSzFJLGlCQUFpQixRQUFTK3VILEtBR2pDcnBILFNBQVMxRixpQkFBaUIsVUFBWXFyQixJQUNwQyxHQUFJQSxFQUFNODJFLFVBQTBCLE1BQWQ5MkUsRUFBTTd3QixJQUFhLENBQ3ZDLE1BQU04bkcsRUFBa0I1OEYsU0FBU3FFLGNBQWMsZ0JBQzNDdTRGLEdBQ0ZBLEVBQWdCQyxlQUFlLENBQUVDLFNBQVUsY0FZbkQseUJBQ0UsUUFBZ0NubEcsSUFBNUJsQixLQUFLMk0sU0FBU3lyRyxVQUF5QixDQUN6QyxNQUFNN1IsRUFBWWg5RixTQUFTMkIsZUFBZSxhQUMxQyxHQUFJcTdGLEVBRUYsWUFEQUEsRUFBVXA4RixNQUFNc0osUUFBVSxJQUk1QixNQUFNby9HLEVBQVF0cEgsU0FBUzJCLGVBQWUsaUNBQ2hDNG5ILEVBQVN2cEgsU0FBU2dLLGNBQWMsVUFDdEN1L0csRUFBT2pwSCxVQUFVZSxJQUFJLGlCQUFrQixVQUN2Q2tvSCxFQUFPcHFILEdBQUssWUFDWm9xSCxFQUFPMTdHLFlBQWMsT0FDckJ5N0csRUFBTXI5RixZQUFZczlGLEdBQ2xCQSxFQUFPanZILGlCQUFpQixRQUFTNHVILEVBQWtCbjBILEtBQUswQixPQUN4RHVKLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFVBQVkrVCxJQUN6QixNQUFaQSxFQUFJdlosS0FDcUQsS0FBdkRrTCxTQUFTMkIsZUFBZSxhQUFhZixNQUFNc0osU0FDN0NnL0csRUFBa0JuMEgsS0FBSzBCLEtBQXZCeXlILEtBSU56eUgsS0FBSzJNLFNBQVNHLEtBQUtzMkcsa0JBQWtCcGpILEtBQUsweUgsaUJBQWlCcDBILEtBQUswQixXQUMzRCxDQUNMLE1BQU02eUgsRUFBUXRwSCxTQUFTMkIsZUFBZSxRQUFRb0IsUUFBUSxZQUNoRDFOLEVBQUkySyxTQUFTZ0ssY0FBYyxLQUNqQzNVLEVBQUVpTCxVQUFVZSxJQUFJLFdBQ2hCLE1BQU1rb0gsRUFBU3ZwSCxTQUFTZ0ssY0FBYyxVQUN0Q3UvRyxFQUFPanBILFVBQVVlLElBQUksaUJBQWtCLFVBQ3ZDa29ILEVBQU9wcUgsR0FBSyxZQUNab3FILEVBQU8xN0csWUFBYyxPQUNyQnhZLEVBQUU0MkIsWUFBWXM5RixHQUNkRCxFQUFNcjlGLFlBQVk1MkIsR0FDbEJrMEgsRUFBT2pwSCxVQUFVZSxJQUFJLGFBQ3JCa29ILEVBQU8zb0gsTUFBTXNKLFFBQVUsT0FDdkJ6VCxLQUFLMHlILG1CQUNMMXlILEtBQUsyTSxTQUFTRyxLQUFLczJHLGtCQUFrQnBqSCxLQUFLMHlILGlCQUFpQnAwSCxLQUFLMEIsUUFPcEUsbUJBQ011SixTQUFTMkIsZUFBZSxhQUFhckIsVUFBVUUsU0FBUyxnQkFDMUQsSUFBQU4saUJBQ2dDdkksSUFBNUJsQixLQUFLMk0sU0FBU3lyRyxZQUVoQnA0RyxLQUFLMkwsWUFBYyxJQUFJLFVBQ3JCM0wsS0FBSzJNLFNBQ0wseUJBRUYsSUFBQXVqSCx3QkFBdUJsd0gsS0FBSzJNLFNBQVUzTSxLQUFLMkwsYUFDQyxlQUF4QzNMLEtBQUsyTSxTQUFTRyxLQUFLL0csWUFBWTFJLE9BQ2pDLElBQUFrekgsYUFBWSxrQ0FDWixJQUFBQyxZQUFXLGlCQUVYLElBQUFELGFBQ0UsNERBRUYsSUFBQUMsWUFBVyx1QkFTbkIsdUJBQ0UsTUFBTTczRyxFQUFlcFAsU0FBUzJCLGVBQWUsc0JBQzdDLEdBQUl5TixFQUVGLFlBREFBLEVBQWF4TyxNQUFNc0osUUFBVSxJQUkvQixNQUFNcy9HLEVBQWdCeHBILFNBQVMyQixlQUFlLDBCQUN4QzhuSCxFQUF3QnpwSCxTQUFTZ0ssY0FBYyxPQUNyRHkvRyxFQUFzQm5wSCxVQUFVZSxJQUM5QixzQ0FDQSxpQkFFRm9vSCxFQUFzQjdvSCxNQUFNaTNDLE9BQVMsVUFDckM0eEUsRUFBc0J0cUgsR0FBSyxxQkFDM0JzcUgsRUFBc0J6bkgsVUFBWSxtd0JBa0JsQ3duSCxFQUFjdjlGLFlBQVl3OUYsUUFFTTl4SCxJQUE1QmxCLEtBQUsyTSxTQUFTeXJHLFlBQ2hCNGEsRUFBc0I3b0gsTUFBTXNKLFFBQVUsU0FHeEMsSUFBQXcvRyw0QiwyREM1TUcsU0FBU0MsRUFBS2o5QyxHQUVqQixNQUFNbHJFLEVBQUt4QixTQUFTZ0ssY0FBYzBpRSxHQUM1QjUyRSxFQUFPbUUsTUFBTTlFLFVBQVVnQyxNQUFNekQsS0FBSzBELFVBQVcsR0FFbkQsS0FBT3RCLEVBQUtnRCxRQUNaLENBRUk4d0gsRUFBd0Jwb0gsRUFEWjFMLEVBQUs4RixTQUlyQixPQUFPNEYsRUFHWCxTQUFTb29ILEVBQXlCcG9ILEVBQUloSCxHQUVsQyxHQUFXLE1BQVBBLEVBR0osR0FBbUIsaUJBQVJBLEdBQW1DLG1CQUFSQSxFQUdsQ2dILEVBQUd5cUIsWUFBWWpzQixTQUFTNjFGLGVBQWVyN0YsU0FFdEMsR0FBSUEsYUFBZWdGLE9BQU82b0IsS0FFM0I3bUIsRUFBR3lxQixZQUFZenhCLFFBRWQsR0FBSUEsYUFBZVAsTUFDeEIsQ0FDSSxNQUFNNHZILEVBQWFydkgsRUFBSTFCLE9BQ3ZCLElBQUssSUFBSXZGLEVBQUksRUFBR0EsRUFBSXMySCxFQUFZdDJILElBQzVCcTJILEVBQXdCcG9ILEVBQUloSCxFQUFJakgsU0FJcEN1MkgsRUFBaUJ0b0gsRUFBSWhILEdBUzdCLFNBQVNzdkgsRUFBa0J0b0gsRUFBSTZCLEdBRTNCLElBQUssTUFBTXVzQixLQUFRdnNCLEVBRVZBLEVBQVdqTyxlQUFldzZCLEtBR2xCLFVBQVRBLEVBRUFtNkYsRUFBU3ZvSCxFQUFJNkIsRUFBV3pDLE9BSXhCWSxFQUFHUCxhQUFhMnVCLEVBQU12c0IsRUFBV3VzQixLQUs3QyxTQUFTbTZGLEVBQVV2b0gsRUFBSVosR0FFbkIsR0FBS0EsRUFHTCxHQUFxQixpQkFBVkEsRUFNWCxJQUFLLE1BQU1vcEgsS0FBV3BwSCxFQUViQSxFQUFNeEwsZUFBZTQwSCxLQUcxQnhvSCxFQUFHWixNQUFNb3BILEdBQVdwcEgsRUFBTW9wSCxTQVQxQnhvSCxFQUFHWixNQUFNcXBILFFBQVVycEgsRUNsRnBCLFNBQVNzcEgsRUFBb0NodkgsR0FFaER6RSxLQUFLM0MsS0FBTyxxQ0FDWjJDLEtBQUt5RSxRQUFVQSxFQUNmekUsS0FBSzZwQixPQUFRLElBQUtybkIsT0FBU3FuQixNQUt4QixTQUFTNnBHLEVBQTRCanZILEdBRXhDekUsS0FBSzNDLEtBQU8sNkJBQ1oyQyxLQUFLeUUsUUFBVUEsRUFDZnpFLEtBQUs2cEIsT0FBUSxJQUFLcm5CLE9BQVNxbkIsTUFLeEIsU0FBUzhwRyxFQUFnQ2x2SCxHQUU1Q3pFLEtBQUszQyxLQUFPLGlDQUNaMkMsS0FBS3lFLFFBQVVBLEVBQ2Z6RSxLQUFLNnBCLE9BQVEsSUFBS3JuQixPQUFTcW5CLE1BZi9CNHBHLEVBQW1DLzBILFVBQVksSUFBSThELE1BU25Ea3hILEVBQTJCaDFILFVBQVksSUFBSThELE1BUzNDbXhILEVBQStCajFILFVBQVksSUFBSThELE1DbkJoQyxNQUpGLENBQ1Q4aEgsT0MwTGdCLElBbkxwQixNQUVJLGNBRUl0a0gsS0FBSzR6SCxPQUFTLEdBZ0JsQixRQUFRQyxFQUFPeDBILEVBQU02aUMsR0FFakIsR0FBSWxpQyxLQUFLNHpILE9BQU9DLEdBQ2hCLENBQ0ksTUFBTUMsRUFBWTl6SCxLQUFLNHpILE9BQU9DLEdBRTlCLFFBQWdDLElBQXJCQyxFQUFVbHBFLE9BQ3JCLENBQ0ksTUFBTW1wRSxFQUFrQkQsRUFBVWxwRSxPQUM1Qm9wRSxFQUFjRCxFQUFnQjF4SCxPQUVwQyxJQUFLLElBQUl2RixFQUFFLEVBQUdBLEVBQUlrM0gsRUFBYWwzSCxJQUUzQmkzSCxFQUFnQmozSCxHQUFHb0MsTUFBTWdqQyxHQUFTLEtBQU03aUMsR0FBUSxJQUl4RCxHQUFJNmlDLFFBQXdDLElBQXhCQSxFQUFNK3hGLGNBQzFCLENBRUksTUFBTUMsRUFBYWh5RixFQUFNK3hGLGdCQUV6QixHQUFJajBILEtBQUs0ekgsT0FBT0MsR0FBT0ssR0FDdkIsQ0FDSSxNQUFNQyxFQUFvQm4wSCxLQUFLNHpILE9BQU9DLEdBQU9LLEdBQ3ZDRSxFQUFjRCxFQUFrQjl4SCxPQUV0QyxJQUFLLElBQUlrTSxFQUFFLEVBQUdBLEVBQUk2bEgsRUFBYTdsSCxJQUUzQjRsSCxFQUFrQjVsSCxHQUFHclAsTUFBTWdqQyxFQUFPN2lDLEdBQVEsT0FtQjlELFVBQVV3MEgsRUFBT2w1RixFQUFVdTVGLEdBMEJ2QixPQXhCS2wwSCxLQUFLNHpILE9BQU9DLEtBRWI3ekgsS0FBSzR6SCxPQUFPQyxHQUFTLElBR0MsaUJBQWZLLEdBRUZsMEgsS0FBSzR6SCxPQUFPQyxHQUFPSyxLQUVwQmwwSCxLQUFLNHpILE9BQU9DLEdBQU9LLEdBQWMsSUFHckNsMEgsS0FBSzR6SCxPQUFPQyxHQUFPSyxHQUFZOXhILEtBQUt1NEIsS0FJL0IzNkIsS0FBSzR6SCxPQUFPQyxHQUFPanBFLFNBRXBCNXFELEtBQUs0ekgsT0FBT0MsR0FBT2pwRSxPQUFTLElBR2hDNXFELEtBQUs0ekgsT0FBT0MsR0FBT2pwRSxPQUFPeG9ELEtBQUt1NEIsSUFHNUJ1NUYsRUFBYSxDQUFDTCxFQUFPbDVGLEVBQVV1NUYsR0FBYyxDQUFDTCxFQUFPbDVGLEdBY2hFLFlBQVl1a0UsRUFBUW0xQixHQUVoQixNQUFNcjJILEVBQUlraEcsRUFBTyxHQUVqQixHQUFJbC9GLEtBQUs0ekgsT0FBTzUxSCxHQUNoQixDQUNJLElBQUlzMkgsRUFDSixNQUFNSixFQUErQixJQUFsQmgxQixFQUFPNzhGLE9BQWU2OEYsRUFBTyxHQUFLLFNBSXJELEdBRkFvMUIsRUFBYXQwSCxLQUFLNHpILE9BQU81MUgsR0FBR2sySCxJQUV2QkksRUFFRCxPQUFPLEVBR1gsR0FBSUQsRUFHQSxjQURPcjBILEtBQUs0ekgsT0FBTzUxSCxHQUFHazJILEdBQ2ZJLEVBQVdqeUgsT0FBUyxFQUcvQixJQUFJdkYsRUFBSXczSCxFQUFXanlILE9BRW5CLEtBQU92RixLQUVILEdBQUl3M0gsRUFBV3gzSCxLQUFPb2lHLEVBQU8sR0FHekIsT0FEQWwvRixLQUFLNHpILE9BQU81MUgsR0FBR2sySCxHQUFZOXJGLE9BQU90ckMsRUFBRyxJQUM5QixFQUtuQixPQUFPLEVBWVgsZUFBZW8zSCxHQUVYLEdBQUlBLEVBQ0osQ0FDSSxNQUFNSyxFQUFTLzJILE9BQU9pSSxLQUFLekYsS0FBSzR6SCxRQUNoQyxJQUNJQyxFQURBLzJILEVBQUl5M0gsRUFBT2x5SCxPQUdmLEtBQU92RixLQUVIKzJILEVBQVFVLEVBQU96M0gsUUFFK0IsSUFBbkNrRCxLQUFLNHpILE9BQU9DLEdBQU9LLFdBRW5CbDBILEtBQUs0ekgsT0FBT0MsR0FBT0ssUUFNbENsMEgsS0FBSzR6SCxPQUFTLE1DeExYLE9BQ1hZLGNBU0osU0FBdUJub0gsRUFBTXN1QixHQUV6QnR1QixFQUFLeEksaUJBQWlCLFlBQVksU0FBVXFyQixHQUVuQ0EsRUFBTSs0RSxTQUVQdHRFLEVBQVN6TCxFQUFPdWxHLEVBQWtCdmxHLEVBQU1rOEIsY0FBZWw4QixPQU0vRCxNQUFNd2xHLEVBQVVDLEVBaEJTLEtBa0J6QnRvSCxFQUFLeEksaUJBQWlCLGVBQWUsU0FBVXFyQixHQUUzQ0EsRUFBTXpXLGlCQUVGeVcsRUFBTSs0RSxVQUVGeXNCLEVBQVFFLGVBRVJGLEVBQVE5dUcsUUFDUitVLEVBQVN6TCxFQUFPdWxHLEVBQWtCdmxHLEVBQU1rOEIsY0FBZWw4QixLQUl2RHdsRyxFQUFRRyxlQW5DcEJDLFFBeUNKLFNBQWlCem9ILEVBQU1zdUIsR0FFbkIsSUFBSW82RixFQUFnQixFQUVwQjFvSCxFQUFLeEksaUJBQWlCLGNBQWMsU0FBVXFyQixHQUcxQ0EsRUFBTXpXLGlCQUVxQyxJQUF2Q3lXLEVBQU1pNkYsY0FBY0MsUUFBUS9tSCxTQUU1QjB5SCxFQUFnQkMsRUFDWjlsRyxFQUFNaTZGLGNBQWNDLFFBQVEsR0FBR25tRyxRQUMvQmlNLEVBQU1pNkYsY0FBY0MsUUFBUSxHQUFHbG1HLFFBQy9CZ00sRUFBTWk2RixjQUFjQyxRQUFRLEdBQUdubUcsUUFDL0JpTSxFQUFNaTZGLGNBQWNDLFFBQVEsR0FBR2xtRyxhQUszQzdXLEVBQUt4SSxpQkFBaUIsYUFBYSxTQUFTcXJCLEdBS3hDLEdBRkFBLEVBQU16VyxpQkFFcUMsSUFBdkN5VyxFQUFNaTZGLGNBQWNDLFFBQVEvbUgsT0FDaEMsQ0FDSSxNQUFNK21ILEVBQVVsNkYsRUFBTWk2RixjQUFjQyxRQUU5QjZMLEVBQWVELEVBQ2pCNUwsRUFBUSxHQUFHbm1HLFFBQ1htbUcsRUFBUSxHQUFHbG1HLFFBQ1hrbUcsRUFBUSxHQUFHbm1HLFFBQ1htbUcsRUFBUSxHQUFHbG1HLFNBR1RneUcsRUFBWUQsRUFBZUYsRUFFakMsR0FBSWptSCxLQUFLQyxJQUFJbW1ILEdBQWEsRUFDMUIsQ0FDSSxNQUFNQyxFQUFjLENBQ2hCbEosT0FBUTdDLEVBQVEsR0FBR25tRyxRQUFVbW1HLEVBQVEsR0FBR25tRyxTQUFXLEVBQ25EaXBHLE9BQVE5QyxFQUFRLEdBQUdsbUcsUUFBVWttRyxFQUFRLEdBQUdsbUcsU0FBVyxHQUd2RHlYLEVBQVN6TCxFQUFPdWxHLEVBQWtCdmxHLEVBQU1rOEIsY0FBZStwRSxHQUFjSixFQUFlRSxTQXJGaEdHLFlBMkZKLFNBQXFCL29ILEVBQU1zdUIsR0FFdkIsTUFBTSs1RixFQUFVQyxFQXhGTyxLQXlGdkIsSUFBSVUsRUFBVyxLQUVmaHBILEVBQUt4SSxpQkFBaUIsV0FBYXFyQixJQUsvQixHQUZBQSxFQUFNelcsaUJBRUZpOEcsRUFBUUUsY0FDWixDQUNJRixFQUFROXVHLFFBR1IsTUFBTTB2RyxFQUFZLENBQ2RySixNQUFPLzhGLEVBQU1pNkYsY0FBY29NLGVBQWUsR0FBR3R5RyxRQUM3Q2lwRyxNQUFPaDlGLEVBQU1pNkYsY0FBY29NLGVBQWUsR0FBR3J5RyxTQUk3Qjh4RyxFQUFTSyxFQUFTcEosTUFBT29KLEVBQVNuSixNQUFPb0osRUFBVXJKLE1BQU9xSixFQUFVcEosT0E1RzlELElBZ0h0QnZ4RixFQUFTekwsRUFBT3VsRyxFQUFrQnZsRyxFQUFNazhCLGNBQWVrcUUsSUFFM0RELEVBQVcsVUFJWEEsRUFBVyxDQUNQcEosTUFBTy84RixFQUFNaTZGLGNBQWNvTSxlQUFlLEdBQUd0eUcsUUFDN0NpcEcsTUFBT2g5RixFQUFNaTZGLGNBQWNvTSxlQUFlLEdBQUdyeUcsU0FHakR3eEcsRUFBUUcsY0FPcEIsU0FBU0csRUFBU1EsRUFBSUMsRUFBSUMsRUFBSUMsR0FFMUIsT0FBTzdtSCxLQUFLczdHLE1BQU1zTCxFQUFLRixJQUFPRSxFQUFLRixJQUFPRyxFQUFLRixJQUFPRSxFQUFLRixJQUsvRCxTQUFTZCxFQUF5QmlCLEdBRTlCLElBQUlDLEdBQVksRUFDWkMsRUFBWSxLQUVoQixNQUFPLENBQ0gsVUFFSUQsR0FBWSxFQUNaRSxJQUNBRCxFQUFZanZILFlBQVcsV0FFbkJndkgsR0FBWSxFQUNaQyxFQUFZLE9BQ2JGLElBRVBoQixZQUFXLElBRUFpQixFQUVYLFFBRUlBLEdBQVksRUFDWkUsTUFJUixTQUFTQSxJQUVhLE9BQWRELElBRUEvdUgsYUFBYSt1SCxHQUNiQSxFQUFZLE9BS3hCLFNBQVNyQixFQUFrQnBvSCxFQUFNMnBILEdBRTdCLE1BQU1DLEVBQVM1cEgsRUFBSzZwSCx3QkFFcEIsTUFBTyxDQUNIL3FGLEtBQU02cUYsRUFBVy9KLE1BQVFnSyxFQUFPOXFGLEtBQ2hDNDZFLElBQUtpUSxFQUFXOUosTUFBUStKLEVBQU9sUSxLLFlDdEx4QixNQUFNLEVBRWpCLFlBQWFwQixFQUFXd1IsR0FFcEJuMkgsS0FBSzZrSCxLQUFPRixFQUVaM2tILEtBQUt3bEgsWUFBYzJRLEVBRW5CbjJILEtBQUtvMkgsY0FBZ0JwMkgsS0FBS3dsSCxZQUFZeHRHLGNBQWNxK0csYUFDcERyMkgsS0FBS3MySCxlQUFpQixLQUN0QnQySCxLQUFLdTJILFdBQWEsRUFHdEIsUUFFZ0MsT0FBeEJ2MkgsS0FBS3MySCxpQkFFTHQySCxLQUFLdzJILFNBQVd4MkgsS0FBS3kySCw2QkFFckJ6MkgsS0FBS3MySCxlQUFpQnBELEVBQUksTUFBTyxDQUFFd0QsTUFBTywyQkFDdEN4RCxFQUFJLE1BQU8sQ0FBRXdELE1BQU8sbUJBQXFCMTJILEtBQUt3MkgsV0FHbER4MkgsS0FBSzIySCxnQkFBa0J6RCxFQUFJLE1BQU8sQ0FBRXdELE1BQU8sNEJBQ3ZDeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLG9CQUFzQjEySCxLQUFLd2xILFlBQVlqOUcsU0FBU3d0RyxTQUFTdVEsTUFBTXRtSCxLQUFLNmtILE1BQU05bkgsS0FJdEdpRCxLQUFLNDJILFVBQ0w1MkgsS0FBS28ySCxjQUFjNWdHLFlBQVl4MUIsS0FBS3MySCxnQkFDcEN0MkgsS0FBS28ySCxjQUFjNWdHLFlBQVl4MUIsS0FBSzIySCxpQkFHeEMsNkJBR0ksTUFBTXB1SCxFQUFXdkksS0FBS3dsSCxZQUFZeHRHLGNBQzVCNitHLEVBQWlCNzJILEtBQUt3bEgsWUFBWXNSLG9CQUNsQ25TLEVBQVkza0gsS0FBSzZrSCxLQUV2QixPQUFPN2tILEtBQUt3bEgsWUFBWXVSLGVBQWVqbkgsSUFBTXdrQyxJQUl6QyxNQUFNdytFLEVBQVN4K0UsRUFBTzBpRixjQUFjQyxXQUFVLEdBa0I5QyxPQWJBbkUsRUFBT2p2SCxpQkFBaUIsUUFBVXFyQixJQUU5Qm9sQixFQUFPNGlGLFlBQVlqNkgsS0FBS3EzQyxFQUFRcGxCLEVBQU8zbUIsRUFBVXN1SCxFQUFnQmxTLEtBQ2xFLEdBRUhtTyxFQUFPanZILGlCQUFpQixXQUFhcXJCLElBR2pDQSxFQUFNelcsaUJBRU42N0IsRUFBTzRpRixZQUFZajZILEtBQUtxM0MsRUFBUXBsQixFQUFPM21CLEVBQVVzdUgsRUFBZ0JsUyxLQUNsRSxHQUVJbU8sSUFLZixVQUVJOXlILEtBQUtvMkgsY0FBY3IyQixZQUFZLy9GLEtBQUtzMkgsZ0JBQ3BDdDJILEtBQUtvMkgsY0FBY3IyQixZQUFZLy9GLEtBQUsyMkgsaUJBR3hDLFVBRUksTUFBTS92RixFQUFNNW1DLEtBQUt3bEgsWUFBWUMsY0FBY3psSCxLQUFLNmtILEtBQU0sQ0FDbERhLGdCQUFnQixFQUNoQkMscUJBQXFCLElBSXpCLElBQUlDLEVBQWE3OEcsT0FBTzg4RyxpQkFBaUI3bEgsS0FBS28ySCxjQUFlLE1BQU10USxpQkFBaUIsZUFFcEY5bEgsS0FBS3MySCxlQUFlbnNILE1BQU00N0csSUFBU24vRSxFQUFJbS9FLElBQVAsS0FDaEMvbEgsS0FBS3MySCxlQUFlbnNILE1BQU1naEMsS0FBVXZFLEVBQUl1RSxLQUFPM3lCLFNBQVNvdEcsR0FBdkIsS0FFakM1bEgsS0FBSzIySCxnQkFBZ0J4c0gsTUFBTTQ3RyxJQUFTbi9FLEVBQUltL0UsSUFBUCxLQUNqQy9sSCxLQUFLMjJILGdCQUFnQnhzSCxNQUFNZ2hDLEtBQVV2RSxFQUFJd0UsTUFBUTV5QixTQUFTb3RHLEdBQWM1bEgsS0FBS3UySCxXQUFhLEVBQXhELE1DeEYzQixNQUFNLEVBRWpCLFlBQWFKLEdBTVQsR0FKQW4ySCxLQUFLd2xILFlBQWMyUSxFQUNuQm4ySCxLQUFLbTNILGFBQWVoQixFQUFXaUIsbUJBQy9CcDNILEtBQUtxM0gsVUFBWSxHQUVicjNILEtBQUt3bEgsWUFBWXVSLGVBQWUxMEgsT0FDcEMsQ0FDSSxNQUFNaTFILEVBQVduQixFQUFXbitHLGNBQWNzL0csU0FFMUMsSUFBSyxJQUFJeDZILEVBQUksRUFBR0EsRUFBSXc2SCxFQUFVeDZILElBQzlCLENBQ0ksTUFBTXk2SCxFQUFVLElBQUksRUFBaUJ6NkgsRUFBR3E1SCxHQUN4Q24ySCxLQUFLcTNILFVBQVVqMUgsS0FBS20xSCxHQUNwQnYzSCxLQUFLd2xILFlBQVlnUyxlQUFlRCxHQU1oQyxJQUFJRSxFQUFhbHVILFNBQVNnSyxjQUFjLFFBQ3hDa2tILEVBQVdsc0gsVUFBWTRxSCxFQUFXNXRILFNBQVN3dEcsU0FBU3VRLE1BQU14cEgsR0FBR0MsRUFDN0QwNkgsRUFBVzV0SCxVQUFVZSxJQUFJLG9CQUN6QjZzSCxFQUFXanRILGFBQWEsUUFBUywwQkFDakNqQixTQUFTbU8sS0FBSzhkLFlBQVlpaUcsR0FDMUIsSUFBSWxCLEVBQWFrQixFQUFXQyxZQUM1Qm51SCxTQUFTbU8sS0FBS3FvRixZQUFZMDNCLEdBRTFCRixFQUFRaEIsV0FBYUEsSUFNakMsY0FBZXJuRyxFQUFPeW9HLEdBRWxCLE1BQU1wdkgsRUFBV3ZJLEtBQUt3bEgsWUFBWXh0RyxjQUM1QjQvRyxFQUFlMW9HLEVBQU0rNEUsUUFBVTEvRixFQUFTc3ZILFVBQVksRUFBSXR2SCxFQUFTc3ZILFVBQVksRUFFN0U1eUgsRUFBV2pGLEtBQUt3bEgsWUFBWXNTLGdDQUFnQ0gsR0FDbEUzM0gsS0FBS3dsSCxZQUFZaCtHLEtBQUtvd0gsRUFBYzN5SCxHQUd4QyxRQUFTaXFCLEVBQU95b0csRUFBUTVDLEVBQWVnRCxHQUduQyxNQUFNQyxFQUFjaDRILEtBQUt3bEgsWUFBWTRSLG1CQUMvQjd1SCxFQUFXdkksS0FBS3dsSCxZQUFZeHRHLGNBRWxDLElBQUk0L0csRUFBZTlvSCxLQUFLb2xCLElBQUlwbEIsS0FBS2l6RyxJQUFJLEVBQUd4NUcsRUFBU3N2SCxXQUFhRSxHQUFlaEQsRUFBZ0JqbUgsS0FBS29sQixJQUFJLEtBQU9wbEIsS0FBS29sQixJQUFJLEdBSXRILEdBSEEwakcsRUFBZTlvSCxLQUFLbUIsSUFBSTFILEVBQVMwdkgsYUFBY0wsR0FDL0NBLEVBQWU5b0gsS0FBS2tCLElBQUl6SCxFQUFTMnZILGFBQWNOLEdBRTNDQSxJQUFpQnJ2SCxFQUFTc3ZILFVBRTFCLE9BR0osTUFBTTV5SCxFQUFXakYsS0FBS3dsSCxZQUFZc1MsZ0NBQWdDSCxHQUc1RFEsRUFEU240SCxLQUFLd2xILFlBQVk0UyxtQkFDSkMsOEJBQThCcHpILEVBQVNxekgsV0FBWU4sRUFBWU8sVUFDckZDLEVBQWEsRUFBSTFwSCxLQUFLaXpHLElBQUksRUFBR3g1RyxFQUFTc3ZILFVBQVlELEdBRXhENTNILEtBQUt3bEgsWUFBWWxPLE9BQU8sQ0FDcEJ1Z0IsVUFBV0QsRUFDWGEsYUFBY3h6SCxFQUFTcXpILFdBQ3ZCSSxpQkFBbUJQLEVBQWF2bUgsRUFBSTNNLEVBQVM4USxPQUFPbzFCLEtBQVFsbUMsRUFBUzhRLE9BQU9vMUIsS0FBT3F0RixFQUNuRkcsZUFBaUJSLEVBQWFubUgsRUFBSS9NLEVBQVM4USxPQUFPZ3dHLElBQU85Z0gsRUFBUzhRLE9BQU9nd0csSUFBTXlTLElBS3ZGLGlCQUVJeDRILEtBQUt3bEgsWUFBWW9ULFFBQVEsbUJBQW9CNTRILEtBQUt3bEgsWUFBWXh0RyxlQUdsRSxnQkFJSWhZLEtBQUs2NEgseUJBRUwsTUFBTUMsRUFBbUI5NEgsS0FBS3dsSCxZQUFZeHRHLGNBQWMrZ0gsZ0JBQ2xEQyxFQUFXaDVILEtBQUt3bEgsWUFBWXBQLFlBQVkwaUIsR0FDOUM5NEgsS0FBS3dsSCxZQUFZb1QsUUFBUSxrQkFBbUJFLEVBQWtCRSxHQUdsRSxnQkFBaUJDLEVBQWVDLEdBRTVCLE1BQU1DLEVBQThCLE9BQWZELEVBQ2pCQSxFQTBEWixTQUE0QkQsRUFBZUcsRUFBUWIsR0FFL0MsTUFBTWMsRUFBVWQsRUFBU3hTLElBQU93UyxFQUFTcjBHLE9BQVMsRUFDNUNvMUcsRUFBVWYsRUFBU3B0RixLQUFRb3RGLEVBQVN0MEcsTUFBUSxFQUs1Q3MxRyxFQUFhLGdCQUFNTixFQUFldFUsSUFFcEMsTUFBTTZVLEVBQU9KLEVBQU9LLGtCQUFrQjlVLEdBQ2hDK1UsRUFBY04sRUFBT08sY0FBY2hWLEVBQVcsQ0FBQ2UsZ0JBQWdCLElBRS9Ea1UsRUFBT0YsRUFBWXZ1RixLQUFRcXVGLEVBQUt2MUcsTUFBUSxFQUN4QzQxRyxFQUFPSCxFQUFZM1QsSUFBT3lULEVBQUt0MUcsT0FBUyxFQUV4Q2lMLEVBQUtyZ0IsS0FBS21CLElBQUluQixLQUFLQyxJQUFJdXFILEVBQVVNLEdBQVNKLEVBQUt2MUcsTUFBUSxFQUFJLEdBQzNEbUwsRUFBS3RnQixLQUFLbUIsSUFBSW5CLEtBQUtDLElBQUlzcUgsRUFBVVEsR0FBU0wsRUFBS3QxRyxPQUFTLEVBQUksR0FFbEUsUUFBU2lMLEVBQUtBLEVBQUtDLEVBQUtBLEtBRzVCLE9BQXFCLE1BQWRtcUcsRUFBcUJBLEVBQWEsS0EvRWpDTyxDQUFrQmIsRUFBZWo1SCxLQUFLd2xILFlBQVk0UyxtQkFBb0JwNEgsS0FBS3dsSCxZQUFZdVUsZUFHM0YsSUFBSWhpRyxFQUFPLzNCLEtBQUttM0gsYUFBYW9CLFNBQVN5QixzQkFFdENoNkgsS0FBS20zSCxhQUFhb0IsU0FBU3lCLHNCQUF3QixFQUNuRCxJQUFJQyxFQUFlaEIsRUFBY2pxSCxPQUFPNUosR0FBU3BGLEtBQUttM0gsYUFBYStDLFNBQVNDLGNBQWMvMEgsSUFFMUZwRixLQUFLbTNILGFBQWFvQixTQUFTeUIsc0JBQXdCamlHLEVBSS9CLE9BQWhCb2hHLEdBRUFuNUgsS0FBS3dsSCxZQUFZNFUsZ0JBQWdCakIsRUFBYWMsR0FHL0IsT0FBZmYsR0FFQWw1SCxLQUFLd2xILFlBQVlvVCxRQUFRLGdCQUFpQk0sR0FHOUNsNUgsS0FBSzY0SCx5QkFHVCx5QkFFSSxNQUFNYixFQUFjaDRILEtBQUttM0gsYUFDbkJVLEVBQVlHLEVBQVk5OUcsUUFBUTI5RyxVQUdsQ0csRUFBWXFDLGVBQWlCeEMsR0FBYUcsRUFBWXFDLGNBQWdCLElBRWxFckMsRUFBWXFDLGFBQWV4QyxFQUUzQjczSCxLQUFLd2xILFlBQVlvVCxRQUFRLGtCQUFtQmYsR0FJNUM3M0gsS0FBS3dsSCxZQUFZb1QsUUFBUSxtQkFBb0JmLEdBR2pENzNILEtBQUt3bEgsWUFBWW9ULFFBQVEsZ0JBQWlCZixJQUc5Q0csRUFBWXFDLGFBQWV4QyxFQUcvQixVQUVJNzNILEtBQUtxM0gsVUFBVTF0SCxRQUFTNHRILElBRXBCdjNILEtBQUt3bEgsWUFBWThVLGtCQUFrQi9DLElBQ3BDdjNILE9DdEpJLE1BQU11NkgsRUFFakIsWUFBYXBFLEdBRVRuMkgsS0FBS3dsSCxZQUFjMlEsRUFJdkIsY0FBZWpuRyxFQUFPeW9HLEdBRWxCLE1BQU0xeUgsRUFBV2pGLEtBQUt3bEgsWUFBWXNTLGdDQUFnQ0gsR0FFNUR5QixFQUFTcDVILEtBQUt3bEgsWUFBWTRTLG1CQUMxQkcsRUFBV3Y0SCxLQUFLd2xILFlBQVl1VSxjQUM1QlMsRUFBNkJwQixFQUFPZiw4QkFBOEJwekgsRUFBU3F6SCxXQUFZQyxHQUU3RnY0SCxLQUFLd2xILFlBQVlsTyxPQUFPLENBQ3BCbWpCLFFBQVEsRUFDUmhDLGFBQWN4ekgsRUFBU3F6SCxXQUN2QkksaUJBQWtCOEIsRUFBMkI1b0gsRUFBSTNNLEVBQVM4USxPQUFPbzFCLEtBQ2pFd3RGLGVBQWdCNkIsRUFBMkJ4b0gsRUFBSS9NLEVBQVM4USxPQUFPZ3dHLE1BSXZFLFVBRUkvbEgsS0FBS3dsSCxZQUFZbE8sT0FBTyxDQUFDbWpCLFFBQVEsSUFJckMsa0JBTUEsaUJBTUEsZ0JBQWlCeEIsRUFBZUMsR0FHNUIsR0FBNkIsSUFBekJELEVBQWM1MkgsT0FBYyxPQUdoQyxJQUFJMDFCLEVBQU8vM0IsS0FBS3dsSCxZQUFZd1MsWUFBWU8sU0FBU3lCLHNCQUVqRGg2SCxLQUFLd2xILFlBQVl3UyxZQUFZTyxTQUFTeUIsc0JBQXdCLEVBQzlELElBQUlDLEVBQWVoQixFQUFjanFILE9BQU81SixHQUFTcEYsS0FBS3dsSCxZQUFZd1MsWUFBWWtDLFNBQVNDLGNBQWMvMEgsSUFJckcsR0FGQXBGLEtBQUt3bEgsWUFBWXdTLFlBQVlPLFNBQVN5QixzQkFBd0JqaUcsRUFFM0MsT0FBZm1oRyxFQUdBLFlBREFsNUgsS0FBS3dsSCxZQUFZNFUsZ0JBQWdCbEIsRUFBWWUsR0FTakQsTUFBTWIsRUFBU3A1SCxLQUFLd2xILFlBQVk0UyxtQkFDMUJ0bkgsRUFBUyxHQUVmbW9ILEVBQWN0dkgsUUFBUWc3RyxJQUVsQixNQUFNOXpHLEVBQVF1b0gsRUFBT3NCLFlBQVkvVixHQUFXOXpHLE1BQ3RCLElBQWxCQyxFQUFPek8sUUFBZ0J3TyxJQUFVQyxFQUFPQSxFQUFPek8sT0FBUyxJQUV4RHlPLEVBQU8xTyxLQUFLeU8sS0FJcEIsTUFBTTBuSCxFQUFXdjRILEtBQUt3bEgsWUFBWXVVLGNBQ2xDLElBQUlZLEVBSUFBLEVBRmtCLElBQWxCN3BILEVBQU96TyxRQUFnQnlPLEVBQU8sR0FBRzhwSCxPQUFPN1UsS0FBT3dTLEVBQVN4UyxJQUUxQ2oxRyxFQUFPLEdBRWhCQSxFQUFPLEdBQUc4cEgsT0FBT0MsUUFBVXRDLEVBQVNzQyxPQUUzQi9wSCxFQUFPLEdBdUJqQyxTQUE2QkEsRUFBUXluSCxHQUVqQyxNQUFNdUMsRUFBaUJ2QyxFQUFTeFMsSUFBTXdTLEVBQVNyMEcsT0FBUyxFQUV4RCxPQUFPLGdCQUFNcFQsRUFBUUQsSUFFakIsTUFBTWtxSCxFQUFjbHFILEVBQU0rcEgsT0FBTzdVLElBQU1sMUcsRUFBTXcvRixXQUFXbnNGLE9BQVMsRUFDakUsT0FBUXBWLEtBQUtDLElBQUkrckgsRUFBaUJDLEtBMUJoQkMsQ0FBbUJscUgsRUFBUXluSCxHQUc3QyxNQUFNWSxFQUFjbjVILEtBQUt3bEgsWUFBWXh0RyxjQUFjK2dILGdCQUU1QjRCLEVBQVlyVSxNQUFNenNFLEtBQUtnckUsR0FBUUEsRUFBS3ovRyxRQUFVK3pILElBSWpFbjVILEtBQUt3bEgsWUFBWTRVLGdCQUFnQk8sRUFBWXJVLE1BQU0sR0FBR2xoSCxNQUFPNjBILEdBSXJFLFlDOUZXLE1BQU1nQixFQUVqQixjQUVJajdILEtBQUtrN0gsT0FBUyxHQUNkbDdILEtBQUttN0gsZUFBaUIsR0FDdEJuN0gsS0FBS283SCxpQkFBbUIsR0FHNUIsV0FBWTdELElBRWV2M0gsS0FBS2s3SCxPQUFPM0QsRUFBUTFTLFFBQVU3a0gsS0FBS2s3SCxPQUFPM0QsRUFBUTFTLE1BQVEsS0FFbEV6aUgsS0FBS20xSCxHQUVoQnYzSCxLQUFLbzdILGlCQUFpQjdELEVBQVExUyxPQUM5QjBTLEVBQVE4RCxRQUdoQixjQUFlOUQsR0FFWCxNQUFNMVMsRUFBTzBTLEVBQVExUyxLQUNmeVcsRUFBaUJ0N0gsS0FBS2s3SCxPQUFPclcsR0FFbkMsSUFBS3lXLEVBQ0QsT0FFSixNQUFNQyxFQUFlRCxFQUFlMXNILFFBQVEyb0gsSUFFdEIsSUFBbEJnRSxJQUdBdjdILEtBQUtvN0gsaUJBQWlCdlcsSUFDdEJ5VyxFQUFlQyxHQUFjQyxVQUVqQ0YsRUFBZWx6RixPQUFPbXpGLEVBQWMsR0FFTixJQUExQkQsRUFBZWo1SCxlQUNSckMsS0FBS2s3SCxPQUFPclcsSUFHM0IsZUFBZ0JvVSxHQUVaLE1BQU13QyxFQUFxQno3SCxLQUFLbTdILGVBQzFCTyxFQUFpQixHQUV2QnpDLEVBQWNucEgsSUFBTTYwRyxJQUVoQitXLEVBQWUvVyxJQUFhLEVBRXZCM2tILEtBQUtvN0gsaUJBQWlCelcsS0FFdkIza0gsS0FBS283SCxpQkFBaUJ6VyxJQUFhLEVBRW5DM2tILEtBQUsyN0gsa0JBQWtCaFgsRUFBVzRTLElBRTlCQSxFQUFROEQsYUFLcEJJLEVBQW1CM3JILElBQU02MEcsSUFFakIrVyxFQUFlL1csR0FFZjNrSCxLQUFLMjdILGtCQUFrQmhYLEVBQVk0UyxJQUUvQkEsRUFBUVgsb0JBS0w1MkgsS0FBS283SCxpQkFBaUJ6VyxHQUM3QjNrSCxLQUFLMjdILGtCQUFrQmhYLEVBQVc0UyxJQUU5QkEsRUFBUWlFLGVBS3BCeDdILEtBQUttN0gsZUFBaUJsQyxFQUcxQixrQkFBbUJ0VSxFQUFXdHFGLEdBRTFCLE1BQU11aEcsRUFBVzU3SCxLQUFLazdILE9BQU92VyxHQUN6QmlYLEdBQ0FBLEVBQVM5ckgsSUFBTXZTLEdBQU04OEIsRUFBSzk4QixLQ25HdkIsTUFBTXMrSCxFQUVqQixZQUFhNWlGLEVBQU02aUYsR0FFZjk3SCxLQUFLKzdILE1BQVE5aUYsRUFDYmo1QyxLQUFLZzhILE1BQVFGLEVBQ2I5N0gsS0FBS2k4SCxLQUFPLElBQUl6NEgsTUFBTXkxQyxHQUFNN3VDLEtBQUssTUFBTTBGLElBQUksSUFBTSxJQUFJdE0sTUFBTXM0SCxHQUFNMXhILE1BQUssSUFHMUUsU0FBVXFtQyxFQUFLeXJGLEdBS1gsT0FBSXpyRixHQUFPendDLEtBQUsrN0gsT0FBU0csR0FBT2w4SCxLQUFLZzhILE9BRzlCaDhILEtBQUtpOEgsS0FBS3hyRixHQUFLeXJGLEdBRzFCLElBQUl6ckYsRUFBS3lyRixFQUFLbitILEdBRVZpQyxLQUFLaThILEtBQUt4ckYsR0FBS3lyRixHQUFPbitILEdDUGYsTUFBTSxFQUVqQixZQUFZbytILEdBRVJuOEgsS0FBS284SCxRQUFVRCxFQUNmLE1BQU1FLEVBQWNyOEgsS0FBS3M4SCxhQUFlLEdBRXhDSCxFQUFPeHlILFFBQVE0eUgsSUFFWEEsRUFBTUMsTUFBTTd5SCxRQUFROHlILElBRWhCSixFQUFZSSxFQUFLOW5GLEtBQU8sQ0FDcEJrakYsVUFBVzBFLEVBQU0xRSxVQUNqQnBuRixJQUFLZ3NGLEVBQUtoc0YsSUFDVnlyRixJQUFLTyxFQUFLUCxTQUt0Qmw4SCxLQUFLdXpFLFFBR1QsUUFFSSxNQUFNbXBELEVBQWdCMThILEtBQUsyOEgsZUFBaUIsR0FFNUMzOEgsS0FBS284SCxRQUFRenlILFFBQVE0eUgsSUFDakJHLEVBQWNILEVBQU0xRSxXQUFhLElBQUlnRSxFQUFnQlUsRUFBTXRqRixLQUFNc2pGLEVBQU1ULFFBSS9FLFNBQVVjLEdBRU4sTUFBTUMsRUFBa0IsR0FDbEJDLEVBQW1COThILEtBQUtvOEgsUUFBUSxHQUFHdkUsVUFDbkNrRixFQUFVLElBQUlsQixFQUFnQjc3SCxLQUFLbzhILFFBQVEsR0FBR25qRixLQUFNajVDLEtBQUtvOEgsUUFBUSxHQUFHTixNQUUxRSxJQUFJa0IsRUFHSixHQUFzQixPQUFsQkosRUFFQUksRUFBaUIsTUFHckIsQ0FDSSxNQUFNQyxFQUFZbnVILEtBQUswMkIsS0FBS28zRixHQUM1QkksRUFxR1osU0FBb0I1MUgsRUFBTzhqRSxHQUV2QixNQUFNN29FLEVBQVMrRSxFQUFNL0UsT0FDckIsSUFBSyxJQUFJdkYsRUFBSSxFQUFHQSxFQUFJdUYsRUFBUXZGLElBRXhCLEdBQUlvdUUsRUFBVTlqRSxFQUFNdEssR0FBSUEsR0FDcEIsT0FBT0EsRUFHZixPQUFRLEVBOUdpQml1RixDQUFVL3FGLEtBQUtvOEgsUUFBU0csR0FBU0EsRUFBTTFFLFdBQWFvRixHQU85Q2o5SCxLQUFLbzhILFFBQVExN0gsTUFBTSxFQUFHczhILEVBQWlCLEdBQUczMUYsVUFDaEUzbkMsT0FBT00sS0FBS284SCxRQUFRMTdILE1BQU1zOEgsRUFBaUIsSUFFN0JyekgsUUFBVTR5SCxJQUV6QixNQUFNVyxFQUFTbDlILEtBQUsyOEgsZUFBZUosRUFBTTFFLFdBRXpDLElBQUlzRixFQUFrQlosRUFBTUMsTUFBTXh0SCxPQUFPeXRILEdBQVFTLEVBQU9FLFNBQVNYLEVBQUtoc0YsSUFBS2dzRixFQUFLUCxNQVFoRixNQUFNMUQsRUFBYTFwSCxLQUFLaXpHLElBQUksRUFBRythLEVBQW1CUCxFQUFNMUUsV0FFeERzRixFQUFrQkEsRUFBZ0JudUgsT0FBT3l0SCxJQUNyQyxJQUFJWSxHQUFXLEVBRWYsTUFBTUMsRUFBYWIsRUFBS2hzRixJQUFNK25GLEVBQ3hCK0UsRUFBYWQsRUFBS1AsSUFBTTFELEVBRTlCLElBQUssSUFBSTE3SCxFQUFFLEVBQUdBLEVBQUkwN0gsRUFBWTE3SCxJQUUxQixJQUFLLElBQUl5UixFQUFFLEVBQUdBLEVBQUlpcUgsRUFBWWpxSCxJQUVyQnd1SCxFQUFRSyxTQUFTRSxFQUFheGdJLEVBQUd5Z0ksRUFBYWh2SCxLQUUvQzh1SCxHQUFXLEVBQ1hOLEVBQVE5NEgsSUFBSXE1SCxFQUFheGdJLEVBQUd5Z0ksRUFBYWh2SCxHQUFHLElBS3hELE9BQU84dUgsSUFHWFIsRUFBZ0J6NkgsS0FBSys2SCxJQUN0Qm45SCxNQUdINjhILEVBQWdCeDFGLFVBRWhCLE1BQU1tMUYsRUFBUSxHQU1kLE9BSkFLLEVBQWdCbHpILFFBQVE2ekgsSUFDcEJoQixFQUFNcDZILEtBQUtsRCxNQUFNczlILEVBQU9nQixLQUdyQmhCLEVBU1gsZ0JBQWlCcnZELEdBRWJudEUsS0FBS3V6RSxRQUVMdnpFLEtBQUtvOEgsUUFBUXp5SCxRQUFVNHlILElBRW5CLE1BQU1XLEVBQVNsOUgsS0FBSzI4SCxlQUFlSixFQUFNMUUsV0FFekMwRSxFQUFNQyxNQUFNN3lILFFBQVE4eUgsSUFDWnR2RCxFQUFNdjhELElBQUk2ckgsRUFBSzluRixNQUNmdW9GLEVBQU9qNUgsSUFBSXc0SCxFQUFLaHNGLElBQUtnc0YsRUFBS1AsS0FBSyxNQUV4Q2w4SCxNQUdQLHFCQUFzQnk5SCxHQUVsQkEsRUFBSzl6SCxRQUFVZ3JDLElBRVgsTUFBTTYrQixFQUFReHpFLEtBQUtzOEgsYUFBYTNuRixHQUNoQzMwQyxLQUFLMjhILGVBQWVucEQsRUFBTXFrRCxXQUFXNXpILElBQUl1dkUsRUFBTS9pQyxJQUFLK2lDLEVBQU0wb0QsS0FBSyxJQUNoRWw4SCxPQ2hKSSxNQUFNMDlILEVBRWpCLFlBQWFDLEVBQVE5RixHQUVqQixNQUFNK0YsRUE2SmQsU0FBNEJELEVBQVE5RixHQUVoQyxNQUFNZ0csRUFBOEIsT0FBZGhHLEVBQXFCOEYsRUFBT0csWUF1RXRELFNBQStCSCxFQUFROUYsR0FFbkMsTUFBTVcsRUFBYTFwSCxLQUFLaXpHLElBQUksRUFBRzhWLEVBQVk4RixFQUFPekYsY0FFbEQsT0FBT3lGLEVBQU9HLFlBQVlodUgsSUFBSWUsSUFBUyxDQUNuQ3cvRixXQUFZMHRCLEVBQWdCbHRILEVBQU13L0YsV0FBWW1vQixHQUU5Q2xTLE1BQU96MUcsRUFBTXkxRyxNQUFNeDJHLElBQUkrMEcsSUFBUSxDQUMzQnovRyxNQUFPeS9HLEVBQUt6L0csTUFFWjQ0SCxZQUFhLENBQ1RqWSxJQUFLajNHLEtBQUtzdUQsTUFBTXluRCxFQUFLbVosWUFBWWpZLElBQU15UyxHQUN2Q3J0RixLQUFNcjhCLEtBQUtzdUQsTUFBTXluRCxFQUFLbVosWUFBWTd5RixLQUFPcXRGLElBRzdDbm9CLFdBQVkwdEIsRUFBZ0JsWixFQUFLeFUsV0FBWW1vQixTQXRGV3lGLENBQXFCTixFQUFROUYsR0FFdkZxRyxFQWlHVixTQUFzQ1AsRUFBUUUsR0FHMUMsSUFBSU0sRUFBY0MsRUFDbEIsTUFBTUMsRUFBYVYsRUFBT3BqSCxRQUFRaFIsU0FFOUJvMEgsRUFBT1csb0JBRVBILEVBQWUsUUFDZkMsRUFBbUJDLEVBQVdsekYsS0FBT2t6RixFQUFXanpGLFFBSWhEK3lGLEVBQWUsU0FDZkMsRUFBbUJDLEVBQVd0WSxJQUFNc1ksRUFBV3hELFFBR25ELE9BQU91RCxFQUFtQlAsRUFBYzMxRyxPQUFPLENBQUNxMkcsRUFBUW5GLElBQVd0cUgsS0FBS21CLElBQUltcEgsRUFBTy9vQixXQUFXOHRCLEdBQWVJLEdBQVMsR0FsSHRGQyxDQUE0QmIsRUFBUUUsR0FHcEUsSUFBSVksRUFBcUJkLEVBQU9XLG1CQUM1QlgsRUFBT3BqSCxRQUFRaFIsU0FBU3c4RyxJQUN4QjRYLEVBQU9wakgsUUFBUWhSLFNBQVM0aEMsS0FFNUIsTUFBTXV6RixFQUFhLEdBR2JDLEVBQWMsQ0FDaEI1WSxJQUFLNFgsRUFBT3BqSCxRQUFRc3FHLEtBQUtrQixJQUN6QjU2RSxLQUFNd3lGLEVBQU9wakgsUUFBUXNxRyxLQUFLMTVFLE1BbUM5QixJQUFJam5CLEVBQVFELEVBaENaNDVHLEVBQWNsMEgsUUFBUSxDQUFDeXZILEVBQVFoMEgsS0FDM0IsSUFBSTJnSCxFQUFLNTZFLEVBRUx3eUYsRUFBT1csb0JBRVB2WSxFQUFNMFksRUFDTnR6RixHQUFRK3lGLEVBQTBCOUUsRUFBTy9vQixXQUFXcHNGLE9BQVMsSUFJN0Q4aEcsR0FBT21ZLEVBQTBCOUUsRUFBTy9vQixXQUFXbnNGLFFBQVUsRUFDN0RpbkIsRUFBT3N6RixHQUdYLE1BQU03RCxFQUFTLENBQ1g3VSxJQUFLQSxFQUNMOFUsT0FBUTlVLEVBQU00WSxFQUFZNVksSUFBTXFULEVBQU8vb0IsV0FBV25zRixPQUNsRGluQixLQUFNQSxFQUNOQyxNQUFPRCxFQUFPd3pGLEVBQVl4ekYsS0FBT2l1RixFQUFPL29CLFdBQVdwc0YsT0FHdkR5NkcsRUFBV3Q4SCxLQUFLLENBQ1pnRCxNQUFPQSxFQUNQaXJHLFdBQVkrb0IsRUFBTy9vQixXQUNuQmlXLE1BQU84UyxFQUFPOVMsTUFDZHNVLE9BQVFBLEVBQ1JyZ0gsUUFBU29rSCxJQUdiRixFQUFxQmQsRUFBT1csbUJBQXFCMUQsRUFBT0MsT0FBU0QsRUFBT3h2RixRQUt4RXV5RixFQUFPVyxvQkFFUHA2RyxFQUFTdTZHLEVBQXFCRSxFQUFZNVksSUFDMUM5aEcsRUFBUWk2RyxJQUlSaDZHLEVBQVNnNkcsRUFDVGo2RyxFQUFRdzZHLEVBQXFCRSxFQUFZeHpGLE1BRzdDLE1BQU8sQ0FDSGtsRSxXQUFZLENBQ1Juc0YsT0FBUUEsRUFDUkQsTUFBT0EsR0FFWHk2RyxXQUFZQSxHQWxPV0UsQ0FBa0JqQixFQUFROUYsR0FFakQ3M0gsS0FBS3F3RyxXQUFhdXRCLEVBQWV2dEIsV0FDakNyd0csS0FBSzArSCxXQUFhZCxFQUFlYyxXQUNqQzErSCxLQUFLNitILFlBdUliLFNBQXdCSCxHQUVwQixNQUFNSSxFQUFhLEdBYW5CLE9BWEFKLEVBQVcvMEgsUUFBUWtILElBQ2ZBLEVBQU15MUcsTUFBTTM4RyxRQUFRazdHLElBQ2hCaWEsRUFBV2phLEVBQUt6L0csT0FBUyxDQUNyQkEsTUFBT3kvRyxFQUFLei9HLE1BQ1p5TCxNQUFPQSxFQUNQdy9GLFdBQVl3VSxFQUFLeFUsV0FDakIydEIsWUFBYW5aLEVBQUttWixpQkFLdkJjLEVBdEpnQkMsQ0FBY25CLEVBQWVjLFlBZXBELFlBQWEvWixHQUVULE9BQU8za0gsS0FBSzYrSCxZQUFZbGEsSUFBYyxLQVMxQyxrQkFBbUJBLEdBRWYsSUFBSzNrSCxLQUFLNitILGNBQWdCNytILEtBQUs2K0gsWUFBWWxhLEdBQ3ZDLE9BQU8sS0FFWCxNQUFNaVcsRUFBU29FLEVBQTBCaC9ILEtBQUs2K0gsWUFBWWxhLElBRTFELE1BQU8sQ0FDSHpnRyxPQUFRMDJHLEVBQU9DLE9BQVNELEVBQU83VSxJQUMvQjloRyxNQUFPMjJHLEVBQU94dkYsTUFBUXd2RixFQUFPenZGLE1BYXJDLGNBQWV3NUUsRUFBV3pxRyxHQUV0QixNQUFNMGdILEVBQVM1NkgsS0FBS3lsSCxjQUFjZCxFQUFXenFHLEdBRTdDLE9BQUswZ0gsRUFHRSxDQUNIN1UsSUFBSzZVLEVBQU83VSxJQUNaNTZFLEtBQU15dkYsRUFBT3p2RixNQUpOLEtBUWYsY0FBZXc1RSxFQUFXenFHLEdBRXRCLE1BQU0ra0gsRUFBV2ovSCxLQUFLNitILFlBQVlsYSxHQUVsQyxJQUFLc2EsRUFDRCxPQUFPLEtBRVgsTUFBTXJFLEVBQVNvRSxFQUEwQkMsR0FDbkMxa0gsRUFBVTBrSCxFQUFTcHVILE1BQU0wSixRQUUvQixPQUFJTCxHQUFXQSxFQUFRd3JHLGVBRVosQ0FDSEssSUFBSzZVLEVBQU83VSxJQUFNeHJHLEVBQVF3ckcsSUFDMUI1NkUsS0FBTXl2RixFQUFPenZGLEtBQU81d0IsRUFBUTR3QixLQUM1QjB2RixPQUFRRCxFQUFPQyxPQUNmenZGLE1BQU93dkYsRUFBT3h2RixPQUlmLENBQ0gyNkUsSUFBSzZVLEVBQU83VSxJQUNaNTZFLEtBQU15dkYsRUFBT3p2RixLQUdiMHZGLE9BQVFELEVBQU9DLE9BQVN0Z0gsRUFBUXdyRyxJQUNoQzM2RSxNQUFPd3ZGLEVBQU94dkYsT0FZdEIsOEJBQStCdTVFLEVBQVc0VCxHQUV0QyxNQUFNak8sRUFBYWlPLEVBQVNwdEYsS0FDdEIrekYsRUFBZTNHLEVBQVNudEYsTUFBUW10RixFQUFTcHRGLEtBRXpDcDFCLEVBQVMvVixLQUFLMjVILGNBQWNoVixHQUU1Qi95RyxFQUFJMDRHLEVBQWF2MEcsRUFBT28xQixLQUFPM3lCLFNBQVMwbUgsRUFBZSxFQUFHLElBRTFEM1UsRUFBWWdPLEVBQVN4UyxJQUNyQm9aLEVBQWdCNUcsRUFBU3NDLE9BQVN0QyxFQUFTeFMsSUFJakQsTUFBTyxDQUNIbjBHLEVBQUdBLEVBQ0hJLEVBSk11NEcsRUFBWXgwRyxFQUFPZ3dHLElBQU12dEcsU0FBUzJtSCxFQUFnQixFQUFHLE1BU3ZFLFNBQVNILEVBQTJCbmEsR0FFaEMsTUFBTWtCLEVBQVNsQixFQUFLbVosWUFBWWpZLElBQU9sQixFQUFLaDBHLE1BQU0rcEgsT0FBTzdVLElBQ25EOFUsRUFBUzlVLEVBQU1sQixFQUFLeFUsV0FBV25zRixPQUMvQmluQixFQUFTMDVFLEVBQUttWixZQUFZN3lGLEtBQU8wNUUsRUFBS2gwRyxNQUFNK3BILE9BQU96dkYsS0FHekQsTUFBTyxDQUNINDZFLElBQUtBLEVBQ0w4VSxPQUFRQSxFQUNSMXZGLEtBQU1BLEVBQ05DLE1BTldELEVBQU8wNUUsRUFBS3hVLFdBQVdwc0YsT0F5SDFDLFNBQVM4NUcsRUFBaUIxdEIsRUFBWW1vQixHQUVsQyxNQUFPLENBQ0h0MEcsT0FBUXBWLEtBQUtzdUQsTUFBTWl6QyxFQUFXbnNGLE9BQVNzMEcsR0FDdkN2MEcsTUFBT25WLEtBQUtzdUQsTUFBTWl6QyxFQUFXcHNGLE1BQVF1MEcsSUN2UTdDLE1BQU14cEIsRUFBUSxFQUFRLEdBQVIsQ0FBaUIsbUJBT2hCLE1BQU1vd0IsRUFFakIsWUFBYWxsSCxHQUVUQSxFQUFVQSxHQUFXLENBQUU2bEcsUUFOTixLQU9qQi8vRyxLQUFLKy9HLFFBQVU3bEcsRUFBUTZsRyxTQVBOLElBU2pCLy9HLEtBQUtxL0gsTUFBUSxHQUNici9ILEtBQUtzL0gsTUFBUSxHQUNidC9ILEtBQUt1L0gsS0FBTyxHQUdoQixJQUFLNXFGLEdBRUQsTUFBTTZxRixFQUFTeC9ILEtBQUtzL0gsTUFBTTNxRixHQUMxQixPQUFPNnFGLEVBQVNBLEVBQU9DLElBQU0sS0FHakMsSUFBSzlxRixHQUVELFFBQVMzMEMsS0FBS3MvSCxNQUFNM3FGLEdBR3hCLElBQUtBLEVBQUs4cUYsR0FFTixJQUFJRCxFQUFTeC9ILEtBQUtzL0gsTUFBTTNxRixHQUNwQjZxRixHQUdBQSxFQUFPQyxJQUFNQSxFQUNiei9ILEtBQUswL0gsU0FBU0YsS0FJZEEsRUFBUyxDQUNMQyxJQUFLQSxFQUNMOXFGLElBQUtBLEdBR1QzMEMsS0FBS3MvSCxNQUFNM3FGLEdBQU82cUYsRUFDbEJ4L0gsS0FBSzIvSCxVQUFVLEdBQ2YzL0gsS0FBS3UvSCxLQUFLcDlILFFBQVFxOUgsSUFJMUIsU0FBVUEsR0FFTixNQUFNcDZILEVBQVFwRixLQUFLdS9ILEtBQUszd0gsUUFBUTR3SCxHQUNoQ3gvSCxLQUFLdS9ILEtBQUtuM0YsT0FBT2hqQyxFQUFPLEdBQ3hCcEYsS0FBS3UvSCxLQUFLcDlILFFBQVFxOUgsR0FHdEIsVUFBV0ksR0FFUCxNQUFNQyxFQUFvQjcvSCxLQUFLKy9HLFFBQVU2ZixFQUV6QyxHQUFJNS9ILEtBQUt1L0gsS0FBS2w5SCxRQUFVdzlILEVBQ3BCLE9BRUosSUFBSUMsRUFBZ0I5L0gsS0FBS3UvSCxLQUFLbDlILE9BQVMsRUFFdkMsT0FDQSxDQUNJLE1BQU1sRCxFQUFTYSxLQUFLdS9ILEtBQUtPLEdBRXpCLElBQUs5L0gsS0FBS3EvSCxNQUFNbGdJLEVBQU93MUMsT0FFbkJxNkQsRUFBTSxvQkFBcUI3dkcsRUFBT3cxQyxLQUNsQzMwQyxLQUFLdS9ILEtBQUtuM0YsT0FBTzAzRixFQUFlLFVBQ3pCOS9ILEtBQUtzL0gsTUFBTW5nSSxFQUFPdzFDLEtBRXJCMzBDLEtBQUt1L0gsS0FBS2w5SCxRQUFVdzlILEdBQ3BCLE1BR1IsR0FBc0IsSUFBbEJDLEVBQ0osQ0FFSTl3QixFQUFNMGQsU0FBVzFkLEVBQU0sb0RBQ25CaHZHLEtBQUt1L0gsS0FBS2w5SCxPQUFTdzlILEdBRXZCLE1BR0pDLEtBSVIsUUFBU25yRixHQUVMMzBDLEtBQUtxL0gsTUFBTTFxRixJQUFRMzBDLEtBQUtxL0gsTUFBTTFxRixJQUFRLEdBQUssRUFDM0MzMEMsS0FBSzAvSCxTQUFTMS9ILEtBQUtzL0gsTUFBTTNxRixJQUc3QixRQUFTQSxHQUVTMzBDLEtBQUtxL0gsTUFBTTFxRixHQUViLEVBQ1IzMEMsS0FBS3EvSCxNQUFNMXFGLFlBRUozMEMsS0FBS3EvSCxNQUFNMXFGLEdBRXRCMzBDLEtBQUsyL0gsVUFBVSxJQ3ZHUixNQUFNSSxFQUVqQixZQUFhN2xILEdBRVRsYSxLQUFLZ2dJLEtBQU85bEgsRUFBUXk2QixJQUNwQjMwQyxLQUFLaWdJLFVBQVkvbEgsRUFBUXZSLEtBQ3pCM0ksS0FBS2tnSSxlQUFpQmhtSCxFQUFRM1YsTUFDOUJ2RSxLQUFLbWdJLFlBQWNqbUgsRUFBUWltSCxhQUFlLEVBQzFDbmdJLEtBQUtvZ0ksU0FBV3BnSSxLQUFLcWdJLFdBQVksRUFDakNyZ0ksS0FBS3NnSSxhQUFlcG1ILEVBQVEzUixTQUFTZzRILGlCQUdyQ3ZnSSxLQUFLNEcsUUFBVUMsV0FBVyxLQUV0QjdHLEtBQUt3Z0ksT0FBUyxJQUFJQyxNQUNsQnpnSSxLQUFLd2dJLE9BQU9FLFlBQWMxZ0ksS0FBS3NnSSxhQUMvQnRnSSxLQUFLd2dJLE9BQU9HLE9BQVMzZ0ksS0FBSzRnSSxZQUFZdGlJLEtBQUswQixNQUMzQ0EsS0FBS3dnSSxPQUFPNzhFLFFBQVUzakQsS0FBSzZnSSxhQUFhdmlJLEtBQUswQixNQUM3Q0EsS0FBS3dnSSxPQUFPbDBHLElBQU1wUyxFQUFReTZCLEtBRTNCMzBDLEtBQUttZ0ksYUFHWixRQUVJcDVILGFBQWEvRyxLQUFLNEcsU0FXZDVHLEtBQUt3Z0ksU0FFTHhnSSxLQUFLd2dJLE9BQU9HLE9BQVMzZ0ksS0FBS3dnSSxPQUFPNzhFLFFBQVUsS0FFM0MzakQsS0FBS3dnSSxPQUFPbDBHLElBQU0sSUFHdEJ0c0IsS0FBS29nSSxVQUFXLEVBR3BCLGNBRVFwZ0ksS0FBS29nSSxTQUVMejlILFFBQVE0QixNQUFNLHdEQUEwRHZFLEtBQUtnZ0ksTUFJN0VoZ0ksS0FBS3FnSSxVQUVMMTlILFFBQVE0QixNQUFNLHdEQUEwRHZFLEtBQUtnZ0ksT0FJakZoZ0ksS0FBS3FnSSxXQUFZLEVBRWpCcmdJLEtBQUtpZ0ksVUFBVWpnSSxLQUFLd2dJLFNBR3hCLGVBRUl4Z0ksS0FBS2tnSSxlQUFlbGdJLEtBQUt3Z0ksU0N4RWxCLE9BQ1hNLFFBbUJKLFNBQWtCNW1ILEdBRWQsTUFBTTZtSCxFQUFhN21ILEVBQVE4bUgsU0FDckJDLEVBQWEvbUgsRUFBUSttSCxXQUNyQkMsRUFBV2huSCxFQUFRZ25ILFNBQ25CQyxFQUFRam5ILEVBQVFpbkgsTUFJaEJwOEYsRUFBUXFwQixJQUNSOW5DLEVBQU15ZSxFQUFRZzhGLEVBRWRLLEVBQVcsR0FDWHJ3SCxFQUFTLEdBQ1Rzd0gsRUFBWTdqSSxPQUFPaUksS0FBS3c3SCxHQUU5QkksRUFBVTEzSCxRQUFRdEwsSUFDZCxNQUFNcy9ILEVBQVNzRCxFQUFXNWlJLEdBQzFCK2lJLEVBQVMvaUksR0F1RGpCLFNBQXFCMG1DLEVBQU96ZSxFQUFLZzdHLEdBRTdCLE9BQVFDLEdBQXFCeDhGLEdBQVN6ZSxFQUFNeWUsR0FBU3U4RixFQUFPQyxHQXpEeEM1bUMsQ0FBWWdqQyxFQUFPdHpILEtBQU1zekgsRUFBTzMzRyxHQUFJMjNHLEVBQU8yRCxRQUFVRSxLQUl6RSxJQUFJQyxFQUFZOWEsdUJBZWhCLFNBQVN0d0IsSUFFTCxNQUFNcnVFLEVBQVVvbUMsS0FrQnBCLFNBQXNCbXpFLEdBRWxCRixFQUFVMTNILFFBQVF0TCxJQUNkMFMsRUFBTzFTLEdBQU8raUksRUFBUy9pSSxHQUFLa2pJLE1BbEJoQ0csQ0FGZ0I1eUgsS0FBS2tCLEtBQUtnWSxFQUFVK2MsR0FBU2c4RixFQUFZLElBR3pERyxFQUFTbndILEdBRUxpWCxFQUFVMUIsRUFFVm03RyxFQUFZOWEsc0JBQXNCdHdCLEdBSWxDc3JDLEVBQTBCLENBQ3RCQyxhQUFhLE9BNUJ6QixNQUFPLENBQ0gsU0FFc0IsT0FBZEgsSUFFQUkscUJBQXFCSixHQUNyQkUsRUFBMEIsQ0FDdEJDLGFBQWEsT0FpQzdCLFNBQVNELEVBQTBCei9HLEdBRS9CdS9HLEVBQVksS0FFUk4sR0FDQUEsRUFBTWovRyxLQXZGZG8vRyxPQUFRLENBQ0pRLE9Bb0dSLFNBQXNCbnNILEdBRWxCLE9BQU9BLEdBckdIb3NILE1BQU9QLElBSWYsSUFBSXB6RSxFQTRHSixTQUFTb3pFLEVBQWtCeGpJLEdBRXZCLE9BQU9BLEVBQUksR0FBTSxFQUFJQSxFQUFJQSxFQUFJQSxHQUFNQSxFQUFJLElBQVEsRUFBSUEsRUFBSSxJQUFRLEVBQUlBLEVBQUksR0FBTSxFQTFHN0Vvd0QsRUFGdUIsb0JBQWhCNHpFLGFBQStCQSxZQUFZNXpFLElBRTVDLElBQWU0ekUsWUFBWTV6RSxNQUkzQixJQUFlejBCLEtBQUt5MEIsTUNUZixNQUFNLEVBRWpCLFlBQWFsMEMsRUFBUytuSCxHQUVsQmppSSxLQUFLa2lJLFVBQVlob0gsRUFBUXErRyxTQUN6QnY0SCxLQUFLbWlJLGNBQWdCam9ILEVBQVFrb0gsYUFDN0JwaUksS0FBS3FpSSxpQkFBbUJub0gsRUFBUW04RyxhQUNoQ3IySCxLQUFLc2lJLFVBQVlwb0gsRUFBUTNSLFNBRXpCdkksS0FBS3VpSSxPQUFTTixHQUFTLEdBRXZCamlJLEtBQUt3aUksUUFBVXRQLEVBQUksU0FBVSxDQUFFd0QsTUFBTyx1QkFDdEMxMkgsS0FBS3lpSSxLQUFPemlJLEtBQUt3aUksUUFBUUUsV0FBVyxNQUVwQzFpSSxLQUFLbzVILE9BQVMsS0FFZHA1SCxLQUFLMmlJLGdCQUFrQixLQUN2QjNpSSxLQUFLbTdILGVBQWlCLEtBQ3RCbjdILEtBQUs0aUksUUFBVSxLQUNmNWlJLEtBQUs2aUksV0FBYSxLQUNsQjdpSSxLQUFLOGlJLGlCQUFtQixLQUN4QjlpSSxLQUFLK2lJLGVBQWlCLEtBQ3RCL2lJLEtBQUtnakksV0FBYSxLQUlsQmhqSSxLQUFLNHpILE9BQVMsSUFBSXdMLEVBQ2xCcC9ILEtBQUtpakksaUJBQW1CLEdBRzVCLGdDQUVJLE1BQWlDLG9CQUF0QkMsa0JBRUEsS0FHSixDQUNILHNDQUF1Q2hRLEVBQUksTUFBTyxVQUNsRCwwQ0FJUixLQUFNeUssRUFBUXdGLEVBQWtCQyxHQWU1QixHQWJBcGpJLEtBQUtxakksa0JBRURyakksS0FBS3VpSSxPQUFPZSxnQkFFWnRqSSxLQUFLdWlJLE9BQU9lLGlCQUdoQnRqSSxLQUFLMmlJLGdCQUFrQlMsRUFDdkJwakksS0FBSzRpSSxRQUFVakYsRUFDZjM5SCxLQUFLOGlJLGlCQUFtQixHQUN4QjlpSSxLQUFLdWpJLHNCQUFzQkosRUFBaUJ0TCxZQUd2QzczSCxLQUFLbzVILE9BQU9zQixZQUFZeUksRUFBaUI3SyxZQUUxQyxNQUFNLElBQUk5MUgsTUFBTSxpQkFBbUIyZ0ksRUFBaUI3SyxZQUdwRHQ0SCxLQUFLd2lJLFFBQVF2K0csUUFBVWprQixLQUFLa2lJLFVBQVVqK0csT0FBU2prQixLQUFLd2lJLFFBQVF0K0csU0FBV2xrQixLQUFLa2lJLFVBQVVoK0csU0FFdEZsa0IsS0FBS3dpSSxRQUFRditHLE1BQVFqa0IsS0FBS2tpSSxVQUFVaitHLE1BQ3BDamtCLEtBQUt3aUksUUFBUXQrRyxPQUFTbGtCLEtBQUtraUksVUFBVWgrRyxRQUl6Q2xrQixLQUFLd2pJLEtBQUtMLEVBQWlCN0ssV0FBWTZLLEVBQWlCeEssZUFBZ0J3SyxFQUFpQnpLLGtCQUVyRjE0SCxLQUFLd2lJLFFBQVF4K0csYUFBZWhrQixLQUFLbWlJLGVBRWpDbmlJLEtBQUttaUksY0FBYy8wQixhQUFhcHRHLEtBQUt3aUksUUFBU3hpSSxLQUFLbWlJLGNBQWMvYyxZQUdqRXBsSCxLQUFLdWlJLE9BQU9rQixlQUVaempJLEtBQUt1aUksT0FBT2tCLGdCQUlwQixxQkFBc0JOLEdBRWxCLEdBQUlBLEVBQWlCdEwsWUFBYzczSCxLQUFLNmlJLFdBQ3hDLENBQ0ksR0FBd0IsT0FBcEI3aUksS0FBSzZpSSxXQUVMLE1BQU0sSUFBSXJoSSxVQUFVLG9DQUVuQixHQUFtQyxPQUEvQjJoSSxFQUFpQnRMLFVBRXRCLE1BQU0sSUFBSXIySCxVQUFVLDBDQUd4QnhCLEtBQUt1akksc0JBQXNCSixFQUFpQnRMLFdBR2hENzNILEtBQUswakksTUFBTVAsRUFBaUI3SyxXQUFZNkssRUFBaUJ4SyxlQUFnQndLLEVBQWlCekssa0JBRzlGLHNCQUF1QmIsR0FFbkI3M0gsS0FBS281SCxPQUFTLElBQUlzRSxFQUFlMTlILEtBQUs0aUksUUFBUy9LLEdBQy9DNzNILEtBQUs2aUksV0FBYWhMLEVBRWxCLEVBQWM3M0gsS0FBS3FpSSxpQkFBa0IsQ0FDakNsNEgsTUFBTyxDQUNIK1osT0FBUWxrQixLQUFLbzVILE9BQU8vb0IsV0FBV25zRixPQUFTLEtBQ3hDRCxNQUFPamtCLEtBQUtvNUgsT0FBTy9vQixXQUFXcHNGLE1BQVEsUUFJOUNqa0IsS0FBS2tpSSxVQUFVeUIsbUJBQW1CM2pJLEtBQUtvNUgsT0FBTy9vQixZQUdsRCxTQUVJcndHLEtBQUtxakksa0JBRUxyakksS0FBSzRqSSxVQUVENWpJLEtBQUt1aUksT0FBT3NCLGlCQUVaN2pJLEtBQUt1aUksT0FBT3NCLGdCQUFnQjdqSSxLQUFLbTdILGVBQWV6NkgsUUFBUyxNQUlqRSxVQUVJLE1BQU1vakksRUFBbUIsR0FDekI5akksS0FBS281SCxPQUFPc0YsV0FBVy8wSCxRQUFTa0gsSUFFNUIsSUFBSzdRLEtBQUtraUksVUFBVTZCLGlCQUFpQmx6SCxFQUFNK3BILFFBRXZDLE9BR0osTUFBTVgsRUFBZXBwSCxFQUFNeTFHLE1BQ3RCdDNHLFFBQU8sU0FBVTYxRyxHQUVkLE9BQU83a0gsS0FBS202SCxjQUFjdFYsRUFBS3ovRyxTQUNoQ3BGLE1BQ0Y4UCxJQUFJKzBHLEdBQVFBLEVBQUt6L0csT0FFdEIwK0gsRUFBaUIxaEksS0FBS2xELE1BQU00a0ksRUFBa0I3SixJQUMvQ2o2SCxNQUVIQSxLQUFLeWlJLEtBQUt1QixVQUFVLEVBQUcsRUFBR2hrSSxLQUFLd2lJLFFBQVF2K0csTUFBT2prQixLQUFLd2lJLFFBQVF0K0csUUFDM0Rsa0IsS0FBS2lrSSxjQUFjSCxHQUVuQkEsRUFBaUJuNkgsUUFBU2c3RyxJQUV0QixJQUFLM2tILEtBQUs4aUksaUJBQWlCbmUsR0FDM0IsQ0FDSSxNQUFNRSxFQUFPN2tILEtBQUtvNUgsT0FBT3NCLFlBQVkvVixHQUMvQnVmLEVBQWFsa0ksS0FBSzJpSSxnQkFBZ0J3Qix3QkFBd0J0ZixHQUMxRHVmLEVBQVksSUFBSSxFQUFlRixHQUNyQ0UsRUFBVUMsZ0JBQWdCcmtJLEtBQUs0ekgsUUFDL0I1ekgsS0FBSzhpSSxpQkFBaUJuZSxHQUFheWYsSUFFeENwa0ksTUFFSEEsS0FBS3NrSSxzQkFBc0JSLEdBRTNCLE1BQU0zbEcsRUFBVW9tRyxFQUFZdmtJLEtBQUttN0gsZ0JBQWtCLEdBQUkySSxHQUV2RDNsRyxFQUFRMGpDLFFBQVFsNEQsUUFBU2c3RyxXQUVkM2tILEtBQUs4aUksaUJBQWlCbmUsSUFDOUIza0gsTUFFSEEsS0FBS203SCxlQUFpQjJJLEVBQ3RCOWpJLEtBQUt3a0ksU0FFRHhrSSxLQUFLdWlJLE9BQU9rQyxnQkFFWnRtRyxFQUFRdW1HLE1BQU0vNkgsUUFBU2c3RyxJQUVuQjNrSCxLQUFLdWlJLE9BQU9rQyxlQUFlOWYsSUFDNUIza0gsTUFJWCxTQUVJLE1BQU0ya0ksRUFBZ0IsR0FFdEIza0ksS0FBS203SCxlQUFleHhILFFBQVVnN0csSUFFMUIza0gsS0FBSzhpSSxpQkFBaUJuZSxHQUFXaWdCLFNBQVM1a0ksS0FBSzZpSSxZQUFZbDVILFFBQVNzNEIsSUFFaEUsTUFBTTRpRyxFQUFTQyxFQUFvQjdpRyxFQUFRamlDLEtBQUs2aUksWUFFNUM3aUksS0FBSytrSSxlQUFlcGdCLEVBQVdrZ0IsS0FFL0JGLEVBQWN2aUksS0FBSzYvQixFQUFPMFMsS0FDMUIzMEMsS0FBS2dsSSxVQUFVcmdCLEVBQVdrZ0IsRUFBUTdrSSxLQUFLNHpILE9BQU9qMkgsSUFBSXNrQyxFQUFPMFMsV0FLckUsTUFBTXc0QixFQUFRbnRFLEtBQUs0ekgsT0FFYnoxRixFQUFVb21HLEVBQVl2a0ksS0FBSytpSSxnQkFBa0IsR0FBSTRCLEdBRXZEeG1HLEVBQVF1bUcsTUFBTS82SCxRQUFRZ3JDLElBRWxCdzRCLEVBQU04M0QsUUFBUXR3RixLQUdsQnhXLEVBQVEwakMsUUFBUWw0RCxRQUFRZ3JDLElBRXBCdzRCLEVBQU0rM0QsUUFBUXZ3RixLQUdkeFcsRUFBUTBqQyxTQUlSN2hFLEtBQUttN0gsZUFBZXh4SCxRQUFTZzdHLElBRXpCM2tILEtBQUs4aUksaUJBQWlCbmUsR0FBVzBmLGdCQUFnQnJrSSxLQUFLNHpILFNBQ3ZENXpILE1BR1BBLEtBQUsraUksZUFBaUI0QixFQUkxQixjQUFlcmUsR0FFWEEsRUFBTTM4RyxRQUFVZzdHLElBRVosSUFBSXNhLEVBQVdqL0gsS0FBS281SCxPQUFPc0IsWUFBWS9WLEdBQ25Dd2dCLEVBQWFubEksS0FBS29sSSxnQkFBZ0J6Z0IsR0FHbEMwZ0IsRUFBbUJ2MkgsS0FBS21CLElBQUksR0FBSWpRLEtBQUtraUksVUFBVWorRyxNQUFRamtCLEtBQUtvNUgsT0FBTy9vQixXQUFXcHNGLE9BQVMsR0FDdkZxaEgsRUFBbUJ4MkgsS0FBS21CLElBQUksR0FBSWpRLEtBQUtraUksVUFBVWgrRyxPQUFTbGtCLEtBQUtvNUgsT0FBTy9vQixXQUFXbnNGLFFBQVUsR0FFekZxaEgsRUFBa0JKLEVBQVdoNkYsS0FBT25yQyxLQUFLa2lJLFVBQVUvMkYsS0FBT2s2RixFQUMxREcsRUFBa0JMLEVBQVdwZixJQUFNL2xILEtBQUtraUksVUFBVW5jLElBQU11ZixFQUV4REcsRUFBY0YsRUFBa0IsR0FBS0EsRUFBa0IsRUFDdkRHLEVBQWNGLEVBQWtCLEdBQUtBLEVBQWtCLEVBRXZERyxFQUFVNzJILEtBQUttQixJQUFJLEVBQUdzMUgsR0FDdEJLLEVBQVU5MkgsS0FBS21CLElBQUksRUFBR3UxSCxHQUV0QkssRUFBWTVHLEVBQVM1dUIsV0FBV3BzRixNQUFRd2hILEVBQ3hDSyxFQUFhN0csRUFBUzV1QixXQUFXbnNGLE9BQVN3aEgsRUFFOUMxbEksS0FBS3lpSSxLQUFLc0QsWUFBYyxPQUV4Qi9sSSxLQUFLeWlJLEtBQUt1RCxXQUFXTCxFQUFVLEdBQUtDLEVBQVUsR0FBS0MsRUFBV0MsS0FVdEUsc0JBQXVCeGYsR0FHbkIsTUFBTTJmLEVBQXFCLEdBR3JCQyxFQUFrQixDQUFDamtHLEVBQVEwaUYsS0FFN0IsTUFBTXlmLEVBQVlwa0ksS0FBSzhpSSxpQkFBaUJuZSxHQUV4Q3NoQixFQUFtQmhrRyxFQUFPMFMsS0FBTyxJQUFJb3JGLEVBQW9CLENBQ3JEcHJGLElBQUsxUyxFQUFPMFMsSUFDWndyRixZQXhSa0IsSUF5UmxCNTNILFNBQVV2SSxLQUFLc2lJLFVBQ2YzNUgsS0FBTTgySCxXQUVLei9ILEtBQUtpakksaUJBQWlCaGhHLEVBQU8wUyxLQUNwQzMwQyxLQUFLNHpILE9BQU9seEYsSUFBSVQsRUFBTzBTLElBQUs4cUYsR0FHeEIyRSxJQUFjcGtJLEtBQUs4aUksaUJBQWlCbmUsSUFFcEN5ZixFQUFVK0IscUJBQXFCLENBQUNsa0csRUFBTzBTLE1BRW5DMzBDLEtBQUtvbUksd0JBQXdCemhCLEVBQVcxaUYsSUFFeENqaUMsS0FBS3drSSxVQUtMeGtJLEtBQUtvbUksd0JBQXdCemhCLEVBQVcxaUYsSUFDeENqaUMsS0FBS3drSSxVQUdqQmpnSSxNQUFPLFlBR0l2RSxLQUFLaWpJLGlCQUFpQmhoRyxFQUFPMFMsU0FLaEQsSUFBSyxJQUFJNzNDLEVBQUksRUFBR0EsRUFBSXdwSCxFQUFNamtILE9BQVF2RixJQUNsQyxDQUNJLE1BQU02bkgsRUFBWTJCLEVBQU14cEgsR0FDbEIwL0gsRUFBUXg4SCxLQUFLMmlJLGdCQUFnQjBELHdCQUF3QnJtSSxLQUFLbzVILE9BQU9zQixZQUFZL1YsSUFBWTZYLE1BRS9GLElBQUssSUFBSWp1SCxFQUFJLEVBQUdBLEVBQUlpdUgsRUFBTW42SCxPQUFRa00sSUFDbEMsQ0FDSSxNQUFNMHpCLEVBQVN1NkYsRUFBTWp1SCxJQUNqQnZPLEtBQUs0ekgsT0FBT2hqSCxJQUFJcXhCLEVBQU8wUyxNQUFTMzBDLEtBQUtvbUksd0JBQXdCemhCLEVBQVcxaUYsS0FNeEVqaUMsS0FBS2lqSSxpQkFBaUJoaEcsRUFBTzBTLE1BRTdCc3hGLEVBQW1CaGtHLEVBQU8wUyxLQUFPMzBDLEtBQUtpakksaUJBQWlCaGhHLEVBQU8wUyxZQUN2RDMwQyxLQUFLaWpJLGlCQUFpQmhoRyxFQUFPMFMsTUFNeEN1eEYsRUFBZ0Jqa0csRUFBUTBpRixLQUloQyxJQUFLLE1BQU1od0UsS0FBTzMwQyxLQUFLaWpJLGlCQUVuQmpqSSxLQUFLaWpJLGlCQUFpQnR1RixHQUFLakIsUUFFL0IxekMsS0FBS2lqSSxpQkFBbUJnRCxFQUc1QixVQUFXdGhCLEVBQVcyaEIsRUFBWTdHLEdBRTlCLElBQUk4RyxFQUFhdm1JLEtBQUt3bUkseUJBQXlCN2hCLEVBQVcyaEIsR0FHdERqQixFQUFtQnYySCxLQUFLbUIsSUFBSSxHQUFJalEsS0FBS2tpSSxVQUFVaitHLE1BQVFqa0IsS0FBS281SCxPQUFPL29CLFdBQVdwc0YsT0FBUyxHQUN2RnFoSCxFQUFtQngySCxLQUFLbUIsSUFBSSxHQUFJalEsS0FBS2tpSSxVQUFVaCtHLE9BQVNsa0IsS0FBS281SCxPQUFPL29CLFdBQVduc0YsUUFBVSxHQUV6RnFoSCxFQUFrQmdCLEVBQVdwN0YsS0FBT25yQyxLQUFLa2lJLFVBQVUvMkYsS0FBT2s2RixFQUMxREcsRUFBa0JlLEVBQVd4Z0IsSUFBTS9sSCxLQUFLa2lJLFVBQVVuYyxJQUFNdWYsRUFFeERHLEVBQWNGLEVBQWtCLEdBQUtBLEVBQWtCLEVBQ3ZERyxFQUFjRixFQUFrQixHQUFLQSxFQUFrQixFQUV2REcsRUFBVTcySCxLQUFLbUIsSUFBSSxFQUFHczFILEdBQ3RCSyxFQUFVOTJILEtBQUttQixJQUFJLEVBQUd1MUgsR0FFdEJpQixFQUFnQmhCLEVBQWNhLEVBQVc5TixXQUN6Q2tPLEVBQWdCaEIsRUFBY1ksRUFBVzlOLFdBSXpDbU8sRUFBZTczSCxLQUFLa0IsSUFBSXMySCxFQUFXajJCLFdBQVdwc0YsTUFBT3c3RyxFQUFJeDdHLE1BQVFxaUgsRUFBVzlOLFlBQWNpTixFQUMxRm1CLEVBQWdCOTNILEtBQUtrQixJQUFJczJILEVBQVdqMkIsV0FBV25zRixPQUFRdTdHLEVBQUl2N0csT0FBU29pSCxFQUFXOU4sWUFBY2tOLEVBRTdGRyxFQUFZLzJILEtBQUttQixJQUFJLEVBQUduQixLQUFLNEssTUFBTWl0SCxJQUNuQ2IsRUFBYWgzSCxLQUFLbUIsSUFBSSxFQUFHbkIsS0FBSzRLLE1BQU1rdEgsSUFFcENDLEVBQWNoQixFQUFZUyxFQUFXOU4sV0FDckNzTyxFQUFlaEIsRUFBYVEsRUFBVzlOLFdBRTNDeDRILEtBQUt5aUksS0FBS3NFLFVBQ050SCxFQUNBZ0gsRUFBZUMsRUFDZkcsRUFBYUMsRUFDYm5CLEVBQVNDLEVBQ1RDLEVBQVdDLEdBR25CLHdCQUF5Qm5oQixFQUFXcWlCLEdBRWhDLE9BQU9obkksS0FBSytrSSxlQUFlcGdCLEVBQVdtZ0IsRUFBb0JrQyxFQUFZaG5JLEtBQUs2aUksYUFHL0UsZUFBZ0JsZSxFQUFXMmhCLEdBRXZCLE1BQU1DLEVBQWF2bUksS0FBS3dtSSx5QkFBeUI3aEIsRUFBVzJoQixHQUc1RCxPQUFPdG1JLEtBQUtraUksVUFBVTZCLGlCQUFpQixDQUNuQ2hlLElBQUt3Z0IsRUFBV3hnQixJQUNoQjhVLE9BQVEwTCxFQUFXeGdCLElBQU11Z0IsRUFBV2oyQixXQUFXbnNGLE9BQy9DaW5CLEtBQU1vN0YsRUFBV3A3RixLQUNqQkMsTUFBT203RixFQUFXcDdGLEtBQU9tN0YsRUFBV2oyQixXQUFXcHNGLFFBSXZELHlCQUEwQjBnRyxFQUFXMmhCLEdBRWpDLE1BQU01TSxFQUFjMTVILEtBQUtvbEksZ0JBQWdCemdCLEdBRXpDLE1BQU8sQ0FDSG9CLElBQUsyVCxFQUFZM1QsSUFBTXVnQixFQUFXdndILE9BQU9nd0csSUFDekM1NkUsS0FBTXV1RixFQUFZdnVGLEtBQU9tN0YsRUFBV3Z3SCxPQUFPbzFCLE1BSW5ELGdCQUFpQnc1RSxHQUViLE9BQU8za0gsS0FBS281SCxPQUFPTyxjQUFjaFYsRUFBVyxDQUFDZSxnQkFBZ0IsSUFJakUsS0FBTWYsRUFBV2dVLEVBQWdCRCxHQUU3QjE0SCxLQUFLcWpJLGtCQUNMcmpJLEtBQUswakksTUFBTS9lLEVBQVdnVSxFQUFnQkQsR0FFbEMxNEgsS0FBS3VpSSxPQUFPc0IsaUJBRVo3akksS0FBS3VpSSxPQUFPc0IsZ0JBQWdCN2pJLEtBQUttN0gsZUFBZXo2SCxRQUFTaWtILEdBSWpFLE1BQU9BLEVBQVdnVSxFQUFnQkQsR0FHOUIsTUFBTXlNLEVBQWFubEksS0FBS281SCxPQUFPTyxjQUFjaFYsR0FHdkNvQixFQUR3Qm9mLEVBQVdwZixJQUFNNFMsRUFDWDdwSCxLQUFLNEssTUFBTTFaLEtBQUtraUksVUFBVWgrRyxPQUFTLEdBR2pFaW5CLEVBRDBCZzZGLEVBQVdoNkYsS0FBT3V0RixFQUNYNXBILEtBQUs0SyxNQUFNMVosS0FBS2tpSSxVQUFVaitHLE1BQVEsR0FFekVqa0IsS0FBS2tpSSxVQUFVbmMsSUFBTUEsRUFDckIvbEgsS0FBS2tpSSxVQUFVLzJGLEtBQU9BLEVBRXRCbnJDLEtBQUs0akksVUFHVCwyQkFBNEIxcEgsR0FFeEJsYSxLQUFLcWpJLGtCQUVMLE1BQU00RCxFQUFjL3NILEVBQVErc0gsWUFDdEJDLEVBQXNCbG5JLEtBQUt1aUksT0FBTzJFLG9CQUV4Q2xuSSxLQUFLZ2pJLFdBQWEsRUFBcUJsQyxRQUFRLENBQzNDRSxTQUFVOW1ILEVBQVE4bUgsU0FDbEJDLFdBQVkvbUgsRUFBUSttSCxXQUNwQkMsU0FBV253SCxJQUVQL1EsS0FBS21uSSxxQkFBcUJGLEVBQVlsMkgsSUFDdEMvUSxLQUFLdWlJLE9BQU82RSxzQkFBc0JyMkgsRUFBTzhtSCxXQUVyQ3FQLEdBRUFBLEtBR1IvRixNQUFRai9HLElBRUFoSSxFQUFRaW5ILE9BRVJqbkgsRUFBUWluSCxNQUFNai9HLEdBR2RsaUIsS0FBS3VpSSxPQUFPc0Isa0JBQW9CM2hILEVBQUswL0csYUFFckM1aEksS0FBS3VpSSxPQUFPc0IsZ0JBQWdCN2pJLEtBQUttN0gsZUFBZXo2SCxRQUFTLFNBTXpFLGtCQUVRVixLQUFLZ2pJLGFBRUxoakksS0FBS2dqSSxXQUFXdjRGLFNBQ2hCenFDLEtBQUtnakksV0FBYSxNQUkxQixjQUFlcmUsR0FFWCxJQUFLM2tILEtBQUtvNUgsT0FFTixPQUFPLEVBS1gsUUFGYXA1SCxLQUFLbzVILE9BQU9zQixZQUFZL1YsSUFPOUIza0gsS0FBS2tpSSxVQUFVNkIsaUJBQWlCL2pJLEtBQUtvNUgsT0FBTzNULGNBQWNkLElBR3JFLG1CQUVJLE9BQU8za0gsS0FBS203SCxlQUFlejZILFFBRy9CLFVBRUlWLEtBQUtxakksa0JBR0w3bEksT0FBT2lJLEtBQUt6RixLQUFLaWpJLGtCQUFrQnQ1SCxRQUFTeTJCLElBRXhDLE1BQU12L0IsRUFBVWIsS0FBS2lqSSxpQkFBaUI3aUcsVUFDL0JwZ0MsS0FBS2lqSSxpQkFBaUI3aUcsR0FFN0J2L0IsRUFBUTZ5QyxTQUNUMXpDLE1BRUhBLEtBQUt3aUksUUFBUXgrRyxXQUFXKzdFLFlBQVkvL0YsS0FBS3dpSSxVQUlqRCxTQUFTc0MsRUFBcUI3aUcsRUFBUW9sRyxHQUVsQyxJQUFJN08sRUFXSixPQVBJQSxFQUZnQixPQUFoQjZPLEVBRWEsRUFJQXY0SCxLQUFLaXpHLElBQUksRUFBR3NsQixFQUFjcGxHLEVBQU80MUYsV0FHM0MsQ0FDSHlQLGdCQUFpQnJsRyxFQUFPNDFGLFVBQ3hCVyxXQUFZQSxFQUNaL25GLElBQUt4TyxFQUFPd08sSUFDWnlyRixJQUFLajZGLEVBQU9pNkYsSUFDWjdyQixXQUFZLENBQ1Jwc0YsTUFBT2dlLEVBQU9vdUUsV0FBV3BzRixNQUFRdTBHLEVBQ2pDdDBHLE9BQVErZCxFQUFPb3VFLFdBQVduc0YsT0FBU3MwRyxHQUV2Q3ppSCxPQUFRLENBQ0pvMUIsS0FBTWxKLEVBQU9sc0IsT0FBT28xQixLQUFPcXRGLEVBQzNCelMsSUFBSzlqRixFQUFPbHNCLE9BQU9nd0csSUFBTXlTLEdBRTdCN2pGLElBQUsxUyxFQUFPMFMsS0FJcEIsU0FBUzR2RixFQUFhMTZDLEVBQVUwOUMsR0FFNUIsR0FBSTE5QyxJQUFhMDlDLEVBRWIsTUFBTyxDQUNIN0MsTUFBTyxHQUNQN2lFLFFBQVMsSUFJakIsTUFBTUEsRUFBVWdvQixFQUFTNzZFLE9BQU93NEgsSUFBNEMsSUFBaENELEVBQVMzNEgsUUFBUTQ0SCxJQUk3RCxNQUFPLENBQ0g5QyxNQUhVNkMsRUFBU3Y0SCxPQUFPeTRILElBQTRDLElBQWhDNTlDLEVBQVNqN0UsUUFBUTY0SCxJQUl2RDVsRSxRQUFTQSxHQ3RrQkYsU0FBUzQzRCxFQUFtQjlVLEVBQVc1TyxHQUVsRCxNQUFNeWpCLEVBQU96akIsRUFBUzJ4QixxQkFBcUIvaUIsR0FFM0MsTUFBTyxDQUNIMWdHLE1BQU9uVixLQUFLc3VELE1BQU1vOEQsRUFBS3YxRyxPQUN2QkMsT0FBUXBWLEtBQUtzdUQsTUFBTW84RCxFQUFLdDFHLFNDSmpCLFNBQVN5akgsRUFBcUJDLEdBSXpDLE9BR0osU0FBc0JBLEdBRWxCLE1BQU03eEIsRUFBVzZ4QixFQUFhN3hCLFNBRXhCOHhCLEVBQWUsR0FDckIsSUFBSUMsRUFBVyxLQUNYQyxFQUFnQixHQUVwQixNQUFNQyxFQUFvQixLQUV0QixJQUFLLElBQUlsckksRUFBSSxFQUFHbXJJLEVBQU9GLEVBQWMxbEksT0FBUXZGLEVBQUltckksRUFBTW5ySSxJQUVuRCtxSSxFQUFhemxJLEtBQUssQ0FBRTJsSSxFQUFjanJJLEtBRXRDaXJJLEVBQWdCLElBR3BCaHlCLEVBQVN1USxNQUFNMzhHLFFBQVMsQ0FBQ2s3RyxFQUFNei9HLEtBRTNCLE1BQU04aUksRUFBYSxDQUNmOWlJLE1BQU9BLEVBQ1BpckcsV0FBWW9wQixFQUFrQnIwSCxFQUFPMndHLEdBQ3JDb3lCLE9BQVNweUIsRUFBU295QixPQUFTdGpCLEVBQUtzakIsUUFJL0JQLEVBQWFRLG1CQUFzQkYsRUFBV0MsU0FHOUNELEVBQVdDLE1BSUcsSUFBVi9pSSxHQUFleS9HLEVBQUt3akIsYUFHekJSLEVBQWF6bEksS0FBSyxDQUFDOGxJLElBQ25CRixLQUVrQixPQUFiRixFQUVMQSxFQUFXSSxHQUlYTCxFQUFhemxJLEtBQUssQ0FBQzBsSSxFQUFVSSxJQUM3QkosRUFBVyxLQUNYRSxLQWhCQUQsRUFBYzNsSSxLQUFLOGxJLE1BcUJWLE9BQWJKLElBRUFELEVBQWF6bEksS0FBSyxDQUFDMGxJLElBQ25CRSxLQUdKLE9BQU9ILEVBL0RXUyxDQUFhVixHQUVkOTNILElBQUlXLEdBZ0V6QixTQUF5Q20zSCxFQUFjbjNILEdBRW5ELE1BQU02dEgsRUFBcUJzSixFQUFhdEosbUJBRXhDLEdBQXdCLElBQXBCN3RILEVBQVNwTyxPQUNULE9Bb0NSLFNBQTRCeWxJLEVBQVVTLEVBQVdqSyxHQUU3QyxNQUFNa0ssRUFBV1YsRUFBU3ozQixXQUNwQm80QixFQUFZRixFQUFVbDRCLFdBRXRCbnNGLEVBQVNwVixLQUFLbUIsSUFBSXU0SCxFQUFTdGtILE9BQVF1a0gsRUFBVXZrSCxRQUVuRCxJQUFJRCxFQUFPeWtILEVBQWlCQyxFQUU1QixHQUFJckssRUFDSixDQUNJLE1BQU1zSyxFQUFXOTVILEtBQUttQixJQUFJdTRILEVBQVN2a0gsTUFBT3drSCxFQUFVeGtILE9BRXBEQSxFQUFtQixFQUFYMmtILEVBRVJGLEVBQWtCRSxFQUFXSixFQUFTdmtILE1BQ3RDMGtILEVBQW1CQyxPQUluQjNrSCxFQUFRdWtILEVBQVN2a0gsTUFBUXdrSCxFQUFVeGtILE1BQ25DeWtILEVBQWtCLEVBQ2xCQyxFQUFtQkgsRUFBU3ZrSCxNQUdoQyxNQUFPLENBQ0hvc0YsV0FBWSxDQUNSbnNGLE9BQVFBLEVBQ1JELE1BQU9BLEdBRVhxaUcsTUFBTyxDQUNILENBQ0lsaEgsTUFBTzBpSSxFQUFTMWlJLE1BQ2hCaXJHLFdBQVltNEIsRUFDWnhLLFlBQWEsQ0FDVGpZLElBQUssRUFDTDU2RSxLQUFNdTlGLElBR2QsQ0FDSXRqSSxNQUFPbWpJLEVBQVVuakksTUFDakJpckcsV0FBWW80QixFQUNaekssWUFBYSxDQUNUalksSUFBSyxFQUNMNTZFLEtBQU13OUYsTUFoRlhFLENBQW1CcDRILEVBQVMsR0FBSUEsRUFBUyxHQUFJNnRILEdBRXhELE1BQU16WixFQUFPcDBHLEVBQVMsR0FDaEJxNEgsRUFBV2prQixFQUFLeFUsV0FNdEIsSUFBSTA0QixFQUVBQSxFQURBbGtCLEVBQUtzakIsTUFDd0IsSUFBZnRqQixFQUFLei9HLE9BQWVrNUgsRUFBc0J3SyxFQUFTN2tILE1BQVEsRUFFNUQsRUFBdUI2a0gsRUFBUzdrSCxNQUFRLEVBQUksRUFFN0QsTUFBTStrSCxFQUNGMUssSUFBdUJzSixFQUFhN3hCLFNBQVN1USxNQUFNekIsRUFBS3ovRyxPQUFPaWpJLFlBSW5FLE1BQU8sQ0FDSGg0QixXQUFZLENBQ1Juc0YsT0FBUTRrSCxFQUFTNWtILE9BQ2pCRCxNQUFPK2tILEVBQWdELEVBQWpCRixFQUFTN2tILE1BQVk2a0gsRUFBUzdrSCxPQUV4RXFpRyxNQUFPLENBQUMsQ0FDSmxoSCxNQUFPeS9HLEVBQUt6L0csTUFDWjQ0SCxZQUFhLENBQ1RqWSxJQUFLLEVBQ0w1NkUsS0FBTTQ5RixHQUVWMTRCLFdBQVl5NEIsS0FwR2FHLENBQWdDckIsRUFBY24zSCxJQ0xwRSxTQUFTeTRILEVBQXFCdEIsR0FFekMsTUFBTXVCLEVBQWdCdkIsRUFBYXJQLFNBQVN0MEcsTUFDdEM4eEYsRUFBVzZ4QixFQUFhN3hCLFNBQ3hCcXpCLEVBQWN4QixFQUFhd0IsWUFDM0JDLEVBQWtCekIsRUFBYXlCLGdCQUMvQkMsRUFBZTFCLEVBQWEwQixhQUM1QmxCLEVBQW9CUixFQUFhUSxrQkFHakNtQixHQUFhSixFQURPRyxHQUFnQkYsRUFBYyxJQUNBQSxFQUNsREksRUFBZ0JELEVBR2hCRSxFQUFZLEVBQW9CSCxFQUFldnpCLEVBQVMyekIsU0FBV0gsRUFBWUQsRUFBZXZ6QixFQUFTNHpCLFNBQVdKLEVBRWxIejRILEVBQVMsR0FDZixJQUFJODRILEVBQWUsR0FFbkIsTUEwQk1DLEVBQWdCLENBQ2xCM2xILE9BQVF1bEgsRUFDUnhsSCxNQUFPa2xILEdBK0NYLE9BNUNBcHpCLEVBQVN1USxNQUFNMzhHLFFBQVMsQ0FBQ2s3RyxFQUFNRixLQUUzQixJQUFLeWpCLEdBQXFCcnlCLEVBQVNveUIsUUFBVXRqQixFQUFLc2pCLE1BQzlDLE9BR0osTUFBTTJCLEVBckNvQkMsS0FJMUIsTUFBTUMsRUFBZ0JELEVBQVMzc0ksRUFBRTJzSSxFQUFTM3NJLEVBQUVpRixPQUFTLEdBQy9DNG5JLEVBQXFCRCxFQUFjbjJGLEVBQUltMkYsRUFBY3puSSxFQUUzRCxJQUFJZ25JLEVBQVdXLEVBYWYsT0FYSWIsR0FFQUUsR0FBYUUsRUFBWUgsR0FBZ0JXLEVBQ3pDQyxFQUFhVCxFQUFZSCxJQUl6QkMsRUFBWUMsRUFDWlUsRUFBYVgsRUFBWVUsR0FHdEIsQ0FDSGhtSCxNQUFPblYsS0FBSzRLLE1BQU02dkgsR0FDbEJybEgsT0FBUXBWLEtBQUs0SyxNQUFNd3dILEtBZUpDLENBQXNCdGxCLEdBQ3pDLElBQUlra0IsRUFBYWo2SCxLQUFLc3VELE1BQU13c0UsRUFBYXZuSSxRQUFVaW5JLEVBQWVFLEdBQWlCRixHQUcvRUQsSUFFQU4sSUFBZVMsRUFBZ0JNLEVBQVc3bEgsT0FBUyxHQUl2RDJsSCxFQUFheG5JLEtBQUssQ0FDZGdELE1BQU91L0csRUFDUHRVLFdBQVl5NUIsRUFDWjlMLFlBQWEsQ0FDVGpZLElBQUssRUFDTDU2RSxLQUFNNDlGLEtBSVZhLEVBQWF2bkksU0FBVyttSSxJQUV4QnQ0SCxFQUFPMU8sS0FBSyxDQUNSaXVHLFdBQVl3NUIsRUFDWnZqQixNQUFPc2pCLElBR1hBLEVBQWUsTUFJbkJBLEVBQWF2bkksT0FBUyxHQUV0QnlPLEVBQU8xTyxLQUFLLENBQ1JpdUcsV0FBWXc1QixFQUNadmpCLE1BQU9zakIsSUFJUjk0SCxFQzFGSSxTQUFTczVILEVBQWdCN2hJLEdBRXBDLEdBQUlBLEVBQVNreUgsT0FFVCxPQUFPeU8sRUFBb0JtQixFQUFNOWhJLEVBQVUsQ0FDdkMsV0FDQSxXQUNBLGNBQ0Esa0JBQ0EsZUFDQSx1QkFJUixDQUNJLE1BQU1vMUgsRUFBUzBNLEVBQU05aEksRUFBVSxDQUFDLFdBQVkscUJBQXNCLHNCQUVsRSxPQUFJQSxFQUFTK2hJLGFBQ0YzQyxFQUFvQmhLLEdDckJ4QixTQUFpQ2lLLEdBRTVDLE1BQU03eEIsRUFBVzZ4QixFQUFhN3hCLFNBR3hCdVEsRUFBUSxHQWtCZCxPQWpCQXZRLEVBQVN1USxNQUFNMzhHLFFBQVMsQ0FBQ2s3RyxFQUFNei9HLEtBRTNCLElBQUt3aUksRUFBYVEsbUJBQXFCcnlCLEVBQVNveUIsUUFBVXRqQixFQUFLc2pCLE1BQzNELE9BRUosTUFBTVcsRUFBV3JQLEVBQWtCcjBILEVBQU8yd0csR0FFMUN1USxFQUFNbGtILEtBQUssQ0FDUGl1RyxXQUFZeTRCLEVBQ1p4aUIsTUFBTyxDQUFDLENBQ0psaEgsTUFBT0EsRUFDUDQ0SCxZQUFhLENBQUVqWSxJQUFLLEVBQUc1NkUsS0FBTSxHQUM3QmtsRSxXQUFZeTRCLFFBS2pCeGlCLEVEQVFpa0IsQ0FBdUI1TSxJQUkxQyxTQUFTME0sRUFBTzM4RyxFQUFLam9CLEdBRWpCLE1BQU11OEQsRUFBTSxHQUtaLE9BSkF2OEQsRUFBS2tFLFNBQVEsU0FBVXRMLEdBRW5CMmpFLEVBQUkzakUsR0FBT3F2QixFQUFJcnZCLE1BRVoyakUsRUVuQ0ksU0FBU3dvRSxFQUFtQnZtRCxHQUV2QyxNQUFNdjJELEVBQU0sR0FPWixPQUxBdTJELEVBQVF0NkUsUUFBVXM0QixLQVF0QixTQUF1QnZVLEVBQUt1a0UsR0FFeEJ6MEYsT0FBT2lJLEtBQUt3c0YsR0FBT3RvRixRQUFVdEwsSUFFekJiLE9BQU9DLGVBQWVpd0IsRUFBS3J2QixFQUFLLENBQzVCVixJQUFLLElBRU1zMEYsRUFBTTV6RixHQUVqQjRGLElBQUssS0FHRCxNQUFNLElBQUl6QyxVQUFVLHVCQUF5Qm5ELFFBbEJyRG9zSSxDQUFjLzhHLEVBQUt1VSxLQUdoQnZVLEVDVkksTUFBTWc5RyxFQUVqQixZQUFheHdILEdBRVRsYSxLQUFLMnFJLGdCQUFrQnp3SCxFQUFReXdILGlCQUFtQixHQUNsRDNxSSxLQUFLa2xHLHFCQUF1QmhyRixFQUFRZ3JGLHNCQUF3QixHQUM1RGxsRyxLQUFLNHFJLFlBQWMxd0gsRUFBUTB3SCxZQUcvQixRQUFTdnNJLEVBQUtOLEVBQU93SyxHQUdqQixJQUFJc2lJLEVBQWtCLEtBYXRCLEdBWEE3cUksS0FBSzRxSSxZQUFZL3dGLEtBQUssQ0FBQ2l4RixFQUFZMWxJLElBRTNCMGxJLEVBQVd6c0ksTUFBUUEsSUFLdkJ3c0ksRUFBa0J6bEksR0FDWCxJQUdhLE9BQXBCeWxJLEVBRUEsT0FBTyxFQUlYLE1BQU1FLEVBQWUsR0FDckJBLEVBQWExc0ksR0FBT04sRUFDcEIsTUFBTWl0SSxFQUFVQyxFQUFzQjFpSSxFQUFVd2lJLEVBQWMvcUksTUFFOUQsT0FBUUEsS0FBS2tySSxlQUFlTCxFQUFpQjlzSSxFQUFPaXRJLEdBR3hELFNBQVV6aUksR0FFTnZJLEtBQUttckksaUJBQWlCLEdBQUk1aUksR0FHOUIsb0JBQXFCQSxFQUFVMlIsR0FFM0IsTUFBTWt4SCxFQUFTNXRJLE9BQU9taEMsT0FBTyxHQUFJemtCLEdBRWpDLE9BREFsYSxLQUFLbXJJLGlCQUFpQjVpSSxFQUFVNmlJLEdBQ3pCQSxFQUdYLGlCQUFrQjdpSSxFQUFVMlIsR0FFeEIsTUFBTW14SCxFQUFrQkosRUFBc0IxaUksRUFBVTJSLEVBQVNsYSxNQUNqRUEsS0FBS3NySSxrQkFBa0JweEgsRUFBU214SCxHQUdwQyxrQkFBbUJueEgsRUFBUzh3SCxHQUV4QmhySSxLQUFLNHFJLFlBQVlqaEksUUFBUSxDQUFDbWhJLEVBQVkxbEksS0FFbEMsSUFBSzhVLEVBQVF2YixlQUFlbXNJLEVBQVd6c0ksS0FFbkMsT0FHSixNQUFNa3RCLEVBQVFyUixFQUFRNHdILEVBQVd6c0ksS0FDM0JrdEksRUFBWXZySSxLQUFLa3JJLGVBQWU5bEksRUFBT21tQixFQUFPeS9HLEdBRWhETyxJQUVLQSxFQUFVQyxtQkE2Ri9CLFNBQXNCbnRJLEVBQUtvdEksRUFBVUYsR0FFakM1b0ksUUFBUUMsS0FBSyxxQkFBdUJ2RSxFQUFNLEtBQU9vdEksRUFBVyxXQUFhRixFQUFZLGFBN0ZyRUcsQ0FBWVosRUFBV3pzSSxJQUFLa3RCLEVBQU9nZ0gsRUFBVXh0SSxPQUdqRG1jLEVBQVE0d0gsRUFBV3pzSSxLQUFPa3RJLEVBQVV4dEksUUFFekNpQyxNQUdQLGVBQWdCb0YsRUFBT21tQixFQUFPeS9HLEdBRTFCLE1BQU1GLEVBQWE5cUksS0FBSzRxSSxZQUFZeGxJLEdBRXBDNGxJLEVBQVE1bEksTUFBUUEsRUFFaEIsSUFBSW9tSSxHQUFvQixFQUN4QixNQUFNN04sRUFBUyxDQUNYZ08sZ0JBQWlCLEtBRWJILEdBQW9CLElBSXRCSSxFQUFjZCxFQUFXLzlGLFNBQVN4aEIsRUFBT3kvRyxFQUFRYSxNQUFPbE8sR0FFOUQsWUFBb0J6OEgsSUFBaEIwcUksR0FBNkJBLElBQWdCcmdILEVBRXRDLEtBR0osQ0FDSHh0QixNQUFPNnRJLEVBQ1BKLGtCQUFtQkEsSUFjL0IsU0FBU1AsRUFBdUIxaUksRUFBVTJSLEVBQVM0eEgsR0FFL0MsTUFBTWQsRUFBVSxDQUNaYSxNQUFPLEdBQ1B6bUksTUFBTyxNQUdMMm1JLEVBQVNDLEVBQVkxdEksS0FBSyxLQUFNaUssRUFBVTJSLEdBRTFDZ3BCLEVBQWEsR0FrQ25CLE9BaENBNG9HLEVBQU9uQixnQkFBZ0JoaEksUUFBU3NpSSxJQUU1Qi9vRyxFQUFXK29HLEdBQWUsQ0FDdEJ0dUksSUFBS291SSxFQUFPenRJLEtBQUssS0FBTTJ0SSxNQUkvQkgsRUFBTzVtQyxxQkFBcUJ2N0YsUUFBU3VpSSxJQUVqQ2hwRyxFQUFXZ3BHLEVBQVc3dEksS0FBTyxDQUN6QlYsSUFBS3V1SSxFQUFXdnVJLE9BSXhCbXVJLEVBQU9sQixZQUFZamhJLFFBQVMsQ0FBQ21oSSxFQUFZRCxLQUVyQzNuRyxFQUFXNG5HLEVBQVd6c0ksS0FBTyxDQUN6QlYsSUFBSyxLQUVELEdBQUlrdEksRUFBa0JHLEVBQVE1bEksTUFFMUIsT0FBTzJtSSxFQUFPakIsRUFBV3pzSSxLQUc3QixNQUFNOHRJLEVBQWFMLEVBQU9sQixZQUFZSSxFQUFRNWxJLE9BQU8vRyxJQUNyRCxNQUFNLElBQUltRCxVQUFVLHlCQUEyQnNwSSxFQUFXenNJLElBQU0scUJBQXVCOHRJLE9BS25HM3VJLE9BQU80dUksaUJBQWlCcEIsRUFBUWEsTUFBTzNvRyxHQUVoQzhuRyxFQVFYLFNBQVNnQixFQUFhOWdILEVBQU1taEgsRUFBV2h1SSxHQUVuQyxPQUFJQSxLQUFPZ3VJLEVBRUFBLEVBQVVodUksR0FHZDZzQixFQUFLN3NCLEdDL0tELE1BQU1pdUksRUFFakIsWUFBYXowRCxFQUFPMzlELEdBRWhCQSxFQUFVQSxHQUFXLEdBRXJCbGEsS0FBS2c2SCxzQkFBd0I5L0csRUFBUTgvRyx1QkFBeUIsRUFDOURoNkgsS0FBSzYzRSxNQUFRQSxFQUNiNzNFLEtBQUt1c0ksS0FBT3ZzSSxLQUFLd3NJLE1BQVF4c0ksS0FBS3lzSSxPQUFTenNJLEtBQUswc0ksUUFBVTFzSSxLQUFLMnNJLGlCQUFtQixLQUU5RTNzSSxLQUFLNHNJLGFBR1QsaUJBQWtCaFMsR0FFZCxPQUFPNTZILEtBQUs2c0kscUJBQXFCalMsSUFBVzU2SCxLQUFLOHNJLG1CQUFtQmxTLEdBR3hFLG1CQUFvQkEsR0FFaEIsTUFBTTdVLEVBQU0vbEgsS0FBSytsSCxJQUFNL2xILEtBQUtnNkgsc0JBQ3RCYSxFQUFTNzZILEtBQUs2NkgsT0FBUzc2SCxLQUFLZzZILHNCQUVsQyxPQUNJK1MsRUFBYW5TLEVBQU83VSxJQUFLQSxFQUFLOFUsSUFDOUJrUyxFQUFhblMsRUFBT0MsT0FBUTlVLEVBQUs4VSxJQUNoQ0QsRUFBTzdVLEtBQU9BLEdBQU82VSxFQUFPQyxRQUFVQSxFQUkvQyxxQkFBc0JELEdBRWxCLE1BQU16dkYsRUFBT25yQyxLQUFLbXJDLEtBQU9uckMsS0FBS2c2SCxzQkFDeEI1dUYsRUFBUXByQyxLQUFLb3JDLE1BQVFwckMsS0FBS2c2SCxzQkFFaEMsT0FDSStTLEVBQWFuUyxFQUFPenZGLEtBQU1BLEVBQU1DLElBQ2hDMmhHLEVBQWFuUyxFQUFPeHZGLE1BQU9ELEVBQU1DLElBQ2hDd3ZGLEVBQU96dkYsTUFBUUEsR0FBUXl2RixFQUFPeHZGLE9BQVNBLEVBSWhELGFBR0lwckMsS0FBS3lzSSxPQUFTenNJLEtBQUs2M0UsTUFBTTYvQyxZQUN6QjEzSCxLQUFLMHNJLFFBQVUxc0ksS0FBSzYzRSxNQUFNbTFELGFBRTFCaHRJLEtBQUt1c0ksS0FBT3ZzSSxLQUFLNjNFLE1BQU0weUMsVUFDdkJ2cUgsS0FBS3dzSSxNQUFReHNJLEtBQUs2M0UsTUFBTXl5QyxXQUc1QixtQkFBb0JqYSxHQUVoQnJ3RyxLQUFLMnNJLGlCQUFtQnQ4QixFQUVwQkEsSUFFQXJ3RyxLQUFLdXNJLEtBQU96bUgsRUFBTTlsQixLQUFLdXNJLEtBQU0sRUFBR2w4QixFQUFXbnNGLE9BQVNsa0IsS0FBSzBzSSxTQUN6RDFzSSxLQUFLd3NJLE1BQVExbUgsRUFBTTlsQixLQUFLd3NJLE1BQU8sRUFBR244QixFQUFXcHNGLE1BQVFqa0IsS0FBS3lzSSxVQTBCdEUsU0FBU1EsRUFBeUJ4OEIsRUFBT3k4QixHQUVyQyxNQUFNQyxFQUFjLElBQU0xOEIsRUFDcEJ4dUUsRUFBUyxTQUFXd3VFLEVBQU1qK0QsT0FBTyxHQUFHbDdCLGNBQWdCbTVGLEVBQU0vdkcsTUFBTSxHQUV0RSxNQUFPLENBQ0gvQyxJQUFLLFdBRUQsT0FBT3FDLEtBQUttdEksSUFFaEJscEksSUFBSyxTQUFVaTZFLEdBRVgsSUFBSTM4QyxFQUVKLEdBQUl2aEMsS0FBSzJzSSxpQkFDVCxDQUVJcHJHLEVBQWF6YixFQUFNbzRELEVBQVUsRUFEVmwrRSxLQUFLMnNJLGlCQUFpQk8sR0FBdUJsdEksS0FBS2t0SSxTQUtyRTNyRyxFQUFhNnJHLEVBQVNsdkQsRUFBVSxHQUdwQ2wrRSxLQUFLbXRJLEdBQWVudEksS0FBSzYzRSxNQUFNNTFDLEdBQVVWLElBS3JELFNBQVM4ckcsRUFBd0JDLEdBRTdCLE1BQU8sQ0FDSDN2SSxJQUFLLFdBRUQsT0FBT3FDLEtBQUssSUFBTXN0SSxLQUs5QixTQUFTUCxFQUFjMzFHLEVBQU8yTixFQUFPemUsR0FFakMsT0FBTzhRLEdBQVMyTixHQUFTM04sR0FBUzlRLEVBR3RDLFNBQVNSLEVBQU8vbkIsRUFBT2lTLEVBQUtDLEdBRXhCLE9BQU9tOUgsRUFRWCxTQUFtQnJ2SSxFQUFPa1MsR0FFdEIsT0FBT25CLEtBQUtrQixJQUFJalMsRUFBT2tTLEdBVlBzOUgsQ0FBU3h2SSxFQUFPa1MsR0FBTUQsR0FHMUMsU0FBU285SCxFQUFVcnZJLEVBQU9pUyxHQUV0QixPQUFPbEIsS0FBS21CLElBQUlsUyxFQUFPaVMsR0F4RTNCeFMsT0FBTzR1SSxpQkFBaUJFLEVBQVM1dEksVUFBVyxDQUN4Q3FuSCxJQUFLa25CLEVBQXdCLE1BQU8sVUFDcEM5aEcsS0FBTThoRyxFQUF3QixPQUFRLFNBRXRDaHBILE1BQU9vcEgsRUFBdUIsU0FDOUJucEgsT0FBUW1wSCxFQUF1QixVQUUvQnhTLE9BQVEsQ0FDSmw5SCxJQUFLLFdBRUQsT0FBT3FDLEtBQUt1c0ksS0FBT3ZzSSxLQUFLMHNJLFVBR2hDdGhHLE1BQU8sQ0FDSHp0QyxJQUFLLFdBRUQsT0FBT3FDLEtBQUt3c0ksTUFBUXhzSSxLQUFLeXNJLFdDbkVyQyxNQUFNLEVBQVEsRUFBUSxHQUFSLENBQWlCLG1CQUUvQixTQUFTZSxJQUNMLE9BQU9BLEVBQVdqdkIsVUFFdEJpdkIsRUFBV2p2QixRQUFVLEVBSXJCLE1BQU1rdkIsRUFBcUIsQ0FDdkIsQ0FDSXB2SSxJQUFLLGVBQ0wwdUMsU0FBVSxDQUFDaHZDLEVBQU93SyxLQUVkLEdBQUl4SyxFQUFRLEdBQUtBLEdBQVN3SyxFQUFTd3RHLFNBQVN1USxNQUFNamtILE9BQzlDLE9BQU8sSUFHbkIsQ0FDSWhFLElBQUssaUJBQ0wwdUMsU0FBV2h2QyxHQUVBK1EsS0FBS21CLElBQUksRUFBR2xTLElBRzNCLENBQ0lNLElBQUssaUJBQ0wwdUMsU0FBVSxDQUFDaHZDLEVBQU93SyxJQUVQdUcsS0FBS21CLElBQUlsUyxFQUFPd0ssRUFBU21sSSxpQkFHeEMsQ0FDSXJ2SSxJQUFLLGNBQ0wwdUMsU0FBVSxDQUFDaHZDLEVBQU93SyxLQUdkLEdBQUl4SyxFQUFRd0ssRUFBU21sSSxnQkFBa0IzdkksRUFBUXdLLEVBQVNvbEksZUFDcEQsT0FBT3BsSSxFQUFTb2xJLGlCQUc1QixDQUNJdHZJLElBQUssZUFDTDB1QyxTQUFVLENBQUNodkMsRUFBT3dLLEVBQVVvMUgsS0FNeEIsR0FGQUEsRUFBT2dPLGtCQUVINXRJLEVBQVEsR0FBS0EsRUFBUXdLLEVBQVN3dEcsU0FBUzYzQixRQUN2QyxPQUFPcmxJLEVBQVN3dEcsU0FBUzYzQixVQUdyQyxDQUNJdnZJLElBQUssZUFDTDB1QyxTQUFVLENBQUNodkMsRUFBT3dLLEVBQVVvMUgsSUFJcEI1L0gsRUFBUXdLLEVBQVN3dEcsU0FBUzYzQixTQUUxQmpRLEVBQU9nTyxrQkFDQSxHQUdQNXRJLEVBQVEsR0FBS0EsRUFBUXdLLEVBQVMydkgsYUFDdkIsT0FEWCxHQUlSLENBQ0k3NUgsSUFBSyxZQUNMMHVDLFNBQVUsQ0FBQ2h2QyxFQUFPd0ssRUFBVW8xSCxJQUVwQjUvSCxFQUFRd0ssRUFBU3d0RyxTQUFTNjNCLFNBRTFCalEsRUFBT2dPLGtCQUNBLEdBR1A1dEksRUFBUXdLLEVBQVMwdkgsY0FBZ0JsNkgsRUFBUXdLLEVBQVMydkgsYUFDM0MzdkgsRUFBUzB2SCxrQkFEcEIsSUFNRyxNQUFNLEVBRWpCLFlBQWEzdUgsRUFBUzRRLEVBQVMyOEcsR0FFM0I3MkgsS0FBSzZ0SSxhQUFldmtJLEVBQ3BCdEosS0FBSzYySCxlQUFpQkEsRUFJdEI3MkgsS0FBS2c0SCxZQUFjLENBQ2Y4VixtQkFBb0IsQ0FBQyxHQUNyQi9VLGdCQUFpQixFQUNqQkwsaUJBQWtCLEVBQ2xCcVYsa0JBQW1CLEVBQ25CdnBCLEdBQUksS0FDSndwQixrQkFBa0IsRUFDbEJDLG9CQUFvQixFQUNwQjVYLGFBQWMsS0FDZDZYLFlBQWEsR0FDYkMsY0FBYyxFQUNkQyxjQUFjLEVBQ2RDLFdBQVcsRUFDWG5SLFFBQVEsRUFDUm5uQixTQUFVLEtBQ1Z1NEIsY0FBYyxFQUNkaFgsU0FBVSxFQUNWK0MsY0FBZSxFQUNmbmdILFFBQVNBLEVBQ1Rrb0gsYUFBYyxLQUNkbU0sWUFBYSxHQUNiQyxhQUFjLElBQUl2VCxFQUNsQndULFVBQVcsR0FDWFosYUFBYzd0SSxLQUFLNnRJLGFBQ25CYSx1QkFBd0IsS0FDeEJDLGdCQUFpQixHQUNqQnpVLFNBQVUsS0FDVjBVLGFBQWMsRUFDZEMsZUFBZ0IsRUFDaEIvL0csU0FBVSxHQUNWZ2dILG1CQUFvQixFQUNwQkMsUUFBUyxLQUNUcFcsZUFBZ0IsRUFDaEJxVyxnQkFBaUIsRUFDakJ6cEIsWUFBYSxLQUNiZ1QsU0FBVSxLQUNWN2dHLGdCQUFpQixLQUNqQnUzRyxlQUFnQixLQUNoQjlwQixhQUFjLEtBR2xCbmxILEtBQUt1SSxTQUFXaWlJLEVBQW1CLENBQUN0d0gsRUFBU2xhLEtBQUtnNEgsY0FHbEQsTUFBTWtYLEVBQVcxQixJQUNqQnh0SSxLQUFLZzRILFlBQVl4VCxHQUFLLFFBQVUwcUIsRUFBVyxJQUMzQ2x2SSxLQUFLZzRILFlBQVlscEcsU0FBVzl1QixLQUFLdUksU0FBU2k4RyxHQUcxQ2huSCxPQUFPNHVJLGlCQUFpQnBzSSxLQUFLdUksU0FBVSxDQUVuQzRtSSxZQUFhLENBQ1R4eEksSUFBSyxJQUVNcUMsS0FBS2c0SCxZQUFZTyxTQUFTcjBHLFFBSXpDa3JILFdBQVksQ0FDUnp4SSxJQUFLLElBRU1xQyxLQUFLZzRILFlBQVlPLFNBQVN0MEcsU0FLN0Nqa0IsS0FBS3F2SSxpQkFBbUIsSUFBSTNFLEVBQWlCLENBQ3pDeGxDLHFCQUFzQixDQUNsQixDQUNJN21HLElBQUssV0FDTFYsSUFBSyxJQUVNcUMsS0FBS2c0SCxZQUFZamlCLFdBS3BDNjBCLFlBQWE2QyxJQUdqQnp0SSxLQUFLZzRILFlBQVk2VyxlQzFMVixXQUVYLElBQUlsdUIsRUFBUXAzRyxTQUFTZ0ssY0FBYyxLQUNuQ290RyxFQUFNeDJHLE1BQU04WixNQUFRLE9BQ3BCMDhGLEVBQU14MkcsTUFBTStaLE9BQVMsUUFFckIsSUFBSTJ6RCxFQUFRdHVFLFNBQVNnSyxjQUFjLE9BQ25Dc2tFLEVBQU0xdEUsTUFBTWxGLFNBQVcsV0FDdkI0eUUsRUFBTTF0RSxNQUFNNDdHLElBQU0sTUFDbEJsdUMsRUFBTTF0RSxNQUFNZ2hDLEtBQU8sTUFDbkIwc0MsRUFBTTF0RSxNQUFNODdHLFdBQWEsU0FDekJwdUMsRUFBTTF0RSxNQUFNOFosTUFBUSxRQUNwQjR6RCxFQUFNMXRFLE1BQU0rWixPQUFTLFFBQ3JCMnpELEVBQU0xdEUsTUFBTXFRLFNBQVcsU0FDdkJxOUQsRUFBTXJpRCxZQUFZbXJGLEdBRWxCcDNHLFNBQVNtTyxLQUFLOGQsWUFBWXFpRCxHQUUxQixJQUFJeTNELEVBQUszdUIsRUFBTTR1QixZQUNmMTNELEVBQU0xdEUsTUFBTXFRLFNBQVcsU0FDdkIsSUFBSWcxSCxFQUFLN3VCLEVBQU00dUIsWUFNZixPQUxJRCxJQUFPRSxJQUNQQSxFQUFLMzNELEVBQU02L0MsYUFHZm51SCxTQUFTbU8sS0FBS3FvRixZQUFZbG9CLEdBQ25CeTNELEVBQUtFLEVEZ0swQkMsR0FHbEN6dkksS0FBS2c0SCxZQUFZc1csa0JBQXNDcHRJLElBQXZCNkgsT0FBTzJtSSxZQUVQLE9BQTVCeDFILEVBQVF5MUgsa0JBSUp6MUgsRUFBUXkxSCxnQkFESyxJQUFiVCxFQUMwQixHQUVBQSxFQUFXLElBSTdDLE1BQU1VLEVBQVkxYyxFQUFJLE1BQU9sekgsS0FBSzZ2SSxVQUFVLFFBQVMsQ0FBRW5aLE1BQU8sZ0JBQ3hEb1osRUFBZTVjLEVBQUksTUFBT2x6SCxLQUFLNnZJLFVBQVUsWUFBYUQsR0FDdERHLEVBQVk3YyxFQUFJLE1BQU9sekgsS0FBSzZ2SSxVQUFVLFNBQ3hDQyxFQUNBNWMsRUFBSSxNQUFPbHpILEtBQUs2dkksVUFBVSxZQUN0QixDQUNJM2MsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGtCQUloQzEySCxLQUFLZzRILFlBQVkzQixhQUFldVosRUFDaEM1dkksS0FBS2c0SCxZQUFZdGdHLGdCQUFrQm80RyxFQUNuQzl2SSxLQUFLZzRILFlBQVlvSyxhQUFlMk4sRUFFaEMvdkksS0FBS2c0SCxZQUFZa1csWUFBYzBCLEVBQy9CNXZJLEtBQUtnNEgsWUFBWWlYLGVBQWlCYSxFQUNsQzl2SSxLQUFLZzRILFlBQVl1VyxZQUFjd0IsRUFFL0IvdkksS0FBS3VJLFNBQVNzbEksYUFBYXI2SCxPQUFPdThILEdBRWxDL3ZJLEtBQUtnNEgsWUFBWU8sU0FBVyxJQUFJK1QsRUFBU3RzSSxLQUFLZzRILFlBQVl0Z0csZ0JBQWlCLENBQ3ZFc2lHLHNCQUF1Qmg2SCxLQUFLdUksU0FBU3luSSxpQkFHekNod0ksS0FBS2l3SSxvQkFBc0Jqd0ksS0FBS2t3SSxlQUFlNXhJLEtBQUswQixNQUNwREEsS0FBS213SSxvQkFBc0Jud0ksS0FBS293SSxlQUFlOXhJLEtBQUswQixNQUdwREEsS0FBS3F3SSxjQUNMcndJLEtBQUtzd0ksZUFHTHR3SSxLQUFLdXdJLGVBR1QsY0FBZWx5SSxFQUFLTixHQUVoQixPQUFPaUMsS0FBS3F2SSxpQkFBaUJtQixRQUFRbnlJLEVBQUtOLEVBQU9pQyxLQUFLZzRILFlBQVk5OUcsU0FHdEUsVUFBV3UySCxFQUFPdmxILEdBRWQsTUFBTXdsSCxFQUFRLENBQ1Zob0ksR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUtpc0IsRUFDdkIvWixNQUFPLFFBQVUrWixHQUdyQixPQUFJdmxILEVBQ08xdEIsT0FBT21oQyxPQUFPK3hHLEVBQU94bEgsR0FFckJ3bEgsRUFHZixZQUFhL3JCLEVBQVc5SSxHQUVwQixPQUFPNzdHLEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNM0IsR0FBV3ZuSCxFQUFFNEMsS0FBS3VJLFNBQVNzdkgsV0FBV2hjLEdBSTlFLGNBRUk3N0csS0FBS2c0SCxZQUFZTyxTQUFTeFMsSUFBTSxFQUdoQ2gvRyxhQUFhL0csS0FBS2c0SCxZQUFZNFcsYUFHbEMsaUJBQWtCMTBILEVBQVM3YixHQUV2QixPQUFPQSxLQUFPNmIsR0FBV0EsRUFBUTdiLEtBQVMyQixLQUFLdUksU0FBU2xLLEdBSTVELGVBQWdCc1gsR0FFTSxLQUFkQSxFQUFFZzdILFNBRUYzd0ksS0FBSzYySCxlQUFlK1osc0JBUTVCLGFBQWNDLEdBRVYsTUFBTUMsRUFBZSxHQW9FckIsR0FsRUFELEVBQWE3d0ksS0FBS3F2SSxpQkFBaUIwQixvQkFBb0Ivd0ksS0FBS3VJLFNBQVVzb0ksR0FHbEU3d0ksS0FBS2d4SSxpQkFBaUJILEVBQVksZUFFbEM3d0ksS0FBS2c0SCxZQUFZcUMsYUFBZXI2SCxLQUFLdUksU0FBU3N2SCxVQUM5QzczSCxLQUFLZzRILFlBQVk5OUcsUUFBUTI5RyxVQUFZZ1osRUFBV2haLFVBQ2hEaVosRUFBYTF1SSxLQUFLLENBQUMscUJBQXNCeXVJLEVBQVdoWixhQUlwRDczSCxLQUFLZ3hJLGlCQUFpQkgsRUFBWSxpQkFFbEM3d0ksS0FBS2c0SCxZQUFZOTlHLFFBQVFrdkgsWUFBY3lILEVBQVd6SCxZQUNsRDBILEVBQWExdUksS0FBSyxDQUFDLHlCQUEwQnl1SSxFQUFXekgsZUFJeERwcEksS0FBS2d4SSxpQkFBaUJILEVBQVksd0JBQ2xDN3dJLEtBQUtnNEgsWUFBWTk5RyxRQUFRb2tILG1CQUFxQnVTLEVBQVd2UyxvQkFHekR0K0gsS0FBS2d4SSxpQkFBaUJILEVBQVksdUJBRWxDN3dJLEtBQUtnNEgsWUFBWTk5RyxRQUFRa3VILGtCQUFvQnlJLEVBQVd6SSxtQkFJeEQsaUJBQWtCeUksR0FFbEI3d0ksS0FBS2c0SCxZQUFZOTlHLFFBQVF1K0csYUFBZW9ZLEVBQVdwWSxhQUUvQyxtQkFBb0JvWSxJQUNwQjd3SSxLQUFLZzRILFlBQVlXLGVBQWlCa1ksRUFBV2xZLGdCQUU3QyxxQkFBc0JrWSxJQUN0Qjd3SSxLQUFLZzRILFlBQVlVLGlCQUFtQm1ZLEVBQVduWSxtQkFLbkQxNEgsS0FBS2c0SCxZQUFZOTlHLFFBQVF1K0csYUFBZXo0SCxLQUFLdUksU0FBU3d3SCxpQkFHdEQvNEgsS0FBS2d4SSxpQkFBaUJILEVBQVksV0FBYTd3SSxLQUFLZ3hJLGlCQUFpQkgsRUFBWSxtQkFFN0UsV0FBWUEsSUFDWjd3SSxLQUFLZzRILFlBQVk5OUcsUUFBUXVnSCxPQUFTb1csRUFBV3BXLFFBRTdDLGlCQUFrQm9XLElBQ2xCN3dJLEtBQUtnNEgsWUFBWTk5RyxRQUFRb3dILGFBQWV1RyxFQUFXdkcsY0FFdkR3RyxFQUFhMXVJLEtBQUssQ0FBQyxnQkFBaUJwQyxLQUFLdUksU0FBU2t5SCxVQUlsRHo2SCxLQUFLZ3hJLGlCQUFpQkgsRUFBWSxrQkFFbEM3d0ksS0FBS2c0SCxZQUFZOTlHLFFBQVErMkgsYUFBZUosRUFBV0ksYUFDbkRqeEksS0FBS2t4SSxrQkFBa0JMLEdBQ3ZCQyxFQUFhMXVJLEtBQUssQ0FBQyxnQkFBaUJwQyxLQUFLdUksU0FBUzBvSSxnQkFHdERqeEksS0FBS214SSxjQUNMbnhJLEtBQUtveEksZ0NBRURweEksS0FBS2c0SCxZQUFZa0MsU0FDckIsQ0FHSSxNQUFNbVgsRUFBaUIsQ0FDbkJ2VCxZQUFhc00sRUFBZXBxSSxLQUFLdUksVUFDakNnUyxRQUFTdmEsS0FBS3N4SSxhQUNkcFosYUFBY2w0SCxLQUFLdUksU0FBU2t5SCxPQUFTLEtBQU96NkgsS0FBS2c0SCxZQUFZamlCLFNBQVM2M0IsUUFDdEV0UCxtQkFBb0J0K0gsS0FBS3VJLFNBQVMrMUgsb0JBQXNCdCtILEtBQUt1SSxTQUFTa3lILFFBR3BFMEksRUFBbUIsQ0FDckJ0TCxVQUFXNzNILEtBQUt1SSxTQUFTa3lILE9BQVMsS0FBT3o2SCxLQUFLdUksU0FBU3N2SCxVQUN2RFMsV0FBWXQ0SCxLQUFLdUksU0FBU2t3SCxhQUMxQkUsZUFBZ0IzNEgsS0FBS2c0SCxZQUFZVyxlQUNqQ0QsaUJBQWtCMTRILEtBQUtnNEgsWUFBWVUsa0JBR2pDNlksRUFBaUJ2eEksS0FBS3d4SSwyQkFFNUIsR0FBSSxFQUFNOWtCLFFBQ1YsQ0FDSSxNQUFNK2tCLEVBQWFqMEksT0FBT2lJLEtBQUs0ckksR0FDMUJyaUksUUFBTyxTQUFVM1EsR0FHZCxNQUFlLGdCQUFSQSxHQUFpQyxZQUFSQSxLQUVuQ3lSLEtBQUksU0FBVXpSLEdBRVgsTUFBTU4sRUFBUXN6SSxFQUFlaHpJLEdBQzdCLE9BQU9BLEVBQU0sS0FBT3dLLEtBQUtPLFVBQVVyTCxNQUV0QzhoQixLQUFLLE1BRVYsRUFBTSxpQkFBa0I0eEgsR0FHNUJ6eEksS0FBS2c0SCxZQUFZa0MsU0FBU3Z4SCxLQUFLMG9JLEVBQWdCbE8sRUFBa0JvTyxHQVFyRSxPQUxBVCxFQUFhbm5JLFFBQVVuQixJQUVuQnhJLEtBQUs0NEgsUUFBUTE1SCxNQUFNYyxLQUFNd0ksTUFHdEIsRUFJWCxrQkFBbUIwUixHQUdmLE1BQU13M0gsRUFBY3gzSCxFQUFRKzJILGFBQWUsTUFBUSxTQUNuRGp4SSxLQUFLZzRILFlBQVl1VyxZQUFZMWtJLFVBQVU2bkksR0FBYSxtQkFDcERub0ksU0FBU21PLEtBQUs3TixVQUFVNm5JLEdBQWEsdUJBQ3JDMXhJLEtBQUt1SSxTQUFTc2xJLGFBQWFoa0ksVUFBVTZuSSxHQUFhLG1CQUdsRCxNQUFNQyxFQUFlM3hJLEtBQUt1SSxTQUFTNG1JLFlBQzdCeUMsRUFBYzV4SSxLQUFLdUksU0FBUzZtSSxXQUlsQyxHQUhBcHZJLEtBQUtnNEgsWUFBWU8sU0FBU3FVLGNBR3JCNXNJLEtBQUtnNEgsWUFBWWtGLFNBQVdsOUgsS0FBS3VJLFNBQVNreUgsVUFBWSxtQkFBb0J2Z0gsR0FDL0UsQ0FFSSxNQUFNazBHLEVBQVlwdUgsS0FBS3VJLFNBQVM0bUksWUFDMUIwQyxFQUFXN3hJLEtBQUt1SSxTQUFTNm1JLFdBRy9CcHZJLEtBQUtnNEgsWUFBWVcsaUJBQW9CZ1osRUFBZXZqQixHQUFhLEVBQ2pFcHVILEtBQUtnNEgsWUFBWVUsbUJBQXNCa1osRUFBY0MsR0FBWSxFQUlqRTMzSCxFQUFRKzJILGFBQ1IxbkksU0FBUzFGLGlCQUFpQixRQUFTN0QsS0FBS213SSxxQkFFeEM1bUksU0FBU3ZGLG9CQUFvQixRQUFTaEUsS0FBS213SSxxQkFJbkQsZ0NBRUksTUFBTTJCLEVBQVU5eEksS0FBS3VJLFNBQVNreUgsT0FBU0YsRUFBYyxHQUVqRHY2SCxLQUFLZzRILFlBQVl6UyxhQUFpQnZsSCxLQUFLZzRILFlBQVl6Uyx1QkFBdUJ1c0IsSUFFMUU5eEksS0FBS2c0SCxZQUFZelMsWUFBWXIrRixVQUM3QmxuQixLQUFLZzRILFlBQVl6UyxZQUFjLE1BRzlCdmxILEtBQUtnNEgsWUFBWXpTLGNBQ2xCdmxILEtBQUtnNEgsWUFBWXpTLFlBQWMsSUFBSXVzQixFQUFROXhJLE9BRTFDQSxLQUFLZzRILFlBQVlrQyxVQUNsQmw2SCxLQUFLK3hJLHFCQUliLHFCQUVJLE1BQU1DLEVBQWUsRUFBU0MseUJBRTlCLEdBQUlELEVBRUFoeUksS0FBS2t5SSxVQUFVRixPQUduQixDQUNJLE1BQU05M0gsRUFBVSxDQUNacStHLFNBQVV2NEgsS0FBS2c0SCxZQUFZTyxTQUMzQjZKLGFBQWNwaUksS0FBS2c0SCxZQUFZb0ssYUFDL0IvTCxhQUFjcjJILEtBQUtnNEgsWUFBWTNCLGFBQy9COXRILFNBQVV2SSxLQUFLdUksVUFHYjA1SCxFQUFRLENBQ1ZxQixlQUFnQixLQUVadGpJLEtBQUtnNEgsWUFBWXpTLFlBQVkrZCxrQkFFakNHLGNBQWUsS0FFWHpqSSxLQUFLbXlJLHFCQUNMbnlJLEtBQUtnNEgsWUFBWXpTLFlBQVlrZSxpQkFFakNJLGdCQUFpQixDQUFDdmQsRUFBTzRTLEtBRXJCbDVILEtBQUtteUkscUJBQ0xueUksS0FBS2c0SCxZQUFZelMsWUFBWXNlLGdCQUFnQnZkLEVBQU80UyxJQUV4RGdPLG9CQUFxQixLQUVqQmxuSSxLQUFLbXlJLHNCQUVUMU4sZUFBaUI5ZixJQUViM2tILEtBQUs0NEgsUUFBUSxlQUFnQmpVLElBRWpDeWlCLHNCQUF3QnZQLElBRXBCNzNILEtBQUs0NEgsUUFBUSxzQkFBdUJmLEtBSTVDNzNILEtBQUtnNEgsWUFBWWtDLFNBQVcsSUFBSSxFQUFTaGdILEVBQVMrbkgsSUFJMUQsMkJBRUksR0FBSWppSSxLQUFLdUksU0FBU2t5SCxPQUNsQixDQUNJLE1BQU0yWCxFQUFxQixDQUN2QmpPLHdCQUEwQnRmLEdBRWYsQ0FBQ3V0QixFQUFtQi9MLHdCQUF3QnhoQixJQUV2RHdoQix3QkFBMEJ4aEIsSUFNZixDQUNIZ1QsVUFBVyxFQUNYNStFLEtBQU0sRUFDTjZpRixLQUFNLEVBQ05VLE1BQU8sQ0FBQyxDQUNKN25GLElBVEkzMEMsS0FBS3VJLFNBQVN3dEcsU0FBU3M4QixnQkFBZ0J4dEIsRUFBS3ovRyxNQUFPLENBQzNENmUsTUFBTzRnRyxFQUFLeFUsV0FBV3BzRixRQVNuQjR6RyxVQUFXLEVBQ1hwbkYsSUFBSyxFQUNMeXJGLElBQUssRUFDTDdyQixXQUFZd1UsRUFBS3hVLFdBQ2pCdDZGLE9BQVEsQ0FDSmd3RyxJQUFLLEVBQ0w1NkUsS0FBTSxRQU8xQixPQUFPaW5HLEVBR1gsTUFBTUUsRUFBaUIsQ0FDbkJydUgsTUFBT2prQixLQUFLdUksU0FBU2dxSSxVQUNyQnJ1SCxPQUFRbGtCLEtBQUt1SSxTQUFTaXFJLFlBRzFCLE1BQU8sQ0FDSG5NLHdCQUEwQnhoQixHQUVmN2tILEtBQUt1SSxTQUFTd3RHLFNBQVMwOEIsa0JBQWtCNXRCLEVBQUt6L0csTUFBTzBKLEtBQUswMkIsS0FBS3hsQyxLQUFLdUksU0FBU3N2SCxXQUFZeWEsR0FFcEduTyx3QkFBMEJ0ZixJQUV0QixNQUFNc1gsRUFBUyxHQUNUdVcsRUFBYTF5SSxLQUFLZzRILFlBQVlqaUIsU0FBUzYzQixRQUU3QyxJQUFLLElBQUlyUixFQUFNLEVBQUdBLEdBQVNtVyxFQUFZblcsSUFFbkNKLEVBQU8vNUgsS0FBS3BDLEtBQUt1SSxTQUFTd3RHLFNBQVMwOEIsa0JBQWtCNXRCLEVBQUt6L0csTUFBT20zSCxFQUFPK1YsSUFLNUUsT0FGQW5XLEVBQU85MEYsVUFFQTgwRixJQUtuQixhQUVJLElBQUl3VyxFQUFZQyxFQUNaQyxFQUFhQyxFQWdCakIsT0FkSTl5SSxLQUFLdUksU0FBU2t5SCxRQUVkb1ksRUFBYzd5SSxLQUFLdUksU0FBUytnSSxhQUM1QnFKLEVBQWFDLEVBQWNFLEVBQWMsSUFJekNILEVBQWEzeUksS0FBS3VJLFNBQVMrMUgsbUJBQXFCdCtILEtBQUtnNEgsWUFBWWdYLGdCQUFrQixFQUNuRjRELEVBQWM1eUksS0FBS3VJLFNBQVMrMUgsbUJBQXFCLEVBQUl0K0gsS0FBS2c0SCxZQUFZK1Ysa0JBRXRFOEUsRUFBYzd5SSxLQUFLdUksU0FBUysxSCxtQkFBcUIsRUFBSXQrSCxLQUFLZzRILFlBQVlnWCxnQkFDdEU4RCxFQUFjOXlJLEtBQUt1SSxTQUFTKzFILG1CQUFxQnQrSCxLQUFLZzRILFlBQVkrVixrQkFBb0IsR0FHbkYsQ0FDSHhrSSxTQUFVLENBQ053OEcsSUFBSzhzQixFQUNMaFksT0FBUWdZLEVBQ1IxbkcsS0FBTTJuRyxFQUNOMW5HLE1BQU8wbkcsR0FFWGp1QixLQUFNLENBQ0ZrQixJQUFLNHNCLEVBQ0w5WCxPQUFRLEVBQ1IxdkYsS0FBTXluRyxFQUNOeG5HLE1BQU8sSUFLbkIscUJBRUlwckMsS0FBS2c0SCxZQUFZd1csYUFBYXVFLGVBQzFCL3lJLEtBQUtnNEgsWUFBWWtDLFNBQVM4WSxvQkFLbEMsV0FBWXBiLEVBQWNxYixHQUd0QixJQUFLanpJLEtBQUtrekksY0FBYyxZQUFhdGIsR0FDakMsT0FBTyxFQU1YLEdBSEE1M0gsS0FBS2c0SCxZQUFZaVgsZUFBZWpySSxvQkFBb0IsU0FBVWhFLEtBQUtpd0ksc0JBRzlEZ0QsRUFDTCxDQUNJLE1BQU0xYSxFQUFXdjRILEtBQUtnNEgsWUFBWU8sU0FDNUI0YSxFQUFnQm56SSxLQUFLZzRILFlBQVlrQyxTQUFTZCxPQUFPM1QsY0FBY3psSCxLQUFLdUksU0FBU3d3SCxpQkFFbkZrYSxFQUFhLENBQ1QzYSxXQUFZdDRILEtBQUt1SSxTQUFTd3dILGdCQUMxQmhqSCxPQUFRLENBQ0pvMUIsS0FBT290RixFQUFTdDBHLE1BQVEsR0FBTWt2SCxFQUFjaG9HLEtBQU9vdEYsRUFBU3B0RixNQUM1RDQ2RSxJQUFNd1MsRUFBU3IwRyxPQUFTLEdBQU1pdkgsRUFBY3B0QixJQUFNd1MsRUFBU3hTLE9BS3ZFLE1BQU1xdEIsRUFBYXB6SSxLQUFLZzRILFlBQVlrQyxTQUFTZCxPQUFPM1QsY0FBY3d0QixFQUFXM2EsWUFHdkUrYSxFQUFrQkQsRUFBV2pvRyxLQUFPOG5HLEVBQVdsOUgsT0FBT28xQixNQUN2RG5yQyxLQUFLdUksU0FBU2d3SCxTQUFTcHRGLEtBQVFuckMsS0FBS3VJLFNBQVNnd0gsU0FBU3QwRyxNQUFRLEdBQzdEcXZILEVBQWtCRixFQUFXcnRCLElBQU1rdEIsRUFBV2w5SCxPQUFPZ3dHLEtBQ3REL2xILEtBQUt1SSxTQUFTZ3dILFNBQVN4UyxJQUFPL2xILEtBQUt1SSxTQUFTZ3dILFNBQVNyMEcsT0FBUyxHQUU3RHF2SCxFQUEyQixDQUFDMWIsRUFBVzJiLEtBRXpDLE1BQU1DLEVBQVkza0ksS0FBS2l6RyxJQUFJLEVBQUc4VixFQUFZMmIsR0FJcEM5YSxFQUFvQnVhLEVBQVdsOUgsT0FBT28xQixLQUFPc29HLEVBQWFKLEVBQzFEMWEsRUFBa0JzYSxFQUFXbDlILE9BQU9nd0csSUFBTTB0QixFQUFhSCxFQUU3RCxNQUFPLENBQ0h6YixVQUFXQSxFQUNYUyxXQUFZMmEsRUFBVzNhLFdBQ3ZCSyxlQUFnQkEsRUFDaEJELGlCQUFrQkEsSUFJMUIxNEgsS0FBS2c0SCxZQUFZOTlHLFFBQVEyOUcsVUFBWUQsRUFDckMsSUFBSThiLEVBQW1CMXpJLEtBQUtnNEgsWUFBWXFDLGFBQ3hDcjZILEtBQUtnNEgsWUFBWXFDLGFBQWVyNkgsS0FBS3VJLFNBQVNzdkgsVUFDOUMsTUFBTThiLEVBQWNKLEVBQXdCM2IsRUFBYzhiLEdBQzFEMXpJLEtBQUtnNEgsWUFBWTk5RyxRQUFRdStHLGFBQWVrYixFQUFZcmIsV0FDcER0NEgsS0FBS2c0SCxZQUFZVyxlQUFpQmdiLEVBQVloYixlQUM5QzM0SCxLQUFLZzRILFlBQVlVLGlCQUFtQmliLEVBQVlqYixpQkFFaEQxNEgsS0FBS2c0SCxZQUFZa0MsU0FBUzBaLDJCQUEyQixDQUNqRDVTLFNBQVVoaEksS0FBS3VJLFNBQVM0OEcsYUFDeEI4YixXQUFZLENBQ1JwSixVQUFXLENBQ1B4dEgsS0FBTXFwSSxFQUNOMXRILEdBQUk0eEcsSUFHWnFQLFlBQWNoRyxHQUVIc1MsRUFBd0J0UyxFQUFXcEosVUFBVzZiLEdBRXpEdlMsTUFBUWovRyxJQUVKbGlCLEtBQUtnNEgsWUFBWWlYLGVBQWVwckksaUJBQWlCLFNBQVU3RCxLQUFLaXdJLHFCQUU1RC90SCxFQUFLMC9HLGNBQ0w1aEksS0FBS2c0SCxZQUFZcUMsYUFBZXpDLE1BSzVDLElBQUlpYyxFQUFldHFJLFNBQVMyQixlQUFlbEwsS0FBS3VJLFNBQVN1bUIsU0FBVyxrQkFDaEVnbEgsRUFBZ0J2cUksU0FBUzJCLGVBQWVsTCxLQUFLdUksU0FBU3VtQixTQUFXLG1CQVlyRSxPQVhBK2tILEVBQWF2N0gsVUFBVyxFQUN4Qnc3SCxFQUFjeDdILFVBQVcsRUFDekJ6UixXQUFXLEtBRVBndEksRUFBYXY3SCxVQUFXLEVBQ3hCdzdILEVBQWN4N0gsVUFBVyxHQUMxQnRZLEtBQUt1SSxTQUFTNDhHLGNBR2pCbmxILEtBQUs0NEgsUUFBUSxxQkFBc0JoQixJQUU1QixFQVdYLFdBQVlqVCxFQUFXb3ZCLEdBRW5CLElBQUlDLE9BQThCLElBQWhCLEVBQThCaDBJLEtBQUt1SSxTQUFTd3dILGdCQUFrQnBVLEVBRWhGLE1BQWUsV0FBWG92QixHQUFrQyxXQUFYQSxFQUVoQnY3SCxTQUFTeFksS0FBS2kwSSxZQUFZRCxFQUFNLEtBQU8sRUFBRyxJQUVqQyxXQUFYRCxFQUVFdjdILFNBQVN4WSxLQUFLaTBJLFlBQVlELEVBQU0sS0FBT2gwSSxLQUFLdUksU0FBUzRtSSxZQUFjLEVBQUcsSUFJdEUzMkgsU0FBU3hZLEtBQUt1SSxTQUFTNG1JLFlBQWMsRUFBRyxJQUt2RCxXQUFZeHFCLEVBQVdvdkIsR0FFbkIsSUFBSUMsT0FBOEIsSUFBaEIsRUFBOEJoMEksS0FBS3VJLFNBQVN3d0gsZ0JBQWtCcFUsRUFFaEYsTUFBZSxTQUFYb3ZCLEVBRU92N0gsU0FBU3hZLEtBQUt1SSxTQUFTNm1JLFdBQWEsRUFBRyxJQUU5QixVQUFYMkUsRUFFRXY3SCxTQUFTeFksS0FBS2kwSSxZQUFZRCxFQUFNLEtBQU9oMEksS0FBS3VJLFNBQVM2bUksV0FBYSxFQUFHLElBSXJFNTJILFNBQVN4WSxLQUFLaTBJLFlBQVlELEVBQU0sS0FBTyxFQUFHLElBS3pELGtCQVdJLE9BVEFoMEksS0FBS2c0SCxZQUFZTyxTQUFTcVUsYUFHdEI1c0ksS0FBS2c0SCxZQUFZa0MsV0FFakJsNkgsS0FBS2swSSxnQkFDTGwwSSxLQUFLZzRILFlBQVlrQyxTQUFTc0osS0FBS3hqSSxLQUFLdUksU0FBU3d3SCxnQkFBaUIvNEgsS0FBS2c0SCxZQUFZVyxlQUFnQjM0SCxLQUFLZzRILFlBQVlVLG9CQUc3RyxFQUdYLGdCQUVJLE1BQU15TSxFQUFhbmxJLEtBQUtnNEgsWUFBWWtDLFNBQVNkLE9BQU9mLDhCQUE4QnI0SCxLQUFLdUksU0FBU3d3SCxnQkFBaUIvNEgsS0FBS2c0SCxZQUFZTyxVQUU5SDRNLElBRUFubEksS0FBS2c0SCxZQUFZVSxpQkFBbUJ5TSxFQUFXdnpILEVBQy9DNVIsS0FBS2c0SCxZQUFZVyxlQUFpQndNLEVBQVduekgsR0FLckQsa0JBR0loUyxLQUFLZzRILFlBQVlpWCxlQUFlcGxJLFVBQVVlLElBQUksY0FFOUMsRUFBYzRwSCxjQUFjeDBILEtBQUtnNEgsWUFBWWlYLGVBQWdCLENBQUMvL0csRUFBT3lvRyxLQUVqRSxFQUFNLHlCQUEwQkEsRUFBT3hzRixLQUFNd3NGLEVBQU81UixLQUNwRC9sSCxLQUFLZzRILFlBQVl6UyxZQUFZaVAsY0FBY3RsRyxFQUFPeW9HLEtBSTFELFdBRUkzM0gsS0FBS20wSSxrQkFFTHB0SSxhQUFhL0csS0FBS2c0SCxZQUFZNFcsYUFFOUI1dUksS0FBS2c0SCxZQUFZNFcsWUFBYy9uSSxXQUFZLEtBRXZDLE1BQU1zK0gsRUFBYW5sSSxLQUFLZzRILFlBQVlrQyxTQUFTZCxPQUFPZiw4QkFBOEJyNEgsS0FBS3VJLFNBQVN3d0gsZ0JBQWlCLzRILEtBQUtnNEgsWUFBWU8sVUFFOUg0TSxFQUVBbmxJLEtBQUtvMEksYUFBYSxDQUNkM2IsYUFBY3o0SCxLQUFLdUksU0FBU3d3SCxnQkFDNUJKLGVBQWdCd00sRUFBV256SCxFQUMzQjBtSCxpQkFBa0J5TSxFQUFXdnpILElBS2pDNVIsS0FBS28wSSxhQUFhLENBQ2QzYixhQUFjejRILEtBQUt1SSxTQUFTd3dILG1CQUdyQyxLQUlQLGtCQUdRLzRILEtBQUt1SSxTQUFTOHJJLGlCQUVkOXFJLFNBQVNtTyxLQUFLN1QsaUJBQWlCLFlBQWNxckIsSUFFL0JBLEVBQU1pNkYsY0FDZDF3RyxrQkFFSyxJQU9mLEVBQWNxOEcsUUFBUTkwSCxLQUFLZzRILFlBQVlpWCxnQkFBZ0IsU0FBVS8vRyxFQUFPeW9HLEVBQVE1eUYsRUFBT3plLEdBRW5GLEVBQU0scUJBQXNCQSxFQUFNeWUsRUFBTzR5RixFQUFPeHNGLEtBQU13c0YsRUFBTzVSLEtBQzdEL2xILEtBQUtnNEgsWUFBWXpTLFlBQVl1UCxRQUFRNWxHLEVBQU95b0csRUFBUTV5RixFQUFPemUsTUFHL0QsRUFBYzh1RyxZQUFZcDFILEtBQUtnNEgsWUFBWWlYLGdCQUFnQixTQUFVLy9HLEVBQU95b0csR0FFeEUsRUFBTSx1QkFBd0JBLEVBQU94c0YsS0FBTXdzRixFQUFPNVIsS0FDbEQvbEgsS0FBS2c0SCxZQUFZelMsWUFBWWlQLGNBQWN0bEcsRUFBT3lvRyxNQUsxRCxpQkFFSSxNQUFNMmMsRUFBb0J0MEksS0FBS2c0SCxZQUFZTyxTQUFTeFMsSUFDOUN3dUIsRUFBcUJ2MEksS0FBS2c0SCxZQUFZTyxTQUFTcHRGLEtBRXJELElBQUk1b0IsRUFFSnZpQixLQUFLZzRILFlBQVlPLFNBQVNxVSxhQUUxQixNQUFNNEgsRUFBZXgwSSxLQUFLZzRILFlBQVlPLFNBQVN4UyxJQUN6QzB1QixFQUFnQnowSSxLQUFLZzRILFlBQVlPLFNBQVNwdEYsS0FHNUM1b0IsRUFEQXZpQixLQUFLdUksU0FBUysxSCxvQkFBc0J0K0gsS0FBS3VJLFNBQVNreUgsT0FDdEMrWixFQUFlRixFQUVmRyxFQUFnQkYsRUFFaEN2MEksS0FBS2c0SCxZQUFZa0MsU0FBU3dhLFNBRTFCLE1BQU1DLEVBQWlCMzBJLEtBQUt1SSxTQUFTKzFILG9CQUFzQnQrSCxLQUFLdUksU0FBU2t5SCxPQUFVK1osRUFBZUMsRUFFbEd6MEksS0FBSzQ0SCxRQUFRLGtCQUFtQitiLEdBRTVCcHlILEVBQVksRUFFWnZpQixLQUFLNDRILFFBQVEsc0JBQXVCK2IsR0FFL0JweUgsRUFBWSxHQUVqQnZpQixLQUFLNDRILFFBQVEsb0JBQXFCK2IsR0FHdEMzMEksS0FBS2swSSxnQkFJVCxlQUdJbDBJLEtBQUtnNEgsWUFBWWtXLFlBQVlycUksaUJBQWlCLFlBQWEsS0FFdkQ3RCxLQUFLZzRILFlBQVlrVyxZQUFZcmtJLFVBQVVlLElBQUksbUJBRy9DNUssS0FBS2c0SCxZQUFZa1csWUFBWXJxSSxpQkFBaUIsVUFBVyxLQUVyRDdELEtBQUtnNEgsWUFBWWtXLFlBQVlya0ksVUFBVUMsT0FBTyxtQkFHbEQ5SixLQUFLNDBJLGtCQUNMNTBJLEtBQUtnNEgsWUFBWWlYLGVBQWVwckksaUJBQWlCLFNBQVU3RCxLQUFLaXdJLHFCQUtoRTFtSSxTQUFTMUYsaUJBQWlCLGVBQWlCcXJCLElBRXZDLElBQUtsdkIsS0FBS2c0SCxZQUFZbVcsYUFDbEIsT0FBTyxFQUdYLEdBQUtudUksS0FBS3VJLFNBQVNzc0ksb0JBQXNCM2xILEVBQU04MkUsVUFUeUMsS0FTN0I5MkUsRUFBTXloSCxTQUEwQjN3SSxLQUFLdUksU0FBU3VzSSxpQkFUaUIsS0FTRTVsSCxFQUFNeWhILFFBRzlILE9BREEzd0ksS0FBS2c0SCxZQUFZTyxTQUFTeFMsS0FBTy9sSCxLQUFLdUksU0FBUzRtSSxhQUN4QyxFQU9YLEdBTFVudkksS0FBS3VJLFNBQVNzc0ksbUJBZGdFLEtBYzNDM2xILEVBQU15aEgsU0FFL0N6aEgsRUFBTXpXLGlCQUdOelksS0FBS3VJLFNBQVN1c0ksZ0JBQ2xCLENBRUksR0FBSTVsSCxFQUFNODJFLFVBQVk5MkUsRUFBTSs0RSxTQUFXLzRFLEVBQU1sVixRQUN6QyxPQUFPLEVBRVgsT0FBUWtWLEVBQU15aEgsU0FFVixLQTNCZ0csR0E4QjVGLE9BREEzd0ksS0FBS2c0SCxZQUFZTyxTQUFTeFMsS0FBTy9sSCxLQUFLdUksU0FBUzRtSSxhQUN4QyxFQUVYLEtBaENPLEdBbUNILE9BREFudkksS0FBS2c0SCxZQUFZTyxTQUFTeFMsS0FBTy9sSCxLQUFLdUksU0FBU3dzSSxtQkFDeEMsRUFFWCxLQXJDMEIsR0F3Q3RCLE9BREEvMEksS0FBS2c0SCxZQUFZTyxTQUFTeFMsS0FBTy9sSCxLQUFLdUksU0FBU3dzSSxtQkFDeEMsRUFFWCxLQTFDNkMsR0E2Q3pDLE9BREEvMEksS0FBS2c0SCxZQUFZTyxTQUFTcHRGLE1BQVFuckMsS0FBS3VJLFNBQVN3c0ksbUJBQ3pDLEVBRVgsS0EvQ2lFLEdBa0Q3RCxPQURBLzBJLEtBQUtnNEgsWUFBWU8sU0FBU3B0RixNQUFRbnJDLEtBQUt1SSxTQUFTd3NJLG1CQUN6QyxFQUVYLEtBcERnSSxHQXVENUgsT0FEQS8wSSxLQUFLZzRILFlBQVlPLFNBQVN4UyxJQUFNLEdBQ3pCLEVBRVgsS0F6RDZJLEdBaUV6SSxPQUxJL2xILEtBQUt1SSxTQUFTKzFILG1CQUNkdCtILEtBQUtnNEgsWUFBWU8sU0FBU3hTLElBQU10dUUsSUFFaEN6M0MsS0FBS2c0SCxZQUFZTyxTQUFTcHRGLEtBQU9zTSxLQUU5QixFQUVYLFFBQ0ksT0FBTyxHQUduQixPQUFPLElBR1gsRUFBSzZzRSxPQUFPQyxVQUFVLHNCQUFzQixXQUV4Q2g3RyxTQUFTdkYsb0JBQW9CLGtCQUM5QmhFLEtBQUt1SSxTQUFTaThHLElBS2pCejdHLE9BQU9sRixpQkFBaUIsU0FBVTdELEtBQUtnMUksU0FBUzEySSxLQUFLMEIsT0FBTyxHQUU1RCxFQUFLc2tILE9BQU9DLFVBQVUsc0JBQXNCLFdBRXhDeDdHLE9BQU8vRSxvQkFBb0IsU0FBVWhFLEtBQUtnMUksVUFBVSxLQUNyRGgxSSxLQUFLdUksU0FBU2k4RyxJQUdiLHdCQUF5Qno3RyxTQUV6QkEsT0FBT2xGLGlCQUFpQixvQkFBcUI3RCxLQUFLZzFJLFVBQVUsR0FFNUQsRUFBSzF3QixPQUFPQyxVQUFVLHNCQUFzQixXQUV4Q3g3RyxPQUFPL0Usb0JBQW9CLG9CQUFxQmhFLEtBQUtnMUksVUFBVSxLQUNoRWgxSSxLQUFLdUksU0FBU2k4RyxLQUdyQixFQUFLRixPQUFPQyxVQUFVLHFCQUFzQnZrSCxLQUFLbTBJLGdCQUFpQm4wSSxLQUFLdUksU0FBU2k4RyxJQUdoRixFQUFLRixPQUFPQyxVQUFVLHFCQUFzQixLQUVwQ3ZrSCxLQUFLZzRILFlBQVlrQyxVQUNqQmw2SCxLQUFLZzRILFlBQVlrQyxTQUFTaHpHLFVBRTlCbmdCLGFBQWEvRyxLQUFLZzRILFlBQVk0VyxjQUMvQjV1SSxLQUFLdUksU0FBU2k4RyxJQUdyQixjQUVJLElBQUt4a0gsS0FBS3VJLFNBQVM1SixlQUFlLFdBQzlCLE9BQU8sS0FFWHFCLEtBQUtnNEgsWUFBWTJXLGdCQUFrQjN1SSxLQUFLdUksU0FBUzBzSSxRQUFRbmxJLElBQU13a0MsSUFFM0QsTUFBTTExQyxFQUFJLElBQUkwMUMsRUFBT3QwQyxNQUtyQixPQUhJcEIsRUFBRXMySSxZQUNGbDFJLEtBQUtnNEgsWUFBWXlXLFVBQVVyc0ksS0FBS3hELEdBRTdCQSxJQUlmLGVBRUlvQixLQUFLbTFJLGVBRUxuMUksS0FBS2c0SCxZQUFZOFcsa0JBQW9Cam9JLFdBQVksS0FFN0MsSUFBSXV1SSxFQUFNN3JJLFNBQVMyQixlQUFlbEwsS0FBS3VJLFNBQVN1bUIsU0FBVyxZQUN2RHNtSCxJQUFLQSxFQUFJanJJLE1BQU1zSixRQUFVLFVBQzlCelQsS0FBS3VJLFNBQVM4c0ksaUJBR3JCLGVBR0l0dUksYUFBYS9HLEtBQUtnNEgsWUFBWThXLG1CQUU5QixJQUFJc0csRUFBTTdySSxTQUFTMkIsZUFBZWxMLEtBQUt1SSxTQUFTdW1CLFNBQVcsWUFFdkRzbUgsSUFBS0EsRUFBSWpySSxNQUFNc0osUUFBVSxRQUdqQyxVQUFXaFAsR0FFUCxNQUFNNndJLEVBQWVwaUIsRUFBSSxNQUFPbHpILEtBQUs2dkksVUFBVSxTQUFVLENBQ3JEM2MsRUFBSSxTQUFVbHpILEtBQUs2dkksVUFBVSxjQUFlLENBQUMsYUFBYyxrQkFDM0QzYyxFQUFJLElBQ0FBLEVBQUksU0FBVSxVQUVsQkEsRUFBSSxNQUFPenVILEtBR2Z6RSxLQUFLZzRILFlBQVl1VyxZQUFZLzRHLFlBQVk4L0csR0FHekMvckksU0FBUzJCLGVBQWVsTCxLQUFLdUksU0FBU3VtQixTQUFXLGVBQWVqckIsaUJBQWlCLFFBQVMsS0FFdEZ5eEksRUFBYXR4SCxXQUFXKzdFLFlBQVl1MUMsS0FJNUMsWUFBYXYvQixFQUFVdy9CLEdBY25CLEdBWkF2MUksS0FBS2c0SCxZQUFZamlCLFNBQVdBLEVBRTVCLzFHLEtBQUttMUksZUFHTG4xSSxLQUFLZzRILFlBQVlWLFNBQVd0M0gsS0FBS3VJLFNBQVN3dEcsU0FBU3VRLE1BQU1qa0gsT0FFekRyQyxLQUFLcXZJLGlCQUFpQnRpRyxTQUFTL3NDLEtBQUtnNEgsWUFBWTk5RyxTQUVoRGxhLEtBQUs0NEgsUUFBUSx5QkFBMEI1NEgsS0FBS3VJLFNBQVMrdUgsVUFHakR0M0gsS0FBS3VJLFNBQVNpdEksZ0JBQWtCLEVBQ3BDLENBQ0ksTUFBTTVsQyxFQUFJOWdHLEtBQUtzdUQsT0FBT3A5RCxLQUFLdUksU0FBUzB2SCxhQUFlajRILEtBQUt1SSxTQUFTMnZILGNBQWdCLEdBQ2pGbDRILEtBQUtnNEgsWUFBWStWLGtCQUFvQnYxSCxTQUFTeFksS0FBS3VJLFNBQVN3dEcsU0FBUzAvQixnQkFBZ0I3bEMsR0FBSzV2RyxLQUFLdUksU0FBU2l0SSxnQkFBaUIsSUFDekh4MUksS0FBS2c0SCxZQUFZZ1gsZ0JBQWtCeDJILFNBQVN4WSxLQUFLdUksU0FBU3d0RyxTQUFTMi9CLGlCQUFpQjlsQyxHQUFLNXZHLEtBQUt1SSxTQUFTaXRJLGdCQUFpQixTQUt4SHgxSSxLQUFLZzRILFlBQVkrVixrQkFBb0IvdEksS0FBS3VJLFNBQVMrZ0ksYUFDbkR0cEksS0FBS2c0SCxZQUFZZ1gsZ0JBQWtCaHZJLEtBQUt1SSxTQUFTK2dJLGFBcUJyRCxJQUFJcU0sRUFBYUMsRUFqQmI1MUksS0FBS2c0SCxZQUFZeVcsVUFBVXBzSSxTQUUzQnJDLEtBQUtnNEgsWUFBWWdYLGdCQUFrQmxnSSxLQUFLbUIsSUFBSSxHQUFJalEsS0FBS2c0SCxZQUFZZ1gsa0JBSWpFaHZJLEtBQUt1SSxTQUFTd3RHLFNBQVNveUIsUUFFdkJub0ksS0FBS2c0SCxZQUFZOTlHLFFBQVFvd0gsY0FBZSxHQUk1Q3RxSSxLQUFLNDRILFFBQVEsZ0JBQWlCNTRILEtBQUt1SSxVQUduQ3ZJLEtBQUttMEksa0JBSUwsSUFBSTBCLEdBQXFCLEVBQ3JCQyxHQUF1QixFQXlDM0IsR0F0Q2dDLE1BQTVCUCxFQUFZOWMsY0FFWjhjLEVBQVk5YyxhQUFlejRILEtBQUt1SSxTQUFTa3dILGFBQ3pDa2QsRUFBY0MsR0FBYyxJQUk1QkQsRUFBOEMsTUFBaENKLEVBQVk3YyxrQkFBNEI3NEgsTUFBTTAxSSxFQUFZN2Msa0JBQ3hFa2QsRUFBNEMsTUFBOUJMLEVBQVk1YyxnQkFBMEI5NEgsTUFBTTAxSSxFQUFZNWMsaUJBSXRFZ2QsSUFHaUMsSUFBN0JKLEVBQVk5YyxjQUFzQno0SCxLQUFLdUksU0FBUytoSSxjQUFnQnRxSSxLQUFLdUksU0FBUysxSCxtQkFHOUVpWCxFQUFZN2MsaUJBQW1CMTRILEtBQUtnNEgsWUFBWStWLG1CQUloRCtILEdBQXVCLEVBQ3ZCUCxFQUFZN2MsaUJBQW1CMTRILEtBQUsrMUksV0FBV1IsRUFBWTljLGFBQWMsWUFJN0VtZCxJQUVBQyxHQUFxQixFQUNyQk4sRUFBWTVjLGVBQWlCMzRILEtBQUtnMkksV0FBV1QsRUFBWTljLGFBQWMsUUFHM0V6NEgsS0FBS28wSSxhQUFhbUIsR0FHbEJ2MUksS0FBS20wSSxrQkFFRG4wSSxLQUFLdUksU0FBUzB0SSxnQkFDbEIsQ0FDSSxJQUFJOTRILEVBQVE1VCxTQUFTMkIsZUFBZWxMLEtBQUt1SSxTQUFTdW1CLFNBQVcsU0FFekQzUixFQUVBQSxFQUFNNVIsVUFBWXZMLEtBQUt1SSxTQUFTd3RHLFNBQVNzUSxVQUl6Q3JtSCxLQUFLdUksU0FBU3NsSSxhQUFhemdDLGFBQ3ZCOGxCLEVBQUksTUFBT2x6SCxLQUFLNnZJLFVBQVUsU0FBVSxDQUFDN3ZJLEtBQUt1SSxTQUFTd3RHLFNBQVNzUSxZQUM1RHJtSCxLQUFLdUksU0FBU3NsSSxhQUFhem9CLFlBTW5DcGxILEtBQUt1SSxTQUFTKzFILG1CQUNkdCtILEtBQUtnNEgsWUFBWTNCLGFBQWFsc0gsTUFBTStySSxTQUFXbDJJLEtBQUt1SSxTQUFTNm1JLFdBQWEsS0FFMUVwdkksS0FBS2c0SCxZQUFZM0IsYUFBYWxzSCxNQUFNMDVHLFVBQVk3akgsS0FBS3VJLFNBQVM0bUksWUFBYyxNQUk1RTBHLEdBQXNCQyxLQUVsQkQsSUFDQTcxSSxLQUFLZzRILFlBQVlXLGVBQWlCMzRILEtBQUtnMkksV0FBV2gySSxLQUFLdUksU0FBU3d3SCxnQkFBaUIsUUFFakYrYyxJQUNBOTFJLEtBQUtnNEgsWUFBWVUsaUJBQW1CMTRILEtBQUsrMUksV0FBVy8xSSxLQUFLdUksU0FBU3d3SCxnQkFBaUIsV0FFdkYvNEgsS0FBS2c0SCxZQUFZa0MsU0FBU3NKLEtBQUt4akksS0FBS3VJLFNBQVN3d0gsZ0JBQWlCLzRILEtBQUtnNEgsWUFBWVcsZUFBZ0IzNEgsS0FBS2c0SCxZQUFZVSxtQkFJcEgxNEgsS0FBS2c0SCxZQUFZa0YsUUFBUyxFQUUxQmw5SCxLQUFLNDRILFFBQVEsZ0JBQWlCNTRILEtBQUt1SSxVQUd2QyxRQUFTMm1CLEdBRUwsTUFBTTd2QixFQUFPbUUsTUFBTTlFLFVBQVVnQyxNQUFNekQsS0FBSzBELFVBQVcsR0FDbkQsRUFBSzJqSCxPQUFPc1UsUUFBUTFwRyxFQUFPN3ZCLEVBQU1XLEtBQUs2MkgsZ0JBRzFDLGNBRUksT0FBTzcySCxLQUFLdUksU0FNaEIsbUJBRUksT0FBT3ZJLEtBQUtnNEgsWUFHaEIsb0JBRUksT0FBT2g0SCxLQUFLNjJILGVBR2hCLGVBRUksT0FBTzcySCxLQUFLZzRILFlBQVl5VyxVQUc1QixtQkFFSSxPQUFPenVJLEtBQUtnNEgsWUFBWWtDLFNBQVdsNkgsS0FBS2c0SCxZQUFZa0MsU0FBU2QsT0FBUyxLQUkxRSxjQUVJLE1BQU1iLEVBQVd2NEgsS0FBS2c0SCxZQUFZTyxTQUVsQyxNQUFPLENBQ0h4UyxJQUFLd1MsRUFBU3hTLElBQ2Q1NkUsS0FBTW90RixFQUFTcHRGLEtBQ2YwdkYsT0FBUXRDLEVBQVNzQyxPQUNqQnp2RixNQUFPbXRGLEVBQVNudEYsTUFFaEJubkIsTUFBT3MwRyxFQUFTdDBHLE1BQ2hCQyxPQUFRcTBHLEVBQVNyMEcsUUFJekIsZUFBZ0JxekcsR0FFWnYzSCxLQUFLZzRILFlBQVl3VyxhQUFhMkgsV0FBVzVlLEdBRzdDLGtCQUFtQkEsR0FFZnYzSCxLQUFLZzRILFlBQVl3VyxhQUFhNEgsY0FBYzdlLEdBR2hELGNBQWU1UyxFQUFXenFHLEdBRXRCLE1BQU1rL0csRUFBU3A1SCxLQUFLZzRILFlBQVlrQyxTQUFTZCxPQUNuQ3dCLEVBQVN4QixFQUFPM1QsY0FBY2QsRUFBV3pxRyxHQUUvQyxHQUFJQSxHQUFXQSxFQUFReXJHLG9CQUN2QixDQUNJLE1BQU13WSxFQUFlbitILEtBQUt1SSxTQUFTKzFILG1CQUFxQixRQUFVLFNBRWxFLEdBQUl0K0gsS0FBS2c0SCxZQUFZTyxTQUFTNEYsR0FBZ0IvRSxFQUFPL29CLFdBQVc4dEIsR0FDaEUsQ0FDSSxNQUFNa1ksR0FBYXIySSxLQUFLZzRILFlBQVlPLFNBQVM0RixHQUFnQi9FLEVBQU8vb0IsV0FBVzh0QixJQUFpQixFQUVoRyxPQUFJbitILEtBQUt1SSxTQUFTKzFILG1CQUVQLENBQ0h2WSxJQUFLNlUsRUFBTzdVLElBQ1o4VSxPQUFRRCxFQUFPQyxPQUVmMXZGLEtBQU15dkYsRUFBT3p2RixLQUFPa3JHLEVBQ3BCanJHLE1BQU93dkYsRUFBT3h2RixNQUFRaXJHLEdBS25CLENBQ0h0d0IsSUFBSzZVLEVBQU83VSxJQUFNc3dCLEVBQ2xCeGIsT0FBUUQsRUFBT0MsT0FBU3diLEVBRXhCbHJHLEtBQU15dkYsRUFBT3p2RixLQUNiQyxNQUFPd3ZGLEVBQU94dkYsUUFNOUIsT0FBT3d2RixFQUdYLGdDQUFpQ2pELEdBRTdCLE1BQU0yZSxFQUNJM2UsRUFBT3hzRixLQUFPbnJDLEtBQUtnNEgsWUFBWU8sU0FBU3B0RixLQUQ1Q21yRyxFQUVHM2UsRUFBTzVSLElBQU0vbEgsS0FBS2c0SCxZQUFZTyxTQUFTeFMsSUFHMUNrVCxFQUFnQmo1SCxLQUFLZzRILFlBQVlrQyxTQUFTOFksbUJBQzFDdUQsRUFBWXRkLEVBQWM1MkgsT0FHaEMsSUFBSyxJQUFJdkYsRUFBRSxFQUFHQSxFQUFJeTVJLEVBQVd6NUksSUFDN0IsQ0FDSSxNQUFNNm5ILEVBQVlzVSxFQUFjbjhILEdBQzFCODlILEVBQVM1NkgsS0FBS2c0SCxZQUFZa0MsU0FBU2QsT0FBTzNULGNBQWNkLEdBRTlELEdBQUlpVyxFQUFPenZGLE1BQVFtckcsR0FBa0IxYixFQUFPeHZGLE9BQVNrckcsR0FDakQxYixFQUFPN1UsS0FBT3V3QixHQUFpQjFiLEVBQU9DLFFBQVV5YixFQUVoRCxNQUFPLENBQ0hoZSxXQUFZM1QsRUFDWjV1RyxPQUFRLENBQ0pvMUIsS0FBTW1yRyxFQUFpQjFiLEVBQU96dkYsS0FDOUI0NkUsSUFBS3V3QixFQUFnQjFiLEVBQU83VSxNQVE1QyxNQUFNb3RCLEVBQWdCbnpJLEtBQUtnNEgsWUFBWWtDLFNBQVNkLE9BQU8zVCxjQUFjemxILEtBQUt1SSxTQUFTd3dILGlCQUVuRixNQUFPLENBQ0hULFdBQVl0NEgsS0FBS3VJLFNBQVN3d0gsZ0JBQzFCaGpILE9BQVEsQ0FDSm8xQixLQUFNbXJHLEVBQWlCbkQsRUFBY2hvRyxLQUNyQzQ2RSxJQUFLdXdCLEVBQWdCbkQsRUFBY3B0QixNQWUvQyxnQkFBaUJ5d0IsRUFBWXZjLElBc0J6QixTQUFzQjMxRyxFQUFHQyxHQUVyQixHQUFJRCxFQUFFamlCLFNBQVdraUIsRUFBRWxpQixPQUNmLE9BQU8sRUFFWCxJQUFLLElBQUl2RixFQUFJLEVBQUc2SCxFQUFNMmYsRUFBRWppQixPQUFRdkYsRUFBSTZILEVBQUs3SCxJQUVyQyxHQUFJd25CLEVBQUV4bkIsS0FBT3luQixFQUFFem5CLEdBQ1gsT0FBTyxFQUVmLE9BQU8sRUE5Qk4yNUksQ0FBWXoySSxLQUFLZzRILFlBQVk4VixtQkFBb0I3VCxJQUVsRGo2SCxLQUFLZzRILFlBQVk4VixtQkFBcUI3VCxFQUNsQ2o2SCxLQUFLZzRILFlBQVllLGtCQUFvQnlkLElBRXJDeDJJLEtBQUtnNEgsWUFBWWUsZ0JBQWtCeWQsRUFDbkN4MkksS0FBSzQ0SCxRQUFRLHNCQUF1QjRkLElBRXhDeDJJLEtBQUs0NEgsUUFBUSx1QkFBd0JxQixHQUdqQ2o2SCxLQUFLZzRILFlBQVlqaUIsU0FBU3VRLE1BQU1rd0IsR0FBWUUsWUFBWXIwSSxPQUFTLEdBQ2pFckMsS0FBSzQ0SCxRQUFRLCtCQUFnQzRkLElBRTVDeDJJLEtBQUtnNEgsWUFBWWUsa0JBQW9CeWQsSUFFMUN4MkksS0FBS2c0SCxZQUFZZSxnQkFBa0J5ZCxFQUNuQ3gySSxLQUFLNDRILFFBQVEsc0JBQXVCNGQsSUFpQjVDLFlBQWE3eEIsR0FFVCxPQUFPM2tILEtBQUtnNEgsWUFBWWppQixTQUFTdVEsTUFBTTNCLEdBQVdyRSxFQUd0RCxPQUFRdXdCLEdBRUo3d0ksS0FBS28wSSxhQUFhdkQsR0FHdEIsS0FBTWhaLEVBQVdvYixHQUViLE9BQU9qekksS0FBS2lqSCxXQUFXNFUsRUFBV29iLEdBR3RDLG1CQUVTanpJLEtBQUtnNEgsWUFBWW9XLGVBRWxCcHVJLEtBQUs0MEksa0JBQ0w1MEksS0FBSzIySSx1QkFDTDMySSxLQUFLZzRILFlBQVk5OUcsUUFBUTQ2SCxnQkFBa0I5MEksS0FBS2c0SCxZQUFZZ1csaUJBQzVEaHVJLEtBQUtnNEgsWUFBWTk5RyxRQUFRMjZILGtCQUFvQjcwSSxLQUFLZzRILFlBQVlpVyxtQkFDOURqdUksS0FBS2c0SCxZQUFZdGdHLGdCQUFnQnZ0QixNQUFNcVEsU0FBVyxPQUNsRHhhLEtBQUtnNEgsWUFBWW9XLGNBQWUsR0FJeEMsdUJBRVFwdUksS0FBS2c0SCxZQUFZaVgsZUFBZXYvRyxhQUFhLGdCQUM3QzF2QixLQUFLZzRILFlBQVlpWCxlQUFlamxJLGdCQUFnQixlQUd4RCxvQkFFUWhLLEtBQUtnNEgsWUFBWW9XLGVBR2pCcHVJLEtBQUsrakgsd0JBR0wvakgsS0FBS2c0SCxZQUFZdVcsWUFBWXFJLFNBQVcsS0FDeEM1MkksS0FBS2c0SCxZQUFZdVcsWUFBWXNJLFlBQWMsS0FHM0M3MkksS0FBS2c0SCxZQUFZdGdHLGdCQUFnQnZ0QixNQUFNcVEsU0FBVyxTQUdsRHhhLEtBQUtnNEgsWUFBWWdXLGlCQUFtQmh1SSxLQUFLdUksU0FBU3VzSSxnQkFDbEQ5MEksS0FBS2c0SCxZQUFZaVcsbUJBQXFCanVJLEtBQUt1SSxTQUFTc3NJLGtCQUNwRDcwSSxLQUFLZzRILFlBQVk5OUcsUUFBUTQ2SCxpQkFBa0IsRUFDM0M5MEksS0FBS2c0SCxZQUFZOTlHLFFBQVEyNkgsbUJBQW9CLEVBRTdDNzBJLEtBQUtnNEgsWUFBWW9XLGNBQWUsR0FJeEMsd0JBRVNwdUksS0FBS2c0SCxZQUFZaVgsZUFBZXYvRyxhQUFhLGdCQUM5QzF2QixLQUFLZzRILFlBQVlpWCxlQUFlemtJLGFBQWEsY0FBZSxJQW9CcEUsUUFFSXhLLEtBQUtteEksY0FHVCwwQkFBMkJ6QyxHQUV2QjF1SSxLQUFLZzRILFlBQVkwVyx1QkFBeUJBLEVBRzlDLFVBR0kxdUksS0FBSzQ0SCxRQUFRLHNCQUF1QjU0SCxLQUFLdUksVUFHckN2SSxLQUFLdUksU0FBU21tSSx3QkFDZDF1SSxLQUFLdUksU0FBU21tSSx1QkFBdUJoN0YsUUFHekNucUMsU0FBU21PLEtBQUtvL0gsWUFBWSx1QkFHMUI5MkksS0FBS3VJLFNBQVNzbEksYUFBYS8vSCxTQUFTaUwsUUFBUWcrSCxXQUFXLFFBR3ZELzJJLEtBQUt1SSxTQUFTc2xJLGFBQWEvL0gsU0FBU2twSSxXQUFXLFNBQVNBLFdBQVcsU0FFbkVoM0ksS0FBSzQ0SCxRQUFRLHFCQUFzQjU0SCxLQUFLdUksVUFHeEMsRUFBSys3RyxPQUFPMnlCLGVBQWVqM0ksS0FBS3VJLFNBQVNpOEcsS0UvOUNsQyxTQUFTMHlCLEVBQWlCNzRJLEdBRXJDLElBSUlOLEVBSkFoQixFQUFJc0IsRUFBSTJ5SCxNQUNSQSxFQUFzQixpQkFBTmowSCxFQUFrQkEsRUFBRVMsT0FBT2lJLEtBQUsxSSxHQUFHLElBQUksR0FBS0EsRUFFNUR3dEIsRUFBSWxzQixFQUFJTixNQWdCWixPQVpJQSxFQUZBeUYsTUFBTWdtQixRQUFRZSxHQUVOQSxFQUFFemEsSUFBSTZGLEdBQUtBLEVBQUVuWSxPQUFPaUksS0FBS2tRLEdBQUcsS0FJZCxpQkFBTjRVLEVBQWtCQSxFQUFFL3NCLE9BQU9pSSxLQUFLOGtCLEdBQUcsSUFBTUEsRUFHekQvbUIsTUFBTWdtQixRQUFRenJCLEtBRWRBLEVBQVFBLEVBQU04aEIsS0FBSyxPQUdoQixDQUNIbXhHLE1BQU9BLEVBQ1BqekgsTUFBT0EsR0M3QmYsTUFBTW81SSxHQUFrQixDQUFDbHpILEVBQU9DLEtBRTVCLE1BQU1rekgsRUFBbUJ0b0ksS0FBS21CLElBQUlnVSxFQUFPQyxHQUN6QyxPQUFJa3pILEVBQW1CLElBQ1osRUFDSnRvSSxLQUFLMDJCLEtBQUsxMkIsS0FBS29sQixLQUFLa2pILEVBQW1CLEdBQUssS0FBYXRvSSxLQUFLb2xCLElBQUksS0FHdkVtakgsR0FBa0IsQ0FBQ0MsRUFBZ0JDLElBQW1CRCxFQUFrQnhvSSxLQUFLaXpHLElBQUksRUFBR3cxQixHQUVwRkMsR0FBb0IsQ0FBQ2QsRUFBYWUsSUFFN0JmLEVBQVk1bUksSUFBTTRuSSxJQUVyQixNQUFNbjFJLEVBQUltMUksRUFBSXp6SCxNQUNSNHZCLEVBQUk2akcsRUFBSXh6SCxPQUNSaEMsRUFBT3kxSCxHQUFlRCxHQUN0Qi9pRyxFQUE2QixNQUF2Qnp5QixFQUFLeXlCLElBQUlqMEMsT0FBTyxHQUFhd2hCLEVBQUt5eUIsSUFBTSxJQUFNenlCLEVBQUt5eUIsSUFFekQ2a0YsRUFBTyxJQUFJaDJILE1BQU1pMEksRUFBZ0IsR0FDdkMsSUFBSyxJQUFJbHBJLEVBQUksRUFBR0EsRUFBSWtwSSxFQUFnQixFQUFHbHBJLElBRW5DaXJILEVBQUtqckgsR0FBSyxDQUNOc2xDLEVBQUcva0MsS0FBS3N1RCxNQUFNaTZFLEdBQWdCeGpHLEVBQUc0akcsRUFBZ0JscEksSUFDakRoTSxFQUFHdU0sS0FBS3N1RCxNQUFNaTZFLEdBQWdCOTBJLEVBQUdrMUksRUFBZ0JscEksS0FJekQsTUFBTyxDQUNIK3hHLEVBQUdwK0YsRUFBS3l5QixJQUNSQSxJQUFLQSxFQUNMaWpHLEdBQUlGLEVBQUkxbUIsT0FBUyxHQUNqQjV6SCxFQUFHbzhILEtBd0JBLFNBQVNxZSxHQUFtQjloQyxHQUV2QyxJQUFJaHNGLEVBQU1nc0YsRUFBUyxZQUVuQixJQUFLaHNGLEVBR0QsT0FEQXBuQixRQUFRNEIsTUFBTSw2Q0FDUCxLQUdYLE1BQU11M0MsRUE3QnlCLENBQUNwM0MsR0FFaEIsbURBQVpBLEdBRUtsQixNQUFNZ21CLFFBQVE5a0IsSUFBWUEsRUFBUWd6RSxTQUFTLGtEQUR6QyxFQUdGbDBFLE1BQU1nbUIsUUFBUTlrQixJQUFZQSxFQUFRZ3pFLFNBQVMsa0RBQ3pDLEVBRUEsRUFvQktvZ0UsQ0FBMkIvdEgsR0FDckNtOEYsRUFBV25RLEVBQVNvUSxVQUFZcFEsRUFBU29RLFVBQVUsR0FBSyxLQUN4REMsRUFBV0YsRUFBV0EsRUFBU0UsU0FBV3JRLEVBQVNqUixNQUNuRGl6QyxFQUFjM3hCLEVBQVMvakgsT0FFdkJpa0gsRUFBUSxJQUFJOWlILE1BQU00aUgsRUFBUy9qSCxRQUVqQyxJQUFJMjFJLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBRUF6ekksRUFDQWl3QyxFQUNBenlCLEVBQ0FrMkgsRUFDQW4wSCxFQUNBQyxFQUNBMHBILEVBQ0FubEMsRUFDQXVvQixFQUNBcW5CLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBYkE5QixFQUFjLEdBZWRlLEVBQWdCLElBQ2hCOU4sRUFBVyxFQUNYRCxFQUFXLElBSWYsSUFBSyxJQUFJOTVCLEVBQUksRUFBR0EsRUFBSW1vQyxFQUFhbm9DLElBQ2pDLENBQ0ksTUFBTXp5RyxFQUFJaXBILEVBQVN4VyxHQUNicnRHLEVBQUlwRixFQUFFOG1CLE1BQ040dkIsRUFBSTEyQyxFQUFFK21CLE9BQ051MEgsRUFBS3RCLEdBQWdCNTBJLEVBQUdzeEMsR0FDeEI2a0csRUFBUTdrRyxFQUFJdHhDLEVBQ2xCb25JLEVBQVc3NkgsS0FBS21CLElBQUl5b0ksRUFBTy9PLEdBQzNCRCxFQUFXNTZILEtBQUtrQixJQUFJMG9JLEVBQU9oUCxHQUUzQitOLEVBQWdCM29JLEtBQUtrQixJQUFJeW5JLEVBQWVnQixHQU01QyxNQUFNRSxFQUFjLElBQUluMUksTUFBTWkwSSxFQUFnQixHQUFHcnRJLEtBQUssR0FDaER3dUksRUFBZSxJQUFJcDFJLE1BQU1pMEksRUFBZ0IsR0FBR3J0SSxLQUFLLEdBQ2pEeXVJLEVBQVksSUFBSXIxSSxNQUFNaTBJLEVBQWdCLEdBQUdydEksS0FBSyxHQUM5QzB1SSxFQUFhLElBQUl0MUksTUFBTWkwSSxFQUFnQixHQUFHcnRJLEtBQUssR0FFckQsSUFBSyxJQUFJdE4sRUFBSSxFQUFHQSxFQUFJaTdJLEVBQWFqN0ksSUFDakMsQ0EwQkksR0F6QkFrN0ksRUFBYTV4QixFQUFTdHBILEdBQ3RCMnJHLEVBQVN1dkMsRUFBVyxRQUFVQSxFQUFXdHZJLEdBQ3pDc29ILEVBQVFnbkIsRUFBV2huQixNQUNuQmluQixFQUFlRCxFQUFXZSxPQUFTZixFQUFXZSxPQUFPLEdBQUdDLFNBQVdoQixFQUFXbHpDLE1BQU0sR0FBR0EsTUFBTSxHQUFHcHRGLEtBTWhHZy9ILEVBQWMsR0FDZ0IsY0FBMUJ1QixFQUFhLFVBQWtELFdBQXRCQSxFQUFhcjJJLE1BRXREczJJLEVBQVlELEVBQWExbEksU0FBVzBsSSxFQUFhbnpDLE1BQU0sR0FDdkRxekMsRUFBa0JGLEVBQWF2dUgsTUFBUXV1SCxFQUFhbnpDLE1BQU1wa0csTUFBTSxHQUNoRWcySSxFQUFjYyxHQUFrQlcsRUFBaUJWLElBSWpEUyxFQUFZRCxFQUloQmgwSCxFQUFRK3pILEVBQVcvekgsT0FBU2kwSCxFQUFVajBILE1BQ3RDQyxFQUFTOHpILEVBQVc5ekgsUUFBVWcwSCxFQUFVaDBILE9BRXBDRCxHQUFTLEdBQUtDLEdBQVUsRUFDNUIsQ0FDSXZoQixRQUFRQyxLQUFLLHNDQUF3Q291SCxFQUFRLGNBQzdELFNBR0o0YyxFQUFVdUosR0FBZ0JsekgsRUFBT0MsR0FFakNtMEgsRUFBYUgsRUFBVWxuQixPQUFTLEtBRWhDOXVHLEVBQU95MUgsR0FBZU8sR0FDdEJ2akcsRUFBNkIsTUFBdkJ6eUIsRUFBS3l5QixJQUFJajBDLE9BQU8sR0FBYXdoQixFQUFLeXlCLElBQU0sSUFBTXp5QixFQUFLeXlCLElBRXpEandDLEVBQVV3ekksRUFBVWUsUUFBUSxhQUFlZixFQUFVZSxRQUFRcjNJLEtBSXpEdzJJLEVBRlksNENBQVoxekksR0FBcUUsa0JBQVpBLEVBRXZDLEVBRUQsZ0VBQVpBLEVBRWEsSUFJQSxFQUd0QjR6SSxFQUFpQixJQUFJOTBJLE1BQU1pMEksRUFBZ0IsR0FFM0MsSUFBSyxJQUFJcHpILEVBQUksRUFBR0EsRUFBSW96SCxFQUFnQixFQUFHcHpILElBRW5DazBILEVBQTBCenBJLEtBQUtzdUQsTUFBTWk2RSxHQUFnQnB6SCxFQUFPd3pILEVBQWdCcHpILElBQzVFbTBILEVBQTJCMXBJLEtBQUtzdUQsTUFBTWk2RSxHQUFnQm56SCxFQUFRdXpILEVBQWdCcHpILElBQzlFaTBILEVBQWVqMEgsR0FBSyxDQUNoQnd2QixFQUFHMmtHLEVBQ0hqMkksRUFBR2cySSxHQUdQSSxFQUFZdDBILElBQU1rMEgsRUFDbEJLLEVBQWF2MEgsSUFBTW0wSCxFQUNuQkssRUFBVXgwSCxHQUFLdlYsS0FBS21CLElBQUlzb0ksRUFBeUJNLEVBQVV4MEgsSUFDM0R5MEgsRUFBV3owSCxHQUFLdlYsS0FBS21CLElBQUl1b0ksRUFBMEJNLEVBQVd6MEgsSUFHbEUsSUFBSTYwSCxFQUFxQyxjQUEzQmxCLEVBQVdtQixlQUFnQ25CLEVBQVczeEMsVUFBc0MsY0FBM0IyeEMsRUFBVzN4QyxTQUFTLEdBQy9GK3lDLEVBQXNDLGlCQUEzQnBCLEVBQVdtQixlQUFtQ25CLEVBQVczeEMsVUFBc0MsaUJBQTNCMnhDLEVBQVczeEMsU0FBUyxHQUV2R2lnQixFQUFNeHBILEdBQUssQ0FDUE0sRUFBR2s3SSxFQUNIcDdJLEVBQUcwd0ksRUFDSDd3SSxFQUFHaTBILEVBQ0g0bUIsR0FBSVMsRUFDSi8zQixFQUFHcCtGLEVBQUt5eUIsSUFDUkEsSUFBS0EsRUFDTG5HLElBQUs0cEcsRUFDTGpRLE1BQU8rUSxFQUNQN1EsWUFBYStRLEVBQ2Izd0MsT0FBUUEsRUFDUml1QyxZQUFhQSxFQUNiMkMsUUFBU24zSCxFQUFLdFEsR0FBSyxLQUNuQjBuSSxRQUFTcDNILEVBQUtsUSxHQUFLLE1BSTNCLE1BQU11bkksRUFBZ0IsSUFBSS8xSSxNQUFNaTBJLEVBQWdCLEdBQzFDK0IsRUFBaUIsSUFBSWgySSxNQUFNaTBJLEVBQWdCLEdBRWpELElBQUssSUFBSW56SCxFQUFJLEVBQUdBLEVBQUltekgsRUFBZ0IsRUFBR256SCxJQUVuQ2kxSCxFQUFjajFILEdBQUtxMEgsRUFBWXIwSCxHQUFLeXpILEVBQ3BDeUIsRUFBZWwxSCxHQUFLczBILEVBQWF0MEgsR0FBS3l6SCxFQUcxQyxNQUFNdmUsRUFBTyxDQUNUaWdCLE1BQU9GLEVBQ1BHLE1BQU9GLEVBQ1BHLE1BQU9kLEVBQ1BlLE1BQU9kLEVBQ1BlLFVBQVdsUSxFQUNYbVEsVUFBV3BRLEVBQ1hxUSxNQUFPbkIsRUFDUG9CLE1BQU9yQixHQUlYLE1BQU8sQ0FDSDc4RixRQUFTQSxFQUNUbStGLFdBQVkvQyxFQUFnQm5oQyxHQUFVaWIsTUFDdEM3cUYsU0FBVTR2RSxFQUFTNXZFLFVBQVksS0FDL0JxekYsS0FBTUEsRUFDTjBnQixTQUFVekMsRUFDVjBDLElBQUs3ekIsRUFDTDZoQixNQUFnQyxVQUF6QnB5QixFQUFTb2pDLGVBQTRCcGpDLEVBQVNxa0MsV0FBc0MsVUFBMUJya0MsRUFBU3FrQyxVQUFVLE1BQTRCbDBCLEdBQW9DLFVBQXpCQSxFQUFTaXpCLGFBWTVJLFNBQVN4QixHQUFnQnFCLEdBRXJCLElBQUlya0csRUFBTXFrRyxFQUFTLFFBQVVBLEVBQVN0d0ksR0FDdEMsTUFBTTJ4SSxFQUFnQixzQ0FDdEIsSUFBSUMsRUFBTyxHQUNQQyxHQUFXLEVBRWYsR0FBSSxvQ0FBb0N2ekksS0FBSzJ0QyxHQUM3QyxDQUdJLE1BQU02bEcsRUFBVzdsRyxFQUFJNW5CLE1BQU0sS0FDM0J1dEgsRUFBT0UsRUFBU0EsRUFBU240SSxPQUFTLFFBRWpDLEdBQUlnNEksRUFBY3J6SSxLQUFLMnRDLEdBQzVCLENBR0kybEcsRUFEZUQsRUFBYzE0RyxLQUFLZ1QsR0FDcEIsUUFFVHFrRyxFQUFTQyxVQUFZRCxFQUFTQyxRQUFRLFFBQVVELEVBQVNDLFFBQVF2d0ksTUFHdEVpc0MsRUFBTXFrRyxFQUFTQyxRQUFRLFFBQVVELEVBQVNDLFFBQVF2d0ksR0FDbEQ2eEksR0FBVyxHQUdYQSxJQUdBNWxHLEVBQU1BLEVBQUk1bkIsTUFBTSxLQUFLcnNCLE1BQU0sR0FBSSxHQUFHbWYsS0FBSyxNQUczQyxNQUFNNDZILEVBQVksQ0FDZDlsRyxJQUFLQSxHQUdULEdBQUkybEcsRUFBS2o0SSxPQUNULENBRUksTUFBTWd1RyxFQUFhaXFDLEVBQUt2dEgsTUFBTSxLQUM5QjB0SCxFQUFVN29JLEVBQUk0RyxTQUFTNjNGLEVBQVcsR0FBSSxJQUN0Q29xQyxFQUFVem9JLEVBQUl3RyxTQUFTNjNGLEVBQVcsR0FBSSxJQUN0Q29xQyxFQUFVbDRJLEVBQUlpVyxTQUFTNjNGLEVBQVcsR0FBSSxJQUN0Q29xQyxFQUFVNW1HLEVBQUlyN0IsU0FBUzYzRixFQUFXLEdBQUksSUFHMUMsT0FBT29xQyxFQzVTSSxNQUFNQyxHQUVqQixnQkFBaUIza0MsRUFBVTRPLEVBQVcxekcsR0FFbEMsSUFBSTBwSSxFQUlBQSxHQUZDMXBJLEdBQXVCLE1BQWRBLEVBQUtnVCxPQUFnQyxNQUFmaFQsRUFBS2lULE9BRTVCLFFBSWUsTUFBZGpULEVBQUtnVCxNQUFnQixHQUFLaFQsRUFBS2dULE9BQVMsS0FBc0IsTUFBZmhULEVBQUtpVCxPQUFpQixHQUFLalQsRUFBS2lULFFBRzdGLE1BQU0yZ0csRUFBTzlPLEVBQVN1USxNQUFNM0IsR0FDdEJpMkIsRUFBVy8xQixFQUFLcjJFLElBQU0sSUFBTyxVQUFZLFNBRS9DLE9BQU9qeEIsVUFBVXNuRyxFQUFLbHdFLElBQU0sUUFBVWdtRyxFQUFTLE1BQVFDLEVBQVUsUUFHckUsZ0JBQWlCN2tDLEVBQVU0TyxFQUFXbjhHLEdBRWxDLE1BQU1xOEcsRUFBTzlPLEVBQVN1USxNQUFNM0IsR0FFNUIsSUFBSXpnRyxFQUFRRCxFQUlSQyxFQUZBMWIsRUFBT2lvQyxNQUFRam9DLEVBQU9xeUksU0FBVyxFQUV4QmgyQixFQUFLem5ILEVBQUVvTCxFQUFPcXZILFdBQVdoa0YsR0FBS3JyQyxFQUFPcXlJLFNBQVcsR0FBS3J5SSxFQUFPOHBJLGVBQWVwdUgsT0FJM0UxYixFQUFPOHBJLGVBQWVwdUgsT0FLL0JELEVBRkF6YixFQUFPMHpILE1BQVExekgsRUFBT3N5SSxTQUFXLEVBRXpCajJCLEVBQUt6bkgsRUFBRW9MLEVBQU9xdkgsV0FBV3QxSCxHQUFLaUcsRUFBT3N5SSxTQUFXLEdBQUt0eUksRUFBTzhwSSxlQUFlcnVILE1BSTNFemIsRUFBTzhwSSxlQUFlcnVILE1BR2xDLE1BQU1zekgsRUFBaUJ6b0ksS0FBS2l6RyxJQUFJLEVBQUdoTSxFQUFTNjNCLFFBQVVwbEksRUFBT3F2SCxXQUU3RCxJQUFJam1ILEVBQUlwSixFQUFPMHpILElBQU0xekgsRUFBTzhwSSxlQUFlcnVILE1BQVFzekgsRUFDL0N2bEksRUFBSXhKLEVBQU9pb0MsSUFBTWpvQyxFQUFPOHBJLGVBQWVwdUgsT0FBU3F6SCxFQUVoRDF5QixFQUFLbG1ILGVBQWUsYUFFcEJpVCxHQUFLaXpHLEVBQUt3MEIsUUFDVnJuSSxHQUFLNnlHLEVBQUt5MEIsU0FHZCxNQUFNMWUsRUFBUyxDQUFDaHBILEVBQUdJLEVBQUdpUyxFQUFRc3pILEVBQWdCcnpILEVBQVNxekgsR0FBZ0IxM0gsS0FBSyxLQUV0RSs2SCxFQUFXLzFCLEVBQUtyMkUsSUFBTSxJQUFPLFVBQVksU0FFL0MsT0FBT2p4QixVQUFVc25HLEVBQUtsd0UsSUFBTWltRixFQUFTLElBQU0zMkcsRUFBUSxJQUFNQyxFQUFTLE1BQVEwMkgsRUFBVSxTQ3hEN0UsTUFBTSxHQUVqQixZQUFhL3lILEVBQU1rekgsR0FHZi82SSxLQUFLc21ILE1BQVF6K0YsRUFBS3N5SCxJQUNsQm42SSxLQUFLNHRJLFFBQVUvbEgsRUFBS3F5SCxTQUNwQmw2SSxLQUFLMnBJLFNBQVc5aEgsRUFBSzJ4RyxLQUFLcWdCLFVBQzFCNzVJLEtBQUswcEksU0FBVzdoSCxFQUFLMnhHLEtBQUtzZ0IsVUFDMUI5NUksS0FBS3FtSCxVQUFZeCtGLEVBQUtveUgsV0FDdEJqNkksS0FBS21tQyxTQUFXdGUsRUFBS3NlLFNBR3JCbm1DLEtBQUttb0ksUUFBVXRnSCxFQUFLc2dILE1BR3BCbm9JLEtBQUtnN0ksV0FBYW56SCxFQUFLMnhHLEtBQUttZ0IsTUFDNUIzNUksS0FBS2k3SSxZQUFjcHpILEVBQUsyeEcsS0FBS29nQixNQUM3QjU1SSxLQUFLazdJLGVBQWlCcnpILEVBQUsyeEcsS0FBS2lnQixNQUNoQ3o1SSxLQUFLbTdJLGdCQUFrQnR6SCxFQUFLMnhHLEtBQUtrZ0IsTUFDakMxNUksS0FBS283SSxjQUFnQnZ6SCxFQUFLMnhHLEtBQUt1Z0IsTUFDL0IvNUksS0FBS3E3SSxhQUFleHpILEVBQUsyeEcsS0FBS3dnQixNQUU5Qmg2SSxLQUFLczdJLFlBQWNQLEVBR3ZCLGdCQUFpQlEsR0FFYixNQUFNMXpILEVBQU9nd0gsR0FBa0IwRCxHQUMvQixPQUFPLElBQUksR0FBYzF6SCxFQUFNLElBQUk2eUgsSUFHdkMsWUFBYS8xQixFQUFXeWpCLEdBRXBCLFNBQUtBLEdBQXFCcG9JLEtBQUttb0ksUUFBVW5vSSxLQUFLc21ILE1BQU0zQixHQUFXd2pCLFNBS3hEeGpCLEdBQWEsR0FBS0EsRUFBWTNrSCxLQUFLc21ILE1BQU1qa0gsUUFHcEQscUJBQXNCc2lILEdBRWxCLE1BQU02MkIsRUFBVXg3SSxLQUFLc21ILE1BQU0zQixHQUFXdm5ILEVBQUU0QyxLQUFLNHRJLFNBRTdDLE1BQU8sQ0FDSDFwSCxPQUFRczNILEVBQVEzbkcsRUFDaEI1dkIsTUFBT3UzSCxFQUFRajVJLEdBSXZCLDZCQUE4Qm9pSCxFQUFXa1QsR0FFckMsTUFBTTJqQixFQUFVeDdJLEtBQUtzbUgsTUFBTTNCLEdBQVd2bkgsRUFBRTRDLEtBQUs0dEksU0FFdkNwVixHQTZGVThPLEVBN0ZpQnRuSSxLQUFLNHRJLFFBNkZMNk4sRUE3RmM1akIsRUErRjVDLEVBQUkvb0gsS0FBS2l6RyxJQUFJLEVBQUd1bEIsRUFBa0JtVSxJQUY3QyxJQUF3Qm5VLEVBQWlCbVUsRUEzRmpDLE1BQU8sQ0FDSHYzSCxPQUFRczNILEVBQVEzbkcsRUFBSTJrRixFQUNwQnYwRyxNQUFPdTNILEVBQVFqNUksRUFBSWkySCxHQVMzQixnQkFBaUI3VCxFQUFXMXpHLEdBRXhCLE9BQU9qUixLQUFLczdJLFlBQVlqSixnQkFBZ0JyeUksS0FBTTJrSCxFQUFXMXpHLEdBTTdELGtCQUFtQjB6RyxFQUFXa1QsRUFBV3lhLEdBRXJDLE1BQU16dEIsRUFBTzdrSCxLQUFLc21ILE1BQU0zQixHQUV4QixJQUFLL3FGLFNBQVNpK0YsSUFBY0EsRUFBWSxHQUFNLEVBRTFDLE1BQU0sSUFBSXIySCxVQUFVLGtDQUFvQ3EySCxHQUc1RCxNQUFNNStFLEVBQU9ucUMsS0FBSzAyQixLQUFLcS9FLEVBQUt6bkgsRUFBRXk2SCxHQUFXaGtGLEVBQUl5K0YsRUFBZXB1SCxRQUN0RDQzRyxFQUFPaHRILEtBQUswMkIsS0FBS3EvRSxFQUFLem5ILEVBQUV5NkgsR0FBV3QxSCxFQUFJK3ZJLEVBQWVydUgsT0FFdER1NEcsRUFBUSxHQUVkLElBQUkvckYsRUFBS3lyRixFQUFLdm5GLEVBRWQsSUFBS2xFLEVBQU0sRUFBR0EsRUFBTXdJLEVBQU14SSxJQUV0QixJQUFLeXJGLEVBQU0sRUFBR0EsRUFBTUosRUFBTUksSUFFdEJ2bkYsRUFBTTMwQyxLQUFLczdJLFlBQVlJLGdCQUFnQjE3SSxLQUFNMmtILEVBQVcsQ0FDcERsMEUsSUFBS0EsRUFDTHlyRixJQUFLQSxFQUNMMmUsU0FBVTVoRyxFQUNWNmhHLFNBQVVoZixFQUNWakUsVUFBV0EsRUFDWHlhLGVBQWdCQSxJQUtwQjlWLEVBQU1wNkgsS0FBSyxDQUNQcXVDLElBQUtBLEVBQ0x5ckYsSUFBS0EsRUFDTHJFLFVBQVdBLEVBQ1h4bkIsV0FBWSxDQUNSbnNGLE9BQVFvdUgsRUFBZXB1SCxPQUN2QkQsTUFBT3F1SCxFQUFlcnVILE9BRTFCbE8sT0FBUSxDQUNKZ3dHLElBQUt0MUUsRUFBTTZoRyxFQUFlcHVILE9BQzFCaW5CLEtBQU0rd0YsRUFBTW9XLEVBQWVydUgsT0FFL0Iwd0IsSUFBS0EsSUFLakIsTUFBTyxDQUNIa2pGLFVBQVdBLEVBQ1g1K0UsS0FBTUEsRUFDTjZpRixLQUFNQSxFQUNOVSxNQUFPQSxJQVluQixTQUFTbWYsR0FBc0JDLEdBRTNCLE9BQU8sU0FBVS9qQixHQUViLE9BQU83M0gsS0FBSzQ3SSxHQUFhL2pCLElBWGpDLEdBQWNuNUgsVUFBVW05SSxZQUFjRixHQUFxQixjQUMzRCxHQUFjajlJLFVBQVVvOUksYUFBZUgsR0FBcUIsZUFDNUQsR0FBY2o5SSxVQUFVKzJJLGdCQUFrQmtHLEdBQXFCLGtCQUMvRCxHQUFjajlJLFVBQVVnM0ksaUJBQW1CaUcsR0FBcUIsbUJBQ2hFLEdBQWNqOUksVUFBVXE5SSxjQUFnQkosR0FBcUIsZ0JBQzdELEdBQWNqOUksVUFBVXM5SSxlQUFpQkwsR0FBcUIsaUJDNUkvQyxNQUFNLEdBRWpCLFlBQWFNLEdBRVRqOEksS0FBS2k4SSxPQUFTQSxFQUNkajhJLEtBQUt1SSxTQUFXMHpJLEVBQU8xekksU0FHM0IsV0FBWWtvSSxFQUFPdmxILEdBRWYsTUFBTXdsSCxFQUFRLENBQ1Zob0ksR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUtpc0IsRUFDdkIvWixNQUFPLFFBQVUrWixHQUdyQixPQUFJdmxILEVBQ08xdEIsT0FBT21oQyxPQUFPK3hHLEVBQU94bEgsR0FFckJ3bEgsRUFLZixXQUFZeGhILEVBQU95TCxHQUVmLEVBQUsycEYsT0FBT0MsVUFBVXIxRixFQUFPeUwsRUFBVTM2QixLQUFLdUksU0FBU2k4RyxJQUl6RCxhQUFjbm5ILEVBQU0yekgsRUFBT3IyRixFQUFVdWhILEdBRWpDLE1BQU1wcEIsRUFBU0ksRUFBSSxTQUFVLENBQ3pCdHhILEtBQU0sU0FDTjhHLEdBQUkxSSxLQUFLdUksU0FBU2k4RyxHQUFLbm5ILEVBQ3ZCcTVILE1BQU8sUUFBVXI1SCxFQUFPLGVBQ3hCOGYsTUFBTzZ6RyxFQUNQLGFBQWNBLElBU2xCLE9BTklrckIsR0FDQXBwQixFQUFPdDlGLFlBQVkwbUgsR0FFbkJ2aEgsR0FDQW00RixFQUFPanZILGlCQUFpQixRQUFTODJCLEdBRTlCbTRGLEVBR1gsWUFBYXoxSCxFQUFNcUwsRUFBSXNvSCxFQUFPbXJCLEVBQVdDLEdBRXJDLE9BQU9scEIsRUFBSSxNQUFPLENBQUV4cUgsR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUs5N0csRUFBSWd1SCxNQUFPcjVILEVBQU8sZUFDakQsQ0FBRTJ6SCxFQUFPa0MsRUFBSSxPQUFRLENBQUV4cUgsR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUsyM0IsR0FBYUMsS0FJM0Usb0JBRUksSUFBSUMsRUFBY3I4SSxLQUFLczhJLHFCQUNuQkMsRUFBYXY4SSxLQUFLdzhJLG9CQUVsQkMsRUFBYyxDQUNkejhJLEtBQUswOEksYUFBYSxrQkFBbUIsV0FBWSxLQUM3QzE4SSxLQUFLaThJLE9BQU9VLGFBQWEzOEksS0FBS3VJLFNBQVNzdkgsVUFBWSxJQUNwRHdrQixHQUNIcjhJLEtBQUswOEksYUFBYSxpQkFBa0IsVUFBVyxLQUMzQzE4SSxLQUFLaThJLE9BQU9VLGFBQWEzOEksS0FBS3VJLFNBQVNzdkgsVUFBWSxJQUNwRDBrQixHQUNIdjhJLEtBQUs0OEksWUFBWSxrQkFBbUIsYUFBYyxlQUFnQixhQUFjNThJLEtBQUt1SSxTQUFTc3ZILFVBQVksSUFHMUc1L0csRUFBYyxXQUVBMU8sU0FBUzJCLGVBQWVsTCxLQUFLdUksU0FBU2k4RyxHQUFLLGNBQ2pEcHRHLFlBQWNwWCxLQUFLdUksU0FBU3N2SCxVQUFZLEdBTXBELE9BSEE3M0gsS0FBSzY4SSxXQUFXLHFCQUFzQjVrSSxHQUN0Q2pZLEtBQUs2OEksV0FBVyxnQkFBaUI1a0ksR0FFMUJpN0csRUFBSSxNQUFPLENBQUV4cUgsR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUssZ0JBQWlCcjZHLE1BQU8saUJBQWtCc3lJLEdBR3pGLHFCQUVJLElBQUlLLEVBQWU5OEksS0FBSys4SSxzQkFDcEJDLEVBQWdCaDlJLEtBQUtpOUksdUJBRXJCQyxFQUFjLENBQ2RsOUksS0FBSzA4SSxhQUFhLGtCQUFtQixRQUFTLEtBQzFDMThJLEtBQUtpOEksT0FBT2tCLG1CQUFtQm45SSxLQUFLdUksU0FBUzZnSSxZQUFjLElBQzVENFQsR0FDSGg5SSxLQUFLMDhJLGFBQWEsaUJBQWtCLE9BQVEsS0FDeEMxOEksS0FBS2k4SSxPQUFPa0IsbUJBQW1CbjlJLEtBQUt1SSxTQUFTNmdJLFlBQWMsSUFDNUQwVCxHQUNIOThJLEtBQUs0OEksWUFBWSxrQkFBbUIsYUFBYyxrQkFBbUIsZ0JBQWlCNThJLEtBQUt1SSxTQUFTNmdJLGNBV3hHLE9BRkFwcEksS0FBSzY4SSxXQUFXLDBCQU5RLFdBRU50ekksU0FBUzJCLGVBQWVsTCxLQUFLdUksU0FBU2k4RyxHQUFLLGlCQUNqRHB0RyxZQUFjcFgsS0FBS3VJLFNBQVM2Z0ksZUFLakNsVyxFQUFJLE1BQU8sQ0FBQ3hxSCxHQUFJMUksS0FBS3VJLFNBQVNpOEcsR0FBSyxnQkFBaUJyNkcsTUFBTyxnQkFBa0IreUksR0FHeEYsa0JBR0ksTUFBTS9qQixFQUFjakcsRUFBSSxPQUFRLENBQzVCeHFILEdBQUkxSSxLQUFLdUksU0FBU2k4RyxHQUFLLGlCQUdyQjQ0QixFQUFvQixLQUd0QixJQUFJQyxFQUFVcjlJLEtBQUtpOEksT0FBT3FCLHdCQUN0QkMsRUFBYUYsRUFBUSxHQUNyQkcsRUFBV0gsRUFBUUEsRUFBUWg3SSxPQUFTLEdBQ3BDbzdJLEVBQWF6OUksS0FBS3VJLFNBQVN3dEcsU0FBU3VRLE1BQU1pM0IsR0FBWXhnSixFQUN0RDJnSixFQUFXMTlJLEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNazNCLEdBQVV6Z0osRUFFbER3Z0osSUFBZUMsRUFFZHg5SSxLQUFLdUksU0FBU28xSSxtQkFDZHhrQixFQUFZL2hILFlBQWNtbUksRUFBYSxNQUFRQyxFQUVsRHJrQixFQUFZL2hILFlBQWNxbUksRUFBYSxNQUFRQyxFQUk1QzE5SSxLQUFLdUksU0FBU28xSSxtQkFDakJ4a0IsRUFBWS9oSCxZQUFjbW1JLEVBRTFCcGtCLEVBQVkvaEgsWUFBY3FtSSxHQVFoQyxPQUpBejlJLEtBQUs2OEksV0FBVyx1QkFBd0JPLEdBQ3hDcDlJLEtBQUs2OEksV0FBVyxnQkFBaUJPLEdBQ2pDcDlJLEtBQUs2OEksV0FBVyxnQkFBaUJPLEdBRTFCbHFCLEVBQUksT0FBUSxDQUNYd0QsTUFBTyw4QkFFWHlDLEdBSVIscUJBRUksTUFBTXlrQixFQUFnQjFxQixFQUFJLFFBQVMsQ0FDL0J4cUgsR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUssa0JBQ3ZCa1MsTUFBTyxrQ0FDUG1uQixhQUFjLE1BQ2RqOEksS0FBTSxPQUNOLGFBQWMsZUFHWms4SSxFQUFpQjVxQixFQUFJLFFBQVMsQ0FDaEN4cUgsR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUssbUJBQ3ZCa1MsTUFBTywrQkFDUDkwSCxLQUFNLFNBQ043RCxNQUFPLE9BR0xnZ0osRUFBbUI3cUIsRUFBSSxNQUFPLENBQzVCeHFILEdBQUkxSSxLQUFLdUksU0FBU2k4RyxHQUFLLG9CQUN2QmtTLE1BQU8sMkJBSVRzbkIsRUFBVzlxQixFQUFJLE9BQVEsQ0FDckJ4cUgsR0FBSTFJLEtBQUt1SSxTQUFTaThHLEdBQUssWUFDdkJrUyxNQUFPLGtCQUVYa25CLEVBQ0FFLEVBQ0FDLEdBb0hKLElBQXdCbm1JLEVBQUt5d0YsRUFBS3huRyxFQW1CbEMsT0FwSUFtOUksRUFBU242SSxpQkFBaUIsU0FBVzhSLElBRWpDQSxFQUFFOEMsaUJBRUYsTUFBTXdsSSxFQUFtQkwsRUFBYzcvSSxNQUV2QyxHQUFJaUMsS0FBS3VJLFNBQVMyMUksY0FBc0QsbUJBQS9CbCtJLEtBQUt1SSxTQUFTMjFJLGFBQ3ZELENBQ0ksTUFBTXY1QixFQUFZM2tILEtBQUt1SSxTQUFTMjFJLGFBQWFELEdBQ3hDaitJLEtBQUtpOEksT0FBT2tDLGdCQUFnQng1QixJQUM3QjU3RyxPQUFPcTFJLE1BQU0sOERBS1pwK0ksS0FBS2k4SSxPQUFPb0MsZ0JBQWdCSixJQUM3QmwxSSxPQUFPcTFJLE1BQU0seURBT3JCLE9BSEFMLEVBQWlCNXpJLE1BQU1zSixRQUFVLFFBRzFCLElBR1gsQ0FBQyxRQUFTLFNBQVM5SixRQUFRdWxCLElBRXZCMHVILEVBQWMvNUksaUJBQWlCcXJCLEVBQU8sS0FDbEM2dUgsRUFBaUJ4eUksVUFBWSxHQUU3QixNQUFNeE4sRUFBUTYvSSxFQUFjNy9JLE1BQzVCLElBQUl1Z0osRUFBaUIsRUFDckIsR0FBSXQrSSxLQUFLdUksU0FBU2cySSx1QkFBeUJ4Z0osRUFDM0MsQ0FDSSxNQUFNdW9ILEVBQVF0bUgsS0FBS3VJLFNBQVN3dEcsU0FBU3VRLE1BQ3JDLElBQUssSUFBSXhwSCxFQUFJLEVBQUc2SCxFQUFNMmhILEVBQU1qa0gsT0FBUXZGLEVBQUk2SCxHQUFPMjVJLEVBQWlCLEdBQUl4aEosSUFFaEUsR0FBSXdwSCxFQUFNeHBILEdBQUdDLEVBQUVrWixjQUFjckgsUUFBUTdRLEVBQU1rWSxnQkFBa0IsRUFDN0QsQ0FDSSxNQUFNdW9JLEVBQXFCdHJCLEVBQUksTUFBTyxDQUM5QndELE1BQU8seUJBRVhwUSxFQUFNeHBILEdBQUdDLEdBR2JnaEosRUFBaUJ2b0gsWUFBWWdwSCxHQUU3QkYsSUFLSkEsRUFBaUIsSUFDakJQLEVBQWlCNXpJLE1BQU1zSixRQUFVLGNBR3JDc3FJLEVBQWlCNXpJLE1BQU1zSixRQUFVLFdBSTdDbXFJLEVBQWMvNUksaUJBQWlCLFVBQVc4UixJQUN0QyxJQUFJNUssRUFDSixHQUFrQixLQUFkNEssRUFBRWc3SCxRQUNOLENBQ0ksTUFBTThOLEVBQVNsMUksU0FBU0MsdUJBQXVCLFVBQVUsUUFDbkMsSUFBWGkxSSxJQUNQYixFQUFjNy9JLE1BQVEwZ0osRUFBT3JoSSxXQUVyQyxHQUFrQixLQUFkekgsRUFBRWc3SCxRQUNOLENBQ0k1bEksRUFBS3hCLFNBQVNDLHVCQUF1QixVQUFVLEdBQy9DLE1BQU1rMUksRUFBUzN6SSxFQUFLQSxFQUFHaUQscUJBQWtCOU0sRUFDekMsUUFBc0IsSUFBWHc5SSxFQUVQM3pJLEVBQUdsQixVQUFVQyxPQUFPLFVBQ0wsT0FBWDQwSSxHQUNBQSxFQUFPNzBJLFVBQVVlLElBQUksY0FHN0IsQ0FDSSxJQUFJbXRELEVBQU94dUQsU0FBU0MsdUJBQXVCLHlCQUF5Qm5ILE9BQVMsRUFDN0VrSCxTQUFTQyx1QkFBdUIseUJBQXlCdXVELEdBQU1sdUQsVUFBVWUsSUFBSSxnQkFHaEYsR0FBa0IsS0FBZCtLLEVBQUVnN0gsUUFDWCxDQUNJNWxJLEVBQUt4QixTQUFTQyx1QkFBdUIsVUFBVSxHQUMvQyxNQUFNbTFJLEVBQVM1ekksRUFBS0EsRUFBR21ELGlCQUFjaE4sT0FDZixJQUFYeTlJLEdBRVA1ekksRUFBR2xCLFVBQVVDLE9BQU8sVUFDTCxPQUFYNjBJLEdBQ0FBLEVBQU85MEksVUFBVWUsSUFBSSxXQUl6QnJCLFNBQVNDLHVCQUF1Qix5QkFBeUIsR0FBR0ssVUFBVWUsSUFBSSxhQWdCOURnTixFQVhFLFlBV0d5d0YsRUFYVSx5QkFXTHhuRyxFQVgrQixXQUU3RCs4SSxFQUFjNy9JLE1BQVFpQyxLQUFLb1gsWUFDM0IybUksRUFBaUI1ekksTUFBTXNKLFFBQVUsT0FDakMsSUFBSW1ySSxFQUFjLElBQUlDLE1BQU0sU0FBVSxDQUNsQ0MsWUFBWSxJQUVoQmQsRUFBU24yQyxjQUFjKzJDLElBUG5CYixFQWFDbDZJLGlCQUFpQitULEdBQUssU0FBVXNYLEdBR2pDLElBREEsSUFBSWx4QixFQUFJa3hCLEVBQU0vdkIsT0FDUG5CLEdBQUtBLElBQU1nQyxNQUVWaEMsRUFBRTAyRixRQUFRMlQsSUFDVnhuRyxFQUFRNUQsS0FBS2UsRUFBR2t4QixHQUNwQmx4QixFQUFJQSxFQUFFZ21CLGNBS2xCNDVILEVBQWMvNUksaUJBQWlCLE9BQVEsS0FFbkNrNkksRUFBaUI1ekksTUFBTXNKLFFBQVUsU0FHOUJ1cUksRUFHWCxpQkFFSSxNQUFNZSxFQUFrQjdyQixFQUFJLE1BQU9sekgsS0FBS2cvSSxXQUFXLGlCQUM3Q0MsRUFBZWovSSxLQUFLay9JLHNCQUNwQkMsRUFBZW4vSSxLQUFLby9JLHNCQUNwQkMsRUFBZXIvSSxLQUFLcy9JLHNCQU9wQkMsRUFBbUJ2L0ksS0FBSzA4SSxhQUFhLFlBQWEsY0FMOUIsS0FFdEJxQyxFQUFnQjUwSSxNQUFNc0osUUFBNEMsU0FBbENzckksRUFBZ0I1MEksTUFBTXNKLFFBQXFCLFFBQVUsU0FLbkYrckksRUFBYzF5SSxJQUVoQjlNLEtBQUtpOEksT0FBT3dELFdBQVczeUksR0FHdkJpeUksRUFBZ0I1MEksTUFBTXNKLFFBQVUsUUFHOUJpc0ksRUFBaUIsS0FNZjEvSSxLQUFLdUksU0FBU2t5SCxRQUVkOGtCLEVBQWlCL3BILFlBQVl5cEgsR0FDN0JNLEVBQWlCL2pJLFVBQVksNkNBRXhCeGIsS0FBS3VJLFNBQVMraEksY0FFbkJpVixFQUFpQi9wSCxZQUFZMnBILEdBQzdCSSxFQUFpQi9qSSxVQUFZLDhDQUk3QitqSSxFQUFpQi9wSCxZQUFZNnBILEdBQzdCRSxFQUFpQi9qSSxVQUFZLGlEQUdqQyxNQUFNbWtJLEVBQWNwMkksU0FBU3EySSx5QkFhN0IsS0FWSTUvSSxLQUFLdUksU0FBU2t5SCxRQUFVejZILEtBQUt1SSxTQUFTK2hJLGVBQ3RDcVYsRUFBWW5xSCxZQUFZeDFCLEtBQUswOEksYUFBYSxnQkFBaUIsZ0JBQWlCOEMsRUFBV2xoSixLQUFLLEtBQU0sWUFBYStnSixLQUUvR3IvSSxLQUFLdUksU0FBU2t5SCxRQUFXejZILEtBQUt1SSxTQUFTK2hJLGNBQ3ZDcVYsRUFBWW5xSCxZQUFZeDFCLEtBQUswOEksYUFBYSxZQUFhLFlBQWE4QyxFQUFXbGhKLEtBQUssS0FBTSxRQUFTNmdKLElBRWxHbi9JLEtBQUt1SSxTQUFTa3lILFFBQ2ZrbEIsRUFBWW5xSCxZQUFZeDFCLEtBQUswOEksYUFBYSxZQUFhLFlBQWE4QyxFQUFXbGhKLEtBQUssS0FBTSxRQUFTMmdKLElBR2hHRixFQUFnQjM1QixZQUVuQjI1QixFQUFnQmgvQyxZQUFZZy9DLEVBQWdCMzVCLFlBSWhEMjVCLEVBQWdCdnBILFlBQVltcUgsSUFjaEMsT0FYQXAySSxTQUFTMUYsaUJBQWlCLFVBQVdxckIsSUFFN0I2dkgsSUFBb0I3dkgsRUFBTS92QixTQUUxQjQvSSxFQUFnQjUwSSxNQUFNc0osUUFBVSxVQUl4Q3pULEtBQUs2OEksV0FBVyxnQkFBaUI2QyxHQUNqQzEvSSxLQUFLNjhJLFdBQVcsZ0JBQWlCNkMsR0FFMUJ4c0IsRUFBSSxNQUFPbHpILEtBQUtnL0ksV0FBVyxhQUM5Qk8sRUFDQVIsR0FJUix5QkFFSSxJQUFJYyxFQUFpQjcvSSxLQUFLOC9JLHdCQUUxQixPQUFPOS9JLEtBQUswOEksYUFBYSxrQkFBbUIseUJBQTBCLEtBQ2xFMThJLEtBQUtpOEksT0FBTzhELHdCQUNiRixHQUdQLHlCQUVTNy9JLEtBQUt1SSxTQUFTa3lILFFBT2ZseEgsU0FBUzJCLGVBQWVsTCxLQUFLdUksU0FBU2k4RyxHQUFLLGlCQUFpQnI2RyxNQUFNc0osUUFBVSxPQUM1RWxLLFNBQVMyQixlQUFlbEwsS0FBS3VJLFNBQVNpOEcsR0FBSyxpQkFBaUJyNkcsTUFBTXNKLFFBQVUsVUFONUVsSyxTQUFTMkIsZUFBZWxMLEtBQUt1SSxTQUFTaThHLEdBQUssaUJBQWlCcjZHLE1BQU1zSixRQUFVLFFBQzVFbEssU0FBUzJCLGVBQWVsTCxLQUFLdUksU0FBU2k4RyxHQUFLLGlCQUFpQnI2RyxNQUFNc0osUUFBVSxRQVVwRixTQUVJelQsS0FBSzY4SSxXQUFXLGdCQUFpQjc4SSxLQUFLZ2dKLHdCQUN0Q2hnSixLQUFLNjhJLFdBQVcsZ0JBQWlCNzhJLEtBQUtnZ0osd0JBRXRDLElBQUlDLEVBQVksQ0FDWmpnSixLQUFLa2dKLG9CQUNMbGdKLEtBQUttZ0osc0JBRUxDLEVBQWEsQ0FDYnBnSixLQUFLcWdKLGtCQUNMcmdKLEtBQUtzZ0osa0JBRUx0Z0osS0FBS3VJLFNBQVNnNEksa0JBQ2RILEVBQVdoK0ksS0FBS3BDLEtBQUt3Z0osMEJBQ3JCeGdKLEtBQUt1SSxTQUFTazRJLGdCQUNkTCxFQUFXaDRHLE9BQU8sRUFBRyxFQUFHcG9DLEtBQUswZ0osc0JBR2pDLElBQUl6TCxFQUFVajFJLEtBQUtpOEksT0FBT2prQixZQUFZMlcsZ0JBQ3RDLElBQUssSUFBSTd4SSxFQUFJLEVBQUc2SCxFQUFNc3dJLEVBQVE1eUksT0FBUXZGLEVBQUk2SCxFQUFLN0gsSUFDL0MsQ0FDSSxJQUFJdzNDLEVBQVMyZ0csRUFBUW40SSxHQUVoQnczQyxFQUFPcXNHLGNBR1pyc0csRUFBT3NzRyxZQUFjdHNHLEVBQU91c0csYUFDdkJ2c0csRUFBT3NzRyxjQUllLFVBQXZCdHNHLEVBQU9xc0csWUFDUFAsRUFBV2g0RyxPQUFPLEVBQUcsRUFBR2tNLEVBQU9zc0csYUFDSCxTQUF2QnRzRyxFQUFPcXNHLGFBQ1pWLEVBQVU3M0csT0FBTyxFQUFHLEVBQUdrTSxFQUFPc3NHLGFBRWxDdHNHLEVBQU9zc0csWUFBWS84SSxpQkFBaUIsUUFBU2k5SSxFQUFrQnhpSixLQUFLMEIsS0FBTXMwQyxNQUc5RSxTQUFTd3NHLEVBQW1CeHNHLEdBRXhCQSxFQUFPNGlGLFlBQVlsM0gsS0FBS2k4SSxRQUc1QixNQUFNOEUsRUFBUTd0QixFQUFJLE1BQU9sekgsS0FBS2cvSSxXQUFXLFNBQzdCOXJCLEVBQUksTUFBT2x6SCxLQUFLZy9JLFdBQVcsY0FBZWlCLEdBQzFDL3NCLEVBQUksTUFBT2x6SCxLQUFLZy9JLFdBQVcsZUFBZ0JvQixJQUd2RHBnSixLQUFLdUksU0FBU3k0SSxvQkFBb0I1ekMsYUFDOUIyekMsRUFDQS9nSixLQUFLdUksU0FBU3k0SSxvQkFBb0I1N0IsWUFJMUMsbUJBQW9CejlFLEdBRWhCLElBQUl1MEcsRUFBTzN5SSxTQUFTcWlHLGdCQUFnQiw2QkFBOEIsT0FDbEVzd0MsRUFBS3R1QixlQUFlLEtBQU0sVUFBVyxhQUNyQ3N1QixFQUFLdHVCLGVBQWUsS0FBTSxJQUFLLE9BQy9Cc3VCLEVBQUt0dUIsZUFBZSxLQUFNLElBQUssT0FDL0JzdUIsRUFBS3R1QixlQUFlLEtBQU0sUUFBUyxvQ0FFbkMsSUFBSS9XLEVBQVF0dEcsU0FBU3FpRyxnQkFBZ0IsNkJBQThCLEtBV25FLE9BVkFpTCxFQUFNK1csZUFBZSxLQUFNLFlBQWEsZ0NBRXhDam1GLEVBQU1oK0IsUUFBVStGLElBRVosSUFBSXV4SSxFQUFNMTNJLFNBQVNxaUcsZ0JBQWdCLDZCQUE4QixRQUNqRXExQyxFQUFJcnpCLGVBQWUsS0FBTSxJQUFLbCtHLEdBQzlCbW5HLEVBQU1yaEYsWUFBWXlySCxLQUd0Qi9FLEVBQUsxbUgsWUFBWXFoRixHQUNWcWxDLEVBR1gscUJBT0ksT0FBT2w4SSxLQUFLa2hKLG1CQUxBLENBQ1IsaUlBQ0EsNmJBTVIsb0JBS0ksT0FBT2xoSixLQUFLa2hKLG1CQUhBLENBQ1IsbXNCQUtSLHNCQUtJLE9BQU9saEosS0FBS2toSixtQkFIQSxDQUNSLDJuQ0FLUix1QkFLSSxPQUFPbGhKLEtBQUtraEosbUJBSEEsQ0FDUixtZ0JBS1Isc0JBS0ksT0FBT2xoSixLQUFLa2hKLG1CQUhBLENBQ1IsMm5DQUtSLHNCQUtJLE9BQU9saEosS0FBS2toSixtQkFIQSxDQUNSLG9vQkFLUixzQkFNSSxPQUFPbGhKLEtBQUtraEosbUJBSkEsQ0FDUixpc0JBTVIsd0JBT0ksT0FBT2xoSixLQUFLa2hKLG1CQUxBLENBQ1IseUhBQ0EseWtDQ3BqQkcsT0FMRSxDQUNidmpKLElBQUt3akosR0FDTDlxRCxPQW1ESixTQUEwQmg0RixFQUFLTixHQUczQixNQUFNcWpKLEVBQWdCRCxHQUFhOWlKLEdBQzdCMm9CLEVBQU9qZSxPQUFPc3VHLFNBQVNyd0YsS0FFN0IsR0FBSW82SCxJQUFrQnJqSixFQUdsQixHQUE2QixpQkFBbEJxakosRUFDWCxDQUVJLE1BQU03RCxFQUFjdjJILEVBQUtwWSxRQUFRLElBQU12USxFQUFNLEtBQU8sRUFBSzJvQixFQUFLcFksUUFBUSxJQUFNdlEsRUFBTSxLQUFPMm9CLEVBQUtwWSxRQUFRLElBQU12USxFQUFNLEtBQzVHbS9JLEVBQVdELEVBQWFsL0ksRUFBSWdFLE9BQVMsRUFBSSsrSSxFQUFjLytJLE9BRXZEZy9JLEVBQTZCLElBQWY5RCxFQUFvQixJQUFNLElBQzlDeDBJLE9BQU9zdUcsU0FBU3I4RixRQUFRZ00sRUFBSy9CLFVBQVUsRUFBR3M0SCxHQUFjOEQsRUFBYWhqSixFQUFNLElBQU1OLEVBQVFpcEIsRUFBSy9CLFVBQVV1NEgsU0FLcEYsSUFBaEJ4MkgsRUFBSzNrQixPQUVMMEcsT0FBT3N1RyxTQUFTcjhGLFFBQVEsSUFBTTNjLEVBQU0sSUFBTU4sR0FLMUNnTCxPQUFPc3VHLFNBQVNyOEYsUUFBUWdNLEVBQU8sSUFBTTNvQixFQUFNLElBQU1OLEtBdEVqRSxTQUFTb2pKLEdBQWM5aUosR0FFbkIsTUFBTTJvQixFQUFPamUsT0FBT3N1RyxTQUFTcndGLEtBRTdCLEdBQWEsS0FBVEEsRUFDSixDQUVJLElBQUl1MkgsRUFBY3YySCxFQUFLcFksUUFBUSxJQUFNdlEsRUFBTSxLQUFPLEVBQUsyb0IsRUFBS3BZLFFBQVEsSUFBTXZRLEVBQU0sS0FBTzJvQixFQUFLcFksUUFBUSxJQUFNdlEsRUFBTSxLQUdoSCxHQUFJay9JLEdBQWMsRUFDbEIsQ0FFSUEsR0FBY2wvSSxFQUFJZ0UsT0FBUyxFQUczQixNQUFNbTdJLEVBQVd4MkgsRUFBS3BZLFFBQVEsSUFBSzJ1SSxHQUNuQyxPQUFJQyxFQUFXRCxFQUVKdndILG1CQUFtQmhHLEVBQUsvQixVQUFVczRILEVBQVlDLElBRWhEQSxFQUFXLEVBR1R4d0gsbUJBQW1CaEcsRUFBSy9CLFVBQVVzNEgsSUFHdEMsR0FLUCxPQUFPLEVBTVgsT0FBTyxFQ2pCZixNQUFNLEdBRUYsWUFBYWowSSxFQUFTNFEsR0FLbEIsS0FBTTVRLGFBQW1CZzRJLGVBRXJCdGhKLEtBQUtzSixRQUFVQyxTQUFTMkIsZUFBZTVCLEdBRWxCLE9BQWpCdEosS0FBS3NKLFNBRUwsTUFBTSxJQUFJbXFILEVBSWxCLElBQUt2NUcsRUFBUTBwRyxXQUVULE1BQU0sSUFBSStQLEVBQStCLDZFQUc3QzN6SCxLQUFLa2EsUUFBVTFjLE9BQU9taEMsT0FBTyxDQUN6QjYyRyxnQkFBaUIsSUFDakJULGtCQUFtQixHQUNuQlYsaUJBQWlCLEVBQ2pCendCLFdBQVksR0FDWnF5QixpQkFBaUIsRUFDakJzTCxnQkFBZ0IsRUFDaEJoQixrQkFBa0IsRUFDbEJFLGdCQUFnQixFQUNoQmxDLHVCQUF1QixFQUN2QmlELGdCQUFnQixFQUNoQkMsbUJBQW9CLFVBQ3BCQyxtQkFBbUIsRUFDbkIvRCxvQkFBb0IsRUFDcEI3SSxpQkFBaUIsRUFDakI2TSxnQkFBZ0IsRUFDaEJDLDhCQUE4QixFQUM5Qi9NLG1CQUFtQixFQUNuQmdOLGVBQWUsRUFDZkMsbUJBQW9CLFVBQ3BCQyxrQkFBa0IsRUFDbEJ6WSxhQUFjLEdBQ2RELGlCQUFpQixFQUNqQjVRLGFBQWMsRUFDZGtYLGdCQUFpQixLQUNqQnBQLGlCQUFrQixZQUNsQjBRLGNBQWMsRUFDZDNHLGNBQWMsRUFDZDdQLFFBQVEsRUFDUmtULGVBQWdCLEVBQ2hCelYsY0FBZSxFQUNmd1YsZUFBZ0IsRUFDaEJ6VixhQUFjLEVBQ2RpbUIsYUFBYyxLQUNkOEQsWUFBYSxHQUNiQyxrQkFBbUIsV0FBVyxPQUFPLEdBQ3JDQyxnQkFBaUIsSUFDakI5WSxZQUFhLEVBQ2IrWSxlQUFnQixDQUFDLE9BQVUsb0JBQzNCL1osbUJBQW1CLEVBQ25CaU4sZ0JBQWlCLElBQ2pCN0MsV0FBWSxJQUNaRCxVQUFXLElBQ1h5TyxvQkFBcUIsS0FDckIxaUIsb0JBQW9CLEVBQ3BCMFIsZUFBZ0IsSUFDaEJuWSxVQUFXLEdBQ1ozOUcsR0FHSCxNQUFNa29JLEVBQWlCbHZCLEVBQUksTUFBTyxDQUM5QndELE1BQU8sZ0JBQWUxMkgsS0FBS2thLFFBQVE2bkksaUJBQW1CLHdCQUEwQixNQUdwRi9oSixLQUFLc0osUUFBUWtzQixZQUFZNHNILEdBRXpCcGlKLEtBQUtrYSxRQUFROG1JLG9CQUFzQmhoSixLQUFLa2EsUUFBUThtSSxxQkFBdUJvQixFQUV2RSxNQUFNanNCLEVBQWEsSUFBSSxFQUFXaXNCLEVBQWdCcGlKLEtBQUtrYSxRQUFTbGEsTUFFaEVBLEtBQUtnNEgsWUFBYzdCLEVBQVdpQixtQkFDOUJwM0gsS0FBS3VJLFNBQVc0dEgsRUFBV24rRyxjQUMzQmhZLEtBQUsrdUksUUFBVS91SSxLQUFLdUksU0FBU3M1SSxjQUFnQixJQUFJLEdBQVE3aEosTUFBUSxLQUVqRW9pSixFQUFlMTVJLEdBQUsxSSxLQUFLdUksU0FBU2k4RyxHQUFLLFVBRXZDeGtILEtBQUtxaUosVUFBWSxDQUNibHNCLFdBQVlBLEVBQ1o0WSxRQUFTL3VJLEtBQUsrdUksU0FJbEIsSUFBSTd2QyxFQUFTLEVBQUtvbEIsT0FBT0MsVUFBVSxnQkFBaUIsS0FFM0IsT0FBakJ2a0gsS0FBSyt1SSxTQUVML3VJLEtBQUsrdUksUUFBUXVULFNBR2pCLEVBQUtoK0IsT0FBT2krQixZQUFZcmpELEtBRzVCbC9GLEtBQUt3aUosVUFBWXhpSixLQUFLeWlKLHFCQUV0QnppSixLQUFLMGlKLHlCQU1ULHlCQUVJLEdBQXdDLGlCQUE3QjFpSixLQUFLdUksU0FBU3E3RyxXQUdyQi84RyxXQUFXLEtBRVA3RyxLQUFLMmlKLGdCQUFnQjNpSixLQUFLdUksU0FBU3E3RyxXQUFZNWpILEtBQUt3aUosWUFDckQsT0FHUCxDQUNJLE1BQU05VCxFQUF5Qjk2RixNQUFNNXpDLEtBQUt1SSxTQUFTcTdHLFdBQVksQ0FDM0RsMkQsUUFBUzF0RCxLQUFLdUksU0FBUzQ1SSxpQkFDeEJ4bUksS0FBT0MsSUFFTixJQUFLQSxFQUFTZ2dCLEdBQ2QsQ0FFSSxFQUFLMG9GLE9BQU9zVSxRQUFRLHFCQUFzQixDQUFDaDlHLEdBQVc1YixNQUV0REEsS0FBSzRpSixXQUFXaG5JLEdBRWhCLElBQUlyWCxFQUFRLElBQUkvQixNQUFNb1osRUFBU2k4RixZQUUvQixNQURBdHpHLEVBQU1xWCxTQUFXQSxFQUNYclgsRUFFVixPQUFPcVgsRUFBUzBqQyxTQUVqQjNqQyxLQUFPa00sSUFFTjduQixLQUFLMmlKLGdCQUFnQjk2SCxFQUFNN25CLEtBQUt3aUosYUFJcEN4aUosS0FBS3FpSixVQUFVbHNCLFdBQVcwc0IsMEJBQTBCblUsSUFPNUQsV0FBWWpxSSxHQUVSekUsS0FBS3FpSixVQUFVbHNCLFdBQVcrYixVQUFVenRJLEdBTXhDLFdBQVltWCxHQUdSLE1BQU04bEcsRUFBZSxDQUFDLDJDQUE2QzlsRyxFQUFTa2lCLE9BQVMsSUFBTWxpQixFQUFTaThGLFlBS3BHLEdBRmdGLElBQXBENzNHLEtBQUt1SSxTQUFTcTdHLFdBQVc3akUsWUFBWSxPQUFRLEdBR3pFLENBQ0ksTUFBTStpRyxFQUFXOWlKLEtBQUt1SSxTQUFTcTdHLFdBQVc1b0csUUFBUSxlQUFnQixJQUFJK1IsTUFBTSxTQUFTLEdBRWpGaGtCLE9BQU9zdUcsU0FBU2hYLFdBQWF5aUQsR0FFN0JwaEMsRUFBYXQvRyxLQUNUOHdILEVBQUksSUFBSyx1REFDVEEsRUFBSSxJQUNBLHVGQUNBQSxFQUFJLElBQUssQ0FDTDN5QixLQUFNLHNGQUNOcGhHLE9BQVEsVUFDVCx1Q0FNbkJhLEtBQUsraUosV0FBV3JoQyxHQU1wQixnQkFBaUJzaEMsRUFBY1IsR0FFM0IsSUFBSXpzQyxFQUdKLElBQUtpdEMsRUFBYXJrSixlQUFlLGVBQThELElBQTlDcWtKLEVBQWEsWUFBWXAwSSxRQUFRLFVBQXlFLElBQXZEbzBJLEVBQWEsWUFBWXAwSSxRQUFRLGtCQUVqSSxNQUFNLElBQUk4a0gsRUFBMkIsK0NBSXpDLEVBQUtwUCxPQUFPc1UsUUFBUSxrQkFBbUIsQ0FBQ29xQixHQUFlaGpKLE1BQ3ZEKzFHLEVBQVcsR0FBY2t0QyxTQUFTRCxHQUNsQyxNQUFNek4sRUFBY2lOLEVBQVl4aUosS0FBS2tqSix3QkFBd0JWLEVBQVd6c0MsR0FBWSxHQUVwRi8xRyxLQUFLcWlKLFVBQVVsc0IsV0FBV2d0QixZQUFZcHRDLEVBQVV3L0IsR0FRcEQscUJBRUksTUFBTXR5SSxFQUFRLEdBMkJkLE1BekJBLENBQUMsSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxLQUFLMEcsUUFBVTBSLElBRS9DLE1BQU10ZCxFQUFRLEdBQVdKLElBQUkwZCxFQUFRcmIsS0FBS3VJLFNBQVNvbkksa0JBR3JDLElBQVY1eEksSUFDQWtGLEVBQU1vWSxHQUFTdGQsS0FPUCxTQUFaa0YsRUFBTXE5RyxFQUNOcjlHLEVBQU1xOUcsR0FBSSxFQUNPLFVBQVpyOUcsRUFBTXE5RyxJQUNYcjlHLEVBQU1xOUcsR0FBSSxHQUdkLENBQUMsSUFBSyxJQUFLLElBQUssSUFBSyxLQUFLMzJHLFFBQVUwUixJQUU1QkEsS0FBU3BZLElBQ1RBLEVBQU1vWSxHQUFTN0MsU0FBU3ZWLEVBQU1vWSxHQUFRLE9BR3ZDcFksRUFNWCx3QkFBeUJBLEVBQU84eUcsR0FFNUJBLEVBQVdBLEdBQVkvMUcsS0FBS3VJLFNBQVN3dEcsU0FFckMsTUFBTTc3RixFQUFXLE1BQU9qWCxFQUFTakQsS0FBS29qSixjQUFjbmdKLEVBQU1zbkIsR0FBSyxHQUUzRCxNQUFPdG5CLElBQ1BpWCxFQUFRKzJILGFBQWVodUksRUFBTXE5RyxHQUU3QixNQUFPcjlHLElBQ1BpWCxFQUFRMjlHLFVBQVk1MEgsRUFBTTJzRyxHQUUxQixNQUFPM3NHLElBQ1BpWCxFQUFRa3ZILFlBQWNubUksRUFBTTFFLEdBR2hDLElBQUlvbUgsRUFBWTNrSCxLQUFLcWpKLHlCQUF5QnR0QyxFQUFVOXlHLEVBQU1uRyxHQVc5RCxHQVRNNm5ILEdBQWEsR0FBS0EsRUFBWTVPLEVBQVN1USxNQUFNamtILFNBRS9Dc2lILEVBQVkxaEgsRUFBTXJFLEVBQUksRUFHaEIrbEgsR0FBYSxHQUFLQSxFQUFZNU8sRUFBU3VRLE1BQU1qa0gsU0FDL0NzaUgsRUFBWSxPQUdGLE9BQWRBLEVBQ0osQ0FDSSxNQUFNK1QsRUFBbUJsZ0gsU0FBU3ZWLEVBQU0yTyxFQUFHLElBQ3JDK21ILEVBQWlCbmdILFNBQVN2VixFQUFNK08sRUFBRyxJQUV6Q2tJLEVBQVF1K0csYUFBZTlULEVBQ3ZCenFHLEVBQVF3K0csaUJBQW1CQSxFQUMzQngrRyxFQUFReStHLGVBQWlCQSxFQUc3QixPQUFPeitHLEVBTVgsY0FBZXBOLEdBRVgsT0FBUUEsR0FFSixJQUFLLElBQ0QsTUFBTyxDQUNIMnRILFFBQVEsRUFDUjZQLGNBQWMsR0FHdEIsSUFBSyxJQUNELE1BQU8sQ0FDSDdQLFFBQVEsRUFDUjZQLGNBQWMsR0FHdEIsSUFBSyxJQUNELE1BQU8sQ0FDSDdQLFFBQVEsRUFDUjZQLGNBQWMsR0FHdEIsUUFDSSxNQUFPLElBT25CLHlCQUEwQnYwQixFQUFVdHhELEdBRWhDLElBQUkzbkQsRUFDSixNQUFNd21KLEVBQUt2dEMsRUFBU3VRLE1BQU1qa0gsT0FFMUIsSUFBS3ZGLEVBQUksRUFBR0EsRUFBSXdtSixFQUFJeG1KLElBRWhCLEdBQUlpNUcsRUFBU3VRLE1BQU14cEgsR0FBR3dqSCxJQUFNNzdELEVBRXhCLE9BQU8zbkQsRUFJZixPQUFRLEVBTVosWUFFSSxJQUFJZ1EsRUFJQUEsRUFGQTlNLEtBQUt1SSxTQUFTa3lILE9BRVAsSUFFRno2SCxLQUFLdUksU0FBUytoSSxhQUVaLElBSUEsSUFHWCxNQUNNbkYsRUFEU25sSSxLQUFLcWlKLFVBQVVsc0IsV0FBV2lDLG1CQUNmQyw4QkFBOEJyNEgsS0FBS3VJLFNBQVN3d0gsZ0JBQWlCLzRILEtBQUtnNEgsWUFBWU8sVUFFeEcsTUFBTyxDQUNILEVBQUt2NEgsS0FBS3VJLFNBQVMwb0ksYUFDbkIsRUFBS25rSSxFQUNMLEVBQUs5TSxLQUFLdUksU0FBU3N2SCxVQUNuQixFQUFLNzNILEtBQUt1SSxTQUFTNmdJLFlBQ25CLElBQUtwcEksS0FBS3VJLFNBQVNnNUksZ0JBQWlCdmhKLEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNdG1ILEtBQUt1SSxTQUFTd3dILGlCQUFpQnpZLEVBQ2hHLEdBQUt0Z0gsS0FBS3VJLFNBQVNnNUksZ0JBQXlCdmhKLEtBQUt1SSxTQUFTd3dILGdCQUFrQixFQUM1RSxJQUFLb00sR0FBYUEsRUFBV256SCxFQUM3QixJQUFLbXpILEdBQWFBLEVBQVd2ekgsR0FPckMsY0FFSSxNQUFNMnhJLEVBQWF2akosS0FBS3dqSixZQUNsQkMsRUFBb0IsR0FDMUIsSUFBSXBvSSxFQUVKLElBQUtBLEtBQVNrb0ksR0FFZ0IsSUFBdEJBLEVBQVdsb0ksSUFDWG9vSSxFQUFrQnJoSixLQUFLaVosRUFBUXJiLEtBQUt1SSxTQUFTb25JLGdCQUFrQixJQUFNcHFILG1CQUFtQmcrSCxFQUFXbG9JLEtBRzNHLE9BQU9vb0ksRUFBa0I1akksS0FBSyxLQVFsQyxjQUFlNGtDLEdBRVgsT0FBT3prRCxLQUFLcWpKLHlCQUF5QnJqSixLQUFLdUksU0FBU3d0RyxTQUFVdHhELEdBTWpFLGVBRUksUUFBS3prRCxLQUFLZzRILFlBQVlrRixTQUVsQnY2SCxRQUFRQyxLQUFLLDhLQUNOLEdBVWYsb0JBT0ksSUFBSTVFLEVBTEpnQyxLQUFLMGpKLGNBQWMsQ0FDZnpTLGNBQWVqeEksS0FBS3VJLFNBQVMwb0ksZUFLakMsSUFBSTBTLEdBQVEsRUFDUjVDLEVBQVF4M0ksU0FBUzJCLGVBQWVsTCxLQUFLdUksU0FBU3VtQixTQUFXLFNBcUI3RCxTQUFTODBILElBRUw3QyxFQUFNNTJJLE1BQU11TSxRQUFVLEVBQ3RCM1AsYUFBYS9JLElBQ1IybEosR0FBUzNqSixLQUFLdUksU0FBUzBvSSxlQUN4Qmp6SSxFQUFJNkksWUFBVyxXQUVYazZJLEVBQU01MkksTUFBTXVNLFFBQVUsSUEzQmxCLE1BRVoxVyxLQUFLdUksU0FBUzBvSSxjQUVkOFAsRUFBTWwzSSxVQUFVZSxJQUFJLHlCQUVwQnJCLFNBQVMxRixpQkFBaUIsWUFBYSsvSSxFQUFjdGxKLEtBQUswQixPQUMxRHVKLFNBQVNDLHVCQUF1QixpQkFBaUIsR0FBRzNGLGlCQUFpQixTQUFVKy9JLEVBQWN0bEosS0FBSzBCLE9BQ2xHK2dKLEVBQU1sOUksaUJBQWlCLGNBQWMsV0FDakM4L0ksR0FBUSxLQUVaNUMsRUFBTWw5SSxpQkFBaUIsY0FBYyxXQUNqQzgvSSxHQUFRLE1BS1o1QyxFQUFNbDNJLFVBQVVDLE9BQU8seUJBcUIvQiwrQkFFSSxNQUFNdzBILEdBQXNCdCtILEtBQUt1SSxTQUFTKzFILG1CQVcxQyxPQVJBdCtILEtBQUswakosY0FBYyxDQUNmanBCLFFBQVEsRUFDUjZELG1CQUFvQkEsRUFDcEI3RixhQUFjejRILEtBQUt1SSxTQUFTd3dILGdCQUM1QkosZUFBZ0IzNEgsS0FBS3FpSixVQUFVbHNCLFdBQVc2ZixhQUMxQ3RkLGlCQUFrQjE0SCxLQUFLcWlKLFVBQVVsc0IsV0FBVzRmLGVBR3pDelgsRUFRWCxZQUFhdWxCLEdBRVQsT0FBUUEsR0FFSixJQUFLLFdBQ0QsT0FBTzdqSixLQUFLMGpKLGNBQWMsQ0FDdEJqcEIsUUFBUSxFQUNSNlAsY0FBYyxJQUd0QixJQUFLLE9BQ0QsT0FBT3RxSSxLQUFLMGpKLGNBQWMsQ0FDdEJqcEIsUUFBUSxFQUNSNlAsY0FBYyxJQUd0QixJQUFLLE9BQ0QsT0FBT3RxSSxLQUFLMGpKLGNBQWMsQ0FDdEJqcEIsUUFBUSxJQUdoQixRQUNJLE9BQU8sR0FZbkIsaUJBQWtCOVYsRUFBV20vQixFQUFTQyxHQUVsQyxJQUFJL1AsRUFBT3g3SCxTQUFTbXNHLEVBQVcsSUFFL0IsR0FBSTNrSCxLQUFLZ2tKLGtCQUFrQmhRLEdBQzNCLENBQ0ksTUFBTWlRLEVBQVVqa0osS0FBS3FpSixVQUFVbHNCLFdBQVc0ZixXQUFXL0IsRUFBTThQLEdBQ3JESSxFQUFVbGtKLEtBQUtxaUosVUFBVWxzQixXQUFXNmYsV0FBV2hDLEVBQU0rUCxHQUczRCxPQURBL2pKLEtBQUtnNEgsWUFBWWtDLFNBQVNzSixLQUFLd1EsRUFBTWtRLEVBQVNELElBQ3ZDLEVBR1gsT0FBTyxFQVVYLGtCQUFtQnQvQixHQUVmLE9BQU8za0gsS0FBS3VJLFNBQVN3dEcsU0FBU291QyxZQUFZeC9CLEVBQVcza0gsS0FBS3VJLFNBQVM2L0gsbUJBU3ZFLDZCQUE4Qm5jLEVBQU9DLEdBR2pDLE1BQU1rNEIsRUFBY3BrSixLQUFLZzRILFlBQVlvSyxhQUFhbE0sd0JBQzVDbXVCLEVBQVdELEVBQVlyK0IsSUFDdkJ1K0IsRUFBWUYsRUFBWWo1RyxLQUN4Qm81RyxFQUFjSCxFQUFZdnBCLE9BQzFCMnBCLEVBQWFKLEVBQVloNUcsTUFHL0IsR0FBSTZnRixFQUFRcTRCLEdBQWFyNEIsRUFBUXU0QixFQUM3QixPQUFRLEVBRVosR0FBSXQ0QixFQUFRbTRCLEdBQVluNEIsRUFBUXE0QixFQUM1QixPQUFRLEVBR1osTUFBTWorQixFQUFRLzhHLFNBQVNDLHVCQUF1QixhQUM5QyxJQUFJaTdJLEVBQWFuK0IsRUFBTWprSCxPQUN2QixLQUFPb2lKLEtBQ1AsQ0FFSSxNQUFNQyxFQUFVcCtCLEVBQU1tK0IsR0FDaEJFLEVBQVlELEVBQVF4dUIsd0JBRzFCLEtBQUlqSyxFQUFRMDRCLEVBQVV4NUcsTUFBUThnRixFQUFRMDRCLEVBQVV2NUcsVUFJNUM4Z0YsRUFBUXk0QixFQUFVNStCLEtBQU9tRyxFQUFReTRCLEVBQVU5cEIsUUFJL0MsT0FBTzZwQixFQUFROTBJLGFBQWEsY0FJaEMsT0FBUSxFQU1aLGNBQWVpaEksR0FFWCxPQUFPN3dJLEtBQUtxaUosVUFBVWxzQixXQUFXN2UsT0FBT3U1QixHQU01QyxpQkFFSSxPQUFPeDVCLFNBQVMzcUQsU0FBVyxLQUFPMnFELFNBQVNscUQsS0FBT2txRCxTQUFTL1csU0FBVytXLFNBQVN2a0csT0FBUyxJQUFNOVMsS0FBSzRrSixjQWN2RyxXQUVJNWtKLEtBQUtnNEgsWUFBWW1XLGNBQWUsRUFTcEMsYUFBY3ZxQixHQUVWNWpILEtBQUtnNEgsWUFBWWtGLFFBQVMsRUFDMUJsOUgsS0FBS3FpSixVQUFVbHNCLFdBQVc1aUQsUUFFdEJ2ekUsS0FBS2c0SCxZQUFZa0MsVUFDakJsNkgsS0FBS2c0SCxZQUFZa0MsU0FBU2h6RyxVQUU5QmxuQixLQUFLZzRILFlBQVk5OUcsUUFBUTBwRyxXQUFhQSxFQUV0QzVqSCxLQUFLMGlKLHlCQVNULFdBQVltQixHQUVSN2pKLEtBQUs2a0osWUFBWWhCLEdBUXJCLGFBRUk3akosS0FBS2c0SCxZQUFZbVcsY0FBZSxFQVFwQyxVQUVJbnVJLEtBQUtxaUosVUFBVWxzQixXQUFXanZHLFVBUTlCLG9CQUVJbG5CLEtBQUtxaUosVUFBVWxzQixXQUFXMnVCLG9CQVE5QixtQkFFSTlrSixLQUFLcWlKLFVBQVVsc0IsV0FBVzR1QixtQkFROUIsd0JBRUkva0osS0FBS3FpSixVQUFVbHNCLFdBQVdwUyx3QkFROUIsdUJBRUkvakgsS0FBS3FpSixVQUFVbHNCLFdBQVd3Z0IsdUJBWTlCLHNCQUVJLE9BQUszMkksS0FBS3VJLFNBQVMwb0ksZUFFZmp4SSxLQUFLZ2xKLHFCQUNFLEdBYWYsZ0JBRUksT0FBS2hsSixLQUFLdUksU0FBU2t5SCxTQUVmejZILEtBQUs2a0osWUFBWSxTQUNWLEdBWWYsaUJBRUksT0FBTzdrSixLQUFLdUksU0FBU3d0RyxTQUFTdVEsTUFBTXgyRyxJQUFNbTFJLEdBRS9CQSxFQUFHM2tDLEdBVWxCLG1CQUVJLE9BQU90Z0gsS0FBS3VJLFNBQVN3dEcsU0FBU3VRLE1BQU10bUgsS0FBS3VJLFNBQVN3d0gsaUJBQWlCdHdCLE9BVXZFLDZDQUVJLE9BQU96b0csS0FBS3NsSCxvQ0FBb0N0bEgsS0FBS3VJLFNBQVN3d0gsaUJBVWxFLHlCQUdJLE9BREFwMkgsUUFBUUMsS0FBSyxxR0FDTjVDLEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNdG1ILEtBQUt1SSxTQUFTd3dILGlCQUFpQnpZLEVBU3ZFLHdCQUVJLE9BQU90Z0gsS0FBS3VJLFNBQVN1bEksbUJBU3hCLHFCQUVHLE9BQU85dEksS0FBS3VJLFNBQVN3d0gsZ0JBU3pCLHVCQUVJLE9BQU8vNEgsS0FBSzI1SCxjQUFjMzVILEtBQUt1SSxTQUFTd3dILGlCQVM1QyxvQkFFSSxPQUFPLzRILEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNdG1ILEtBQUt1SSxTQUFTd3dILGlCQUFpQnpZLEVBVXZFLGdCQUVJLE9BQU90Z0gsS0FBS2tsSixpQkFVaEIsZUFJSSxPQUZBdmlKLFFBQVFDLEtBQUssaUZBRU41QyxLQUFLdUksU0FBU3d0RyxTQUFTdVEsTUFBTXgyRyxJQUFNbTFJLEdBRS9CQSxFQUFHM2tDLEdBVWxCLHFCQUdJLE9BQU90Z0gsS0FBS3VJLFNBQVM2Z0ksWUFVekIsZ0JBRUksT0FBT3BwSSxLQUFLdUksU0FBU2k4RyxHQVV6QixzQkFFSSxPQUFPeGtILEtBQUtxaUosVUFBVWxzQixXQUFXcm5HLFNBU3JDLGVBRUksT0FBTzl1QixLQUFLdUksU0FBU3d0RyxTQUFTc1EsVUFTbEMsa0JBRUksT0FBT3JtSCxLQUFLdUksU0FBUzJ2SCxhQVV6Qix1QkFBd0JpdEIsR0FFcEIsUUFBS25sSixLQUFLb2xKLGdCQUdIcGxKLEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNNitCLEdBQVNqb0osRUFTakQsa0JBRUksT0FBTzhDLEtBQUt1SSxTQUFTMHZILGFBU3pCLG1CQUVJLFFBQUtqNEgsS0FBS29sSixnQkFHSHBsSixLQUFLdUksU0FBUyt1SCxTQVV6QixlQUFnQjNTLEdBRVosT0FBTzNrSCxLQUFLdUksU0FBU3d0RyxTQUFTdVEsTUFBTTNCLEdBQVcreEIsWUFVbkQsa0JBQW1CL3hCLEdBRWYsT0FBSzNrSCxLQUFLb2xKLGVBR0hwbEosS0FBS3FpSixVQUFVbHNCLFdBQVdpQyxtQkFBbUJxQixrQkFBa0I5VSxHQUYzRCxLQWFmLG9DQUFxQ0EsR0FFakMsSUFBSXF2QixFQUFPeDdILFNBQVNtc0csRUFBVyxJQUUvQixJQUFLM2tILEtBQUtna0osa0JBQWtCaFEsR0FDeEIsTUFBTSxJQUFJeHhJLE1BQU0sc0JBRXBCLE9BQU94QyxLQUFLcWlKLFVBQVVsc0IsV0FBV2lDLG1CQUFtQnFCLGtCQUFrQnVhLEdBVzFFLDZCQUE4Qm1SLEVBQVN0dEIsR0FFbkMsSUFBSzczSCxLQUFLb2xKLGVBQ04sT0FBTyxFQUVQdnRCLEVBQVk3M0gsS0FBS3VJLFNBQVMydkgsZUFDMUJMLEVBQVk3M0gsS0FBS3VJLFNBQVMydkgsY0FFOUIsTUFDTW10QixFQURLcmxKLEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNOXRHLFNBQVMyc0ksRUFBUyxLQUN0Qy9uSixFQUFFb2IsU0FBU3EvRyxFQUFXLEtBRTFDLE1BQU8sQ0FDSDV6RyxNQUFPb2hJLEVBQVM5aUosRUFDaEIyaEIsT0FBUW1oSSxFQUFTeHhHLEdBY3pCLGdCQUFpQjh3RSxFQUFXMXpHLEdBRXhCLE9BQU9qUixLQUFLdUksU0FBU3d0RyxTQUFTczhCLGdCQUFnQjF0QixFQUFXMXpHLEdBWTdELDRCQUE2Qmc3RyxFQUFPQyxHQUVoQyxPQUFPbHNILEtBQUtzbEosNkJBQTZCcjVCLEVBQU9DLEdBWXBELGNBQWV2SCxFQUFXenFHLEdBRXRCLE1BQU0wZ0gsRUFBUzU2SCxLQUFLcWlKLFVBQVVsc0IsV0FBVzFRLGNBQWNkLEVBQVd6cUcsR0FFbEUsTUFBTyxDQUNINnJHLElBQUs2VSxFQUFPN1UsSUFDWjU2RSxLQUFNeXZGLEVBQU96dkYsTUFVckIsY0FFSSxPQUFPbnJDLEtBQUt1SSxTQVNoQixXQUVJLE9BQU92SSxLQUFLd2pKLFlBU2hCLGVBRUksT0FBT3hqSixLQUFLdUksU0FBU3N2SCxVQWF6QixnQkFBaUJsVCxFQUFXbS9CLEVBQVNDLEdBRWpDLE9BQU8vakosS0FBS3VsSixpQkFBaUI1Z0MsRUFBV20vQixFQUFTQyxHQWFyRCxnQkFBaUIveUIsRUFBTzh5QixFQUFTQyxHQUU3QixNQUFNejlCLEVBQVF0bUgsS0FBS3VJLFNBQVN3dEcsU0FBU3VRLE1BQ3JDLElBQUlrL0IsRUFBTXgwQixFQUFNLzZHLGNBRWhCLElBQUssSUFBSW5aLEVBQUksRUFBRzZILEVBQU0yaEgsRUFBTWprSCxPQUFRdkYsRUFBSTZILEVBQUs3SCxJQUV6QyxHQUFJd3BILEVBQU14cEgsR0FBR0MsRUFBRWtaLGNBQWNySCxRQUFRNDJJLElBQVEsRUFDekMsT0FBT3hsSixLQUFLdWxKLGlCQUFpQnpvSixFQUFHZ25KLEVBQVNDLEdBR2pELE1BQU1wL0IsRUFBWW5zRyxTQUFTdzRHLEVBQU8sSUFBTSxFQUN4QyxPQUFPaHhILEtBQUt1bEosaUJBQWlCNWdDLEVBQVdtL0IsRUFBU0MsR0FZckQsZUFBZ0J0L0YsRUFBVXEvRixFQUFTQyxHQUUvQnBoSixRQUFRQyxLQUFLLDBGQUNiLE1BQU0raEgsRUFBWTNrSCxLQUFLeWxKLGNBQWNoaEcsR0FDckMsT0FBT3prRCxLQUFLdWxKLGlCQUFpQjVnQyxFQUFXbS9CLEVBQVNDLEdBWXJELGNBQWU1NkgsRUFBSzI2SCxFQUFTQyxHQUV6QixNQUFNcC9CLEVBQVkza0gsS0FBS3lsSixjQUFjdDhILEdBQ3JDLE9BQU9ucEIsS0FBS3VsSixpQkFBaUI1Z0MsRUFBV20vQixFQUFTQyxHQVVyRCxlQUFnQnAvQixHQUVaLE9BQStELElBQXhEM2tILEtBQUt1SSxTQUFTd3RHLFNBQVN1USxNQUFNM0IsR0FBVyt4QixZQVFuRCxvQkFFSTEySSxLQUFLMGpKLGNBQWMsQ0FBRXRiLG1CQUFtQixJQVM1QyxpQkFFSSxPQUFPcG9JLEtBQUt1SSxTQUFTMG9JLGFBU3pCLGlCQUFrQnRzQixHQUVkLE9BQU8za0gsS0FBS2drSixrQkFBa0JyL0IsR0FVbEMsaUJBQWtCQSxHQUVkLE9BQU8za0gsS0FBS2c0SCxZQUFZa0MsU0FBU0MsY0FBY3hWLEdBU25ELFVBRUksT0FBTzNrSCxLQUFLZzRILFlBQVlrRixPQWM1QixtQkFBb0J2WSxFQUFXb2tCLEVBQVkyYyxFQUFXemhJLEVBQU9DLEdBRXpELE1BQU1rMUcsRUFBU3A1SCxLQUFLcWlKLFVBQVVsc0IsV0FBV2lDLG1CQUV6QyxJQUFLZ0IsRUFDRCxPQUFPLEVBRVgsTUFBTXJqSCxFQUFTcWpILEVBQU9PLGNBQWNoVixHQUU5Qm9CLEVBQU1od0csRUFBT2d3RyxJQUFNMi9CLEVBQ25CdjZHLEVBQU9wMUIsRUFBT28xQixLQUFPNDlGLEVBRTNCLE9BQU8vb0ksS0FBS2c0SCxZQUFZTyxTQUFTd0wsaUJBQWlCLENBQzlDaGUsSUFBS0EsRUFDTDhVLE9BQVE5VSxFQUFNN2hHLEVBQ2RpbkIsS0FBTUEsRUFDTkMsTUFBT0QsRUFBT2xuQixJQVV0Qix1QkFFSSxPQUFPamtCLEtBQUt1SSxTQUFTKzFILG1CQVN6QixzQkFFSSxRQUFJdCtILEtBQUt1SSxTQUFTMG9JLGVBRWRqeEksS0FBS2dsSixxQkFDRSxHQVlmLGdCQUVJLFFBQUlobEosS0FBS3VJLFNBQVNreUgsU0FFZHo2SCxLQUFLMGpKLGNBQWMsQ0FBRWpwQixRQUFRLEtBQ3RCLEdBYWYsbUJBQW9CMk8sR0FHaEIsUUFBS3BwSSxLQUFLcWlKLFVBQVVsc0IsV0FBVytjLGNBQWMsY0FBZTlKLElBR3JEcHBJLEtBQUswakosY0FBYyxDQUN0QmpwQixRQUFRLEVBQ1IyTyxZQUFhQSxJQVdyQixTQUFVbm1JLEdBRU5qRCxLQUFLMGpKLGNBQWMxakosS0FBS2tqSix3QkFBd0JqZ0osSUFTcEQsYUFBYzQwSCxHQVNWLE9BUEk3M0gsS0FBS3VJLFNBQVNreUgsUUFFZHo2SCxLQUFLMGpKLGNBQWMsQ0FDZmpwQixRQUFRLElBSVR6NkgsS0FBS3FpSixVQUFVbHNCLFdBQVczdUgsS0FBS3F3SCxHQVMxQyxvQkFFSTczSCxLQUFLMGpKLGNBQWMsQ0FBRXRiLG1CQUFtQixJQVM1Qyx1QkFFSXBvSSxLQUFLZ2xKLG9CQVNULGdDQUVJaGxKLEtBQUswakosY0FBYyxDQUNmdGIsbUJBQW9CcG9JLEtBQUt1SSxTQUFTNi9ILG9CQUsxQyxvQkFFSSxPQUFPcG9JLEtBQUsybEosK0JBa0JoQiwwQkFBMkIxZ0osR0FFdkIsTUFBTXN5SSxFQUFpQnYzSSxLQUFLdUksU0FBUzJ2SCxhQUFlbDRILEtBQUt1SSxTQUFTc3ZILFVBQ2xFLE9BQU81eUgsRUFBVzZKLEtBQUtpekcsSUFBSSxFQUFHdzFCLEdBZWxDLHdCQUF5QnR5SSxHQUVyQixNQUFNc3lJLEVBQWlCdjNJLEtBQUt1SSxTQUFTMnZILGFBQWVsNEgsS0FBS3VJLFNBQVNzdkgsVUFJbEUsT0FBdUIsSUFBbkIwZixFQUNPdHlJLEVBRUpBLEVBQVc2SixLQUFLaXpHLElBQUksRUFBR3cxQixHQVNsQyxTQUVJLE9BQU92M0ksS0FBSzI4SSxhQUFhMzhJLEtBQUt1SSxTQUFTc3ZILFVBQVksR0FPdkQsVUFFSSxPQUFPNzNILEtBQUsyOEksYUFBYTM4SSxLQUFLdUksU0FBU3N2SCxVQUFZLElBSTNELEdBQUt2VCxPQUFTLEVBQUtBLE9BRUosSUFNQTE1RCxHQU5BLGFBS08sb0JBQVg3aEQsVUFDSTZoRCxHQUdSN2hELFFBRFE2OEksS0FBT2g3RixHQUFPZzdGLE1BQVEiLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDU4KTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdHlwZXMgPSBbXG4gIHJlcXVpcmUoJy4vbmV4dFRpY2snKSxcbiAgcmVxdWlyZSgnLi9xdWV1ZU1pY3JvdGFzaycpLFxuICByZXF1aXJlKCcuL211dGF0aW9uLmpzJyksXG4gIHJlcXVpcmUoJy4vbWVzc2FnZUNoYW5uZWwnKSxcbiAgcmVxdWlyZSgnLi9zdGF0ZUNoYW5nZScpLFxuICByZXF1aXJlKCcuL3RpbWVvdXQnKVxuXTtcbnZhciBkcmFpbmluZztcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xudmFyIHF1ZXVlID0gW107XG52YXIgc2NoZWR1bGVkID0gZmFsc2U7XG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBkcmFpbmluZyA9IGZhbHNlO1xuICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcXVldWVJbmRleCA9IC0xO1xuICB9XG4gIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICBuZXh0VGljaygpO1xuICB9XG59XG5cbi8vbmFtZWQgbmV4dFRpY2sgZm9yIGxlc3MgY29uZnVzaW5nIHN0YWNrIHRyYWNlc1xuZnVuY3Rpb24gbmV4dFRpY2soKSB7XG4gIGlmIChkcmFpbmluZykge1xuICAgIHJldHVybjtcbiAgfVxuICBzY2hlZHVsZWQgPSBmYWxzZTtcbiAgZHJhaW5pbmcgPSB0cnVlO1xuICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgd2hpbGUgKGxlbikge1xuICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgIHF1ZXVlID0gW107XG4gICAgd2hpbGUgKGN1cnJlbnRRdWV1ZSAmJiArK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICB9XG4gICAgcXVldWVJbmRleCA9IC0xO1xuICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgfVxuICBjdXJyZW50UXVldWUgPSBudWxsO1xuICBxdWV1ZUluZGV4ID0gLTE7XG4gIGRyYWluaW5nID0gZmFsc2U7XG4gIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cbnZhciBzY2hlZHVsZURyYWluO1xudmFyIGkgPSAtMTtcbnZhciBsZW4gPSB0eXBlcy5sZW5ndGg7XG53aGlsZSAoKytpIDwgbGVuKSB7XG4gIGlmICh0eXBlc1tpXSAmJiB0eXBlc1tpXS50ZXN0ICYmIHR5cGVzW2ldLnRlc3QoKSkge1xuICAgIHNjaGVkdWxlRHJhaW4gPSB0eXBlc1tpXS5pbnN0YWxsKG5leHRUaWNrKTtcbiAgICBicmVhaztcbiAgfVxufVxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gIHRoaXMuZnVuID0gZnVuO1xuICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmdW4gPSB0aGlzLmZ1bjtcbiAgdmFyIGFycmF5ID0gdGhpcy5hcnJheTtcbiAgc3dpdGNoIChhcnJheS5sZW5ndGgpIHtcbiAgY2FzZSAwOlxuICAgIHJldHVybiBmdW4oKTtcbiAgY2FzZSAxOlxuICAgIHJldHVybiBmdW4oYXJyYXlbMF0pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIGZ1bihhcnJheVswXSwgYXJyYXlbMV0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIGZ1bihhcnJheVswXSwgYXJyYXlbMV0sIGFycmF5WzJdKTtcbiAgZGVmYXVsdDpcbiAgICByZXR1cm4gZnVuLmFwcGx5KG51bGwsIGFycmF5KTtcbiAgfVxuXG59O1xubW9kdWxlLmV4cG9ydHMgPSBpbW1lZGlhdGU7XG5mdW5jdGlvbiBpbW1lZGlhdGUodGFzaykge1xuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gIH1cbiAgcXVldWUucHVzaChuZXcgSXRlbSh0YXNrLCBhcmdzKSk7XG4gIGlmICghc2NoZWR1bGVkICYmICFkcmFpbmluZykge1xuICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgc2NoZWR1bGVEcmFpbigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cGluZ1R5cGUsIFNlbGVjdGlvblR5cGUsIFVzZXJUeXBlLCBJbnNlcnRUeXBlLCBJbnNlcnRUYWJUeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuXG4vKipcbiAqIFRoZSBvbmUgaW5zdGFuY2Ugb2YgTG9jYWxTZXR0aW5ncyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBhbmRcbiAqIHVzZWQgYnkgdGhlIGVkaXRvci5cbiAqIFxuICogVXNlIHRoZSBmdW5jdGlvbnMgYGdldFNldHRpbmdzKClgIGFuZCBgc2V0U2V0dGluZ3MoKWBcbiAqIHRvIGFjY2VzcyB0aGlzIGluc3RhbmNlLlxuICovXG5sZXQgbG9jYWxTZXR0aW5nczogTG9jYWxTZXR0aW5ncyA9IG51bGw7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciB0aGUgc2V0dGluZ3MgZm9yIGVhY2ggZm9saW9cbiAqIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuXG4gKlxuICogRXZlcnkga2V5IGlzIG9wdGlvbmFsIHNvIHRoYXQgdGhpcyBzYW1lIHR5cGluZ1xuICogY2FuIGJlIHVzZWQgZm9yIGBzZXRTZXR0aW5ncygpYCAvIGBMb2NhbFNldHRpbmdzLnNldCgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5ncyB7XG4gIHpvb206IG51bWJlcjtcbiAgZ2x5cGhPcGFjaXR5OiBudW1iZXI7XG4gIGltYWdlT3BhY2l0eTogbnVtYmVyO1xuICBjaXJjbGVTaXplOiBudW1iZXI7XG4gIGhpZ2hsaWdodE1vZGU6IEdyb3VwaW5nVHlwZTtcbiAgdXNlck1vZGU6IFVzZXJUeXBlO1xuICBpbnNlcnRNb2RlOiBJbnNlcnRUeXBlO1xuICBpbnNlcnRUYWI6IEluc2VydFRhYlR5cGU7XG4gIHNlbGVjdGlvbk1vZGU6IFNlbGVjdGlvblR5cGU7XG4gIGRlYnVnTW9kZTogYm9vbGVhbjtcbiAgZGlzcGxheUJCb3g6IGJvb2xlYW47XG4gIGRpc3BsYXlUZXh0OiBib29sZWFuO1xuICBkaXNwbGF5SW5mbzogYm9vbGVhbjtcbiAgZGlzcGxheUVyckxvZzogYm9vbGVhbjtcbiAgdmlld0JveDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmF1bHQgc2V0dGluZ3MsIHdoaWNoIHNob3VsZCBiZSBzZXQgZm9yIGEgZm9saW8gd2l0aCBub1xuICogbG9jYWxTdG9yYWdlIHZhbHVlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIHVwZGF0ZWQgYWxvbmdzaWRlIHRoZSBpbnRlcmZhY2UgYFNldHRpbmdzYFxuICogYW55IHRpbWUgd2Ugd2FudCB0byBhZGQgYSBuZXcgc2V0dGluZyB0byBzdG9yZSBpbiBsb2NhbFN0b3JhZ2UuXG4gKi9cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFNldHRpbmdzID0ge1xuICB6b29tOiAxMDAsXG4gIGdseXBoT3BhY2l0eTogMTAwLFxuICBpbWFnZU9wYWNpdHk6IDEwMCxcbiAgY2lyY2xlU2l6ZTogMjUsXG4gIGhpZ2hsaWdodE1vZGU6ICdub25lJyxcbiAgdXNlck1vZGU6ICdlZGl0JyxcbiAgaW5zZXJ0TW9kZTogJ3B1bmN0dW0nLFxuICBpbnNlcnRUYWI6ICdwcmltaXRpdmVUYWInLFxuICBzZWxlY3Rpb25Nb2RlOiAnc2VsQnlTeWxsYWJsZScsXG4gIGRlYnVnTW9kZTogZmFsc2UsXG4gIGRpc3BsYXlCQm94OiBmYWxzZSxcbiAgZGlzcGxheVRleHQ6IGZhbHNlLFxuICBkaXNwbGF5SW5mbzogZmFsc2UsXG4gIGRpc3BsYXlFcnJMb2c6IGZhbHNlLFxuICB2aWV3Qm94OiBudWxsXG59O1xuXG5jbGFzcyBMb2NhbFNldHRpbmdzIHtcbiAgaWQ6IHN0cmluZztcbiAgc2V0dGluZ3M6IFNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yIChmb2xpb0lkOiBzdHJpbmcpIHtcbiAgICBsb2NhbFNldHRpbmdzID0gdGhpcztcbiAgICB0aGlzLmlkID0gZm9saW9JZDtcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHNldHRpbmdzIGZyb20gbG9jYWxTdG9yYWdlLCBhbmQgc3luYyBsb2FkZWQgc2V0dGluZ3Mgd2l0aFxuICAgKiBuZXcgZmllbGRzIHRoYXQgbWF5IG5vdCBiZSBpbiBsb2NhbFN0b3JhZ2UuXG4gICAqL1xuICBsb2FkICgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkOiBQYXJ0aWFsPFNldHRpbmdzPiA9IEpTT04ucGFyc2Uod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuaWQpKTtcbiAgICAgIHRoaXMuc3luYyhzdG9yZWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBsb2NhbFN0b3JhZ2UgdmFsdWUgaXMgbm90IGEgSlNPTiBvYmplY3QgKGZvciBpbnN0YW5jZSwgYW4gZW1wdHkgc3RyaW5nKSxcbiAgICAgIC8vIGEgU3ludGF4RXJyb3Igd2lsbCBiZSB0aHJvd24uIFdlIG11c3QgaGFuZGxlIGl0IGJ5IGNhbGxpbmcgc3luYygpXG4gICAgICAvLyB3aXRoIGFuIGVtcHR5IEpTT04gb2JqZWN0LlxuICAgICAgdGhpcy5zeW5jKHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IG5ldyBmaWVsZHMgaW4gbG9jYWxTdG9yYWdlLCBhcyBhIFwidW5pb25cIiBvZiBvbGQgYW5kIG5ldyBzZXR0aW5ncy5cbiAgICovXG4gIHNldCAocGFyYW1zOiBQYXJ0aWFsPFNldHRpbmdzPik6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3MgPSB7IC4uLnRoaXMuc2V0dGluZ3MsIC4uLnBhcmFtcyB9O1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmlkLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNldHRpbmdzKSk7XG4gIH1cblxuICAvKipcbiAgICogU3luYyBzZXR0aW5ncyB0aGF0IG1heSBub3QgYmUgaW5jbHVkZWQgaW4gdXNlcidzIGxvY2FsU3RvcmFnZSxcbiAgICogc3VjaCBhcyBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gbG9jYWxTdG9yYWdlIGluIGEgbmV3XG4gICAqIHVwZGF0ZSBvZiBOZW9uLlxuICAgKi9cbiAgc3luYyAoc3RvcmVkOiBQYXJ0aWFsPFNldHRpbmdzPik6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3MgPSB7IC4uLkRFRkFVTFRfU0VUVElOR1MsIC4uLnN0b3JlZCB9O1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmlkLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNldHRpbmdzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgbG9jYWxTdG9yYWdlIHNldHRpbmdzIGZvciB0aGUgZm9saW8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXR0aW5ncyAoKTogU2V0dGluZ3Mge1xuICByZXR1cm4gbG9jYWxTZXR0aW5ncy5zZXR0aW5ncztcbn1cblxuLyoqXG4gKiBTZXQgc3BlY2lmaWMgbG9jYWxTdG9yYWdlIHNldHRpbmdzIGZvciB0aGUgZm9saW8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR0aW5ncyAocGFyYW1zOiBQYXJ0aWFsPFNldHRpbmdzPik6IHZvaWQge1xuICBsb2NhbFNldHRpbmdzLnNldChwYXJhbXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBMb2NhbFNldHRpbmdzO1xuIiwiaW1wb3J0ICogYXMgQ29sb3IgZnJvbSAnLi9Db2xvcic7XG5pbXBvcnQgeyB1cGRhdGVIaWdobGlnaHQgfSBmcm9tICcuLi9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzJztcbmltcG9ydCAqIGFzIEdyb3VwaW5nIGZyb20gJy4uL1NxdWFyZUVkaXQvR3JvdXBpbmcnO1xuaW1wb3J0IHsgcmVzaXplIH0gZnJvbSAnLi9SZXNpemUnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgU2VsZWN0aW9uVHlwZSB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgRHJhZ0hhbmRsZXIgZnJvbSAnLi9EcmFnSGFuZGxlcic7XG5pbXBvcnQgKiBhcyBTZWxlY3RPcHRpb25zIGZyb20gJy4uL1NxdWFyZUVkaXQvU2VsZWN0T3B0aW9ucyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5cbi8qKlxuICogQHJldHVybnMgVGhlIHNlbGVjdGlvbiBtb2RlIGNob3NlbiBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblR5cGUoKTogU2VsZWN0aW9uVHlwZSB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWwtYnkgaXMtYWN0aXZlJyk7XG4gIGlmIChlbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBlbGVtZW50WzBdLmlkIGFzIFNlbGVjdGlvblR5cGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBVbnNlbGVjdCBhbGwgc2VsZWN0ZWQgZWxlbWVudHMgYW5kIHJ1biB1bmRvIGFueSBleHRyYVxuICogYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc2VsZWN0KCk6IHZvaWQge1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcubm8tbW92aW5nJylcbiAgICAuZm9yRWFjaCgoc2VsZWN0ZWQ6IFNWR0dFbGVtZW50KSA9PiBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCduby1tb3ZpbmcnKSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLmZvckVhY2goKHNlbGVjdGVkOiBTVkdHRWxlbWVudCkgPT4ge1xuICAgIHNlbGVjdGVkLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgaWYgKHNlbGVjdGVkLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkge1xuICAgICAgc2VsZWN0ZWQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgQ29sb3IudW5oaWdobGlnaHQoc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICBzZWxlY3RlZC5zdHlsZS5maWxsID0gJyc7XG4gICAgfVxuXG4gICAgQXJyYXkuZnJvbShzZWxlY3RlZC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpKS5mb3JFYWNoKFxuICAgICAgKGRpdkxpbmU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGRpdkxpbmUuc3R5bGUuc3Ryb2tlID0gJyc7XG4gICAgICAgIGRpdkxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMzBweCcpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgQXJyYXkuZnJvbShzZWxlY3RlZC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKSkuZm9yRWFjaChcbiAgICAgIChuZXVtZTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgbmV1bWUuc3R5bGUuZmlsbCA9ICcnO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgQXJyYXkuZnJvbShzZWxlY3RlZC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKS5mb3JFYWNoKFxuICAgICAgKHN5bFJlY3Q6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHN5bFJlY3Quc3R5bGUuZmlsbCA9ICdibHVlJztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmIChzZWxlY3RlZC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUtaGlnaGxpZ2h0ZWQnKSkge1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5zdHlsZS5maWxsID0gJyc7XG4gICAgICBzZWxlY3RlZC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N5bGxhYmxlJyk7XG4gICAgICBzZWxlY3RlZC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG5cbiAgICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpKS5mb3JFYWNoKFxuICAgICAgICAoZGl2TGluZTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBkaXZMaW5lLnN0eWxlLnN0cm9rZSA9ICcnO1xuICAgICAgICAgIGRpdkxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMzBweCcpO1xuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgQXJyYXkuZnJvbShzZWxlY3RlZC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpKS5mb3JFYWNoKFxuICAgICAgICAobmV1bWU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgbmV1bWUuc3R5bGUuZmlsbCA9ICcnO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBkMy5zZWxlY3RBbGwoJyNyZXNpemVSZWN0JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcucmVzaXplUG9pbnQnKS5yZW1vdmUoKTtcbiAgICBkMy5zZWxlY3RBbGwoJy5yb3RhdGVQb2ludCcpLnJlbW92ZSgpO1xuICB9KTtcblxuICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50ZXh0LXNlbGVjdCcpKS5mb3JFYWNoKFxuICAgIChlbDogU1ZHRWxlbWVudCkgPT4ge1xuICAgICAgZWwuc3R5bGUuY29sb3IgPSAnJztcbiAgICAgIGVsLnN0eWxlLmZvbnRXZWlnaHQgPSAnJztcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RleHQtc2VsZWN0Jyk7XG4gICAgfSxcbiAgKTtcblxuICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeVN0YWZmJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgIEdyb3VwaW5nLmVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgU2VsZWN0T3B0aW9ucy5lbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIH1cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgdXBkYXRlSGlnaGxpZ2h0KCk7XG59XG5cbi8qKlxuICogU2VsZWN0IGEgc3RhZmYgZWxlbWVudC5cbiAqIEBwYXJhbSBzdGFmZiAtIFRoZSBzdGFmZiBlbGVtZW50IGluIHRoZSBET00uXG4gKiBAcGFyYW0gZHJhZ0hhbmRsZXIgLSBUaGUgZHJhZyBoYW5kbGVyIGluIHVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFN0YWZmKFxuICBzdGFmZjogU1ZHR0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcixcbik6IHZvaWQge1xuICBpZiAoIXN0YWZmLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgIHN0YWZmLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgQ29sb3IudW5oaWdobGlnaHQoc3RhZmYpO1xuICAgIENvbG9yLmhpZ2hsaWdodChzdGFmZiwgJyNkMDAnKTtcbiAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMoKTtcbiAgICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbiAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGEgbGF5ZXIgZWxlbWVudC5cbiAqIEBwYXJhbSBsYXllckVsZW1lbnQgLSBUaGUgbGF5ZXIgZWxlbWVudCBpbiB0aGUgRE9NLlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gVGhlIGRyYWcgaGFuZGxlciBpbiB1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RMYXllckVsZW1lbnQoXG4gIGxheWVyRWxlbWVudDogU1ZHR0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcixcbik6IHZvaWQge1xuICBpZiAoIWxheWVyRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBsYXllckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBDb2xvci51bmhpZ2hsaWdodChsYXllckVsZW1lbnQpO1xuICAgIENvbG9yLmhpZ2hsaWdodChsYXllckVsZW1lbnQsICcjZDAwJyk7XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyaWMgc2VsZWN0IGZ1bmN0aW9uLlxuICogQHBhcmFtIGVsIC0gRWxlbWVudCB0byBzZWxlY3QuXG4gKiBAcGFyYW0gZHJhZ0hhbmRsZXIgLSBPbmx5IHVzZWQgZm9yIHN0YXZlcy5cbiAqIEBwYXJhbSBuZWVkc0hpZ2hsaWdodFVwZGF0ZSAtIFdoZXRoZXIgYWxsIHRoZSBncm91cCdzIGhpZ2hsaWdodHMgc2hvdWxkIGJlIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChcbiAgZWw6IFNWR0dyYXBoaWNzRWxlbWVudCxcbiAgZHJhZ0hhbmRsZXI/OiBEcmFnSGFuZGxlcixcbiAgbmVlZHNIaWdobGlnaHRVcGRhdGUgPSB0cnVlLFxuKTogdm9pZCB7XG4gIC8vIElmIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QsIGV4aXRcbiAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICByZXR1cm4gc2VsZWN0U3RhZmYoZWwsIGRyYWdIYW5kbGVyKTtcbiAgfVxuICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdsYXllcicpKSB7XG4gICAgcmV0dXJuIHNlbGVjdExheWVyRWxlbWVudChlbCwgZHJhZ0hhbmRsZXIpO1xuICB9XG5cbiAgaWYgKFxuICAgICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgJiZcbiAgICAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxUZXh0UmVjdCcpICYmXG4gICAgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsVGV4dFJlY3QtZGlzcGxheScpXG4gICkge1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgLy8gc2V0IGZpbGwgdG8gcmVkXG4gICAgLy8gc2V0IHN0cm9rZSB0byByZWQgb25seSBpZiBzZWxlY3RlZCBlbGVtIGlzIGEgZGl2TGluZVxuICAgIGVsLnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgZWwuc3R5bGUuc3Ryb2tlID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykgPyAnI2QwMCcgOiAnYmxhY2snO1xuXG4gICAgaWYgKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykubGVuZ3RoKSB7XG4gICAgICBlbC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2goXG4gICAgICAgIChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIGVsZW0uc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykubGVuZ3RoKSB7XG4gICAgICBlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW0uc3R5bGUuc3Ryb2tlID0gJyNkMDAnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKSkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbG9yIG9mIHRoZSBjb3JyZXNwb25kaW5nIHRleHQgaW4gdGhlIHRleHQgcGFuZWwgdG8gcmVkXG4gICAgbGV0IHN5bElkO1xuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIHN5bElkID0gZWwuaWQ7XG4gICAgfSBlbHNlIGlmIChlbC5jbG9zZXN0KCcuc3lsbGFibGUnKSAhPT0gbnVsbCkge1xuICAgICAgc3lsSWQgPSBlbC5jbG9zZXN0KCcuc3lsbGFibGUnKS5pZDtcbiAgICB9XG4gICAgaWYgKHN5bElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNwYW5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3Bhbi4nICsgc3lsSWQpO1xuICAgICAgc3BhbnMuZm9yRWFjaCgoc3BhbjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjZDAwJztcbiAgICAgICAgc3Bhbi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xuICAgICAgICBzcGFuLmNsYXNzTGlzdC5hZGQoJ3RleHQtc2VsZWN0Jyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRzSGlnaGxpZ2h0VXBkYXRlKSB7XG4gICAgdXBkYXRlSGlnaGxpZ2h0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgYW4gbmMuXG4gKiBAcGFyYW0gZWwgLSBUaGUgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VsZWN0TmNzKFxuICBlbDogU1ZHR3JhcGhpY3NFbGVtZW50LFxuICBuZW9uVmlldzogTmVvblZpZXcsXG4gIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWVsLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudCBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICB1bnNlbGVjdCgpO1xuICAgIHNlbGVjdChwYXJlbnQpO1xuICAgIGlmIChhd2FpdCBpc0xpZ2F0dXJlKHBhcmVudCwgbmVvblZpZXcpKSB7XG4gICAgICBjb25zdCBwcmV2TmMgPSBwYXJlbnQucHJldmlvdXNTaWJsaW5nIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgaWYgKGF3YWl0IGlzTGlnYXR1cmUocHJldk5jLCBuZW9uVmlldykpIHtcbiAgICAgICAgc2VsZWN0KHByZXZOYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0TmMgPSBwYXJlbnQubmV4dFNpYmxpbmcgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIGlmIChhd2FpdCBpc0xpZ2F0dXJlKG5leHROYywgbmVvblZpZXcpKSB7XG4gICAgICAgICAgc2VsZWN0KG5leHROYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvcjogTmVpdGhlciBwcmV2IG9yIG5leHQgbmMgYXJlIGxpZ2F0dXJlcycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBHcm91cGluZy50cmlnZ2VyR3JvdXBpbmcoJ2xpZ2F0dXJlJyk7XG4gICAgfSBlbHNlIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCduYycpKSB7XG4gICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJOY0FjdGlvbnMocGFyZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdObyBhY3Rpb24gdHJpZ2dlcmVkIScpO1xuICAgIH1cbiAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIG5jIC0gVGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEBwYXJhbSBuZW9uVmlldyAtIFRoZSBbW05lb25WaWV3XV0gZm9yIHRoaXMgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBuZXVtZSBjb21wb25lbnQgaXMgcGFydCBvZiBhIGxpZ2F0dXJlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNMaWdhdHVyZShcbiAgbmM6IFNWR0dyYXBoaWNzRWxlbWVudCxcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZXMgPSBhd2FpdCBuZW9uVmlldy5nZXRFbGVtZW50QXR0cihcbiAgICBuYy5pZCxcbiAgICBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCksXG4gICk7XG4gIHJldHVybiBCb29sZWFuKGF0dHJpYnV0ZXMubGlnYXRlZCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgbGlzdCBvZiBlbGVtZW50cyBvZiBhIGNlcnRhaW4gdHlwZSBhcmUgbG9naWNhbGx5IGFkamFjZW50IHRvIGVhY2ggb3RoZXIuXG4gKiBJbmNsdWRlcyBlbGVtZW50cyB0aGF0IGFyZSBvbiBzZXBhcmF0ZSBzdGF2ZXMgYnV0IHdvdWxkIG90aGVyd2lzZSBiZSBuZXh0IHRvIGVhY2ggb3RoZXIuXG4gKiBDYW4gbm90IGFwcGx5IHRvIGVsZW1lbnRzIG9mIHR5cGUgbmV1bWUgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb25UeXBlIHVzZXIgc2VsZWN0aW9uIG1vZGVcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgb2YgaW50ZXJlc3RcbiAqIEByZXR1cm5zIHRydWUgaWYgZWxlbWVudHMgYXJlIGFkamFjZW50LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZUFkamFjZW50KFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICAvLyAyIGVsZW1lbnRzIGNhbm5vdCBiZSBhZGphY2VudCBpZiB0aGVyZSBpcyBvbmx5IDEgZWxlbWVudFxuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGdldCBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhcyBzZWxlY3Rpb25UeXBlXG4gIGxldCBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZTogSFRNTEVsZW1lbnRbXTtcbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSA9IEFycmF5LmZyb20oXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZScpLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICAvLyBXZSBhdXRvbWF0aWNhbGx5IHJldHVybiAndHJ1ZScgZm9yIG5ldW1lcyBiZWNhdXNlIHdlIHdhbnQgdGhlIHVzZXIgdG8gYmVcbiAgICAgIC8vIGFsbG93ZWQgdG8gZ3JvdXAgdHdvIG5ldW1lcyBpbiBzZXBhcmF0ZSBzeWxsYWJlcyB3aXRob3V0IGhhdmluZyB0byBwYXJmb3JtIG90aGVyXG4gICAgICAvLyBzdGVwcyBmaXJzdC4gWWVzLCB0aGVyZSBpcyBhIHRyYWRlLW9mZiAtIHRoaXMgYWxsb3dzIHVzZXJzIHRvIHRyeSBhbmQgZ3JvdXAgYW55XG4gICAgICAvLyB0d28gbm9uLWFkamFjZW50IG5ldW1lcywgYnV0IGl0IHdhcyBkZWNpZGVkIHRoYXQgdGhlIGJlbmVmaXRzIChzcGVlZCBhbmQgZWZmaWNpZW5jeSlcbiAgICAgIC8vIG91dHdlaWdoIHRoZSBjb3N0cyAodXNlciB0cnlpbmcgYW4gaWxsZWdhbCBlZGl0KS5cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5jJykpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeVN0YWZmJzpcbiAgICAgIGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYnKSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBTb3J0IFNFTEVDVEVEIGVsZW1lbnRzIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UgYnlcbiAgLy8gbWF0Y2hpbmcgdG8gb3JkZXIgb2YgQUxMIGVsZW1lbnRzIG9mIHNlbGVjdGlvbiB0eXBlXG4gIGNvbnN0IHNvcnRlZEVsZW1lbnRzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoYWxsRWxlbXNPZlNlbGVjdGlvblR5cGVbaV0uaXNTYW1lTm9kZShlbGVtZW50c1tqXSkpIHtcbiAgICAgICAgc29ydGVkRWxlbWVudHMucHVzaChlbGVtZW50c1tqXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTm93IGNoZWNrIGlmIFNFTEVDVEVEIGVsZW1lbnRzIGFyZSBhbGwgYWRqYWNlbnQgKGluIGEgcm93KSBieVxuICAvLyBmaW5kaW5nIGFuZCBjb21wYXJpbmcgdGhlaXIgaW5kZWNlcyBpbiB0aGUgYXJyYXkgb2YgQUxMIGVsZW1lbnRzIG9mIHNlbGVjdGlvbiB0eXBlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkRWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgZmlyc3RFbGVtID0gc29ydGVkRWxlbWVudHNbaV07XG4gICAgY29uc3Qgc2Vjb25kRWxlbSA9IHNvcnRlZEVsZW1lbnRzW2kgKyAxXTtcblxuICAgIGNvbnN0IGluZGV4MSA9IGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlLmluZGV4T2YoZmlyc3RFbGVtKTtcbiAgICBjb25zdCBpbmRleDIgPSBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZS5pbmRleE9mKHNlY29uZEVsZW0pO1xuXG4gICAgaWYgKE1hdGguYWJzKGluZGV4MSAtIGluZGV4MikgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJyYXkgb2YgZWxlbWVudHMgYWxsIHNoYXJlIHRoZSBzYW1lIGxvZ2ljYWwgcGFyZW50LlxuICogRm9yIGV4YW1wbGU6IElmIGFsbCBuZXVtZXMgYXJlIGluIHRoZSBzYW1lIHN5bGxhYmxlLlxuICpcbiAqIE5vdGUhISBUaGVyZSBpcyBjdXJyZW50bHkgbm8gbG9naWMgZm9yIHRyZWF0aW5nIGxheWVyIGVsZW1lbnRzIGFuZCBiYm94ZXMhXG4gKiBOb3RlISEgRnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIHRydWUgZm9yIHN0YXZlIGVsZW1lbnRzLiAoU2hvdWxkIGl0Pz8/KVxuICpcbiAqIEBwYXJhbSBzZWxlY3Rpb25UeXBlIHRoZSBjdXJyZW50IE5lb24gc2VsZWN0aW9uIG1vZGVcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgaW4gcXVlc3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgYWxsIGVsZW1lbnRzIHNoYXJlIHRoZSBzYW1lIGxvZ2ljYWwgcGFyZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWRMb2dpY2FsUGFyZW50KFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICBlbGVtZW50cyA9IGVsZW1lbnRzLmZpbHRlcihcbiAgICAoZWxlbSkgPT5cbiAgICAgICEoXG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykgfHxcbiAgICAgICAgZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2FjY2lkJykgfHxcbiAgICAgICAgZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKVxuICAgICAgKSxcbiAgKTtcblxuICBpZiAoIWVsZW1lbnRzSGF2ZUNvcnJlY3RUeXBlKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgY29uc3QgcmVmZXJlbmNlUGFyZW50U3RhZmYgPSBlbGVtZW50c1swXS5jbG9zZXN0KCcuc3RhZmYnKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAoIWVsZW0uY2xvc2VzdCgnLnN0YWZmJykuaXNTYW1lTm9kZShyZWZlcmVuY2VQYXJlbnRTdGFmZikpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIGNvbnN0IHJlZmVyZW5jZVBhcmVudFN5bGxhYmxlID0gZWxlbWVudHNbMF0uY2xvc2VzdCgnLnN5bGxhYmxlJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpLmlzU2FtZU5vZGUocmVmZXJlbmNlUGFyZW50U3lsbGFibGUpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbGwgc2VsZWN0ZWQgZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGN1cnJlbnQgc2VsZWN0aW9uIG1vZGUuXG4gKiBGb3IgZXhhbXBsZSwgY2hlY2sgaWYgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGFyZSBvZiB0eXBlIG5ldW1lLCBvciBzeWxsYWJsZSwgZXRjLlxuICpcbiAqIE5vdGUhISBUaGVyZSBpcyBubyBsb2dpYyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIGxheWVyIGVsZW1lbnRzIG9yIGJib3hlcy5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gbW9kZVxuICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBiZWluZyBjaGVja2VkXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBlbGVtZW50cyBtYXRjaCBzZWxlY3Rpb24gbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudHNIYXZlQ29ycmVjdFR5cGUoXG4gIHNlbGVjdGlvblR5cGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IFNWR0dyYXBoaWNzRWxlbWVudFtdLFxuKTogYm9vbGVhbiB7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGlmICghZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBpZiAoIWVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbGVtZW50cyAtIFRoZSBlbGVtZW50cyB0byBjb21wYXJlLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSBwYXJlbnQgdXAgdHdvIGxldmVscywgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkU2Vjb25kTGV2ZWxQYXJlbnQoXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCB0ZW1wRWxlbWVudHMgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcbiAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcEVsZW1lbnRzLnBvcCgpO1xuICBjb25zdCBzZWNvbmRQYXJlbnQgPSBmaXJzdEVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGVtcEVsZW1lbnRzKSB7XG4gICAgY29uc3Qgc2VjUGFyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKHNlY1Bhci5pZCAhPT0gc2Vjb25kUGFyZW50LmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHVzZXIgc2VsZWN0ZWQgZWxlbWVudHMgYWNjcm9zcyBtdWx0aXBsZSBzdGF2ZXNcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgdXNlci1zZWxlY3RlZCBlbGVtZW50c1xuICogQHJldHVybnMgdHJ1ZSBpZiBzZWxlY3Rpb24gaXMgYWNjcm9zcyBtdWx0aXBsZSBzdGF2ZXMsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNdWx0aVN0YXZlU2VsZWN0aW9uKGVsZW1lbnRzOiBTVkdFbGVtZW50W10pOiBib29sZWFuIHtcbiAgY29uc3QgZWxlbWVudHNBcnJheSA9IEFycmF5LmZyb20oZWxlbWVudHMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN0YWZmID0gZWxlbWVudHNBcnJheVtpXS5jbG9zZXN0KCcuc3RhZmYnKTtcblxuICAgIGZvciAobGV0IGogPSBpOyBqIDwgZWxlbWVudHNBcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYW5vdGhlclN0YWZmID0gZWxlbWVudHNBcnJheVtqXS5jbG9zZXN0KCcuc3RhZmYnKTtcbiAgICAgIC8vIGNvbXBhcmUgd2l0aCBvdGhlciBzdGF2ZXNcbiAgICAgIGlmICghc3RhZmYuaXNTYW1lTm9kZShhbm90aGVyU3RhZmYpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQm91bmRpbmcgYm94IG9iamVjdCBpbnRlcmZhY2UgZm9yIGdldFN0YWZmQkJveCgpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZmZCQm94IHtcbiAgaWQ6IHN0cmluZztcbiAgdWx4OiBudW1iZXI7XG4gIHVseTogbnVtYmVyO1xuICBscng6IG51bWJlcjtcbiAgbHJ5OiBudW1iZXI7XG4gIHJvdGF0ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYm91bmRpbmcgYm94IG9mIGEgc3RhZmYgYmFzZWQgb24gaXRzIHN0YWZmIGxpbmVzLlxuICogUm90YXRlIGlzIGluY2x1ZGVkIGluIHJhZGlhbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFmZkJCb3goc3RhZmY6IFNWR0dFbGVtZW50KTogU3RhZmZCQm94IHtcbiAgbGV0IHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlO1xuICBzdGFmZi5xdWVyeVNlbGVjdG9yQWxsKCdwYXRoJykuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzOiBudW1iZXJbXSA9IHBhdGhcbiAgICAgIC5nZXRBdHRyaWJ1dGUoJ2QnKVxuICAgICAgLm1hdGNoKC9cXGQrL2cpXG4gICAgICAubWFwKChlbGVtZW50KSA9PiBOdW1iZXIoZWxlbWVudCkpO1xuICAgIGlmIChyb3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcm90YXRlID0gTWF0aC5hdGFuKFxuICAgICAgICAoY29vcmRpbmF0ZXNbM10gLSBjb29yZGluYXRlc1sxXSkgLyAoY29vcmRpbmF0ZXNbMl0gLSBjb29yZGluYXRlc1swXSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh1bHkgPT09IHVuZGVmaW5lZCB8fCBNYXRoLm1pbihjb29yZGluYXRlc1sxXSwgY29vcmRpbmF0ZXNbM10pIDwgdWx5KSB7XG4gICAgICB1bHkgPSBNYXRoLm1pbihjb29yZGluYXRlc1sxXSwgY29vcmRpbmF0ZXNbM10pO1xuICAgIH1cbiAgICBpZiAodWx4ID09PSB1bmRlZmluZWQgfHwgY29vcmRpbmF0ZXNbMF0gPCB1bHgpIHtcbiAgICAgIHVseCA9IGNvb3JkaW5hdGVzWzBdO1xuICAgIH1cbiAgICBpZiAobHJ5ID09PSB1bmRlZmluZWQgfHwgTWF0aC5tYXgoY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKSA+IGxyeSkge1xuICAgICAgbHJ5ID0gTWF0aC5tYXgoY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKTtcbiAgICB9XG4gICAgaWYgKGxyeCA9PT0gdW5kZWZpbmVkIHx8IGNvb3JkaW5hdGVzWzJdID4gbHJ4KSB7XG4gICAgICBscnggPSBjb29yZGluYXRlc1syXTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7IGlkOiBzdGFmZi5pZCwgdWx4LCB1bHksIGxyeCwgbHJ5LCByb3RhdGUgfTtcbn1cblxuLyoqXG4gKiBzZWxlY3QgYSBib3VuZGluZ2JveCBlbGVtZW50XG4gKiBAcGFyYW0gZWwgLSB0aGUgYmJveCAoc3lsVGV4dFJlY3QpIGVsZW1lbnQgaW4gdGhlIERPTVxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gdGhlIGRyYWcgaGFuZGxlciBpbiB1c2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJCb3goXG4gIGVsOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcixcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJib3ggPSBlbDtcbiAgY29uc3Qgc3lsID0gYmJveC5jbG9zZXN0KCcuc3lsJyk7XG4gIGlmICghc3lsLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgIHN5bC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIGJib3guc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICBjb25zdCBjbG9zZXN0ID0gZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY2xvc2VzdC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgIGNsb3Nlc3QuY2xhc3NMaXN0LmFkZCgnc3lsbGFibGUtaGlnaGxpZ2h0ZWQnKTtcbiAgICBpZiAoY2xvc2VzdC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpLmxlbmd0aCkge1xuICAgICAgY2xvc2VzdC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKS5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtLnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICB9KTtcbiAgICAgIGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtLnN0eWxlLnN0cm9rZSA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChuZW9uVmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXNpemUoc3lsIGFzIFNWR0dyYXBoaWNzRWxlbWVudCwgbmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICB9XG4gICAgaWYgKGRyYWdIYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gICAgfVxuICAgIGNvbnN0IHN5bElkID0gZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykuaWQ7XG4gICAgaWYgKHN5bElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNwYW46IEhUTUxTcGFuRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4uJyArIHN5bElkKTtcbiAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnI2QwMCc7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LXNlbGVjdCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBTZWxlY3RPcHRpb25zLnRyaWdnZXJCQm94QWN0aW9ucygpO1xufVxuXG4vKipcbiAqIFNlbGVjdCBub3QgbmV1bWUgZWxlbWVudHMuXG4gKiBAcGFyYW0gbm90TmV1bWVzIC0gQW4gYXJyYXkgb2Ygbm90IG5ldW1lcyBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdE5uKG5vdE5ldW1lczogU1ZHR3JhcGhpY3NFbGVtZW50W10pOiBib29sZWFuIHtcbiAgaWYgKG5vdE5ldW1lcy5sZW5ndGggPiAwKSB7XG4gICAgbm90TmV1bWVzLmZvckVhY2goKG5uKSA9PiB7XG4gICAgICBzZWxlY3Qobm4pO1xuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBzZWxlY3RpbmcgYW4gYXJyYXkgb2YgZWxlbWVudHMgYmFzZWQgb24gdGhlIHNlbGVjdGlvbiB0eXBlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VsZWN0QWxsKFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50PixcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc2VsZWN0aW9uVHlwZSA9IGdldFNlbGVjdGlvblR5cGUoKTtcbiAgdW5zZWxlY3QoKTtcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgc2VsZWN0aW9uQ2xhc3M7XG4gIGxldCBjb250YWluc0xheWVyRWxlbWVudHMgPSBmYWxzZTtcbiAgbGV0IGNvbnRhaW5zTmMgPSBmYWxzZTtcblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5zeWxsYWJsZSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5uZXVtZSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxCeU5jJzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5uYyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxCeVN0YWZmJzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5zdGFmZic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgc2VsZWN0aW9uQ2xhc3MgPSAnLnN5bFRleHRSZWN0LWRpc3BsYXknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlMYXllckVsZW1lbnQnOlxuICAgICAgc2VsZWN0aW9uQ2xhc3MgPSAnLmNsZWYsIC5jdXN0b3MsIC5hY2NpZCwgLmRpdkxpbmUnO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gc2VsZWN0aW9uIHR5cGUgJyArIHNlbGVjdGlvblR5cGUpO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gR2V0IHRoZSBncm91cGluZ3Mgc3BlY2lmaWVkIGJ5IHNlbGVjdGlvbkNsYXNzXG4gIC8vIHRoYXQgY29udGFpbiB0aGUgcHJvdmlkZWQgZWxlbWVudHMgdG8gc2VsZWN0LlxuICBjb25zdCBncm91cHNUb1NlbGVjdCA9IG5ldyBTZXQ8U1ZHR0VsZW1lbnQ+KCk7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGxldCBncm91cGluZyA9IGVsZW1lbnQuY2xvc2VzdDxTVkdHRWxlbWVudD4oc2VsZWN0aW9uQ2xhc3MpO1xuICAgIGlmIChncm91cGluZyA9PT0gbnVsbCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UgY2xpY2stc2VsZWN0ZWQgYSBjbGVmIG9yIGEgY3VzdG9zIG9yIGFuIGFjY2lkIG9yIGEgZGl2TGluZVxuICAgICAgZ3JvdXBpbmcgPSBlbGVtZW50LmNsb3Nlc3QoJy5jbGVmLCAuY3VzdG9zLCAuYWNjaWQsIC5kaXZMaW5lJyk7XG4gICAgICBpZiAoZ3JvdXBpbmcgPT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdFbGVtZW50ICcgK1xuICAgICAgICAgICAgZWxlbWVudC5pZCArXG4gICAgICAgICAgICAnIGlzIG5vdCBwYXJ0IG9mIHNwZWNpZmllZCBncm91cCBhbmQgaXMgbm90IGEgY2xlZiBvciBjdXN0b3Mgb3IgYWNjaWQgb3IgZGl2TGluZS4nLFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5zTGF5ZXJFbGVtZW50cyA9IGNvbnRhaW5zTGF5ZXJFbGVtZW50cyB8fCB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluc05jID0gY29udGFpbnNOYyB8fCB0cnVlO1xuICAgIH1cbiAgICBncm91cHNUb1NlbGVjdC5hZGQoZ3JvdXBpbmcpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHByZWNlZGVzL2ZvbGxvd3NcbiAgICBsZXQgc2VsZWN0ZWQgPSBncm91cGluZztcbiAgICBsZXQgZm9sbG93cyA9IHNlbGVjdGVkLmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKTtcbiAgICBsZXQgcHJlY2VkZXMgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpO1xuICAgIHdoaWxlIChmb2xsb3dzIHx8IHByZWNlZGVzKSB7XG4gICAgICBpZiAoZm9sbG93cykge1xuICAgICAgICBzZWxlY3RlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgZm9sbG93cy5zbGljZSgxKSk7XG4gICAgICAgIGlmIChncm91cHNUb1NlbGVjdC5oYXMoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LmFkZCgnbm8tbW92aW5nJyk7XG4gICAgICAgIGdyb3Vwc1RvU2VsZWN0LmFkZChzZWxlY3RlZCk7XG4gICAgICAgIGZvbGxvd3MgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyk7XG4gICAgICB9XG4gICAgICBpZiAocHJlY2VkZXMpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHByZWNlZGVzLnNsaWNlKDEpKTtcbiAgICAgICAgaWYgKGdyb3Vwc1RvU2VsZWN0LmhhcyhzZWxlY3RlZCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZC5jbGFzc0xpc3QuYWRkKCduby1tb3ZpbmcnKTtcbiAgICAgICAgZ3JvdXBzVG9TZWxlY3QuYWRkKHNlbGVjdGVkKTtcbiAgICAgICAgcHJlY2VkZXMgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBTZWxlY3QgdGhlIGVsZW1lbnRzXG4gIGdyb3Vwc1RvU2VsZWN0LmZvckVhY2goKGdyb3VwOiBTVkdHcmFwaGljc0VsZW1lbnQpID0+XG4gICAgc2VsZWN0KGdyb3VwLCBkcmFnSGFuZGxlciwgZmFsc2UpLFxuICApO1xuXG4gIC8qIERldGVybWluZSB0aGUgY29udGV4dCBtZW51IHRvIGRpc3BsYXkgKGlmIGFueSkgKi9cblxuICBjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGdyb3Vwc1RvU2VsZWN0LnZhbHVlcygpKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICAvLyBIYW5kbGUgb2NjdXJhbmNlIG9mIGNsZWYgb3IgY3VzdG9zIG9yIGFjY2lkIG9yIGRpdkxpbmVcbiAgaWYgKGNvbnRhaW5zTGF5ZXJFbGVtZW50cyAmJiAhY29udGFpbnNOYykge1xuICAgIC8vIEEgY29udGV4dCBtZW51IHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYSBzaW5nbGUgY2xlZlxuICAgIGlmIChncm91cHNUb1NlbGVjdC5zaXplID09PSAxKSB7XG4gICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJMYXllckVsZW1lbnRBY3Rpb25zKGdyb3Vwc1swXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzZWxlY3Rpb25UeXBlID09ICdzZWxCeVN5bGxhYmxlJykge1xuICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0U3lsQWN0aW9ucygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclNpbmdsZVN0YWZmQWN0aW9ucygpO1xuICAgICAgICAgIEdyb3VwaW5nLmluaXRHcm91cGluZ0xpc3RlbmVycygpO1xuICAgICAgICAgIHJlc2l6ZShncm91cHNbMF0sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTXVsdGlTdGFmZkFjdGlvbnMoKTtcbiAgICAgICAgICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlMYXllckVsZW1lbnQnOlxuICAgICAgaWYgKGdyb3Vwc1RvU2VsZWN0LnNpemUgPT09IDEpIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhncm91cHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdEFjdGlvbnMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIC8vIFRPRE8gY2hhbmdlIGNvbnRleHQgaWYgaXQgaXMgb25seSBhIG5ldW1lL25jLlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnc2luZ2xlU2VsZWN0Jyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbGlua2VkIHN5bGxhYmxlIHNwbGl0IGJ5IGEgc3RhZmYgYnJlYWtcbiAgICAgICAgICAvLyBpZiB0aGV5IGFyZSBsaW5rYWJsZSwgdXNlciBjYW4gdG9nZ2xlIGxpbmtlZC1zeWxsc1xuICAgICAgICAgIGlmIChHcm91cGluZy5pc0xpbmthYmxlKCdzZWxCeVN5bGxhYmxlJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdsaW5rYWJsZVNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBzeWxsYWJsZXMgYXJlIGFsbCBsb2NhdGVkIG9uIG9uZSBzdGF2ZSwgdGhleSBzaG91bGQgYmUgZ3JvdXBhYmxlXG4gICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcuaXNHcm91cGFibGUoJ3NlbEJ5U3lsbGFibGUnLCBncm91cHMpKSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ211bHRpU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHN5bGxzIGFyZSBhY2Nyb3NzIG11bHRpcGxlIHN0YXZlc1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdkZWZhdWx0Jyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIHN3aXRjaCAoZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gVE9ETyBjaGFuZ2UgY29udGV4dCBpZiBpdCBpcyBvbmx5IGEgbmMuXG4gICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmV1bWVBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKEdyb3VwaW5nLmlzR3JvdXBhYmxlKCdzZWxCeU5ldW1lJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduZXVtZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck5jQWN0aW9ucyhncm91cHNbMF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHNoYXJlZFNlY29uZExldmVsUGFyZW50KGdyb3VwcykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgc2VsZWN0aW9uIGlzIGEgbGlnYXR1cmUgb3IgY2FuIGJlIGEgbGlnYXR1cmVcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXNlIG5ldW1lIGNvbXBvbmVudHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgbmV1bWVcbiAgICAgICAgICAgIGlmIChncm91cHNbMF0ucGFyZW50RWxlbWVudCA9PT0gZ3JvdXBzWzFdLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGdyb3Vwc1swXS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcblxuICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IG5ldW1lIGNvbXBvbmVudHMgYXJlIGFkamFjZW50XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzBdKSAtIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzFdKSxcbiAgICAgICAgICAgICAgICApID09PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2Vjb25kIG5ldW1lIGNvbXBvbmVudCBpcyBsb3dlciB0aGFuIGZpcnN0LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgb3JkZXIgaW4gdGhlIGxpc3QgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGVcbiAgICAgICAgICAgICAgICAvLyBvcmRlciBieSB4LXBvc2l0aW9uLlxuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DID0gZ3JvdXBzWzBdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZE5DID0gZ3JvdXBzWzFdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQ1ggPSBmaXJzdE5DLnguYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2Vjb25kTkNYID0gc2Vjb25kTkMueC5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DWSA9IGZpcnN0TkMueS5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBzZWNvbmROQ1kgPSBzZWNvbmROQy55LmJhc2VWYWwudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAvLyBvcmRlciBuYydzIGJ5IHggY29vcmQgKGxlZnQgdG8gcmlnaHQpXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ggPiBzZWNvbmROQ1ggfHxcbiAgICAgICAgICAgICAgICAgIChmaXJzdE5DWCA9PT0gc2Vjb25kTkNYICYmIGZpcnN0TkNZIDwgc2Vjb25kTkNZKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgW2ZpcnN0TkMsIHNlY29uZE5DXSA9IFtzZWNvbmROQywgZmlyc3ROQ107XG4gICAgICAgICAgICAgICAgICBbZmlyc3ROQ1gsIGZpcnN0TkNZLCBzZWNvbmROQ1gsIHNlY29uZE5DWV0gPSBbXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZE5DWCxcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kTkNZLFxuICAgICAgICAgICAgICAgICAgICBmaXJzdE5DWCxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ksXG4gICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIHN0YWNrZWQgbmMncy9saWdhdHVyZSAoaWRlbnRpY2FsIHgpLCBvciBkZXNjZW5kaW5nIG5jJ3MgKHkgZGVzY2VuZHMpXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0TkNYID09PSBzZWNvbmROQ1ggfHwgZmlyc3ROQ1kgPCBzZWNvbmROQ1kpIHtcbiAgICAgICAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbGlnYXR1cmUnKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoc2hhcmVkU2Vjb25kTGV2ZWxQYXJlbnQoZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5QkJveCc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHNlbGVjdEJCb3goZ3JvdXBzWzBdLCBkcmFnSGFuZGxlciwgbmVvblZpZXcpO1xuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckJCb3hBY3Rpb25zKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHNlbGVjdEJCb3goZywgZHJhZ0hhbmRsZXIsIHVuZGVmaW5lZCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gc2VsZWN0aW9uIHR5cGUuIFRoaXMgc2hvdWxkIG5vdCBoYXZlIG9jY3VycmVkLicpO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gY2hhbmdlU3RhZmZMaXN0ZW5lcigpOiB2b2lkIHtcbiAgLy8gdHJ5IHtcbiAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYW5nZVN0YWZmJylcbiAgLy8gLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgU2VsZWN0T3B0aW9ucy5jaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICAvLyB9IGNhdGNoIChlKSB7Y29uc29sZS5kZWJ1ZyhlKTt9XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7IHJlY29yZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vRXJyb3JMb2cnO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSAnLi9yYW5kb20nO1xuXG50eXBlIE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ3N1Y2Nlc3MnO1xuXG5jb25zdCBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25bXSA9IG5ldyBBcnJheSgwKTtcbmxldCBjdXJyZW50TW9kZU1lc3NhZ2U6IE5vdGlmaWNhdGlvbiA9IG51bGw7XG5cbi8qKlxuICogTnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgdG8gZGlzcGxheSBhdCBhIHRpbWUuXG4gKi9cbmNvbnN0IE5VTUJFUl9UT19ESVNQTEFZID0gMztcblxuLyoqXG4gKiBOdW1iZXIgb2Ygbm90aWZpY2F0aW9ucyB0byBkaXNwbGF5IGF0IGEgdGltZS5cbiAqL1xuY29uc3QgVElNRU9VVCA9IDUwMDA7XG5cbmNvbnN0IG5vdGlmaWNhdGlvbkljb246IFJlY29yZDxOb3RpZmljYXRpb25UeXBlLCBzdHJpbmc+ID0ge1xuICBkZWZhdWx0OiAnJyxcbiAgd2FybmluZzogJ+KaoO+4jyAnLFxuICBlcnJvcjogJ/CflLQgJyxcbiAgc3VjY2VzczogJ+KchSAnLFxufTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIG1hbmFnZSBOZW9uIG5vdGlmaWNhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRpc3BsYXllZDogYm9vbGVhbjtcbiAgaWQ6IHN0cmluZztcbiAgaXNNb2RlTWVzc2FnZTogYm9vbGVhbjtcbiAgbG9nSW5mbzogc3RyaW5nO1xuICB0aW1lb3V0SUQ6IG51bWJlcjtcbiAgdHlwZTogTm90aWZpY2F0aW9uVHlwZTtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBub3RpZmljYXRpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gTm90aWZpY2F0aW9uIGNvbnRlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBOb3RpZmljYXRpb25UeXBlLCBsb2dJbmZvOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbm90aWZpY2F0aW9uSWNvblt0eXBlXSArIG1lc3NhZ2U7XG4gICAgdGhpcy5kaXNwbGF5ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5pc01vZGVNZXNzYWdlID0gbWVzc2FnZS5zZWFyY2goJ01vZGUnKSAhPT0gLTE7XG4gICAgdGhpcy5sb2dJbmZvID0gbG9nSW5mbztcbiAgICB0aGlzLnRpbWVvdXRJRCA9IC0xO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBJRCBmcm9tIHNldFRpbWVvdXQuICovXG4gIHNldFRpbWVvdXRJZCAoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudGltZW91dElEID0gTWF0aC5tYXgoaWQsIC0xKTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IHRoZSBOb3RpZmljYXRpb24uICovXG4gIGRpc3BsYXkgKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgVVVJRCBmb3IgdGhpcyBub3RpZmljYXRpb24uXG4gICAqL1xuICBnZXRJZCAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIHRoZSBub3RpZmljYXRpb25cbiAqIEBwYXJhbSBjdXJyZW50SWQgLSBUaGUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBjbGVhcmVkLlxuICovXG5mdW5jdGlvbiBjbGVhck5vdGlmaWNhdGlvbiAoY3VycmVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGN1cnJlbnRJZCkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjdXJyZW50SWQpLnJlbW92ZSgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBhIG5vdGlmaWNhdGlvbi5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gdG8gZGlzcGxheS5cbiAqL1xuZnVuY3Rpb24gZGlzcGxheU5vdGlmaWNhdGlvbiAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgLy8gTm90IHN1cmUgd2hhdCBpdCBkb2VzLCBtYXliZSByZWxhdGVkIHRvIHJvZGFuL25lb25cbiAgaWYgKG5vdGlmaWNhdGlvbi5pc01vZGVNZXNzYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRNb2RlTWVzc2FnZSA9PT0gbnVsbCkge1xuICAgICAgY3VycmVudE1vZGVNZXNzYWdlID0gbm90aWZpY2F0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGN1cnJlbnRNb2RlTWVzc2FnZS50aW1lb3V0SUQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgdG9wIG5vdGlmaWNhdGlvbiBpZiBleGNlZWRzIG1heG1pbXVtXG4gIG5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICBpZiAobm90aWZpY2F0aW9ucy5sZW5ndGggPiBOVU1CRVJfVE9fRElTUExBWSkge1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gbm90aWZpY2F0aW9ucy5zaGlmdCgpO1xuICAgIGNsZWFyTm90aWZpY2F0aW9uKHRvUmVtb3ZlLmdldElkKCkpO1xuICB9XG4gIGNvbnN0IG5vdGlmaWNhdGlvbkNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWNvbnRlbnQnKTtcbiAgY29uc3QgbmV3Tm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld05vdGlmaWNhdGlvbi5jbGFzc0xpc3QuYWRkKCduZW9uLW5vdGlmaWNhdGlvbicpO1xuICBuZXdOb3RpZmljYXRpb24uY2xhc3NMaXN0LmFkZChgbmVvbi1ub3RpZmljYXRpb24tJHtub3RpZmljYXRpb24udHlwZX1gKTtcbiAgbmV3Tm90aWZpY2F0aW9uLmlkID0gbm90aWZpY2F0aW9uLmdldElkKCk7XG4gIG5ld05vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSBub3RpZmljYXRpb24ubWVzc2FnZTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5hcHBlbmQobmV3Tm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIG5vdGlmaWNhdGlvbi5kaXNwbGF5KCk7XG59XG5cbi8qKlxuICogU3RhcnQgZGlzcGxheWluZyBub3RpZmljYXRpb25zLiBDYWxsZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gc3RhcnROb3RpZmljYXRpb24gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gIGRpc3BsYXlOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uLnNldFRpbWVvdXRJZChcbiAgICB3aW5kb3cuc2V0VGltZW91dChjbGVhck5vdGlmaWNhdGlvbiwgVElNRU9VVCwgbm90aWZpY2F0aW9uLmdldElkKCkpXG4gICk7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKG5vdGlmaWNhdGlvbi5nZXRJZCgpKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQobm90aWZpY2F0aW9uLnRpbWVvdXRJRCk7XG4gICAgICBjbGVhck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZ2V0SWQoKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQWRkIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBxdWV1ZS5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlTm90aWZpY2F0aW9uIChub3RpZmljYXRpb25Db250ZW50OiBzdHJpbmcsIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcsIGxvZ0luZm86IHN0cmluZyA9IG51bGwpOiB2b2lkIHtcbiAgY29uc3Qgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Db250ZW50LCB0eXBlLCBsb2dJbmZvKTtcblxuICBpZiAobm90aWZpY2F0aW9uLnR5cGUgPT0gJ2Vycm9yJyB8fCBub3RpZmljYXRpb24udHlwZSA9PSAnd2FybmluZycpIHtcbiAgICByZWNvcmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgfVxuXG4gIHN0YXJ0Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgcXVldWVOb3RpZmljYXRpb24gfTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBhcmdzQXJyYXk7XG5cbmZ1bmN0aW9uIGFyZ3NBcnJheShmdW4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgdmFyIGkgPSAtMTtcbiAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW4uY2FsbCh0aGlzLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bi5jYWxsKHRoaXMsIFtdKTtcbiAgICB9XG4gIH07XG59IiwibW9kdWxlLmV4cG9ydHMgPSBkMzsiLCIvKipcbiAqIEhUTUwgZm9yIGVhY2ggaW5zZXJ0IHRhYiAobmV1bWUsIGdyb3VwaW5nLCBjbGVmLCBzeXN0ZW0sIGFuZCBkaXZpc2lvbikuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRUYWJIdG1sOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBwcmltaXRpdmVUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInB1bmN0dW1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicHVuY3R1bVwiIHRpdGxlPVwicHVuY3R1bVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcHVuY3R1bS5wbmdcIiBjbGFzcz1cImltYWdlXCIvPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidmlyZ2FcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidmlyZ2FcIiB0aXRsZT1cInZpcmdhXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy92aXJnYS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ2aXJnYVJldmVyc2VkXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIlJldmVyc2VkIFZpcmdhXCIgdGl0bGU9XCJSZXZlcnNlZCBWaXJnYVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdmlyZ2FfcmV2ZXJzZWQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlhbW9uZFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJpbmNsaW5hdHVtXCIgdGl0bGU9XCJpbmNsaW5hdHVtXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9kaWFtb25kLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImN1c3Rvc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjdXN0b3NcIiB0aXRsZT1cImN1c3Rvc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY3VzdG9zLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNDbGVmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkMgQ2xlZlwiIHRpdGxlPVwiIEMgQ2xlZlwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY0NsZWYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZkNsZWZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRiBDbGVmXCIgdGl0bGU9XCJGIENsZWZcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ZDbGVmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImxpcXVlc2NlbnRBXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkxpcXVlc2NlbnQgQVwiIHRpdGxlPVwiTGlxdWVzY2VudCBBXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9saXF1ZXNjZW50QS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJsaXF1ZXNjZW50Q1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJMaXF1ZXNjZW50IENcIiB0aXRsZT1cIkxpcXVlc2NlbnQgQ1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbGlxdWVzY2VudEMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZmxhdFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJGbGF0XCIgdGl0bGU9XCJGbGF0XCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZEZsYXQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibmF0dXJhbFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJOYXR1cmFsXCIgdGl0bGU9XCJOYXR1cmFsXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZE5hdHVyYWwucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGl2TGluZU1heGltYVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJEaXZMaW5lIE1heGltYVwiIHRpdGxlPVwiRGl2TGluZSBNYXhpbWFcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2RpdmlzaW8ucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+YCxcbiAgZ3JvdXBpbmdUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInBlc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwZXNcIiB0aXRsZT1cInBlc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcGVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaXZpc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjbGl2aXNcIiB0aXRsZT1cImNsaXZpc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpdmlzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNjYW5kaWN1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJzY2FuZGljdXNcIiB0aXRsZT1cInNjYW5kaWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc2NhbmRpY3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaW1hY3VzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cImNsaW1hY3VzXCIgdGl0bGU9XCJjbGltYWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpbWFjdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG9yY3VsdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidG9jdWx1c1wiIHRpdGxlPVwidG9jdWx1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdG9yY3VsdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicG9ycmVjdHVzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInBvcnJlY3R1c1wiIHRpdGxlPVwicG9ycmVjdHVzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wb3JyZWN0dXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicHJlc3N1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwcmVzc3VzXCIgdGl0bGU9XCJwcmVzc3VzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wcmVzc3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPmAsXG4gIHN5c3RlbVRhYjogYDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3RhZmZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIGxvbmdlbFwiIGFyaWEtbGFiZWw9XCJzeXN0ZW1cIiB0aXRsZT1cInN5c3RlbVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc3RhZmYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPkNsaWNrIHVwcGVyIGxlZnQgYW5kIGxvd2VyIHJpZ2h0IGNvcm5lcnMgb2YgbmV3IHN0YWZmLjwvcD5gLFxuICAvLyBkaXZpc2lvblRhYjogXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nc21hbGxEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9zbWFsbGRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyAgICAgXCI8YnV0dG9uIGlkPSdtaW5vckRpdicgY2xhc3M9J3NpZGUtcGFuZWwtYnRuIGluc2VydGVsIHRhbGxlbCc+PGltZyBzcmM9J1wiICsgX19BU1NFVF9QUkVGSVhfXyArICdhc3NldHMvaW1nL21pbm9yZGl2LnBuZ1wiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyAgICAgXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nbWFqb3JEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9tYWpvcmRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J2ZpbmFsRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvZmluYWxkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCJcbn07XG5cbi8qKlxuICogU3RydWN0dXJlIG9mIGluc2VydCBwYW5lbCB3aXRoIGJhc2ljIGdyb3VwaW5nIHRhYnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRDb250cm9sc1BhbmVsID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJpbnNlcnRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlXCI+SU5TRVJUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUluc2VydFwiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblx0PGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwicHJpbWl0aXZlVGFiXCIgY2xhc3M9XCJpbnNlcnRUYWJcIj5QcmltaXRpdmUgRWxlbWVudHM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJncm91cGluZ1RhYlwiIGNsYXNzPVwiaW5zZXJ0VGFiXCI+R3JvdXBpbmc8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJzeXN0ZW1UYWJcIiBjbGFzcz1cImluc2VydFRhYlwiPlN5c3RlbTwvYT5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRfZGF0YVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGVkaXQgcGFuZWwgd2l0aCBidXR0b25zLlxuICovXG5leHBvcnQgY29uc3QgZWRpdENvbnRyb2xzUGFuZWwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiBpZD1cImVkaXRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlIGZvY3VzZWRcIj5FRElUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUVkaXRcIiB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImVkaXRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VsZWN0aW9uLW1vZGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXN1Yi10aXRsZVwiPlNlbGVjdGlvbiBNb2RlOjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWxlY3Rpb24tbW9kZS1idG5zLWNvbnRhaW5lclwiICBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5U3lsbGFibGVcIj5TeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlOZXVtZVwiPk5ldW1lPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeU5jXCI+TmV1bWUgQ29tcG9uZW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeVN0YWZmXCI+U3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5TGF5ZXJFbGVtZW50XCI+TGF5ZXIgRWxlbWVudDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cIm1vcmVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImV4dHJhRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgICAgICogVGhlIGV4dHJhRWRpdCBwYW5lbCBpcyBhZGRlZCBmb3IgZWRpdCBvcHRpb25zIHRoYXQgaGF2ZSBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAqIExpa2UgdGhlIE5ldW1lIGFuZCBDbGVmIG1lbnVzXG4gICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIG1vcmVFZGl0IG1lbnUgbmVlZHMgdG8gaGF2ZSBvdmVyZmxvdyBmb3IgY2FzZXMgd2hlcmUgaXQgaGFzIGxvdHMgb2YgYnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICAqIEJ1dCBvdmVyZmxvdyBydWlucyBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtY29udGVudC1zdWJzZWN0aW9uIGhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibmV1bWVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidW5kb1JlZG9fY29udHJvbHNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuYyBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5jQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBIZWFkIFNoYXBlOjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkhlYWQgU2hhcGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlB1bmN0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5QdW5jdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVmlyZ2FcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5WaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlZpcmdhUmV2ZXJzZWRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5SZXZlcnNlZCBWaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkluY2xpbmF0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5JbmNsaW5hdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiTGlxdWVzY2VudEFudGljbG9ja3dpc2VcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5MaXF1ZXNjZW50IEE8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJMaXF1ZXNjZW50Q2xvY2t3aXNlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TGlxdWVzY2VudCBDPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYmFzaWMgbmV1bWUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInNwbGl0LW5ldW1lXCI+U3BsaXQgTmV1bWVzPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuZXVtZSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5ldW1lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkdyb3VwaW5nIE9wdGlvbnM6PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+R3JvdXBpbmdzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50IHNjcm9sbGFibGUtZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaW1hY3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+Q2xpbWFjdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGltYWN1c1Jlc3VwaW51c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaW1hY3VzIFJlc3VwaW51czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaXZpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaXZpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBlczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1N1YnB1bmN0aXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5QZXMgU3VicHVuY3RpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UG9ycmVjdHVzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQcmVzc3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UHJlc3N1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+U2NhbmRpY3VzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJUb3JjdWx1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlRvcmN1bHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVG9yY3VsdXNSZXN1cGludXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Ub3JjdWx1cyBSZXN1cGludXM8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ1bmdyb3VwTmNzXCI+VW5ncm91cDwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudSB3aGVuIHNlbGVjdGluZyBieSBzeWxsYWJsZVxuICogU2FtZSBhcyBhYm92ZSBleGNlcHQgaW5jbHVkZXMgcmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmZcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyA9IGA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgY3VzdG9zIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9zQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBsYXllciBlbGVtZW50IChvdXRzaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiaW5zZXJ0VG9TeWxsYWJsZVwiPkluc2VydCB0byBuZWFyZXN0IHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgbGF5ZXIgZWxlbWVudCAoaW5zaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudEluQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtb3ZlT3V0c2lkZVN5bGxhYmxlXCI+TW92ZSBvdXRzaWRlIHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYWNjaWQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBhY2NpZEFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgQWNjaWRlbnRhbDo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlNoYXBlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb0ZsYXRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GbGF0PC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9OYXR1cmFsXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TmF0dXJhbDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIHN0YWZmIHNwbGl0IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3Qgc3RhZmZTcGxpdEFjdGlvbkNvbnRlbnRzID0gYDxkaXY+U3BsaXQgU3lzdGVtOjwvZGl2PlxuICAgIDxkaXYgaWQ9XCJzcGxpdC1zeXN0ZW0tYnRucy1jb250YWluZXJcIiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNwbGl0LXN5c3RlbVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5TcGxpdDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVzZXQtcm90YXRlXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPlJlc2V0IFJvdGF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgc3RhZmYgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFmZk1lcmdlQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPk1lcmdlIFN5c3RlbXM6PC9sYWJlbD5cbiAgICA8ZGl2IGlkPVwibWVyZ2Utc3lzdGVtLWJ0bnMtY29udGFpbmVyXCIgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtZXJnZS1zeXN0ZW1zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPk1lcmdlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBhY2NpZCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbHVtbkFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jb250YWluZXJcIj5cbiAgICAgICAgRWRpdCBDb2x1bW4gSW5mb3JtYXRpb246XG4gICAgICAgIDxkaXYgaWQ9XCJjb2wtc3RlcHBlci1idG5zLWNvbnRhaW5lclwiIGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1kZWNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPuKAkzwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjb2wtaW5wdXRcIiBjbGFzcz1cInNpZGUtcGFuZWwtc3RlcHBlci1pbnB1dFwiIHZhbHVlPVwiMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1pbmNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPis8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtY29uZmlybVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2lkZS1wYW5lbC1jb25maXJtLWJ0blwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+Q29uZmlybTwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBpZD1cImNvbC13YXJuaW5nXCIgY2xhc3M9XCJzaWRlLXBhbmVsLXdhcm5pbmdcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBjbGVmIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY2xlZkFjdGlvbkNvbnRlbnRzID0gYFxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIiBvdmVyZmxvdz1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EaXNwbGFjZSBPY3RhdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiaW5jcmVtZW50LW9jdGF2ZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPisxIE9jdGF2ZTwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJkZWNyZW1lbnQtb2N0YXZlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+LTEgT2N0YXZlPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCIgb3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2hhbmdlIENsZWYgU2hhcGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiQ0NsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5DIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiRkNsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgYDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBkaXZMaW5lIHR5cGUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkaXZMaW5lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBEaXZMaW5lOjwvbGFiZWw+XG48ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8c3Bhbj5TaGFwZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9DYWVzdXJhXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+Q2Flc3VyYTwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9GaW5hbGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RmluYWxpczwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NaW5pbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NaW5pbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWFpb3JcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYWlvcjwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NYXhpbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYXhpbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvVmlyZ3VsYVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlZpcmd1bGE8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBiYm94IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgYmJveEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWF0Y2hIZWlnaHRcIj5NYXRjaCBIZWlnaHQgZm9yIEVudGlyZSBSb3c8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIEhUTUwgZm9yIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZ3JvdXBpbmdNZW51ID0ge1xuICBuYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gbW9yZS1lZGl0LWJ0blwiIGlkPVwiZ3JvdXBOY3NcIj5Hcm91cCBOZXVtZSBDb21wb25lbnRzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBuZXVtZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImdyb3VwTmV1bWVzXCI+R3JvdXAgTmV1bWVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBzeWw6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtZXJnZVN5bHNcIj5NZXJnZSBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cdFx0PC9kaXY+YCxcbiAgbGlnYXR1cmVOYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJncm91cE5jc1wiPkdyb3VwIE5ldW1lIENvbXBvbmVudHM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gLFxuICBsaWdhdHVyZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gLFxuICBzcGxpdFN5bGxhYmxlOiBgPGRpdiBjbGFzcz1cIm1vcmUtZWRpdC1idG4gcGFuZWwtYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saW5rXCI+VG9nZ2xlIExpbmtlZCBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmAsXG59O1xuXG4vKiBCR0lOTklORyBPRiBNT0RBTCBXSU5ET1cgQ09OVEVOVCBTRUNUSU9OICovXG5cbi8qKlxuICogSFRNTCBmb3IgRWRpdCBTeWxsYWJsZSBUZXh0IG1vZGFsIHdpbmRvd1xuICovXG5leHBvcnQgY29uc3QgZWRpdFRleHRNb2RhbCA9IGA8ZGl2IGNsYXNzPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudFwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1lZGl0LXRleHRcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1pbnB1dFwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWxhYmVsXCI+RW50ZXIgU3lsbGFibGUgVGV4dDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxuICAgICAgICA8ZGl2IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWJ0bnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbFwiPkNhbmNlbDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibmVvbi1tb2RhbC13aW5kb3ctYnRuXCIgaWQ9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtc2F2ZVwiPlNhdmU8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBIVE1MIGZvciBIb3RrZXlzIG1vZGFsIHdpbmRvd1xuICovXG5leHBvcnQgY29uc3QgaG90a2V5c01vZGFsID0gYFxuICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50XCIgaWQ9XCJuZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXNcIj5cbiAgICAgICAgPCEtLSBcIkRpc3BsYXlcIiBob3RrZXlzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LXN1YmNhdGVnb3J5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS10aXRsZVwiPkRpc3BsYXk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlNoaWZ0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+KzwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5ab29tIEluPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlNoaWZ0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5ab29tIE91dDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj4wPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlpvb20gUmVzZXQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+aDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5IaWRlIEdseXBoPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlNoaWZ0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+VDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5TY3JvbGwgVG8gU3lsbGFibGUgVGV4dDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gXCJFZGl0XCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5FZGl0PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5DdHJsPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ejwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pm9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj7ijJg8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj56PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlVuZG88L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+Q3RybDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlNoaWZ0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ejwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pm9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj7ijJg8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+UmVkbzwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5xL3cvZS9yL3QveTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgSGlnaGxpZ2h0IGJ5IFN0YWZmL1N5bGxhYmxlL05ldW1lL0xheWVyRWxlbWVudC9TZWxlY3Rpb24vT2ZmXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPjEvMi8zLzQvNS82PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICBTZWxlY3QgYnkgU3lsbGFibGUvTmV1bWUvTmV1bWUgQ29tcG9uZW50L1N0YWZmL0xheWVyIEVsZW1lbnQvQkJveFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPk51bWJlcjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgQmVnaW4gSW5zZXJ0IGZvciB0aGUgPGk+bnRoPC9pPiBPcHRpb24gaW4gdGhlIFNlbGVjdGVkIFRhYlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5nPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICBHcm91cC9Vbmdyb3VwIFNlbGVjdGVkIEVsZW1lbnQocylcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFwiT3RoZXJcIiBob3RrZXlzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LXN1YmNhdGVnb3J5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS10aXRsZVwiPk90aGVyPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5zPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlNhdmUgRmlsZTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5Fc2M8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+UmV0dXJuIHRvIEVkaXQgTW9kZTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbmV4cG9ydCBjb25zdCBzeWxsYWJsZUFjdGlvbnNDb250ZW50ID0gYFxuICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWVyZ2VTeWxzXCI+TWVyZ2UgU3lsbGFibGVzPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ1bmdyb3VwTmV1bWVzXCI+VW5ncm91cDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gIDwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IGVycm9yTG9nc1BhbmVsQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiBpZD1cImVycm9yTG9nSGVhZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZy10aXRsZVwiPkVycm9yIExvZzwvZGl2PlxuICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUVycm9yTG9nXCIgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtY29udGVudHNcIiBpZD1cImVycm9yTG9nQ29udGVudHNcIiBzdHlsZT1cIm92ZXJmbG93OiBzY3JvbGw7IHBhZGRpbmc6IDAuNWVtIDAuNzVlbTsgbWF4LWhlaWdodDogMzAwcHg7XCI+PGRpdj5gO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbnZhciBieXRlVG9IZXggPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFycikge1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgdmFyIHV1aWQgPSAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwiZXhwb3J0IGRlZmF1bHQgL14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pOyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsIi8qKiBAbW9kdWxlIERpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMgKi9cblxuaW1wb3J0ICogYXMgQ29sb3IgZnJvbSAnLi4vdXRpbHMvQ29sb3InO1xuaW1wb3J0IFpvb21IYW5kbGVyIGZyb20gJy4uL1NpbmdsZVZpZXcvWm9vbSc7XG5pbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncywgc2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcblxubGV0IGxhc3RHbHlwaE9wYWNpdHk6IG51bWJlciwgbGFzdEltYWdlT3BhY2l0eTogbnVtYmVyLCBsYXN0Q2lyY2xlU2l6ZTogbnVtYmVyO1xuXG4vKipcbiAqIFNldCB6b29tIGNvbnRyb2wgbGlzdGVuZXIgZm9yIGJ1dHRvbiBhbmQgc2xpZGVyXG4gKiBAcGFyYW0gem9vbUhhbmRsZXIgLSBBIFtbWm9vbUhhbmRsZXJdXSBpcyBvbmx5IG5lY2Vzc2FyeSBpbiBTaW5nbGUgUGFnZSBtb2RlIGFzIGRpdmEuanMgaGFuZGxlcyB6b29taW5nIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFpvb21Db250cm9scyAoem9vbUhhbmRsZXI/OiBab29tSGFuZGxlcik6IHZvaWQge1xuICBpZiAoem9vbUhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB6b29tU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21TbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCB6b29tT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21PdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IHpvb20gfSA9IGdldFNldHRpbmdzKCk7XG4gIHpvb21TbGlkZXIudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21IYW5kbGVyLnpvb21Ubyh6b29tIC8gMTAwLjApO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtem9vbScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHpvb21PdXRwdXQudmFsdWUgPSAnMTAwJztcbiAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgem9vbUhhbmRsZXIucmVzZXRab29tQW5kUGFuKCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXQtem9vbS1lYXN5LWVkaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gJzE4MCc7XG4gICAgem9vbVNsaWRlci52YWx1ZSA9ICcxODAnO1xuICAgIHpvb21IYW5kbGVyLnpvb21UbygxODAvMTAwKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gaW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gem9vbVNsaWRlci52YWx1ZTtcbiAgICB6b29tSGFuZGxlci56b29tVG8oTnVtYmVyKHpvb21PdXRwdXQudmFsdWUpIC8gMTAwLjApO1xuICB9XG5cbiAgLy8gem9vbVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuZGlzYWJsZWQgPSBmYWxzZTtcblxuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZ0KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFpvb20gPSBwYXJzZUludCh6b29tT3V0cHV0LnZhbHVlKTtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2dC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IFxuICAgIGV2dC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldnQua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnKycpIHsgLy8gaW5jcmVhc2Ugem9vbSBieSAyMFxuICAgICAgY29uc3QgbmV3Wm9vbSA9IE1hdGgubWluKGN1cnJlbnRab29tICsgMjAsIHBhcnNlSW50KHpvb21TbGlkZXIuZ2V0QXR0cmlidXRlKCdtYXgnKSkpO1xuICAgICAgem9vbUhhbmRsZXIuem9vbVRvKG5ld1pvb20gLyAxMDAuMCk7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICdfJykgeyAvLyBkZWNyZWFzZSB6b29tIGJ5IDIwXG4gICAgICBjb25zdCBuZXdab29tID0gTWF0aC5tYXgoY3VycmVudFpvb20gLSAyMCwgcGFyc2VJbnQoem9vbVNsaWRlci5nZXRBdHRyaWJ1dGUoJ21pbicpKSk7XG4gICAgICB6b29tSGFuZGxlci56b29tVG8obmV3Wm9vbSAvIDEwMC4wKTtcbiAgICAgIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcobmV3Wm9vbSk7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJzAnKSB7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tSGFuZGxlci5yZXNldFpvb21BbmRQYW4oKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBNRUkgb3BhY2l0eSB0byB2YWx1ZSBmcm9tIHRoZSBzbGlkZXIuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciAobWVpQ2xhc3NOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuICBjb25zdCBvcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wYWNpdHlTbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBvcGFjaXR5T3V0cHV0LnZhbHVlO1xuICAvLyB0aGlzIGlzIHdoZXJlIHdlIGxvYWQgZ2x5cGggb3BhY2l0eSBmcm9tIGxvY2FsU3RvcmFnZSBvbiBwYWdlLWxvYWRcbiAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdG9nZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlR2x5cGhJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWdseXBoLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSA9PT0gMCkge1xuICAgIGhpZGVHbHlwaEltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zaG93LWljb24uc3ZnYCk7XG4gICAgaGlkZUdseXBoSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdTaG93IGdseXBoJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgaGlkZUdseXBoSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2hpZGUtaWNvbi5zdmdgKTtcbiAgICBoaWRlR2x5cGhJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0hpZGUgZ2x5cGgnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgKChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIG1laUNsYXNzTmFtZSkpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KS5mb3JFYWNoKGcgPT4ge1xuICAgICAgZy5zdHlsZS5vcGFjaXR5ID0gKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMC4wKS50b1N0cmluZygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gcHJvcGVybHkgc2V0IG9wYWNpdHkgdG8gcGFnZXMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCByZW5kZXJlZCBNRUkgb3BhY2l0eSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5mdW5jdGlvbiBzZXRHbHlwaE9wYWNpdHlDb250cm9scyAobWVpQ2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5U2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgb3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5T3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyBnbHlwaE9wYWNpdHkgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RHbHlwaE9wYWNpdHkgPSBnbHlwaE9wYWNpdHk7XG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcoZ2x5cGhPcGFjaXR5KTtcbiAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhnbHlwaE9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGlucHV0Q2hhbmdlT3BhY2l0eSAoKTogdm9pZCB7XG4gICAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IG9wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEdseXBoT3BhY2l0eSA9IE51bWJlcihvcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBzZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyKG1laUNsYXNzTmFtZSk7XG4gIH1cblxuICBjb25zdCB0b2dnbGVPcGFjaXR5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1nbHlwaC1vcGFjaXR5Jyk7XG5cbiAgaWYgKGdseXBoT3BhY2l0eSA9PSAxMDApIHtcbiAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlT3BhY2l0eUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cbiAgICBsZXQgbmV3T3BhY2l0eTtcbiAgICBpZiAodG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtaWNvbicpKSB7XG4gICAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUtaWNvbicpO1xuICAgICAgbmV3T3BhY2l0eSA9IDA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cblxuICAgIC8vIERlZmluaXRpb24gc2NhbGUgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB3aGF0IGlzIGdlbmVyYXRlZCBieSB2ZXJvdmlvXG4gICAgXG4gICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgbWVpQ2xhc3NOYW1lKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PikuZm9yRWFjaChnID0+IHtcbiAgICAgIGcuc3R5bGUub3BhY2l0eSA9IG5ld09wYWNpdHkudG9TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGxhc3RHbHlwaE9wYWNpdHkgPSBOdW1iZXIob3BhY2l0eVNsaWRlci52YWx1ZSk7XG4gICAgb3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBvcGFjaXR5T3V0cHV0LnZhbHVlID0gU3RyaW5nKE1hdGgucm91bmQobmV3T3BhY2l0eSAqIDEwMCkpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IG5ld09wYWNpdHkgKiAxMDAgfSk7XG5cbiAgICBpbnB1dENoYW5nZU9wYWNpdHkoKTtcbiAgfSk7XG5cbiAgb3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlT3BhY2l0eSk7XG4gIG9wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaW5wdXRDaGFuZ2VPcGFjaXR5KTtcblxuICBvcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBTZXQgYmFja2dyb3VuZCBpbWFnZSBvcGFjaXR5IGJ1dHRvbiBhbmQgc2xpZGVyIGxpc3RlbmVycy5cbiAqIEBwYXJhbSBiYWNrZ3JvdW5kIC0gVGhlIGJhY2tncm91bmQgaW1hZ2Ugc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHNldEJnT3BhY2l0eUNvbnRyb2xzIChiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnT3BhY2l0eVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGJnT3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ09wYWNpdHlPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IGltYWdlT3BhY2l0eSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdEltYWdlT3BhY2l0eSA9IGltYWdlT3BhY2l0eTtcbiAgYmdPcGFjaXR5U2xpZGVyLnZhbHVlID0gU3RyaW5nKGltYWdlT3BhY2l0eSk7XG4gIGJnT3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGJnSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBiZ09wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIHNldEJnT3BhY2l0eUZyb21TbGlkZXIoYmFja2dyb3VuZCk7XG4gIH1cblxuXG4gIGNvbnN0IHRvZ2dsZUJnT3BhY2l0eUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtYmctb3BhY2l0eScpO1xuXG4gIGlmIChpbWFnZU9wYWNpdHkgPT0gMTAwKSB7XG4gICAgdG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlQmdPcGFjaXR5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgbGV0IG5ld09wYWNpdHk7XG5cbiAgICBpZiAodG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5jb250YWlucygnaGlkZS1pY29uJykpIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cbiAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShiYWNrZ3JvdW5kKVswXSBhcyBIVE1MRWxlbWVudClcbiAgICAgIC5zdHlsZS5vcGFjaXR5ID0gbmV3T3BhY2l0eS50b1N0cmluZygpO1xuXG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIGJnT3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoTWF0aC5yb3VuZChuZXdPcGFjaXR5ICogMTAwKSk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IGltYWdlT3BhY2l0eTogbmV3T3BhY2l0eSAqIDEwMCB9KTtcbiAgICBiZ0lucHV0Q2hhbmdlSGFuZGxlcigpO1xuICB9KTtcblxuICBiZ09wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG4gIGJnT3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgYmdPcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEJnT3BhY2l0eUZyb21TbGlkZXIgKGJhY2tncm91bmQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5T3V0cHV0OiBIVE1MT3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiZ09wYWNpdHlPdXRwdXQnKTtcbiAgXG4gIHNldFNldHRpbmdzKHsgaW1hZ2VPcGFjaXR5OiBOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdGlnZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlQmdJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWJnLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihiZ09wYWNpdHlPdXRwdXQudmFsdWUpID09PSAwKSB7XG4gICAgaGlkZUJnSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3Nob3ctaWNvbi5zdmdgKTtcbiAgICBoaWRlQmdJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ1Nob3cgYmFja2dyb3VuZCBpbWFnZScpO1xuICB9XG4gIGVsc2Uge1xuICAgIGhpZGVCZ0ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9oaWRlLWljb24uc3ZnYCk7XG4gICAgaGlkZUJnSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdIaWRlIGJhY2tncm91bmQgaW1hZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IGJnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2JhY2tncm91bmR9YCk7XG4gIGlmIChiZykgYmcuc3R5bGUub3BhY2l0eSA9IFN0cmluZyhOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMCk7XG59XG5cbi8qKlxuICogU2V0IGJib3ggYWRqdXN0bWVudCBjaXJjbGUgc2l6ZSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDaXJjbGVTaXplQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBjaXJjbGVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2lyY2xlU2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgY2lyY2xlT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NpcmNsZU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuXG4gIGNvbnN0IHsgY2lyY2xlU2l6ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdENpcmNsZVNpemUgPSBjaXJjbGVTaXplO1xuICBjaXJjbGVTbGlkZXIudmFsdWUgPSBTdHJpbmcoY2lyY2xlU2l6ZSk7XG4gIGNpcmNsZU91dHB1dC52YWx1ZSA9IFN0cmluZyhjaXJjbGVTaXplKTtcblxuICBmdW5jdGlvbiBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBjaXJjbGVPdXRwdXQudmFsdWUgPSBjaXJjbGVTbGlkZXIudmFsdWU7XG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoY2lyY2xlU2xpZGVyLnZhbHVlKTtcbiAgICBzZXRTZXR0aW5ncyh7IGNpcmNsZVNpemU6IE51bWJlcihsYXN0Q2lyY2xlU2l6ZSkgfSk7XG4gICAgY29uc3QgcmVzaXplUG9pbnRzID0gZDMuc2VsZWN0QWxsKCcucmVzaXplUG9pbnQnKTtcbiAgICBpZiAoIXJlc2l6ZVBvaW50cy5lbXB0eSgpKSB7XG4gICAgICByZXNpemVQb2ludHMuYXR0cigncicsIGxhc3RDaXJjbGVTaXplKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1jaXJjbGUtc2l6ZScpO1xuICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0U2l6ZSA9IDI1OyBcbiAgICAvLyBpZiBoYXMgcmVzaXplUG9pbnRzIGRpc3BsYXllZFxuICAgIGNvbnN0IHJlc2l6ZVBvaW50cyA9IGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50Jyk7XG4gICAgaWYgKCFyZXNpemVQb2ludHMuZW1wdHkoKSkge1xuICAgICAgcmVzaXplUG9pbnRzLmF0dHIoJ3InLCBkZWZhdWx0U2l6ZSk7XG4gICAgfVxuXG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoZGVmYXVsdFNpemUpO1xuICAgIGNpcmNsZVNsaWRlci52YWx1ZSA9IFN0cmluZyhkZWZhdWx0U2l6ZSk7XG4gICAgY2lyY2xlT3V0cHV0LnZhbHVlID0gU3RyaW5nKGRlZmF1bHRTaXplKTtcblxuICAgIHNldFNldHRpbmdzKHsgY2lyY2xlU2l6ZTogTnVtYmVyKGRlZmF1bHRTaXplKSB9KTtcbiAgICBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyKCk7XG4gIH0pO1xuXG4gIGNpcmNsZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIpO1xuICBjaXJjbGVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgY2lyY2xlU2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cbi8qKlxuICogVXBkYXRlIGhpZ2hsaWdodCBkcm9wZG93biBvcHRpb24gKyBkaXNwbGF5XG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRPcHRpb24gKGdyb3VwOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhpZ2hsaWdodC0ke2dyb3VwfWApO1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcbiAgY29uc3QgaGlnaGxpZ2h0VHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpO1xuXG4gIC8vIHNhdmUgaGlnaGxpZ2h0IG9wdGlvbiB0byBsb2NhbFN0b3JhZ2VcbiAgc2V0U2V0dGluZ3MoeyBoaWdobGlnaHRNb2RlOiBncm91cCB9KTtcblxuICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmZvckVhY2goZWxlbSA9PiB7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgfSk7XG5cbiAgaWYgKGdyb3VwID09PSAnbm9uZScpIHtcbiAgICBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50ID0gJ1xceEEwLSBPZmYnO1xuICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIG9wdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcblxuICAvLyBUZXh0IGNvbnRlbnQgaXMgdGhlIGdyb3VwaW5nIHR5cGUgY2FwaXRhbGl6ZWRcbiAgaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudCA9IGBcXHhBMC0gJHtncm91cFswXS50b1VwcGVyQ2FzZSgpICsgZ3JvdXAuc2xpY2UoMSl9YDtcbiAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXApO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHQgbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWdobGlnaHRUeXBlICgpOiBHcm91cGluZ1R5cGUge1xuICBjb25zdCBoaWdobGlnaHRUeXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJyk7XG4gIHJldHVybiBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCkgYXMgR3JvdXBpbmdUeXBlO1xufVxuXG4vKipcbiAqIFNldCBjbGljayBsaXN0ZW5lciBmb3IgZWFjaCBoaWdobGlnaHQgZHJvcGRvd24gb3B0aW9uXG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0T3B0aW9uIChncm91cDogR3JvdXBpbmdUeXBlKTogdm9pZCB7XG4gIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBoaWdobGlnaHQtJHtncm91cH1gKTtcbiAgb3B0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbihncm91cCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENsaWNrYXdheSBsaXN0ZW5lciBmb3IgdGhlIGhpZ2hsaWdodCBkcm9wZG93bi5cbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q2xpY2thd2F5ICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbn1cblxuLyoqXG4gKiBTZXQgbGlzdGVuZXIgb24gc3RhZmYgaGlnaGxpZ2h0aW5nIGNoZWNrYm94LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0Q29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWJ1dHRvbicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcm9wZG93bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBpZiAoZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG5cbiAgICAgIHNldEhpZ2hsaWdodE9wdGlvbignY29sdW1uJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N0YWZmJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N5bGxhYmxlJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ2xheWVyRWxlbWVudCcpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdub25lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICAqIFNldCBsaXN0ZW5lciBvbiBrZXkgc2hvcnRjdXRzIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiBoaWdobGlnaHRzXG4gICogXG4gICogVGhlIGN1cnJlbnQgcGxhbiBpcyB0byB1c2UgdGhlIGtleXMgcSwgdywgZSwgciwgdCwgYW5kIHlcbiAgKi9cbmZ1bmN0aW9uIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIC8vIFByZXZlbnQgY21kL2N0cmwrciBmcm9tIGNoYW5naW5nIGhpZ2hsaWdodCBvcHRpb25cbiAgICBpZiAoZXZ0Lm1ldGFLZXkpIHJldHVybjtcblxuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAncSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc3RhZmYnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3JzpcbiAgICAgICAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKCdzeWxsYWJsZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2UnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncic6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbGF5ZXJFbGVtZW50Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndCc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc2VsZWN0aW9uJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbm9uZScpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0U2VsZWN0aW9uQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBoaWdobGlnaHRTZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LXNlbGVjdGlvbicpO1xuICBoaWdobGlnaHRTZWxlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1kcm9wZG93bicpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgICBoaWdobGlnaHRTZWxlY3Rpb24uY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJykudGV4dENvbnRlbnQgPSAnIC0gU2VsZWN0aW9uJztcbiAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnc2VsZWN0aW9uJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBoaWdobGlnaHQgZm9yIGRpZmZlcmVudCB0eXBlcyBiYXNlZCBvbiB0aGUgJ2hpZ2hsaWdodC1zZWxlY3RlZCcgY2xhc3MgaW4gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUhpZ2hsaWdodCAoKTogdm9pZCB7XG4gIGxldCBoaWdobGlnaHRJZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGhpZ2hsaWdodElkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmlkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGlnaGxpZ2h0SWQgPSAnJztcbiAgfVxuICBzd2l0Y2ggKGhpZ2hsaWdodElkKSB7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LWNvbHVtbic6XG4gICAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnY29sdW1uJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3RhZmYnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N0YWZmJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3lsbGFibGUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N5bGxhYmxlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbmV1bWUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ25ldW1lJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbGF5ZXJFbGVtZW50JzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdsYXllckVsZW1lbnQnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hpZ2hsaWdodC1zZWxlY3Rpb24nOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3NlbGVjdGlvbicpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBsaXN0ZW5lciBvbiBidXJnZXIgbWVudSBmb3Igc21hbGxlciBzY3JlZW5zLlxuICovXG5mdW5jdGlvbiBzZXRCdXJnZXJDb250cm9scyAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidXJnZXJNZW51JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1cmdlck1lbnUnKS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2TWVudScpLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuICB9KTtcbn1cblxuLyoqIFxuICogU2V0IGxpc3RlbmVyIGZvciBcIkRpc3BsYXkgQWxsXCIgYnV0dG9uIGluIERpc3BsYXkgcGFuZWwuXG4qL1xuZnVuY3Rpb24gc2V0RGlzcGxheUFsbExpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBzZWxlY3RBbGxCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1hbGwtYnRuJyk7XG4gIHNlbGVjdEFsbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAvLyBhdCB0aGUgbW9tZW50LCBjbGFzc25hbWUgJ3NlbGVjdGVkJyBpcyBvbmx5IHVzZWQgZm9yIHRyYWNraW5nIHB1cnBvc2VzXG4gICAgaWYgKHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcblxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGVja2VkKSBvcHRpb24uY2xpY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcbiAgICAgIFxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb24uY2hlY2tlZCkgb3B0aW9uLmNsaWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKiogXG4gKiBVcGRhdGUgYERpc3BsYXkgQWxsYCBidXR0b24gc3RhdHVzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlBbGxCdG4oKTogdm9pZCB7XG4gIGNvbnN0IGRpc3BsYXlBbGxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1hbGwtYnRuJyk7XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlJbmZvJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUJCb3hlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5QkJveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlUZXh0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUVyckxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5LWVycm9ycycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgLy8gaWYgYWxsIG9wdGlvbnMgYXJlIHNlbGVjdGVkLFxuICAvLyBzZXQgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIHRvIFwiSGlkZSBBbGxcIi5cbiAgaWYgKGRpc3BsYXlJbmZvPy5jaGVja2VkICYmIGRpc3BsYXlCQm94ZXM/LmNoZWNrZWQgJiYgXG4gICAgZGlzcGxheVRleHQ/LmNoZWNrZWQgJiYgZGlzcGxheUVyckxvZz8uY2hlY2tlZCkge1xuICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIGlzIGluIFwiSGlkZSBBbGxcIiBtb2RlLCBzZXQgaXQgdG8gXCJEaXNwbGF5IEFsbFwiIG1vZGVcbiAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0Rpc3BsYXkgQWxsJztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGhpZ2hsaWdodCBzZXR0aW5ncyBmcm9tIGxvY2FsU3RvcmFnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhpZ2hsaWdodFNldHRpbmdzICgpOiB2b2lkIHtcbiAgY29uc3QgeyBoaWdobGlnaHRNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICB1cGRhdGVIaWdobGlnaHRPcHRpb24oaGlnaGxpZ2h0TW9kZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsaXN0ZW5lcnMgYW5kIGNvbnRyb2xzIGZvciBkaXNwbGF5IHBhbmVsLlxuICogQHBhcmFtIHtzdHJpbmd9IG1laUNsYXNzTmFtZSAtIFRoZSBjbGFzcyB1c2VkIHRvIHNpZ25pZml5IHRoZSBNRUkgZWxlbWVudChzKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYWNrZ3JvdW5kIC0gVGhlIGNsYXNzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYmFja2dyb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5Q29udHJvbHMgKG1laUNsYXNzTmFtZTogc3RyaW5nLCBiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0R2x5cGhPcGFjaXR5Q29udHJvbHMobWVpQ2xhc3NOYW1lKTtcbiAgc2V0QmdPcGFjaXR5Q29udHJvbHMoYmFja2dyb3VuZCk7XG4gIHNldEhpZ2hsaWdodENvbnRyb2xzKCk7XG4gIHNldEJ1cmdlckNvbnRyb2xzKCk7XG4gIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzKCk7XG4gIHNldERpc3BsYXlBbGxMaXN0ZW5lcigpO1xuICBsb2FkSGlnaGxpZ2h0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5Q29udGVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUNvbnRlbnRzJyk7XG4gIGNvbnN0IHRvZ2dsZURpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlRGlzcGxheScpO1xuICBjb25zdCBkaXNwbGF5SGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlIZWFkZXInKTtcblxuICBkaXNwbGF5SGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGlmIGRpc3BsYXkgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGRpc3BsYXlDb250ZW50cy5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb3NlZCcpKSB7XG4gICAgICBkaXNwbGF5Q29udGVudHMuY2xhc3NMaXN0LnJlbW92ZSgnY2xvc2VkJyk7XG4gICAgICBkaXNwbGF5Q29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93bmApO1xuICAgIH0gXG4gICAgLy8gaWYgZGlzcGxheSBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdFxuICAgIGVsc2Uge1xuICAgICAgZGlzcGxheUNvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ2Nsb3NlZCcpO1xuICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tc2lkZWApO1xuICAgIH1cbiAgfSk7XG59XG5cbiIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTZXRUZXh0QWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgTW9kYWxXaW5kb3dJbnRlcmZhY2UgfSBmcm9tICcuLi9JbnRlcmZhY2VzJztcbmltcG9ydCB7IGhvdGtleXNNb2RhbCwgZWRpdFRleHRNb2RhbCB9IGZyb20gJy4uL1NxdWFyZUVkaXQvQ29udGVudHMnO1xuaW1wb3J0IHsgbmV3Rm9sZGVySFRNTCwgcmVuYW1lSFRNTCwgdXBsb2FkQXJlYUhUTUwgfSBmcm9tICcuLi9EYXNoYm9hcmQvRGFzaGJvYXJkQ29udGVudCc7XG5pbXBvcnQgRHJhZ0hhbmRsZXIgZnJvbSAnLi9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBzZWxlY3RCQm94LCB1bnNlbGVjdCB9IGZyb20gJy4vU2VsZWN0VG9vbHMnO1xuXG5cbi8qKlxuICogRGVmaW5lcyBtb2RhbCB0eXBlcy5cbiAqIFRvIGNyZWF0ZSBuZXcgbW9kYWwgd2luZG93IHR5cGVzLCBhZGQgZW51bSBvcHRpb24gYW5kIGltcGxlbWVudCBsb2dpYyBpbnNpZGUgTW9kYWwgY2xhc3MuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGFsV2luZG93VmlldyB7XG4gIEVESVRfVEVYVCxcbiAgSE9US0VZUyxcbiAgRVJST1JfTE9HLCAvLyBmb3IgdmFsaWRhdGlvbiBlcnJvcnMgYWdhaW5zdCBNRUkgc2NoZW1hIGFuZCBpbnZhbGlkIGVsZW1lbnQgZXJyb3JzXG4gIERPQ1VNRU5UX1VQTE9BRCxcbiAgTU9WRV9UTyxcbiAgTkVXX0ZPTERFUixcbiAgUkVOQU1FXG59XG5cbmVudW0gTW9kYWxXaW5kb3dTdGF0ZSB7XG4gIE9QRU4sXG4gIENMT1NFRFxufVxuXG5cblxuLyoqXG4gKiBNb2RhbCBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbmQgY29udHJvbCBzdGF0ZS9jb250ZW50IFxuICogb2YgbW9kYWwgd2luZG93cyBpbiBOZW9uLlxuICovXG5leHBvcnQgY2xhc3MgTW9kYWxXaW5kb3cgaW1wbGVtZW50cyBNb2RhbFdpbmRvd0ludGVyZmFjZSB7XG4gIHByaXZhdGUgbW9kYWxXaW5kb3dWaWV3OiBNb2RhbFdpbmRvd1ZpZXc7IC8vIGN1cnJlbnQgbW9kYWwgdHlwZVxuICBwcml2YXRlIG1vZGFsV2luZG93U3RhdGU6IE1vZGFsV2luZG93U3RhdGU7IC8vIG9wZW4gb3IgY2xvc2VkP1xuICBwcml2YXRlIG5lb25WaWV3OiBOZW9uVmlldzsgLy8gbmVvblZpZXcgaW5zdGFuY2UgY29udGV4dFxuXG5cbiAgLyoqXG4gICAqIFNldCBuZW9uVmlldyBpbnN0YW5jZSBjb250ZXh0IGZvciB0aGlzIG1vZGFsIHdpbmRvdyBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG5lb25WaWV3IG5lb25WaWV3IGNvbnRleHQgZm9yIE1vZGFsIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobmVvblZpZXc/OiBOZW9uVmlldykge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLm1vZGFsV2luZG93U3RhdGUgPSBNb2RhbFdpbmRvd1N0YXRlLkNMT1NFRDtcbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYXBwbHkgdG8gYWxsIG1vZGFsIHdpbmRvd3NcbiAgICovXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mb2N1c01vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kYWwgd2luZG93XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItY2xvc2UnKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdycpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lci5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmZvY3VzTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1vZGFsIHZpZXcgb2YgdGhpcyBNb2RhbCBpbnN0YW5jZS5cbiAgICogVXBkYXRlIHRoZSBjb250ZW50IGJhc2VkIG9uIHBhc3NlZCB2aWV3LlxuICAgKiBAcGFyYW0gdmlldyBUeXBlIG9mIG1vZGFsIHRvIG9wZW4gKE1vZGFsVmlldyBlbnVtKVxuICAgKi9cbiAgc2V0TW9kYWxXaW5kb3dWaWV3KHZpZXc6IE1vZGFsV2luZG93VmlldywgY29udGVudD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubW9kYWxXaW5kb3dWaWV3ID0gdmlldztcbiAgICB0aGlzLnNldE1vZGFsV2luZG93Q29udGVudChjb250ZW50KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBtb2RhbCB2aWV3IGFzIGEgc3RyaW5nXG4gICAqL1xuICBnZXRNb2RhbFdpbmRvd1ZpZXcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbFdpbmRvd1ZpZXcudG9TdHJpbmcoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE9wZW4gYSBtb2RlbCB3aW5kb3cgd2l0aCBjb250ZW50IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBNb2RhbFZpZXcuXG4gICAqL1xuICBvcGVuTW9kYWxXaW5kb3coKTogdm9pZCB7XG4gICAgLy8gbWFrZSBzdXJlIG5vIG90aGVyIG1vZGFsIGNvbnRlbnQgaXMgYmVpbmcgZGlzcGxheWVkXG4gICAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50JykpLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIH0pO1xuICAgIHN3aXRjaCh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIHRoaXMub3BlbkVkaXRTeWxUZXh0TW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAgIFxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuSE9US0VZUzpcbiAgICAgICAgLy8gc2V0IHVwIGFuZCBkaXBsYXkgaG90a2V5IG1vZGFsIGNvbnRlbnRcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtaG90a2V5cycpLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgICAvLyBhZGQgZnVuY3Rpb24gdG8gcGFpcmluZyBidXR0b25cbiAgICAgICAgLy8gYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk1PVkVfVE86XG4gICAgICAgIFxuICAgICAgICAvLyBicmVhaztcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk5FV19GT0xERVI6XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHRoaXMuZm9jdXNNb2RhbFdpbmRvdygpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHVzZXIgY2FuJ3Qgc2Nyb2xsIHdoZW4gbW9kYWwgaXMgb3BlblxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dYID0gJ2hpZGRlbic7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcbiAgICB0aGlzLm1vZGFsV2luZG93U3RhdGUgPSBNb2RhbFdpbmRvd1N0YXRlLk9QRU47XG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIE5lb24gbW9kYWwgd2luZG93XG4gICAqL1xuICBoaWRlTW9kYWxXaW5kb3coKTogdm9pZCB7XG4gICAgc3dpdGNoKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIGNvbnN0IHNwYW4gPSAoPEhUTUxTcGFuRWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0JykucXVlcnlTZWxlY3RvckFsbCgnc3Bhbi5zZWxlY3RlZC10by1lZGl0JylbMF0pO1xuICAgICAgICBzcGFuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkLXRvLWVkaXQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAgIFxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk5FV19GT0xERVI6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5SRU5BTUU6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWNvbnRhaW5lcicpLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfSBcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyByZXNldCBzY3JvbGwgYmVoYXZpb3Igb2YgYm9keVxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dYID0gJ2hpZGRlbic7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1kgPSAnc2Nyb2xsJztcbiAgICB0aGlzLm1vZGFsV2luZG93U3RhdGUgPSBNb2RhbFdpbmRvd1N0YXRlLkNMT1NFRDtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXQgY29udGVudCBvZiBtb2RhbCB3aW5kb3dcbiAgICovXG4gIHByaXZhdGUgc2V0TW9kYWxXaW5kb3dDb250ZW50KGNvbnRlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1jb250YWluZXInKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItdGl0bGUnKTtcblxuICAgIHN3aXRjaCAodGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkVESVRfVEVYVDpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGVkaXRUZXh0TW9kYWw7XG4gICAgICAgIC8vIHNldCBtb2RhbCB3aW5kb3cgdGl0bGVcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0VESVQgU1lMTEFCTEUgVEVYVCc7XG5cbiAgICAgICAgLy8gc3BhbiBhbmQgY3VycmVudCB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGUgYW5kIGZpbHRlciBvdXQgdW53YW50ZWQgY2hhcnNcbiAgICAgICAgY29uc3Qgc3BhbiA9IDxIVE1MU3BhbkVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzeWxfdGV4dCcpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdO1xuICAgICAgICBjb25zdCByZW1vdmVTeW1ib2wgPSAvXFx1ezI1Q0F9L3U7XG4gICAgICAgIGNvbnN0IG9yaWcgPSBzcGFuLnRleHRDb250ZW50LnJlcGxhY2UocmVtb3ZlU3ltYm9sLCAnJykudHJpbSgpO1xuXG4gICAgICAgIC8vIHNldCB2YWx1ZSBvZiBpbnB1dCBmaWVsZCB0byBjdXJyZW50IHN5bGxhYmxlIHRleHRcbiAgICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1pbnB1dCcpKSkudmFsdWUgPSBvcmlnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuSE9US0VZUzpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGhvdGtleXNNb2RhbDtcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0hPVEtFWVMnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRVJST1JfTE9HOlxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXG4gICAgICAgICAgYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAzMHB4O3doaXRlLXNwYWNlOiBwcmUtbGluZTtcIj4ke2NvbnRlbnR9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCR7ZW5jb2RlVVJJKGNvbnRlbnQpfVwiIGRvd25sb2FkPVwiZXJyb3IubG9nXCI+XG4gICAgICAgICAgICAgIEV4cG9ydFxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0VSUk9SIExPRyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ET0NVTUVOVF9VUExPQUQ6XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdET0NVTUVOVCBVUExPQUQnO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gdXBsb2FkQXJlYUhUTUw7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5NT1ZFX1RPOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnTU9WRSBUTyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnTkVXIEZPTERFUic7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBuZXdGb2xkZXJIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnUkVOQU1FJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHJlbmFtZUhUTUw7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlLiBUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4nKTtcbiAgICB9IFxuICB9XG5cblxuICAvKipcbiAgICogRmlsbCBtb2RhbCB3aW5kb3cgd2l0aCBjb250ZW50IGZvciB1cGRhdGluZyBzeWxsYWJsZSB0ZXh0XG4gICAqL1xuICBwcml2YXRlIG9wZW5FZGl0U3lsVGV4dE1vZGFsV2luZG93ID0gZnVuY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gbWFrZSBzdXJlIG5vIG90aGVyIG1vZGFsIGNvbnRlbnQgaXMgYmVpbmcgZGlzcGxheWVkXG4gICAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50JykpLmZvckVhY2goIChlbGVtKSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB9KTtcblxuICAgIC8vIHNldCB1cCBFZGl0IFN5bGxhYmxlIFRleHQgbW9kYWwgd2luZG93XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0JykuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgIFxuICAgIC8vIFJlc2V0IFwiQ2FuY2VsXCIgYnV0dG9uIGV2ZW50IGxpc3RlbmVyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsV2luZG93KTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBSZXNldCBcIlNhdmVcIiBidXR0b24gZXZlbnQgbGlzdGVuZXJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmUnKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudXBkYXRlU3lsVGV4dC5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudXBkYXRlU3lsVGV4dC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIGRpc3BsYXkgbW9kYWwgd2luZG93XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgdGhpcy5mb2N1c01vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGVzIHdpdGggdXNlci1wcm92aWRlZCB0ZXh0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVN5bFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gc3BhbiBhbmQgY3VycmVudCB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGUgYW5kIGZpbHRlciBvdXQgdW53YW50ZWQgY2hhcnNcbiAgICBjb25zdCBzcGFuID0gPEhUTUxTcGFuRWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0JykucXVlcnlTZWxlY3RvckFsbCgnc3Bhbi5zZWxlY3RlZC10by1lZGl0JylbMF07XG4gICAgY29uc3QgcmVtb3ZlU3ltYm9sID0gL1xcdXsyNUNBfS91O1xuICAgIGNvbnN0IG9yaWcgPSBzcGFuLnRleHRDb250ZW50LnJlcGxhY2UocmVtb3ZlU3ltYm9sLCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHVwZGF0ZWRTeWxUZXh0ID0gKDxIVE1MSW5wdXRFbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JykpLnZhbHVlO1xuXG4gICAgaWYgKHVwZGF0ZWRTeWxUZXh0ICE9PSBudWxsICYmIHVwZGF0ZWRTeWxUZXh0ICE9PSBvcmlnKSB7XG4gICAgICAvLyBjcmVhdGUgXCJzZXQgdGV4dFwiIGFjdGlvblxuICAgICAgY29uc3QgZWxlbWVudElkID0gWy4uLnNwYW4uY2xhc3NMaXN0LmVudHJpZXMoKV0uZmlsdGVyKChjbGFzc05hbWUpID0+IGNsYXNzTmFtZVsxXSAhPT0gJ3RleHQtc2VsZWN0JyAmJiBjbGFzc05hbWVbMV0gIT09ICdzZWxlY3RlZC10by1lZGl0JylbMF1bMV07XG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IFNldFRleHRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldFRleHQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudElkLFxuICAgICAgICAgIHRleHQ6IHVwZGF0ZWRTeWxUZXh0LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIC8vIHNlbmQgYWN0aW9uIHRvIHZlcm92aW8gZm9yIHByb2Nlc3NpbmdcbiAgICAgIHRoaXMubmVvblZpZXcuZWRpdChlZGl0b3JBY3Rpb24sIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXNwb25zZTogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIFNWR1xuICAgICAgICAgIHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEFuIHVwZGF0ZSB0byB0aGUgcGFnZSB3aWxsIHJlbG9hZCB0aGUgZW50aXJlIHN2ZztcbiAgICAgICAgICAgIC8vIFdlIHdvdWxkIGxpa2UgdG8gdGhlbiByZXNlbGVjdCB0aGUgc2FtZSBzZWxlY3RlZCBzeWxsYWJsZVxuICAgICAgICAgICAgLy8gaWYgYmJveGVzIGFyZSBlbmFibGVkXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQkJveChzcGFuLCB0aGlzLmRyYWdIYW5kbGVyLCB0aGlzLm5lb25WaWV3KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlc2VsZWN0IGlmIG5vIGNoYW5nZSBpcyBtYWRlXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQkJveChzcGFuLCB0aGlzLmRyYWdIYW5kbGVyLCB0aGlzLm5lb25WaWV3KTtcbiAgICB9XG4gICAgLy8gY2xvc2UgbW9kYWwgd2luZG93XG4gICAgdGhpcy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBib3VuZGluZyBib3ggc2VsZWN0ZWQgd2hlbiB0aGUgZWRpdCB0ZXh0IG1vZGFsIGhhcyBiZWVuIGNsaWNrZWQgXG4gICovXG4gIHVwZGF0ZVNlbGVjdGVkQkJveCAoc3BhbjogSFRNTFNwYW5FbGVtZW50LCBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsIG5lb25WaWV3OiBOZW9uVmlldyk6IHZvaWQge1xuICAgIHVuc2VsZWN0KCk7XG5cbiAgICBjb25zdCBiYm94SWQgPSBBcnJheS5mcm9tKHNwYW4uY2xhc3NMaXN0KS5maW5kKGUgPT4gZSAhPT0gJ3RleHQtc2VsZWN0JyAmJiBlICE9PSAnc2VsZWN0ZWQtdG8tZWRpdCcpO1xuXG4gICAgaWYgKChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJCb3gnKSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmJveElkKSkge1xuICAgICAgICBjb25zdCBkaXNwbGF5UmVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJib3hJZCkucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIHNlbGVjdEJCb3goZGlzcGxheVJlY3QsIGRyYWdIYW5kbGVyLCBuZW9uVmlldyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogRmlsbCBtb2RhbCB3aW5kb3cgd2l0aCBob3RrZXkgaW5mbyBjb250ZW50XG4gICAqL1xuICAvKlxuICBwcml2YXRlIG9wZW5Ib3RrZXlNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uKCkgeyAgIFxuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpKS5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB9KTtcblxuICAgIC8vIHNldCB1cCBhbmQgZGlwbGF5IGhvdGtleSBtb2RhbCBjb250ZW50XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtaG90a2V5cycpLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIHRoaXMuZm9jdXNNb2RhbFdpbmRvdygpO1xuICB9O1xuICAqL1xuXG5cbiAgLyoqXG4gICAqIERlZmluZSBldmVudCBsaXN0ZW5lcnMgZm9yIG1vZGFsIHdpbmRvdyBiYXNlZCBvbiBtb2RhbFZpZXcgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBrZXlkb3duTGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgLy8gcHJldmVudCBOZW9uIGhvdGtleSBldmVudHMgZnJvbSBmaXJpbmcgd2hlbiB1c2VyIGlzIHR5cGluZ1xuXG4gICAgc3dpdGNoKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgdGhpcy51cGRhdGVTeWxUZXh0KCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgfSAgXG4gIH07XG5cblxuICAvKipcbiAgICogRXZlbnQgbGlzdGVuZXIgdGhhdCBmb2N1c2VzIHRoZSBtb2RhbCB3aW5kb3cgaWYgdXNlciBjbGlja3MgYW55d2hlcmUgb3V0c2lkZSBvZiBpdFxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c01vZGFsV2luZG93ID0gZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgICg8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1pbnB1dCcpKS5zZWxlY3QoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ET0NVTUVOVF9VUExPQUQ6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdycpLmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG59XG4iLCJpbXBvcnQgKiBhcyBDb250ZW50cyBmcm9tICcuL0NvbnRlbnRzJztcbmltcG9ydCAqIGFzIEdyb3VwaW5nIGZyb20gJy4vR3JvdXBpbmcnO1xuaW1wb3J0IE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IFNwbGl0U3RhZmZIYW5kbGVyIH0gZnJvbSAnLi9TdGFmZlRvb2xzJztcbmltcG9ydCB7IFNwbGl0TmV1bWVIYW5kbGVyIH0gZnJvbSAnLi9OZXVtZVRvb2xzJztcbmltcG9ydCB7XG4gIENoYWluQWN0aW9uLFxuICBDaGFuZ2VTdGFmZkFjdGlvbixcbiAgRGlzcGxhY2VDbGVmT2N0YXZlQWN0aW9uLFxuICBFZGl0b3JBY3Rpb24sXG4gIE1hdGNoSGVpZ2h0QWN0aW9uLFxuICBSZW1vdmVBY3Rpb24sXG4gIFNldEFjdGlvbixcbiAgU2V0Q2xlZkFjdGlvbixcbiAgU2V0TGlxdWVzY2VudEFjdGlvblxufSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuLi91dGlscy9TZWxlY3RUb29scyc7XG5cbi8qKlxuICogVGhlIE5lb25WaWV3IHBhcmVudCB0byBjYWxsIGVkaXRvciBhY3Rpb25zLlxuICovXG5sZXQgbmVvblZpZXc6IE5lb25WaWV3O1xuXG4vKipcbiAqIEluaXRpYWxpemUgTmVvblZpZXcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TmVvblZpZXcgKHZpZXc6IE5lb25WaWV3KTogdm9pZCB7XG4gIG5lb25WaWV3ID0gdmlldztcbiAgR3JvdXBpbmcuaW5pdE5lb25WaWV3KHZpZXcpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBpbmNsaW5hdHVtIHBhcmFtZXRlciBvZiBhIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc2V0SW5jbGluYXR1bUFjdGlvbiAoaWQ6IHN0cmluZyk6IFNldEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0JyxcbiAgICBwYXJhbToge1xuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICBhdHRyVmFsdWU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSB2aXJnYSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldFZpcmdhQWN0aW9uIChpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgIGF0dHJWYWx1ZTogJydcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBuZXVtZSBjb21wb25lbnQuXG4gKiBAcmV0dXJucyBBbiBhY3Rpb24gdGhhdCB1bnNldHMgdGhlIHJldmVyc2VkIHZpcmdhIHBhcmFtZXRlciBvZiBhIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbiAoaWQ6IHN0cmluZyk6IFNldEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0JyxcbiAgICBwYXJhbToge1xuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICBhdHRyVmFsdWU6ICcnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2Nsb2Nrd2lzZSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24gKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ2N1cnZlJyxcbiAgICAgIGF0dHJWYWx1ZTogJydcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBuZXVtZSBjb21wb25lbnQuXG4gKiBAcmV0dXJucyBBbiBhY3Rpb24gdGhhdCB1bnNldHMgdGhlIGxpcXVlc2NlbnRfYW50aWNsb2Nrd2lzZSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uIChpZDogc3RyaW5nKTogU2V0TGlxdWVzY2VudEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0TGlxdWVzY2VudCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBjdXJ2ZTogJydcbiAgICB9XG4gIH07XG59XG5cbi8qKiBFdmVudCBoYW5kbGVyIGZvciBkZWxldGUgYnV0dG9uIHByZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUJ1dHRvbkhhbmRsZXIgKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICBpZiAoZXZ0LmtleSA9PT0gJ2QnIHx8IGV2dC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7IHJlbW92ZUhhbmRsZXIoKTsgZXZ0LnByZXZlbnREZWZhdWx0KCk7IH1cbn1cblxuLyoqXG4gKiBFbmQgdGhlIGV4dHJhIG9wdGlvbnMgbWVudS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZE9wdGlvbnNTZWxlY3Rpb24gKCk6IHZvaWQge1xuICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICBjb25zdCBleHRyYUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0Jyk7XG4gIGlmIChtb3JlRWRpdCkge1xuICAgIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIH1cbiAgaWYgKGV4dHJhRWRpdCkge1xuICAgIGV4dHJhRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICBleHRyYUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgfVxuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSByZW1vdmluZyBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSGFuZGxlciAoKTogdm9pZCB7XG4gIGNvbnN0IHRvUmVtb3ZlOiBSZW1vdmVBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goZWxlbSA9PiB7XG4gICAgaWYgKGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgZWxlbSA9IGVsZW0uY2xvc2VzdCgnLnN5bGxhYmxlJyk7XG4gICAgfVxuICAgIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnYWNjaWQnKSkge1xuICAgICAgZWxlbSA9IGVsZW0uY2xvc2VzdCgnLmFjY2lkJyk7XG4gICAgfVxuICAgIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpKSB7XG4gICAgICBlbGVtID0gZWxlbS5jbG9zZXN0KCcuZGl2TGluZScpO1xuICAgIH1cbiAgICB0b1JlbW92ZS5wdXNoKFxuICAgICAge1xuICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbS5pZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvUmVtb3ZlXG4gIH07XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgbmVvblZpZXcuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKCgpID0+IHsgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTsgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIHJlLWFzc29jaWF0aW5nIGVsZW1lbnRzIHRvIHRoZSBuZWFyZXN0IHN0YWZmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VTdGFmZkhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvQ2hhbmdlOiBDaGFuZ2VTdGFmZkFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaChlbGVtID0+IHtcbiAgICB0b0NoYW5nZS5wdXNoKFxuICAgICAge1xuICAgICAgICBhY3Rpb246ICdjaGFuZ2VTdGFmZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgY29uc3QgY2hhaW5BY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvQ2hhbmdlXG4gIH07XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgbmVvblZpZXcuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKCgpID0+IHsgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTsgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIGluc2VydGluZyBkaXZpc2lvIG9yIGFjY2lkZW50YWwgaW50byBuZWFyZXN0IHN5bGxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRUb1N5bGxhYmxlSGFuZGxlcigpOiB2b2lkIHtcbiAgY29uc3QgdG9JbnNlcnQ6IEVkaXRvckFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaChlbGVtID0+IHtcbiAgICB0b0luc2VydC5wdXNoKFxuICAgICAge1xuICAgICAgICBhY3Rpb246ICdpbnNlcnRUb1N5bGxhYmxlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW0uaWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b0luc2VydFxuICB9O1xuICBuZW9uVmlldy5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4geyBcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0luc2VydCBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdJbnNlcnQgRmFpbGVkIFhvWCcsICdlcnJvcicpO1xuICAgIH1cbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTsgXG4gIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBtb3ZpbmcgZGl2aXNpbyBvciBhY2NpZGVudGFsIG91dCBvZiBzeWxsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvTW92ZTogRWRpdG9yQWN0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBzZWxlY3RlZC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgIHRvTW92ZS5wdXNoKFxuICAgICAge1xuICAgICAgICBhY3Rpb246ICdtb3ZlT3V0c2lkZVN5bGxhYmxlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW0uaWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b01vdmVcbiAgfTtcbiAgbmVvblZpZXcuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNb3ZlIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ01vdmUgRmFpbGVkIFhvWCcsICdlcnJvcicpO1xuICAgIH1cbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTsgXG4gIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIG1hdGNoIGJib3ggaGVpZ2h0IHRvIHRoZSBzZWxlY3RlZCBiYm94XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEhlaWdodEhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDEpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0Nhbm5vdCBtYXRjaCBoZWlnaHQgdG8gbXVsdGlwbGUgYmJveCcsICdlcnJvcicpO1xuICB9XG4gIGNvbnN0IHRvQ2hhbmdlOiBNYXRjaEhlaWdodEFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdtYXRjaEhlaWdodCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogc2VsZWN0ZWRbMF0uaWRcbiAgICB9XG4gIH07XG5cbiAgbmVvblZpZXcuZWRpdCh0b0NoYW5nZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdIZWlnaHQgTWF0Y2ggU3VjY2VzcycsICdzdWNjZXNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSGVpZ2h0IE1hdGNoIEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRGVsZXRlTGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUnKTtcblxuICBpZiAoZGVsKSB7XG4gICAgZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG4gICAgZGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG5cbiAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBvdXRzaWRlIHRoZSBpZiBjb25kaXRpb24/XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZGVsZXRlQnV0dG9uSGFuZGxlcik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGNoYW5nZVN0YWZmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYW5nZVN0YWZmJyk7XG4gIGNoYW5nZVN0YWZmPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYW5nZVN0YWZmSGFuZGxlcik7XG4gIGNoYW5nZVN0YWZmPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYW5nZVN0YWZmSGFuZGxlcik7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBpbnB1dFxuICovXG5mdW5jdGlvbiB1cGRhdGVDb2x1bW5JbmZvKCk6IHZvaWQge1xuICBjb25zdCBjb2xJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2wtaW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCBzdGF2ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYuc2VsZWN0ZWQnKTtcbiAgbGV0IGNvbEluZm86IG51bWJlcjtcbiAgZm9yIChjb25zdCBzdGFmZiBvZiBzdGF2ZXMpIHtcbiAgICBjb25zdCBoYXNDb2x1bW4gPSBBcnJheS5mcm9tKHN0YWZmLmNsYXNzTGlzdCkuam9pbignICcpLm1hdGNoKC9cXGJjb2x1bW4oXFxkKylcXGIvKTtcbiAgICBpZiAoaGFzQ29sdW1uKSB7XG4gICAgICBjb25zdCBzdGFmZkNvbCA9IHBhcnNlSW50KGhhc0NvbHVtblsxXSwgMTApO1xuICAgICAgaWYgKGNvbEluZm8gJiYgY29sSW5mbyAhPSBzdGFmZkNvbCkge1xuICAgICAgICBjb25zdCB3YXJuaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC13YXJuaW5nJyk7XG4gICAgICAgIHdhcm5pbmcuaW5uZXJUZXh0ID0gJ1RoZSBzZWxlY3RlZCBzdGF2ZXMgYXJlIG5vdCBvZiB0aGUgc2FtZSBjb2x1bW4hJztcbiAgICAgICAgY29sSW5mbyA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sSW5mbyA9IHN0YWZmQ29sO1xuICAgICAgfVxuICAgIH1cbiAgfSBcbiAgaWYgKGNvbEluZm8pIGNvbElucHV0LnZhbHVlID0gY29sSW5mby50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEFkZCBjb2x1bW4gaW5mbyBlZGl0IGhhbmRsZXIgZm9yIGNvbHVtbiBpbmZvIGVkaXRvclxuICovXG5mdW5jdGlvbiBhZGRDb2x1bW5JbmZvU3RlcEhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IGRlY3JlbWVudEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2wtZGVjcmVtZW50JykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGluY3JlbWVudEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2wtaW5jcmVtZW50JykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGNvbmZpcm1CdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWNvbmZpcm0nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29sSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICBkZWNyZW1lbnRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlTnVtYmVyKC0xKTtcbiAgfSk7XG5cbiAgaW5jcmVtZW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZU51bWJlcigxKTtcbiAgfSk7XG5cbiAgLy8gQWRkIGNvbHVtbiBpbmZvIGVkaXQgaGFuZGxlclxuICBjb25maXJtQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRvU2V0Q29sdW1uOiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICAgIGNvbnN0IHN0YXZlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGFmZi5zZWxlY3RlZCcpO1xuICAgIHN0YXZlcy5mb3JFYWNoKHN0YWZmID0+IHtcbiAgICAgIHRvU2V0Q29sdW1uLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICBlbGVtZW50SWQ6IHN0YWZmLmlkLFxuICAgICAgICAgICAgYXR0clR5cGU6ICd0eXBlJyxcbiAgICAgICAgICAgIGF0dHJWYWx1ZTogJ2NvbHVtbicgKyBjb2xJbnB1dC52YWx1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgY2hhaW5BY3Rpb246IENoYWluQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgICAgcGFyYW06IHRvU2V0Q29sdW1uXG4gICAgfTtcbiAgICBuZW9uVmlldy5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4geyBcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDb2x1bW4gVmFsdWUgVXBkYXRlIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDb2x1bW4gVmFsdWUgVXBkYXRlIEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IFxuICAgIH0pO1xuICB9KTtcbiAgXG4gIGZ1bmN0aW9uIHVwZGF0ZU51bWJlcihjaGFuZ2U6IG51bWJlcikge1xuICAgIGNvbnN0IG1pbk51bSA9IDE7XG4gICAgY29uc3QgbWF4TnVtID0gNTtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gcGFyc2VJbnQoY29sSW5wdXQudmFsdWUsIDEwKSB8fCAwO1xuICAgIGN1cnJlbnRWYWx1ZSArPSBjaGFuZ2U7XG5cbiAgICBjdXJyZW50VmFsdWUgPSBNYXRoLm1pbihNYXRoLm1heChjdXJyZW50VmFsdWUsIG1pbk51bSksIG1heE51bSk7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS50b1N0cmluZygpICE9IGNvbElucHV0LnZhbHVlKSBjb25maXJtQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBjb2xJbnB1dC52YWx1ZSA9IGN1cnJlbnRWYWx1ZS50b1N0cmluZygpO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gc2V0IHRoZSBIVE1MIGNvbnRlbnQgb2YgZWRpdCBjb250cm9sczogZWl0aGVyICNtb3JlRWRpdCBvciAjZXh0cmFFZGl0XG4gKlxuICogQHBhcmFtIHsnbW9yZUVkaXQnIHwgJ2V4dHJhRWRpdCd9IGVkaXRUeXBlIC0gVGhlIHR5cGUgb2YgZWRpdCBjb250cm9sc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzIC0gVGhlIGlubmVySFRNTCBjb250ZW50c1xuICogQHBhcmFtIHtib29sZWFufSByZXBsYWNlIC0gSXMgdGhlIGlubmVySFRNTCBiZWluZyByZXBsYWNlZCwgb3IgYmVpbmcgYWRkZWQgdG8/XG4gKi9cbmZ1bmN0aW9uIHNldEVkaXRDb250cm9scyhlZGl0VHlwZTogJ21vcmVFZGl0JyB8ICdleHRyYUVkaXQnLCBjb250ZW50czogc3RyaW5nLCByZXBsYWNlID0gdHJ1ZSk6IHZvaWQge1xuICBjb25zdCBlZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdFR5cGUpO1xuICBcbiAgaWYgKGVkaXQpIHtcbiAgICBlZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgaWYgKHJlcGxhY2UpIGVkaXQuaW5uZXJIVE1MID0gY29udGVudHM7XG4gICAgZWxzZSBlZGl0LmlubmVySFRNTCArPSBjb250ZW50cztcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgdGhlIGV4dHJhIG5jIGFjdGlvbiBtZW51IGZvciBhIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOY0FjdGlvbnMgKG5jOiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5kZWZhdWx0QWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLm5jQWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQdW5jdHVtLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhID0gdW5zZXRWaXJnYUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhUmV2ZXJzZWQgPSB1bnNldFZpcmdhUmV2ZXJzZWRBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIG5lb25WaWV3LmVkaXQoeyBhY3Rpb246ICdjaGFpbicsIHBhcmFtOiBbIHVuc2V0SW5jbGluYXR1bSwgdW5zZXRWaXJnYSwgdW5zZXRWaXJnYVJldmVyc2VkLCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgXSB9LCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSW5jbGluYXR1bS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldFZpcmdhID0gdW5zZXRWaXJnYUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhUmV2ZXJzZWQgPSB1bnNldFZpcmdhUmV2ZXJzZWRBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHNldEluY2xpbmF0dW06IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnc2UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldFZpcmdhLCB1bnNldFZpcmdhUmV2ZXJzZWQsIHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSwgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSwgc2V0SW5jbGluYXR1bSBdIH0gLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjVmlyZ2EuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3Qgc2V0VmlyZ2E6IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAncydcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3LmVkaXQoeyBhY3Rpb246ICdjaGFpbicsIHBhcmFtOiBbIHVuc2V0VmlyZ2FSZXZlcnNlZCwgdW5zZXRJbmNsaW5hdHVtLCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsIHNldFZpcmdhIF0gfSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1ZpcmdhUmV2ZXJzZWQuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRJbmNsaW5hdHVtID0gdW5zZXRJbmNsaW5hdHVtQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2EgPSB1bnNldFZpcmdhQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRWaXJnYVJldmVyc2VkOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ24nXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldEluY2xpbmF0dW0sIHVuc2V0VmlyZ2EsIHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSwgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSwgc2V0VmlyZ2FSZXZlcnNlZCBdIH0sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNMaXF1ZXNjZW50Q2xvY2t3aXNlLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhID0gdW5zZXRWaXJnYUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhUmV2ZXJzZWQgPSB1bnNldFZpcmdhUmV2ZXJzZWRBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3Qgc2V0TGlxdWVzY2VudENsb2Nrd2lzZTogU2V0TGlxdWVzY2VudEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0TGlxdWVzY2VudCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBjdXJ2ZTogJ2MnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZW9uVmlldy5lZGl0KHsgYWN0aW9uOiAnY2hhaW4nLCBwYXJhbTogWyB1bnNldEluY2xpbmF0dW0sIHVuc2V0VmlyZ2EsIHVuc2V0VmlyZ2FSZXZlcnNlZCwgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSwgc2V0TGlxdWVzY2VudENsb2Nrd2lzZSBdIH0sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0pOyAgXG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0xpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhID0gdW5zZXRWaXJnYUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldFZpcmdhUmV2ZXJzZWQgPSB1bnNldFZpcmdhUmV2ZXJzZWRBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlOiBTZXRMaXF1ZXNjZW50QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRMaXF1ZXNjZW50JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGN1cnZlOiAnYSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3LmVkaXQoeyBhY3Rpb246ICdjaGFpbicsIHBhcmFtOiBbIHVuc2V0SW5jbGluYXR1bSwgdW5zZXRWaXJnYSwgdW5zZXRWaXJnYVJldmVyc2VkLCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsIHNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlIF0gfSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2hhcGUgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSk7ICBcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgbmV1bWUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOZXVtZUFjdGlvbnMgKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG5cbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLmRlZmF1bHROZXVtZUFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5uZXVtZUFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcblxuICBjb25zdCBuZXVtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpO1xuICBpZiAobmV1bWUubGVuZ3RoICE9PSAxKSB7XG4gICAgY29uc29sZS53YXJuKCdNb3JlIHRoYW4gb25lIG5ldW1lIHNlbGVjdGVkISBDYW5ub3QgdHJpZ2dlciBOZXVtZSBDbGlja1NlbGVjdCBhY3Rpb25zLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRPRE8gYWRkIHRyaWdnZXIgZm9yIHNwbGl0IGFjdGlvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BsaXQtbmV1bWUnKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IG5ldW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ldW1lLnNlbGVjdGVkJykgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgICBpZiAobmV1bWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBuZXcgU3BsaXROZXVtZUhhbmRsZXIobmVvblZpZXcsIG5ldW1lKTtcbiAgICAgICAgc3BsaXQuc3RhcnRTcGxpdCgpO1xuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzdGFmZiB3YXMgc2VsZWN0ZWQhJyk7XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUGVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUGVzU3VicHVuY3Rpcy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NsaXZpcy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1NjYW5kaWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1NjYW5kaWN1c0ZsZXh1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1NjYW5kaWN1c1N1YnB1bmN0aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDbGltYWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NsaW1hY3VzUmVzdXBpbnVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjVG9yY3VsdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNUb3JjdWx1c1Jlc3VwaW51cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1BvcnJlY3R1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1BvcnJlY3R1c0ZsZXh1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7IFxuICAgIH0pOyBcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1BvcnJlY3R1c1N1YnB1bmN0aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQpO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpOyBcbiAgICB9KTsgXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNQcmVzc3VzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZSgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTsgXG4gICAgfSk7IFxuXG4gIGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2VHcm91cCAoY29udG91cjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlR3JvdXBpbmdBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYW5nZUdyb3VwJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogbmV1bWVbMF0uaWQsXG4gICAgICAgIGNvbnRvdXI6IGNvbnRvdXJcbiAgICAgIH1cbiAgICB9O1xuICAgIG5lb25WaWV3LmVkaXQoY2hhbmdlR3JvdXBpbmdBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgQ2hhbmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgfVxuICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRPcHRpb25zTGlzdGVuZXJzKCk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBleHRyYSBzeWxsYWJsZSBhY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclN5bGxhYmxlQWN0aW9ucyAoc2VsZWN0aW9uVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3lsbGFibGVBY3Rpb25zQ29udGVudCk7XG4gIC8vIGluaXRpYWxpemUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgaHRtbCB0byBiZSBhZGRlZCB0byBEaXNwbGF5IHBhbmVsXG4gIGxldCBleHRyYUFjdGlvbnNIVE1MID0gJyc7XG5cbiAgLy8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiB0aGF0IHdhcyBtYWRlIGJ5IHRoZSB1c2VyXG4gIHN3aXRjaChzZWxlY3Rpb25UeXBlKSB7XG4gICAgLy8gb25seSBvbmUgc3lsbGFibGVcbiAgICBjYXNlICdzaW5nbGVTZWxlY3QnOlxuICAgICAgZXh0cmFBY3Rpb25zSFRNTCArPSBcbiAgICAgICAgYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ1bmdyb3VwTmV1bWVzXCI+VW5ncm91cDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBicmVhaztcblxuICAgIC8vIHR3byBzeWxsYWJsZXMgb24gc2VwYXJhdGUgc3RhdmVzXG4gICAgY2FzZSAnbGlua2FibGVTZWxlY3QnOlxuICAgICAgZXh0cmFBY3Rpb25zSFRNTCArPSBcbiAgICAgICAgYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ0b2dnbGUtbGlua1wiPlRvZ2dsZSBMaW5rZWQgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gdG93IG9yIG1vcmUgc3lsbGFibGVzIG9uIG9uZSBzdGFmZlxuICAgIGNhc2UgJ211bHRpU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWVyZ2VTeWxzXCI+TWVyZ2UgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy9kZWZhdWx0IG9wdGlvbnNcbiAgICBjYXNlICdkZWZhdWx0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBicmVhaztcblxuICB9XG5cbiAgLy8gc2V0IGNvbnRlbnQgb2YgYWRkaXRpb25hbCBhY3Rpb25zIGluIERpc3BsYXkgcGFuZWwgXG4gIC8vIGFuZCBpbml0aWFsaXplIG5lY2Vzc2FyeSBsaXN0ZW5lcnNcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIGV4dHJhQWN0aW9uc0hUTUwsIHRydWUpO1xuICBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG4gIEdyb3VwaW5nLmluaXRHcm91cGluZ0xpc3RlbmVycygpO1xufVxuXG5cbi8qKlxuICogVHJpZ2dlciBleHRyYSBsYXllciBlbGVtZW50IChhY2NpZCwgZGl2TGluZSwgY3VzdG9zLCBjbGVmKSBhY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckxheWVyRWxlbWVudEFjdGlvbnMgKGVsZW1lbnQ6IFNWR0dyYXBoaWNzRWxlbWVudCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG5cbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjdXN0b3MnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5jdXN0b3NBY3Rpb25Db250ZW50cyk7XG4gICAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xuICAgIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGNvbnN0IHBhcmVudElzU3lsbGFibGUgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpO1xuICBjb25zdCBsYXllckVsZW1lbnRBY3Rpb25zID0gcGFyZW50SXNTeWxsYWJsZVxuICAgID8gQ29udGVudHMubGF5ZXJFbGVtZW50SW5BY3Rpb25Db250ZW50c1xuICAgIDogQ29udGVudHMubGF5ZXJFbGVtZW50T3V0QWN0aW9uQ29udGVudHM7XG4gIFxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgbGF5ZXJFbGVtZW50QWN0aW9ucywgZmFsc2UpO1xuICBcbiAgLy8gZXh0cmEgYWN0aW9ucyBmb3IgYWNjaWQgYW5kIGRpdkxpbmVcbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpKSB7XG4gICAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5hY2NpZEFjdGlvbkNvbnRlbnRzKTtcbiAgICBhY2NpZE9wdGlvbnNMaXN0ZW5lcihlbGVtZW50KTtcbiAgfVxuICBlbHNlIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnY2xlZicpKSB7XG4gICAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5jbGVmQWN0aW9uQ29udGVudHMpO1xuICAgIGNsZWZPcHRpb25zTGlzdGVuZXIoZWxlbWVudCk7XG4gIH1cbiAgZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuZGl2TGluZUFjdGlvbkNvbnRlbnRzKTtcbiAgICBkaXZMaW5lT3B0aW9uc0xpc3RlbmVyKGVsZW1lbnQpO1xuICB9XG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydFRvU3lsbGFibGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnNlcnRUb1N5bGxhYmxlSGFuZGxlcik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3ZlT3V0c2lkZVN5bGxhYmxlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIpO1xuXG4gXG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zZXJ0VG9TeWxsYWJsZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGluc2VydFRvU3lsbGFibGVIYW5kbGVyKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vdmVPdXRzaWRlU3lsbGFibGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtb3ZlT3V0c2lkZVN5bGxhYmxlSGFuZGxlcik7XG59XG5cbmZ1bmN0aW9uIGFjY2lkT3B0aW9uc0xpc3RlbmVyKGVsZW1lbnQ6IFNWR0dyYXBoaWNzRWxlbWVudCk6IHZvaWQge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9GbGF0LmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZVRvRmxhdDogU2V0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2FjY2lkJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdmJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihjaGFuZ2VUb0ZsYXQpO1xuICAgIH0pO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9OYXR1cmFsLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZVRvTmF0dXJhbDogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2FjY2lkJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICduJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihjaGFuZ2VUb05hdHVyYWwpO1xuICAgIH0pO1xuXG4gIGluaXRPcHRpb25zTGlzdGVuZXJzKCk7XG5cbn1cblxuZnVuY3Rpb24gY2xlZk9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2luY3JlbWVudC1vY3RhdmUnKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluY3JlbWVudE9jdGF2ZTogRGlzcGxhY2VDbGVmT2N0YXZlQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdkaXNwbGFjZUNsZWZPY3RhdmUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBkaXJlY3Rpb246ICdhYm92ZSdcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbmVvblZpZXcuZWRpdChpbmNyZW1lbnRPY3RhdmUsIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0NsZWYgb2N0YXZlIGluY3JlbWVudGVkLicsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNYXhpbXVtIG9jdGF2ZSBkaXNwbGFjZW1lbnQgcmVhY2hlZC4gQ2xlZiBjYW4gb25seSBiZSBkaXNwbGFjZWQgdXAgdG8gMyBvY3RhdmVzLicsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWNyZW1lbnQtb2N0YXZlJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbmNyZW1lbnRPY3RhdmU6IERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnZGlzcGxhY2VDbGVmT2N0YXZlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgZGlyZWN0aW9uOiAnYmVsb3cnXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG5lb25WaWV3LmVkaXQoaW5jcmVtZW50T2N0YXZlLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDbGVmIG9jdGF2ZSBkZWNyZW1lbnRlZC4nLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTWF4aW11bSBvY3RhdmUgZGlzcGxhY2VtZW50IHJlYWNoZWQuIENsZWYgY2FuIG9ubHkgYmUgZGlzcGxhY2VkIHVwIHRvIDMgb2N0YXZlcy4nLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ0NsZWYuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2V0Q0NsZWY6IFNldENsZWZBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldENsZWYnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBzaGFwZTogJ0MnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKHNldENDbGVmKTtcbiAgICB9KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0ZDbGVmLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNldEZDbGVmOiBTZXRDbGVmQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRDbGVmJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgc2hhcGU6ICdGJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRGQ2xlZik7XG4gICAgfSk7XG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuZnVuY3Rpb24gZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWluaW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWluaW1hOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWluaW1hJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihDaGFuZ2VUb01pbmltYSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWFpb3IuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ2hhbmdlVG9NYWlvcjogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ21haW9yJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihDaGFuZ2VUb01haW9yKTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9NYXhpbWEuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ2hhbmdlVG9NYXhpbWE6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdmb3JtJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdtYXhpbWEnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvTWF4aW1hKTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9GaW5hbGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvRmluYWxpczogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ2ZpbmFsaXMnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvRmluYWxpcyk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvQ2Flc3VyYS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb0NhZXN1cmE6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdmb3JtJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdjYWVzdXJhJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihDaGFuZ2VUb0NhZXN1cmEpO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNDaGFuZ2VUb1Zpcmd1bGEuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ2hhbmdlVG9WaXJndWxhOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAndmlyZ3VsYSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9WaXJndWxhKTtcbiAgICB9KTtcbiAgICBcbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhY3Rpb25zIHJlZ2FyZGluZyBzaGFwZSBjaGFuZ2VzIHRvIGVkaXRvciBhY3Rpb25cbiAqL1xuZnVuY3Rpb24gcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihhY3Rpb246IFNldEFjdGlvbiB8IFNldENsZWZBY3Rpb24pIHtcbiAgbmVvblZpZXcuZWRpdChhY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgfVxuICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGV4dHJhIHN0YWZmIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTXVsdGlTdGFmZkFjdGlvbnMgKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5zdGFmZk1lcmdlQWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmNvbHVtbkFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcblxuICAvLyBDb2x1bW4gaW5mbyBlZGl0b3JcbiAgdXBkYXRlQ29sdW1uSW5mbygpO1xuICBhZGRDb2x1bW5JbmZvU3RlcEhhbmRsZXIoKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVyZ2Utc3lzdGVtcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIEdyb3VwaW5nLm1lcmdlU3RhdmVzKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEVudGVyIHN0YWZmIHNwbGl0dGluZyBtb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyU3RhZmZTcGxpdE1vZGUgKCk6IHZvaWQge1xuICBjb25zdCBzdGFmZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdGFmZi5zZWxlY3RlZCcpIGFzIFNWR0dFbGVtZW50O1xuICBpZiAoc3RhZmYgIT09IG51bGwpIHtcbiAgICBjb25zdCBzcGxpdCA9IG5ldyBTcGxpdFN0YWZmSGFuZGxlcihuZW9uVmlldywgc3RhZmYpO1xuICAgIHNwbGl0LnN0YXJ0U3BsaXQoKTtcbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkIScpO1xuICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgc3BsaXQgc3RhZmYgb3B0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zICgpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3RhZmZTcGxpdEFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5jb2x1bW5BY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgLy8gQ29sdW1uIGluZm8gZWRpdG9yXG4gIHVwZGF0ZUNvbHVtbkluZm8oKTtcbiAgYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk7XG5cbiAgLy8gQWRkIHRyaWdnZXIgZm9yIHNwbGl0IGFjdGlvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BsaXQtc3lzdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0cmlnZ2VyU3RhZmZTcGxpdE1vZGUoKTtcbiAgICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtcm90YXRlJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGFmZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdGFmZi5zZWxlY3RlZCcpIGFzIFNWR0VsZW1lbnQ7XG4gICAgICAvLyBVbnVzZWQgdmFyaWFibGVzOlxuICAgICAgLy8gY29uc3QgcmVjdCA9IHN0YWZmLnF1ZXJ5U2VsZWN0b3IoJyNyZXNpemVSZWN0Jyk7XG4gICAgICAvLyBjb25zdCBjbyA9IHJlY3QuZ2V0QXR0cmlidXRlKCdwb2ludHMnKS5zcGxpdCgnICcpO1xuICAgICAgLy8gY29uc3QgZHkgPSBwYXJzZUludChjb1swXS5zcGxpdCgnLCcpWzFdKSAtIHBhcnNlSW50KGNvWzFdLnNwbGl0KCcsJylbMV0pO1xuICAgICAgY29uc3QgcG9pbnRzID0gZ2V0U3RhZmZCQm94KHN0YWZmIGFzIFNWR0dFbGVtZW50KTtcbiAgICAgIGNvbnN0IHlfY2hhbmdlID0gTWF0aC50YW4ocG9pbnRzLnJvdGF0ZSkqKHBvaW50cy5scnggLSBwb2ludHMudWx4KTtcbiAgICAgIGlmIChzdGFmZiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgICBhY3Rpb246ICdyZXNpemVSb3RhdGUnLFxuICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICBlbGVtZW50SWQ6IHN0YWZmLmlkLFxuICAgICAgICAgICAgdWx4OiBwb2ludHMudWx4LFxuICAgICAgICAgICAgdWx5OiBwb2ludHMucm90YXRlID4gMCA/IHBvaW50cy51bHkgKyB5X2NoYW5nZS8yIDogcG9pbnRzLnVseSAtIHlfY2hhbmdlLzIsXG4gICAgICAgICAgICBscng6IHBvaW50cy5scngsXG4gICAgICAgICAgICBscnk6IHBvaW50cy5yb3RhdGUgPiAwID8gcG9pbnRzLmxyeSAtIHlfY2hhbmdlLzIgOiBwb2ludHMubHJ5ICsgeV9jaGFuZ2UvMixcbiAgICAgICAgICAgIHJvdGF0ZTogMFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbmVvblZpZXcuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgYXdhaXQgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzdGFmZiB3YXMgc2VsZWN0ZWQnKTtcbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgYmJveCBvcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyQkJveEFjdGlvbnMgKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5iYm94QWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWF0Y2hIZWlnaHQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtYXRjaEhlaWdodEhhbmRsZXIoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBkZWZhdWx0IGFjdGlvbnMgd2hlbiBzZWxlY3RpbmcgYnkgc3lsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMgKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5kZWZhdWx0U3lsQWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBkZWZhdWx0IHNlbGVjdGlvbiBvcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdEFjdGlvbnMgKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5kZWZhdWx0QWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgZXh0cmEgZHJvcGRvd24gb3B0aW9uczpcbiAqIExpc3RlbiB0byBjbGlja3Mgb24gZHJvcGRvd25zXG4gKi9cbmZ1bmN0aW9uIGluaXRPcHRpb25zTGlzdGVuZXJzICgpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bfc2VsZWN0JylcbiAgICAuZm9yRWFjaChcbiAgICAgIGRyb3AgPT4ge1xuICAgICAgICAvLyBXaGVuIGFueXRoaW5nIHRoYXQgaXMgbm90IHRoZSBkcm9wZG93biBpcyBjbGlja2VkIGF3YXksIHRoZSBkcm9wZG93blxuICAgICAgICAvLyBzaG91bGQgbG9zZSBpdHMgdmlzaWJpbGl0eVxuICAgICAgICBjb25zdCBvcHRpb25zQ2xpY2thd2F5ID0gKCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25zQ2xpY2thd2F5KTtcbiAgICAgICAgICBkcm9wLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGRyb3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZ0KSA9PiB7XG4gICAgICAgICAgLy8gVG9nZ2xlIHZpc2liaWxpdHkgb2YgZHJvcGRvd25cbiAgICAgICAgICBkcm9wLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHZpc2liaWxpdHkgb2Ygb3RoZXIgZHJvcGRvd25zIHdoZW4gdGhpcyBvbmUgaXMgY2xpY2tlZFxuICAgICAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bfc2VsZWN0JykpXG4gICAgICAgICAgICAuZmlsdGVyKG90aGVyID0+IG90aGVyICE9PSBkcm9wKVxuICAgICAgICAgICAgLmZvckVhY2gob3RoZXIgPT4gb3RoZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJykpO1xuXG4gICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgb3RoZXIgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBib2R5IHRvIGludGVyZmVyZSB3aXRoIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICBpZiAoZHJvcC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKVxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wdGlvbnNDbGlja2F3YXkpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25zQ2xpY2thd2F5KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbn1cbiIsImltcG9ydCB7IGdldFN0YWZmQkJveCB9IGZyb20gJy4vU2VsZWN0VG9vbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQkJveCB7XG4gIHVseDogbnVtYmVyO1xuICB1bHk6IG51bWJlcjtcbiAgbHJ4OiBudW1iZXI7XG4gIGxyeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdldCBTVkcgcmVsYXRpdmUgY29vcmRpbmF0ZXMgZ2l2ZW4gY2xpZW50WCBhbmQgY2xpZW50WVxuICogU291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yOTI2MTMwNFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U1ZHUmVsQ29vcmRzIChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFBvaW50IHtcbiAgY29uc3QgcHQgPSBuZXcgRE9NUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gIGNvbnN0IHN2ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHU1ZHRWxlbWVudD4oJy5hY3RpdmUtcGFnZSA+IC5kZWZpbml0aW9uLXNjYWxlJyk7XG4gIGNvbnN0IHBhZ2VNYXJnaW4gPSBzdmcucXVlcnlTZWxlY3RvcjxTVkdHRWxlbWVudD4oJy5wYWdlLW1hcmdpbicpO1xuXG4gIGNvbnN0IHsgeCwgeSB9ID0gcHQubWF0cml4VHJhbnNmb3JtKHBhZ2VNYXJnaW4uZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgcmV0dXJuIHsgeCwgeSB9O1xuXG4gIC8vIElmIHRoZXJlIGlzIHNvbWUgaXNzdWUgd2l0aCBjb29yZGluYXRlcywgdGhpcyBtYXkgZml4IHRoZSBpc3N1ZTpcbiAgLy8gY29uc3Qgc3ZnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxTVkdTVkdFbGVtZW50PignI3N2Z19ncm91cCcpO1xuICAvLyBjb25zdCB7IHgsIHkgfSA9IHB0Lm1hdHJpeFRyYW5zZm9ybShzdmcuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbn1cblxuLyoqXG4gKiBHZXQgSUQgb2Ygc3RhZmYgYnkgY2xpZW50J3MgeC15IGNvb3JkaW5hdGVzLlxuICogVGhpcyBmdW5jdGlvbiBjb25zaWRlcnMgdGhlICp2aXN1YWwqIGJvdW5kaW5nIGJveCBvZiB0aGUgc3RhZmZcbiAqIGJhc2VkIG9uIGl0cyBzdGFmZiBsaW5lcywgaW5zdGVhZCBvZiB0aGUgU1ZHIGVsZW1lbnQgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhZmZJZEJ5Q29vcmRzIChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHRWxlbWVudD4oJy5zdGFmZicpKTtcbiAgY29uc3Qgc3RhZmZCQm94ZXMgPSBzdGF2ZXMubWFwKHN0YWZmID0+IGdldFN0YWZmQkJveChzdGFmZikpO1xuXG4gIC8vIGZpbmQgdGhlIHN0YWZmIHRoYXQgdGhlIGN1cnNvciBpcyBpbnNpZGVcbiAgY29uc3QgeyB4LCB5IH0gPSBnZXRTVkdSZWxDb29yZHMoY2xpZW50WCwgY2xpZW50WSk7XG4gIGNvbnN0IHN0YWZmID0gc3RhZmZCQm94ZXMuZmluZChcbiAgICAoYmJveCkgPT4geCA8PSBiYm94LmxyeCAmJiB4ID49IGJib3gudWx4ICYmIHkgPD0gYmJveC5scnkgJiYgeSA+PSBiYm94LnVseVxuICApOyBcblxuICAvLyBJZiB0aGVyZSBpcyBpc3N1ZXMgd2l0aCBmaW5kaW5nIHRoZSBzdGFmZiwgdGhpcyBtYXkgYmUgbW9yZSBhY2N1cmF0ZTpcbiAgLy8gcmV0dXJuIChwdC54ID4gdWx4ICYmIHB0LnggPCBscngpICYmXG4gIC8vICAgKHB0LnkgPiAodWx5ICsgKHB0LnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKSkpICYmXG4gIC8vICAgKHB0LnkgPCAobHJ5IC0gKGxyeCAtIHB0LngpICogTWF0aC50YW4ocm90YXRlKSkpO1xuXG4gIC8vIGlmIHRoZSBjdXJzb3IgaXMgbm90IGluc2lkZSBhbnkgc3RhZmYsIHRoZW4gZXhwbGljaXRseSByZXR1cm4gbnVsbFxuICByZXR1cm4gc3RhZmYgPyBzdGFmZi5pZCA6IG51bGw7XG59XG5cbi8qKlxuICogR2V0IHN0YWZmIGJ5IGNsaWVudCdzIHgteSBjb29yZGluYXRlczsgd3JhcHBlciBmb3IgZ2V0U3RhZmZJZEJ5Q29vcmRzLCBidXRcbiAqICAgcmV0dXJucyB0aGUgZWxlbWVudCwgbm90IHRoZSBJRFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhZmZCeUNvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBTVkdHRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBzdGFmZklkID0gZ2V0U3RhZmZJZEJ5Q29vcmRzKGNsaWVudFgsIGNsaWVudFkpO1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7c3RhZmZJZH1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT3V0T2ZTVkdCb3VuZHMgKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJnSW1nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxTVkdJbWFnZUVsZW1lbnQ+KCcjYmdpbWcnKTtcbiAgXG4gIHJldHVybiAoXG4gICAgeCA8PSAwIHx8IHggPj0gTnVtYmVyKGJnSW1nLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSkgfHxcbiAgICB5IDw9IDAgfHwgeSA+PSBOdW1iZXIoYmdJbWcuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBHZXQgYm91bmRpbmcgYm94IChscngsIGxyeSwgdWx4LCB1bHkpIG9mIGEgZ2x5cGgsIHdoaWNoXG4gKiBpcyBhIDx1c2U+IGVsZW1lbnQgaW4gdGhlIFNWR1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2x5cGhCQm94IChnOiBTVkdSZWN0RWxlbWVudCB8IFNWR1VzZUVsZW1lbnQpOiBCQm94IHtcbiAgY29uc3QgcmVjdCA9IChnLnRhZ05hbWUgPT0gJ3JlY3QnKSA/IGcuZ2V0QkJveCgpIDogKGcucGFyZW50Tm9kZSBhcyBTVkdHRWxlbWVudCkuZ2V0QkJveCgpO1xuXG4gIHJldHVybiB7XG4gICAgdWx4OiByZWN0LngsXG4gICAgdWx5OiByZWN0LnksXG4gICAgbHJ4OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGxyeTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfTtcbn1cblxuIiwiKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBOb2RlL0NvbW1vbkpTXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRFxuICAgICAgICBkZWZpbmUoZmFjdG9yeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzICh3aXRoIHN1cHBvcnQgZm9yIHdlYiB3b3JrZXJzKVxuICAgICAgICB2YXIgZ2xvYjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZ2xvYiA9IHdpbmRvdztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZ2xvYiA9IHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICBnbG9iLlNwYXJrTUQ1ID0gZmFjdG9yeSgpO1xuICAgIH1cbn0oZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuXG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLypcbiAgICAgKiBGYXN0ZXN0IG1kNSBpbXBsZW1lbnRhdGlvbiBhcm91bmQgKEpLTSBtZDUpLlxuICAgICAqIENyZWRpdHM6IEpvc2VwaCBNeWVyc1xuICAgICAqXG4gICAgICogQHNlZSBodHRwOi8vd3d3Lm15ZXJzZGFpbHkub3JnL2pvc2VwaC9qYXZhc2NyaXB0L21kNS10ZXh0Lmh0bWxcbiAgICAgKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL21kNS1zaG9vdG91dC83XG4gICAgICovXG5cbiAgICAvKiB0aGlzIGZ1bmN0aW9uIGlzIG11Y2ggZmFzdGVyLFxuICAgICAgc28gaWYgcG9zc2libGUgd2UgdXNlIGl0LiBTb21lIElFc1xuICAgICAgYXJlIHRoZSBvbmx5IG9uZXMgSSBrbm93IG9mIHRoYXRcbiAgICAgIG5lZWQgdGhlIGlkaW90aWMgc2Vjb25kIGZ1bmN0aW9uLFxuICAgICAgZ2VuZXJhdGVkIGJ5IGFuIGlmIGNsYXVzZS4gICovXG4gICAgdmFyIGFkZDMyID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIChhICsgYikgJiAweEZGRkZGRkZGO1xuICAgIH0sXG4gICAgICAgIGhleF9jaHIgPSBbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnXTtcblxuXG4gICAgZnVuY3Rpb24gY21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgICAgICAgYSA9IGFkZDMyKGFkZDMyKGEsIHEpLCBhZGQzMih4LCB0KSk7XG4gICAgICAgIHJldHVybiBhZGQzMigoYSA8PCBzKSB8IChhID4+PiAoMzIgLSBzKSksIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNWN5Y2xlKHgsIGspIHtcbiAgICAgICAgdmFyIGEgPSB4WzBdLFxuICAgICAgICAgICAgYiA9IHhbMV0sXG4gICAgICAgICAgICBjID0geFsyXSxcbiAgICAgICAgICAgIGQgPSB4WzNdO1xuXG4gICAgICAgIGEgKz0gKGIgJiBjIHwgfmIgJiBkKSArIGtbMF0gLSA2ODA4NzY5MzYgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1sxXSAtIDM4OTU2NDU4NiB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1syXSArIDYwNjEwNTgxOSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1szXSAtIDEwNDQ1MjUzMzAgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG4gICAgICAgIGEgKz0gKGIgJiBjIHwgfmIgJiBkKSArIGtbNF0gLSAxNzY0MTg4OTcgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1s1XSArIDEyMDAwODA0MjYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbNl0gLSAxNDczMjMxMzQxIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzddIC0gNDU3MDU5ODMgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG4gICAgICAgIGEgKz0gKGIgJiBjIHwgfmIgJiBkKSArIGtbOF0gKyAxNzcwMDM1NDE2IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbOV0gLSAxOTU4NDE0NDE3IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzEwXSAtIDQyMDYzIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzExXSAtIDE5OTA0MDQxNjIgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG4gICAgICAgIGEgKz0gKGIgJiBjIHwgfmIgJiBkKSArIGtbMTJdICsgMTgwNDYwMzY4MiB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzEzXSAtIDQwMzQxMTAxIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzE0XSAtIDE1MDIwMDIyOTAgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbMTVdICsgMTIzNjUzNTMyOSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjIgfCBiID4+PiAxMCkgKyBjIHwgMDtcblxuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzFdIC0gMTY1Nzk2NTEwIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbNl0gLSAxMDY5NTAxNjMyIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTFdICsgNjQzNzE3NzEzIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzBdIC0gMzczODk3MzAyIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzVdIC0gNzAxNTU4NjkxIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTBdICsgMzgwMTYwODMgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDkgfCBkID4+PiAyMykgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGIgfCBhICYgfmIpICsga1sxNV0gLSA2NjA0NzgzMzUgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE0IHwgYyA+Pj4gMTgpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBhIHwgZCAmIH5hKSArIGtbNF0gLSA0MDU1Mzc4NDggfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIwIHwgYiA+Pj4gMTIpICsgYyB8IDA7XG4gICAgICAgIGEgKz0gKGIgJiBkIHwgYyAmIH5kKSArIGtbOV0gKyA1Njg0NDY0MzggfCAwO1xuICAgICAgICBhICA9IChhIDw8IDUgfCBhID4+PiAyNykgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGMgfCBiICYgfmMpICsga1sxNF0gLSAxMDE5ODAzNjkwIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbM10gLSAxODczNjM5NjEgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE0IHwgYyA+Pj4gMTgpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBhIHwgZCAmIH5hKSArIGtbOF0gKyAxMTYzNTMxNTAxIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzEzXSAtIDE0NDQ2ODE0NjcgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDUgfCBhID4+PiAyNykgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGMgfCBiICYgfmMpICsga1syXSAtIDUxNDAzNzg0IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbN10gKyAxNzM1MzI4NDczIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzEyXSAtIDE5MjY2MDc3MzQgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIwIHwgYiA+Pj4gMTIpICsgYyB8IDA7XG5cbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbNV0gLSAzNzg1NTggfCAwO1xuICAgICAgICBhICA9IChhIDw8IDQgfCBhID4+PiAyOCkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSBeIGIgXiBjKSArIGtbOF0gLSAyMDIyNTc0NDYzIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1sxMV0gKyAxODM5MDMwNTYyIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNiB8IGMgPj4+IDE2KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjIF4gZCBeIGEpICsga1sxNF0gLSAzNTMwOTU1NiB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1sxXSAtIDE1MzA5OTIwNjAgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDQgfCBhID4+PiAyOCkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSBeIGIgXiBjKSArIGtbNF0gKyAxMjcyODkzMzUzIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1s3XSAtIDE1NTQ5NzYzMiB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTBdIC0gMTA5NDczMDY0MCB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1sxM10gKyA2ODEyNzkxNzQgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDQgfCBhID4+PiAyOCkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSBeIGIgXiBjKSArIGtbMF0gLSAzNTg1MzcyMjIgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzNdIC0gNzIyNTIxOTc5IHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNiB8IGMgPj4+IDE2KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjIF4gZCBeIGEpICsga1s2XSArIDc2MDI5MTg5IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMyB8IGIgPj4+IDkpICsgYyB8IDA7XG4gICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzldIC0gNjQwMzY0NDg3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzEyXSAtIDQyMTgxNTgzNSB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTVdICsgNTMwNzQyNTIwIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNiB8IGMgPj4+IDE2KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjIF4gZCBeIGEpICsga1syXSAtIDk5NTMzODY1MSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuXG4gICAgICAgIGEgKz0gKGMgXiAoYiB8IH5kKSkgKyBrWzBdIC0gMTk4NjMwODQ0IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBrWzddICsgMTEyNjg5MTQxNSB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTAgfCBkID4+PiAyMikgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoYSBeIChkIHwgfmIpKSArIGtbMTRdIC0gMTQxNjM1NDkwNSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbNV0gLSA1NzQzNDA1NSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1sxMl0gKyAxNzAwNDg1NTcxIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBrWzNdIC0gMTg5NDk4NjYwNiB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTAgfCBkID4+PiAyMikgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoYSBeIChkIHwgfmIpKSArIGtbMTBdIC0gMTA1MTUyMyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMV0gLSAyMDU0OTIyNzk5IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMSB8YiA+Pj4gMTEpICsgYyB8IDA7XG4gICAgICAgIGEgKz0gKGMgXiAoYiB8IH5kKSkgKyBrWzhdICsgMTg3MzMxMzM1OSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1sxNV0gLSAzMDYxMTc0NCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTAgfCBkID4+PiAyMikgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoYSBeIChkIHwgfmIpKSArIGtbNl0gLSAxNTYwMTk4MzgwIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNSB8IGMgPj4+IDE3KSArIGQgfCAwO1xuICAgICAgICBiICs9IChkIF4gKGMgfCB+YSkpICsga1sxM10gKyAxMzA5MTUxNjQ5IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMSB8YiA+Pj4gMTEpICsgYyB8IDA7XG4gICAgICAgIGEgKz0gKGMgXiAoYiB8IH5kKSkgKyBrWzRdIC0gMTQ1NTIzMDcwIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBrWzExXSAtIDExMjAyMTAzNzkgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzJdICsgNzE4Nzg3MjU5IHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNSB8IGMgPj4+IDE3KSArIGQgfCAwO1xuICAgICAgICBiICs9IChkIF4gKGMgfCB+YSkpICsga1s5XSAtIDM0MzQ4NTU1MSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfCBiID4+PiAxMSkgKyBjIHwgMDtcblxuICAgICAgICB4WzBdID0gYSArIHhbMF0gfCAwO1xuICAgICAgICB4WzFdID0gYiArIHhbMV0gfCAwO1xuICAgICAgICB4WzJdID0gYyArIHhbMl0gfCAwO1xuICAgICAgICB4WzNdID0gZCArIHhbM10gfCAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNWJsayhzKSB7XG4gICAgICAgIHZhciBtZDVibGtzID0gW10sXG4gICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gcy5jaGFyQ29kZUF0KGkpICsgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgKyAocy5jaGFyQ29kZUF0KGkgKyAyKSA8PCAxNikgKyAocy5jaGFyQ29kZUF0KGkgKyAzKSA8PCAyNCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1kNWJsa3M7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWQ1YmxrX2FycmF5KGEpIHtcbiAgICAgICAgdmFyIG1kNWJsa3MgPSBbXSxcbiAgICAgICAgICAgIGk7IC8qIEFuZHkgS2luZyBzYWlkIGRvIGl0IHRoaXMgd2F5LiAqL1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSA0KSB7XG4gICAgICAgICAgICBtZDVibGtzW2kgPj4gMl0gPSBhW2ldICsgKGFbaSArIDFdIDw8IDgpICsgKGFbaSArIDJdIDw8IDE2KSArIChhW2kgKyAzXSA8PCAyNCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1kNWJsa3M7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWQ1MShzKSB7XG4gICAgICAgIHZhciBuID0gcy5sZW5ndGgsXG4gICAgICAgICAgICBzdGF0ZSA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgICB0YWlsLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBuOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrKHMuc3Vic3RyaW5nKGkgLSA2NCwgaSkpKTtcbiAgICAgICAgfVxuICAgICAgICBzID0gcy5zdWJzdHJpbmcoaSAtIDY0KTtcbiAgICAgICAgbGVuZ3RoID0gcy5sZW5ndGg7XG4gICAgICAgIHRhaWwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdGFpbFtpID4+IDJdIHw9IHMuY2hhckNvZGVBdChpKSA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgfVxuICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgaWYgKGkgPiA1NSkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICB0YWlsW2ldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJld2FyZSB0aGF0IHRoZSBmaW5hbCBsZW5ndGggbWlnaHQgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0XG4gICAgICAgIHRtcCA9IG4gKiA4O1xuICAgICAgICB0bXAgPSB0bXAudG9TdHJpbmcoMTYpLm1hdGNoKC8oLio/KSguezAsOH0pJC8pO1xuICAgICAgICBsbyA9IHBhcnNlSW50KHRtcFsyXSwgMTYpO1xuICAgICAgICBoaSA9IHBhcnNlSW50KHRtcFsxXSwgMTYpIHx8IDA7XG5cbiAgICAgICAgdGFpbFsxNF0gPSBsbztcbiAgICAgICAgdGFpbFsxNV0gPSBoaTtcblxuICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDUxX2FycmF5KGEpIHtcbiAgICAgICAgdmFyIG4gPSBhLmxlbmd0aCxcbiAgICAgICAgICAgIHN0YXRlID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgICAgIHRhaWwsXG4gICAgICAgICAgICB0bXAsXG4gICAgICAgICAgICBsbyxcbiAgICAgICAgICAgIGhpO1xuXG4gICAgICAgIGZvciAoaSA9IDY0OyBpIDw9IG47IGkgKz0gNjQpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCBtZDVibGtfYXJyYXkoYS5zdWJhcnJheShpIC0gNjQsIGkpKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3Qgc3VyZSBpZiBpdCBpcyBhIGJ1ZywgaG93ZXZlciBJRTEwIHdpbGwgYWx3YXlzIHByb2R1Y2UgYSBzdWIgYXJyYXkgb2YgbGVuZ3RoIDFcbiAgICAgICAgLy8gY29udGFpbmluZyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXJlbnQgYXJyYXkgaWYgdGhlIHN1YiBhcnJheSBzcGVjaWZpZWQgc3RhcnRzXG4gICAgICAgIC8vIGJleW9uZCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJlbnQgYXJyYXkgLSB3ZWlyZC5cbiAgICAgICAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy83NzE0NTIvdHlwZWQtYXJyYXktc3ViYXJyYXktaXNzdWVcbiAgICAgICAgYSA9IChpIC0gNjQpIDwgbiA/IGEuc3ViYXJyYXkoaSAtIDY0KSA6IG5ldyBVaW50OEFycmF5KDApO1xuXG4gICAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBhW2ldIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIGlmIChpID4gNTUpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1pZ2h0IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdFxuICAgICAgICB0bXAgPSBuICogODtcbiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtcbiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwO1xuXG4gICAgICAgIHRhaWxbMTRdID0gbG87XG4gICAgICAgIHRhaWxbMTVdID0gaGk7XG5cbiAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaGV4KG4pIHtcbiAgICAgICAgdmFyIHMgPSAnJyxcbiAgICAgICAgICAgIGo7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqICs9IDEpIHtcbiAgICAgICAgICAgIHMgKz0gaGV4X2NoclsobiA+PiAoaiAqIDggKyA0KSkgJiAweDBGXSArIGhleF9jaHJbKG4gPj4gKGogKiA4KSkgJiAweDBGXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoZXgoeCkge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHhbaV0gPSByaGV4KHhbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4LmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGZhc3QgYWRkMzIgZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQuLlxuICAgIGlmIChoZXgobWQ1MSgnaGVsbG8nKSkgIT09ICc1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MicpIHtcbiAgICAgICAgYWRkMzIgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgICAgdmFyIGxzdyA9ICh4ICYgMHhGRkZGKSArICh5ICYgMHhGRkZGKSxcbiAgICAgICAgICAgICAgICBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgICAgICAgICAgIHJldHVybiAobXN3IDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogQXJyYXlCdWZmZXIgc2xpY2UgcG9seWZpbGwuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90dGF1YmVydC9ub2RlLWFycmF5YnVmZmVyLXNsaWNlXG4gICAgICovXG5cbiAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiAhQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlKSB7XG4gICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBjbGFtcCh2YWwsIGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgfCAwKSB8fCAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHZhbCArIGxlbmd0aCwgMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbCwgbGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSBjbGFtcChmcm9tLCBsZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBlbmQgPSBsZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIG51bSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlQXJyYXk7XG5cbiAgICAgICAgICAgICAgICBpZiAodG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBjbGFtcCh0bywgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVnaW4gPiBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBudW0gPSBlbmQgLSBiZWdpbjtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgQXJyYXlCdWZmZXIobnVtKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheSA9IG5ldyBVaW50OEFycmF5KHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICBzb3VyY2VBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMsIGJlZ2luLCBudW0pO1xuICAgICAgICAgICAgICAgIHRhcmdldEFycmF5LnNldChzb3VyY2VBcnJheSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlcnMuXG4gICAgICovXG5cbiAgICBmdW5jdGlvbiB0b1V0Zjgoc3RyKSB7XG4gICAgICAgIGlmICgvW1xcdTAwODAtXFx1RkZGRl0vLnRlc3Qoc3RyKSkge1xuICAgICAgICAgICAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1dGY4U3RyMkFycmF5QnVmZmVyKHN0ciwgcmV0dXJuVUludDhBcnJheSkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCxcbiAgICAgICAgICAgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgpLFxuICAgICAgICAgICBhcnIgPSBuZXcgVWludDhBcnJheShidWZmKSxcbiAgICAgICAgICAgaTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGFycltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblVJbnQ4QXJyYXkgPyBhcnIgOiBidWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFycmF5QnVmZmVyMlV0ZjhTdHIoYnVmZikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheShidWZmKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoZmlyc3QsIHNlY29uZCwgcmV0dXJuVUludDhBcnJheSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3QuYnl0ZUxlbmd0aCArIHNlY29uZC5ieXRlTGVuZ3RoKTtcblxuICAgICAgICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KGZpcnN0KSk7XG4gICAgICAgIHJlc3VsdC5zZXQobmV3IFVpbnQ4QXJyYXkoc2Vjb25kKSwgZmlyc3QuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblVJbnQ4QXJyYXkgPyByZXN1bHQgOiByZXN1bHQuYnVmZmVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhleFRvQmluYXJ5U3RyaW5nKGhleCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSBbXSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGhleC5sZW5ndGgsXG4gICAgICAgICAgICB4O1xuXG4gICAgICAgIGZvciAoeCA9IDA7IHggPCBsZW5ndGggLSAxOyB4ICs9IDIpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2gocGFyc2VJbnQoaGV4LnN1YnN0cih4LCAyKSwgMTYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgYnl0ZXMpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogU3BhcmtNRDUgT09QIGltcGxlbWVudGF0aW9uLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUsIG90aGVyd2lzZSB1c2UgdGhlXG4gICAgICogc3RhdGljIG1ldGhvZHMgaW5zdGVhZC5cbiAgICAgKi9cblxuICAgIGZ1bmN0aW9uIFNwYXJrTUQ1KCkge1xuICAgICAgICAvLyBjYWxsIHJlc2V0IHRvIGluaXQgdGhlIGluc3RhbmNlXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmRzIGEgc3RyaW5nLlxuICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgYW4gdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gYmUgYXBwZW5kZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB0byB1dGY4IGJ5dGVzIGlmIG5lY2Vzc2FyeVxuICAgICAgICAvLyBUaGVuIGFwcGVuZCBhcyBiaW5hcnlcbiAgICAgICAgdGhpcy5hcHBlbmRCaW5hcnkodG9VdGY4KHN0cikpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmRzIGEgYmluYXJ5IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyBUaGUgYmluYXJ5IHN0cmluZyB0byBiZSBhcHBlbmRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDV9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5wcm90b3R5cGUuYXBwZW5kQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnRzKSB7XG4gICAgICAgIHRoaXMuX2J1ZmYgKz0gY29udGVudHM7XG4gICAgICAgIHRoaXMuX2xlbmd0aCArPSBjb250ZW50cy5sZW5ndGg7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuX2J1ZmYubGVuZ3RoLFxuICAgICAgICAgICAgaTtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIG1kNWJsayh0aGlzLl9idWZmLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9idWZmID0gdGhpcy5fYnVmZi5zdWJzdHJpbmcoaSAtIDY0KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluaXNoZXMgdGhlIGluY3JlbWVudGFsIGNvbXB1dGF0aW9uLCByZXNldGluZyB0aGUgaW50ZXJuYWwgc3RhdGUgYW5kXG4gICAgICogcmV0dXJuaW5nIHRoZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJhdyBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKHJhdykge1xuICAgICAgICB2YXIgYnVmZiA9IHRoaXMuX2J1ZmYsXG4gICAgICAgICAgICBsZW5ndGggPSBidWZmLmxlbmd0aCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgcmV0O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdGFpbFtpID4+IDJdIHw9IGJ1ZmYuY2hhckNvZGVBdChpKSA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZpbmlzaCh0YWlsLCBsZW5ndGgpO1xuICAgICAgICByZXQgPSBoZXgodGhpcy5faGFzaCk7XG5cbiAgICAgICAgaWYgKHJhdykge1xuICAgICAgICAgICAgcmV0ID0gaGV4VG9CaW5hcnlTdHJpbmcocmV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wdXRhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9idWZmID0gJyc7XG4gICAgICAgIHRoaXMuX2xlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX2hhc2ggPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wdXRhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYnVmZjogdGhpcy5fYnVmZixcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5fbGVuZ3RoLFxuICAgICAgICAgICAgaGFzaDogdGhpcy5faGFzaC5zbGljZSgpXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wdXRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBUaGUgc3RhdGVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2J1ZmYgPSBzdGF0ZS5idWZmO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2hhc2ggPSBzdGF0ZS5oYXNoO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBtZW1vcnkgdXNlZCBieSB0aGUgaW5jcmVtZW50YWwgYnVmZmVyIGFuZCBvdGhlciBhZGRpdGlvbmFsXG4gICAgICogcmVzb3VyY2VzLiBJZiB5b3UgcGxhbiB0byB1c2UgdGhlIGluc3RhbmNlIGFnYWluLCB1c2UgcmVzZXQgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBTcGFya01ENS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2hhc2g7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9idWZmO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGVuZ3RoO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2ggdGhlIGZpbmFsIGNhbGN1bGF0aW9uIGJhc2VkIG9uIHRoZSB0YWlsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gIHRhaWwgICBUaGUgdGFpbCAod2lsbCBiZSBtb2RpZmllZClcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlbWFpbmluZyBidWZmZXJcbiAgICAgKi9cbiAgICBTcGFya01ENS5wcm90b3R5cGUuX2ZpbmlzaCA9IGZ1bmN0aW9uICh0YWlsLCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGkgPSBsZW5ndGgsXG4gICAgICAgICAgICB0bXAsXG4gICAgICAgICAgICBsbyxcbiAgICAgICAgICAgIGhpO1xuXG4gICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICBpZiAoaSA+IDU1KSB7XG4gICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCB0YWlsKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyB0aGUgZmluYWwgY29tcHV0YXRpb24gYmFzZWQgb24gdGhlIHRhaWwgYW5kIGxlbmd0aFxuICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1heSBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXRcbiAgICAgICAgdG1wID0gdGhpcy5fbGVuZ3RoICogODtcbiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtcbiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwO1xuXG4gICAgICAgIHRhaWxbMTRdID0gbG87XG4gICAgICAgIHRhaWxbMTVdID0gaGk7XG4gICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIHRhaWwpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgbWQ1IGhhc2ggb24gYSBzdHJpbmcuXG4gICAgICogQSBjb252ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCBpZiB1dGY4IHN0cmluZyBpcyBkZXRlY3RlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgc3RyIFRoZSBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddIFRydWUgdG8gZ2V0IHRoZSByYXcgc3RyaW5nLCBmYWxzZSB0byBnZXQgdGhlIGhleCBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHJlc3VsdFxuICAgICAqL1xuICAgIFNwYXJrTUQ1Lmhhc2ggPSBmdW5jdGlvbiAoc3RyLCByYXcpIHtcbiAgICAgICAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB0byB1dGY4IGJ5dGVzIGlmIG5lY2Vzc2FyeVxuICAgICAgICAvLyBUaGVuIGNvbXB1dGUgaXQgdXNpbmcgdGhlIGJpbmFyeSBmdW5jdGlvblxuICAgICAgICByZXR1cm4gU3BhcmtNRDUuaGFzaEJpbmFyeSh0b1V0Zjgoc3RyKSwgcmF3KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGEgYmluYXJ5IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgY29udGVudCBUaGUgYmluYXJ5IHN0cmluZ1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3Jhd10gICAgIFRydWUgdG8gZ2V0IHRoZSByYXcgc3RyaW5nLCBmYWxzZSB0byBnZXQgdGhlIGhleCBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHJlc3VsdFxuICAgICAqL1xuICAgIFNwYXJrTUQ1Lmhhc2hCaW5hcnkgPSBmdW5jdGlvbiAoY29udGVudCwgcmF3KSB7XG4gICAgICAgIHZhciBoYXNoID0gbWQ1MShjb250ZW50KSxcbiAgICAgICAgICAgIHJldCA9IGhleChoYXNoKTtcblxuICAgICAgICByZXR1cm4gcmF3ID8gaGV4VG9CaW5hcnlTdHJpbmcocmV0KSA6IHJldDtcbiAgICB9O1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBTcGFya01ENSBPT1AgaW1wbGVtZW50YXRpb24gZm9yIGFycmF5IGJ1ZmZlcnMuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBjbGFzcyB0byBwZXJmb3JtIGFuIGluY3JlbWVudGFsIG1kNSBPTkxZIGZvciBhcnJheSBidWZmZXJzLlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjYWxsIHJlc2V0IHRvIGluaXQgdGhlIGluc3RhbmNlXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhbiBhcnJheSBidWZmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnIgVGhlIGFycmF5IHRvIGJlIGFwcGVuZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENS5BcnJheUJ1ZmZlcn0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gICAgICAgIHZhciBidWZmID0gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnModGhpcy5fYnVmZi5idWZmZXIsIGFyciwgdHJ1ZSksXG4gICAgICAgICAgICBsZW5ndGggPSBidWZmLmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgdGhpcy5fbGVuZ3RoICs9IGFyci5ieXRlTGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDY0OyBpIDw9IGxlbmd0aDsgaSArPSA2NCkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgbWQ1YmxrX2FycmF5KGJ1ZmYuc3ViYXJyYXkoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYnVmZiA9IChpIC0gNjQpIDwgbGVuZ3RoID8gbmV3IFVpbnQ4QXJyYXkoYnVmZi5idWZmZXIuc2xpY2UoaSAtIDY0KSkgOiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluaXNoZXMgdGhlIGluY3JlbWVudGFsIGNvbXB1dGF0aW9uLCByZXNldGluZyB0aGUgaW50ZXJuYWwgc3RhdGUgYW5kXG4gICAgICogcmV0dXJuaW5nIHRoZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJhdyBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKHJhdykge1xuICAgICAgICB2YXIgYnVmZiA9IHRoaXMuX2J1ZmYsXG4gICAgICAgICAgICBsZW5ndGggPSBidWZmLmxlbmd0aCxcbiAgICAgICAgICAgIHRhaWwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcmV0O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdGFpbFtpID4+IDJdIHw9IGJ1ZmZbaV0gPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0ID0gaGV4KHRoaXMuX2hhc2gpO1xuXG4gICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgIHJldCA9IGhleFRvQmluYXJ5U3RyaW5nKHJldCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENS5BcnJheUJ1ZmZlcn0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYnVmZiA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9oYXNoID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gU3BhcmtNRDUucHJvdG90eXBlLmdldFN0YXRlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgLy8gQ29udmVydCBidWZmZXIgdG8gYSBzdHJpbmdcbiAgICAgICAgc3RhdGUuYnVmZiA9IGFycmF5QnVmZmVyMlV0ZjhTdHIoc3RhdGUuYnVmZik7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENS5BcnJheUJ1ZmZlcn0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBidWZmZXJcbiAgICAgICAgc3RhdGUuYnVmZiA9IHV0ZjhTdHIyQXJyYXlCdWZmZXIoc3RhdGUuYnVmZiwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZS5jYWxsKHRoaXMsIHN0YXRlKTtcbiAgICB9O1xuXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBTcGFya01ENS5wcm90b3R5cGUuZGVzdHJveTtcblxuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5fZmluaXNoID0gU3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2g7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgbWQ1IGhhc2ggb24gYW4gYXJyYXkgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyIFRoZSBhcnJheSBidWZmZXJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59ICAgICBbcmF3XSBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggb25lXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5oYXNoID0gZnVuY3Rpb24gKGFyciwgcmF3KSB7XG4gICAgICAgIHZhciBoYXNoID0gbWQ1MV9hcnJheShuZXcgVWludDhBcnJheShhcnIpKSxcbiAgICAgICAgICAgIHJldCA9IGhleChoYXNoKTtcblxuICAgICAgICByZXR1cm4gcmF3ID8gaGV4VG9CaW5hcnlTdHJpbmcocmV0KSA6IHJldDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNwYXJrTUQ1O1xufSkpO1xuIiwiLyoqXG4gKiBGb3JtYXRzIHJhdyBVVUlEIGRhdGEgaW50byB0aGUgcHJvcGVyIHN0cmluZyBmb3JtYXQuXG4gKiBAcGFyYW0gZGF0YSAtIFJhdyBVVUlEIGRhdGEuXG4gKiBAcmV0dXJucyBGb3JtYXR0ZWQgVVVJRCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHVpbnQ4VG9VdWlkIChkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgaWYgKGRhdGEubGVuZ3RoICE9PSAxNikge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNiIChwcmV2aW91czogc3RyaW5nLCBjdXJyZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcmV2aW91cyArIGN1cnJlbnQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH1cblxuICByZXR1cm4gZGF0YS5zbGljZSgwLCA0KS5yZWR1Y2UoY2IsICcnKSArXG4gICAgJy0nICsgZGF0YS5zbGljZSg0LCA2KS5yZWR1Y2UoY2IsICcnKSArXG4gICAgJy0nICsgZGF0YS5zbGljZSg2LCA4KS5yZWR1Y2UoY2IsICcnKSArXG4gICAgJy0nICsgZGF0YS5zbGljZSg4LCAxMCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoMTApLnJlZHVjZShjYiwgJycpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIEEgW3ZlcnNpb24gNCBVVUlEXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllciNWZXJzaW9uXzRfKHJhbmRvbSkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZHY0ICgpOiBzdHJpbmcge1xuICAvLyBDaGVjayBmb3IgY3J5cHRvIEFQSVxuICBpZiAod2luZG93LmNyeXB0byA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVpbnQ4VG9VdWlkKG5ldyBVaW50OEFycmF5KDE2KSk7XG4gIH1cblxuICAvLyBHZXQgMTYgb2N0ZXRzIGZvciBVVUlEXG4gIGNvbnN0IG9jdGV0cyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgY29uc3QgbW9kaWZpZXJzID0gVWludDhBcnJheS5mcm9tKFtcbiAgICBwYXJzZUludCgnMDEwMDAwMDAnLCAyKSwgIC8vIFZlcnNpb24gYml0cyAoNCA9PiAwMTAwKVxuICAgIHBhcnNlSW50KCcxMDAwMDAwMCcsIDIpLCAgLy8gVmFyaWFudCBiaXRzICgxMHgpXG4gICAgcGFyc2VJbnQoJzAwMDAxMTExJywgMiksICAvLyBNYXNrIHRvIHplcm8gaGlnaGVyIGJpdHMsIHZlcnNpb25cbiAgICBwYXJzZUludCgnMDAxMTExMTEnLCAyKSAgIC8vIE1hc2sgdG8gemVybyBoaWdoZXIgYml0cywgdmFyaWFudFxuICBdKTtcbiAgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMob2N0ZXRzKTtcbiAgLy8gU2V0IHZlcnNpb24gYml0cyBhbmQgdmFyaWFudCBiaXRzXG4gIG9jdGV0c1s2XSA9IChvY3RldHNbNl0gJiBtb2RpZmllcnNbMl0pIHwgbW9kaWZpZXJzWzBdO1xuICBvY3RldHNbOF0gPSAob2N0ZXRzWzhdICYgbW9kaWZpZXJzWzNdKSB8IG1vZGlmaWVyc1sxXTtcblxuICByZXR1cm4gdWludDhUb1V1aWQob2N0ZXRzKTtcbn1cbiIsImltcG9ydCB7IEdyb3VwaW5nVHlwZSB9IGZyb20gJy4uL1R5cGVzJztcblxuLyoqXG4gKiBBZGFwdGVkIGZyb20gY29sb3IgcGFsZXR0ZSBmcm9tIEZpZ3VyZSAyIChDb2xvcnMgb3B0aW1pemVkIGZvciBjb2xvci1ibGluZFxuICogaW5kaXZpZHVhbHMpIGZyb21cbiAqIFtcIlBvaW50cyBvZiB2aWV3OiBDb2xvciBibGluZG5lc3NcIiBieSBCYW5nIFdvbmcgcHVibGlzaGVkIGluIE5hdHVyZSBNZXRob2RzIHZvbHVtZSA4IG9uIDI3IE1heSAyMDExXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL25tZXRoLjE2MTg/V1QuZWNfaWQ9Tk1FVEgtMjAxMTA2KVxuICovXG5jb25zdCBDb2xvclBhbGV0dGU6IHN0cmluZ1tdID0gW1xuICAncmdiKDIzMCwgMTU5LCAwKScsXG4gICdyZ2IoODYsIDE4MCwgMjMzKScsXG4gICdyZ2IoMCwgMTU4LCAxMTUpJyxcbiAgJ3JnYigyNDAsIDIyOCwgNjYpJyxcbiAgJ3JnYigwLCAxMTQsIDE3OCknLFxuICAncmdiKDIxMywgOTQsIDApJyxcbiAgJ3JnYigyMDQsIDEyMSwgMTY3KSdcbl07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBoaWdobGlnaHQgZnJvbSBhIHN0YWZmLlxuICogQHBhcmFtIHN0YWZmIElmIHVuZGVmaW5lZCwgdGhlIGFsbCBzdGF2ZXMgYXJlIHVuaGlnaGxpZ2h0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmhpZ2hsaWdodChzdGFmZj86IFNWR0dFbGVtZW50KTogdm9pZCB7XG4gIGxldCBjaGlsZHJlbjogTm9kZUxpc3RPZjxFbGVtZW50PjtcbiAgaWYgKHN0YWZmKSB7XG4gICAgY2hpbGRyZW4gPSBzdGFmZi5xdWVyeVNlbGVjdG9yQWxsKCc6bm90KC5zZWxlY3RlZCkgLmhpZ2hsaWdodGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCc6bm90KC5zZWxlY3RlZCkgLmhpZ2hsaWdodGVkJyk7XG4gIH1cbiAgY2hpbGRyZW4uZm9yRWFjaChlbGVtID0+IHtcbiAgICBpZiAoZWxlbS50YWdOYW1lID09PSAncGF0aCcgJiYgIWVsZW0uY2xvc2VzdCgnLnN0YWZmJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBlbGVtLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJyMwMDAwMDAnKTtcbiAgICB9IGVsc2UgaWYgKGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykgJiYgIWVsZW0uY2xvc2VzdCgnLnN0YWZmJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBlbGVtLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJyMwMDAwMDAnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSgnZmlsbCcpO1xuICAgICAgbGV0IHJlY3RzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZWN0cyA9IGVsZW0uY2xvc2VzdCgnLnN5bGxhYmxlJykucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlY3RzID0gW10gYXMgdW5rbm93biBhcyBOb2RlTGlzdE9mPEVsZW1lbnQ+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWN0OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBpZiAocmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSB8fFxuICAgICAgICAgIHJlY3QuY2xvc2VzdCgnLnN5bCcpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICAgIC8vIHJlY3QuY2xvc2VzdCgnLmxheWVyJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICAgICl7XG4gICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICdibHVlJztcbiAgICAgICAgfVxuICAgICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGhpZ2hsaWdodCBmcm9tIGVhY2ggc3RhZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldFN0YWZmSGlnaGxpZ2h0KCk6IHZvaWQge1xuICB1bmhpZ2hsaWdodCgpO1xufVxuXG4vKipcbiAqIFVuc2V0IGhpZ2hsaWdodCBmb3IgYWxsIGdyb3VwaW5nIHR5cGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldEdyb3VwaW5nSGlnaGxpZ2h0KCk6IHZvaWQge1xuICB1bnNldFN0YWZmSGlnaGxpZ2h0KCk7XG4gIGNvbnN0IGhpZ2hsaWdodGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHRlZCcpKVxuICAgIC5maWx0ZXIoKGVsZW06IEhUTUxFbGVtZW50KSA9PiAhZWxlbS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSk7XG4gIGhpZ2hsaWdodGVkLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgZWxlbS5zZXRBdHRyaWJ1dGUoJyNkMDAnLCBudWxsKTtcbiAgICBsZXQgcmVjdHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgaWYgKCFyZWN0cy5sZW5ndGgpIHtcbiAgICAgIGlmIChlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpICE9PSBudWxsKSB7XG4gICAgICAgIHJlY3RzID0gZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKS5xdWVyeVNlbGVjdG9yQWxsKCdzeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlY3RzLmZvckVhY2goZnVuY3Rpb24gKHJlY3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgICBpZiAocmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHwgXG4gICAgICByZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICl7XG4gICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICdibHVlJztcbiAgICAgIH1cbiAgICAgIHJlY3QuY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgICB9KTtcbiAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCdzeWxUZXh0UmVjdC1kaXNwbGF5JykuZm9yRWFjaChyZWN0ID0+IHtcbiAgICAgIHJlY3QuY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgICB9KTtcbiAgfSk7XG4gIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSkuZm9yRWFjaCgoZWwpID0+IHsgZWwuc2V0QXR0cmlidXRlKCdmaWxsJywgJycpOyB9KTtcbn1cblxuLyoqXG4gKiBIaWdobGlnaHQgYSBzdGFmZiBhIGNlcnRhaW4gY29sb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWdobGlnaHQoc3RhZmY6IFNWR0dFbGVtZW50LCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShzdGFmZi5jaGlsZHJlbik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChjaGlsZC50YWdOYW1lID09PSAncGF0aCcpIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgY29sb3IpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykpIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgY29sb3IpO1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMzBweCcpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5sZW5ndGggJiYgY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSB7XG4gICAgICBBcnJheS5mcm9tKGNoaWxkLmNoaWxkcmVuKS5maWx0ZXIoZWwgPT4gZWwucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChjY2hpbGQgPT4geyBjaGlsZHJlbi5wdXNoKGNjaGlsZCk7IH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3Jlc2l6ZVBvaW50JykgfHwgY2hpbGQuaWQgPT09ICdyZXNpemVSZWN0JyB8fCBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3JvdGF0ZVBvaW50JykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnbGF5ZXInKSkge1xuICAgICAgQXJyYXkuZnJvbShjaGlsZC5jaGlsZHJlbikuZm9yRWFjaChjY2hpbGQgPT4geyBjaGlsZHJlbi5wdXNoKGNjaGlsZCk7IH0pO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJykubGVuZ3RoICYmXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHQtc2VsZWN0ZWQnKVswXS5pZCA9PT0gJ2hpZ2hsaWdodC1uZXVtZSdcbiAgICAgICYmIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKSkge1xuICAgICAgQXJyYXkuZnJvbShjaGlsZC5jaGlsZHJlbikuZmlsdGVyKGVsID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSkuZm9yRWFjaChjY2hpbGQgPT4geyBjaGlsZHJlbi5wdXNoKGNjaGlsZCk7IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICBsZXQgcmVjdHMgPSBjaGlsZC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZWN0cyA9IGNoaWxkLmNsb3Nlc3QoJy5zeWxsYWJsZScpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWN0cyA9IFtdIGFzIHVua25vd24gYXMgTm9kZUxpc3RPZjxFbGVtZW50PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCEocmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICAgIC8vIHJlY3QuY2xvc2VzdCgnLmxheWVyJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICAgICkpIHtcbiAgICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSBjb2xvcjtcbiAgICAgICAgICByZWN0LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjaGlsZC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpO1xuICB9XG4gIGxldCB3aWR0aCwgaGVpZ2h0O1xuICAvKnRyeSB7XG4gICAgd2lkdGggPSBOdW1iZXIoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGl2ZS1wYWdlJykucXVlcnlTZWxlY3Rvcignc3ZnJykuZ2V0QXR0cmlidXRlKCd3aWR0aCcpLnNwbGl0KCdweCcpWzBdKTtcbiAgICBoZWlnaHQgPSBOdW1iZXIoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGl2ZS1wYWdlJykucXVlcnlTZWxlY3Rvcignc3ZnJykuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKS5zcGxpdCgncHgnKVswXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmRlYnVnKGUpO1xuICB9Ki9cbiAgbGV0IHN0cm9rZTogc3RyaW5nO1xuICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCAmJiBoZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGlkayBsb29rcyBnb29kIDonKVxuICAgIC8vIFRPRE8gZmluZCBhIGJldHRlciB3YXkgb2YgY2FsY3VsYXRpbmcgdGhpcyBhcyB0aGlzIGFjdHVhbGx5IGRvZXNuJ3Qgd29yayBhcyB3ZWxsIGFzIDMwcHhcbiAgICBzdHJva2UgPSAod2lkdGggKiBoZWlnaHQgLyAxMDAwMDAwKS50b1N0cmluZygpO1xuICB9XG4gIGVsc2Uge1xuICAgIHN0cm9rZSA9ICczMHB4JztcbiAgfVxuICBzdGFmZi5xdWVyeVNlbGVjdG9yQWxsKCcubmMsIC5jdXN0b3MsIC5jbGVmLCAuYWNjaWQnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdibGFjaycpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgc3Ryb2tlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGVhY2ggc3RhZmYgYSBkaWZmZXJlbnQgY29sb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTdGFmZkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdmVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzdGFmZicpKSBhcyBTVkdHRWxlbWVudFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXZlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN0YWZmQ29sb3IgPSBDb2xvclBhbGV0dGVbaSAlIENvbG9yUGFsZXR0ZS5sZW5ndGhdO1xuICAgIGhpZ2hsaWdodChzdGF2ZXNbaV0sIHN0YWZmQ29sb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldENvbHVtbkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgY29uc3QgIGdyb3VwczogeyBba2V5OiBudW1iZXJdOiBTVkdHRWxlbWVudFtdIH0gPSB7fTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYnKS5mb3JFYWNoKChzdGFmZikgPT4ge1xuICAgIGNvbnN0IGhhc0NvbHVtbiA9IEFycmF5LmZyb20oc3RhZmYuY2xhc3NMaXN0KS5qb2luKCcgJykubWF0Y2goL1xcYmNvbHVtbihcXGQrKVxcYi8pO1xuICAgIGxldCBjb2x1bW5OdW0gPSAwO1xuICAgIGlmIChoYXNDb2x1bW4pIHtcbiAgICAgIGNvbHVtbk51bSA9IHBhcnNlSW50KGhhc0NvbHVtblsxXSwgMTApIC0gMTtcbiAgICB9XG5cbiAgICBpZiAoIWdyb3Vwc1tjb2x1bW5OdW1dKSB7XG4gICAgICBncm91cHNbY29sdW1uTnVtXSA9IFtdO1xuICAgIH1cblxuICAgIGdyb3Vwc1tjb2x1bW5OdW1dLnB1c2goc3RhZmYgYXMgU1ZHR0VsZW1lbnQpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IFtjb2x1bW4sIHN0YXZlc10gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXBzKSkge1xuICAgIGNvbnN0IGNvbG9yID0gQ29sb3JQYWxldHRlW051bWJlcihjb2x1bW4pICUgQ29sb3JQYWxldHRlLmxlbmd0aF07XG4gICAgZm9yIChjb25zdCBzdGFmZiBvZiBzdGF2ZXMpIHtcbiAgICAgIGhpZ2hsaWdodChzdGFmZiwgY29sb3IpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNldCBhIGhpZ2hsaWdodCBieSBhIGRpZmZlcmVudCBncm91cGluZy5cbiAqIEBwYXJhbSBncm91cGluZyAtIEVpdGhlciBcInN0YWZmXCIsIFwic3lsbGFibGVcIiwgXCJuZXVtZVwiLCBcInNlbGVjdGlvblwiLCBvciBcImxheWVyRWxlbWVudFwiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXBpbmc6IEdyb3VwaW5nVHlwZSk6IHZvaWQge1xuICB1bnNldEdyb3VwaW5nSGlnaGxpZ2h0KCk7XG4gIGlmIChncm91cGluZyA9PT0gJ3N0YWZmJykge1xuICAgIHNldFN0YWZmSGlnaGxpZ2h0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsc2UgaWYgKGdyb3VwaW5nID09PSAnY29sdW1uJykge1xuICAgIHNldENvbHVtbkhpZ2hsaWdodCgpO1xuICAgIHJldHVybjtcbiAgfSBcbiAgZWxzZSBpZiAoZ3JvdXBpbmcgPT09ICdzZWxlY3Rpb24nKSB7XG4gICAgY29uc3QgdGVtcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWwtYnkuaXMtYWN0aXZlJykuaWQ7XG4gICAgc3dpdGNoICh0ZW1wKSB7XG4gICAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIGNhc2UgJ3NlbEJ5QkJveCc6XG4gICAgICAgIGdyb3VwaW5nID0gJ3N5bGxhYmxlJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxCeUNvbHVtbic6XG4gICAgICAgIGdyb3VwaW5nID0gJ2NvbHVtbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICAgIGdyb3VwaW5nID0gJ3N0YWZmJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxCeUxheWVyRWxlbWVudCc6XG4gICAgICAgIGdyb3VwaW5nID0gJ2xheWVyRWxlbWVudCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBncm91cGluZyA9ICduZXVtZSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzZXRHcm91cGluZ0hpZ2hsaWdodChncm91cGluZyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBncm91cHM7XG5cbiAgaWYgKGdyb3VwaW5nID09ICdsYXllckVsZW1lbnQnKSB7XG4gICAgZ3JvdXBzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFjY2lkLCAuY2xlZiwgLmN1c3RvcywgLmRpdkxpbmUnKTtcbiAgfVxuICBlbHNlIHtcbiAgICBncm91cHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGdyb3VwaW5nKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxFbGVtZW50PjtcbiAgfVxuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYywgLmN1c3RvcywgLmNsZWYsIC5hY2NpZCwgLmRpdkxpbmUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdibGFjaycpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgfSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBncm91cENvbG9yID0gQ29sb3JQYWxldHRlW2kgJSBDb2xvclBhbGV0dGUubGVuZ3RoXTtcbiAgICBpZiAoKGdyb3Vwc1tpXS5jbG9zZXN0KCcuc2VsZWN0ZWQnKSA9PT0gbnVsbCkgJiYgIWdyb3Vwc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBncm91cENvbG9yKTtcbiAgICAgIGNvbnN0IHJlY3RzID0gZ3JvdXBzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG4gICAgICByZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWN0KSB7XG4gICAgICAgIGlmIChyZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zeWxsYWJsZScpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSB8fFxuICAgICAgICAgIHJlY3QuY2xvc2VzdCgnLnN0YWZmJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSBncm91cENvbG9yO1xuICAgICAgfSk7XG4gICAgICBncm91cHNbaV0uY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0ZWQnKTtcbiAgICAgIGdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2gocmVjdCA9PiB7XG4gICAgICAgIHJlY3QuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0ZWQnKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3Vwc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgZ3JvdXBzW2ldLnNldEF0dHJpYnV0ZSgnZmlsbCcsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JvdXBzW2ldLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjZDAwJyk7XG4gICAgICB9XG4gICAgICBncm91cHNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaXZMaW5lQ2hpbGRyZW4gPSBncm91cHNbaV0ucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKTtcbiAgICBpZiAoZGl2TGluZUNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRpdkxpbmVDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICBkaXZMaW5lQ2hpbGRyZW5bal0uc2V0QXR0cmlidXRlKCdzdHJva2UnLCBncm91cENvbG9yKTtcbiAgICAgICAgZGl2TGluZUNoaWxkcmVuW2pdLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1cmkgPSByZXF1aXJlKCd1cmwnKTtcblxudmFyIFZhbGlkYXRpb25FcnJvciA9IGV4cG9ydHMuVmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24gVmFsaWRhdGlvbkVycm9yIChtZXNzYWdlLCBpbnN0YW5jZSwgc2NoZW1hLCBwYXRoLCBuYW1lLCBhcmd1bWVudCkge1xuICBpZihBcnJheS5pc0FycmF5KHBhdGgpKXtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMucHJvcGVydHkgPSBwYXRoLnJlZHVjZShmdW5jdGlvbihzdW0sIGl0ZW0pe1xuICAgICAgcmV0dXJuIHN1bSArIG1ha2VTdWZmaXgoaXRlbSk7XG4gICAgfSwgJ2luc3RhbmNlJyk7XG4gIH1lbHNlIGlmKHBhdGggIT09IHVuZGVmaW5lZCl7XG4gICAgdGhpcy5wcm9wZXJ0eSA9IHBhdGg7XG4gIH1cbiAgaWYgKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG4gIGlmIChzY2hlbWEpIHtcbiAgICB2YXIgaWQgPSBzY2hlbWEuJGlkIHx8IHNjaGVtYS5pZDtcbiAgICB0aGlzLnNjaGVtYSA9IGlkIHx8IHNjaGVtYTtcbiAgfVxuICBpZiAoaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgfVxuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG4gIHRoaXMuc3RhY2sgPSB0aGlzLnRvU3RyaW5nKCk7XG59O1xuXG5WYWxpZGF0aW9uRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0aGlzLnByb3BlcnR5ICsgJyAnICsgdGhpcy5tZXNzYWdlO1xufTtcblxudmFyIFZhbGlkYXRvclJlc3VsdCA9IGV4cG9ydHMuVmFsaWRhdG9yUmVzdWx0ID0gZnVuY3Rpb24gVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLnBhdGggPSBjdHgucGF0aDtcbiAgdGhpcy5wcm9wZXJ0eVBhdGggPSBjdHgucHJvcGVydHlQYXRoO1xuICB0aGlzLmVycm9ycyA9IFtdO1xuICB0aGlzLnRocm93RXJyb3IgPSBvcHRpb25zICYmIG9wdGlvbnMudGhyb3dFcnJvcjtcbiAgdGhpcy50aHJvd0ZpcnN0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRocm93Rmlyc3Q7XG4gIHRoaXMudGhyb3dBbGwgPSBvcHRpb25zICYmIG9wdGlvbnMudGhyb3dBbGw7XG4gIHRoaXMuZGlzYWJsZUZvcm1hdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kaXNhYmxlRm9ybWF0ID09PSB0cnVlO1xufTtcblxuVmFsaWRhdG9yUmVzdWx0LnByb3RvdHlwZS5hZGRFcnJvciA9IGZ1bmN0aW9uIGFkZEVycm9yKGRldGFpbCkge1xuICB2YXIgZXJyO1xuICBpZiAodHlwZW9mIGRldGFpbCA9PSAnc3RyaW5nJykge1xuICAgIGVyciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoZGV0YWlsLCB0aGlzLmluc3RhbmNlLCB0aGlzLnNjaGVtYSwgdGhpcy5wYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWRldGFpbCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGVycm9yIGRldGFpbCcpO1xuICAgIGlmICghZGV0YWlsLm1lc3NhZ2UpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBlcnJvciBtZXNzYWdlJyk7XG4gICAgaWYgKCFkZXRhaWwubmFtZSkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHZhbGlkYXRvciB0eXBlJyk7XG4gICAgZXJyID0gbmV3IFZhbGlkYXRpb25FcnJvcihkZXRhaWwubWVzc2FnZSwgdGhpcy5pbnN0YW5jZSwgdGhpcy5zY2hlbWEsIHRoaXMucGF0aCwgZGV0YWlsLm5hbWUsIGRldGFpbC5hcmd1bWVudCk7XG4gIH1cblxuICB0aGlzLmVycm9ycy5wdXNoKGVycik7XG4gIGlmICh0aGlzLnRocm93Rmlyc3QpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdG9yUmVzdWx0RXJyb3IodGhpcyk7XG4gIH1lbHNlIGlmKHRoaXMudGhyb3dFcnJvcil7XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIHJldHVybiBlcnI7XG59O1xuXG5WYWxpZGF0b3JSZXN1bHQucHJvdG90eXBlLmltcG9ydEVycm9ycyA9IGZ1bmN0aW9uIGltcG9ydEVycm9ycyhyZXMpIHtcbiAgaWYgKHR5cGVvZiByZXMgPT0gJ3N0cmluZycgfHwgKHJlcyAmJiByZXMudmFsaWRhdG9yVHlwZSkpIHtcbiAgICB0aGlzLmFkZEVycm9yKHJlcyk7XG4gIH0gZWxzZSBpZiAocmVzICYmIHJlcy5lcnJvcnMpIHtcbiAgICB0aGlzLmVycm9ycyA9IHRoaXMuZXJyb3JzLmNvbmNhdChyZXMuZXJyb3JzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc3RyaW5naXplciAodixpKXtcbiAgcmV0dXJuIGkrJzogJyt2LnRvU3RyaW5nKCkrJ1xcbic7XG59XG5WYWxpZGF0b3JSZXN1bHQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcocmVzKSB7XG4gIHJldHVybiB0aGlzLmVycm9ycy5tYXAoc3RyaW5naXplcikuam9pbignJyk7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmFsaWRhdG9yUmVzdWx0LnByb3RvdHlwZSwgXCJ2YWxpZFwiLCB7IGdldDogZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5lcnJvcnMubGVuZ3RoO1xufSB9KTtcblxubW9kdWxlLmV4cG9ydHMuVmFsaWRhdG9yUmVzdWx0RXJyb3IgPSBWYWxpZGF0b3JSZXN1bHRFcnJvcjtcbmZ1bmN0aW9uIFZhbGlkYXRvclJlc3VsdEVycm9yKHJlc3VsdCkge1xuICBpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSl7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgVmFsaWRhdG9yUmVzdWx0RXJyb3IpO1xuICB9XG4gIHRoaXMuaW5zdGFuY2UgPSByZXN1bHQuaW5zdGFuY2U7XG4gIHRoaXMuc2NoZW1hID0gcmVzdWx0LnNjaGVtYTtcbiAgdGhpcy5vcHRpb25zID0gcmVzdWx0Lm9wdGlvbnM7XG4gIHRoaXMuZXJyb3JzID0gcmVzdWx0LmVycm9ycztcbn1cblZhbGlkYXRvclJlc3VsdEVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuVmFsaWRhdG9yUmVzdWx0RXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmFsaWRhdG9yUmVzdWx0RXJyb3I7XG5WYWxpZGF0b3JSZXN1bHRFcnJvci5wcm90b3R5cGUubmFtZSA9IFwiVmFsaWRhdGlvbiBFcnJvclwiO1xuXG4vKipcbiAqIERlc2NyaWJlcyBhIHByb2JsZW0gd2l0aCBhIFNjaGVtYSB3aGljaCBwcmV2ZW50cyB2YWxpZGF0aW9uIG9mIGFuIGluc3RhbmNlXG4gKiBAbmFtZSBTY2hlbWFFcnJvclxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnZhciBTY2hlbWFFcnJvciA9IGV4cG9ydHMuU2NoZW1hRXJyb3IgPSBmdW5jdGlvbiBTY2hlbWFFcnJvciAobXNnLCBzY2hlbWEpIHtcbiAgdGhpcy5tZXNzYWdlID0gbXNnO1xuICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgRXJyb3IuY2FsbCh0aGlzLCBtc2cpO1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTY2hlbWFFcnJvcik7XG59O1xuU2NoZW1hRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsXG4gIHtcbiAgICBjb25zdHJ1Y3Rvcjoge3ZhbHVlOiBTY2hlbWFFcnJvciwgZW51bWVyYWJsZTogZmFsc2V9LFxuICAgIG5hbWU6IHt2YWx1ZTogJ1NjaGVtYUVycm9yJywgZW51bWVyYWJsZTogZmFsc2V9LFxuICB9KTtcblxudmFyIFNjaGVtYUNvbnRleHQgPSBleHBvcnRzLlNjaGVtYUNvbnRleHQgPSBmdW5jdGlvbiBTY2hlbWFDb250ZXh0IChzY2hlbWEsIG9wdGlvbnMsIHBhdGgsIGJhc2UsIHNjaGVtYXMpIHtcbiAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIGlmKEFycmF5LmlzQXJyYXkocGF0aCkpe1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5wcm9wZXJ0eVBhdGggPSBwYXRoLnJlZHVjZShmdW5jdGlvbihzdW0sIGl0ZW0pe1xuICAgICAgcmV0dXJuIHN1bSArIG1ha2VTdWZmaXgoaXRlbSk7XG4gICAgfSwgJ2luc3RhbmNlJyk7XG4gIH1lbHNle1xuICAgIHRoaXMucHJvcGVydHlQYXRoID0gcGF0aDtcbiAgfVxuICB0aGlzLmJhc2UgPSBiYXNlO1xuICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzO1xufTtcblxuU2NoZW1hQ29udGV4dC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUgKHRhcmdldCkge1xuICByZXR1cm4gdXJpLnJlc29sdmUodGhpcy5iYXNlLCB0YXJnZXQpO1xufTtcblxuU2NoZW1hQ29udGV4dC5wcm90b3R5cGUubWFrZUNoaWxkID0gZnVuY3Rpb24gbWFrZUNoaWxkKHNjaGVtYSwgcHJvcGVydHlOYW1lKXtcbiAgdmFyIHBhdGggPSAocHJvcGVydHlOYW1lPT09dW5kZWZpbmVkKSA/IHRoaXMucGF0aCA6IHRoaXMucGF0aC5jb25jYXQoW3Byb3BlcnR5TmFtZV0pO1xuICB2YXIgaWQgPSBzY2hlbWEuJGlkIHx8IHNjaGVtYS5pZDtcbiAgdmFyIGJhc2UgPSB1cmkucmVzb2x2ZSh0aGlzLmJhc2UsIGlkfHwnJyk7XG4gIHZhciBjdHggPSBuZXcgU2NoZW1hQ29udGV4dChzY2hlbWEsIHRoaXMub3B0aW9ucywgcGF0aCwgYmFzZSwgT2JqZWN0LmNyZWF0ZSh0aGlzLnNjaGVtYXMpKTtcbiAgaWYoaWQgJiYgIWN0eC5zY2hlbWFzW2Jhc2VdKXtcbiAgICBjdHguc2NoZW1hc1tiYXNlXSA9IHNjaGVtYTtcbiAgfVxuICByZXR1cm4gY3R4O1xufTtcblxudmFyIEZPUk1BVF9SRUdFWFBTID0gZXhwb3J0cy5GT1JNQVRfUkVHRVhQUyA9IHtcbiAgLy8gNy4zLjEuIERhdGVzLCBUaW1lcywgYW5kIER1cmF0aW9uXG4gICdkYXRlLXRpbWUnOiAvXlxcZHs0fS0oPzowWzAtOV17MX18MVswLTJdezF9KS0oM1swMV18MFsxLTldfFsxMl1bMC05XSlbdFQgXSgyWzAtNF18WzAxXVswLTldKTooWzAtNV1bMC05XSk6KDYwfFswLTVdWzAtOV0pKFxcLlxcZCspPyhbelpdfFsrLV0oWzAtNV1bMC05XSk6KDYwfFswLTVdWzAtOV0pKSQvLFxuICAnZGF0ZSc6IC9eXFxkezR9LSg/OjBbMC05XXsxfXwxWzAtMl17MX0pLSgzWzAxXXwwWzEtOV18WzEyXVswLTldKSQvLFxuICAndGltZSc6IC9eKDJbMC00XXxbMDFdWzAtOV0pOihbMC01XVswLTldKTooNjB8WzAtNV1bMC05XSkkLyxcbiAgJ2R1cmF0aW9uJzogL1AoVFxcZCsoSChcXGQrTShcXGQrUyk/KT98TShcXGQrUyk/fFMpfFxcZCsoRHxNKFxcZCtEKT98WShcXGQrTShcXGQrRCk/KT8pKFRcXGQrKEgoXFxkK00oXFxkK1MpPyk/fE0oXFxkK1MpP3xTKSk/fFxcZCtXKS9pLFxuXG4gIC8vIDcuMy4yLiBFbWFpbCBBZGRyZXNzZXNcbiAgLy8gVE9ETzogZml4IHRoZSBlbWFpbCBwcm9kdWN0aW9uXG4gICdlbWFpbCc6IC9eKD86W1xcd1xcIVxcI1xcJFxcJVxcJlxcJ1xcKlxcK1xcLVxcL1xcPVxcP1xcXlxcYFxce1xcfFxcfVxcfl0rXFwuKSpbXFx3XFwhXFwjXFwkXFwlXFwmXFwnXFwqXFwrXFwtXFwvXFw9XFw/XFxeXFxgXFx7XFx8XFx9XFx+XStAKD86KD86KD86W2EtekEtWjAtOV0oPzpbYS16QS1aMC05XFwtXSg/IVxcLikpezAsNjF9W2EtekEtWjAtOV0/XFwuKStbYS16QS1aMC05XSg/OlthLXpBLVowLTlcXC1dKD8hJCkpezAsNjF9W2EtekEtWjAtOV0/KXwoPzpcXFsoPzooPzpbMDFdP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKVxcLil7M30oPzpbMDFdP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKVxcXSkpJC8sXG4gICdpZG4tZW1haWwnOiAvXihcIig/OlshIy1cXFtcXF0tXFx1ezEwRkZGRn1dfFxcXFxbXFx0IC1cXHV7MTBGRkZGfV0pKlwifFshIy0nKitcXC0vLTk9P0EtWlxcXi1cXHV7MTBGRkZGfV0oPzpcXC4/WyEjLScqK1xcLS8tOT0/QS1aXFxeLVxcdXsxMEZGRkZ9XSkqKUAoWyEjLScqK1xcLS8tOT0/QS1aXFxeLVxcdXsxMEZGRkZ9XSg/OlxcLj9bISMtJyorXFwtLy05PT9BLVpcXF4tXFx1ezEwRkZGRn1dKSp8XFxbWyEtWlxcXi1cXHV7MTBGRkZGfV0qXFxdKSQvdSxcblxuICAvLyA3LjMuMy4gSG9zdG5hbWVzXG5cbiAgLy8gNy4zLjQuIElQIEFkZHJlc3Nlc1xuICAnaXAtYWRkcmVzcyc6IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJC8sXG4gIC8vIEZJWE1FIHdoaXRlc3BhY2UgaXMgaW52YWxpZFxuICAnaXB2Nic6IC9eXFxzKigoKFswLTlBLUZhLWZdezEsNH06KXs3fShbMC05QS1GYS1mXXsxLDR9fDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs2fSg6WzAtOUEtRmEtZl17MSw0fXwoKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezV9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsMn0pfDooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezR9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsM30pfCgoOlswLTlBLUZhLWZdezEsNH0pPzooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXszfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDR9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDJ9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezJ9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNX0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsM306KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7MX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw2fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCw0fTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoOigoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDd9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDV9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpKSglLispP1xccyokLyxcblxuICAvLyA3LjMuNS4gUmVzb3VyY2UgSWRlbnRpZmllcnNcbiAgLy8gVE9ETzogQSBtb3JlIGFjY3VyYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgXCJ1cmlcIiBnb2VzOlxuICAvLyBbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qOigoLygvKCglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1BLVpfYS16fl0pK3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KSg6XFxkKik/KT8pPyMoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKnwoLygvKCglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1BLVpfYS16fl0pK3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KSg6XFxkKik/Wy8/XXxbISQmLS4wLTs9Py1aX2Eten5dKXwvPyVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTs9Py1aX2Eten5dKSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+XSkqKCMoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKik/fC8oLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten5dKSsoOlxcZCopP3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/OlxcZCp8XFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KT8pP1xuICAndXJpJzogL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjpbXlxcc10qJC8sXG4gICd1cmktcmVmZXJlbmNlJzogL14oKCgoW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKig6JVswLTlBLUZhLWZdezJ9fDpbISQmLS4wLTs9Py1aX2Eten5dfFsvP10pfFxcPykoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKnwoW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKjo/KT8pfChbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qOik/XFwvKCglWzAtOUEtRmEtZl17Mn18XFwvKCglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1BLVpfYS16fl0pK3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KSg6XFxkKik/Wy8/XXxbISQmLS4wLTs9Py1aX2Eten5dKSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+XSkqfChcXC8oKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUEtWl9hLXp+XSkrfChcXFsoKFtWdl1bMC05QS1GYS1mXStcXC5bISQmLS4wLTs9QS1aX2Eten5dKyk/fFsuMC06QS1GYS1mXSspXFxdKT8pKDpcXGQqKT8pPykpIyglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+XSkqfCgoW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKik/JVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QF9+XXxbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qWyEkJi0qLDs9QF9+XSkoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QC1aX2Eten5dKSooKChbLz9dKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten5dKSopPyN8Wy8/XSkoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKik/fChbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qKDolWzAtOUEtRmEtZl17Mn18OlshJCYtLjAtOz0/LVpfYS16fl18Wy8/XSl8XFw/KSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+XSkqfChbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qOik/XFwvKCglWzAtOUEtRmEtZl17Mn18XFwvKCglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1BLVpfYS16fl0pK3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KSg6XFxkKik/Wy8/XXxbISQmLS4wLTs9Py1aX2Eten5dKSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+XSkqfFxcLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten5dKSsoOlxcZCopP3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/OlxcZCp8XFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KT98W0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKjo/KT8kLyxcbiAgJ2lyaSc6IC9eW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6W15cXHNdKiQvLFxuICAnaXJpLXJlZmVyZW5jZSc6IC9eKCgoKFtBLVphLXpdWytcXC0uMC05QS1aYS16XSooOiVbMC05QS1GYS1mXXsyfXw6WyEkJi0uMC07PT8tWl9hLXp+LVxcdXsxMEZGRkZ9XXxbLz9dKXxcXD8pKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten4tXFx1ezEwRkZGRn1dKSp8KFtBLVphLXpdWytcXC0uMC05QS1aYS16XSo6Pyk/KXwoW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKjopP1xcLygoJVswLTlBLUZhLWZdezJ9fFxcLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten4tXFx1ezEwRkZGRn1dKSt8KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fi1cXHV7MTBGRkZGfV0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPykoOlxcZCopP1svP118WyEkJi0uMC07PT8tWl9hLXp+LVxcdXsxMEZGRkZ9XSkoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV0pKnwoXFwvKCglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1BLVpfYS16fi1cXHV7MTBGRkZGfV0pK3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+LVxcdXsxMEZGRkZ9XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KSg6XFxkKik/KT8pKSMoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV0pKnwoKFtBLVphLXpdWytcXC0uMC05QS1aYS16XSopPyVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUBffi1cXHV7MTBGRkZGfV18W0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKlshJCYtKiw7PUBffi1cXHV7MTBGRkZGfV0pKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUAtWl9hLXp+LVxcdXsxMEZGRkZ9XSkqKCgoWy8/XSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+LVxcdXsxMEZGRkZ9XSkqKT8jfFsvP10pKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten4tXFx1ezEwRkZGRn1dKSopP3woW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKig6JVswLTlBLUZhLWZdezJ9fDpbISQmLS4wLTs9Py1aX2Eten4tXFx1ezEwRkZGRn1dfFsvP10pfFxcPykoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV0pKnwoW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKjopP1xcLygoJVswLTlBLUZhLWZdezJ9fFxcLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten4tXFx1ezEwRkZGRn1dKSt8KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fi1cXHV7MTBGRkZGfV0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPykoOlxcZCopP1svP118WyEkJi0uMC07PT8tWl9hLXp+LVxcdXsxMEZGRkZ9XSkoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV0pKnxcXC8oKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUEtWl9hLXp+LVxcdXsxMEZGRkZ9XSkrKDpcXGQqKT98KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fi1cXHV7MTBGRkZGfV0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPzpcXGQqfFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fi1cXHV7MTBGRkZGfV0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPyk/fFtBLVphLXpdWytcXC0uMC05QS1aYS16XSo6Pyk/JC91LFxuICAndXVpZCc6IC9eWzAtOUEtRl17OH0tWzAtOUEtRl17NH0tWzAtOUEtRl17NH0tWzAtOUEtRl17NH0tWzAtOUEtRl17MTJ9JC9pLFxuXG4gIC8vIDcuMy42LiB1cmktdGVtcGxhdGVcbiAgJ3VyaS10ZW1wbGF0ZSc6IC8oJVswLTlhLWZdezJ9fFshIyQmKC07PT9AXFxbXFxdX2Eten5dfFxce1shIyYrLC4vOz0/QHxdPyglWzAtOWEtZl17Mn18WzAtOV9hLXpdKShcXC4/KCVbMC05YS1mXXsyfXxbMC05X2Etel0pKSooOlsxLTldXFxkezAsM318XFwqKT8oLCglWzAtOWEtZl17Mn18WzAtOV9hLXpdKShcXC4/KCVbMC05YS1mXXsyfXxbMC05X2Etel0pKSooOlsxLTldXFxkezAsM318XFwqKT8pKlxcfSkqL2l1LFxuXG4gIC8vIDcuMy43LiBKU09OIFBvaW50ZXJzXG4gICdqc29uLXBvaW50ZXInOiAvXihcXC8oW1xceDAwLVxceDJlMC1AXFxbLX1cXHg3Zl18flswMV0pKikqJC9pdSxcbiAgJ3JlbGF0aXZlLWpzb24tcG9pbnRlcic6IC9eXFxkKygjfChcXC8oW1xceDAwLVxceDJlMC1AXFxbLX1cXHg3Zl18flswMV0pKikqKSQvaXUsXG5cbiAgLy8gaG9zdG5hbWUgcmVnZXggZnJvbTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTQyMDIyNS81NjI4XG4gICdob3N0bmFtZSc6IC9eKD89LnsxLDI1NX0kKVswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KD86XFwuWzAtOUEtWmEtel0oPzooPzpbMC05QS1aYS16XXwtKXswLDYxfVswLTlBLVphLXpdKT8pKlxcLj8kLyxcbiAgJ2hvc3QtbmFtZSc6IC9eKD89LnsxLDI1NX0kKVswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KD86XFwuWzAtOUEtWmEtel0oPzooPzpbMC05QS1aYS16XXwtKXswLDYxfVswLTlBLVphLXpdKT8pKlxcLj8kLyxcblxuICAndXRjLW1pbGxpc2VjJzogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSAmJiBwYXJzZUZsb2F0KGlucHV0KSA9PT0gcGFyc2VJbnQoaW5wdXQsIDEwKSAmJiAhaXNOYU4oaW5wdXQpO1xuICB9LFxuXG4gIC8vIDcuMy44LiByZWdleFxuICAncmVnZXgnOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChpbnB1dCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgLy8gT3RoZXIgZGVmaW5pdGlvbnNcbiAgLy8gXCJzdHlsZVwiIHdhcyByZW1vdmVkIGZyb20gSlNPTiBTY2hlbWEgaW4gZHJhZnQtNCBhbmQgaXMgZGVwcmVjYXRlZFxuICAnc3R5bGUnOiAvW1xcclxcblxcdCBdKlteXFxyXFxuXFx0IF1bXjpdKjpbXFxyXFxuXFx0IF0qW15cXHJcXG5cXHQgO10qW1xcclxcblxcdCBdKjs/LyxcbiAgLy8gXCJjb2xvclwiIHdhcyByZW1vdmVkIGZyb20gSlNPTiBTY2hlbWEgaW4gZHJhZnQtNCBhbmQgaXMgZGVwcmVjYXRlZFxuICAnY29sb3InOiAvXigjPyhbMC05QS1GYS1mXXszfSl7MSwyfVxcYnxhcXVhfGJsYWNrfGJsdWV8ZnVjaHNpYXxncmF5fGdyZWVufGxpbWV8bWFyb29ufG5hdnl8b2xpdmV8b3JhbmdlfHB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93fChyZ2JcXChcXHMqXFxiKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcXGJcXHMqLFxccypcXGIoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKVxcYlxccyosXFxzKlxcYihbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXFxiXFxzKlxcKSl8KHJnYlxcKFxccyooXFxkP1xcZCV8MTAwJSkrXFxzKixcXHMqKFxcZD9cXGQlfDEwMCUpK1xccyosXFxzKihcXGQ/XFxkJXwxMDAlKStcXHMqXFwpKSkkLyxcbiAgJ3Bob25lJzogL15cXCsoPzpbMC05XSA/KXs2LDE0fVswLTldJC8sXG4gICdhbHBoYSc6IC9eW2EtekEtWl0rJC8sXG4gICdhbHBoYW51bWVyaWMnOiAvXlthLXpBLVowLTldKyQvLFxufTtcblxuRk9STUFUX1JFR0VYUFMucmVnZXhwID0gRk9STUFUX1JFR0VYUFMucmVnZXg7XG5GT1JNQVRfUkVHRVhQUy5wYXR0ZXJuID0gRk9STUFUX1JFR0VYUFMucmVnZXg7XG5GT1JNQVRfUkVHRVhQUy5pcHY0ID0gRk9STUFUX1JFR0VYUFNbJ2lwLWFkZHJlc3MnXTtcblxuZXhwb3J0cy5pc0Zvcm1hdCA9IGZ1bmN0aW9uIGlzRm9ybWF0IChpbnB1dCwgZm9ybWF0LCB2YWxpZGF0b3IpIHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgRk9STUFUX1JFR0VYUFNbZm9ybWF0XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEZPUk1BVF9SRUdFWFBTW2Zvcm1hdF0gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiBGT1JNQVRfUkVHRVhQU1tmb3JtYXRdLnRlc3QoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIEZPUk1BVF9SRUdFWFBTW2Zvcm1hdF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBGT1JNQVRfUkVHRVhQU1tmb3JtYXRdKGlucHV0KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsaWRhdG9yICYmIHZhbGlkYXRvci5jdXN0b21Gb3JtYXRzICYmXG4gICAgICB0eXBlb2YgdmFsaWRhdG9yLmN1c3RvbUZvcm1hdHNbZm9ybWF0XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3VzdG9tRm9ybWF0c1tmb3JtYXRdKGlucHV0KTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBtYWtlU3VmZml4ID0gZXhwb3J0cy5tYWtlU3VmZml4ID0gZnVuY3Rpb24gbWFrZVN1ZmZpeCAoa2V5KSB7XG4gIGtleSA9IGtleS50b1N0cmluZygpO1xuICAvLyBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGNhcGFibGUgb2Ygb3V0cHV0dGluZyB2YWxpZCBhIEVDTUFTY3JpcHQgc3RyaW5nLCBidXQgdGhlXG4gIC8vIHJlc3VsdGluZyBjb2RlIGZvciB0ZXN0aW5nIHdoaWNoIGZvcm0gdG8gdXNlIHdvdWxkIGJlIHRlbnMgb2YgdGhvdXNhbmRzIG9mIGNoYXJhY3RlcnMgbG9uZ1xuICAvLyBUaGF0IG1lYW5zIHRoaXMgd2lsbCB1c2UgdGhlIG5hbWUgZm9ybSBmb3Igc29tZSBpbGxlZ2FsIGZvcm1zXG4gIGlmICgha2V5Lm1hdGNoKC9bLlxcc1xcW1xcXV0vKSAmJiAha2V5Lm1hdGNoKC9eW1xcZF0vKSkge1xuICAgIHJldHVybiAnLicgKyBrZXk7XG4gIH1cbiAgaWYgKGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICByZXR1cm4gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIHJldHVybiAnWycgKyBKU09OLnN0cmluZ2lmeShrZXkpICsgJ10nO1xufTtcblxuZXhwb3J0cy5kZWVwQ29tcGFyZVN0cmljdCA9IGZ1bmN0aW9uIGRlZXBDb21wYXJlU3RyaWN0IChhLCBiKSB7XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYS5ldmVyeShmdW5jdGlvbiAodiwgaSkge1xuICAgICAgcmV0dXJuIGRlZXBDb21wYXJlU3RyaWN0KGFbaV0sIGJbaV0pO1xuICAgIH0pO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoIWEgfHwgIWIpIHtcbiAgICAgIHJldHVybiBhID09PSBiO1xuICAgIH1cbiAgICB2YXIgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICB2YXIgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gZGVlcENvbXBhcmVTdHJpY3QoYVt2XSwgYlt2XSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGEgPT09IGI7XG59O1xuXG5mdW5jdGlvbiBkZWVwTWVyZ2VyICh0YXJnZXQsIGRzdCwgZSwgaSkge1xuICBpZiAodHlwZW9mIGUgPT09ICdvYmplY3QnKSB7XG4gICAgZHN0W2ldID0gZGVlcE1lcmdlKHRhcmdldFtpXSwgZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRhcmdldC5pbmRleE9mKGUpID09PSAtMSkge1xuICAgICAgZHN0LnB1c2goZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHlpc3QgKHNyYywgZHN0LCBrZXkpIHtcbiAgZHN0W2tleV0gPSBzcmNba2V5XTtcbn1cblxuZnVuY3Rpb24gY29weWlzdFdpdGhEZWVwTWVyZ2UgKHRhcmdldCwgc3JjLCBkc3QsIGtleSkge1xuICBpZiAodHlwZW9mIHNyY1trZXldICE9PSAnb2JqZWN0JyB8fCAhc3JjW2tleV0pIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldO1xuICB9XG4gIGVsc2Uge1xuICAgIGlmICghdGFyZ2V0W2tleV0pIHtcbiAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRzdFtrZXldID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzcmNba2V5XSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZXBNZXJnZSAodGFyZ2V0LCBzcmMpIHtcbiAgdmFyIGFycmF5ID0gQXJyYXkuaXNBcnJheShzcmMpO1xuICB2YXIgZHN0ID0gYXJyYXkgJiYgW10gfHwge307XG5cbiAgaWYgKGFycmF5KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IFtdO1xuICAgIGRzdCA9IGRzdC5jb25jYXQodGFyZ2V0KTtcbiAgICBzcmMuZm9yRWFjaChkZWVwTWVyZ2VyLmJpbmQobnVsbCwgdGFyZ2V0LCBkc3QpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goY29weWlzdC5iaW5kKG51bGwsIHRhcmdldCwgZHN0KSk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHNyYykuZm9yRWFjaChjb3B5aXN0V2l0aERlZXBNZXJnZS5iaW5kKG51bGwsIHRhcmdldCwgc3JjLCBkc3QpKTtcbiAgfVxuXG4gIHJldHVybiBkc3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzLmRlZXBNZXJnZSA9IGRlZXBNZXJnZTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgaW5zdGFuY2UgYWdhaW5zdCB0aGUgcHJvdmlkZWQgc2NoZW1hXG4gKiBJbXBsZW1lbnRzIFVSSStKU09OIFBvaW50ZXIgZW5jb2RpbmcsIGUuZy4gXCIlN2VcIj1cIn4wXCI9PlwiflwiLCBcIn4xXCI9XCIlMmZcIj0+XCIvXCJcbiAqIEBwYXJhbSBvXG4gKiBAcGFyYW0gcyBUaGUgcGF0aCB0byB3YWxrIG8gYWxvbmdcbiAqIEByZXR1cm4gYW55XG4gKi9cbmV4cG9ydHMub2JqZWN0R2V0UGF0aCA9IGZ1bmN0aW9uIG9iamVjdEdldFBhdGgobywgcykge1xuICB2YXIgcGFydHMgPSBzLnNwbGl0KCcvJykuc2xpY2UoMSk7XG4gIHZhciBrO1xuICB3aGlsZSAodHlwZW9mIChrPXBhcnRzLnNoaWZ0KCkpID09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG4gPSBkZWNvZGVVUklDb21wb25lbnQoay5yZXBsYWNlKC9+MC8sJ34nKS5yZXBsYWNlKC9+MS9nLCcvJykpO1xuICAgIGlmICghKG4gaW4gbykpIHJldHVybjtcbiAgICBvID0gb1tuXTtcbiAgfVxuICByZXR1cm4gbztcbn07XG5cbmZ1bmN0aW9uIHBhdGhFbmNvZGVyICh2KSB7XG4gIHJldHVybiAnLycrZW5jb2RlVVJJQ29tcG9uZW50KHYpLnJlcGxhY2UoL34vZywnJTdFJyk7XG59XG4vKipcbiAqIEFjY2VwdCBhbiBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgcmV0dXJuIGEgSlNPTiBQb2ludGVyIFVSSSBmcmFnbWVudFxuICogQHBhcmFtIEFycmF5IGFcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZXhwb3J0cy5lbmNvZGVQYXRoID0gZnVuY3Rpb24gZW5jb2RlUG9pbnRlcihhKXtcbiAgLy8gfiBtdXN0IGJlIGVuY29kZWQgZXhwbGljaXRseSBiZWNhdXNlIGhhY2tzXG4gIC8vIHRoZSBzbGFzaCBpcyBlbmNvZGVkIGJ5IGVuY29kZVVSSUNvbXBvbmVudFxuICByZXR1cm4gYS5tYXAocGF0aEVuY29kZXIpLmpvaW4oJycpO1xufTtcblxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGEgbnVtYmVyIHVzZXNcbiAqIFdlIG5lZWQgdGhpcyB0byBnZXQgY29ycmVjdCByZXN1bHRzIG91dCBvZiBtdWx0aXBsZU9mIGFuZCBkaXZpc2libGVCeVxuICogd2hlbiBlaXRoZXIgZmlndXJlIGlzIGhhcyBkZWNpbWFsIHBsYWNlcywgZHVlIHRvIElFRUUtNzU0IGZsb2F0IGlzc3Vlcy5cbiAqIEBwYXJhbSBudW1iZXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydHMuZ2V0RGVjaW1hbFBsYWNlcyA9IGZ1bmN0aW9uIGdldERlY2ltYWxQbGFjZXMobnVtYmVyKSB7XG5cbiAgdmFyIGRlY2ltYWxQbGFjZXMgPSAwO1xuICBpZiAoaXNOYU4obnVtYmVyKSkgcmV0dXJuIGRlY2ltYWxQbGFjZXM7XG5cbiAgaWYgKHR5cGVvZiBudW1iZXIgIT09ICdudW1iZXInKSB7XG4gICAgbnVtYmVyID0gTnVtYmVyKG51bWJlcik7XG4gIH1cblxuICB2YXIgcGFydHMgPSBudW1iZXIudG9TdHJpbmcoKS5zcGxpdCgnZScpO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgaWYgKHBhcnRzWzFdWzBdICE9PSAnLScpIHtcbiAgICAgIHJldHVybiBkZWNpbWFsUGxhY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNpbWFsUGxhY2VzID0gTnVtYmVyKHBhcnRzWzFdLnNsaWNlKDEpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZGVjaW1hbFBhcnRzID0gcGFydHNbMF0uc3BsaXQoJy4nKTtcbiAgaWYgKGRlY2ltYWxQYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICBkZWNpbWFsUGxhY2VzICs9IGRlY2ltYWxQYXJ0c1sxXS5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gZGVjaW1hbFBsYWNlcztcbn07XG5cbmV4cG9ydHMuaXNTY2hlbWEgPSBmdW5jdGlvbiBpc1NjaGVtYSh2YWwpe1xuICByZXR1cm4gKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCkgfHwgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJyk7XG59O1xuXG4iLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbnZhciBnZXRSYW5kb21WYWx1ZXM7XG52YXIgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBybmcoKSB7XG4gIC8vIGxhenkgbG9hZCBzbyB0aGF0IGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gcG9seWZpbGwgaGF2ZSBhIGNoYW5jZSB0byBkbyBzb1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi4gQWxzbyxcbiAgICAvLyBmaW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdG8gKG1zQ3J5cHRvKSBvbiBJRTExLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0bykgfHwgdHlwZW9mIG1zQ3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nICYmIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKTtcblxuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN0cmluZ2lmeS9wYXJzZSBmdW5jdGlvbnMgdGhhdCBkb24ndCBvcGVyYXRlXG4gKiByZWN1cnNpdmVseSwgc28gdGhleSBhdm9pZCBjYWxsIHN0YWNrIGV4Y2VlZGVkXG4gKiBlcnJvcnMuXG4gKi9cbmV4cG9ydHMuc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KGlucHV0KSB7XG4gIHZhciBxdWV1ZSA9IFtdO1xuICBxdWV1ZS5wdXNoKHtvYmo6IGlucHV0fSk7XG5cbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbmV4dCwgb2JqLCBwcmVmaXgsIHZhbCwgaSwgYXJyYXlQcmVmaXgsIGtleXMsIGssIGtleSwgdmFsdWUsIG9ialByZWZpeDtcbiAgd2hpbGUgKChuZXh0ID0gcXVldWUucG9wKCkpKSB7XG4gICAgb2JqID0gbmV4dC5vYmo7XG4gICAgcHJlZml4ID0gbmV4dC5wcmVmaXggfHwgJyc7XG4gICAgdmFsID0gbmV4dC52YWwgfHwgJyc7XG4gICAgcmVzICs9IHByZWZpeDtcbiAgICBpZiAodmFsKSB7XG4gICAgICByZXMgKz0gdmFsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJlcyArPSB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBKU09OLnN0cmluZ2lmeShvYmopO1xuICAgIH0gZWxzZSBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICByZXMgKz0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICBxdWV1ZS5wdXNoKHt2YWw6ICddJ30pO1xuICAgICAgZm9yIChpID0gb2JqLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGFycmF5UHJlZml4ID0gaSA9PT0gMCA/ICcnIDogJywnO1xuICAgICAgICBxdWV1ZS5wdXNoKHtvYmo6IG9ialtpXSwgcHJlZml4OiBhcnJheVByZWZpeH0pO1xuICAgICAgfVxuICAgICAgcXVldWUucHVzaCh7dmFsOiAnWyd9KTtcbiAgICB9IGVsc2UgeyAvLyBvYmplY3RcbiAgICAgIGtleXMgPSBbXTtcbiAgICAgIGZvciAoayBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgIGtleXMucHVzaChrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcXVldWUucHVzaCh7dmFsOiAnfSd9KTtcbiAgICAgIGZvciAoaSA9IGtleXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgb2JqUHJlZml4ID0gKGkgPiAwID8gJywnIDogJycpO1xuICAgICAgICBvYmpQcmVmaXggKz0gSlNPTi5zdHJpbmdpZnkoa2V5KSArICc6JztcbiAgICAgICAgcXVldWUucHVzaCh7b2JqOiB2YWx1ZSwgcHJlZml4OiBvYmpQcmVmaXh9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ3snfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgdGhlIHBhcnNlIGZ1bmN0aW9uLlxuLy8gVGhpcyBwb3AgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGNvcGllZCBmcm9tXG4vLyBwb3VjaENvbGxhdGUucGFyc2VJbmRleGFibGVTdHJpbmdcbmZ1bmN0aW9uIHBvcChvYmosIHN0YWNrLCBtZXRhU3RhY2spIHtcbiAgdmFyIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gIGlmIChvYmogPT09IGxhc3RNZXRhRWxlbWVudC5lbGVtZW50KSB7XG4gICAgLy8gcG9wcGluZyBhIG1ldGEtZWxlbWVudCwgZS5nLiBhbiBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgYW5vdGhlciBvYmplY3RcbiAgICBtZXRhU3RhY2sucG9wKCk7XG4gICAgbGFzdE1ldGFFbGVtZW50ID0gbWV0YVN0YWNrW21ldGFTdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuICB2YXIgZWxlbWVudCA9IGxhc3RNZXRhRWxlbWVudC5lbGVtZW50O1xuICB2YXIgbGFzdEVsZW1lbnRJbmRleCA9IGxhc3RNZXRhRWxlbWVudC5pbmRleDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICBlbGVtZW50LnB1c2gob2JqKTtcbiAgfSBlbHNlIGlmIChsYXN0RWxlbWVudEluZGV4ID09PSBzdGFjay5sZW5ndGggLSAyKSB7IC8vIG9iaiB3aXRoIGtleSt2YWx1ZVxuICAgIHZhciBrZXkgPSBzdGFjay5wb3AoKTtcbiAgICBlbGVtZW50W2tleV0gPSBvYmo7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucHVzaChvYmopOyAvLyBvYmogd2l0aCBrZXkgb25seVxuICB9XG59XG5cbmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgbWV0YVN0YWNrID0gW107IC8vIHN0YWNrIGZvciBhcnJheXMgYW5kIG9iamVjdHNcbiAgdmFyIGkgPSAwO1xuICB2YXIgY29sbGF0aW9uSW5kZXgscGFyc2VkTnVtLG51bUNoYXI7XG4gIHZhciBwYXJzZWRTdHJpbmcsbGFzdENoLG51bUNvbnNlY3V0aXZlU2xhc2hlcyxjaDtcbiAgdmFyIGFycmF5RWxlbWVudCwgb2JqRWxlbWVudDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb2xsYXRpb25JbmRleCA9IHN0cltpKytdO1xuICAgIGlmIChjb2xsYXRpb25JbmRleCA9PT0gJ30nIHx8XG4gICAgICAgIGNvbGxhdGlvbkluZGV4ID09PSAnXScgfHxcbiAgICAgICAgdHlwZW9mIGNvbGxhdGlvbkluZGV4ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3Aoc3RhY2sucG9wKCksIHN0YWNrLCBtZXRhU3RhY2spO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoIChjb2xsYXRpb25JbmRleCkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICBjYXNlICdcXHQnOlxuICAgICAgY2FzZSAnXFxuJzpcbiAgICAgIGNhc2UgJzonOlxuICAgICAgY2FzZSAnLCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbic6XG4gICAgICAgIGkgKz0gMzsgLy8gJ3VsbCdcbiAgICAgICAgcG9wKG51bGwsIHN0YWNrLCBtZXRhU3RhY2spO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3QnOlxuICAgICAgICBpICs9IDM7IC8vICdydWUnXG4gICAgICAgIHBvcCh0cnVlLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmJzpcbiAgICAgICAgaSArPSA0OyAvLyAnYWxzZSdcbiAgICAgICAgcG9wKGZhbHNlLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcwJzpcbiAgICAgIGNhc2UgJzEnOlxuICAgICAgY2FzZSAnMic6XG4gICAgICBjYXNlICczJzpcbiAgICAgIGNhc2UgJzQnOlxuICAgICAgY2FzZSAnNSc6XG4gICAgICBjYXNlICc2JzpcbiAgICAgIGNhc2UgJzcnOlxuICAgICAgY2FzZSAnOCc6XG4gICAgICBjYXNlICc5JzpcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgICBwYXJzZWROdW0gPSAnJztcbiAgICAgICAgaS0tO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIG51bUNoYXIgPSBzdHJbaSsrXTtcbiAgICAgICAgICBpZiAoL1tcXGRcXC5cXC1lXFwrXS8udGVzdChudW1DaGFyKSkge1xuICAgICAgICAgICAgcGFyc2VkTnVtICs9IG51bUNoYXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwb3AocGFyc2VGbG9hdChwYXJzZWROdW0pLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdcIic6XG4gICAgICAgIHBhcnNlZFN0cmluZyA9ICcnO1xuICAgICAgICBsYXN0Q2ggPSB2b2lkIDA7XG4gICAgICAgIG51bUNvbnNlY3V0aXZlU2xhc2hlcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY2ggPSBzdHJbaSsrXTtcbiAgICAgICAgICBpZiAoY2ggIT09ICdcIicgfHwgKGxhc3RDaCA9PT0gJ1xcXFwnICYmXG4gICAgICAgICAgICAgIG51bUNvbnNlY3V0aXZlU2xhc2hlcyAlIDIgPT09IDEpKSB7XG4gICAgICAgICAgICBwYXJzZWRTdHJpbmcgKz0gY2g7XG4gICAgICAgICAgICBsYXN0Q2ggPSBjaDtcbiAgICAgICAgICAgIGlmIChsYXN0Q2ggPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG51bUNvbnNlY3V0aXZlU2xhc2hlcyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwb3AoSlNPTi5wYXJzZSgnXCInICsgcGFyc2VkU3RyaW5nICsgJ1wiJyksIHN0YWNrLCBtZXRhU3RhY2spO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1snOlxuICAgICAgICBhcnJheUVsZW1lbnQgPSB7IGVsZW1lbnQ6IFtdLCBpbmRleDogc3RhY2subGVuZ3RoIH07XG4gICAgICAgIHN0YWNrLnB1c2goYXJyYXlFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChhcnJheUVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3snOlxuICAgICAgICBvYmpFbGVtZW50ID0geyBlbGVtZW50OiB7fSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKG9iakVsZW1lbnQuZWxlbWVudCk7XG4gICAgICAgIG1ldGFTdGFjay5wdXNoKG9iakVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAndW5leHBlY3RlZGx5IHJlYWNoZWQgZW5kIG9mIGlucHV0OiAnICsgY29sbGF0aW9uSW5kZXgpO1xuICAgIH1cbiAgfVxufTtcbiIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBEcmFnQWN0aW9uLCBFZGl0b3JBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBCQm94LCBpc091dE9mU1ZHQm91bmRzLCBnZXRHbHlwaEJCb3ggfSBmcm9tICcuL0Nvb3JkaW5hdGVzJztcbmltcG9ydCB7IHF1ZXVlTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IHsgc2VsZWN0QWxsLCBzZWxlY3RCQm94LCBzZWxlY3RTdGFmZiB9IGZyb20gJy4vU2VsZWN0VG9vbHMnO1xuXG5jbGFzcyBEcmFnSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcHJpdmF0ZSBzZWxlY3Rvcjogc3RyaW5nO1xuICBwcml2YXRlIHNlbGVjdGlvbjogU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gIHByaXZhdGUgbm9Nb3ZlUHJlY2VkZXM6IFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuXG4gIHByaXZhdGUgZHJhZ1N0YXJ0Q29vcmRzOiBbbnVtYmVyLCBudW1iZXJdID0gWy0xLCAtMV07XG4gIHByaXZhdGUgcmVzZXRUb0FjdGlvbjogKHNlbGVjdGlvbjogZDMuU2VsZWN0aW9uPGQzLkJhc2VUeXBlLCB1bmtub3duLCBIVE1MRWxlbWVudCwgdW5rbm93bj4sIGFyZ3M6IHVua25vd25bXSkgPT4gdm9pZDtcblxuICBwcml2YXRlIGR4OiBudW1iZXI7XG4gIHByaXZhdGUgZHk6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIHNlbGVjdG9yIC0gQ1NTIHNlbGVjdG9yIG9mIGVsZW1lbnQgdG8gYXBwbHkgZHJhZyBoYW5kbGVyIHRvLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgc2VsZWN0b3I6IHN0cmluZykge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgZHJhZ2dpbmcgYWN0aW9uIGFuZCBoYW5kbGVyIGZvciBzZWxlY3RlZCBlbGVtZW50cy5cbiAgICovXG4gIGRyYWdJbml0ICgpOiB2b2lkIHtcbiAgICAvLyBEcmFnIGVmZmVjdHNcbiAgICBmdW5jdGlvbiBkcmFnU3RhcnRlZCAoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdTdGFydENvb3JkcyA9IFtkMy5ldmVudC54LCBkMy5ldmVudC55XTtcbiAgICAgIHRoaXMuZHggPSAwO1xuICAgICAgdGhpcy5keSA9IDA7XG4gICAgICBjb25zdCB0YXJnZXQgPSBkMy5ldmVudC5zb3VyY2VFdmVudC50YXJnZXQ7XG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkge1xuICAgICAgICBkMy5zZWxlY3QodGhpcy5zZWxlY3RvcikuY2FsbChkcmFnQmVoYXZpb3VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgbGlzdGVuZXJzXG4gICAgY29uc3QgZHJhZ0JlaGF2aW91ciA9IGQzLmRyYWcoKVxuICAgICAgLm9uKCdzdGFydCcsIGRyYWdTdGFydGVkLmJpbmQodGhpcykpXG4gICAgICAub24oJ2RyYWcnLCB0aGlzLmRyYWdnaW5nLmJpbmQodGhpcykpXG4gICAgICAub24oJ2VuZCcsIHRoaXMuZHJhZ0VuZGVkLmJpbmQodGhpcykpO1xuXG4gICAgY29uc3QgYWN0aXZlTmMgPSBkMy5zZWxlY3RBbGwoJy5zZWxlY3RlZCcpO1xuICAgIGFjdGl2ZU5jLmNhbGwoZHJhZ0JlaGF2aW91cik7XG5cbiAgICBsZXQgc2VsZWN0aW9uID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPFNWR0dyYXBoaWNzRWxlbWVudD4oJy5zZWxlY3RlZCcpKTtcblxuICAgIC8vIGlmIHRoZSB1c2VyIGRyYWdzIHRoZSBmb2xsb3dzIHN5bGxhYmxlIGluIGEgdG9nZ2xlLWxpbmtlZCBzeWxsYWJsZSwgXG4gICAgLy8gY2FuY2VsIHRoZSBjb21wZW5zYXRpb24gZm9yIHN5bCBtb3ZlbWVudCBpbiBkcmFnZ2luZy5cbiAgICB0aGlzLm5vTW92ZVByZWNlZGVzID0gc2VsZWN0aW9uLmZpbHRlcigoZWwpID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnbm8tbW92aW5nJykgJiYgZWwuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSk7XG4gICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmZpbHRlcihlbCA9PiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCduby1tb3ZpbmcnKSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb25jYXQoQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPFNWR0dyYXBoaWNzRWxlbWVudD4oJy5yZXNpemVQb2ludCcpKSk7XG4gIH1cblxuICBkcmFnZ2luZyAoKTogdm9pZCB7XG4gICAgdGhpcy5keCA9IGQzLmV2ZW50LnggLSB0aGlzLmRyYWdTdGFydENvb3Jkc1swXTtcbiAgICB0aGlzLmR5ID0gZDMuZXZlbnQueSAtIHRoaXMuZHJhZ1N0YXJ0Q29vcmRzWzFdO1xuXG4gICAgdGhpcy5tb3ZlRWxlbWVudHModGhpcy5zZWxlY3Rpb24sIHRoaXMuZHgsIHRoaXMuZHkpO1xuXG4gICAgLypcbiAgICAgKiBpZiB3ZSdyZSBkcmFnZ2luZyBhIHN5bGxhYmxlIChvciBuZXVtZSBldGMpIHRoZW4gdGhlcmUgd29uJ3QgYmUgYSBzeWwgc2VsZWN0ZWRcbiAgICAgKiB0aGVuIHdlIGRvbid0IHdhbnQgdGhlIGJvdW5kaW5nIGJveCAoaWYgaXQgaXMgZGlzcGxheWVkKSB0byBtb3ZlIHdoZW4gZHJhZ2dpbmcgdGhlIG5ldW1lc1xuICAgICAqIGl0IHdpbGwgYmUgYSBjaGlsZCBvZiB0aGUgZWxlbWVudCBpbiBzZWxlY3Rpb24sIHNvIGl0IHdpbGwgZ2V0IG1vdmVkIGluIHRoZSBhYm92ZSBsb29wXG4gICAgICogc28gd2UgY2FuY2VsIHRoYXQgbW92ZW1lbnQgb3V0IGhlcmVcbiAgICAgKi9cbiAgICBjb25zdCBzeWxzID0gdGhpcy5zZWxlY3Rpb24uZmlsdGVyKChlbCkgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSk7XG4gICAgaWYgKHN5bHMubGVuZ3RoID09PSAwICYmIHRoaXMubm9Nb3ZlUHJlY2VkZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBiYm94ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZS5zZWxlY3RlZCcpKVxuICAgICAgICAubWFwKGVsID0+IGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykpO1xuICAgICAgdGhpcy5tb3ZlRWxlbWVudHMoYmJveGVzLCAtdGhpcy5keCwgLXRoaXMuZHkpO1xuICAgIH1cbiAgfVxuXG5cbiAgZHJhZ0VuZGVkICgpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGhhcyBub3QgYmVlbiBtb3ZlZCBtb3JlIHRoYW4gNSBwaXhlbHMgaW4gYW55IGRpcmVjdGlvbixcbiAgICAvLyBkbyBub3QgZG8gYW55IGFjdGlvblxuICAgIGNvbnN0IHhEaWZmID0gTWF0aC5hYnModGhpcy5keCksIHlEaWZmID0gTWF0aC5hYnModGhpcy5keSk7XG4gICAgaWYgKHhEaWZmIDw9IDUgJiYgeURpZmYgPD0gNSkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciBzZWxlY3Rpb24gZm9yIGRyYWdnYWJsZSBlbGVtZW50c1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoZWwpID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Jlc2l6ZVBvaW50JykpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnNvciBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZSBzZWxlY3Rpb24gYXJyYXkgaXMgb3V0IG9mIGJvdW5kcyxcbiAgICAvLyBkcmFnIGFjdGlvbnMgc2hvdWxkIG5vdCBoYXBwZW4uIFJldHVybiBhbiBlcnJvciBub3RpZmljYXRpb24gYW5kIHJlc2V0XG4gICAgLy8gdGhlIGRyYWcgaGFuZGxlclxuICAgIGlmICh0aGlzLmlzQ3Vyc29yT3V0T2ZCb3VuZHMoKSB8fCB0aGlzLmlzRHJhZ091dE9mQm91bmRzKHNlbGVjdGlvbikpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgc2VsZWN0aW9uIGJhY2sgdG8gbm9ybWFsIHN0YXRlXG4gICAgICB0aGlzLnJldHVybkVsZW1lbnRzKHRoaXMuc2VsZWN0aW9uKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBib3VuZGluZyBib3hlcyBhcyB3ZWxsXG4gICAgICBjb25zdCBiYm94ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZS5zZWxlY3RlZCcpKVxuICAgICAgICAubWFwKGVsID0+IGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykpO1xuICAgICAgdGhpcy5yZXR1cm5FbGVtZW50cyhiYm94ZXMpO1xuXG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICB0aGlzLmRyYWdJbml0KCk7XG4gICAgICByZXR1cm4gcXVldWVOb3RpZmljYXRpb24oJ1tGQUlMXSBHbHlwaHMgd2VyZSBwbGFjZWQgb3V0IG9mIGJvdW5kcyEgRHJhZyBhY3Rpb24gZmFpbGVkLicsICdlcnJvcicpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgY2hhaW4gZWRpdG9yIGFjdGlvbiBmb3Igc2VsZWN0aW9uXG4gICAgY29uc3QgcGFyYW1BcnJheTogRWRpdG9yQWN0aW9uW10gPSBbXTtcbiAgICBzZWxlY3Rpb24uZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZWwudGFnTmFtZSA9PT0gJ3JlY3QnID8gZWwuY2xvc2VzdCgnLnN5bCcpLmlkIDogZWwuaWQ7XG5cbiAgICAgIGNvbnN0IGRyYWdBY3Rpb246IERyYWdBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ2RyYWcnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICAgICAgeDogdGhpcy5keCxcbiAgICAgICAgICB5OiAtdGhpcy5keSxcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcGFyYW1BcnJheS5wdXNoKGRyYWdBY3Rpb24pO1xuICAgIH0pO1xuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgICAgcGFyYW06IHBhcmFtQXJyYXlcbiAgICB9O1xuXG4gICAgLy8gU2VuZCBlZGl0b3IgYWN0aW9uXG4gICAgdGhpcy5uZW9uVmlld1xuICAgICAgLmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gTmVvbiByZS1yZW5kZXJzIHRoZSBlbnRpcmUgU1ZHLCBhbmQgaGVuY2UsIGJlZm9yZSB3ZSBkbyBzbyxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdG9yZSBhbGwgdGhlIGVsZW1lbnRzIChJRHMpIHdlIG5lZWQgdG8gc2VsZWN0IGFnYWluXG4gICAgICAgIC8vIFRoZW4sIHdlIG5lZWQgdG8gcmVzZWxlY3QgdGhlbSBieSBjYWxsaW5nIGB0aGlzLnJlc2VsZWN0KClgXG4gICAgICAgIGNvbnN0IHRvUmVzZWxlY3QgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpKVxuICAgICAgICAgIC5maWx0ZXIoZWwgPT4gIWVsLmNsYXNzTGlzdC5jb250YWlucygnbm8tbW92aW5nJykpXG4gICAgICAgICAgLm1hcChlbCA9PiBlbC5pZCk7XG5cbiAgICAgICAgLy8gQ0FVVElPTjogYHVwZGF0ZUZvckN1cnJlbnRQYWdlKClgIGlzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiFcbiAgICAgICAgLy8gSXQgcmVxdWlyZXMgYW4gYGF3YWl0YCBrZXl3b3JkLlxuICAgICAgICBhd2FpdCB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIHRoaXMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgLy8gUmVzZWxlY3QgdGhlIGVsZW1lbnRzIGFuZCByZWluaXRpYWxpemUgZHJhZ1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2VsZWN0KHRvUmVzZWxlY3QpO1xuICAgICAgICB0aGlzLmRyYWdJbml0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlc2VsZWN0ICh0b1Jlc2VsZWN0OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc2VsZWN0ZWQgPSB0b1Jlc2VsZWN0Lm1hcChpZCA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFNWR0dyYXBoaWNzRWxlbWVudD4oYCMke2lkfWApKTtcblxuICAgIC8vIEFsbCBnbHlwaHMgZXhjZXB0IGJvdWRpbmcgYm94ZXMgKCdzeWwncykgbXVzdCBiZSBzZWxlY3RlZCB3aXRoXG4gICAgLy8gYHNlbGVjdEFsbCgpYFxuICAgIHJlc2VsZWN0ZWRcbiAgICAgIC5maWx0ZXIoZWwgPT4gIWVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpXG4gICAgICAuZm9yRWFjaChhc3luYyAoKSA9PiBhd2FpdCBzZWxlY3RBbGwocmVzZWxlY3RlZCwgdGhpcy5uZW9uVmlldywgdGhpcykpO1xuXG4gICAgLy8gQm91bmRpbmcgYm94ZXMgbXVzdCBiZSBleHBsaWNpdGx5IHNlbGVjdGVkIHVzaW5nIGBzZWxlY3RCQm94KClgXG4gICAgcmVzZWxlY3RlZFxuICAgICAgLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKVxuICAgICAgLmZvckVhY2goXG4gICAgICAgIGVsID0+IHNlbGVjdEJCb3goZWwucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgdGhpcywgdGhpcy5uZW9uVmlldylcbiAgICAgICk7XG5cbiAgICAvLyBTdGF2ZXMgbXVzdCBiZSBleHBsaWNpdGx5IHNlbGVjdGVkIHVzaW5nIGBzZWxlY3RTdGFmZigpYFxuICAgIC8vIEFORCBtdXN0IGJlIHNlbGVjdGVkIHdpdGggYHNlbGVjdEFsbCgpYCBmb3IgY29ycmVjdCBiZWhhdmlvciAoZm9yIHNvbWUgcmVhc29uKS5cbiAgICByZXNlbGVjdGVkXG4gICAgICAuZmlsdGVyKGVsID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSlcbiAgICAgIC5mb3JFYWNoKGVsID0+IHNlbGVjdFN0YWZmKGVsLCB0aGlzKSk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBkMyBhY3Rpb24gdG8gdXNlIGZvciBbW3Jlc2V0XV0uICovXG4gIHJlc2V0VG8gKHJlc2V0OiAoc2VsZWN0aW9uOiBkMy5TZWxlY3Rpb248ZDMuQmFzZVR5cGUsIHVua25vd24sIEhUTUxFbGVtZW50LCB1bmtub3duPiwgYXJnczogdW5rbm93bltdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFRvQWN0aW9uID0gcmVzZXQ7XG4gIH1cblxuICAvKiogUmVzZXQgdG8gYSBwcmV2aW91cyBkMyBhY3Rpb24gZm9yIFtbdGhpcy5zZWxlY3Rvcl1dLiAqL1xuICByZXNldCAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZXRUb0FjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkMy5zZWxlY3QodGhpcy5zZWxlY3RvcikuY2FsbCh0aGlzLnJlc2V0VG9BY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24gKCk6IHZvaWQge1xuICAgIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gICAgY29uc3QgZXh0cmFFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpO1xuICAgIGlmIChtb3JlRWRpdCkge1xuICAgICAgbW9yZUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIH1cbiAgICBpZiAoZXh0cmFFZGl0KSB7XG4gICAgICBleHRyYUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgICBleHRyYUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlzdWFsbHkgbW92ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgYnkgYGR4YCBhbmQgYGR5YDsgKG5vdCB1c2luZyBkMylcbiAgICovXG4gIG1vdmVFbGVtZW50cyAoc2VsZWN0aW9uOiBFbGVtZW50W10sIGR4OiBudW1iZXIsIGR5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBzZWxlY3Rpb24uZmlsdGVyKGVsID0+IGVsICE9PSBudWxsKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7ZHh9LCR7ZHl9KWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpc3VhbGx5IHJldHVybiBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGVpciBvcmlnaW5hbCBwb3NpdGlvbnNcbiAgICogYnkgcmVtb3ZpbmcgdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGVcbiAgICovXG4gIHJldHVybkVsZW1lbnRzIChzZWxlY3Rpb246IEVsZW1lbnRbXSk6IHZvaWQge1xuICAgIHNlbGVjdGlvbi5maWx0ZXIoZWwgPT4gZWwgIT09IG51bGwpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpO1xuICAgIH0pO1xuICB9XG5cbiAgaXNDdXJzb3JPdXRPZkJvdW5kcyAoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZW5kWCA9IHRoaXMuZHJhZ1N0YXJ0Q29vcmRzWzBdICsgdGhpcy5keDtcbiAgICBjb25zdCBlbmRZID0gdGhpcy5kcmFnU3RhcnRDb29yZHNbMV0gKyB0aGlzLmR5O1xuXG4gICAgcmV0dXJuIGlzT3V0T2ZTVkdCb3VuZHMoZW5kWCwgZW5kWSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gYXJyYXkgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIFNWR1xuICAgKiBAcGFyYW0ge1NWR0dyYXBoaWNzRWxlbWVudFtdfSBzZWxlY3Rpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59IElzIHNlbGVjdGlvbiBvdXQgb2YgYm91bmRzXG4gICAqL1xuICBpc0RyYWdPdXRPZkJvdW5kcyAoc2VsZWN0aW9uOiBTVkdHcmFwaGljc0VsZW1lbnRbXSk6IGJvb2xlYW4ge1xuICAgIC8vIEdldCB0aGUgYm91bmRpbmcgYm94ZXMgb2YgYWxsIGdseXBocyAoPHVzZT4gZWxlbWVudHMpIHdpdGhpbiB0aGUgc2VsZWN0aW9uIGFycmF5XG4gICAgY29uc3QgaXNCQm94RGlzcGxheWVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI2Rpc3BsYXlCQm94JykuY2hlY2tlZDtcbiAgICBsZXQgZ2x5cGhTZWxlY3RvciA9IGlzQkJveERpc3BsYXllZCA/ICd1c2UsIHJlY3QnIDogJ3VzZSc7XG5cbiAgICBpZiAoc2VsZWN0aW9uWzBdLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkgZ2x5cGhTZWxlY3RvciA9ICdwYXRoJztcblxuICAgIGNvbnN0IGdseXBoczogU1ZHVXNlRWxlbWVudFtdID0gc2VsZWN0aW9uLnJlZHVjZShcbiAgICAgIChhY2MsIGVsKSA9PiBhY2MuY29uY2F0KC4uLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoZ2x5cGhTZWxlY3RvcikpLCBbXVxuICAgICk7XG4gICAgY29uc3QgZ2x5cGhCQm94ZXM6IEJCb3hbXSA9IGdseXBocy5tYXAoZ2V0R2x5cGhCQm94KTtcblxuICAgIC8vIEdldCB0aGUgc3Vycm91bmRpbmcgYm91bmRpbmcgYm94IG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50c1xuICAgIGNvbnN0IHNlbGVjdGlvbkJCb3g6IEJCb3ggPSBnbHlwaEJCb3hlcy5yZWR1Y2UoXG4gICAgICAoYmJveCwgY3VycikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVseDogTWF0aC5taW4oYmJveC51bHgsIGN1cnIudWx4KSxcbiAgICAgICAgICB1bHk6IE1hdGgubWluKGJib3gudWx5LCBjdXJyLnVseSksXG4gICAgICAgICAgbHJ4OiBNYXRoLm1heChiYm94LmxyeCwgY3Vyci5scngpLFxuICAgICAgICAgIGxyeTogTWF0aC5tYXgoYmJveC5scnksIGN1cnIubHJ5KSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHVseDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgdWx5OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBscng6IE51bWJlci5NSU5fVkFMVUUsXG4gICAgICAgIGxyeTogTnVtYmVyLk1JTl9WQUxVRSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgeyB1bHgsIHVseSwgbHJ4LCBscnkgfSA9IHNlbGVjdGlvbkJCb3g7XG4gICAgcmV0dXJuIGlzT3V0T2ZTVkdCb3VuZHModWx4ICsgdGhpcy5keCwgdWx5ICsgdGhpcy5keSkgfHwgaXNPdXRPZlNWR0JvdW5kcyhscnggKyB0aGlzLmR4LCBscnkgKyB0aGlzLmR5KTtcbiAgfVxufVxuXG5leHBvcnQgeyBEcmFnSGFuZGxlciBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgKiBhcyBDb250ZW50cyBmcm9tICcuL0NvbnRlbnRzJztcbmltcG9ydCAqIGFzIFdhcm5pbmdzIGZyb20gJy4uL1dhcm5pbmdzJztcbmltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgU2VsZWN0VG9vbHMgZnJvbSAnLi4vdXRpbHMvU2VsZWN0VG9vbHMnO1xuaW1wb3J0ICogYXMgU2VsZWN0T3B0aW9ucyBmcm9tICcuLi9TcXVhcmVFZGl0L1NlbGVjdE9wdGlvbnMnO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IEVkaXRvckFjdGlvbiwgVG9nZ2xlTGlnYXR1cmVBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyByZW1vdmVIYW5kbGVyLCBkZWxldGVCdXR0b25IYW5kbGVyIH0gZnJvbSAnLi9TZWxlY3RPcHRpb25zJztcblxuLyoqXG4gKiBUaGUgTmVvblZpZXcgcGFyZW50IHRvIGFjY2VzcyBlZGl0b3IgYWN0aW9ucy5cbiAqL1xubGV0IG5lb25WaWV3OiBOZW9uVmlldztcblxuLyoqXG4gKiBTZXQgdGhlIG5lb25WaWV3IG1lbWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXROZW9uVmlldyh2aWV3OiBOZW9uVmlldyk6IHZvaWQge1xuICBuZW9uVmlldyA9IHZpZXc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgc2VsZWN0ZWQgZWxlbWVudHMgY2FuIGJlIGdyb3VwZWQgb3Igbm90XG4gKiBAcmV0dXJucyB0cnVlIGlmIGNhbiBiZSBncm91cGVkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR3JvdXBhYmxlKFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBBcnJheTxTVkdHcmFwaGljc0VsZW1lbnQ+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGdyb3VwcyA9IEFycmF5LmZyb20oZWxlbWVudHMudmFsdWVzKCkpIGFzIFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuXG4gIGlmIChncm91cHMubGVuZ3RoIDwgMikge1xuICAgIC8vIGNhbm5vdCBncm91cCBpZiBvbmx5IDEgZWxlbWVudCBpcyBzZWxlY3RlZFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgLy8gaWYgbmV1bWVzIGFyZSBpbiBzYW1lIHN5bGxhYmxlLCBkb24ndCBkaXNwbGF5IGdyb3VwaW5nIG9wdGlvblxuICAgICAgaWYgKFNlbGVjdFRvb2xzLnNoYXJlZExvZ2ljYWxQYXJlbnQoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gY2hlY2sgaWYgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGFyZSBhZGphY2VudCB0byBlYWNoIG90aGVyXG4gICAgICBpZiAoU2VsZWN0VG9vbHMuYXJlQWRqYWNlbnQoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTGlua2VkKFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzPzogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbikge1xuICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJyksXG4gICAgKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcbiAgfVxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykgfHxcbiAgICAgICAgICBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ1RoZSBhY3Rpb24gaW52b2x2ZXMgbGlua2VkIHN5bGxhYmxlcywgcGxlYXNlIHVudG9nZ2xlIHRoZW0gZmlyc3QnLFxuICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ1RoZSBhY3Rpb24gaW52b2x2ZXMgbGlua2VkIHN5bGxhYmxlcywgcGxlYXNlIHVudG9nZ2xlIHRoZW0gZmlyc3QnLFxuICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykgfHxcbiAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzSW52YWxpZExpbmtlZFN5bGxhYmxlKFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IGJvb2xlYW4ge1xuICAvLyBTb3J0IGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIG9yZGVyIGluIHRoZSBET01cbiAgZWxlbWVudHMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HXG4gICAgKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0pO1xuXG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGVsZW1lbnRzLmxlbmd0aDsgaWR4KyspIHtcbiAgICBjb25zdCBzeWxsYWJsZSA9IGVsZW1lbnRzLmF0KGlkeCk7XG4gICAgaWYgKHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykpIHtcbiAgICAgIC8vIEdldCB4bWw6aWQgb2YgdGhlIG5leHQgc3lsbGFibGUgKHdpdGhvdXQgdGhlICMsIGlmIGl0IGV4aXN0cylcbiAgICAgIGNvbnN0IG5leHRTeWxsYWJsZUlkID0gc3lsbGFibGVcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJylcbiAgICAgICAgLnJlcGxhY2UoJyMnLCAnJyk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIG5leHQgc3lsbGFibGUgYW5kIGl0cyBpbmRleCBpbiB0aGUgYXJyYXlcbiAgICAgIGxldCBuZXh0U3lsbGFibGVJZHg6IG51bWJlcjtcbiAgICAgIGNvbnN0IG5leHRTeWxsYWJsZSA9IGVsZW1lbnRzLmZpbmQoKGVsZW1lbnQsIGlkeCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5pZCA9PT0gbmV4dFN5bGxhYmxlSWQpIHtcbiAgICAgICAgICBuZXh0U3lsbGFibGVJZHggPSBpZHg7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ29uZGl0aW9uIDE6IFRoZSBuZXh0IChmb2xsb3dpbmcpIHN5bGxhYmxlIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgaWYgKCFuZXh0U3lsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAyOiBUaGUgbmV4dCBzeWxsYWJsZSBoYXMgYmVlbiBmb3VuZCwgYnV0IHRoZSBAZm9sbG93cyBhdHRyaWJ1dGUgZG9lcyBOT1QgRVhJU1RcbiAgICAgIGlmICghbmV4dFN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uZGl0aW9uIDM6IFRoZSBuZXh0IHN5bGxhYmxlJ3MgQGZvbGxvd3MgYXR0cmlidXRlIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQgI2lkXG4gICAgICBpZiAobmV4dFN5bGxhYmxlLmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSAhPSAnIycgKyBzeWxsYWJsZS5pZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uZGl0aW9uIDQ6XG4gICAgICAvLyBTaW5jZSB0aGUgQGZvbGxvd3MgdmFsdWUgaXMgY29ycmVjdCwgYSBwYWlyIG9mIHN5bGxhYmxlcyBleGlzdCBmb3IgdGhlIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgQGZvbGxvd3Mgc3lsbGFibGUgaXMgdGhlIG5leHQgc3lsbGFibGUgKGluZGV4LXdpc2UpIGluIHRoZSBhcnJheTpcbiAgICAgIGlmIChuZXh0U3lsbGFibGVJZHggIT09IGlkeCArIDEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykpIHtcbiAgICAgIGNvbnN0IHByZXZTeWxsYWJsZUlkID0gc3lsbGFibGVcbiAgICAgICAgLmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKVxuICAgICAgICAucmVwbGFjZSgnIycsICcnKTtcbiAgICAgIGNvbnN0IHByZXZTeWxsYWJsZSA9IGVsZW1lbnRzLmZpbmQoXG4gICAgICAgIChzeWxsYWJsZSkgPT4gc3lsbGFibGUuaWQgPT09IHByZXZTeWxsYWJsZUlkLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29uZGl0aW9uIDE6IFRoZSBwcmV2aW91cyBzeWxsYWJsZSBkb2VzIG5vdCBleGlzdFxuICAgICAgaWYgKCFwcmV2U3lsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAyOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZXhpc3RzLCBidXQgdGhlIEBwcmVjZWRlcyBhdHRyaWJ1dGUgZG9lcyBOT1QgRVhJU1RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgcHJldmlvdXMgc3lsbGFibGUncyBAcHJlY2VkZXMgYXR0cmlidXRlIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQgI2lkXG4gICAgICBpZiAocHJldlN5bGxhYmxlLmdldEF0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgIT0gJyMnICsgc3lsbGFibGUuaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHRvIHNlZSBpcyBhIHNlbGVjdGlvbiBvZiBlbGVtZW50cyBpcyBhbHJlYWR5IGxpbmtlZFxuICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEByZXR1cm5zIHRydWUgaXMgbGlua2VkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2VkKGVsZW1lbnRzOiBBcnJheTxTVkdHcmFwaGljc0VsZW1lbnQ+KTogYm9vbGVhbiB7XG4gIC8vIGV2ZXJ5IGVsZW1lbnQgc2hvdWxkIGJlIGxpbmtlZFxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBpZiAoXG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICYmXG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJylcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQXNzdW1pbmcgYWxsIGVsZW1lbnRzIGFyZSB2YWxpZCxcbiAqIGNoZWNrIGlmIHRoZSBlbGVtZW50cyBjYW4gYmUgbGlua2VkOlxuICogMS4gc29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gKiAyLiBlbnN1cmUgZWxlbWVudHMgYXJlIGFkamFjZW50IGluIHRoZSBET01cbiAqIDMuIGVuc3VyZSBlbGVtZW50cyBiZWxvbmcgdG8gYWRqYWNlbnQgc3RhdmVzXG4gKiA0LiBjaGVjayBpZiBjYW4gYmUgbGlua2VkOlxuICogICAgNC4xIGlmIGV4YWN0bHkgdHdvIGVsZW1lbnRzLCBib3RoIG5lZWRzIHRvIGJlIHVubGlua2VkXG4gKiAgICA0LjIgaWYgbW9yZSB0aGFuIHR3byBlbGVtZW50cywgb25seSBvbmUgZWxlbWVudCBjYW4gYmUgdW5saW5rZWQsXG4gKiAgICAgICAgYXQgZWl0aGVyIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIHNlcXVlbmNlXG4gKiBAcGFyYW0gZWxlbWVudHMgZWxlbWVudHMgdG8gYmUgY29uc2lkZXJlZFxuICogQHJldHVybnMgdHJ1ZSBjYW4gYmUgbGlua2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5CZUxpbmtlZChlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pik6IGJvb2xlYW4ge1xuICAvLyAxLiBTb3J0IGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIG9yZGVyIGluIHRoZSBET01cbiAgZWxlbWVudHMuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHN0YWZmQSA9IGEuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgY29uc3Qgc3RhZmZCID0gYi5jbG9zZXN0KCcuc3RhZmYnKTtcbiAgICByZXR1cm4gc3RhZmZBLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YWZmQikgJlxuICAgICAgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkdcbiAgICAgID8gLTFcbiAgICAgIDogMTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RhdmVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYnKSk7XG4gIGNvbnN0IHN5bGxhYmxlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN5bGxhYmxlJykpO1xuXG4gIC8vIDIuIEVuc3VyZSBzeWxsYWJsZXMgYXJlIGFkamFjZW50IGluIHRoZSBET01cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gZWxlbWVudHNbaV07XG4gICAgY29uc3QgbmV4dCA9IGVsZW1lbnRzW2kgKyAxXTtcbiAgICBjb25zdCBjdXJyZW50U3lsbGFibGVJbmRleCA9IHN5bGxhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuICAgIGNvbnN0IG5leHRTeWxsYWJsZUluZGV4ID0gc3lsbGFibGVzLmluZGV4T2YobmV4dCk7XG4gICAgaWYgKG5leHRTeWxsYWJsZUluZGV4IC0gY3VycmVudFN5bGxhYmxlSW5kZXggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gU3RhdmVzIG11c3QgYmUgYWRqYWNlbnRcbiAgICB9XG4gICAgLy8gMy4gRW5zdXJlIHN5bGxhYmxlcyBiZWxvbmcgdG8gYWRqYWNlbnQgc3RhdmVzXG4gICAgY29uc3QgY3VycmVudFN0YWZmID0gY3VycmVudC5jbG9zZXN0KCcuc3RhZmYnKTtcbiAgICBjb25zdCBuZXh0U3RhZmYgPSBuZXh0LmNsb3Nlc3QoJy5zdGFmZicpO1xuXG4gICAgY29uc3QgY3VycmVudFN0YWZmSW5kZXggPSBzdGF2ZXMuaW5kZXhPZihjdXJyZW50U3RhZmYgYXMgSFRNTEVsZW1lbnQpO1xuICAgIGNvbnN0IG5leHRTdGFmZkluZGV4ID0gc3RhdmVzLmluZGV4T2YobmV4dFN0YWZmIGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAobmV4dFN0YWZmSW5kZXggLSBjdXJyZW50U3RhZmZJbmRleCAhPT0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBTdGF2ZXMgbXVzdCBiZSBhZGphY2VudFxuICAgIH1cbiAgfVxuXG4gIC8vIDQuMSBIYW5kbGUgY2FzZSBmb3IgZXhhY3RseSB0d28gc3lsbGFibGVzXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gZWxlbWVudHMuZXZlcnkoXG4gICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSAmJlxuICAgICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIDQuMiBIYW5kbGUgY2FzZSBmb3IgbW9yZSB0aGFuIHR3byBzeWxsYWJsZXNcbiAgY29uc3QgdW5saW5rZWRFbGVtZW50cyA9IGVsZW1lbnRzLmZpbHRlcihcbiAgICAoZWxlbWVudCkgPT5cbiAgICAgICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiZcbiAgICAgICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSxcbiAgKTtcblxuICBpZiAodW5saW5rZWRFbGVtZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIE9ubHkgb25lIHVubGlua2VkIHN5bGxhYmxlIGlzIGFsbG93ZWRcbiAgfVxuXG4gIC8vIFRoZSB1bmxpbmtlZCBzeWxsYWJsZSBzaG91bGQgYmUgYXQgdGhlIGJlZ2lubmluZyBvciBlbmRcbiAgY29uc3QgZmlyc3RVbmxpbmtlZCA9IHVubGlua2VkRWxlbWVudHNbMF07XG5cbiAgcmV0dXJuIChcbiAgICBlbGVtZW50cy5pbmRleE9mKGZpcnN0VW5saW5rZWQpID09PSAwIHx8XG4gICAgZWxlbWVudHMuaW5kZXhPZihmaXJzdFVubGlua2VkKSA9PT0gZWxlbWVudHMubGVuZ3RoIC0gMVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBlbGVtZW50cyBjYW4gYmUgbGlua2VkIG9yIHVubGlrbmVkLlxuICogQHBhcmFtIHNlbGVjdGlvblR5cGUgQ3VycmVudCBzZWxlY3Rpb24gbW9kZS4gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBiZSBsaW5rZWRcbiAqIEBwYXJhbSBlbGVtZW50cyBUaGUgZWxlbWVudHMgdW5kZXIgcXVlc3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgdXNlciBzaG91bGQgYmUgYWJsZSB0byBsaW5rIG9yIHVuLWxpbmsgZWxlbWVudHMsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMaW5rYWJsZShcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IGJvb2xlYW4ge1xuICAvLyBjYW5ub3QgdG9nZ2xlIGxpbmsgZm9yIHN5bGxhYmxlIHNlbGVjdGlvbiBpZiBudW1iZXIgb2Ygc2VsZWN0ZWRcbiAgLy8gc3lsbGFibGVzIGlzIHNtYWxsZXIgdGhhbiAyXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gb25seSBTeWxsYWJsZXMgY2FuIGJlIGxpbmtlZCBvciB1bmxpbmtlZCAoPylcbiAgaWYgKHNlbGVjdGlvblR5cGUgIT09ICdzZWxCeVN5bGxhYmxlJykgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIENoZWNrIGlmIGhhcyBpbnZhbGlkIGxpbmtlZCBzeWxsYWJsZXNcbiAgaWYgKGhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZShlbGVtZW50cykpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnVGhlIHNlbGVjdGVkIHN5bGxhYmxlcyBpbmNsdWRlIGludmFsaWQgbGlua2VkIHN5bGxhYmxlKHMpIScsXG4gICAgICAnd2FybmluZycsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBpZiBBTFJFQURZIGxpbmtlZFxuICBpZiAoaXNMaW5rZWQoZWxlbWVudHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gaWYgQ0FOIGJlIGxpbmtlZFxuICBlbHNlIGlmIChjYW5CZUxpbmtlZChlbGVtZW50cykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzZWxlY3RlZCBzdGF2ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3RhdmVzKCk6IHZvaWQge1xuICBjb25zdCBzeXN0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmLnNlbGVjdGVkJyk7XG4gIGNvbnN0IGVsZW1lbnRJZHMgPSBbXTtcbiAgc3lzdGVtcy5mb3JFYWNoKChzdGFmZikgPT4ge1xuICAgIGVsZW1lbnRJZHMucHVzaChzdGFmZi5pZCk7XG4gIH0pO1xuICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdtZXJnZScsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgfSxcbiAgfTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU3RhZmYgTWVyZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy5lbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ01lcmdlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgdGhlIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICogQHBhcmFtIHR5cGUgLSBUaGUgZ3JvdXBpbmcgdHlwZTogbmMsIG5ldW1lLCBzeWwsIGxpZ2F0dXJlTmMsIG9yIGxpZ2F0dXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyR3JvdXBpbmcodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gIG1vcmVFZGl0LmlubmVySFRNTCArPSBDb250ZW50cy5ncm91cGluZ01lbnVbdHlwZV07XG4gIGluaXRHcm91cGluZ0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JvdXBpbmcgc2VsZWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRHcm91cGluZ1NlbGVjdGlvbigpOiB2b2lkIHtcbiAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgbW9yZUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlkb3duTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFRoZSBncm91cGluZyBkcm9wZG93biBsaXN0ZW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRHcm91cGluZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgY29uc3QgZGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZScpO1xuICBkZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZW1vdmVIYW5kbGVyKTtcbiAgZGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlkb3duTGlzdGVuZXIpO1xuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lcmdlU3lscycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGNvbnRhaW5zTGlua2VkKFNlbGVjdFRvb2xzLmdldFNlbGVjdGlvblR5cGUoKSkpIHJldHVybjtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpLmZpbHRlcigoZSkgPT5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduZXVtZScpLFxuICAgICAgKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyb3VwTmV1bWVzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBpZiAoY29udGFpbnNMaW5rZWQoU2VsZWN0VG9vbHMuZ2V0U2VsZWN0aW9uVHlwZSgpKSkgcmV0dXJuO1xuICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpLmZpbHRlcigoZSkgPT5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduZXVtZScpLFxuICAgICAgKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyb3VwTmNzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCkuZmlsdGVyKChlKSA9PlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKS5jbGFzc0xpc3QuY29udGFpbnMoJ25jJyksXG4gICAgICApO1xuICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndW5ncm91cE5ldW1lcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCk7XG4gICAgICBncm91cGluZ0FjdGlvbigndW5ncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZ3JvdXBOY3MnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmMnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1saWdhdHVyZScpXG4gICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRJZHMoKTtcblxuICAgICAgICBjb25zdCBlZGl0b3JBY3Rpb246IFRvZ2dsZUxpZ2F0dXJlQWN0aW9uID0ge1xuICAgICAgICAgIGFjdGlvbjogJ3RvZ2dsZUxpZ2F0dXJlJyxcbiAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgZWxlbWVudElkczogZWxlbWVudElkcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBuZW9uVmlld1xuICAgICAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdMaWdhdHVyZSBUb2dnbGVkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTGlnYXR1cmUgVG9nZ2xlIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kR3JvdXBpbmdTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtbGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdG9nZ2xlTGlua2VkU3lsbGFibGVzKCk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbi8qKlxuICogR3JvdXBpbmcvVW5ncm91cGluZyBrZXliaW5kaW5nIGV2ZW50IGxpc3RlbmVyXG4gKi9cbmNvbnN0IGtleWRvd25MaXN0ZW5lciA9IGZ1bmN0aW9uIChlKSB7XG4gIGlmIChlLmtleSA9PT0gJ2cnKSB7XG4gICAgLy8gZ2V0IHNlbGVjdGVkIGVsZW1lbnRzIHRvIGNoZWNrIGlmIHRoZXkgY2FuIGJlIGdyb3VwZWRzXG4gICAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJyksXG4gICAgKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjtcblxuICAgIGNvbnN0IHNlbGVjdGlvblR5cGUgPSBTZWxlY3RUb29scy5nZXRTZWxlY3Rpb25UeXBlKCk7XG5cbiAgICBpZiAoY29udGFpbnNMaW5rZWQoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSByZXR1cm47XG5cbiAgICAvLyBHcm91cC9tZXJnZSBvciB1bmdyb3VwL3NwbGl0IGJhc2VkIG9uIHNlbGVjdGlvbiB0eXBlXG4gICAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgICAgLy8gaWYgc3lsbGFibGVzIGFyZSBsaW5ua2FibGUsIHRvZ2dsZSBsaW5rZWQgc3lsbGFibGVcbiAgICAgICAgLy8gbGlua2VkIHN5bGxhYmxlcyBjYW5ub3QgYmUgZ3JvdXBlZC91bmdyb3VwZWRcbiAgICAgICAgaWYgKGlzTGlua2FibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgdG9nZ2xlTGlua2VkU3lsbGFibGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgaWYgZ3JvdXBhYmxlIGJlZm9yZSBncm91cGluZ1xuICAgICAgICBlbHNlIGlmIChpc0dyb3VwYWJsZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKS5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjYW4gb25seSB1bmdyb3VwIGlmIGxlbmd0aCBpcyAxIChvbmUgc3lsbGFibGUgc2VsZWN0ZWQpXG4gICAgICAgIC8vIGNhbm5vdCB1bmdyb3VwIGlmIG11bHRpcGxlIHN5bGxhYmxlcyBhcmUgc2VsZWN0ZWRcbiAgICAgICAgZWxzZSBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICAgIGlmIChpc0dyb3VwYWJsZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmMnLCBlbGVtZW50SWRzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICAgIGlmIChpc0dyb3VwYWJsZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmMnLCBlbGVtZW50SWRzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICAgIGlmIChpc0dyb3VwYWJsZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHtcbiAgICAgICAgICBtZXJnZVN0YXZlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN0YWZmU3BsaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYENhbid0IHBlcmZvcm0gZ3JvdXBpbmcvdW5ncm91cGluZyBhY3Rpb24gb24gc2VsZWN0aW9uIHR5cGUgJHtzZWxlY3Rpb25UeXBlfS5gLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEZvcm0gYW5kIGV4ZWN1dGUgYSBncm91cC91bmdyb3VwIGFjdGlvbi5cbiAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgYWN0aW9uIHRvIGV4ZWN1dGUuIEVpdGhlciBcImdyb3VwXCIgb3IgXCJ1bmdyb3VwXCIuXG4gKiBAcGFyYW0gZ3JvdXBUeXBlIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gZ3JvdXAuIEVpdGhlciBcIm5ldW1lXCIgb3IgXCJuY1wiLlxuICogQHBhcmFtIGVsZW1lbnRJZHMgLSBUaGUgSURzIG9mIHRoZSBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gZ3JvdXBpbmdBY3Rpb24oXG4gIGFjdGlvbjogJ2dyb3VwJyB8ICd1bmdyb3VwJyxcbiAgZ3JvdXBUeXBlOiAnbmV1bWUnIHwgJ25jJyxcbiAgZWxlbWVudElkczogc3RyaW5nW10sXG4pOiB2b2lkIHtcbiAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgcGFyYW06IHtcbiAgICAgIGdyb3VwVHlwZTogZ3JvdXBUeXBlLFxuICAgICAgZWxlbWVudElkczogZWxlbWVudElkcyxcbiAgICB9LFxuICB9O1xuICBuZW9uVmlld1xuICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgU3VjY2VzcycsICdzdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdVbmdyb3VwaW5nIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYWN0aW9uID09PSAnZ3JvdXAnKSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdHcm91cGluZyBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1VuZ3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG5cbiAgICAgIC8vIFByb21wdCB1c2VyIHRvIGNvbmZpcm0gaWYgTmVvbiBkb2VzIG5vdCByZSBjb2duaXplIGNvbnRvdXJcbiAgICAgIGlmIChncm91cFR5cGUgPT09ICduYycpIHtcbiAgICAgICAgY29uc3QgbmV1bWVQYXJlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgICAgICBlbGVtZW50SWRzWzBdLFxuICAgICAgICApLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG5jcyA9IEFycmF5LmZyb20obmV1bWVQYXJlbnQuY2hpbGRyZW4pIGFzIFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuICAgICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyKG5jcyk7XG4gICAgICAgIGlmIChjb250b3VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBXYXJuaW5ncy5ncm91cGluZ05vdFJlY29nbml6ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZW5kR3JvdXBpbmdTZWxlY3Rpb24oKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdW5saW5rKGVsZW1lbnRJZHM6IHN0cmluZ1tdKTogQXJyYXk8RWRpdG9yQWN0aW9uPiB7XG4gIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcbiAgZm9yIChjb25zdCBpZCBvZiBlbGVtZW50SWRzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICBwYXJhbS5wdXNoKHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtZWk6Zm9sbG93cycpKSB7XG4gICAgICBwYXJhbS5wdXNoKHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9sbG93cycsXG4gICAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldFRleHQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyYW07XG59XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGFuIGVsZW1lbnQgYnkgSUQgYW5kIGVuc3VyZSBpdCdzIGFuIFNWR0dyYXBoaWNzRWxlbWVudFxuZnVuY3Rpb24gZ2V0U1ZHR3JhcGhpY3NFbGVtZW50QnlJZChpZDogc3RyaW5nKTogU1ZHR3JhcGhpY3NFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU1ZHR3JhcGhpY3NFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFRvZ2dsZVN5bGxhYmxlSWRzKFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IFtTVkdHcmFwaGljc0VsZW1lbnQsIFNWR0dyYXBoaWNzRWxlbWVudF0ge1xuICAvLyBTb3J0IGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIG9yZGVyIGluIHRoZSBET01cbiAgZWxlbWVudHMuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHN0YWZmQSA9IGEuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgY29uc3Qgc3RhZmZCID0gYi5jbG9zZXN0KCcuc3RhZmYnKTtcbiAgICByZXR1cm4gc3RhZmZBLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YWZmQikgJlxuICAgICAgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkdcbiAgICAgID8gLTFcbiAgICAgIDogMTtcbiAgfSk7XG5cbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBbZWxlbWVudHNbMF0sIGVsZW1lbnRzWzFdXTtcbiAgfVxuXG4gIGNvbnN0IHVubGlua2VkRWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoXG4gICAgKGVsKSA9PiAhZWwuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSAmJiAhZWwuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpLFxuICApO1xuXG4gIGlmICh1bmxpbmtlZEVsZW1lbnQpIHtcbiAgICBjb25zdCBpbmRleCA9IGVsZW1lbnRzLmluZGV4T2YodW5saW5rZWRFbGVtZW50KTtcblxuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtlbGVtZW50c1tpbmRleF0sIGVsZW1lbnRzW2luZGV4ICsgMV1dO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IGVsZW1lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiBbZWxlbWVudHNbaW5kZXggLSAxXSwgZWxlbWVudHNbaW5kZXhdXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hhdCBhY3Rpb24gKGxpbmsvdW5saW5rKSB0byBwZXJmb3JtIHdoZW4gdXNlciBjbGlja3Mgb24gXCJUb2dnbGUgTGlua2VkIFN5bGxhYmxlXCJcbiAqIEFsc28gY2FsbGVkIHdoZW4gY29ycmVzcGluZGluZyBob3RrZXkgaXMgcHJlc3NlZC5cbiAqL1xuZnVuY3Rpb24gdG9nZ2xlTGlua2VkU3lsbGFibGVzKCkge1xuICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiBbXSxcbiAgfTtcbiAgY29uc3QgcGFyYW0gPSBuZXcgQXJyYXk8RWRpdG9yQWN0aW9uPigpO1xuXG4gIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudElkc1xuICAgIC5tYXAoZ2V0U1ZHR3JhcGhpY3NFbGVtZW50QnlJZCkgLy8gTWFwIElEcyB0byBTVkdHcmFwaGljc0VsZW1lbnQgb3IgbnVsbFxuICAgIC5maWx0ZXIoKGVsKTogZWwgaXMgU1ZHR3JhcGhpY3NFbGVtZW50ID0+IGVsICE9PSBudWxsKTtcblxuICBpZiAoaXNMaW5rZWQoZWxlbWVudHMpKSB7XG4gICAgcGFyYW0ucHVzaCguLi51bmxpbmsoZWxlbWVudElkcykpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtmaXJzdFN5bGxhYmxlLCBzZWNvbmRTeWxsYWJsZV0gPSBnZXRUb2dnbGVTeWxsYWJsZUlkcyhlbGVtZW50cyk7XG4gICAgY29uc29sZS5sb2coZmlyc3RTeWxsYWJsZS5pZCwgc2Vjb25kU3lsbGFibGUuaWQpO1xuICAgIHBhcmFtLnB1c2goe1xuICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZmlyc3RTeWxsYWJsZS5pZCxcbiAgICAgICAgYXR0clR5cGU6ICdwcmVjZWRlcycsXG4gICAgICAgIGF0dHJWYWx1ZTogJyMnICsgc2Vjb25kU3lsbGFibGUuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHBhcmFtLnB1c2goe1xuICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogc2Vjb25kU3lsbGFibGUuaWQsXG4gICAgICAgIGF0dHJUeXBlOiAnZm9sbG93cycsXG4gICAgICAgIGF0dHJWYWx1ZTogJyMnICsgZmlyc3RTeWxsYWJsZS5pZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gRGVsZXRlIHN5bCBvbiBzZWNvbmQgc3lsbGFibGVcbiAgICBjb25zdCBzeWwgPSBzZWNvbmRTeWxsYWJsZS5xdWVyeVNlbGVjdG9yKCcuc3lsJyk7XG4gICAgaWYgKHN5bCAhPT0gbnVsbCkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3JlbW92ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBzeWwuaWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjaGFpbkFjdGlvbi5wYXJhbSA9IHBhcmFtO1xuICBuZW9uVmlld1xuICAgIC5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1RvZ2dsZWQgU3lsbGFibGUgTGluaycsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBUb2dnbGUgU3lsbGFibGUgTGluaycsXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBJRHMgb2Ygc2VsZWN0ZWQgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdldElkcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlkcyA9IFtdO1xuICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgaWRzLnB1c2goZWwuaWQpO1xuICB9KTtcbiAgcmV0dXJuIGlkcztcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgSURzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cycgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGdldENoaWxkcmVuSWRzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY2hpbGRyZW5JZHMgPSBbXTtcbiAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlmIChcbiAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpIHx8XG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjY2lkJykgfHxcbiAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucygnY2xlZicpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5jaGlsZHJlbik7XG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2gpID0+IHtcbiAgICAgIGNoaWxkcmVuSWRzLnB1c2goY2guaWQpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGNoaWxkcmVuSWRzO1xufVxuIiwiaW1wb3J0IHsgTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZXJyb3JMb2dzUGFuZWxDb250ZW50cyB9IGZyb20gJy4uL1NxdWFyZUVkaXQvQ29udGVudHMnO1xuaW1wb3J0IHsgc2V0U2V0dGluZ3MsIGdldFNldHRpbmdzIH0gZnJvbSAnLi9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCB7IE1vZGFsV2luZG93LCBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuL01vZGFsV2luZG93JztcblxuZnVuY3Rpb24gY3JlYXRlTG9nTWVzc2FnZSAobm90aWY6IE5vdGlmaWNhdGlvbik6IEVsZW1lbnQge1xuICBjb25zdCBub3RpZkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBub3RpZkRpdi5jbGFzc0xpc3QuYWRkKCdub3RpZmljYXRpb24tY29udGFpbmVyJyk7XG4gIG5vdGlmRGl2LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLW1haW5cIj4ke25vdGlmLm1lc3NhZ2V9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZXh0cmFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLWJ0bi1jb250YWluZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RpZi1sb2ctaW5mby1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBjbGFzcz1cIm5vdGlmLWxvZy1pbmZvLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvbm90aWZpY2F0aW9uLWluZm8taWNvbi1saWdodC5zdmdcIiB0aXRsZT1cIkxvZyBNZXNzYWdlXCI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RpZi1yZW1vdmUtaWNvbi13cmFwcGVyXCI+XG4gICAgICAgICAgPGltZyBjbGFzcz1cImxvZy1yZW1vdmUgbm90aWYtcmVtb3ZlLWljb25cIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvZ2FyYmFnZS1jbG9zZWQuc3ZnXCIgdGl0bGU9XCJSZW1vdmVcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgYDtcblxuICBjb25zdCByZW1vdmVCdG4gPSBub3RpZkRpdi5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PignLmxvZy1yZW1vdmUnKTtcbiAgcmVtb3ZlQnRuLm9uY2xpY2sgPSAoKSA9PiBub3RpZkRpdi5yZW1vdmUoKTtcbiAgcmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICByZW1vdmVCdG4uc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL2dhcmJhZ2Utb3Blbi5zdmdgKTtcbiAgfSk7XG4gIHJlbW92ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICByZW1vdmVCdG4uc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL2dhcmJhZ2UtY2xvc2VkLnN2Z2ApO1xuICB9KTtcblxuICBpZiAobm90aWYubG9nSW5mbykge1xuICAgIGNvbnN0IGluZm9CdG4gPSBub3RpZkRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLm5vdGlmLWxvZy1pbmZvLWljb24nKTtcbiAgICBpbmZvQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIHJlbW92ZUJ0bi5zdHlsZS5oZWlnaHQgPSAnMjBweCc7XG5cbiAgICBpbmZvQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgIGluZm9CdG4uc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL25vdGlmaWNhdGlvbi1pbmZvLWljb24tZGFyay5zdmdgKTtcbiAgICB9KTtcbiAgICBpbmZvQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgaW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvbm90aWZpY2F0aW9uLWluZm8taWNvbi1saWdodC5zdmdgKTtcbiAgICB9KTtcbiAgICBpbmZvQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gb3BlbkVycm9yTG9nV2luZG93KG5vdGlmLmxvZ0luZm8pKTtcbiAgfVxuXG4gIHJldHVybiBub3RpZkRpdjtcbn1cblxuXG4vKipcbiAqIEFkZCBub3RpZmljYXRpb24gdG8gdGhlIHBlcnNpc3RlbnQgZXJyb3IgbG9nIG9uIHRoZSBzaWRlYmFyXG4gKiBAcGFyYW0gbm90aWYge05vdGlmaWNhdGlvbn0gTm90aWZpY2F0aW9uIHRvIGFkZCB0byB0aGUgZXJyb3IgbG9nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmROb3RpZmljYXRpb24gKG5vdGlmOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgY29uc3QgbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yTG9nQ29udGVudHMnKTtcbiAgbG9nLnByZXBlbmQoY3JlYXRlTG9nTWVzc2FnZShub3RpZikpO1xufVxuXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBlcnJvciBsb2cuXG4gKiBBZGRzIG5lY2Vzc2FyeSBIVE1MIHRvIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRFcnJvckxvZygpOiB2b2lkIHtcbiAgLy8gRXJyb3IgbG9nIHBhbmVsXG4gIGNvbnN0IGxvZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvcl9sb2cnKTtcbiAgbG9nLmlubmVySFRNTCA9IGVycm9yTG9nc1BhbmVsQ29udGVudHM7XG5cbiAgaW5pdEVycm9yTG9nQ29udHJvbHMoKTtcbn1cblxuXG4vKipcbiAqIFNldCB1cCBldmVudCBsaXN0ZW5lcnMgZm9yIGVycm9yIExvZyBwYW5lbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEVycm9yTG9nQ29udHJvbHMoKTogdm9pZCB7XG4gIGNvbnN0IGVycm9yUGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JfbG9nJyk7XG4gIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JMb2dIZWFkaW5nJyk7XG4gIGNvbnN0IGRyb3Bkb3duSWNvbiA9IGhlYWRpbmcucXVlcnlTZWxlY3Rvcignc3ZnID4gdXNlJyk7XG4gIGNvbnN0IGNvbnRlbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yTG9nQ29udGVudHMnKSBhcyBIVE1MRWxlbWVudDtcblxuICBjb25zdCB7IGRpc3BsYXlFcnJMb2cgfSA9IGdldFNldHRpbmdzKCk7XG4gIGlmIChkaXNwbGF5RXJyTG9nKSBlcnJvclBhbmVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcblxuICBoZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGlmIGVycm9yIHBhbmVsIGlzIGNsb3NlZCwgb3BlbiBpdFxuICAgIGlmIChjb250ZW50cy5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb3NlZCcpKSB7XG4gICAgICAvLyBzZXQgY2xhc3NlcyBhbmQgc3R5bGVzIGZvciBhbiBvcGVuIHBhbmVsXG4gICAgICBjb250ZW50cy5jbGFzc0xpc3QucmVtb3ZlKCdjbG9zZWQnKTtcbiAgICAgIGNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMC41ZW0gMC43NWVtJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIH0sIDIwMCk7XG4gICAgICBkcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duYCk7XG4gICAgfSBcbiAgICAvLyBpZiBlcnJvciBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdFxuICAgIGVsc2Uge1xuICAgICAgLy8gc2V0IGNsYXNzZXMgYW5kIHN0eWxlcyBmb3IgYSBjbG9zZWQgcGFuZWxcbiAgICAgIGNvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ2Nsb3NlZCcpO1xuICAgICAgY29udGVudHMuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb250ZW50cy5zdHlsZS5wYWRkaW5nID0gJzBweCc7XG4gICAgICB9LCAyMDApO1xuICAgICAgZHJvcGRvd25JY29uLnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tc2lkZWApO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5pdERpc3BsYXlMaXN0ZW5lcigpO1xufVxuXG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgY2xpY2sgbGlzdGVuZXIgb24gXCJTaG93IGVycm9yIGxvZ3NcIiBidXR0b24gaW4gXCJWaWV3XCIgZHJvcGRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RGlzcGxheUxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBjaGVja2JveGVzQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Rpc3BsYXktc2luZ2xlLWNvbnRhaW5lcicpO1xuICBjb25zdCBlcnJvcnNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gIGNvbnN0IGVyb3Jyc0J0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cbiAgZXJvcnJzQnRuLmNsYXNzTGlzdC5hZGQoJ2NoZWNrYm94Jyk7XG4gIGVycm9yc0xhYmVsLmNsYXNzTGlzdC5hZGQoJ2NoZWNrYm94LWNvbnRhaW5lcicsICdzaWRlLXBhbmVsLWJ0bicpO1xuICBlcnJvcnNMYWJlbC50ZXh0Q29udGVudCA9ICdFcnJvcnMnO1xuICBlcm9ycnNCdG4uaWQgPSAnZGlzcGxheS1lcnJvcnMnO1xuICBlcm9ycnNCdG4udHlwZSA9ICdjaGVja2JveCc7XG4gIGVyb3Jyc0J0bi5jaGVja2VkID0gZmFsc2U7XG4gIGVycm9yc0xhYmVsLmFwcGVuZENoaWxkKGVyb3Jyc0J0bik7XG4gIGNoZWNrYm94ZXNDb250YWluZXIuYXBwZW5kKGVycm9yc0xhYmVsKTtcblxuICBjb25zdCB7IGRpc3BsYXlFcnJMb2cgfSA9IGdldFNldHRpbmdzKCk7XG4gIGVyb3Jyc0J0bi5jaGVja2VkID0gZGlzcGxheUVyckxvZztcblxuICBlcm9ycnNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgc2V0U2V0dGluZ3MoeyBkaXNwbGF5RXJyTG9nOiBlcm9ycnNCdG4uY2hlY2tlZCB9KTtcbiAgICB1cGRhdGVFcnJvckxvZ1Zpc2liaWxpdHkoKTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gb3BlbkVycm9yTG9nV2luZG93KGxvZzogc3RyaW5nKSB7XG4gIGNvbnN0IG1vZGFsV2luZG93ID0gbmV3IE1vZGFsV2luZG93KCk7XG4gIG1vZGFsV2luZG93LnNldE1vZGFsV2luZG93VmlldyhNb2RhbFdpbmRvd1ZpZXcuRVJST1JfTE9HLCBsb2cpO1xuICBtb2RhbFdpbmRvdy5vcGVuTW9kYWxXaW5kb3coKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgY29uc3Qgbm90aWZQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvcl9sb2cnKTtcbiAgY29uc3QgeyBkZWJ1Z01vZGUsIGRpc3BsYXlFcnJMb2csIGRpc3BsYXlJbmZvLCBkaXNwbGF5QkJveCwgZGlzcGxheVRleHQgfSA9IGdldFNldHRpbmdzKCk7XG5cbiAgY29uc3QgZGlzcGxheUFsbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5LWFsbC1idG4nKTtcblxuICBpZiAoZGVidWdNb2RlKSB7XG4gICAgaWYgKGRpc3BsYXlFcnJMb2cpIHtcbiAgICAgIG5vdGlmUGFuZWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgICAgaWYgKGRpc3BsYXlJbmZvICYmIGRpc3BsYXlCQm94ICYmIFxuICAgICAgICBkaXNwbGF5VGV4dCAmJiBkaXNwbGF5RXJyTG9nKSB7XG4gICAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnSGlkZSBBbGwnO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG5vdGlmUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgICAgaWYgKGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnRGlzcGxheSBBbGwnO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBub3RpZlBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICBpZiAoZGlzcGxheUluZm8gJiYgZGlzcGxheUJCb3ggJiYgZGlzcGxheVRleHQpIHtcbiAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0hpZGUgQWxsJztcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgZGlzcGxheUFsbEJ0bi5pbm5lckhUTUwgPSAnRGlzcGxheSBBbGwnO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCB7IGdldFN0YWZmQkJveCwgc2VsZWN0QkJveCwgc2VsZWN0U3RhZmYsIHNlbGVjdEFsbCB9IGZyb20gJy4vU2VsZWN0VG9vbHMnO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcblxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgRWRpdG9yQWN0aW9uLCBSZXNpemVBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBpc091dE9mU1ZHQm91bmRzIH0gZnJvbSAnLi9Db29yZGluYXRlcyc7XG5pbXBvcnQgeyBxdWV1ZU5vdGlmaWNhdGlvbiB9IGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9Mb2NhbFNldHRpbmdzJztcblxuLyoqXG4gKiBSZXNpemUgYSBzdGFmZiBvciBhIHN5bGxhYmxlIHRleHQgYm91bmRpbmcgYm94LlxuICogRm9yIHN0YXZlcywgdGhpcyBhbHNvIHN1cHBvcnRzIGFkanVzdGluZyB0aGUgcm90YXRlLlxuICovXG50eXBlIFBvaW50ID0geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgbmFtZTogbnVtYmVyIH07XG5cbi8qKlxuICogVGhlIHBvaW50cyB5b3UgY2FuIGNsaWNrIGFuZCBkcmFnIHRvIHJlc2l6ZVxuICovXG5jb25zdCBQb2ludE5hbWVzID0ge1xuICBUb3BMZWZ0OiAwLFxuICBUb3A6IDEsXG4gIFRvcFJpZ2h0OiAyLFxuICBSaWdodDogMyxcbiAgQm90dG9tUmlnaHQ6IDQsXG4gIEJvdHRvbTogNSxcbiAgQm90dG9tTGVmdDogNixcbiAgTGVmdDogN1xufTtcblxuZnVuY3Rpb24gZ2V0UG9pbnRzKHVseDogbnVtYmVyLCB1bHk6IG51bWJlciwgbHJ4OiBudW1iZXIsIGxyeTogbnVtYmVyLCByb3RhdGU6IG51bWJlcik6IFBvaW50W10ge1xuICAvLyBOb3RlIHRoYXQgYXJjIGZ1bmN0aW9ucyByZXR1cm4gYW4gYW5nbGUgeCBpbiBbLXBpLzIsIHBpLzJdLlxuICBsZXQgcG9pbnRzOiBBcnJheTxQb2ludD47XG4gIC8vIHVsIGlzIHVseCwgdWx5LCBsciBpcyBscngsIGxyeVxuICBpZiAocm90YXRlID49IDApIHtcbiAgICBwb2ludHMgPSBbXG4gICAgICB7IHg6IHVseCwgeTogdWx5LCBuYW1lOiBQb2ludE5hbWVzLlRvcExlZnQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiB1bHkgKyAobHJ4IC0gdWx4KSAvIDIgKiBNYXRoLnNpbihyb3RhdGUpLCBuYW1lOiBQb2ludE5hbWVzLlRvcCB9LFxuICAgICAgeyB4OiBscngsIHk6IHVseSArIChscnggLSB1bHgpICogTWF0aC5zaW4ocm90YXRlKSwgbmFtZTogUG9pbnROYW1lcy5Ub3BSaWdodCB9LFxuICAgICAgeyB4OiBscngsIHk6ICh1bHkgKyBscnkgKyAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSkpIC8gMiwgbmFtZTogUG9pbnROYW1lcy5SaWdodCB9LFxuICAgICAgeyB4OiBscngsIHk6IGxyeSwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b21SaWdodCB9LFxuICAgICAgeyB4OiAodWx4ICsgbHJ4KSAvIDIsIHk6IGxyeSAtIChscnggLSB1bHgpIC8gMiAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tIH0sXG4gICAgICB7IHg6IHVseCwgeTogbHJ5IC0gKGxyeCAtIHVseCkgKiBNYXRoLnNpbihyb3RhdGUpLCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbUxlZnQgfSxcbiAgICAgIHsgeDogdWx4LCB5OiAodWx5ICsgbHJ5IC0gKGxyeCAtIHVseCkgKiBNYXRoLnNpbihyb3RhdGUpKSAvIDIsIG5hbWU6IFBvaW50TmFtZXMuTGVmdCB9XG4gICAgXTtcbiAgfVxuICAvLyBOb3QgdGhhdFxuICBlbHNlIHtcbiAgICBjb25zdCBhID0gKGxyeCAtIHVseCkgKiBNYXRoLnRhbihNYXRoLmFicyhyb3RhdGUpKTtcbiAgICBjb25zdCBiID0gbHJ5IC0gdWx5IC0gYTtcbiAgICBwb2ludHMgPSBbXG4gICAgICB7IHg6IHVseCwgeTogdWx5ICsgYSwgbmFtZTogUG9pbnROYW1lcy5Ub3BMZWZ0IH0sXG4gICAgICB7IHg6ICh1bHggKyBscngpIC8gMiwgeTogdWx5ICsgYSAvIDIsIG5hbWU6IFBvaW50TmFtZXMuVG9wIH0sXG4gICAgICB7IHg6IGxyeCwgeTogdWx5LCBuYW1lOiBQb2ludE5hbWVzLlRvcFJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogdWx5ICsgYiAvIDIsIG5hbWU6IFBvaW50TmFtZXMuUmlnaHQgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHkgKyBiLCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0IH0sXG4gICAgICB7IHg6ICh1bHggKyBscngpIC8gMiwgeTogbHJ5IC0gYSAvIDIsIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tIH0sXG4gICAgICB7IHg6IHVseCwgeTogbHJ5LCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbUxlZnQgfSxcbiAgICAgIHsgeDogdWx4LCB5OiBscnkgLSBiIC8gMiwgbmFtZTogUG9pbnROYW1lcy5MZWZ0IH1cbiAgICBdO1xuICB9XG4gIHJldHVybiBwb2ludHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemUgKGVsZW1lbnQ6IFNWR0dyYXBoaWNzRWxlbWVudCwgbmVvblZpZXc6IE5lb25WaWV3LCBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIpOiB2b2lkIHtcbiAgbGV0IHVseDogbnVtYmVyO1xuICBsZXQgdWx5OiBudW1iZXI7XG4gIGxldCBscng6IG51bWJlcjtcbiAgbGV0IGxyeTogbnVtYmVyO1xuICBsZXQgcm90YXRlOiBudW1iZXI7XG5cbiAgbGV0IGluaXRpYWxVbHg6IG51bWJlciwgaW5pdGlhbExyeDogbnVtYmVyO1xuICBsZXQgaW5pdGlhbFBvaW50OiBudW1iZXJbXSwgaW5pdGlhbFVseTogbnVtYmVyLCBpbml0aWFsTHJ5OiBudW1iZXIsXG4gICAgaW5pdGlhbFk6IG51bWJlciwgaW5pdGlhbFJlY3RZOiBudW1iZXIsIHBvbHlMZW46IG51bWJlciwgZHk6IG51bWJlciwgaW5pdGlhbFJvdGF0ZTogbnVtYmVyO1xuXG4gIGRyYXdJbml0aWFsUmVjdCgpO1xuXG4gIC8qKlxuICAgKiBSZWRyYXcgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBuZXcgYm91bmRzXG4gICAqL1xuICBmdW5jdGlvbiByZWRyYXcgKCk6IHZvaWQge1xuICAgIGNvbnN0IHBvaW50czogUG9pbnRbXSA9IGdldFBvaW50cyh1bHgsIHVseSwgbHJ4LCBscnksIHJvdGF0ZSk7XG5cbiAgICBjb25zdCBwb2ludFN0cmluZzogc3RyaW5nID0gcG9pbnRzLmZpbHRlcigoX2VsZW0sIGluZGV4KSA9PiB7IHJldHVybiBpbmRleCAlIDIgPT09IDA7IH0pXG4gICAgICAubWFwKGVsZW0gPT4gZWxlbS54ICsgJywnICsgZWxlbS55KVxuICAgICAgLmpvaW4oJyAnKTtcblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZXNpemVSZWN0Jykuc2V0QXR0cmlidXRlKCdwb2ludHMnLCBwb2ludFN0cmluZyk7XG5cbiAgICBjb25zdCB0ZXh0UmVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zeWwuc2VsZWN0ZWQgPiAuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgIGlmICh0ZXh0UmVjdCkge1xuICAgICAgdGV4dFJlY3Quc2V0QXR0cmlidXRlKCd4JywgU3RyaW5nKE1hdGgubWluKHVseCwgbHJ4KSkpO1xuICAgICAgdGV4dFJlY3Quc2V0QXR0cmlidXRlKCd5JywgU3RyaW5nKE1hdGgubWluKHVseSwgbHJ5KSkpO1xuICAgICAgdGV4dFJlY3Quc2V0QXR0cmlidXRlKCd3aWR0aCcsIFN0cmluZyhNYXRoLmFicyhscnggLSB1bHgpKSk7XG4gICAgICB0ZXh0UmVjdC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFN0cmluZyhNYXRoLmFicyhscnkgLSB1bHkpKSk7XG4gICAgfVxuXG5cbiAgICBmb3IgKGNvbnN0IHBvaW50TmFtZSBpbiBQb2ludE5hbWVzKSB7XG4gICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBwb2ludHNbUG9pbnROYW1lc1twb2ludE5hbWVdXTtcbiAgICAgIGQzLnNlbGVjdCgnI3AtJyArIHBvaW50TmFtZSkuZmlsdGVyKCcucmVzaXplUG9pbnQnKVxuICAgICAgICAuYXR0cignY3gnLCBwb2ludC54KVxuICAgICAgICAuYXR0cignY3knLCBwb2ludC55KTtcbiAgICB9XG5cbiAgICBsZXQgeCA9IHBvaW50c1szXS54O1xuICAgIGxldCB5ID0gcG9pbnRzWzNdLnk7XG4gICAgY29uc3QgcG9pbnRTdHJpbmdSaWdodCA9ICh4ICsgMTAwKSArICcsJyArICh5ICsgODUpICsgJyAnICtcbiAgICAgICh4ICsgNzApICsgJywnICsgKHkgKyA1MCkgKyAnICcgKyAoeCArIDEwMCkgKyAnLCcgKyAoeSArIDE1KSArICcgJyArICh4ICsgMTMwKSArICcsJyArICh5ICsgNTApO1xuICAgIHggPSBwb2ludHNbN10ueDtcbiAgICB5ID0gcG9pbnRzWzddLnk7XG4gICAgY29uc3QgcG9pbnRTdHJpbmdMZWZ0ID0gKHggLSAxMDApICsgJywnICsgKHkgLSAxNSkgKyAnICcgK1xuICAgICAgKHggLSAxMzApICsgJywnICsgKHkgLSA1MCkgKyAnICcgKyAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDg1KSArICcgJyArICh4IC0gNzApICsgJywnICsgKHkgLSA1MCk7XG5cbiAgICBkMy5zZWxlY3QoJyNyb3RhdGVMZWZ0JykuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmdMZWZ0KTtcbiAgICBkMy5zZWxlY3QoJyNyb3RhdGVSaWdodCcpLmF0dHIoJ3BvaW50cycsIHBvaW50U3RyaW5nUmlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGluaXRpYWwgcmVjdGFuZ2xlIGFyb3VuZCB0aGUgZWxlbWVudFxuICAgKiBhbmQgYWRkIHRoZSBsaXN0ZW5lcnMgdG8gc3VwcG9ydCBkcmFnZ2luZyB0byByZXNpemUuXG4gICAqL1xuICBmdW5jdGlvbiBkcmF3SW5pdGlhbFJlY3QgKCk6IHZvaWQge1xuICAgIGlmIChlbGVtZW50ID09PSBudWxsKSByZXR1cm47XG5cbiAgICBkMy5zZWxlY3RBbGwoJy5yZXNpemVQb2ludCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnI3Jlc2l6ZVJlY3QnKS5yZW1vdmUoKTtcbiAgICBkMy5zZWxlY3RBbGwoJy5yb3RhdGVQb2ludCcpLnJlbW92ZSgpO1xuXG4gICAgLy8gaWYgaXQncyBhIGJvdW5kaW5nYm94IGp1c3QgZ2V0IHRoZSBjb29yZGluYXRlc1xuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICBpZiAocmVjdCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RyaWVkIHRvIGRyYXcgcmVzaXplIHJlY3QgZm9yIGEgc3lsVGV4dFJlY3QgdGhhdCBkb2VzblxcJ3QgZXhpc3QgKG9yIGlzblxcJ3QgZGlzcGxheWluZyknKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdWx4ID0gTnVtYmVyKHJlY3QuZ2V0QXR0cmlidXRlKCd4JykpO1xuICAgICAgdWx5ID0gTnVtYmVyKHJlY3QuZ2V0QXR0cmlidXRlKCd5JykpO1xuICAgICAgbHJ4ID0gK3VseCArICtyZWN0LmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICAgIGxyeSA9ICt1bHkgKyArcmVjdC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuXG4gICAgICByb3RhdGUgPSAwO1xuICAgIH1cblxuICAgIC8vIGlmIGl0J3MgYSBzdGFmZiB1c2UgdGhlIHBhdGhzIHRvIGdldCBpdCdzIGJvdW5kaW5nYm94XG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSB7XG4gICAgICBjb25zdCBiYm94ID0gZ2V0U3RhZmZCQm94KGVsZW1lbnQpO1xuICAgICAgdWx4ID0gYmJveC51bHg7XG4gICAgICB1bHkgPSBiYm94LnVseTtcbiAgICAgIGxyeCA9IGJib3gubHJ4O1xuICAgICAgbHJ5ID0gYmJveC5scnk7XG5cbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzOiBudW1iZXJbXSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcigncGF0aCcpXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ2QnKVxuICAgICAgICAubWF0Y2goL1xcZCsvZylcbiAgICAgICAgLm1hcChlbGVtZW50ID0+IE51bWJlcihlbGVtZW50KSk7XG4gICAgICByb3RhdGUgPSBNYXRoLmF0YW4oKGNvb3JkaW5hdGVzWzNdIC0gY29vcmRpbmF0ZXNbMV0pIC9cbiAgICAgICAgKGNvb3JkaW5hdGVzWzJdIC0gY29vcmRpbmF0ZXNbMF0pKTtcbiAgICB9XG5cbiAgICBpbml0aWFsVWx4ID0gdWx4LCBpbml0aWFsVWx5ID0gdWx5LCBpbml0aWFsTHJ4ID0gbHJ4LCBpbml0aWFsTHJ5ID0gbHJ5O1xuXG4gICAgbGV0IHdoaWNoUG9pbnQ6IHN0cmluZztcblxuICAgIGNvbnN0IHBvaW50cyA9IGdldFBvaW50cyh1bHgsIHVseSwgbHJ4LCBscnksIHJvdGF0ZSk7XG5cbiAgICBwb2x5TGVuID0gcG9pbnRzWzJdLnggLSBwb2ludHNbMF0ueDtcblxuICAgIGNvbnN0IHBvaW50U3RyaW5nID0gcG9pbnRzLmZpbHRlcigoXywgaW5kZXgpID0+IGluZGV4ICUgMiA9PT0gMClcbiAgICAgIC5tYXAoZWxlbSA9PiBlbGVtLnggKyAnLCcgKyBlbGVtLnkpXG4gICAgICAuam9pbignICcpO1xuXG4gICAgZDMuc2VsZWN0KCcjJyArIGVsZW1lbnQuaWQpLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAuYXR0cigncG9pbnRzJywgcG9pbnRTdHJpbmcpXG4gICAgICAuYXR0cignaWQnLCAncmVzaXplUmVjdCcpXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxMClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxuICAgICAgLnN0eWxlKCdjdXJzb3InLCAnbW92ZScpXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMjAgMTAnKTtcblxuICAgIGNvbnN0IHsgY2lyY2xlU2l6ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICAgIGZvciAoY29uc3QgcG9pbnROYW1lIGluIFBvaW50TmFtZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50OiBQb2ludCA9IHBvaW50c1tQb2ludE5hbWVzW3BvaW50TmFtZV1dO1xuICAgICAgZDMuc2VsZWN0KGVsZW1lbnQudmlld3BvcnRFbGVtZW50KS5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgIC5hdHRyKCdjeCcsIHBvaW50LngpXG4gICAgICAgIC5hdHRyKCdjeScsIHBvaW50LnkpXG4gICAgICAgIC5hdHRyKCdyJywgY2lyY2xlU2l6ZSlcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCA0KVxuICAgICAgICAuYXR0cignZmlsbCcsICcjMDA5OWZmJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3Jlc2l6ZVBvaW50JylcbiAgICAgICAgLmF0dHIoJ2lkJywgJ3AtJyArIHBvaW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gZG8gaXQgYXMgYSBsb29wIGluc3RlYWQgb2Ygc2VsZWN0QWxsIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkga25vdyB3aGljaCBwb2ludCB3YXNcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gUG9pbnROYW1lcykge1xuICAgICAgZDMuc2VsZWN0KCcjcC0nICsgbmFtZSkuZmlsdGVyKCcucmVzaXplUG9pbnQnKS5jYWxsKFxuICAgICAgICBkMy5kcmFnKClcbiAgICAgICAgICAub24oJ3N0YXJ0JywgKCkgPT4geyByZXNpemVTdGFydChuYW1lKTsgfSlcbiAgICAgICAgICAub24oJ2RyYWcnLCByZXNpemVEcmFnKVxuICAgICAgICAgIC5vbignZW5kJywgcmVzaXplRW5kLmJpbmQodGhpcykpKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIGxldCB4ID0gcG9pbnRzWzNdLng7XG4gICAgICBsZXQgeSA9IHBvaW50c1szXS55O1xuICAgICAgY29uc3QgcG9pbnRTdHJpbmdSaWdodCA9ICh4ICsgMTAwKSArICcsJyArICh5ICsgODUpICsgJyAnICtcbiAgICAgICAgKHggKyA3MCkgKyAnLCcgKyAoeSArIDUwKSArICcgJyArICh4ICsgMTAwKSArICcsJyArICh5ICsgMTUpICsgJyAnICsgKHggKyAxMzApICsgJywnICsgKHkgKyA1MCk7XG4gICAgICB4ID0gcG9pbnRzWzddLng7XG4gICAgICB5ID0gcG9pbnRzWzddLnk7XG4gICAgICBjb25zdCBwb2ludFN0cmluZ0xlZnQgPSAoeCAtIDEwMCkgKyAnLCcgKyAoeSAtIDE1KSArICcgJyArXG4gICAgICAgICh4IC0gMTMwKSArICcsJyArICh5IC0gNTApICsgJyAnICsgKHggLSAxMDApICsgJywnICsgKHkgLSA4NSkgKyAnICcgKyAoeCAtIDcwKSArICcsJyArICh5IC0gNTApO1xuXG4gICAgICBkMy5zZWxlY3QoJyMnICsgZWxlbWVudC5pZCkuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgLmF0dHIoJ3BvaW50cycsIHBvaW50U3RyaW5nUmlnaHQpXG4gICAgICAgIC5hdHRyKCdpZCcsICdyb3RhdGVSaWdodCcpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgNylcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnIzAwOTlmZicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdyb3RhdGVQb2ludCcpO1xuXG4gICAgICBkMy5zZWxlY3QoJyMnICsgZWxlbWVudC5pZCkuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgLmF0dHIoJ3BvaW50cycsIHBvaW50U3RyaW5nTGVmdClcbiAgICAgICAgLmF0dHIoJ2lkJywgJ3JvdGF0ZUxlZnQnKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDcpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJyMwMDk5ZmYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAncm90YXRlUG9pbnQnKTtcblxuICAgICAgZDMuc2VsZWN0KCcjcm90YXRlTGVmdCcpLmNhbGwoXG4gICAgICAgIGQzLmRyYWcoKVxuICAgICAgICAgIC5vbignc3RhcnQnLCByb3RhdGVTdGFydClcbiAgICAgICAgICAub24oJ2RyYWcnLCByb3RhdGVEcmFnTGVmdClcbiAgICAgICAgICAub24oJ2VuZCcsIHJvdGF0ZUVuZCkpO1xuXG4gICAgICBkMy5zZWxlY3QoJyNyb3RhdGVSaWdodCcpLmNhbGwoXG4gICAgICAgIGQzLmRyYWcoKVxuICAgICAgICAgIC5vbignc3RhcnQnLCByb3RhdGVTdGFydClcbiAgICAgICAgICAub24oJ2RyYWcnLCByb3RhdGVEcmFnUmlnaHQpXG4gICAgICAgICAgLm9uKCdlbmQnLCByb3RhdGVFbmQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemVTdGFydCAobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICB3aGljaFBvaW50ID0gbmFtZTtcbiAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLmZpbmQocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lc1tuYW1lXSk7XG4gICAgICBpbml0aWFsUG9pbnQgPSBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgICBpbml0aWFsVWx5ID0gdWx5O1xuICAgICAgaW5pdGlhbExyeSA9IGxyeTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemVEcmFnICgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQb2ludCA9IGQzLm1vdXNlKHRoaXMpO1xuICAgICAgc3dpdGNoIChQb2ludE5hbWVzW3doaWNoUG9pbnRdKSB7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5Ub3BMZWZ0OlxuICAgICAgICAgIHVseCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICB1bHkgPSBjdXJyZW50UG9pbnRbMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5Ub3A6XG4gICAgICAgICAgdWx5ID0gY3VycmVudFBvaW50WzFdIC0gKGxyeCAtIHVseCkgKiBNYXRoLnRhbihyb3RhdGUpIC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLlRvcFJpZ2h0OlxuICAgICAgICAgIGxyeCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICB1bHkgPSBjdXJyZW50UG9pbnRbMV0gLSAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5SaWdodDpcbiAgICAgICAgICBscnggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgbHJ5ID0gaW5pdGlhbExyeSArIChjdXJyZW50UG9pbnRbMF0gLSBpbml0aWFsUG9pbnRbMF0pICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0OlxuICAgICAgICAgIGxyeCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICBscnkgPSBjdXJyZW50UG9pbnRbMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5Cb3R0b206XG4gICAgICAgICAgbHJ5ID0gY3VycmVudFBvaW50WzFdICsgKGxyeCAtIHVseCkgKiBNYXRoLnRhbihyb3RhdGUpIC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLkJvdHRvbUxlZnQ6XG4gICAgICAgICAgdWx4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIGxyeSA9IGN1cnJlbnRQb2ludFsxXSArIChscnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQb2ludE5hbWVzLkxlZnQ6XG4gICAgICAgICAgdWx4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIHVseSA9IGluaXRpYWxVbHkgKyAoY3VycmVudFBvaW50WzBdIC0gaW5pdGlhbFBvaW50WzBdKSAqIE1hdGgudGFuKHJvdGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcignU29tZXRoaW5nIHRoYXQgd2FzblxcJ3QgYSBzaWRlIG9mIHRoZSByZWN0YW5nbGUgd2FzIGRyYWdnZWQuIFRoaXMgc2hvdWxkblxcJ3QgaGFwcGVuLicpO1xuICAgICAgfVxuICAgICAgcmVkcmF3KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzaXplRW5kICgpOiB2b2lkIHtcbiAgICAgIGlmIChpc091dE9mU1ZHQm91bmRzKHVseCwgdWx5KSB8fCBpc091dE9mU1ZHQm91bmRzKGxyeCwgbHJ5KSkge1xuICAgICAgICB1bHggPSBpbml0aWFsVWx4LCB1bHkgPSBpbml0aWFsVWx5LCBscnggPSBpbml0aWFsTHJ4LCBscnkgPSBpbml0aWFsTHJ5O1xuICAgICAgICByZWRyYXcoKTtcblxuICAgICAgICByZXR1cm4gcXVldWVOb3RpZmljYXRpb24oJ1tGQUlMXSBHbHlwaHMgd2VyZSBwbGFjZWQgb3V0IG9mIGJvdW5kcyEgUmVzaXplIGFjdGlvbiBmYWlsZWQuJywgJ2Vycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkaXRvckFjdGlvbjogUmVzaXplQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdyZXNpemUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICB1bHg6IHVseCxcbiAgICAgICAgICB1bHk6IHVseSxcbiAgICAgICAgICBscng6IGxyeCxcbiAgICAgICAgICBscnk6IGxyeVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBuZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2VsZW1lbnQuaWR9YCk7XG4gICAgICAgIHVseCA9IHVuZGVmaW5lZCwgdWx5ID0gdW5kZWZpbmVkLCBscnggPSB1bmRlZmluZWQsIGxyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZHJhd0luaXRpYWxSZWN0KCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKSB7XG4gICAgICAgICAgc2VsZWN0QkJveChlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIGRyYWdIYW5kbGVyLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RBbGwoW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2VsZW1lbnQuaWR9YCldLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgICAgIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbW9yZUVkaXQnKTtcblxuICAgICAgICAgIGlmIChtb3JlRWRpdCkge1xuICAgICAgICAgICAgbW9yZUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUk9UQVRFXG4gICAgZnVuY3Rpb24gcm90YXRlU3RhcnQgKCk6IHZvaWQge1xuICAgICAgY29uc3Qgd2hpY2ggPSBkMy5ldmVudC5zb3VyY2VFdmVudC50YXJnZXQuaWQ7XG4gICAgICBpbml0aWFsWSA9IGQzLm1vdXNlKHRoaXMpWzFdO1xuICAgICAgaW5pdGlhbExyeSA9IGxyeTtcbiAgICAgIGluaXRpYWxVbHkgPSB1bHk7XG4gICAgICBpbml0aWFsUmVjdFkgPSAod2hpY2ggPT09ICdyb3RhdGVSaWdodCcgPyBscnkgOiB1bHkpO1xuICAgICAgaW5pdGlhbFJvdGF0ZSA9IHJvdGF0ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGVEcmFnTGVmdCAoKTogdm9pZCB7XG4gICAgICBjb25zdCBjdXJyZW50WSA9IGQzLm1vdXNlKHRoaXMpWzFdO1xuICAgICAgY29uc3QgdGVtcCA9IGN1cnJlbnRZIC0gaW5pdGlhbFk7XG4gICAgICBjb25zdCB0ZW1wUm90YXRlID0gaW5pdGlhbFJvdGF0ZSAtIE1hdGguYXRhbih0ZW1wIC8gcG9seUxlbik7XG4gICAgICBpZiAodGVtcFJvdGF0ZSA+IC0wLjIgJiYgdGVtcFJvdGF0ZSA8IDAuMikge1xuICAgICAgICBkeSA9IHRlbXA7XG4gICAgICAgIHVseSA9IGluaXRpYWxSZWN0WSArIGR5O1xuICAgICAgICByb3RhdGUgPSB0ZW1wUm90YXRlO1xuICAgICAgICBpZiAocm90YXRlID49IDApIHtcbiAgICAgICAgICB1bHkgPSBkeSArIHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Ub3BMZWZ0KVswXS55O1xuICAgICAgICAgIGxyeSA9IHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Cb3R0b21SaWdodClbMF0ueTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bHkgPSBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuVG9wUmlnaHQpWzBdLnk7XG4gICAgICAgICAgbHJ5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuQm90dG9tTGVmdClbMF0ueTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVkcmF3KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm90YXRlRHJhZ1JpZ2h0ICgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRZID0gZDMubW91c2UodGhpcylbMV07XG4gICAgICBjb25zdCB0ZW1wID0gY3VycmVudFkgLSBpbml0aWFsWTtcbiAgICAgIGNvbnN0IHRlbXBSb3RhdGUgPSBpbml0aWFsUm90YXRlICsgTWF0aC5hdGFuKHRlbXAgLyBwb2x5TGVuKTtcbiAgICAgIGlmICh0ZW1wUm90YXRlID4gLTAuMiAmJiB0ZW1wUm90YXRlIDwgMC4yKSB7XG4gICAgICAgIGR5ID0gdGVtcDtcbiAgICAgICAgcm90YXRlID0gdGVtcFJvdGF0ZTtcbiAgICAgICAgaWYgKHJvdGF0ZSA+PSAwICkge1xuICAgICAgICAgIGxyeSA9IGR5ICsgcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbVJpZ2h0KVswXS55O1xuICAgICAgICAgIHVseSA9IHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Ub3BMZWZ0KVswXS55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVseSA9IGR5ICsgcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcFJpZ2h0KVswXS55O1xuICAgICAgICAgIGxyeSA9IHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Cb3R0b21MZWZ0KVswXS55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWRyYXcoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGVFbmQgKCk6IHZvaWQge1xuICAgICAgaWYgKGR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZHkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNPdXRPZlNWR0JvdW5kcyh1bHgsIHVseSkgfHwgaXNPdXRPZlNWR0JvdW5kcyhscngsIGxyeSkpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlc2l6ZVBvaW50JykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZXNpemVSZWN0JykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yb3RhdGVQb2ludCcpLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpO1xuXG4gICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50LmlkKSBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgICAgdWx4ID0gdW5kZWZpbmVkO1xuICAgICAgICB1bHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGxyeCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZHJhd0luaXRpYWxSZWN0KCk7XG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgICAgICBzZWxlY3RCQm94KGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSwgZHJhZ0hhbmRsZXIsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdFN0YWZmKGVsZW1lbnQsIGRyYWdIYW5kbGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWV1ZU5vdGlmaWNhdGlvbignW0ZBSUxdIEdseXBocyB3ZXJlIHBsYWNlZCBvdXQgb2YgYm91bmRzISBSb3RhdGUgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3Jlc2l6ZVJvdGF0ZScsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHVseDogdWx4LFxuICAgICAgICAgIHVseTogdWx5LFxuICAgICAgICAgIGxyeDogbHJ4LFxuICAgICAgICAgIGxyeTogbHJ5LFxuICAgICAgICAgIHJvdGF0ZTogcm90YXRlICogMTgwIC8gTWF0aC5QSVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbmVvblZpZXcuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBhd2FpdCBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50LmlkKSBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgICAgdWx4ID0gdW5kZWZpbmVkLCB1bHkgPSB1bmRlZmluZWQsIGxyeCA9IHVuZGVmaW5lZCwgbHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICBkeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZHJhd0luaXRpYWxSZWN0KCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKSB7XG4gICAgICAgICAgc2VsZWN0QkJveChlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIGRyYWdIYW5kbGVyLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RTdGFmZihlbGVtZW50LCBkcmFnSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGltbWVkaWF0ZSBmcm9tICdpbW1lZGlhdGUnO1xuaW1wb3J0IHsgdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCBNZDUgZnJvbSAnc3BhcmstbWQ1JztcbmltcG9ydCB2dXZ1emVsYSBmcm9tICd2dXZ1emVsYSc7XG5pbXBvcnQgZ2V0QXJndW1lbnRzIGZyb20gJ2FyZ3NhcnJheSc7XG5pbXBvcnQgaW5oZXJpdHMgZnJvbSAnaW5oZXJpdHMnO1xuaW1wb3J0IEVFIGZyb20gJ2V2ZW50cyc7XG5cbmZ1bmN0aW9uIG1hbmdsZShrZXkpIHtcbiAgcmV0dXJuICckJyArIGtleTtcbn1cbmZ1bmN0aW9uIHVubWFuZ2xlKGtleSkge1xuICByZXR1cm4ga2V5LnN1YnN0cmluZygxKTtcbn1cbmZ1bmN0aW9uIE1hcCQxKCkge1xuICB0aGlzLl9zdG9yZSA9IHt9O1xufVxuTWFwJDEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgdmFyIG1hbmdsZWQgPSBtYW5nbGUoa2V5KTtcbiAgcmV0dXJuIHRoaXMuX3N0b3JlW21hbmdsZWRdO1xufTtcbk1hcCQxLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICB0aGlzLl9zdG9yZVttYW5nbGVkXSA9IHZhbHVlO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5NYXAkMS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgbWFuZ2xlZCA9IG1hbmdsZShrZXkpO1xuICByZXR1cm4gbWFuZ2xlZCBpbiB0aGlzLl9zdG9yZTtcbn07XG5NYXAkMS5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3N0b3JlKS5tYXAoayA9PiB1bm1hbmdsZShrKSk7XG59O1xuTWFwJDEucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgdmFyIG1hbmdsZWQgPSBtYW5nbGUoa2V5KTtcbiAgdmFyIHJlcyA9IG1hbmdsZWQgaW4gdGhpcy5fc3RvcmU7XG4gIGRlbGV0ZSB0aGlzLl9zdG9yZVttYW5nbGVkXTtcbiAgcmV0dXJuIHJlcztcbn07XG5NYXAkMS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYikge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX3N0b3JlKTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLl9zdG9yZVtrZXldO1xuICAgIGtleSA9IHVubWFuZ2xlKGtleSk7XG4gICAgY2IodmFsdWUsIGtleSk7XG4gIH1cbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwJDEucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3N0b3JlKS5sZW5ndGg7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBTZXQkMShhcnJheSkge1xuICB0aGlzLl9zdG9yZSA9IG5ldyBNYXAkMSgpO1xuXG4gIC8vIGluaXQgd2l0aCBhbiBhcnJheVxuICBpZiAoYXJyYXkgJiYgQXJyYXkuaXNBcnJheShhcnJheSkpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkKGFycmF5W2ldKTtcbiAgICB9XG4gIH1cbn1cblNldCQxLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9zdG9yZS5zZXQoa2V5LCB0cnVlKTtcbn07XG5TZXQkMS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gdGhpcy5fc3RvcmUuaGFzKGtleSk7XG59O1xuU2V0JDEucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2IpIHtcbiAgdGhpcy5fc3RvcmUuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIGNiKGtleSk7XG4gIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQkMS5wcm90b3R5cGUsICdzaXplJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuc2l6ZTtcbiAgfVxufSk7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8va2FuZ2F4LmdpdGh1Yi5pby9jb21wYXQtdGFibGUvZXM2LyB3ZSBjYW4gc25pZmYgb3V0XG4vLyBpbmNvbXBsZXRlIE1hcC9TZXQgaW1wbGVtZW50YXRpb25zIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBvdXIgdGVzdHMgdG8gZmFpbC5cbi8vIE5vdGFibHkgdGhleSBmYWlsIGluIElFMTEgYW5kIGlPUyA4LjQsIHdoaWNoIHRoaXMgcHJldmVudHMuXG5mdW5jdGlvbiBzdXBwb3J0c01hcEFuZFNldCgpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm9wID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihNYXAsIFN5bWJvbC5zcGVjaWVzKTtcbiAgcmV0dXJuIHByb3AgJiYgJ2dldCcgaW4gcHJvcCAmJiBNYXBbU3ltYm9sLnNwZWNpZXNdID09PSBNYXA7XG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb250YWdlanMvY29sbGVjdGlvbnNcblxudmFyIEV4cG9ydGVkU2V0O1xudmFyIEV4cG9ydGVkTWFwO1xuXG57XG4gIGlmIChzdXBwb3J0c01hcEFuZFNldCgpKSB7IC8vIHByZWZlciBidWlsdC1pbiBNYXAvU2V0XG4gICAgRXhwb3J0ZWRTZXQgPSBTZXQ7XG4gICAgRXhwb3J0ZWRNYXAgPSBNYXA7XG4gIH0gZWxzZSB7IC8vIGZhbGwgYmFjayB0byBvdXIgcG9seWZpbGxcbiAgICBFeHBvcnRlZFNldCA9IFNldCQxO1xuICAgIEV4cG9ydGVkTWFwID0gTWFwJDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNCaW5hcnlPYmplY3Qob2JqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHxcbiAgICAodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIG9iamVjdCBpbnN0YW5jZW9mIEJsb2IpO1xufVxuXG5mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGJ1ZmYpIHtcbiAgaWYgKHR5cGVvZiBidWZmLnNsaWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJ1ZmYuc2xpY2UoMCk7XG4gIH1cbiAgLy8gSUUxMC0xMSBzbGljZSgpIHBvbHlmaWxsXG4gIHZhciB0YXJnZXQgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZi5ieXRlTGVuZ3RoKTtcbiAgdmFyIHRhcmdldEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGFyZ2V0KTtcbiAgdmFyIHNvdXJjZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZik7XG4gIHRhcmdldEFycmF5LnNldChzb3VyY2VBcnJheSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lQmluYXJ5T2JqZWN0KG9iamVjdCkge1xuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuICB9XG4gIHZhciBzaXplID0gb2JqZWN0LnNpemU7XG4gIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG4gIC8vIEJsb2JcbiAgaWYgKHR5cGVvZiBvYmplY3Quc2xpY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb2JqZWN0LnNsaWNlKDAsIHNpemUsIHR5cGUpO1xuICB9XG4gIC8vIFBoYW50b21KUyBzbGljZSgpIHJlcGxhY2VtZW50XG4gIHJldHVybiBvYmplY3Qud2Via2l0U2xpY2UoMCwgc2l6ZSwgdHlwZSk7XG59XG5cbi8vIG1vc3Qgb2YgdGhpcyBpcyBib3Jyb3dlZCBmcm9tIGxvZGFzaC5pc1BsYWluT2JqZWN0OlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zpcy1jb21wb25lbnRzL2xvZGFzaC5pc3BsYWlub2JqZWN0L1xuLy8gYmxvYi8yOWMzNTgxNDBhNzRmMjUyYWViMDhjOWViMjhiZWY4NmYyMjE3ZDRhL2luZGV4LmpzXG5cbnZhciBmdW5jVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChwcm90byA9PT0gbnVsbCkgeyAvLyBub3Qgc3VyZSB3aGVuIHRoaXMgaGFwcGVucywgYnV0IEkgZ3Vlc3MgaXQgY2FuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGNsb25lKG9iamVjdCkge1xuICB2YXIgbmV3T2JqZWN0O1xuICB2YXIgaTtcbiAgdmFyIGxlbjtcblxuICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgbmV3T2JqZWN0ID0gW107XG4gICAgZm9yIChpID0gMCwgbGVuID0gb2JqZWN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBuZXdPYmplY3RbaV0gPSBjbG9uZShvYmplY3RbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3T2JqZWN0O1xuICB9XG5cbiAgLy8gc3BlY2lhbCBjYXNlOiB0byBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBJbmRleGVkREJcbiAgLy8gYW5kIG90aGVyIGJhY2tlbmRzLCB3ZSBhdXRvbWF0aWNhbGx5IHN0cmluZ2lmeSBEYXRlc1xuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGF0ZSAmJiBpc0Zpbml0ZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgaWYgKGlzQmluYXJ5T2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gY2xvbmVCaW5hcnlPYmplY3Qob2JqZWN0KTtcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDsgLy8gZG9uJ3QgY2xvbmUgb2JqZWN0cyBsaWtlIFdvcmtlcnNcbiAgfVxuXG4gIG5ld09iamVjdCA9IHt9O1xuICBmb3IgKGkgaW4gb2JqZWN0KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgaSkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGNsb25lKG9iamVjdFtpXSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBuZXdPYmplY3RbaV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld09iamVjdDtcbn1cblxuZnVuY3Rpb24gb25jZShmdW4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgLy8gdGhpcyBpcyBhIHNtb2tlIHRlc3QgYW5kIHNob3VsZCBuZXZlciBhY3R1YWxseSBoYXBwZW5cbiAgICAgIHRocm93IG5ldyBFcnJvcignb25jZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZ1bi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b1Byb21pc2UoZnVuYykge1xuICAvL2NyZWF0ZSB0aGUgZnVuY3Rpb24gd2Ugd2lsbCBiZSByZXR1cm5pbmdcbiAgcmV0dXJuIGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgIC8vIENsb25lIGFyZ3VtZW50c1xuICAgIGFyZ3MgPSBjbG9uZShhcmdzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gaWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgYSBmdW5jdGlvbiwgYXNzdW1lIGl0cyBhIGNhbGxiYWNrXG4gICAgdmFyIHVzZWRDQiA9ICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSA/IGFyZ3MucG9wKCkgOiBmYWxzZTtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHtcbiAgICAgIHZhciByZXNwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gb25jZShmdW5jdGlvbiAoZXJyLCBtZXNnKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZ1bGZpbGwobWVzZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gY3JlYXRlIGEgY2FsbGJhY2sgZm9yIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAvLyBhcHBseSB0aGUgZnVuY3Rpb24gaW4gdGhlIG9yaWcgY29udGV4dFxuICAgICAgICBhcmdzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXNwID0gZnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgaWYgKHJlc3AgJiYgdHlwZW9mIHJlc3AudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGZ1bGZpbGwocmVzcCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIGlmIHRoZXJlIGlzIGEgY2FsbGJhY2ssIGNhbGwgaXQgYmFja1xuICAgIGlmICh1c2VkQ0IpIHtcbiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHVzZWRDQihudWxsLCByZXN1bHQpO1xuICAgICAgfSwgdXNlZENCKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBsb2dBcGlDYWxsKHNlbGYsIG5hbWUsIGFyZ3MpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChzZWxmLmNvbnN0cnVjdG9yLmxpc3RlbmVycygnZGVidWcnKS5sZW5ndGgpIHtcbiAgICB2YXIgbG9nQXJncyA9IFsnYXBpJywgc2VsZi5uYW1lLCBuYW1lXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBsb2dBcmdzLnB1c2goYXJnc1tpXSk7XG4gICAgfVxuICAgIHNlbGYuY29uc3RydWN0b3IuZW1pdCgnZGVidWcnLCBsb2dBcmdzKTtcblxuICAgIC8vIG92ZXJyaWRlIHRoZSBjYWxsYmFjayBpdHNlbGYgdG8gbG9nIHRoZSByZXNwb25zZVxuICAgIHZhciBvcmlnQ2FsbGJhY2sgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdID0gZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICB2YXIgcmVzcG9uc2VBcmdzID0gWydhcGknLCBzZWxmLm5hbWUsIG5hbWVdO1xuICAgICAgcmVzcG9uc2VBcmdzID0gcmVzcG9uc2VBcmdzLmNvbmNhdChcbiAgICAgICAgZXJyID8gWydlcnJvcicsIGVycl0gOiBbJ3N1Y2Nlc3MnLCByZXNdXG4gICAgICApO1xuICAgICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCdkZWJ1ZycsIHJlc3BvbnNlQXJncyk7XG4gICAgICBvcmlnQ2FsbGJhY2soZXJyLCByZXMpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRhcHRlckZ1bihuYW1lLCBjYWxsYmFjaykge1xuICByZXR1cm4gdG9Qcm9taXNlKGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2RhdGFiYXNlIGlzIGNsb3NlZCcpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZGF0YWJhc2UgaXMgZGVzdHJveWVkJykpO1xuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbG9nQXBpQ2FsbChzZWxmLCBuYW1lLCBhcmdzKTtcbiAgICBpZiAoIXRoaXMudGFza3F1ZXVlLmlzUmVhZHkpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZnVsZmlsbCwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYudGFza3F1ZXVlLmFkZFRhc2soZnVuY3Rpb24gKGZhaWxlZCkge1xuICAgICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIHJlamVjdChmYWlsZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmdWxmaWxsKHNlbGZbbmFtZV0uYXBwbHkoc2VsZiwgYXJncykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9KSk7XG59XG5cbi8vIGxpa2UgdW5kZXJzY29yZS9sb2Rhc2ggXy5waWNrKClcbmZ1bmN0aW9uIHBpY2sob2JqLCBhcnIpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIHByb3AgPSBhcnJbaV07XG4gICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICByZXNbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vIE1vc3QgYnJvd3NlcnMgdGhyb3R0bGUgY29uY3VycmVudCByZXF1ZXN0cyBhdCA2LCBzbyBpdCdzIHNpbGx5XG4vLyB0byBzaGltIF9idWxrX2dldCBieSB0cnlpbmcgdG8gbGF1bmNoIHBvdGVudGlhbGx5IGh1bmRyZWRzIG9mIHJlcXVlc3RzXG4vLyBhbmQgdGhlbiBsZXR0aW5nIHRoZSBtYWpvcml0eSB0aW1lIG91dC4gV2UgY2FuIGhhbmRsZSB0aGlzIG91cnNlbHZlcy5cbnZhciBNQVhfTlVNX0NPTkNVUlJFTlRfUkVRVUVTVFMgPSA2O1xuXG5mdW5jdGlvbiBpZGVudGl0eUZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0KHJlc3VsdCkge1xuICByZXR1cm4gW3tcbiAgICBvazogcmVzdWx0XG4gIH1dO1xufVxuXG4vLyBzaGltIGZvciBQL0NvdWNoREIgYWRhcHRlcnMgdGhhdCBkb24ndCBkaXJlY3RseSBpbXBsZW1lbnQgX2J1bGtfZ2V0XG5mdW5jdGlvbiBidWxrR2V0KGRiLCBvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgcmVxdWVzdHMgPSBvcHRzLmRvY3M7XG5cbiAgLy8gY29uc29saWRhdGUgaW50byBvbmUgcmVxdWVzdCBwZXIgZG9jIGlmIHBvc3NpYmxlXG4gIHZhciByZXF1ZXN0c0J5SWQgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgcmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgIGlmIChyZXF1ZXN0c0J5SWQuaGFzKHJlcXVlc3QuaWQpKSB7XG4gICAgICByZXF1ZXN0c0J5SWQuZ2V0KHJlcXVlc3QuaWQpLnB1c2gocmVxdWVzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3RzQnlJZC5zZXQocmVxdWVzdC5pZCwgW3JlcXVlc3RdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBudW1Eb2NzID0gcmVxdWVzdHNCeUlkLnNpemU7XG4gIHZhciBudW1Eb25lID0gMDtcbiAgdmFyIHBlckRvY1Jlc3VsdHMgPSBuZXcgQXJyYXkobnVtRG9jcyk7XG5cbiAgZnVuY3Rpb24gY29sbGFwc2VSZXN1bHRzQW5kRmluaXNoKCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgcGVyRG9jUmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHJlcy5kb2NzLmZvckVhY2goZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICBpZDogcmVzLmlkLFxuICAgICAgICAgIGRvY3M6IFtpbmZvXVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNhbGxiYWNrKG51bGwsIHtyZXN1bHRzOiByZXN1bHRzfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgaWYgKCsrbnVtRG9uZSA9PT0gbnVtRG9jcykge1xuICAgICAgY29sbGFwc2VSZXN1bHRzQW5kRmluaXNoKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ290UmVzdWx0KGRvY0luZGV4LCBpZCwgZG9jcykge1xuICAgIHBlckRvY1Jlc3VsdHNbZG9jSW5kZXhdID0ge2lkOiBpZCwgZG9jczogZG9jc307XG4gICAgY2hlY2tEb25lKCk7XG4gIH1cblxuICB2YXIgYWxsUmVxdWVzdHMgPSBbXTtcbiAgcmVxdWVzdHNCeUlkLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBhbGxSZXF1ZXN0cy5wdXNoKGtleSk7XG4gIH0pO1xuXG4gIHZhciBpID0gMDtcblxuICBmdW5jdGlvbiBuZXh0QmF0Y2goKSB7XG5cbiAgICBpZiAoaSA+PSBhbGxSZXF1ZXN0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdXBUbyA9IE1hdGgubWluKGkgKyBNQVhfTlVNX0NPTkNVUlJFTlRfUkVRVUVTVFMsIGFsbFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgdmFyIGJhdGNoID0gYWxsUmVxdWVzdHMuc2xpY2UoaSwgdXBUbyk7XG4gICAgcHJvY2Vzc0JhdGNoKGJhdGNoLCBpKTtcbiAgICBpICs9IGJhdGNoLmxlbmd0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NCYXRjaChiYXRjaCwgb2Zmc2V0KSB7XG4gICAgYmF0Y2guZm9yRWFjaChmdW5jdGlvbiAoZG9jSWQsIGopIHtcbiAgICAgIHZhciBkb2NJZHggPSBvZmZzZXQgKyBqO1xuICAgICAgdmFyIGRvY1JlcXVlc3RzID0gcmVxdWVzdHNCeUlkLmdldChkb2NJZCk7XG5cbiAgICAgIC8vIGp1c3QgdXNlIHRoZSBmaXJzdCByZXF1ZXN0IGFzIHRoZSBcInRlbXBsYXRlXCJcbiAgICAgIC8vIFRPRE86IFRoZSBfYnVsa19nZXQgQVBJIGFsbG93cyBmb3IgbW9yZSBzdWJ0bGUgdXNlIGNhc2VzIHRoYW4gdGhpcyxcbiAgICAgIC8vIGJ1dCBmb3Igbm93IGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlcmUgd2lsbCBiZSBhIG1peCBvZiBkaWZmZXJlbnRcbiAgICAgIC8vIFwiYXR0c19zaW5jZVwiIG9yIFwiYXR0YWNobWVudHNcIiBpbiB0aGUgc2FtZSByZXF1ZXN0LCBzaW5jZSBpdCdzIGp1c3RcbiAgICAgIC8vIHJlcGxpY2F0ZS5qcyB0aGF0IGlzIHVzaW5nIHRoaXMgZm9yIHRoZSBtb21lbnQuXG4gICAgICAvLyBBbHNvLCBhdHRzX3NpbmNlIGlzIGFzcGlyYXRpb25hbCwgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBpdCB5ZXQuXG4gICAgICB2YXIgZG9jT3B0cyA9IHBpY2soZG9jUmVxdWVzdHNbMF0sIFsnYXR0c19zaW5jZScsICdhdHRhY2htZW50cyddKTtcbiAgICAgIGRvY09wdHMub3Blbl9yZXZzID0gZG9jUmVxdWVzdHMubWFwKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgIC8vIHJldiBpcyBvcHRpb25hbCwgb3Blbl9yZXZzIGRpc2FsbG93ZWRcbiAgICAgICAgcmV0dXJuIHJlcXVlc3QucmV2O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHJlbW92ZSBmYWxzZXkgLyB1bmRlZmluZWQgcmV2aXNpb25zXG4gICAgICBkb2NPcHRzLm9wZW5fcmV2cyA9IGRvY09wdHMub3Blbl9yZXZzLmZpbHRlcihpZGVudGl0eUZ1bmN0aW9uKTtcblxuICAgICAgdmFyIGZvcm1hdFJlc3VsdCA9IGlkZW50aXR5RnVuY3Rpb247XG5cbiAgICAgIGlmIChkb2NPcHRzLm9wZW5fcmV2cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGRvY09wdHMub3Blbl9yZXZzO1xuXG4gICAgICAgIC8vIHdoZW4gZmV0Y2hpbmcgb25seSB0aGUgXCJ3aW5uaW5nXCIgbGVhZixcbiAgICAgICAgLy8gdHJhbnNmb3JtIHRoZSByZXN1bHQgc28gaXQgbG9va3MgbGlrZSBhbiBvcGVuX3JldnNcbiAgICAgICAgLy8gcmVxdWVzdFxuICAgICAgICBmb3JtYXRSZXN1bHQgPSBmb3JtYXRSZXN1bHRGb3JPcGVuUmV2c0dldDtcbiAgICAgIH1cblxuICAgICAgLy8gZ2xvYmFsbHktc3VwcGxpZWQgb3B0aW9uc1xuICAgICAgWydyZXZzJywgJ2F0dGFjaG1lbnRzJywgJ2JpbmFyeScsICdhamF4JywgJ2xhdGVzdCddLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSBpbiBvcHRzKSB7XG4gICAgICAgICAgZG9jT3B0c1twYXJhbV0gPSBvcHRzW3BhcmFtXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkYi5nZXQoZG9jSWQsIGRvY09wdHMsIGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlc3VsdCA9IFt7ZXJyb3I6IGVycn1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdFJlc3VsdChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGdvdFJlc3VsdChkb2NJZHgsIGRvY0lkLCByZXN1bHQpO1xuICAgICAgICBuZXh0QmF0Y2goKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmV4dEJhdGNoKCk7XG5cbn1cblxudmFyIGhhc0xvY2FsO1xuXG50cnkge1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnX3BvdWNoX2NoZWNrX2xvY2Fsc3RvcmFnZScsIDEpO1xuICBoYXNMb2NhbCA9ICEhbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ19wb3VjaF9jaGVja19sb2NhbHN0b3JhZ2UnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgaGFzTG9jYWwgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxTdG9yYWdlKCkge1xuICByZXR1cm4gaGFzTG9jYWw7XG59XG5cbi8vIEN1c3RvbSBuZXh0VGljaygpIHNoaW0gZm9yIGJyb3dzZXJzLiBJbiBub2RlLCB0aGlzIHdpbGwganVzdCBiZSBwcm9jZXNzLm5leHRUaWNrKCkuIFdlXG5cbmluaGVyaXRzKENoYW5nZXMsIEVFKTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGF0dGFjaEJyb3dzZXJFdmVudHMoc2VsZikge1xuICBpZiAoaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICBhZGRFdmVudExpc3RlbmVyKFwic3RvcmFnZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgc2VsZi5lbWl0KGUua2V5KTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBDaGFuZ2VzKCkge1xuICBFRS5jYWxsKHRoaXMpO1xuICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcblxuICBhdHRhY2hCcm93c2VyRXZlbnRzKHRoaXMpO1xufVxuQ2hhbmdlcy5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZGJOYW1lLCBpZCwgZGIsIG9wdHMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0aGlzLl9saXN0ZW5lcnNbaWRdKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGlucHJvZ3Jlc3MgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZXZlbnRGdW5jdGlvbigpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXNlbGYuX2xpc3RlbmVyc1tpZF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlucHJvZ3Jlc3MpIHtcbiAgICAgIGlucHJvZ3Jlc3MgPSAnd2FpdGluZyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlucHJvZ3Jlc3MgPSB0cnVlO1xuICAgIHZhciBjaGFuZ2VzT3B0cyA9IHBpY2sob3B0cywgW1xuICAgICAgJ3N0eWxlJywgJ2luY2x1ZGVfZG9jcycsICdhdHRhY2htZW50cycsICdjb25mbGljdHMnLCAnZmlsdGVyJyxcbiAgICAgICdkb2NfaWRzJywgJ3ZpZXcnLCAnc2luY2UnLCAncXVlcnlfcGFyYW1zJywgJ2JpbmFyeScsICdyZXR1cm5fZG9jcydcbiAgICBdKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZnVuY3Rpb24gb25FcnJvcigpIHtcbiAgICAgIGlucHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkYi5jaGFuZ2VzKGNoYW5nZXNPcHRzKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgIGlmIChjLnNlcSA+IG9wdHMuc2luY2UgJiYgIW9wdHMuY2FuY2VsbGVkKSB7XG4gICAgICAgIG9wdHMuc2luY2UgPSBjLnNlcTtcbiAgICAgICAgb3B0cy5vbkNoYW5nZShjKTtcbiAgICAgIH1cbiAgICB9KS5vbignY29tcGxldGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaW5wcm9ncmVzcyA9PT0gJ3dhaXRpbmcnKSB7XG4gICAgICAgIGltbWVkaWF0ZShldmVudEZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlucHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9KS5vbignZXJyb3InLCBvbkVycm9yKTtcbiAgfVxuICB0aGlzLl9saXN0ZW5lcnNbaWRdID0gZXZlbnRGdW5jdGlvbjtcbiAgdGhpcy5vbihkYk5hbWUsIGV2ZW50RnVuY3Rpb24pO1xufTtcblxuQ2hhbmdlcy5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZGJOYW1lLCBpZCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCEoaWQgaW4gdGhpcy5fbGlzdGVuZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBFRS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIuY2FsbCh0aGlzLCBkYk5hbWUsXG4gICAgdGhpcy5fbGlzdGVuZXJzW2lkXSk7XG4gIGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbaWRdO1xufTtcblxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuQ2hhbmdlcy5wcm90b3R5cGUubm90aWZ5TG9jYWxXaW5kb3dzID0gZnVuY3Rpb24gKGRiTmFtZSkge1xuICAvL2RvIGEgdXNlbGVzcyBjaGFuZ2Ugb24gYSBzdG9yYWdlIHRoaW5nXG4gIC8vaW4gb3JkZXIgdG8gZ2V0IG90aGVyIHdpbmRvd3MncyBsaXN0ZW5lcnMgdG8gYWN0aXZhdGVcbiAgaWYgKGhhc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgbG9jYWxTdG9yYWdlW2RiTmFtZV0gPSAobG9jYWxTdG9yYWdlW2RiTmFtZV0gPT09IFwiYVwiKSA/IFwiYlwiIDogXCJhXCI7XG4gIH1cbn07XG5cbkNoYW5nZXMucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uIChkYk5hbWUpIHtcbiAgdGhpcy5lbWl0KGRiTmFtZSk7XG4gIHRoaXMubm90aWZ5TG9jYWxXaW5kb3dzKGRiTmFtZSk7XG59O1xuXG5mdW5jdGlvbiBndWFyZGVkQ29uc29sZShtZXRob2QpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZVttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGNvbnNvbGVbbWV0aG9kXS5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByYW5kb21OdW1iZXIobWluLCBtYXgpIHtcbiAgdmFyIG1heFRpbWVvdXQgPSA2MDAwMDA7IC8vIEhhcmQtY29kZWQgZGVmYXVsdCBvZiAxMCBtaW51dGVzXG4gIG1pbiA9IHBhcnNlSW50KG1pbiwgMTApIHx8IDA7XG4gIG1heCA9IHBhcnNlSW50KG1heCwgMTApO1xuICBpZiAobWF4ICE9PSBtYXggfHwgbWF4IDw9IG1pbikge1xuICAgIG1heCA9IChtaW4gfHwgMSkgPDwgMTsgLy9kb3VibGluZ1xuICB9IGVsc2Uge1xuICAgIG1heCA9IG1heCArIDE7XG4gIH1cbiAgLy8gSW4gb3JkZXIgdG8gbm90IGV4Y2VlZCBtYXhUaW1lb3V0LCBwaWNrIGEgcmFuZG9tIHZhbHVlIGJldHdlZW4gaGFsZiBvZiBtYXhUaW1lb3V0IGFuZCBtYXhUaW1lb3V0XG4gIGlmIChtYXggPiBtYXhUaW1lb3V0KSB7XG4gICAgbWluID0gbWF4VGltZW91dCA+PiAxOyAvLyBkaXZpZGUgYnkgdHdvXG4gICAgbWF4ID0gbWF4VGltZW91dDtcbiAgfVxuICB2YXIgcmF0aW8gPSBNYXRoLnJhbmRvbSgpO1xuICB2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG5cbiAgcmV0dXJuIH5+KHJhbmdlICogcmF0aW8gKyBtaW4pOyAvLyB+fiBjb2VyY2VzIHRvIGFuIGludCwgYnV0IGZhc3QuXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRCYWNrT2ZmKG1pbikge1xuICB2YXIgbWF4ID0gMDtcbiAgaWYgKCFtaW4pIHtcbiAgICBtYXggPSAyMDAwO1xuICB9XG4gIHJldHVybiByYW5kb21OdW1iZXIobWluLCBtYXgpO1xufVxuXG4vLyBkZXNpZ25lZCB0byBnaXZlIGluZm8gdG8gYnJvd3NlciB1c2Vycywgd2hvIGFyZSBkaXN0dXJiZWRcbi8vIHdoZW4gdGhleSBzZWUgaHR0cCBlcnJvcnMgaW4gdGhlIGNvbnNvbGVcbmZ1bmN0aW9uIGV4cGxhaW5FcnJvcihzdGF0dXMsIHN0cikge1xuICBndWFyZGVkQ29uc29sZSgnaW5mbycsICdUaGUgYWJvdmUgJyArIHN0YXR1cyArICcgaXMgdG90YWxseSBub3JtYWwuICcgKyBzdHIpO1xufVxuXG52YXIgYXNzaWduO1xue1xuICBpZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuICB9IGVsc2Uge1xuICAgIC8vIGxpdGUgT2JqZWN0LmFzc2lnbiBwb2x5ZmlsbCBiYXNlZCBvblxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbiAgICBhc3NpZ24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICB2YXIgdG8gPSBPYmplY3QodGFyZ2V0KTtcblxuICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIG5leHRTb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChuZXh0U291cmNlICE9IG51bGwpIHsgLy8gU2tpcCBvdmVyIGlmIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBuZXh0U291cmNlKSB7XG4gICAgICAgICAgICAvLyBBdm9pZCBidWdzIHdoZW4gaGFzT3duUHJvcGVydHkgaXMgc2hhZG93ZWRcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV4dFNvdXJjZSwgbmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRvO1xuICAgIH07XG4gIH1cbn1cblxudmFyICRpbmplY3RfT2JqZWN0X2Fzc2lnbiA9IGFzc2lnbjtcblxuaW5oZXJpdHMoUG91Y2hFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBQb3VjaEVycm9yKHN0YXR1cywgZXJyb3IsIHJlYXNvbikge1xuICBFcnJvci5jYWxsKHRoaXMsIHJlYXNvbik7XG4gIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICB0aGlzLm5hbWUgPSBlcnJvcjtcbiAgdGhpcy5tZXNzYWdlID0gcmVhc29uO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbn1cblxuUG91Y2hFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgIHJlYXNvbjogdGhpcy5yZWFzb25cbiAgfSk7XG59O1xuXG52YXIgVU5BVVRIT1JJWkVEID0gbmV3IFBvdWNoRXJyb3IoNDAxLCAndW5hdXRob3JpemVkJywgXCJOYW1lIG9yIHBhc3N3b3JkIGlzIGluY29ycmVjdC5cIik7XG52YXIgTUlTU0lOR19CVUxLX0RPQ1MgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsIFwiTWlzc2luZyBKU09OIGxpc3Qgb2YgJ2RvY3MnXCIpO1xudmFyIE1JU1NJTkdfRE9DID0gbmV3IFBvdWNoRXJyb3IoNDA0LCAnbm90X2ZvdW5kJywgJ21pc3NpbmcnKTtcbnZhciBSRVZfQ09ORkxJQ1QgPSBuZXcgUG91Y2hFcnJvcig0MDksICdjb25mbGljdCcsICdEb2N1bWVudCB1cGRhdGUgY29uZmxpY3QnKTtcbnZhciBJTlZBTElEX0lEID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnX2lkIGZpZWxkIG11c3QgY29udGFpbiBhIHN0cmluZycpO1xudmFyIE1JU1NJTkdfSUQgPSBuZXcgUG91Y2hFcnJvcig0MTIsICdtaXNzaW5nX2lkJywgJ19pZCBpcyByZXF1aXJlZCBmb3IgcHV0cycpO1xudmFyIFJFU0VSVkVEX0lEID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnT25seSByZXNlcnZlZCBkb2N1bWVudCBpZHMgbWF5IHN0YXJ0IHdpdGggdW5kZXJzY29yZS4nKTtcbnZhciBOT1RfT1BFTiA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ3ByZWNvbmRpdGlvbl9mYWlsZWQnLCAnRGF0YWJhc2Ugbm90IG9wZW4nKTtcbnZhciBVTktOT1dOX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAndW5rbm93bl9lcnJvcicsICdEYXRhYmFzZSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGVycm9yJyk7XG52YXIgQkFEX0FSRyA9IG5ldyBQb3VjaEVycm9yKDUwMCwgJ2JhZGFyZycsICdTb21lIHF1ZXJ5IGFyZ3VtZW50IGlzIGludmFsaWQnKTtcbnZhciBJTlZBTElEX1JFUVVFU1QgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdpbnZhbGlkX3JlcXVlc3QnLCAnUmVxdWVzdCB3YXMgaW52YWxpZCcpO1xudmFyIFFVRVJZX1BBUlNFX0VSUk9SID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAncXVlcnlfcGFyc2VfZXJyb3InLCAnU29tZSBxdWVyeSBwYXJhbWV0ZXIgaXMgaW52YWxpZCcpO1xudmFyIERPQ19WQUxJREFUSU9OID0gbmV3IFBvdWNoRXJyb3IoNTAwLCAnZG9jX3ZhbGlkYXRpb24nLCAnQmFkIHNwZWNpYWwgZG9jdW1lbnQgbWVtYmVyJyk7XG52YXIgQkFEX1JFUVVFU1QgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdTb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgcmVxdWVzdCcpO1xudmFyIE5PVF9BTl9PQkpFQ1QgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdEb2N1bWVudCBtdXN0IGJlIGEgSlNPTiBvYmplY3QnKTtcbnZhciBEQl9NSVNTSU5HID0gbmV3IFBvdWNoRXJyb3IoNDA0LCAnbm90X2ZvdW5kJywgJ0RhdGFiYXNlIG5vdCBmb3VuZCcpO1xudmFyIElEQl9FUlJPUiA9IG5ldyBQb3VjaEVycm9yKDUwMCwgJ2luZGV4ZWRfZGJfd2VudF9iYWQnLCAndW5rbm93bicpO1xudmFyIFdTUV9FUlJPUiA9IG5ldyBQb3VjaEVycm9yKDUwMCwgJ3dlYl9zcWxfd2VudF9iYWQnLCAndW5rbm93bicpO1xudmFyIExEQl9FUlJPUiA9IG5ldyBQb3VjaEVycm9yKDUwMCwgJ2xldmVsREJfd2VudF93ZW50X2JhZCcsICd1bmtub3duJyk7XG52YXIgRk9SQklEREVOID0gbmV3IFBvdWNoRXJyb3IoNDAzLCAnZm9yYmlkZGVuJywgJ0ZvcmJpZGRlbiBieSBkZXNpZ24gZG9jIHZhbGlkYXRlX2RvY191cGRhdGUgZnVuY3Rpb24nKTtcbnZhciBJTlZBTElEX1JFViA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ0ludmFsaWQgcmV2IGZvcm1hdCcpO1xudmFyIEZJTEVfRVhJU1RTID0gbmV3IFBvdWNoRXJyb3IoNDEyLCAnZmlsZV9leGlzdHMnLCAnVGhlIGRhdGFiYXNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4nKTtcbnZhciBNSVNTSU5HX1NUVUIgPSBuZXcgUG91Y2hFcnJvcig0MTIsICdtaXNzaW5nX3N0dWInLCAnQSBwcmUtZXhpc3RpbmcgYXR0YWNobWVudCBzdHViIHdhc25cXCd0IGZvdW5kJyk7XG52YXIgSU5WQUxJRF9VUkwgPSBuZXcgUG91Y2hFcnJvcig0MTMsICdpbnZhbGlkX3VybCcsICdQcm92aWRlZCBVUkwgaXMgaW52YWxpZCcpO1xuXG5mdW5jdGlvbiBjcmVhdGVFcnJvcihlcnJvciwgcmVhc29uKSB7XG4gIGZ1bmN0aW9uIEN1c3RvbVBvdWNoRXJyb3IocmVhc29uKSB7XG4gICAgLy8gaW5oZXJpdCBlcnJvciBwcm9wZXJ0aWVzIGZyb20gb3VyIHBhcmVudCBlcnJvciBtYW51YWxseVxuICAgIC8vIHNvIGFzIHRvIGFsbG93IHByb3BlciBKU09OIHBhcnNpbmcuXG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0eXBlb2YgZXJyb3JbbmFtZXNbaV1dICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbbmFtZXNbaV1dID0gZXJyb3JbbmFtZXNbaV1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICAgIH1cblxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgaWYgKHJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICB9XG4gIH1cbiAgQ3VzdG9tUG91Y2hFcnJvci5wcm90b3R5cGUgPSBQb3VjaEVycm9yLnByb3RvdHlwZTtcbiAgcmV0dXJuIG5ldyBDdXN0b21Qb3VjaEVycm9yKHJlYXNvbik7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UoZXJyKSB7XG5cbiAgaWYgKHR5cGVvZiBlcnIgIT09ICdvYmplY3QnKSB7XG4gICAgdmFyIGRhdGEgPSBlcnI7XG4gICAgZXJyID0gVU5LTk9XTl9FUlJPUjtcbiAgICBlcnIuZGF0YSA9IGRhdGE7XG4gIH1cblxuICBpZiAoJ2Vycm9yJyBpbiBlcnIgJiYgZXJyLmVycm9yID09PSAnY29uZmxpY3QnKSB7XG4gICAgZXJyLm5hbWUgPSAnY29uZmxpY3QnO1xuICAgIGVyci5zdGF0dXMgPSA0MDk7XG4gIH1cblxuICBpZiAoISgnbmFtZScgaW4gZXJyKSkge1xuICAgIGVyci5uYW1lID0gZXJyLmVycm9yIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIGlmICghKCdzdGF0dXMnIGluIGVycikpIHtcbiAgICBlcnIuc3RhdHVzID0gNTAwO1xuICB9XG5cbiAgaWYgKCEoJ21lc3NhZ2UnIGluIGVycikpIHtcbiAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlIHx8IGVyci5yZWFzb247XG4gIH1cblxuICBpZiAoISgnc3RhY2snIGluIGVycikpIHtcbiAgICBlcnIuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG5cbiAgcmV0dXJuIGVycjtcbn1cblxuZnVuY3Rpb24gdHJ5RmlsdGVyKGZpbHRlciwgZG9jLCByZXEpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gIWZpbHRlcihkb2MsIHJlcSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHZhciBtc2cgPSAnRmlsdGVyIGZ1bmN0aW9uIHRocmV3OiAnICsgZXJyLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yKEJBRF9SRVFVRVNULCBtc2cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbHRlckNoYW5nZShvcHRzKSB7XG4gIHZhciByZXEgPSB7fTtcbiAgdmFyIGhhc0ZpbHRlciA9IG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJztcbiAgcmVxLnF1ZXJ5ID0gb3B0cy5xdWVyeV9wYXJhbXM7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGZpbHRlcihjaGFuZ2UpIHtcbiAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgIC8vIENTRyBzZW5kcyBldmVudHMgb24gdGhlIGNoYW5nZXMgZmVlZCB0aGF0IGRvbid0IGhhdmUgZG9jdW1lbnRzLFxuICAgICAgLy8gdGhpcyBoYWNrIG1ha2VzIGEgd2hvbGUgbG90IG9mIGV4aXN0aW5nIGNvZGUgcm9idXN0LlxuICAgICAgY2hhbmdlLmRvYyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBmaWx0ZXJSZXR1cm4gPSBoYXNGaWx0ZXIgJiYgdHJ5RmlsdGVyKG9wdHMuZmlsdGVyLCBjaGFuZ2UuZG9jLCByZXEpO1xuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXJSZXR1cm4gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZmlsdGVyUmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXJSZXR1cm4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICBkZWxldGUgY2hhbmdlLmRvYztcbiAgICB9IGVsc2UgaWYgKCFvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBmb3IgKHZhciBhdHQgaW4gY2hhbmdlLmRvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjaGFuZ2UuZG9jLl9hdHRhY2htZW50cywgYXR0KSkge1xuICAgICAgICAgIGNoYW5nZS5kb2MuX2F0dGFjaG1lbnRzW2F0dF0uc3R1YiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJycykge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcmVzID0gcmVzLmNvbmNhdChhcnJzW2ldKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vLyBzaGltIGZvciBGdW5jdGlvbi5wcm90b3R5cGUubmFtZSxcblxuLy8gRGV0ZXJtaW5lIGlkIGFuIElEIGlzIHZhbGlkXG4vLyAgIC0gaW52YWxpZCBJRHMgYmVnaW4gd2l0aCBhbiB1bmRlcmVzY29yZSB0aGF0IGRvZXMgbm90IGJlZ2luICdfZGVzaWduJyBvclxuLy8gICAgICdfbG9jYWwnXG4vLyAgIC0gYW55IG90aGVyIHN0cmluZyB2YWx1ZSBpcyBhIHZhbGlkIGlkXG4vLyBSZXR1cm5zIHRoZSBzcGVjaWZpYyBlcnJvciBvYmplY3QgZm9yIGVhY2ggY2FzZVxuZnVuY3Rpb24gaW52YWxpZElkRXJyb3IoaWQpIHtcbiAgdmFyIGVycjtcbiAgaWYgKCFpZCkge1xuICAgIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfSUQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHtcbiAgICBlcnIgPSBjcmVhdGVFcnJvcihJTlZBTElEX0lEKTtcbiAgfSBlbHNlIGlmICgvXl8vLnRlc3QoaWQpICYmICEoL15fKGRlc2lnbnxsb2NhbCkvKS50ZXN0KGlkKSkge1xuICAgIGVyciA9IGNyZWF0ZUVycm9yKFJFU0VSVkVEX0lEKTtcbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8vIENoZWNrcyBpZiBhIFBvdWNoREIgb2JqZWN0IGlzIFwicmVtb3RlXCIgb3Igbm90LiBUaGlzIGlzXG5cbmZ1bmN0aW9uIGlzUmVtb3RlKGRiKSB7XG4gIGlmICh0eXBlb2YgZGIuX3JlbW90ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGRiLl9yZW1vdGU7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiBkYi50eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLFxuICAgICAgJ2RiLnR5cGUoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArXG4gICAgICAnYSBmdXR1cmUgdmVyc2lvbiBvZiBQb3VjaERCJyk7XG4gICAgcmV0dXJuIGRiLnR5cGUoKSA9PT0gJ2h0dHAnO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuZXJDb3VudChlZSwgdHlwZSkge1xuICByZXR1cm4gJ2xpc3RlbmVyQ291bnQnIGluIGVlID8gZWUubGlzdGVuZXJDb3VudCh0eXBlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRS5saXN0ZW5lckNvdW50KGVlLCB0eXBlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUocykge1xuICBpZiAoIXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcGFydHMgPSBzLnNwbGl0KCcvJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gcGFydHM7XG4gIH1cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBbcywgc107XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShzKSB7XG4gIHZhciBub3JtYWxpemVkID0gcGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUocyk7XG4gIHJldHVybiBub3JtYWxpemVkID8gbm9ybWFsaXplZC5qb2luKCcvJykgOiBudWxsO1xufVxuXG4vLyBvcmlnaW5hbGx5IHBhcnNlVXJpIDEuMi4yLCBub3cgcGF0Y2hlZCBieSB1c1xuLy8gKGMpIFN0ZXZlbiBMZXZpdGhhbiA8c3RldmVubGV2aXRoYW4uY29tPlxuLy8gTUlUIExpY2Vuc2VcbnZhciBrZXlzID0gW1wic291cmNlXCIsIFwicHJvdG9jb2xcIiwgXCJhdXRob3JpdHlcIiwgXCJ1c2VySW5mb1wiLCBcInVzZXJcIiwgXCJwYXNzd29yZFwiLFxuICAgIFwiaG9zdFwiLCBcInBvcnRcIiwgXCJyZWxhdGl2ZVwiLCBcInBhdGhcIiwgXCJkaXJlY3RvcnlcIiwgXCJmaWxlXCIsIFwicXVlcnlcIiwgXCJhbmNob3JcIl07XG52YXIgcU5hbWUgPVwicXVlcnlLZXlcIjtcbnZhciBxUGFyc2VyID0gLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nO1xuXG4vLyB1c2UgdGhlIFwibG9vc2VcIiBwYXJzZXJcbi8qIGVzbGludCBuby11c2VsZXNzLWVzY2FwZTogMCAqL1xudmFyIHBhcnNlciA9IC9eKD86KD8hW146QF0rOlteOkBcXC9dKkApKFteOlxcLz8jLl0rKTopPyg/OlxcL1xcLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLztcblxuZnVuY3Rpb24gcGFyc2VVcmkoc3RyKSB7XG4gIHZhciBtID0gcGFyc2VyLmV4ZWMoc3RyKTtcbiAgdmFyIHVyaSA9IHt9O1xuICB2YXIgaSA9IDE0O1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsdWUgPSBtW2ldIHx8IFwiXCI7XG4gICAgdmFyIGVuY29kZWQgPSBbJ3VzZXInLCAncGFzc3dvcmQnXS5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgIHVyaVtrZXldID0gZW5jb2RlZCA/IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgOiB2YWx1ZTtcbiAgfVxuXG4gIHVyaVtxTmFtZV0gPSB7fTtcbiAgdXJpW2tleXNbMTJdXS5yZXBsYWNlKHFQYXJzZXIsIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgaWYgKCQxKSB7XG4gICAgICB1cmlbcU5hbWVdWyQxXSA9ICQyO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHVyaTtcbn1cblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2FsZXhkYXZpZC9zY29wZS1ldmFsIHYwLjAuM1xuLy8gKHNvdXJjZTogaHR0cHM6Ly91bnBrZy5jb20vc2NvcGUtZXZhbEAwLjAuMy9zY29wZV9ldmFsLmpzKVxuLy8gVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHdyYXBwZXIgYXJvdW5kIG5ldyBGdW5jdGlvbigpXG5cbmZ1bmN0aW9uIHNjb3BlRXZhbChzb3VyY2UsIHNjb3BlKSB7XG4gIHZhciBrZXlzID0gW107XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIHNjb3BlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzY29wZSwga2V5KSkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB2YWx1ZXMucHVzaChzY29wZVtrZXldKTtcbiAgICB9XG4gIH1cbiAga2V5cy5wdXNoKHNvdXJjZSk7XG4gIHJldHVybiBGdW5jdGlvbi5hcHBseShudWxsLCBrZXlzKS5hcHBseShudWxsLCB2YWx1ZXMpO1xufVxuXG4vLyB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBcInVwZGF0ZSBzdWdhclwiIGZ1bmN0aW9uIGZyb20gZGFsZWhhcnZleS9wb3VjaGRiIzEzODhcbi8vIHRoZSBkaWZmRnVuIHRlbGxzIHVzIHdoYXQgZGVsdGEgdG8gYXBwbHkgdG8gdGhlIGRvYy4gIGl0IGVpdGhlciByZXR1cm5zXG4vLyB0aGUgZG9jLCBvciBmYWxzZSBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gZG8gYW4gdXBkYXRlIGFmdGVyIGFsbFxuZnVuY3Rpb24gdXBzZXJ0KGRiLCBkb2NJZCwgZGlmZkZ1bikge1xuICByZXR1cm4gZGIuZ2V0KGRvY0lkKVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAvLyB0aGUgdXNlciBtaWdodCBjaGFuZ2UgdGhlIF9yZXYsIHNvIHNhdmUgaXQgZm9yIHBvc3Rlcml0eVxuICAgICAgdmFyIGRvY1JldiA9IGRvYy5fcmV2O1xuICAgICAgdmFyIG5ld0RvYyA9IGRpZmZGdW4oZG9jKTtcblxuICAgICAgaWYgKCFuZXdEb2MpIHtcbiAgICAgICAgLy8gaWYgdGhlIGRpZmZGdW4gcmV0dXJucyBmYWxzeSwgd2Ugc2hvcnQtY2lyY3VpdCBhc1xuICAgICAgICAvLyBhbiBvcHRpbWl6YXRpb25cbiAgICAgICAgcmV0dXJuIHt1cGRhdGVkOiBmYWxzZSwgcmV2OiBkb2NSZXZ9O1xuICAgICAgfVxuXG4gICAgICAvLyB1c2VycyBhcmVuJ3QgYWxsb3dlZCB0byBtb2RpZnkgdGhlc2UgdmFsdWVzLFxuICAgICAgLy8gc28gcmVzZXQgdGhlbSBoZXJlXG4gICAgICBuZXdEb2MuX2lkID0gZG9jSWQ7XG4gICAgICBuZXdEb2MuX3JldiA9IGRvY1JldjtcbiAgICAgIHJldHVybiB0cnlBbmRQdXQoZGIsIG5ld0RvYywgZGlmZkZ1bik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHRyeUFuZFB1dChkYiwgZG9jLCBkaWZmRnVuKSB7XG4gIHJldHVybiBkYi5wdXQoZG9jKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlZDogdHJ1ZSxcbiAgICAgIHJldjogcmVzLnJldlxuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDkpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHVwc2VydChkYiwgZG9jLl9pZCwgZGlmZkZ1bik7XG4gIH0pO1xufVxuXG52YXIgdGhpc0F0b2IgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBhdG9iKHN0cik7XG59O1xuXG52YXIgdGhpc0J0b2EgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBidG9hKHN0cik7XG59O1xuXG4vLyBBYnN0cmFjdHMgY29uc3RydWN0aW5nIGEgQmxvYiBvYmplY3QsIHNvIGl0IGFsc28gd29ya3MgaW4gb2xkZXJcbi8vIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgbmF0aXZlIEJsb2IgY29uc3RydWN0b3IgKGUuZy5cbi8vIG9sZCBRdFdlYktpdCB2ZXJzaW9ucywgQW5kcm9pZCA8IDQuNCkuXG5mdW5jdGlvbiBjcmVhdGVCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKSB7XG4gIC8qIGdsb2JhbCBCbG9iQnVpbGRlcixNU0Jsb2JCdWlsZGVyLE1vekJsb2JCdWlsZGVyLFdlYktpdEJsb2JCdWlsZGVyICovXG4gIHBhcnRzID0gcGFydHMgfHwgW107XG4gIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgQmxvYihwYXJ0cywgcHJvcGVydGllcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5uYW1lICE9PSBcIlR5cGVFcnJvclwiKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICB2YXIgQnVpbGRlciA9IHR5cGVvZiBCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCcgPyBCbG9iQnVpbGRlciA6XG4gICAgICAgICAgICAgICAgICB0eXBlb2YgTVNCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCcgPyBNU0Jsb2JCdWlsZGVyIDpcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBNb3pCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCcgPyBNb3pCbG9iQnVpbGRlciA6XG4gICAgICAgICAgICAgICAgICBXZWJLaXRCbG9iQnVpbGRlcjtcbiAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgYnVpbGRlci5hcHBlbmQocGFydHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlci5nZXRCbG9iKHByb3BlcnRpZXMudHlwZSk7XG4gIH1cbn1cblxuLy8gRnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0OTY3NjQ3LyAoY29udGludWVzIG9uIG5leHQgbGluZSlcbi8vIGVuY29kZS1kZWNvZGUtaW1hZ2Utd2l0aC1iYXNlNjQtYnJlYWtzLWltYWdlICgyMDEzLTA0LTIxKVxuZnVuY3Rpb24gYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlcihiaW4pIHtcbiAgdmFyIGxlbmd0aCA9IGJpbi5sZW5ndGg7XG4gIHZhciBidWYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKTtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBhcnJbaV0gPSBiaW4uY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufVxuXG5mdW5jdGlvbiBiaW5TdHJpbmdUb0JsdWZmZXIoYmluU3RyaW5nLCB0eXBlKSB7XG4gIHJldHVybiBjcmVhdGVCbG9iKFtiaW5hcnlTdHJpbmdUb0FycmF5QnVmZmVyKGJpblN0cmluZyldLCB7dHlwZTogdHlwZX0pO1xufVxuXG5mdW5jdGlvbiBiNjRUb0JsdWZmZXIoYjY0LCB0eXBlKSB7XG4gIHJldHVybiBiaW5TdHJpbmdUb0JsdWZmZXIodGhpc0F0b2IoYjY0KSwgdHlwZSk7XG59XG5cbi8vQ2FuJ3QgZmluZCBvcmlnaW5hbCBwb3N0LCBidXQgdGhpcyBpcyBjbG9zZVxuLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY5NjUxMDcvIChjb250aW51ZXMgb24gbmV4dCBsaW5lKVxuLy9jb252ZXJ0aW5nLWJldHdlZW4tc3RyaW5ncy1hbmQtYXJyYXlidWZmZXJzXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKGJ1ZmZlcikge1xuICB2YXIgYmluYXJ5ID0gJyc7XG4gIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gIHZhciBsZW5ndGggPSBieXRlcy5ieXRlTGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICB9XG4gIHJldHVybiBiaW5hcnk7XG59XG5cbi8vIHNoaW0gZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdFxuZnVuY3Rpb24gcmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IsIGNhbGxiYWNrKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICB2YXIgaGFzQmluYXJ5U3RyaW5nID0gdHlwZW9mIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcgPT09ICdmdW5jdGlvbic7XG4gIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQgfHwgJyc7XG4gICAgaWYgKGhhc0JpbmFyeVN0cmluZykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgfVxuICAgIGNhbGxiYWNrKGFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcocmVzdWx0KSk7XG4gIH07XG4gIGlmIChoYXNCaW5hcnlTdHJpbmcpIHtcbiAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpO1xuICB9IGVsc2Uge1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBibG9iVG9CaW5hcnlTdHJpbmcoYmxvYk9yQnVmZmVyLCBjYWxsYmFjaykge1xuICByZWFkQXNCaW5hcnlTdHJpbmcoYmxvYk9yQnVmZmVyLCBmdW5jdGlvbiAoYmluKSB7XG4gICAgY2FsbGJhY2soYmluKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJsb2JUb0Jhc2U2NChibG9iT3JCdWZmZXIsIGNhbGxiYWNrKSB7XG4gIGJsb2JUb0JpbmFyeVN0cmluZyhibG9iT3JCdWZmZXIsIGZ1bmN0aW9uIChiYXNlNjQpIHtcbiAgICBjYWxsYmFjayh0aGlzQnRvYShiYXNlNjQpKTtcbiAgfSk7XG59XG5cbi8vIHNpbXBsaWZpZWQgQVBJLiB1bml2ZXJzYWwgYnJvd3NlciBzdXBwb3J0IGlzIGFzc3VtZWRcbmZ1bmN0aW9uIHJlYWRBc0FycmF5QnVmZmVyKGJsb2IsIGNhbGxiYWNrKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZS50YXJnZXQucmVzdWx0IHx8IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICBjYWxsYmFjayhyZXN1bHQpO1xuICB9O1xuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG59XG5cbi8vIHRoaXMgaXMgbm90IHVzZWQgaW4gdGhlIGJyb3dzZXJcblxudmFyIHNldEltbWVkaWF0ZVNoaW0gPSBzZWxmLnNldEltbWVkaWF0ZSB8fCBzZWxmLnNldFRpbWVvdXQ7XG52YXIgTUQ1X0NIVU5LX1NJWkUgPSAzMjc2ODtcblxuZnVuY3Rpb24gcmF3VG9CYXNlNjQocmF3KSB7XG4gIHJldHVybiB0aGlzQnRvYShyYXcpO1xufVxuXG5mdW5jdGlvbiBzbGljZUJsb2IoYmxvYiwgc3RhcnQsIGVuZCkge1xuICBpZiAoYmxvYi53ZWJraXRTbGljZSkge1xuICAgIHJldHVybiBibG9iLndlYmtpdFNsaWNlKHN0YXJ0LCBlbmQpO1xuICB9XG4gIHJldHVybiBibG9iLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRCbG9iKGJ1ZmZlciwgYmxvYiwgc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcbiAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBibG9iLnNpemUpIHtcbiAgICAvLyBvbmx5IHNsaWNlIGJsb2IgaWYgd2UgcmVhbGx5IG5lZWQgdG9cbiAgICBibG9iID0gc2xpY2VCbG9iKGJsb2IsIHN0YXJ0LCBlbmQpO1xuICB9XG4gIHJlYWRBc0FycmF5QnVmZmVyKGJsb2IsIGZ1bmN0aW9uIChhcnJheUJ1ZmZlcikge1xuICAgIGJ1ZmZlci5hcHBlbmQoYXJyYXlCdWZmZXIpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRTdHJpbmcoYnVmZmVyLCBzdHJpbmcsIHN0YXJ0LCBlbmQsIGNhbGxiYWNrKSB7XG4gIGlmIChzdGFydCA+IDAgfHwgZW5kIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgIC8vIG9ubHkgY3JlYXRlIGEgc3Vic3RyaW5nIGlmIHdlIHJlYWxseSBuZWVkIHRvXG4gICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgfVxuICBidWZmZXIuYXBwZW5kQmluYXJ5KHN0cmluZyk7XG4gIGNhbGxiYWNrKCk7XG59XG5cbmZ1bmN0aW9uIGJpbmFyeU1kNShkYXRhLCBjYWxsYmFjaykge1xuICB2YXIgaW5wdXRJc1N0cmluZyA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJztcbiAgdmFyIGxlbiA9IGlucHV0SXNTdHJpbmcgPyBkYXRhLmxlbmd0aCA6IGRhdGEuc2l6ZTtcbiAgdmFyIGNodW5rU2l6ZSA9IE1hdGgubWluKE1ENV9DSFVOS19TSVpFLCBsZW4pO1xuICB2YXIgY2h1bmtzID0gTWF0aC5jZWlsKGxlbiAvIGNodW5rU2l6ZSk7XG4gIHZhciBjdXJyZW50Q2h1bmsgPSAwO1xuICB2YXIgYnVmZmVyID0gaW5wdXRJc1N0cmluZyA/IG5ldyBNZDUoKSA6IG5ldyBNZDUuQXJyYXlCdWZmZXIoKTtcblxuICB2YXIgYXBwZW5kID0gaW5wdXRJc1N0cmluZyA/IGFwcGVuZFN0cmluZyA6IGFwcGVuZEJsb2I7XG5cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBzZXRJbW1lZGlhdGVTaGltKGxvYWROZXh0Q2h1bmspO1xuICB9XG5cbiAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICB2YXIgcmF3ID0gYnVmZmVyLmVuZCh0cnVlKTtcbiAgICB2YXIgYmFzZTY0ID0gcmF3VG9CYXNlNjQocmF3KTtcbiAgICBjYWxsYmFjayhiYXNlNjQpO1xuICAgIGJ1ZmZlci5kZXN0cm95KCk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkTmV4dENodW5rKCkge1xuICAgIHZhciBzdGFydCA9IGN1cnJlbnRDaHVuayAqIGNodW5rU2l6ZTtcbiAgICB2YXIgZW5kID0gc3RhcnQgKyBjaHVua1NpemU7XG4gICAgY3VycmVudENodW5rKys7XG4gICAgaWYgKGN1cnJlbnRDaHVuayA8IGNodW5rcykge1xuICAgICAgYXBwZW5kKGJ1ZmZlciwgZGF0YSwgc3RhcnQsIGVuZCwgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZChidWZmZXIsIGRhdGEsIHN0YXJ0LCBlbmQsIGRvbmUpO1xuICAgIH1cbiAgfVxuICBsb2FkTmV4dENodW5rKCk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ01kNShzdHJpbmcpIHtcbiAgcmV0dXJuIE1kNS5oYXNoKHN0cmluZyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyByZXZpc2lvbiBzdHJpbmcgdGhhdCBkb2VzIE5PVCBpbmNsdWRlIHRoZSByZXZpc2lvbiBoZWlnaHRcbiAqIEZvciBleGFtcGxlICc1NjY0OWYxYjA1MDZjNmNhOWZkYTA3NDZlYjBjYWNkZidcbiAqL1xuZnVuY3Rpb24gcmV2JCQxKGRvYywgZGV0ZXJtaW5pc3RpY19yZXZzKSB7XG4gIGlmICghZGV0ZXJtaW5pc3RpY19yZXZzKSB7XG4gICAgcmV0dXJuIHY0KCkucmVwbGFjZSgvLS9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHZhciBtdXRhdGVhYmxlRG9jID0gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCBkb2MpO1xuICBkZWxldGUgbXV0YXRlYWJsZURvYy5fcmV2X3RyZWU7XG4gIHJldHVybiBzdHJpbmdNZDUoSlNPTi5zdHJpbmdpZnkobXV0YXRlYWJsZURvYykpO1xufVxuXG52YXIgdXVpZCA9IHY0OyAvLyBtaW1pYyBvbGQgaW1wb3J0LCBvbmx5IHY0IGlzIGV2ZXIgdXNlZCBlbHNld2hlcmVcblxuLy8gV2UgZmV0Y2ggYWxsIGxlYWZzIG9mIHRoZSByZXZpc2lvbiB0cmVlLCBhbmQgc29ydCB0aGVtIGJhc2VkIG9uIHRyZWUgbGVuZ3RoXG4vLyBhbmQgd2hldGhlciB0aGV5IHdlcmUgZGVsZXRlZCwgdW5kZWxldGVkIGRvY3VtZW50cyB3aXRoIHRoZSBsb25nZXN0IHJldmlzaW9uXG4vLyB0cmVlIChtb3N0IGVkaXRzKSB3aW5cbi8vIFRoZSBmaW5hbCBzb3J0IGFsZ29yaXRobSBpcyBzbGlnaHRseSBkb2N1bWVudGVkIGluIGEgc2lkZWJhciBoZXJlOlxuLy8gaHR0cDovL2d1aWRlLmNvdWNoZGIub3JnL2RyYWZ0L2NvbmZsaWN0cy5odG1sXG5mdW5jdGlvbiB3aW5uaW5nUmV2KG1ldGFkYXRhKSB7XG4gIHZhciB3aW5uaW5nSWQ7XG4gIHZhciB3aW5uaW5nUG9zO1xuICB2YXIgd2lubmluZ0RlbGV0ZWQ7XG4gIHZhciB0b1Zpc2l0ID0gbWV0YWRhdGEucmV2X3RyZWUuc2xpY2UoKTtcbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBwb3MgPSBub2RlLnBvcztcbiAgICBpZiAoYnJhbmNoZXMubGVuZ3RoKSB7IC8vIG5vbi1sZWFmXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IHBvcyArIDEsIGlkczogYnJhbmNoZXNbaV19KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgZGVsZXRlZCA9ICEhdHJlZVsxXS5kZWxldGVkO1xuICAgIHZhciBpZCA9IHRyZWVbMF07XG4gICAgLy8gc29ydCBieSBkZWxldGVkLCB0aGVuIHBvcywgdGhlbiBpZFxuICAgIGlmICghd2lubmluZ0lkIHx8ICh3aW5uaW5nRGVsZXRlZCAhPT0gZGVsZXRlZCA/IHdpbm5pbmdEZWxldGVkIDpcbiAgICAgICAgd2lubmluZ1BvcyAhPT0gcG9zID8gd2lubmluZ1BvcyA8IHBvcyA6IHdpbm5pbmdJZCA8IGlkKSkge1xuICAgICAgd2lubmluZ0lkID0gaWQ7XG4gICAgICB3aW5uaW5nUG9zID0gcG9zO1xuICAgICAgd2lubmluZ0RlbGV0ZWQgPSBkZWxldGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3aW5uaW5nUG9zICsgJy0nICsgd2lubmluZ0lkO1xufVxuXG4vLyBQcmV0dHkgbXVjaCBhbGwgYmVsb3cgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBoaWdoZXIgb3JkZXIgZnVuY3Rpb24gdG9cbi8vIHRyYXZlcnNlIHJldmlzaW9uc1xuLy8gVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjYWxsYmFjayB3aWxsIGJlIHBhc3NlZCBhcyBjb250ZXh0IHRvIGFsbFxuLy8gY2hpbGRyZW4gb2YgdGhhdCBub2RlXG5mdW5jdGlvbiB0cmF2ZXJzZVJldlRyZWUocmV2cywgY2FsbGJhY2spIHtcbiAgdmFyIHRvVmlzaXQgPSByZXZzLnNsaWNlKCk7XG5cbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zO1xuICAgIHZhciB0cmVlID0gbm9kZS5pZHM7XG4gICAgdmFyIGJyYW5jaGVzID0gdHJlZVsyXTtcbiAgICB2YXIgbmV3Q3R4ID1cbiAgICAgIGNhbGxiYWNrKGJyYW5jaGVzLmxlbmd0aCA9PT0gMCwgcG9zLCB0cmVlWzBdLCBub2RlLmN0eCwgdHJlZVsxXSk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJyYW5jaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0b1Zpc2l0LnB1c2goe3BvczogcG9zICsgMSwgaWRzOiBicmFuY2hlc1tpXSwgY3R4OiBuZXdDdHh9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc29ydEJ5UG9zKGEsIGIpIHtcbiAgcmV0dXJuIGEucG9zIC0gYi5wb3M7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RMZWF2ZXMocmV2cykge1xuICB2YXIgbGVhdmVzID0gW107XG4gIHRyYXZlcnNlUmV2VHJlZShyZXZzLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIGlkLCBhY2MsIG9wdHMpIHtcbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBsZWF2ZXMucHVzaCh7cmV2OiBwb3MgKyBcIi1cIiArIGlkLCBwb3M6IHBvcywgb3B0czogb3B0c30pO1xuICAgIH1cbiAgfSk7XG4gIGxlYXZlcy5zb3J0KHNvcnRCeVBvcykucmV2ZXJzZSgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGVhdmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgZGVsZXRlIGxlYXZlc1tpXS5wb3M7XG4gIH1cbiAgcmV0dXJuIGxlYXZlcztcbn1cblxuLy8gcmV0dXJucyByZXZzIG9mIGFsbCBjb25mbGljdHMgdGhhdCBpcyBsZWF2ZXMgc3VjaCB0aGF0XG4vLyAxLiBhcmUgbm90IGRlbGV0ZWQgYW5kXG4vLyAyLiBhcmUgZGlmZmVyZW50IHRoYW4gd2lubmluZyByZXZpc2lvblxuZnVuY3Rpb24gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSkge1xuICB2YXIgd2luID0gd2lubmluZ1JldihtZXRhZGF0YSk7XG4gIHZhciBsZWF2ZXMgPSBjb2xsZWN0TGVhdmVzKG1ldGFkYXRhLnJldl90cmVlKTtcbiAgdmFyIGNvbmZsaWN0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGVhdmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGxlYWYgPSBsZWF2ZXNbaV07XG4gICAgaWYgKGxlYWYucmV2ICE9PSB3aW4gJiYgIWxlYWYub3B0cy5kZWxldGVkKSB7XG4gICAgICBjb25mbGljdHMucHVzaChsZWFmLnJldik7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbi8vIGNvbXBhY3QgYSB0cmVlIGJ5IG1hcmtpbmcgaXRzIG5vbi1sZWFmcyBhcyBtaXNzaW5nLFxuLy8gYW5kIHJldHVybiBhIGxpc3Qgb2YgcmV2cyB0byBkZWxldGVcbmZ1bmN0aW9uIGNvbXBhY3RUcmVlKG1ldGFkYXRhKSB7XG4gIHZhciByZXZzID0gW107XG4gIHRyYXZlcnNlUmV2VHJlZShtZXRhZGF0YS5yZXZfdHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZIYXNoLCBjdHgsIG9wdHMpIHtcbiAgICBpZiAob3B0cy5zdGF0dXMgPT09ICdhdmFpbGFibGUnICYmICFpc0xlYWYpIHtcbiAgICAgIHJldnMucHVzaChwb3MgKyAnLScgKyByZXZIYXNoKTtcbiAgICAgIG9wdHMuc3RhdHVzID0gJ21pc3NpbmcnO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXZzO1xufVxuXG4vLyBidWlsZCB1cCBhIGxpc3Qgb2YgYWxsIHRoZSBwYXRocyB0byB0aGUgbGVhZnMgaW4gdGhpcyByZXZpc2lvbiB0cmVlXG5mdW5jdGlvbiByb290VG9MZWFmKHJldnMpIHtcbiAgdmFyIHBhdGhzID0gW107XG4gIHZhciB0b1Zpc2l0ID0gcmV2cy5zbGljZSgpO1xuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgdmFyIHRyZWUgPSBub2RlLmlkcztcbiAgICB2YXIgaWQgPSB0cmVlWzBdO1xuICAgIHZhciBvcHRzID0gdHJlZVsxXTtcbiAgICB2YXIgYnJhbmNoZXMgPSB0cmVlWzJdO1xuICAgIHZhciBpc0xlYWYgPSBicmFuY2hlcy5sZW5ndGggPT09IDA7XG5cbiAgICB2YXIgaGlzdG9yeSA9IG5vZGUuaGlzdG9yeSA/IG5vZGUuaGlzdG9yeS5zbGljZSgpIDogW107XG4gICAgaGlzdG9yeS5wdXNoKHtpZDogaWQsIG9wdHM6IG9wdHN9KTtcbiAgICBpZiAoaXNMZWFmKSB7XG4gICAgICBwYXRocy5wdXNoKHtwb3M6IChwb3MgKyAxIC0gaGlzdG9yeS5sZW5ndGgpLCBpZHM6IGhpc3Rvcnl9KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJyYW5jaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0b1Zpc2l0LnB1c2goe3BvczogcG9zICsgMSwgaWRzOiBicmFuY2hlc1tpXSwgaGlzdG9yeTogaGlzdG9yeX0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGF0aHMucmV2ZXJzZSgpO1xufVxuXG4vLyBmb3IgYSBiZXR0ZXIgb3ZlcnZpZXcgb2Ygd2hhdCB0aGlzIGlzIGRvaW5nLCByZWFkOlxuXG5mdW5jdGlvbiBzb3J0QnlQb3MkMShhLCBiKSB7XG4gIHJldHVybiBhLnBvcyAtIGIucG9zO1xufVxuXG4vLyBjbGFzc2ljIGJpbmFyeSBzZWFyY2hcbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaChhcnIsIGl0ZW0sIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGxvdyA9IDA7XG4gIHZhciBoaWdoID0gYXJyLmxlbmd0aDtcbiAgdmFyIG1pZDtcbiAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDE7XG4gICAgaWYgKGNvbXBhcmF0b3IoYXJyW21pZF0sIGl0ZW0pIDwgMCkge1xuICAgICAgbG93ID0gbWlkICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlnaCA9IG1pZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvdztcbn1cblxuLy8gYXNzdW1pbmcgdGhlIGFyciBpcyBzb3J0ZWQsIGluc2VydCB0aGUgaXRlbSBpbiB0aGUgcHJvcGVyIHBsYWNlXG5mdW5jdGlvbiBpbnNlcnRTb3J0ZWQoYXJyLCBpdGVtLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpZHggPSBiaW5hcnlTZWFyY2goYXJyLCBpdGVtLCBjb21wYXJhdG9yKTtcbiAgYXJyLnNwbGljZShpZHgsIDAsIGl0ZW0pO1xufVxuXG4vLyBUdXJuIGEgcGF0aCBhcyBhIGZsYXQgYXJyYXkgaW50byBhIHRyZWUgd2l0aCBhIHNpbmdsZSBicmFuY2guXG4vLyBJZiBhbnkgc2hvdWxkIGJlIHN0ZW1tZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSwgdGhhdCdzIHBhc3NlZFxuLy8gaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudFxuZnVuY3Rpb24gcGF0aFRvVHJlZShwYXRoLCBudW1TdGVtbWVkKSB7XG4gIHZhciByb290O1xuICB2YXIgbGVhZjtcbiAgZm9yICh2YXIgaSA9IG51bVN0ZW1tZWQsIGxlbiA9IHBhdGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHBhdGhbaV07XG4gICAgdmFyIGN1cnJlbnRMZWFmID0gW25vZGUuaWQsIG5vZGUub3B0cywgW11dO1xuICAgIGlmIChsZWFmKSB7XG4gICAgICBsZWFmWzJdLnB1c2goY3VycmVudExlYWYpO1xuICAgICAgbGVhZiA9IGN1cnJlbnRMZWFmO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290ID0gbGVhZiA9IGN1cnJlbnRMZWFmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLy8gY29tcGFyZSB0aGUgSURzIG9mIHR3byB0cmVlc1xuZnVuY3Rpb24gY29tcGFyZVRyZWUoYSwgYikge1xuICByZXR1cm4gYVswXSA8IGJbMF0gPyAtMSA6IDE7XG59XG5cbi8vIE1lcmdlIHR3byB0cmVlcyB0b2dldGhlclxuLy8gVGhlIHJvb3RzIG9mIHRyZWUxIGFuZCB0cmVlMiBtdXN0IGJlIHRoZSBzYW1lIHJldmlzaW9uXG5mdW5jdGlvbiBtZXJnZVRyZWUoaW5fdHJlZTEsIGluX3RyZWUyKSB7XG4gIHZhciBxdWV1ZSA9IFt7dHJlZTE6IGluX3RyZWUxLCB0cmVlMjogaW5fdHJlZTJ9XTtcbiAgdmFyIGNvbmZsaWN0cyA9IGZhbHNlO1xuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIHZhciBpdGVtID0gcXVldWUucG9wKCk7XG4gICAgdmFyIHRyZWUxID0gaXRlbS50cmVlMTtcbiAgICB2YXIgdHJlZTIgPSBpdGVtLnRyZWUyO1xuXG4gICAgaWYgKHRyZWUxWzFdLnN0YXR1cyB8fCB0cmVlMlsxXS5zdGF0dXMpIHtcbiAgICAgIHRyZWUxWzFdLnN0YXR1cyA9XG4gICAgICAgICh0cmVlMVsxXS5zdGF0dXMgPT09ICAnYXZhaWxhYmxlJyB8fFxuICAgICAgICB0cmVlMlsxXS5zdGF0dXMgPT09ICdhdmFpbGFibGUnKSA/ICdhdmFpbGFibGUnIDogJ21pc3NpbmcnO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZTJbMl0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdHJlZTFbMl1bMF0pIHtcbiAgICAgICAgY29uZmxpY3RzID0gJ25ld19sZWFmJztcbiAgICAgICAgdHJlZTFbMl1bMF0gPSB0cmVlMlsyXVtpXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBtZXJnZWQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdHJlZTFbMl0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHRyZWUxWzJdW2pdWzBdID09PSB0cmVlMlsyXVtpXVswXSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2goe3RyZWUxOiB0cmVlMVsyXVtqXSwgdHJlZTI6IHRyZWUyWzJdW2ldfSk7XG4gICAgICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFtZXJnZWQpIHtcbiAgICAgICAgY29uZmxpY3RzID0gJ25ld19icmFuY2gnO1xuICAgICAgICBpbnNlcnRTb3J0ZWQodHJlZTFbMl0sIHRyZWUyWzJdW2ldLCBjb21wYXJlVHJlZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7Y29uZmxpY3RzOiBjb25mbGljdHMsIHRyZWU6IGluX3RyZWUxfTtcbn1cblxuZnVuY3Rpb24gZG9NZXJnZSh0cmVlLCBwYXRoLCBkb250RXhwYW5kKSB7XG4gIHZhciByZXN0cmVlID0gW107XG4gIHZhciBjb25mbGljdHMgPSBmYWxzZTtcbiAgdmFyIG1lcmdlZCA9IGZhbHNlO1xuICB2YXIgcmVzO1xuXG4gIGlmICghdHJlZS5sZW5ndGgpIHtcbiAgICByZXR1cm4ge3RyZWU6IFtwYXRoXSwgY29uZmxpY3RzOiAnbmV3X2xlYWYnfTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0cmVlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGJyYW5jaCA9IHRyZWVbaV07XG4gICAgaWYgKGJyYW5jaC5wb3MgPT09IHBhdGgucG9zICYmIGJyYW5jaC5pZHNbMF0gPT09IHBhdGguaWRzWzBdKSB7XG4gICAgICAvLyBQYXRocyBzdGFydCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhbmQgaGF2ZSB0aGUgc2FtZSByb290LCBzbyB0aGV5IG5lZWRcbiAgICAgIC8vIG1lcmdlZFxuICAgICAgcmVzID0gbWVyZ2VUcmVlKGJyYW5jaC5pZHMsIHBhdGguaWRzKTtcbiAgICAgIHJlc3RyZWUucHVzaCh7cG9zOiBicmFuY2gucG9zLCBpZHM6IHJlcy50cmVlfSk7XG4gICAgICBjb25mbGljdHMgPSBjb25mbGljdHMgfHwgcmVzLmNvbmZsaWN0cztcbiAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkb250RXhwYW5kICE9PSB0cnVlKSB7XG4gICAgICAvLyBUaGUgcGF0aHMgc3RhcnQgYXQgYSBkaWZmZXJlbnQgcG9zaXRpb24sIHRha2UgdGhlIGVhcmxpZXN0IHBhdGggYW5kXG4gICAgICAvLyB0cmF2ZXJzZSB1cCB1bnRpbCBpdCBhcyBhdCB0aGUgc2FtZSBwb2ludCBmcm9tIHJvb3QgYXMgdGhlIHBhdGggd2VcbiAgICAgIC8vIHdhbnQgdG8gbWVyZ2UuICBJZiB0aGUga2V5cyBtYXRjaCB3ZSByZXR1cm4gdGhlIGxvbmdlciBwYXRoIHdpdGggdGhlXG4gICAgICAvLyBvdGhlciBtZXJnZWQgQWZ0ZXIgc3RlbW1pbmcgd2UgZG9udCB3YW50IHRvIGV4cGFuZCB0aGUgdHJlZXNcblxuICAgICAgdmFyIHQxID0gYnJhbmNoLnBvcyA8IHBhdGgucG9zID8gYnJhbmNoIDogcGF0aDtcbiAgICAgIHZhciB0MiA9IGJyYW5jaC5wb3MgPCBwYXRoLnBvcyA/IHBhdGggOiBicmFuY2g7XG4gICAgICB2YXIgZGlmZiA9IHQyLnBvcyAtIHQxLnBvcztcblxuICAgICAgdmFyIGNhbmRpZGF0ZVBhcmVudHMgPSBbXTtcblxuICAgICAgdmFyIHRyZWVzID0gW107XG4gICAgICB0cmVlcy5wdXNoKHtpZHM6IHQxLmlkcywgZGlmZjogZGlmZiwgcGFyZW50OiBudWxsLCBwYXJlbnRJZHg6IG51bGx9KTtcbiAgICAgIHdoaWxlICh0cmVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBpdGVtID0gdHJlZXMucG9wKCk7XG4gICAgICAgIGlmIChpdGVtLmRpZmYgPT09IDApIHtcbiAgICAgICAgICBpZiAoaXRlbS5pZHNbMF0gPT09IHQyLmlkc1swXSkge1xuICAgICAgICAgICAgY2FuZGlkYXRlUGFyZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWxlbWVudHMgPSBpdGVtLmlkc1syXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDAsIGVsZW1lbnRzTGVuID0gZWxlbWVudHMubGVuZ3RoOyBqIDwgZWxlbWVudHNMZW47IGorKykge1xuICAgICAgICAgIHRyZWVzLnB1c2goe1xuICAgICAgICAgICAgaWRzOiBlbGVtZW50c1tqXSxcbiAgICAgICAgICAgIGRpZmY6IGl0ZW0uZGlmZiAtIDEsXG4gICAgICAgICAgICBwYXJlbnQ6IGl0ZW0uaWRzLFxuICAgICAgICAgICAgcGFyZW50SWR4OiBqXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGVsID0gY2FuZGlkYXRlUGFyZW50c1swXTtcblxuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXN0cmVlLnB1c2goYnJhbmNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcyA9IG1lcmdlVHJlZShlbC5pZHMsIHQyLmlkcyk7XG4gICAgICAgIGVsLnBhcmVudFsyXVtlbC5wYXJlbnRJZHhdID0gcmVzLnRyZWU7XG4gICAgICAgIHJlc3RyZWUucHVzaCh7cG9zOiB0MS5wb3MsIGlkczogdDEuaWRzfSk7XG4gICAgICAgIGNvbmZsaWN0cyA9IGNvbmZsaWN0cyB8fCByZXMuY29uZmxpY3RzO1xuICAgICAgICBtZXJnZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN0cmVlLnB1c2goYnJhbmNoKTtcbiAgICB9XG4gIH1cblxuICAvLyBXZSBkaWRudCBmaW5kXG4gIGlmICghbWVyZ2VkKSB7XG4gICAgcmVzdHJlZS5wdXNoKHBhdGgpO1xuICB9XG5cbiAgcmVzdHJlZS5zb3J0KHNvcnRCeVBvcyQxKTtcblxuICByZXR1cm4ge1xuICAgIHRyZWU6IHJlc3RyZWUsXG4gICAgY29uZmxpY3RzOiBjb25mbGljdHMgfHwgJ2ludGVybmFsX25vZGUnXG4gIH07XG59XG5cbi8vIFRvIGVuc3VyZSB3ZSBkb250IGdyb3cgdGhlIHJldmlzaW9uIHRyZWUgaW5maW5pdGVseSwgd2Ugc3RlbSBvbGQgcmV2aXNpb25zXG5mdW5jdGlvbiBzdGVtKHRyZWUsIGRlcHRoKSB7XG4gIC8vIEZpcnN0IHdlIGJyZWFrIG91dCB0aGUgdHJlZSBpbnRvIGEgY29tcGxldGUgbGlzdCBvZiByb290IHRvIGxlYWYgcGF0aHNcbiAgdmFyIHBhdGhzID0gcm9vdFRvTGVhZih0cmVlKTtcbiAgdmFyIHN0ZW1tZWRSZXZzO1xuXG4gIHZhciByZXN1bHQ7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXRocy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIC8vIFRoZW4gZm9yIGVhY2ggcGF0aCwgd2UgY3V0IG9mZiB0aGUgc3RhcnQgb2YgdGhlIHBhdGggYmFzZWQgb24gdGhlXG4gICAgLy8gYGRlcHRoYCB0byBzdGVtIHRvLCBhbmQgZ2VuZXJhdGUgYSBuZXcgc2V0IG9mIGZsYXQgdHJlZXNcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2ldO1xuICAgIHZhciBzdGVtbWVkID0gcGF0aC5pZHM7XG4gICAgdmFyIG5vZGU7XG4gICAgaWYgKHN0ZW1tZWQubGVuZ3RoID4gZGVwdGgpIHtcbiAgICAgIC8vIG9ubHkgZG8gdGhlIHN0ZW1taW5nIHdvcmsgaWYgd2UgYWN0dWFsbHkgbmVlZCB0byBzdGVtXG4gICAgICBpZiAoIXN0ZW1tZWRSZXZzKSB7XG4gICAgICAgIHN0ZW1tZWRSZXZzID0ge307IC8vIGF2b2lkIGFsbG9jYXRpbmcgdGhpcyBvYmplY3QgdW5uZWNlc3NhcmlseVxuICAgICAgfVxuICAgICAgdmFyIG51bVN0ZW1tZWQgPSBzdGVtbWVkLmxlbmd0aCAtIGRlcHRoO1xuICAgICAgbm9kZSA9IHtcbiAgICAgICAgcG9zOiBwYXRoLnBvcyArIG51bVN0ZW1tZWQsXG4gICAgICAgIGlkczogcGF0aFRvVHJlZShzdGVtbWVkLCBudW1TdGVtbWVkKVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBudW1TdGVtbWVkOyBzKyspIHtcbiAgICAgICAgdmFyIHJldiA9IChwYXRoLnBvcyArIHMpICsgJy0nICsgc3RlbW1lZFtzXS5pZDtcbiAgICAgICAgc3RlbW1lZFJldnNbcmV2XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gbm8gbmVlZCB0byBhY3R1YWxseSBzdGVtXG4gICAgICBub2RlID0ge1xuICAgICAgICBwb3M6IHBhdGgucG9zLFxuICAgICAgICBpZHM6IHBhdGhUb1RyZWUoc3RlbW1lZCwgMClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVGhlbiB3ZSByZW1lcmdlIGFsbCB0aG9zZSBmbGF0IHRyZWVzIHRvZ2V0aGVyLCBlbnN1cmluZyB0aGF0IHdlIGRvbnRcbiAgICAvLyBjb25uZWN0IHRyZWVzIHRoYXQgd291bGQgZ28gYmV5b25kIHRoZSBkZXB0aCBsaW1pdFxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IGRvTWVyZ2UocmVzdWx0LCBub2RlLCB0cnVlKS50cmVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBbbm9kZV07XG4gICAgfVxuICB9XG5cbiAgLy8gdGhpcyBpcyBtZW1vcnktaGVhdnkgcGVyIENocm9tZSBwcm9maWxlciwgYXZvaWQgdW5sZXNzIHdlIGFjdHVhbGx5IHN0ZW1tZWRcbiAgaWYgKHN0ZW1tZWRSZXZzKSB7XG4gICAgdHJhdmVyc2VSZXZUcmVlKHJlc3VsdCwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCByZXZIYXNoKSB7XG4gICAgICAvLyBzb21lIHJldmlzaW9ucyBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gYSBicmFuY2ggYnV0IG5vdCBpbiBhbm90aGVyXG4gICAgICBkZWxldGUgc3RlbW1lZFJldnNbcG9zICsgJy0nICsgcmV2SGFzaF07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRyZWU6IHJlc3VsdCxcbiAgICByZXZzOiBzdGVtbWVkUmV2cyA/IE9iamVjdC5rZXlzKHN0ZW1tZWRSZXZzKSA6IFtdXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlKHRyZWUsIHBhdGgsIGRlcHRoKSB7XG4gIHZhciBuZXdUcmVlID0gZG9NZXJnZSh0cmVlLCBwYXRoKTtcbiAgdmFyIHN0ZW1tZWQgPSBzdGVtKG5ld1RyZWUudHJlZSwgZGVwdGgpO1xuICByZXR1cm4ge1xuICAgIHRyZWU6IHN0ZW1tZWQudHJlZSxcbiAgICBzdGVtbWVkUmV2czogc3RlbW1lZC5yZXZzLFxuICAgIGNvbmZsaWN0czogbmV3VHJlZS5jb25mbGljdHNcbiAgfTtcbn1cblxuLy8gcmV0dXJuIHRydWUgaWYgYSByZXYgZXhpc3RzIGluIHRoZSByZXYgdHJlZSwgZmFsc2Ugb3RoZXJ3aXNlXG5mdW5jdGlvbiByZXZFeGlzdHMocmV2cywgcmV2KSB7XG4gIHZhciB0b1Zpc2l0ID0gcmV2cy5zbGljZSgpO1xuICB2YXIgc3BsaXRSZXYgPSByZXYuc3BsaXQoJy0nKTtcbiAgdmFyIHRhcmdldFBvcyA9IHBhcnNlSW50KHNwbGl0UmV2WzBdLCAxMCk7XG4gIHZhciB0YXJnZXRJZCA9IHNwbGl0UmV2WzFdO1xuXG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIGlmIChub2RlLnBvcyA9PT0gdGFyZ2V0UG9zICYmIG5vZGUuaWRzWzBdID09PSB0YXJnZXRJZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBicmFuY2hlcyA9IG5vZGUuaWRzWzJdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBicmFuY2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IG5vZGUucG9zICsgMSwgaWRzOiBicmFuY2hlc1tpXX0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFRyZWVzKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuaWRzO1xufVxuXG4vLyBjaGVjayBpZiBhIHNwZWNpZmljIHJldmlzaW9uIG9mIGEgZG9jIGhhcyBiZWVuIGRlbGV0ZWRcbi8vICAtIG1ldGFkYXRhOiB0aGUgbWV0YWRhdGEgb2JqZWN0IGZyb20gdGhlIGRvYyBzdG9yZVxuLy8gIC0gcmV2OiAob3B0aW9uYWwpIHRoZSByZXZpc2lvbiB0byBjaGVjay4gZGVmYXVsdHMgdG8gd2lubmluZyByZXZpc2lvblxuZnVuY3Rpb24gaXNEZWxldGVkKG1ldGFkYXRhLCByZXYpIHtcbiAgaWYgKCFyZXYpIHtcbiAgICByZXYgPSB3aW5uaW5nUmV2KG1ldGFkYXRhKTtcbiAgfVxuICB2YXIgaWQgPSByZXYuc3Vic3RyaW5nKHJldi5pbmRleE9mKCctJykgKyAxKTtcbiAgdmFyIHRvVmlzaXQgPSBtZXRhZGF0YS5yZXZfdHJlZS5tYXAoZ2V0VHJlZXMpO1xuXG4gIHZhciB0cmVlO1xuICB3aGlsZSAoKHRyZWUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIGlmICh0cmVlWzBdID09PSBpZCkge1xuICAgICAgcmV0dXJuICEhdHJlZVsxXS5kZWxldGVkO1xuICAgIH1cbiAgICB0b1Zpc2l0ID0gdG9WaXNpdC5jb25jYXQodHJlZVsyXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNMb2NhbElkKGlkKSB7XG4gIHJldHVybiAoL15fbG9jYWwvKS50ZXN0KGlkKTtcbn1cblxuLy8gcmV0dXJucyB0aGUgY3VycmVudCBsZWFmIG5vZGUgZm9yIGEgZ2l2ZW4gcmV2aXNpb25cbmZ1bmN0aW9uIGxhdGVzdChyZXYsIG1ldGFkYXRhKSB7XG4gIHZhciB0b1Zpc2l0ID0gbWV0YWRhdGEucmV2X3RyZWUuc2xpY2UoKTtcbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zO1xuICAgIHZhciB0cmVlID0gbm9kZS5pZHM7XG4gICAgdmFyIGlkID0gdHJlZVswXTtcbiAgICB2YXIgb3B0cyA9IHRyZWVbMV07XG4gICAgdmFyIGJyYW5jaGVzID0gdHJlZVsyXTtcbiAgICB2YXIgaXNMZWFmID0gYnJhbmNoZXMubGVuZ3RoID09PSAwO1xuXG4gICAgdmFyIGhpc3RvcnkgPSBub2RlLmhpc3RvcnkgPyBub2RlLmhpc3Rvcnkuc2xpY2UoKSA6IFtdO1xuICAgIGhpc3RvcnkucHVzaCh7aWQ6IGlkLCBwb3M6IHBvcywgb3B0czogb3B0c30pO1xuXG4gICAgaWYgKGlzTGVhZikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhpc3RvcnkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGhpc3RvcnlOb2RlID0gaGlzdG9yeVtpXTtcbiAgICAgICAgdmFyIGhpc3RvcnlSZXYgPSBoaXN0b3J5Tm9kZS5wb3MgKyAnLScgKyBoaXN0b3J5Tm9kZS5pZDtcblxuICAgICAgICBpZiAoaGlzdG9yeVJldiA9PT0gcmV2KSB7XG4gICAgICAgICAgLy8gcmV0dXJuIHRoZSByZXYgb2YgdGhpcyBsZWFmXG4gICAgICAgICAgcmV0dXJuIHBvcyArICctJyArIGlkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDAsIGwgPSBicmFuY2hlcy5sZW5ndGg7IGogPCBsOyBqKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2pdLCBoaXN0b3J5OiBoaXN0b3J5fSk7XG4gICAgfVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBsYXRlc3QgcmV2aXNpb24gZm9yIGlkICcgKyBtZXRhZGF0YS5pZCArICcsIHJldiAnICsgcmV2KTtcbn1cblxuaW5oZXJpdHMoQ2hhbmdlcyQxLCBFRSk7XG5cbmZ1bmN0aW9uIHRyeUNhdGNoSW5DaGFuZ2VMaXN0ZW5lcihzZWxmLCBjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpIHtcbiAgLy8gaXNvbGF0ZSB0cnkvY2F0Y2hlcyB0byBhdm9pZCBWOCBkZW9wdGltaXphdGlvbnNcbiAgdHJ5IHtcbiAgICBzZWxmLmVtaXQoJ2NoYW5nZScsIGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCAnRXJyb3IgaW4gLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKTonLCBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBDaGFuZ2VzJDEoZGIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIEVFLmNhbGwodGhpcyk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5kYiA9IGRiO1xuICBvcHRzID0gb3B0cyA/IGNsb25lKG9wdHMpIDoge307XG4gIHZhciBjb21wbGV0ZSA9IG9wdHMuY29tcGxldGUgPSBvbmNlKGZ1bmN0aW9uIChlcnIsIHJlc3ApIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAobGlzdGVuZXJDb3VudChzZWxmLCAnZXJyb3InKSA+IDApIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuZW1pdCgnY29tcGxldGUnLCByZXNwKTtcbiAgICB9XG4gICAgc2VsZi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBkYi5yZW1vdmVMaXN0ZW5lcignZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgfSk7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHNlbGYub24oJ2NvbXBsZXRlJywgZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3ApO1xuICAgIH0pO1xuICAgIHNlbGYub24oJ2Vycm9yJywgY2FsbGJhY2spO1xuICB9XG4gIGZ1bmN0aW9uIG9uRGVzdHJveSgpIHtcbiAgICBzZWxmLmNhbmNlbCgpO1xuICB9XG4gIGRiLm9uY2UoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG5cbiAgb3B0cy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5pc0NhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnlDYXRjaEluQ2hhbmdlTGlzdGVuZXIoc2VsZiwgY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKTtcbiAgfTtcblxuICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHtcbiAgICBvcHRzLmNvbXBsZXRlID0gZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnVsZmlsbChyZXMpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBzZWxmLm9uY2UoJ2NhbmNlbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkYi5yZW1vdmVMaXN0ZW5lcignZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHtzdGF0dXM6ICdjYW5jZWxsZWQnfSk7XG4gIH0pO1xuICB0aGlzLnRoZW4gPSBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKTtcbiAgdGhpc1snY2F0Y2gnXSA9IHByb21pc2VbJ2NhdGNoJ10uYmluZChwcm9taXNlKTtcbiAgdGhpcy50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBjb21wbGV0ZShudWxsLCByZXN1bHQpO1xuICB9LCBjb21wbGV0ZSk7XG5cblxuXG4gIGlmICghZGIudGFza3F1ZXVlLmlzUmVhZHkpIHtcbiAgICBkYi50YXNrcXVldWUuYWRkVGFzayhmdW5jdGlvbiAoZmFpbGVkKSB7XG4gICAgICBpZiAoZmFpbGVkKSB7XG4gICAgICAgIG9wdHMuY29tcGxldGUoZmFpbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5pc0NhbmNlbGxlZCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2NhbmNlbCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi52YWxpZGF0ZUNoYW5nZXMob3B0cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi52YWxpZGF0ZUNoYW5nZXMob3B0cyk7XG4gIH1cbn1cbkNoYW5nZXMkMS5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgaWYgKHRoaXMuZGIudGFza3F1ZXVlLmlzUmVhZHkpIHtcbiAgICB0aGlzLmVtaXQoJ2NhbmNlbCcpO1xuICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc0NoYW5nZShkb2MsIG1ldGFkYXRhLCBvcHRzKSB7XG4gIHZhciBjaGFuZ2VMaXN0ID0gW3tyZXY6IGRvYy5fcmV2fV07XG4gIGlmIChvcHRzLnN0eWxlID09PSAnYWxsX2RvY3MnKSB7XG4gICAgY2hhbmdlTGlzdCA9IGNvbGxlY3RMZWF2ZXMobWV0YWRhdGEucmV2X3RyZWUpXG4gICAgLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4ge3JldjogeC5yZXZ9OyB9KTtcbiAgfVxuICB2YXIgY2hhbmdlID0ge1xuICAgIGlkOiBtZXRhZGF0YS5pZCxcbiAgICBjaGFuZ2VzOiBjaGFuZ2VMaXN0LFxuICAgIGRvYzogZG9jXG4gIH07XG5cbiAgaWYgKGlzRGVsZXRlZChtZXRhZGF0YSwgZG9jLl9yZXYpKSB7XG4gICAgY2hhbmdlLmRlbGV0ZWQgPSB0cnVlO1xuICB9XG4gIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgIGNoYW5nZS5kb2MuX2NvbmZsaWN0cyA9IGNvbGxlY3RDb25mbGljdHMobWV0YWRhdGEpO1xuICAgIGlmICghY2hhbmdlLmRvYy5fY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgZGVsZXRlIGNoYW5nZS5kb2MuX2NvbmZsaWN0cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZTtcbn1cblxuQ2hhbmdlcyQxLnByb3RvdHlwZS52YWxpZGF0ZUNoYW5nZXMgPSBmdW5jdGlvbiAob3B0cykge1xuICB2YXIgY2FsbGJhY2sgPSBvcHRzLmNvbXBsZXRlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4pIHtcbiAgICBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLnZhbGlkYXRlKG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICBzZWxmLmRvQ2hhbmdlcyhvcHRzKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLmRvQ2hhbmdlcyhvcHRzKTtcbiAgfVxufTtcblxuQ2hhbmdlcyQxLnByb3RvdHlwZS5kb0NoYW5nZXMgPSBmdW5jdGlvbiAob3B0cykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjYWxsYmFjayA9IG9wdHMuY29tcGxldGU7XG5cbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuICBpZiAoJ2xpdmUnIGluIG9wdHMgJiYgISgnY29udGludW91cycgaW4gb3B0cykpIHtcbiAgICBvcHRzLmNvbnRpbnVvdXMgPSBvcHRzLmxpdmU7XG4gIH1cbiAgb3B0cy5wcm9jZXNzQ2hhbmdlID0gcHJvY2Vzc0NoYW5nZTtcblxuICBpZiAob3B0cy5zaW5jZSA9PT0gJ2xhdGVzdCcpIHtcbiAgICBvcHRzLnNpbmNlID0gJ25vdyc7XG4gIH1cbiAgaWYgKCFvcHRzLnNpbmNlKSB7XG4gICAgb3B0cy5zaW5jZSA9IDA7XG4gIH1cbiAgaWYgKG9wdHMuc2luY2UgPT09ICdub3cnKSB7XG4gICAgdGhpcy5kYi5pbmZvKCkudGhlbihmdW5jdGlvbiAoaW5mbykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoc2VsZi5pc0NhbmNlbGxlZCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB7c3RhdHVzOiAnY2FuY2VsbGVkJ30pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcHRzLnNpbmNlID0gaW5mby51cGRhdGVfc2VxO1xuICAgICAgc2VsZi5kb0NoYW5nZXMob3B0cyk7XG4gICAgfSwgY2FsbGJhY2spO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luKSB7XG4gICAgUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbi5ub3JtYWxpemUob3B0cyk7XG4gICAgaWYgKFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4uc2hvdWxkRmlsdGVyKHRoaXMsIG9wdHMpKSB7XG4gICAgICByZXR1cm4gUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbi5maWx0ZXIodGhpcywgb3B0cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFsnZG9jX2lkcycsICdmaWx0ZXInLCAnc2VsZWN0b3InLCAndmlldyddLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGtleSBpbiBvcHRzKSB7XG4gICAgICAgIGd1YXJkZWRDb25zb2xlKCd3YXJuJyxcbiAgICAgICAgICAnVGhlIFwiJyArIGtleSArICdcIiBvcHRpb24gd2FzIHBhc3NlZCBpbiB0byBjaGFuZ2VzL3JlcGxpY2F0ZSwgJyArXG4gICAgICAgICAgJ2J1dCBwb3VjaGRiLWNoYW5nZXMtZmlsdGVyIHBsdWdpbiBpcyBub3QgaW5zdGFsbGVkLCBzbyBpdCAnICtcbiAgICAgICAgICAnd2FzIGlnbm9yZWQuIFBsZWFzZSBpbnN0YWxsIHRoZSBwbHVnaW4gdG8gZW5hYmxlIGZpbHRlcmluZy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoISgnZGVzY2VuZGluZycgaW4gb3B0cykpIHtcbiAgICBvcHRzLmRlc2NlbmRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIDAgYW5kIDEgc2hvdWxkIHJldHVybiAxIGRvY3VtZW50XG4gIG9wdHMubGltaXQgPSBvcHRzLmxpbWl0ID09PSAwID8gMSA6IG9wdHMubGltaXQ7XG4gIG9wdHMuY29tcGxldGUgPSBjYWxsYmFjaztcbiAgdmFyIG5ld1Byb21pc2UgPSB0aGlzLmRiLl9jaGFuZ2VzKG9wdHMpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAobmV3UHJvbWlzZSAmJiB0eXBlb2YgbmV3UHJvbWlzZS5jYW5jZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgY2FuY2VsID0gc2VsZi5jYW5jZWw7XG4gICAgc2VsZi5jYW5jZWwgPSBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIG5ld1Byb21pc2UuY2FuY2VsKCk7XG4gICAgICBjYW5jZWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qXG4gKiBBIGdlbmVyaWMgcG91Y2ggYWRhcHRlclxuICovXG5cbmZ1bmN0aW9uIGNvbXBhcmUobGVmdCwgcmlnaHQpIHtcbiAgcmV0dXJuIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDA7XG59XG5cbi8vIFdyYXBwZXIgZm9yIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlIGJ1bGtkb2NzIGFwaSB3aXRoIGEgc2luZ2xlIGRvYyxcbi8vIGlmIHRoZSBmaXJzdCByZXN1bHQgaXMgYW4gZXJyb3IsIHJldHVybiBhbiBlcnJvclxuZnVuY3Rpb24geWFua0Vycm9yKGNhbGxiYWNrLCBkb2NJZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGVyciwgcmVzdWx0cykge1xuICAgIGlmIChlcnIgfHwgKHJlc3VsdHNbMF0gJiYgcmVzdWx0c1swXS5lcnJvcikpIHtcbiAgICAgIGVyciA9IGVyciB8fCByZXN1bHRzWzBdO1xuICAgICAgZXJyLmRvY0lkID0gZG9jSWQ7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzLmxlbmd0aCA/IHJlc3VsdHNbMF0gIDogcmVzdWx0cyk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBjbGVhbiBkb2NzIGdpdmVuIHRvIHVzIGJ5IHRoZSB1c2VyXG5mdW5jdGlvbiBjbGVhbkRvY3MoZG9jcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZG9jID0gZG9jc1tpXTtcbiAgICBpZiAoZG9jLl9kZWxldGVkKSB7XG4gICAgICBkZWxldGUgZG9jLl9hdHRhY2htZW50czsgLy8gaWdub3JlIGF0dHMgZm9yIGRlbGV0ZWQgZG9jc1xuICAgIH0gZWxzZSBpZiAoZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgLy8gZmlsdGVyIG91dCBleHRyYW5lb3VzIGtleXMgZnJvbSBfYXR0YWNobWVudHNcbiAgICAgIHZhciBhdHRzID0gT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cyk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGF0dCA9IGF0dHNbal07XG4gICAgICAgIGRvYy5fYXR0YWNobWVudHNbYXR0XSA9IHBpY2soZG9jLl9hdHRhY2htZW50c1thdHRdLFxuICAgICAgICAgIFsnZGF0YScsICdkaWdlc3QnLCAnY29udGVudF90eXBlJywgJ2xlbmd0aCcsICdyZXZwb3MnLCAnc3R1YiddKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gY29tcGFyZSB0d28gZG9jcywgZmlyc3QgYnkgX2lkIHRoZW4gYnkgX3JldlxuZnVuY3Rpb24gY29tcGFyZUJ5SWRUaGVuUmV2KGEsIGIpIHtcbiAgdmFyIGlkQ29tcGFyZSA9IGNvbXBhcmUoYS5faWQsIGIuX2lkKTtcbiAgaWYgKGlkQ29tcGFyZSAhPT0gMCkge1xuICAgIHJldHVybiBpZENvbXBhcmU7XG4gIH1cbiAgdmFyIGFTdGFydCA9IGEuX3JldmlzaW9ucyA/IGEuX3JldmlzaW9ucy5zdGFydCA6IDA7XG4gIHZhciBiU3RhcnQgPSBiLl9yZXZpc2lvbnMgPyBiLl9yZXZpc2lvbnMuc3RhcnQgOiAwO1xuICByZXR1cm4gY29tcGFyZShhU3RhcnQsIGJTdGFydCk7XG59XG5cbi8vIGZvciBldmVyeSBub2RlIGluIGEgcmV2aXNpb24gdHJlZSBjb21wdXRlcyBpdHMgZGlzdGFuY2UgZnJvbSB0aGUgY2xvc2VzdFxuLy8gbGVhZlxuZnVuY3Rpb24gY29tcHV0ZUhlaWdodChyZXZzKSB7XG4gIHZhciBoZWlnaHQgPSB7fTtcbiAgdmFyIGVkZ2VzID0gW107XG4gIHRyYXZlcnNlUmV2VHJlZShyZXZzLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIGlkLCBwcm50KSB7XG4gICAgdmFyIHJldiA9IHBvcyArIFwiLVwiICsgaWQ7XG4gICAgaWYgKGlzTGVhZikge1xuICAgICAgaGVpZ2h0W3Jldl0gPSAwO1xuICAgIH1cbiAgICBpZiAocHJudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlZGdlcy5wdXNoKHtmcm9tOiBwcm50LCB0bzogcmV2fSk7XG4gICAgfVxuICAgIHJldHVybiByZXY7XG4gIH0pO1xuXG4gIGVkZ2VzLnJldmVyc2UoKTtcbiAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgIGlmIChoZWlnaHRbZWRnZS5mcm9tXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWlnaHRbZWRnZS5mcm9tXSA9IDEgKyBoZWlnaHRbZWRnZS50b107XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlaWdodFtlZGdlLmZyb21dID0gTWF0aC5taW4oaGVpZ2h0W2VkZ2UuZnJvbV0sIDEgKyBoZWlnaHRbZWRnZS50b10pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBoZWlnaHQ7XG59XG5cbmZ1bmN0aW9uIGFsbERvY3NLZXlzUGFyc2Uob3B0cykge1xuICB2YXIga2V5cyA9ICAoJ2xpbWl0JyBpbiBvcHRzKSA/XG4gICAgb3B0cy5rZXlzLnNsaWNlKG9wdHMuc2tpcCwgb3B0cy5saW1pdCArIG9wdHMuc2tpcCkgOlxuICAgIChvcHRzLnNraXAgPiAwKSA/IG9wdHMua2V5cy5zbGljZShvcHRzLnNraXApIDogb3B0cy5rZXlzO1xuICBvcHRzLmtleXMgPSBrZXlzO1xuICBvcHRzLnNraXAgPSAwO1xuICBkZWxldGUgb3B0cy5saW1pdDtcbiAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgIGtleXMucmV2ZXJzZSgpO1xuICAgIG9wdHMuZGVzY2VuZGluZyA9IGZhbHNlO1xuICB9XG59XG5cbi8vIGFsbCBjb21wYWN0aW9uIGlzIGRvbmUgaW4gYSBxdWV1ZSwgdG8gYXZvaWQgYXR0YWNoaW5nXG4vLyB0b28gbWFueSBsaXN0ZW5lcnMgYXQgb25jZVxuZnVuY3Rpb24gZG9OZXh0Q29tcGFjdGlvbihzZWxmKSB7XG4gIHZhciB0YXNrID0gc2VsZi5fY29tcGFjdGlvblF1ZXVlWzBdO1xuICB2YXIgb3B0cyA9IHRhc2sub3B0cztcbiAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgc2VsZi5nZXQoJ19sb2NhbC9jb21wYWN0aW9uJykuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSkudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgaWYgKGRvYyAmJiBkb2MubGFzdF9zZXEpIHtcbiAgICAgIG9wdHMubGFzdF9zZXEgPSBkb2MubGFzdF9zZXE7XG4gICAgfVxuICAgIHNlbGYuX2NvbXBhY3Qob3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gICAgICB9XG4gICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLl9jb21wYWN0aW9uUXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKHNlbGYuX2NvbXBhY3Rpb25RdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBkb05leHRDb21wYWN0aW9uKHNlbGYpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaG1lbnROYW1lRXJyb3IobmFtZSkge1xuICBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICdfJykge1xuICAgIHJldHVybiBuYW1lICsgJyBpcyBub3QgYSB2YWxpZCBhdHRhY2htZW50IG5hbWUsIGF0dGFjaG1lbnQgJyArXG4gICAgICAnbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggXFwnX1xcJyc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5pbmhlcml0cyhBYnN0cmFjdFBvdWNoREIsIEVFKTtcblxuZnVuY3Rpb24gQWJzdHJhY3RQb3VjaERCKCkge1xuICBFRS5jYWxsKHRoaXMpO1xuXG4gIC8vIHJlLWJpbmQgcHJvdG90eXBlZCBtZXRob2RzXG4gIGZvciAodmFyIHAgaW4gQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZSkge1xuICAgIGlmICh0eXBlb2YgdGhpc1twXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1twXSA9IHRoaXNbcF0uYmluZCh0aGlzKTtcbiAgICB9XG4gIH1cbn1cblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5wb3N0ID1cbiAgYWRhcHRlckZ1bigncG9zdCcsIGZ1bmN0aW9uIChkb2MsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBkb2MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZG9jKSkge1xuICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihOT1RfQU5fT0JKRUNUKSk7XG4gIH1cbiAgdGhpcy5idWxrRG9jcyh7ZG9jczogW2RvY119LCBvcHRzLCB5YW5rRXJyb3IoY2FsbGJhY2ssIGRvYy5faWQpKTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnB1dCA9IGFkYXB0ZXJGdW4oJ3B1dCcsIGZ1bmN0aW9uIChkb2MsIG9wdHMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBkb2MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZG9jKSkge1xuICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihOT1RfQU5fT0JKRUNUKSk7XG4gIH1cbiAgaW52YWxpZElkRXJyb3IoZG9jLl9pZCk7XG4gIGlmIChpc0xvY2FsSWQoZG9jLl9pZCkgJiYgdHlwZW9mIHRoaXMuX3B1dExvY2FsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGRvYy5fZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlbW92ZUxvY2FsKGRvYywgY2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHV0TG9jYWwoZG9jLCBjYik7XG4gICAgfVxuICB9XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKG9wdHMuZm9yY2UgJiYgZG9jLl9yZXYpIHtcbiAgICB0cmFuc2Zvcm1Gb3JjZU9wdGlvblRvTmV3RWRpdHNPcHRpb24oKTtcbiAgICBwdXREb2MoZnVuY3Rpb24gKGVycikge1xuICAgICAgdmFyIHJlc3VsdCA9IGVyciA/IG51bGwgOiB7b2s6IHRydWUsIGlkOiBkb2MuX2lkLCByZXY6IGRvYy5fcmV2fTtcbiAgICAgIGNiKGVyciwgcmVzdWx0KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwdXREb2MoY2IpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtRm9yY2VPcHRpb25Ub05ld0VkaXRzT3B0aW9uKCkge1xuICAgIHZhciBwYXJ0cyA9IGRvYy5fcmV2LnNwbGl0KCctJyk7XG4gICAgdmFyIG9sZFJldklkID0gcGFydHNbMV07XG4gICAgdmFyIG9sZFJldk51bSA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XG5cbiAgICB2YXIgbmV3UmV2TnVtID0gb2xkUmV2TnVtICsgMTtcbiAgICB2YXIgbmV3UmV2SWQgPSByZXYkJDEoKTtcblxuICAgIGRvYy5fcmV2aXNpb25zID0ge1xuICAgICAgc3RhcnQ6IG5ld1Jldk51bSxcbiAgICAgIGlkczogW25ld1JldklkLCBvbGRSZXZJZF1cbiAgICB9O1xuICAgIGRvYy5fcmV2ID0gbmV3UmV2TnVtICsgJy0nICsgbmV3UmV2SWQ7XG4gICAgb3B0cy5uZXdfZWRpdHMgPSBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiBwdXREb2MobmV4dCkge1xuICAgIGlmICh0eXBlb2Ygc2VsZi5fcHV0ID09PSAnZnVuY3Rpb24nICYmIG9wdHMubmV3X2VkaXRzICE9PSBmYWxzZSkge1xuICAgICAgc2VsZi5fcHV0KGRvYywgb3B0cywgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuYnVsa0RvY3Moe2RvY3M6IFtkb2NdfSwgb3B0cywgeWFua0Vycm9yKG5leHQsIGRvYy5faWQpKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnB1dEF0dGFjaG1lbnQgPVxuICBhZGFwdGVyRnVuKCdwdXRBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsIHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9iLCB0eXBlKSB7XG4gIHZhciBhcGkgPSB0aGlzO1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0eXBlID0gYmxvYjtcbiAgICBibG9iID0gcmV2O1xuICAgIHJldiA9IG51bGw7XG4gIH1cbiAgLy8gTGV0cyBmaXggaW4gaHR0cHM6Ly9naXRodWIuY29tL3BvdWNoZGIvcG91Y2hkYi9pc3N1ZXMvMzI2N1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgIHR5cGUgPSBibG9iO1xuICAgIGJsb2IgPSByZXY7XG4gICAgcmV2ID0gbnVsbDtcbiAgfVxuICBpZiAoIXR5cGUpIHtcbiAgICBndWFyZGVkQ29uc29sZSgnd2FybicsICdBdHRhY2htZW50JywgYXR0YWNobWVudElkLCAnb24gZG9jdW1lbnQnLCBkb2NJZCwgJ2lzIG1pc3NpbmcgY29udGVudF90eXBlJyk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBdHRhY2htZW50KGRvYykge1xuICAgIHZhciBwcmV2cmV2cG9zID0gJ19yZXYnIGluIGRvYyA/IHBhcnNlSW50KGRvYy5fcmV2LCAxMCkgOiAwO1xuICAgIGRvYy5fYXR0YWNobWVudHMgPSBkb2MuX2F0dGFjaG1lbnRzIHx8IHt9O1xuICAgIGRvYy5fYXR0YWNobWVudHNbYXR0YWNobWVudElkXSA9IHtcbiAgICAgIGNvbnRlbnRfdHlwZTogdHlwZSxcbiAgICAgIGRhdGE6IGJsb2IsXG4gICAgICByZXZwb3M6ICsrcHJldnJldnBvc1xuICAgIH07XG4gICAgcmV0dXJuIGFwaS5wdXQoZG9jKTtcbiAgfVxuXG4gIHJldHVybiBhcGkuZ2V0KGRvY0lkKS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAoZG9jLl9yZXYgIT09IHJldikge1xuICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQXR0YWNobWVudChkb2MpO1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgIC8vIGNyZWF0ZSBuZXcgZG9jXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXJyLnJlYXNvbiA9PT0gTUlTU0lOR19ET0MubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUF0dGFjaG1lbnQoe19pZDogZG9jSWR9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5yZW1vdmVBdHRhY2htZW50ID1cbiAgYWRhcHRlckZ1bigncmVtb3ZlQXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLCByZXYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmdldChkb2NJZCwgZnVuY3Rpb24gKGVyciwgb2JqKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9iai5fcmV2ICE9PSByZXYpIHtcbiAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIW9iai5fYXR0YWNobWVudHMpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBkZWxldGUgb2JqLl9hdHRhY2htZW50c1thdHRhY2htZW50SWRdO1xuICAgIGlmIChPYmplY3Qua2V5cyhvYmouX2F0dGFjaG1lbnRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBvYmouX2F0dGFjaG1lbnRzO1xuICAgIH1cbiAgICBzZWxmLnB1dChvYmosIGNhbGxiYWNrKTtcbiAgfSk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5yZW1vdmUgPVxuICBhZGFwdGVyRnVuKCdyZW1vdmUnLCBmdW5jdGlvbiAoZG9jT3JJZCwgb3B0c09yUmV2LCBvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgZG9jO1xuICBpZiAodHlwZW9mIG9wdHNPclJldiA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBpZCwgcmV2LCBvcHRzLCBjYWxsYmFjayBzdHlsZVxuICAgIGRvYyA9IHtcbiAgICAgIF9pZDogZG9jT3JJZCxcbiAgICAgIF9yZXY6IG9wdHNPclJldlxuICAgIH07XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGRvYywgb3B0cywgY2FsbGJhY2sgc3R5bGVcbiAgICBkb2MgPSBkb2NPcklkO1xuICAgIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHNPclJldjtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IG9wdHNPclJldjtcbiAgICB9XG4gIH1cbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIG9wdHMud2FzX2RlbGV0ZSA9IHRydWU7XG4gIHZhciBuZXdEb2MgPSB7X2lkOiBkb2MuX2lkLCBfcmV2OiAoZG9jLl9yZXYgfHwgb3B0cy5yZXYpfTtcbiAgbmV3RG9jLl9kZWxldGVkID0gdHJ1ZTtcbiAgaWYgKGlzTG9jYWxJZChuZXdEb2MuX2lkKSAmJiB0eXBlb2YgdGhpcy5fcmVtb3ZlTG9jYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlTG9jYWwoZG9jLCBjYWxsYmFjayk7XG4gIH1cbiAgdGhpcy5idWxrRG9jcyh7ZG9jczogW25ld0RvY119LCBvcHRzLCB5YW5rRXJyb3IoY2FsbGJhY2ssIG5ld0RvYy5faWQpKTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJldnNEaWZmID1cbiAgYWRhcHRlckZ1bigncmV2c0RpZmYnLCBmdW5jdGlvbiAocmVxLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHZhciBpZHMgPSBPYmplY3Qua2V5cyhyZXEpO1xuXG4gIGlmICghaWRzLmxlbmd0aCkge1xuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7fSk7XG4gIH1cblxuICB2YXIgY291bnQgPSAwO1xuICB2YXIgbWlzc2luZyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG4gIGZ1bmN0aW9uIGFkZFRvTWlzc2luZyhpZCwgcmV2SWQpIHtcbiAgICBpZiAoIW1pc3NpbmcuaGFzKGlkKSkge1xuICAgICAgbWlzc2luZy5zZXQoaWQsIHttaXNzaW5nOiBbXX0pO1xuICAgIH1cbiAgICBtaXNzaW5nLmdldChpZCkubWlzc2luZy5wdXNoKHJldklkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NEb2MoaWQsIHJldl90cmVlKSB7XG4gICAgLy8gSXMgdGhpcyBmYXN0IGVub3VnaD8gTWF5YmUgd2Ugc2hvdWxkIHN3aXRjaCB0byBhIHNldCBzaW11bGF0ZWQgYnkgYSBtYXBcbiAgICB2YXIgbWlzc2luZ0ZvcklkID0gcmVxW2lkXS5zbGljZSgwKTtcbiAgICB0cmF2ZXJzZVJldlRyZWUocmV2X3RyZWUsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgcmV2SGFzaCwgY3R4LFxuICAgICAgb3B0cykge1xuICAgICAgICB2YXIgcmV2ID0gcG9zICsgJy0nICsgcmV2SGFzaDtcbiAgICAgICAgdmFyIGlkeCA9IG1pc3NpbmdGb3JJZC5pbmRleE9mKHJldik7XG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbWlzc2luZ0ZvcklkLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKG9wdHMuc3RhdHVzICE9PSAnYXZhaWxhYmxlJykge1xuICAgICAgICAgIGFkZFRvTWlzc2luZyhpZCwgcmV2KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBUcmF2ZXJzaW5nIHRoZSB0cmVlIGlzIHN5bmNocm9ub3VzLCBzbyBub3cgYG1pc3NpbmdGb3JJZGAgY29udGFpbnNcbiAgICAvLyByZXZpc2lvbnMgdGhhdCB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgdHJlZVxuICAgIG1pc3NpbmdGb3JJZC5mb3JFYWNoKGZ1bmN0aW9uIChyZXYpIHtcbiAgICAgIGFkZFRvTWlzc2luZyhpZCwgcmV2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlkcy5tYXAoZnVuY3Rpb24gKGlkKSB7XG4gICAgdGhpcy5fZ2V0UmV2aXNpb25UcmVlKGlkLCBmdW5jdGlvbiAoZXJyLCByZXZfdHJlZSkge1xuICAgICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzID09PSA0MDQgJiYgZXJyLm1lc3NhZ2UgPT09ICdtaXNzaW5nJykge1xuICAgICAgICBtaXNzaW5nLnNldChpZCwge21pc3Npbmc6IHJlcVtpZF19KTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0RvYyhpZCwgcmV2X3RyZWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKytjb3VudCA9PT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAvLyBjb252ZXJ0IExhenlNYXAgdG8gb2JqZWN0XG4gICAgICAgIHZhciBtaXNzaW5nT2JqID0ge307XG4gICAgICAgIG1pc3NpbmcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgIG1pc3NpbmdPYmpba2V5XSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG1pc3NpbmdPYmopO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCB0aGlzKTtcbn0pO1xuXG4vLyBfYnVsa19nZXQgQVBJIGZvciBmYXN0ZXIgcmVwbGljYXRpb24sIGFzIGRlc2NyaWJlZCBpblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb3VjaGRiLWNodHRwZC9wdWxsLzMzXG4vLyBBdCB0aGUgXCJhYnN0cmFjdFwiIGxldmVsLCBpdCB3aWxsIGp1c3QgcnVuIG11bHRpcGxlIGdldCgpcyBpblxuLy8gcGFyYWxsZWwsIGJlY2F1c2UgdGhpcyBpc24ndCBtdWNoIG9mIGEgcGVyZm9ybWFuY2UgY29zdFxuLy8gZm9yIGxvY2FsIGRhdGFiYXNlcyAoZXhjZXB0IHRoZSBjb3N0IG9mIG11bHRpcGxlIHRyYW5zYWN0aW9ucywgd2hpY2ggaXNcbi8vIHNtYWxsKS4gVGhlIGh0dHAgYWRhcHRlciBvdmVycmlkZXMgdGhpcyBpbiBvcmRlclxuLy8gdG8gZG8gYSBtb3JlIGVmZmljaWVudCBzaW5nbGUgSFRUUCByZXF1ZXN0LlxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5idWxrR2V0ID1cbiAgYWRhcHRlckZ1bignYnVsa0dldCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICBidWxrR2V0KHRoaXMsIG9wdHMsIGNhbGxiYWNrKTtcbn0pO1xuXG4vLyBjb21wYWN0IG9uZSBkb2N1bWVudCBhbmQgZmlyZSBjYWxsYmFja1xuLy8gYnkgY29tcGFjdGluZyB3ZSBtZWFuIHJlbW92aW5nIGFsbCByZXZpc2lvbnMgd2hpY2hcbi8vIGFyZSBmdXJ0aGVyIGZyb20gdGhlIGxlYWYgaW4gcmV2aXNpb24gdHJlZSB0aGFuIG1heF9oZWlnaHRcbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuY29tcGFjdERvY3VtZW50ID1cbiAgYWRhcHRlckZ1bignY29tcGFjdERvY3VtZW50JywgZnVuY3Rpb24gKGRvY0lkLCBtYXhIZWlnaHQsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fZ2V0UmV2aXNpb25UcmVlKGRvY0lkLCBmdW5jdGlvbiAoZXJyLCByZXZUcmVlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIHZhciBoZWlnaHQgPSBjb21wdXRlSGVpZ2h0KHJldlRyZWUpO1xuICAgIHZhciBjYW5kaWRhdGVzID0gW107XG4gICAgdmFyIHJldnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhoZWlnaHQpLmZvckVhY2goZnVuY3Rpb24gKHJldikge1xuICAgICAgaWYgKGhlaWdodFtyZXZdID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChyZXYpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJhdmVyc2VSZXZUcmVlKHJldlRyZWUsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgcmV2SGFzaCwgY3R4LCBvcHRzKSB7XG4gICAgICB2YXIgcmV2ID0gcG9zICsgJy0nICsgcmV2SGFzaDtcbiAgICAgIGlmIChvcHRzLnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScgJiYgY2FuZGlkYXRlcy5pbmRleE9mKHJldikgIT09IC0xKSB7XG4gICAgICAgIHJldnMucHVzaChyZXYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlbGYuX2RvQ29tcGFjdGlvbihkb2NJZCwgcmV2cywgY2FsbGJhY2spO1xuICB9KTtcbn0pO1xuXG4vLyBjb21wYWN0IHRoZSB3aG9sZSBkYXRhYmFzZSB1c2luZyBzaW5nbGUgZG9jdW1lbnRcbi8vIGNvbXBhY3Rpb25cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuY29tcGFjdCA9XG4gIGFkYXB0ZXJGdW4oJ2NvbXBhY3QnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgc2VsZi5fY29tcGFjdGlvblF1ZXVlID0gc2VsZi5fY29tcGFjdGlvblF1ZXVlIHx8IFtdO1xuICBzZWxmLl9jb21wYWN0aW9uUXVldWUucHVzaCh7b3B0czogb3B0cywgY2FsbGJhY2s6IGNhbGxiYWNrfSk7XG4gIGlmIChzZWxmLl9jb21wYWN0aW9uUXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgZG9OZXh0Q29tcGFjdGlvbihzZWxmKTtcbiAgfVxufSk7XG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLl9jb21wYWN0ID0gZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNoYW5nZXNPcHRzID0ge1xuICAgIHJldHVybl9kb2NzOiBmYWxzZSxcbiAgICBsYXN0X3NlcTogb3B0cy5sYXN0X3NlcSB8fCAwXG4gIH07XG4gIHZhciBwcm9taXNlcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlKHJvdykge1xuICAgIHByb21pc2VzLnB1c2goc2VsZi5jb21wYWN0RG9jdW1lbnQocm93LmlkLCAwKSk7XG4gIH1cbiAgZnVuY3Rpb24gb25Db21wbGV0ZShyZXNwKSB7XG4gICAgdmFyIGxhc3RTZXEgPSByZXNwLmxhc3Rfc2VxO1xuICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB1cHNlcnQoc2VsZiwgJ19sb2NhbC9jb21wYWN0aW9uJywgZnVuY3Rpb24gZGVsdGFGdW5jKGRvYykge1xuICAgICAgICBpZiAoIWRvYy5sYXN0X3NlcSB8fCBkb2MubGFzdF9zZXEgPCBsYXN0U2VxKSB7XG4gICAgICAgICAgZG9jLmxhc3Rfc2VxID0gbGFzdFNlcTtcbiAgICAgICAgICByZXR1cm4gZG9jO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gc29tZWJvZHkgZWxzZSBnb3QgaGVyZSBmaXJzdCwgZG9uJ3QgdXBkYXRlXG4gICAgICB9KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtvazogdHJ1ZX0pO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgfVxuICBzZWxmLmNoYW5nZXMoY2hhbmdlc09wdHMpXG4gICAgLm9uKCdjaGFuZ2UnLCBvbkNoYW5nZSlcbiAgICAub24oJ2NvbXBsZXRlJywgb25Db21wbGV0ZSlcbiAgICAub24oJ2Vycm9yJywgY2FsbGJhY2spO1xufTtcblxuLyogQmVnaW4gYXBpIHdyYXBwZXJzLiBTcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHRvIHN0b3JhZ2UgYmVsb25ncyBpbiB0aGVcbiAgIF9bbWV0aG9kXSAqL1xuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5nZXQgPSBhZGFwdGVyRnVuKCdnZXQnLCBmdW5jdGlvbiAoaWQsIG9wdHMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY2IoY3JlYXRlRXJyb3IoSU5WQUxJRF9JRCkpO1xuICB9XG4gIGlmIChpc0xvY2FsSWQoaWQpICYmIHR5cGVvZiB0aGlzLl9nZXRMb2NhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGlzLl9nZXRMb2NhbChpZCwgY2IpO1xuICB9XG4gIHZhciBsZWF2ZXMgPSBbXSwgc2VsZiA9IHRoaXM7XG5cbiAgZnVuY3Rpb24gZmluaXNoT3BlblJldnMoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBjb3VudCA9IGxlYXZlcy5sZW5ndGg7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFjb3VudCkge1xuICAgICAgcmV0dXJuIGNiKG51bGwsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gb3JkZXIgd2l0aCBvcGVuX3JldnMgaXMgdW5zcGVjaWZpZWRcbiAgICBsZWF2ZXMuZm9yRWFjaChmdW5jdGlvbiAobGVhZikge1xuICAgICAgc2VsZi5nZXQoaWQsIHtcbiAgICAgICAgcmV2OiBsZWFmLFxuICAgICAgICByZXZzOiBvcHRzLnJldnMsXG4gICAgICAgIGxhdGVzdDogb3B0cy5sYXRlc3QsXG4gICAgICAgIGF0dGFjaG1lbnRzOiBvcHRzLmF0dGFjaG1lbnRzLFxuICAgICAgICBiaW5hcnk6IG9wdHMuYmluYXJ5XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyLCBkb2MpIHtcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAvLyB1c2luZyBsYXRlc3Q9dHJ1ZSBjYW4gcHJvZHVjZSBkdXBsaWNhdGVzXG4gICAgICAgICAgdmFyIGV4aXN0aW5nO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdFtpXS5vayAmJiByZXN1bHRbaV0ub2suX3JldiA9PT0gZG9jLl9yZXYpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe29rOiBkb2N9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goe21pc3Npbmc6IGxlYWZ9KTtcbiAgICAgICAgfVxuICAgICAgICBjb3VudC0tO1xuICAgICAgICBpZiAoIWNvdW50KSB7XG4gICAgICAgICAgY2IobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAob3B0cy5vcGVuX3JldnMpIHtcbiAgICBpZiAob3B0cy5vcGVuX3JldnMgPT09IFwiYWxsXCIpIHtcbiAgICAgIHRoaXMuX2dldFJldmlzaW9uVHJlZShpZCwgZnVuY3Rpb24gKGVyciwgcmV2X3RyZWUpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBsZWF2ZXMgPSBjb2xsZWN0TGVhdmVzKHJldl90cmVlKS5tYXAoZnVuY3Rpb24gKGxlYWYpIHtcbiAgICAgICAgICByZXR1cm4gbGVhZi5yZXY7XG4gICAgICAgIH0pO1xuICAgICAgICBmaW5pc2hPcGVuUmV2cygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMub3Blbl9yZXZzKSkge1xuICAgICAgICBsZWF2ZXMgPSBvcHRzLm9wZW5fcmV2cztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZWF2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgbCA9IGxlYXZlc1tpXTtcbiAgICAgICAgICAvLyBsb29rcyBsaWtlIGl0J3MgdGhlIG9ubHkgdGhpbmcgY291Y2hkYiBjaGVja3NcbiAgICAgICAgICBpZiAoISh0eXBlb2YgKGwpID09PSBcInN0cmluZ1wiICYmIC9eXFxkKy0vLnRlc3QobCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoY3JlYXRlRXJyb3IoSU5WQUxJRF9SRVYpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoT3BlblJldnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjYihjcmVhdGVFcnJvcihVTktOT1dOX0VSUk9SLCAnZnVuY3Rpb25fY2xhdXNlJykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47IC8vIG9wZW5fcmV2cyBkb2VzIG5vdCBsaWtlIG90aGVyIG9wdGlvbnNcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9nZXQoaWQsIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGVyci5kb2NJZCA9IGlkO1xuICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuXG4gICAgdmFyIGRvYyA9IHJlc3VsdC5kb2M7XG4gICAgdmFyIG1ldGFkYXRhID0gcmVzdWx0Lm1ldGFkYXRhO1xuICAgIHZhciBjdHggPSByZXN1bHQuY3R4O1xuXG4gICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICB2YXIgY29uZmxpY3RzID0gY29sbGVjdENvbmZsaWN0cyhtZXRhZGF0YSk7XG4gICAgICBpZiAoY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgICBkb2MuX2NvbmZsaWN0cyA9IGNvbmZsaWN0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNEZWxldGVkKG1ldGFkYXRhLCBkb2MuX3JldikpIHtcbiAgICAgIGRvYy5fZGVsZXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2cyB8fCBvcHRzLnJldnNfaW5mbykge1xuICAgICAgdmFyIHNwbGl0dGVkUmV2ID0gZG9jLl9yZXYuc3BsaXQoJy0nKTtcbiAgICAgIHZhciByZXZObyAgICAgICA9IHBhcnNlSW50KHNwbGl0dGVkUmV2WzBdLCAxMCk7XG4gICAgICB2YXIgcmV2SGFzaCAgICAgPSBzcGxpdHRlZFJldlsxXTtcblxuICAgICAgdmFyIHBhdGhzID0gcm9vdFRvTGVhZihtZXRhZGF0YS5yZXZfdHJlZSk7XG4gICAgICB2YXIgcGF0aCA9IG51bGw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGN1cnJlbnRQYXRoID0gcGF0aHNbaV07XG4gICAgICAgIHZhciBoYXNoSW5kZXggPSBjdXJyZW50UGF0aC5pZHMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LmlkOyB9KVxuICAgICAgICAgIC5pbmRleE9mKHJldkhhc2gpO1xuICAgICAgICB2YXIgaGFzaEZvdW5kQXRSZXZQb3MgPSBoYXNoSW5kZXggPT09IChyZXZObyAtIDEpO1xuXG4gICAgICAgIGlmIChoYXNoRm91bmRBdFJldlBvcyB8fCAoIXBhdGggJiYgaGFzaEluZGV4ICE9PSAtMSkpIHtcbiAgICAgICAgICBwYXRoID0gY3VycmVudFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgZXJyID0gbmV3IEVycm9yKCdpbnZhbGlkIHJldiB0cmVlJyk7XG4gICAgICAgIGVyci5kb2NJZCA9IGlkO1xuICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4T2ZSZXYgPSBwYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguaWQ7IH0pXG4gICAgICAgIC5pbmRleE9mKGRvYy5fcmV2LnNwbGl0KCctJylbMV0pICsgMTtcbiAgICAgIHZhciBob3dNYW55ID0gcGF0aC5pZHMubGVuZ3RoIC0gaW5kZXhPZlJldjtcbiAgICAgIHBhdGguaWRzLnNwbGljZShpbmRleE9mUmV2LCBob3dNYW55KTtcbiAgICAgIHBhdGguaWRzLnJldmVyc2UoKTtcblxuICAgICAgaWYgKG9wdHMucmV2cykge1xuICAgICAgICBkb2MuX3JldmlzaW9ucyA9IHtcbiAgICAgICAgICBzdGFydDogKHBhdGgucG9zICsgcGF0aC5pZHMubGVuZ3RoKSAtIDEsXG4gICAgICAgICAgaWRzOiBwYXRoLmlkcy5tYXAoZnVuY3Rpb24gKHJldikge1xuICAgICAgICAgICAgcmV0dXJuIHJldi5pZDtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMucmV2c19pbmZvKSB7XG4gICAgICAgIHZhciBwb3MgPSAgcGF0aC5wb3MgKyBwYXRoLmlkcy5sZW5ndGg7XG4gICAgICAgIGRvYy5fcmV2c19pbmZvID0gcGF0aC5pZHMubWFwKGZ1bmN0aW9uIChyZXYpIHtcbiAgICAgICAgICBwb3MtLTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmV2OiBwb3MgKyAnLScgKyByZXYuaWQsXG4gICAgICAgICAgICBzdGF0dXM6IHJldi5vcHRzLnN0YXR1c1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzICYmIGRvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgIHZhciBhdHRhY2htZW50cyA9IGRvYy5fYXR0YWNobWVudHM7XG4gICAgICB2YXIgY291bnQgPSBPYmplY3Qua2V5cyhhdHRhY2htZW50cykubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjYihudWxsLCBkb2MpO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmtleXMoYXR0YWNobWVudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB0aGlzLl9nZXRBdHRhY2htZW50KGRvYy5faWQsIGtleSwgYXR0YWNobWVudHNba2V5XSwge1xuICAgICAgICAgIC8vIFByZXZpb3VzbHkgdGhlIHJldmlzaW9uIGhhbmRsaW5nIHdhcyBkb25lIGluIGFkYXB0ZXIuanNcbiAgICAgICAgICAvLyBnZXRBdHRhY2htZW50LCBob3dldmVyIHNpbmNlIGlkYi1uZXh0IGRvZXNudCB3ZSBuZWVkIHRvXG4gICAgICAgICAgLy8gcGFzcyB0aGUgcmV2IHRocm91Z2hcbiAgICAgICAgICByZXY6IGRvYy5fcmV2LFxuICAgICAgICAgIGJpbmFyeTogb3B0cy5iaW5hcnksXG4gICAgICAgICAgY3R4OiBjdHhcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICAgIHZhciBhdHQgPSBkb2MuX2F0dGFjaG1lbnRzW2tleV07XG4gICAgICAgICAgYXR0LmRhdGEgPSBkYXRhO1xuICAgICAgICAgIGRlbGV0ZSBhdHQuc3R1YjtcbiAgICAgICAgICBkZWxldGUgYXR0Lmxlbmd0aDtcbiAgICAgICAgICBpZiAoIS0tY291bnQpIHtcbiAgICAgICAgICAgIGNiKG51bGwsIGRvYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sIHNlbGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb2MuX2F0dGFjaG1lbnRzLCBrZXkpKSB7XG4gICAgICAgICAgICBkb2MuX2F0dGFjaG1lbnRzW2tleV0uc3R1YiA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYihudWxsLCBkb2MpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuLy8gVE9ETzogSSBkb250IGxpa2UgdGhpcywgaXQgZm9yY2VzIGFuIGV4dHJhIHJlYWQgZm9yIGV2ZXJ5XG4vLyBhdHRhY2htZW50IHJlYWQgYW5kIGVuZm9yY2VzIGEgY29uZnVzaW5nIGFwaSBiZXR3ZWVuXG4vLyBhZGFwdGVyLmpzIGFuZCB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5nZXRBdHRhY2htZW50ID1cbiAgYWRhcHRlckZ1bignZ2V0QXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLCBvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChvcHRzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHRoaXMuX2dldChkb2NJZCwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIGlmIChyZXMuZG9jLl9hdHRhY2htZW50cyAmJiByZXMuZG9jLl9hdHRhY2htZW50c1thdHRhY2htZW50SWRdKSB7XG4gICAgICBvcHRzLmN0eCA9IHJlcy5jdHg7XG4gICAgICBvcHRzLmJpbmFyeSA9IHRydWU7XG4gICAgICBzZWxmLl9nZXRBdHRhY2htZW50KGRvY0lkLCBhdHRhY2htZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5kb2MuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF0sIG9wdHMsIGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DKSk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmFsbERvY3MgPVxuICBhZGFwdGVyRnVuKCdhbGxEb2NzJywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgb3B0cy5za2lwID0gdHlwZW9mIG9wdHMuc2tpcCAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRzLnNraXAgOiAwO1xuICBpZiAob3B0cy5zdGFydF9rZXkpIHtcbiAgICBvcHRzLnN0YXJ0a2V5ID0gb3B0cy5zdGFydF9rZXk7XG4gIH1cbiAgaWYgKG9wdHMuZW5kX2tleSkge1xuICAgIG9wdHMuZW5ka2V5ID0gb3B0cy5lbmRfa2V5O1xuICB9XG4gIGlmICgna2V5cycgaW4gb3B0cykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRzLmtleXMpKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IFR5cGVFcnJvcignb3B0aW9ucy5rZXlzIG11c3QgYmUgYW4gYXJyYXknKSk7XG4gICAgfVxuICAgIHZhciBpbmNvbXBhdGlibGVPcHQgPVxuICAgICAgWydzdGFydGtleScsICdlbmRrZXknLCAna2V5J10uZmlsdGVyKGZ1bmN0aW9uIChpbmNvbXBhdGlibGVPcHQpIHtcbiAgICAgIHJldHVybiBpbmNvbXBhdGlibGVPcHQgaW4gb3B0cztcbiAgICB9KVswXTtcbiAgICBpZiAoaW5jb21wYXRpYmxlT3B0KSB7XG4gICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihRVUVSWV9QQVJTRV9FUlJPUixcbiAgICAgICAgJ1F1ZXJ5IHBhcmFtZXRlciBgJyArIGluY29tcGF0aWJsZU9wdCArXG4gICAgICAgICdgIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggbXVsdGktZ2V0J1xuICAgICAgKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNSZW1vdGUodGhpcykpIHtcbiAgICAgIGFsbERvY3NLZXlzUGFyc2Uob3B0cyk7XG4gICAgICBpZiAob3B0cy5rZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsRG9jcyh7bGltaXQ6IDB9LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2FsbERvY3Mob3B0cywgY2FsbGJhY2spO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuY2hhbmdlcyA9IGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgLy8gQnkgZGVmYXVsdCBzZXQgcmV0dXJuX2RvY3MgdG8gZmFsc2UgaWYgdGhlIGNhbGxlciBoYXMgb3B0cy5saXZlID0gdHJ1ZSxcbiAgLy8gdGhpcyB3aWxsIHByZXZlbnQgdXMgZnJvbSBjb2xsZWN0aW5nIHRoZSBzZXQgb2YgY2hhbmdlcyBpbmRlZmluaXRlbHlcbiAgLy8gcmVzdWx0aW5nIGluIGdyb3dpbmcgbWVtb3J5XG4gIG9wdHMucmV0dXJuX2RvY3MgPSAoJ3JldHVybl9kb2NzJyBpbiBvcHRzKSA/IG9wdHMucmV0dXJuX2RvY3MgOiAhb3B0cy5saXZlO1xuXG4gIHJldHVybiBuZXcgQ2hhbmdlcyQxKHRoaXMsIG9wdHMsIGNhbGxiYWNrKTtcbn07XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuY2xvc2UgPSBhZGFwdGVyRnVuKCdjbG9zZScsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuICB0aGlzLmVtaXQoJ2Nsb3NlZCcpO1xuICByZXR1cm4gdGhpcy5fY2xvc2UoY2FsbGJhY2spO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuaW5mbyA9IGFkYXB0ZXJGdW4oJ2luZm8nLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9pbmZvKGZ1bmN0aW9uIChlcnIsIGluZm8pIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgLy8gYXNzdW1lIHdlIGtub3cgYmV0dGVyIHRoYW4gdGhlIGFkYXB0ZXIsIHVubGVzcyBpdCBpbmZvcm1zIHVzXG4gICAgaW5mby5kYl9uYW1lID0gaW5mby5kYl9uYW1lIHx8IHNlbGYubmFtZTtcbiAgICBpbmZvLmF1dG9fY29tcGFjdGlvbiA9ICEhKHNlbGYuYXV0b19jb21wYWN0aW9uICYmICFpc1JlbW90ZShzZWxmKSk7XG4gICAgaW5mby5hZGFwdGVyID0gc2VsZi5hZGFwdGVyO1xuICAgIGNhbGxiYWNrKG51bGwsIGluZm8pO1xuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmlkID0gYWRhcHRlckZ1bignaWQnLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMuX2lkKGNhbGxiYWNrKTtcbn0pO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHR5cGVvZiB0aGlzLl90eXBlID09PSAnZnVuY3Rpb24nKSA/IHRoaXMuX3R5cGUoKSA6IHRoaXMuYWRhcHRlcjtcbn07XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuYnVsa0RvY3MgPVxuICBhZGFwdGVyRnVuKCdidWxrRG9jcycsIGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShyZXEpKSB7XG4gICAgcmVxID0ge1xuICAgICAgZG9jczogcmVxXG4gICAgfTtcbiAgfVxuXG4gIGlmICghcmVxIHx8ICFyZXEuZG9jcyB8fCAhQXJyYXkuaXNBcnJheShyZXEuZG9jcykpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19CVUxLX0RPQ1MpKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxLmRvY3MubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodHlwZW9mIHJlcS5kb2NzW2ldICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJlcS5kb2NzW2ldKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE5PVF9BTl9PQkpFQ1QpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYXR0YWNobWVudEVycm9yO1xuICByZXEuZG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAoZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhdHRhY2htZW50RXJyb3IgPSBhdHRhY2htZW50RXJyb3IgfHwgYXR0YWNobWVudE5hbWVFcnJvcihuYW1lKTtcbiAgICAgICAgaWYgKCFkb2MuX2F0dGFjaG1lbnRzW25hbWVdLmNvbnRlbnRfdHlwZSkge1xuICAgICAgICAgIGd1YXJkZWRDb25zb2xlKCd3YXJuJywgJ0F0dGFjaG1lbnQnLCBuYW1lLCAnb24gZG9jdW1lbnQnLCBkb2MuX2lkLCAnaXMgbWlzc2luZyBjb250ZW50X3R5cGUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBpZiAoYXR0YWNobWVudEVycm9yKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKEJBRF9SRVFVRVNULCBhdHRhY2htZW50RXJyb3IpKTtcbiAgfVxuXG4gIGlmICghKCduZXdfZWRpdHMnIGluIG9wdHMpKSB7XG4gICAgaWYgKCduZXdfZWRpdHMnIGluIHJlcSkge1xuICAgICAgb3B0cy5uZXdfZWRpdHMgPSByZXEubmV3X2VkaXRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRzLm5ld19lZGl0cyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFkYXB0ZXIgPSB0aGlzO1xuICBpZiAoIW9wdHMubmV3X2VkaXRzICYmICFpc1JlbW90ZShhZGFwdGVyKSkge1xuICAgIC8vIGVuc3VyZSByZXZpc2lvbnMgb2YgdGhlIHNhbWUgZG9jIGFyZSBzb3J0ZWQsIHNvIHRoYXRcbiAgICAvLyB0aGUgbG9jYWwgYWRhcHRlciBwcm9jZXNzZXMgdGhlbSBjb3JyZWN0bHkgKCMyOTM1KVxuICAgIHJlcS5kb2NzLnNvcnQoY29tcGFyZUJ5SWRUaGVuUmV2KTtcbiAgfVxuXG4gIGNsZWFuRG9jcyhyZXEuZG9jcyk7XG5cbiAgLy8gaW4gdGhlIGNhc2Ugb2YgY29uZmxpY3RzLCB3ZSB3YW50IHRvIHJldHVybiB0aGUgX2lkcyB0byB0aGUgdXNlclxuICAvLyBob3dldmVyLCB0aGUgdW5kZXJseWluZyBhZGFwdGVyIG1heSBkZXN0cm95IHRoZSBkb2NzIGFycmF5LCBzb1xuICAvLyBjcmVhdGUgYSBjb3B5IGhlcmVcbiAgdmFyIGlkcyA9IHJlcS5kb2NzLm1hcChmdW5jdGlvbiAoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5faWQ7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzLl9idWxrRG9jcyhyZXEsIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICBpZiAoIW9wdHMubmV3X2VkaXRzKSB7XG4gICAgICAvLyB0aGlzIGlzIHdoYXQgY291Y2ggZG9lcyB3aGVuIG5ld19lZGl0cyBpcyBmYWxzZVxuICAgICAgcmVzID0gcmVzLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4geC5lcnJvcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBhZGQgaWRzIGZvciBlcnJvci9jb25mbGljdCByZXNwb25zZXMgKG5vdCByZXF1aXJlZCBmb3IgQ291Y2hEQilcbiAgICBpZiAoIWlzUmVtb3RlKGFkYXB0ZXIpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcmVzW2ldLmlkID0gcmVzW2ldLmlkIHx8IGlkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCByZXMpO1xuICB9KTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLnJlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UgPVxuICBhZGFwdGVyRnVuKCdyZWdpc3RlckRlcGVuZGVudERhdGFiYXNlJywgZnVuY3Rpb24gKGRlcGVuZGVudERiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKSB7XG4gIHZhciBkYk9wdGlvbnMgPSBjbG9uZSh0aGlzLl9fb3B0cyk7XG4gIGlmICh0aGlzLl9fb3B0cy52aWV3X2FkYXB0ZXIpIHtcbiAgICBkYk9wdGlvbnMuYWRhcHRlciA9IHRoaXMuX19vcHRzLnZpZXdfYWRhcHRlcjtcbiAgfVxuXG4gIHZhciBkZXBEQiA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGRlcGVuZGVudERiLCBkYk9wdGlvbnMpO1xuXG4gIGZ1bmN0aW9uIGRpZmZGdW4oZG9jKSB7XG4gICAgZG9jLmRlcGVuZGVudERicyA9IGRvYy5kZXBlbmRlbnREYnMgfHwge307XG4gICAgaWYgKGRvYy5kZXBlbmRlbnREYnNbZGVwZW5kZW50RGJdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIG5vIHVwZGF0ZSByZXF1aXJlZFxuICAgIH1cbiAgICBkb2MuZGVwZW5kZW50RGJzW2RlcGVuZGVudERiXSA9IHRydWU7XG4gICAgcmV0dXJuIGRvYztcbiAgfVxuICB1cHNlcnQodGhpcywgJ19sb2NhbC9fcG91Y2hfZGVwZW5kZW50RGJzJywgZGlmZkZ1bilcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCB7ZGI6IGRlcERCfSk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuZGVzdHJveSA9XG4gIGFkYXB0ZXJGdW4oJ2Rlc3Ryb3knLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcblxuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdXNlUHJlZml4ID0gJ3VzZV9wcmVmaXgnIGluIHNlbGYgPyBzZWxmLnVzZV9wcmVmaXggOiB0cnVlO1xuXG4gIGZ1bmN0aW9uIGRlc3Ryb3lEYigpIHtcbiAgICAvLyBjYWxsIGRlc3Ryb3kgbWV0aG9kIG9mIHRoZSBwYXJ0aWN1bGFyIGFkYXB0b3JcbiAgICBzZWxmLl9kZXN0cm95KG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlc3ApIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICBzZWxmLl9kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgc2VsZi5lbWl0KCdkZXN0cm95ZWQnKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3AgfHwgeyAnb2snOiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzUmVtb3RlKHNlbGYpKSB7XG4gICAgLy8gbm8gbmVlZCB0byBjaGVjayBmb3IgZGVwZW5kZW50IERCcyBpZiBpdCdzIGEgcmVtb3RlIERCXG4gICAgcmV0dXJuIGRlc3Ryb3lEYigpO1xuICB9XG5cbiAgc2VsZi5nZXQoJ19sb2NhbC9fcG91Y2hfZGVwZW5kZW50RGJzJywgZnVuY3Rpb24gKGVyciwgbG9jYWxEb2MpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2UgeyAvLyBubyBkZXBlbmRlbmNpZXNcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3lEYigpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZGVwZW5kZW50RGJzID0gbG9jYWxEb2MuZGVwZW5kZW50RGJzO1xuICAgIHZhciBQb3VjaERCID0gc2VsZi5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgZGVsZXRlZE1hcCA9IE9iamVjdC5rZXlzKGRlcGVuZGVudERicykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyB1c2VfcHJlZml4IGlzIG9ubHkgZmFsc2UgaW4gdGhlIGJyb3dzZXJcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB2YXIgdHJ1ZU5hbWUgPSB1c2VQcmVmaXggP1xuICAgICAgICBuYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnXicgKyBQb3VjaERCLnByZWZpeCksICcnKSA6IG5hbWU7XG4gICAgICByZXR1cm4gbmV3IFBvdWNoREIodHJ1ZU5hbWUsIHNlbGYuX19vcHRzKS5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoZGVsZXRlZE1hcCkudGhlbihkZXN0cm95RGIsIGNhbGxiYWNrKTtcbiAgfSk7XG59KTtcblxuZnVuY3Rpb24gVGFza1F1ZXVlKCkge1xuICB0aGlzLmlzUmVhZHkgPSBmYWxzZTtcbiAgdGhpcy5mYWlsZWQgPSBmYWxzZTtcbiAgdGhpcy5xdWV1ZSA9IFtdO1xufVxuXG5UYXNrUXVldWUucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBmdW47XG4gIGlmICh0aGlzLmZhaWxlZCkge1xuICAgIHdoaWxlICgoZnVuID0gdGhpcy5xdWV1ZS5zaGlmdCgpKSkge1xuICAgICAgZnVuKHRoaXMuZmFpbGVkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKChmdW4gPSB0aGlzLnF1ZXVlLnNoaWZ0KCkpKSB7XG4gICAgICBmdW4oKTtcbiAgICB9XG4gIH1cbn07XG5cblRhc2tRdWV1ZS5wcm90b3R5cGUuZmFpbCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdGhpcy5mYWlsZWQgPSBlcnI7XG4gIHRoaXMuZXhlY3V0ZSgpO1xufTtcblxuVGFza1F1ZXVlLnByb3RvdHlwZS5yZWFkeSA9IGZ1bmN0aW9uIChkYikge1xuICB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuICB0aGlzLmRiID0gZGI7XG4gIHRoaXMuZXhlY3V0ZSgpO1xufTtcblxuVGFza1F1ZXVlLnByb3RvdHlwZS5hZGRUYXNrID0gZnVuY3Rpb24gKGZ1bikge1xuICB0aGlzLnF1ZXVlLnB1c2goZnVuKTtcbiAgaWYgKHRoaXMuZmFpbGVkKSB7XG4gICAgdGhpcy5leGVjdXRlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHBhcnNlQWRhcHRlcihuYW1lLCBvcHRzKSB7XG4gIHZhciBtYXRjaCA9IG5hbWUubWF0Y2goLyhbYS16LV0qKTpcXC9cXC8oLiopLyk7XG4gIGlmIChtYXRjaCkge1xuICAgIC8vIHRoZSBodHRwIGFkYXB0ZXIgZXhwZWN0cyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWVcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogL2h0dHBzPy8udGVzdChtYXRjaFsxXSkgPyBtYXRjaFsxXSArICc6Ly8nICsgbWF0Y2hbMl0gOiBtYXRjaFsyXSxcbiAgICAgIGFkYXB0ZXI6IG1hdGNoWzFdXG4gICAgfTtcbiAgfVxuXG4gIHZhciBhZGFwdGVycyA9IFBvdWNoREIuYWRhcHRlcnM7XG4gIHZhciBwcmVmZXJyZWRBZGFwdGVycyA9IFBvdWNoREIucHJlZmVycmVkQWRhcHRlcnM7XG4gIHZhciBwcmVmaXggPSBQb3VjaERCLnByZWZpeDtcbiAgdmFyIGFkYXB0ZXJOYW1lID0gb3B0cy5hZGFwdGVyO1xuXG4gIGlmICghYWRhcHRlck5hbWUpIHsgLy8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgYWRhcHRlclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZmVycmVkQWRhcHRlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGFkYXB0ZXJOYW1lID0gcHJlZmVycmVkQWRhcHRlcnNbaV07XG4gICAgICAvLyBjaGVjayBmb3IgYnJvd3NlcnMgdGhhdCBoYXZlIGJlZW4gdXBncmFkZWQgZnJvbSB3ZWJzcWwtb25seSB0byB3ZWJzcWwraWRiXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChhZGFwdGVyTmFtZSA9PT0gJ2lkYicgJiYgJ3dlYnNxbCcgaW4gYWRhcHRlcnMgJiZcbiAgICAgICAgICBoYXNMb2NhbFN0b3JhZ2UoKSAmJiBsb2NhbFN0b3JhZ2VbJ19wb3VjaF9fd2Vic3FsZGJfJyArIHByZWZpeCArIG5hbWVdKSB7XG4gICAgICAgIC8vIGxvZyBpdCwgYmVjYXVzZSB0aGlzIGNhbiBiZSBjb25mdXNpbmcgZHVyaW5nIGRldmVsb3BtZW50XG4gICAgICAgIGd1YXJkZWRDb25zb2xlKCdsb2cnLCAnUG91Y2hEQiBpcyBkb3duZ3JhZGluZyBcIicgKyBuYW1lICsgJ1wiIHRvIFdlYlNRTCB0bycgK1xuICAgICAgICAgICcgYXZvaWQgZGF0YSBsb3NzLCBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IG9wZW5lZCB3aXRoIFdlYlNRTC4nKTtcbiAgICAgICAgY29udGludWU7IC8vIGtlZXAgdXNpbmcgd2Vic3FsIHRvIGF2b2lkIHVzZXIgZGF0YSBsb3NzXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgYWRhcHRlciA9IGFkYXB0ZXJzW2FkYXB0ZXJOYW1lXTtcblxuICAvLyBpZiBhZGFwdGVyIGlzIGludmFsaWQsIHRoZW4gYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gbGF0ZXJcbiAgdmFyIHVzZVByZWZpeCA9IChhZGFwdGVyICYmICd1c2VfcHJlZml4JyBpbiBhZGFwdGVyKSA/XG4gICAgYWRhcHRlci51c2VfcHJlZml4IDogdHJ1ZTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IHVzZVByZWZpeCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUsXG4gICAgYWRhcHRlcjogYWRhcHRlck5hbWVcbiAgfTtcbn1cblxuLy8gT0ssIHNvIGhlcmUncyB0aGUgZGVhbC4gQ29uc2lkZXIgdGhpcyBjb2RlOlxuLy8gICAgIHZhciBkYjEgPSBuZXcgUG91Y2hEQignZm9vJyk7XG4vLyAgICAgdmFyIGRiMiA9IG5ldyBQb3VjaERCKCdmb28nKTtcbi8vICAgICBkYjEuZGVzdHJveSgpO1xuLy8gXiB0aGVzZSB0d28gYm90aCBuZWVkIHRvIGVtaXQgJ2Rlc3Ryb3llZCcgZXZlbnRzLFxuLy8gYXMgd2VsbCBhcyB0aGUgUG91Y2hEQiBjb25zdHJ1Y3RvciBpdHNlbGYuXG4vLyBTbyB3ZSBoYXZlIG9uZSBkYiBvYmplY3QgKHdoaWNoZXZlciBvbmUgZ290IGRlc3Ryb3koKSBjYWxsZWQgb24gaXQpXG4vLyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgdGhlIGluaXRpYWwgZXZlbnQsIHdoaWNoIHRoZW4gZ2V0cyBlbWl0dGVkXG4vLyBieSB0aGUgY29uc3RydWN0b3IsIHdoaWNoIHRoZW4gYnJvYWRjYXN0cyBpdCB0byBhbnkgb3RoZXIgZGJzXG4vLyB0aGF0IG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWUuXG5mdW5jdGlvbiBwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oc2VsZikge1xuXG4gIGZ1bmN0aW9uIG9uRGVzdHJveWVkKGZyb21fY29uc3RydWN0b3IpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCdjbG9zZWQnLCBvbkNsb3NlZCk7XG4gICAgaWYgKCFmcm9tX2NvbnN0cnVjdG9yKSB7XG4gICAgICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ2Rlc3Ryb3llZCcsIHNlbGYubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25DbG9zZWQoKSB7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcignZGVzdHJveWVkJywgb25EZXN0cm95ZWQpO1xuICAgIHNlbGYuY29uc3RydWN0b3IuZW1pdCgndW5yZWYnLCBzZWxmKTtcbiAgfVxuXG4gIHNlbGYub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95ZWQpO1xuICBzZWxmLm9uY2UoJ2Nsb3NlZCcsIG9uQ2xvc2VkKTtcbiAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCdyZWYnLCBzZWxmKTtcbn1cblxuaW5oZXJpdHMoUG91Y2hEQiwgQWJzdHJhY3RQb3VjaERCKTtcbmZ1bmN0aW9uIFBvdWNoREIobmFtZSwgb3B0cykge1xuICAvLyBJbiBOb2RlIG91ciB0ZXN0IHN1aXRlIG9ubHkgdGVzdHMgdGhpcyBmb3IgUG91Y2hBbHQgdW5mb3J0dW5hdGVseVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBvdWNoREIpKSB7XG4gICAgcmV0dXJuIG5ldyBQb3VjaERCKG5hbWUsIG9wdHMpO1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICBpZiAobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRzID0gbmFtZTtcbiAgICBuYW1lID0gb3B0cy5uYW1lO1xuICAgIGRlbGV0ZSBvcHRzLm5hbWU7XG4gIH1cblxuICBpZiAob3B0cy5kZXRlcm1pbmlzdGljX3JldnMgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdHMuZGV0ZXJtaW5pc3RpY19yZXZzID0gdHJ1ZTtcbiAgfVxuXG4gIHRoaXMuX19vcHRzID0gb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gIHNlbGYuYXV0b19jb21wYWN0aW9uID0gb3B0cy5hdXRvX2NvbXBhY3Rpb247XG4gIHNlbGYucHJlZml4ID0gUG91Y2hEQi5wcmVmaXg7XG5cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZy9pbnZhbGlkIERCIG5hbWUnKTtcbiAgfVxuXG4gIHZhciBwcmVmaXhlZE5hbWUgPSAob3B0cy5wcmVmaXggfHwgJycpICsgbmFtZTtcbiAgdmFyIGJhY2tlbmQgPSBwYXJzZUFkYXB0ZXIocHJlZml4ZWROYW1lLCBvcHRzKTtcblxuICBvcHRzLm5hbWUgPSBiYWNrZW5kLm5hbWU7XG4gIG9wdHMuYWRhcHRlciA9IG9wdHMuYWRhcHRlciB8fCBiYWNrZW5kLmFkYXB0ZXI7XG5cbiAgc2VsZi5uYW1lID0gbmFtZTtcbiAgc2VsZi5fYWRhcHRlciA9IG9wdHMuYWRhcHRlcjtcbiAgUG91Y2hEQi5lbWl0KCdkZWJ1ZycsIFsnYWRhcHRlcicsICdQaWNrZWQgYWRhcHRlcjogJywgb3B0cy5hZGFwdGVyXSk7XG5cbiAgaWYgKCFQb3VjaERCLmFkYXB0ZXJzW29wdHMuYWRhcHRlcl0gfHxcbiAgICAgICFQb3VjaERCLmFkYXB0ZXJzW29wdHMuYWRhcHRlcl0udmFsaWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBZGFwdGVyOiAnICsgb3B0cy5hZGFwdGVyKTtcbiAgfVxuXG4gIGlmIChvcHRzLnZpZXdfYWRhcHRlcikge1xuICAgIGlmICghUG91Y2hEQi5hZGFwdGVyc1tvcHRzLnZpZXdfYWRhcHRlcl0gfHxcbiAgICAgICAgIVBvdWNoREIuYWRhcHRlcnNbb3B0cy52aWV3X2FkYXB0ZXJdLnZhbGlkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBWaWV3IEFkYXB0ZXI6ICcgKyBvcHRzLnZpZXdfYWRhcHRlcik7XG4gICAgfVxuICB9XG5cbiAgQWJzdHJhY3RQb3VjaERCLmNhbGwoc2VsZik7XG4gIHNlbGYudGFza3F1ZXVlID0gbmV3IFRhc2tRdWV1ZSgpO1xuXG4gIHNlbGYuYWRhcHRlciA9IG9wdHMuYWRhcHRlcjtcblxuICBQb3VjaERCLmFkYXB0ZXJzW29wdHMuYWRhcHRlcl0uY2FsbChzZWxmLCBvcHRzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIHNlbGYudGFza3F1ZXVlLmZhaWwoZXJyKTtcbiAgICB9XG4gICAgcHJlcGFyZUZvckRlc3RydWN0aW9uKHNlbGYpO1xuXG4gICAgc2VsZi5lbWl0KCdjcmVhdGVkJywgc2VsZik7XG4gICAgUG91Y2hEQi5lbWl0KCdjcmVhdGVkJywgc2VsZi5uYW1lKTtcbiAgICBzZWxmLnRhc2txdWV1ZS5yZWFkeShzZWxmKTtcbiAgfSk7XG5cbn1cblxuLy8gQWJvcnRDb250cm9sbGVyIHdhcyBpbnRyb2R1Y2VkIHF1aXRlIGEgd2hpbGUgYWZ0ZXIgZmV0Y2ggYW5kXG4vLyBpc250IHJlcXVpcmVkIGZvciBQb3VjaERCIHRvIGZ1bmN0aW9uIHNvIHBvbHlmaWxsIGlmIG5lZWRlZFxudmFyIGEgPSAodHlwZW9mIEFib3J0Q29udHJvbGxlciAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgPyBBYm9ydENvbnRyb2xsZXJcbiAgICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHthYm9ydDogZnVuY3Rpb24gKCkge319OyB9O1xuXG52YXIgZiQxID0gZmV0Y2g7XG52YXIgaCA9IEhlYWRlcnM7XG5cblBvdWNoREIuYWRhcHRlcnMgPSB7fTtcblBvdWNoREIucHJlZmVycmVkQWRhcHRlcnMgPSBbXTtcblxuUG91Y2hEQi5wcmVmaXggPSAnX3BvdWNoXyc7XG5cbnZhciBldmVudEVtaXR0ZXIgPSBuZXcgRUUoKTtcblxuZnVuY3Rpb24gc2V0VXBFdmVudEVtaXR0ZXIoUG91Y2gpIHtcbiAgT2JqZWN0LmtleXMoRUUucHJvdG90eXBlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAodHlwZW9mIEVFLnByb3RvdHlwZVtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBQb3VjaFtrZXldID0gZXZlbnRFbWl0dGVyW2tleV0uYmluZChldmVudEVtaXR0ZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gdGhlc2UgYXJlIGNyZWF0ZWQgaW4gY29uc3RydWN0b3IuanMsIGFuZCBhbGxvdyB1cyB0byBub3RpZnkgZWFjaCBEQiB3aXRoXG4gIC8vIHRoZSBzYW1lIG5hbWUgdGhhdCBpdCB3YXMgZGVzdHJveWVkLCB2aWEgdGhlIGNvbnN0cnVjdG9yIG9iamVjdFxuICB2YXIgZGVzdHJ1Y3RMaXN0ZW5lcnMgPSBQb3VjaC5fZGVzdHJ1Y3Rpb25MaXN0ZW5lcnMgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuICBQb3VjaC5vbigncmVmJywgZnVuY3Rpb24gb25Db25zdHJ1Y3RvclJlZihkYikge1xuICAgIGlmICghZGVzdHJ1Y3RMaXN0ZW5lcnMuaGFzKGRiLm5hbWUpKSB7XG4gICAgICBkZXN0cnVjdExpc3RlbmVycy5zZXQoZGIubmFtZSwgW10pO1xuICAgIH1cbiAgICBkZXN0cnVjdExpc3RlbmVycy5nZXQoZGIubmFtZSkucHVzaChkYik7XG4gIH0pO1xuXG4gIFBvdWNoLm9uKCd1bnJlZicsIGZ1bmN0aW9uIG9uQ29uc3RydWN0b3JVbnJlZihkYikge1xuICAgIGlmICghZGVzdHJ1Y3RMaXN0ZW5lcnMuaGFzKGRiLm5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBkYkxpc3QgPSBkZXN0cnVjdExpc3RlbmVycy5nZXQoZGIubmFtZSk7XG4gICAgdmFyIHBvcyA9IGRiTGlzdC5pbmRleE9mKGRiKTtcbiAgICBpZiAocG9zIDwgMCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGJMaXN0LnNwbGljZShwb3MsIDEpO1xuICAgIGlmIChkYkxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGRlc3RydWN0TGlzdGVuZXJzLnNldChkYi5uYW1lLCBkYkxpc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0cnVjdExpc3RlbmVycy5kZWxldGUoZGIubmFtZSk7XG4gICAgfVxuICB9KTtcblxuICBQb3VjaC5vbignZGVzdHJveWVkJywgZnVuY3Rpb24gb25Db25zdHJ1Y3RvckRlc3Ryb3llZChuYW1lKSB7XG4gICAgaWYgKCFkZXN0cnVjdExpc3RlbmVycy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRiTGlzdCA9IGRlc3RydWN0TGlzdGVuZXJzLmdldChuYW1lKTtcbiAgICBkZXN0cnVjdExpc3RlbmVycy5kZWxldGUobmFtZSk7XG4gICAgZGJMaXN0LmZvckVhY2goZnVuY3Rpb24gKGRiKSB7XG4gICAgICBkYi5lbWl0KCdkZXN0cm95ZWQnLHRydWUpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuc2V0VXBFdmVudEVtaXR0ZXIoUG91Y2hEQik7XG5cblBvdWNoREIuYWRhcHRlciA9IGZ1bmN0aW9uIChpZCwgb2JqLCBhZGRUb1ByZWZlcnJlZEFkYXB0ZXJzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChvYmoudmFsaWQoKSkge1xuICAgIFBvdWNoREIuYWRhcHRlcnNbaWRdID0gb2JqO1xuICAgIGlmIChhZGRUb1ByZWZlcnJlZEFkYXB0ZXJzKSB7XG4gICAgICBQb3VjaERCLnByZWZlcnJlZEFkYXB0ZXJzLnB1c2goaWQpO1xuICAgIH1cbiAgfVxufTtcblxuUG91Y2hEQi5wbHVnaW4gPSBmdW5jdGlvbiAob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7IC8vIGZ1bmN0aW9uIHN0eWxlIGZvciBwbHVnaW5zXG4gICAgb2JqKFBvdWNoREIpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBsdWdpbjogZ290IFwiJyArIG9iaiArICdcIiwgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24nKTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IC8vIG9iamVjdCBzdHlsZSBmb3IgcGx1Z2luc1xuICAgICAgUG91Y2hEQi5wcm90b3R5cGVbaWRdID0gb2JqW2lkXTtcbiAgICB9KTtcbiAgfVxuICBpZiAodGhpcy5fX2RlZmF1bHRzKSB7XG4gICAgUG91Y2hEQi5fX2RlZmF1bHRzID0gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCB0aGlzLl9fZGVmYXVsdHMpO1xuICB9XG4gIHJldHVybiBQb3VjaERCO1xufTtcblxuUG91Y2hEQi5kZWZhdWx0cyA9IGZ1bmN0aW9uIChkZWZhdWx0T3B0cykge1xuICBmdW5jdGlvbiBQb3VjaEFsdChuYW1lLCBvcHRzKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBvdWNoQWx0KSkge1xuICAgICAgcmV0dXJuIG5ldyBQb3VjaEFsdChuYW1lLCBvcHRzKTtcbiAgICB9XG5cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIGlmIChuYW1lICYmIHR5cGVvZiBuYW1lID09PSAnb2JqZWN0Jykge1xuICAgICAgb3B0cyA9IG5hbWU7XG4gICAgICBuYW1lID0gb3B0cy5uYW1lO1xuICAgICAgZGVsZXRlIG9wdHMubmFtZTtcbiAgICB9XG5cbiAgICBvcHRzID0gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCBQb3VjaEFsdC5fX2RlZmF1bHRzLCBvcHRzKTtcbiAgICBQb3VjaERCLmNhbGwodGhpcywgbmFtZSwgb3B0cyk7XG4gIH1cblxuICBpbmhlcml0cyhQb3VjaEFsdCwgUG91Y2hEQik7XG5cbiAgUG91Y2hBbHQucHJlZmVycmVkQWRhcHRlcnMgPSBQb3VjaERCLnByZWZlcnJlZEFkYXB0ZXJzLnNsaWNlKCk7XG4gIE9iamVjdC5rZXlzKFBvdWNoREIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghKGtleSBpbiBQb3VjaEFsdCkpIHtcbiAgICAgIFBvdWNoQWx0W2tleV0gPSBQb3VjaERCW2tleV07XG4gICAgfVxuICB9KTtcblxuICAvLyBtYWtlIGRlZmF1bHQgb3B0aW9ucyB0cmFuc2l0aXZlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3VjaGRiL3BvdWNoZGIvaXNzdWVzLzU5MjJcbiAgUG91Y2hBbHQuX19kZWZhdWx0cyA9ICRpbmplY3RfT2JqZWN0X2Fzc2lnbih7fSwgdGhpcy5fX2RlZmF1bHRzLCBkZWZhdWx0T3B0cyk7XG5cbiAgcmV0dXJuIFBvdWNoQWx0O1xufTtcblxuUG91Y2hEQi5mZXRjaCA9IGZ1bmN0aW9uICh1cmwsIG9wdHMpIHtcbiAgcmV0dXJuIGYkMSh1cmwsIG9wdHMpO1xufTtcblxuLy8gbWFuYWdlZCBhdXRvbWF0aWNhbGx5IGJ5IHNldC12ZXJzaW9uLmpzXG52YXIgdmVyc2lvbiA9IFwiNy4zLjBcIjtcblxuLy8gdGhpcyB3b3VsZCBqdXN0IGJlIFwicmV0dXJuIGRvY1tmaWVsZF1cIiwgYnV0IGZpZWxkc1xuLy8gY2FuIGJlIFwiZGVlcFwiIGR1ZSB0byBkb3Qgbm90YXRpb25cbmZ1bmN0aW9uIGdldEZpZWxkRnJvbURvYyhkb2MsIHBhcnNlZEZpZWxkKSB7XG4gIHZhciB2YWx1ZSA9IGRvYztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZEZpZWxkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGtleSA9IHBhcnNlZEZpZWxkW2ldO1xuICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlJDEobGVmdCwgcmlnaHQpIHtcbiAgcmV0dXJuIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDA7XG59XG5cbi8vIENvbnZlcnRzIGEgc3RyaW5nIGluIGRvdCBub3RhdGlvbiB0byBhbiBhcnJheSBvZiBpdHMgY29tcG9uZW50cywgd2l0aCBiYWNrc2xhc2ggZXNjYXBpbmdcbmZ1bmN0aW9uIHBhcnNlRmllbGQoZmllbGROYW1lKSB7XG4gIC8vIGZpZWxkcyBtYXkgYmUgZGVlcCAoZS5nLiBcImZvby5iYXIuYmF6XCIpLCBzbyBwYXJzZVxuICB2YXIgZmllbGRzID0gW107XG4gIHZhciBjdXJyZW50ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBmaWVsZE5hbWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgY2ggPSBmaWVsZE5hbWVbaV07XG4gICAgaWYgKGkgPiAwICYmIGZpZWxkTmFtZVtpIC0gMV0gPT09ICdcXFxcJyAmJiAoY2ggPT09ICckJyB8fCBjaCA9PT0gJy4nKSkge1xuICAgICAgLy8gZXNjYXBlZCBkZWxpbWl0ZXJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnN1YnN0cmluZygwLCBjdXJyZW50Lmxlbmd0aCAtIDEpICsgY2g7XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJy4nKSB7XG4gICAgICAvLyBXaGVuIGAuYCBpcyBub3QgZXNjYXBlZCAoYWJvdmUpLCBpdCBpcyBhIGZpZWxkIGRlbGltaXRlclxuICAgICAgZmllbGRzLnB1c2goY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gJyc7XG4gICAgfSBlbHNlIHsgLy8gbm9ybWFsIGNoYXJhY3RlclxuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9XG4gIH1cbiAgZmllbGRzLnB1c2goY3VycmVudCk7XG4gIHJldHVybiBmaWVsZHM7XG59XG5cbnZhciBjb21iaW5hdGlvbkZpZWxkcyA9IFsnJG9yJywgJyRub3InLCAnJG5vdCddO1xuZnVuY3Rpb24gaXNDb21iaW5hdGlvbmFsRmllbGQoZmllbGQpIHtcbiAgcmV0dXJuIGNvbWJpbmF0aW9uRmllbGRzLmluZGV4T2YoZmllbGQpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGdldEtleShvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailbMF07XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKG9iaikge1xuICByZXR1cm4gb2JqW2dldEtleShvYmopXTtcbn1cblxuXG4vLyBmbGF0dGVuIGFuIGFycmF5IG9mIHNlbGVjdG9ycyBqb2luZWQgYnkgYW4gJGFuZCBvcGVyYXRvclxuZnVuY3Rpb24gbWVyZ2VBbmRlZFNlbGVjdG9ycyhzZWxlY3RvcnMpIHtcblxuICAvLyBzb3J0IHRvIGVuc3VyZSB0aGF0IGUuZy4gaWYgdGhlIHVzZXIgc3BlY2lmaWVkXG4gIC8vICRhbmQ6IFt7JGd0OiAnYSd9LCB7JGd0OiAnYid9XSwgdGhlbiBpdCdzIGNvbGxhcHNlZCBpbnRvXG4gIC8vIGp1c3QgeyRndDogJ2InfVxuICB2YXIgcmVzID0ge307XG4gIHZhciBmaXJzdCA9IHskb3I6IHRydWUsICRub3I6IHRydWV9O1xuXG4gIHNlbGVjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIE9iamVjdC5rZXlzKHNlbGVjdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIG1hdGNoZXIgPSBzZWxlY3RvcltmaWVsZF07XG4gICAgICBpZiAodHlwZW9mIG1hdGNoZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1hdGNoZXIgPSB7JGVxOiBtYXRjaGVyfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29tYmluYXRpb25hbEZpZWxkKGZpZWxkKSkge1xuICAgICAgICAvLyBvciwgbm9yXG4gICAgICAgIGlmIChtYXRjaGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBpZiAoZmlyc3RbZmllbGRdKSB7XG4gICAgICAgICAgICBmaXJzdFtmaWVsZF0gPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc1tmaWVsZF0gPSBtYXRjaGVyO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICAgICAgcmVzW2ZpZWxkXS5mb3JFYWNoKGZ1bmN0aW9uIChleGlzdGluZykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobWF0Y2hlcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgIHZhciBtID0gbWF0Y2hlcltrZXldO1xuICAgICAgICAgICAgICB2YXIgbG9uZ2VzdCA9IE1hdGgubWF4KE9iamVjdC5rZXlzKGV4aXN0aW5nKS5sZW5ndGgsIE9iamVjdC5rZXlzKG0pLmxlbmd0aCk7XG4gICAgICAgICAgICAgIHZhciBtZXJnZWQgPSBtZXJnZUFuZGVkU2VsZWN0b3JzKFtleGlzdGluZywgbV0pO1xuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobWVyZ2VkKS5sZW5ndGggPD0gbG9uZ2VzdCkge1xuICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBzaXR1YXRpb24gbGlrZTogKGEgOnskZXEgOjF9IHx8IC4uLikgJiYgKGEgeyRlcTogMn0gfHwgLi4uKVxuICAgICAgICAgICAgICAgIC8vIG1lcmdpbmcgd291bGQgcHJvZHVjZSBhICRlcSAyIHdoZW4gYWN0dWFsbHkgd2Ugc2hvdWxkbid0IGV2ZXIgbWF0Y2ggYWdhaW5zdCB0aGVzZSBtZXJnZWQgY29uZGl0aW9uc1xuICAgICAgICAgICAgICAgIC8vIG1lcmdlZCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gbW9yZSB2YWx1ZXMgdG8gYmUgdmFsaWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKG1lcmdlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXNbZmllbGRdID0gZW50cmllcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBub3RcbiAgICAgICAgICByZXNbZmllbGRdID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhbbWF0Y2hlcl0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmllbGRNYXRjaGVycyA9IHJlc1tmaWVsZF0gPSByZXNbZmllbGRdIHx8IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChvcGVyYXRvcikge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG1hdGNoZXJbb3BlcmF0b3JdO1xuXG4gICAgICAgICAgaWYgKG9wZXJhdG9yID09PSAnJGd0JyB8fCBvcGVyYXRvciA9PT0gJyRndGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VHdEd0ZShvcGVyYXRvciwgdmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09ICckbHQnIHx8IG9wZXJhdG9yID09PSAnJGx0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUx0THRlKG9wZXJhdG9yLCB2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gJyRuZScpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZU5lKHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSAnJGVxJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlRXEodmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IFwiJHJlZ2V4XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZVJlZ2V4KHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRNYXRjaGVyc1tvcGVyYXRvcl0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59XG5cblxuXG4vLyBjb2xsYXBzZSBsb2dpY2FsbHkgZXF1aXZhbGVudCBndC9ndGUgdmFsdWVzXG5mdW5jdGlvbiBtZXJnZUd0R3RlKG9wZXJhdG9yLCB2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICBpZiAodHlwZW9mIGZpZWxkTWF0Y2hlcnMuJGVxICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjsgLy8gZG8gbm90aGluZ1xuICB9XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZ3RlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvcGVyYXRvciA9PT0gJyRndGUnKSB7XG4gICAgICBpZiAodmFsdWUgPiBmaWVsZE1hdGNoZXJzLiRndGUpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRndGUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBvcGVyYXRvciA9PT0gJyRndCdcbiAgICAgIGlmICh2YWx1ZSA+PSBmaWVsZE1hdGNoZXJzLiRndGUpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3RlO1xuICAgICAgICBmaWVsZE1hdGNoZXJzLiRndCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kZ3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGd0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA+IGZpZWxkTWF0Y2hlcnMuJGd0KSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGd0O1xuICAgICAgICBmaWVsZE1hdGNoZXJzLiRndGUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBvcGVyYXRvciA9PT0gJyRndCdcbiAgICAgIGlmICh2YWx1ZSA+IGZpZWxkTWF0Y2hlcnMuJGd0KSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZmllbGRNYXRjaGVycy4kZ3QgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmllbGRNYXRjaGVyc1tvcGVyYXRvcl0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vLyBjb2xsYXBzZSBsb2dpY2FsbHkgZXF1aXZhbGVudCBsdC9sdGUgdmFsdWVzXG5mdW5jdGlvbiBtZXJnZUx0THRlKG9wZXJhdG9yLCB2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICBpZiAodHlwZW9mIGZpZWxkTWF0Y2hlcnMuJGVxICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjsgLy8gZG8gbm90aGluZ1xuICB9XG4gIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kbHRlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvcGVyYXRvciA9PT0gJyRsdGUnKSB7XG4gICAgICBpZiAodmFsdWUgPCBmaWVsZE1hdGNoZXJzLiRsdGUpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBmaWVsZE1hdGNoZXJzLiRsdGUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBvcGVyYXRvciA9PT0gJyRndCdcbiAgICAgIGlmICh2YWx1ZSA8PSBmaWVsZE1hdGNoZXJzLiRsdGUpIHsgLy8gbW9yZSBzcGVjaWZpY2l0eVxuICAgICAgICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHRlO1xuICAgICAgICBmaWVsZE1hdGNoZXJzLiRsdCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRNYXRjaGVycy4kbHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSAnJGx0ZScpIHtcbiAgICAgIGlmICh2YWx1ZSA8IGZpZWxkTWF0Y2hlcnMuJGx0KSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGx0O1xuICAgICAgICBmaWVsZE1hdGNoZXJzLiRsdGUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBvcGVyYXRvciA9PT0gJyRndCdcbiAgICAgIGlmICh2YWx1ZSA8IGZpZWxkTWF0Y2hlcnMuJGx0KSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZmllbGRNYXRjaGVycy4kbHQgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmllbGRNYXRjaGVyc1tvcGVyYXRvcl0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vLyBjb21iaW5lICRuZSB2YWx1ZXMgaW50byBvbmUgYXJyYXlcbmZ1bmN0aW9uIG1lcmdlTmUodmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgaWYgKCckbmUnIGluIGZpZWxkTWF0Y2hlcnMpIHtcbiAgICAvLyB0aGVyZSBhcmUgbWFueSB0aGluZ3MgdGhpcyBjb3VsZCBcIm5vdFwiIGJlXG4gICAgZmllbGRNYXRjaGVycy4kbmUucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSB7IC8vIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgZmllbGRNYXRjaGVycy4kbmUgPSBbdmFsdWVdO1xuICB9XG59XG5cbi8vIGFkZCAkZXEgaW50byB0aGUgbWl4XG5mdW5jdGlvbiBtZXJnZUVxKHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIC8vIHRoZXNlIGFsbCBoYXZlIGxlc3Mgc3BlY2lmaWNpdHkgdGhhbiB0aGUgJGVxXG4gIC8vIFRPRE86IGNoZWNrIGZvciB1c2VyIGVycm9ycyBoZXJlXG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRndDtcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGd0ZTtcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGx0O1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kbHRlO1xuICBkZWxldGUgZmllbGRNYXRjaGVycy4kbmU7XG4gIGZpZWxkTWF0Y2hlcnMuJGVxID0gdmFsdWU7XG59XG5cbi8vIGNvbWJpbmUgJHJlZ2V4IHZhbHVlcyBpbnRvIG9uZSBhcnJheVxuZnVuY3Rpb24gbWVyZ2VSZWdleCh2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICBpZiAoJyRyZWdleCcgaW4gZmllbGRNYXRjaGVycykge1xuICAgIC8vIGEgdmFsdWUgY291bGQgbWF0Y2ggbXVsdGlwbGUgcmVnZXhlc1xuICAgIGZpZWxkTWF0Y2hlcnMuJHJlZ2V4LnB1c2godmFsdWUpO1xuICB9IGVsc2UgeyAvLyBkb2Vzbid0IGV4aXN0IHlldFxuICAgIGZpZWxkTWF0Y2hlcnMuJHJlZ2V4ID0gW3ZhbHVlXTtcbiAgfVxufVxuXG4vLyM3NDU4OiBleGVjdXRlIGZ1bmN0aW9uIG1lcmdlQW5kZWRTZWxlY3RvcnMgb24gbmVzdGVkICRhbmRcbmZ1bmN0aW9uIG1lcmdlQW5kZWRTZWxlY3RvcnNOZXN0ZWQob2JqKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqW2ldWyckYW5kJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW2ldID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhvYmpbaV1bJyRhbmQnXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIG1lcmdlQW5kZWRTZWxlY3RvcnNOZXN0ZWQodmFsdWUpOyAvLyA8LSByZWN1cnNpdmUgY2FsbFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5cbi8vIzc0NTg6IGRldGVybWluZSBpZCAkYW5kIGlzIHByZXNlbnQgaW4gc2VsZWN0b3IgKGF0IGFueSBsZXZlbClcbmZ1bmN0aW9uIGlzQW5kSW5TZWxlY3RvcihvYmosIGlzQW5kKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKHByb3AgPT09ICckYW5kJykge1xuICAgICAgICAgICAgaXNBbmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlzQW5kID0gaXNBbmRJblNlbGVjdG9yKHZhbHVlLCBpc0FuZCk7IC8vIDwtIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzQW5kO1xufVxuXG4vL1xuLy8gbm9ybWFsaXplIHRoZSBzZWxlY3RvclxuLy9cbmZ1bmN0aW9uIG1hc3NhZ2VTZWxlY3RvcihpbnB1dCkge1xuICB2YXIgcmVzdWx0ID0gY2xvbmUoaW5wdXQpO1xuICB2YXIgd2FzQW5kZWQgPSBmYWxzZTtcbiAgICAvLyM3NDU4OiBpZiAkYW5kIGlzIHByZXNlbnQgaW4gc2VsZWN0b3IgKGF0IGFueSBsZXZlbCkgbWVyZ2UgbmVzdGVkICRhbmRcbiAgICBpZiAoaXNBbmRJblNlbGVjdG9yKHJlc3VsdCwgZmFsc2UpKSB7XG4gICAgICAgIHJlc3VsdCA9IG1lcmdlQW5kZWRTZWxlY3RvcnNOZXN0ZWQocmVzdWx0KTtcbiAgICAgICAgaWYgKCckYW5kJyBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG1lcmdlQW5kZWRTZWxlY3RvcnMocmVzdWx0WyckYW5kJ10pO1xuICAgICAgICB9XG4gICAgICAgIHdhc0FuZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgWyckb3InLCAnJG5vciddLmZvckVhY2goZnVuY3Rpb24gKG9yT3JOb3IpIHtcbiAgICBpZiAob3JPck5vciBpbiByZXN1bHQpIHtcbiAgICAgIC8vIG1lc3NhZ2UgZWFjaCBpbmRpdmlkdWFsIHNlbGVjdG9yXG4gICAgICAvLyBlLmcuIHtmb286ICdiYXInfSBiZWNvbWVzIHtmb286IHskZXE6ICdiYXInfX1cbiAgICAgIHJlc3VsdFtvck9yTm9yXS5mb3JFYWNoKGZ1bmN0aW9uIChzdWJTZWxlY3Rvcikge1xuICAgICAgICB2YXIgZmllbGRzID0gT2JqZWN0LmtleXMoc3ViU2VsZWN0b3IpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICB2YXIgbWF0Y2hlciA9IHN1YlNlbGVjdG9yW2ZpZWxkXTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1hdGNoZXIgIT09ICdvYmplY3QnIHx8IG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN1YlNlbGVjdG9yW2ZpZWxkXSA9IHskZXE6IG1hdGNoZXJ9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBpZiAoJyRub3QnIGluIHJlc3VsdCkge1xuICAgIC8vVGhpcyBmZWVscyBhIGxpdHRsZSBsaWtlIGZvcmNpbmcsIGJ1dCBpdCB3aWxsIHdvcmsgZm9yIG5vdyxcbiAgICAvL0kgd291bGQgbGlrZSB0byBjb21lIGJhY2sgdG8gdGhpcyBhbmQgbWFrZSB0aGUgbWVyZ2luZyBvZiBzZWxlY3RvcnMgYSBsaXR0bGUgbW9yZSBnZW5lcmljXG4gICAgcmVzdWx0Wyckbm90J10gPSBtZXJnZUFuZGVkU2VsZWN0b3JzKFtyZXN1bHRbJyRub3QnXV0pO1xuICB9XG5cbiAgdmFyIGZpZWxkcyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgdmFyIG1hdGNoZXIgPSByZXN1bHRbZmllbGRdO1xuXG4gICAgaWYgKHR5cGVvZiBtYXRjaGVyICE9PSAnb2JqZWN0JyB8fCBtYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBtYXRjaGVyID0geyRlcTogbWF0Y2hlcn07XG4gICAgfSBlbHNlIGlmICghd2FzQW5kZWQpIHtcbiAgICAgIC8vIFRoZXNlIHZhbHVlcyBtdXN0IGJlIHBsYWNlZCBpbiBhbiBhcnJheSBiZWNhdXNlIHRoZXNlIG9wZXJhdG9ycyBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBmaWVsZFxuICAgICAgLy8gd2hlbiAkYW5kIGlzIHVzZWQsIG1lcmdlQW5kZWRTZWxlY3RvcnMgdGFrZXMgY2FyZSBvZiBwdXR0aW5nIHRoZW0gaW50byBhcnJheXMsIG90aGVyd2lzZSBpdCdzIGRvbmUgaGVyZTpcbiAgICAgIGlmICgnJG5lJyBpbiBtYXRjaGVyKSB7XG4gICAgICAgIG1hdGNoZXIuJG5lID0gW21hdGNoZXIuJG5lXTtcbiAgICAgIH1cbiAgICAgIGlmICgnJHJlZ2V4JyBpbiBtYXRjaGVyKSB7XG4gICAgICAgIG1hdGNoZXIuJHJlZ2V4ID0gW21hdGNoZXIuJHJlZ2V4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0W2ZpZWxkXSA9IG1hdGNoZXI7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwYWQoc3RyLCBwYWRXaXRoLCB1cFRvTGVuZ3RoKSB7XG4gIHZhciBwYWRkaW5nID0gJyc7XG4gIHZhciB0YXJnZXRMZW5ndGggPSB1cFRvTGVuZ3RoIC0gc3RyLmxlbmd0aDtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgd2hpbGUgKHBhZGRpbmcubGVuZ3RoIDwgdGFyZ2V0TGVuZ3RoKSB7XG4gICAgcGFkZGluZyArPSBwYWRXaXRoO1xuICB9XG4gIHJldHVybiBwYWRkaW5nO1xufVxuXG5mdW5jdGlvbiBwYWRMZWZ0KHN0ciwgcGFkV2l0aCwgdXBUb0xlbmd0aCkge1xuICB2YXIgcGFkZGluZyA9IHBhZChzdHIsIHBhZFdpdGgsIHVwVG9MZW5ndGgpO1xuICByZXR1cm4gcGFkZGluZyArIHN0cjtcbn1cblxudmFyIE1JTl9NQUdOSVRVREUgPSAtMzI0OyAvLyB2ZXJpZmllZCBieSAtTnVtYmVyLk1JTl9WQUxVRVxudmFyIE1BR05JVFVERV9ESUdJVFMgPSAzOyAvLyBkaXR0b1xudmFyIFNFUCA9ICcnOyAvLyBzZXQgdG8gJ18nIGZvciBlYXNpZXIgZGVidWdnaW5nXG5cbmZ1bmN0aW9uIGNvbGxhdGUoYSwgYikge1xuXG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBhID0gbm9ybWFsaXplS2V5KGEpO1xuICBiID0gbm9ybWFsaXplS2V5KGIpO1xuXG4gIHZhciBhaSA9IGNvbGxhdGlvbkluZGV4KGEpO1xuICB2YXIgYmkgPSBjb2xsYXRpb25JbmRleChiKTtcbiAgaWYgKChhaSAtIGJpKSAhPT0gMCkge1xuICAgIHJldHVybiBhaSAtIGJpO1xuICB9XG4gIHN3aXRjaCAodHlwZW9mIGEpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5nQ29sbGF0ZShhLCBiKTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShhKSA/IGFycmF5Q29sbGF0ZShhLCBiKSA6IG9iamVjdENvbGxhdGUoYSwgYik7XG59XG5cbi8vIGNvdWNoIGNvbnNpZGVycyBudWxsL05hTi9JbmZpbml0eS8tSW5maW5pdHkgPT09IHVuZGVmaW5lZCxcbi8vIGZvciB0aGUgcHVycG9zZXMgb2YgbWFwcmVkdWNlIGluZGV4ZXMuIGFsc28sIGRhdGVzIGdldCBzdHJpbmdpZmllZC5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleShrZXkpIHtcbiAgc3dpdGNoICh0eXBlb2Yga2V5KSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBpZiAoa2V5ID09PSBJbmZpbml0eSB8fCBrZXkgPT09IC1JbmZpbml0eSB8fCBpc05hTihrZXkpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleTtcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgdmFyIG9yaWdLZXkgPSBrZXk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgIHZhciBsZW4gPSBrZXkubGVuZ3RoO1xuICAgICAgICBrZXkgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGtleVtpXSA9IG5vcm1hbGl6ZUtleShvcmlnS2V5W2ldKTtcbiAgICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIH0gZWxzZSBpZiAoa2V5IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4ga2V5LnRvSlNPTigpO1xuICAgICAgfSBlbHNlIGlmIChrZXkgIT09IG51bGwpIHsgLy8gZ2VuZXJpYyBvYmplY3RcbiAgICAgICAga2V5ID0ge307XG4gICAgICAgIGZvciAodmFyIGsgaW4gb3JpZ0tleSkge1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3JpZ0tleSwgaykpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvcmlnS2V5W2tdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGtleVtrXSA9IG5vcm1hbGl6ZUtleSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICB9XG4gIHJldHVybiBrZXk7XG59XG5cbmZ1bmN0aW9uIGluZGV4aWZ5KGtleSkge1xuICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgc3dpdGNoICh0eXBlb2Yga2V5KSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIGtleSA/IDEgOiAwO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuIG51bVRvSW5kZXhhYmxlU3RyaW5nKGtleSk7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAvLyBXZSd2ZSB0byBiZSBzdXJlIHRoYXQga2V5IGRvZXMgbm90IGNvbnRhaW4gXFx1MDAwMFxuICAgICAgICAvLyBEbyBvcmRlci1wcmVzZXJ2aW5nIHJlcGxhY2VtZW50czpcbiAgICAgICAgLy8gMCAtPiAxLCAxXG4gICAgICAgIC8vIDEgLT4gMSwgMlxuICAgICAgICAvLyAyIC0+IDIsIDJcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29udHJvbC1yZWdleCAqL1xuICAgICAgICByZXR1cm4ga2V5XG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDIvZywgJ1xcdTAwMDJcXHUwMDAyJylcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMS9nLCAnXFx1MDAwMVxcdTAwMDInKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAwL2csICdcXHUwMDAxXFx1MDAwMScpO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShrZXkpO1xuICAgICAgICB2YXIgYXJyID0gaXNBcnJheSA/IGtleSA6IE9iamVjdC5rZXlzKGtleSk7XG4gICAgICAgIHZhciBpID0gLTE7XG4gICAgICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvSW5kZXhhYmxlU3RyaW5nKGFycltpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgICAgIHZhciBvYmpLZXkgPSBhcnJbaV07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9JbmRleGFibGVTdHJpbmcob2JqS2V5KSArXG4gICAgICAgICAgICAgICAgdG9JbmRleGFibGVTdHJpbmcoa2V5W29iaktleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8vIGNvbnZlcnQgdGhlIGdpdmVuIGtleSB0byBhIHN0cmluZyB0aGF0IHdvdWxkIGJlIGFwcHJvcHJpYXRlXG4vLyBmb3IgbGV4aWNhbCBzb3J0aW5nLCBlLmcuIHdpdGhpbiBhIGRhdGFiYXNlLCB3aGVyZSB0aGVcbi8vIHNvcnRpbmcgaXMgdGhlIHNhbWUgZ2l2ZW4gYnkgdGhlIGNvbGxhdGUoKSBmdW5jdGlvbi5cbmZ1bmN0aW9uIHRvSW5kZXhhYmxlU3RyaW5nKGtleSkge1xuICB2YXIgemVybyA9ICdcXHUwMDAwJztcbiAga2V5ID0gbm9ybWFsaXplS2V5KGtleSk7XG4gIHJldHVybiBjb2xsYXRpb25JbmRleChrZXkpICsgU0VQICsgaW5kZXhpZnkoa2V5KSArIHplcm87XG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKHN0ciwgaSkge1xuICB2YXIgb3JpZ2luYWxJZHggPSBpO1xuICB2YXIgbnVtO1xuICB2YXIgemVybyA9IHN0cltpXSA9PT0gJzEnO1xuICBpZiAoemVybykge1xuICAgIG51bSA9IDA7XG4gICAgaSsrO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZWcgPSBzdHJbaV0gPT09ICcwJztcbiAgICBpKys7XG4gICAgdmFyIG51bUFzU3RyaW5nID0gJyc7XG4gICAgdmFyIG1hZ0FzU3RyaW5nID0gc3RyLnN1YnN0cmluZyhpLCBpICsgTUFHTklUVURFX0RJR0lUUyk7XG4gICAgdmFyIG1hZ25pdHVkZSA9IHBhcnNlSW50KG1hZ0FzU3RyaW5nLCAxMCkgKyBNSU5fTUFHTklUVURFO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKG5lZykge1xuICAgICAgbWFnbml0dWRlID0gLW1hZ25pdHVkZTtcbiAgICB9XG4gICAgaSArPSBNQUdOSVRVREVfRElHSVRTO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgY2ggPSBzdHJbaV07XG4gICAgICBpZiAoY2ggPT09ICdcXHUwMDAwJykge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bUFzU3RyaW5nICs9IGNoO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICBudW1Bc1N0cmluZyA9IG51bUFzU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgaWYgKG51bUFzU3RyaW5nLmxlbmd0aCA9PT0gMSkge1xuICAgICAgbnVtID0gcGFyc2VJbnQobnVtQXNTdHJpbmcsIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtQXNTdHJpbmdbMF0gKyAnLicgKyBudW1Bc1N0cmluZ1sxXSk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKG5lZykge1xuICAgICAgbnVtID0gbnVtIC0gMTA7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKG1hZ25pdHVkZSAhPT0gMCkge1xuICAgICAgLy8gcGFyc2VGbG9hdCBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gcG93IGR1ZSB0byByb3VuZGluZyBlcnJvcnNcbiAgICAgIC8vIGUuZy4gTnVtYmVyLk1BWF9WQUxVRSB3b3VsZCByZXR1cm4gSW5maW5pdHkgaWYgd2UgZGlkXG4gICAgICAvLyBudW0gKiBNYXRoLnBvdygxMCwgbWFnbml0dWRlKTtcbiAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtICsgJ2UnICsgbWFnbml0dWRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtudW06IG51bSwgbGVuZ3RoIDogaSAtIG9yaWdpbmFsSWR4fTtcbn1cblxuLy8gbW92ZSB1cCB0aGUgc3RhY2sgd2hpbGUgcGFyc2luZ1xuLy8gdGhpcyBmdW5jdGlvbiBtb3ZlZCBvdXRzaWRlIG9mIHBhcnNlSW5kZXhhYmxlU3RyaW5nIGZvciBwZXJmb3JtYW5jZVxuZnVuY3Rpb24gcG9wKHN0YWNrLCBtZXRhU3RhY2spIHtcbiAgdmFyIG9iaiA9IHN0YWNrLnBvcCgpO1xuXG4gIGlmIChtZXRhU3RhY2subGVuZ3RoKSB7XG4gICAgdmFyIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKG9iaiA9PT0gbGFzdE1ldGFFbGVtZW50LmVsZW1lbnQpIHtcbiAgICAgIC8vIHBvcHBpbmcgYSBtZXRhLWVsZW1lbnQsIGUuZy4gYW4gb2JqZWN0IHdob3NlIHZhbHVlIGlzIGFub3RoZXIgb2JqZWN0XG4gICAgICBtZXRhU3RhY2sucG9wKCk7XG4gICAgICBsYXN0TWV0YUVsZW1lbnQgPSBtZXRhU3RhY2tbbWV0YVN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudCA9IGxhc3RNZXRhRWxlbWVudC5lbGVtZW50O1xuICAgIHZhciBsYXN0RWxlbWVudEluZGV4ID0gbGFzdE1ldGFFbGVtZW50LmluZGV4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LnB1c2gob2JqKTtcbiAgICB9IGVsc2UgaWYgKGxhc3RFbGVtZW50SW5kZXggPT09IHN0YWNrLmxlbmd0aCAtIDIpIHsgLy8gb2JqIHdpdGgga2V5K3ZhbHVlXG4gICAgICB2YXIga2V5ID0gc3RhY2sucG9wKCk7XG4gICAgICBlbGVtZW50W2tleV0gPSBvYmo7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YWNrLnB1c2gob2JqKTsgLy8gb2JqIHdpdGgga2V5IG9ubHlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VJbmRleGFibGVTdHJpbmcoc3RyKSB7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgbWV0YVN0YWNrID0gW107IC8vIHN0YWNrIGZvciBhcnJheXMgYW5kIG9iamVjdHNcbiAgdmFyIGkgPSAwO1xuXG4gIC8qZXNsaW50IG5vLWNvbnN0YW50LWNvbmRpdGlvbjogW1wiZXJyb3JcIiwgeyBcImNoZWNrTG9vcHNcIjogZmFsc2UgfV0qL1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBjb2xsYXRpb25JbmRleCA9IHN0cltpKytdO1xuICAgIGlmIChjb2xsYXRpb25JbmRleCA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBzdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcChzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoY29sbGF0aW9uSW5kZXgpIHtcbiAgICAgIGNhc2UgJzEnOlxuICAgICAgICBzdGFjay5wdXNoKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzInOlxuICAgICAgICBzdGFjay5wdXNoKHN0cltpXSA9PT0gJzEnKTtcbiAgICAgICAgaSsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzMnOlxuICAgICAgICB2YXIgcGFyc2VkTnVtID0gcGFyc2VOdW1iZXIoc3RyLCBpKTtcbiAgICAgICAgc3RhY2sucHVzaChwYXJzZWROdW0ubnVtKTtcbiAgICAgICAgaSArPSBwYXJzZWROdW0ubGVuZ3RoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzQnOlxuICAgICAgICB2YXIgcGFyc2VkU3RyID0gJyc7XG4gICAgICAgIC8qZXNsaW50IG5vLWNvbnN0YW50LWNvbmRpdGlvbjogW1wiZXJyb3JcIiwgeyBcImNoZWNrTG9vcHNcIjogZmFsc2UgfV0qL1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIHZhciBjaCA9IHN0cltpXTtcbiAgICAgICAgICBpZiAoY2ggPT09ICdcXHUwMDAwJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcnNlZFN0ciArPSBjaDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGVyZm9ybSB0aGUgcmV2ZXJzZSBvZiB0aGUgb3JkZXItcHJlc2VydmluZyByZXBsYWNlbWVudFxuICAgICAgICAvLyBhbGdvcml0aG0gKHNlZSBhYm92ZSlcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29udHJvbC1yZWdleCAqL1xuICAgICAgICBwYXJzZWRTdHIgPSBwYXJzZWRTdHIucmVwbGFjZSgvXFx1MDAwMVxcdTAwMDEvZywgJ1xcdTAwMDAnKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAxXFx1MDAwMi9nLCAnXFx1MDAwMScpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDJcXHUwMDAyL2csICdcXHUwMDAyJyk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29udHJvbC1yZWdleCAqL1xuICAgICAgICBzdGFjay5wdXNoKHBhcnNlZFN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnNSc6XG4gICAgICAgIHZhciBhcnJheUVsZW1lbnQgPSB7IGVsZW1lbnQ6IFtdLCBpbmRleDogc3RhY2subGVuZ3RoIH07XG4gICAgICAgIHN0YWNrLnB1c2goYXJyYXlFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChhcnJheUVsZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzYnOlxuICAgICAgICB2YXIgb2JqRWxlbWVudCA9IHsgZWxlbWVudDoge30sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChvYmpFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChvYmpFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdiYWQgY29sbGF0aW9uSW5kZXggb3IgdW5leHBlY3RlZGx5IHJlYWNoZWQgZW5kIG9mIGlucHV0OiAnICtcbiAgICAgICAgICAgIGNvbGxhdGlvbkluZGV4KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXJyYXlDb2xsYXRlKGEsIGIpIHtcbiAgdmFyIGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgc29ydCA9IGNvbGxhdGUoYVtpXSwgYltpXSk7XG4gICAgaWYgKHNvcnQgIT09IDApIHtcbiAgICAgIHJldHVybiBzb3J0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gKGEubGVuZ3RoID09PSBiLmxlbmd0aCkgPyAwIDpcbiAgICAoYS5sZW5ndGggPiBiLmxlbmd0aCkgPyAxIDogLTE7XG59XG5mdW5jdGlvbiBzdHJpbmdDb2xsYXRlKGEsIGIpIHtcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGFsZWhhcnZleS9wb3VjaGRiL2lzc3Vlcy80MFxuICAvLyBUaGlzIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDb3VjaERCIGltcGxlbWVudGF0aW9uLCBidXQgaXRzIHRoZVxuICAvLyBiZXN0IHdlIGNhbiBkbyBmb3Igbm93XG4gIHJldHVybiAoYSA9PT0gYikgPyAwIDogKChhID4gYikgPyAxIDogLTEpO1xufVxuZnVuY3Rpb24gb2JqZWN0Q29sbGF0ZShhLCBiKSB7XG4gIHZhciBhayA9IE9iamVjdC5rZXlzKGEpLCBiayA9IE9iamVjdC5rZXlzKGIpO1xuICB2YXIgbGVuID0gTWF0aC5taW4oYWsubGVuZ3RoLCBiay5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgLy8gRmlyc3Qgc29ydCB0aGUga2V5c1xuICAgIHZhciBzb3J0ID0gY29sbGF0ZShha1tpXSwgYmtbaV0pO1xuICAgIGlmIChzb3J0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gc29ydDtcbiAgICB9XG4gICAgLy8gaWYgdGhlIGtleXMgYXJlIGVxdWFsIHNvcnQgdGhlIHZhbHVlc1xuICAgIHNvcnQgPSBjb2xsYXRlKGFbYWtbaV1dLCBiW2JrW2ldXSk7XG4gICAgaWYgKHNvcnQgIT09IDApIHtcbiAgICAgIHJldHVybiBzb3J0O1xuICAgIH1cblxuICB9XG4gIHJldHVybiAoYWsubGVuZ3RoID09PSBiay5sZW5ndGgpID8gMCA6XG4gICAgKGFrLmxlbmd0aCA+IGJrLmxlbmd0aCkgPyAxIDogLTE7XG59XG4vLyBUaGUgY29sbGF0aW9uIGlzIGRlZmluZWQgYnkgZXJsYW5ncyBvcmRlcmVkIHRlcm1zXG4vLyB0aGUgYXRvbXMgbnVsbCwgdHJ1ZSwgZmFsc2UgY29tZSBmaXJzdCwgdGhlbiBudW1iZXJzLCBzdHJpbmdzLFxuLy8gYXJyYXlzLCB0aGVuIG9iamVjdHNcbi8vIG51bGwvdW5kZWZpbmVkL05hTi9JbmZpbml0eS8tSW5maW5pdHkgYXJlIGFsbCBjb25zaWRlcmVkIG51bGxcbmZ1bmN0aW9uIGNvbGxhdGlvbkluZGV4KHgpIHtcbiAgdmFyIGlkID0gWydib29sZWFuJywgJ251bWJlcicsICdzdHJpbmcnLCAnb2JqZWN0J107XG4gIHZhciBpZHggPSBpZC5pbmRleE9mKHR5cGVvZiB4KTtcbiAgLy9mYWxzZSBpZiAtMSBvdGhlcndpc2UgdHJ1ZSwgYnV0IGZhc3QhISEhMVxuICBpZiAofmlkeCkge1xuICAgIGlmICh4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIHJldHVybiA1O1xuICAgIH1cbiAgICByZXR1cm4gaWR4IDwgMyA/IChpZHggKyAyKSA6IChpZHggKyAzKTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiA1O1xuICB9XG59XG5cbi8vIGNvbnZlcnNpb246XG4vLyB4IHl5eSB6ei4uLnp6XG4vLyB4ID0gMCBmb3IgbmVnYXRpdmUsIDEgZm9yIDAsIDIgZm9yIHBvc2l0aXZlXG4vLyB5ID0gZXhwb25lbnQgKGZvciBuZWdhdGl2ZSBudW1iZXJzIG5lZ2F0ZWQpIG1vdmVkIHNvIHRoYXQgaXQncyA+PSAwXG4vLyB6ID0gbWFudGlzc2VcbmZ1bmN0aW9uIG51bVRvSW5kZXhhYmxlU3RyaW5nKG51bSkge1xuXG4gIGlmIChudW0gPT09IDApIHtcbiAgICByZXR1cm4gJzEnO1xuICB9XG5cbiAgLy8gY29udmVydCBudW1iZXIgdG8gZXhwb25lbnRpYWwgZm9ybWF0IGZvciBlYXNpZXIgYW5kXG4gIC8vIG1vcmUgc3VjY2luY3Qgc3RyaW5nIHNvcnRpbmdcbiAgdmFyIGV4cEZvcm1hdCA9IG51bS50b0V4cG9uZW50aWFsKCkuc3BsaXQoL2VcXCs/Lyk7XG4gIHZhciBtYWduaXR1ZGUgPSBwYXJzZUludChleHBGb3JtYXRbMV0sIDEwKTtcblxuICB2YXIgbmVnID0gbnVtIDwgMDtcblxuICB2YXIgcmVzdWx0ID0gbmVnID8gJzAnIDogJzInO1xuXG4gIC8vIGZpcnN0IHNvcnQgYnkgbWFnbml0dWRlXG4gIC8vIGl0J3MgZWFzaWVyIGlmIGFsbCBtYWduaXR1ZGVzIGFyZSBwb3NpdGl2ZVxuICB2YXIgbWFnRm9yQ29tcGFyaXNvbiA9ICgobmVnID8gLW1hZ25pdHVkZSA6IG1hZ25pdHVkZSkgLSBNSU5fTUFHTklUVURFKTtcbiAgdmFyIG1hZ1N0cmluZyA9IHBhZExlZnQoKG1hZ0ZvckNvbXBhcmlzb24pLnRvU3RyaW5nKCksICcwJywgTUFHTklUVURFX0RJR0lUUyk7XG5cbiAgcmVzdWx0ICs9IFNFUCArIG1hZ1N0cmluZztcblxuICAvLyB0aGVuIHNvcnQgYnkgdGhlIGZhY3RvclxuICB2YXIgZmFjdG9yID0gTWF0aC5hYnMocGFyc2VGbG9hdChleHBGb3JtYXRbMF0pKTsgLy8gWzEuLjEwKVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAobmVnKSB7IC8vIGZvciBuZWdhdGl2ZSByZXZlcnNlIG9yZGVyaW5nXG4gICAgZmFjdG9yID0gMTAgLSBmYWN0b3I7XG4gIH1cblxuICB2YXIgZmFjdG9yU3RyID0gZmFjdG9yLnRvRml4ZWQoMjApO1xuXG4gIC8vIHN0cmlwIHplcm9zIGZyb20gdGhlIGVuZFxuICBmYWN0b3JTdHIgPSBmYWN0b3JTdHIucmVwbGFjZSgvXFwuPzArJC8sICcnKTtcblxuICByZXN1bHQgKz0gU0VQICsgZmFjdG9yU3RyO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIGNyZWF0ZSBhIGNvbXBhcmF0b3IgYmFzZWQgb24gdGhlIHNvcnQgb2JqZWN0XG5mdW5jdGlvbiBjcmVhdGVGaWVsZFNvcnRlcihzb3J0KSB7XG5cbiAgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZXNBc0FycmF5KGRvYykge1xuICAgIHJldHVybiBzb3J0Lm1hcChmdW5jdGlvbiAoc29ydGluZykge1xuICAgICAgdmFyIGZpZWxkTmFtZSA9IGdldEtleShzb3J0aW5nKTtcbiAgICAgIHZhciBwYXJzZWRGaWVsZCA9IHBhcnNlRmllbGQoZmllbGROYW1lKTtcbiAgICAgIHZhciBkb2NGaWVsZFZhbHVlID0gZ2V0RmllbGRGcm9tRG9jKGRvYywgcGFyc2VkRmllbGQpO1xuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFSb3csIGJSb3cpIHtcbiAgICB2YXIgYUZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXNBc0FycmF5KGFSb3cuZG9jKTtcbiAgICB2YXIgYkZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXNBc0FycmF5KGJSb3cuZG9jKTtcbiAgICB2YXIgY29sbGF0aW9uID0gY29sbGF0ZShhRmllbGRWYWx1ZXMsIGJGaWVsZFZhbHVlcyk7XG4gICAgaWYgKGNvbGxhdGlvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuIGNvbGxhdGlvbjtcbiAgICB9XG4gICAgLy8gdGhpcyBpcyB3aGF0IG1hbmdvIHNlZW1zIHRvIGRvXG4gICAgcmV0dXJuIGNvbXBhcmUkMShhUm93LmRvYy5faWQsIGJSb3cuZG9jLl9pZCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbHRlckluTWVtb3J5RmllbGRzKHJvd3MsIHJlcXVlc3REZWYsIGluTWVtb3J5RmllbGRzKSB7XG4gIHJvd3MgPSByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgcmV0dXJuIHJvd0ZpbHRlcihyb3cuZG9jLCByZXF1ZXN0RGVmLnNlbGVjdG9yLCBpbk1lbW9yeUZpZWxkcyk7XG4gIH0pO1xuXG4gIGlmIChyZXF1ZXN0RGVmLnNvcnQpIHtcbiAgICAvLyBpbi1tZW1vcnkgc29ydFxuICAgIHZhciBmaWVsZFNvcnRlciA9IGNyZWF0ZUZpZWxkU29ydGVyKHJlcXVlc3REZWYuc29ydCk7XG4gICAgcm93cyA9IHJvd3Muc29ydChmaWVsZFNvcnRlcik7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0RGVmLnNvcnRbMF0gIT09ICdzdHJpbmcnICYmXG4gICAgICAgIGdldFZhbHVlKHJlcXVlc3REZWYuc29ydFswXSkgPT09ICdkZXNjJykge1xuICAgICAgcm93cyA9IHJvd3MucmV2ZXJzZSgpO1xuICAgIH1cbiAgfVxuXG4gIGlmICgnbGltaXQnIGluIHJlcXVlc3REZWYgfHwgJ3NraXAnIGluIHJlcXVlc3REZWYpIHtcbiAgICAvLyBoYXZlIHRvIGRvIHRoZSBsaW1pdCBpbi1tZW1vcnlcbiAgICB2YXIgc2tpcCA9IHJlcXVlc3REZWYuc2tpcCB8fCAwO1xuICAgIHZhciBsaW1pdCA9ICgnbGltaXQnIGluIHJlcXVlc3REZWYgPyByZXF1ZXN0RGVmLmxpbWl0IDogcm93cy5sZW5ndGgpICsgc2tpcDtcbiAgICByb3dzID0gcm93cy5zbGljZShza2lwLCBsaW1pdCk7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIHJvd0ZpbHRlcihkb2MsIHNlbGVjdG9yLCBpbk1lbW9yeUZpZWxkcykge1xuICByZXR1cm4gaW5NZW1vcnlGaWVsZHMuZXZlcnkoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIG1hdGNoZXIgPSBzZWxlY3RvcltmaWVsZF07XG4gICAgdmFyIHBhcnNlZEZpZWxkID0gcGFyc2VGaWVsZChmaWVsZCk7XG4gICAgdmFyIGRvY0ZpZWxkVmFsdWUgPSBnZXRGaWVsZEZyb21Eb2MoZG9jLCBwYXJzZWRGaWVsZCk7XG4gICAgaWYgKGlzQ29tYmluYXRpb25hbEZpZWxkKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIG1hdGNoQ29taW5hdGlvbmFsU2VsZWN0b3IoZmllbGQsIG1hdGNoZXIsIGRvYyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoU2VsZWN0b3IobWF0Y2hlciwgZG9jLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaFNlbGVjdG9yKG1hdGNoZXIsIGRvYywgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgaWYgKCFtYXRjaGVyKSB7XG4gICAgLy8gbm8gZmlsdGVyaW5nIG5lY2Vzc2FyeTsgdGhpcyBmaWVsZCBpcyBqdXN0IG5lZWRlZCBmb3Igc29ydGluZ1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gaXMgbWF0Y2hlciBhbiBvYmplY3QsIGlmIHNvIGNvbnRpbnVlIHJlY3Vyc2lvblxuICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1hdGNoZXIpLmV2ZXJ5KGZ1bmN0aW9uIChtYXliZVVzZXJPcGVyYXRvcikge1xuICAgICAgdmFyIHVzZXJWYWx1ZSA9IG1hdGNoZXJbIG1heWJlVXNlck9wZXJhdG9yIF07XG4gICAgICAvLyBleHBsaWNpdCBvcGVyYXRvclxuICAgICAgaWYgKG1heWJlVXNlck9wZXJhdG9yLmluZGV4T2YoXCIkXCIpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBtYXRjaChtYXliZVVzZXJPcGVyYXRvciwgZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzdWJQYXJzZWRGaWVsZCA9IHBhcnNlRmllbGQobWF5YmVVc2VyT3BlcmF0b3IpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkb2NGaWVsZFZhbHVlID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB0eXBlb2YgdXNlclZhbHVlICE9PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgc3ViUGFyc2VkRmllbGQubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QsIHJldHVybiBvciBnZXRGaWVsZEZyb21Eb2Mgd2lsbCB0aHJvd1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdWJEb2NGaWVsZFZhbHVlID0gZ2V0RmllbGRGcm9tRG9jKGRvY0ZpZWxkVmFsdWUsIHN1YlBhcnNlZEZpZWxkKTtcblxuICAgICAgICBpZiAodHlwZW9mIHVzZXJWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vIGZpZWxkIHZhbHVlIGlzIGFuIG9iamVjdCB0aGF0IG1pZ2h0IGNvbnRhaW4gbW9yZSBvcGVyYXRvcnNcbiAgICAgICAgICByZXR1cm4gbWF0Y2hTZWxlY3Rvcih1c2VyVmFsdWUsIGRvYywgcGFyc2VkRmllbGQsIHN1YkRvY0ZpZWxkVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1wbGljaXQgb3BlcmF0b3JcbiAgICAgICAgcmV0dXJuIG1hdGNoKFwiJGVxXCIsIGRvYywgdXNlclZhbHVlLCBzdWJQYXJzZWRGaWVsZCwgc3ViRG9jRmllbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBubyBtb3JlIGRlcHRoLCBObyBuZWVkIHRvIHJlY3Vyc2UgZnVydGhlclxuICByZXR1cm4gbWF0Y2hlciA9PT0gZG9jRmllbGRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvcihmaWVsZCwgbWF0Y2hlciwgZG9jKSB7XG5cbiAgaWYgKGZpZWxkID09PSAnJG9yJykge1xuICAgIHJldHVybiBtYXRjaGVyLnNvbWUoZnVuY3Rpb24gKG9yTWF0Y2hlcnMpIHtcbiAgICAgIHJldHVybiByb3dGaWx0ZXIoZG9jLCBvck1hdGNoZXJzLCBPYmplY3Qua2V5cyhvck1hdGNoZXJzKSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoZmllbGQgPT09ICckbm90Jykge1xuICAgIHJldHVybiAhcm93RmlsdGVyKGRvYywgbWF0Y2hlciwgT2JqZWN0LmtleXMobWF0Y2hlcikpO1xuICB9XG5cbiAgLy9gJG5vcmBcbiAgcmV0dXJuICFtYXRjaGVyLmZpbmQoZnVuY3Rpb24gKG9yTWF0Y2hlcnMpIHtcbiAgICByZXR1cm4gcm93RmlsdGVyKGRvYywgb3JNYXRjaGVycywgT2JqZWN0LmtleXMob3JNYXRjaGVycykpO1xuICB9KTtcblxufVxuXG5mdW5jdGlvbiBtYXRjaCh1c2VyT3BlcmF0b3IsIGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICBpZiAoIW1hdGNoZXJzW3VzZXJPcGVyYXRvcl0pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBvcGVyYXRvciBcIicgKyB1c2VyT3BlcmF0b3IgK1xuICAgICAgJ1wiIC0gc2hvdWxkIGJlIG9uZSBvZiAkZXEsICRsdGUsICRsdCwgJGd0LCAkZ3RlLCAkZXhpc3RzLCAkbmUsICRpbiwgJyArXG4gICAgICAnJG5pbiwgJHNpemUsICRtb2QsICRyZWdleCwgJGVsZW1NYXRjaCwgJHR5cGUsICRhbGxNYXRjaCBvciAkYWxsJyk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXJzW3VzZXJPcGVyYXRvcl0oZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIGRvY0ZpZWxkVmFsdWUgIT09ICd1bmRlZmluZWQnICYmIGRvY0ZpZWxkVmFsdWUgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIGRvY0ZpZWxkVmFsdWUgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBtb2RGaWVsZChkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBkb2NGaWVsZFZhbHVlICE9PSBcIm51bWJlclwiIHx8XG4gICAgcGFyc2VJbnQoZG9jRmllbGRWYWx1ZSwgMTApICE9PSBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGRpdmlzb3IgPSB1c2VyVmFsdWVbMF07XG4gIHZhciBtb2QgPSB1c2VyVmFsdWVbMV07XG5cbiAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUgJSBkaXZpc29yID09PSBtb2Q7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnNWYWx1ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgcmV0dXJuIHVzZXJWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAoZG9jRmllbGRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uIChkb2NGaWVsZFZhbHVlSXRlbSkge1xuICAgICAgICByZXR1cm4gY29sbGF0ZSh2YWwsIGRvY0ZpZWxkVmFsdWVJdGVtKSA9PT0gMDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb2xsYXRlKHZhbCwgZG9jRmllbGRWYWx1ZSkgPT09IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcnJheUNvbnRhaW5zQWxsVmFsdWVzKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICByZXR1cm4gdXNlclZhbHVlLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5zb21lKGZ1bmN0aW9uIChkb2NGaWVsZFZhbHVlSXRlbSkge1xuICAgICAgcmV0dXJuIGNvbGxhdGUodmFsLCBkb2NGaWVsZFZhbHVlSXRlbSkgPT09IDA7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcnJheVNpemUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHJldHVybiBkb2NGaWVsZFZhbHVlLmxlbmd0aCA9PT0gdXNlclZhbHVlO1xufVxuXG5mdW5jdGlvbiByZWdleE1hdGNoKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKHVzZXJWYWx1ZSk7XG5cbiAgcmV0dXJuIHJlLnRlc3QoZG9jRmllbGRWYWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVNYXRjaChkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcblxuICBzd2l0Y2ggKHVzZXJWYWx1ZSkge1xuICAgIGNhc2UgJ251bGwnOlxuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUgPT09IG51bGw7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gdHlwZW9mIChkb2NGaWVsZFZhbHVlKSA9PT0gJ2Jvb2xlYW4nO1xuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gdHlwZW9mIChkb2NGaWVsZFZhbHVlKSA9PT0gJ251bWJlcic7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiB0eXBlb2YgKGRvY0ZpZWxkVmFsdWUpID09PSAnc3RyaW5nJztcbiAgICBjYXNlICdhcnJheSc6XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5O1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICByZXR1cm4gKHt9KS50b1N0cmluZy5jYWxsKGRvY0ZpZWxkVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcbiAgfVxufVxuXG52YXIgbWF0Y2hlcnMgPSB7XG5cbiAgJyRlbGVtTWF0Y2gnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRvY0ZpZWxkVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRvY0ZpZWxkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkb2NGaWVsZFZhbHVlWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuc29tZShmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiByb3dGaWx0ZXIodmFsLCB1c2VyVmFsdWUsIE9iamVjdC5rZXlzKHVzZXJWYWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuc29tZShmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gbWF0Y2hTZWxlY3Rvcih1c2VyVmFsdWUsIGRvYywgcGFyc2VkRmllbGQsIHZhbCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgJyRhbGxNYXRjaCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChkb2NGaWVsZFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZG9jRmllbGRWYWx1ZVswXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHJvd0ZpbHRlcih2YWwsIHVzZXJWYWx1ZSwgT2JqZWN0LmtleXModXNlclZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gbWF0Y2hTZWxlY3Rvcih1c2VyVmFsdWUsIGRvYywgcGFyc2VkRmllbGQsIHZhbCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgJyRlcSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPT09IDA7XG4gIH0sXG5cbiAgJyRndGUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpID49IDA7XG4gIH0sXG5cbiAgJyRndCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPiAwO1xuICB9LFxuXG4gICckbHRlJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA8PSAwO1xuICB9LFxuXG4gICckbHQnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIDwgMDtcbiAgfSxcblxuICAnJGV4aXN0cyc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICAvL2EgZmllbGQgdGhhdCBpcyBudWxsIGlzIHN0aWxsIGNvbnNpZGVyZWQgdG8gZXhpc3RcbiAgICBpZiAodXNlclZhbHVlKSB7XG4gICAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSk7XG4gIH0sXG5cbiAgJyRtb2QnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkRXhpc3RzKGRvY0ZpZWxkVmFsdWUpICYmIG1vZEZpZWxkKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSk7XG4gIH0sXG5cbiAgJyRuZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gdXNlclZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChuZVZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sbGF0ZShkb2NGaWVsZFZhbHVlLCBuZVZhbHVlKSAhPT0gMDtcbiAgICB9KTtcbiAgfSxcbiAgJyRpbic6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiYgYXJyYXlDb250YWluc1ZhbHVlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSk7XG4gIH0sXG5cbiAgJyRuaW4nOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkRXhpc3RzKGRvY0ZpZWxkVmFsdWUpICYmICFhcnJheUNvbnRhaW5zVmFsdWUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJHNpemUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkRXhpc3RzKGRvY0ZpZWxkVmFsdWUpICYmXG4gICAgICBBcnJheS5pc0FycmF5KGRvY0ZpZWxkVmFsdWUpICYmXG4gICAgICBhcnJheVNpemUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKTtcbiAgfSxcblxuICAnJGFsbCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkb2NGaWVsZFZhbHVlKSAmJiBhcnJheUNvbnRhaW5zQWxsVmFsdWVzKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSk7XG4gIH0sXG5cbiAgJyRyZWdleCc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRFeGlzdHMoZG9jRmllbGRWYWx1ZSkgJiZcbiAgICAgIHR5cGVvZiBkb2NGaWVsZFZhbHVlID09IFwic3RyaW5nXCIgJiZcbiAgICAgIHVzZXJWYWx1ZS5ldmVyeShmdW5jdGlvbiAocmVnZXhWYWx1ZSkge1xuICAgICAgICByZXR1cm4gcmVnZXhNYXRjaChkb2NGaWVsZFZhbHVlLCByZWdleFZhbHVlKTtcbiAgICAgIH0pO1xuICB9LFxuXG4gICckdHlwZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZU1hdGNoKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSk7XG4gIH1cbn07XG5cbi8vIHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkb2MgbWF0Y2hlcyB0aGUgc3VwcGxpZWQgc2VsZWN0b3JcbmZ1bmN0aW9uIG1hdGNoZXNTZWxlY3Rvcihkb2MsIHNlbGVjdG9yKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAnb2JqZWN0Jykge1xuICAgIC8vIG1hdGNoIHRoZSBDb3VjaERCIGVycm9yIG1lc3NhZ2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbGVjdG9yIGVycm9yOiBleHBlY3RlZCBhIEpTT04gb2JqZWN0Jyk7XG4gIH1cblxuICBzZWxlY3RvciA9IG1hc3NhZ2VTZWxlY3RvcihzZWxlY3Rvcik7XG4gIHZhciByb3cgPSB7XG4gICAgJ2RvYyc6IGRvY1xuICB9O1xuXG4gIHZhciByb3dzTWF0Y2hlZCA9IGZpbHRlckluTWVtb3J5RmllbGRzKFtyb3ddLCB7ICdzZWxlY3Rvcic6IHNlbGVjdG9yIH0sIE9iamVjdC5rZXlzKHNlbGVjdG9yKSk7XG4gIHJldHVybiByb3dzTWF0Y2hlZCAmJiByb3dzTWF0Y2hlZC5sZW5ndGggPT09IDE7XG59XG5cbmZ1bmN0aW9uIGV2YWxGaWx0ZXIoaW5wdXQpIHtcbiAgcmV0dXJuIHNjb3BlRXZhbCgnXCJ1c2Ugc3RyaWN0XCI7XFxucmV0dXJuICcgKyBpbnB1dCArICc7Jywge30pO1xufVxuXG5mdW5jdGlvbiBldmFsVmlldyhpbnB1dCkge1xuICB2YXIgY29kZSA9IFtcbiAgICAncmV0dXJuIGZ1bmN0aW9uKGRvYykgeycsXG4gICAgJyAgXCJ1c2Ugc3RyaWN0XCI7JyxcbiAgICAnICB2YXIgZW1pdHRlZCA9IGZhbHNlOycsXG4gICAgJyAgdmFyIGVtaXQgPSBmdW5jdGlvbiAoYSwgYikgeycsXG4gICAgJyAgICBlbWl0dGVkID0gdHJ1ZTsnLFxuICAgICcgIH07JyxcbiAgICAnICB2YXIgdmlldyA9ICcgKyBpbnB1dCArICc7JyxcbiAgICAnICB2aWV3KGRvYyk7JyxcbiAgICAnICBpZiAoZW1pdHRlZCkgeycsXG4gICAgJyAgICByZXR1cm4gdHJ1ZTsnLFxuICAgICcgIH0nLFxuICAgICd9OydcbiAgXS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gc2NvcGVFdmFsKGNvZGUsIHt9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGUob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKG9wdHMuc2VsZWN0b3IpIHtcbiAgICBpZiAob3B0cy5maWx0ZXIgJiYgb3B0cy5maWx0ZXIgIT09ICdfc2VsZWN0b3InKSB7XG4gICAgICB2YXIgZmlsdGVyTmFtZSA9IHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ3N0cmluZycgP1xuICAgICAgICBvcHRzLmZpbHRlciA6ICdmdW5jdGlvbic7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdzZWxlY3RvciBpbnZhbGlkIGZvciBmaWx0ZXIgXCInICsgZmlsdGVyTmFtZSArICdcIicpKTtcbiAgICB9XG4gIH1cbiAgY2FsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKG9wdHMpIHtcbiAgaWYgKG9wdHMudmlldyAmJiAhb3B0cy5maWx0ZXIpIHtcbiAgICBvcHRzLmZpbHRlciA9ICdfdmlldyc7XG4gIH1cblxuICBpZiAob3B0cy5zZWxlY3RvciAmJiAhb3B0cy5maWx0ZXIpIHtcbiAgICBvcHRzLmZpbHRlciA9ICdfc2VsZWN0b3InO1xuICB9XG5cbiAgaWYgKG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAob3B0cy5maWx0ZXIgPT09ICdfdmlldycpIHtcbiAgICAgIG9wdHMudmlldyA9IG5vcm1hbGl6ZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShvcHRzLnZpZXcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRzLmZpbHRlciA9IG5vcm1hbGl6ZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShvcHRzLmZpbHRlcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEZpbHRlcihjaGFuZ2VzSGFuZGxlciwgb3B0cykge1xuICByZXR1cm4gb3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJyAmJlxuICAgICFvcHRzLmRvY19pZHMgJiYgIWlzUmVtb3RlKGNoYW5nZXNIYW5kbGVyLmRiKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyKGNoYW5nZXNIYW5kbGVyLCBvcHRzKSB7XG4gIHZhciBjYWxsYmFjayA9IG9wdHMuY29tcGxldGU7XG4gIGlmIChvcHRzLmZpbHRlciA9PT0gJ192aWV3Jykge1xuICAgIGlmICghb3B0cy52aWV3IHx8IHR5cGVvZiBvcHRzLnZpZXcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgZXJyID0gY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsXG4gICAgICAgICdgdmlld2AgZmlsdGVyIHBhcmFtZXRlciBub3QgZm91bmQgb3IgaW52YWxpZC4nKTtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICAvLyBmZXRjaCBhIHZpZXcgZnJvbSBhIGRlc2lnbiBkb2MsIG1ha2UgaXQgYmVoYXZlIGxpa2UgYSBmaWx0ZXJcbiAgICB2YXIgdmlld05hbWUgPSBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShvcHRzLnZpZXcpO1xuICAgIGNoYW5nZXNIYW5kbGVyLmRiLmdldCgnX2Rlc2lnbi8nICsgdmlld05hbWVbMF0sIGZ1bmN0aW9uIChlcnIsIGRkb2MpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGNoYW5nZXNIYW5kbGVyLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7c3RhdHVzOiAnY2FuY2VsbGVkJ30pO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UoZXJyKSk7XG4gICAgICB9XG4gICAgICB2YXIgbWFwRnVuID0gZGRvYyAmJiBkZG9jLnZpZXdzICYmIGRkb2Mudmlld3Nbdmlld05hbWVbMV1dICYmXG4gICAgICAgIGRkb2Mudmlld3Nbdmlld05hbWVbMV1dLm1hcDtcbiAgICAgIGlmICghbWFwRnVuKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0RPQyxcbiAgICAgICAgICAoZGRvYy52aWV3cyA/ICdtaXNzaW5nIGpzb24ga2V5OiAnICsgdmlld05hbWVbMV0gOlxuICAgICAgICAgICAgJ21pc3NpbmcganNvbiBrZXk6IHZpZXdzJykpKTtcbiAgICAgIH1cbiAgICAgIG9wdHMuZmlsdGVyID0gZXZhbFZpZXcobWFwRnVuKTtcbiAgICAgIGNoYW5nZXNIYW5kbGVyLmRvQ2hhbmdlcyhvcHRzKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChvcHRzLnNlbGVjdG9yKSB7XG4gICAgb3B0cy5maWx0ZXIgPSBmdW5jdGlvbiAoZG9jKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1NlbGVjdG9yKGRvYywgb3B0cy5zZWxlY3Rvcik7XG4gICAgfTtcbiAgICBjaGFuZ2VzSGFuZGxlci5kb0NoYW5nZXMob3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gZmV0Y2ggYSBmaWx0ZXIgZnJvbSBhIGRlc2lnbiBkb2NcbiAgICB2YXIgZmlsdGVyTmFtZSA9IHBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lKG9wdHMuZmlsdGVyKTtcbiAgICBjaGFuZ2VzSGFuZGxlci5kYi5nZXQoJ19kZXNpZ24vJyArIGZpbHRlck5hbWVbMF0sIGZ1bmN0aW9uIChlcnIsIGRkb2MpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGNoYW5nZXNIYW5kbGVyLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7c3RhdHVzOiAnY2FuY2VsbGVkJ30pO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UoZXJyKSk7XG4gICAgICB9XG4gICAgICB2YXIgZmlsdGVyRnVuID0gZGRvYyAmJiBkZG9jLmZpbHRlcnMgJiYgZGRvYy5maWx0ZXJzW2ZpbHRlck5hbWVbMV1dO1xuICAgICAgaWYgKCFmaWx0ZXJGdW4pIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLFxuICAgICAgICAgICgoZGRvYyAmJiBkZG9jLmZpbHRlcnMpID8gJ21pc3NpbmcganNvbiBrZXk6ICcgKyBmaWx0ZXJOYW1lWzFdXG4gICAgICAgICAgICA6ICdtaXNzaW5nIGpzb24ga2V5OiBmaWx0ZXJzJykpKTtcbiAgICAgIH1cbiAgICAgIG9wdHMuZmlsdGVyID0gZXZhbEZpbHRlcihmaWx0ZXJGdW4pO1xuICAgICAgY2hhbmdlc0hhbmRsZXIuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2hhbmdlc0ZpbHRlclBsdWdpbihQb3VjaERCKSB7XG4gIFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4gPSB7XG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlLFxuICAgIG5vcm1hbGl6ZTogbm9ybWFsaXplLFxuICAgIHNob3VsZEZpbHRlcjogc2hvdWxkRmlsdGVyLFxuICAgIGZpbHRlcjogZmlsdGVyXG4gIH07XG59XG5cbi8vIFRPRE86IHJlbW92ZSBmcm9tIHBvdWNoZGItY29yZSAoYnJlYWtpbmcpXG5Qb3VjaERCLnBsdWdpbihhcHBseUNoYW5nZXNGaWx0ZXJQbHVnaW4pO1xuXG5Qb3VjaERCLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG5mdW5jdGlvbiB0b09iamVjdChhcnJheSkge1xuICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGl0ZW0pIHtcbiAgICBvYmpbaXRlbV0gPSB0cnVlO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbn1cbi8vIExpc3Qgb2YgdG9wIGxldmVsIHJlc2VydmVkIHdvcmRzIGZvciBkb2NcbnZhciByZXNlcnZlZFdvcmRzID0gdG9PYmplY3QoW1xuICAnX2lkJyxcbiAgJ19yZXYnLFxuICAnX2FjY2VzcycsXG4gICdfYXR0YWNobWVudHMnLFxuICAnX2RlbGV0ZWQnLFxuICAnX3JldmlzaW9ucycsXG4gICdfcmV2c19pbmZvJyxcbiAgJ19jb25mbGljdHMnLFxuICAnX2RlbGV0ZWRfY29uZmxpY3RzJyxcbiAgJ19sb2NhbF9zZXEnLFxuICAnX3Jldl90cmVlJyxcbiAgLy8gcmVwbGljYXRpb24gZG9jdW1lbnRzXG4gICdfcmVwbGljYXRpb25faWQnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZV90aW1lJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZV9yZWFzb24nLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRzJyxcbiAgLy8gU3BlY2lmaWMgdG8gQ291Y2hiYXNlIFN5bmMgR2F0ZXdheVxuICAnX3JlbW92ZWQnXG5dKTtcblxuLy8gTGlzdCBvZiByZXNlcnZlZCB3b3JkcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gdGhlIGRvY3VtZW50XG52YXIgZGF0YVdvcmRzID0gdG9PYmplY3QoW1xuICAnX2FjY2VzcycsXG4gICdfYXR0YWNobWVudHMnLFxuICAvLyByZXBsaWNhdGlvbiBkb2N1bWVudHNcbiAgJ19yZXBsaWNhdGlvbl9pZCcsXG4gICdfcmVwbGljYXRpb25fc3RhdGUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3RpbWUnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlX3JlYXNvbicsXG4gICdfcmVwbGljYXRpb25fc3RhdHMnXG5dKTtcblxuZnVuY3Rpb24gcGFyc2VSZXZpc2lvbkluZm8ocmV2KSB7XG4gIGlmICghL15cXGQrLS8udGVzdChyZXYpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yKElOVkFMSURfUkVWKTtcbiAgfVxuICB2YXIgaWR4ID0gcmV2LmluZGV4T2YoJy0nKTtcbiAgdmFyIGxlZnQgPSByZXYuc3Vic3RyaW5nKDAsIGlkeCk7XG4gIHZhciByaWdodCA9IHJldi5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gIHJldHVybiB7XG4gICAgcHJlZml4OiBwYXJzZUludChsZWZ0LCAxMCksXG4gICAgaWQ6IHJpZ2h0XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1ha2VSZXZUcmVlRnJvbVJldmlzaW9ucyhyZXZpc2lvbnMsIG9wdHMpIHtcbiAgdmFyIHBvcyA9IHJldmlzaW9ucy5zdGFydCAtIHJldmlzaW9ucy5pZHMubGVuZ3RoICsgMTtcblxuICB2YXIgcmV2aXNpb25JZHMgPSByZXZpc2lvbnMuaWRzO1xuICB2YXIgaWRzID0gW3JldmlzaW9uSWRzWzBdLCBvcHRzLCBbXV07XG5cbiAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IHJldmlzaW9uSWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWRzID0gW3JldmlzaW9uSWRzW2ldLCB7c3RhdHVzOiAnbWlzc2luZyd9LCBbaWRzXV07XG4gIH1cblxuICByZXR1cm4gW3tcbiAgICBwb3M6IHBvcyxcbiAgICBpZHM6IGlkc1xuICB9XTtcbn1cblxuLy8gUHJlcHJvY2VzcyBkb2N1bWVudHMsIHBhcnNlIHRoZWlyIHJldmlzaW9ucywgYXNzaWduIGFuIGlkIGFuZCBhXG4vLyByZXZpc2lvbiBmb3IgbmV3IHdyaXRlcyB0aGF0IGFyZSBtaXNzaW5nIHRoZW0sIGV0Y1xuZnVuY3Rpb24gcGFyc2VEb2MoZG9jLCBuZXdFZGl0cywgZGJPcHRzKSB7XG4gIGlmICghZGJPcHRzKSB7XG4gICAgZGJPcHRzID0ge1xuICAgICAgZGV0ZXJtaW5pc3RpY19yZXZzOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIHZhciBuUmV2TnVtO1xuICB2YXIgbmV3UmV2SWQ7XG4gIHZhciByZXZJbmZvO1xuICB2YXIgb3B0cyA9IHtzdGF0dXM6ICdhdmFpbGFibGUnfTtcbiAgaWYgKGRvYy5fZGVsZXRlZCkge1xuICAgIG9wdHMuZGVsZXRlZCA9IHRydWU7XG4gIH1cblxuICBpZiAobmV3RWRpdHMpIHtcbiAgICBpZiAoIWRvYy5faWQpIHtcbiAgICAgIGRvYy5faWQgPSB1dWlkKCk7XG4gICAgfVxuICAgIG5ld1JldklkID0gcmV2JCQxKGRvYywgZGJPcHRzLmRldGVybWluaXN0aWNfcmV2cyk7XG4gICAgaWYgKGRvYy5fcmV2KSB7XG4gICAgICByZXZJbmZvID0gcGFyc2VSZXZpc2lvbkluZm8oZG9jLl9yZXYpO1xuICAgICAgaWYgKHJldkluZm8uZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJldkluZm87XG4gICAgICB9XG4gICAgICBkb2MuX3Jldl90cmVlID0gW3tcbiAgICAgICAgcG9zOiByZXZJbmZvLnByZWZpeCxcbiAgICAgICAgaWRzOiBbcmV2SW5mby5pZCwge3N0YXR1czogJ21pc3NpbmcnfSwgW1tuZXdSZXZJZCwgb3B0cywgW11dXV1cbiAgICAgIH1dO1xuICAgICAgblJldk51bSA9IHJldkluZm8ucHJlZml4ICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jLl9yZXZfdHJlZSA9IFt7XG4gICAgICAgIHBvczogMSxcbiAgICAgICAgaWRzIDogW25ld1JldklkLCBvcHRzLCBbXV1cbiAgICAgIH1dO1xuICAgICAgblJldk51bSA9IDE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkb2MuX3JldmlzaW9ucykge1xuICAgICAgZG9jLl9yZXZfdHJlZSA9IG1ha2VSZXZUcmVlRnJvbVJldmlzaW9ucyhkb2MuX3JldmlzaW9ucywgb3B0cyk7XG4gICAgICBuUmV2TnVtID0gZG9jLl9yZXZpc2lvbnMuc3RhcnQ7XG4gICAgICBuZXdSZXZJZCA9IGRvYy5fcmV2aXNpb25zLmlkc1swXTtcbiAgICB9XG4gICAgaWYgKCFkb2MuX3Jldl90cmVlKSB7XG4gICAgICByZXZJbmZvID0gcGFyc2VSZXZpc2lvbkluZm8oZG9jLl9yZXYpO1xuICAgICAgaWYgKHJldkluZm8uZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJldkluZm87XG4gICAgICB9XG4gICAgICBuUmV2TnVtID0gcmV2SW5mby5wcmVmaXg7XG4gICAgICBuZXdSZXZJZCA9IHJldkluZm8uaWQ7XG4gICAgICBkb2MuX3Jldl90cmVlID0gW3tcbiAgICAgICAgcG9zOiBuUmV2TnVtLFxuICAgICAgICBpZHM6IFtuZXdSZXZJZCwgb3B0cywgW11dXG4gICAgICB9XTtcbiAgICB9XG4gIH1cblxuICBpbnZhbGlkSWRFcnJvcihkb2MuX2lkKTtcblxuICBkb2MuX3JldiA9IG5SZXZOdW0gKyAnLScgKyBuZXdSZXZJZDtcblxuICB2YXIgcmVzdWx0ID0ge21ldGFkYXRhIDoge30sIGRhdGEgOiB7fX07XG4gIGZvciAodmFyIGtleSBpbiBkb2MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9jLCBrZXkpKSB7XG4gICAgICB2YXIgc3BlY2lhbEtleSA9IGtleVswXSA9PT0gJ18nO1xuICAgICAgaWYgKHNwZWNpYWxLZXkgJiYgIXJlc2VydmVkV29yZHNba2V5XSkge1xuICAgICAgICB2YXIgZXJyb3IgPSBjcmVhdGVFcnJvcihET0NfVkFMSURBVElPTiwga2V5KTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IERPQ19WQUxJREFUSU9OLm1lc3NhZ2UgKyAnOiAnICsga2V5O1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZWxzZSBpZiAoc3BlY2lhbEtleSAmJiAhZGF0YVdvcmRzW2tleV0pIHtcbiAgICAgICAgcmVzdWx0Lm1ldGFkYXRhW2tleS5zbGljZSgxKV0gPSBkb2Nba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5kYXRhW2tleV0gPSBkb2Nba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcGFyc2VCYXNlNjQoZGF0YSkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzQXRvYihkYXRhKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihCQURfQVJHLFxuICAgICAgJ0F0dGFjaG1lbnQgaXMgbm90IGEgdmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICAgIHJldHVybiB7ZXJyb3I6IGVycn07XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1N0cmluZyhhdHQsIGJsb2JUeXBlLCBjYWxsYmFjaykge1xuICB2YXIgYXNCaW5hcnkgPSBwYXJzZUJhc2U2NChhdHQuZGF0YSk7XG4gIGlmIChhc0JpbmFyeS5lcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFjayhhc0JpbmFyeS5lcnJvcik7XG4gIH1cblxuICBhdHQubGVuZ3RoID0gYXNCaW5hcnkubGVuZ3RoO1xuICBpZiAoYmxvYlR5cGUgPT09ICdibG9iJykge1xuICAgIGF0dC5kYXRhID0gYmluU3RyaW5nVG9CbHVmZmVyKGFzQmluYXJ5LCBhdHQuY29udGVudF90eXBlKTtcbiAgfSBlbHNlIGlmIChibG9iVHlwZSA9PT0gJ2Jhc2U2NCcpIHtcbiAgICBhdHQuZGF0YSA9IHRoaXNCdG9hKGFzQmluYXJ5KTtcbiAgfSBlbHNlIHsgLy8gYmluYXJ5XG4gICAgYXR0LmRhdGEgPSBhc0JpbmFyeTtcbiAgfVxuICBiaW5hcnlNZDUoYXNCaW5hcnksIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBhdHQuZGlnZXN0ID0gJ21kNS0nICsgcmVzdWx0O1xuICAgIGNhbGxiYWNrKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzQmxvYihhdHQsIGJsb2JUeXBlLCBjYWxsYmFjaykge1xuICBiaW5hcnlNZDUoYXR0LmRhdGEsIGZ1bmN0aW9uIChtZDUpIHtcbiAgICBhdHQuZGlnZXN0ID0gJ21kNS0nICsgbWQ1O1xuICAgIC8vIHNpemUgaXMgZm9yIGJsb2JzIChicm93c2VyKSwgbGVuZ3RoIGlzIGZvciBidWZmZXJzIChub2RlKVxuICAgIGF0dC5sZW5ndGggPSBhdHQuZGF0YS5zaXplIHx8IGF0dC5kYXRhLmxlbmd0aCB8fCAwO1xuICAgIGlmIChibG9iVHlwZSA9PT0gJ2JpbmFyeScpIHtcbiAgICAgIGJsb2JUb0JpbmFyeVN0cmluZyhhdHQuZGF0YSwgZnVuY3Rpb24gKGJpblN0cmluZykge1xuICAgICAgICBhdHQuZGF0YSA9IGJpblN0cmluZztcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoYmxvYlR5cGUgPT09ICdiYXNlNjQnKSB7XG4gICAgICBibG9iVG9CYXNlNjQoYXR0LmRhdGEsIGZ1bmN0aW9uIChiNjQpIHtcbiAgICAgICAgYXR0LmRhdGEgPSBiNjQ7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzQXR0YWNobWVudChhdHQsIGJsb2JUeXBlLCBjYWxsYmFjaykge1xuICBpZiAoYXR0LnN0dWIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuICBpZiAodHlwZW9mIGF0dC5kYXRhID09PSAnc3RyaW5nJykgeyAvLyBpbnB1dCBpcyBhIGJhc2U2NCBzdHJpbmdcbiAgICBwcmVwcm9jZXNzU3RyaW5nKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKTtcbiAgfSBlbHNlIHsgLy8gaW5wdXQgaXMgYSBibG9iXG4gICAgcHJlcHJvY2Vzc0Jsb2IoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NBdHRhY2htZW50cyhkb2NJbmZvcywgYmxvYlR5cGUsIGNhbGxiYWNrKSB7XG5cbiAgaWYgKCFkb2NJbmZvcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIHZhciBkb2N2ID0gMDtcbiAgdmFyIG92ZXJhbGxFcnI7XG5cbiAgZG9jSW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoZG9jSW5mbykge1xuICAgIHZhciBhdHRhY2htZW50cyA9IGRvY0luZm8uZGF0YSAmJiBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzID9cbiAgICAgIE9iamVjdC5rZXlzKGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMpIDogW107XG4gICAgdmFyIHJlY3YgPSAwO1xuXG4gICAgaWYgKCFhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBkb25lKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc2VkQXR0YWNobWVudChlcnIpIHtcbiAgICAgIG92ZXJhbGxFcnIgPSBlcnI7XG4gICAgICByZWN2Kys7XG4gICAgICBpZiAocmVjdiA9PT0gYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzLCBrZXkpKSB7XG4gICAgICAgIHByZXByb2Nlc3NBdHRhY2htZW50KGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHNba2V5XSxcbiAgICAgICAgICBibG9iVHlwZSwgcHJvY2Vzc2VkQXR0YWNobWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIGRvY3YrKztcbiAgICBpZiAoZG9jSW5mb3MubGVuZ3RoID09PSBkb2N2KSB7XG4gICAgICBpZiAob3ZlcmFsbEVycikge1xuICAgICAgICBjYWxsYmFjayhvdmVyYWxsRXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURvYyhyZXZMaW1pdCwgcHJldiwgZG9jSW5mbywgcmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICBpLCBjYiwgd3JpdGVEb2MsIG5ld0VkaXRzKSB7XG5cbiAgaWYgKHJldkV4aXN0cyhwcmV2LnJldl90cmVlLCBkb2NJbmZvLm1ldGFkYXRhLnJldikgJiYgIW5ld0VkaXRzKSB7XG4gICAgcmVzdWx0c1tpXSA9IGRvY0luZm87XG4gICAgcmV0dXJuIGNiKCk7XG4gIH1cblxuICAvLyBzb21ldGltZXMgdGhpcyBpcyBwcmUtY2FsY3VsYXRlZC4gaGlzdG9yaWNhbGx5IG5vdCBhbHdheXNcbiAgdmFyIHByZXZpb3VzV2lubmluZ1JldiA9IHByZXYud2lubmluZ1JldiB8fCB3aW5uaW5nUmV2KHByZXYpO1xuICB2YXIgcHJldmlvdXNseURlbGV0ZWQgPSAnZGVsZXRlZCcgaW4gcHJldiA/IHByZXYuZGVsZXRlZCA6XG4gICAgaXNEZWxldGVkKHByZXYsIHByZXZpb3VzV2lubmluZ1Jldik7XG4gIHZhciBkZWxldGVkID0gJ2RlbGV0ZWQnIGluIGRvY0luZm8ubWV0YWRhdGEgPyBkb2NJbmZvLm1ldGFkYXRhLmRlbGV0ZWQgOlxuICAgIGlzRGVsZXRlZChkb2NJbmZvLm1ldGFkYXRhKTtcbiAgdmFyIGlzUm9vdCA9IC9eMS0vLnRlc3QoZG9jSW5mby5tZXRhZGF0YS5yZXYpO1xuXG4gIGlmIChwcmV2aW91c2x5RGVsZXRlZCAmJiAhZGVsZXRlZCAmJiBuZXdFZGl0cyAmJiBpc1Jvb3QpIHtcbiAgICB2YXIgbmV3RG9jID0gZG9jSW5mby5kYXRhO1xuICAgIG5ld0RvYy5fcmV2ID0gcHJldmlvdXNXaW5uaW5nUmV2O1xuICAgIG5ld0RvYy5faWQgPSBkb2NJbmZvLm1ldGFkYXRhLmlkO1xuICAgIGRvY0luZm8gPSBwYXJzZURvYyhuZXdEb2MsIG5ld0VkaXRzKTtcbiAgfVxuXG4gIHZhciBtZXJnZWQgPSBtZXJnZShwcmV2LnJldl90cmVlLCBkb2NJbmZvLm1ldGFkYXRhLnJldl90cmVlWzBdLCByZXZMaW1pdCk7XG5cbiAgdmFyIGluQ29uZmxpY3QgPSBuZXdFZGl0cyAmJiAoKFxuICAgIChwcmV2aW91c2x5RGVsZXRlZCAmJiBkZWxldGVkICYmIG1lcmdlZC5jb25mbGljdHMgIT09ICduZXdfbGVhZicpIHx8XG4gICAgKCFwcmV2aW91c2x5RGVsZXRlZCAmJiBtZXJnZWQuY29uZmxpY3RzICE9PSAnbmV3X2xlYWYnKSB8fFxuICAgIChwcmV2aW91c2x5RGVsZXRlZCAmJiAhZGVsZXRlZCAmJiBtZXJnZWQuY29uZmxpY3RzID09PSAnbmV3X2JyYW5jaCcpKSk7XG5cbiAgaWYgKGluQ29uZmxpY3QpIHtcbiAgICB2YXIgZXJyID0gY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKTtcbiAgICByZXN1bHRzW2ldID0gZXJyO1xuICAgIHJldHVybiBjYigpO1xuICB9XG5cbiAgdmFyIG5ld1JldiA9IGRvY0luZm8ubWV0YWRhdGEucmV2O1xuICBkb2NJbmZvLm1ldGFkYXRhLnJldl90cmVlID0gbWVyZ2VkLnRyZWU7XG4gIGRvY0luZm8uc3RlbW1lZFJldnMgPSBtZXJnZWQuc3RlbW1lZFJldnMgfHwgW107XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcmV2LnJldl9tYXApIHtcbiAgICBkb2NJbmZvLm1ldGFkYXRhLnJldl9tYXAgPSBwcmV2LnJldl9tYXA7IC8vIHVzZWQgb25seSBieSBsZXZlbGRiXG4gIH1cblxuICAvLyByZWNhbGN1bGF0ZVxuICB2YXIgd2lubmluZ1JldiQkMSA9IHdpbm5pbmdSZXYoZG9jSW5mby5tZXRhZGF0YSk7XG4gIHZhciB3aW5uaW5nUmV2SXNEZWxldGVkID0gaXNEZWxldGVkKGRvY0luZm8ubWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEpO1xuXG4gIC8vIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGRvY3VtZW50cyB0aGF0IHdlcmUgYWRkZWQvcmVtb3ZlZCxcbiAgLy8gZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdG90YWxfcm93cy9kb2NfY291bnRcbiAgdmFyIGRlbHRhID0gKHByZXZpb3VzbHlEZWxldGVkID09PSB3aW5uaW5nUmV2SXNEZWxldGVkKSA/IDAgOlxuICAgIHByZXZpb3VzbHlEZWxldGVkIDwgd2lubmluZ1JldklzRGVsZXRlZCA/IC0xIDogMTtcblxuICB2YXIgbmV3UmV2SXNEZWxldGVkO1xuICBpZiAobmV3UmV2ID09PSB3aW5uaW5nUmV2JCQxKSB7XG4gICAgLy8gaWYgdGhlIG5ldyByZXYgaXMgdGhlIHNhbWUgYXMgdGhlIHdpbm5pbmcgcmV2LCB3ZSBjYW4gcmV1c2UgdGhhdCB2YWx1ZVxuICAgIG5ld1JldklzRGVsZXRlZCA9IHdpbm5pbmdSZXZJc0RlbGV0ZWQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhleSdyZSBub3QgdGhlIHNhbWUsIHRoZW4gd2UgbmVlZCB0byByZWNhbGN1bGF0ZVxuICAgIG5ld1JldklzRGVsZXRlZCA9IGlzRGVsZXRlZChkb2NJbmZvLm1ldGFkYXRhLCBuZXdSZXYpO1xuICB9XG5cbiAgd3JpdGVEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCwgbmV3UmV2SXNEZWxldGVkLFxuICAgIHRydWUsIGRlbHRhLCBpLCBjYik7XG59XG5cbmZ1bmN0aW9uIHJvb3RJc01pc3NpbmcoZG9jSW5mbykge1xuICByZXR1cm4gZG9jSW5mby5tZXRhZGF0YS5yZXZfdHJlZVswXS5pZHNbMV0uc3RhdHVzID09PSAnbWlzc2luZyc7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEb2NzKHJldkxpbWl0LCBkb2NJbmZvcywgYXBpLCBmZXRjaGVkRG9jcywgdHgsIHJlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgICB3cml0ZURvYywgb3B0cywgb3ZlcmFsbENhbGxiYWNrKSB7XG5cbiAgLy8gRGVmYXVsdCB0byAxMDAwIGxvY2FsbHlcbiAgcmV2TGltaXQgPSByZXZMaW1pdCB8fCAxMDAwO1xuXG4gIGZ1bmN0aW9uIGluc2VydERvYyhkb2NJbmZvLCByZXN1bHRzSWR4LCBjYWxsYmFjaykge1xuICAgIC8vIENhbnQgaW5zZXJ0IG5ldyBkZWxldGVkIGRvY3VtZW50c1xuICAgIHZhciB3aW5uaW5nUmV2JCQxID0gd2lubmluZ1Jldihkb2NJbmZvLm1ldGFkYXRhKTtcbiAgICB2YXIgZGVsZXRlZCA9IGlzRGVsZXRlZChkb2NJbmZvLm1ldGFkYXRhLCB3aW5uaW5nUmV2JCQxKTtcbiAgICBpZiAoJ3dhc19kZWxldGUnIGluIG9wdHMgJiYgZGVsZXRlZCkge1xuICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLCAnZGVsZXRlZCcpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgLy8gNDcxMiAtIGRldGVjdCB3aGV0aGVyIGEgbmV3IGRvY3VtZW50IHdhcyBpbnNlcnRlZCB3aXRoIGEgX3JldlxuICAgIHZhciBpbkNvbmZsaWN0ID0gbmV3RWRpdHMgJiYgcm9vdElzTWlzc2luZyhkb2NJbmZvKTtcblxuICAgIGlmIChpbkNvbmZsaWN0KSB7XG4gICAgICB2YXIgZXJyID0gY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKTtcbiAgICAgIHJlc3VsdHNbcmVzdWx0c0lkeF0gPSBlcnI7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB2YXIgZGVsdGEgPSBkZWxldGVkID8gMCA6IDE7XG5cbiAgICB3cml0ZURvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCBkZWxldGVkLCBkZWxldGVkLCBmYWxzZSxcbiAgICAgIGRlbHRhLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gIH1cblxuICB2YXIgbmV3RWRpdHMgPSBvcHRzLm5ld19lZGl0cztcbiAgdmFyIGlkc1RvRG9jcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG4gIHZhciBkb2NzRG9uZSA9IDA7XG4gIHZhciBkb2NzVG9EbyA9IGRvY0luZm9zLmxlbmd0aDtcblxuICBmdW5jdGlvbiBjaGVja0FsbERvY3NEb25lKCkge1xuICAgIGlmICgrK2RvY3NEb25lID09PSBkb2NzVG9EbyAmJiBvdmVyYWxsQ2FsbGJhY2spIHtcbiAgICAgIG92ZXJhbGxDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIGRvY0luZm9zLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnREb2MsIHJlc3VsdHNJZHgpIHtcblxuICAgIGlmIChjdXJyZW50RG9jLl9pZCAmJiBpc0xvY2FsSWQoY3VycmVudERvYy5faWQpKSB7XG4gICAgICB2YXIgZnVuID0gY3VycmVudERvYy5fZGVsZXRlZCA/ICdfcmVtb3ZlTG9jYWwnIDogJ19wdXRMb2NhbCc7XG4gICAgICBhcGlbZnVuXShjdXJyZW50RG9jLCB7Y3R4OiB0eH0sIGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICByZXN1bHRzW3Jlc3VsdHNJZHhdID0gZXJyIHx8IHJlcztcbiAgICAgICAgY2hlY2tBbGxEb2NzRG9uZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGlkID0gY3VycmVudERvYy5tZXRhZGF0YS5pZDtcbiAgICBpZiAoaWRzVG9Eb2NzLmhhcyhpZCkpIHtcbiAgICAgIGRvY3NUb0RvLS07IC8vIGR1cGxpY2F0ZVxuICAgICAgaWRzVG9Eb2NzLmdldChpZCkucHVzaChbY3VycmVudERvYywgcmVzdWx0c0lkeF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZHNUb0RvY3Muc2V0KGlkLCBbW2N1cnJlbnREb2MsIHJlc3VsdHNJZHhdXSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBpbiB0aGUgY2FzZSBvZiBuZXdfZWRpdHMsIHRoZSB1c2VyIGNhbiBwcm92aWRlIG11bHRpcGxlIGRvY3NcbiAgLy8gd2l0aCB0aGUgc2FtZSBpZC4gdGhlc2UgbmVlZCB0byBiZSBwcm9jZXNzZWQgc2VxdWVudGlhbGx5XG4gIGlkc1RvRG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NzLCBpZCkge1xuICAgIHZhciBudW1Eb25lID0gMDtcblxuICAgIGZ1bmN0aW9uIGRvY1dyaXR0ZW4oKSB7XG4gICAgICBpZiAoKytudW1Eb25lIDwgZG9jcy5sZW5ndGgpIHtcbiAgICAgICAgbmV4dERvYygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tBbGxEb2NzRG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0RG9jKCkge1xuICAgICAgdmFyIHZhbHVlID0gZG9jc1tudW1Eb25lXTtcbiAgICAgIHZhciBjdXJyZW50RG9jID0gdmFsdWVbMF07XG4gICAgICB2YXIgcmVzdWx0c0lkeCA9IHZhbHVlWzFdO1xuXG4gICAgICBpZiAoZmV0Y2hlZERvY3MuaGFzKGlkKSkge1xuICAgICAgICB1cGRhdGVEb2MocmV2TGltaXQsIGZldGNoZWREb2NzLmdldChpZCksIGN1cnJlbnREb2MsIHJlc3VsdHMsXG4gICAgICAgICAgcmVzdWx0c0lkeCwgZG9jV3JpdHRlbiwgd3JpdGVEb2MsIG5ld0VkaXRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEVuc3VyZSBzdGVtbWluZyBhcHBsaWVzIHRvIG5ldyB3cml0ZXMgYXMgd2VsbFxuICAgICAgICB2YXIgbWVyZ2VkID0gbWVyZ2UoW10sIGN1cnJlbnREb2MubWV0YWRhdGEucmV2X3RyZWVbMF0sIHJldkxpbWl0KTtcbiAgICAgICAgY3VycmVudERvYy5tZXRhZGF0YS5yZXZfdHJlZSA9IG1lcmdlZC50cmVlO1xuICAgICAgICBjdXJyZW50RG9jLnN0ZW1tZWRSZXZzID0gbWVyZ2VkLnN0ZW1tZWRSZXZzIHx8IFtdO1xuICAgICAgICBpbnNlcnREb2MoY3VycmVudERvYywgcmVzdWx0c0lkeCwgZG9jV3JpdHRlbik7XG4gICAgICB9XG4gICAgfVxuICAgIG5leHREb2MoKTtcbiAgfSk7XG59XG5cbi8vIEluZGV4ZWREQiByZXF1aXJlcyBhIHZlcnNpb25lZCBkYXRhYmFzZSBzdHJ1Y3R1cmUsIHNvIHdlIHVzZSB0aGVcbi8vIHZlcnNpb24gaGVyZSB0byBtYW5hZ2UgbWlncmF0aW9ucy5cbnZhciBBREFQVEVSX1ZFUlNJT04gPSA1O1xuXG4vLyBUaGUgb2JqZWN0IHN0b3JlcyBjcmVhdGVkIGZvciBlYWNoIGRhdGFiYXNlXG4vLyBET0NfU1RPUkUgc3RvcmVzIHRoZSBkb2N1bWVudCBtZXRhIGRhdGEsIGl0cyByZXZpc2lvbiBoaXN0b3J5IGFuZCBzdGF0ZVxuLy8gS2V5ZWQgYnkgZG9jdW1lbnQgaWRcbnZhciBET0NfU1RPUkUgPSAnZG9jdW1lbnQtc3RvcmUnO1xuLy8gQllfU0VRX1NUT1JFIHN0b3JlcyBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBhIGRvY3VtZW50LCBrZXllZCBieSBpdHNcbi8vIHNlcXVlbmNlIGlkXG52YXIgQllfU0VRX1NUT1JFID0gJ2J5LXNlcXVlbmNlJztcbi8vIFdoZXJlIHdlIHN0b3JlIGF0dGFjaG1lbnRzXG52YXIgQVRUQUNIX1NUT1JFID0gJ2F0dGFjaC1zdG9yZSc7XG4vLyBXaGVyZSB3ZSBzdG9yZSBtYW55LXRvLW1hbnkgcmVsYXRpb25zXG4vLyBiZXR3ZWVuIGF0dGFjaG1lbnQgZGlnZXN0cyBhbmQgc2Vxc1xudmFyIEFUVEFDSF9BTkRfU0VRX1NUT1JFID0gJ2F0dGFjaC1zZXEtc3RvcmUnO1xuXG4vLyBXaGVyZSB3ZSBzdG9yZSBkYXRhYmFzZS13aWRlIG1ldGEgZGF0YSBpbiBhIHNpbmdsZSByZWNvcmRcbi8vIGtleWVkIGJ5IGlkOiBNRVRBX1NUT1JFXG52YXIgTUVUQV9TVE9SRSA9ICdtZXRhLXN0b3JlJztcbi8vIFdoZXJlIHdlIHN0b3JlIGxvY2FsIGRvY3VtZW50c1xudmFyIExPQ0FMX1NUT1JFID0gJ2xvY2FsLXN0b3JlJztcbi8vIFdoZXJlIHdlIGRldGVjdCBibG9iIHN1cHBvcnRcbnZhciBERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFID0gJ2RldGVjdC1ibG9iLXN1cHBvcnQnO1xuXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlKHN0cikge1xuICAvLyBUaGlzIHRyeS9jYXRjaCBndWFyZHMgYWdhaW5zdCBzdGFjayBvdmVyZmxvdyBlcnJvcnMuXG4gIC8vIEpTT04ucGFyc2UoKSBpcyBmYXN0ZXIgdGhhbiB2dXZ1emVsYS5wYXJzZSgpIGJ1dCB2dXZ1emVsYVxuICAvLyBjYW5ub3Qgb3ZlcmZsb3cuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHZ1dnV6ZWxhLnBhcnNlKHN0cik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZUpzb25TdHJpbmdpZnkoanNvbikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc29uKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHZ1dnV6ZWxhLnN0cmluZ2lmeShqc29uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpZGJFcnJvcihjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gKGV2dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ3Vua25vd25fZXJyb3InO1xuICAgIGlmIChldnQudGFyZ2V0ICYmIGV2dC50YXJnZXQuZXJyb3IpIHtcbiAgICAgIG1lc3NhZ2UgPSBldnQudGFyZ2V0LmVycm9yLm5hbWUgfHwgZXZ0LnRhcmdldC5lcnJvci5tZXNzYWdlO1xuICAgIH1cbiAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihJREJfRVJST1IsIG1lc3NhZ2UsIGV2dC50eXBlKSk7XG4gIH07XG59XG5cbi8vIFVuZm9ydHVuYXRlbHksIHRoZSBtZXRhZGF0YSBoYXMgdG8gYmUgc3RyaW5naWZpZWRcbi8vIHdoZW4gaXQgaXMgcHV0IGludG8gdGhlIGRhdGFiYXNlLCBiZWNhdXNlIG90aGVyd2lzZVxuLy8gSW5kZXhlZERCIGNhbiB0aHJvdyBlcnJvcnMgZm9yIGRlZXBseS1uZXN0ZWQgb2JqZWN0cy5cbi8vIE9yaWdpbmFsbHkgd2UganVzdCB1c2VkIEpTT04ucGFyc2UvSlNPTi5zdHJpbmdpZnk7IG5vd1xuLy8gd2UgdXNlIHRoaXMgY3VzdG9tIHZ1dnV6ZWxhIGxpYnJhcnkgdGhhdCBhdm9pZHMgcmVjdXJzaW9uLlxuLy8gSWYgd2UgY291bGQgZG8gaXQgYWxsIG92ZXIgYWdhaW4sIHdlJ2QgcHJvYmFibHkgdXNlIGFcbi8vIGZvcm1hdCBmb3IgdGhlIHJldmlzaW9uIHRyZWVzIG90aGVyIHRoYW4gSlNPTi5cbmZ1bmN0aW9uIGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLCB3aW5uaW5nUmV2LCBkZWxldGVkKSB7XG4gIHJldHVybiB7XG4gICAgZGF0YTogc2FmZUpzb25TdHJpbmdpZnkobWV0YWRhdGEpLFxuICAgIHdpbm5pbmdSZXY6IHdpbm5pbmdSZXYsXG4gICAgZGVsZXRlZE9yTG9jYWw6IGRlbGV0ZWQgPyAnMScgOiAnMCcsXG4gICAgc2VxOiBtZXRhZGF0YS5zZXEsIC8vIGhpZ2hlc3Qgc2VxIGZvciB0aGlzIGRvY1xuICAgIGlkOiBtZXRhZGF0YS5pZFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZWNvZGVNZXRhZGF0YShzdG9yZWRPYmplY3QpIHtcbiAgaWYgKCFzdG9yZWRPYmplY3QpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgbWV0YWRhdGEgPSBzYWZlSnNvblBhcnNlKHN0b3JlZE9iamVjdC5kYXRhKTtcbiAgbWV0YWRhdGEud2lubmluZ1JldiA9IHN0b3JlZE9iamVjdC53aW5uaW5nUmV2O1xuICBtZXRhZGF0YS5kZWxldGVkID0gc3RvcmVkT2JqZWN0LmRlbGV0ZWRPckxvY2FsID09PSAnMSc7XG4gIG1ldGFkYXRhLnNlcSA9IHN0b3JlZE9iamVjdC5zZXE7XG4gIHJldHVybiBtZXRhZGF0YTtcbn1cblxuLy8gcmVhZCB0aGUgZG9jIGJhY2sgb3V0IGZyb20gdGhlIGRhdGFiYXNlLiB3ZSBkb24ndCBzdG9yZSB0aGVcbi8vIF9pZCBvciBfcmV2IGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIF9kb2NfaWRfcmV2LlxuZnVuY3Rpb24gZGVjb2RlRG9jKGRvYykge1xuICBpZiAoIWRvYykge1xuICAgIHJldHVybiBkb2M7XG4gIH1cbiAgdmFyIGlkeCA9IGRvYy5fZG9jX2lkX3Jldi5sYXN0SW5kZXhPZignOicpO1xuICBkb2MuX2lkID0gZG9jLl9kb2NfaWRfcmV2LnN1YnN0cmluZygwLCBpZHggLSAxKTtcbiAgZG9jLl9yZXYgPSBkb2MuX2RvY19pZF9yZXYuc3Vic3RyaW5nKGlkeCArIDEpO1xuICBkZWxldGUgZG9jLl9kb2NfaWRfcmV2O1xuICByZXR1cm4gZG9jO1xufVxuXG4vLyBSZWFkIGEgYmxvYiBmcm9tIHRoZSBkYXRhYmFzZSwgZW5jb2RpbmcgYXMgbmVjZXNzYXJ5XG4vLyBhbmQgdHJhbnNsYXRpbmcgZnJvbSBiYXNlNjQgaWYgdGhlIElEQiBkb2Vzbid0IHN1cHBvcnRcbi8vIG5hdGl2ZSBCbG9ic1xuZnVuY3Rpb24gcmVhZEJsb2JEYXRhKGJvZHksIHR5cGUsIGFzQmxvYiwgY2FsbGJhY2spIHtcbiAgaWYgKGFzQmxvYikge1xuICAgIGlmICghYm9keSkge1xuICAgICAgY2FsbGJhY2soY3JlYXRlQmxvYihbJyddLCB7dHlwZTogdHlwZX0pKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJykgeyAvLyB3ZSBoYXZlIGJsb2Igc3VwcG9ydFxuICAgICAgY2FsbGJhY2soYm9keSk7XG4gICAgfSBlbHNlIHsgLy8gbm8gYmxvYiBzdXBwb3J0XG4gICAgICBjYWxsYmFjayhiNjRUb0JsdWZmZXIoYm9keSwgdHlwZSkpO1xuICAgIH1cbiAgfSBlbHNlIHsgLy8gYXMgYmFzZTY0IHN0cmluZ1xuICAgIGlmICghYm9keSkge1xuICAgICAgY2FsbGJhY2soJycpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnKSB7IC8vIHdlIGhhdmUgYmxvYiBzdXBwb3J0XG4gICAgICByZWFkQXNCaW5hcnlTdHJpbmcoYm9keSwgZnVuY3Rpb24gKGJpbmFyeSkge1xuICAgICAgICBjYWxsYmFjayh0aGlzQnRvYShiaW5hcnkpKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7IC8vIG5vIGJsb2Igc3VwcG9ydFxuICAgICAgY2FsbGJhY2soYm9keSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeShkb2MsIG9wdHMsIHR4biwgY2IpIHtcbiAgdmFyIGF0dGFjaG1lbnRzID0gT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cyB8fCB7fSk7XG4gIGlmICghYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNiICYmIGNiKCk7XG4gIH1cbiAgdmFyIG51bURvbmUgPSAwO1xuXG4gIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICBpZiAoKytudW1Eb25lID09PSBhdHRhY2htZW50cy5sZW5ndGggJiYgY2IpIHtcbiAgICAgIGNiKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hBdHRhY2htZW50KGRvYywgYXR0KSB7XG4gICAgdmFyIGF0dE9iaiA9IGRvYy5fYXR0YWNobWVudHNbYXR0XTtcbiAgICB2YXIgZGlnZXN0ID0gYXR0T2JqLmRpZ2VzdDtcbiAgICB2YXIgcmVxID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSkuZ2V0KGRpZ2VzdCk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBhdHRPYmouYm9keSA9IGUudGFyZ2V0LnJlc3VsdC5ib2R5O1xuICAgICAgY2hlY2tEb25lKCk7XG4gICAgfTtcbiAgfVxuXG4gIGF0dGFjaG1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGF0dCkge1xuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICBmZXRjaEF0dGFjaG1lbnQoZG9jLCBhdHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MuX2F0dGFjaG1lbnRzW2F0dF0uc3R1YiA9IHRydWU7XG4gICAgICBjaGVja0RvbmUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBJREItc3BlY2lmaWMgcG9zdHByb2Nlc3NpbmcgbmVjZXNzYXJ5IGJlY2F1c2Vcbi8vIHdlIGRvbid0IGtub3cgd2hldGhlciB3ZSBzdG9yZWQgYSB0cnVlIEJsb2Igb3Jcbi8vIGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nLCBhbmQgaWYgaXQncyBhIEJsb2IgaXRcbi8vIG5lZWRzIHRvIGJlIHJlYWQgb3V0c2lkZSBvZiB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuZnVuY3Rpb24gcG9zdFByb2Nlc3NBdHRhY2htZW50cyhyZXN1bHRzLCBhc0Jsb2IpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMubWFwKGZ1bmN0aW9uIChyb3cpIHtcbiAgICBpZiAocm93LmRvYyAmJiByb3cuZG9jLl9hdHRhY2htZW50cykge1xuICAgICAgdmFyIGF0dE5hbWVzID0gT2JqZWN0LmtleXMocm93LmRvYy5fYXR0YWNobWVudHMpO1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGF0dE5hbWVzLm1hcChmdW5jdGlvbiAoYXR0KSB7XG4gICAgICAgIHZhciBhdHRPYmogPSByb3cuZG9jLl9hdHRhY2htZW50c1thdHRdO1xuICAgICAgICBpZiAoISgnYm9keScgaW4gYXR0T2JqKSkgeyAvLyBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYm9keSA9IGF0dE9iai5ib2R5O1xuICAgICAgICB2YXIgdHlwZSA9IGF0dE9iai5jb250ZW50X3R5cGU7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlYWRCbG9iRGF0YShib2R5LCB0eXBlLCBhc0Jsb2IsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICByb3cuZG9jLl9hdHRhY2htZW50c1thdHRdID0gJGluamVjdF9PYmplY3RfYXNzaWduKFxuICAgICAgICAgICAgICBwaWNrKGF0dE9iaiwgWydkaWdlc3QnLCAnY29udGVudF90eXBlJ10pLFxuICAgICAgICAgICAgICB7ZGF0YTogZGF0YX1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBjb21wYWN0UmV2cyhyZXZzLCBkb2NJZCwgdHhuKSB7XG5cbiAgdmFyIHBvc3NpYmx5T3JwaGFuZWREaWdlc3RzID0gW107XG4gIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICB2YXIgYXR0U3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKTtcbiAgdmFyIGF0dEFuZFNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9BTkRfU0VRX1NUT1JFKTtcbiAgdmFyIGNvdW50ID0gcmV2cy5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgIGNvdW50LS07XG4gICAgaWYgKCFjb3VudCkgeyAvLyBkb25lIHByb2Nlc3NpbmcgYWxsIHJldnNcbiAgICAgIGRlbGV0ZU9ycGhhbmVkQXR0YWNobWVudHMoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVPcnBoYW5lZEF0dGFjaG1lbnRzKCkge1xuICAgIGlmICghcG9zc2libHlPcnBoYW5lZERpZ2VzdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBvc3NpYmx5T3JwaGFuZWREaWdlc3RzLmZvckVhY2goZnVuY3Rpb24gKGRpZ2VzdCkge1xuICAgICAgdmFyIGNvdW50UmVxID0gYXR0QW5kU2VxU3RvcmUuaW5kZXgoJ2RpZ2VzdFNlcScpLmNvdW50KFxuICAgICAgICBJREJLZXlSYW5nZS5ib3VuZChcbiAgICAgICAgICBkaWdlc3QgKyAnOjonLCBkaWdlc3QgKyAnOjpcXHVmZmZmJywgZmFsc2UsIGZhbHNlKSk7XG4gICAgICBjb3VudFJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY291bnQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgICAvLyBvcnBoYW5lZFxuICAgICAgICAgIGF0dFN0b3JlLmRlbGV0ZShkaWdlc3QpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV2cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXYpIHtcbiAgICB2YXIgaW5kZXggPSBzZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKTtcbiAgICB2YXIga2V5ID0gZG9jSWQgKyBcIjo6XCIgKyByZXY7XG4gICAgaW5kZXguZ2V0S2V5KGtleSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBzZXEgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIHNlcSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrRG9uZSgpO1xuICAgICAgfVxuICAgICAgc2VxU3RvcmUuZGVsZXRlKHNlcSk7XG5cbiAgICAgIHZhciBjdXJzb3IgPSBhdHRBbmRTZXFTdG9yZS5pbmRleCgnc2VxJylcbiAgICAgICAgLm9wZW5DdXJzb3IoSURCS2V5UmFuZ2Uub25seShzZXEpKTtcblxuICAgICAgY3Vyc29yLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgY3Vyc29yID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgIHZhciBkaWdlc3QgPSBjdXJzb3IudmFsdWUuZGlnZXN0U2VxLnNwbGl0KCc6OicpWzBdO1xuICAgICAgICAgIHBvc3NpYmx5T3JwaGFuZWREaWdlc3RzLnB1c2goZGlnZXN0KTtcbiAgICAgICAgICBhdHRBbmRTZXFTdG9yZS5kZWxldGUoY3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICB9IGVsc2UgeyAvLyBkb25lXG4gICAgICAgICAgY2hlY2tEb25lKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgbW9kZSkge1xuICB0cnkge1xuICAgIHJldHVybiB7XG4gICAgICB0eG46IGlkYi50cmFuc2FjdGlvbihzdG9yZXMsIG1vZGUpXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBlcnJcbiAgICB9O1xuICB9XG59XG5cbnZhciBjaGFuZ2VzSGFuZGxlciA9IG5ldyBDaGFuZ2VzKCk7XG5cbmZ1bmN0aW9uIGlkYkJ1bGtEb2NzKGRiT3B0cywgcmVxLCBvcHRzLCBhcGksIGlkYiwgY2FsbGJhY2spIHtcbiAgdmFyIGRvY0luZm9zID0gcmVxLmRvY3M7XG4gIHZhciB0eG47XG4gIHZhciBkb2NTdG9yZTtcbiAgdmFyIGJ5U2VxU3RvcmU7XG4gIHZhciBhdHRhY2hTdG9yZTtcbiAgdmFyIGF0dGFjaEFuZFNlcVN0b3JlO1xuICB2YXIgbWV0YVN0b3JlO1xuICB2YXIgZG9jSW5mb0Vycm9yO1xuICB2YXIgbWV0YURvYztcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZG9jSW5mb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgZG9jID0gZG9jSW5mb3NbaV07XG4gICAgaWYgKGRvYy5faWQgJiYgaXNMb2NhbElkKGRvYy5faWQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZG9jID0gZG9jSW5mb3NbaV0gPSBwYXJzZURvYyhkb2MsIG9wdHMubmV3X2VkaXRzLCBkYk9wdHMpO1xuICAgIGlmIChkb2MuZXJyb3IgJiYgIWRvY0luZm9FcnJvcikge1xuICAgICAgZG9jSW5mb0Vycm9yID0gZG9jO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkb2NJbmZvRXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soZG9jSW5mb0Vycm9yKTtcbiAgfVxuXG4gIHZhciBhbGxEb2NzUHJvY2Vzc2VkID0gZmFsc2U7XG4gIHZhciBkb2NDb3VudERlbHRhID0gMDtcbiAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkoZG9jSW5mb3MubGVuZ3RoKTtcbiAgdmFyIGZldGNoZWREb2NzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG4gIHZhciBwcmVjb25kaXRpb25FcnJvcmVkID0gZmFsc2U7XG4gIHZhciBibG9iVHlwZSA9IGFwaS5fbWV0YS5ibG9iU3VwcG9ydCA/ICdibG9iJyA6ICdiYXNlNjQnO1xuXG4gIHByZXByb2Nlc3NBdHRhY2htZW50cyhkb2NJbmZvcywgYmxvYlR5cGUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgc3RhcnRUcmFuc2FjdGlvbigpO1xuICB9KTtcblxuICBmdW5jdGlvbiBzdGFydFRyYW5zYWN0aW9uKCkge1xuXG4gICAgdmFyIHN0b3JlcyA9IFtcbiAgICAgIERPQ19TVE9SRSwgQllfU0VRX1NUT1JFLFxuICAgICAgQVRUQUNIX1NUT1JFLFxuICAgICAgTE9DQUxfU1RPUkUsIEFUVEFDSF9BTkRfU0VRX1NUT1JFLFxuICAgICAgTUVUQV9TVE9SRVxuICAgIF07XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIHN0b3JlcywgJ3JlYWR3cml0ZScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB0eG4gPSB0eG5SZXN1bHQudHhuO1xuICAgIHR4bi5vbmFib3J0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHR4bi5vbnRpbWVvdXQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgdHhuLm9uY29tcGxldGUgPSBjb21wbGV0ZTtcbiAgICBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICAgIGJ5U2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgICBhdHRhY2hTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpO1xuICAgIGF0dGFjaEFuZFNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9BTkRfU0VRX1NUT1JFKTtcbiAgICBtZXRhU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSk7XG5cbiAgICBtZXRhU3RvcmUuZ2V0KE1FVEFfU1RPUkUpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBtZXRhRG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgdXBkYXRlRG9jQ291bnRJZlJlYWR5KCk7XG4gICAgfTtcblxuICAgIHZlcmlmeUF0dGFjaG1lbnRzKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcHJlY29uZGl0aW9uRXJyb3JlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuICAgICAgZmV0Y2hFeGlzdGluZ0RvY3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQWxsRG9jc1Byb2Nlc3NlZCgpIHtcbiAgICBhbGxEb2NzUHJvY2Vzc2VkID0gdHJ1ZTtcbiAgICB1cGRhdGVEb2NDb3VudElmUmVhZHkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlkYlByb2Nlc3NEb2NzKCkge1xuICAgIHByb2Nlc3NEb2NzKGRiT3B0cy5yZXZzX2xpbWl0LCBkb2NJbmZvcywgYXBpLCBmZXRjaGVkRG9jcyxcbiAgICAgICAgICAgICAgICB0eG4sIHJlc3VsdHMsIHdyaXRlRG9jLCBvcHRzLCBvbkFsbERvY3NQcm9jZXNzZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRG9jQ291bnRJZlJlYWR5KCkge1xuICAgIGlmICghbWV0YURvYyB8fCAhYWxsRG9jc1Byb2Nlc3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjYWNoaW5nIHRoZSBkb2NDb3VudCBzYXZlcyBhIGxvdCBvZiB0aW1lIGluIGFsbERvY3MoKSBhbmRcbiAgICAvLyBpbmZvKCksIHdoaWNoIGlzIHdoeSB3ZSBnbyB0byBhbGwgdGhlIHRyb3VibGUgb2YgZG9pbmcgdGhpc1xuICAgIG1ldGFEb2MuZG9jQ291bnQgKz0gZG9jQ291bnREZWx0YTtcbiAgICBtZXRhU3RvcmUucHV0KG1ldGFEb2MpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hFeGlzdGluZ0RvY3MoKSB7XG5cbiAgICBpZiAoIWRvY0luZm9zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBudW1GZXRjaGVkID0gMDtcblxuICAgIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICAgIGlmICgrK251bUZldGNoZWQgPT09IGRvY0luZm9zLmxlbmd0aCkge1xuICAgICAgICBpZGJQcm9jZXNzRG9jcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRNZXRhZGF0YShldmVudCkge1xuICAgICAgdmFyIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG5cbiAgICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgICBmZXRjaGVkRG9jcy5zZXQobWV0YWRhdGEuaWQsIG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICAgIGNoZWNrRG9uZSgpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkb2NJbmZvcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGRvY0luZm8gPSBkb2NJbmZvc1tpXTtcbiAgICAgIGlmIChkb2NJbmZvLl9pZCAmJiBpc0xvY2FsSWQoZG9jSW5mby5faWQpKSB7XG4gICAgICAgIGNoZWNrRG9uZSgpOyAvLyBza2lwIGxvY2FsIGRvY3NcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVxID0gZG9jU3RvcmUuZ2V0KGRvY0luZm8ubWV0YWRhdGEuaWQpO1xuICAgICAgcmVxLm9uc3VjY2VzcyA9IHJlYWRNZXRhZGF0YTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICBpZiAocHJlY29uZGl0aW9uRXJyb3JlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNoYW5nZXNIYW5kbGVyLm5vdGlmeShhcGkuX21ldGEubmFtZSk7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7XG4gIH1cblxuICBmdW5jdGlvbiB2ZXJpZnlBdHRhY2htZW50KGRpZ2VzdCwgY2FsbGJhY2spIHtcblxuICAgIHZhciByZXEgPSBhdHRhY2hTdG9yZS5nZXQoZGlnZXN0KTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghZS50YXJnZXQucmVzdWx0KSB7XG4gICAgICAgIHZhciBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX1NUVUIsXG4gICAgICAgICAgJ3Vua25vd24gc3R1YiBhdHRhY2htZW50IHdpdGggZGlnZXN0ICcgK1xuICAgICAgICAgIGRpZ2VzdCk7XG4gICAgICAgIGVyci5zdGF0dXMgPSA0MTI7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB2ZXJpZnlBdHRhY2htZW50cyhmaW5pc2gpIHtcblxuXG4gICAgdmFyIGRpZ2VzdHMgPSBbXTtcbiAgICBkb2NJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NJbmZvKSB7XG4gICAgICBpZiAoZG9jSW5mby5kYXRhICYmIGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgICB2YXIgYXR0ID0gZG9jSW5mby5kYXRhLl9hdHRhY2htZW50c1tmaWxlbmFtZV07XG4gICAgICAgICAgaWYgKGF0dC5zdHViKSB7XG4gICAgICAgICAgICBkaWdlc3RzLnB1c2goYXR0LmRpZ2VzdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWRpZ2VzdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmluaXNoKCk7XG4gICAgfVxuICAgIHZhciBudW1Eb25lID0gMDtcbiAgICB2YXIgZXJyO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgICAgaWYgKCsrbnVtRG9uZSA9PT0gZGlnZXN0cy5sZW5ndGgpIHtcbiAgICAgICAgZmluaXNoKGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIGRpZ2VzdHMuZm9yRWFjaChmdW5jdGlvbiAoZGlnZXN0KSB7XG4gICAgICB2ZXJpZnlBdHRhY2htZW50KGRpZ2VzdCwgZnVuY3Rpb24gKGF0dEVycikge1xuICAgICAgICBpZiAoYXR0RXJyICYmICFlcnIpIHtcbiAgICAgICAgICBlcnIgPSBhdHRFcnI7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tEb25lKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsIG5ld1JldklzRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgaXNVcGRhdGUsIGRlbHRhLCByZXN1bHRzSWR4LCBjYWxsYmFjaykge1xuXG4gICAgZG9jSW5mby5tZXRhZGF0YS53aW5uaW5nUmV2ID0gd2lubmluZ1JldiQkMTtcbiAgICBkb2NJbmZvLm1ldGFkYXRhLmRlbGV0ZWQgPSB3aW5uaW5nUmV2SXNEZWxldGVkO1xuXG4gICAgdmFyIGRvYyA9IGRvY0luZm8uZGF0YTtcbiAgICBkb2MuX2lkID0gZG9jSW5mby5tZXRhZGF0YS5pZDtcbiAgICBkb2MuX3JldiA9IGRvY0luZm8ubWV0YWRhdGEucmV2O1xuXG4gICAgaWYgKG5ld1JldklzRGVsZXRlZCkge1xuICAgICAgZG9jLl9kZWxldGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgaGFzQXR0YWNobWVudHMgPSBkb2MuX2F0dGFjaG1lbnRzICYmXG4gICAgICBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKS5sZW5ndGg7XG4gICAgaWYgKGhhc0F0dGFjaG1lbnRzKSB7XG4gICAgICByZXR1cm4gd3JpdGVBdHRhY2htZW50cyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLFxuICAgICAgICBpc1VwZGF0ZSwgcmVzdWx0c0lkeCwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGRvY0NvdW50RGVsdGEgKz0gZGVsdGE7XG4gICAgdXBkYXRlRG9jQ291bnRJZlJlYWR5KCk7XG5cbiAgICBmaW5pc2hEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCxcbiAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2hEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgIGlzVXBkYXRlLCByZXN1bHRzSWR4LCBjYWxsYmFjaykge1xuXG4gICAgdmFyIGRvYyA9IGRvY0luZm8uZGF0YTtcbiAgICB2YXIgbWV0YWRhdGEgPSBkb2NJbmZvLm1ldGFkYXRhO1xuXG4gICAgZG9jLl9kb2NfaWRfcmV2ID0gbWV0YWRhdGEuaWQgKyAnOjonICsgbWV0YWRhdGEucmV2O1xuICAgIGRlbGV0ZSBkb2MuX2lkO1xuICAgIGRlbGV0ZSBkb2MuX3JldjtcblxuICAgIGZ1bmN0aW9uIGFmdGVyUHV0RG9jKGUpIHtcbiAgICAgIHZhciByZXZzVG9EZWxldGUgPSBkb2NJbmZvLnN0ZW1tZWRSZXZzIHx8IFtdO1xuXG4gICAgICBpZiAoaXNVcGRhdGUgJiYgYXBpLmF1dG9fY29tcGFjdGlvbikge1xuICAgICAgICByZXZzVG9EZWxldGUgPSByZXZzVG9EZWxldGUuY29uY2F0KGNvbXBhY3RUcmVlKGRvY0luZm8ubWV0YWRhdGEpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldnNUb0RlbGV0ZSAmJiByZXZzVG9EZWxldGUubGVuZ3RoKSB7XG4gICAgICAgIGNvbXBhY3RSZXZzKHJldnNUb0RlbGV0ZSwgZG9jSW5mby5tZXRhZGF0YS5pZCwgdHhuKTtcbiAgICAgIH1cblxuICAgICAgbWV0YWRhdGEuc2VxID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgLy8gQ3VycmVudCBfcmV2IGlzIGNhbGN1bGF0ZWQgZnJvbSBfcmV2X3RyZWUgb24gcmVhZFxuICAgICAgLy8gZGVsZXRlIG1ldGFkYXRhLnJldjtcbiAgICAgIHZhciBtZXRhZGF0YVRvU3RvcmUgPSBlbmNvZGVNZXRhZGF0YShtZXRhZGF0YSwgd2lubmluZ1JldiQkMSxcbiAgICAgICAgd2lubmluZ1JldklzRGVsZXRlZCk7XG4gICAgICB2YXIgbWV0YURhdGFSZXEgPSBkb2NTdG9yZS5wdXQobWV0YWRhdGFUb1N0b3JlKTtcbiAgICAgIG1ldGFEYXRhUmVxLm9uc3VjY2VzcyA9IGFmdGVyUHV0TWV0YWRhdGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWZ0ZXJQdXREb2NFcnJvcihlKSB7XG4gICAgICAvLyBDb25zdHJhaW50RXJyb3IsIG5lZWQgdG8gdXBkYXRlLCBub3QgcHV0IChzZWUgIzE2MzggZm9yIGRldGFpbHMpXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIGFib3J0XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBvbmVycm9yXG4gICAgICB2YXIgaW5kZXggPSBieVNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuICAgICAgdmFyIGdldEtleVJlcSA9IGluZGV4LmdldEtleShkb2MuX2RvY19pZF9yZXYpO1xuICAgICAgZ2V0S2V5UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBwdXRSZXEgPSBieVNlcVN0b3JlLnB1dChkb2MsIGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgIHB1dFJlcS5vbnN1Y2Nlc3MgPSBhZnRlclB1dERvYztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWZ0ZXJQdXRNZXRhZGF0YSgpIHtcbiAgICAgIHJlc3VsdHNbcmVzdWx0c0lkeF0gPSB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBpZDogbWV0YWRhdGEuaWQsXG4gICAgICAgIHJldjogbWV0YWRhdGEucmV2XG4gICAgICB9O1xuICAgICAgZmV0Y2hlZERvY3Muc2V0KGRvY0luZm8ubWV0YWRhdGEuaWQsIGRvY0luZm8ubWV0YWRhdGEpO1xuICAgICAgaW5zZXJ0QXR0YWNobWVudE1hcHBpbmdzKGRvY0luZm8sIG1ldGFkYXRhLnNlcSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHZhciBwdXRSZXEgPSBieVNlcVN0b3JlLnB1dChkb2MpO1xuXG4gICAgcHV0UmVxLm9uc3VjY2VzcyA9IGFmdGVyUHV0RG9jO1xuICAgIHB1dFJlcS5vbmVycm9yID0gYWZ0ZXJQdXREb2NFcnJvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlQXR0YWNobWVudHMoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VwZGF0ZSwgcmVzdWx0c0lkeCwgY2FsbGJhY2spIHtcblxuXG4gICAgdmFyIGRvYyA9IGRvY0luZm8uZGF0YTtcblxuICAgIHZhciBudW1Eb25lID0gMDtcbiAgICB2YXIgYXR0YWNobWVudHMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcblxuICAgIGZ1bmN0aW9uIGNvbGxlY3RSZXN1bHRzKCkge1xuICAgICAgaWYgKG51bURvbmUgPT09IGF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgICBmaW5pc2hEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCxcbiAgICAgICAgICBpc1VwZGF0ZSwgcmVzdWx0c0lkeCwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF0dGFjaG1lbnRTYXZlZCgpIHtcbiAgICAgIG51bURvbmUrKztcbiAgICAgIGNvbGxlY3RSZXN1bHRzKCk7XG4gICAgfVxuXG4gICAgYXR0YWNobWVudHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgYXR0ID0gZG9jSW5mby5kYXRhLl9hdHRhY2htZW50c1trZXldO1xuICAgICAgaWYgKCFhdHQuc3R1Yikge1xuICAgICAgICB2YXIgZGF0YSA9IGF0dC5kYXRhO1xuICAgICAgICBkZWxldGUgYXR0LmRhdGE7XG4gICAgICAgIGF0dC5yZXZwb3MgPSBwYXJzZUludCh3aW5uaW5nUmV2JCQxLCAxMCk7XG4gICAgICAgIHZhciBkaWdlc3QgPSBhdHQuZGlnZXN0O1xuICAgICAgICBzYXZlQXR0YWNobWVudChkaWdlc3QsIGRhdGEsIGF0dGFjaG1lbnRTYXZlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1Eb25lKys7XG4gICAgICAgIGNvbGxlY3RSZXN1bHRzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBtYXAgc2VxcyB0byBhdHRhY2htZW50IGRpZ2VzdHMsIHdoaWNoXG4gIC8vIHdlIHdpbGwgbmVlZCBsYXRlciBkdXJpbmcgY29tcGFjdGlvblxuICBmdW5jdGlvbiBpbnNlcnRBdHRhY2htZW50TWFwcGluZ3MoZG9jSW5mbywgc2VxLCBjYWxsYmFjaykge1xuXG4gICAgdmFyIGF0dHNBZGRlZCA9IDA7XG4gICAgdmFyIGF0dHNUb0FkZCA9IE9iamVjdC5rZXlzKGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMgfHwge30pO1xuXG4gICAgaWYgKCFhdHRzVG9BZGQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgICBpZiAoKythdHRzQWRkZWQgPT09IGF0dHNUb0FkZC5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGQoYXR0KSB7XG4gICAgICB2YXIgZGlnZXN0ID0gZG9jSW5mby5kYXRhLl9hdHRhY2htZW50c1thdHRdLmRpZ2VzdDtcbiAgICAgIHZhciByZXEgPSBhdHRhY2hBbmRTZXFTdG9yZS5wdXQoe1xuICAgICAgICBzZXE6IHNlcSxcbiAgICAgICAgZGlnZXN0U2VxOiBkaWdlc3QgKyAnOjonICsgc2VxXG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9IGNoZWNrRG9uZTtcbiAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gdGhpcyBjYWxsYmFjayBpcyBmb3IgYSBjb25zdGFpbnQgZXJyb3IsIHdoaWNoIHdlIGlnbm9yZVxuICAgICAgICAvLyBiZWNhdXNlIHRoaXMgZG9jaWQvcmV2IGhhcyBhbHJlYWR5IGJlZW4gYXNzb2NpYXRlZCB3aXRoXG4gICAgICAgIC8vIHRoZSBkaWdlc3QgKGUuZy4gd2hlbiBuZXdfZWRpdHMgPT0gZmFsc2UpXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gYWJvcnRcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gb25lcnJvclxuICAgICAgICBjaGVja0RvbmUoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0c1RvQWRkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoYXR0c1RvQWRkW2ldKTsgLy8gZG8gaW4gcGFyYWxsZWxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQXR0YWNobWVudChkaWdlc3QsIGRhdGEsIGNhbGxiYWNrKSB7XG5cblxuICAgIHZhciBnZXRLZXlSZXEgPSBhdHRhY2hTdG9yZS5jb3VudChkaWdlc3QpO1xuICAgIGdldEtleVJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGNvdW50ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpOyAvLyBhbHJlYWR5IGV4aXN0c1xuICAgICAgfVxuICAgICAgdmFyIG5ld0F0dCA9IHtcbiAgICAgICAgZGlnZXN0OiBkaWdlc3QsXG4gICAgICAgIGJvZHk6IGRhdGFcbiAgICAgIH07XG4gICAgICB2YXIgcHV0UmVxID0gYXR0YWNoU3RvcmUucHV0KG5ld0F0dCk7XG4gICAgICBwdXRSZXEub25zdWNjZXNzID0gY2FsbGJhY2s7XG4gICAgfTtcbiAgfVxufVxuXG4vLyBBYnN0cmFjdGlvbiBvdmVyIElEQkN1cnNvciBhbmQgZ2V0QWxsKCkvZ2V0QWxsS2V5cygpIHRoYXQgYWxsb3dzIHVzIHRvIGJhdGNoIG91ciBvcGVyYXRpb25zXG4vLyB3aGlsZSBmYWxsaW5nIGJhY2sgdG8gYSBub3JtYWwgSURCQ3Vyc29yIG9wZXJhdGlvbiBvbiBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgZ2V0QWxsKCkgb3Jcbi8vIGdldEFsbEtleXMoKS4gVGhpcyBhbGxvd3MgZm9yIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gdGhhbiBqdXN0IHN0cmFpZ2h0LXVwIGN1cnNvcnMsIGJlY2F1c2Vcbi8vIHdlJ3JlIG5vdCBwcm9jZXNzaW5nIGVhY2ggZG9jdW1lbnQgb25lLWF0LWEtdGltZS5cbmZ1bmN0aW9uIHJ1bkJhdGNoZWRDdXJzb3Iob2JqZWN0U3RvcmUsIGtleVJhbmdlLCBkZXNjZW5kaW5nLCBiYXRjaFNpemUsIG9uQmF0Y2gpIHtcblxuICBpZiAoYmF0Y2hTaXplID09PSAtMSkge1xuICAgIGJhdGNoU2l6ZSA9IDEwMDA7XG4gIH1cblxuICAvLyBCYWlsIG91dCBvZiBnZXRBbGwoKS9nZXRBbGxLZXlzKCkgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcbiAgLy8gMSkgZWl0aGVyIG1ldGhvZCBpcyB1bnN1cHBvcnRlZCAtIHdlIG5lZWQgYm90aFxuICAvLyAyKSBiYXRjaFNpemUgaXMgMSAobWlnaHQgYXMgd2VsbCB1c2UgSURCQ3Vyc29yKVxuICAvLyAzKSBkZXNjZW5kaW5nIOKAkyBubyByZWFsIHdheSB0byBkbyB0aGlzIHZpYSBnZXRBbGwoKS9nZXRBbGxLZXlzKClcblxuICB2YXIgdXNlR2V0QWxsID0gdHlwZW9mIG9iamVjdFN0b3JlLmdldEFsbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3RTdG9yZS5nZXRBbGxLZXlzID09PSAnZnVuY3Rpb24nICYmXG4gICAgYmF0Y2hTaXplID4gMSAmJiAhZGVzY2VuZGluZztcblxuICB2YXIga2V5c0JhdGNoO1xuICB2YXIgdmFsdWVzQmF0Y2g7XG4gIHZhciBwc2V1ZG9DdXJzb3I7XG5cbiAgZnVuY3Rpb24gb25HZXRBbGwoZSkge1xuICAgIHZhbHVlc0JhdGNoID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmIChrZXlzQmF0Y2gpIHtcbiAgICAgIG9uQmF0Y2goa2V5c0JhdGNoLCB2YWx1ZXNCYXRjaCwgcHNldWRvQ3Vyc29yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkdldEFsbEtleXMoZSkge1xuICAgIGtleXNCYXRjaCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAodmFsdWVzQmF0Y2gpIHtcbiAgICAgIG9uQmF0Y2goa2V5c0JhdGNoLCB2YWx1ZXNCYXRjaCwgcHNldWRvQ3Vyc29yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb250aW51ZVBzZXVkb0N1cnNvcigpIHtcbiAgICBpZiAoIWtleXNCYXRjaC5sZW5ndGgpIHsgLy8gbm8gbW9yZSByZXN1bHRzXG4gICAgICByZXR1cm4gb25CYXRjaCgpO1xuICAgIH1cbiAgICAvLyBmZXRjaCBuZXh0IGJhdGNoLCBleGNsdXNpdmUgc3RhcnRcbiAgICB2YXIgbGFzdEtleSA9IGtleXNCYXRjaFtrZXlzQmF0Y2gubGVuZ3RoIC0gMV07XG4gICAgdmFyIG5ld0tleVJhbmdlO1xuICAgIGlmIChrZXlSYW5nZSAmJiBrZXlSYW5nZS51cHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3S2V5UmFuZ2UgPSBJREJLZXlSYW5nZS5ib3VuZChsYXN0S2V5LCBrZXlSYW5nZS51cHBlcixcbiAgICAgICAgICB0cnVlLCBrZXlSYW5nZS51cHBlck9wZW4pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5uYW1lID09PSBcIkRhdGFFcnJvclwiICYmIGUuY29kZSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBvbkJhdGNoKCk7IC8vIHdlJ3JlIGRvbmUsIHN0YXJ0a2V5IGFuZCBlbmRrZXkgYXJlIGVxdWFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV3S2V5UmFuZ2UgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGxhc3RLZXksIHRydWUpO1xuICAgIH1cbiAgICBrZXlSYW5nZSA9IG5ld0tleVJhbmdlO1xuICAgIGtleXNCYXRjaCA9IG51bGw7XG4gICAgdmFsdWVzQmF0Y2ggPSBudWxsO1xuICAgIG9iamVjdFN0b3JlLmdldEFsbChrZXlSYW5nZSwgYmF0Y2hTaXplKS5vbnN1Y2Nlc3MgPSBvbkdldEFsbDtcbiAgICBvYmplY3RTdG9yZS5nZXRBbGxLZXlzKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ3Vyc29yKGUpIHtcbiAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmICghY3Vyc29yKSB7IC8vIGRvbmVcbiAgICAgIHJldHVybiBvbkJhdGNoKCk7XG4gICAgfVxuICAgIC8vIHJlZ3VsYXIgSURCQ3Vyc29yIGFjdHMgbGlrZSBhIGJhdGNoIHdoZXJlIGJhdGNoIHNpemUgaXMgYWx3YXlzIDFcbiAgICBvbkJhdGNoKFtjdXJzb3Iua2V5XSwgW2N1cnNvci52YWx1ZV0sIGN1cnNvcik7XG4gIH1cblxuICBpZiAodXNlR2V0QWxsKSB7XG4gICAgcHNldWRvQ3Vyc29yID0ge1wiY29udGludWVcIjogY29udGludWVQc2V1ZG9DdXJzb3J9O1xuICAgIG9iamVjdFN0b3JlLmdldEFsbChrZXlSYW5nZSwgYmF0Y2hTaXplKS5vbnN1Y2Nlc3MgPSBvbkdldEFsbDtcbiAgICBvYmplY3RTdG9yZS5nZXRBbGxLZXlzKGtleVJhbmdlLCBiYXRjaFNpemUpLm9uc3VjY2VzcyA9IG9uR2V0QWxsS2V5cztcbiAgfSBlbHNlIGlmIChkZXNjZW5kaW5nKSB7XG4gICAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSwgJ3ByZXYnKS5vbnN1Y2Nlc3MgPSBvbkN1cnNvcjtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKS5vbnN1Y2Nlc3MgPSBvbkN1cnNvcjtcbiAgfVxufVxuXG4vLyBzaW1wbGUgc2hpbSBmb3Igb2JqZWN0U3RvcmUuZ2V0QWxsKCksIGZhbGxpbmcgYmFjayB0byBJREJDdXJzb3JcbmZ1bmN0aW9uIGdldEFsbChvYmplY3RTdG9yZSwga2V5UmFuZ2UsIG9uU3VjY2Vzcykge1xuICBpZiAodHlwZW9mIG9iamVjdFN0b3JlLmdldEFsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHVzZSBuYXRpdmUgZ2V0QWxsXG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlKS5vbnN1Y2Nlc3MgPSBvblN1Y2Nlc3M7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGZhbGwgYmFjayB0byBjdXJzb3JzXG4gIHZhciB2YWx1ZXMgPSBbXTtcblxuICBmdW5jdGlvbiBvbkN1cnNvcihlKSB7XG4gICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAoY3Vyc29yKSB7XG4gICAgICB2YWx1ZXMucHVzaChjdXJzb3IudmFsdWUpO1xuICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uU3VjY2Vzcyh7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHJlc3VsdDogdmFsdWVzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9iamVjdFN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xufVxuXG5mdW5jdGlvbiBhbGxEb2NzS2V5cyhrZXlzLCBkb2NTdG9yZSwgb25CYXRjaCkge1xuICAvLyBJdCdzIG5vdCBndWFyYW50ZWQgdG8gYmUgcmV0dXJuZWQgaW4gcmlnaHQgb3JkZXIgIFxuICB2YXIgdmFsdWVzQmF0Y2ggPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpO1xuICB2YXIgY291bnQgPSAwO1xuICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSwgaW5kZXgpIHtcbiAgICBkb2NTdG9yZS5nZXQoa2V5KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQucmVzdWx0KSB7XG4gICAgICAgIHZhbHVlc0JhdGNoW2luZGV4XSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXNCYXRjaFtpbmRleF0gPSB7a2V5OiBrZXksIGVycm9yOiAnbm90X2ZvdW5kJ307XG4gICAgICB9XG4gICAgICBjb3VudCsrO1xuICAgICAgaWYgKGNvdW50ID09PSBrZXlzLmxlbmd0aCkge1xuICAgICAgICBvbkJhdGNoKGtleXMsIHZhbHVlc0JhdGNoLCB7fSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVJhbmdlKHN0YXJ0LCBlbmQsIGluY2x1c2l2ZUVuZCwga2V5LCBkZXNjZW5kaW5nKSB7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmJvdW5kKGVuZCwgc3RhcnQsICFpbmNsdXNpdmVFbmQsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5ib3VuZChzdGFydCwgZW5kLCBmYWxzZSwgIWluY2x1c2l2ZUVuZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLnVwcGVyQm91bmQoc3RhcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmxvd2VyQm91bmQoc3RhcnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kKSB7XG4gICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChlbmQsICFpbmNsdXNpdmVFbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLnVwcGVyQm91bmQoZW5kLCAhaW5jbHVzaXZlRW5kKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleSkge1xuICAgICAgcmV0dXJuIElEQktleVJhbmdlLm9ubHkoa2V5KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaWRiQWxsRG9jcyhvcHRzLCBpZGIsIGNhbGxiYWNrKSB7XG4gIHZhciBzdGFydCA9ICdzdGFydGtleScgaW4gb3B0cyA/IG9wdHMuc3RhcnRrZXkgOiBmYWxzZTtcbiAgdmFyIGVuZCA9ICdlbmRrZXknIGluIG9wdHMgPyBvcHRzLmVuZGtleSA6IGZhbHNlO1xuICB2YXIga2V5ID0gJ2tleScgaW4gb3B0cyA/IG9wdHMua2V5IDogZmFsc2U7XG4gIHZhciBrZXlzID0gJ2tleXMnIGluIG9wdHMgPyBvcHRzLmtleXMgOiBmYWxzZTsgXG4gIHZhciBza2lwID0gb3B0cy5za2lwIHx8IDA7XG4gIHZhciBsaW1pdCA9IHR5cGVvZiBvcHRzLmxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMubGltaXQgOiAtMTtcbiAgdmFyIGluY2x1c2l2ZUVuZCA9IG9wdHMuaW5jbHVzaXZlX2VuZCAhPT0gZmFsc2U7XG5cbiAgdmFyIGtleVJhbmdlIDsgXG4gIHZhciBrZXlSYW5nZUVycm9yO1xuICBpZiAoIWtleXMpIHtcbiAgICBrZXlSYW5nZSA9IGNyZWF0ZUtleVJhbmdlKHN0YXJ0LCBlbmQsIGluY2x1c2l2ZUVuZCwga2V5LCBvcHRzLmRlc2NlbmRpbmcpO1xuICAgIGtleVJhbmdlRXJyb3IgPSBrZXlSYW5nZSAmJiBrZXlSYW5nZS5lcnJvcjtcbiAgICBpZiAoa2V5UmFuZ2VFcnJvciAmJiBcbiAgICAgICEoa2V5UmFuZ2VFcnJvci5uYW1lID09PSBcIkRhdGFFcnJvclwiICYmIGtleVJhbmdlRXJyb3IuY29kZSA9PT0gMCkpIHtcbiAgICAgIC8vIERhdGFFcnJvciB3aXRoIGVycm9yIGNvZGUgMCBpbmRpY2F0ZXMgc3RhcnQgaXMgbGVzcyB0aGFuIGVuZCwgc29cbiAgICAgIC8vIGNhbiBqdXN0IGRvIGFuIGVtcHR5IHF1ZXJ5LiBFbHNlIG5lZWQgdG8gdGhyb3dcbiAgICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihJREJfRVJST1IsXG4gICAgICAgIGtleVJhbmdlRXJyb3IubmFtZSwga2V5UmFuZ2VFcnJvci5tZXNzYWdlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0b3JlcyA9IFtET0NfU1RPUkUsIEJZX1NFUV9TVE9SRSwgTUVUQV9TVE9SRV07XG5cbiAgaWYgKG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICBzdG9yZXMucHVzaChBVFRBQ0hfU1RPUkUpO1xuICB9XG4gIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBzdG9yZXMsICdyZWFkb25seScpO1xuICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gIH1cbiAgdmFyIHR4biA9IHR4blJlc3VsdC50eG47XG4gIHR4bi5vbmNvbXBsZXRlID0gb25UeG5Db21wbGV0ZTtcbiAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICB2YXIgc2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgdmFyIG1ldGFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKTtcbiAgdmFyIGRvY0lkUmV2SW5kZXggPSBzZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKTtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIGRvY0NvdW50O1xuICB2YXIgdXBkYXRlU2VxO1xuXG4gIG1ldGFTdG9yZS5nZXQoTUVUQV9TVE9SRSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICBkb2NDb3VudCA9IGUudGFyZ2V0LnJlc3VsdC5kb2NDb3VudDtcbiAgfTtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgIGdldE1heFVwZGF0ZVNlcShzZXFTdG9yZSwgZnVuY3Rpb24gKGUpIHsgXG4gICAgICBpZiAoZS50YXJnZXQucmVzdWx0ICYmIGUudGFyZ2V0LnJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVwZGF0ZVNlcSA9IGUudGFyZ2V0LnJlc3VsdFswXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1heFVwZGF0ZVNlcShvYmplY3RTdG9yZSwgb25TdWNjZXNzKSB7XG4gICAgZnVuY3Rpb24gb25DdXJzb3IoZSkge1xuICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIHZhciBtYXhLZXkgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoY3Vyc29yICYmIGN1cnNvci5rZXkpIHtcbiAgICAgICAgbWF4S2V5ID0gY3Vyc29yLmtleTtcbiAgICAgIH0gXG4gICAgICByZXR1cm4gb25TdWNjZXNzKHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgcmVzdWx0OiBbbWF4S2V5XVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcihudWxsLCAncHJldicpLm9uc3VjY2VzcyA9IG9uQ3Vyc29yO1xuICB9XG5cbiAgLy8gaWYgdGhlIHVzZXIgc3BlY2lmaWVzIGluY2x1ZGVfZG9jcz10cnVlLCB0aGVuIHdlIGRvbid0XG4gIC8vIHdhbnQgdG8gYmxvY2sgdGhlIG1haW4gY3Vyc29yIHdoaWxlIHdlJ3JlIGZldGNoaW5nIHRoZSBkb2NcbiAgZnVuY3Rpb24gZmV0Y2hEb2NBc3luY2hyb25vdXNseShtZXRhZGF0YSwgcm93LCB3aW5uaW5nUmV2JCQxKSB7XG4gICAgdmFyIGtleSA9IG1ldGFkYXRhLmlkICsgXCI6OlwiICsgd2lubmluZ1JldiQkMTtcbiAgICBkb2NJZFJldkluZGV4LmdldChrZXkpLm9uc3VjY2VzcyA9ICBmdW5jdGlvbiBvbkdldERvYyhlKSB7XG4gICAgICByb3cuZG9jID0gZGVjb2RlRG9jKGUudGFyZ2V0LnJlc3VsdCkgfHwge307XG4gICAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgICAgdmFyIGNvbmZsaWN0cyA9IGNvbGxlY3RDb25mbGljdHMobWV0YWRhdGEpO1xuICAgICAgICBpZiAoY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgICAgIHJvdy5kb2MuX2NvbmZsaWN0cyA9IGNvbmZsaWN0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmV0Y2hBdHRhY2htZW50c0lmTmVjZXNzYXJ5KHJvdy5kb2MsIG9wdHMsIHR4bik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFsbERvY3NJbm5lcih3aW5uaW5nUmV2JCQxLCBtZXRhZGF0YSkge1xuICAgIHZhciByb3cgPSB7XG4gICAgICBpZDogbWV0YWRhdGEuaWQsXG4gICAgICBrZXk6IG1ldGFkYXRhLmlkLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgcmV2OiB3aW5uaW5nUmV2JCQxXG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgZGVsZXRlZCA9IG1ldGFkYXRhLmRlbGV0ZWQ7XG4gICAgaWYgKGRlbGV0ZWQpIHtcbiAgICAgIGlmIChrZXlzKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChyb3cpO1xuICAgICAgICAvLyBkZWxldGVkIGRvY3MgYXJlIG9rYXkgd2l0aCBcImtleXNcIiByZXF1ZXN0c1xuICAgICAgICByb3cudmFsdWUuZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIHJvdy5kb2MgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2tpcC0tIDw9IDApIHtcbiAgICAgIHJlc3VsdHMucHVzaChyb3cpO1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIGZldGNoRG9jQXN5bmNocm9ub3VzbHkobWV0YWRhdGEsIHJvdywgd2lubmluZ1JldiQkMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoKGJhdGNoVmFsdWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJhdGNoVmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IGxpbWl0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGJhdGNoVmFsdWUgPSBiYXRjaFZhbHVlc1tpXTtcbiAgICAgIGlmIChiYXRjaFZhbHVlLmVycm9yICYmIGtleXMpIHtcbiAgICAgICAgLy8ga2V5IHdhcyBub3QgZm91bmQgd2l0aCBcImtleXNcIiByZXF1ZXN0c1xuICAgICAgICByZXN1bHRzLnB1c2goYmF0Y2hWYWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoYmF0Y2hWYWx1ZSk7XG4gICAgICB2YXIgd2lubmluZ1JldiQkMSA9IG1ldGFkYXRhLndpbm5pbmdSZXY7XG4gICAgICBhbGxEb2NzSW5uZXIod2lubmluZ1JldiQkMSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQmF0Y2goYmF0Y2hLZXlzLCBiYXRjaFZhbHVlcywgY3Vyc29yKSB7XG4gICAgaWYgKCFjdXJzb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzc0JhdGNoKGJhdGNoVmFsdWVzKTtcbiAgICBpZiAocmVzdWx0cy5sZW5ndGggPCBsaW1pdCkge1xuICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25HZXRBbGwoZSkge1xuICAgIHZhciB2YWx1ZXMgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgdmFsdWVzID0gdmFsdWVzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcHJvY2Vzc0JhdGNoKHZhbHVlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBvblJlc3VsdHNSZWFkeSgpIHtcbiAgICB2YXIgcmV0dXJuVmFsID0ge1xuICAgICAgdG90YWxfcm93czogZG9jQ291bnQsXG4gICAgICBvZmZzZXQ6IG9wdHMuc2tpcCxcbiAgICAgIHJvd3M6IHJlc3VsdHNcbiAgICB9O1xuICAgIFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEgJiYgdXBkYXRlU2VxICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblZhbC51cGRhdGVfc2VxID0gdXBkYXRlU2VxO1xuICAgIH1cbiAgICBjYWxsYmFjayhudWxsLCByZXR1cm5WYWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UeG5Db21wbGV0ZSgpIHtcbiAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgcG9zdFByb2Nlc3NBdHRhY2htZW50cyhyZXN1bHRzLCBvcHRzLmJpbmFyeSkudGhlbihvblJlc3VsdHNSZWFkeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uUmVzdWx0c1JlYWR5KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSByZXF1ZXN0cyBpZiBzdGFydCA+IGVuZCBvciBsaW1pdCA9PT0gMFxuICBpZiAoa2V5UmFuZ2VFcnJvciB8fCBsaW1pdCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoa2V5cykge1xuICAgIHJldHVybiBhbGxEb2NzS2V5cyhvcHRzLmtleXMsIGRvY1N0b3JlLCBvbkJhdGNoKTtcbiAgfVxuICBpZiAobGltaXQgPT09IC0xKSB7IC8vIGp1c3QgZmV0Y2ggZXZlcnl0aGluZ1xuICAgIHJldHVybiBnZXRBbGwoZG9jU3RvcmUsIGtleVJhbmdlLCBvbkdldEFsbCk7XG4gIH1cbiAgLy8gZWxzZSBkbyBhIGN1cnNvclxuICAvLyBjaG9vc2UgYSBiYXRjaCBzaXplIGJhc2VkIG9uIHRoZSBza2lwLCBzaW5jZSB3ZSdsbCBuZWVkIHRvIHNraXAgdGhhdCBtYW55XG4gIHJ1bkJhdGNoZWRDdXJzb3IoZG9jU3RvcmUsIGtleVJhbmdlLCBvcHRzLmRlc2NlbmRpbmcsIGxpbWl0ICsgc2tpcCwgb25CYXRjaCk7XG59XG5cbi8vXG4vLyBCbG9icyBhcmUgbm90IHN1cHBvcnRlZCBpbiBhbGwgdmVyc2lvbnMgb2YgSW5kZXhlZERCLCBub3RhYmx5XG4vLyBDaHJvbWUgPDM3IGFuZCBBbmRyb2lkIDw1LiBJbiB0aG9zZSB2ZXJzaW9ucywgc3RvcmluZyBhIGJsb2Igd2lsbCB0aHJvdy5cbi8vXG4vLyBWYXJpb3VzIG90aGVyIGJsb2IgYnVncyBleGlzdCBpbiBDaHJvbWUgdjM3LTQyIChpbmNsdXNpdmUpLlxuLy8gRGV0ZWN0aW5nIHRoZW0gaXMgZXhwZW5zaXZlIGFuZCBjb25mdXNpbmcgdG8gdXNlcnMsIGFuZCBDaHJvbWUgMzctNDJcbi8vIGlzIGF0IHZlcnkgbG93IHVzYWdlIHdvcmxkd2lkZSwgc28gd2UgZG8gYSBoYWNreSB1c2VyQWdlbnQgY2hlY2sgaW5zdGVhZC5cbi8vXG4vLyBjb250ZW50LXR5cGUgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDA4MTIwXG4vLyA0MDQgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3OTE2XG4vLyBGaWxlUmVhZGVyIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0NzgzNlxuLy9cbmZ1bmN0aW9uIGNoZWNrQmxvYlN1cHBvcnQodHhuKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHZhciBibG9iJCQxID0gY3JlYXRlQmxvYihbJyddKTtcbiAgICB2YXIgcmVxID0gdHhuLm9iamVjdFN0b3JlKERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUpLnB1dChibG9iJCQxLCAna2V5Jyk7XG5cbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG1hdGNoZWRDaHJvbWUgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICAgIHZhciBtYXRjaGVkRWRnZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8vKTtcbiAgICAgIC8vIE1TIEVkZ2UgcHJldGVuZHMgdG8gYmUgQ2hyb21lIDQyOlxuICAgICAgLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDg2OTMwMSUyOHY9dnMuODUlMjkuYXNweFxuICAgICAgcmVzb2x2ZShtYXRjaGVkRWRnZSB8fCAhbWF0Y2hlZENocm9tZSB8fFxuICAgICAgICBwYXJzZUludChtYXRjaGVkQ2hyb21lWzFdLCAxMCkgPj0gNDMpO1xuICAgIH07XG5cbiAgICByZXEub25lcnJvciA9IHR4bi5vbmFib3J0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIElmIHRoZSB0cmFuc2FjdGlvbiBhYm9ydHMgbm93IGl0cyBkdWUgdG8gbm90IGJlaW5nIGFibGUgdG9cbiAgICAgIC8vIHdyaXRlIHRvIHRoZSBkYXRhYmFzZSwgbGlrZWx5IGR1ZSB0byB0aGUgZGlzayBiZWluZyBmdWxsXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfTtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gZXJyb3IsIHNvIGFzc3VtZSB1bnN1cHBvcnRlZFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY291bnREb2NzKHR4biwgY2IpIHtcbiAgdmFyIGluZGV4ID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSkuaW5kZXgoJ2RlbGV0ZWRPckxvY2FsJyk7XG4gIGluZGV4LmNvdW50KElEQktleVJhbmdlLm9ubHkoJzAnKSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICBjYihlLnRhcmdldC5yZXN1bHQpO1xuICB9O1xufVxuXG4vLyBUaGlzIHRhc2sgcXVldWUgZW5zdXJlcyB0aGF0IElEQiBvcGVuIGNhbGxzIGFyZSBkb25lIGluIHRoZWlyIG93biB0aWNrXG5cbnZhciBydW5uaW5nID0gZmFsc2U7XG52YXIgcXVldWUgPSBbXTtcblxuZnVuY3Rpb24gdHJ5Q29kZShmdW4sIGVyciwgcmVzLCBQb3VjaERCKSB7XG4gIHRyeSB7XG4gICAgZnVuKGVyciwgcmVzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gU2hvdWxkbid0IGhhcHBlbiwgYnV0IGluIHNvbWUgb2RkIGNhc2VzXG4gICAgLy8gSW5kZXhlZERCIGltcGxlbWVudGF0aW9ucyBtaWdodCB0aHJvdyBhIHN5bmNcbiAgICAvLyBlcnJvciwgaW4gd2hpY2ggY2FzZSB0aGlzIHdpbGwgYXQgbGVhc3QgbG9nIGl0LlxuICAgIFBvdWNoREIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5TmV4dCgpIHtcbiAgaWYgKHJ1bm5pbmcgfHwgIXF1ZXVlLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuICBydW5uaW5nID0gdHJ1ZTtcbiAgcXVldWUuc2hpZnQoKSgpO1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlVGFzayhhY3Rpb24sIGNhbGxiYWNrLCBQb3VjaERCKSB7XG4gIHF1ZXVlLnB1c2goZnVuY3Rpb24gcnVuQWN0aW9uKCkge1xuICAgIGFjdGlvbihmdW5jdGlvbiBydW5DYWxsYmFjayhlcnIsIHJlcykge1xuICAgICAgdHJ5Q29kZShjYWxsYmFjaywgZXJyLCByZXMsIFBvdWNoREIpO1xuICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uIHJ1bk5leHQoKSB7XG4gICAgICAgIGFwcGx5TmV4dChQb3VjaERCKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgYXBwbHlOZXh0KCk7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZXMob3B0cywgYXBpLCBkYk5hbWUsIGlkYikge1xuICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgaWYgKG9wdHMuY29udGludW91cykge1xuICAgIHZhciBpZCA9IGRiTmFtZSArICc6JyArIHV1aWQoKTtcbiAgICBjaGFuZ2VzSGFuZGxlci5hZGRMaXN0ZW5lcihkYk5hbWUsIGlkLCBhcGksIG9wdHMpO1xuICAgIGNoYW5nZXNIYW5kbGVyLm5vdGlmeShkYk5hbWUpO1xuICAgIHJldHVybiB7XG4gICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hhbmdlc0hhbmRsZXIucmVtb3ZlTGlzdGVuZXIoZGJOYW1lLCBpZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHZhciBkb2NJZHMgPSBvcHRzLmRvY19pZHMgJiYgbmV3IEV4cG9ydGVkU2V0KG9wdHMuZG9jX2lkcyk7XG5cbiAgb3B0cy5zaW5jZSA9IG9wdHMuc2luY2UgfHwgMDtcbiAgdmFyIGxhc3RTZXEgPSBvcHRzLnNpbmNlO1xuXG4gIHZhciBsaW1pdCA9ICdsaW1pdCcgaW4gb3B0cyA/IG9wdHMubGltaXQgOiAtMTtcbiAgaWYgKGxpbWl0ID09PSAwKSB7XG4gICAgbGltaXQgPSAxOyAvLyBwZXIgQ291Y2hEQiBfY2hhbmdlcyBzcGVjXG4gIH1cblxuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgbnVtUmVzdWx0cyA9IDA7XG4gIHZhciBmaWx0ZXIgPSBmaWx0ZXJDaGFuZ2Uob3B0cyk7XG4gIHZhciBkb2NJZHNUb01ldGFkYXRhID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgdmFyIHR4bjtcbiAgdmFyIGJ5U2VxU3RvcmU7XG4gIHZhciBkb2NTdG9yZTtcbiAgdmFyIGRvY0lkUmV2SW5kZXg7XG5cbiAgZnVuY3Rpb24gb25CYXRjaChiYXRjaEtleXMsIGJhdGNoVmFsdWVzLCBjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvciB8fCAhYmF0Y2hLZXlzLmxlbmd0aCkgeyAvLyBkb25lXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdpbm5pbmdEb2NzID0gbmV3IEFycmF5KGJhdGNoS2V5cy5sZW5ndGgpO1xuICAgIHZhciBtZXRhZGF0YXMgPSBuZXcgQXJyYXkoYmF0Y2hLZXlzLmxlbmd0aCk7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWV0YWRhdGFBbmRXaW5uaW5nRG9jKG1ldGFkYXRhLCB3aW5uaW5nRG9jKSB7XG4gICAgICB2YXIgY2hhbmdlID0gb3B0cy5wcm9jZXNzQ2hhbmdlKHdpbm5pbmdEb2MsIG1ldGFkYXRhLCBvcHRzKTtcbiAgICAgIGxhc3RTZXEgPSBjaGFuZ2Uuc2VxID0gbWV0YWRhdGEuc2VxO1xuXG4gICAgICB2YXIgZmlsdGVyZWQgPSBmaWx0ZXIoY2hhbmdlKTtcbiAgICAgIGlmICh0eXBlb2YgZmlsdGVyZWQgPT09ICdvYmplY3QnKSB7IC8vIGFueXRoaW5nIGJ1dCB0cnVlL2ZhbHNlIGluZGljYXRlcyBlcnJvclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZmlsdGVyZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZpbHRlcmVkKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIG51bVJlc3VsdHMrKztcbiAgICAgIGlmIChvcHRzLnJldHVybl9kb2NzKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChjaGFuZ2UpO1xuICAgICAgfVxuICAgICAgLy8gcHJvY2VzcyB0aGUgYXR0YWNobWVudCBpbW1lZGlhdGVseVxuICAgICAgLy8gZm9yIHRoZSBiZW5lZml0IG9mIGxpdmUgbGlzdGVuZXJzXG4gICAgICBpZiAob3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3Nhcnkod2lubmluZ0RvYywgb3B0cywgdHhuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwb3N0UHJvY2Vzc0F0dGFjaG1lbnRzKFtjaGFuZ2VdLCBvcHRzLmJpbmFyeSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2hhbmdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkJhdGNoRG9uZSgpIHtcbiAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHdpbm5pbmdEb2NzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChudW1SZXN1bHRzID09PSBsaW1pdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aW5uaW5nRG9jID0gd2lubmluZ0RvY3NbaV07XG4gICAgICAgIGlmICghd2lubmluZ0RvYykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IG1ldGFkYXRhc1tpXTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChwcm9jZXNzTWV0YWRhdGFBbmRXaW5uaW5nRG9jKG1ldGFkYXRhLCB3aW5uaW5nRG9jKSk7XG4gICAgICB9XG5cbiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjaGFuZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGNoYW5nZXNbaV0pIHtcbiAgICAgICAgICAgIG9wdHMub25DaGFuZ2UoY2hhbmdlc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChvcHRzLmNvbXBsZXRlKTtcblxuICAgICAgaWYgKG51bVJlc3VsdHMgIT09IGxpbWl0KSB7XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZldGNoIGFsbCBtZXRhZGF0YXMvd2lubmluZ2RvY3MgZnJvbSB0aGlzIGJhdGNoIGluIHBhcmFsbGVsLCB0aGVuIHByb2Nlc3NcbiAgICAvLyB0aGVtIGFsbCBvbmx5IG9uY2UgYWxsIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkLiBUaGlzIGlzIGRvbmUgaW4gcGFyYWxsZWxcbiAgICAvLyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZG9pbmcgaXQgb25lLWF0LWEtdGltZS5cbiAgICB2YXIgbnVtRG9uZSA9IDA7XG4gICAgYmF0Y2hWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgIHZhciBkb2MgPSBkZWNvZGVEb2ModmFsdWUpO1xuICAgICAgdmFyIHNlcSA9IGJhdGNoS2V5c1tpXTtcbiAgICAgIGZldGNoV2lubmluZ0RvY0FuZE1ldGFkYXRhKGRvYywgc2VxLCBmdW5jdGlvbiAobWV0YWRhdGEsIHdpbm5pbmdEb2MpIHtcbiAgICAgICAgbWV0YWRhdGFzW2ldID0gbWV0YWRhdGE7XG4gICAgICAgIHdpbm5pbmdEb2NzW2ldID0gd2lubmluZ0RvYztcbiAgICAgICAgaWYgKCsrbnVtRG9uZSA9PT0gYmF0Y2hLZXlzLmxlbmd0aCkge1xuICAgICAgICAgIG9uQmF0Y2hEb25lKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25HZXRNZXRhZGF0YShkb2MsIHNlcSwgbWV0YWRhdGEsIGNiKSB7XG4gICAgaWYgKG1ldGFkYXRhLnNlcSAhPT0gc2VxKSB7XG4gICAgICAvLyBzb21lIG90aGVyIHNlcSBpcyBsYXRlclxuICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLndpbm5pbmdSZXYgPT09IGRvYy5fcmV2KSB7XG4gICAgICAvLyB0aGlzIGlzIHRoZSB3aW5uaW5nIGRvY1xuICAgICAgcmV0dXJuIGNiKG1ldGFkYXRhLCBkb2MpO1xuICAgIH1cblxuICAgIC8vIGZldGNoIHdpbm5pbmcgZG9jIGluIHNlcGFyYXRlIHJlcXVlc3RcbiAgICB2YXIgZG9jSWRSZXYgPSBkb2MuX2lkICsgJzo6JyArIG1ldGFkYXRhLndpbm5pbmdSZXY7XG4gICAgdmFyIHJlcSA9IGRvY0lkUmV2SW5kZXguZ2V0KGRvY0lkUmV2KTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNiKG1ldGFkYXRhLCBkZWNvZGVEb2MoZS50YXJnZXQucmVzdWx0KSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoV2lubmluZ0RvY0FuZE1ldGFkYXRhKGRvYywgc2VxLCBjYikge1xuICAgIGlmIChkb2NJZHMgJiYgIWRvY0lkcy5oYXMoZG9jLl9pZCkpIHtcbiAgICAgIHJldHVybiBjYigpO1xuICAgIH1cblxuICAgIHZhciBtZXRhZGF0YSA9IGRvY0lkc1RvTWV0YWRhdGEuZ2V0KGRvYy5faWQpO1xuICAgIGlmIChtZXRhZGF0YSkgeyAvLyBjYWNoZWRcbiAgICAgIHJldHVybiBvbkdldE1ldGFkYXRhKGRvYywgc2VxLCBtZXRhZGF0YSwgY2IpO1xuICAgIH1cbiAgICAvLyBtZXRhZGF0YSBub3QgY2FjaGVkLCBoYXZlIHRvIGdvIGZldGNoIGl0XG4gICAgZG9jU3RvcmUuZ2V0KGRvYy5faWQpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICBkb2NJZHNUb01ldGFkYXRhLnNldChkb2MuX2lkLCBtZXRhZGF0YSk7XG4gICAgICBvbkdldE1ldGFkYXRhKGRvYywgc2VxLCBtZXRhZGF0YSwgY2IpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgb3B0cy5jb21wbGV0ZShudWxsLCB7XG4gICAgICByZXN1bHRzOiByZXN1bHRzLFxuICAgICAgbGFzdF9zZXE6IGxhc3RTZXFcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHhuQ29tcGxldGUoKSB7XG4gICAgaWYgKCFvcHRzLmNvbnRpbnVvdXMgJiYgb3B0cy5hdHRhY2htZW50cykge1xuICAgICAgLy8gY2Fubm90IGd1YXJhbnRlZSB0aGF0IHBvc3RQcm9jZXNzaW5nIHdhcyBhbHJlYWR5IGRvbmUsXG4gICAgICAvLyBzbyBkbyBpdCBhZ2FpblxuICAgICAgcG9zdFByb2Nlc3NBdHRhY2htZW50cyhyZXN1bHRzKS50aGVuKGZpbmlzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvYmplY3RTdG9yZXMgPSBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkVdO1xuICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgIG9iamVjdFN0b3Jlcy5wdXNoKEFUVEFDSF9TVE9SRSk7XG4gIH1cbiAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIG9iamVjdFN0b3JlcywgJ3JlYWRvbmx5Jyk7XG4gIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICByZXR1cm4gb3B0cy5jb21wbGV0ZSh0eG5SZXN1bHQuZXJyb3IpO1xuICB9XG4gIHR4biA9IHR4blJlc3VsdC50eG47XG4gIHR4bi5vbmFib3J0ID0gaWRiRXJyb3Iob3B0cy5jb21wbGV0ZSk7XG4gIHR4bi5vbmNvbXBsZXRlID0gb25UeG5Db21wbGV0ZTtcblxuICBieVNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gIGRvY0lkUmV2SW5kZXggPSBieVNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpO1xuXG4gIHZhciBrZXlSYW5nZSA9IChvcHRzLnNpbmNlICYmICFvcHRzLmRlc2NlbmRpbmcpID9cbiAgICBJREJLZXlSYW5nZS5sb3dlckJvdW5kKG9wdHMuc2luY2UsIHRydWUpIDogbnVsbDtcblxuICBydW5CYXRjaGVkQ3Vyc29yKGJ5U2VxU3RvcmUsIGtleVJhbmdlLCBvcHRzLmRlc2NlbmRpbmcsIGxpbWl0LCBvbkJhdGNoKTtcbn1cblxudmFyIGNhY2hlZERCcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xudmFyIGJsb2JTdXBwb3J0UHJvbWlzZTtcbnZhciBvcGVuUmVxTGlzdCA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG5mdW5jdGlvbiBJZGJQb3VjaChvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgYXBpID0gdGhpcztcblxuICBlbnF1ZXVlVGFzayhmdW5jdGlvbiAodGhpc0NhbGxiYWNrKSB7XG4gICAgaW5pdChhcGksIG9wdHMsIHRoaXNDYWxsYmFjayk7XG4gIH0sIGNhbGxiYWNrLCBhcGkuY29uc3RydWN0b3IpO1xufVxuXG5mdW5jdGlvbiBpbml0KGFwaSwgb3B0cywgY2FsbGJhY2spIHtcblxuICB2YXIgZGJOYW1lID0gb3B0cy5uYW1lO1xuXG4gIHZhciBpZGIgPSBudWxsO1xuICB2YXIgaWRiR2xvYmFsRmFpbHVyZUVycm9yID0gbnVsbDtcbiAgYXBpLl9tZXRhID0gbnVsbDtcblxuICBmdW5jdGlvbiBlbnJpY2hDYWxsYmFja0Vycm9yKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0KSB7XG4gICAgICBpZiAoZXJyb3IgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhZXJyb3IucmVhc29uKSB7XG4gICAgICAgIGlmIChpZGJHbG9iYWxGYWlsdXJlRXJyb3IpIHtcbiAgICAgICAgICBlcnJvci5yZWFzb24gPSBpZGJHbG9iYWxGYWlsdXJlRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3VsdCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIGNhbGxlZCB3aGVuIGNyZWF0aW5nIGEgZnJlc2ggbmV3IGRhdGFiYXNlXG4gIGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYShkYikge1xuICAgIHZhciBkb2NTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKERPQ19TVE9SRSwge2tleVBhdGggOiAnaWQnfSk7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFLCB7YXV0b0luY3JlbWVudDogdHJ1ZX0pXG4gICAgICAuY3JlYXRlSW5kZXgoJ19kb2NfaWRfcmV2JywgJ19kb2NfaWRfcmV2Jywge3VuaXF1ZTogdHJ1ZX0pO1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSwge2tleVBhdGg6ICdkaWdlc3QnfSk7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTUVUQV9TVE9SRSwge2tleVBhdGg6ICdpZCcsIGF1dG9JbmNyZW1lbnQ6IGZhbHNlfSk7XG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSk7XG5cbiAgICAvLyBhZGRlZCBpbiB2MlxuICAgIGRvY1N0b3JlLmNyZWF0ZUluZGV4KCdkZWxldGVkT3JMb2NhbCcsICdkZWxldGVkT3JMb2NhbCcsIHt1bmlxdWUgOiBmYWxzZX0pO1xuXG4gICAgLy8gYWRkZWQgaW4gdjNcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShMT0NBTF9TVE9SRSwge2tleVBhdGg6ICdfaWQnfSk7XG5cbiAgICAvLyBhZGRlZCBpbiB2NFxuICAgIHZhciBhdHRBbmRTZXFTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKEFUVEFDSF9BTkRfU0VRX1NUT1JFLFxuICAgICAge2F1dG9JbmNyZW1lbnQ6IHRydWV9KTtcbiAgICBhdHRBbmRTZXFTdG9yZS5jcmVhdGVJbmRleCgnc2VxJywgJ3NlcScpO1xuICAgIGF0dEFuZFNlcVN0b3JlLmNyZWF0ZUluZGV4KCdkaWdlc3RTZXEnLCAnZGlnZXN0U2VxJywge3VuaXF1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gMlxuICAvLyB1bmZvcnR1bmF0ZWx5IFwiZGVsZXRlZE9yTG9jYWxcIiBpcyBhIG1pc25vbWVyIG5vdyB0aGF0IHdlIG5vIGxvbmdlclxuICAvLyBzdG9yZSBsb2NhbCBkb2NzIGluIHRoZSBtYWluIGRvYy1zdG9yZSwgYnV0IHdoYWRkeWFnb25uYWRvXG4gIGZ1bmN0aW9uIGFkZERlbGV0ZWRPckxvY2FsSW5kZXgodHhuLCBjYWxsYmFjaykge1xuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICAgIGRvY1N0b3JlLmNyZWF0ZUluZGV4KCdkZWxldGVkT3JMb2NhbCcsICdkZWxldGVkT3JMb2NhbCcsIHt1bmlxdWUgOiBmYWxzZX0pO1xuXG4gICAgZG9jU3RvcmUub3BlbkN1cnNvcigpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGN1cnNvciA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IGN1cnNvci52YWx1ZTtcbiAgICAgICAgdmFyIGRlbGV0ZWQgPSBpc0RlbGV0ZWQobWV0YWRhdGEpO1xuICAgICAgICBtZXRhZGF0YS5kZWxldGVkT3JMb2NhbCA9IGRlbGV0ZWQgPyBcIjFcIiA6IFwiMFwiO1xuICAgICAgICBkb2NTdG9yZS5wdXQobWV0YWRhdGEpO1xuICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDMgKHBhcnQgMSlcbiAgZnVuY3Rpb24gY3JlYXRlTG9jYWxTdG9yZVNjaGVtYShkYikge1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKExPQ0FMX1NUT1JFLCB7a2V5UGF0aDogJ19pZCd9KVxuICAgICAgLmNyZWF0ZUluZGV4KCdfZG9jX2lkX3JldicsICdfZG9jX2lkX3JldicsIHt1bmlxdWU6IHRydWV9KTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDMgKHBhcnQgMilcbiAgZnVuY3Rpb24gbWlncmF0ZUxvY2FsU3RvcmUodHhuLCBjYikge1xuICAgIHZhciBsb2NhbFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKExPQ0FMX1NUT1JFKTtcbiAgICB2YXIgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgICB2YXIgc2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcblxuICAgIHZhciBjdXJzb3IgPSBkb2NTdG9yZS5vcGVuQ3Vyc29yKCk7XG4gICAgY3Vyc29yLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGN1cnNvciA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IGN1cnNvci52YWx1ZTtcbiAgICAgICAgdmFyIGRvY0lkID0gbWV0YWRhdGEuaWQ7XG4gICAgICAgIHZhciBsb2NhbCA9IGlzTG9jYWxJZChkb2NJZCk7XG4gICAgICAgIHZhciByZXYgPSB3aW5uaW5nUmV2KG1ldGFkYXRhKTtcbiAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgdmFyIGRvY0lkUmV2ID0gZG9jSWQgKyBcIjo6XCIgKyByZXY7XG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCBzZXEgZW50cmllc1xuICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY0lkXG4gICAgICAgICAgdmFyIHN0YXJ0ID0gZG9jSWQgKyBcIjo6XCI7XG4gICAgICAgICAgdmFyIGVuZCA9IGRvY0lkICsgXCI6On5cIjtcbiAgICAgICAgICB2YXIgaW5kZXggPSBzZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKTtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSBJREJLZXlSYW5nZS5ib3VuZChzdGFydCwgZW5kLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgIHZhciBzZXFDdXJzb3IgPSBpbmRleC5vcGVuQ3Vyc29yKHJhbmdlKTtcbiAgICAgICAgICBzZXFDdXJzb3Iub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHNlcUN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIGlmICghc2VxQ3Vyc29yKSB7XG4gICAgICAgICAgICAgIC8vIGRvbmVcbiAgICAgICAgICAgICAgZG9jU3RvcmUuZGVsZXRlKGN1cnNvci5wcmltYXJ5S2V5KTtcbiAgICAgICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgZGF0YSA9IHNlcUN1cnNvci52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGRhdGEuX2RvY19pZF9yZXYgPT09IGRvY0lkUmV2KSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yZS5wdXQoZGF0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2VxU3RvcmUuZGVsZXRlKHNlcUN1cnNvci5wcmltYXJ5S2V5KTtcbiAgICAgICAgICAgICAgc2VxQ3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgICBjYigpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiA0IChwYXJ0IDEpXG4gIGZ1bmN0aW9uIGFkZEF0dGFjaEFuZFNlcVN0b3JlKGRiKSB7XG4gICAgdmFyIGF0dEFuZFNlcVN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoQVRUQUNIX0FORF9TRVFfU1RPUkUsXG4gICAgICB7YXV0b0luY3JlbWVudDogdHJ1ZX0pO1xuICAgIGF0dEFuZFNlcVN0b3JlLmNyZWF0ZUluZGV4KCdzZXEnLCAnc2VxJyk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ2RpZ2VzdFNlcScsICdkaWdlc3RTZXEnLCB7dW5pcXVlOiB0cnVlfSk7XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiA0IChwYXJ0IDIpXG4gIGZ1bmN0aW9uIG1pZ3JhdGVBdHRzQW5kU2Vxcyh0eG4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gICAgdmFyIGF0dFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSk7XG4gICAgdmFyIGF0dEFuZFNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9BTkRfU0VRX1NUT1JFKTtcblxuICAgIC8vIG5lZWQgdG8gYWN0dWFsbHkgcG9wdWxhdGUgdGhlIHRhYmxlLiB0aGlzIGlzIHRoZSBleHBlbnNpdmUgcGFydCxcbiAgICAvLyBzbyBhcyBhbiBvcHRpbWl6YXRpb24sIGNoZWNrIGZpcnN0IHRoYXQgdGhpcyBkYXRhYmFzZSBldmVuXG4gICAgLy8gY29udGFpbnMgYXR0YWNobWVudHNcbiAgICB2YXIgcmVxID0gYXR0U3RvcmUuY291bnQoKTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjb3VudCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICghY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7IC8vIGRvbmVcbiAgICAgIH1cblxuICAgICAgc2VxU3RvcmUub3BlbkN1cnNvcigpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7IC8vIGRvbmVcbiAgICAgICAgfVxuICAgICAgICB2YXIgZG9jID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICB2YXIgc2VxID0gY3Vyc29yLnByaW1hcnlLZXk7XG4gICAgICAgIHZhciBhdHRzID0gT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cyB8fCB7fSk7XG4gICAgICAgIHZhciBkaWdlc3RNYXAgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhdHRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGF0dCA9IGRvYy5fYXR0YWNobWVudHNbYXR0c1tqXV07XG4gICAgICAgICAgZGlnZXN0TWFwW2F0dC5kaWdlc3RdID0gdHJ1ZTsgLy8gdW5pcSBkaWdlc3RzLCBqdXN0IGluIGNhc2VcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGlnZXN0cyA9IE9iamVjdC5rZXlzKGRpZ2VzdE1hcCk7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBkaWdlc3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGRpZ2VzdCA9IGRpZ2VzdHNbal07XG4gICAgICAgICAgYXR0QW5kU2VxU3RvcmUucHV0KHtcbiAgICAgICAgICAgIHNlcTogc2VxLFxuICAgICAgICAgICAgZGlnZXN0U2VxOiBkaWdlc3QgKyAnOjonICsgc2VxXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiA1XG4gIC8vIEluc3RlYWQgb2YgcmVseWluZyBvbiBvbi10aGUtZmx5IG1pZ3JhdGlvbiBvZiBtZXRhZGF0YSxcbiAgLy8gdGhpcyBicmluZ3MgdGhlIGRvYy1zdG9yZSB0byBpdHMgbW9kZXJuIGZvcm06XG4gIC8vIC0gbWV0YWRhdGEud2lubmluZ3JldlxuICAvLyAtIG1ldGFkYXRhLnNlcVxuICAvLyAtIHN0cmluZ2lmeSB0aGUgbWV0YWRhdGEgd2hlbiBzdG9yaW5nIGl0XG4gIGZ1bmN0aW9uIG1pZ3JhdGVNZXRhZGF0YSh0eG4pIHtcblxuICAgIGZ1bmN0aW9uIGRlY29kZU1ldGFkYXRhQ29tcGF0KHN0b3JlZE9iamVjdCkge1xuICAgICAgaWYgKCFzdG9yZWRPYmplY3QuZGF0YSkge1xuICAgICAgICAvLyBvbGQgZm9ybWF0LCB3aGVuIHdlIGRpZG4ndCBzdG9yZSBpdCBzdHJpbmdpZmllZFxuICAgICAgICBzdG9yZWRPYmplY3QuZGVsZXRlZCA9IHN0b3JlZE9iamVjdC5kZWxldGVkT3JMb2NhbCA9PT0gJzEnO1xuICAgICAgICByZXR1cm4gc3RvcmVkT2JqZWN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlY29kZU1ldGFkYXRhKHN0b3JlZE9iamVjdCk7XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIHRoYXQgZXZlcnkgbWV0YWRhdGEgaGFzIGEgd2lubmluZ1JldiBhbmQgc2VxLFxuICAgIC8vIHdoaWNoIHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgb24tdGhlLWZseSBidXQgYmV0dGVyIHRvIG1pZ3JhdGVcbiAgICB2YXIgYnlTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgIHZhciBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICAgIHZhciBjdXJzb3IgPSBkb2NTdG9yZS5vcGVuQ3Vyc29yKCk7XG4gICAgY3Vyc29yLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBkb25lXG4gICAgICB9XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YUNvbXBhdChjdXJzb3IudmFsdWUpO1xuXG4gICAgICBtZXRhZGF0YS53aW5uaW5nUmV2ID0gbWV0YWRhdGEud2lubmluZ1JldiB8fFxuICAgICAgICB3aW5uaW5nUmV2KG1ldGFkYXRhKTtcblxuICAgICAgZnVuY3Rpb24gZmV0Y2hNZXRhZGF0YVNlcSgpIHtcbiAgICAgICAgLy8gbWV0YWRhdGEuc2VxIHdhcyBhZGRlZCBwb3N0LTMuMi4wLCBzbyBpZiBpdCdzIG1pc3NpbmcsXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZmV0Y2ggaXQgbWFudWFsbHlcbiAgICAgICAgdmFyIHN0YXJ0ID0gbWV0YWRhdGEuaWQgKyAnOjonO1xuICAgICAgICB2YXIgZW5kID0gbWV0YWRhdGEuaWQgKyAnOjpcXHVmZmZmJztcbiAgICAgICAgdmFyIHJlcSA9IGJ5U2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jykub3BlbkN1cnNvcihcbiAgICAgICAgICBJREJLZXlSYW5nZS5ib3VuZChzdGFydCwgZW5kKSk7XG5cbiAgICAgICAgdmFyIG1ldGFkYXRhU2VxID0gMDtcbiAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICAgICAgbWV0YWRhdGEuc2VxID0gbWV0YWRhdGFTZXE7XG4gICAgICAgICAgICByZXR1cm4gb25HZXRNZXRhZGF0YVNlcSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc2VxID0gY3Vyc29yLnByaW1hcnlLZXk7XG4gICAgICAgICAgaWYgKHNlcSA+IG1ldGFkYXRhU2VxKSB7XG4gICAgICAgICAgICBtZXRhZGF0YVNlcSA9IHNlcTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uR2V0TWV0YWRhdGFTZXEoKSB7XG4gICAgICAgIHZhciBtZXRhZGF0YVRvU3RvcmUgPSBlbmNvZGVNZXRhZGF0YShtZXRhZGF0YSxcbiAgICAgICAgICBtZXRhZGF0YS53aW5uaW5nUmV2LCBtZXRhZGF0YS5kZWxldGVkKTtcblxuICAgICAgICB2YXIgcmVxID0gZG9jU3RvcmUucHV0KG1ldGFkYXRhVG9TdG9yZSk7XG4gICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRhZGF0YS5zZXEpIHtcbiAgICAgICAgcmV0dXJuIG9uR2V0TWV0YWRhdGFTZXEoKTtcbiAgICAgIH1cblxuICAgICAgZmV0Y2hNZXRhZGF0YVNlcSgpO1xuICAgIH07XG5cbiAgfVxuXG4gIGFwaS5fcmVtb3RlID0gZmFsc2U7XG4gIGFwaS50eXBlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnaWRiJztcbiAgfTtcblxuICBhcGkuX2lkID0gdG9Qcm9taXNlKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKG51bGwsIGFwaS5fbWV0YS5pbnN0YW5jZUlkKTtcbiAgfSk7XG5cbiAgYXBpLl9idWxrRG9jcyA9IGZ1bmN0aW9uIGlkYl9idWxrRG9jcyhyZXEsIHJlcU9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWRiQnVsa0RvY3Mob3B0cywgcmVxLCByZXFPcHRzLCBhcGksIGlkYiwgZW5yaWNoQ2FsbGJhY2tFcnJvcihjYWxsYmFjaykpO1xuICB9O1xuXG4gIC8vIEZpcnN0IHdlIGxvb2sgdXAgdGhlIG1ldGFkYXRhIGluIHRoZSBpZHMgZGF0YWJhc2UsIHRoZW4gd2UgZmV0Y2ggdGhlXG4gIC8vIGN1cnJlbnQgcmV2aXNpb24ocykgZnJvbSB0aGUgYnkgc2VxdWVuY2Ugc3RvcmVcbiAgYXBpLl9nZXQgPSBmdW5jdGlvbiBpZGJfZ2V0KGlkLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHZhciBkb2M7XG4gICAgdmFyIG1ldGFkYXRhO1xuICAgIHZhciBlcnI7XG4gICAgdmFyIHR4biA9IG9wdHMuY3R4O1xuICAgIGlmICghdHhuKSB7XG4gICAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYixcbiAgICAgICAgW0RPQ19TVE9SRSwgQllfU0VRX1NUT1JFLCBBVFRBQ0hfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0eG4gPSB0eG5SZXN1bHQudHhuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICAgIGNhbGxiYWNrKGVyciwge2RvYzogZG9jLCBtZXRhZGF0YTogbWV0YWRhdGEsIGN0eDogdHhufSk7XG4gICAgfVxuXG4gICAgdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSkuZ2V0KGlkKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgLy8gd2UgY2FuIGRldGVybWluZSB0aGUgcmVzdWx0IGhlcmUgaWY6XG4gICAgICAvLyAxLiB0aGVyZSBpcyBubyBzdWNoIGRvY3VtZW50XG4gICAgICAvLyAyLiB0aGUgZG9jdW1lbnQgaXMgZGVsZXRlZCBhbmQgd2UgZG9uJ3QgYXNrIGFib3V0IHNwZWNpZmljIHJldlxuICAgICAgLy8gV2hlbiB3ZSBhc2sgd2l0aCBvcHRzLnJldiB3ZSBleHBlY3QgdGhlIGFuc3dlciB0byBiZSBlaXRoZXJcbiAgICAgIC8vIGRvYyAocG9zc2libHkgd2l0aCBfZGVsZXRlZD10cnVlKSBvciBtaXNzaW5nIGVycm9yXG4gICAgICBpZiAoIW1ldGFkYXRhKSB7XG4gICAgICAgIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLCAnbWlzc2luZycpO1xuICAgICAgICByZXR1cm4gZmluaXNoKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXY7XG4gICAgICBpZiAoIW9wdHMucmV2KSB7XG4gICAgICAgIHJldiA9IG1ldGFkYXRhLndpbm5pbmdSZXY7XG4gICAgICAgIHZhciBkZWxldGVkID0gaXNEZWxldGVkKG1ldGFkYXRhKTtcbiAgICAgICAgaWYgKGRlbGV0ZWQpIHtcbiAgICAgICAgICBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX0RPQywgXCJkZWxldGVkXCIpO1xuICAgICAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV2ID0gb3B0cy5sYXRlc3QgPyBsYXRlc3Qob3B0cy5yZXYsIG1ldGFkYXRhKSA6IG9wdHMucmV2O1xuICAgICAgfVxuXG4gICAgICB2YXIgb2JqZWN0U3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgICAgIHZhciBrZXkgPSBtZXRhZGF0YS5pZCArICc6OicgKyByZXY7XG5cbiAgICAgIG9iamVjdFN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpLmdldChrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGRvYyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgIGRvYyA9IGRlY29kZURvYyhkb2MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsICdtaXNzaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIGZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmlzaCgpO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIGFwaS5fZ2V0QXR0YWNobWVudCA9IGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNoSWQsIGF0dGFjaG1lbnQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHR4bjtcbiAgICBpZiAob3B0cy5jdHgpIHtcbiAgICAgIHR4biA9IG9wdHMuY3R4O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYixcbiAgICAgICAgW0RPQ19TVE9SRSwgQllfU0VRX1NUT1JFLCBBVFRBQ0hfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0eG4gPSB0eG5SZXN1bHQudHhuO1xuICAgIH1cbiAgICB2YXIgZGlnZXN0ID0gYXR0YWNobWVudC5kaWdlc3Q7XG4gICAgdmFyIHR5cGUgPSBhdHRhY2htZW50LmNvbnRlbnRfdHlwZTtcblxuICAgIHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpLmdldChkaWdlc3QpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgYm9keSA9IGUudGFyZ2V0LnJlc3VsdC5ib2R5O1xuICAgICAgcmVhZEJsb2JEYXRhKGJvZHksIHR5cGUsIG9wdHMuYmluYXJ5LCBmdW5jdGlvbiAoYmxvYkRhdGEpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgYmxvYkRhdGEpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX2luZm8gPSBmdW5jdGlvbiBpZGJfaW5mbyhjYWxsYmFjaykge1xuICAgIHZhciB1cGRhdGVTZXE7XG4gICAgdmFyIGRvY0NvdW50O1xuXG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtNRVRBX1NUT1JFLCBCWV9TRVFfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdmFyIHR4biA9IHR4blJlc3VsdC50eG47XG4gICAgdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZG9jQ291bnQgPSBlLnRhcmdldC5yZXN1bHQuZG9jQ291bnQ7XG4gICAgfTtcbiAgICB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKS5vcGVuQ3Vyc29yKG51bGwsICdwcmV2Jykub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICB1cGRhdGVTZXEgPSBjdXJzb3IgPyBjdXJzb3Iua2V5IDogMDtcbiAgICB9O1xuXG4gICAgdHhuLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIGRvY19jb3VudDogZG9jQ291bnQsXG4gICAgICAgIHVwZGF0ZV9zZXE6IHVwZGF0ZVNlcSxcbiAgICAgICAgLy8gZm9yIGRlYnVnZ2luZ1xuICAgICAgICBpZGJfYXR0YWNobWVudF9mb3JtYXQ6IChhcGkuX21ldGEuYmxvYlN1cHBvcnQgPyAnYmluYXJ5JyA6ICdiYXNlNjQnKVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX2FsbERvY3MgPSBmdW5jdGlvbiBpZGJfYWxsRG9jcyhvcHRzLCBjYWxsYmFjaykge1xuICAgIGlkYkFsbERvY3Mob3B0cywgaWRiLCBlbnJpY2hDYWxsYmFja0Vycm9yKGNhbGxiYWNrKSk7XG4gIH07XG5cbiAgYXBpLl9jaGFuZ2VzID0gZnVuY3Rpb24gaWRiQ2hhbmdlcyhvcHRzKSB7XG4gICAgcmV0dXJuIGNoYW5nZXMob3B0cywgYXBpLCBkYk5hbWUsIGlkYik7XG4gIH07XG5cbiAgYXBpLl9jbG9zZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSW5kZXhlZERCL0lEQkRhdGFiYXNlI2Nsb3NlXG4gICAgLy8gXCJSZXR1cm5zIGltbWVkaWF0ZWx5IGFuZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gaW4gYSBzZXBhcmF0ZSB0aHJlYWQuLi5cIlxuICAgIGlkYi5jbG9zZSgpO1xuICAgIGNhY2hlZERCcy5kZWxldGUoZGJOYW1lKTtcbiAgICBjYWxsYmFjaygpO1xuICB9O1xuXG4gIGFwaS5fZ2V0UmV2aXNpb25UcmVlID0gZnVuY3Rpb24gKGRvY0lkLCBjYWxsYmFjaykge1xuICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBbRE9DX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHZhciB0eG4gPSB0eG5SZXN1bHQudHhuO1xuICAgIHZhciByZXEgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5nZXQoZG9jSWQpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBkb2MgPSBkZWNvZGVNZXRhZGF0YShldmVudC50YXJnZXQucmVzdWx0KTtcbiAgICAgIGlmICghZG9jKSB7XG4gICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBkb2MucmV2X3RyZWUpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiByZW1vdmVzIHJldmlzaW9ucyBvZiBkb2N1bWVudCBkb2NJZFxuICAvLyB3aGljaCBhcmUgbGlzdGVkIGluIHJldnMgYW5kIHNldHMgdGhpcyBkb2N1bWVudFxuICAvLyByZXZpc2lvbiB0byB0byByZXZfdHJlZVxuICBhcGkuX2RvQ29tcGFjdGlvbiA9IGZ1bmN0aW9uIChkb2NJZCwgcmV2cywgY2FsbGJhY2spIHtcbiAgICB2YXIgc3RvcmVzID0gW1xuICAgICAgRE9DX1NUT1JFLFxuICAgICAgQllfU0VRX1NUT1JFLFxuICAgICAgQVRUQUNIX1NUT1JFLFxuICAgICAgQVRUQUNIX0FORF9TRVFfU1RPUkVcbiAgICBdO1xuICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBzdG9yZXMsICdyZWFkd3JpdGUnKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdmFyIHR4biA9IHR4blJlc3VsdC50eG47XG5cbiAgICB2YXIgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcblxuICAgIGRvY1N0b3JlLmdldChkb2NJZCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShldmVudC50YXJnZXQucmVzdWx0KTtcbiAgICAgIHRyYXZlcnNlUmV2VHJlZShtZXRhZGF0YS5yZXZfdHJlZSwgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2SGFzaCwgY3R4LCBvcHRzKSB7XG4gICAgICAgIHZhciByZXYgPSBwb3MgKyAnLScgKyByZXZIYXNoO1xuICAgICAgICBpZiAocmV2cy5pbmRleE9mKHJldikgIT09IC0xKSB7XG4gICAgICAgICAgb3B0cy5zdGF0dXMgPSAnbWlzc2luZyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29tcGFjdFJldnMocmV2cywgZG9jSWQsIHR4bik7XG4gICAgICB2YXIgd2lubmluZ1JldiQkMSA9IG1ldGFkYXRhLndpbm5pbmdSZXY7XG4gICAgICB2YXIgZGVsZXRlZCA9IG1ldGFkYXRhLmRlbGV0ZWQ7XG4gICAgICB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKS5wdXQoXG4gICAgICAgIGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhLCB3aW5uaW5nUmV2JCQxLCBkZWxldGVkKSk7XG4gICAgfTtcbiAgICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfTtcbiAgfTtcblxuXG4gIGFwaS5fZ2V0TG9jYWwgPSBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtMT0NBTF9TVE9SRV0sICdyZWFkb25seScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHggPSB0eG5SZXN1bHQudHhuO1xuICAgIHZhciByZXEgPSB0eC5vYmplY3RTdG9yZShMT0NBTF9TVE9SRSkuZ2V0KGlkKTtcblxuICAgIHJlcS5vbmVycm9yID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGRvYyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICghZG9jKSB7XG4gICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZG9jWydfZG9jX2lkX3JldiddOyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdFxuICAgICAgICBjYWxsYmFjayhudWxsLCBkb2MpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgYXBpLl9wdXRMb2NhbCA9IGZ1bmN0aW9uIChkb2MsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIGRlbGV0ZSBkb2MuX3JldmlzaW9uczsgLy8gaWdub3JlIHRoaXMsIHRydXN0IHRoZSByZXZcbiAgICB2YXIgb2xkUmV2ID0gZG9jLl9yZXY7XG4gICAgdmFyIGlkID0gZG9jLl9pZDtcbiAgICBpZiAoIW9sZFJldikge1xuICAgICAgZG9jLl9yZXYgPSAnMC0xJztcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jLl9yZXYgPSAnMC0nICsgKHBhcnNlSW50KG9sZFJldi5zcGxpdCgnLScpWzFdLCAxMCkgKyAxKTtcbiAgICB9XG5cbiAgICB2YXIgdHggPSBvcHRzLmN0eDtcbiAgICB2YXIgcmV0O1xuICAgIGlmICghdHgpIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBbTE9DQUxfU1RPUkVdLCAncmVhZHdyaXRlJyk7XG4gICAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdHggPSB0eG5SZXN1bHQudHhuO1xuICAgICAgdHgub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICAgIHR4Lm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBvU3RvcmUgPSB0eC5vYmplY3RTdG9yZShMT0NBTF9TVE9SRSk7XG4gICAgdmFyIHJlcTtcbiAgICBpZiAob2xkUmV2KSB7XG4gICAgICByZXEgPSBvU3RvcmUuZ2V0KGlkKTtcbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgb2xkRG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoIW9sZERvYyB8fCBvbGREb2MuX3JldiAhPT0gb2xkUmV2KSB7XG4gICAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKSk7XG4gICAgICAgIH0gZWxzZSB7IC8vIHVwZGF0ZVxuICAgICAgICAgIHZhciByZXEgPSBvU3RvcmUucHV0KGRvYyk7XG4gICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldCA9IHtvazogdHJ1ZSwgaWQ6IGRvYy5faWQsIHJldjogZG9jLl9yZXZ9O1xuICAgICAgICAgICAgaWYgKG9wdHMuY3R4KSB7IC8vIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHsgLy8gbmV3IGRvY1xuICAgICAgcmVxID0gb1N0b3JlLmFkZChkb2MpO1xuICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBjb25zdHJhaW50IGVycm9yLCBhbHJlYWR5IGV4aXN0c1xuICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBhYm9ydFxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBvbmVycm9yXG4gICAgICB9O1xuICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0ID0ge29rOiB0cnVlLCBpZDogZG9jLl9pZCwgcmV2OiBkb2MuX3Jldn07XG4gICAgICAgIGlmIChvcHRzLmN0eCkgeyAvLyByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICBhcGkuX3JlbW92ZUxvY2FsID0gZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgdmFyIHR4ID0gb3B0cy5jdHg7XG4gICAgaWYgKCF0eCkge1xuICAgICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsIFtMT0NBTF9TVE9SRV0sICdyZWFkd3JpdGUnKTtcbiAgICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgICB0eCA9IHR4blJlc3VsdC50eG47XG4gICAgICB0eC5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHJldDtcbiAgICB2YXIgaWQgPSBkb2MuX2lkO1xuICAgIHZhciBvU3RvcmUgPSB0eC5vYmplY3RTdG9yZShMT0NBTF9TVE9SRSk7XG4gICAgdmFyIHJlcSA9IG9TdG9yZS5nZXQoaWQpO1xuXG4gICAgcmVxLm9uZXJyb3IgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb2xkRG9jID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKCFvbGREb2MgfHwgb2xkRG9jLl9yZXYgIT09IGRvYy5fcmV2KSB7XG4gICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvU3RvcmUuZGVsZXRlKGlkKTtcbiAgICAgICAgcmV0ID0ge29rOiB0cnVlLCBpZDogaWQsIHJldjogJzAtMCd9O1xuICAgICAgICBpZiAob3B0cy5jdHgpIHsgLy8gcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgYXBpLl9kZXN0cm95ID0gZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgY2hhbmdlc0hhbmRsZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGRiTmFtZSk7XG5cbiAgICAvL0Nsb3NlIG9wZW4gcmVxdWVzdCBmb3IgXCJkYk5hbWVcIiBkYXRhYmFzZSB0byBmaXggaWUgZGVsYXkuXG4gICAgdmFyIG9wZW5SZXEgPSBvcGVuUmVxTGlzdC5nZXQoZGJOYW1lKTtcbiAgICBpZiAob3BlblJlcSAmJiBvcGVuUmVxLnJlc3VsdCkge1xuICAgICAgb3BlblJlcS5yZXN1bHQuY2xvc2UoKTtcbiAgICAgIGNhY2hlZERCcy5kZWxldGUoZGJOYW1lKTtcbiAgICB9XG4gICAgdmFyIHJlcSA9IGluZGV4ZWREQi5kZWxldGVEYXRhYmFzZShkYk5hbWUpO1xuXG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vUmVtb3ZlIG9wZW4gcmVxdWVzdCBmcm9tIHRoZSBsaXN0LlxuICAgICAgb3BlblJlcUxpc3QuZGVsZXRlKGRiTmFtZSk7XG4gICAgICBpZiAoaGFzTG9jYWxTdG9yYWdlKCkgJiYgKGRiTmFtZSBpbiBsb2NhbFN0b3JhZ2UpKSB7XG4gICAgICAgIGRlbGV0ZSBsb2NhbFN0b3JhZ2VbZGJOYW1lXTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIHsgJ29rJzogdHJ1ZSB9KTtcbiAgICB9O1xuXG4gICAgcmVxLm9uZXJyb3IgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gIH07XG5cbiAgdmFyIGNhY2hlZCA9IGNhY2hlZERCcy5nZXQoZGJOYW1lKTtcblxuICBpZiAoY2FjaGVkKSB7XG4gICAgaWRiID0gY2FjaGVkLmlkYjtcbiAgICBhcGkuX21ldGEgPSBjYWNoZWQuZ2xvYmFsO1xuICAgIHJldHVybiBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgYXBpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciByZXEgPSBpbmRleGVkREIub3BlbihkYk5hbWUsIEFEQVBURVJfVkVSU0lPTik7XG4gIG9wZW5SZXFMaXN0LnNldChkYk5hbWUsIHJlcSk7XG5cbiAgcmVxLm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGRiID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmIChlLm9sZFZlcnNpb24gPCAxKSB7XG4gICAgICByZXR1cm4gY3JlYXRlU2NoZW1hKGRiKTsgLy8gbmV3IGRiLCBpbml0aWFsIHNjaGVtYVxuICAgIH1cbiAgICAvLyBkbyBtaWdyYXRpb25zXG5cbiAgICB2YXIgdHhuID0gZS5jdXJyZW50VGFyZ2V0LnRyYW5zYWN0aW9uO1xuICAgIC8vIHRoZXNlIG1pZ3JhdGlvbnMgaGF2ZSB0byBiZSBkb25lIGluIHRoaXMgZnVuY3Rpb24sIGJlZm9yZVxuICAgIC8vIGNvbnRyb2wgaXMgcmV0dXJuZWQgdG8gdGhlIGV2ZW50IGxvb3AsIGJlY2F1c2UgSW5kZXhlZERCXG5cbiAgICBpZiAoZS5vbGRWZXJzaW9uIDwgMykge1xuICAgICAgY3JlYXRlTG9jYWxTdG9yZVNjaGVtYShkYik7IC8vIHYyIC0+IHYzXG4gICAgfVxuICAgIGlmIChlLm9sZFZlcnNpb24gPCA0KSB7XG4gICAgICBhZGRBdHRhY2hBbmRTZXFTdG9yZShkYik7IC8vIHYzIC0+IHY0XG4gICAgfVxuXG4gICAgdmFyIG1pZ3JhdGlvbnMgPSBbXG4gICAgICBhZGREZWxldGVkT3JMb2NhbEluZGV4LCAvLyB2MSAtPiB2MlxuICAgICAgbWlncmF0ZUxvY2FsU3RvcmUsICAgICAgLy8gdjIgLT4gdjNcbiAgICAgIG1pZ3JhdGVBdHRzQW5kU2VxcywgICAgIC8vIHYzIC0+IHY0XG4gICAgICBtaWdyYXRlTWV0YWRhdGEgICAgICAgICAvLyB2NCAtPiB2NVxuICAgIF07XG5cbiAgICB2YXIgaSA9IGUub2xkVmVyc2lvbjtcblxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB2YXIgbWlncmF0aW9uID0gbWlncmF0aW9uc1tpIC0gMV07XG4gICAgICBpKys7XG4gICAgICBpZiAobWlncmF0aW9uKSB7XG4gICAgICAgIG1pZ3JhdGlvbih0eG4sIG5leHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfTtcblxuICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcblxuICAgIGlkYiA9IGUudGFyZ2V0LnJlc3VsdDtcblxuICAgIGlkYi5vbnZlcnNpb25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZGIuY2xvc2UoKTtcbiAgICAgIGNhY2hlZERCcy5kZWxldGUoZGJOYW1lKTtcbiAgICB9O1xuXG4gICAgaWRiLm9uYWJvcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJywgJ0RhdGFiYXNlIGhhcyBhIGdsb2JhbCBmYWlsdXJlJywgZS50YXJnZXQuZXJyb3IpO1xuICAgICAgaWRiR2xvYmFsRmFpbHVyZUVycm9yID0gZS50YXJnZXQuZXJyb3I7XG4gICAgICBpZGIuY2xvc2UoKTtcbiAgICAgIGNhY2hlZERCcy5kZWxldGUoZGJOYW1lKTtcbiAgICB9O1xuXG4gICAgLy8gRG8gYSBmZXcgc2V0dXAgb3BlcmF0aW9ucyAoaW4gcGFyYWxsZWwgYXMgbXVjaCBhcyBwb3NzaWJsZSk6XG4gICAgLy8gMS4gRmV0Y2ggbWV0YSBkb2NcbiAgICAvLyAyLiBDaGVjayBibG9iIHN1cHBvcnRcbiAgICAvLyAzLiBDYWxjdWxhdGUgZG9jQ291bnRcbiAgICAvLyA0LiBHZW5lcmF0ZSBhbiBpbnN0YW5jZUlkIGlmIG5lY2Vzc2FyeVxuICAgIC8vIDUuIFN0b3JlIGRvY0NvdW50IGFuZCBpbnN0YW5jZUlkIG9uIG1ldGEgZG9jXG5cbiAgICB2YXIgdHhuID0gaWRiLnRyYW5zYWN0aW9uKFtcbiAgICAgIE1FVEFfU1RPUkUsXG4gICAgICBERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFLFxuICAgICAgRE9DX1NUT1JFXG4gICAgXSwgJ3JlYWR3cml0ZScpO1xuXG4gICAgdmFyIHN0b3JlZE1ldGFEb2MgPSBmYWxzZTtcbiAgICB2YXIgbWV0YURvYztcbiAgICB2YXIgZG9jQ291bnQ7XG4gICAgdmFyIGJsb2JTdXBwb3J0O1xuICAgIHZhciBpbnN0YW5jZUlkO1xuXG4gICAgZnVuY3Rpb24gY29tcGxldGVTZXR1cCgpIHtcbiAgICAgIGlmICh0eXBlb2YgYmxvYlN1cHBvcnQgPT09ICd1bmRlZmluZWQnIHx8ICFzdG9yZWRNZXRhRG9jKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS5fbWV0YSA9IHtcbiAgICAgICAgbmFtZTogZGJOYW1lLFxuICAgICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZUlkLFxuICAgICAgICBibG9iU3VwcG9ydDogYmxvYlN1cHBvcnRcbiAgICAgIH07XG5cbiAgICAgIGNhY2hlZERCcy5zZXQoZGJOYW1lLCB7XG4gICAgICAgIGlkYjogaWRiLFxuICAgICAgICBnbG9iYWw6IGFwaS5fbWV0YVxuICAgICAgfSk7XG4gICAgICBjYWxsYmFjayhudWxsLCBhcGkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0b3JlTWV0YURvY0lmUmVhZHkoKSB7XG4gICAgICBpZiAodHlwZW9mIGRvY0NvdW50ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgbWV0YURvYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGluc3RhbmNlS2V5ID0gZGJOYW1lICsgJ19pZCc7XG4gICAgICBpZiAoaW5zdGFuY2VLZXkgaW4gbWV0YURvYykge1xuICAgICAgICBpbnN0YW5jZUlkID0gbWV0YURvY1tpbnN0YW5jZUtleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhRG9jW2luc3RhbmNlS2V5XSA9IGluc3RhbmNlSWQgPSB1dWlkKCk7XG4gICAgICB9XG4gICAgICBtZXRhRG9jLmRvY0NvdW50ID0gZG9jQ291bnQ7XG4gICAgICB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSkucHV0KG1ldGFEb2MpO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gZmV0Y2ggb3IgZ2VuZXJhdGUgdGhlIGluc3RhbmNlSWRcbiAgICAvL1xuICAgIHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKS5nZXQoTUVUQV9TVE9SRSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFEb2MgPSBlLnRhcmdldC5yZXN1bHQgfHwgeyBpZDogTUVUQV9TVE9SRSB9O1xuICAgICAgc3RvcmVNZXRhRG9jSWZSZWFkeSgpO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIGNvdW50RG9jc1xuICAgIC8vXG4gICAgY291bnREb2NzKHR4biwgZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgICBkb2NDb3VudCA9IGNvdW50O1xuICAgICAgc3RvcmVNZXRhRG9jSWZSZWFkeSgpO1xuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvLyBjaGVjayBibG9iIHN1cHBvcnRcbiAgICAvL1xuICAgIGlmICghYmxvYlN1cHBvcnRQcm9taXNlKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgYmxvYiBzdXBwb3J0IGlzIG9ubHkgY2hlY2tlZCBvbmNlXG4gICAgICBibG9iU3VwcG9ydFByb21pc2UgPSBjaGVja0Jsb2JTdXBwb3J0KHR4bik7XG4gICAgfVxuXG4gICAgYmxvYlN1cHBvcnRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKHZhbCkge1xuICAgICAgYmxvYlN1cHBvcnQgPSB2YWw7XG4gICAgICBjb21wbGV0ZVNldHVwKCk7XG4gICAgfSk7XG5cbiAgICAvLyBvbmx5IHdoZW4gdGhlIG1ldGFkYXRhIHB1dCB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLFxuICAgIC8vIGNvbnNpZGVyIHRoZSBzZXR1cCBkb25lXG4gICAgdHhuLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzdG9yZWRNZXRhRG9jID0gdHJ1ZTtcbiAgICAgIGNvbXBsZXRlU2V0dXAoKTtcbiAgICB9O1xuICAgIHR4bi5vbmFib3J0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICB9O1xuXG4gIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgbXNnID0gZS50YXJnZXQuZXJyb3IgJiYgZS50YXJnZXQuZXJyb3IubWVzc2FnZTtcblxuICAgIGlmICghbXNnKSB7XG4gICAgICBtc2cgPSAnRmFpbGVkIHRvIG9wZW4gaW5kZXhlZERCLCBhcmUgeW91IGluIHByaXZhdGUgYnJvd3NpbmcgbW9kZT8nO1xuICAgIH0gZWxzZSBpZiAobXNnLmluZGV4T2YoXCJzdG9yZWQgZGF0YWJhc2UgaXMgYSBoaWdoZXIgdmVyc2lvblwiKSAhPT0gLTEpIHtcbiAgICAgIG1zZyA9IG5ldyBFcnJvcignVGhpcyBEQiB3YXMgY3JlYXRlZCB3aXRoIHRoZSBuZXdlciBcImluZGV4ZWRkYlwiIGFkYXB0ZXIsIGJ1dCB5b3UgYXJlIHRyeWluZyB0byBvcGVuIGl0IHdpdGggdGhlIG9sZGVyIFwiaWRiXCIgYWRhcHRlcicpO1xuICAgIH1cblxuICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsIG1zZyk7XG4gICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoSURCX0VSUk9SLCBtc2cpKTtcbiAgfTtcbn1cblxuSWRiUG91Y2gudmFsaWQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIEZvbGxvd2luZyAjNzA4NSBidWdneSBpZGIgdmVyc2lvbnMgKHR5cGljYWxseSBTYWZhcmkgPCAxMC4xKSBhcmVcbiAgLy8gY29uc2lkZXJlZCB2YWxpZC5cblxuICAvLyBPbiBGaXJlZm94IFNlY3VyaXR5RXJyb3IgaXMgdGhyb3duIHdoaWxlIHJlZmVyZW5jaW5nIGluZGV4ZWREQiBpZiBjb29raWVzXG4gIC8vIGFyZSBub3QgYWxsb3dlZC4gYHR5cGVvZiBpbmRleGVkREJgIGFsc28gdHJpZ2dlcnMgdGhlIGVycm9yLlxuICB0cnkge1xuICAgIC8vIHNvbWUgb3V0ZGF0ZWQgaW1wbGVtZW50YXRpb25zIG9mIElEQiB0aGF0IGFwcGVhciBvbiBTYW1zdW5nXG4gICAgLy8gYW5kIEhUQyBBbmRyb2lkIGRldmljZXMgPDQuNCBhcmUgbWlzc2luZyBJREJLZXlSYW5nZVxuICAgIHJldHVybiB0eXBlb2YgaW5kZXhlZERCICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgSURCS2V5UmFuZ2UgIT09ICd1bmRlZmluZWQnO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBJREJQb3VjaCAoUG91Y2hEQikge1xuICBQb3VjaERCLmFkYXB0ZXIoJ2lkYicsIElkYlBvdWNoLCB0cnVlKTtcbn1cblxuLy8gZGVhZCBzaW1wbGUgcHJvbWlzZSBwb29sLCBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vdGltZHAvZXM2LXByb21pc2UtcG9vbFxuLy8gYnV0IG11Y2ggc21hbGxlciBpbiBjb2RlIHNpemUuIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcHJvbWlzZXMgdGhhdCBhcmUgZXhlY3V0ZWRcblxuXG5mdW5jdGlvbiBwb29sKHByb21pc2VGYWN0b3JpZXMsIGxpbWl0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJ1bm5pbmcgPSAwO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgZG9uZSA9IDA7XG4gICAgdmFyIGxlbiA9IHByb21pc2VGYWN0b3JpZXMubGVuZ3RoO1xuICAgIHZhciBlcnI7XG5cbiAgICBmdW5jdGlvbiBydW5OZXh0KCkge1xuICAgICAgcnVubmluZysrO1xuICAgICAgcHJvbWlzZUZhY3Rvcmllc1tjdXJyZW50KytdKCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvTmV4dCgpIHtcbiAgICAgIGlmICgrK2RvbmUgPT09IGxlbikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnVuTmV4dEJhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25TdWNjZXNzKCkge1xuICAgICAgcnVubmluZy0tO1xuICAgICAgZG9OZXh0KCk7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBmdW5jdGlvbiBvbkVycm9yKHRoaXNFcnIpIHtcbiAgICAgIHJ1bm5pbmctLTtcbiAgICAgIGVyciA9IGVyciB8fCB0aGlzRXJyO1xuICAgICAgZG9OZXh0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuTmV4dEJhdGNoKCkge1xuICAgICAgd2hpbGUgKHJ1bm5pbmcgPCBsaW1pdCAmJiBjdXJyZW50IDwgbGVuKSB7XG4gICAgICAgIHJ1bk5leHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBydW5OZXh0QmF0Y2goKTtcbiAgfSk7XG59XG5cbnZhciBDSEFOR0VTX0JBVENIX1NJWkUgPSAyNTtcbnZhciBNQVhfU0lNVUxUQU5FT1VTX1JFVlMgPSA1MDtcbnZhciBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSID0gNTAwMDtcbnZhciBERUZBVUxUX0hFQVJUQkVBVCA9IDEwMDAwO1xuXG52YXIgc3VwcG9ydHNCdWxrR2V0TWFwID0ge307XG5cbmZ1bmN0aW9uIHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKHJvdykge1xuICB2YXIgZG9jID0gcm93LmRvYyB8fCByb3cub2s7XG4gIHZhciBhdHRzID0gZG9jICYmIGRvYy5fYXR0YWNobWVudHM7XG4gIGlmICghYXR0cykge1xuICAgIHJldHVybjtcbiAgfVxuICBPYmplY3Qua2V5cyhhdHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgIHZhciBhdHQgPSBhdHRzW2ZpbGVuYW1lXTtcbiAgICBhdHQuZGF0YSA9IGI2NFRvQmx1ZmZlcihhdHQuZGF0YSwgYXR0LmNvbnRlbnRfdHlwZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVEb2NJZChpZCkge1xuICBpZiAoL15fZGVzaWduLy50ZXN0KGlkKSkge1xuICAgIHJldHVybiAnX2Rlc2lnbi8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkLnNsaWNlKDgpKTtcbiAgfVxuICBpZiAoL15fbG9jYWwvLnRlc3QoaWQpKSB7XG4gICAgcmV0dXJuICdfbG9jYWwvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZC5zbGljZSg3KSk7XG4gIH1cbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpZCk7XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NBdHRhY2htZW50cyQxKGRvYykge1xuICBpZiAoIWRvYy5fYXR0YWNobWVudHMgfHwgIU9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGF0dGFjaG1lbnQgPSBkb2MuX2F0dGFjaG1lbnRzW2tleV07XG4gICAgaWYgKGF0dGFjaG1lbnQuZGF0YSAmJiB0eXBlb2YgYXR0YWNobWVudC5kYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGJsb2JUb0Jhc2U2NChhdHRhY2htZW50LmRhdGEsIHJlc29sdmUpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoYjY0KSB7XG4gICAgICAgIGF0dGFjaG1lbnQuZGF0YSA9IGI2NDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBoYXNVcmxQcmVmaXgob3B0cykge1xuICBpZiAoIW9wdHMucHJlZml4KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90b2NvbCA9IHBhcnNlVXJpKG9wdHMucHJlZml4KS5wcm90b2NvbDtcbiAgcmV0dXJuIHByb3RvY29sID09PSAnaHR0cCcgfHwgcHJvdG9jb2wgPT09ICdodHRwcyc7XG59XG5cbi8vIEdldCBhbGwgdGhlIGluZm9ybWF0aW9uIHlvdSBwb3NzaWJseSBjYW4gYWJvdXQgdGhlIFVSSSBnaXZlbiBieSBuYW1lIGFuZFxuLy8gcmV0dXJuIGl0IGFzIGEgc3VpdGFibGUgb2JqZWN0LlxuZnVuY3Rpb24gZ2V0SG9zdChuYW1lLCBvcHRzKSB7XG4gIC8vIGVuY29kZSBkYiBuYW1lIGlmIG9wdHMucHJlZml4IGlzIGEgdXJsICgjNTU3NClcbiAgaWYgKGhhc1VybFByZWZpeChvcHRzKSkge1xuICAgIHZhciBkYk5hbWUgPSBvcHRzLm5hbWUuc3Vic3RyKG9wdHMucHJlZml4Lmxlbmd0aCk7XG4gICAgLy8gRW5zdXJlIHByZWZpeCBoYXMgYSB0cmFpbGluZyBzbGFzaFxuICAgIHZhciBwcmVmaXggPSBvcHRzLnByZWZpeC5yZXBsYWNlKC9cXC8/JC8sICcvJyk7XG4gICAgbmFtZSA9IHByZWZpeCArIGVuY29kZVVSSUNvbXBvbmVudChkYk5hbWUpO1xuICB9XG5cbiAgdmFyIHVyaSA9IHBhcnNlVXJpKG5hbWUpO1xuICBpZiAodXJpLnVzZXIgfHwgdXJpLnBhc3N3b3JkKSB7XG4gICAgdXJpLmF1dGggPSB7dXNlcm5hbWU6IHVyaS51c2VyLCBwYXNzd29yZDogdXJpLnBhc3N3b3JkfTtcbiAgfVxuXG4gIC8vIFNwbGl0IHRoZSBwYXRoIHBhcnQgb2YgdGhlIFVSSSBpbnRvIHBhcnRzIHVzaW5nICcvJyBhcyB0aGUgZGVsaW1pdGVyXG4gIC8vIGFmdGVyIHJlbW92aW5nIGFueSBsZWFkaW5nICcvJyBhbmQgYW55IHRyYWlsaW5nICcvJ1xuICB2YXIgcGFydHMgPSB1cmkucGF0aC5yZXBsYWNlKC8oXlxcL3xcXC8kKS9nLCAnJykuc3BsaXQoJy8nKTtcblxuICB1cmkuZGIgPSBwYXJ0cy5wb3AoKTtcbiAgLy8gUHJldmVudCBkb3VibGUgZW5jb2Rpbmcgb2YgVVJJIGNvbXBvbmVudFxuICBpZiAodXJpLmRiLmluZGV4T2YoJyUnKSA9PT0gLTEpIHtcbiAgICB1cmkuZGIgPSBlbmNvZGVVUklDb21wb25lbnQodXJpLmRiKTtcbiAgfVxuXG4gIHVyaS5wYXRoID0gcGFydHMuam9pbignLycpO1xuXG4gIHJldHVybiB1cmk7XG59XG5cbi8vIEdlbmVyYXRlIGEgVVJMIHdpdGggdGhlIGhvc3QgZGF0YSBnaXZlbiBieSBvcHRzIGFuZCB0aGUgZ2l2ZW4gcGF0aFxuZnVuY3Rpb24gZ2VuREJVcmwob3B0cywgcGF0aCkge1xuICByZXR1cm4gZ2VuVXJsKG9wdHMsIG9wdHMuZGIgKyAnLycgKyBwYXRoKTtcbn1cblxuLy8gR2VuZXJhdGUgYSBVUkwgd2l0aCB0aGUgaG9zdCBkYXRhIGdpdmVuIGJ5IG9wdHMgYW5kIHRoZSBnaXZlbiBwYXRoXG5mdW5jdGlvbiBnZW5Vcmwob3B0cywgcGF0aCkge1xuICAvLyBJZiB0aGUgaG9zdCBhbHJlYWR5IGhhcyBhIHBhdGgsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcGF0aCBkZWxpbWl0ZXJcbiAgLy8gT3RoZXJ3aXNlLCB0aGUgcGF0aCBkZWxpbWl0ZXIgaXMgdGhlIGVtcHR5IHN0cmluZ1xuICB2YXIgcGF0aERlbCA9ICFvcHRzLnBhdGggPyAnJyA6ICcvJztcblxuICAvLyBJZiB0aGUgaG9zdCBhbHJlYWR5IGhhcyBhIHBhdGgsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcGF0aCBkZWxpbWl0ZXJcbiAgLy8gT3RoZXJ3aXNlLCB0aGUgcGF0aCBkZWxpbWl0ZXIgaXMgdGhlIGVtcHR5IHN0cmluZ1xuICByZXR1cm4gb3B0cy5wcm90b2NvbCArICc6Ly8nICsgb3B0cy5ob3N0ICtcbiAgICAgICAgIChvcHRzLnBvcnQgPyAoJzonICsgb3B0cy5wb3J0KSA6ICcnKSArXG4gICAgICAgICAnLycgKyBvcHRzLnBhdGggKyBwYXRoRGVsICsgcGF0aDtcbn1cblxuZnVuY3Rpb24gcGFyYW1zVG9TdHIocGFyYW1zKSB7XG4gIHJldHVybiAnPycgKyBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcChmdW5jdGlvbiAoaykge1xuICAgIHJldHVybiBrICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1trXSk7XG4gIH0pLmpvaW4oJyYnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2FjaGVCdXN0KG9wdHMpIHtcbiAgdmFyIHVhID0gKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQpID9cbiAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSA6ICcnO1xuICB2YXIgaXNJRSA9IHVhLmluZGV4T2YoJ21zaWUnKSAhPT0gLTE7XG4gIHZhciBpc1RyaWRlbnQgPSB1YS5pbmRleE9mKCd0cmlkZW50JykgIT09IC0xO1xuICB2YXIgaXNFZGdlID0gdWEuaW5kZXhPZignZWRnZScpICE9PSAtMTtcbiAgdmFyIGlzR0VUID0gISgnbWV0aG9kJyBpbiBvcHRzKSB8fCBvcHRzLm1ldGhvZCA9PT0gJ0dFVCc7XG4gIHJldHVybiAoaXNJRSB8fCBpc1RyaWRlbnQgfHwgaXNFZGdlKSAmJiBpc0dFVDtcbn1cblxuLy8gSW1wbGVtZW50cyB0aGUgUG91Y2hEQiBBUEkgZm9yIGRlYWxpbmcgd2l0aCBDb3VjaERCIGluc3RhbmNlcyBvdmVyIEhUVFBcbmZ1bmN0aW9uIEh0dHBQb3VjaChvcHRzLCBjYWxsYmFjaykge1xuXG4gIC8vIFRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZSBmb3IgSHR0cFBvdWNoXG4gIHZhciBhcGkgPSB0aGlzO1xuXG4gIHZhciBob3N0ID0gZ2V0SG9zdChvcHRzLm5hbWUsIG9wdHMpO1xuICB2YXIgZGJVcmwgPSBnZW5EQlVybChob3N0LCAnJyk7XG5cbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gIHZhciBvdXJGZXRjaCA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCBuZXcgaCgpO1xuXG4gICAgb3B0aW9ucy5jcmVkZW50aWFscyA9ICdpbmNsdWRlJztcblxuICAgIGlmIChvcHRzLmF1dGggfHwgaG9zdC5hdXRoKSB7XG4gICAgICB2YXIgbkF1dGggPSBvcHRzLmF1dGggfHwgaG9zdC5hdXRoO1xuICAgICAgdmFyIHN0ciA9IG5BdXRoLnVzZXJuYW1lICsgJzonICsgbkF1dGgucGFzc3dvcmQ7XG4gICAgICB2YXIgdG9rZW4gPSB0aGlzQnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpO1xuICAgICAgb3B0aW9ucy5oZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgdG9rZW4pO1xuICAgIH1cblxuICAgIHZhciBoZWFkZXJzID0gb3B0cy5oZWFkZXJzIHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzLmFwcGVuZChrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgfSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2hvdWxkQ2FjaGVCdXN0KG9wdGlvbnMpKSB7XG4gICAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArICdfbm9uY2U9JyArIERhdGUubm93KCk7XG4gICAgfVxuXG4gICAgdmFyIGZldGNoRnVuID0gb3B0cy5mZXRjaCB8fCBmJDE7XG4gICAgcmV0dXJuIGZldGNoRnVuKHVybCwgb3B0aW9ucyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gYWRhcHRlckZ1biQkMShuYW1lLCBmdW4pIHtcbiAgICByZXR1cm4gYWRhcHRlckZ1bihuYW1lLCBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgIH0pO1xuICAgIH0pKS5iaW5kKGFwaSk7XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaEpTT04odXJsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IG5ldyBoKCk7XG5cbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycy5nZXQoJ0FjY2VwdCcpKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXJGZXRjaCh1cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXN1bHQub2sgPSByZXNwb25zZS5vaztcbiAgICAgIHJlc3VsdC5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgIHJlc3VsdC5kYXRhID0ganNvbjtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIHJlc3VsdC5kYXRhLnN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG4gICAgICAgIHZhciBlcnIgPSBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5kYXRhKSkge1xuICAgICAgICByZXN1bHQuZGF0YSA9IHJlc3VsdC5kYXRhLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICAgIGlmICh2LmVycm9yIHx8IHYubWlzc2luZykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2Uodik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIHNldHVwUHJvbWlzZTtcblxuICBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICBpZiAob3B0cy5za2lwX3NldHVwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBzZXR1cCBpbiBwcm9jZXNzIG9yIHByZXZpb3VzIHN1Y2Nlc3NmdWwgc2V0dXBcbiAgICAvLyBkb25lIHRoZW4gd2Ugd2lsbCB1c2UgdGhhdFxuICAgIC8vIElmIHByZXZpb3VzIHNldHVwcyBoYXZlIGJlZW4gcmVqZWN0ZWQgd2Ugd2lsbCB0cnkgYWdhaW5cbiAgICBpZiAoc2V0dXBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gc2V0dXBQcm9taXNlO1xuICAgIH1cblxuICAgIHNldHVwUHJvbWlzZSA9IGZldGNoSlNPTihkYlVybCkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzICYmIGVyci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAvLyBEb2VzbnQgZXhpc3QsIGNyZWF0ZSBpdFxuICAgICAgICBleHBsYWluRXJyb3IoNDA0LCAnUG91Y2hEQiBpcyBqdXN0IGRldGVjdGluZyBpZiB0aGUgcmVtb3RlIGV4aXN0cy4nKTtcbiAgICAgICAgcmV0dXJuIGZldGNoSlNPTihkYlVybCwge21ldGhvZDogJ1BVVCd9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8vIElmIHdlIHRyeSB0byBjcmVhdGUgYSBkYXRhYmFzZSB0aGF0IGFscmVhZHkgZXhpc3RzLCBza2lwcGVkIGluXG4gICAgICAvLyBpc3RhbmJ1bCBzaW5jZSBpdHMgY2F0Y2hpbmcgYSByYWNlIGNvbmRpdGlvbi5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzICYmIGVyci5zdGF0dXMgPT09IDQxMikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgc2V0dXBQcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldHVwUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2V0dXBQcm9taXNlO1xuICB9XG5cbiAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhudWxsLCBhcGkpO1xuICB9KTtcblxuICBhcGkuX3JlbW90ZSA9IHRydWU7XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgYXBpLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdodHRwJztcbiAgfTtcblxuICBhcGkuaWQgPSBhZGFwdGVyRnVuJCQxKCdpZCcsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIG91ckZldGNoKGdlblVybChob3N0LCAnJykpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIC8vIEJhZCByZXNwb25zZSBvciBtaXNzaW5nIGB1dWlkYCBzaG91bGQgbm90IHByZXZlbnQgSUQgZ2VuZXJhdGlvbi5cbiAgICAgIHZhciB1dWlkJCQxID0gKHJlc3VsdCAmJiByZXN1bHQudXVpZCkgP1xuICAgICAgICAgIChyZXN1bHQudXVpZCArIGhvc3QuZGIpIDogZ2VuREJVcmwoaG9zdCwgJycpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgdXVpZCQkMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFNlbmRzIGEgUE9TVCByZXF1ZXN0IHRvIHRoZSBob3N0IGNhbGxpbmcgdGhlIGNvdWNoZGIgX2NvbXBhY3QgZnVuY3Rpb25cbiAgLy8gICAgdmVyc2lvbjogVGhlIHZlcnNpb24gb2YgQ291Y2hEQiBpdCBpcyBydW5uaW5nXG4gIGFwaS5jb21wYWN0ID0gYWRhcHRlckZ1biQkMSgnY29tcGFjdCcsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19jb21wYWN0JyksIHttZXRob2Q6ICdQT1NUJ30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gcGluZygpIHtcbiAgICAgICAgYXBpLmluZm8oZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgICAgLy8gQ291Y2hEQiBtYXkgc2VuZCBhIFwiY29tcGFjdF9ydW5uaW5nOnRydWVcIiBpZiBpdCdzXG4gICAgICAgICAgLy8gYWxyZWFkeSBjb21wYWN0aW5nLiBQb3VjaERCIFNlcnZlciBkb2Vzbid0LlxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKHJlcyAmJiAhcmVzLmNvbXBhY3RfcnVubmluZykge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge29rOiB0cnVlfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocGluZywgb3B0cy5pbnRlcnZhbCB8fCAyMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBQaW5nIHRoZSBodHRwIGlmIGl0J3MgZmluaXNoZWQgY29tcGFjdGlvblxuICAgICAgcGluZygpO1xuICAgIH0pO1xuICB9KTtcblxuICBhcGkuYnVsa0dldCA9IGFkYXB0ZXJGdW4oJ2J1bGtHZXQnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBkb0J1bGtHZXQoY2IpIHtcbiAgICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICAgIGlmIChvcHRzLnJldnMpIHtcbiAgICAgICAgcGFyYW1zLnJldnMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcGFyYW1zLmF0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmxhdGVzdCkge1xuICAgICAgICBwYXJhbXMubGF0ZXN0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2J1bGtfZ2V0JyArIHBhcmFtc1RvU3RyKHBhcmFtcykpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRvY3M6IG9wdHMuZG9jc30pXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5iaW5hcnkpIHtcbiAgICAgICAgICByZXN1bHQuZGF0YS5yZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgcmVzLmRvY3MuZm9yRWFjaChyZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2IobnVsbCwgcmVzdWx0LmRhdGEpO1xuICAgICAgfSkuY2F0Y2goY2IpO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZnVuY3Rpb24gZG9CdWxrR2V0U2hpbSgpIHtcbiAgICAgIC8vIGF2b2lkIFwidXJsIHRvbyBsb25nIGVycm9yXCIgYnkgc3BsaXR0aW5nIHVwIGludG8gbXVsdGlwbGUgcmVxdWVzdHNcbiAgICAgIHZhciBiYXRjaFNpemUgPSBNQVhfU0lNVUxUQU5FT1VTX1JFVlM7XG4gICAgICB2YXIgbnVtQmF0Y2hlcyA9IE1hdGguY2VpbChvcHRzLmRvY3MubGVuZ3RoIC8gYmF0Y2hTaXplKTtcbiAgICAgIHZhciBudW1Eb25lID0gMDtcbiAgICAgIHZhciByZXN1bHRzID0gbmV3IEFycmF5KG51bUJhdGNoZXMpO1xuXG4gICAgICBmdW5jdGlvbiBvblJlc3VsdChiYXRjaE51bSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgICAgLy8gZXJyIGlzIGltcG9zc2libGUgYmVjYXVzZSBzaGltIHJldHVybnMgYSBsaXN0IG9mIGVycnMgaW4gdGhhdCBjYXNlXG4gICAgICAgICAgcmVzdWx0c1tiYXRjaE51bV0gPSByZXMucmVzdWx0cztcbiAgICAgICAgICBpZiAoKytudW1Eb25lID09PSBudW1CYXRjaGVzKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7cmVzdWx0czogZmxhdHRlbihyZXN1bHRzKX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1CYXRjaGVzOyBpKyspIHtcbiAgICAgICAgdmFyIHN1Yk9wdHMgPSBwaWNrKG9wdHMsIFsncmV2cycsICdhdHRhY2htZW50cycsICdiaW5hcnknLCAnbGF0ZXN0J10pO1xuICAgICAgICBzdWJPcHRzLmRvY3MgPSBvcHRzLmRvY3Muc2xpY2UoaSAqIGJhdGNoU2l6ZSxcbiAgICAgICAgICBNYXRoLm1pbihvcHRzLmRvY3MubGVuZ3RoLCAoaSArIDEpICogYmF0Y2hTaXplKSk7XG4gICAgICAgIGJ1bGtHZXQoc2VsZiwgc3ViT3B0cywgb25SZXN1bHQoaSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1hcmsgdGhlIHdob2xlIGRhdGFiYXNlIGFzIGVpdGhlciBzdXBwb3J0aW5nIG9yIG5vdCBzdXBwb3J0aW5nIF9idWxrX2dldFxuICAgIHZhciBkYlVybCA9IGdlblVybChob3N0LCAnJyk7XG4gICAgdmFyIHN1cHBvcnRzQnVsa0dldCA9IHN1cHBvcnRzQnVsa0dldE1hcFtkYlVybF07XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2Ygc3VwcG9ydHNCdWxrR2V0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgZGF0YWJhc2Ugc3VwcG9ydHMgX2J1bGtfZ2V0XG4gICAgICBkb0J1bGtHZXQoZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBzdXBwb3J0c0J1bGtHZXRNYXBbZGJVcmxdID0gZmFsc2U7XG4gICAgICAgICAgZXhwbGFpbkVycm9yKFxuICAgICAgICAgICAgZXJyLnN0YXR1cyxcbiAgICAgICAgICAgICdQb3VjaERCIGlzIGp1c3QgZGV0ZWN0aW5nIGlmIHRoZSByZW1vdGUgJyArXG4gICAgICAgICAgICAnc3VwcG9ydHMgdGhlIF9idWxrX2dldCBBUEkuJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZG9CdWxrR2V0U2hpbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1cHBvcnRzQnVsa0dldE1hcFtkYlVybF0gPSB0cnVlO1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNCdWxrR2V0KSB7XG4gICAgICBkb0J1bGtHZXQoY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb0J1bGtHZXRTaGltKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDYWxscyBHRVQgb24gdGhlIGhvc3QsIHdoaWNoIGdldHMgYmFjayBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmdcbiAgLy8gICAgY291Y2hkYjogQSB3ZWxjb21lIHN0cmluZ1xuICAvLyAgICB2ZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiBDb3VjaERCIGl0IGlzIHJ1bm5pbmdcbiAgYXBpLl9pbmZvID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvdXJGZXRjaChnZW5EQlVybChob3N0LCAnJykpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgIGluZm8uaG9zdCA9IGdlbkRCVXJsKGhvc3QsICcnKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGluZm8pO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgfTtcblxuICBhcGkuZmV0Y2ggPSBmdW5jdGlvbiAocGF0aCwgb3B0aW9ucykge1xuICAgIHJldHVybiBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHVybCA9IHBhdGguc3Vic3RyaW5nKDAsIDEpID09PSAnLycgP1xuICAgICAgICBnZW5VcmwoaG9zdCwgcGF0aC5zdWJzdHJpbmcoMSkpIDpcbiAgICAgICAgZ2VuREJVcmwoaG9zdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb3VyRmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBHZXQgdGhlIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIGlkIGZyb20gdGhlIGRhdGFiYXNlIGdpdmVuIGJ5IGhvc3QuXG4gIC8vIFRoZSBpZCBjb3VsZCBiZSBzb2xlbHkgdGhlIF9pZCBpbiB0aGUgZGF0YWJhc2UsIG9yIGl0IG1heSBiZSBhXG4gIC8vIF9kZXNpZ24vSUQgb3IgX2xvY2FsL0lEIHBhdGhcbiAgYXBpLmdldCA9IGFkYXB0ZXJGdW4kJDEoJ2dldCcsIGZ1bmN0aW9uIChpZCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAvLyBJZiBubyBvcHRpb25zIHdlcmUgZ2l2ZW4sIHNldCB0aGUgY2FsbGJhY2sgdG8gdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgLy8gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgR0VUIHJlcXVlc3RcbiAgICB2YXIgcGFyYW1zID0ge307XG5cbiAgICBpZiAob3B0cy5yZXZzKSB7XG4gICAgICBwYXJhbXMucmV2cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2c19pbmZvKSB7XG4gICAgICBwYXJhbXMucmV2c19pbmZvID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5sYXRlc3QpIHtcbiAgICAgIHBhcmFtcy5sYXRlc3QgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm9wZW5fcmV2cykge1xuICAgICAgaWYgKG9wdHMub3Blbl9yZXZzICE9PSBcImFsbFwiKSB7XG4gICAgICAgIG9wdHMub3Blbl9yZXZzID0gSlNPTi5zdHJpbmdpZnkob3B0cy5vcGVuX3JldnMpO1xuICAgICAgfVxuICAgICAgcGFyYW1zLm9wZW5fcmV2cyA9IG9wdHMub3Blbl9yZXZzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnJldikge1xuICAgICAgcGFyYW1zLnJldiA9IG9wdHMucmV2O1xuICAgIH1cblxuICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgcGFyYW1zLmNvbmZsaWN0cyA9IG9wdHMuY29uZmxpY3RzO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgIHBhcmFtcy51cGRhdGVfc2VxID0gb3B0cy51cGRhdGVfc2VxO1xuICAgIH1cblxuICAgIGlkID0gZW5jb2RlRG9jSWQoaWQpO1xuXG4gICAgZnVuY3Rpb24gZmV0Y2hBdHRhY2htZW50cyhkb2MpIHtcbiAgICAgIHZhciBhdHRzID0gZG9jLl9hdHRhY2htZW50cztcbiAgICAgIHZhciBmaWxlbmFtZXMgPSBhdHRzICYmIE9iamVjdC5rZXlzKGF0dHMpO1xuICAgICAgaWYgKCFhdHRzIHx8ICFmaWxlbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIHdlIGZldGNoIHRoZXNlIG1hbnVhbGx5IGluIHNlcGFyYXRlIFhIUnMsIGJlY2F1c2VcbiAgICAgIC8vIFN5bmMgR2F0ZXdheSB3b3VsZCBub3JtYWxseSBzZW5kIGl0IGJhY2sgYXMgbXVsdGlwYXJ0L21peGVkLFxuICAgICAgLy8gd2hpY2ggd2UgY2Fubm90IHBhcnNlLiBBbHNvLCB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW5cbiAgICAgIC8vIHJlY2VpdmluZyBhdHRhY2htZW50cyBhcyBiYXNlNjQtZW5jb2RlZCBzdHJpbmdzLlxuICAgICAgZnVuY3Rpb24gZmV0Y2hEYXRhKGZpbGVuYW1lKSB7XG4gICAgICAgIHZhciBhdHQgPSBhdHRzW2ZpbGVuYW1lXTtcbiAgICAgICAgdmFyIHBhdGggPSBlbmNvZGVEb2NJZChkb2MuX2lkKSArICcvJyArIGVuY29kZUF0dGFjaG1lbnRJZChmaWxlbmFtZSkgK1xuICAgICAgICAgICAgJz9yZXY9JyArIGRvYy5fcmV2O1xuICAgICAgICByZXR1cm4gb3VyRmV0Y2goZ2VuREJVcmwoaG9zdCwgcGF0aCkpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKCdidWZmZXInIGluIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYnVmZmVyKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICAgICAgICAgIGlmIChvcHRzLmJpbmFyeSkge1xuICAgICAgICAgICAgdmFyIHR5cGVGaWVsZERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJsb2IuX19wcm90b19fLCAndHlwZScpO1xuICAgICAgICAgICAgaWYgKCF0eXBlRmllbGREZXNjcmlwdG9yIHx8IHR5cGVGaWVsZERlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgICAgICAgIGJsb2IudHlwZSA9IGF0dC5jb250ZW50X3R5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmxvYjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBibG9iVG9CYXNlNjQoYmxvYiwgcmVzb2x2ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBkZWxldGUgYXR0LnN0dWI7XG4gICAgICAgICAgZGVsZXRlIGF0dC5sZW5ndGg7XG4gICAgICAgICAgYXR0LmRhdGEgPSBkYXRhO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb21pc2VGYWN0b3JpZXMgPSBmaWxlbmFtZXMubWFwKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBmZXRjaERhdGEoZmlsZW5hbWUpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2YgcGFyYWxsZWwgeGhyIHJlcXVlc3RzIHRvIDUgYW55IHRpbWVcbiAgICAgIC8vIHRvIGF2b2lkIGlzc3VlcyB3aXRoIG1heGltdW0gYnJvd3NlciByZXF1ZXN0IGxpbWl0c1xuICAgICAgcmV0dXJuIHBvb2wocHJvbWlzZUZhY3RvcmllcywgNSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmV0Y2hBbGxBdHRhY2htZW50cyhkb2NPckRvY3MpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRvY09yRG9jcykpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRvY09yRG9jcy5tYXAoZnVuY3Rpb24gKGRvYykge1xuICAgICAgICAgIGlmIChkb2Mub2spIHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaEF0dGFjaG1lbnRzKGRvYy5vayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmV0Y2hBdHRhY2htZW50cyhkb2NPckRvY3MpO1xuICAgIH1cblxuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBpZCArIHBhcmFtc1RvU3RyKHBhcmFtcykpO1xuICAgIGZldGNoSlNPTih1cmwpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgICAgIHJldHVybiBmZXRjaEFsbEF0dGFjaG1lbnRzKHJlcy5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlcy5kYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLmRvY0lkID0gaWQ7XG4gICAgICBjYWxsYmFjayhlKTtcbiAgICB9KTtcbiAgfSk7XG5cblxuICAvLyBEZWxldGUgdGhlIGRvY3VtZW50IGdpdmVuIGJ5IGRvYyBmcm9tIHRoZSBkYXRhYmFzZSBnaXZlbiBieSBob3N0LlxuICBhcGkucmVtb3ZlID0gYWRhcHRlckZ1biQkMSgncmVtb3ZlJywgZnVuY3Rpb24gKGRvY09ySWQsIG9wdHNPclJldiwgb3B0cywgY2IpIHtcbiAgICB2YXIgZG9jO1xuICAgIGlmICh0eXBlb2Ygb3B0c09yUmV2ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gaWQsIHJldiwgb3B0cywgY2FsbGJhY2sgc3R5bGVcbiAgICAgIGRvYyA9IHtcbiAgICAgICAgX2lkOiBkb2NPcklkLFxuICAgICAgICBfcmV2OiBvcHRzT3JSZXZcbiAgICAgIH07XG4gICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBvcHRzO1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvYywgb3B0cywgY2FsbGJhY2sgc3R5bGVcbiAgICAgIGRvYyA9IGRvY09ySWQ7XG4gICAgICBpZiAodHlwZW9mIG9wdHNPclJldiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdHNPclJldjtcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2IgPSBvcHRzO1xuICAgICAgICBvcHRzID0gb3B0c09yUmV2O1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXYgPSAoZG9jLl9yZXYgfHwgb3B0cy5yZXYpO1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBlbmNvZGVEb2NJZChkb2MuX2lkKSkgKyAnP3Jldj0nICsgcmV2O1xuXG4gICAgZmV0Y2hKU09OKHVybCwge21ldGhvZDogJ0RFTEVURSd9LCBjYikuY2F0Y2goY2IpO1xuICB9KTtcblxuICBmdW5jdGlvbiBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnRJZC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG4gIH1cblxuICAvLyBHZXQgdGhlIGF0dGFjaG1lbnRcbiAgYXBpLmdldEF0dGFjaG1lbnQgPSBhZGFwdGVyRnVuJCQxKCdnZXRBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICB2YXIgcGFyYW1zID0gb3B0cy5yZXYgPyAoJz9yZXY9JyArIG9wdHMucmV2KSA6ICcnO1xuICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCBlbmNvZGVEb2NJZChkb2NJZCkpICsgJy8nICtcbiAgICAgICAgZW5jb2RlQXR0YWNobWVudElkKGF0dGFjaG1lbnRJZCkgKyBwYXJhbXM7XG4gICAgdmFyIGNvbnRlbnRUeXBlO1xuICAgIG91ckZldGNoKHVybCwge21ldGhvZDogJ0dFVCd9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IHJlc3BvbnNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhcHJvY2Vzcy5icm93c2VyICYmIHR5cGVvZiByZXNwb25zZS5idWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYnVmZmVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkudGhlbihmdW5jdGlvbiAoYmxvYikge1xuICAgICAgLy8gVE9ETzogYWxzbyByZW1vdmVcbiAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgIXByb2Nlc3MuYnJvd3Nlcikge1xuICAgICAgICBibG9iLnR5cGUgPSBjb250ZW50VHlwZTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGJsb2IpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFJlbW92ZSB0aGUgYXR0YWNobWVudCBnaXZlbiBieSB0aGUgaWQgYW5kIHJldlxuICBhcGkucmVtb3ZlQXR0YWNobWVudCA9ICBhZGFwdGVyRnVuJCQxKCdyZW1vdmVBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spIHtcbiAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgZW5jb2RlRG9jSWQoZG9jSWQpICsgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlQXR0YWNobWVudElkKGF0dGFjaG1lbnRJZCkpICsgJz9yZXY9JyArIHJldjtcbiAgICBmZXRjaEpTT04odXJsLCB7bWV0aG9kOiAnREVMRVRFJ30sIGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG4gIH0pO1xuXG4gIC8vIEFkZCB0aGUgYXR0YWNobWVudCBnaXZlbiBieSBibG9iIGFuZCBpdHMgY29udGVudFR5cGUgcHJvcGVydHlcbiAgLy8gdG8gdGhlIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIGlkLCB0aGUgcmV2aXNpb24gZ2l2ZW4gYnkgcmV2LCBhbmRcbiAgLy8gYWRkIGl0IHRvIHRoZSBkYXRhYmFzZSBnaXZlbiBieSBob3N0LlxuICBhcGkucHV0QXR0YWNobWVudCA9IGFkYXB0ZXJGdW4kJDEoJ3B1dEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldiwgYmxvYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IHR5cGU7XG4gICAgICB0eXBlID0gYmxvYjtcbiAgICAgIGJsb2IgPSByZXY7XG4gICAgICByZXYgPSBudWxsO1xuICAgIH1cbiAgICB2YXIgaWQgPSBlbmNvZGVEb2NJZChkb2NJZCkgKyAnLycgKyBlbmNvZGVBdHRhY2htZW50SWQoYXR0YWNobWVudElkKTtcbiAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgaWQpO1xuICAgIGlmIChyZXYpIHtcbiAgICAgIHVybCArPSAnP3Jldj0nICsgcmV2O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIGlucHV0IGlzIGFzc3VtZWQgdG8gYmUgYSBiYXNlNjQgc3RyaW5nXG4gICAgICB2YXIgYmluYXJ5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmluYXJ5ID0gdGhpc0F0b2IoYmxvYik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKEJBRF9BUkcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQXR0YWNobWVudCBpcyBub3QgYSB2YWxpZCBiYXNlNjQgc3RyaW5nJykpO1xuICAgICAgfVxuICAgICAgYmxvYiA9IGJpbmFyeSA/IGJpblN0cmluZ1RvQmx1ZmZlcihiaW5hcnksIHR5cGUpIDogJyc7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBhdHRhY2htZW50XG4gICAgZmV0Y2hKU09OKHVybCwge1xuICAgICAgaGVhZGVyczogbmV3IGgoeydDb250ZW50LVR5cGUnOiB0eXBlfSksXG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgYm9keTogYmxvYlxuICAgIH0sIGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZS9jcmVhdGUgbXVsdGlwbGUgZG9jdW1lbnRzIGdpdmVuIGJ5IHJlcSBpbiB0aGUgZGF0YWJhc2VcbiAgLy8gZ2l2ZW4gYnkgaG9zdC5cbiAgYXBpLl9idWxrRG9jcyA9IGZ1bmN0aW9uIChyZXEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgLy8gSWYgbmV3X2VkaXRzPWZhbHNlIHRoZW4gaXQgcHJldmVudHMgdGhlIGRhdGFiYXNlIGZyb20gY3JlYXRpbmdcbiAgICAvLyBuZXcgcmV2aXNpb24gbnVtYmVycyBmb3IgdGhlIGRvY3VtZW50cy4gSW5zdGVhZCBpdCBqdXN0IHVzZXNcbiAgICAvLyB0aGUgb2xkIG9uZXMuIFRoaXMgaXMgdXNlZCBpbiBkYXRhYmFzZSByZXBsaWNhdGlvbi5cbiAgICByZXEubmV3X2VkaXRzID0gb3B0cy5uZXdfZWRpdHM7XG5cbiAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlcS5kb2NzLm1hcChwcmVwcm9jZXNzQXR0YWNobWVudHMkMSkpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVXBkYXRlL2NyZWF0ZSB0aGUgZG9jdW1lbnRzXG4gICAgICByZXR1cm4gZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfYnVsa19kb2NzJyksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcSlcbiAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gIH07XG5cblxuICAvLyBVcGRhdGUvY3JlYXRlIGRvY3VtZW50XG4gIGFwaS5fcHV0ID0gZnVuY3Rpb24gKGRvYywgb3B0cywgY2FsbGJhY2spIHtcbiAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHByZXByb2Nlc3NBdHRhY2htZW50cyQxKGRvYyk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvYy5faWQpKSwge1xuICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkb2MpXG4gICAgICB9KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5kYXRhKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBlcnIuZG9jSWQgPSBkb2MgJiYgZG9jLl9pZDtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gIH07XG5cblxuICAvLyBHZXQgYSBsaXN0aW5nIG9mIHRoZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlIGdpdmVuXG4gIC8vIGJ5IGhvc3QgYW5kIG9yZGVyZWQgYnkgaW5jcmVhc2luZyBpZC5cbiAgYXBpLmFsbERvY3MgPSBhZGFwdGVyRnVuJCQxKCdhbGxEb2NzJywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICAgIC8vIExpc3Qgb2YgcGFyYW1ldGVycyB0byBhZGQgdG8gdGhlIEdFVCByZXF1ZXN0XG4gICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgIHZhciBib2R5O1xuICAgIHZhciBtZXRob2QgPSAnR0VUJztcblxuICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgcGFyYW1zLmNvbmZsaWN0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgcGFyYW1zLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgIHBhcmFtcy5kZXNjZW5kaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgIHBhcmFtcy5pbmNsdWRlX2RvY3MgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIGFkZGVkIGluIENvdWNoREIgMS42LjBcbiAgICBpZiAob3B0cy5hdHRhY2htZW50cykge1xuICAgICAgcGFyYW1zLmF0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5rZXkpIHtcbiAgICAgIHBhcmFtcy5rZXkgPSBKU09OLnN0cmluZ2lmeShvcHRzLmtleSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc3RhcnRfa2V5KSB7XG4gICAgICBvcHRzLnN0YXJ0a2V5ID0gb3B0cy5zdGFydF9rZXk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc3RhcnRrZXkpIHtcbiAgICAgIHBhcmFtcy5zdGFydGtleSA9IEpTT04uc3RyaW5naWZ5KG9wdHMuc3RhcnRrZXkpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuZF9rZXkpIHtcbiAgICAgIG9wdHMuZW5ka2V5ID0gb3B0cy5lbmRfa2V5O1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuZGtleSkge1xuICAgICAgcGFyYW1zLmVuZGtleSA9IEpTT04uc3RyaW5naWZ5KG9wdHMuZW5ka2V5KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuaW5jbHVzaXZlX2VuZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5pbmNsdXNpdmVfZW5kID0gISFvcHRzLmluY2x1c2l2ZV9lbmQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmxpbWl0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmxpbWl0ID0gb3B0cy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuc2tpcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5za2lwID0gb3B0cy5za2lwO1xuICAgIH1cblxuICAgIHZhciBwYXJhbVN0ciA9IHBhcmFtc1RvU3RyKHBhcmFtcyk7XG5cbiAgICBpZiAodHlwZW9mIG9wdHMua2V5cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgIGJvZHkgPSB7a2V5czogb3B0cy5rZXlzfTtcbiAgICB9XG5cbiAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19hbGxfZG9jcycgKyBwYXJhbVN0ciksIHtcbiAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MgJiYgb3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmJpbmFyeSkge1xuICAgICAgICByZXN1bHQuZGF0YS5yb3dzLmZvckVhY2gocmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIpO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0LmRhdGEpO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgLy8gR2V0IGEgbGlzdCBvZiBjaGFuZ2VzIG1hZGUgdG8gZG9jdW1lbnRzIGluIHRoZSBkYXRhYmFzZSBnaXZlbiBieSBob3N0LlxuICAvLyBUT0RPIEFjY29yZGluZyB0byB0aGUgUkVBRE1FLCB0aGVyZSBzaG91bGQgYmUgdHdvIG90aGVyIG1ldGhvZHMgaGVyZSxcbiAgLy8gYXBpLmNoYW5nZXMuYWRkTGlzdGVuZXIgYW5kIGFwaS5jaGFuZ2VzLnJlbW92ZUxpc3RlbmVyLlxuICBhcGkuX2NoYW5nZXMgPSBmdW5jdGlvbiAob3B0cykge1xuXG4gICAgLy8gV2UgaW50ZXJuYWxseSBwYWdlIHRoZSByZXN1bHRzIG9mIGEgY2hhbmdlcyByZXF1ZXN0LCB0aGlzIG1lYW5zXG4gICAgLy8gaWYgdGhlcmUgaXMgYSBsYXJnZSBzZXQgb2YgY2hhbmdlcyB0byBiZSByZXR1cm5lZCB3ZSBjYW4gc3RhcnRcbiAgICAvLyBwcm9jZXNzaW5nIHRoZW0gcXVpY2tlciBpbnN0ZWFkIG9mIHdhaXRpbmcgb24gdGhlIGVudGlyZVxuICAgIC8vIHNldCBvZiBjaGFuZ2VzIHRvIHJldHVybiBhbmQgYXR0ZW1wdGluZyB0byBwcm9jZXNzIHRoZW0gYXQgb25jZVxuICAgIHZhciBiYXRjaFNpemUgPSAnYmF0Y2hfc2l6ZScgaW4gb3B0cyA/IG9wdHMuYmF0Y2hfc2l6ZSA6IENIQU5HRVNfQkFUQ0hfU0laRTtcblxuICAgIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICAgIGlmIChvcHRzLmNvbnRpbnVvdXMgJiYgISgnaGVhcnRiZWF0JyBpbiBvcHRzKSkge1xuICAgICAgb3B0cy5oZWFydGJlYXQgPSBERUZBVUxUX0hFQVJUQkVBVDtcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdFRpbWVvdXQgPSAoJ3RpbWVvdXQnIGluIG9wdHMpID8gb3B0cy50aW1lb3V0IDogMzAgKiAxMDAwO1xuXG4gICAgLy8gZW5zdXJlIENIQU5HRVNfVElNRU9VVF9CVUZGRVIgYXBwbGllc1xuICAgIGlmICgndGltZW91dCcgaW4gb3B0cyAmJiBvcHRzLnRpbWVvdXQgJiZcbiAgICAgIChyZXF1ZXN0VGltZW91dCAtIG9wdHMudGltZW91dCkgPCBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSKSB7XG4gICAgICAgIHJlcXVlc3RUaW1lb3V0ID0gb3B0cy50aW1lb3V0ICsgQ0hBTkdFU19USU1FT1VUX0JVRkZFUjtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoJ2hlYXJ0YmVhdCcgaW4gb3B0cyAmJiBvcHRzLmhlYXJ0YmVhdCAmJlxuICAgICAgIChyZXF1ZXN0VGltZW91dCAtIG9wdHMuaGVhcnRiZWF0KSA8IENIQU5HRVNfVElNRU9VVF9CVUZGRVIpIHtcbiAgICAgICAgcmVxdWVzdFRpbWVvdXQgPSBvcHRzLmhlYXJ0YmVhdCArIENIQU5HRVNfVElNRU9VVF9CVUZGRVI7XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgIGlmICgndGltZW91dCcgaW4gb3B0cyAmJiBvcHRzLnRpbWVvdXQpIHtcbiAgICAgIHBhcmFtcy50aW1lb3V0ID0gb3B0cy50aW1lb3V0O1xuICAgIH1cblxuICAgIHZhciBsaW1pdCA9ICh0eXBlb2Ygb3B0cy5saW1pdCAhPT0gJ3VuZGVmaW5lZCcpID8gb3B0cy5saW1pdCA6IGZhbHNlO1xuICAgIHZhciBsZWZ0VG9GZXRjaCA9IGxpbWl0O1xuXG4gICAgaWYgKG9wdHMuc3R5bGUpIHtcbiAgICAgIHBhcmFtcy5zdHlsZSA9IG9wdHMuc3R5bGU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzIHx8IG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGFyYW1zLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIHBhcmFtcy5hdHRhY2htZW50cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY29udGludW91cykge1xuICAgICAgcGFyYW1zLmZlZWQgPSAnbG9uZ3BvbGwnO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnNlcV9pbnRlcnZhbCkge1xuICAgICAgcGFyYW1zLnNlcV9pbnRlcnZhbCA9IG9wdHMuc2VxX2ludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgcGFyYW1zLmNvbmZsaWN0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgcGFyYW1zLmRlc2NlbmRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgIHBhcmFtcy51cGRhdGVfc2VxID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoJ2hlYXJ0YmVhdCcgaW4gb3B0cykge1xuICAgICAgLy8gSWYgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcyBmYWxzZSwgaXQgZGlzYWJsZXMgdGhlIGRlZmF1bHQgaGVhcnRiZWF0XG4gICAgICBpZiAob3B0cy5oZWFydGJlYXQpIHtcbiAgICAgICAgcGFyYW1zLmhlYXJ0YmVhdCA9IG9wdHMuaGVhcnRiZWF0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXJhbXMuZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMudmlldyAmJiB0eXBlb2Ygb3B0cy52aWV3ID09PSAnc3RyaW5nJykge1xuICAgICAgcGFyYW1zLmZpbHRlciA9ICdfdmlldyc7XG4gICAgICBwYXJhbXMudmlldyA9IG9wdHMudmlldztcbiAgICB9XG5cbiAgICAvLyBJZiBvcHRzLnF1ZXJ5X3BhcmFtcyBleGlzdHMsIHBhc3MgaXQgdGhyb3VnaCB0byB0aGUgY2hhbmdlcyByZXF1ZXN0LlxuICAgIC8vIFRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlIHVzZWQgYnkgdGhlIGZpbHRlciBvbiB0aGUgc291cmNlIGRhdGFiYXNlLlxuICAgIGlmIChvcHRzLnF1ZXJ5X3BhcmFtcyAmJiB0eXBlb2Ygb3B0cy5xdWVyeV9wYXJhbXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKHZhciBwYXJhbV9uYW1lIGluIG9wdHMucXVlcnlfcGFyYW1zKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0cy5xdWVyeV9wYXJhbXMsIHBhcmFtX25hbWUpKSB7XG4gICAgICAgICAgcGFyYW1zW3BhcmFtX25hbWVdID0gb3B0cy5xdWVyeV9wYXJhbXNbcGFyYW1fbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbWV0aG9kID0gJ0dFVCc7XG4gICAgdmFyIGJvZHk7XG5cbiAgICBpZiAob3B0cy5kb2NfaWRzKSB7XG4gICAgICAvLyBzZXQgdGhpcyBhdXRvbWFnaWNhbGx5IGZvciB0aGUgdXNlcjsgaXQncyBhbm5veWluZyB0aGF0IGNvdWNoZGJcbiAgICAgIC8vIHJlcXVpcmVzIGJvdGggYSBcImZpbHRlclwiIGFuZCBhIFwiZG9jX2lkc1wiIHBhcmFtLlxuICAgICAgcGFyYW1zLmZpbHRlciA9ICdfZG9jX2lkcyc7XG4gICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICBib2R5ID0ge2RvY19pZHM6IG9wdHMuZG9jX2lkcyB9O1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGVsc2UgaWYgKG9wdHMuc2VsZWN0b3IpIHtcbiAgICAgIC8vIHNldCB0aGlzIGF1dG9tYWdpY2FsbHkgZm9yIHRoZSB1c2VyLCBzaW1pbGFyIHRvIGFib3ZlXG4gICAgICBwYXJhbXMuZmlsdGVyID0gJ19zZWxlY3Rvcic7XG4gICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICBib2R5ID0ge3NlbGVjdG9yOiBvcHRzLnNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgYSgpO1xuICAgIHZhciBsYXN0RmV0Y2hlZFNlcTtcblxuICAgIC8vIEdldCBhbGwgdGhlIGNoYW5nZXMgc3RhcnRpbmcgd3RpaCB0aGUgb25lIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgIC8vIHNlcXVlbmNlIG51bWJlciBnaXZlbiBieSBzaW5jZS5cbiAgICB2YXIgZmV0Y2hEYXRhID0gZnVuY3Rpb24gKHNpbmNlLCBjYWxsYmFjaykge1xuICAgICAgaWYgKG9wdHMuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXJhbXMuc2luY2UgPSBzaW5jZTtcbiAgICAgIC8vIFwic2luY2VcIiBjYW4gYmUgYW55IGtpbmQgb2YganNvbiBvYmplY3QgaW4gQ2xvdWRhbnQvQ291Y2hEQiAyLnhcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAodHlwZW9mIHBhcmFtcy5zaW5jZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBwYXJhbXMuc2luY2UgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMuc2luY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICAgIGlmIChsaW1pdCkge1xuICAgICAgICAgIHBhcmFtcy5saW1pdCA9IGxlZnRUb0ZldGNoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMubGltaXQgPSAoIWxpbWl0IHx8IGxlZnRUb0ZldGNoID4gYmF0Y2hTaXplKSA/XG4gICAgICAgICAgYmF0Y2hTaXplIDogbGVmdFRvRmV0Y2g7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgb3B0aW9ucyBmb3IgdGhlIGFqYXggY2FsbFxuICAgICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsICdfY2hhbmdlcycgKyBwYXJhbXNUb1N0cihwYXJhbXMpKTtcbiAgICAgIHZhciBmZXRjaE9wdHMgPSB7XG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfTtcbiAgICAgIGxhc3RGZXRjaGVkU2VxID0gc2luY2U7XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKG9wdHMuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgY2hhbmdlc1xuICAgICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoSlNPTih1cmwsIGZldGNoT3B0cywgY2FsbGJhY2spO1xuICAgICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICAvLyBJZiBvcHRzLnNpbmNlIGV4aXN0cywgZ2V0IGFsbCB0aGUgY2hhbmdlcyBmcm9tIHRoZSBzZXF1ZW5jZVxuICAgIC8vIG51bWJlciBnaXZlbiBieSBvcHRzLnNpbmNlLiBPdGhlcndpc2UsIGdldCBhbGwgdGhlIGNoYW5nZXNcbiAgICAvLyBmcm9tIHRoZSBzZXF1ZW5jZSBudW1iZXIgMC5cbiAgICB2YXIgcmVzdWx0cyA9IHtyZXN1bHRzOiBbXX07XG5cbiAgICB2YXIgZmV0Y2hlZCA9IGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgaWYgKG9wdHMuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcmF3X3Jlc3VsdHNfbGVuZ3RoID0gMDtcbiAgICAgIC8vIElmIHRoZSByZXN1bHQgb2YgdGhlIGFqYXggY2FsbCAocmVzKSBjb250YWlucyBjaGFuZ2VzIChyZXMucmVzdWx0cylcbiAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdHMpIHtcbiAgICAgICAgcmF3X3Jlc3VsdHNfbGVuZ3RoID0gcmVzLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICByZXN1bHRzLmxhc3Rfc2VxID0gcmVzLmxhc3Rfc2VxO1xuICAgICAgICB2YXIgcGVuZGluZyA9IG51bGw7XG4gICAgICAgIHZhciBsYXN0U2VxID0gbnVsbDtcbiAgICAgICAgLy8gQXR0YWNoICdwZW5kaW5nJyBwcm9wZXJ0eSBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQgKENvdWNoREIgMi4wKylcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmICh0eXBlb2YgcmVzLnBlbmRpbmcgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHJlcy5wZW5kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0cy5sYXN0X3NlcSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJlc3VsdHMubGFzdF9zZXEgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbGFzdFNlcSA9IHJlc3VsdHMubGFzdF9zZXE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGVhY2ggY2hhbmdlXG4gICAgICAgIHZhciByZXEgPSB7fTtcbiAgICAgICAgcmVxLnF1ZXJ5ID0gb3B0cy5xdWVyeV9wYXJhbXM7XG4gICAgICAgIHJlcy5yZXN1bHRzID0gcmVzLnJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgbGVmdFRvRmV0Y2gtLTtcbiAgICAgICAgICB2YXIgcmV0ID0gZmlsdGVyQ2hhbmdlKG9wdHMpKGMpO1xuICAgICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyAmJiBvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgICAgICAgIHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdHMucmV0dXJuX2RvY3MpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5yZXN1bHRzLnB1c2goYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRzLm9uQ2hhbmdlKGMsIHBlbmRpbmcsIGxhc3RTZXEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHN0b3AgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIGFuZCBjYWxsXG4gICAgICAgIC8vIG9wdHMuY29tcGxldGVcbiAgICAgICAgb3B0cy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgb3B0cy5jb21wbGV0ZShlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjaGFuZ2VzIGZlZWQgbWF5IGhhdmUgdGltZWQgb3V0IHdpdGggbm8gcmVzdWx0c1xuICAgICAgLy8gaWYgc28gcmV1c2UgbGFzdCB1cGRhdGUgc2VxdWVuY2VcbiAgICAgIGlmIChyZXMgJiYgcmVzLmxhc3Rfc2VxKSB7XG4gICAgICAgIGxhc3RGZXRjaGVkU2VxID0gcmVzLmxhc3Rfc2VxO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluaXNoZWQgPSAobGltaXQgJiYgbGVmdFRvRmV0Y2ggPD0gMCkgfHxcbiAgICAgICAgKHJlcyAmJiByYXdfcmVzdWx0c19sZW5ndGggPCBiYXRjaFNpemUpIHx8XG4gICAgICAgIChvcHRzLmRlc2NlbmRpbmcpO1xuXG4gICAgICBpZiAoKG9wdHMuY29udGludW91cyAmJiAhKGxpbWl0ICYmIGxlZnRUb0ZldGNoIDw9IDApKSB8fCAhZmluaXNoZWQpIHtcbiAgICAgICAgLy8gUXVldWUgYSBjYWxsIHRvIGZldGNoIGFnYWluIHdpdGggdGhlIG5ld2VzdCBzZXF1ZW5jZSBudW1iZXJcbiAgICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsgZmV0Y2hEYXRhKGxhc3RGZXRjaGVkU2VxLCBmZXRjaGVkKTsgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSdyZSBkb25lLCBjYWxsIHRoZSBjYWxsYmFja1xuICAgICAgICBvcHRzLmNvbXBsZXRlKG51bGwsIHJlc3VsdHMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmZXRjaERhdGEob3B0cy5zaW5jZSB8fCAwLCBmZXRjaGVkKTtcblxuICAgIC8vIFJldHVybiBhIG1ldGhvZCB0byBjYW5jZWwgdGhpcyBtZXRob2QgZnJvbSBwcm9jZXNzaW5nIGFueSBtb3JlXG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICBvcHRzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBHaXZlbiBhIHNldCBvZiBkb2N1bWVudC9yZXZpc2lvbiBJRHMgKGdpdmVuIGJ5IHJlcSksIHRldHMgdGhlIHN1YnNldCBvZlxuICAvLyB0aG9zZSB0aGF0IGRvIE5PVCBjb3JyZXNwb25kIHRvIHJldmlzaW9ucyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAvLyBTZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9jb3VjaGRiL0h0dHBQb3N0UmV2c0RpZmZcbiAgYXBpLnJldnNEaWZmID0gYWRhcHRlckZ1biQkMSgncmV2c0RpZmYnLCBmdW5jdGlvbiAocmVxLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIC8vIElmIG5vIG9wdGlvbnMgd2VyZSBnaXZlbiwgc2V0IHRoZSBjYWxsYmFjayB0byBiZSB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbWlzc2luZyBkb2N1bWVudC9yZXZpc2lvbiBJRHNcbiAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19yZXZzX2RpZmYnKSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXEpXG4gICAgfSwgY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSk7XG5cbiAgYXBpLl9jbG9zZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG5cbiAgYXBpLl9kZXN0cm95ID0gZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICcnKSwge21ldGhvZDogJ0RFTEVURSd9KS50aGVuKGZ1bmN0aW9uIChqc29uKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBqc29uKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwge29rOiB0cnVlfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufVxuXG4vLyBIdHRwUG91Y2ggaXMgYSB2YWxpZCBhZGFwdGVyLlxuSHR0cFBvdWNoLnZhbGlkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIEh0dHBQb3VjaCQxIChQb3VjaERCKSB7XG4gIFBvdWNoREIuYWRhcHRlcignaHR0cCcsIEh0dHBQb3VjaCwgZmFsc2UpO1xuICBQb3VjaERCLmFkYXB0ZXIoJ2h0dHBzJywgSHR0cFBvdWNoLCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIFF1ZXJ5UGFyc2VFcnJvcihtZXNzYWdlKSB7XG4gIHRoaXMuc3RhdHVzID0gNDAwO1xuICB0aGlzLm5hbWUgPSAncXVlcnlfcGFyc2VfZXJyb3InO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBRdWVyeVBhcnNlRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5pbmhlcml0cyhRdWVyeVBhcnNlRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gTm90Rm91bmRFcnJvcihtZXNzYWdlKSB7XG4gIHRoaXMuc3RhdHVzID0gNDA0O1xuICB0aGlzLm5hbWUgPSAnbm90X2ZvdW5kJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5lcnJvciA9IHRydWU7XG4gIHRyeSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgTm90Rm91bmRFcnJvcik7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbmluaGVyaXRzKE5vdEZvdW5kRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gQnVpbHRJbkVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5zdGF0dXMgPSA1MDA7XG4gIHRoaXMubmFtZSA9ICdpbnZhbGlkX3ZhbHVlJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5lcnJvciA9IHRydWU7XG4gIHRyeSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgQnVpbHRJbkVycm9yKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuaW5oZXJpdHMoQnVpbHRJbkVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIHByb21pc2VkQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjayhyZWFzb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5KGZ1bikge1xuICByZXR1cm4gZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgdmFyIGNiID0gYXJncy5wb3AoKTtcbiAgICB2YXIgcHJvbWlzZSA9IGZ1bi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9taXNlZENhbGxiYWNrKHByb21pc2UsIGNiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0pO1xufVxuXG4vLyBQcm9taXNlIGZpbmFsbHkgdXRpbCBzaW1pbGFyIHRvIFEuZmluYWxseVxuZnVuY3Rpb24gZmluKHByb21pc2UsIGZpbmFsUHJvbWlzZUZhY3RvcnkpIHtcbiAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgcmV0dXJuIGZpbmFsUHJvbWlzZUZhY3RvcnkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICByZXR1cm4gZmluYWxQcm9taXNlRmFjdG9yeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgcmVhc29uO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2VxdWVudGlhbGl6ZShxdWV1ZSwgcHJvbWlzZUZhY3RvcnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHF1ZXVlLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZUZhY3RvcnkuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIHVuaXEgYW4gYXJyYXkgb2Ygc3RyaW5ncywgb3JkZXIgbm90IGd1YXJhbnRlZWRcbi8vIHNpbWlsYXIgdG8gdW5kZXJzY29yZS9sb2Rhc2ggXy51bmlxXG5mdW5jdGlvbiB1bmlxKGFycikge1xuICB2YXIgdGhlU2V0ID0gbmV3IEV4cG9ydGVkU2V0KGFycik7XG4gIHZhciByZXN1bHQgPSBuZXcgQXJyYXkodGhlU2V0LnNpemUpO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdGhlU2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYXBUb0tleXNBcnJheShtYXApIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShtYXAuc2l6ZSk7XG4gIHZhciBpbmRleCA9IC0xO1xuICBtYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IGtleTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5FcnJvcihuYW1lKSB7XG4gIHZhciBtZXNzYWdlID0gJ2J1aWx0aW4gJyArIG5hbWUgK1xuICAgICcgZnVuY3Rpb24gcmVxdWlyZXMgbWFwIHZhbHVlcyB0byBiZSBudW1iZXJzJyArXG4gICAgJyBvciBudW1iZXIgYXJyYXlzJztcbiAgcmV0dXJuIG5ldyBCdWlsdEluRXJyb3IobWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHN1bSh2YWx1ZXMpIHtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgbnVtID0gdmFsdWVzW2ldO1xuICAgIGlmICh0eXBlb2YgbnVtICE9PSAnbnVtYmVyJykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobnVtKSkge1xuICAgICAgICAvLyBsaXN0cyBvZiBudW1iZXJzIGFyZSBhbHNvIGFsbG93ZWQsIHN1bSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgcmVzdWx0ID0gdHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicgPyBbcmVzdWx0XSA6IHJlc3VsdDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpMZW4gPSBudW0ubGVuZ3RoOyBqIDwgakxlbjsgaisrKSB7XG4gICAgICAgICAgdmFyIGpOdW0gPSBudW1bal07XG4gICAgICAgICAgaWYgKHR5cGVvZiBqTnVtICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnVpbHRJbkVycm9yKCdfc3VtJyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0W2pdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goak51bSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFtqXSArPSBqTnVtO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gbm90IGFycmF5L251bWJlclxuICAgICAgICB0aHJvdyBjcmVhdGVCdWlsdEluRXJyb3IoJ19zdW0nKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXN1bHQgKz0gbnVtO1xuICAgIH0gZWxzZSB7IC8vIGFkZCBudW1iZXIgdG8gYXJyYXlcbiAgICAgIHJlc3VsdFswXSArPSBudW07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBsb2cgPSBndWFyZGVkQ29uc29sZS5iaW5kKG51bGwsICdsb2cnKTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciB0b0pTT04gPSBKU09OLnBhcnNlO1xuXG5mdW5jdGlvbiBldmFsRnVuY3Rpb25XaXRoRXZhbChmdW5jLCBlbWl0KSB7XG4gIHJldHVybiBzY29wZUV2YWwoXG4gICAgXCJyZXR1cm4gKFwiICsgZnVuYy5yZXBsYWNlKC87XFxzKiQvLCBcIlwiKSArIFwiKTtcIixcbiAgICB7XG4gICAgICBlbWl0OiBlbWl0LFxuICAgICAgc3VtOiBzdW0sXG4gICAgICBsb2c6IGxvZyxcbiAgICAgIGlzQXJyYXk6IGlzQXJyYXksXG4gICAgICB0b0pTT046IHRvSlNPTlxuICAgIH1cbiAgKTtcbn1cblxuLypcbiAqIFNpbXBsZSB0YXNrIHF1ZXVlIHRvIHNlcXVlbnRpYWxpemUgYWN0aW9ucy4gQXNzdW1lc1xuICogY2FsbGJhY2tzIHdpbGwgZXZlbnR1YWxseSBmaXJlIChvbmNlKS5cbiAqL1xuXG5cbmZ1bmN0aW9uIFRhc2tRdWV1ZSQxKCkge1xuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZnVsZmlsbCkge2Z1bGZpbGwoKTsgfSk7XG59XG5UYXNrUXVldWUkMS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHByb21pc2VGYWN0b3J5KSB7XG4gIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgLy8ganVzdCByZWNvdmVyXG4gIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwcm9taXNlRmFjdG9yeSgpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbn07XG5UYXNrUXVldWUkMS5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5wcm9taXNlO1xufTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5KGlucHV0KSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7IC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIGVtcHR5IHJlZHVjZVxuICB9XG4gIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggbWFwcmVkdWNlLCBmdW5jdGlvbnMvc3RyaW5ncyBhcmUgc3RyaW5naWZpZWRcbiAgLy8gYXMtaXMuIGV2ZXJ5dGhpbmcgZWxzZSBpcyBKU09OLXN0cmluZ2lmaWVkLlxuICBzd2l0Y2ggKHR5cGVvZiBpbnB1dCkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIC8vIGUuZy4gYSBtYXByZWR1Y2UgbWFwXG4gICAgICByZXR1cm4gaW5wdXQudG9TdHJpbmcoKTtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgLy8gZS5nLiBhIG1hcHJlZHVjZSBidWlsdC1pbiBfcmVkdWNlIGZ1bmN0aW9uXG4gICAgICByZXR1cm4gaW5wdXQudG9TdHJpbmcoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBhIEpTT04gb2JqZWN0IGluIHRoZSBjYXNlIG9mIG1hbmdvIHF1ZXJpZXNcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbnB1dCk7XG4gIH1cbn1cblxuLyogY3JlYXRlIGEgc3RyaW5nIHNpZ25hdHVyZSBmb3IgYSB2aWV3IHNvIHdlIGNhbiBjYWNoZSBpdCBhbmQgdW5pcSBpdCAqL1xuZnVuY3Rpb24gY3JlYXRlVmlld1NpZ25hdHVyZShtYXBGdW4sIHJlZHVjZUZ1bikge1xuICAvLyB0aGUgXCJ1bmRlZmluZWRcIiBwYXJ0IGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICByZXR1cm4gc3RyaW5naWZ5KG1hcEZ1bikgKyBzdHJpbmdpZnkocmVkdWNlRnVuKSArICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaWV3KHNvdXJjZURCLCB2aWV3TmFtZSwgbWFwRnVuLCByZWR1Y2VGdW4sIHRlbXBvcmFyeSwgbG9jYWxEb2NOYW1lKSB7XG4gIHZhciB2aWV3U2lnbmF0dXJlID0gY3JlYXRlVmlld1NpZ25hdHVyZShtYXBGdW4sIHJlZHVjZUZ1bik7XG5cbiAgdmFyIGNhY2hlZFZpZXdzO1xuICBpZiAoIXRlbXBvcmFyeSkge1xuICAgIC8vIGNhY2hlIHRoaXMgdG8gZW5zdXJlIHdlIGRvbid0IHRyeSB0byB1cGRhdGUgdGhlIHNhbWUgdmlldyB0d2ljZVxuICAgIGNhY2hlZFZpZXdzID0gc291cmNlREIuX2NhY2hlZFZpZXdzID0gc291cmNlREIuX2NhY2hlZFZpZXdzIHx8IHt9O1xuICAgIGlmIChjYWNoZWRWaWV3c1t2aWV3U2lnbmF0dXJlXSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFZpZXdzW3ZpZXdTaWduYXR1cmVdO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcm9taXNlRm9yVmlldyA9IHNvdXJjZURCLmluZm8oKS50aGVuKGZ1bmN0aW9uIChpbmZvKSB7XG5cbiAgICB2YXIgZGVwRGJOYW1lID0gaW5mby5kYl9uYW1lICsgJy1tcnZpZXctJyArXG4gICAgICAodGVtcG9yYXJ5ID8gJ3RlbXAnIDogc3RyaW5nTWQ1KHZpZXdTaWduYXR1cmUpKTtcblxuICAgIC8vIHNhdmUgdGhlIHZpZXcgbmFtZSBpbiB0aGUgc291cmNlIGRiIHNvIGl0IGNhbiBiZSBjbGVhbmVkIHVwIGlmIG5lY2Vzc2FyeVxuICAgIC8vIChlLmcuIHdoZW4gdGhlIF9kZXNpZ24gZG9jIGlzIGRlbGV0ZWQsIHJlbW92ZSBhbGwgYXNzb2NpYXRlZCB2aWV3IGRhdGEpXG4gICAgZnVuY3Rpb24gZGlmZkZ1bmN0aW9uKGRvYykge1xuICAgICAgZG9jLnZpZXdzID0gZG9jLnZpZXdzIHx8IHt9O1xuICAgICAgdmFyIGZ1bGxWaWV3TmFtZSA9IHZpZXdOYW1lO1xuICAgICAgaWYgKGZ1bGxWaWV3TmFtZS5pbmRleE9mKCcvJykgPT09IC0xKSB7XG4gICAgICAgIGZ1bGxWaWV3TmFtZSA9IHZpZXdOYW1lICsgJy8nICsgdmlld05hbWU7XG4gICAgICB9XG4gICAgICB2YXIgZGVwRGJzID0gZG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0gPSBkb2Mudmlld3NbZnVsbFZpZXdOYW1lXSB8fCB7fTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGRlcERic1tkZXBEYk5hbWVdKSB7XG4gICAgICAgIHJldHVybjsgLy8gbm8gdXBkYXRlIG5lY2Vzc2FyeVxuICAgICAgfVxuICAgICAgZGVwRGJzW2RlcERiTmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGRvYztcbiAgICB9XG4gICAgcmV0dXJuIHVwc2VydChzb3VyY2VEQiwgJ19sb2NhbC8nICsgbG9jYWxEb2NOYW1lLCBkaWZmRnVuY3Rpb24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNvdXJjZURCLnJlZ2lzdGVyRGVwZW5kZW50RGF0YWJhc2UoZGVwRGJOYW1lKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgdmFyIGRiID0gcmVzLmRiO1xuICAgICAgICBkYi5hdXRvX2NvbXBhY3Rpb24gPSB0cnVlO1xuICAgICAgICB2YXIgdmlldyA9IHtcbiAgICAgICAgICBuYW1lOiBkZXBEYk5hbWUsXG4gICAgICAgICAgZGI6IGRiLFxuICAgICAgICAgIHNvdXJjZURCOiBzb3VyY2VEQixcbiAgICAgICAgICBhZGFwdGVyOiBzb3VyY2VEQi5hZGFwdGVyLFxuICAgICAgICAgIG1hcEZ1bjogbWFwRnVuLFxuICAgICAgICAgIHJlZHVjZUZ1bjogcmVkdWNlRnVuXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2aWV3LmRiLmdldCgnX2xvY2FsL2xhc3RTZXEnKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAobGFzdFNlcURvYykge1xuICAgICAgICAgIHZpZXcuc2VxID0gbGFzdFNlcURvYyA/IGxhc3RTZXFEb2Muc2VxIDogMDtcbiAgICAgICAgICBpZiAoY2FjaGVkVmlld3MpIHtcbiAgICAgICAgICAgIHZpZXcuZGIub25jZSgnZGVzdHJveWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBkZWxldGUgY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChjYWNoZWRWaWV3cykge1xuICAgIGNhY2hlZFZpZXdzW3ZpZXdTaWduYXR1cmVdID0gcHJvbWlzZUZvclZpZXc7XG4gIH1cbiAgcmV0dXJuIHByb21pc2VGb3JWaWV3O1xufVxuXG52YXIgcGVyc2lzdGVudFF1ZXVlcyA9IHt9O1xudmFyIHRlbXBWaWV3UXVldWUgPSBuZXcgVGFza1F1ZXVlJDEoKTtcbnZhciBDSEFOR0VTX0JBVENIX1NJWkUkMSA9IDUwO1xuXG5mdW5jdGlvbiBwYXJzZVZpZXdOYW1lKG5hbWUpIHtcbiAgLy8gY2FuIGJlIGVpdGhlciAnZGRvY25hbWUvdmlld25hbWUnIG9yIGp1c3QgJ3ZpZXduYW1lJ1xuICAvLyAod2hlcmUgdGhlIGRkb2MgbmFtZSBpcyB0aGUgc2FtZSlcbiAgcmV0dXJuIG5hbWUuaW5kZXhPZignLycpID09PSAtMSA/IFtuYW1lLCBuYW1lXSA6IG5hbWUuc3BsaXQoJy8nKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5PbmUoY2hhbmdlcykge1xuICAvLyBvbmx5IHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGNoYW5nZSBpcyAxLVxuICAvLyBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGxlYWZzXG4gIHJldHVybiBjaGFuZ2VzLmxlbmd0aCA9PT0gMSAmJiAvXjEtLy50ZXN0KGNoYW5nZXNbMF0ucmV2KTtcbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yKGRiLCBlKSB7XG4gIHRyeSB7XG4gICAgZGIuZW1pdCgnZXJyb3InLCBlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJyxcbiAgICAgICdUaGUgdXNlclxcJ3MgbWFwL3JlZHVjZSBmdW5jdGlvbiB0aHJldyBhbiB1bmNhdWdodCBlcnJvci5cXG4nICtcbiAgICAgICdZb3UgY2FuIGRlYnVnIHRoaXMgZXJyb3IgYnkgZG9pbmc6XFxuJyArXG4gICAgICAnbXlEYXRhYmFzZS5vbihcXCdlcnJvclxcJywgZnVuY3Rpb24gKGVycikgeyBkZWJ1Z2dlcjsgfSk7XFxuJyArXG4gICAgICAnUGxlYXNlIGRvdWJsZS1jaGVjayB5b3VyIG1hcC9yZWR1Y2UgZnVuY3Rpb24uJyk7XG4gICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJywgZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIFwiYWJzdHJhY3RcIiBtYXByZWR1Y2Ugb2JqZWN0IG9mIHRoZSBmb3JtOlxuICpcbiAqICAge1xuICogICAgIHF1ZXJ5OiBxdWVyeUZ1bixcbiAqICAgICB2aWV3Q2xlYW51cDogdmlld0NsZWFudXBGdW5cbiAqICAgfVxuICpcbiAqIEFyZ3VtZW50cyBhcmU6XG4gKlxuICogbG9jYWxEb2M6IHN0cmluZ1xuICogICBUaGlzIGlzIGZvciB0aGUgbG9jYWwgZG9jIHRoYXQgZ2V0cyBzYXZlZCBpbiBvcmRlciB0byB0cmFjayB0aGVcbiAqICAgXCJkZXBlbmRlbnRcIiBEQnMgYW5kIGNsZWFuIHRoZW0gdXAgZm9yIHZpZXdDbGVhbnVwLiBJdCBzaG91bGQgYmVcbiAqICAgdW5pcXVlLCBzbyB0aGF0IGluZGV4ZXIgcGx1Z2lucyBkb24ndCBjb2xsaWRlIHdpdGggZWFjaCBvdGhlci5cbiAqIG1hcHBlcjogZnVuY3Rpb24gKG1hcEZ1bkRlZiwgZW1pdClcbiAqICAgUmV0dXJucyBhIG1hcCBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgbWFwRnVuRGVmLCB3aGljaCBpbiB0aGUgY2FzZSBvZlxuICogICBub3JtYWwgbWFwL3JlZHVjZSBpcyBqdXN0IHRoZSBkZS1zdHJpbmdpZmllZCBmdW5jdGlvbiwgYnV0IG1heSBiZVxuICogICBzb21ldGhpbmcgZWxzZSwgc3VjaCBhcyBhbiBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgcG91Y2hkYi1maW5kLlxuICogcmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZUZ1bkRlZilcbiAqICAgRGl0dG8sIGJ1dCBmb3IgcmVkdWNpbmcuIE1vZHVsZXMgZG9uJ3QgaGF2ZSB0byBzdXBwb3J0IHJlZHVjaW5nXG4gKiAgIChlLmcuIHBvdWNoZGItZmluZCkuXG4gKiBkZG9jVmFsaWRhdG9yOiBmdW5jdGlvbiAoZGRvYywgdmlld05hbWUpXG4gKiAgIFRocm93cyBhbiBlcnJvciBpZiB0aGUgZGRvYyBvciB2aWV3TmFtZSBpcyBub3QgdmFsaWQuXG4gKiAgIFRoaXMgY291bGQgYmUgYSB3YXkgdG8gY29tbXVuaWNhdGUgdG8gdGhlIHVzZXIgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlXG4gKiAgIGluZGV4ZXIgaXMgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UobG9jYWxEb2NOYW1lLCBtYXBwZXIsIHJlZHVjZXIsIGRkb2NWYWxpZGF0b3IpIHtcblxuICBmdW5jdGlvbiB0cnlNYXAoZGIsIGZ1biwgZG9jKSB7XG4gICAgLy8gZW1pdCBhbiBldmVudCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgdGhyb3duIGJ5IGEgbWFwIGZ1bmN0aW9uLlxuICAgIC8vIHB1dHRpbmcgdHJ5L2NhdGNoZXMgaW4gYSBzaW5nbGUgZnVuY3Rpb24gYWxzbyBhdm9pZHMgZGVvcHRpbWl6YXRpb25zLlxuICAgIHRyeSB7XG4gICAgICBmdW4oZG9jKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbWl0RXJyb3IoZGIsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVJlZHVjZShkYiwgZnVuLCBrZXlzLCB2YWx1ZXMsIHJlcmVkdWNlKSB7XG4gICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IHJldHVybmluZyB0aGUgcmVzdWx0IG9yIGFuIGVycm9yLiB0aGVyZSBhcmUgdHdvIHNlcGFyYXRlXG4gICAgLy8gZnVuY3Rpb25zIHRvIGF2b2lkIGV4dHJhIG1lbW9yeSBhbGxvY2F0aW9ucyBzaW5jZSB0aGUgdHJ5Q29kZSgpIGNhc2UgaXMgdXNlZFxuICAgIC8vIGZvciBjdXN0b20gbWFwIGZ1bmN0aW9ucyAoY29tbW9uKSB2cyB0aGlzIGZ1bmN0aW9uLCB3aGljaCBpcyBvbmx5IHVzZWQgZm9yXG4gICAgLy8gY3VzdG9tIHJlZHVjZSBmdW5jdGlvbnMgKHJhcmUpXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7b3V0cHV0IDogZnVuKGtleXMsIHZhbHVlcywgcmVyZWR1Y2UpfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlbWl0RXJyb3IoZGIsIGUpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZX07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc29ydEJ5S2V5VGhlblZhbHVlKHgsIHkpIHtcbiAgICB2YXIga2V5Q29tcGFyZSA9IGNvbGxhdGUoeC5rZXksIHkua2V5KTtcbiAgICByZXR1cm4ga2V5Q29tcGFyZSAhPT0gMCA/IGtleUNvbXBhcmUgOiBjb2xsYXRlKHgudmFsdWUsIHkudmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2xpY2VSZXN1bHRzKHJlc3VsdHMsIGxpbWl0LCBza2lwKSB7XG4gICAgc2tpcCA9IHNraXAgfHwgMDtcbiAgICBpZiAodHlwZW9mIGxpbWl0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuc2xpY2Uoc2tpcCwgbGltaXQgKyBza2lwKTtcbiAgICB9IGVsc2UgaWYgKHNraXAgPiAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5zbGljZShza2lwKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBmdW5jdGlvbiByb3dUb0RvY0lkKHJvdykge1xuICAgIHZhciB2YWwgPSByb3cudmFsdWU7XG4gICAgLy8gVXNlcnMgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeSBhIGpvaW5lZCBkb2MgX2lkLCBvciBpdFxuICAgIC8vIGRlZmF1bHRzIHRvIHRoZSBkb2MgX2lkIHRoYXQgZW1pdHRlZCB0aGUga2V5L3ZhbHVlLlxuICAgIHZhciBkb2NJZCA9ICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsLl9pZCkgfHwgcm93LmlkO1xuICAgIHJldHVybiBkb2NJZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKHJlcykge1xuICAgIHJlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgdmFyIGF0dHMgPSByb3cuZG9jICYmIHJvdy5kb2MuX2F0dGFjaG1lbnRzO1xuICAgICAgaWYgKCFhdHRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5rZXlzKGF0dHMpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgIHZhciBhdHQgPSBhdHRzW2ZpbGVuYW1lXTtcbiAgICAgICAgYXR0c1tmaWxlbmFtZV0uZGF0YSA9IGI2NFRvQmx1ZmZlcihhdHQuZGF0YSwgYXR0LmNvbnRlbnRfdHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc3Rwcm9jZXNzQXR0YWNobWVudHMob3B0cykge1xuICAgIHJldHVybiBmdW5jdGlvbiAocmVzKSB7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MgJiYgb3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmJpbmFyeSkge1xuICAgICAgICByZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcihyZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkSHR0cFBhcmFtKHBhcmFtTmFtZSwgb3B0cywgcGFyYW1zLCBhc0pzb24pIHtcbiAgICAvLyBhZGQgYW4gaHR0cCBwYXJhbSBmcm9tIG9wdHMgdG8gcGFyYW1zLCBvcHRpb25hbGx5IGpzb24tZW5jb2RlZFxuICAgIHZhciB2YWwgPSBvcHRzW3BhcmFtTmFtZV07XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoYXNKc29uKSB7XG4gICAgICAgIHZhbCA9IGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh2YWwpKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5wdXNoKHBhcmFtTmFtZSArICc9JyArIHZhbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29lcmNlSW50ZWdlcihpbnRlZ2VyQ2FuZGlkYXRlKSB7XG4gICAgaWYgKHR5cGVvZiBpbnRlZ2VyQ2FuZGlkYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGFzTnVtYmVyID0gTnVtYmVyKGludGVnZXJDYW5kaWRhdGUpO1xuICAgICAgLy8gcHJldmVudHMgZS5nLiAnMWZvbycgb3IgJzEuMScgYmVpbmcgY29lcmNlZCB0byAxXG4gICAgICBpZiAoIWlzTmFOKGFzTnVtYmVyKSAmJiBhc051bWJlciA9PT0gcGFyc2VJbnQoaW50ZWdlckNhbmRpZGF0ZSwgMTApKSB7XG4gICAgICAgIHJldHVybiBhc051bWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnRlZ2VyQ2FuZGlkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvZXJjZU9wdGlvbnMob3B0cykge1xuICAgIG9wdHMuZ3JvdXBfbGV2ZWwgPSBjb2VyY2VJbnRlZ2VyKG9wdHMuZ3JvdXBfbGV2ZWwpO1xuICAgIG9wdHMubGltaXQgPSBjb2VyY2VJbnRlZ2VyKG9wdHMubGltaXQpO1xuICAgIG9wdHMuc2tpcCA9IGNvZXJjZUludGVnZXIob3B0cy5za2lwKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrUG9zaXRpdmVJbnRlZ2VyKG51bWJlcikge1xuICAgIGlmIChudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgbnVtYmVyICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gIG5ldyBRdWVyeVBhcnNlRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIGludGVnZXI6IFwiJyArXG4gICAgICAgICAgbnVtYmVyICsgJ1wiJyk7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5UGFyc2VFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcG9zaXRpdmUgaW50ZWdlcjogJyArXG4gICAgICAgICAgJ1wiJyArIG51bWJlciArICdcIicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrUXVlcnlQYXJzZUVycm9yKG9wdGlvbnMsIGZ1bikge1xuICAgIHZhciBzdGFydGtleU5hbWUgPSBvcHRpb25zLmRlc2NlbmRpbmcgPyAnZW5ka2V5JyA6ICdzdGFydGtleSc7XG4gICAgdmFyIGVuZGtleU5hbWUgPSBvcHRpb25zLmRlc2NlbmRpbmcgPyAnc3RhcnRrZXknIDogJ2VuZGtleSc7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnNbc3RhcnRrZXlOYW1lXSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBvcHRpb25zW2VuZGtleU5hbWVdICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgY29sbGF0ZShvcHRpb25zW3N0YXJ0a2V5TmFtZV0sIG9wdGlvbnNbZW5ka2V5TmFtZV0pID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5UGFyc2VFcnJvcignTm8gcm93cyBjYW4gbWF0Y2ggeW91ciBrZXkgcmFuZ2UsICcgK1xuICAgICAgICAncmV2ZXJzZSB5b3VyIHN0YXJ0X2tleSBhbmQgZW5kX2tleSBvciBzZXQge2Rlc2NlbmRpbmcgOiB0cnVlfScpO1xuICAgIH0gZWxzZSBpZiAoZnVuLnJlZHVjZSAmJiBvcHRpb25zLnJlZHVjZSAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVfZG9jcykge1xuICAgICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUVycm9yKCd7aW5jbHVkZV9kb2NzOnRydWV9IGlzIGludmFsaWQgZm9yIHJlZHVjZScpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtleXMgJiYgb3B0aW9ucy5rZXlzLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgIW9wdGlvbnMuZ3JvdXAgJiYgIW9wdGlvbnMuZ3JvdXBfbGV2ZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5UGFyc2VFcnJvcignTXVsdGkta2V5IGZldGNoZXMgZm9yIHJlZHVjZSB2aWV3cyBtdXN0IHVzZSAnICtcbiAgICAgICAgICAne2dyb3VwOiB0cnVlfScpO1xuICAgICAgfVxuICAgIH1cbiAgICBbJ2dyb3VwX2xldmVsJywgJ2xpbWl0JywgJ3NraXAnXS5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb25OYW1lKSB7XG4gICAgICB2YXIgZXJyb3IgPSBjaGVja1Bvc2l0aXZlSW50ZWdlcihvcHRpb25zW29wdGlvbk5hbWVdKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGh0dHBRdWVyeShkYiwgZnVuLCBvcHRzKSB7XG4gICAgLy8gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGFkZCB0byB0aGUgUFVUIHJlcXVlc3RcbiAgICB2YXIgcGFyYW1zID0gW107XG4gICAgdmFyIGJvZHk7XG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnO1xuICAgIHZhciBvaywgc3RhdHVzO1xuXG4gICAgLy8gSWYgb3B0cy5yZWR1Y2UgZXhpc3RzIGFuZCBpcyBkZWZpbmVkLCB0aGVuIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgIC8vIG9mIHBhcmFtZXRlcnMuXG4gICAgLy8gSWYgcmVkdWNlPWZhbHNlIHRoZW4gdGhlIHJlc3VsdHMgYXJlIHRoYXQgb2Ygb25seSB0aGUgbWFwIGZ1bmN0aW9uXG4gICAgLy8gbm90IHRoZSBmaW5hbCByZXN1bHQgb2YgbWFwIGFuZCByZWR1Y2UuXG4gICAgYWRkSHR0cFBhcmFtKCdyZWR1Y2UnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnaW5jbHVkZV9kb2NzJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2F0dGFjaG1lbnRzJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2xpbWl0Jywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2Rlc2NlbmRpbmcnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnZ3JvdXAnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnZ3JvdXBfbGV2ZWwnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnc2tpcCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdzdGFsZScsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdjb25mbGljdHMnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnc3RhcnRrZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnc3RhcnRfa2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2VuZGtleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCdlbmRfa2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2luY2x1c2l2ZV9lbmQnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgna2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3VwZGF0ZV9zZXEnLCBvcHRzLCBwYXJhbXMpO1xuXG4gICAgLy8gRm9ybWF0IHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgaW50byBhIHZhbGlkIFVSSSBxdWVyeSBzdHJpbmdcbiAgICBwYXJhbXMgPSBwYXJhbXMuam9pbignJicpO1xuICAgIHBhcmFtcyA9IHBhcmFtcyA9PT0gJycgPyAnJyA6ICc/JyArIHBhcmFtcztcblxuICAgIC8vIElmIGtleXMgYXJlIHN1cHBsaWVkLCBpc3N1ZSBhIFBPU1QgdG8gY2lyY3VtdmVudCBHRVQgcXVlcnkgc3RyaW5nIGxpbWl0c1xuICAgIC8vIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL2NvdWNoZGIvSFRUUF92aWV3X0FQSSNRdWVyeWluZ19PcHRpb25zXG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgTUFYX1VSTF9MRU5HVEggPSAyMDAwO1xuICAgICAgLy8gYWNjb3JkaW5nIHRvIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQxNzE4NC82ODA3NDIsXG4gICAgICAvLyB0aGUgZGUgZmFjdG8gVVJMIGxlbmd0aCBsaW1pdCBpcyAyMDAwIGNoYXJhY3RlcnNcblxuICAgICAgdmFyIGtleXNBc1N0cmluZyA9XG4gICAgICAgICdrZXlzPScgKyBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkob3B0cy5rZXlzKSk7XG4gICAgICBpZiAoa2V5c0FzU3RyaW5nLmxlbmd0aCArIHBhcmFtcy5sZW5ndGggKyAxIDw9IE1BWF9VUkxfTEVOR1RIKSB7XG4gICAgICAgIC8vIElmIHRoZSBrZXlzIGFyZSBzaG9ydCBlbm91Z2gsIGRvIGEgR0VULiB3ZSBkbyB0aGlzIHRvIHdvcmsgYXJvdW5kXG4gICAgICAgIC8vIFNhZmFyaSBub3QgdW5kZXJzdGFuZGluZyAzMDRzIG9uIFBPU1RzIChzZWUgcG91Y2hkYi9wb3VjaGRiIzEyMzkpXG4gICAgICAgIHBhcmFtcyArPSAocGFyYW1zWzBdID09PSAnPycgPyAnJicgOiAnPycpICsga2V5c0FzU3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgICBpZiAodHlwZW9mIGZ1biA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBib2R5ID0ge2tleXM6IG9wdHMua2V5c307XG4gICAgICAgIH0gZWxzZSB7IC8vIGZ1biBpcyB7bWFwIDogbWFwZnVufSwgc28gYXBwZW5kIHRvIHRoaXNcbiAgICAgICAgICBmdW4ua2V5cyA9IG9wdHMua2V5cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGFyZSByZWZlcmVuY2luZyBhIHF1ZXJ5IGRlZmluZWQgaW4gdGhlIGRlc2lnbiBkb2NcbiAgICBpZiAodHlwZW9mIGZ1biA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBwYXJ0cyA9IHBhcnNlVmlld05hbWUoZnVuKTtcbiAgICAgIHJldHVybiBkYi5mZXRjaCgnX2Rlc2lnbi8nICsgcGFydHNbMF0gKyAnL192aWV3LycgKyBwYXJ0c1sxXSArIHBhcmFtcywge1xuICAgICAgICBoZWFkZXJzOiBuZXcgaCh7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30pLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIG9rID0gcmVzcG9uc2Uub2s7XG4gICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgICB0aHJvdyBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmFpbCB0aGUgZW50aXJlIHJlcXVlc3QgaWYgdGhlIHJlc3VsdCBjb250YWlucyBhbiBlcnJvclxuICAgICAgICByZXN1bHQucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAocm93LnZhbHVlICYmIHJvdy52YWx1ZS5lcnJvciAmJiByb3cudmFsdWUuZXJyb3IgPT09IFwiYnVpbHRpbl9yZWR1Y2VfZXJyb3JcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJvdy5yZWFzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KS50aGVuKHBvc3Rwcm9jZXNzQXR0YWNobWVudHMob3B0cykpO1xuICAgIH1cblxuICAgIC8vIFdlIGFyZSB1c2luZyBhIHRlbXBvcmFyeSB2aWV3LCB0ZXJyaWJsZSBmb3IgcGVyZm9ybWFuY2UsIGdvb2QgZm9yIHRlc3RpbmdcbiAgICBib2R5ID0gYm9keSB8fCB7fTtcbiAgICBPYmplY3Qua2V5cyhmdW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZnVuW2tleV0pKSB7XG4gICAgICAgIGJvZHlba2V5XSA9IGZ1bltrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keVtrZXldID0gZnVuW2tleV0udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkYi5mZXRjaCgnX3RlbXBfdmlldycgKyBwYXJhbXMsIHtcbiAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSksXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgb2sgPSByZXNwb25zZS5vaztcbiAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhyb3cgZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShyZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KS50aGVuKHBvc3Rwcm9jZXNzQXR0YWNobWVudHMob3B0cykpO1xuICB9XG5cbiAgLy8gY3VzdG9tIGFkYXB0ZXJzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGFwaS5fcXVlcnlcbiAgLy8gYW5kIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGZ1bmN0aW9uIGN1c3RvbVF1ZXJ5KGRiLCBmdW4sIG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZGIuX3F1ZXJ5KGZ1biwgb3B0cywgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjdXN0b20gYWRhcHRlcnMgY2FuIGRlZmluZSB0aGVpciBvd24gYXBpLl92aWV3Q2xlYW51cFxuICAvLyBhbmQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZnVuY3Rpb24gY3VzdG9tVmlld0NsZWFudXAoZGIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZGIuX3ZpZXdDbGVhbnVwKGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdHNUbyh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHJlYXNvbi5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIHJldHVybnMgYSBwcm9taXNlIGZvciBhIGxpc3Qgb2YgZG9jcyB0byB1cGRhdGUsIGJhc2VkIG9uIHRoZSBpbnB1dCBkb2NJZC5cbiAgLy8gdGhlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLCBiZWNhdXNlIHBvc3QtMy4yLjAsIGJ1bGtEb2NzXG4gIC8vIGlzIGFuIGF0b21pYyBvcGVyYXRpb24gaW4gYWxsIHRocmVlIGFkYXB0ZXJzLlxuICBmdW5jdGlvbiBnZXREb2NzVG9QZXJzaXN0KGRvY0lkLCB2aWV3LCBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cykge1xuICAgIHZhciBtZXRhRG9jSWQgPSAnX2xvY2FsL2RvY18nICsgZG9jSWQ7XG4gICAgdmFyIGRlZmF1bHRNZXRhRG9jID0ge19pZDogbWV0YURvY0lkLCBrZXlzOiBbXX07XG4gICAgdmFyIGRvY0RhdGEgPSBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cy5nZXQoZG9jSWQpO1xuICAgIHZhciBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMgPSBkb2NEYXRhWzBdO1xuICAgIHZhciBjaGFuZ2VzID0gZG9jRGF0YVsxXTtcblxuICAgIGZ1bmN0aW9uIGdldE1ldGFEb2MoKSB7XG4gICAgICBpZiAoaXNHZW5PbmUoY2hhbmdlcykpIHtcbiAgICAgICAgLy8gZ2VuZXJhdGlvbiAxLCBzbyB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBpbml0aWFsIHN0YXRlXG4gICAgICAgIC8vIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChhdm9pZHMgdW5uZWNlc3NhcnkgR0VUcylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkZWZhdWx0TWV0YURvYyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmlldy5kYi5nZXQobWV0YURvY0lkKS5jYXRjaChkZWZhdWx0c1RvKGRlZmF1bHRNZXRhRG9jKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0S2V5VmFsdWVEb2NzKG1ldGFEb2MpIHtcbiAgICAgIGlmICghbWV0YURvYy5rZXlzLmxlbmd0aCkge1xuICAgICAgICAvLyBubyBrZXlzLCBubyBuZWVkIGZvciBhIGxvb2t1cFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtyb3dzOiBbXX0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZpZXcuZGIuYWxsRG9jcyh7XG4gICAgICAgIGtleXM6IG1ldGFEb2Mua2V5cyxcbiAgICAgICAgaW5jbHVkZV9kb2NzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzS2V5VmFsdWVEb2NzKG1ldGFEb2MsIGt2RG9jc1Jlcykge1xuICAgICAgdmFyIGt2RG9jcyA9IFtdO1xuICAgICAgdmFyIG9sZEtleXMgPSBuZXcgRXhwb3J0ZWRTZXQoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGt2RG9jc1Jlcy5yb3dzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSBrdkRvY3NSZXMucm93c1tpXTtcbiAgICAgICAgdmFyIGRvYyA9IHJvdy5kb2M7XG4gICAgICAgIGlmICghZG9jKSB7IC8vIGRlbGV0ZWRcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBrdkRvY3MucHVzaChkb2MpO1xuICAgICAgICBvbGRLZXlzLmFkZChkb2MuX2lkKTtcbiAgICAgICAgZG9jLl9kZWxldGVkID0gIWluZGV4YWJsZUtleXNUb0tleVZhbHVlcy5oYXMoZG9jLl9pZCk7XG4gICAgICAgIGlmICghZG9jLl9kZWxldGVkKSB7XG4gICAgICAgICAgdmFyIGtleVZhbHVlID0gaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzLmdldChkb2MuX2lkKTtcbiAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiBrZXlWYWx1ZSkge1xuICAgICAgICAgICAgZG9jLnZhbHVlID0ga2V5VmFsdWUudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgbmV3S2V5cyA9IG1hcFRvS2V5c0FycmF5KGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyk7XG4gICAgICBuZXdLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIW9sZEtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAvLyBuZXcgZG9jXG4gICAgICAgICAgdmFyIGt2RG9jID0ge1xuICAgICAgICAgICAgX2lkOiBrZXlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGluZGV4YWJsZUtleXNUb0tleVZhbHVlcy5nZXQoa2V5KTtcbiAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiBrZXlWYWx1ZSkge1xuICAgICAgICAgICAga3ZEb2MudmFsdWUgPSBrZXlWYWx1ZS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAga3ZEb2NzLnB1c2goa3ZEb2MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1ldGFEb2Mua2V5cyA9IHVuaXEobmV3S2V5cy5jb25jYXQobWV0YURvYy5rZXlzKSk7XG4gICAgICBrdkRvY3MucHVzaChtZXRhRG9jKTtcblxuICAgICAgcmV0dXJuIGt2RG9jcztcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0TWV0YURvYygpLnRoZW4oZnVuY3Rpb24gKG1ldGFEb2MpIHtcbiAgICAgIHJldHVybiBnZXRLZXlWYWx1ZURvY3MobWV0YURvYykudGhlbihmdW5jdGlvbiAoa3ZEb2NzUmVzKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzS2V5VmFsdWVEb2NzKG1ldGFEb2MsIGt2RG9jc1Jlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHVwZGF0ZXMgYWxsIGVtaXR0ZWQga2V5L3ZhbHVlIGRvY3MgYW5kIG1ldGFEb2NzIGluIHRoZSBtcnZpZXcgZGF0YWJhc2VcbiAgLy8gZm9yIHRoZSBnaXZlbiBiYXRjaCBvZiBkb2N1bWVudHMgZnJvbSB0aGUgc291cmNlIGRhdGFiYXNlXG4gIGZ1bmN0aW9uIHNhdmVLZXlWYWx1ZXModmlldywgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMsIHNlcSkge1xuICAgIHZhciBzZXFEb2NJZCA9ICdfbG9jYWwvbGFzdFNlcSc7XG4gICAgcmV0dXJuIHZpZXcuZGIuZ2V0KHNlcURvY0lkKVxuICAgICAgLmNhdGNoKGRlZmF1bHRzVG8oe19pZDogc2VxRG9jSWQsIHNlcTogMH0pKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGxhc3RTZXFEb2MpIHtcbiAgICAgICAgdmFyIGRvY0lkcyA9IG1hcFRvS2V5c0FycmF5KGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRvY0lkcy5tYXAoZnVuY3Rpb24gKGRvY0lkKSB7XG4gICAgICAgICAgcmV0dXJuIGdldERvY3NUb1BlcnNpc3QoZG9jSWQsIHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzKTtcbiAgICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKGxpc3RPZkRvY3NUb1BlcnNpc3QpIHtcbiAgICAgICAgICB2YXIgZG9jc1RvUGVyc2lzdCA9IGZsYXR0ZW4obGlzdE9mRG9jc1RvUGVyc2lzdCk7XG4gICAgICAgICAgbGFzdFNlcURvYy5zZXEgPSBzZXE7XG4gICAgICAgICAgZG9jc1RvUGVyc2lzdC5wdXNoKGxhc3RTZXFEb2MpO1xuICAgICAgICAgIC8vIHdyaXRlIGFsbCBkb2NzIGluIGEgc2luZ2xlIG9wZXJhdGlvbiwgdXBkYXRlIHRoZSBzZXEgb25jZVxuICAgICAgICAgIHJldHVybiB2aWV3LmRiLmJ1bGtEb2NzKHtkb2NzIDogZG9jc1RvUGVyc2lzdH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UXVldWUodmlldykge1xuICAgIHZhciB2aWV3TmFtZSA9IHR5cGVvZiB2aWV3ID09PSAnc3RyaW5nJyA/IHZpZXcgOiB2aWV3Lm5hbWU7XG4gICAgdmFyIHF1ZXVlID0gcGVyc2lzdGVudFF1ZXVlc1t2aWV3TmFtZV07XG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgcXVldWUgPSBwZXJzaXN0ZW50UXVldWVzW3ZpZXdOYW1lXSA9IG5ldyBUYXNrUXVldWUkMSgpO1xuICAgIH1cbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVWaWV3KHZpZXcsIG9wdHMpIHtcbiAgICByZXR1cm4gc2VxdWVudGlhbGl6ZShnZXRRdWV1ZSh2aWV3KSwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZVZpZXdJblF1ZXVlKHZpZXcsIG9wdHMpO1xuICAgIH0pKCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKSB7XG4gICAgLy8gYmluZCB0aGUgZW1pdCBmdW5jdGlvbiBvbmNlXG4gICAgdmFyIG1hcFJlc3VsdHM7XG4gICAgdmFyIGRvYztcblxuICAgIGZ1bmN0aW9uIGVtaXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIG91dHB1dCA9IHtpZDogZG9jLl9pZCwga2V5OiBub3JtYWxpemVLZXkoa2V5KX07XG4gICAgICAvLyBEb24ndCBleHBsaWNpdGx5IHN0b3JlIHRoZSB2YWx1ZSB1bmxlc3MgaXQncyBkZWZpbmVkIGFuZCBub24tbnVsbC5cbiAgICAgIC8vIFRoaXMgc2F2ZXMgb24gc3RvcmFnZSBzcGFjZSwgYmVjYXVzZSBvZnRlbiBwZW9wbGUgZG9uJ3QgdXNlIGl0LlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgb3V0cHV0LnZhbHVlID0gbm9ybWFsaXplS2V5KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIG1hcFJlc3VsdHMucHVzaChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBtYXBGdW4gPSBtYXBwZXIodmlldy5tYXBGdW4sIGVtaXQpO1xuXG4gICAgdmFyIGN1cnJlbnRTZXEgPSB2aWV3LnNlcSB8fCAwO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0NoYW5nZShkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cywgc2VxKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc2F2ZUtleVZhbHVlcyh2aWV3LCBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cywgc2VxKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IGluZGV4ZWRfZG9jcyA9IDA7XG4gICAgbGV0IHByb2dyZXNzID0ge1xuICAgICAgdmlldzogdmlldy5uYW1lLFxuICAgICAgaW5kZXhlZF9kb2NzOiBpbmRleGVkX2RvY3NcbiAgICB9O1xuICAgIHZpZXcuc291cmNlREIuZW1pdCgnaW5kZXhpbmcnLCBwcm9ncmVzcyk7XG5cbiAgICB2YXIgcXVldWUgPSBuZXcgVGFza1F1ZXVlJDEoKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NOZXh0QmF0Y2goKSB7XG4gICAgICByZXR1cm4gdmlldy5zb3VyY2VEQi5jaGFuZ2VzKHtcbiAgICAgICAgcmV0dXJuX2RvY3M6IHRydWUsXG4gICAgICAgIGNvbmZsaWN0czogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZV9kb2NzOiB0cnVlLFxuICAgICAgICBzdHlsZTogJ2FsbF9kb2NzJyxcbiAgICAgICAgc2luY2U6IGN1cnJlbnRTZXEsXG4gICAgICAgIGxpbWl0OiBvcHRzLmNoYW5nZXNfYmF0Y2hfc2l6ZVxuICAgICAgfSkudGhlbihwcm9jZXNzQmF0Y2gpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NCYXRjaChyZXNwb25zZSkge1xuICAgICAgdmFyIHJlc3VsdHMgPSByZXNwb25zZS5yZXN1bHRzO1xuICAgICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMgPSBjcmVhdGVEb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyhyZXN1bHRzKTtcbiAgICAgIHF1ZXVlLmFkZChwcm9jZXNzQ2hhbmdlKGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBjdXJyZW50U2VxKSk7XG5cbiAgICAgIGluZGV4ZWRfZG9jcyA9IGluZGV4ZWRfZG9jcyArIHJlc3VsdHMubGVuZ3RoO1xuICAgICAgbGV0IHByb2dyZXNzID0ge1xuICAgICAgICB2aWV3OiB2aWV3Lm5hbWUsXG4gICAgICAgIGxhc3Rfc2VxOiByZXNwb25zZS5sYXN0X3NlcSxcbiAgICAgICAgcmVzdWx0c19jb3VudDogcmVzdWx0cy5sZW5ndGgsXG4gICAgICAgIGluZGV4ZWRfZG9jczogaW5kZXhlZF9kb2NzXG4gICAgICB9O1xuICAgICAgdmlldy5zb3VyY2VEQi5lbWl0KCdpbmRleGluZycsIHByb2dyZXNzKTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoIDwgb3B0cy5jaGFuZ2VzX2JhdGNoX3NpemUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2Nlc3NOZXh0QmF0Y2goKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyhyZXN1bHRzKSB7XG4gICAgICB2YXIgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByZXN1bHRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBjaGFuZ2UgPSByZXN1bHRzW2ldO1xuICAgICAgICBpZiAoY2hhbmdlLmRvYy5faWRbMF0gIT09ICdfJykge1xuICAgICAgICAgIG1hcFJlc3VsdHMgPSBbXTtcbiAgICAgICAgICBkb2MgPSBjaGFuZ2UuZG9jO1xuXG4gICAgICAgICAgaWYgKCFkb2MuX2RlbGV0ZWQpIHtcbiAgICAgICAgICAgIHRyeU1hcCh2aWV3LnNvdXJjZURCLCBtYXBGdW4sIGRvYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcFJlc3VsdHMuc29ydChzb3J0QnlLZXlUaGVuVmFsdWUpO1xuXG4gICAgICAgICAgdmFyIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyA9IGNyZWF0ZUluZGV4YWJsZUtleXNUb0tleVZhbHVlcyhtYXBSZXN1bHRzKTtcbiAgICAgICAgICBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cy5zZXQoY2hhbmdlLmRvYy5faWQsIFtcbiAgICAgICAgICAgIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcyxcbiAgICAgICAgICAgIGNoYW5nZS5jaGFuZ2VzXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFNlcSA9IGNoYW5nZS5zZXE7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzKG1hcFJlc3VsdHMpIHtcbiAgICAgIHZhciBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbiAgICAgIHZhciBsYXN0S2V5O1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcFJlc3VsdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGVtaXR0ZWRLZXlWYWx1ZSA9IG1hcFJlc3VsdHNbaV07XG4gICAgICAgIHZhciBjb21wbGV4S2V5ID0gW2VtaXR0ZWRLZXlWYWx1ZS5rZXksIGVtaXR0ZWRLZXlWYWx1ZS5pZF07XG4gICAgICAgIGlmIChpID4gMCAmJiBjb2xsYXRlKGVtaXR0ZWRLZXlWYWx1ZS5rZXksIGxhc3RLZXkpID09PSAwKSB7XG4gICAgICAgICAgY29tcGxleEtleS5wdXNoKGkpOyAvLyBkdXAga2V5K2lkLCBzbyBtYWtlIGl0IHVuaXF1ZVxuICAgICAgICB9XG4gICAgICAgIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcy5zZXQodG9JbmRleGFibGVTdHJpbmcoY29tcGxleEtleSksIGVtaXR0ZWRLZXlWYWx1ZSk7XG4gICAgICAgIGxhc3RLZXkgPSBlbWl0dGVkS2V5VmFsdWUua2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluZGV4YWJsZUtleXNUb0tleVZhbHVlcztcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc05leHRCYXRjaCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmZpbmlzaCgpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmlldy5zZXEgPSBjdXJyZW50U2VxO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVkdWNlVmlldyh2aWV3LCByZXN1bHRzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZ3JvdXBfbGV2ZWwgPT09IDApIHtcbiAgICAgIGRlbGV0ZSBvcHRpb25zLmdyb3VwX2xldmVsO1xuICAgIH1cblxuICAgIHZhciBzaG91bGRHcm91cCA9IG9wdGlvbnMuZ3JvdXAgfHwgb3B0aW9ucy5ncm91cF9sZXZlbDtcblxuICAgIHZhciByZWR1Y2VGdW4gPSByZWR1Y2VyKHZpZXcucmVkdWNlRnVuKTtcblxuICAgIHZhciBncm91cHMgPSBbXTtcbiAgICB2YXIgbHZsID0gaXNOYU4ob3B0aW9ucy5ncm91cF9sZXZlbCkgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOlxuICAgICAgb3B0aW9ucy5ncm91cF9sZXZlbDtcbiAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBsYXN0ID0gZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBncm91cEtleSA9IHNob3VsZEdyb3VwID8gZS5rZXkgOiBudWxsO1xuXG4gICAgICAvLyBvbmx5IHNldCBncm91cF9sZXZlbCBmb3IgYXJyYXkga2V5c1xuICAgICAgaWYgKHNob3VsZEdyb3VwICYmIEFycmF5LmlzQXJyYXkoZ3JvdXBLZXkpKSB7XG4gICAgICAgIGdyb3VwS2V5ID0gZ3JvdXBLZXkuc2xpY2UoMCwgbHZsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3QgJiYgY29sbGF0ZShsYXN0Lmdyb3VwS2V5LCBncm91cEtleSkgPT09IDApIHtcbiAgICAgICAgbGFzdC5rZXlzLnB1c2goW2Uua2V5LCBlLmlkXSk7XG4gICAgICAgIGxhc3QudmFsdWVzLnB1c2goZS52YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdyb3Vwcy5wdXNoKHtcbiAgICAgICAga2V5czogW1tlLmtleSwgZS5pZF1dLFxuICAgICAgICB2YWx1ZXM6IFtlLnZhbHVlXSxcbiAgICAgICAgZ3JvdXBLZXk6IGdyb3VwS2V5XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXN1bHRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGUgPSBncm91cHNbaV07XG4gICAgICB2YXIgcmVkdWNlVHJ5ID0gdHJ5UmVkdWNlKHZpZXcuc291cmNlREIsIHJlZHVjZUZ1biwgZS5rZXlzLCBlLnZhbHVlcywgZmFsc2UpO1xuICAgICAgaWYgKHJlZHVjZVRyeS5lcnJvciAmJiByZWR1Y2VUcnkuZXJyb3IgaW5zdGFuY2VvZiBCdWlsdEluRXJyb3IpIHtcbiAgICAgICAgLy8gQ291Y2hEQiByZXR1cm5zIGFuIGVycm9yIGlmIGEgYnVpbHQtaW4gZXJyb3JzIG91dFxuICAgICAgICB0aHJvdyByZWR1Y2VUcnkuZXJyb3I7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAvLyBDb3VjaERCIGp1c3Qgc2V0cyB0aGUgdmFsdWUgdG8gbnVsbCBpZiBhIG5vbi1idWlsdC1pbiBlcnJvcnMgb3V0XG4gICAgICAgIHZhbHVlOiByZWR1Y2VUcnkuZXJyb3IgPyBudWxsIDogcmVkdWNlVHJ5Lm91dHB1dCxcbiAgICAgICAga2V5OiBlLmdyb3VwS2V5XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gbm8gdG90YWxfcm93cy9vZmZzZXQgd2hlbiByZWR1Y2luZ1xuICAgIHJldHVybiB7cm93czogc2xpY2VSZXN1bHRzKHJlc3VsdHMsIG9wdGlvbnMubGltaXQsIG9wdGlvbnMuc2tpcCl9O1xuICB9XG5cbiAgZnVuY3Rpb24gcXVlcnlWaWV3KHZpZXcsIG9wdHMpIHtcbiAgICByZXR1cm4gc2VxdWVudGlhbGl6ZShnZXRRdWV1ZSh2aWV3KSwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5Vmlld0luUXVldWUodmlldywgb3B0cyk7XG4gICAgfSkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1ZXJ5Vmlld0luUXVldWUodmlldywgb3B0cykge1xuICAgIHZhciB0b3RhbFJvd3M7XG4gICAgdmFyIHNob3VsZFJlZHVjZSA9IHZpZXcucmVkdWNlRnVuICYmIG9wdHMucmVkdWNlICE9PSBmYWxzZTtcbiAgICB2YXIgc2tpcCA9IG9wdHMuc2tpcCB8fCAwO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5rZXlzICE9PSAndW5kZWZpbmVkJyAmJiAhb3B0cy5rZXlzLmxlbmd0aCkge1xuICAgICAgLy8gZXF1aXZhbGVudCBxdWVyeVxuICAgICAgb3B0cy5saW1pdCA9IDA7XG4gICAgICBkZWxldGUgb3B0cy5rZXlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZldGNoRnJvbVZpZXcodmlld09wdHMpIHtcbiAgICAgIHZpZXdPcHRzLmluY2x1ZGVfZG9jcyA9IHRydWU7XG4gICAgICByZXR1cm4gdmlldy5kYi5hbGxEb2NzKHZpZXdPcHRzKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgdG90YWxSb3dzID0gcmVzLnRvdGFsX3Jvd3M7XG4gICAgICAgIHJldHVybiByZXMucm93cy5tYXAoZnVuY3Rpb24gKHJlc3VsdCkge1xuXG4gICAgICAgICAgLy8gaW1wbGljaXQgbWlncmF0aW9uIC0gaW4gb2xkZXIgdmVyc2lvbnMgb2YgUG91Y2hEQixcbiAgICAgICAgICAvLyB3ZSBleHBsaWNpdGx5IHN0b3JlZCB0aGUgZG9jIGFzIHtpZDogLi4uLCBrZXk6IC4uLiwgdmFsdWU6IC4uLn1cbiAgICAgICAgICAvLyB0aGlzIGlzIHRlc3RlZCBpbiBhIG1pZ3JhdGlvbiB0ZXN0XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiByZXN1bHQuZG9jICYmIHR5cGVvZiByZXN1bHQuZG9jLnZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgcmVzdWx0LmRvYy52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZXN1bHQuZG9jLnZhbHVlKS5zb3J0KCk7XG4gICAgICAgICAgICAvLyB0aGlzIGRldGVjdGlvbiBtZXRob2QgaXMgbm90IHBlcmZlY3QsIGJ1dCBpdCdzIHVubGlrZWx5IHRoZSB1c2VyXG4gICAgICAgICAgICAvLyBlbWl0dGVkIGEgdmFsdWUgd2hpY2ggd2FzIGFuIG9iamVjdCB3aXRoIHRoZXNlIDMgZXhhY3Qga2V5c1xuICAgICAgICAgICAgdmFyIGV4cGVjdGVkS2V5cyA9IFsnaWQnLCAna2V5JywgJ3ZhbHVlJ107XG4gICAgICAgICAgICBpZiAoIShrZXlzIDwgZXhwZWN0ZWRLZXlzIHx8IGtleXMgPiBleHBlY3RlZEtleXMpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9jLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBwYXJzZWRLZXlBbmREb2NJZCA9IHBhcnNlSW5kZXhhYmxlU3RyaW5nKHJlc3VsdC5kb2MuX2lkKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBwYXJzZWRLZXlBbmREb2NJZFswXSxcbiAgICAgICAgICAgIGlkOiBwYXJzZWRLZXlBbmREb2NJZFsxXSxcbiAgICAgICAgICAgIHZhbHVlOiAoJ3ZhbHVlJyBpbiByZXN1bHQuZG9jID8gcmVzdWx0LmRvYy52YWx1ZSA6IG51bGwpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1hcFJlc3VsdHNSZWFkeShyb3dzKSB7XG4gICAgICB2YXIgZmluYWxSZXN1bHRzO1xuICAgICAgaWYgKHNob3VsZFJlZHVjZSkge1xuICAgICAgICBmaW5hbFJlc3VsdHMgPSByZWR1Y2VWaWV3KHZpZXcsIHJvd3MsIG9wdHMpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0cy5rZXlzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmaW5hbFJlc3VsdHMgPSB7XG4gICAgICAgICAgdG90YWxfcm93czogdG90YWxSb3dzLFxuICAgICAgICAgIG9mZnNldDogc2tpcCxcbiAgICAgICAgICByb3dzOiByb3dzXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdXBwb3J0IGxpbWl0LCBza2lwIGZvciBrZXlzIHF1ZXJ5XG4gICAgICAgIGZpbmFsUmVzdWx0cyA9IHtcbiAgICAgICAgICB0b3RhbF9yb3dzOiB0b3RhbFJvd3MsXG4gICAgICAgICAgb2Zmc2V0OiBza2lwLFxuICAgICAgICAgIHJvd3M6IHNsaWNlUmVzdWx0cyhyb3dzLG9wdHMubGltaXQsb3B0cy5za2lwKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICAgIGZpbmFsUmVzdWx0cy51cGRhdGVfc2VxID0gdmlldy5zZXE7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgICAgdmFyIGRvY0lkcyA9IHVuaXEocm93cy5tYXAocm93VG9Eb2NJZCkpO1xuXG4gICAgICAgIHJldHVybiB2aWV3LnNvdXJjZURCLmFsbERvY3Moe1xuICAgICAgICAgIGtleXM6IGRvY0lkcyxcbiAgICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWUsXG4gICAgICAgICAgY29uZmxpY3RzOiBvcHRzLmNvbmZsaWN0cyxcbiAgICAgICAgICBhdHRhY2htZW50czogb3B0cy5hdHRhY2htZW50cyxcbiAgICAgICAgICBiaW5hcnk6IG9wdHMuYmluYXJ5XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGFsbERvY3NSZXMpIHtcbiAgICAgICAgICB2YXIgZG9jSWRzVG9Eb2NzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG4gICAgICAgICAgYWxsRG9jc1Jlcy5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgZG9jSWRzVG9Eb2NzLnNldChyb3cuaWQsIHJvdy5kb2MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICB2YXIgZG9jSWQgPSByb3dUb0RvY0lkKHJvdyk7XG4gICAgICAgICAgICB2YXIgZG9jID0gZG9jSWRzVG9Eb2NzLmdldChkb2NJZCk7XG4gICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgIHJvdy5kb2MgPSBkb2M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0cztcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmluYWxSZXN1bHRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5rZXlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGtleXMgPSBvcHRzLmtleXM7XG4gICAgICB2YXIgZmV0Y2hQcm9taXNlcyA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHZpZXdPcHRzID0ge1xuICAgICAgICAgIHN0YXJ0a2V5IDogdG9JbmRleGFibGVTdHJpbmcoW2tleV0pLFxuICAgICAgICAgIGVuZGtleSAgIDogdG9JbmRleGFibGVTdHJpbmcoW2tleSwge31dKVxuICAgICAgICB9O1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgICAgIHZpZXdPcHRzLnVwZGF0ZV9zZXEgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZXRjaEZyb21WaWV3KHZpZXdPcHRzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGZldGNoUHJvbWlzZXMpLnRoZW4oZmxhdHRlbikudGhlbihvbk1hcFJlc3VsdHNSZWFkeSk7XG4gICAgfSBlbHNlIHsgLy8gbm9ybWFsIHF1ZXJ5LCBubyAna2V5cydcbiAgICAgIHZhciB2aWV3T3B0cyA9IHtcbiAgICAgICAgZGVzY2VuZGluZyA6IG9wdHMuZGVzY2VuZGluZ1xuICAgICAgfTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgICB2aWV3T3B0cy51cGRhdGVfc2VxID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGFydGtleTtcbiAgICAgIHZhciBlbmRrZXk7XG4gICAgICBpZiAoJ3N0YXJ0X2tleScgaW4gb3B0cykge1xuICAgICAgICBzdGFydGtleSA9IG9wdHMuc3RhcnRfa2V5O1xuICAgICAgfVxuICAgICAgaWYgKCdzdGFydGtleScgaW4gb3B0cykge1xuICAgICAgICBzdGFydGtleSA9IG9wdHMuc3RhcnRrZXk7XG4gICAgICB9XG4gICAgICBpZiAoJ2VuZF9rZXknIGluIG9wdHMpIHtcbiAgICAgICAgZW5ka2V5ID0gb3B0cy5lbmRfa2V5O1xuICAgICAgfVxuICAgICAgaWYgKCdlbmRrZXknIGluIG9wdHMpIHtcbiAgICAgICAgZW5ka2V5ID0gb3B0cy5lbmRrZXk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHN0YXJ0a2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2aWV3T3B0cy5zdGFydGtleSA9IG9wdHMuZGVzY2VuZGluZyA/XG4gICAgICAgICAgdG9JbmRleGFibGVTdHJpbmcoW3N0YXJ0a2V5LCB7fV0pIDpcbiAgICAgICAgICB0b0luZGV4YWJsZVN0cmluZyhbc3RhcnRrZXldKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZW5ka2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgaW5jbHVzaXZlRW5kID0gb3B0cy5pbmNsdXNpdmVfZW5kICE9PSBmYWxzZTtcbiAgICAgICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgICAgIGluY2x1c2l2ZUVuZCA9ICFpbmNsdXNpdmVFbmQ7XG4gICAgICAgIH1cblxuICAgICAgICB2aWV3T3B0cy5lbmRrZXkgPSB0b0luZGV4YWJsZVN0cmluZyhcbiAgICAgICAgICBpbmNsdXNpdmVFbmQgPyBbZW5ka2V5LCB7fV0gOiBbZW5ka2V5XSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMua2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIga2V5U3RhcnQgPSB0b0luZGV4YWJsZVN0cmluZyhbb3B0cy5rZXldKTtcbiAgICAgICAgdmFyIGtleUVuZCA9IHRvSW5kZXhhYmxlU3RyaW5nKFtvcHRzLmtleSwge31dKTtcbiAgICAgICAgaWYgKHZpZXdPcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgICB2aWV3T3B0cy5lbmRrZXkgPSBrZXlTdGFydDtcbiAgICAgICAgICB2aWV3T3B0cy5zdGFydGtleSA9IGtleUVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3T3B0cy5zdGFydGtleSA9IGtleVN0YXJ0O1xuICAgICAgICAgIHZpZXdPcHRzLmVuZGtleSA9IGtleUVuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzaG91bGRSZWR1Y2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmxpbWl0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHZpZXdPcHRzLmxpbWl0ID0gb3B0cy5saW1pdDtcbiAgICAgICAgfVxuICAgICAgICB2aWV3T3B0cy5za2lwID0gc2tpcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEZyb21WaWV3KHZpZXdPcHRzKS50aGVuKG9uTWFwUmVzdWx0c1JlYWR5KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBodHRwVmlld0NsZWFudXAoZGIpIHtcbiAgICByZXR1cm4gZGIuZmV0Y2goJ192aWV3X2NsZWFudXAnLCB7XG4gICAgICBoZWFkZXJzOiBuZXcgaCh7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30pLFxuICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2FsVmlld0NsZWFudXAoZGIpIHtcbiAgICByZXR1cm4gZGIuZ2V0KCdfbG9jYWwvJyArIGxvY2FsRG9jTmFtZSkudGhlbihmdW5jdGlvbiAobWV0YURvYykge1xuICAgICAgdmFyIGRvY3NUb1ZpZXdzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG4gICAgICBPYmplY3Qua2V5cyhtZXRhRG9jLnZpZXdzKS5mb3JFYWNoKGZ1bmN0aW9uIChmdWxsVmlld05hbWUpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gcGFyc2VWaWV3TmFtZShmdWxsVmlld05hbWUpO1xuICAgICAgICB2YXIgZGVzaWduRG9jTmFtZSA9ICdfZGVzaWduLycgKyBwYXJ0c1swXTtcbiAgICAgICAgdmFyIHZpZXdOYW1lID0gcGFydHNbMV07XG4gICAgICAgIHZhciB2aWV3cyA9IGRvY3NUb1ZpZXdzLmdldChkZXNpZ25Eb2NOYW1lKTtcbiAgICAgICAgaWYgKCF2aWV3cykge1xuICAgICAgICAgIHZpZXdzID0gbmV3IEV4cG9ydGVkU2V0KCk7XG4gICAgICAgICAgZG9jc1RvVmlld3Muc2V0KGRlc2lnbkRvY05hbWUsIHZpZXdzKTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3cy5hZGQodmlld05hbWUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAga2V5cyA6IG1hcFRvS2V5c0FycmF5KGRvY3NUb1ZpZXdzKSxcbiAgICAgICAgaW5jbHVkZV9kb2NzIDogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHJldHVybiBkYi5hbGxEb2NzKG9wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB2YXIgdmlld3NUb1N0YXR1cyA9IHt9O1xuICAgICAgICByZXMucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICB2YXIgZGRvY05hbWUgPSByb3cua2V5LnN1YnN0cmluZyg4KTsgLy8gY3V0cyBvZmYgJ19kZXNpZ24vJ1xuICAgICAgICAgIGRvY3NUb1ZpZXdzLmdldChyb3cua2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh2aWV3TmFtZSkge1xuICAgICAgICAgICAgdmFyIGZ1bGxWaWV3TmFtZSA9IGRkb2NOYW1lICsgJy8nICsgdmlld05hbWU7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmICghbWV0YURvYy52aWV3c1tmdWxsVmlld05hbWVdKSB7XG4gICAgICAgICAgICAgIC8vIG5ldyBmb3JtYXQsIHdpdGhvdXQgc2xhc2hlcywgdG8gc3VwcG9ydCBQb3VjaERCIDIuMi4wXG4gICAgICAgICAgICAgIC8vIG1pZ3JhdGlvbiB0ZXN0IGluIHBvdWNoZGIncyBicm93c2VyLm1pZ3JhdGlvbi5qcyB2ZXJpZmllcyB0aGlzXG4gICAgICAgICAgICAgIGZ1bGxWaWV3TmFtZSA9IHZpZXdOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZpZXdEQk5hbWVzID0gT2JqZWN0LmtleXMobWV0YURvYy52aWV3c1tmdWxsVmlld05hbWVdKTtcbiAgICAgICAgICAgIC8vIGRlc2lnbiBkb2MgZGVsZXRlZCwgb3IgdmlldyBmdW5jdGlvbiBub25leGlzdGVudFxuICAgICAgICAgICAgdmFyIHN0YXR1c0lzR29vZCA9IHJvdy5kb2MgJiYgcm93LmRvYy52aWV3cyAmJlxuICAgICAgICAgICAgICByb3cuZG9jLnZpZXdzW3ZpZXdOYW1lXTtcbiAgICAgICAgICAgIHZpZXdEQk5hbWVzLmZvckVhY2goZnVuY3Rpb24gKHZpZXdEQk5hbWUpIHtcbiAgICAgICAgICAgICAgdmlld3NUb1N0YXR1c1t2aWV3REJOYW1lXSA9XG4gICAgICAgICAgICAgICAgdmlld3NUb1N0YXR1c1t2aWV3REJOYW1lXSB8fCBzdGF0dXNJc0dvb2Q7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBkYnNUb0RlbGV0ZSA9IE9iamVjdC5rZXlzKHZpZXdzVG9TdGF0dXMpLmZpbHRlcihcbiAgICAgICAgICBmdW5jdGlvbiAodmlld0RCTmFtZSkgeyByZXR1cm4gIXZpZXdzVG9TdGF0dXNbdmlld0RCTmFtZV07IH0pO1xuICAgICAgICB2YXIgZGVzdHJveVByb21pc2VzID0gZGJzVG9EZWxldGUubWFwKGZ1bmN0aW9uICh2aWV3REJOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHNlcXVlbnRpYWxpemUoZ2V0UXVldWUodmlld0RCTmFtZSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgZGIuY29uc3RydWN0b3Iodmlld0RCTmFtZSwgZGIuX19vcHRzKS5kZXN0cm95KCk7XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChkZXN0cm95UHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7b2s6IHRydWV9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIGRlZmF1bHRzVG8oe29rOiB0cnVlfSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVlcnlQcm9taXNlZChkYiwgZnVuLCBvcHRzKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAodHlwZW9mIGRiLl9xdWVyeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGN1c3RvbVF1ZXJ5KGRiLCBmdW4sIG9wdHMpO1xuICAgIH1cbiAgICBpZiAoaXNSZW1vdGUoZGIpKSB7XG4gICAgICByZXR1cm4gaHR0cFF1ZXJ5KGRiLCBmdW4sIG9wdHMpO1xuICAgIH1cblxuICAgIHZhciB1cGRhdGVWaWV3T3B0cyA9IHtcbiAgICAgIGNoYW5nZXNfYmF0Y2hfc2l6ZTogZGIuX19vcHRzLnZpZXdfdXBkYXRlX2NoYW5nZXNfYmF0Y2hfc2l6ZSB8fCBDSEFOR0VTX0JBVENIX1NJWkUkMVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGZ1biAhPT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIHRlbXBfdmlld1xuICAgICAgY2hlY2tRdWVyeVBhcnNlRXJyb3Iob3B0cywgZnVuKTtcblxuICAgICAgdGVtcFZpZXdRdWV1ZS5hZGQoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRlVmlld1Byb21pc2UgPSBjcmVhdGVWaWV3KFxuICAgICAgICAgIC8qIHNvdXJjZURCICovIGRiLFxuICAgICAgICAgIC8qIHZpZXdOYW1lICovICd0ZW1wX3ZpZXcvdGVtcF92aWV3JyxcbiAgICAgICAgICAvKiBtYXBGdW4gKi8gZnVuLm1hcCxcbiAgICAgICAgICAvKiByZWR1Y2VGdW4gKi8gZnVuLnJlZHVjZSxcbiAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8gdHJ1ZSxcbiAgICAgICAgICAvKiBsb2NhbERvY05hbWUgKi8gbG9jYWxEb2NOYW1lKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZpZXdQcm9taXNlLnRoZW4oZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgICByZXR1cm4gZmluKHVwZGF0ZVZpZXcodmlldywgdXBkYXRlVmlld09wdHMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Vmlldyh2aWV3LCBvcHRzKTtcbiAgICAgICAgICB9KSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXcuZGIuZGVzdHJveSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRlbXBWaWV3UXVldWUuZmluaXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHBlcnNpc3RlbnQgdmlld1xuICAgICAgdmFyIGZ1bGxWaWV3TmFtZSA9IGZ1bjtcbiAgICAgIHZhciBwYXJ0cyA9IHBhcnNlVmlld05hbWUoZnVsbFZpZXdOYW1lKTtcbiAgICAgIHZhciBkZXNpZ25Eb2NOYW1lID0gcGFydHNbMF07XG4gICAgICB2YXIgdmlld05hbWUgPSBwYXJ0c1sxXTtcbiAgICAgIHJldHVybiBkYi5nZXQoJ19kZXNpZ24vJyArIGRlc2lnbkRvY05hbWUpLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgICAgICB2YXIgZnVuID0gZG9jLnZpZXdzICYmIGRvYy52aWV3c1t2aWV3TmFtZV07XG5cbiAgICAgICAgaWYgKCFmdW4pIHtcbiAgICAgICAgICAvLyBiYXNpYyB2YWxpZGF0b3I7IGl0J3MgYXNzdW1lZCB0aGF0IGV2ZXJ5IHN1YmNsYXNzIHdvdWxkIHdhbnQgdGhpc1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdkZG9jICcgKyBkb2MuX2lkICsgJyBoYXMgbm8gdmlldyBuYW1lZCAnICtcbiAgICAgICAgICAgIHZpZXdOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRkb2NWYWxpZGF0b3IoZG9jLCB2aWV3TmFtZSk7XG4gICAgICAgIGNoZWNrUXVlcnlQYXJzZUVycm9yKG9wdHMsIGZ1bik7XG5cbiAgICAgICAgdmFyIGNyZWF0ZVZpZXdQcm9taXNlID0gY3JlYXRlVmlldyhcbiAgICAgICAgICAvKiBzb3VyY2VEQiAqLyBkYixcbiAgICAgICAgICAvKiB2aWV3TmFtZSAqLyBmdWxsVmlld05hbWUsXG4gICAgICAgICAgLyogbWFwRnVuICovIGZ1bi5tYXAsXG4gICAgICAgICAgLyogcmVkdWNlRnVuICovIGZ1bi5yZWR1Y2UsXG4gICAgICAgICAgLyogdGVtcG9yYXJ5ICovIGZhbHNlLFxuICAgICAgICAgIC8qIGxvY2FsRG9jTmFtZSAqLyBsb2NhbERvY05hbWUpO1xuICAgICAgICByZXR1cm4gY3JlYXRlVmlld1Byb21pc2UudGhlbihmdW5jdGlvbiAodmlldykge1xuICAgICAgICAgIGlmIChvcHRzLnN0YWxlID09PSAnb2snIHx8IG9wdHMuc3RhbGUgPT09ICd1cGRhdGVfYWZ0ZXInKSB7XG4gICAgICAgICAgICBpZiAob3B0cy5zdGFsZSA9PT0gJ3VwZGF0ZV9hZnRlcicpIHtcbiAgICAgICAgICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KHZpZXcsIHVwZGF0ZVZpZXdPcHRzKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcXVlcnlWaWV3KHZpZXcsIG9wdHMpO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIHN0YWxlIG5vdCBva1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVZpZXcodmlldywgdXBkYXRlVmlld09wdHMpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gcXVlcnlWaWV3KHZpZXcsIG9wdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFic3RyYWN0UXVlcnkoZnVuLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHZhciBkYiA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHMgPSBvcHRzID8gY29lcmNlT3B0aW9ucyhvcHRzKSA6IHt9O1xuXG4gICAgaWYgKHR5cGVvZiBmdW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZ1biA9IHttYXAgOiBmdW59O1xuICAgIH1cblxuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcXVlcnlQcm9taXNlZChkYiwgZnVuLCBvcHRzKTtcbiAgICB9KTtcbiAgICBwcm9taXNlZENhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHZhciBhYnN0cmFjdFZpZXdDbGVhbnVwID0gY2FsbGJhY2tpZnkoZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYiA9IHRoaXM7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAodHlwZW9mIGRiLl92aWV3Q2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdDbGVhbnVwKGRiKTtcbiAgICB9XG4gICAgaWYgKGlzUmVtb3RlKGRiKSkge1xuICAgICAgcmV0dXJuIGh0dHBWaWV3Q2xlYW51cChkYik7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZXdDbGVhbnVwKGRiKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBxdWVyeTogYWJzdHJhY3RRdWVyeSxcbiAgICB2aWV3Q2xlYW51cDogYWJzdHJhY3RWaWV3Q2xlYW51cFxuICB9O1xufVxuXG52YXIgYnVpbHRJblJlZHVjZSA9IHtcbiAgX3N1bTogZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgIHJldHVybiBzdW0odmFsdWVzKTtcbiAgfSxcblxuICBfY291bnQ6IGZ1bmN0aW9uIChrZXlzLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aDtcbiAgfSxcblxuICBfc3RhdHM6IGZ1bmN0aW9uIChrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBubyBuZWVkIHRvIGltcGxlbWVudCByZXJlZHVjZT10cnVlLCBiZWNhdXNlIFBvdWNoXG4gICAgLy8gd2lsbCBuZXZlciBjYWxsIGl0XG4gICAgZnVuY3Rpb24gc3Vtc3FyKHZhbHVlcykge1xuICAgICAgdmFyIF9zdW1zcXIgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgbnVtID0gdmFsdWVzW2ldO1xuICAgICAgICBfc3Vtc3FyICs9IChudW0gKiBudW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9zdW1zcXI7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdW0gICAgIDogc3VtKHZhbHVlcyksXG4gICAgICBtaW4gICAgIDogTWF0aC5taW4uYXBwbHkobnVsbCwgdmFsdWVzKSxcbiAgICAgIG1heCAgICAgOiBNYXRoLm1heC5hcHBseShudWxsLCB2YWx1ZXMpLFxuICAgICAgY291bnQgICA6IHZhbHVlcy5sZW5ndGgsXG4gICAgICBzdW1zcXIgOiBzdW1zcXIodmFsdWVzKVxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldEJ1aWx0SW4ocmVkdWNlRnVuU3RyaW5nKSB7XG4gIGlmICgvXl9zdW0vLnRlc3QocmVkdWNlRnVuU3RyaW5nKSkge1xuICAgIHJldHVybiBidWlsdEluUmVkdWNlLl9zdW07XG4gIH0gZWxzZSBpZiAoL15fY291bnQvLnRlc3QocmVkdWNlRnVuU3RyaW5nKSkge1xuICAgIHJldHVybiBidWlsdEluUmVkdWNlLl9jb3VudDtcbiAgfSBlbHNlIGlmICgvXl9zdGF0cy8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW5SZWR1Y2UuX3N0YXRzO1xuICB9IGVsc2UgaWYgKC9eXy8udGVzdChyZWR1Y2VGdW5TdHJpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlZHVjZUZ1blN0cmluZyArICcgaXMgbm90IGEgc3VwcG9ydGVkIHJlZHVjZSBmdW5jdGlvbi4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBwZXIobWFwRnVuLCBlbWl0KSB7XG4gIC8vIGZvciB0ZW1wX3ZpZXdzIG9uZSBjYW4gdXNlIGVtaXQoZG9jLCBlbWl0KSwgc2VlICMzOFxuICBpZiAodHlwZW9mIG1hcEZ1biA9PT0gXCJmdW5jdGlvblwiICYmIG1hcEZ1bi5sZW5ndGggPT09IDIpIHtcbiAgICB2YXIgb3JpZ01hcCA9IG1hcEZ1bjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRvYykge1xuICAgICAgcmV0dXJuIG9yaWdNYXAoZG9jLCBlbWl0KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBldmFsRnVuY3Rpb25XaXRoRXZhbChtYXBGdW4udG9TdHJpbmcoKSwgZW1pdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlcihyZWR1Y2VGdW4pIHtcbiAgdmFyIHJlZHVjZUZ1blN0cmluZyA9IHJlZHVjZUZ1bi50b1N0cmluZygpO1xuICB2YXIgYnVpbHRJbiA9IGdldEJ1aWx0SW4ocmVkdWNlRnVuU3RyaW5nKTtcbiAgaWYgKGJ1aWx0SW4pIHtcbiAgICByZXR1cm4gYnVpbHRJbjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXZhbEZ1bmN0aW9uV2l0aEV2YWwocmVkdWNlRnVuU3RyaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZG9jVmFsaWRhdG9yKGRkb2MsIHZpZXdOYW1lKSB7XG4gIHZhciBmdW4gPSBkZG9jLnZpZXdzICYmIGRkb2Mudmlld3Nbdmlld05hbWVdO1xuICBpZiAodHlwZW9mIGZ1bi5tYXAgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ2Rkb2MgJyArIGRkb2MuX2lkICsgJyBoYXMgbm8gc3RyaW5nIHZpZXcgbmFtZWQgJyArXG4gICAgICB2aWV3TmFtZSArICcsIGluc3RlYWQgZm91bmQgb2JqZWN0IG9mIHR5cGU6ICcgKyB0eXBlb2YgZnVuLm1hcCk7XG4gIH1cbn1cblxudmFyIGxvY2FsRG9jTmFtZSA9ICdtcnZpZXdzJztcbnZhciBhYnN0cmFjdCA9IGNyZWF0ZUFic3RyYWN0TWFwUmVkdWNlKGxvY2FsRG9jTmFtZSwgbWFwcGVyLCByZWR1Y2VyLCBkZG9jVmFsaWRhdG9yKTtcblxuZnVuY3Rpb24gcXVlcnkoZnVuLCBvcHRzLCBjYWxsYmFjaykge1xuICByZXR1cm4gYWJzdHJhY3QucXVlcnkuY2FsbCh0aGlzLCBmdW4sIG9wdHMsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gdmlld0NsZWFudXAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFic3RyYWN0LnZpZXdDbGVhbnVwLmNhbGwodGhpcywgY2FsbGJhY2spO1xufVxuXG52YXIgbWFwcmVkdWNlID0ge1xuICBxdWVyeTogcXVlcnksXG4gIHZpZXdDbGVhbnVwOiB2aWV3Q2xlYW51cFxufTtcblxuZnVuY3Rpb24gaXNHZW5PbmUkMShyZXYpIHtcbiAgcmV0dXJuIC9eMS0vLnRlc3QocmV2KTtcbn1cblxuZnVuY3Rpb24gZmlsZUhhc0NoYW5nZWQobG9jYWxEb2MsIHJlbW90ZURvYywgZmlsZW5hbWUpIHtcbiAgcmV0dXJuICFsb2NhbERvYy5fYXR0YWNobWVudHMgfHxcbiAgICAgICAgICFsb2NhbERvYy5fYXR0YWNobWVudHNbZmlsZW5hbWVdIHx8XG4gICAgICAgICBsb2NhbERvYy5fYXR0YWNobWVudHNbZmlsZW5hbWVdLmRpZ2VzdCAhPT0gcmVtb3RlRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZV0uZGlnZXN0O1xufVxuXG5mdW5jdGlvbiBnZXREb2NBdHRhY2htZW50cyhkYiwgZG9jKSB7XG4gIHZhciBmaWxlbmFtZXMgPSBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVuYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIGRiLmdldEF0dGFjaG1lbnQoZG9jLl9pZCwgZmlsZW5hbWUsIHtyZXY6IGRvYy5fcmV2fSk7XG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jQXR0YWNobWVudHNGcm9tVGFyZ2V0T3JTb3VyY2UodGFyZ2V0LCBzcmMsIGRvYykge1xuICB2YXIgZG9DaGVja0ZvckxvY2FsQXR0YWNobWVudHMgPSBpc1JlbW90ZShzcmMpICYmICFpc1JlbW90ZSh0YXJnZXQpO1xuICB2YXIgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cyk7XG5cbiAgaWYgKCFkb0NoZWNrRm9yTG9jYWxBdHRhY2htZW50cykge1xuICAgIHJldHVybiBnZXREb2NBdHRhY2htZW50cyhzcmMsIGRvYyk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0LmdldChkb2MuX2lkKS50aGVuKGZ1bmN0aW9uIChsb2NhbERvYykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChmaWxlbmFtZXMubWFwKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgaWYgKGZpbGVIYXNDaGFuZ2VkKGxvY2FsRG9jLCBkb2MsIGZpbGVuYW1lKSkge1xuICAgICAgICByZXR1cm4gc3JjLmdldEF0dGFjaG1lbnQoZG9jLl9pZCwgZmlsZW5hbWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0LmdldEF0dGFjaG1lbnQobG9jYWxEb2MuX2lkLCBmaWxlbmFtZSk7XG4gICAgfSkpO1xuICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoZXJyb3Iuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHJldHVybiBnZXREb2NBdHRhY2htZW50cyhzcmMsIGRvYyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWxrR2V0T3B0cyhkaWZmcykge1xuICB2YXIgcmVxdWVzdHMgPSBbXTtcbiAgT2JqZWN0LmtleXMoZGlmZnMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIG1pc3NpbmdSZXZzID0gZGlmZnNbaWRdLm1pc3Npbmc7XG4gICAgbWlzc2luZ1JldnMuZm9yRWFjaChmdW5jdGlvbiAobWlzc2luZ1Jldikge1xuICAgICAgcmVxdWVzdHMucHVzaCh7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgcmV2OiBtaXNzaW5nUmV2XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBkb2NzOiByZXF1ZXN0cyxcbiAgICByZXZzOiB0cnVlLFxuICAgIGxhdGVzdDogdHJ1ZVxuICB9O1xufVxuXG4vL1xuLy8gRmV0Y2ggYWxsIHRoZSBkb2N1bWVudHMgZnJvbSB0aGUgc3JjIGFzIGRlc2NyaWJlZCBpbiB0aGUgXCJkaWZmc1wiLFxuLy8gd2hpY2ggaXMgYSBtYXBwaW5nIG9mIGRvY3MgSURzIHRvIHJldmlzaW9ucy4gSWYgdGhlIHN0YXRlIGV2ZXJcbi8vIGNoYW5nZXMgdG8gXCJjYW5jZWxsZWRcIiwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkLlxuLy8gRWxzZSBpdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggYSBsaXN0IG9mIGZldGNoZWQgZG9jdW1lbnRzLlxuLy9cbmZ1bmN0aW9uIGdldERvY3Moc3JjLCB0YXJnZXQsIGRpZmZzLCBzdGF0ZSkge1xuICBkaWZmcyA9IGNsb25lKGRpZmZzKTsgLy8gd2UgZG8gbm90IG5lZWQgdG8gbW9kaWZ5IHRoaXNcblxuICB2YXIgcmVzdWx0RG9jcyA9IFtdLFxuICAgICAgb2sgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIGdldEFsbERvY3MoKSB7XG5cbiAgICB2YXIgYnVsa0dldE9wdHMgPSBjcmVhdGVCdWxrR2V0T3B0cyhkaWZmcyk7XG5cbiAgICBpZiAoIWJ1bGtHZXRPcHRzLmRvY3MubGVuZ3RoKSB7IC8vIG9wdGltaXphdGlvbjogc2tpcCBlbXB0eSByZXF1ZXN0c1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBzcmMuYnVsa0dldChidWxrR2V0T3B0cykudGhlbihmdW5jdGlvbiAoYnVsa0dldFJlc3BvbnNlKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChzdGF0ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChidWxrR2V0UmVzcG9uc2UucmVzdWx0cy5tYXAoZnVuY3Rpb24gKGJ1bGtHZXRJbmZvKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChidWxrR2V0SW5mby5kb2NzLm1hcChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgICAgdmFyIHJlbW90ZURvYyA9IGRvYy5vaztcblxuICAgICAgICAgIGlmIChkb2MuZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gQVVUT19DT01QQUNUSU9OIGlzIHNldCwgZG9jcyBjYW4gYmUgcmV0dXJuZWQgd2hpY2ggbG9va1xuICAgICAgICAgICAgLy8gbGlrZSB0aGlzOiB7XCJtaXNzaW5nXCI6XCIxLTdjM2FjMjU2YjY5M2M0NjJhZjg0NDJmOTkyYjgzNjk2XCJ9XG4gICAgICAgICAgICBvayA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghcmVtb3RlRG9jIHx8ICFyZW1vdGVEb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3RlRG9jO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBnZXREb2NBdHRhY2htZW50c0Zyb21UYXJnZXRPclNvdXJjZSh0YXJnZXQsIHNyYywgcmVtb3RlRG9jKVxuICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChhdHRhY2htZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVuYW1lcyA9IE9iamVjdC5rZXlzKHJlbW90ZURvYy5fYXR0YWNobWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGF0dGFjaG1lbnQsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ID0gcmVtb3RlRG9jLl9hdHRhY2htZW50c1tmaWxlbmFtZXNbaV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHQuc3R1YjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXR0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHQuZGF0YSA9IGF0dGFjaG1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZW1vdGVEb2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSkpXG5cbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgIHJlc3VsdERvY3MgPSByZXN1bHREb2NzLmNvbmNhdChmbGF0dGVuKHJlc3VsdHMpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0F0dGFjaG1lbnRzKGRvYykge1xuICAgIHJldHVybiBkb2MuX2F0dGFjaG1lbnRzICYmIE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNDb25mbGljdHMoZG9jKSB7XG4gICAgcmV0dXJuIGRvYy5fY29uZmxpY3RzICYmIGRvYy5fY29uZmxpY3RzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaFJldmlzaW9uT25lRG9jcyhpZHMpIHtcbiAgICAvLyBPcHRpbWl6YXRpb246IGZldGNoIGdlbi0xIGRvY3MgYW5kIGF0dGFjaG1lbnRzIGluXG4gICAgLy8gYSBzaW5nbGUgcmVxdWVzdCB1c2luZyBfYWxsX2RvY3NcbiAgICByZXR1cm4gc3JjLmFsbERvY3Moe1xuICAgICAga2V5czogaWRzLFxuICAgICAgaW5jbHVkZV9kb2NzOiB0cnVlLFxuICAgICAgY29uZmxpY3RzOiB0cnVlXG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICBpZiAoc3RhdGUuY2FuY2VsbGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG4gICAgICByZXMucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgaWYgKHJvdy5kZWxldGVkIHx8ICFyb3cuZG9jIHx8ICFpc0dlbk9uZSQxKHJvdy52YWx1ZS5yZXYpIHx8XG4gICAgICAgICAgICBoYXNBdHRhY2htZW50cyhyb3cuZG9jKSB8fCBoYXNDb25mbGljdHMocm93LmRvYykpIHtcbiAgICAgICAgICAvLyBpZiBhbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcHBseSwgd2UgbmVlZCB0byBmZXRjaCB1c2luZyBnZXQoKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0cmlwIF9jb25mbGljdHMgYXJyYXkgdG8gYXBwZWFzZSBDU0cgKCM1NzkzKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHJvdy5kb2MuX2NvbmZsaWN0cykge1xuICAgICAgICAgIGRlbGV0ZSByb3cuZG9jLl9jb25mbGljdHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgZG9jIHdlIGdvdCBiYWNrIGZyb20gYWxsRG9jcygpIGlzIHN1ZmZpY2llbnRcbiAgICAgICAgcmVzdWx0RG9jcy5wdXNoKHJvdy5kb2MpO1xuICAgICAgICBkZWxldGUgZGlmZnNbcm93LmlkXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmV2aXNpb25PbmVEb2NzKCkge1xuICAgIC8vIGZpbHRlciBvdXQgdGhlIGdlbmVyYXRpb24gMSBkb2NzIGFuZCBnZXQgdGhlbVxuICAgIC8vIGxlYXZpbmcgdGhlIG5vbi1nZW5lcmF0aW9uIG9uZSBkb2NzIHRvIGJlIGdvdCBvdGhlcndpc2VcbiAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMoZGlmZnMpLmZpbHRlcihmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHZhciBtaXNzaW5nID0gZGlmZnNbaWRdLm1pc3Npbmc7XG4gICAgICByZXR1cm4gbWlzc2luZy5sZW5ndGggPT09IDEgJiYgaXNHZW5PbmUkMShtaXNzaW5nWzBdKTtcbiAgICB9KTtcbiAgICBpZiAoaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmZXRjaFJldmlzaW9uT25lRG9jcyhpZHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJldHVyblJlc3VsdCgpIHtcbiAgICByZXR1cm4geyBvazpvaywgZG9jczpyZXN1bHREb2NzIH07XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbihnZXRSZXZpc2lvbk9uZURvY3MpXG4gICAgLnRoZW4oZ2V0QWxsRG9jcylcbiAgICAudGhlbihyZXR1cm5SZXN1bHQpO1xufVxuXG52YXIgQ0hFQ0tQT0lOVF9WRVJTSU9OID0gMTtcbnZhciBSRVBMSUNBVE9SID0gXCJwb3VjaGRiXCI7XG4vLyBUaGlzIGlzIGFuIGFyYml0cmFyeSBudW1iZXIgdG8gbGltaXQgdGhlXG4vLyBhbW91bnQgb2YgcmVwbGljYXRpb24gaGlzdG9yeSB3ZSBzYXZlIGluIHRoZSBjaGVja3BvaW50LlxuLy8gSWYgd2Ugc2F2ZSB0b28gbXVjaCwgdGhlIGNoZWNrcG9pbmcgZG9jcyB3aWxsIGJlY29tZSB2ZXJ5IGJpZyxcbi8vIGlmIHdlIHNhdmUgZmV3ZXIsIHdlJ2xsIHJ1biBhIGdyZWF0ZXIgcmlzayBvZiBoYXZpbmcgdG9cbi8vIHJlYWQgYWxsIHRoZSBjaGFuZ2VzIGZyb20gMCB3aGVuIGNoZWNrcG9pbnQgUFVUcyBmYWlsXG4vLyBDb3VjaERCIDIuMCBoYXMgYSBtb3JlIGludm9sdmVkIGhpc3RvcnkgcHJ1bmluZyxcbi8vIGJ1dCBsZXQncyBnbyBmb3IgdGhlIHNpbXBsZSB2ZXJzaW9uIGZvciBub3cuXG52YXIgQ0hFQ0tQT0lOVF9ISVNUT1JZX1NJWkUgPSA1O1xudmFyIExPV0VTVF9TRVEgPSAwO1xuXG5mdW5jdGlvbiB1cGRhdGVDaGVja3BvaW50KGRiLCBpZCwgY2hlY2twb2ludCwgc2Vzc2lvbiwgcmV0dXJuVmFsdWUpIHtcbiAgcmV0dXJuIGRiLmdldChpZCkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgIGlmIChkYi5hZGFwdGVyID09PSAnaHR0cCcgfHwgZGIuYWRhcHRlciA9PT0gJ2h0dHBzJykge1xuICAgICAgICBleHBsYWluRXJyb3IoXG4gICAgICAgICAgNDA0LCAnUG91Y2hEQiBpcyBqdXN0IGNoZWNraW5nIGlmIGEgcmVtb3RlIGNoZWNrcG9pbnQgZXhpc3RzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlc3Npb25faWQ6IHNlc3Npb24sXG4gICAgICAgIF9pZDogaWQsXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxuICAgICAgICByZXBsaWNhdG9yOiBSRVBMSUNBVE9SLFxuICAgICAgICB2ZXJzaW9uOiBDSEVDS1BPSU5UX1ZFUlNJT05cbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfSkudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBjaGVja3BvaW50IGhhcyBub3QgY2hhbmdlZCwgZG8gbm90IHVwZGF0ZVxuICAgIGlmIChkb2MubGFzdF9zZXEgPT09IGNoZWNrcG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGN1cnJlbnQgZW50cnkgZm9yIHRoaXMgcmVwbGljYXRpb25cbiAgICBkb2MuaGlzdG9yeSA9IChkb2MuaGlzdG9yeSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5zZXNzaW9uX2lkICE9PSBzZXNzaW9uO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSBsYXRlc3QgY2hlY2twb2ludCB0byBoaXN0b3J5XG4gICAgZG9jLmhpc3RvcnkudW5zaGlmdCh7XG4gICAgICBsYXN0X3NlcTogY2hlY2twb2ludCxcbiAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25cbiAgICB9KTtcblxuICAgIC8vIEp1c3QgdGFrZSB0aGUgbGFzdCBwaWVjZXMgaW4gaGlzdG9yeSwgdG9cbiAgICAvLyBhdm9pZCByZWFsbHkgYmlnIGNoZWNrcG9pbnQgZG9jcy5cbiAgICAvLyBzZWUgY29tbWVudCBvbiBoaXN0b3J5IHNpemUgYWJvdmVcbiAgICBkb2MuaGlzdG9yeSA9IGRvYy5oaXN0b3J5LnNsaWNlKDAsIENIRUNLUE9JTlRfSElTVE9SWV9TSVpFKTtcblxuICAgIGRvYy52ZXJzaW9uID0gQ0hFQ0tQT0lOVF9WRVJTSU9OO1xuICAgIGRvYy5yZXBsaWNhdG9yID0gUkVQTElDQVRPUjtcblxuICAgIGRvYy5zZXNzaW9uX2lkID0gc2Vzc2lvbjtcbiAgICBkb2MubGFzdF9zZXEgPSBjaGVja3BvaW50O1xuXG4gICAgcmV0dXJuIGRiLnB1dChkb2MpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgLy8gcmV0cnk7IHNvbWVvbmUgaXMgdHJ5aW5nIHRvIHdyaXRlIGEgY2hlY2twb2ludCBzaW11bHRhbmVvdXNseVxuICAgICAgICByZXR1cm4gdXBkYXRlQ2hlY2twb2ludChkYiwgaWQsIGNoZWNrcG9pbnQsIHNlc3Npb24sIHJldHVyblZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIENoZWNrcG9pbnRlcihzcmMsIHRhcmdldCwgaWQsIHJldHVyblZhbHVlLCBvcHRzKSB7XG4gIHRoaXMuc3JjID0gc3JjO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgdGhpcy5pZCA9IGlkO1xuICB0aGlzLnJldHVyblZhbHVlID0gcmV0dXJuVmFsdWU7XG4gIHRoaXMub3B0cyA9IG9wdHMgfHwge307XG59XG5cbkNoZWNrcG9pbnRlci5wcm90b3R5cGUud3JpdGVDaGVja3BvaW50ID0gZnVuY3Rpb24gKGNoZWNrcG9pbnQsIHNlc3Npb24pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy51cGRhdGVUYXJnZXQoY2hlY2twb2ludCwgc2Vzc2lvbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHNlbGYudXBkYXRlU291cmNlKGNoZWNrcG9pbnQsIHNlc3Npb24pO1xuICB9KTtcbn07XG5cbkNoZWNrcG9pbnRlci5wcm90b3R5cGUudXBkYXRlVGFyZ2V0ID0gZnVuY3Rpb24gKGNoZWNrcG9pbnQsIHNlc3Npb24pIHtcbiAgaWYgKHRoaXMub3B0cy53cml0ZVRhcmdldENoZWNrcG9pbnQpIHtcbiAgICByZXR1cm4gdXBkYXRlQ2hlY2twb2ludCh0aGlzLnRhcmdldCwgdGhpcy5pZCwgY2hlY2twb2ludCxcbiAgICAgIHNlc3Npb24sIHRoaXMucmV0dXJuVmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn07XG5cbkNoZWNrcG9pbnRlci5wcm90b3R5cGUudXBkYXRlU291cmNlID0gZnVuY3Rpb24gKGNoZWNrcG9pbnQsIHNlc3Npb24pIHtcbiAgaWYgKHRoaXMub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHVwZGF0ZUNoZWNrcG9pbnQodGhpcy5zcmMsIHRoaXMuaWQsIGNoZWNrcG9pbnQsXG4gICAgICBzZXNzaW9uLCB0aGlzLnJldHVyblZhbHVlKVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRm9yYmlkZGVuRXJyb3IoZXJyKSkge1xuICAgICAgICAgIHNlbGYub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG59O1xuXG52YXIgY29tcGFyaXNvbnMgPSB7XG4gIFwidW5kZWZpbmVkXCI6IGZ1bmN0aW9uICh0YXJnZXREb2MsIHNvdXJjZURvYykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHByZXZpb3VzIGNvbXBhcmlzb24gZnVuY3Rpb25cbiAgICBpZiAoY29sbGF0ZSh0YXJnZXREb2MubGFzdF9zZXEsIHNvdXJjZURvYy5sYXN0X3NlcSkgPT09IDApIHtcbiAgICAgIHJldHVybiBzb3VyY2VEb2MubGFzdF9zZXE7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIFwiMVwiOiBmdW5jdGlvbiAodGFyZ2V0RG9jLCBzb3VyY2VEb2MpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHBvcnRlZCBmcm9tIENvdWNoREJcbiAgICByZXR1cm4gY29tcGFyZVJlcGxpY2F0aW9uTG9ncyhzb3VyY2VEb2MsIHRhcmdldERvYykubGFzdF9zZXE7XG4gIH1cbn07XG5cbkNoZWNrcG9pbnRlci5wcm90b3R5cGUuZ2V0Q2hlY2twb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmIChzZWxmLm9wdHMgJiYgc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCAmJiAhc2VsZi5vcHRzLndyaXRlVGFyZ2V0Q2hlY2twb2ludCkge1xuICAgIHJldHVybiBzZWxmLnNyYy5nZXQoc2VsZi5pZCkudGhlbihmdW5jdGlvbiAoc291cmNlRG9jKSB7XG4gICAgICByZXR1cm4gc291cmNlRG9jLmxhc3Rfc2VxIHx8IExPV0VTVF9TRVE7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHNlbGYudGFyZ2V0LmdldChzZWxmLmlkKS50aGVuKGZ1bmN0aW9uICh0YXJnZXREb2MpIHtcbiAgICBpZiAoc2VsZi5vcHRzICYmIHNlbGYub3B0cy53cml0ZVRhcmdldENoZWNrcG9pbnQgJiYgIXNlbGYub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQpIHtcbiAgICAgIHJldHVybiB0YXJnZXREb2MubGFzdF9zZXEgfHwgTE9XRVNUX1NFUTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZi5zcmMuZ2V0KHNlbGYuaWQpLnRoZW4oZnVuY3Rpb24gKHNvdXJjZURvYykge1xuICAgICAgLy8gU2luY2Ugd2UgY2FuJ3QgbWlncmF0ZSBhbiBvbGQgdmVyc2lvbiBkb2MgdG8gYSBuZXcgb25lXG4gICAgICAvLyAobm8gc2Vzc2lvbiBpZCksIHdlIGp1c3QgZ28gd2l0aCB0aGUgbG93ZXN0IHNlcSBpbiB0aGlzIGNhc2VcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHRhcmdldERvYy52ZXJzaW9uICE9PSBzb3VyY2VEb2MudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZlcnNpb247XG4gICAgICBpZiAodGFyZ2V0RG9jLnZlcnNpb24pIHtcbiAgICAgICAgdmVyc2lvbiA9IHRhcmdldERvYy52ZXJzaW9uLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZlcnNpb24gaW4gY29tcGFyaXNvbnMpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25zW3ZlcnNpb25dKHRhcmdldERvYywgc291cmNlRG9jKTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDA0ICYmIHRhcmdldERvYy5sYXN0X3NlcSkge1xuICAgICAgICByZXR1cm4gc2VsZi5zcmMucHV0KHtcbiAgICAgICAgICBfaWQ6IHNlbGYuaWQsXG4gICAgICAgICAgbGFzdF9zZXE6IExPV0VTVF9TRVFcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAoaXNGb3JiaWRkZW5FcnJvcihlcnIpKSB7XG4gICAgICAgICAgICBzZWxmLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0RG9jLmxhc3Rfc2VxO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gIH0pO1xufTtcbi8vIFRoaXMgY2hlY2twb2ludCBjb21wYXJpc29uIGlzIHBvcnRlZCBmcm9tIENvdWNoREJzIHNvdXJjZVxuLy8gdGhleSBjb21lIGZyb20gaGVyZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY291Y2hkYi1jb3VjaC1yZXBsaWNhdG9yL2Jsb2IvbWFzdGVyL3NyYy9jb3VjaF9yZXBsaWNhdG9yLmVybCNMODYzLUw5MDZcblxuZnVuY3Rpb24gY29tcGFyZVJlcGxpY2F0aW9uTG9ncyhzcmNEb2MsIHRndERvYykge1xuICBpZiAoc3JjRG9jLnNlc3Npb25faWQgPT09IHRndERvYy5zZXNzaW9uX2lkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3Rfc2VxOiBzcmNEb2MubGFzdF9zZXEsXG4gICAgICBoaXN0b3J5OiBzcmNEb2MuaGlzdG9yeVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY29tcGFyZVJlcGxpY2F0aW9uSGlzdG9yeShzcmNEb2MuaGlzdG9yeSwgdGd0RG9jLmhpc3RvcnkpO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlUmVwbGljYXRpb25IaXN0b3J5KHNvdXJjZUhpc3RvcnksIHRhcmdldEhpc3RvcnkpIHtcbiAgLy8gdGhlIGVybGFuZyBsb29wIHZpYSBmdW5jdGlvbiBhcmd1bWVudHMgaXMgbm90IHNvIGVhc3kgdG8gcmVwZWF0IGluIEpTXG4gIC8vIHRoZXJlZm9yZSwgZG9pbmcgdGhpcyBhcyByZWN1cnNpb25cbiAgdmFyIFMgPSBzb3VyY2VIaXN0b3J5WzBdO1xuICB2YXIgc291cmNlUmVzdCA9IHNvdXJjZUhpc3Rvcnkuc2xpY2UoMSk7XG4gIHZhciBUID0gdGFyZ2V0SGlzdG9yeVswXTtcbiAgdmFyIHRhcmdldFJlc3QgPSB0YXJnZXRIaXN0b3J5LnNsaWNlKDEpO1xuXG4gIGlmICghUyB8fCB0YXJnZXRIaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X3NlcTogTE9XRVNUX1NFUSxcbiAgICAgIGhpc3Rvcnk6IFtdXG4gICAgfTtcbiAgfVxuXG4gIHZhciBzb3VyY2VJZCA9IFMuc2Vzc2lvbl9pZDtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChoYXNTZXNzaW9uSWQoc291cmNlSWQsIHRhcmdldEhpc3RvcnkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3Rfc2VxOiBTLmxhc3Rfc2VxLFxuICAgICAgaGlzdG9yeTogc291cmNlSGlzdG9yeVxuICAgIH07XG4gIH1cblxuICB2YXIgdGFyZ2V0SWQgPSBULnNlc3Npb25faWQ7XG4gIGlmIChoYXNTZXNzaW9uSWQodGFyZ2V0SWQsIHNvdXJjZVJlc3QpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhc3Rfc2VxOiBULmxhc3Rfc2VxLFxuICAgICAgaGlzdG9yeTogdGFyZ2V0UmVzdFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY29tcGFyZVJlcGxpY2F0aW9uSGlzdG9yeShzb3VyY2VSZXN0LCB0YXJnZXRSZXN0KTtcbn1cblxuZnVuY3Rpb24gaGFzU2Vzc2lvbklkKHNlc3Npb25JZCwgaGlzdG9yeSkge1xuICB2YXIgcHJvcHMgPSBoaXN0b3J5WzBdO1xuICB2YXIgcmVzdCA9IGhpc3Rvcnkuc2xpY2UoMSk7XG5cbiAgaWYgKCFzZXNzaW9uSWQgfHwgaGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc2Vzc2lvbklkID09PSBwcm9wcy5zZXNzaW9uX2lkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gaGFzU2Vzc2lvbklkKHNlc3Npb25JZCwgcmVzdCk7XG59XG5cbmZ1bmN0aW9uIGlzRm9yYmlkZGVuRXJyb3IoZXJyKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyLnN0YXR1cyA9PT0gJ251bWJlcicgJiYgTWF0aC5mbG9vcihlcnIuc3RhdHVzIC8gMTAwKSA9PT0gNDtcbn1cblxudmFyIFNUQVJUSU5HX0JBQ0tfT0ZGID0gMDtcblxuZnVuY3Rpb24gYmFja09mZihvcHRzLCByZXR1cm5WYWx1ZSwgZXJyb3IsIGNhbGxiYWNrKSB7XG4gIGlmIChvcHRzLnJldHJ5ID09PSBmYWxzZSkge1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIHJldHVyblZhbHVlLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHJldHVybjtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBvcHRzLmJhY2tfb2ZmX2Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgb3B0cy5iYWNrX29mZl9mdW5jdGlvbiA9IGRlZmF1bHRCYWNrT2ZmO1xuICB9XG4gIHJldHVyblZhbHVlLmVtaXQoJ3JlcXVlc3RFcnJvcicsIGVycm9yKTtcbiAgaWYgKHJldHVyblZhbHVlLnN0YXRlID09PSAnYWN0aXZlJyB8fCByZXR1cm5WYWx1ZS5zdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgcmV0dXJuVmFsdWUuZW1pdCgncGF1c2VkJywgZXJyb3IpO1xuICAgIHJldHVyblZhbHVlLnN0YXRlID0gJ3N0b3BwZWQnO1xuICAgIHZhciBiYWNrT2ZmU2V0ID0gZnVuY3Rpb24gYmFja29mZlRpbWVTZXQoKSB7XG4gICAgICBvcHRzLmN1cnJlbnRfYmFja19vZmYgPSBTVEFSVElOR19CQUNLX09GRjtcbiAgICB9O1xuICAgIHZhciByZW1vdmVCYWNrT2ZmU2V0dGVyID0gZnVuY3Rpb24gcmVtb3ZlQmFja09mZlRpbWVTZXQoKSB7XG4gICAgICByZXR1cm5WYWx1ZS5yZW1vdmVMaXN0ZW5lcignYWN0aXZlJywgYmFja09mZlNldCk7XG4gICAgfTtcbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdwYXVzZWQnLCByZW1vdmVCYWNrT2ZmU2V0dGVyKTtcbiAgICByZXR1cm5WYWx1ZS5vbmNlKCdhY3RpdmUnLCBiYWNrT2ZmU2V0KTtcbiAgfVxuXG4gIG9wdHMuY3VycmVudF9iYWNrX29mZiA9IG9wdHMuY3VycmVudF9iYWNrX29mZiB8fCBTVEFSVElOR19CQUNLX09GRjtcbiAgb3B0cy5jdXJyZW50X2JhY2tfb2ZmID0gb3B0cy5iYWNrX29mZl9mdW5jdGlvbihvcHRzLmN1cnJlbnRfYmFja19vZmYpO1xuICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBvcHRzLmN1cnJlbnRfYmFja19vZmYpO1xufVxuXG5mdW5jdGlvbiBzb3J0T2JqZWN0UHJvcGVydGllc0J5S2V5KHF1ZXJ5UGFyYW1zKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykuc29ydChjb2xsYXRlKS5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwga2V5KSB7XG4gICAgcmVzdWx0W2tleV0gPSBxdWVyeVBhcmFtc1trZXldO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcbn1cblxuLy8gR2VuZXJhdGUgYSB1bmlxdWUgaWQgcGFydGljdWxhciB0byB0aGlzIHJlcGxpY2F0aW9uLlxuLy8gTm90IGd1YXJhbnRlZWQgdG8gYWxpZ24gcGVyZmVjdGx5IHdpdGggQ291Y2hEQidzIHJlcCBpZHMuXG5mdW5jdGlvbiBnZW5lcmF0ZVJlcGxpY2F0aW9uSWQoc3JjLCB0YXJnZXQsIG9wdHMpIHtcbiAgdmFyIGRvY0lkcyA9IG9wdHMuZG9jX2lkcyA/IG9wdHMuZG9jX2lkcy5zb3J0KGNvbGxhdGUpIDogJyc7XG4gIHZhciBmaWx0ZXJGdW4gPSBvcHRzLmZpbHRlciA/IG9wdHMuZmlsdGVyLnRvU3RyaW5nKCkgOiAnJztcbiAgdmFyIHF1ZXJ5UGFyYW1zID0gJyc7XG4gIHZhciBmaWx0ZXJWaWV3TmFtZSA9ICAnJztcbiAgdmFyIHNlbGVjdG9yID0gJyc7XG5cbiAgLy8gcG9zc2liaWxpdHkgZm9yIGNoZWNrcG9pbnRzIHRvIGJlIGxvc3QgaGVyZSBhcyBiZWhhdmlvdXIgb2ZcbiAgLy8gSlNPTi5zdHJpbmdpZnkgaXMgbm90IHN0YWJsZSAoc2VlICM2MjI2KVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKG9wdHMuc2VsZWN0b3IpIHtcbiAgICBzZWxlY3RvciA9IEpTT04uc3RyaW5naWZ5KG9wdHMuc2VsZWN0b3IpO1xuICB9XG5cbiAgaWYgKG9wdHMuZmlsdGVyICYmIG9wdHMucXVlcnlfcGFyYW1zKSB7XG4gICAgcXVlcnlQYXJhbXMgPSBKU09OLnN0cmluZ2lmeShzb3J0T2JqZWN0UHJvcGVydGllc0J5S2V5KG9wdHMucXVlcnlfcGFyYW1zKSk7XG4gIH1cblxuICBpZiAob3B0cy5maWx0ZXIgJiYgb3B0cy5maWx0ZXIgPT09ICdfdmlldycpIHtcbiAgICBmaWx0ZXJWaWV3TmFtZSA9IG9wdHMudmlldy50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtzcmMuaWQoKSwgdGFyZ2V0LmlkKCldKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICB2YXIgcXVlcnlEYXRhID0gcmVzWzBdICsgcmVzWzFdICsgZmlsdGVyRnVuICsgZmlsdGVyVmlld05hbWUgK1xuICAgICAgcXVlcnlQYXJhbXMgKyBkb2NJZHMgKyBzZWxlY3RvcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIGJpbmFyeU1kNShxdWVyeURhdGEsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9KS50aGVuKGZ1bmN0aW9uIChtZDVzdW0pIHtcbiAgICAvLyBjYW4ndCB1c2Ugc3RyYWlnaHQtdXAgbWQ1IGFscGhhYmV0LCBiZWNhdXNlXG4gICAgLy8gdGhlIGNoYXIgJy8nIGlzIGludGVycHJldGVkIGFzIGJlaW5nIGZvciBhdHRhY2htZW50cyxcbiAgICAvLyBhbmQgKyBpcyBhbHNvIG5vdCB1cmwtc2FmZVxuICAgIG1kNXN1bSA9IG1kNXN1bS5yZXBsYWNlKC9cXC8vZywgJy4nKS5yZXBsYWNlKC9cXCsvZywgJ18nKTtcbiAgICByZXR1cm4gJ19sb2NhbC8nICsgbWQ1c3VtO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVwbGljYXRlKHNyYywgdGFyZ2V0LCBvcHRzLCByZXR1cm5WYWx1ZSwgcmVzdWx0KSB7XG4gIHZhciBiYXRjaGVzID0gW107ICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBiYXRjaGVzIHRvIGJlIHByb2Nlc3NlZFxuICB2YXIgY3VycmVudEJhdGNoOyAgICAgICAgICAgICAgIC8vIHRoZSBiYXRjaCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkXG4gIHZhciBwZW5kaW5nQmF0Y2ggPSB7XG4gICAgc2VxOiAwLFxuICAgIGNoYW5nZXM6IFtdLFxuICAgIGRvY3M6IFtdXG4gIH07IC8vIG5leHQgYmF0Y2gsIG5vdCB5ZXQgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkXG4gIHZhciB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlOyAgLy8gdHJ1ZSB3aGlsZSBjaGVja3BvaW50IGlzIGJlaW5nIHdyaXR0ZW5cbiAgdmFyIGNoYW5nZXNDb21wbGV0ZWQgPSBmYWxzZTsgICAvLyB0cnVlIHdoZW4gYWxsIGNoYW5nZXMgcmVjZWl2ZWRcbiAgdmFyIHJlcGxpY2F0aW9uQ29tcGxldGVkID0gZmFsc2U7IC8vIHRydWUgd2hlbiByZXBsaWNhdGlvbiBoYXMgY29tcGxldGVkXG4gIHZhciBsYXN0X3NlcSA9IDA7XG4gIHZhciBjb250aW51b3VzID0gb3B0cy5jb250aW51b3VzIHx8IG9wdHMubGl2ZSB8fCBmYWxzZTtcbiAgdmFyIGJhdGNoX3NpemUgPSBvcHRzLmJhdGNoX3NpemUgfHwgMTAwO1xuICB2YXIgYmF0Y2hlc19saW1pdCA9IG9wdHMuYmF0Y2hlc19saW1pdCB8fCAxMDtcbiAgdmFyIHN0eWxlID0gb3B0cy5zdHlsZSB8fCAnYWxsX2RvY3MnO1xuICB2YXIgY2hhbmdlc1BlbmRpbmcgPSBmYWxzZTsgICAgIC8vIHRydWUgd2hpbGUgc3JjLmNoYW5nZXMgaXMgcnVubmluZ1xuICB2YXIgZG9jX2lkcyA9IG9wdHMuZG9jX2lkcztcbiAgdmFyIHNlbGVjdG9yID0gb3B0cy5zZWxlY3RvcjtcbiAgdmFyIHJlcElkO1xuICB2YXIgY2hlY2twb2ludGVyO1xuICB2YXIgY2hhbmdlZERvY3MgPSBbXTtcbiAgLy8gTGlrZSBjb3VjaGRiLCBldmVyeSByZXBsaWNhdGlvbiBnZXRzIGEgdW5pcXVlIHNlc3Npb24gaWRcbiAgdmFyIHNlc3Npb24gPSB1dWlkKCk7XG5cbiAgcmVzdWx0ID0gcmVzdWx0IHx8IHtcbiAgICBvazogdHJ1ZSxcbiAgICBzdGFydF90aW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgZG9jc19yZWFkOiAwLFxuICAgIGRvY3Nfd3JpdHRlbjogMCxcbiAgICBkb2Nfd3JpdGVfZmFpbHVyZXM6IDAsXG4gICAgZXJyb3JzOiBbXVxuICB9O1xuXG4gIHZhciBjaGFuZ2VzT3B0cyA9IHt9O1xuICByZXR1cm5WYWx1ZS5yZWFkeShzcmMsIHRhcmdldCk7XG5cbiAgZnVuY3Rpb24gaW5pdENoZWNrcG9pbnRlcigpIHtcbiAgICBpZiAoY2hlY2twb2ludGVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiBnZW5lcmF0ZVJlcGxpY2F0aW9uSWQoc3JjLCB0YXJnZXQsIG9wdHMpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgcmVwSWQgPSByZXM7XG5cbiAgICAgIHZhciBjaGVja3BvaW50T3B0cyA9IHt9O1xuICAgICAgaWYgKG9wdHMuY2hlY2twb2ludCA9PT0gZmFsc2UpIHtcbiAgICAgICAgY2hlY2twb2ludE9wdHMgPSB7IHdyaXRlU291cmNlQ2hlY2twb2ludDogZmFsc2UsIHdyaXRlVGFyZ2V0Q2hlY2twb2ludDogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSBpZiAob3B0cy5jaGVja3BvaW50ID09PSAnc291cmNlJykge1xuICAgICAgICBjaGVja3BvaW50T3B0cyA9IHsgd3JpdGVTb3VyY2VDaGVja3BvaW50OiB0cnVlLCB3cml0ZVRhcmdldENoZWNrcG9pbnQ6IGZhbHNlIH07XG4gICAgICB9IGVsc2UgaWYgKG9wdHMuY2hlY2twb2ludCA9PT0gJ3RhcmdldCcpIHtcbiAgICAgICAgY2hlY2twb2ludE9wdHMgPSB7IHdyaXRlU291cmNlQ2hlY2twb2ludDogZmFsc2UsIHdyaXRlVGFyZ2V0Q2hlY2twb2ludDogdHJ1ZSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2twb2ludE9wdHMgPSB7IHdyaXRlU291cmNlQ2hlY2twb2ludDogdHJ1ZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIGNoZWNrcG9pbnRlciA9IG5ldyBDaGVja3BvaW50ZXIoc3JjLCB0YXJnZXQsIHJlcElkLCByZXR1cm5WYWx1ZSwgY2hlY2twb2ludE9wdHMpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVEb2NzKCkge1xuICAgIGNoYW5nZWREb2NzID0gW107XG5cbiAgICBpZiAoY3VycmVudEJhdGNoLmRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBkb2NzID0gY3VycmVudEJhdGNoLmRvY3M7XG4gICAgdmFyIGJ1bGtPcHRzID0ge3RpbWVvdXQ6IG9wdHMudGltZW91dH07XG4gICAgcmV0dXJuIHRhcmdldC5idWxrRG9jcyh7ZG9jczogZG9jcywgbmV3X2VkaXRzOiBmYWxzZX0sIGJ1bGtPcHRzKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGByZXNgIGRvZXNuJ3QgaW5jbHVkZSBmdWxsIGRvY3VtZW50cyAod2hpY2ggbGl2ZSBpbiBgZG9jc2ApLCBzbyB3ZSBjcmVhdGUgYSBtYXAgb2ZcbiAgICAgIC8vIChpZCAtPiBlcnJvciksIGFuZCBjaGVjayBmb3IgZXJyb3JzIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGBkb2NzYFxuICAgICAgdmFyIGVycm9yc0J5SWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgcmVzLmZvckVhY2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBpZiAocmVzLmVycm9yKSB7XG4gICAgICAgICAgZXJyb3JzQnlJZFtyZXMuaWRdID0gcmVzO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIGVycm9yc05vID0gT2JqZWN0LmtleXMoZXJyb3JzQnlJZCkubGVuZ3RoO1xuICAgICAgcmVzdWx0LmRvY193cml0ZV9mYWlsdXJlcyArPSBlcnJvcnNObztcbiAgICAgIHJlc3VsdC5kb2NzX3dyaXR0ZW4gKz0gZG9jcy5sZW5ndGggLSBlcnJvcnNObztcblxuICAgICAgZG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgdmFyIGVycm9yID0gZXJyb3JzQnlJZFtkb2MuX2lkXTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAvLyBOb3JtYWxpemUgZXJyb3IgbmFtZS4gaS5lLiAnVW5hdXRob3JpemVkJyAtPiAndW5hdXRob3JpemVkJyAoZWcgU3luYyBHYXRld2F5KVxuICAgICAgICAgIHZhciBlcnJvck5hbWUgPSAoZXJyb3IubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBpZiAoZXJyb3JOYW1lID09PSAndW5hdXRob3JpemVkJyB8fCBlcnJvck5hbWUgPT09ICdmb3JiaWRkZW4nKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdkZW5pZWQnLCBjbG9uZShlcnJvcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlZERvY3MucHVzaChkb2MpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJlc3VsdC5kb2Nfd3JpdGVfZmFpbHVyZXMgKz0gZG9jcy5sZW5ndGg7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2hCYXRjaCgpIHtcbiAgICBpZiAoY3VycmVudEJhdGNoLmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhIHByb2JsZW0gZ2V0dGluZyBkb2NzLicpO1xuICAgIH1cbiAgICByZXN1bHQubGFzdF9zZXEgPSBsYXN0X3NlcSA9IGN1cnJlbnRCYXRjaC5zZXE7XG4gICAgdmFyIG91dFJlc3VsdCA9IGNsb25lKHJlc3VsdCk7XG4gICAgaWYgKGNoYW5nZWREb2NzLmxlbmd0aCkge1xuICAgICAgb3V0UmVzdWx0LmRvY3MgPSBjaGFuZ2VkRG9jcztcbiAgICAgIC8vIEF0dGFjaCAncGVuZGluZycgcHJvcGVydHkgaWYgc2VydmVyIHN1cHBvcnRzIGl0IChDb3VjaERCIDIuMCspXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICh0eXBlb2YgY3VycmVudEJhdGNoLnBlbmRpbmcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG91dFJlc3VsdC5wZW5kaW5nID0gY3VycmVudEJhdGNoLnBlbmRpbmc7XG4gICAgICAgIGRlbGV0ZSBjdXJyZW50QmF0Y2gucGVuZGluZztcbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoYW5nZScsIG91dFJlc3VsdCk7XG4gICAgfVxuICAgIHdyaXRpbmdDaGVja3BvaW50ID0gdHJ1ZTtcbiAgICByZXR1cm4gY2hlY2twb2ludGVyLndyaXRlQ2hlY2twb2ludChjdXJyZW50QmF0Y2guc2VxLFxuICAgICAgICBzZXNzaW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdjaGVja3BvaW50JzogY3VycmVudEJhdGNoLnNlcSB9KTtcbiAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgY3VycmVudEJhdGNoID0gdW5kZWZpbmVkO1xuICAgICAgZ2V0Q2hhbmdlcygpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIG9uQ2hlY2twb2ludEVycm9yKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaWZmcygpIHtcbiAgICB2YXIgZGlmZiA9IHt9O1xuICAgIGN1cnJlbnRCYXRjaC5jaGFuZ2VzLmZvckVhY2goZnVuY3Rpb24gKGNoYW5nZSkge1xuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hlY2twb2ludCcsIHsgJ3JldnNfZGlmZic6IGNoYW5nZSB9KTtcbiAgICAgIC8vIENvdWNoYmFzZSBTeW5jIEdhdGV3YXkgZW1pdHMgdGhlc2UsIGJ1dCB3ZSBjYW4gaWdub3JlIHRoZW1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGNoYW5nZS5pZCA9PT0gXCJfdXNlci9cIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaWZmW2NoYW5nZS5pZF0gPSBjaGFuZ2UuY2hhbmdlcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHgucmV2O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldC5yZXZzRGlmZihkaWZmKS50aGVuKGZ1bmN0aW9uIChkaWZmcykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGN1cnJlbnRCYXRjaC5kaWZmcyBlbGVtZW50cyBhcmUgZGVsZXRlZCBhcyB0aGUgZG9jdW1lbnRzIGFyZSB3cml0dGVuXG4gICAgICBjdXJyZW50QmF0Y2guZGlmZnMgPSBkaWZmcztcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJhdGNoRG9jcygpIHtcbiAgICByZXR1cm4gZ2V0RG9jcyhzcmMsIHRhcmdldCwgY3VycmVudEJhdGNoLmRpZmZzLCByZXR1cm5WYWx1ZSkudGhlbihmdW5jdGlvbiAoZ290KSB7XG4gICAgICBjdXJyZW50QmF0Y2guZXJyb3IgPSAhZ290Lm9rO1xuICAgICAgZ290LmRvY3MuZm9yRWFjaChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIGRlbGV0ZSBjdXJyZW50QmF0Y2guZGlmZnNbZG9jLl9pZF07XG4gICAgICAgIHJlc3VsdC5kb2NzX3JlYWQrKztcbiAgICAgICAgY3VycmVudEJhdGNoLmRvY3MucHVzaChkb2MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydE5leHRCYXRjaCgpIHtcbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkIHx8IGN1cnJlbnRCYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYmF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHByb2Nlc3NQZW5kaW5nQmF0Y2godHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRCYXRjaCA9IGJhdGNoZXMuc2hpZnQoKTtcbiAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGVja3BvaW50JywgeyAnc3RhcnRfbmV4dF9iYXRjaCc6IGN1cnJlbnRCYXRjaC5zZXEgfSk7XG4gICAgZ2V0RGlmZnMoKVxuICAgICAgLnRoZW4oZ2V0QmF0Y2hEb2NzKVxuICAgICAgLnRoZW4od3JpdGVEb2NzKVxuICAgICAgLnRoZW4oZmluaXNoQmF0Y2gpXG4gICAgICAudGhlbihzdGFydE5leHRCYXRjaClcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGFib3J0UmVwbGljYXRpb24oJ2JhdGNoIHByb2Nlc3NpbmcgdGVybWluYXRlZCB3aXRoIGVycm9yJywgZXJyKTtcbiAgICAgIH0pO1xuICB9XG5cblxuICBmdW5jdGlvbiBwcm9jZXNzUGVuZGluZ0JhdGNoKGltbWVkaWF0ZSQkMSkge1xuICAgIGlmIChwZW5kaW5nQmF0Y2guY2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChiYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiAhY3VycmVudEJhdGNoKSB7XG4gICAgICAgIGlmICgoY29udGludW91cyAmJiBjaGFuZ2VzT3B0cy5saXZlKSB8fCBjaGFuZ2VzQ29tcGxldGVkKSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWUuc3RhdGUgPSAncGVuZGluZyc7XG4gICAgICAgICAgcmV0dXJuVmFsdWUuZW1pdCgncGF1c2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgaW1tZWRpYXRlJCQxIHx8XG4gICAgICBjaGFuZ2VzQ29tcGxldGVkIHx8XG4gICAgICBwZW5kaW5nQmF0Y2guY2hhbmdlcy5sZW5ndGggPj0gYmF0Y2hfc2l6ZVxuICAgICkge1xuICAgICAgYmF0Y2hlcy5wdXNoKHBlbmRpbmdCYXRjaCk7XG4gICAgICBwZW5kaW5nQmF0Y2ggPSB7XG4gICAgICAgIHNlcTogMCxcbiAgICAgICAgY2hhbmdlczogW10sXG4gICAgICAgIGRvY3M6IFtdXG4gICAgICB9O1xuICAgICAgaWYgKHJldHVyblZhbHVlLnN0YXRlID09PSAncGVuZGluZycgfHwgcmV0dXJuVmFsdWUuc3RhdGUgPT09ICdzdG9wcGVkJykge1xuICAgICAgICByZXR1cm5WYWx1ZS5zdGF0ZSA9ICdhY3RpdmUnO1xuICAgICAgICByZXR1cm5WYWx1ZS5lbWl0KCdhY3RpdmUnKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0TmV4dEJhdGNoKCk7XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBhYm9ydFJlcGxpY2F0aW9uKHJlYXNvbiwgZXJyKSB7XG4gICAgaWYgKHJlcGxpY2F0aW9uQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZXJyLm1lc3NhZ2UpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gcmVhc29uO1xuICAgIH1cbiAgICByZXN1bHQub2sgPSBmYWxzZTtcbiAgICByZXN1bHQuc3RhdHVzID0gJ2Fib3J0aW5nJztcbiAgICBiYXRjaGVzID0gW107XG4gICAgcGVuZGluZ0JhdGNoID0ge1xuICAgICAgc2VxOiAwLFxuICAgICAgY2hhbmdlczogW10sXG4gICAgICBkb2NzOiBbXVxuICAgIH07XG4gICAgY29tcGxldGVSZXBsaWNhdGlvbihlcnIpO1xuICB9XG5cblxuICBmdW5jdGlvbiBjb21wbGV0ZVJlcGxpY2F0aW9uKGZhdGFsRXJyb3IpIHtcbiAgICBpZiAocmVwbGljYXRpb25Db21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgcmVzdWx0LnN0YXR1cyA9ICdjYW5jZWxsZWQnO1xuICAgICAgaWYgKHdyaXRpbmdDaGVja3BvaW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnN0YXR1cyA9IHJlc3VsdC5zdGF0dXMgfHwgJ2NvbXBsZXRlJztcbiAgICByZXN1bHQuZW5kX3RpbWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgcmVzdWx0Lmxhc3Rfc2VxID0gbGFzdF9zZXE7XG4gICAgcmVwbGljYXRpb25Db21wbGV0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKGZhdGFsRXJyb3IpIHtcbiAgICAgIC8vIG5lZWQgdG8gZXh0ZW5kIHRoZSBlcnJvciBiZWNhdXNlIEZpcmVmb3ggY29uc2lkZXJzIFwiLnJlc3VsdFwiIHJlYWQtb25seVxuICAgICAgZmF0YWxFcnJvciA9IGNyZWF0ZUVycm9yKGZhdGFsRXJyb3IpO1xuICAgICAgZmF0YWxFcnJvci5yZXN1bHQgPSByZXN1bHQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSBlcnJvciBuYW1lLiBpLmUuICdVbmF1dGhvcml6ZWQnIC0+ICd1bmF1dGhvcml6ZWQnIChlZyBTeW5jIEdhdGV3YXkpXG4gICAgICB2YXIgZXJyb3JOYW1lID0gKGZhdGFsRXJyb3IubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChlcnJvck5hbWUgPT09ICd1bmF1dGhvcml6ZWQnIHx8IGVycm9yTmFtZSA9PT0gJ2ZvcmJpZGRlbicpIHtcbiAgICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnZXJyb3InLCBmYXRhbEVycm9yKTtcbiAgICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYWNrT2ZmKG9wdHMsIHJldHVyblZhbHVlLCBmYXRhbEVycm9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVwbGljYXRlKHNyYywgdGFyZ2V0LCBvcHRzLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5WYWx1ZS5lbWl0KCdjb21wbGV0ZScsIHJlc3VsdCk7XG4gICAgICByZXR1cm5WYWx1ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlKGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgfVxuICAgIC8vIEF0dGFjaCAncGVuZGluZycgcHJvcGVydHkgaWYgc2VydmVyIHN1cHBvcnRzIGl0IChDb3VjaERCIDIuMCspXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nID09PSAnbnVtYmVyJykge1xuICAgICAgcGVuZGluZ0JhdGNoLnBlbmRpbmcgPSBwZW5kaW5nO1xuICAgIH1cblxuICAgIHZhciBmaWx0ZXIgPSBmaWx0ZXJDaGFuZ2Uob3B0cykoY2hhbmdlKTtcbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwZW5kaW5nQmF0Y2guc2VxID0gY2hhbmdlLnNlcSB8fCBsYXN0U2VxO1xuICAgIHBlbmRpbmdCYXRjaC5jaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGVja3BvaW50JywgeyAncGVuZGluZ19iYXRjaCc6IHBlbmRpbmdCYXRjaC5zZXEgfSk7XG4gICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3NQZW5kaW5nQmF0Y2goYmF0Y2hlcy5sZW5ndGggPT09IDAgJiYgY2hhbmdlc09wdHMubGl2ZSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlc0NvbXBsZXRlKGNoYW5nZXMpIHtcbiAgICBjaGFuZ2VzUGVuZGluZyA9IGZhbHNlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgbm8gcmVzdWx0cyB3ZXJlIHJldHVybmVkIHRoZW4gd2UncmUgZG9uZSxcbiAgICAvLyBlbHNlIGZldGNoIG1vcmVcbiAgICBpZiAoY2hhbmdlcy5yZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZXNPcHRzLnNpbmNlID0gY2hhbmdlcy5yZXN1bHRzW2NoYW5nZXMucmVzdWx0cy5sZW5ndGggLSAxXS5zZXE7XG4gICAgICBnZXRDaGFuZ2VzKCk7XG4gICAgICBwcm9jZXNzUGVuZGluZ0JhdGNoKHRydWUpO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvbnRpbnVvdXMpIHtcbiAgICAgICAgICBjaGFuZ2VzT3B0cy5saXZlID0gdHJ1ZTtcbiAgICAgICAgICBnZXRDaGFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaCh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgY2hlY2twb2ludCBzbyB3ZSBzdGFydCBmcm9tIHRoZSByaWdodCBzZXEgbmV4dCB0aW1lXG4gICAgICBpZiAoIWN1cnJlbnRCYXRjaCAmJiBjaGFuZ2VzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gdHJ1ZTtcbiAgICAgICAgY2hlY2twb2ludGVyLndyaXRlQ2hlY2twb2ludChjaGFuZ2VzLmxhc3Rfc2VxLFxuICAgICAgICAgICAgc2Vzc2lvbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgICAgICByZXN1bHQubGFzdF9zZXEgPSBsYXN0X3NlcSA9IGNoYW5nZXMubGFzdF9zZXE7XG4gICAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKG9uQ2hlY2twb2ludEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBvbkNoYW5nZXNFcnJvcihlcnIpIHtcbiAgICBjaGFuZ2VzUGVuZGluZyA9IGZhbHNlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgfVxuICAgIGFib3J0UmVwbGljYXRpb24oJ2NoYW5nZXMgcmVqZWN0ZWQnLCBlcnIpO1xuICB9XG5cblxuICBmdW5jdGlvbiBnZXRDaGFuZ2VzKCkge1xuICAgIGlmICghKFxuICAgICAgIWNoYW5nZXNQZW5kaW5nICYmXG4gICAgICAhY2hhbmdlc0NvbXBsZXRlZCAmJlxuICAgICAgYmF0Y2hlcy5sZW5ndGggPCBiYXRjaGVzX2xpbWl0XG4gICAgICApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNoYW5nZXNQZW5kaW5nID0gdHJ1ZTtcbiAgICBmdW5jdGlvbiBhYm9ydENoYW5nZXMoKSB7XG4gICAgICBjaGFuZ2VzLmNhbmNlbCgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcigpIHtcbiAgICAgIHJldHVyblZhbHVlLnJlbW92ZUxpc3RlbmVyKCdjYW5jZWwnLCBhYm9ydENoYW5nZXMpO1xuICAgIH1cblxuICAgIGlmIChyZXR1cm5WYWx1ZS5fY2hhbmdlcykgeyAvLyByZW1vdmUgb2xkIGNoYW5nZXMoKSBhbmQgbGlzdGVuZXJzXG4gICAgICByZXR1cm5WYWx1ZS5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgcmV0dXJuVmFsdWUuX2Fib3J0Q2hhbmdlcyk7XG4gICAgICByZXR1cm5WYWx1ZS5fY2hhbmdlcy5jYW5jZWwoKTtcbiAgICB9XG4gICAgcmV0dXJuVmFsdWUub25jZSgnY2FuY2VsJywgYWJvcnRDaGFuZ2VzKTtcblxuICAgIHZhciBjaGFuZ2VzID0gc3JjLmNoYW5nZXMoY2hhbmdlc09wdHMpXG4gICAgICAub24oJ2NoYW5nZScsIG9uQ2hhbmdlKTtcbiAgICBjaGFuZ2VzLnRoZW4ocmVtb3ZlTGlzdGVuZXIsIHJlbW92ZUxpc3RlbmVyKTtcbiAgICBjaGFuZ2VzLnRoZW4ob25DaGFuZ2VzQ29tcGxldGUpXG4gICAgICAuY2F0Y2gob25DaGFuZ2VzRXJyb3IpO1xuXG4gICAgaWYgKG9wdHMucmV0cnkpIHtcbiAgICAgIC8vIHNhdmUgZm9yIGxhdGVyIHNvIHdlIGNhbiBjYW5jZWwgaWYgbmVjZXNzYXJ5XG4gICAgICByZXR1cm5WYWx1ZS5fY2hhbmdlcyA9IGNoYW5nZXM7XG4gICAgICByZXR1cm5WYWx1ZS5fYWJvcnRDaGFuZ2VzID0gYWJvcnRDaGFuZ2VzO1xuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gc3RhcnRDaGFuZ2VzKCkge1xuICAgIGluaXRDaGVja3BvaW50ZXIoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVja3BvaW50ZXIuZ2V0Q2hlY2twb2ludCgpLnRoZW4oZnVuY3Rpb24gKGNoZWNrcG9pbnQpIHtcbiAgICAgICAgbGFzdF9zZXEgPSBjaGVja3BvaW50O1xuICAgICAgICBjaGFuZ2VzT3B0cyA9IHtcbiAgICAgICAgICBzaW5jZTogbGFzdF9zZXEsXG4gICAgICAgICAgbGltaXQ6IGJhdGNoX3NpemUsXG4gICAgICAgICAgYmF0Y2hfc2l6ZTogYmF0Y2hfc2l6ZSxcbiAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgZG9jX2lkczogZG9jX2lkcyxcbiAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgcmV0dXJuX2RvY3M6IHRydWUgLy8gcmVxdWlyZWQgc28gd2Uga25vdyB3aGVuIHdlJ3JlIGRvbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdHMuZmlsdGVyKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmZpbHRlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIHJlcXVpcmVkIGZvciB0aGUgY2xpZW50LXNpZGUgZmlsdGVyIGluIG9uQ2hhbmdlXG4gICAgICAgICAgICBjaGFuZ2VzT3B0cy5pbmNsdWRlX2RvY3MgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIGRkb2MgZmlsdGVyXG4gICAgICAgICAgICBjaGFuZ2VzT3B0cy5maWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdoZWFydGJlYXQnIGluIG9wdHMpIHtcbiAgICAgICAgICBjaGFuZ2VzT3B0cy5oZWFydGJlYXQgPSBvcHRzLmhlYXJ0YmVhdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3RpbWVvdXQnIGluIG9wdHMpIHtcbiAgICAgICAgICBjaGFuZ2VzT3B0cy50aW1lb3V0ID0gb3B0cy50aW1lb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnF1ZXJ5X3BhcmFtcykge1xuICAgICAgICAgIGNoYW5nZXNPcHRzLnF1ZXJ5X3BhcmFtcyA9IG9wdHMucXVlcnlfcGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnZpZXcpIHtcbiAgICAgICAgICBjaGFuZ2VzT3B0cy52aWV3ID0gb3B0cy52aWV3O1xuICAgICAgICB9XG4gICAgICAgIGdldENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGFib3J0UmVwbGljYXRpb24oJ2dldENoZWNrcG9pbnQgcmVqZWN0ZWQgd2l0aCAnLCBlcnIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZnVuY3Rpb24gb25DaGVja3BvaW50RXJyb3IoZXJyKSB7XG4gICAgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICBhYm9ydFJlcGxpY2F0aW9uKCd3cml0ZUNoZWNrcG9pbnQgY29tcGxldGVkIHdpdGggZXJyb3InLCBlcnIpO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHsgLy8gY2FuY2VsbGVkIGltbWVkaWF0ZWx5XG4gICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghcmV0dXJuVmFsdWUuX2FkZGVkTGlzdGVuZXJzKSB7XG4gICAgcmV0dXJuVmFsdWUub25jZSgnY2FuY2VsJywgY29tcGxldGVSZXBsaWNhdGlvbik7XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVyblZhbHVlLm9uY2UoJ2Vycm9yJywgb3B0cy5jb21wbGV0ZSk7XG4gICAgICByZXR1cm5WYWx1ZS5vbmNlKCdjb21wbGV0ZScsIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgb3B0cy5jb21wbGV0ZShudWxsLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVyblZhbHVlLl9hZGRlZExpc3RlbmVycyA9IHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMuc2luY2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3RhcnRDaGFuZ2VzKCk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdENoZWNrcG9pbnRlcigpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGNoZWNrcG9pbnRlci53cml0ZUNoZWNrcG9pbnQob3B0cy5zaW5jZSwgc2Vzc2lvbik7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGFzdF9zZXEgPSBvcHRzLnNpbmNlO1xuICAgICAgc3RhcnRDaGFuZ2VzKCk7XG4gICAgfSkuY2F0Y2gob25DaGVja3BvaW50RXJyb3IpO1xuICB9XG59XG5cbi8vIFdlIGNyZWF0ZSBhIGJhc2ljIHByb21pc2Ugc28gdGhlIGNhbGxlciBjYW4gY2FuY2VsIHRoZSByZXBsaWNhdGlvbiBwb3NzaWJseVxuLy8gYmVmb3JlIHdlIGhhdmUgYWN0dWFsbHkgc3RhcnRlZCBsaXN0ZW5pbmcgdG8gY2hhbmdlcyBldGNcbmluaGVyaXRzKFJlcGxpY2F0aW9uLCBFRSk7XG5mdW5jdGlvbiBSZXBsaWNhdGlvbigpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbiAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcbiAgdGhpcy5zdGF0ZSA9ICdwZW5kaW5nJztcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChmdWxmaWxsLCByZWplY3QpIHtcbiAgICBzZWxmLm9uY2UoJ2NvbXBsZXRlJywgZnVsZmlsbCk7XG4gICAgc2VsZi5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xuICBzZWxmLnRoZW4gPSBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICB9O1xuICBzZWxmLmNhdGNoID0gZnVuY3Rpb24gKHJlamVjdCkge1xuICAgIHJldHVybiBwcm9taXNlLmNhdGNoKHJlamVjdCk7XG4gIH07XG4gIC8vIEFzIHdlIGFsbG93IGVycm9yIGhhbmRsaW5nIHZpYSBcImVycm9yXCIgZXZlbnQgYXMgd2VsbCxcbiAgLy8gcHV0IGEgc3R1YiBpbiBoZXJlIHNvIHRoYXQgcmVqZWN0aW5nIG5ldmVyIHRocm93cyBVbmhhbmRsZWRFcnJvci5cbiAgc2VsZi5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG59XG5cblJlcGxpY2F0aW9uLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgdGhpcy5zdGF0ZSA9ICdjYW5jZWxsZWQnO1xuICB0aGlzLmVtaXQoJ2NhbmNlbCcpO1xufTtcblxuUmVwbGljYXRpb24ucHJvdG90eXBlLnJlYWR5ID0gZnVuY3Rpb24gKHNyYywgdGFyZ2V0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHNlbGYuX3JlYWR5Q2FsbGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuX3JlYWR5Q2FsbGVkID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBvbkRlc3Ryb3koKSB7XG4gICAgc2VsZi5jYW5jZWwoKTtcbiAgfVxuICBzcmMub25jZSgnZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgdGFyZ2V0Lm9uY2UoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICAgIHRhcmdldC5yZW1vdmVMaXN0ZW5lcignZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgfVxuICBzZWxmLm9uY2UoJ2NvbXBsZXRlJywgY2xlYW51cCk7XG4gIHNlbGYub25jZSgnZXJyb3InLCBjbGVhbnVwKTtcbn07XG5cbmZ1bmN0aW9uIHRvUG91Y2goZGIsIG9wdHMpIHtcbiAgdmFyIFBvdWNoQ29uc3RydWN0b3IgPSBvcHRzLlBvdWNoQ29uc3RydWN0b3I7XG4gIGlmICh0eXBlb2YgZGIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBQb3VjaENvbnN0cnVjdG9yKGRiLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGljYXRlV3JhcHBlcihzcmMsIHRhcmdldCwgb3B0cywgY2FsbGJhY2spIHtcblxuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBpZiAob3B0cy5kb2NfaWRzICYmICFBcnJheS5pc0FycmF5KG9wdHMuZG9jX2lkcykpIHtcbiAgICB0aHJvdyBjcmVhdGVFcnJvcihCQURfUkVRVUVTVCxcbiAgICAgICAgICAgICAgICAgICAgICAgXCJgZG9jX2lkc2AgZmlsdGVyIHBhcmFtZXRlciBpcyBub3QgYSBsaXN0LlwiKTtcbiAgfVxuXG4gIG9wdHMuY29tcGxldGUgPSBjYWxsYmFjaztcbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuICBvcHRzLmNvbnRpbnVvdXMgPSBvcHRzLmNvbnRpbnVvdXMgfHwgb3B0cy5saXZlO1xuICBvcHRzLnJldHJ5ID0gKCdyZXRyeScgaW4gb3B0cykgPyBvcHRzLnJldHJ5IDogZmFsc2U7XG4gIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gIG9wdHMuUG91Y2hDb25zdHJ1Y3RvciA9IG9wdHMuUG91Y2hDb25zdHJ1Y3RvciB8fCB0aGlzO1xuICB2YXIgcmVwbGljYXRlUmV0ID0gbmV3IFJlcGxpY2F0aW9uKG9wdHMpO1xuICB2YXIgc3JjUG91Y2ggPSB0b1BvdWNoKHNyYywgb3B0cyk7XG4gIHZhciB0YXJnZXRQb3VjaCA9IHRvUG91Y2godGFyZ2V0LCBvcHRzKTtcbiAgcmVwbGljYXRlKHNyY1BvdWNoLCB0YXJnZXRQb3VjaCwgb3B0cywgcmVwbGljYXRlUmV0KTtcbiAgcmV0dXJuIHJlcGxpY2F0ZVJldDtcbn1cblxuaW5oZXJpdHMoU3luYywgRUUpO1xuZnVuY3Rpb24gc3luYyhzcmMsIHRhcmdldCwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgb3B0cy5Qb3VjaENvbnN0cnVjdG9yID0gb3B0cy5Qb3VjaENvbnN0cnVjdG9yIHx8IHRoaXM7XG4gIHNyYyA9IHRvUG91Y2goc3JjLCBvcHRzKTtcbiAgdGFyZ2V0ID0gdG9Qb3VjaCh0YXJnZXQsIG9wdHMpO1xuICByZXR1cm4gbmV3IFN5bmMoc3JjLCB0YXJnZXQsIG9wdHMsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gU3luYyhzcmMsIHRhcmdldCwgb3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmNhbmNlbGVkID0gZmFsc2U7XG5cbiAgdmFyIG9wdHNQdXNoID0gb3B0cy5wdXNoID8gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCBvcHRzLCBvcHRzLnB1c2gpIDogb3B0cztcbiAgdmFyIG9wdHNQdWxsID0gb3B0cy5wdWxsID8gJGluamVjdF9PYmplY3RfYXNzaWduKHt9LCBvcHRzLCBvcHRzLnB1bGwpIDogb3B0cztcblxuICB0aGlzLnB1c2ggPSByZXBsaWNhdGVXcmFwcGVyKHNyYywgdGFyZ2V0LCBvcHRzUHVzaCk7XG4gIHRoaXMucHVsbCA9IHJlcGxpY2F0ZVdyYXBwZXIodGFyZ2V0LCBzcmMsIG9wdHNQdWxsKTtcblxuICB0aGlzLnB1c2hQYXVzZWQgPSB0cnVlO1xuICB0aGlzLnB1bGxQYXVzZWQgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIHB1bGxDaGFuZ2UoY2hhbmdlKSB7XG4gICAgc2VsZi5lbWl0KCdjaGFuZ2UnLCB7XG4gICAgICBkaXJlY3Rpb246ICdwdWxsJyxcbiAgICAgIGNoYW5nZTogY2hhbmdlXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcHVzaENoYW5nZShjaGFuZ2UpIHtcbiAgICBzZWxmLmVtaXQoJ2NoYW5nZScsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1c2gnLFxuICAgICAgY2hhbmdlOiBjaGFuZ2VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdXNoRGVuaWVkKGRvYykge1xuICAgIHNlbGYuZW1pdCgnZGVuaWVkJywge1xuICAgICAgZGlyZWN0aW9uOiAncHVzaCcsXG4gICAgICBkb2M6IGRvY1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHB1bGxEZW5pZWQoZG9jKSB7XG4gICAgc2VsZi5lbWl0KCdkZW5pZWQnLCB7XG4gICAgICBkaXJlY3Rpb246ICdwdWxsJyxcbiAgICAgIGRvYzogZG9jXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcHVzaFBhdXNlZCgpIHtcbiAgICBzZWxmLnB1c2hQYXVzZWQgPSB0cnVlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLnB1bGxQYXVzZWQpIHtcbiAgICAgIHNlbGYuZW1pdCgncGF1c2VkJyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHB1bGxQYXVzZWQoKSB7XG4gICAgc2VsZi5wdWxsUGF1c2VkID0gdHJ1ZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5wdXNoUGF1c2VkKSB7XG4gICAgICBzZWxmLmVtaXQoJ3BhdXNlZCcpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwdXNoQWN0aXZlKCkge1xuICAgIHNlbGYucHVzaFBhdXNlZCA9IGZhbHNlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLnB1bGxQYXVzZWQpIHtcbiAgICAgIHNlbGYuZW1pdCgnYWN0aXZlJywge1xuICAgICAgICBkaXJlY3Rpb246ICdwdXNoJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHB1bGxBY3RpdmUoKSB7XG4gICAgc2VsZi5wdWxsUGF1c2VkID0gZmFsc2U7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVzaFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdhY3RpdmUnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3B1bGwnXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVtb3ZlZCA9IHt9O1xuXG4gIGZ1bmN0aW9uIHJlbW92ZUFsbCh0eXBlKSB7IC8vIHR5cGUgaXMgJ3B1c2gnIG9yICdwdWxsJ1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQsIGZ1bmMpIHtcbiAgICAgIHZhciBpc0NoYW5nZSA9IGV2ZW50ID09PSAnY2hhbmdlJyAmJlxuICAgICAgICAoZnVuYyA9PT0gcHVsbENoYW5nZSB8fCBmdW5jID09PSBwdXNoQ2hhbmdlKTtcbiAgICAgIHZhciBpc0RlbmllZCA9IGV2ZW50ID09PSAnZGVuaWVkJyAmJlxuICAgICAgICAoZnVuYyA9PT0gcHVsbERlbmllZCB8fCBmdW5jID09PSBwdXNoRGVuaWVkKTtcbiAgICAgIHZhciBpc1BhdXNlZCA9IGV2ZW50ID09PSAncGF1c2VkJyAmJlxuICAgICAgICAoZnVuYyA9PT0gcHVsbFBhdXNlZCB8fCBmdW5jID09PSBwdXNoUGF1c2VkKTtcbiAgICAgIHZhciBpc0FjdGl2ZSA9IGV2ZW50ID09PSAnYWN0aXZlJyAmJlxuICAgICAgICAoZnVuYyA9PT0gcHVsbEFjdGl2ZSB8fCBmdW5jID09PSBwdXNoQWN0aXZlKTtcblxuICAgICAgaWYgKGlzQ2hhbmdlIHx8IGlzRGVuaWVkIHx8IGlzUGF1c2VkIHx8IGlzQWN0aXZlKSB7XG4gICAgICAgIGlmICghKGV2ZW50IGluIHJlbW92ZWQpKSB7XG4gICAgICAgICAgcmVtb3ZlZFtldmVudF0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVkW2V2ZW50XVt0eXBlXSA9IHRydWU7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhyZW1vdmVkW2V2ZW50XSkubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgLy8gYm90aCBwdXNoIGFuZCBwdWxsIGhhdmUgYXNrZWQgdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgIHNlbGYucmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBpZiAob3B0cy5saXZlKSB7XG4gICAgdGhpcy5wdXNoLm9uKCdjb21wbGV0ZScsIHNlbGYucHVsbC5jYW5jZWwuYmluZChzZWxmLnB1bGwpKTtcbiAgICB0aGlzLnB1bGwub24oJ2NvbXBsZXRlJywgc2VsZi5wdXNoLmNhbmNlbC5iaW5kKHNlbGYucHVzaCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkT25lTGlzdGVuZXIoZWUsIGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIGlmIChlZS5saXN0ZW5lcnMoZXZlbnQpLmluZGV4T2YobGlzdGVuZXIpID09IC0xKSB7XG4gICAgICBlZS5vbihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMub24oJ25ld0xpc3RlbmVyJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ID09PSAnY2hhbmdlJykge1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdWxsLCAnY2hhbmdlJywgcHVsbENoYW5nZSk7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1c2gsICdjaGFuZ2UnLCBwdXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnZGVuaWVkJykge1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdWxsLCAnZGVuaWVkJywgcHVsbERlbmllZCk7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1c2gsICdkZW5pZWQnLCBwdXNoRGVuaWVkKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnYWN0aXZlJykge1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdWxsLCAnYWN0aXZlJywgcHVsbEFjdGl2ZSk7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1c2gsICdhY3RpdmUnLCBwdXNoQWN0aXZlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAncGF1c2VkJykge1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdWxsLCAncGF1c2VkJywgcHVsbFBhdXNlZCk7XG4gICAgICBhZGRPbmVMaXN0ZW5lcihzZWxmLnB1c2gsICdwYXVzZWQnLCBwdXNoUGF1c2VkKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMub24oJ3JlbW92ZUxpc3RlbmVyJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ID09PSAnY2hhbmdlJykge1xuICAgICAgc2VsZi5wdWxsLnJlbW92ZUxpc3RlbmVyKCdjaGFuZ2UnLCBwdWxsQ2hhbmdlKTtcbiAgICAgIHNlbGYucHVzaC5yZW1vdmVMaXN0ZW5lcignY2hhbmdlJywgcHVzaENoYW5nZSk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2RlbmllZCcpIHtcbiAgICAgIHNlbGYucHVsbC5yZW1vdmVMaXN0ZW5lcignZGVuaWVkJywgcHVsbERlbmllZCk7XG4gICAgICBzZWxmLnB1c2gucmVtb3ZlTGlzdGVuZXIoJ2RlbmllZCcsIHB1c2hEZW5pZWQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdhY3RpdmUnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ2FjdGl2ZScsIHB1bGxBY3RpdmUpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdhY3RpdmUnLCBwdXNoQWN0aXZlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAncGF1c2VkJykge1xuICAgICAgc2VsZi5wdWxsLnJlbW92ZUxpc3RlbmVyKCdwYXVzZWQnLCBwdWxsUGF1c2VkKTtcbiAgICAgIHNlbGYucHVzaC5yZW1vdmVMaXN0ZW5lcigncGF1c2VkJywgcHVzaFBhdXNlZCk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLnB1bGwub24oJ3JlbW92ZUxpc3RlbmVyJywgcmVtb3ZlQWxsKCdwdWxsJykpO1xuICB0aGlzLnB1c2gub24oJ3JlbW92ZUxpc3RlbmVyJywgcmVtb3ZlQWxsKCdwdXNoJykpO1xuXG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5hbGwoW1xuICAgIHRoaXMucHVzaCxcbiAgICB0aGlzLnB1bGxcbiAgXSkudGhlbihmdW5jdGlvbiAocmVzcCkge1xuICAgIHZhciBvdXQgPSB7XG4gICAgICBwdXNoOiByZXNwWzBdLFxuICAgICAgcHVsbDogcmVzcFsxXVxuICAgIH07XG4gICAgc2VsZi5lbWl0KCdjb21wbGV0ZScsIG91dCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBvdXQpO1xuICAgIH1cbiAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHJldHVybiBvdXQ7XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzZWxmLmNhbmNlbCgpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gaWYgdGhlcmUncyBhIGNhbGxiYWNrLCB0aGVuIHRoZSBjYWxsYmFjayBjYW4gcmVjZWl2ZVxuICAgICAgLy8gdGhlIGVycm9yIGV2ZW50XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiB0aGVyZSdzIG5vIGNhbGxiYWNrLCB0aGVuIHdlJ3JlIHNhZmUgdG8gZW1pdCBhbiBlcnJvclxuICAgICAgLy8gZXZlbnQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSB0aHJvdyBhbiB1bmhhbmRsZWQgZXJyb3JcbiAgICAgIC8vIGR1ZSB0byAnZXJyb3InIGJlaW5nIGEgc3BlY2lhbCBldmVudCBpbiBFdmVudEVtaXR0ZXJzXG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc2VsZi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIC8vIG5vIHNlbnNlIHRocm93aW5nIGlmIHdlJ3JlIGFscmVhZHkgZW1pdHRpbmcgYW4gJ2Vycm9yJyBldmVudFxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy50aGVuID0gZnVuY3Rpb24gKHN1Y2Nlc3MsIGVycikge1xuICAgIHJldHVybiBwcm9taXNlLnRoZW4oc3VjY2VzcywgZXJyKTtcbiAgfTtcblxuICB0aGlzLmNhdGNoID0gZnVuY3Rpb24gKGVycikge1xuICAgIHJldHVybiBwcm9taXNlLmNhdGNoKGVycik7XG4gIH07XG59XG5cblN5bmMucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNhbmNlbGVkKSB7XG4gICAgdGhpcy5jYW5jZWxlZCA9IHRydWU7XG4gICAgdGhpcy5wdXNoLmNhbmNlbCgpO1xuICAgIHRoaXMucHVsbC5jYW5jZWwoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcmVwbGljYXRpb24oUG91Y2hEQikge1xuICBQb3VjaERCLnJlcGxpY2F0ZSA9IHJlcGxpY2F0ZVdyYXBwZXI7XG4gIFBvdWNoREIuc3luYyA9IHN5bmM7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBvdWNoREIucHJvdG90eXBlLCAncmVwbGljYXRlJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlcGxpY2F0ZU1ldGhvZHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMucmVwbGljYXRlTWV0aG9kcyA9IHtcbiAgICAgICAgICBmcm9tOiBmdW5jdGlvbiAob3RoZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3Rvci5yZXBsaWNhdGUob3RoZXIsIHNlbGYsIG9wdHMsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRvOiBmdW5jdGlvbiAob3RoZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jb25zdHJ1Y3Rvci5yZXBsaWNhdGUoc2VsZiwgb3RoZXIsIG9wdHMsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZXBsaWNhdGVNZXRob2RzO1xuICAgIH1cbiAgfSk7XG5cbiAgUG91Y2hEQi5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uIChkYk5hbWUsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3Iuc3luYyh0aGlzLCBkYk5hbWUsIG9wdHMsIGNhbGxiYWNrKTtcbiAgfTtcbn1cblxuUG91Y2hEQi5wbHVnaW4oSURCUG91Y2gpXG4gIC5wbHVnaW4oSHR0cFBvdWNoJDEpXG4gIC5wbHVnaW4obWFwcmVkdWNlKVxuICAucGx1Z2luKHJlcGxpY2F0aW9uKTtcblxuLy8gUHVsbCBmcm9tIHNyYyBiZWNhdXNlIHBvdWNoZGItbm9kZS9wb3VjaGRiLWJyb3dzZXIgdGhlbXNlbHZlc1xuXG5leHBvcnQgZGVmYXVsdCBQb3VjaERCO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL29wZW5qc2Yub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUtRVM1IGVudmlyb25tZW50cy4gKi9cbiAgdmFyIHVuZGVmaW5lZDtcblxuICAvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG4gIHZhciBWRVJTSU9OID0gJzQuMTcuMjEnO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xuICB2YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuICAvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG4gIHZhciBDT1JFX0VSUk9SX1RFWFQgPSAnVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJyxcbiAgICAgIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJyxcbiAgICAgIElOVkFMSURfVEVNUExfVkFSX0VSUk9SX1RFWFQgPSAnSW52YWxpZCBgdmFyaWFibGVgIG9wdGlvbiBwYXNzZWQgaW50byBgXy50ZW1wbGF0ZWAnO1xuXG4gIC8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbiAgdmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbiAgdmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xuICB2YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbiAgdmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbiAgdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICB2YXIgV1JBUF9CSU5EX0ZMQUcgPSAxLFxuICAgICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICAgIFdSQVBfQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgICBXUkFQX1BBUlRJQUxfRkxBRyA9IDMyLFxuICAgICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NCxcbiAgICAgIFdSQVBfQVJZX0ZMQUcgPSAxMjgsXG4gICAgICBXUkFQX1JFQVJHX0ZMQUcgPSAyNTYsXG4gICAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuICAvKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi9cbiAgdmFyIERFRkFVTFRfVFJVTkNfTEVOR1RIID0gMzAsXG4gICAgICBERUZBVUxUX1RSVU5DX09NSVNTSU9OID0gJy4uLic7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xuICB2YXIgSE9UX0NPVU5UID0gODAwLFxuICAgICAgSE9UX1NQQU4gPSAxNjtcblxuICAvKiogVXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBsYXp5IGl0ZXJhdGVlcy4gKi9cbiAgdmFyIExBWllfRklMVEVSX0ZMQUcgPSAxLFxuICAgICAgTEFaWV9NQVBfRkxBRyA9IDIsXG4gICAgICBMQVpZX1dISUxFX0ZMQUcgPSAzO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuICB2YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICAgIE5BTiA9IDAgLyAwO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG4gIHZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NSxcbiAgICAgIE1BWF9BUlJBWV9JTkRFWCA9IE1BWF9BUlJBWV9MRU5HVEggLSAxLFxuICAgICAgSEFMRl9NQVhfQVJSQVlfTEVOR1RIID0gTUFYX0FSUkFZX0xFTkdUSCA+Pj4gMTtcblxuICAvKiogVXNlZCB0byBhc3NvY2lhdGUgd3JhcCBtZXRob2RzIHdpdGggdGhlaXIgYml0IGZsYWdzLiAqL1xuICB2YXIgd3JhcEZsYWdzID0gW1xuICAgIFsnYXJ5JywgV1JBUF9BUllfRkxBR10sXG4gICAgWydiaW5kJywgV1JBUF9CSU5EX0ZMQUddLFxuICAgIFsnYmluZEtleScsIFdSQVBfQklORF9LRVlfRkxBR10sXG4gICAgWydjdXJyeScsIFdSQVBfQ1VSUllfRkxBR10sXG4gICAgWydjdXJyeVJpZ2h0JywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxcbiAgICBbJ2ZsaXAnLCBXUkFQX0ZMSVBfRkxBR10sXG4gICAgWydwYXJ0aWFsJywgV1JBUF9QQVJUSUFMX0ZMQUddLFxuICAgIFsncGFydGlhbFJpZ2h0JywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFxuICAgIFsncmVhcmcnLCBXUkFQX1JFQVJHX0ZMQUddXG4gIF07XG5cbiAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuICB2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICAgIGRvbUV4Y1RhZyA9ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nLFxuICAgICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICAgIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XScsXG4gICAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nLFxuICAgICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJyxcbiAgICAgIHdlYWtTZXRUYWcgPSAnW29iamVjdCBXZWFrU2V0XSc7XG5cbiAgdmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBlbXB0eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlLiAqL1xuICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXFxiX19wIFxcKz0gJyc7L2csXG4gICAgICByZUVtcHR5U3RyaW5nTWlkZGxlID0gL1xcYihfX3AgXFwrPSkgJycgXFwrL2csXG4gICAgICByZUVtcHR5U3RyaW5nVHJhaWxpbmcgPSAvKF9fZVxcKC4qP1xcKXxcXGJfX3RcXCkpIFxcK1xcbicnOy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlZEh0bWwgPSAvJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2csXG4gICAgICByZVVuZXNjYXBlZEh0bWwgPSAvWyY8PlwiJ10vZyxcbiAgICAgIHJlSGFzRXNjYXBlZEh0bWwgPSBSZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLFxuICAgICAgcmVIYXNVbmVzY2FwZWRIdG1sID0gUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG4gIHZhciByZUVzY2FwZSA9IC88JS0oW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVFdmFsdWF0ZSA9IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUludGVycG9sYXRlID0gLzwlPShbXFxzXFxTXSs/KSU+L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLyxcbiAgICAgIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAgICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gICAqL1xuICB2YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nLFxuICAgICAgcmVIYXNSZWdFeHBDaGFyID0gUmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuICAvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbiAgdmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xuICB2YXIgcmVXcmFwQ29tbWVudCA9IC9cXHsoPzpcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoIC4rXFxdIFxcKlxcLyk/XFxuPy8sXG4gICAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdmFsaWRhdGUgdGhlIGB2YWxpZGF0ZWAgb3B0aW9uIGluIGBfLnRlbXBsYXRlYCB2YXJpYWJsZS5cbiAgICpcbiAgICogRm9yYmlkcyBjaGFyYWN0ZXJzIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgZGVmaW5pdGlvbjpcbiAgICogLSBcIigpLFwiIChtb2RpZmljYXRpb24gb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIj1cIiAoZGVmYXVsdCB2YWx1ZSlcbiAgICogLSBcIltde31cIiAoZGVzdHJ1Y3R1cmluZyBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzKVxuICAgKiAtIFwiL1wiIChiZWdpbm5pbmcgb2YgYSBjb21tZW50KVxuICAgKiAtIHdoaXRlc3BhY2VcbiAgICovXG4gIHZhciByZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycyA9IC9bKCk9LHt9XFxbXFxdXFwvXFxzXS87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaFxuICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLlxuICAgKi9cbiAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG4gIHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG4gIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggTGF0aW4gVW5pY29kZSBsZXR0ZXJzIChleGNsdWRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycykuICovXG4gIHZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbiAgdmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICAgIHJzTG93ZXJSYW5nZSA9ICdhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmYnLFxuICAgICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgICByc1B1bmN0dWF0aW9uUmFuZ2UgPSAnXFxcXHUyMDAwLVxcXFx1MjA2ZicsXG4gICAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZicsXG4gICAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xuICB2YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCIsXG4gICAgICByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICAgIHJzRGlnaXRzID0gJ1xcXFxkKycsXG4gICAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgICByc01pc2MgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArIHJzQnJlYWtSYW5nZSArIHJzRGlnaXRzICsgcnNEaW5nYmF0UmFuZ2UgKyByc0xvd2VyUmFuZ2UgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICAgIHJzVXBwZXIgPSAnWycgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xuICB2YXIgcnNNaXNjTG93ZXIgPSAnKD86JyArIHJzTG93ZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgICAgcnNPcHRDb250clVwcGVyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86RHxMTHxNfFJFfFN8VHxWRSkpPycsXG4gICAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxLFxuICAgICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG4gIHZhciByZUFwb3MgPSBSZWdFeHAocnNBcG9zLCAnZycpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kXG4gICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gICAqL1xuICB2YXIgcmVDb21ib01hcmsgPSBSZWdFeHAocnNDb21ibywgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xuICB2YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggY29tcGxleCBvciBjb21wb3VuZCB3b3Jkcy4gKi9cbiAgdmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICAgIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNNaXNjVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyICsgcnNNaXNjTG93ZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICAgIHJzT3JkVXBwZXIsXG4gICAgcnNPcmRMb3dlcixcbiAgICByc0RpZ2l0cyxcbiAgICByc0Vtb2ppXG4gIF0uam9pbignfCcpLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG4gIHZhciByZUhhc1VuaWNvZGVXb3JkID0gL1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdCdWZmZXInLCAnRGF0YVZpZXcnLCAnRGF0ZScsICdFcnJvcicsICdGbG9hdDMyQXJyYXknLCAnRmxvYXQ2NEFycmF5JyxcbiAgICAnRnVuY3Rpb24nLCAnSW50OEFycmF5JywgJ0ludDE2QXJyYXknLCAnSW50MzJBcnJheScsICdNYXAnLCAnTWF0aCcsICdPYmplY3QnLFxuICAgICdQcm9taXNlJywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ1N5bWJvbCcsICdUeXBlRXJyb3InLCAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ1VpbnQxNkFycmF5JywgJ1VpbnQzMkFycmF5JywgJ1dlYWtNYXAnLFxuICAgICdfJywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdwYXJzZUludCcsICdzZXRUaW1lb3V0J1xuICBdO1xuXG4gIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG4gIHZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xuICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICB0eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbiAgdmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbiAgY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbiAgY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbiAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcycsXG4gICAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAgICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAgICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAgICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAgICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAgICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAgICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAgICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAgICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAgICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAgICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG4gIHZhciBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgaHRtbFVuZXNjYXBlcyA9IHtcbiAgICAnJmFtcDsnOiAnJicsXG4gICAgJyZsdDsnOiAnPCcsXG4gICAgJyZndDsnOiAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyYjMzk7JzogXCInXCJcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbiAgdmFyIGZyZWVQYXJzZUZsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICAgIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbiAgLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG4gIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgICAgaWYgKHR5cGVzKSB7XG4gICAgICAgIHJldHVybiB0eXBlcztcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9KCkpO1xuXG4gIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG4gIHZhciBub2RlSXNBcnJheUJ1ZmZlciA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsXG4gICAgICBub2RlSXNEYXRlID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNEYXRlLFxuICAgICAgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXAsXG4gICAgICBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cCxcbiAgICAgIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0LFxuICAgICAgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgIH1cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsXG4gICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICAgIHZhciByZXN1bHQ7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlSW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVhbmAgYW5kIGBfLm1lYW5CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gICAqIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXlcbiAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nXG4gICAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgICAgOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICAgKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAgICogb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICAgIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltU3RhcnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSAwO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgKytyZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gICAqL1xuICB2YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIGVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIGEgd29yZCBjb21wb3NlZCBvZiBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYGl0ZXJhdG9yYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZXJhdG9yIFRoZSBpdGVyYXRvciB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikge1xuICAgIHZhciBkYXRhLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICghKGRhdGEgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBbdmFsdWUsIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5sYXN0SW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgICA6IGFzY2lpVG9BcnJheShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAgICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICAgIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byB1bmVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciB1bmVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICAgICsrcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQHNpbmNlIDEuMS4wXG4gICAqIEBjYXRlZ29yeSBVdGlsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogXy5taXhpbih7ICdmb28nOiBfLmNvbnN0YW50KCdmb28nKSB9KTtcbiAgICpcbiAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7XG4gICAqIGxvZGFzaC5taXhpbih7ICdiYXInOiBsb2Rhc2guY29uc3RhbnQoJ2JhcicpIH0pO1xuICAgKlxuICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqIF8uaXNGdW5jdGlvbihfLmJhcik7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5mb28pO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guYmFyKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKlxuICAgKiAvLyBDcmVhdGUgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanMuXG4gICAqIHZhciBkZWZlciA9IF8ucnVuSW5Db250ZXh0KHsgJ3NldFRpbWVvdXQnOiBzZXRJbW1lZGlhdGUgfSkuZGVmZXI7XG4gICAqL1xuICB2YXIgcnVuSW5Db250ZXh0ID0gKGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IGNvbnRleHQgPT0gbnVsbCA/IHJvb3QgOiBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKTtcblxuICAgIC8qKiBCdWlsdC1pbiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksXG4gICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsXG4gICAgICAgIEVycm9yID0gY29udGV4dC5FcnJvcixcbiAgICAgICAgRnVuY3Rpb24gPSBjb250ZXh0LkZ1bmN0aW9uLFxuICAgICAgICBNYXRoID0gY29udGV4dC5NYXRoLFxuICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCxcbiAgICAgICAgUmVnRXhwID0gY29udGV4dC5SZWdFeHAsXG4gICAgICAgIFN0cmluZyA9IGNvbnRleHQuU3RyaW5nLFxuICAgICAgICBUeXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjtcblxuICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICAgICAgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG4gICAgdmFyIGNvcmVKc0RhdGEgPSBjb250ZXh0WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbiAgICB2YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG4gICAgdmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqL1xuICAgIHZhciBpZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbiAgICB2YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gICAgICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAgICAgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAgICAgKiBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgdmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG4gICAgdmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgXy5ub0NvbmZsaWN0YC4gKi9cbiAgICB2YXIgb2xkRGFzaCA9IHJvb3QuXztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG4gICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBjb250ZXh0LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgU3ltYm9sID0gY29udGV4dC5TeW1ib2wsXG4gICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksXG4gICAgICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkLFxuICAgICAgICBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KSxcbiAgICAgICAgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSxcbiAgICAgICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2UsXG4gICAgICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1JdGVyYXRvciA9IFN5bWJvbCA/IFN5bWJvbC5pdGVyYXRvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgICAgICBmdW5jKHt9LCAnJywge30pO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSgpKTtcblxuICAgIC8qKiBNb2NrZWQgYnVpbHQtaW5zLiAqL1xuICAgIHZhciBjdHhDbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCAhPT0gcm9vdC5jbGVhclRpbWVvdXQgJiYgY29udGV4dC5jbGVhclRpbWVvdXQsXG4gICAgICAgIGN0eE5vdyA9IERhdGUgJiYgRGF0ZS5ub3cgIT09IHJvb3QuRGF0ZS5ub3cgJiYgRGF0ZS5ub3csXG4gICAgICAgIGN0eFNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQgIT09IHJvb3Quc2V0VGltZW91dCAmJiBjb250ZXh0LnNldFRpbWVvdXQ7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG4gICAgdmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcixcbiAgICAgICAgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gICAgICAgIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsXG4gICAgICAgIG5hdGl2ZUpvaW4gPSBhcnJheVByb3RvLmpvaW4sXG4gICAgICAgIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZU5vdyA9IERhdGUubm93LFxuICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRleHQucGFyc2VJbnQsXG4gICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tLFxuICAgICAgICBuYXRpdmVSZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuICAgIHZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShjb250ZXh0LCAnRGF0YVZpZXcnKSxcbiAgICAgICAgTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdNYXAnKSxcbiAgICAgICAgUHJvbWlzZSA9IGdldE5hdGl2ZShjb250ZXh0LCAnUHJvbWlzZScpLFxuICAgICAgICBTZXQgPSBnZXROYXRpdmUoY29udGV4dCwgJ1NldCcpLFxuICAgICAgICBXZWFrTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdXZWFrTWFwJyksXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuICAgIC8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICAgIHZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xuICAgIHZhciByZWFsTmFtZXMgPSB7fTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG4gICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICAgICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgICAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4gICAgLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG4gICAgdmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMuIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucyxcbiAgICAgKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWVcbiAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gICAgICogYW5kIHJldHVybiB0aGUgdW53cmFwcGVkIHZhbHVlLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogRXhwbGljaXQgY2hhaW4gc2VxdWVuY2VzLCB3aGljaCBtdXN0IGJlIHVud3JhcHBlZCB3aXRoIGBfI3ZhbHVlYCwgbWF5IGJlXG4gICAgICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuXG4gICAgICpcbiAgICAgKiBUaGUgZXhlY3V0aW9uIG9mIGNoYWluZWQgbWV0aG9kcyBpcyBsYXp5LCB0aGF0IGlzLCBpdCdzIGRlZmVycmVkIHVudGlsXG4gICAgICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBMYXp5IGV2YWx1YXRpb24gYWxsb3dzIHNldmVyYWwgbWV0aG9kcyB0byBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbi5cbiAgICAgKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkc1xuICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICAgICAqIGl0ZXJhdGVlIGV4ZWN1dGlvbnMuIFNlY3Rpb25zIG9mIGEgY2hhaW4gc2VxdWVuY2UgcXVhbGlmeSBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5XG4gICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlLlxuICAgICAqXG4gICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gICAgICogYGZpbmRMYXN0YCwgYGhlYWRgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGByZWplY3RgLCBgcmV2ZXJzZWAsIGBzbGljZWAsXG4gICAgICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YFxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCxcbiAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gICAgICogYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25mb3Jtc2AsIGBjb25zdGFudGAsIGBjb3VudEJ5YCwgYGNyZWF0ZWAsXG4gICAgICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsXG4gICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAgICAgKiBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGV4dGVuZGAsIGBleHRlbmRXaXRoYCwgYGZpbGxgLCBgZmlsdGVyYCxcbiAgICAgKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsXG4gICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICAgICAqIGBmdW5jdGlvbnNJbmAsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludGVyc2VjdGlvbkJ5YCxcbiAgICAgKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCxcbiAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAgICAgKiBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXJnZVdpdGhgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCwgYG5lZ2F0ZWAsXG4gICAgICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsXG4gICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gICAgICogYHBpY2tCeWAsIGBwbGFudGAsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLCBgcHVsbEFsbGAsIGBwdWxsQWxsQnlgLFxuICAgICAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsXG4gICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAgICAgKiBgc2xpY2VgLCBgc29ydGAsIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHNwcmVhZGAsIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLFxuICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICAgICAqIGB1bmlvbmAsIGB1bmlvbkJ5YCwgYHVuaW9uV2l0aGAsIGB1bmlxYCwgYHVuaXFCeWAsIGB1bmlxV2l0aGAsIGB1bnNldGAsXG4gICAgICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsXG4gICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICAgICAqIGB6aXBPYmplY3RgLCBgemlwT2JqZWN0RGVlcGAsIGFuZCBgemlwV2l0aGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gICAgICogYGFkZGAsIGBhdHRlbXB0YCwgYGNhbWVsQ2FzZWAsIGBjYXBpdGFsaXplYCwgYGNlaWxgLCBgY2xhbXBgLCBgY2xvbmVgLFxuICAgICAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLFxuICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gICAgICogYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCxcbiAgICAgKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsXG4gICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAgICAgKiBgaGFzSW5gLCBgaGVhZGAsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCwgYGluUmFuZ2VgLCBgaW52b2tlYCxcbiAgICAgKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCxcbiAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAgICAgKiBgaXNFcXVhbFdpdGhgLCBgaXNFcnJvcmAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzSW50ZWdlcmAsIGBpc0xlbmd0aGAsXG4gICAgICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCxcbiAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICAgICAqIGBpc1NhZmVJbnRlZ2VyYCwgYGlzU2V0YCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsXG4gICAgICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsXG4gICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICAgICAqIGBtaW5gLCBgbWluQnlgLCBgbXVsdGlwbHlgLCBgbm9Db25mbGljdGAsIGBub29wYCwgYG5vd2AsIGBudGhgLCBgcGFkYCxcbiAgICAgKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCxcbiAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICAgICAqIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRJbmRleEJ5YCwgYHNvcnRlZExhc3RJbmRleGAsXG4gICAgICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLFxuICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdGltZXNgLCBgdG9GaW5pdGVgLCBgdG9JbnRlZ2VyYCwgYHRvSlNPTmAsIGB0b0xlbmd0aGAsXG4gICAgICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLFxuICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICAgICAqIGB1cHBlckZpcnN0YCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpO1xuICAgICAqIC8vID0+IDZcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgICAgIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTG9kYXNoKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWluQWxsXSBFbmFibGUgZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLCBjaGFpbkFsbCkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2NoYWluX18gPSAhIWNoYWluQWxsO1xuICAgICAgdGhpcy5fX2luZGV4X18gPSAwO1xuICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlXG4gICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogcmVFc2NhcGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2V2YWx1YXRlJzogcmVFdmFsdWF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAqL1xuICAgICAgJ2ltcG9ydHMnOiB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgICdfJzogbG9kYXNoXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB3cmFwcGVycyBhcmUgaW5zdGFuY2VzIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBsb2Rhc2gucHJvdG90eXBlID0gYmFzZUxvZGFzaC5wcm90b3R5cGU7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGxvZGFzaDtcblxuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fZGlyX18gPSAxO1xuICAgICAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlZXNfXyA9IFtdO1xuICAgICAgdGhpcy5fX3Rha2VDb3VudF9fID0gTUFYX0FSUkFZX0xFTkdUSDtcbiAgICAgIHRoaXMuX192aWV3c19fID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBsYXp5IHdyYXBwZXIgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5Q2xvbmUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9fZGlyX18gPSB0aGlzLl9fZGlyX187XG4gICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdGhpcy5fX2ZpbHRlcmVkX187XG4gICAgICByZXN1bHQuX19pdGVyYXRlZXNfXyA9IGNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO1xuICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSB0aGlzLl9fdGFrZUNvdW50X187XG4gICAgICByZXN1bHQuX192aWV3c19fID0gY29weUFycmF5KHRoaXMuX192aWV3c19fKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBsYXp5IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5UmV2ZXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLl9fZmlsdGVyZWRfXykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyA9IC0xO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSB1bndyYXBwZWQgdmFsdWUgZnJvbSBpdHMgbGF6eSB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVZhbHVlKCkge1xuICAgICAgdmFyIGFycmF5ID0gdGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLFxuICAgICAgICAgIGRpciA9IHRoaXMuX19kaXJfXyxcbiAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoYXJyYXkpLFxuICAgICAgICAgIGlzUmlnaHQgPSBkaXIgPCAwLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGlzQXJyID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICB2aWV3ID0gZ2V0VmlldygwLCBhcnJMZW5ndGgsIHRoaXMuX192aWV3c19fKSxcbiAgICAgICAgICBzdGFydCA9IHZpZXcuc3RhcnQsXG4gICAgICAgICAgZW5kID0gdmlldy5lbmQsXG4gICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQsXG4gICAgICAgICAgaW5kZXggPSBpc1JpZ2h0ID8gZW5kIDogKHN0YXJ0IC0gMSksXG4gICAgICAgICAgaXRlcmF0ZWVzID0gdGhpcy5fX2l0ZXJhdGVlc19fLFxuICAgICAgICAgIGl0ZXJMZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICB0YWtlQ291bnQgPSBuYXRpdmVNaW4obGVuZ3RoLCB0aGlzLl9fdGFrZUNvdW50X18pO1xuXG4gICAgICBpZiAoIWlzQXJyIHx8ICghaXNSaWdodCAmJiBhcnJMZW5ndGggPT0gbGVuZ3RoICYmIHRha2VDb3VudCA9PSBsZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKGFycmF5LCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuXG4gICAgICAgIHZhciBpdGVySW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlICgrK2l0ZXJJbmRleCA8IGl0ZXJMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGl0ZXJhdGVlc1tpdGVySW5kZXhdLFxuICAgICAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgICAgIHR5cGUgPSBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhenlXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICAgICAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG4gICAgSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG4gICAgSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbiAgICBIYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuICAgIEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG4gICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICAgICAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgICAgICBkYXRhLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgLS10aGlzLnNpemU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgKyt0aGlzLnNpemU7XG4gICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAgICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgYWRkXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQGFsaWFzIHB1c2hcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICAgICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICAgICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gICAgICB9XG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcbiAgICBTdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG4gICAgU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuICAgIFN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcbiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICAgICAgKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVTaXplYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlU2l6ZShhcnJheSwgbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAgICAgKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZXMgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIG9uIGBhY2N1bXVsYXRvcmAgd2l0aCBrZXlzIHRyYW5zZm9ybWVkXG4gICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICAgICAqIHZhbHVlIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBdChvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBza2lwID0gb2JqZWN0ID09IG51bGw7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBza2lwID8gdW5kZWZpbmVkIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyIDw9IHVwcGVyID8gbnVtYmVyIDogdXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gICAgICogdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIERlZXAgY2xvbmVcbiAgICAgKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgKiAgNCAtIENsb25lIHN5bWJvbHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgICAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgICAgIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zVG9gIHdoaWNoIGFjY2VwdHMgYHByb3BzYCB0byBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHNvdXJjZVtrZXldLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICogdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ldmVyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICAgICAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgICAgIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgICAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmICghKHNlZW5cbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYXBwbHkoZnVuYywgb2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcnJheUJ1ZmZlclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gZGF0ZVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICAgICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gICAgICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgICAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICAgICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2FtZVRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICAgID8gY3VzdG9taXplcihzYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5udGhgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU50aChhcnJheSwgbikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG4gKz0gbiA8IDAgPyBsZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGlzSW5kZXgobiwgbGVuZ3RoKSA/IGFycmF5W25dIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gICAgICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2VHZXQodmFsdWUsIGl0ZXJhdGVlLmxlbmd0aCA9PT0gMSA/IGl0ZXJhdGVlWzBdIDogaXRlcmF0ZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW2lkZW50aXR5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgdmFyIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpLFxuICAgICAgICAgIHZhbElzVW5kZWZpbmVkID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IG5hdGl2ZUZsb29yKChsb3cgKyBoaWdoKSAvIDIpLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSxcbiAgICAgICAgICAgIG90aElzRGVmaW5lZCA9IGNvbXB1dGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBjb21wdXRlZCA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gY29tcHV0ZWQgPT09IGNvbXB1dGVkLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7XG5cbiAgICAgICAgaWYgKHZhbElzTmFOKSB7XG4gICAgICAgICAgdmFyIHNldExvdyA9IHJldEhpZ2hlc3QgfHwgb3RoSXNSZWZsZXhpdmU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiAocmV0SGlnaGVzdCB8fCBvdGhJc0RlZmluZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzTnVsbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNOdWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAhb3RoSXNOdWxsICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc1N5bWJvbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3RoSXNOdWxsIHx8IG90aElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldExvdykge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZU1pbihoaWdoLCBNQVhfQVJSQVlfSU5ERVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZFVuaXFgIGFuZCBgXy5zb3J0ZWRVbmlxQnlgIHdpdGhvdXRcbiAgICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWVxKGNvbXB1dGVkLCBzZWVuKSkge1xuICAgICAgICAgIHZhciBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAgICAgKiBjb252ZXJzaW9ucyBvZiBiaW5hcnksIGhleGFkZWNpbWFsLCBvciBvY3RhbCBzdHJpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAgICAgKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgICAgICBpZiAoc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51cGRhdGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHJldHVybiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdXBkYXRlcihiYXNlR2V0KG9iamVjdCwgcGF0aCkpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZHJvcFdoaWxlYCBhbmQgYF8udGFrZVdoaWxlYFxuICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRHJvcF0gU3BlY2lmeSBkcm9wcGluZyBlbGVtZW50cyBpbnN0ZWFkIG9mIHRha2luZyB0aGVtLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkgJiZcbiAgICAgICAgcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge31cblxuICAgICAgcmV0dXJuIGlzRHJvcFxuICAgICAgICA/IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IDAgOiBpbmRleCksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiBsZW5ndGgpKVxuICAgICAgICA6IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IDApLCAoZnJvbVJpZ2h0ID8gbGVuZ3RoIDogaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2ZcbiAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2hcbiAgICAgKiBzdWNjZXNzaXZlIGFjdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykge1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsIGZ1bmN0aW9uKHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpO1xuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ueG9yYCwgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWG9yKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VVbmlxKGFycmF5c1swXSkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpbmRleF0sXG4gICAgICAgICAgICBvdGhJbmRleCA9IC0xO1xuXG4gICAgICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKG90aEluZGV4ICE9IGluZGV4KSB7XG4gICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gYmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XSB8fCBhcnJheSwgYXJyYXlzW290aEluZGV4XSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uemlwT2JqZWN0YCB3aGljaCBhc3NpZ25zIHZhbHVlcyB1c2luZyBgYXNzaWduRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2lnbkZ1bmMocmVzdWx0LCBwcm9wc1tpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgYGJhc2VSZXN0YCBhbGlhcyB3aGljaCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBgaWRlbnRpdHlgIGJ5IG1vZHVsZVxuICAgICAqIHJlcGxhY2VtZW50IHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHZhciBjYXN0UmVzdCA9IGJhc2VSZXN0O1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gICAgICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgY2xlYXJUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vY2xlYXJUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ8T2JqZWN0fSBpZCBUaGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3Qgb2YgdGhlIHRpbWVyIHRvIGNsZWFyLlxuICAgICAqL1xuICAgIHZhciBjbGVhclRpbWVvdXQgPSBjdHhDbGVhclRpbWVvdXQgfHwgZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiByb290LmNsZWFyVGltZW91dChpZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICBidWZmZXIuY29weShyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gICAgICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHN5bWJvbCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZiA/IE9iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSkgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpO1xuXG4gICAgICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICAgICAodmFsSXNTeW1ib2wgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlICYmICFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICF2YWxJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wgJiYgIW90aElzU3ltYm9sICYmIHZhbHVlIDwgb3RoZXIpIHx8XG4gICAgICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIW90aElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gICAgICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gICAgICpcbiAgICAgKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICAgICAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAgICAgKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgICAgIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gICAgICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZWZ0TGVuZ3RoICsgcmFuZ2VMZW5ndGgpLFxuICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICAgICAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IHJhbmdlTGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IGFyZ3NJbmRleDtcbiAgICAgIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgaG9sZGVyc1tob2xkZXJzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICAgICAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgICAgIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5ncm91cEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbml0aWFsaXplcl0gVGhlIGFjY3VtdWxhdG9yIG9iamVjdCBpbml0aWFsaXplci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLCBpbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5QWdncmVnYXRvciA6IGJhc2VBZ2dyZWdhdG9yLFxuICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBpbml0aWFsaXplciA/IGluaXRpYWxpemVyKCkgOiB7fTtcblxuICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBzZXR0ZXIsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYWNjdW11bGF0b3IpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5sb3dlckZpcnN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBTdHJpbmdgIGNhc2UgbWV0aG9kIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHZhciBjaHIgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICAgICAgOiBzdHJpbmcuY2hhckF0KDApO1xuXG4gICAgICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHNcbiAgICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgICAgIDogc3RyaW5nLnNsaWNlKDEpO1xuXG4gICAgICAgIHJldHVybiBjaHJbbWV0aG9kTmFtZV0oKSArIHRyYWlsaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5jYW1lbENhc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBlYWNoIHdvcmQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhcnJheVJlZHVjZSh3b3JkcyhkZWJ1cnIoc3RyaW5nKS5yZXBsYWNlKHJlQXBvcywgJycpKSwgY2FsbGJhY2ssICcnKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbiAgICAgICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcbiAgICAgICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxcbiAgICAgICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXJpdHkgVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KSB7XG4gICAgICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpO1xuXG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuXG4gICAgICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZsb3dgIG9yIGBfLmZsb3dSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsb3cgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmxvdyhmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmbGF0UmVzdChmdW5jdGlvbihmdW5jcykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gZnVuY3MubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwcmVyZXEgPSBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O1xuXG4gICAgICAgIGlmIChmcm9tUmlnaHQpIHtcbiAgICAgICAgICBmdW5jcy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2luZGV4XTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlcmVxICYmICF3cmFwcGVyICYmIGdldEZ1bmNOYW1lKGZ1bmMpID09ICd3cmFwcGVyJykge1xuICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgTG9kYXNoV3JhcHBlcihbXSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gd3JhcHBlciA/IGluZGV4IDogbGVuZ3RoO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGZ1bmMgPSBmdW5jc1tpbmRleF07XG5cbiAgICAgICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICAgICAgZGF0YSA9IGZ1bmNOYW1lID09ICd3cmFwcGVyJyA/IGdldERhdGEoZnVuYykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoZGF0YSAmJiBpc0xhemlhYmxlKGRhdGFbMF0pICYmXG4gICAgICAgICAgICAgICAgZGF0YVsxXSA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSAmJlxuICAgICAgICAgICAgICAgICFkYXRhWzRdLmxlbmd0aCAmJiBkYXRhWzldID09IDFcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gd3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlciwgZGF0YVszXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyYXBwZXIgPSAoZnVuYy5sZW5ndGggPT0gMSAmJiBpc0xhemlhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICA/IHdyYXBwZXJbZnVuY05hbWVdKClcbiAgICAgICAgICAgICAgOiB3cmFwcGVyLnRocnUoZnVuYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzWzBdO1xuXG4gICAgICAgICAgaWYgKHdyYXBwZXIgJiYgYXJncy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGxlbmd0aCA/IGZ1bmNzW2luZGV4XS5hcHBseSh0aGlzLCBhcmdzKSA6IHZhbHVlO1xuXG4gICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNzW2luZGV4XS5jYWxsKHRoaXMsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkXG4gICAgICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBXUkFQX0FSWV9GTEFHLFxuICAgICAgICAgIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLFxuICAgICAgICAgIGlzQ3VycmllZCA9IGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgICAgICBpc0ZsaXAgPSBiaXRtYXNrICYgV1JBUF9GTElQX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgICAgICBob2xkZXJzQ291bnQgPSBjb3VudEhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgICAgICBpZiAoaXNDdXJyaWVkICYmIGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHRoaXNBcmcsXG4gICAgICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICAgICAgbGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgICAgIGlmIChhcmdQb3MpIHtcbiAgICAgICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRmxpcCAmJiBsZW5ndGggPiAxKSB7XG4gICAgICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJ5ICYmIGFyeSA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpIHtcbiAgICAgICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmludmVydEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRvSXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgaXRlcmF0ZWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludmVydGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmVydGVyKHNldHRlciwgdG9JdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgdG9JdGVyYXRlZShpdGVyYXRlZSksIHt9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSB1c2VkIGZvciBgdW5kZWZpbmVkYCBhcmd1bWVudHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3RoZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9TdHJpbmcob3RoZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICBvdGhlciA9IGJhc2VUb051bWJlcihvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ub3ZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFycmF5RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBvdmVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcbiAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgICB2YXIgdGhpc0FyZyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgIGJhc2VkIG9uIGBsZW5ndGhgLiBUaGUgYGNoYXJzYCBzdHJpbmdcbiAgICAgKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIGNoYXJzID0gY2hhcnMgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGJhc2VUb1N0cmluZyhjaGFycyk7XG5cbiAgICAgIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDtcbiAgICAgIGlmIChjaGFyc0xlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJzTGVuZ3RoID8gYmFzZVJlcGVhdChjaGFycywgbGVuZ3RoKSA6IGNoYXJzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VSZXBlYXQoY2hhcnMsIG5hdGl2ZUNlaWwobGVuZ3RoIC8gc3RyaW5nU2l6ZShjaGFycykpKTtcbiAgICAgIHJldHVybiBoYXNVbmljb2RlKGNoYXJzKVxuICAgICAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJylcbiAgICAgICAgOiByZXN1bHQuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nXG4gICAgICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZWZ0TGVuZ3RoICsgYXJnc0xlbmd0aCksXG4gICAgICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZm4sIGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAoc3RhcnQgPCBlbmQgPyAxIDogLTEpIDogdG9GaW5pdGUoc3RlcCk7XG4gICAgICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSByZWxhdGlvbmFsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlbGF0aW9uYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24ob3BlcmF0b3IpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmIHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICBvdGhlciA9IHRvTnVtYmVyKG90aGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuXG4gICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBXUkFQX0NVUlJZX0ZMQUcsXG4gICAgICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBob2xkZXJzLFxuICAgICAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogcGFydGlhbHM7XG5cbiAgICAgIGJpdG1hc2sgfD0gKGlzQ3VycnkgPyBXUkFQX1BBUlRJQUxfRkxBRyA6IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgOiBXUkFQX1BBUlRJQUxfRkxBRyk7XG5cbiAgICAgIGlmICghKGJpdG1hc2sgJiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgbmV3UGFydGlhbHMsIG5ld0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsXG4gICAgICAgIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gd3JhcEZ1bmMuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIGlmIChpc0xhemlhYmxlKGZ1bmMpKSB7XG4gICAgICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLnJvdW5kYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBNYXRoW21ldGhvZE5hbWVdO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PSBudWxsID8gMCA6IG5hdGl2ZU1pbih0b0ludGVnZXIocHJlY2lzaW9uKSwgMjkyKTtcbiAgICAgICAgaWYgKHByZWNpc2lvbiAmJiBuYXRpdmVJc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuXG4gICAgICAgICAgLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksXG4gICAgICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7XG5cbiAgICAgICAgICBwYWlyID0gKHRvU3RyaW5nKHZhbHVlKSArICdlJykuc3BsaXQoJ2UnKTtcbiAgICAgICAgICByZXR1cm4gKyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdIC0gcHJlY2lzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMobnVtYmVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gICAgICovXG4gICAgdmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy50b1BhaXJzYCBvciBgXy50b1BhaXJzSW5gIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpO1xuICAgICAgICBpZiAodGFnID09IG1hcFRhZykge1xuICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVG9QYWlycyhvYmplY3QsIGtleXNGdW5jKG9iamVjdCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogICAgMSAtIGBfLmJpbmRgXG4gICAgICogICAgMiAtIGBfLmJpbmRLZXlgXG4gICAgICogICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gICAgICogICAgOCAtIGBfLmN1cnJ5YFxuICAgICAqICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICAgICAqICAgMzIgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gICAgICogIDEyOCAtIGBfLnJlYXJnYFxuICAgICAqICAyNTYgLSBgXy5hcnlgXG4gICAgICogIDUxMiAtIGBfLmZsaXBgXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJ5ID0gYXJ5ID09PSB1bmRlZmluZWQgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApO1xuICAgICAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkID8gYXJpdHkgOiB0b0ludGVnZXIoYXJpdHkpO1xuICAgICAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgICAgIGhvbGRlcnNSaWdodCA9IGhvbGRlcnM7XG5cbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBnZXREYXRhKGZ1bmMpO1xuXG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICAgICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gICAgICB9XG4gICAgICBmdW5jID0gbmV3RGF0YVswXTtcbiAgICAgIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICAgICAgdGhpc0FyZyA9IG5ld0RhdGFbMl07XG4gICAgICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gICAgICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgICAgIGFyaXR5ID0gbmV3RGF0YVs5XSA9IG5ld0RhdGFbOV0gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gICAgICBpZiAoIWFyaXR5ICYmIGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtcbiAgICAgIH1cbiAgICAgIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICAgICAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7XG4gICAgICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZXR0ZXIgPSBkYXRhID8gYmFzZVNldERhdGEgOiBzZXREYXRhO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKSwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c2AgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25JbmAgdXNlIHRvIGFzc2lnbiBwcm9wZXJ0aWVzXG4gICAgICogb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXNcbiAgICAgKiB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzRGVlcGAgdG8gY3VzdG9taXplIGl0cyBgXy5tZXJnZWAgdXNlIHRvIG1lcmdlIHNvdXJjZVxuICAgICAqIG9iamVjdHMgaW50byBkZXN0aW5hdGlvbiBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0aHJ1LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgcGFyZW50IG9iamVjdCBvZiBgc3JjVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykge1xuICAgICAgaWYgKGlzT2JqZWN0KG9ialZhbHVlKSAmJiBpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgb2JqVmFsdWUpO1xuICAgICAgICBiYXNlTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCB1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9taXRgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uY2xvbmVEZWVwYCB1c2UgdG8gb25seSBjbG9uZSBwbGFpblxuICAgICAqIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bmNsb25lZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCB0byBkZWZlciBjbG9uaW5nIHRvIGBfLmNsb25lRGVlcGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gICAgICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gICAgICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gICAgICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gICAgICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICAgICAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgICAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgICAgIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgICAgICBpZiAob3RoZXJGdW5jID09IG51bGwgfHwgb3RoZXJGdW5jID09IGZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsICdwbGFjZWhvbGRlcicpID8gbG9kYXNoIDogZnVuYztcbiAgICAgIHJldHVybiBvYmplY3QucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBiYXNlSXRlcmF0ZWVgLlxuICAgICAqIElmIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjaG9zZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiB0aGUgY3JlYXRlZCBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdGVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5pdGVyYXRlZSB8fCBpdGVyYXRlZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gaXRlcmF0ZWUgPyBiYXNlSXRlcmF0ZWUgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJlc3VsdChhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgICAgICA6IGRhdGEubWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB3aGlsZSAob2JqZWN0KSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuICAgIGlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAgICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgICAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAgICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgICAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gICAgICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLCB3cmFwcGVyLl9fY2hhaW5fXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICAgICAgcmVzdWx0Ll9fdmFsdWVzX18gPSB3cmFwcGVyLl9fdmFsdWVzX187XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmdcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoIC8gc2l6ZSkpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYmFzZVNsaWNlKGFycmF5LCBpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICogYW5kL29yIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIG90aGVyID0gXy5jb25jYXQoYXJyYXksIDIsIFszXSwgW1s0XV0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCAtIDEpLFxuICAgICAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KSA/IGNvcHlBcnJheShhcnJheSkgOiBbYXJyYXldLCBiYXNlRmxhdHRlbihhcmdzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbEJ5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmRcbiAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMFxuICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKVxuICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCBJTkZJTklUWSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dO1xuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8udG9QYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkXG4gICAgICogZnJvbSBrZXktdmFsdWUgYHBhaXJzYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5oZWFkKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZWFkKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWBcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDAsIC0xKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBhbGwgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMl1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgaWYgKGl0ZXJhdGVlID09PSBsYXN0KG1hcHBlZCkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzXG4gICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFsbCBlbGVtZW50cyBpbiBgYXJyYXlgIGludG8gYSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5qb2luKFsnYScsICdiJywgJ2MnXSwgJ34nKTtcbiAgICAgKiAvLyA9PiAnYX5ifmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gam9pbihhcnJheSwgc2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/ICcnIDogbmF0aXZlSm9pbi5jYWxsKGFycmF5LCBzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgYXJyYXlgIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCkgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgICA/IHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpXG4gICAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAtMik7XG4gICAgICogLy8gPT4gJ2MnO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBnaXZlbiB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICogdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgcHJlZGljYXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGwoYXJyYXksICdhJywgJ2MnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIHZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogNSwgJ3knOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksIHZhbHVlcywgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdjJ11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHB1bGxlZCk7XG4gICAgICogLy8gPT4gWydiJywgJ2QnXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSBmbGF0UmVzdChmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG5cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGFycmF5TWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gICAgICB9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5maWx0ZXJgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5wdWxsYFxuICAgICAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICogW2BBcnJheSNzbGljZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3NsaWNlKSB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgJiYgdHlwZW9mIGVuZCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggJiYgZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmxhc3RJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIGlmIChlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjEsIDIuM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMSwgbGVuZ3RoKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZVxuICAgICAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAqIGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbkJ5KFsyLjFdLCBbMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb21cbiAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgKiBpbiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICAgKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgKiBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqXG4gICAgICogXy51bnppcCh6aXBwZWQpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCwgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTtcbiAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZVxuICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqL1xuICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZFxuICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yLCAzLjRdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnhvckJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB4b3JCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0RGVlcChbJ2EuYlswXS5jJywgJ2EuYlsxXS5kJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gYSArIGIgKyBjO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxMTEsIDIyMl1cbiAgICAgKi9cbiAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpdGVyYXRlZSA9IHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gKGFycmF5cy5wb3AoKSwgaXRlcmF0ZWUpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLiBUaGUgcmVzdWx0IG9mIHN1Y2ggc2VxdWVuY2VzIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gX1xuICAgICAqICAgLmNoYWluKHVzZXJzKVxuICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAqICAgICByZXR1cm4gby51c2VyICsgJyBpcyAnICsgby5hZ2U7XG4gICAgICogICB9KVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICAgICAqICAgIC8vIE11dGF0ZSBpbnB1dCBhcnJheS5cbiAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnJldmVyc2UoKVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXygnICBhYmMgICcpXG4gICAgICogIC5jaGFpbigpXG4gICAgICogIC50cmltKClcbiAgICAgKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICAgICAqXG4gICAgICogQG5hbWUgYXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDEgfHwgdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGggfHxcbiAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICAgICAgdmFsdWUuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGlmIChsZW5ndGggJiYgIWFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGFycmF5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgY2hhaW5cbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpLmhlYWQoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycylcbiAgICAgKiAgIC5jaGFpbigpXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAucGljaygndXNlcicpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHtcbiAgICAgIHJldHVybiBjaGFpbih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oYXJyYXkpLnB1c2goMyk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLmxhc3QoKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksIHRoaXMuX19jaGFpbl9fKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZVxuICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciBkb25lID0gdGhpcy5fX2luZGV4X18gPj0gdGhpcy5fX3ZhbHVlc19fLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAqXG4gICAgICogQG5hbWUgU3ltYm9sLml0ZXJhdG9yXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZFtTeW1ib2wuaXRlcmF0b3JdKCkgPT09IHdyYXBwZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogQXJyYXkuZnJvbSh3cmFwcGVkKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSkubWFwKHNxdWFyZSk7XG4gICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAqXG4gICAgICogb3RoZXIudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwO1xuICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSBjbG9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXMgPSBjbG9uZTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIHRoZSB3cmFwcGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXztcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgICAnYXJncyc6IFtyZXZlcnNlXSxcbiAgICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sIHRoaXMuX19hY3Rpb25zX18pO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgKytyZXN1bHRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAqIGVsZW1lbnRzIG9mIGVtcHR5IGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8ucmVqZWN0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gQ29tYmluaW5nIHNldmVyYWwgcHJlZGljYXRlcyB1c2luZyBgXy5vdmVyRXZlcnlgIG9yIGBfLm92ZXJTb21lYC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9Y29sbGVjdGlvbi5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgdmFyIGZpbmRMYXN0ID0gY3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlZXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgSU5GSU5JVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlcHRoKFsxLCAyXSwgZHVwbGljYXRlLCAyKTtcbiAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBkZXB0aCkge1xuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZVxuICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICAgIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXNGdW5jID8gYXBwbHkocGF0aCwgdmFsdWUsIGFyZ3MpIDogYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICAgICAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlc1xuICAgICAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICAgICAgfVxuICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleSBmb3IuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKi9cbiAgICB2YXIgcGFydGl0aW9uID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXkgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICogYW5kIGBzb3J0QnlgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICogfSwgMCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2VSaWdodCA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqIHRoYXQgYHByZWRpY2F0ZWAgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5maWx0ZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZSA6IGJhc2VTYW1wbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlXG4gICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgKiAvLyA9PiBbMiwgMywgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZVNpemUgOiBiYXNlU2FtcGxlU2l6ZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTaHVmZmxlIDogYmFzZVNodWZmbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAqIC8vID0+IDdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U29tZSA6IGJhc2VTb21lO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAgICAgKi9cbiAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gICAgICogfSwgXy5ub3coKSk7XG4gICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgbm93ID0gY3R4Tm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmJlZm9yZWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA8IDEpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHVwIHRvIGBuYCBhcmd1bWVudHMsXG4gICAgICogaWdub3JpbmcgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLmFyeShwYXJzZUludCwgMSkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnkoZnVuYywgbiwgZ3VhcmQpIHtcbiAgICAgIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAgICAgKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA8PSAxKSB7XG4gICAgICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIHdpdGggYHBhcnRpYWxzYFxuICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2VcbiAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gICAgICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnlSaWdodChhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgzKSgyKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMiwgMykoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAqIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICAgICAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICAgICAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxhc3RBcmdzLFxuICAgICAgICAgIGxhc3RUaGlzLFxuICAgICAgICAgIG1heFdhaXQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHRpbWVySWQsXG4gICAgICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgICAgICByZXR1cm4gbWF4aW5nXG4gICAgICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgICAgIDogdGltZVdhaXRpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICAgICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgICAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAgICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgICAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gICAgICByZXR1cm4gZGVib3VuY2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBpbnZva2luZyB0aGUgYGZ1bmNgIHVudGlsIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuIEFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAnZGVmZXJyZWQnKTtcbiAgICAgKiAvLyA9PiBMb2dzICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG1pbGxpc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWZlciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgMSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWxheShmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgKiAvLyA9PiBMb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVsYXkgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIHRvTnVtYmVyKHdhaXQpIHx8IDAsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxpcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZsaXBwZWQgPSBfLmZsaXAoZnVuY3Rpb24oKSB7XG4gICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gWydkJywgJ2MnLCAnYicsICdhJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGlwKGZ1bmMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfRkxJUF9GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICAgICAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAgICAgKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICAgICAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICAgICAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gICAgICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAgICAgKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICAgICAqXG4gICAgICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB2YWx1ZXMob3RoZXIpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqXG4gICAgICogb2JqZWN0LmEgPSAyO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gICAgICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKlxuICAgICAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gICAgICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgICAgIHJldHVybiBtZW1vaXplZDtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgYE1hcENhY2hlYC5cbiAgICBtZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBuZWdhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBgZnVuY2AuIFRoZVxuICAgICAqIGBmdW5jYCBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIHByZWRpY2F0ZSB0byBuZWdhdGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbmVnYXRlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNFdmVuKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gICAgICogLy8gPT4gWzEsIDMsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyByZXN0cmljdGVkIHRvIGludm9raW5nIGBmdW5jYCBvbmNlLiBSZXBlYXQgY2FsbHNcbiAgICAgKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIC8vID0+IGBjcmVhdGVBcHBsaWNhdGlvbmAgaXMgaW52b2tlZCBvbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmVmb3JlKDIsIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50cyB0cmFuc2Zvcm1lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGFyZ3VtZW50IHRyYW5zZm9ybXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGRvdWJsZWQobikge1xuICAgICAqICAgcmV0dXJuIG4gKiAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJBcmdzKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiBbeCwgeV07XG4gICAgICogfSwgW3NxdWFyZSwgZG91YmxlZF0pO1xuICAgICAqXG4gICAgICogZnVuYyg5LCAzKTtcbiAgICAgKiAvLyA9PiBbODEsIDZdXG4gICAgICpcbiAgICAgKiBmdW5jKDEwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTAwLCAxMF1cbiAgICAgKi9cbiAgICB2YXIgb3ZlckFyZ3MgPSBjYXN0UmVzdChmdW5jdGlvbihmdW5jLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB0cmFuc2Zvcm1zID0gKHRyYW5zZm9ybXMubGVuZ3RoID09IDEgJiYgaXNBcnJheSh0cmFuc2Zvcm1zWzBdKSlcbiAgICAgICAgPyBhcnJheU1hcCh0cmFuc2Zvcm1zWzBdLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpXG4gICAgICAgIDogYXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywgMSksIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciBmdW5jc0xlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oYXJncy5sZW5ndGgsIGZ1bmNzTGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gdHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLCBhcmdzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZVxuICAgICAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4gVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5iaW5kYCBleGNlcHQgaXQgZG9lcyAqKm5vdCoqXG4gICAgICogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWwoZ3JlZXQsICdoZWxsbycpO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWwoZ3JlZXQsIF8sICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsKSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50c1xuICAgICAqIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsUmlnaHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgYXJyYW5nZWQgYWNjb3JkaW5nXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBgaW5kZXhlc2Agd2hlcmUgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBmaXJzdCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBzZWNvbmQgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZWFycmFuZ2UgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcmd1bWVudCBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcmVhcmdlZCA9IF8ucmVhcmcoZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9LCBbMiwgMCwgMV0pO1xuICAgICAqXG4gICAgICogcmVhcmdlZCgnYicsICdjJywgJ2EnKVxuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIHZhciByZWFyZyA9IGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsIGluZGV4ZXMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUkVBUkdfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5kZXhlcyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXNcbiAgICAgKiBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vbWRuLmlvL3Jlc3RfcGFyYW1ldGVycykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8ucmVzdChmdW5jdGlvbih3aGF0LCBuYW1lcykge1xuICAgICAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgK1xuICAgICAqICAgICAoXy5zaXplKG5hbWVzKSA+IDEgPyAnLCAmICcgOiAnJykgKyBfLmxhc3QobmFtZXMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KCdoZWxsbycsICdmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jLCBzdGFydCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlIGZ1bmN0aW9uIGFuZCBhbiBhcnJheSBvZiBhcmd1bWVudHMgbXVjaCBsaWtlXG4gICAgICogW2BGdW5jdGlvbiNhcHBseWBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtzcHJlYWQgb3BlcmF0b3JdKGh0dHBzOi8vbWRuLmlvL3NwcmVhZF9vcGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBzcHJlYWQgYXJndW1lbnRzIG92ZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNwcmVhZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8uc3ByZWFkKGZ1bmN0aW9uKHdobywgd2hhdCkge1xuICAgICAqICAgcmV0dXJuIHdobyArICcgc2F5cyAnICsgd2hhdDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheShbJ2ZyZWQnLCAnaGVsbG8nXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQgc2F5cyBoZWxsbydcbiAgICAgKlxuICAgICAqIHZhciBudW1iZXJzID0gUHJvbWlzZS5hbGwoW1xuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDQwKSxcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSgzNilcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIG51bWJlcnMudGhlbihfLnNwcmVhZChmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4geCArIHk7XG4gICAgICogfSkpO1xuICAgICAqIC8vID0+IGEgUHJvbWlzZSBvZiA3NlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwcmVhZChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IG5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLCAwKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFyZ3Nbc3RhcnRdLFxuICAgICAgICAgICAgb3RoZXJBcmdzID0gY2FzdFNsaWNlKGFyZ3MsIDAsIHN0YXJ0KTtcblxuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBhcnJheVB1c2gob3RoZXJBcmdzLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gICAgICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAgICAgKiBtZXRob2QgdG8gY2FuY2VsIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvXG4gICAgICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gICAgICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICAgICAqIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZCB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGVcbiAgICAgKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gICAgICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy50aHJvdHRsZWAgYW5kIGBfLmRlYm91bmNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHRocm90dGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gICAgICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB0aHJvdHRsZWQpO1xuICAgICAqXG4gICAgICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCB0aHJvdHRsZWQuY2FuY2VsKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVhZGluZyA9IHRydWUsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICdsZWFkaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIHtcbiAgICAgICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgICAgICd0cmFpbGluZyc6IHRyYWlsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG9uZSBhcmd1bWVudCwgaWdub3JpbmcgYW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8udW5hcnkocGFyc2VJbnQpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5hcnkoZnVuYykge1xuICAgICAgcmV0dXJuIGFyeShmdW5jLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIGB3cmFwcGVyYCBhcyBpdHMgZmlyc3RcbiAgICAgKiBhcmd1bWVudC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWRcbiAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYHdyYXBwZXJgLiBUaGUgd3JhcHBlciBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFt3cmFwcGVyPWlkZW50aXR5XSBUaGUgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHAgPSBfLndyYXAoXy5lc2NhcGUsIGZ1bmN0aW9uKGZ1bmMsIHRleHQpIHtcbiAgICAgKiAgIHJldHVybiAnPHA+JyArIGZ1bmModGV4dCkgKyAnPC9wPic7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBwKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICc8cD5mcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXM8L3A+J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgYXMgYW4gYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoMSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbbnVsbF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKiBjb25zb2xlLmxvZyhfLmNhc3RBcnJheShhcnJheSkgPT09IGFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEFycmF5KCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gICAgICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAgICAgKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gICAgICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkXG4gICAgICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAgICAgKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gICAgICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAgICAgKiBjbG9uaW5nIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHVwIHRvIGZvdXIgYXJndW1lbnRzOyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lV2l0aGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVEZWVwV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXBXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgb2JqZWN0YCBjb25mb3JtcyB0byBgc291cmNlYCBieSBpbnZva2luZyB0aGUgcHJlZGljYXRlXG4gICAgICogcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMjsgfSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2UgPT0gbnVsbCB8fCBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKE5hTiwgTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5ndCgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUd0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheUJ1ZmZlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheUJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IG5vZGVJc0FycmF5QnVmZmVyID8gYmFzZVVuYXJ5KG5vZGVJc0FycmF5QnVmZmVyKSA6IGJhc2VJc0FycmF5QnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICAgICAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAgICAgKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gICAgICogaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUobmV3IERhdGUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKCdNb24gQXByaWwgMjMgMjAxMicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzRGF0ZSA9IG5vZGVJc0RhdGUgPyBiYXNlVW5hcnkobm9kZUlzRGF0ZSkgOiBiYXNlSXNEYXRlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoJzxib2R5PicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAgICAgKlxuICAgICAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICAgICAqIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAgICAgKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gICAgICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkodHJ1ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICAgICAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgICAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICAgICAqIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gICAgICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLFxuICAgICAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkXG4gICAgICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gICAgICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogb2JqZWN0ID09PSBvdGhlcjtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzRXF1YWxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0b1xuICAgICAqIHNpeCBhcmd1bWVudHM6IChvYmpWYWx1ZSwgb3RoVmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIG90aGVyLCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcob3RoVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddO1xuICAgICAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsV2l0aChhcnJheSwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcih2YWx1ZSwgb3RoZXIpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCB1bmRlZmluZWQsIGN1c3RvbWl6ZXIpIDogISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgYEV2YWxFcnJvcmAsIGBSYW5nZUVycm9yYCwgYFJlZmVyZW5jZUVycm9yYCxcbiAgICAgKiBgU3ludGF4RXJyb3JgLCBgVHlwZUVycm9yYCwgb3IgYFVSSUVycm9yYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IobmV3IEVycm9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IoRXJyb3IpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZXJyb3JUYWcgfHwgdGFnID09IGRvbUV4Y1RhZyB8fFxuICAgICAgICAodHlwZW9mIHZhbHVlLm1lc3NhZ2UgPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLm5hbWUgPT0gJ3N0cmluZycgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBwcmltaXRpdmUgbnVtYmVyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNGaW5pdGVgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNGaW5pdGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiBuYXRpdmVJc0Zpbml0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbihfKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gICAgICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gICAgICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICAgICAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gICAgICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBgb2JqZWN0YCBhbmQgYHNvdXJjZWAgdG9cbiAgICAgKiBkZXRlcm1pbmUgaWYgYG9iamVjdGAgY29udGFpbnMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5tYXRjaGVzYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaChvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc01hdGNoYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggZml2ZVxuICAgICAqIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwgaW5kZXh8a2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcoc3JjVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAgICAgKiB2YXIgc291cmNlID0geyAnZ3JlZXRpbmcnOiAnaGknIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNOYU5gXShodHRwczovL21kbi5pby9OdW1iZXIvaXNOYU4pIGFuZCBpcyBub3QgdGhlIHNhbWUgYXNcbiAgICAgKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgbm9uLW51bWJlciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGB0b1N0cmluZ1RhZ2AgY2hlY2sgZmlyc3QgdG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZVxuICAgICAgLy8gQWN0aXZlWCBvYmplY3RzIGluIElFLlxuICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcmlzdGluZSBuYXRpdmUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgY2FuJ3QgcmVsaWFibHkgZGV0ZWN0IG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIHByZXNlbmNlXG4gICAgICogb2YgdGhlIGNvcmUtanMgcGFja2FnZSBiZWNhdXNlIGNvcmUtanMgY2lyY3VtdmVudHMgdGhpcyBraW5kIG9mIGRldGVjdGlvbi5cbiAgICAgKiBEZXNwaXRlIG11bHRpcGxlIHJlcXVlc3RzLCB0aGUgY29yZS1qcyBtYWludGFpbmVyIGhhcyBtYWRlIGl0IGNsZWFyOiBhbnlcbiAgICAgKiBhdHRlbXB0IHRvIGZpeCB0aGUgZGV0ZWN0aW9uIHdpbGwgYmUgb2JzdHJ1Y3RlZC4gQXMgYSByZXN1bHQsIHdlJ3JlIGxlZnRcbiAgICAgKiB3aXRoIGxpdHRsZSBjaG9pY2UgYnV0IHRvIHRocm93IGFuIGVycm9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gYWZmZWN0c1xuICAgICAqIHBhY2thZ2VzLCBsaWtlIFtiYWJlbC1wb2x5ZmlsbF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcG9seWZpbGwpLFxuICAgICAqIHdoaWNoIHJlbHkgb24gY29yZS1qcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShfKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoaXNNYXNrYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbCh2b2lkIDApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBudWxsaXNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmlsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZVxuICAgICAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gICAgICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuOC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICAgICAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBSZWdFeHBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgvYWJjLyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgnL2FiYy8nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1JlZ0V4cCA9IG5vZGVJc1JlZ0V4cCA/IGJhc2VVbmFyeShub2RlSXNSZWdFeHApIDogYmFzZUlzUmVnRXhwO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIuIEFuIGludGVnZXIgaXMgc2FmZSBpZiBpdCdzIGFuIElFRUUtNzU0XG4gICAgICogZG91YmxlIHByZWNpc2lvbiBudW1iZXIgd2hpY2ggaXNuJ3QgdGhlIHJlc3VsdCBvZiBhIHJvdW5kZWQgdW5zYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc1NhZmVJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzU2FmZUludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IC1NQVhfU0FGRV9JTlRFR0VSICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gd2Vha01hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHdlYWtTZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0KDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHQgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDw9IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0FycmF5KHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KDEpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHN0cmluZ1RvQXJyYXkodmFsdWUpIDogY29weUFycmF5KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeW1JdGVyYXRvciAmJiB2YWx1ZVtzeW1JdGVyYXRvcl0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVG9BcnJheSh2YWx1ZVtzeW1JdGVyYXRvcl0oKSk7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICBmdW5jID0gdGFnID09IG1hcFRhZyA/IG1hcFRvQXJyYXkgOiAodGFnID09IHNldFRhZyA/IHNldFRvQXJyYXkgOiB2YWx1ZXMpO1xuXG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMi4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICAgICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBsZW5ndGggb2YgYW5cbiAgICAgKiBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDQyOTQ5NjcyOTVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIDAsIE1BWF9BUlJBWV9MRU5HVEgpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b051bWJlcigzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IEluZmluaXR5XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOQU47XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgICAgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAgICAgKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICAgICAqIHJlcHJlc2VudGVkIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIC1NQVhfU0FGRV9JTlRFR0VSLCBNQVhfU0FGRV9JTlRFR0VSKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAgICAgKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKG51bGwpO1xuICAgICAqIC8vID0+ICcnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKC0wKTtcbiAgICAgKiAvLyA9PiAnLTAnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gJzEsMiwzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgIGFuZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBpZiAoaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25JbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRXaXRoXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25JbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXy5hdChvYmplY3QsIFsnYVswXS5iLmMnLCAnYVsxXSddKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgYXQgPSBmbGF0UmVzdChiYXNlQXQpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgcHJvdG90eXBlYCBvYmplY3QuIElmIGFcbiAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0IGlzIGdpdmVuLCBpdHMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXNcbiAgICAgKiBhcmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICAgICAqICAgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTtcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcyA9PSBudWxsID8gcmVzdWx0IDogYmFzZUFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAgICAgKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgICAgICB2YXIgcHJvcHNJbmRleCA9IC0xO1xuICAgICAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW3Byb3BzSW5kZXhdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kZWZhdWx0c2AgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgYXNzaWduc1xuICAgICAqIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0c0RlZXAoeyAnYSc6IHsgJ2InOiAyIH0gfSwgeyAnYSc6IHsgJ2InOiAxLCAnYyc6IDMgfSB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IDIsICdjJzogMyB9IH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHNEZWVwID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgYXJncy5wdXNoKHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSk7XG4gICAgICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiByZXR1cm5zICdwZWJibGVzJyBhc3N1bWluZyBgXy5maW5kS2V5YCByZXR1cm5zICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW5cbiAgICAgKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3Iob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW5SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2MnLCAnYicsIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvckluYCBsb2dzICdhJywgJ2InLCB0aGVuICdjJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3JSaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmRcbiAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd24ob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdiJyB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIHRoZW4gJ2InLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93blJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgICAqIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc0luXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGFuZCBpbmhlcml0ZWRcbiAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gICAgICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gICAgICogcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnQob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9XG4gICAgICovXG4gICAgdmFyIGludmVydCA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRbdmFsdWVdID0ga2V5O1xuICAgIH0sIGNvbnN0YW50KGlkZW50aXR5KSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludmVydGAgZXhjZXB0IHRoYXQgdGhlIGludmVydGVkIG9iamVjdCBpcyBnZW5lcmF0ZWRcbiAgICAgKiBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogY29ycmVzcG9uZGluZyBpbnZlcnRlZCB2YWx1ZSBvZiBlYWNoIGludmVydGVkIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzXG4gICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGludmVydGVkIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAnZ3JvdXAnICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnZ3JvdXAxJzogWydhJywgJ2MnXSwgJ2dyb3VwMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0QnkgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gW2tleV07XG4gICAgICB9XG4gICAgfSwgZ2V0SXRlcmF0ZWUpO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IFsxLCAyLCAzLCA0XSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmludm9rZShvYmplY3QsICdhWzBdLmIuYy5zbGljZScsIDEsIDMpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIHZhciBpbnZva2UgPSBiYXNlUmVzdChiYXNlSW52b2tlKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAgICAgKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5cyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLmtleXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1hcFZhbHVlc2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAgICogc2FtZSB2YWx1ZXMgYXMgYG9iamVjdGAgYW5kIGtleXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZVxuICAgICAqIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcFZhbHVlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcEtleXMoeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICByZXR1cm4ga2V5ICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYTEnOiAxLCAnYjInOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBLZXlzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAgICAgKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBLZXlzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICAgICAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICAgICAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gICAgICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gICAgICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIG90aGVyID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVyZ2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlXG4gICAgICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGVcbiAgICAgKiBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggc2l4IGFyZ3VtZW50czpcbiAgICAgKiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogWzFdLCAnYic6IFsyXSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiBbM10sICdiJzogWzRdIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlV2l0aChvYmplY3QsIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogWzEsIDNdLCAnYic6IFsyLCA0XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgcGF0aHMgb2YgYG9iamVjdGAgdGhhdCBhcmUgbm90IG9taXR0ZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IHNsb3dlciB0aGFuIGBfLnBpY2tgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gb21pdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdChvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIHZhciBvbWl0ID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaXNEZWVwID0gZmFsc2U7XG4gICAgICBwYXRocyA9IGFycmF5TWFwKHBhdGhzLCBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgICBpc0RlZXAgfHwgKGlzRGVlcCA9IHBhdGgubGVuZ3RoID4gMSk7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSk7XG4gICAgICBjb3B5T2JqZWN0KG9iamVjdCwgZ2V0QWxsS2V5c0luKG9iamVjdCksIHJlc3VsdCk7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJlc3VsdCA9IGJhc2VDbG9uZShyZXN1bHQsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX0ZMQVRfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9tT21pdENsb25lKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgYmFzZVVuc2V0KHJlc3VsdCwgcGF0aHNbbGVuZ3RoXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tCeWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mXG4gICAgICogdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYG9iamVjdGAgdGhhdFxuICAgICAqIGBwcmVkaWNhdGVgIGRvZXNuJ3QgcmV0dXJuIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3b1xuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9taXRCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHBpY2tCeShvYmplY3QsIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAgICAgKiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGlja0J5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGlja0J5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFtwcm9wXTtcbiAgICAgIH0pO1xuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlKTtcbiAgICAgIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwcmVkaWNhdGUodmFsdWUsIHBhdGhbMF0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhXG4gICAgICogZnVuY3Rpb24gaXQncyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGl0cyBwYXJlbnQgb2JqZWN0IGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYzEnOiAzLCAnYzInOiBfLmNvbnN0YW50KDQpIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMScpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMicpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCBfLmNvbnN0YW50KCdkZWZhdWx0JykpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3VsdChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGxvb3AgaXMgZW50ZXJlZCB3aGVuIHBhdGggaXMgZW1wdHkuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICBvYmplY3QgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IGlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUuY2FsbChvYmplY3QpIDogdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICAgICAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICAgICAqIGFyZSBjcmVhdGVkIGZvciBhbGwgb3RoZXIgbWlzc2luZyBwcm9wZXJ0aWVzLiBVc2UgYF8uc2V0V2l0aGAgdG8gY3VzdG9taXplXG4gICAgICogYHBhdGhgIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgWyd4JywgJzAnLCAneScsICd6J10sIDUpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnNldFdpdGgob2JqZWN0LCAnWzBdWzFdJywgJ2EnLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdpdGgob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGBcbiAgICAgKiB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXAgb3Igc2V0LCBpdHNcbiAgICAgKiBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlycyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzID0gY3JlYXRlVG9QYWlycyhrZXlzKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnNcbiAgICAgKiBmb3IgYG9iamVjdGAgd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwXG4gICAgICogb3Igc2V0LCBpdHMgZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc0luXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlyc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzSW4gPSBjcmVhdGVUb1BhaXJzKGtleXNJbik7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICAgICAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICAgICAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAgICAgKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICAgICAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgOV1cbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgICAgIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogNyB9IH1dIH07XG4gICAgICogXy51bnNldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udW5zZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdHJ1ZSA6IGJhc2VVbnNldChvYmplY3QsIHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBhY2NlcHRzIGB1cGRhdGVyYCB0byBwcm9kdWNlIHRoZVxuICAgICAqIHZhbHVlIHRvIHNldC4gVXNlIGBfLnVwZGF0ZVdpdGhgIHRvIGN1c3RvbWl6ZSBgcGF0aGAgY3JlYXRpb24uIFRoZSBgdXBkYXRlcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ2FbMF0uYi5jJywgZnVuY3Rpb24obikgeyByZXR1cm4gbiAqIG47IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gOVxuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAneFswXS55LnonLCBmdW5jdGlvbihuKSB7IHJldHVybiBuID8gbiArIDEgOiAwOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVwZGF0ZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlV2l0aChvYmplY3QsICdbMF1bMV0nLCBfLmNvbnN0YW50KCdhJyksIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlciksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKCdoaScpO1xuICAgICAqIC8vID0+IFsnaCcsICdpJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5XG4gICAgICogdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IC01XG4gICAgICpcbiAgICAgKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgICAgICB1cHBlciA9IHVwcGVyID09PSB1cHBlciA/IHVwcGVyIDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gdG9OdW1iZXIobG93ZXIpO1xuICAgICAgICBsb3dlciA9IGxvd2VyID09PSBsb3dlciA/IGxvd2VyIDogMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSwgbG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG5gIGlzIGJldHdlZW4gYHN0YXJ0YCBhbmQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gSWZcbiAgICAgKiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLCBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0XG4gICAgICogbmVnYXRpdmUgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLnJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDMsIDIsIDQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCA4KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgyLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDEuMiwgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDUuMiwgNCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgtMywgLTIsIC02KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgfVxuICAgICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICAgIHJldHVybiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICogSWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXJcbiAgICAgKiBpcyByZXR1cm5lZC4gSWYgYGZsb2F0aW5nYCBpcyBgdHJ1ZWAsIG9yIGVpdGhlciBgbG93ZXJgIG9yIGB1cHBlcmAgYXJlXG4gICAgICogZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyPTBdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3VwcGVyPTFdIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZ10gU3BlY2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obG93ZXIsIHVwcGVyLCBmbG9hdGluZykge1xuICAgICAgaWYgKGZsb2F0aW5nICYmIHR5cGVvZiBmbG9hdGluZyAhPSAnYm9vbGVhbicgJiYgaXNJdGVyYXRlZUNhbGwobG93ZXIsIHVwcGVyLCBmbG9hdGluZykpIHtcbiAgICAgICAgdXBwZXIgPSBmbG9hdGluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdXBwZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSB1cHBlcjtcbiAgICAgICAgICB1cHBlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG93ZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID09PSB1bmRlZmluZWQgJiYgdXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIHVwcGVyID0gMTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBsb3dlciA9IHRvRmluaXRlKGxvd2VyKTtcbiAgICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cHBlciA9IHRvRmluaXRlKHVwcGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgICAgdmFyIHRlbXAgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1cHBlcjtcbiAgICAgICAgdXBwZXIgPSB0ZW1wO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nIHx8IGxvd2VyICUgMSB8fCB1cHBlciAlIDEpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVSYW5kb20oKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihsb3dlciArIChyYW5kICogKHVwcGVyIC0gbG93ZXIgKyBmcmVlUGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArICcnKS5sZW5ndGggLSAxKSkpKSwgdXBwZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbY2FtZWwgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FtZWxDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhbWVsIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICovXG4gICAgdmFyIGNhbWVsQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyBjYXBpdGFsaXplKHdvcmQpIDogd29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UgYW5kIHRoZSByZW1haW5pbmdcbiAgICAgKiB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICAgICAgcmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWJ1cnJzIGBzdHJpbmdgIGJ5IGNvbnZlcnRpbmdcbiAgICAgKiBbTGF0aW4tMSBTdXBwbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbi0xX1N1cHBsZW1lbnRfKFVuaWNvZGVfYmxvY2spI0NoYXJhY3Rlcl90YWJsZSlcbiAgICAgKiBhbmQgW0xhdGluIEV4dGVuZGVkLUFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX0V4dGVuZGVkLUEpXG4gICAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzIGFuZCByZW1vdmluZ1xuICAgICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWJ1cnIoJ2TDqWrDoCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgICAgIHZhciBlbmQgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uIC09IHRhcmdldC5sZW5ndGg7XG4gICAgICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICAgICAqIFhTUyB2ZWN0b3JzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlUmVnRXhwKCdbbG9kYXNoXShodHRwczovL2xvZGFzaC5jb20vKScpO1xuICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKi9cbiAgICB2YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJy0nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnZlJFRCdcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSwgY2hhcnMpICtcbiAgICAgICAgc3RyaW5nICtcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksIGNoYXJzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBJZiBgcmFkaXhgIGlzXG4gICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgKiBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAqIFtFUzUgaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4yKSBvZiBgcGFyc2VJbnRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXg9MTBdIFRoZSByYWRpeCB0byBpbnRlcnByZXQgYHZhbHVlYCBieS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCB8fCByYWRpeCA9PSBudWxsKSB7XG4gICAgICAgIHJhZGl4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocmFkaXgpIHtcbiAgICAgICAgcmFkaXggPSArcmFkaXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyksIHJhZGl4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdHMgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIG1hdGNoZXMgZm9yIGBwYXR0ZXJuYCBpbiBgc3RyaW5nYCB3aXRoIGByZXBsYWNlbWVudGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNyZXBsYWNlYF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3JlcGxhY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBsYWNlKCdIaSBGcmVkJywgJ0ZyZWQnLCAnQmFybmV5Jyk7XG4gICAgICogLy8gPT4gJ0hpIEJhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoYXJnc1swXSk7XG5cbiAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA8IDMgPyBzdHJpbmcgOiBzdHJpbmcucmVwbGFjZShhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgcmVzdWx0cyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBsaW1pdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmICghbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKFxuICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKVxuICAgICAgICAgICkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgdXBwZXJGaXJzdCh3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgPyAwXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgKiBpbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpblxuICAgICAqIFwiZXNjYXBlXCIgZGVsaW1pdGVycywgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy4gRGF0YVxuICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICogb2JqZWN0IGlzIGdpdmVuLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYF8udGVtcGxhdGVTZXR0aW5nc2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgKiBbc291cmNlVVJMc10oaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybClcbiAgICAgKiBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlXG4gICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlXG4gICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHRlbXBsYXRlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlPV8udGVtcGxhdGVTZXR0aW5ncy5lc2NhcGVdXG4gICAgICogIFRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICogIFRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzPV8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXVxuICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGVdXG4gICAgICogIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAqICBUaGUgc291cmNlVVJMIG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBkYXRhIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIF8uZm9yRWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEVTIHRlbXBsYXRlIGxpdGVyYWwgZGVsaW1pdGVyIGFzIGFuIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pO1xuICAgICAqIGNvbXBpbGVkKGRhdGEpO1xuICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICogY29tcGlsZWQuc291cmNlO1xuICAgICAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAqIC8vICAgX19wICs9ICdoaSAnICsgKChfX3QgPSAoIGRhdGEudXNlciApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnO1xuICAgICAqIC8vICAgcmV0dXJuIF9fcDtcbiAgICAgKiAvLyB9XG4gICAgICpcbiAgICAgKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyB7eyB1c2VyIH19IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIChodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLylcbiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1QpLlxuICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0dGluZ3MuaW1wb3J0cywgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksXG4gICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSBiYXNlVmFsdWVzKGltcG9ydHMsIGltcG9ydHNLZXlzKTtcblxuICAgICAgdmFyIGlzRXNjYXBpbmcsXG4gICAgICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGUgfHwgcmVOb01hdGNoLFxuICAgICAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAgICAgLy8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bFxuICAgICAgLy8gdG8gbm9ybWFsaXplIGFsbCBraW5kcyBvZiB3aGl0ZXNwYWNlLCBzbyBlLmcuIG5ld2xpbmVzIChhbmQgdW5pY29kZSB2ZXJzaW9ucyBvZiBpdCkgY2FuJ3Qgc25lYWsgaW5cbiAgICAgIC8vIGFuZCBlc2NhcGUgdGhlIGNvbW1lbnQsIHRodXMgaW5qZWN0aW5nIGNvZGUgdGhhdCBnZXRzIGV2YWxlZC5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3NvdXJjZVVSTCcpXG4gICAgICAgICAgPyAob3B0aW9ucy5zb3VyY2VVUkwgKyAnJykucmVwbGFjZSgvXFxzL2csICcgJylcbiAgICAgICAgICA6ICgnbG9kYXNoLnRlbXBsYXRlU291cmNlc1snICsgKCsrdGVtcGxhdGVDb3VudGVyKSArICddJylcbiAgICAgICAgKSArICdcXG4nO1xuXG4gICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgICAgIHNvdXJjZSArPSBzdHJpbmcuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHMuXG4gICAgICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbl9fZShcIiArIGVzY2FwZVZhbHVlICsgXCIpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJwb2xhdGVWYWx1ZSkge1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgICAgLy8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAgICAgdmFyIHZhcmlhYmxlID0gaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAndmFyaWFibGUnKSAmJiBvcHRpb25zLnZhcmlhYmxlO1xuICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAob2JqKSB7XFxuJyArIHNvdXJjZSArICdcXG59XFxuJztcbiAgICAgIH1cbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGEgZm9yYmlkZGVuIGNoYXJhY3RlciB3YXMgZm91bmQgaW4gYHZhcmlhYmxlYCwgdG8gcHJldmVudFxuICAgICAgLy8gcG90ZW50aWFsIGNvbW1hbmQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAgICBlbHNlIGlmIChyZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycy50ZXN0KHZhcmlhYmxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgY29kZSBieSBzdHJpcHBpbmcgZW1wdHkgc3RyaW5ncy5cbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAgICAgKHZhcmlhYmxlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIFwidmFyIF9fdCwgX19wID0gJydcIiArXG4gICAgICAgIChpc0VzY2FwaW5nXG4gICAgICAgICAgID8gJywgX19lID0gXy5lc2NhcGUnXG4gICAgICAgICAgIDogJydcbiAgICAgICAgKSArXG4gICAgICAgIChpc0V2YWx1YXRpbmdcbiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xcbicgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgICAgIDogJztcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBzb3VyY2UgK1xuICAgICAgICAncmV0dXJuIF9fcFxcbn0nO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgaW1wb3J0c1ZhbHVlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gICAgICAvLyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IgaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzLlxuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gbG93ZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1mb28tYmFyLS0nXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29iYXInXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ19fZm9vX2Jhcl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT09CQVInXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gYmFzZVRyaW0oc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgXy5tYXRjaGVzKHsgJ2EnOiA0IH0pXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDEpLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgbWF0Y2hlc0Z1bmMgPSBfLm92ZXJTb21lKFt7ICdhJzogMSB9LCB7ICdhJzogMiB9XSlcbiAgICAgKiB2YXIgbWF0Y2hlc1Byb3BlcnR5RnVuYyA9IF8ub3ZlclNvbWUoW1snYScsIDFdLCBbJ2EnLCAyXV0pXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IGxvZGFzaEZ1bmMubmFtZSArICcnO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCBrZXkpKSB7XG4gICAgICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZWFsTmFtZXNba2V5XS5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsIi8qKlxyXG4qIHZrQmVhdXRpZnkgLSBqYXZhc2NyaXB0IHBsdWdpbiB0byBwcmV0dHktcHJpbnQgb3IgbWluaWZ5IHRleHQgaW4gWE1MLCBKU09OLCBDU1MgYW5kIFNRTCBmb3JtYXRzLlxyXG4qXHJcbiogQ29weXJpZ2h0IChjKSAyMDEyIFZhZGltIEtpcnl1a2hpblxyXG4qIHZraXJ5dWtoaW4gQCBnbWFpbC5jb21cclxuKiBodHRwOi8vd3d3LmVzbGluc3RydWN0b3IubmV0L3ZrYmVhdXRpZnkvXHJcbipcclxuKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczpcclxuKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcbiogICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWxcclxuKlxyXG4qICAgUHJldHR5IHByaW50XHJcbipcclxuKiAgICAgICAgdmtiZWF1dGlmeS54bWwodGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuanNvbih0ZXh0IFssaW5kZW50X3BhdHRlcm5dKTtcclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3ModGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQgWyxpbmRlbnRfcGF0dGVybl0pO1xyXG4qXHJcbiogICAgICAgIEB0ZXh0IC0gU3RyaW5nOyB0ZXh0IHRvIGJlYXR1Znk7XHJcbiogICAgICAgIEBpbmRlbnRfcGF0dGVybiAtIEludGVnZXIgfCBTdHJpbmc7XHJcbiogICAgICAgICAgICAgICAgSW50ZWdlcjogIG51bWJlciBvZiB3aGl0ZSBzcGFjZXM7XHJcbiogICAgICAgICAgICAgICAgU3RyaW5nOiAgIGNoYXJhY3RlciBzdHJpbmcgdG8gdmlzdWFsaXplIGluZGVudGF0aW9uICggY2FuIGFsc28gYmUgYSBzZXQgb2Ygd2hpdGUgc3BhY2VzIClcclxuKiAgIE1pbmlmeVxyXG4qXHJcbiogICAgICAgIHZrYmVhdXRpZnkueG1sbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuY3NzbWluKHRleHQgWyxwcmVzZXJ2ZV9jb21tZW50c10pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbG1pbih0ZXh0KTtcclxuKlxyXG4qICAgICAgICBAdGV4dCAtIFN0cmluZzsgdGV4dCB0byBtaW5pZnk7XHJcbiogICAgICAgIEBwcmVzZXJ2ZV9jb21tZW50cyAtIEJvb2w7IFtvcHRpb25hbF07XHJcbiogICAgICAgICAgICAgICAgU2V0IHRoaXMgZmxhZyB0byB0cnVlIHRvIHByZXZlbnQgcmVtb3ZpbmcgY29tbWVudHMgZnJvbSBAdGV4dCAoIG1pbnhtbCBhbmQgbWluY3NzIGZ1bmN0aW9ucyBvbmx5LiApXHJcbipcclxuKiAgIEV4YW1wbGVzOlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbCh0ZXh0KTsgLy8gcHJldHR5IHByaW50IFhNTFxyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb24odGV4dCwgNCApOyAvLyBwcmV0dHkgcHJpbnQgSlNPTlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LmNzcyh0ZXh0LCAnLiAuIC4gLicpOyAvLyBwcmV0dHkgcHJpbnQgQ1NTXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsKHRleHQsICctLS0tJyk7IC8vIHByZXR0eSBwcmludCBTUUxcclxuKlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbG1pbih0ZXh0LCB0cnVlKTsvLyBtaW5pZnkgWE1MLCBwcmVzZXJ2ZSBjb21tZW50c1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb25taW4odGV4dCk7Ly8gbWluaWZ5IEpTT05cclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3NtaW4odGV4dCk7Ly8gbWluaWZ5IENTUywgcmVtb3ZlIGNvbW1lbnRzICggZGVmYXVsdCApXHJcbiogICAgICAgIHZrYmVhdXRpZnkuc3FsbWluKHRleHQpOy8vIG1pbmlmeSBTUUxcclxuKlxyXG4qL1xyXG5mdW5jdGlvbiBjcmVhdGVTaGlmdEFycihzdGVwKSB7XHJcblxyXG5cdHZhciBzcGFjZSA9ICcgICAgJztcclxuXHJcblx0aWYgKCBpc05hTihwYXJzZUludChzdGVwKSkgKSB7ICAvLyBhcmd1bWVudCBpcyBzdHJpbmdcclxuXHRcdHNwYWNlID0gc3RlcDtcclxuXHR9IGVsc2UgeyAvLyBhcmd1bWVudCBpcyBpbnRlZ2VyXHJcblx0XHRzd2l0Y2goc3RlcCkge1xyXG5cdFx0XHRjYXNlIDE6IHNwYWNlID0gJyAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSAyOiBzcGFjZSA9ICcgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDM6IHNwYWNlID0gJyAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDQ6IHNwYWNlID0gJyAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA1OiBzcGFjZSA9ICcgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDY6IHNwYWNlID0gJyAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDc6IHNwYWNlID0gJyAgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA4OiBzcGFjZSA9ICcgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDk6IHNwYWNlID0gJyAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDEwOiBzcGFjZSA9ICcgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTE6IHNwYWNlID0gJyAgICAgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTI6IHNwYWNlID0gJyAgICAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIHNoaWZ0ID0gWydcXG4nXTsgLy8gYXJyYXkgb2Ygc2hpZnRzXHJcblx0Zm9yKHZhciBpeD0wO2l4PDEwMDtpeCsrKSB7XHJcblx0XHRzaGlmdC5wdXNoKHNoaWZ0W2l4XStzcGFjZSk7XHJcblx0fVxyXG5cdHJldHVybiBzaGlmdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdmtiZWF1dGlmeSgpe1xyXG5cdHRoaXMuc3RlcCA9ICcgICAgJzsgLy8gNCBzcGFjZXNcclxuXHR0aGlzLnNoaWZ0ID0gY3JlYXRlU2hpZnRBcnIodGhpcy5zdGVwKTtcclxufTtcclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLnhtbCA9IGZ1bmN0aW9uKHRleHQsc3RlcCkge1xyXG5cclxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoLzwvZyxcIn46On48XCIpXHJcblx0XHRcdFx0IC5yZXBsYWNlKC9cXHMqeG1sbnNcXDovZyxcIn46On54bWxuczpcIilcclxuXHRcdFx0XHQgLnJlcGxhY2UoL1xccyp4bWxuc1xcPS9nLFwifjo6fnhtbG5zPVwiKVxyXG5cdFx0XHRcdCAuc3BsaXQoJ346On4nKSxcclxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcclxuXHRcdGluQ29tbWVudCA9IGZhbHNlLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cdFx0XHQvLyBzdGFydCBjb21tZW50IG9yIDwhW0NEQVRBWy4uLl1dPiBvciA8IURPQ1RZUEUgLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPCEvKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSB0cnVlO1xyXG5cdFx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0XHRpZihhcltpeF0uc2VhcmNoKC8tLT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goL1xcXT4vKSA+IC0xIHx8IGFyW2l4XS5zZWFyY2goLyFET0NUWVBFLykgPiAtMSApIHtcclxuXHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBhcltpeF07XHJcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtPjwvZWxtPiAvL1xyXG5cdFx0XHRpZiggL148XFx3Ly5leGVjKGFyW2l4LTFdKSAmJiAvXjxcXC9cXHcvLmV4ZWMoYXJbaXhdKSAmJlxyXG5cdFx0XHRcdC9ePFtcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXgtMV0pID09IC9ePFxcL1tcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXhdKVswXS5yZXBsYWNlKCcvJywnJykpIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHRcdGlmKCFpbkNvbW1lbnQpIGRlZXAtLTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdCAvLyA8ZWxtPiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPT0gLTEgJiYgYXJbaXhdLnNlYXJjaCgvXFwvPi8pID09IC0xICkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0IC8vIDxlbG0+Li4uPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXHcvKSA+IC0xICYmIGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPC9lbG0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzxcXC8vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyA8ZWxtLz4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvXFwvPi8pID4gLTEgKSB7XHJcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPD8geG1sIC4uLiA/PiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFw/LykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyB4bWxucyAvL1xyXG5cdFx0XHRpZiggYXJbaXhdLnNlYXJjaCgveG1sbnNcXDovKSA+IC0xICB8fCBhcltpeF0uc2VhcmNoKC94bWxuc1xcPS8pID4gLTEpIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdHJldHVybiAgKHN0clswXSA9PSAnXFxuJykgPyBzdHIuc2xpY2UoMSkgOiBzdHI7XHJcbn1cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLmpzb24gPSBmdW5jdGlvbih0ZXh0LHN0ZXApIHtcclxuXHJcblx0dmFyIHN0ZXAgPSBzdGVwID8gc3RlcCA6IHRoaXMuc3RlcDtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiICkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGV4dCksIG51bGwsIHN0ZXApO1xyXG5cdGlmICggdHlwZW9mIHRleHQgPT09IFwib2JqZWN0XCIgKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGV4dCwgbnVsbCwgc3RlcCk7XHJcblxyXG5cdHJldHVybiB0ZXh0OyAvLyB0ZXh0IGlzIG5vdCBzdHJpbmcgbm9yIG9iamVjdFxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3MgPSBmdW5jdGlvbih0ZXh0LCBzdGVwKSB7XHJcblxyXG5cdHZhciBhciA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLCcgJylcclxuXHRcdFx0XHQucmVwbGFjZSgvXFx7L2csXCJ7fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXH0vZyxcIn46On59fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXDsvZyxcIjt+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcL1xcKi9nLFwifjo6fi8qXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcKlxcLy9nLFwiKi9+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL346On5cXHN7MCx9fjo6fi9nLFwifjo6flwiKVxyXG5cdFx0XHRcdC5zcGxpdCgnfjo6ficpLFxyXG5cdFx0bGVuID0gYXIubGVuZ3RoLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHRzdHIgPSAnJyxcclxuXHRcdGl4ID0gMCxcclxuXHRcdHNoaWZ0ID0gc3RlcCA/IGNyZWF0ZVNoaWZ0QXJyKHN0ZXApIDogdGhpcy5zaGlmdDtcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cclxuXHRcdFx0aWYoIC9cXHsvLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcCsrXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFstLWRlZXBdK2FyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdGlmKCAvXFwqXFxcXC8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxuezEsfS8sJycpO1xyXG59XHJcblxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmZ1bmN0aW9uIGlzU3VicXVlcnkoc3RyLCBwYXJlbnRoZXNpc0xldmVsKSB7XHJcblx0cmV0dXJuICBwYXJlbnRoZXNpc0xldmVsIC0gKHN0ci5yZXBsYWNlKC9cXCgvZywnJykubGVuZ3RoIC0gc3RyLnJlcGxhY2UoL1xcKS9nLCcnKS5sZW5ndGggKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzcGxpdF9zcWwoc3RyLCB0YWIpIHtcclxuXHJcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHN7MSx9L2csXCIgXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQU5EIC9pZyxcIn46On5cIit0YWIrdGFiK1wiQU5EIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQkVUV0VFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiQkVUV0VFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENBU0UgL2lnLFwifjo6flwiK3RhYitcIkNBU0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFTFNFIC9pZyxcIn46On5cIit0YWIrXCJFTFNFIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRU5EIC9pZyxcIn46On5cIit0YWIrXCJFTkQgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBGUk9NIC9pZyxcIn46On5GUk9NIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gR1JPVVBcXHN7MSx9QlkvaWcsXCJ+Ojp+R1JPVVAgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBIQVZJTkcgL2lnLFwifjo6fkhBVklORyBcIilcclxuXHRcdFx0XHQvLy5yZXBsYWNlKC8gU0VUIC9pZyxcIiBTRVR+Ojp+XCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBJTiAvaWcsXCIgSU4gXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSk9JTiAvaWcsXCJ+Ojp+Sk9JTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIENST1NTfjo6fnsxLH1KT0lOIC9pZyxcIn46On5DUk9TUyBKT0lOIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSU5ORVJ+Ojp+ezEsfUpPSU4gL2lnLFwifjo6fklOTkVSIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBMRUZUfjo6fnsxLH1KT0lOIC9pZyxcIn46On5MRUZUIEpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBSSUdIVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+UklHSFQgSk9JTiBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT04gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPUiAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIk9SIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT1JERVJcXHN7MSx9QlkvaWcsXCJ+Ojp+T1JERVIgQlkgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBPVkVSIC9pZyxcIn46On5cIit0YWIrXCJPVkVSIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvXFwoXFxzezAsfVNFTEVDVCAvaWcsXCJ+Ojp+KFNFTEVDVCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFwpXFxzezAsfVNFTEVDVCAvaWcsXCIpfjo6flNFTEVDVCBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBUSEVOIC9pZyxcIiBUSEVOfjo6flwiK3RhYitcIlwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVU5JT04gL2lnLFwifjo6flVOSU9Ofjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVVNJTkcgL2lnLFwifjo6flVTSU5HIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gV0hFTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiV0hFTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdIRVJFIC9pZyxcIn46On5XSEVSRSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdJVEggL2lnLFwifjo6fldJVEggXCIpXHJcblxyXG5cdFx0XHRcdC8vLnJlcGxhY2UoL1xcLFxcc3swLH1cXCgvaWcsXCIsfjo6figgXCIpXHJcblx0XHRcdFx0Ly8ucmVwbGFjZSgvXFwsL2lnLFwiLH46On5cIit0YWIrdGFiK1wiXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQUxMIC9pZyxcIiBBTEwgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBUyAvaWcsXCIgQVMgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBBU0MgL2lnLFwiIEFTQyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIERFU0MgL2lnLFwiIERFU0MgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBESVNUSU5DVCAvaWcsXCIgRElTVElOQ1QgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBFWElTVFMgL2lnLFwiIEVYSVNUUyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIE5PVCAvaWcsXCIgTk9UIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gTlVMTCAvaWcsXCIgTlVMTCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIExJS0UgL2lnLFwiIExJS0UgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcc3swLH1TRUxFQ1QgL2lnLFwiU0VMRUNUIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHN7MCx9VVBEQVRFIC9pZyxcIlVQREFURSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFNFVCAvaWcsXCIgU0VUIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvfjo6fnsxLH0vZyxcIn46On5cIilcclxuXHRcdFx0XHQuc3BsaXQoJ346On4nKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuc3FsID0gZnVuY3Rpb24odGV4dCxzdGVwKSB7XHJcblxyXG5cdHZhciBhcl9ieV9xdW90ZSA9IHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXCcvaWcsXCJ+Ojp+XFwnXCIpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCd+Ojp+JyksXHJcblx0XHRsZW4gPSBhcl9ieV9xdW90ZS5sZW5ndGgsXHJcblx0XHRhciA9IFtdLFxyXG5cdFx0ZGVlcCA9IDAsXHJcblx0XHR0YWIgPSB0aGlzLnN0ZXAsLy8rdGhpcy5zdGVwLFxyXG5cdFx0aW5Db21tZW50ID0gdHJ1ZSxcclxuXHRcdGluUXVvdGUgPSBmYWxzZSxcclxuXHRcdHBhcmVudGhlc2lzTGV2ZWwgPSAwLFxyXG5cdFx0c3RyID0gJycsXHJcblx0XHRpeCA9IDAsXHJcblx0XHRzaGlmdCA9IHN0ZXAgPyBjcmVhdGVTaGlmdEFycihzdGVwKSA6IHRoaXMuc2hpZnQ7O1xyXG5cclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblx0XHRcdGlmKGl4JTIpIHtcclxuXHRcdFx0XHRhciA9IGFyLmNvbmNhdChhcl9ieV9xdW90ZVtpeF0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyID0gYXIuY29uY2F0KHNwbGl0X3NxbChhcl9ieV9xdW90ZVtpeF0sIHRhYikgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGxlbiA9IGFyLmxlbmd0aDtcclxuXHRcdGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XHJcblxyXG5cdFx0XHRwYXJlbnRoZXNpc0xldmVsID0gaXNTdWJxdWVyeShhcltpeF0sIHBhcmVudGhlc2lzTGV2ZWwpO1xyXG5cclxuXHRcdFx0aWYoIC9cXHN7MCx9XFxzezAsfVNFTEVDVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggL1xcc3swLH1cXHN7MCx9U0VUXFxzezAsfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdGFyW2l4XSA9IGFyW2l4XS5yZXBsYWNlKC9cXCwvZyxcIixcXG5cIit0YWIrdGFiK1wiXCIpXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCAvXFxzezAsfVxcKFxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7XHJcblx0XHRcdFx0ZGVlcCsrO1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcJy8uZXhlYyhhcltpeF0pICkgIHtcclxuXHRcdFx0XHRpZihwYXJlbnRoZXNpc0xldmVsPDEgJiYgZGVlcCkge1xyXG5cdFx0XHRcdFx0ZGVlcC0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHRcdGlmKHBhcmVudGhlc2lzTGV2ZWw8MSAmJiBkZWVwKSB7XHJcblx0XHRcdFx0XHRkZWVwLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciBqdW5rID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRzdHIgPSBzdHIucmVwbGFjZSgvXlxcbnsxLH0vLCcnKS5yZXBsYWNlKC9cXG57MSx9L2csXCJcXG5cIik7XHJcblx0XHRyZXR1cm4gc3RyO1xyXG59XHJcblxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUueG1sbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xyXG5cclxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcclxuXHRcdFx0XHRcdFx0XHQgICA6IHRleHQucmVwbGFjZSgvXFw8IVsgXFxyXFxuXFx0XSooLS0oW15cXC1dfFtcXHJcXG5dfC1bXlxcLV0pKi0tWyBcXHJcXG5cXHRdKilcXD4vZyxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgLnJlcGxhY2UoL1sgXFxyXFxuXFx0XXsxLH14bWxucy9nLCAnIHhtbG5zJyk7XHJcblx0cmV0dXJuICBzdHIucmVwbGFjZSgvPlxcc3swLH08L2csXCI+PFwiKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuanNvbm1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcclxuXHJcblx0aWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJyApIHJldHVybiB0ZXh0O1xyXG5cclxuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZSh0ZXh0KSwgbnVsbCwgMCk7XHJcblxyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5jc3NtaW4gPSBmdW5jdGlvbih0ZXh0LCBwcmVzZXJ2ZUNvbW1lbnRzKSB7XHJcblxyXG5cdHZhciBzdHIgPSBwcmVzZXJ2ZUNvbW1lbnRzID8gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdCAgIDogdGV4dC5yZXBsYWNlKC9cXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXiovXXxbXFxyXFxuXSkpKSpcXCorXFwvL2csXCJcIikgO1xyXG5cclxuXHRyZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xce1xcc3sxLH0vZyxcIntcIilcclxuXHRcdFx0ICAucmVwbGFjZSgvXFx9XFxzezEsfS9nLFwifVwiKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXDtcXHN7MSx9L2csXCI7XCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcL1xcKlxcc3sxLH0vZyxcIi8qXCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcKlxcL1xcc3sxLH0vZyxcIiovXCIpO1xyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5zcWxtaW4gPSBmdW5jdGlvbih0ZXh0KSB7XHJcblx0cmV0dXJuIHRleHQucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKS5yZXBsYWNlKC9cXHN7MSx9XFwoLyxcIihcIikucmVwbGFjZSgvXFxzezEsfVxcKS8sXCIpXCIpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyB2a2JlYXV0aWZ5KCk7XHJcbiIsImV4cG9ydCBjb25zdCB1cGxvYWRBcmVhSFRNTCA9IFxuICBgPGRpdiBpZD1cImRvY3VtZW50LXVwbG9hZC1jb250YWluZXJcIj5cblxuICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9jb250YWluZXJcIj5cbiAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9hcmVhXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbml0aWFsX3VwbG9hZF9tZXNzYWdlXCI+VXBsb2FkIEZpbGVzPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGlkPVwidXBsb2FkaW5nX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVfY29udGFpbmVyXCIgaWQ9XCJ1bnBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5VbnBhaXJlZCBEb2N1bWVudHM8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZmlsZXNfY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwibWVpX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1FSTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cIm1laV9saXN0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2NvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICNEQUVBRjE7IGJvcmRlci1yYWRpdXM6IDVweDtcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJ1bnBhaXJlZF9pdGVtX3JhZGlvXCIgbmFtZT1cIm1laV9yYWRpb19ncm91cFwiIHZhbHVlPVwiY3JlYXRlX21laVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IGF1dG87bWFyZ2luLWxlZnQ6IDNweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbmV3IE1FSSBmaWxlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImltYWdlX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPkltYWdlczwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVfc29ydF9uYW1lXCI+XG4gICAgICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2xpc3RcIiBpZD1cImltYWdlX2xpc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiZ2VuZXJhdGUtcGFpci1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbl9idXR0b25cIiBpZD1cIm1ha2VfcGFpclwiPk1ha2UgUGFpcjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9jb250YWluZXJcIiBpZD1cInBhaXJlZF9jb250YWluZXJcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXItdGl0bGVcIj5QYWlyZWQgRm9saW9zPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX3NvcnRfbmFtZVwiPlxuICAgICAgICAgIDxkaXY+TmFtZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3J0X25hbWUgYXJyb3dfYnRuXCI+JiN4MjJDMDs8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb2xpb19saXN0XCIgaWQ9XCJwYWlyZWRfbGlzdFwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRfYnV0dG9uX2NvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25fYnV0dG9uXCIgaWQ9XCJ1cGxvYWRfYnV0dG9uXCI+XG4gICAgICAgICAgICBVcGxvYWRcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ1cGxvYWRpbmdfc3Bpbm5lclwiPuKGuzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS1cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2NvbnRhaW5lclwiIGlkPVwibWFudXNjcmlwdHNfY29udGFpbmVyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImZpbGVfaGVhZGluZ1wiPk1hbnVzY3JpcHRzPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbGlvX2xpc3RcIiBpZD1cIm1hbnVzY3JpcHRfbGlzdFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAtLT5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3QgbmV3Rm9sZGVySFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuXG5leHBvcnQgY29uc3QgcmVuYW1lSFRNTCA9IGBcbiAgICA8ZGl2IGlkPVwicmVuYW1lX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdiBpZD1cImRhc2hib2FyZF9pbnB1dF9jb250YWluZXJcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cInJlbmFtZV9idXR0b25zX2NvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FuY2VsX2Rhc2hib2FyZFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29uZmlybV9kYXNoYm9hcmRcIj5Db25maXJtPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDsiLCIvKiogQG1vZHVsZSBXYXJuaW5ncyAqL1xuXG4vKipcbiAqIFdhcm4gd2hlbiBncm91cGVkIG5ldW1lIGNvbXBvbmVudHMgZm9ybSBhbiB1bnJlY29nbml6ZWQgbmV1bWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ05vdFJlY29nbml6ZWQgKCk6IHZvaWQge1xuICBpZiAoISh3aW5kb3cuY29uZmlybSgnTmVvbiBkb2VzIG5vdCByZWNvZ25pemUgdGhpcyBuZXVtZSBncm91cGluZy4gV291bGQgeW91IGxpa2UgdG8gY3JlYXRlIGEgY29tcG91bmQgbmV1bWU/JykpKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG8nKS5jbGljaygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCB7IHNlbGVjdEFsbCB9IGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuLi91dGlscy9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTVkdSZWxDb29yZHMgfSBmcm9tICcuLi91dGlscy9Db29yZGluYXRlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgc3RhZmYgaW50byB0d28gc3RhdmVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdFN0YWZmSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgc3RhZmY6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgc3RhZmY6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMuc3RhZmYgPSBzdGFmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgV2hlcmUgdG8gU3BsaXQnKTtcbiAgfVxuXG4gIHNwbGl0RGlzYWJsZSAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBpbnB1dCB0byBzcGxpdCBhIHN0YWZmLiAqL1xuICBoYW5kbGVyID0gKChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAvLyBGaW5kIHN0YWZmIHBvaW50IGNvcnJlc3BvbmRzIHRvIGlmIG9uZSBleGlzdHNcbiAgICAvLyBUT0RPXG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YWZmLmlkO1xuICAgIGNvbnN0IGN1cnNvciA9IGdldFNWR1JlbENvb3JkcyhldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXRBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdzcGxpdCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICB4OiBjdXJzb3IueFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLnN0YWZmJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKV0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgY29uc3QgbW9yZUVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKTtcbiAgICAgIGlmIChtb3JlRWRpdCkge1xuICAgICAgICBtb3JlRWRpdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdHMgc3BsaXQgb24gRXNjYXBlIHByZXNzLCBkaXNhYmxlcyBvbiBTaGlmdC4gKi9cbiAga2V5ZG93bkxpc3RlbmVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuc3BsaXREaXNhYmxlKCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKiBFeGl0IHNwbGl0IGlmIHVzZXIgY2xpY2tzIG9mZiBvZiBhY3RpdmUgcGFnZS4gKi9cbiAgY2xpY2thd2F5SGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5hY3RpdmUtcGFnZScpID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogQ2FsbGVkIHRvIHJlYXBwbHkgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIG5lY2Vzc2FyeS4gKi9cbiAgcmVzZXRIYW5kbGVyID0gKChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcbn1cbiIsImltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IFNwbGl0TmV1bWVBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKiBIYW5kbGUgc3BsaXR0aW5nIGEgbmV1bWUgaW50byB0d28gbmV1bWVzIHRocm91Z2ggVmVyb3Zpby4gKi9cbmV4cG9ydCBjbGFzcyBTcGxpdE5ldW1lSGFuZGxlciB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgcmVhZG9ubHkgbmV1bWU6IFNWR0dFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmV1bWUgLSBUaGUgbmV1bWUgdGhhdCB3aWxsIGJlIG1vZGlmaWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgbmV1bWU6IFNWR0dFbGVtZW50KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMubmV1bWUgPSBuZXVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBwYXJ0IG9mIHRoZSBzcGxpdCBhY3Rpb24uXG4gICAqL1xuICBzdGFydFNwbGl0ICgpOiB2b2lkIHtcbiAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleXByZXNzZXNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xpY2sgVGhlIEJlZ2lubmluZyBvZiBUaGUgU2Vjb25kIE5ldW1lJyk7XG4gIH1cblxuICBzcGxpdERpc2FibGUgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXNldEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrYXdheUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgaW5wdXQgdG8gc3BsaXQgYSBuZXVtZS4gKi9cbiAgaGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5ldW1lLmlkO1xuXG4gICAgLy8gdW5zZWxlY3QoKTtcbiAgICBcbiAgICBjb25zdCBuYyA9IChldnQudGFyZ2V0IGFzIFNWR0dFbGVtZW50KS5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IG5jSWQgPSBuYy5pZDtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogU3BsaXROZXVtZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ3NwbGl0TmV1bWUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgbmNJZDogbmNJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gc3VjY2Vzc2Z1bCcsICdzdWNjZXNzJyk7XG4gICAgICB9IFxuICAgICAgZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTcGxpdCBhY3Rpb24gZmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICAvLyB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAvLyBjb25zdCBkcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLm5ldW1lJyk7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgICAgLy8gc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKSBhcyBTVkdHRWxlbWVudF0sIHRoaXMubmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICAgIC8vIHRyeSB7XG4gICAgICAvLyAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgLy8gICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5jbGFzc0xpc3QuYWRkKCdpcy1oaWRkZW4nKTtcbiAgICAgIC8vIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSk7XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIEV4aXRzIHNwbGl0IG9uIEVzY2FwZSBwcmVzcywgZGlzYWJsZXMgb24gU2hpZnQuICovXG4gIGtleWRvd25MaXN0ZW5lciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdCBzcGxpdCBpZiB1c2VyIGNsaWNrcyBvZmYgb2YgYWN0aXZlIHBhZ2UuICovXG4gIGNsaWNrYXdheUhhbmRsZXIgPSAoKGV2dDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYWN0aXZlLXBhZ2UnKSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIENhbGxlZCB0byByZWFwcGx5IHRoZSBldmVudCBsaXN0ZW5lciBpZiBuZWNlc3NhcnkuICovXG4gIHJlc2V0SGFuZGxlciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLnRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgZ2xvYmFsLnF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBnbG9iYWwucXVldWVNaWNyb3Rhc2soZnVuYyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy9iYXNlZCBvZmYgcnN2cCBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzXG4vL2xpY2Vuc2UgaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9tYXN0ZXIvbGliL3JzdnAvYXNhcC5qc1xuXG52YXIgTXV0YXRpb24gPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTXV0YXRpb247XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb24oaGFuZGxlKTtcbiAgdmFyIGVsZW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGVsZW1lbnQuZGF0YSA9IChjYWxsZWQgPSArK2NhbGxlZCAlIDIpO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAvLyB3ZSBjYW4gb25seSBnZXQgaGVyZSBpbiBJRTEwXG4gICAgLy8gd2hpY2ggZG9lc24ndCBoYW5kZWwgcG9zdE1lc3NhZ2Ugd2VsbFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAoZnVuYykge1xuICB2YXIgY2hhbm5lbCA9IG5ldyBnbG9iYWwuTWVzc2FnZUNoYW5uZWwoKTtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gIH07XG59OyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2RvY3VtZW50JyBpbiBnbG9iYWwgJiYgJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICB2YXIgc2NyaXB0RWwgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0RWwub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlKCk7XG5cbiAgICAgIHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgIHNjcmlwdEVsID0gbnVsbDtcbiAgICB9O1xuICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpO1xuXG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uICh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCh0LCAwKTtcbiAgfTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gICAgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgICAvLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuICAgIGRlbGltcyA9IFsnPCcsICc+JywgJ1wiJywgJ2AnLCAnICcsICdcXHInLCAnXFxuJywgJ1xcdCddLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgICB1bndpc2UgPSBbJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ10uY29uY2F0KGRlbGltcyksXG5cbiAgICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gICAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gICAgLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbiAgICAvLyBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAgLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gICAgLy8gdGhlbS5cbiAgICBub25Ib3N0Q2hhcnMgPSBbJyUnLCAnLycsICc/JywgJzsnLCAnIyddLmNvbmNhdChhdXRvRXNjYXBlKSxcbiAgICBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ10sXG4gICAgaG9zdG5hbWVNYXhMZW4gPSAyNTUsXG4gICAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1dGlsLmlzT2JqZWN0KHVybCkgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSByZXR1cm4gdXJsO1xuXG4gIHZhciB1ID0gbmV3IFVybDtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICghdXRpbC5pc1N0cmluZyh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIHF1ZXJ5SW5kZXggPSB1cmwuaW5kZXhPZignPycpLFxuICAgICAgc3BsaXR0ZXIgPVxuICAgICAgICAgIChxdWVyeUluZGV4ICE9PSAtMSAmJiBxdWVyeUluZGV4IDwgdXJsLmluZGV4T2YoJyMnKSkgPyAnPycgOiAnIycsXG4gICAgICB1U3BsaXQgPSB1cmwuc3BsaXQoc3BsaXR0ZXIpLFxuICAgICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICBpZiAoIXNsYXNoZXNEZW5vdGVIb3N0ICYmIHVybC5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBmYXN0IHBhdGggcmVnZXhwXG4gICAgdmFyIHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKVxuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHRoaXMuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgICB0aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMV0gPT09ICddJztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB2YXIgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAodXRpbC5pc1N0cmluZyhvYmopKSBvYmogPSB1cmxQYXJzZShvYmopO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopO1xuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICAgIGhhc2ggPSB0aGlzLmhhc2ggfHwgJycsXG4gICAgICBob3N0ID0gZmFsc2UsXG4gICAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAgICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmXG4gICAgICB1dGlsLmlzT2JqZWN0KHRoaXMucXVlcnkpICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KTtcbiAgfVxuXG4gIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCB8fCAocXVlcnkgJiYgKCc/JyArIHF1ZXJ5KSkgfHwgJyc7XG5cbiAgaWYgKHByb3RvY29sICYmIHByb3RvY29sLnN1YnN0cigtMSkgIT09ICc6JykgcHJvdG9jb2wgKz0gJzonO1xuXG4gIC8vIG9ubHkgdGhlIHNsYXNoZWRQcm90b2NvbHMgZ2V0IHRoZSAvLy4gIE5vdCBtYWlsdG86LCB4bXBwOiwgZXRjLlxuICAvLyB1bmxlc3MgdGhleSBoYWQgdGhlbSB0byBiZWdpbiB3aXRoLlxuICBpZiAodGhpcy5zbGFzaGVzIHx8XG4gICAgICAoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbFtwcm90b2NvbF0pICYmIGhvc3QgIT09IGZhbHNlKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lO1xuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2g7XG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZU9iamVjdCA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIGlmICh1dGlsLmlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgICByZXN1bHQuaG9zdG5hbWUgJiYgIXJlc3VsdC5wYXRobmFtZSkge1xuICAgICAgcmVzdWx0LnBhdGggPSByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICAgIGlzUmVsQWJzID0gKFxuICAgICAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgICAgICByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgKSxcbiAgICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSksXG4gICAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIXV0aWwuaXNOdWxsT3JVbmRlZmluZWQocmVsYXRpdmUuc2VhcmNoKSkge1xuICAgIC8vIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAvLyBsaWtlIGhyZWY9Jz9mb28nLlxuICAgIC8vIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiZcbiAgICAgIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHwgbGFzdCA9PT0gJycpO1xuXG4gIC8vIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHNyY1BhdGgubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIGxhc3QgPSBzcmNQYXRoW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgICAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fFxuICAgICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyKDAsIGhvc3QubGVuZ3RoIC0gcG9ydC5sZW5ndGgpO1xuICB9XG4gIGlmIChob3N0KSB0aGlzLmhvc3RuYW1lID0gaG9zdDtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHVyaWxpYiA9IHJlcXVpcmUoJ3VybCcpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcblxubW9kdWxlLmV4cG9ydHMuU2NoZW1hU2NhblJlc3VsdCA9IFNjaGVtYVNjYW5SZXN1bHQ7XG5mdW5jdGlvbiBTY2hlbWFTY2FuUmVzdWx0KGZvdW5kLCByZWYpe1xuICB0aGlzLmlkID0gZm91bmQ7XG4gIHRoaXMucmVmID0gcmVmO1xufVxuXG4vKipcbiAqIEFkZHMgYSBzY2hlbWEgd2l0aCBhIGNlcnRhaW4gdXJuIHRvIHRoZSBWYWxpZGF0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gc3RyaW5nIHVyaVxuICogQHBhcmFtIG9iamVjdCBzY2hlbWFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xubW9kdWxlLmV4cG9ydHMuc2NhbiA9IGZ1bmN0aW9uIHNjYW4oYmFzZSwgc2NoZW1hKXtcbiAgZnVuY3Rpb24gc2NhblNjaGVtYShiYXNldXJpLCBzY2hlbWEpe1xuICAgIGlmKCFzY2hlbWEgfHwgdHlwZW9mIHNjaGVtYSE9J29iamVjdCcpIHJldHVybjtcbiAgICAvLyBNYXJrIGFsbCByZWZlcmVuY2VkIHNjaGVtYXMgc28gd2UgY2FuIHRlbGwgbGF0ZXIgd2hpY2ggc2NoZW1hcyBhcmUgcmVmZXJyZWQgdG8sIGJ1dCBuZXZlciBkZWZpbmVkXG4gICAgaWYoc2NoZW1hLiRyZWYpe1xuICAgICAgdmFyIHJlc29sdmVkVXJpID0gdXJpbGliLnJlc29sdmUoYmFzZXVyaSwgc2NoZW1hLiRyZWYpO1xuICAgICAgcmVmW3Jlc29sdmVkVXJpXSA9IHJlZltyZXNvbHZlZFVyaV0gPyByZWZbcmVzb2x2ZWRVcmldKzEgOiAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaWQgPSBzY2hlbWEuJGlkIHx8IHNjaGVtYS5pZDtcbiAgICB2YXIgb3VyQmFzZSA9IGlkID8gdXJpbGliLnJlc29sdmUoYmFzZXVyaSwgaWQpIDogYmFzZXVyaTtcbiAgICBpZiAob3VyQmFzZSkge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBmcmFnbWVudCwgYXBwZW5kIGFuIGVtcHR5IG9uZVxuICAgICAgaWYob3VyQmFzZS5pbmRleE9mKCcjJyk8MCkgb3VyQmFzZSArPSAnIyc7XG4gICAgICBpZihmb3VuZFtvdXJCYXNlXSl7XG4gICAgICAgIGlmKCFoZWxwZXJzLmRlZXBDb21wYXJlU3RyaWN0KGZvdW5kW291ckJhc2VdLCBzY2hlbWEpKXtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVtYSA8JytvdXJCYXNlKyc+IGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IGRlZmluaXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmRbb3VyQmFzZV07XG4gICAgICB9XG4gICAgICBmb3VuZFtvdXJCYXNlXSA9IHNjaGVtYTtcbiAgICAgIC8vIHN0cmlwIHRyYWlsaW5nIGZyYWdtZW50XG4gICAgICBpZihvdXJCYXNlW291ckJhc2UubGVuZ3RoLTFdPT0nIycpe1xuICAgICAgICBmb3VuZFtvdXJCYXNlLnN1YnN0cmluZygwLCBvdXJCYXNlLmxlbmd0aC0xKV0gPSBzY2hlbWE7XG4gICAgICB9XG4gICAgfVxuICAgIHNjYW5BcnJheShvdXJCYXNlKycvaXRlbXMnLCAoQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpP3NjaGVtYS5pdGVtczpbc2NoZW1hLml0ZW1zXSkpO1xuICAgIHNjYW5BcnJheShvdXJCYXNlKycvZXh0ZW5kcycsIChBcnJheS5pc0FycmF5KHNjaGVtYS5leHRlbmRzKT9zY2hlbWEuZXh0ZW5kczpbc2NoZW1hLmV4dGVuZHNdKSk7XG4gICAgc2NhblNjaGVtYShvdXJCYXNlKycvYWRkaXRpb25hbEl0ZW1zJywgc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyk7XG4gICAgc2Nhbk9iamVjdChvdXJCYXNlKycvcHJvcGVydGllcycsIHNjaGVtYS5wcm9wZXJ0aWVzKTtcbiAgICBzY2FuU2NoZW1hKG91ckJhc2UrJy9hZGRpdGlvbmFsUHJvcGVydGllcycsIHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgc2Nhbk9iamVjdChvdXJCYXNlKycvZGVmaW5pdGlvbnMnLCBzY2hlbWEuZGVmaW5pdGlvbnMpO1xuICAgIHNjYW5PYmplY3Qob3VyQmFzZSsnL3BhdHRlcm5Qcm9wZXJ0aWVzJywgc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKTtcbiAgICBzY2FuT2JqZWN0KG91ckJhc2UrJy9kZXBlbmRlbmNpZXMnLCBzY2hlbWEuZGVwZW5kZW5jaWVzKTtcbiAgICBzY2FuQXJyYXkob3VyQmFzZSsnL2Rpc2FsbG93Jywgc2NoZW1hLmRpc2FsbG93KTtcbiAgICBzY2FuQXJyYXkob3VyQmFzZSsnL2FsbE9mJywgc2NoZW1hLmFsbE9mKTtcbiAgICBzY2FuQXJyYXkob3VyQmFzZSsnL2FueU9mJywgc2NoZW1hLmFueU9mKTtcbiAgICBzY2FuQXJyYXkob3VyQmFzZSsnL29uZU9mJywgc2NoZW1hLm9uZU9mKTtcbiAgICBzY2FuU2NoZW1hKG91ckJhc2UrJy9ub3QnLCBzY2hlbWEubm90KTtcbiAgfVxuICBmdW5jdGlvbiBzY2FuQXJyYXkoYmFzZXVyaSwgc2NoZW1hcyl7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkoc2NoZW1hcykpIHJldHVybjtcbiAgICBmb3IodmFyIGk9MDsgaTxzY2hlbWFzLmxlbmd0aDsgaSsrKXtcbiAgICAgIHNjYW5TY2hlbWEoYmFzZXVyaSsnLycraSwgc2NoZW1hc1tpXSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNjYW5PYmplY3QoYmFzZXVyaSwgc2NoZW1hcyl7XG4gICAgaWYoIXNjaGVtYXMgfHwgdHlwZW9mIHNjaGVtYXMhPSdvYmplY3QnKSByZXR1cm47XG4gICAgZm9yKHZhciBwIGluIHNjaGVtYXMpe1xuICAgICAgc2NhblNjaGVtYShiYXNldXJpKycvJytwLCBzY2hlbWFzW3BdKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZm91bmQgPSB7fTtcbiAgdmFyIHJlZiA9IHt9O1xuICBzY2FuU2NoZW1hKGJhc2UsIHNjaGVtYSk7XG4gIHJldHVybiBuZXcgU2NoZW1hU2NhblJlc3VsdChmb3VuZCwgcmVmKTtcbn07XG4iLCIvKiogQG1vZHVsZSB1dGlscy9TZWxlY3QgKi9cblxuaW1wb3J0IHsgdW5zZWxlY3QsIGdldFN0YWZmQkJveCwgc2VsZWN0U3RhZmYsIHNlbGVjdEFsbCwgZ2V0U2VsZWN0aW9uVHlwZSB9IGZyb20gJy4vU2VsZWN0VG9vbHMnO1xuaW1wb3J0IHsgcmVzaXplIH0gZnJvbSAnLi9SZXNpemUnO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcbmltcG9ydCB7IEluZm9JbnRlcmZhY2UgfSBmcm9tICcuLi9JbnRlcmZhY2VzJztcbmltcG9ydCBab29tSGFuZGxlciBmcm9tICcuLi9TaW5nbGVWaWV3L1pvb20nO1xuXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBCQm94LCBnZXRTdGFmZkJ5Q29vcmRzLCBQb2ludCB9IGZyb20gJy4vQ29vcmRpbmF0ZXMnO1xuXG5sZXQgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLCBuZW9uVmlldzogTmVvblZpZXcsIGluZm86IEluZm9JbnRlcmZhY2UsIHpvb21IYW5kbGVyOiBab29tSGFuZGxlcjtcbmxldCBzdHJva2VXaWR0aCA9IDc7XG5cbi8qKlxuICogU2V0IHN0cm9rZSB3aWR0aCBvbiBkcmFnIHNlbGVjdCBib3guXG4gKiBAcGFyYW0gd2lkdGggLSBTdHJva2Ugd2lkdGggaW4gcGl4ZWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0U3Ryb2tlV2lkdGggKHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgc3Ryb2tlV2lkdGggPSB3aWR0aDtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIG9iamVjdHMgZm9yIHRoaXMgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0SGVscGVyT2JqZWN0cyAobnY6IE5lb25WaWV3LCBkaDogRHJhZ0hhbmRsZXIpOiB2b2lkIHtcbiAgZHJhZ0hhbmRsZXIgPSBkaDtcbiAgbmVvblZpZXcgPSBudjtcbiAgaW5mbyA9IG5lb25WaWV3LmluZm87XG4gIHpvb21IYW5kbGVyID0gbmVvblZpZXcudmlldy56b29tSGFuZGxlcjtcbn1cblxuZnVuY3Rpb24gZXNjYXBlS2V5TGlzdGVuZXIgKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICBpZiAoZXZ0LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKS5sZW5ndGggPiAwKSB7XG4gICAgICBpbmZvLmluZm9MaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgdW5zZWxlY3QoKTtcbiAgfVxufVxuXG4vLyBFTlRFUiBLRVk6IHdoZW4gYSBCQm94IGlzIHNlbGVjdGVkLCBwcmVzc2luZyBlbnRlciB3aWxsXG4vLyAgIHRyaWdnZXIgdGhlIGVkaXQgc3lsbGFibGUgdGV4dCBmdW5jdGlvbi5cbmZ1bmN0aW9uIGVudGVyS2V5TGlzdGVuZXIgKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAvLyBjaGVjayBpZiAnZW50ZXInIGlzIHByZXNzZWQgd2l0aCB0aGUgY29ycmVjdCBjb25kaXRpb25zXG4gIGlmIChnZXRTZWxlY3Rpb25UeXBlKCkgIT09ICdzZWxCeUJCb3gnXG4gICAgfHwgIShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheVRleHQnKSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkXG4gICAgfHwgZXZ0LmtleSAhPT0gJ0VudGVyJ1xuICApXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG5cbiAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBzeWxsYWJsZSBzZWxlY3RlZFxuICBpZiAoc2VsZWN0ZWQpIHtcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc3Bhbi4nICsgc2VsZWN0ZWQuaWQpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgLy8gd2Ugc2ltdWxhdGUgYSBjbGljayBiZWNhdXNlIHRoZSBtZXRob2QgYHVwZGF0ZVN5bFRleHQoKWAgaXMgb25seVxuICAgIC8vIGFjY2Vzc2libGUgaW5zaWRlIFRleHRFZGl0TW9kZTsgdGhlIHNwYW4gaGFzIGFuIGV2ZW50IGxpc3RlbmVyIGZvclxuICAgIC8vIGNsaWNrcy5cbiAgICBzcGFuLmNsaWNrKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXJyb3dLZXlMaXN0ZW5lciAoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIGlmIChnZXRTZWxlY3Rpb25UeXBlKCkgIT09ICdzZWxCeUJCb3gnIHx8IChldnQua2V5ICE9PSAnQXJyb3dMZWZ0JyAmJiBldnQua2V5ICE9PSAnQXJyb3dSaWdodCcgJiYgZXZ0LmtleSAhPT0gJ1RhYicgJiYgZXZ0LnNoaWZ0S2V5KSlcbiAgICByZXR1cm47XG4gIGV2dC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IGRlZmF1bHQgZm9yIHRhYiBrZXlcbiAgXG4gIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG4gIGNvbnN0IHN5bGxhYmxlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN5bGxhYmxlJykpO1xuXG4gIC8vIG5vdCBhbGwgc3lsbGFibGVzIGhhdmUgQkJveGVzOyB3ZSBtdXN0IGZpbHRlciB0aGVtIG91dFxuICBjb25zdCBiYm94U3lsbGFibGVzID0gc3lsbGFibGVzLmZpbHRlcihzeWwgPT4gc3lsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykgIT09IG51bGwpO1xuICBjb25zdCBpbmQgPSBiYm94U3lsbGFibGVzLmluZGV4T2Yoc2VsZWN0ZWQpO1xuXG4gIGlmICgoZXZ0LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgKGV2dC5rZXkgPT09ICdUYWInICYmIGV2dC5zaGlmdEtleSkpICYmIGluZCA+IDApIHtcbiAgICB1bnNlbGVjdCgpO1xuXG4gICAgY29uc3QgYmJveCA9IGJib3hTeWxsYWJsZXNbaW5kIC0gMV0ucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICBzZWxlY3RBbGwoW2Jib3ggYXMgU1ZHR3JhcGhpY3NFbGVtZW50XSwgbmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgfSBlbHNlIGlmICgoZXZ0LmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IChldnQua2V5ID09PSAnVGFiJyAmJiAhZXZ0LnNoaWZ0S2V5KSkgJiYgaW5kIDwgYmJveFN5bGxhYmxlcy5sZW5ndGggLSAxKSB7XG4gICAgdW5zZWxlY3QoKTtcblxuICAgIGNvbnN0IGJib3ggPSBiYm94U3lsbGFibGVzW2luZCArIDFdLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgc2VsZWN0QWxsKFtiYm94IGFzIFNWR0dyYXBoaWNzRWxlbWVudF0sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gIH1cbiAgXG4gIC8vIEF1dG8gc2Nyb2xsIHRvIGhpZ2hsaWdodGVkIHRleHRcbiAgY29uc3Qgc2VsZWN0ZWRTeWxUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRleHQtc2VsZWN0Jyk7XG4gIGlmIChzZWxlY3RlZFN5bFRleHQpIHtcbiAgICBzZWxlY3RlZFN5bFRleHQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTZWxCeUJCb3ggKCk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWxCeUJCb3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94Jyk7XG4gIGlmIChzZWxCeUJCb3gpIHtcbiAgICByZXR1cm4gc2VsQnlCQm94LmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzdG9wUHJvcEhhbmRsZXIgKGV2dDogRXZlbnQpOiB2b2lkIHsgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOyB9XG5cbi8qKlxuICogR2V0IGJvdW5kaW5nIGJveCBvZiBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldEJCb3hDb29yZHMgKGVsOiBTVkdHcmFwaGljc0VsZW1lbnQpOiBCQm94IHtcbiAgaWYgKGlzU2VsQnlCQm94KCkpIHtcbiAgICBjb25zdCB1bHggPSBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCd4JykpLCB1bHkgPSBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCd5JykpO1xuICAgIC8vIFdoYXQgaXMgdGhlIG1hdGggaGVyZT8/P1xuICAgIGNvbnN0IGxyeCA9IHVseCArIE51bWJlcigoZWwuZ2V0QXR0cmlidXRlKCd3aWR0aCcpLnNsaWNlKDAsIC0yKSkpO1xuICAgIGNvbnN0IGxyeSA9IHVseSArIE51bWJlcigoZWwuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKS5zbGljZSgwLCAtMikpKTtcblxuICAgIHJldHVybiB7IHVseCwgdWx5LCBscngsIGxyeSB9O1xuICB9XG5cbiAgaWYgKGVsLnRhZ05hbWUgPT09ICd1c2UnKSB7XG4gICAgY29uc3QgcmVjdCA9IChlbC5wYXJlbnROb2RlIGFzIFNWR0dFbGVtZW50KS5nZXRCQm94KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWx4OiByZWN0LngsXG4gICAgICB1bHk6IHJlY3QueSxcbiAgICAgIGxyeDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICAgIGxyeTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGdldFN0YWZmQkJveChlbCk7XG59XG5cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIHdpdGhpbiB0aGUgZHJhZyBzZWxlY3Rpb24gcmVjdGFuZ2xlLlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIGB1bGAgKHVwcGVyIGxlZnQpIGFuZCBgbHJgIChsb3dlciByaWdodClcbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50SW5SZWN0KGVsOiBTVkdHcmFwaGljc0VsZW1lbnQsIHVsOiBQb2ludCwgbHI6IFBvaW50KTogYm9vbGVhbiB7XG4gIGlmIChpc1NlbEJ5QkJveCgpIHx8IGVsLnRhZ05hbWUgPT09ICd1c2UnKSB7XG4gICAgY29uc3QgYmJveCA9IGdldEJCb3hDb29yZHMoZWwpO1xuICAgIFxuICAgIC8vIFdlIHdhbnQgdG8gZmluZCB3aGV0aGVyIHRoZSBib3VuZGluZyBib3ggb3ZlcmxhcHMgd2l0aCB0aGUgcmVjdGFuZ2xlXG4gICAgLy8gZGVmaW5lZCBieSBgdWxgIGFuZCBgbHJgLiBUaGUgZWFzaWVzdCBzb2x1dGlvbiBpcyB0byBuZWdhdGUgYSBzdW0tb2YtcHJvZHVjdHMgZXF1YXRpb246XG4gICAgLy8gaS5lLiwgdGhlcmUgYXJlIDQgcG9zc2liaWxpdGllcyBpbiB3aGljaCB0aGUgdHdvICpkb24ndCogb3ZlcmxhcFxuICAgIHJldHVybiAhKGxyLnggPCBiYm94LnVseCB8fCB1bC54ID4gYmJveC5scnggfHwgbHIueSA8IGJib3gudWx5IHx8IHVsLnkgPiBiYm94LmxyeSk7XG4gIH1cblxuICAvLyBUT0RPOiBTaW1wbGlmeVxuICBjb25zdCBib3ggPSBnZXRTdGFmZkJCb3goZWwpO1xuICByZXR1cm4gISgodWwueCA8IGJveC51bHggJiYgbHIueCA8IGJveC51bHgpIHx8ICh1bC54ID4gYm94LmxyeCAmJiBsci54ID4gYm94LmxyeCkgfHxcbiAgICAgICAgICAodWwueSA8IChib3gudWx5ICsgTWF0aC5hYnMoYm94LnVseCAtIHVsLngpICogTWF0aC50YW4oYm94LnJvdGF0ZSkpICYmXG4gICAgICAgICAgICBsci55IDwgKGJveC51bHkgKyBNYXRoLmFicyhib3gudWx4IC0gdWwueCkgKiBNYXRoLnRhbihib3gucm90YXRlKSkpIHx8XG4gICAgICAgICAgKHVsLnkgPiAoYm94LmxyeSArIE1hdGguYWJzKGJveC5scnkgLSBsci55KSAqIE1hdGgudGFuKGJveC5yb3RhdGUpKSAmJlxuICAgICAgICAgICAgbHIueSA+IChib3gubHJ5ICsgTWF0aC5hYnMoYm94LmxyeSAtIGxyLnkpICogTWF0aC50YW4oYm94LnJvdGF0ZSkpKSk7XG59XG5cbi8qKlxuICogQXBwbHkgbGlzdGVuZXJzIGZvciBjbGljayBzZWxlY3Rpb24uXG4gKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIHVzZWQgdG8gY2hvb3NlIHdoZXJlIGxpc3RlbmVycyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsaWNrU2VsZWN0IChzZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpLmZvckVhY2goc2VsID0+IHtcbiAgICBzZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2xpY2tIYW5kbGVyKTtcbiAgICBzZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2xpY2tIYW5kbGVyKTtcbiAgfSk7XG5cbiAgLy8gQ2xpY2sgYXdheSBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjYXBlS2V5TGlzdGVuZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlc2NhcGVLZXlMaXN0ZW5lcik7XG5cbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZW50ZXJLZXlMaXN0ZW5lcik7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVudGVyS2V5TGlzdGVuZXIpO1xuXG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGFycm93S2V5TGlzdGVuZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBhcnJvd0tleUxpc3RlbmVyKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZXZ0KSA9PiB7IGV2dC5wcmV2ZW50RGVmYXVsdCgpOyB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd1c2UscmVjdCwjbW9yZUVkaXQnKS5mb3JFYWNoKHNlbCA9PiB7XG4gICAgc2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3RvcFByb3BIYW5kbGVyKTtcbiAgICBzZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdG9wUHJvcEhhbmRsZXIpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgY2xpY2sgZXZlbnRzIHJlbGF0ZWQgdG8gZWxlbWVudCBzZWxlY3Rpb24uXG4gKi9cblxuLy8gVGhlIGB0aGlzYCBrZXl3b3JkIGNhbiBiZSBcInBhc3NlZFwiIGFzIGEgZmFrZSBwYXJhbWV0ZXIgc28gdGhhdCB3ZSBjYW4gdHlwZSBpdCBjb3JyZWN0bHlcbi8vIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZnVuY3Rpb25zLmh0bWwjZGVjbGFyaW5nLXRoaXMtaW4tYS1mdW5jdGlvblxuZnVuY3Rpb24gY2xpY2tIYW5kbGVyICh0aGlzOiBTVkdHcmFwaGljc0VsZW1lbnQsIGV2dDogTW91c2VFdmVudCk6IHZvaWQge1xuICAvLyBSZXR1cm4gaWYgdXNlciBpcyBpbiBpbnNlcnQgbW9kZSBvciBwYW5uaW5nIGlzIGFjdGl2ZSBmcm9tIHNoaWZ0IGtleVxuICBpZiAoIW5lb25WaWV3IHx8IG5lb25WaWV3LmdldFVzZXJNb2RlKCkgPT09ICdpbnNlcnQnIHx8IGV2dC5zaGlmdEtleSlcbiAgICByZXR1cm47XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBjdHJsL2NtZCBrZXkgaGFzIGJlZW4gc2VsZWN0ZWRcbiAgZnVuY3Rpb24gaXNNdWx0aVNlbGVjdCAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NYWMvKSA/IGV2dC5tZXRhS2V5IDogZXZ0LmN0cmxLZXk7XG4gIH1cblxuICAvLyBJZiB1c2VyIGhhcyBjbGlja2VkIGEgbGF5ZXIgZWxlbWVudFxuICBpZiAodGhpcy50YWdOYW1lID09PSAndXNlJyAmJiBnZXRTZWxlY3Rpb25UeXBlKCkgIT09ICdzZWxCeUJCb3gnKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpIHtcbiAgICAgIGxldCBzZWxlY3Rpb246IFNWR0dyYXBoaWNzRWxlbWVudFtdID0gW3RoaXNdO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHBhcnQgb2YgYSBsaWdhdHVyZSBhbmQsIGlmIHNvLCBhZGQgYWxsIG9mIGl0IHRvIHRoZSBzZWxlY3Rpb24uXG4gICAgICBjb25zdCBmaXJzdExpZ2F0dXJlSGFsZiA9IC9FOUJbNDU2NzhdLztcbiAgICAgIGNvbnN0IHNlY29uZExpZ2F0dXJlSGFsZiA9IC9FOUJbOUFCQ10vO1xuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykubWF0Y2goc2Vjb25kTGlnYXR1cmVIYWxmKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcGFydCBvZiBhIGxpZ2F0dXJlXG4gICAgICAgIGNvbnN0IG5jID0gdGhpcy5jbG9zZXN0KCcubmMnKTtcbiAgICAgICAgY29uc3QgbmV1bWUgPSB0aGlzLmNsb3Nlc3QoJy5uZXVtZScpO1xuICAgICAgICBjb25zdCBuY0luZGV4ID0gQXJyYXkuZnJvbShuZXVtZS5jaGlsZHJlbikuaW5kZXhPZihuYyk7XG4gICAgICAgIGNvbnN0IGZpcnN0VXNlID0gbmV1bWUuY2hpbGRyZW5bbmNJbmRleCAtIDFdLmNoaWxkcmVuWzBdIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgICAgY29uc29sZS5hc3NlcnQoZmlyc3RVc2UuZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykubWF0Y2goZmlyc3RMaWdhdHVyZUhhbGYpLCAnRmlyc3QgZ2x5cGggb2YgbGlnYXR1cmUgdW5leHBlY3RlZCEnKTtcblxuICAgICAgICBpZiAoZmlyc3RVc2UuY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpIHtcbiAgICAgICAgICBzZWxlY3Rpb24udW5zaGlmdChmaXJzdFVzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnKS5tYXRjaChmaXJzdExpZ2F0dXJlSGFsZikpIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFydCBvZiBhIGxpZ2F0dXJlXG4gICAgICAgIGNvbnN0IG5jID0gdGhpcy5jbG9zZXN0KCcubmMnKTtcbiAgICAgICAgY29uc3QgbmV1bWUgPSB0aGlzLmNsb3Nlc3QoJy5uZXVtZScpO1xuICAgICAgICBjb25zdCBuY0luZGV4ID0gQXJyYXkuZnJvbShuZXVtZS5jaGlsZHJlbikuaW5kZXhPZihuYyk7XG4gICAgICAgIGNvbnN0IHNlY29uZFVzZSA9IG5ldW1lLmNoaWxkcmVuW25jSW5kZXggKyAxXS5jaGlsZHJlblswXSBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIGNvbnNvbGUuYXNzZXJ0KHNlY29uZFVzZS5nZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnKS5tYXRjaChzZWNvbmRMaWdhdHVyZUhhbGYpLCAnU2Vjb25kIGdseXBoIG9mIGxpZ2F0dXJlIHVuZXhwZWN0ZWQhJyk7XG5cbiAgICAgICAgaWYgKHNlY29uZFVzZS5jbG9zZXN0KCcuc2VsZWN0ZWQnKSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNlbGVjdGlvbi5wdXNoKHNlY29uZFVzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzTXVsdGlTZWxlY3QoKSkge1xuICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb24uY29uY2F0KEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJykpKTtcbiAgICAgIH1cblxuICAgICAgc2VsZWN0QWxsKHNlbGVjdGlvbiwgbmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgaWYgKGRyYWdIYW5kbGVyKSB7XG4gICAgICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKGlzTXVsdGlTZWxlY3QoKSkge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25Nb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlbC1ieSAuaXMtYWN0aXZlJykuaWQ7XG4gICAgICAgIGNvbnN0IG1vZGVUb0NsYXNzID0ge1xuICAgICAgICAgIHNlbEJ5U3RhZmY6ICcuc3RhZmYnLFxuICAgICAgICAgIHNlbEJ5TmV1bWU6ICcubmV1bWUnLFxuICAgICAgICAgIHNlbEJ5TmM6ICcubmMnLFxuICAgICAgICAgIHNlbEJ5TGF5ZXJFbGVtZW50OiAnLmFjY2lkJyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDbGFzcyA9IG1vZGVUb0NsYXNzW3NlbGVjdGlvbk1vZGVdIHx8ICcuc3lsbGFibGUnO1xuICAgICAgICBjb25zdCByZW1vdmUgPSBbdGhpcy5jbG9zZXN0KHNlbGVjdGVkQ2xhc3MpXTtcblxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gW107XG4gICAgICAgIHNlbGVjdGlvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiAhcmVtb3ZlLmluY2x1ZGVzKGVsKSk7XG5cbiAgICAgICAgc2VsZWN0QWxsKHNlbGVjdGlvbiwgbmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgICBpZiAoZHJhZ0hhbmRsZXIpIHtcbiAgICAgICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lID09PSAncmVjdCcgJiYgZ2V0U2VsZWN0aW9uVHlwZSgpID09PSAnc2VsQnlCQm94Jykge1xuICAgIGlmICh0aGlzLmNsb3Nlc3QoJy5zZWxlY3RlZCcpID09PSBudWxsKSB7XG4gICAgICBsZXQgc2VsZWN0aW9uID0gW2V2dC50YXJnZXRdIGFzIFNWR0dFbGVtZW50W107XG4gICAgICBpZiAoaXNNdWx0aVNlbGVjdCgpKSB7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb25jYXQoQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKSBhcyBTVkdHRWxlbWVudFtdKTtcbiAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLm1hcCggKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLnRhZ05hbWUgPT0gJ3JlY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtRGlzcGxheScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdEFsbChzZWxlY3Rpb24sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICBpZiAoZHJhZ0hhbmRsZXIpIHtcbiAgICAgICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHNlbGVjdGlvbiA9IFtdO1xuICAgICAgaWYgKGlzTXVsdGlTZWxlY3QoKSkge1xuICAgICAgICBjb25zdCByZW1vdmUgPSBbdGhpc107XG4gICAgICAgIHNlbGVjdGlvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5tYXAoIChlbCkgPT4ge1xuICAgICAgICAgIGlmIChlbC50YWdOYW1lID09ICdyZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LURpc3BsYXknKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maWx0ZXIoIChlbCkgPT4ge1xuICAgICAgICAgIHJldHVybiAhcmVtb3ZlLmluY2x1ZGVzKGVsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGVjdEFsbChzZWxlY3Rpb24sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICAgIGlmIChkcmFnSGFuZGxlcikge1xuICAgICAgICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGdldFNlbGVjdGlvblR5cGUoKSAhPT0gJ3NlbEJ5U3RhZmYnKSB7XG4gICAgICBpbmZvLmluZm9MaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcG9pbnQgaXMgaW4gYSBzdGFmZi5cbiAgICBpZiAoIWlzTXVsdGlTZWxlY3QoKSlcbiAgICAgIHVuc2VsZWN0KCk7XG5cbiAgICAvLyBTZWxlY3QgYSBzdGFmZlxuICAgIGNvbnN0IHN0YWZmID0gZ2V0U3RhZmZCeUNvb3JkcyhldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIFxuICAgIGlmICghc3RhZmYpIHJldHVybjtcblxuICAgIGlmICghc3RhZmYuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICAvLyBTZWxlY3QgcHJldmlvdXNseSB1bnNlbGVjdGVkIHN0YWZmXG4gICAgICBzZWxlY3RTdGFmZihzdGFmZiwgZHJhZ0hhbmRsZXIpO1xuICAgICAgcmVzaXplKHN0YWZmLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgaWYgKGRyYWdIYW5kbGVyKSB7XG4gICAgICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRyaWdnZXIgbW91c2Vkb3duIGV2ZW50IG9uIHRoZSBzdGFmZlxuICAgIHN0YWZmLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicsIHtcbiAgICAgIHNjcmVlblg6IGV2dC5zY3JlZW5YLFxuICAgICAgc2NyZWVuWTogZXZ0LnNjcmVlblksXG4gICAgICBjbGllbnRYOiBldnQuY2xpZW50WCxcbiAgICAgIGNsaWVudFk6IGV2dC5jbGllbnRZLFxuICAgICAgY3RybEtleTogZXZ0LmN0cmxLZXksXG4gICAgICBzaGlmdEtleTogZXZ0LnNoaWZ0S2V5LFxuICAgICAgYWx0S2V5OiBldnQuYWx0S2V5LFxuICAgICAgbWV0YUtleTogZXZ0Lm1ldGFLZXksXG4gICAgICB2aWV3OiBldnQudmlld1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIEFwcGx5IGxpc3RlbmVycyBmb3IgZHJhZyBzZWxlY3Rpb24uXG4gKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIHVzZWQgdG8gY2hvb3NlIHdoZXJlIGxpc3RlbmVycyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYWdTZWxlY3QgKHNlbGVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IGluaXRpYWxYID0gMDtcbiAgbGV0IGluaXRpYWxZID0gMDtcbiAgbGV0IHBhbm5pbmcgPSBmYWxzZTtcbiAgbGV0IGRyYWdTZWxlY3RpbmcgPSBmYWxzZTtcbiAgLy8gdmFyIGNhbnZhcyA9IGQzLnNlbGVjdCgnI3N2Z19ncm91cCcpO1xuXG4gIGNvbnN0IGNhbnZhcyA9IGQzLnNlbGVjdChzZWxlY3Rvcik7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcG9pbnQgaXMgaW4gdGhlIGJvdW5kcyBvZiBhIHN0YWZmIGVsZW1lbnQuXG4gICAqIFJvdGF0ZSBpcyBub3QgdGFrZW4gaW50byBhY2NvdW50LlxuICAgKi9cbiAgZnVuY3Rpb24gcG9pbnROb3RJblN0YWZmIChwdDogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF2ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3N0YWZmJykpO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gc3RhdmVzLmZpbHRlcigoc3RhZmY6IFNWR0dFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBiYm94ID0gZ2V0U3RhZmZCQm94KHN0YWZmKTtcbiAgICAgIGNvbnN0IHVseCA9IGJib3gudWx4O1xuICAgICAgY29uc3QgdWx5ID0gYmJveC51bHk7XG4gICAgICBjb25zdCBscnggPSBiYm94LmxyeDtcbiAgICAgIGNvbnN0IGxyeSA9IGJib3gubHJ5O1xuICAgICAgY29uc3Qgcm90YXRlID0gYmJveC5yb3RhdGU7XG5cbiAgICAgIHJldHVybiAocHRbMF0gPiB1bHggJiYgcHRbMF0gPCBscngpICYmXG4gICAgICAgIChwdFsxXSA+ICh1bHkgKyAocHRbMF0gLSB1bHgpICogTWF0aC50YW4ocm90YXRlKSkpICYmXG4gICAgICAgIChwdFsxXSA8IChscnkgLSAobHJ4IC0gcHRbMF0pICogTWF0aC50YW4ocm90YXRlKSkpO1xuICAgIH0pO1xuICAgIHJldHVybiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbml0aWFsIGRyYWdnaW5nIHJlY3RhbmdsZS5cbiAgICAgKiBAcGFyYW0gdWx4IC0gVGhlIHVwcGVyIGxlZnQgeC1wb3NpdGlvbiBvZiB0aGUgbmV3IHJlY3RhbmdsZS5cbiAgICAgKiBAcGFyYW0gdWx5IC0gVGhlIHVwcGVyIGxlZnQgeS1wb3NpdGlvbiBvZiB0aGUgbmV3IHJlY3RhbmdsZS5cbiAgICAgKi9cbiAgZnVuY3Rpb24gaW5pdFJlY3QgKHVseDogbnVtYmVyLCB1bHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNhbnZhcy5hcHBlbmQoJ3JlY3QnKVxuICAgICAgLmF0dHIoJ3gnLCB1bHgpXG4gICAgICAuYXR0cigneScsIHVseSlcbiAgICAgIC5hdHRyKCd3aWR0aCcsIDApXG4gICAgICAuYXR0cignaGVpZ2h0JywgMClcbiAgICAgIC5hdHRyKCdpZCcsICdzZWxlY3RSZWN0JylcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsU3RhcnQgKCk6IHZvaWQge1xuICAgIGlmICghbmVvblZpZXcpIHJldHVybjtcbiAgICBjb25zdCB1c2VyTW9kZSA9IG5lb25WaWV3LmdldFVzZXJNb2RlKCk7XG4gICAgaWYgKGQzLmV2ZW50LnNvdXJjZUV2ZW50LnRhcmdldC5ub2RlTmFtZSAhPT0gJ3VzZScgJiYgdXNlck1vZGUgIT09ICdpbnNlcnQnICYmIGQzLmV2ZW50LnNvdXJjZUV2ZW50LnRhcmdldC5ub2RlTmFtZSAhPT0gJ3JlY3QnKSB7XG4gICAgICBpZiAoIWQzLmV2ZW50LnNvdXJjZUV2ZW50LnNoaWZ0S2V5KSB7IC8vIElmIG5vdCBob2xkaW5nIGRvd24gc2hpZnQga2V5IHRvIHBhblxuICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeVN0YWZmJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSB8fFxuICAgICAgICAgIHBvaW50Tm90SW5TdGFmZihkMy5tb3VzZSh0aGlzKSkpIHtcbiAgICAgICAgICB1bnNlbGVjdCgpO1xuICAgICAgICAgIGRyYWdTZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IGluaXRpYWxQID0gZDMubW91c2UodGhpcyk7XG4gICAgICAgICAgaW5pdGlhbFggPSBpbml0aWFsUFswXTtcbiAgICAgICAgICBpbml0aWFsWSA9IGluaXRpYWxQWzFdO1xuICAgICAgICAgIGluaXRSZWN0KGluaXRpYWxYLCBpbml0aWFsWSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhbm5pbmcgPSB0cnVlO1xuICAgICAgICBpZiAoem9vbUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHpvb21IYW5kbGVyLnN0YXJ0RHJhZygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkMy5ldmVudC5zb3VyY2VFdmVudC5zaGlmdEtleSkge1xuICAgICAgcGFubmluZyA9IHRydWU7XG4gICAgICBpZiAoem9vbUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB6b29tSGFuZGxlci5zdGFydERyYWcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGRyYWdnaW5nIHJlY3RhbmdsZS5cbiAgICAgKiBAcGFyYW0gbmV3WCAtIFRoZSBuZXcgdWx4LlxuICAgICAqIEBwYXJhbSBuZXdZIC0gVGhlIG5ldyB1bHkuXG4gICAgICogQHBhcmFtIGN1cnJlbnRXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0gY3VycmVudEhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBpbiBwaXhlbHMuXG4gICAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVJlY3QgKG5ld1g6IG51bWJlciwgbmV3WTogbnVtYmVyLCBjdXJyZW50V2lkdGg6IG51bWJlciwgY3VycmVudEhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgZDMuc2VsZWN0KCcjc2VsZWN0UmVjdCcpXG4gICAgICAuYXR0cigneCcsIG5ld1gpXG4gICAgICAuYXR0cigneScsIG5ld1kpXG4gICAgICAuYXR0cignd2lkdGgnLCBjdXJyZW50V2lkdGgpXG4gICAgICAuYXR0cignaGVpZ2h0JywgY3VycmVudEhlaWdodCk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbGVtZW50c0J5U2VsZWN0b3IgKHNlbGVjdG9yOiBzdHJpbmcpOiBTVkdHcmFwaGljc0VsZW1lbnRbXSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeVN0YWZmJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSlcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IgKyAnIHVzZSwgJyArIHNlbGVjdG9yICsgJyAuc3RhZmYnKSk7XG5cbiAgICBpZiAoaXNTZWxCeUJCb3goKSlcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IgKyAnIC5zeWxUZXh0UmVjdC1kaXNwbGF5JykpO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciArICcgdXNlJykpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW5nICgpOiB2b2lkIHtcbiAgICBpZiAoIXBhbm5pbmcgJiYgZHJhZ1NlbGVjdGluZykge1xuICAgICAgY29uc3QgY3VycmVudFB0ID0gZDMubW91c2UodGhpcyk7XG4gICAgICBjb25zdCBjdXJYID0gY3VycmVudFB0WzBdO1xuICAgICAgY29uc3QgY3VyWSA9IGN1cnJlbnRQdFsxXTtcblxuICAgICAgY29uc3QgbmV3WCA9IGN1clggPCBpbml0aWFsWCA/IGN1clggOiBpbml0aWFsWDtcbiAgICAgIGNvbnN0IG5ld1kgPSBjdXJZIDwgaW5pdGlhbFkgPyBjdXJZIDogaW5pdGlhbFk7XG4gICAgICBjb25zdCB3aWR0aCA9IGN1clggPCBpbml0aWFsWCA/IGluaXRpYWxYIC0gY3VyWCA6IGN1clggLSBpbml0aWFsWDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGN1clkgPCBpbml0aWFsWSA/IGluaXRpYWxZIC0gY3VyWSA6IGN1clkgLSBpbml0aWFsWTtcblxuICAgICAgdXBkYXRlUmVjdChuZXdYLCBuZXdZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2UgaWYgKHBhbm5pbmcpIHtcbiAgICAgIGlmICh6b29tSGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHpvb21IYW5kbGVyLmRyYWdnaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsRW5kICgpOiB2b2lkIHtcbiAgICBpZiAoIXBhbm5pbmcgJiYgZHJhZ1NlbGVjdGluZykge1xuICAgICAgY29uc3Qgc2VsZWN0UmVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxlY3RSZWN0Jyk7XG4gICAgICBjb25zdCByeCA9IHBhcnNlSW50KHNlbGVjdFJlY3QuZ2V0QXR0cmlidXRlKCd4JykpO1xuICAgICAgY29uc3QgcnkgPSBwYXJzZUludChzZWxlY3RSZWN0LmdldEF0dHJpYnV0ZSgneScpKTtcbiAgICAgIGNvbnN0IGx4ID0gcnggKyBwYXJzZUludChzZWxlY3RSZWN0LmdldEF0dHJpYnV0ZSgnd2lkdGgnKSk7XG4gICAgICBjb25zdCBseSA9IHJ5ICsgcGFyc2VJbnQoc2VsZWN0UmVjdC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHRvIHRoZSBjb3JyZWN0IGNvb3JkaW5hdGUgc3lzdGVtXG4gICAgICBjb25zdCBub2RlID0gY2FudmFzLm5vZGUoKSBhcyBTVkdTVkdFbGVtZW50O1xuICAgICAgbGV0IHVsID0gbmV3IERPTVBvaW50KHJ4LCByeSksIGxyID0gbmV3IERPTVBvaW50KGx4LCBseSk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSBub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKVxuICAgICAgICAubXVsdGlwbHkoKGNhbnZhcy5zZWxlY3QoJy5zeXN0ZW0nKS5ub2RlKCkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50KS5nZXRTY3JlZW5DVE0oKSlcbiAgICAgICAgLmludmVyc2UoKTtcbiAgICAgIHVsID0gdWwubWF0cml4VHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICBsciA9IGxyLm1hdHJpeFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuXG4gICAgICAvLyBHZXQgYWxsIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdG9yXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAvLyBHZXQgdGhlIGVsZW1lbnRzIHdpdGhpbiB0aGUgc2VsZWN0aW9uIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGVsZW1lbnRzLmZpbHRlcihlbCA9PiBpc0VsZW1lbnRJblJlY3QoZWwsIHVsLCBscikpO1xuXG4gICAgICAvLyBHZXQgb3RoZXIgaGFsdmVzIG9mIGxpZ2F0dXJlcyBpZiBvbmx5IG9uZSBpcyBzZWxlY3RlZFxuICAgICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBTVkdFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICd1c2UnICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykubWF0Y2goL0U5Qls0NTY3ODlBQkNdLykpIHtcbiAgICAgICAgICBjb25zdCBuZXVtZSA9IGVsZW1lbnQuY2xvc2VzdCgnLm5ldW1lJyk7XG4gICAgICAgICAgY29uc3QgbmNJbmRleCA9IEFycmF5LmZyb20obmV1bWUuY2hpbGRyZW4pLmluZGV4T2YoZWxlbWVudC5jbG9zZXN0KCcubmMnKSk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykubWF0Y2goL0U5Qls0NTY3OF0vKSkge1xuICAgICAgICAgICAgLy8gQWRkIHNlY29uZCBoYWxmIG9mIGxpZ2F0dXJlIHRvIHNlbGVjdGVkIGxpc3QgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kTmMgPSBuZXVtZS5jaGlsZHJlbltuY0luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBzZWNvbmRVc2UgPSBzZWNvbmROYy5xdWVyeVNlbGVjdG9yKCd1c2UnKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmluZGV4T2Yoc2Vjb25kVXNlKSA8IDApIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5wdXNoKHNlY29uZFVzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFkZCBmaXJzdCBoYWxmIG9mIGxpZ2F0dXJlIHRvIHNlbGVjdGVkIGxpc3QgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgY29uc3QgZmlyc3ROYyA9IG5ldW1lLmNoaWxkcmVuW25jSW5kZXggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VXNlID0gZmlyc3ROYy5xdWVyeVNlbGVjdG9yKCd1c2UnKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmluZGV4T2YoZmlyc3RVc2UpIDwgMCkge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLnB1c2goZmlyc3RVc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBzZWxlY3RBbGwoc2VsZWN0ZWRFbGVtZW50cywgbmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcblxuICAgICAgaWYgKGRyYWdIYW5kbGVyKSB7XG4gICAgICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gICAgICB9XG4gICAgICBkMy5zZWxlY3RBbGwoJyNzZWxlY3RSZWN0JykucmVtb3ZlKCk7XG4gICAgICBkcmFnU2VsZWN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHBhbm5pbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGQzLnNlbGVjdEFsbChzZWxlY3Rvci5yZXBsYWNlKCcuYWN0aXZlLXBhZ2UnLCAnJykudHJpbSgpKVxuICAgIC5vbignLmRyYWcnLCBudWxsKTtcbiAgY29uc3QgZHJhZ1NlbGVjdEFjdGlvbiA9IGQzLmRyYWcoKVxuICAgIC5vbignc3RhcnQnLCBzZWxTdGFydClcbiAgICAub24oJ2RyYWcnLCBzZWxlY3RpbmcpXG4gICAgLm9uKCdlbmQnLCBzZWxFbmQpO1xuICBjYW52YXMuY2FsbChkcmFnU2VsZWN0QWN0aW9uKTtcbiAgaWYgKGRyYWdIYW5kbGVyKSB7XG4gICAgZHJhZ0hhbmRsZXIucmVzZXRUbyhkcmFnU2VsZWN0QWN0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0ICogYXMgdmtiZWF1dGlmeSBmcm9tICd2a2JlYXV0aWZ5JztcbmltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuXG4vLyBGb3IgZGV0YWlscyBhYm91dCB0aGUgZmlsZSBjb252ZXJzaW9uLFxuLy8gcmVmZXIgdG8gdGhpcyBsaW5rOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RETUFML05lb24vd2lraS9OZW9uJUUyJTgwJTkwVmVyb3Zpby1GaWxlLUNvbnZlcnNpb25cblxuZXhwb3J0IGZ1bmN0aW9uIHppcDxUPihhcnJheTE6IEFycmF5PFQ+LCBhcnJheTI6IEFycmF5PFQ+KTogQXJyYXk8VD4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChcbiAgICBsZXQgaSA9IDA7XG4gICAgaSA8IChhcnJheTEubGVuZ3RoID4gYXJyYXkyLmxlbmd0aCA/IGFycmF5Mi5sZW5ndGggOiBhcnJheTEubGVuZ3RoKTtcbiAgICBpKytcbiAgKSB7XG4gICAgcmVzdWx0LnB1c2goW2FycmF5MVtpXSwgYXJyYXkyW2ldXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29weUF0dHJpYnV0ZXMoc3JjOiBFbGVtZW50LCBkc3Q6IEVsZW1lbnQpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhdHRyIG9mIHNyYy5hdHRyaWJ1dGVzKSB7XG4gICAgZHN0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9OZW9uKHN0YWZmQmFzZWRNZWk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XG4gIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc3RhZmZCYXNlZE1laSwgJ3RleHQveG1sJyk7XG4gIGNvbnN0IG1laSA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG4gIGxldCBuQ29sID0gMDtcblxuICBjb25zdCBzZWN0aW9ucyA9IEFycmF5LmZyb20oXG4gICAgbWVpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlY3Rpb246bm90KFt0eXBlPVwibmVvbi1uZXVtZS1saW5lXCJdKScpLFxuICApO1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAvLyBSZW1vdmUgZGlyZWN0IGNoaWxkcmVuIHBiICYgc2IgZWxlbWVudHMgd2l0aGluIHNlY3Rpb25cbiAgICBjb25zdCBwYnMgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJ3BiJyk7XG4gICAgcGJzLmZvckVhY2goKHBiKSA9PiBwYi5yZW1vdmUoKSk7XG4gICAgY29uc3Qgc2JzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCdzYicpO1xuICAgIHNicy5mb3JFYWNoKChzYikgPT4gc2IucmVtb3ZlKCkpO1xuXG4gICAgY29uc3QgbmV3U3RhZmYgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAnc3RhZmYnLFxuICAgICk7XG4gICAgY29uc3QgbmV3TGF5ZXIgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAnbGF5ZXInLFxuICAgICk7XG4gICAgbmV3U3RhZmYuc2V0QXR0cmlidXRlKCduJywgJzEnKTtcbiAgICBuZXdMYXllci5zZXRBdHRyaWJ1dGUoJ24nLCAnMScpO1xuICAgIG5ld1N0YWZmLmFwcGVuZENoaWxkKG5ld0xheWVyKTtcblxuICAgIC8vIEFkZCA8cGI+XG4gICAgY29uc3Qgc3VyZmFjZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdzdXJmYWNlJyk7XG4gICAgY29uc3Qgc3VyZmFjZUlkID0gc3VyZmFjZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpO1xuICAgIGNvbnN0IHBiID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgJ3BiJyxcbiAgICApO1xuICAgIHBiLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICBwYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCAnIycgKyBzdXJmYWNlSWQpO1xuICAgIG5ld0xheWVyLmFwcGVuZENoaWxkKHBiKTtcblxuICAgIGNvbnN0IG5lb25OZXVtZUxpbmVTZWN0aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlY3Rpb25bdHlwZT1cIm5lb24tbmV1bWUtbGluZVwiXScpLFxuICAgICk7XG4gICAgbGV0IG5TdGFmZiA9IDA7XG4gICAgbGV0IGxhc3RDYjogRWxlbWVudCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IG5lb25OZXVtZUxpbmVTZWN0aW9uIG9mIG5lb25OZXVtZUxpbmVTZWN0aW9ucykge1xuICAgICAgblN0YWZmICs9IDE7XG4gICAgICBjb25zdCBzdGFmZiA9IG5lb25OZXVtZUxpbmVTZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ3N0YWZmJyk7XG4gICAgICBpZiAoIXN0YWZmKSB7XG4gICAgICAgIG5lb25OZXVtZUxpbmVTZWN0aW9uLnJlbW92ZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxheWVyID0gc3RhZmYucXVlcnlTZWxlY3RvcignbGF5ZXInKTtcblxuICAgICAgLy8gaWYgc3RhZmYgaGFzIGEgbmV3IHR5cGUgdmFsdWUsXG4gICAgICAvLyBhZGQgY2IgYmVmb3JlIHNiXG4gICAgICBpZiAoXG4gICAgICAgIHN0YWZmLmhhc0F0dHJpYnV0ZSgndHlwZScpICYmXG4gICAgICAgIHN0YWZmLmdldEF0dHJpYnV0ZSgndHlwZScpICE9ICdjb2x1bW4nICsgbkNvbC50b1N0cmluZygpXG4gICAgICApIHtcbiAgICAgICAgbkNvbCArPSAxO1xuICAgICAgICBjb25zdCBjYiA9IG1laURvYy5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAgICAgJ2NiJyxcbiAgICAgICAgKTtcbiAgICAgICAgY2Iuc2V0QXR0cmlidXRlKCduJywgbkNvbC50b1N0cmluZygpKTtcbiAgICAgICAgY2Iuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgICBjYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCAnI20tJyArIHV1aWR2NCgpKTtcbiAgICAgICAgbmV3TGF5ZXIuYXBwZW5kQ2hpbGQoY2IpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB6b25lIGZvciBwcmV2aW91cyBjYlxuICAgICAgICBpZiAobGFzdENiKSB7XG4gICAgICAgICAgY2FsY3VsYXRlQW5kQWRkWm9uZShsYXN0Q2IsIGNiLCBzdXJmYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2IgPSBjYjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2IgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICAgJ3NiJyxcbiAgICAgICk7XG4gICAgICBzYi5zZXRBdHRyaWJ1dGUoJ24nLCBuU3RhZmYudG9TdHJpbmcoKSk7XG4gICAgICBzYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCBzdGFmZi5nZXRBdHRyaWJ1dGUoJ2ZhY3MnKSk7XG4gICAgICBzYi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsIHN0YWZmLmdldEF0dHJpYnV0ZSgneG1sOmlkJykpO1xuXG4gICAgICAvLyBIYW5kbGUgY3VzdG9zXG4gICAgICBsZXQgY3VzdG9zOiBFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBuZXdMYXllci5sYXN0RWxlbWVudENoaWxkICE9PSBudWxsICYmXG4gICAgICAgIG5ld0xheWVyLmxhc3RFbGVtZW50Q2hpbGQudGFnTmFtZSA9PT0gJ2N1c3RvcydcbiAgICAgICkge1xuICAgICAgICBjdXN0b3MgPSBuZXdMYXllci5yZW1vdmVDaGlsZChuZXdMYXllci5sYXN0RWxlbWVudENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1c3RvcyAhPT0gdW5kZWZpbmVkKSBuZXdMYXllci5hcHBlbmRDaGlsZChjdXN0b3MpO1xuICAgICAgbmV3TGF5ZXIuYXBwZW5kQ2hpbGQoc2IpO1xuXG4gICAgICAvLyBBZGQgcmVtYWluaW5nIGVsZW1lbnRzIG9mIGxheWVyIHRvIG5ld0xheWVyXG4gICAgICB3aGlsZSAobGF5ZXIuZmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3TGF5ZXIuYXBwZW5kQ2hpbGQobGF5ZXIuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgfVxuICAgICAgbmVvbk5ldW1lTGluZVNlY3Rpb24ucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBhZGQgem9uZSBmb3IgdGhlIGxhc3QgY2IgaW4gdGhlIHNlY3Rpb25cbiAgICBpZiAobGFzdENiKSB7XG4gICAgICBjYWxjdWxhdGVBbmRBZGRab25lKGxhc3RDYiwgbnVsbCwgc3VyZmFjZSk7XG4gICAgfVxuICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobmV3U3RhZmYpO1xuICB9XG5cbiAgLy8gQWRkIDxjb2xMYXlvdXQ+XG4gIGlmIChuQ29sKSB7XG4gICAgY29uc3Qgc2NvcmVEZWYgPSBtZWkucXVlcnlTZWxlY3Rvcignc2NvcmVEZWYnKTtcbiAgICBjb25zdCBjb2xMYXlvdXQgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAnY29sTGF5b3V0JyxcbiAgICApO1xuICAgIGNvbExheW91dC5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgY29sTGF5b3V0LnNldEF0dHJpYnV0ZSgnbicsIG5Db2wudG9TdHJpbmcoKSk7XG4gICAgc2NvcmVEZWYuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGNvbExheW91dCk7XG4gIH1cblxuICByZXR1cm4gdmtiZWF1dGlmeS54bWwoc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhtZWlEb2MpKTtcblxuICBmdW5jdGlvbiBjYWxjdWxhdGVBbmRBZGRab25lKFxuICAgIHN0YXJ0RWxlbWVudDogRWxlbWVudCxcbiAgICBlbmRFbGVtZW50OiBFbGVtZW50IHwgbnVsbCxcbiAgICBzdXJmYWNlOiBFbGVtZW50LFxuICApIHtcbiAgICAvLyBDb2xsZWN0IGVsZW1lbnRzIGJldHdlZW4gc3RhcnRDYiBhbmQgZW5kQ2JcbiAgICBjb25zdCBlbGVtZW50c0JldHdlZW4gPSBjb2xsZWN0QWxsRWxlbWVudHNXaXRoRmFjcyhcbiAgICAgIHN0YXJ0RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcsXG4gICAgICBlbmRFbGVtZW50LFxuICAgICk7XG5cbiAgICAvLyBDYWxjdWxhdGUgem9uZSBhdHRyaWJ1dGVzXG4gICAgY29uc3Qgem9uZSA9IG1laURvYy5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICd6b25lJyxcbiAgICApO1xuICAgIGNvbnN0IEJCb3ggPSBjYWxjdWxhdGVCQm94KGVsZW1lbnRzQmV0d2Vlbiwgc3VyZmFjZSk7XG4gICAgem9uZS5zZXRBdHRyaWJ1dGUoJ2xyeCcsIEJCb3gubHJ4LnRvU3RyaW5nKCkpO1xuICAgIHpvbmUuc2V0QXR0cmlidXRlKCdscnknLCBCQm94LmxyeS50b1N0cmluZygpKTtcbiAgICB6b25lLnNldEF0dHJpYnV0ZSgndWx4JywgQkJveC51bHgudG9TdHJpbmcoKSk7XG4gICAgem9uZS5zZXRBdHRyaWJ1dGUoJ3VseScsIEJCb3gudWx5LnRvU3RyaW5nKCkpO1xuICAgIHpvbmUuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdmYWNzJykuc2xpY2UoMSkpO1xuXG4gICAgLy8gQWRkIHpvbmUgdG8gdGhlIGJlZ2lubmluZyBvZiBzdXJmYWNlIGNoaWxkcmVuXG4gICAgc3VyZmFjZS5pbnNlcnRCZWZvcmUoem9uZSwgc3VyZmFjZS5maXJzdEVsZW1lbnRDaGlsZCk7XG4gIH1cblxuICBmdW5jdGlvbiBjb2xsZWN0QWxsRWxlbWVudHNXaXRoRmFjcyhcbiAgICBlbGVtZW50OiBFbGVtZW50LFxuICAgIGVuZEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgZWxlbWVudHNCZXR3ZWVuID0gW10sXG4gICkge1xuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGVuZEVsZW1lbnQpIHtcbiAgICAgIC8vIFB1c2ggZWxlbWVudHMgb25seSBpZiBpdCBoYXMgZmFjc1xuICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdmYWNzJykpIGVsZW1lbnRzQmV0d2Vlbi5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWxlbWVudC5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbGxlY3RBbGxFbGVtZW50c1dpdGhGYWNzKGNoaWxkLCBlbmRFbGVtZW50LCBlbGVtZW50c0JldHdlZW4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgICBjb2xsZWN0QWxsRWxlbWVudHNXaXRoRmFjcyhcbiAgICAgICAgICBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyxcbiAgICAgICAgICBlbmRFbGVtZW50LFxuICAgICAgICAgIGVsZW1lbnRzQmV0d2VlbixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNCZXR3ZWVuO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlQkJveChlbGVtZW50czogRWxlbWVudFtdLCBzdXJmYWNlOiBFbGVtZW50KSB7XG4gICAgbGV0IGxyeCA9IEluZmluaXR5O1xuICAgIGxldCBscnkgPSAwO1xuICAgIGxldCB1bHggPSAwO1xuICAgIGxldCB1bHkgPSBJbmZpbml0eTtcblxuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHpvbmUgPSBBcnJheS5mcm9tKHN1cmZhY2UuY2hpbGRyZW4pLmZpbmQoXG4gICAgICAgICh6b25lKSA9PlxuICAgICAgICAgIHpvbmUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSA9PT0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2ZhY3MnKS5zbGljZSgxKSxcbiAgICAgICk7XG4gICAgICBscnggPSBNYXRoLm1pbihscngsIHBhcnNlSW50KHpvbmUuZ2V0QXR0cmlidXRlKCdscngnKSkpO1xuICAgICAgbHJ5ID0gTWF0aC5tYXgobHJ5LCBwYXJzZUludCh6b25lLmdldEF0dHJpYnV0ZSgnbHJ5JykpKTtcbiAgICAgIHVseCA9IE1hdGgubWF4KHVseCwgcGFyc2VJbnQoem9uZS5nZXRBdHRyaWJ1dGUoJ3VseCcpKSk7XG4gICAgICB1bHkgPSBNYXRoLm1pbih1bHksIHBhcnNlSW50KHpvbmUuZ2V0QXR0cmlidXRlKCd1bHknKSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgbHJ4LCBscnksIHVseCwgdWx5IH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bGxhYmxlVGV4dChzeWxsYWJsZTogRWxlbWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IHN5bCA9IHN5bGxhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3N5bCcpPy5jaGlsZE5vZGVzWzBdO1xuICBsZXQgc3lsVGV4dDogc3RyaW5nO1xuICBpZiAoc3lsKSB7XG4gICAgc3lsVGV4dCA9IHN5bC5ub2RlVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgc3lsVGV4dCA9ICfil4onO1xuICB9XG5cbiAgcmV0dXJuIHN5bFRleHQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgem9uZSBpcyBhbGwtemVybywgaGFzIG5lZ2F0aXZlIGNvb3JkaW5hdGVzLCBvciBub3QgbGlua2VkIHdpdGggZ2x5cGhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludmFsaWRCQm94KFxuICBtZWk6IEhUTUxFbGVtZW50LFxuICB6b25lOiBFbGVtZW50LFxuKTogW2Jvb2xlYW4sIEVsZW1lbnQ/XSB7XG4gIGNvbnN0IGxyeCA9IHBhcnNlSW50KHpvbmUuZ2V0QXR0cmlidXRlKCdscngnKSk7XG4gIGNvbnN0IGxyeSA9IHBhcnNlSW50KHpvbmUuZ2V0QXR0cmlidXRlKCdscnknKSk7XG4gIGNvbnN0IHVseCA9IHBhcnNlSW50KHpvbmUuZ2V0QXR0cmlidXRlKCd1bHgnKSk7XG4gIGNvbnN0IHVseSA9IHBhcnNlSW50KHpvbmUuZ2V0QXR0cmlidXRlKCd1bHknKSk7XG5cbiAgY29uc3QgaXNBbGxaZXJvID0gbHJ4ID09PSAwICYmIGxyeSA9PT0gMCAmJiB1bHggPT09IDAgJiYgdWx5ID09PSAwO1xuICBjb25zdCBoYXNOZWdhdGl2ZUNvb3JkaW5hdGVzID0gbHJ4IDwgMCB8fCBscnkgPCAwIHx8IHVseCA8IDAgfHwgdWx5IDwgMDtcblxuICBjb25zdCBlbGVtZW50ID0gbWVpLnF1ZXJ5U2VsZWN0b3IoXG4gICAgYCpbZmFjcz1cIiR7JyMnICsgem9uZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpfVwiXWAsXG4gICk7XG4gIGlmIChpc0FsbFplcm8gfHwgaGFzTmVnYXRpdmVDb29yZGluYXRlcyB8fCAhZWxlbWVudCkgcmV0dXJuIFt0cnVlLCBlbGVtZW50XTtcbiAgcmV0dXJuIFtmYWxzZV07XG59XG5cbi8qKlxuICogQ29udmVydCBzYiB0byBzdGFmZiBmb3IgdmVyb3Zpb1xuICogQWxzbyBkbyBoZXVyaXN0aWMgY2hlY2tzOlxuICogICAgMS4gaW52YWxpZCB6b25lc1xuICogICAgMi4gbmV1bWUgd2l0aG91dCBuZXVtZSBjb21wb25lbnRcbiAqICAgIDMuIHN5bGxhYmxlIHdpdGhvdXQgbmV1bWVcbiAqICAgIDQuIGxpbmtlZCBzeWxsYWJsZXMgbm90IGxpbmtlZFxuICogICAgNS4gaW5jb21wbGV0ZSBsaW5rZWQgc3lsbGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1Zlcm92aW8oc2JCYXNlZE1laTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHNiQmFzZWRNZWksICd0ZXh0L3htbCcpO1xuICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuICBsZXQgaGFzQ29scyA9IGZhbHNlO1xuXG4gIGNvbnN0IGZhY3NpbWlsZSA9IG1laS5xdWVyeVNlbGVjdG9yKCdmYWNzaW1pbGUnKTtcbiAgZmFjc2ltaWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0cmFuc2NyaXB0aW9uJyk7XG5cbiAgLy8gUmVtb3ZlIGFsbC16ZXJvIHpvbmVzXG4gIC8vIFJlbW92ZSB6b25lcyBub3QgbGlua2VkIHdpdGggZ2x5cGhzXG4gIGNvbnN0IHN1cmZhY2UgPSBtZWkucXVlcnlTZWxlY3Rvcignc3VyZmFjZScpO1xuICBsZXQgaGFzSW52YWxpZEJCb3ggPSBmYWxzZTtcbiAgY29uc3Qgem9uZXMgPSBBcnJheS5mcm9tKHN1cmZhY2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3pvbmUnKSk7XG4gIGxldCBpbnZhbGlkWm9uZXNJbmZvID0gJ1RoZSBmb2xsb3dpbmcgem9uZXMgYXJlIGludmFsaWQ6IFxcblxcbic7XG4gIGZvciAoY29uc3Qgem9uZSBvZiB6b25lcykge1xuICAgIGNvbnN0IFtpc0ludmFsaWQsIGVsZW1lbnRdID0gaXNJbnZhbGlkQkJveChtZWksIHpvbmUpO1xuICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgIGhhc0ludmFsaWRCQm94ID0gdHJ1ZTtcbiAgICAgIGludmFsaWRab25lc0luZm8gKz0gYC0gWm9uZSB3aXRoIHhtbDppZDogJHt6b25lLmdldEF0dHJpYnV0ZSgneG1sOmlkJyl9IGA7XG5cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgaW52YWxpZFpvbmVzSW5mbyArPSBgZm9yICZsdDske1xuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZVxuICAgICAgICB9Jmd0OyB3aXRoIHhtbDppZDogJHtlbGVtZW50LmdldEF0dHJpYnV0ZSgneG1sOmlkJyl9XFxuYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludmFsaWRab25lc0luZm8gKz0gJ2lzIG5vdCBsaW5rZWQgd2l0aCBhbnkgZ2x5cGhzXFxuJztcbiAgICAgIH1cbiAgICAgIHpvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh6b25lKTtcbiAgICB9XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRCQm94KSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1JlbW92ZWQgaW52YWxpZCB6b25lcyBjb250YWluZWQgaW4gdGhpcyBmaWxlJyxcbiAgICAgICd3YXJuaW5nJyxcbiAgICAgIGludmFsaWRab25lc0luZm8sXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZXJlIGlzIDxjb2xMYXlvdXQ+IGVsZW1lbnQgYW5kIHJlbW92ZSB0aGVtXG4gIC8vIFRoZXJlIHdpbGwgb25seSBiZSBvbmUgPGNvbExheW91dD4gZWxlbWVudFxuICBjb25zdCBjb2xMYXlvdXQgPSBtZWkucXVlcnlTZWxlY3RvcignY29sTGF5b3V0Jyk7XG4gIGlmIChjb2xMYXlvdXQpIHtcbiAgICBoYXNDb2xzID0gdHJ1ZTtcbiAgICBjb2xMYXlvdXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb2xMYXlvdXQpO1xuICB9XG5cbiAgLy8gQ2hlY2sgc3lsbGFibGUgd2l0aG91dCBuZXVtZVxuICAvLyBDaGVjayBkaXZMaW5lIGluc2lkZSBlbXB0eSBzeWxsYWJsZVxuICAvLyBDaGVjayBhY2NpZCBpbnNpZGUgZW1wdHkgc3lsbGFibGVcbiAgY29uc3Qgc3lsbGFibGVzID0gQXJyYXkuZnJvbShtZWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N5bGxhYmxlJykpO1xuICBsZXQgaGFzRW1wdHlTeWxsYWJsZSA9IGZhbHNlO1xuICBsZXQgaGFzRW1wdHlOZXVtZSA9IGZhbHNlO1xuICBsZXQgaGFzSW52YWxpZERpdkxpbmUgPSBmYWxzZTtcbiAgbGV0IGludmFsaWREaXZMaW5lSW5mbyA9XG4gICAgJ1RoZSBmb2xsb3dpbmcgZGl2TGluZShzKSBhcmUgdGhlIG9ubHkgZWxlbWVudCBpbnNpZGUgdGhlIHN5bGxhYmxlKHMpOiBcXG5cXG4nO1xuICBsZXQgaGFzSW52YWxpZEFjY2lkID0gZmFsc2U7XG4gIGxldCBpbnZhbGlkQWNjaWRJbmZvID1cbiAgICAnVGhlIGZvbGxvd2luZyBhY2NpZChzKSBhcmUgdGhlIG9ubHkgZWxlbWVudCBpbnNpZGUgdGhlIHN5bGxhYmxlKHMpOiBcXG5cXG4nO1xuICBsZXQgZW1wdHlTeWxsYWJsZUluZm8gPSAnVGhlIGZvbGxvd2luZyBzeWxsYWJsZShzKSBoYXZlIG5vIG5ldW1lczogXFxuXFxuJztcbiAgbGV0IGVtcHR5TmV1bWVJbmZvID0gJ1RoZSBmb2xsb3dpbmcgbmV1bWUocykgaGF2ZSBubyBuZXVtZSBjb21wb25lbnRzOiBcXG5cXG4nO1xuICBmb3IgKGNvbnN0IHN5bGxhYmxlIG9mIHN5bGxhYmxlcykge1xuICAgIGlmIChzeWxsYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbmV1bWUnKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGhhc0VtcHR5U3lsbGFibGUgPSB0cnVlO1xuICAgICAgZW1wdHlTeWxsYWJsZUluZm8gKz0gYC0gJmx0OyR7XG4gICAgICAgIHN5bGxhYmxlLnRhZ05hbWVcbiAgICAgIH0mZ3Q7IHdpdGggeG1sOmlkOiAke3N5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyl9XFxuYDtcbiAgICAgIGlmIChzeWxsYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2TGluZScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaGFzSW52YWxpZERpdkxpbmUgPSB0cnVlO1xuICAgICAgICBpbnZhbGlkRGl2TGluZUluZm8gKz0gYC0gJmx0O2RpdkxpbmUmZ3Q7IGluc2lkZSAmbHQ7c3lsbGFibGUmZ3Q7IHdpdGggeG1sOmlkOiAke3N5bGxhYmxlLmdldEF0dHJpYnV0ZShcbiAgICAgICAgICAneG1sOmlkJyxcbiAgICAgICAgKX1cXG5gO1xuICAgICAgfVxuICAgICAgaWYgKHN5bGxhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhY2NpZCcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaGFzSW52YWxpZEFjY2lkID0gdHJ1ZTtcbiAgICAgICAgaW52YWxpZEFjY2lkSW5mbyArPSBgLSAmbHQ7YWNjaWQmZ3Q7IGluc2lkZSAmbHQ7c3lsbGFibGUmZ3Q7IHdpdGggeG1sOmlkOiAke3N5bGxhYmxlLmdldEF0dHJpYnV0ZShcbiAgICAgICAgICAneG1sOmlkJyxcbiAgICAgICAgKX1cXG5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIG5ldW1lIHdpdGhvdXQgbmV1bWUgY29tcG9uZW50XG4gICAgY29uc3QgbmV1bWVzID0gc3lsbGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ25ldW1lJyk7XG4gICAgZm9yIChjb25zdCBuZXVtZSBvZiBuZXVtZXMpIHtcbiAgICAgIGNvbnN0IG5jcyA9IEFycmF5LmZyb20obmV1bWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ25jJykpO1xuICAgICAgaWYgKG5jcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaGFzRW1wdHlOZXVtZSA9IHRydWU7XG4gICAgICAgIGVtcHR5TmV1bWVJbmZvICs9IGAtICZsdDske1xuICAgICAgICAgIG5ldW1lLnRhZ05hbWVcbiAgICAgICAgfSZndDsgd2l0aCB4bWw6aWQ6ICR7bmV1bWUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKX1cXG5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG8gYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlOlxuICAgICAgICAvLyBJZiBuYyBoYXMgYSBAY3VydmUgdmFsdWUsIGFkZCBhIDxsaXF1ZXNjZW50PiBlbGVtZW50XG4gICAgICAgIGZvciAoY29uc3QgbmMgb2YgbmNzKSB7XG4gICAgICAgICAgaWYgKG5jLmhhc0F0dHJpYnV0ZSgnY3VydmUnKSAmJiBuYy5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpcSA9IG1laURvYy5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgICAgICAgICAnbGlxdWVzY2VudCcsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGlxLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgICAgICAgIG5jLmFwcGVuZENoaWxkKGxpcSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc0VtcHR5U3lsbGFibGUpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnVGhpcyBmaWxlIGNvbnRhaW5zIHN5bGxhYmxlKHMpIHdpdGhvdXQgbmV1bWUhJyxcbiAgICAgICd3YXJuaW5nJyxcbiAgICAgIGVtcHR5U3lsbGFibGVJbmZvLFxuICAgICk7XG4gIH1cbiAgaWYgKGhhc0VtcHR5TmV1bWUpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnVGhpcyBmaWxlIGNvbnRhaW5zIG5ldW1lKHMpIHdpdGhvdXQgbmV1bWUgY29tcG9uZW50IScsXG4gICAgICAnd2FybmluZycsXG4gICAgICBlbXB0eU5ldW1lSW5mbyxcbiAgICApO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkRGl2TGluZSkge1xuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICdUaGlzIGZpbGUgY29udGFpbnMgZGl2TGluZShzKSBpbnNpZGUgZW1wdHkgc3lsbGFibGUocykhJyxcbiAgICAgICd3YXJuaW5nJyxcbiAgICAgIGludmFsaWREaXZMaW5lSW5mbyxcbiAgICApO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkQWNjaWQpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnVGhpcyBmaWxlIGNvbnRhaW5zIGFjY2lkKHMpIGluc2lkZSBlbXB0eSBzeWxsYWJsZShzKSEnLFxuICAgICAgJ3dhcm5pbmcnLFxuICAgICAgaW52YWxpZEFjY2lkSW5mbyxcbiAgICApO1xuICB9XG5cbiAgLy8gR28gc2VjdGlvbiBieSBzZWN0aW9uIGp1c3QgaW4gY2FzZVxuICBjb25zdCBzZWN0aW9ucyA9IEFycmF5LmZyb20obWVpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzZWN0aW9uJykpO1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAvLyBJbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZSBzdGF2ZXMgaGVyZSB3ZSB3YW50IHRvIHByZXNlcnZlIHRob3NlXG4gICAgLy8gQSBzZXBhcmF0ZSBhcnJheSBpcyBuZWNlc3NhcnkgYXMgdGhlIEhUTUxDb2xsZWN0aW9uIHdpbGwgdXBkYXRlIVxuICAgIGNvbnN0IG9yaWdpbmFsU3RhdmVzID0gQXJyYXkuZnJvbShzZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdGFmZicpKTtcbiAgICBmb3IgKGNvbnN0IHN0YWZmIG9mIG9yaWdpbmFsU3RhdmVzKSB7XG4gICAgICAvLyBBZGQgYSBwYiB3aXRoIGEgZmFjcyBwb2ludGluZyB0byB0aGUgc3VyZmFjZVxuICAgICAgY29uc3QgbmV3UGIgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICAgJ3BiJyxcbiAgICAgICk7XG4gICAgICBuZXdQYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCAnIycgKyBzdXJmYWNlLmdldEF0dHJpYnV0ZSgneG1sOmlkJykpO1xuICAgICAgc2VjdGlvbi5pbnNlcnRCZWZvcmUobmV3UGIsIHN0YWZmKTtcblxuICAgICAgY29uc3QgbGF5ZXIgPSBzdGFmZi5xdWVyeVNlbGVjdG9yKCdsYXllcicpO1xuICAgICAgLy8gRmlyc3QgcGFzczogZ2V0IGFsbCBzYiBlbGVtZW50cyBhcyBkaXJlY3QgY2hpbGRyZW4gb2YgbGF5ZXJcbiAgICAgIGNvbnN0IHNiQXJyYXkgPSBBcnJheS5mcm9tKGxheWVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzYicpKTtcbiAgICAgIC8vIENoZWNrIGlmIGFueSBzeWxsYWJsZXMgaGF2ZSBzYiBpbnNpZGUgKGxpbmtlZCBzeWxsYWJsZXMpXG4gICAgICAvLyBLZWVwIHRoaXMgY2hlY2sgZm9yIGZpbGVzIG5vdCBwcm9kdWNlZCBieSBSb2RhblxuICAgICAgZm9yIChjb25zdCBzYiBvZiBzYkFycmF5KSB7XG4gICAgICAgIGlmIChzYi5wYXJlbnRFbGVtZW50LnRhZ05hbWUgIT09ICdsYXllcicpIHtcbiAgICAgICAgICBjb25zdCBvcmlnU3lsbGFibGU6IEVsZW1lbnQgPSBzYi5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgIGxldCBuZXVtZUJlaGluZCA9IGZhbHNlLFxuICAgICAgICAgICAgbmV1bWVBaGVhZCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGNoaWxkQXJyYXkgPSBBcnJheS5mcm9tKG9yaWdTeWxsYWJsZS5jaGlsZHJlbik7XG4gICAgICAgICAgY29uc3Qgc2JJbmRleCA9IGNoaWxkQXJyYXkuaW5kZXhPZihzYik7XG4gICAgICAgICAgZm9yIChjb25zdCBuZXVtZSBvZiBvcmlnU3lsbGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ25ldW1lJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZCA9IGNoaWxkQXJyYXkuaW5kZXhPZihuZXVtZSk7XG4gICAgICAgICAgICBpZiAoaW5kIDwgc2JJbmRleCkge1xuICAgICAgICAgICAgICBuZXVtZUJlaGluZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluZCA+IHNiSW5kZXgpIHtcbiAgICAgICAgICAgICAgbmV1bWVBaGVhZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWFyayBpZiBhIG5ldyBzdGFmZiBiZWdpbnMgYmVmb3JlIHRoZSBjdXJyZW50IHN5bGxhYmxlLCBhZnRlciBpdCwgb3IgaW4gdGhlIG1pZGRsZSBvZiBpdFxuICAgICAgICAgIC8vIElmIGluIHRoZSBtaWRkbGUsIGxpbmsgc3lsbGFibGVzXG4gICAgICAgICAgaWYgKCFuZXVtZUJlaGluZCAmJiBuZXVtZUFoZWFkKSB7XG4gICAgICAgICAgICBvcmlnU3lsbGFibGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIHNiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ldW1lQmVoaW5kICYmICFuZXVtZUFoZWFkKSB7XG4gICAgICAgICAgICBvcmlnU3lsbGFibGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHNiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ldW1lQmVoaW5kICYmIG5ldW1lQWhlYWQpIHtcbiAgICAgICAgICAgIC8vIFdlIG1heSBuZWVkIHRvIHNwbGl0IHRoZSBzeWxsYWJsZSBoZXJlXG4gICAgICAgICAgICBjb25zdCBuZXdTeWxsYWJsZSA9IG1laURvYy5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgICAgICAgICAnc3lsbGFibGUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5ld1N5bGxhYmxlLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgICAgICAgIG5ld1N5bGxhYmxlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ2ZvbGxvd3MnLFxuICAgICAgICAgICAgICAnIycgKyBvcmlnU3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvcmlnU3lsbGFibGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAncHJlY2VkZXMnLFxuICAgICAgICAgICAgICAnIycgKyBuZXdTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2JJbmRleCA9IGNoaWxkQXJyYXkuaW5kZXhPZihzYik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRBcnJheSkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGNoaWxkQXJyYXkuaW5kZXhPZihjaGlsZCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA+IHNiSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBuZXdTeWxsYWJsZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3JpZ1N5bGxhYmxlLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBzYik7XG4gICAgICAgICAgICBzYi5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3U3lsbGFibGUpO1xuXG4gICAgICAgICAgICAvLyBNb3ZlIGFueSBjdXN0b3MgaW4gb3JpZ1N5bGxhYmxlIG91dCBvZiBpdFxuICAgICAgICAgICAgZm9yIChjb25zdCBjdXN0b3Mgb2Ygb3JpZ1N5bGxhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjdXN0b3MnKSkge1xuICAgICAgICAgICAgICBvcmlnU3lsbGFibGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGN1c3Rvcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1vdmUgYW55IGNsZWYgaW4gbmV3U3lsbGFibGUgb3V0IG9mIGl0XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNsZWYgb2YgbmV3U3lsbGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2NsZWYnKSkge1xuICAgICAgICAgICAgICBuZXdTeWxsYWJsZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgY2xlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTk9ORSBCRUhJTkQgTk9ORSBBSEVBRCcpO1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvcmlnU3lsbGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzYnMgPSBBcnJheS5mcm9tKGxheWVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzYicpKTtcbiAgICAgIGNvbnN0IGxheWVyQ2hpbGRyZW4gPSBBcnJheS5mcm9tKGxheWVyLmNoaWxkcmVuKTtcbiAgICAgIGxldCBuQ29sID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTYiA9IHNic1tpXTtcbiAgICAgICAgY29uc3QgbmV4dFNiID0gc2JzLmxlbmd0aCA+IGkgKyAxID8gc2JzW2kgKyAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXdTYiA9IG1laURvYy5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAgICAgJ3NiJyxcbiAgICAgICAgKTtcbiAgICAgICAgbmV3U2Iuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgICAgICBuZXdTYi5zZXRBdHRyaWJ1dGUoJ2ZhY3MnLCBjdXJyZW50U2IuZ2V0QXR0cmlidXRlKCdmYWNzJykpO1xuXG4gICAgICAgIGNvbnN0IG5ld1NlY3Rpb24gPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgICAgICdzZWN0aW9uJyxcbiAgICAgICAgKTtcbiAgICAgICAgbmV3U2VjdGlvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnbmVvbi1uZXVtZS1saW5lJyk7XG5cbiAgICAgICAgY29uc3QgbmV3U3RhZmYgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgICAgICdzdGFmZicsXG4gICAgICAgICk7XG4gICAgICAgIGNvcHlBdHRyaWJ1dGVzKGN1cnJlbnRTYiwgbmV3U3RhZmYpO1xuICAgICAgICBuZXdTdGFmZi5zZXRBdHRyaWJ1dGUoJ24nLCAnMScpO1xuICAgICAgICBjb25zdCBjdXJyZW50SWR4ID0gbGF5ZXJDaGlsZHJlbi5pbmRleE9mKGN1cnJlbnRTYik7XG4gICAgICAgIGlmIChoYXNDb2xzKSB7XG4gICAgICAgICAgaWYgKGxheWVyQ2hpbGRyZW4uYXQoY3VycmVudElkeCAtIDEpLnRhZ05hbWUgPT09ICdjYicpIHtcbiAgICAgICAgICAgIG5Db2wgKz0gMTtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBjYiBlbGVtZW50IGFuZCBpdHMgem9uZVxuICAgICAgICAgICAgY29uc3QgY2IgPSBsYXllckNoaWxkcmVuLmF0KGN1cnJlbnRJZHggLSAxKTtcbiAgICAgICAgICAgIGNvbnN0IGNiRmFjcyA9IGNiLmdldEF0dHJpYnV0ZSgnZmFjcycpO1xuICAgICAgICAgICAgY29uc3QgY2Jab25lID0gQXJyYXkuZnJvbShzdXJmYWNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3pvbmUnKSkuZmluZChcbiAgICAgICAgICAgICAgKHpvbmUpID0+IHpvbmUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSA9PT0gY2JGYWNzLnNsaWNlKDEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2IpO1xuICAgICAgICAgICAgY2Jab25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2Jab25lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3U3RhZmYuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2NvbHVtbicgKyBuQ29sLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3TGF5ZXIgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgICAgICdsYXllcicsXG4gICAgICAgICk7XG4gICAgICAgIG5ld0xheWVyLnNldEF0dHJpYnV0ZSgnbicsICcxJyk7XG4gICAgICAgIG5ld0xheWVyLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgICAgbmV3U2VjdGlvbi5hcHBlbmRDaGlsZChuZXdTdGFmZik7XG4gICAgICAgIG5ld1N0YWZmLmFwcGVuZENoaWxkKG5ld0xheWVyKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbkFycmF5ID0gQXJyYXkuZnJvbShsYXllci5jaGlsZHJlbik7XG4gICAgICAgIGNvbnN0IGNvcHlBcnJheSA9IGNoaWxkcmVuQXJyYXkuc2xpY2UoXG4gICAgICAgICAgY2hpbGRyZW5BcnJheS5pbmRleE9mKGN1cnJlbnRTYikgKyAxLFxuICAgICAgICAgIGNoaWxkcmVuQXJyYXkuaW5kZXhPZihuZXh0U2IpLFxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY29weUFycmF5KSB7XG4gICAgICAgICAgbmV3TGF5ZXIuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB6b25lcyBmb3IgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgZmlsZVxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBsYXN0IGVsZW1lbnQgaXMgbm90IGluY2x1ZGVkXG4gICAgICAgIGlmICghbmV4dFNiKSB7XG4gICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBjaGlsZHJlbkFycmF5LmF0KC0xKTtcbiAgICAgICAgICBjb25zdCBmYWNzQ2hpbGRyZW4gPSBjb2xsZWN0RmFjc0NoaWxkcmVuKGxhc3RFbGVtZW50LCBbXSk7XG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmYWNzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHpvbmUgPSB6b25lcy5maW5kKFxuICAgICAgICAgICAgICAoeikgPT5cbiAgICAgICAgICAgICAgICB6LmdldEF0dHJpYnV0ZSgneG1sOmlkJykgPT0gY2hpbGQuZ2V0QXR0cmlidXRlKCdmYWNzJykuc2xpY2UoMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHpvbmUgJiYgem9uZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICB6b25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoem9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2VjdGlvbi5pbnNlcnRCZWZvcmUobmV3U2IsIHN0YWZmKTtcbiAgICAgICAgc2VjdGlvbi5pbnNlcnRCZWZvcmUobmV3U2VjdGlvbiwgc3RhZmYpO1xuICAgICAgfVxuICAgICAgc3RhZmYucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2Vjb25kIHBhc3Mgb24gYWxsIHN5bGxhYmxlcyB0byBoYW5kbGUgY2xlZnMgYW5kIGN1c3RvcyB0aGF0IG1pZ2h0IHJlbWFpblxuICBjb25zdCBuZXdTeWxsYWJsZXMgPSBBcnJheS5mcm9tKG1laS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3lsbGFibGUnKSk7XG4gIGxldCBpbnZhbGlkTGlua2VkID0gZmFsc2U7XG4gIGxldCBpbnZhbGlkTGlua2VkSW5mbyA9XG4gICAgJ1RoZSBmb2xsb3dpbmcgbGlua2VkIHN5bGxhYmxlcyBhcmUgbm90IGVuY29kZWQgY29ycmVjdGx5OiBcXG5cXG4nO1xuICBsZXQgaW52YWxpZE9ibGlxdWUgPSBmYWxzZTtcbiAgbGV0IGludmFsaWRPYmxpcXVlSW5mbyA9ICdUaGUgZm9sbG93aW5nIG9ibGlxdWVzIGFyZSBpbmNvbXBsZXRlOiBcXG5cXG4nO1xuICBmb3IgKGNvbnN0IHN5bGxhYmxlIG9mIG1laS5xdWVyeVNlbGVjdG9yQWxsKCdzeWxsYWJsZScpKSB7XG4gICAgZm9yIChjb25zdCBjbGVmIG9mIHN5bGxhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NsZWYnKSkge1xuICAgICAgc3lsbGFibGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGNsZWYpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGN1c3RvcyBvZiBzeWxsYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdjdXN0b3MnKSkge1xuICAgICAgc3lsbGFibGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGN1c3Rvcyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaW5jb21wbGV0ZSBvYmxpcXVlc1xuICAgIC8vIE9ibGlxdWVzIGFsd2F5cyBjb21lIGFzIGEgcGFpclxuICAgIGNvbnN0IG9ibGlxdWVJbmZvID0gY2hlY2tPYmxpcXVlKHN5bGxhYmxlKTtcbiAgICBpZiAob2JsaXF1ZUluZm8pIHtcbiAgICAgIGludmFsaWRPYmxpcXVlID0gdHJ1ZTtcbiAgICAgIGludmFsaWRPYmxpcXVlSW5mbyArPSBvYmxpcXVlSW5mbztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBzeWxsYWJsZXMgdGhhdCBjb250YWlucyBAcHJlY2VkZXMgb3IgQGZvbGxvd3NcbiAgICAvLyBVcGRhdGUgc3lsbGFibGUgYXJyYXlzIGZvciBlYWNoIHN5bGxhYmxlXG4gICAgY29uc3Qgc3lsbGFibGVJZHggPSBuZXdTeWxsYWJsZXMuaW5kZXhPZihzeWxsYWJsZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0b2dnbGUtbGlua2VkIHN5bGxhYmxlXG4gICAgLy8gQ2hlY2sgdGhlIHByZWNlZGVzIHN5bGxhYmxlXG4gICAgaWYgKHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgncHJlY2VkZXMnKSkge1xuICAgICAgY29uc3QgaW5mbyA9IGNoZWNrUHJlY2VkZXNTeWxsYWJsZShzeWxsYWJsZSwgc3lsbGFibGVJZHgsIG5ld1N5bGxhYmxlcyk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbnZhbGlkTGlua2VkID0gdHJ1ZTtcbiAgICAgICAgaW52YWxpZExpbmtlZEluZm8gKz0gaW5mbztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2hlY2sgdGhlIGZvbGxvd3Mgc3lsbGFibGVcbiAgICBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdmb2xsb3dzJykpIHtcbiAgICAgIGNvbnN0IGluZm8gPSBjaGVja0ZvbGxvd3NTeWxsYWJsZShzeWxsYWJsZSwgbmV3U3lsbGFibGVzKTtcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGludmFsaWRMaW5rZWQgPSB0cnVlO1xuICAgICAgICBpbnZhbGlkTGlua2VkSW5mbyArPSBpbmZvO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW52YWxpZE9ibGlxdWUpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnVGhpcyBmaWxlIGNvbnRhaW5zIGluY29tcGxldGUgb2JsaXF1ZShzKScsXG4gICAgICAnZXJyb3InLFxuICAgICAgaW52YWxpZE9ibGlxdWVJbmZvLFxuICAgICk7XG4gIH1cbiAgaWYgKGludmFsaWRMaW5rZWQpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnVGhpcyBmaWxlIGNvbnRhaW5zIGludmFsaWQgbGlua2VkIHN5bGxhYmxlKHMpJyxcbiAgICAgICdlcnJvcicsXG4gICAgICBpbnZhbGlkTGlua2VkSW5mbyxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XG4gIHJldHVybiB2a2JlYXV0aWZ5LnhtbChzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKG1laURvYykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tPdXRPZkJvdW5kc0dseXBocyhtZWlTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobWVpU3RyaW5nLCAndGV4dC94bWwnKTtcbiAgY29uc3QgbWVpID0gbWVpRG9jLmRvY3VtZW50RWxlbWVudDtcblxuICAvLyBDaGVjayBmb3Igb3V0LW9mLWJvdW5kIGdseXBoc1xuICBjb25zdCB6b25lcyA9IEFycmF5LmZyb20obWVpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3pvbmUnKSk7XG4gIGNvbnN0IGRpbWVuc2lvbnMgPSBtZWkucXVlcnlTZWxlY3Rvcignc3VyZmFjZScpO1xuICBjb25zdCBtZWlMcnggPSBOdW1iZXIoZGltZW5zaW9ucy5nZXRBdHRyaWJ1dGUoJ2xyeCcpKSxcbiAgICBtZWlMcnkgPSBOdW1iZXIoZGltZW5zaW9ucy5nZXRBdHRyaWJ1dGUoJ2xyeScpKTtcblxuICBmdW5jdGlvbiBpc0F0dHJPdXRPZkJvdW5kcyh6b25lOiBFbGVtZW50LCBhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb29yZCA9IE51bWJlcih6b25lLmdldEF0dHJpYnV0ZShhdHRyKSk7XG4gICAgY29uc3QgY29tcCA9IGF0dHIgPT0gJ2xyeCcgfHwgYXR0ciA9PSAndWx4JyA/IG1laUxyeCA6IG1laUxyeTtcbiAgICByZXR1cm4gY29vcmQgPCAwIHx8IGNvb3JkID4gY29tcDtcbiAgfVxuXG4gIGxldCBpbmZvID0gJ1RoZSBmb2xsb3dpbmcgZ2x5cGhzIGFyZSBvdXQgb2YgYm91bmRzOiBcXG5cXG4nO1xuXG4gIGNvbnN0IGhhc091dE9mQm91bmRzID0gem9uZXMuc29tZSgoem9uZSkgPT4ge1xuICAgIGNvbnN0IGlzT3V0T2ZCb3VuZHMgPSBbJ3VseCcsICd1bHknLCAnbHJ4JywgJ2xyeSddLnNvbWUoKGF0dHIpID0+XG4gICAgICBpc0F0dHJPdXRPZkJvdW5kcyh6b25lLCBhdHRyKSxcbiAgICApO1xuICAgIGlmIChpc091dE9mQm91bmRzKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gbWVpLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAqW2ZhY3M9XCIkeycjJyArIHpvbmUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKX1cIl1gLFxuICAgICAgKTtcbiAgICAgIGluZm8gKz0gYC0gJmx0OyR7ZWxlbWVudC50YWdOYW1lfSZndDsgd2l0aCB4bWw6aWQ6ICR7ZWxlbWVudC5nZXRBdHRyaWJ1dGUoXG4gICAgICAgICd4bWw6aWQnLFxuICAgICAgKX1cXG5gO1xuICAgIH1cbiAgICByZXR1cm4gaXNPdXRPZkJvdW5kcztcbiAgfSk7XG5cbiAgaWYgKGhhc091dE9mQm91bmRzKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoaXMgZm9saW8gY29udGFpbnMgZ2x5cGgocykgcGxhY2VkIG91dC1vZi1ib3VuZHMhJyxcbiAgICAgICd3YXJuaW5nJyxcbiAgICAgIGluZm8sXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1ByZWNlZGVzU3lsbGFibGUoXG4gIHN5bGxhYmxlOiBFbGVtZW50LFxuICBpZHg6IG51bWJlcixcbiAgc3lsbGFibGVzOiBFbGVtZW50W10sXG4pOiBzdHJpbmcge1xuICAvLyBHZXQgeG1sOmlkIG9mIHRoZSBuZXh0IHN5bGxhYmxlICh3aXRob3V0IHRoZSAjLCBpZiBpdCBleGlzdHMpXG4gIGNvbnN0IG5leHRTeWxsYWJsZUlkID0gc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdwcmVjZWRlcycpLnJlcGxhY2UoJyMnLCAnJyk7XG5cbiAgLy8gRmluZCB0aGUgbmV4dCBzeWxsYWJsZSBhbmQgaXRzIGluZGV4IGluIHRoZSBhcnJheVxuICBsZXQgbmV4dFN5bGxhYmxlSWR4OiBudW1iZXI7XG4gIGNvbnN0IG5leHRTeWxsYWJsZSA9IHN5bGxhYmxlcy5maW5kKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PSBuZXh0U3lsbGFibGVJZCkge1xuICAgICAgbmV4dFN5bGxhYmxlSWR4ID0gaWR4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcblxuICAvLyBDb25kaXRpb24gMTogVGhlIG5leHQgKGZvbGxvd2luZykgc3lsbGFibGUgY2Fubm90IGJlIGZvdW5kXG4gIGlmICghbmV4dFN5bGxhYmxlKSB7XG4gICAgcmV0dXJuIGAtICZsdDske3N5bGxhYmxlLnRhZ05hbWV9Jmd0OyAoJHtnZXRTeWxsYWJsZVRleHQoXG4gICAgICBzeWxsYWJsZSxcbiAgICApfSkgd2l0aCB4bWw6aWQ6ICR7c3lsbGFibGUuZ2V0QXR0cmlidXRlKFxuICAgICAgJ3htbDppZCcsXG4gICAgKX0gaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIHBhcnRcXG5gO1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uIDI6IFRoZSBuZXh0IHN5bGxhYmxlIGhhcyBiZWVuIGZvdW5kLCBidXQgdGhlIEBmb2xsb3dzIGF0dHJpYnV0ZSBkb2VzIE5PVCBFWElTVFxuICBpZiAoIW5leHRTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ2ZvbGxvd3MnKSkge1xuICAgIHJldHVybiBgLSBUaGUgZm9sbG93aW5nIHN5bGxhYmxlIG9mICZsdDske1xuICAgICAgc3lsbGFibGUudGFnTmFtZVxuICAgIH0mZ3Q7ICgke2dldFN5bGxhYmxlVGV4dChzeWxsYWJsZSl9KSB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoXG4gICAgICAneG1sOmlkJyxcbiAgICApfSBpcyBub3QgbGlua2VkIHRvIGFueSBzeWxsYWJsZVxcbmA7XG4gIH1cblxuICAvLyBDb25kaXRpb24gMzogVGhlIG5leHQgc3lsbGFibGUncyBAZm9sbG93cyBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgaXQgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdCAjaWRcbiAgaWYgKFxuICAgIG5leHRTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ2ZvbGxvd3MnKSAhPVxuICAgICcjJyArIHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJylcbiAgKSB7XG4gICAgcmV0dXJuIGAtIFRoZSBmb2xsb3dpbmcgc3lsbGFibGUgb2YgJmx0OyR7XG4gICAgICBzeWxsYWJsZS50YWdOYW1lXG4gICAgfSZndDsgKCR7Z2V0U3lsbGFibGVUZXh0KHN5bGxhYmxlKX0pIHdpdGggeG1sOmlkOiAke3N5bGxhYmxlLmdldEF0dHJpYnV0ZShcbiAgICAgICd4bWw6aWQnLFxuICAgICl9IGlzIGxpbmtlZCB0byB0aGUgd3Jvbmcgc3lsbGFibGVcXG5gO1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uIDQ6XG4gIC8vIFNpbmNlIHRoZSBAZm9sbG93cyB2YWx1ZSBpcyBjb3JyZWN0LCBhIHBhaXIgb2Ygc3lsbGFibGVzIGV4aXN0IGZvciB0aGUgdG9nZ2xlLWxpbmtlZCBzeWxsYWJsZS5cbiAgLy8gQ2hlY2sgaWYgdGhlIEBmb2xsb3dzIHN5bGxhYmxlIGlzIHRoZSBuZXh0IHN5bGxhYmxlIChpbmRleC13aXNlKSBpbiB0aGUgYXJyYXk6XG4gIGlmIChuZXh0U3lsbGFibGVJZHggIT09IGlkeCArIDEpIHtcbiAgICBjb25zdCBzeWxUZXh0ID0gZ2V0U3lsbGFibGVUZXh0KHN5bGxhYmxlKTtcbiAgICBjb25zdCB1bmV4cGVjdGVkU3lsc1RleHQgPSBzeWxsYWJsZXNcbiAgICAgIC5zbGljZShpZHggKyAxLCBuZXh0U3lsbGFibGVJZHgpXG4gICAgICAubWFwKChzeWxsYWJsZSkgPT4gZ2V0U3lsbGFibGVUZXh0KHN5bGxhYmxlKSk7XG5cbiAgICBjb25zdCBzeWxzVGV4dCA9IFtzeWxUZXh0LCAuLi51bmV4cGVjdGVkU3lsc1RleHRdLmpvaW4oJyAtICcpO1xuICAgIHJldHVybiBgLSBVbmV4cGVjdGVkIHN5bGxhYmxlKHMpIGluc2lkZSB0b2dnbGUtbGlua2VkICZsdDske1xuICAgICAgc3lsbGFibGUudGFnTmFtZVxuICAgIH0mZ3Q7ICgke3N5bHNUZXh0fSkgd2l0aCB4bWw6aWQ6ICR7c3lsbGFibGUuZ2V0QXR0cmlidXRlKFxuICAgICAgJ3htbDppZCcsXG4gICAgKX0gaXMgbGlua2VkIHRvIHRoZSB3cm9uZyBzeWxsYWJsZVxcbmA7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tGb2xsb3dzU3lsbGFibGUoc3lsbGFibGU6IEVsZW1lbnQsIHN5bGxhYmxlczogRWxlbWVudFtdKTogc3RyaW5nIHtcbiAgY29uc3QgcHJldlN5bGxhYmxlSWQgPSBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ2ZvbGxvd3MnKS5yZXBsYWNlKCcjJywgJycpO1xuICBjb25zdCBwcmV2U3lsbGFibGUgPSBzeWxsYWJsZXMuZmluZChcbiAgICAoc3lsbGFibGUpID0+IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJykgPT09IHByZXZTeWxsYWJsZUlkLFxuICApO1xuXG4gIC8vIENvbmRpdGlvbiAxOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZG9lcyBub3QgZXhpc3RcbiAgaWYgKCFwcmV2U3lsbGFibGUpIHtcbiAgICByZXR1cm4gYC0gJmx0OyR7c3lsbGFibGUudGFnTmFtZX0mZ3Q7ICgke2dldFN5bGxhYmxlVGV4dChcbiAgICAgIHN5bGxhYmxlLFxuICAgICl9KSB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoXG4gICAgICAneG1sOmlkJyxcbiAgICApfSBpcyBtaXNzaW5nIHRoZSBwcmVjZWRpbmcgcGFydFxcbmA7XG4gIH1cblxuICAvLyBDb25kaXRpb24gMjogVGhlIHByZXZpb3VzIHN5bGxhYmxlIGV4aXN0cywgYnV0IHRoZSBAcHJlY2VkZXMgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gIGlmICghcHJldlN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgncHJlY2VkZXMnKSkge1xuICAgIHJldHVybiBgLSBUaGUgcHJlY2VkaW5nIHN5bGxhYmxlIG9mICZsdDske1xuICAgICAgc3lsbGFibGUudGFnTmFtZVxuICAgIH0mZ3Q7ICgke2dldFN5bGxhYmxlVGV4dChzeWxsYWJsZSl9KSB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoXG4gICAgICAneG1sOmlkJyxcbiAgICApfSBpcyBub3QgbGlua2VkIHRvIGFueSBzeWxsYWJsZVxcbmA7XG4gIH1cblxuICAvLyBDb25kaXRpb24gMzogVGhlIHByZXZpb3VzIHN5bGxhYmxlJ3MgQHByZWNlZGVzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICBpZiAoXG4gICAgcHJldlN5bGxhYmxlLmdldEF0dHJpYnV0ZSgncHJlY2VkZXMnKSAhPVxuICAgICcjJyArIHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJylcbiAgKSB7XG4gICAgcmV0dXJuIGAtIFRoZSBwcmVjZWRpbmcgc3lsbGFibGUgb2YgJmx0OyR7XG4gICAgICBzeWxsYWJsZS50YWdOYW1lXG4gICAgfSZndDsgKCR7Z2V0U3lsbGFibGVUZXh0KFxuICAgICAgcHJldlN5bGxhYmxlLFxuICAgICl9KSB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoXG4gICAgICAneG1sOmlkJyxcbiAgICApfSBpcyBsaW5rZWQgdG8gdGhlIHdyb25nIHN5bGxhYmxlXFxuYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja09ibGlxdWUoc3lsbGFibGU6IEVsZW1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBuY3MgPSBzeWxsYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCduYycpO1xuICBsZXQgbmNJZHggPSAwO1xuICBsZXQgaW5mbyA9ICcnO1xuICB3aGlsZSAobmNJZHggPCBuY3MubGVuZ3RoKSB7XG4gICAgaWYgKG5jc1tuY0lkeF0uZ2V0QXR0cmlidXRlKCdsaWdhdGVkJykpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG5jSWR4IDwgbmNzLmxlbmd0aCAtIDEgJiYgIW5jc1tuY0lkeCArIDFdLmdldEF0dHJpYnV0ZSgnbGlnYXRlZCcpKSB8fFxuICAgICAgICBuY0lkeCA9PSBuY3MubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIG5jIGlzIGxpZ2F0ZWQsIGFuZCB0aGUgbmV4dCBuYyBpcyBub3RcbiAgICAgICAgLy8gT3IsIG5jIGlzIGxpZ2F0ZWQsIGJ1dCBhbHJlYWR5IGF0IHRoZSBlbmQgKHRoZXJlIGlzIG5vIG5leHQpXG4gICAgICAgIGluZm8gKz0gYC0gVGhlIG9ibGlxdWUgaW4gc3lsbGFibGUgKCR7Z2V0U3lsbGFibGVUZXh0KFxuICAgICAgICAgIHN5bGxhYmxlLFxuICAgICAgICApfSkgd2l0aCB4bWw6aWQ6ICR7c3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKX1cXG5gO1xuICAgICAgfVxuICAgICAgbmNJZHggKz0gMjtcbiAgICB9XG4gICAgbmNJZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBpbmZvO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ29sdW1uTGFiZWwobWVpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobWVpLCAndGV4dC94bWwnKTtcbiAgY29uc3QgbWVpRm9yVmFsaWRhdGlvbiA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgZm9yIChjb25zdCBzdGFmZiBvZiBBcnJheS5mcm9tKFxuICAgIG1laUZvclZhbGlkYXRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N0YWZmJyksXG4gICkpIHtcbiAgICBpZiAoc3RhZmYuaGFzQXR0cmlidXRlKCd0eXBlJykpIHtcbiAgICAgIHN0YWZmLnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpO1xuICByZXR1cm4gdmtiZWF1dGlmeS54bWwoc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhtZWlGb3JWYWxpZGF0aW9uKSk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RGYWNzQ2hpbGRyZW4oZWxlbWVudDogRWxlbWVudCwgYXJyYXk6IEVsZW1lbnRbXSk6IEVsZW1lbnRbXSB7XG4gIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZmFjcycpKSBhcnJheS5wdXNoKGVsZW1lbnQpO1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjYWxsIHRoZSBmdW5jdGlvbiBmb3IgY2hpbGQncyBjaGlsZHJlblxuICAgIGNvbGxlY3RGYWNzQ2hpbGRyZW4oY2hpbGQsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG4iLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuL3V0aWxzL01vZGFsV2luZG93JztcblxuY29uc3Qgc2NoZW1hUmVzcG9uc2UgPSBmZXRjaChfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9tZWktYWxsLnJuZycpO1xubGV0IHdvcmtlcjogV29ya2VyLCBzY2hlbWE6IHN0cmluZywgdmVyc2lvbkZpZWxkOiBIVE1MU3BhbkVsZW1lbnQsIHN0YXR1c0ZpZWxkOiBIVE1MU3BhbkVsZW1lbnQ7XG5cbi8qKlxuICogVXBkYXRlIHRoZSBVSSB3aXRoIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMuIENhbGxlZCB3aGVuIHRoZSBXZWJXb3JrZXIgZmluaXNoZXMgdmFsaWRhdGluZy5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlU3RhdHVzVUkgKG1lc3NhZ2U6IHsgZGF0YTogc3RyaW5nW10gfSk6IHZvaWQge1xuICBjb25zdCBlcnJvcnMgPSBtZXNzYWdlLmRhdGE7XG4gIGlmIChlcnJvcnMgPT09IG51bGwpIHtcbiAgICBzdGF0dXNGaWVsZC50ZXh0Q29udGVudCA9ICdWQUxJRCc7XG4gICAgc3RhdHVzRmllbGQuc3R5bGUuY29sb3IgPSAnIzRiYzE0Yic7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBzdGF0dXNGaWVsZC5jaGlsZHJlbikge1xuICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBsb2cgPSAnJztcbiAgICBlcnJvcnMuZm9yRWFjaChsaW5lID0+IHtcbiAgICAgIGxvZyArPSBsaW5lICsgJ1xcbic7XG4gICAgfSk7XG4gICAgc3RhdHVzRmllbGQudGV4dENvbnRlbnQgPSAnJztcbiAgICBzdGF0dXNGaWVsZC5zdHlsZS5jb2xvciA9ICdyZWQnO1xuICAgIC8vIENyZWF0ZSBhIG5ldyBkaXYgZm9yIGVhc2llciBsb2cgaW1wbGVtZW50YXRpb25cbiAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAvL2xpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgYGRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCR7ZW5jb2RlVVJJQ29tcG9uZW50KGxvZyl9YCk7XG4gICAgLy9saW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCAndmFsaWRhdGlvbi5sb2cnKTtcbiAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnSU5WQUxJRCc7XG4gICAgc3RhdHVzLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICBzdGF0dXNGaWVsZC5hcHBlbmRDaGlsZChzdGF0dXMpO1xuXG4gICAgc3RhdHVzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3RhdHVzT25DbGljay5iaW5kKHRoaXMsIGxvZykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25VSSAodmVyc2lvbjogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHJldHVybjtcbiAgfSBcblxuICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICBjYXNlICd1bmtub3duJzpcbiAgICAgIHZlcnNpb25GaWVsZC50ZXh0Q29udGVudCA9IHZlcnNpb247XG4gICAgICB2ZXJzaW9uRmllbGQuc3R5bGUuY29sb3IgPSAnZ3JheSc7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2ZXJzaW9uRmllbGQudGV4dENvbnRlbnQgPSB2ZXJzaW9uO1xuICAgICAgdmVyc2lvbkZpZWxkLnN0eWxlLmNvbG9yID0gJyM2OEE3QUQnO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXR1c09uQ2xpY2sobG9nOiBzdHJpbmcpIHtcbiAgdGhpcy5tb2RhbC5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkVSUk9SX0xPRywgbG9nKTtcbiAgdGhpcy5tb2RhbC5vcGVuTW9kYWxXaW5kb3coKTtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIGRpc3BsYXkgYW5kIGNyZWF0ZSB0aGUgV2ViV29ya2VyXG4gKiBmb3IgdmFsaWRhdGlvbiBNRUkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0IChuZW9uVmlldzogTmVvblZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVN0YXR1c0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLXN0YXR1cycpO1xuICBpZiAoZmlsZVN0YXR1c0RpdiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IG1laVZlcnNpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVpX3ZlcnNpb24nKTtcbiAgICBtZWlWZXJzaW9uLnRleHRDb250ZW50ID0gJ3Vua25vd24nO1xuICAgIHZlcnNpb25GaWVsZCA9IG1laVZlcnNpb247XG5cbiAgICBjb25zdCBtZWlTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsaWRhdGlvbl9zdGF0dXMnKTtcbiAgICBtZWlTdGF0dXMudGV4dENvbnRlbnQgPSAndW5rbm93bic7XG4gICAgc3RhdHVzRmllbGQgPSBtZWlTdGF0dXM7XG4gICAgd29ya2VyID0gbmV3IFdvcmtlcihfX0FTU0VUX1BSRUZJWF9fICsgJ3dvcmtlcnMvV29ya2VyLmpzJyk7XG4gICAgd29ya2VyLm9ubWVzc2FnZSA9IHVwZGF0ZVN0YXR1c1VJLmJpbmQobmVvblZpZXcpO1xuICB9XG59XG5cbi8qKlxuICogU2VuZCB0aGUgY29udGVudHMgb2YgYW4gTUVJIGZpbGUgdG8gdGhlIFdlYldvcmtlciBmb3IgdmFsaWRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZWlEYXRhXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRm9yVmFsaWRhdGlvbiAobWVpRGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzdGF0dXNGaWVsZCA9PT0gdW5kZWZpbmVkIHx8IHZlcnNpb25GaWVsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2NoZW1hUmVzcG9uc2U7XG4gICAgc2NoZW1hID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICB9XG4gIHN0YXR1c0ZpZWxkLnRleHRDb250ZW50ID0gJ2NoZWNraW5nLi4uJztcbiAgc3RhdHVzRmllbGQuc3R5bGUuY29sb3IgPSAnZ3JheSc7XG4gIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgbWVpOiBtZWlEYXRhLFxuICAgIHNjaGVtYTogc2NoZW1hXG4gIH0pO1xuXG4gIHZlcnNpb25GaWVsZC50ZXh0Q29udGVudCA9ICdjaGVja2luZy4uLic7XG4gIHZlcnNpb25GaWVsZC5zdHlsZS5jb2xvciA9ICdncmF5JztcbiAgY29uc3QgbWVpVmVyc2lvbiA9IGF3YWl0IGdldE1laVZlcnNpb24obWVpRGF0YSk7XG4gIHVwZGF0ZVZlcnNpb25VSShtZWlWZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIG1lc3NhZ2Ugb24gYSBibGFuayBwYWdlIHdoZW4gdGhlcmUgaXMgbm8gTUVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxhbmtQYWdlICgpOiB2b2lkIHtcbiAgaWYgKHN0YXR1c0ZpZWxkID09PSB1bmRlZmluZWQgfHwgdmVyc2lvbkZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhdHVzRmllbGQuY2hpbGRyZW4pIHtcbiAgICBjaGlsZC5yZW1vdmUoKTtcbiAgfVxuICBzdGF0dXNGaWVsZC50ZXh0Q29udGVudCA9ICdObyBNRUknO1xuICBzdGF0dXNGaWVsZC5zdHlsZS5jb2xvciA9ICdjb2xvcjpncmF5JztcblxuICB2ZXJzaW9uRmllbGQudGV4dENvbnRlbnQgPSAnTm8gTUVJJztcbiAgdmVyc2lvbkZpZWxkLnN0eWxlLmNvbG9yID0gJ2NvbG9yOmdyYXknO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNZWlWZXJzaW9uKG1laURhdGE6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgbWVpRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhtZWlEYXRhLCAndGV4dC94bWwnKTtcbiAgY29uc3QgbWVpID0gbWVpRG9jLmRvY3VtZW50RWxlbWVudDtcbiAgXG4gIGNvbnN0IG1laVZlcnNpb24gPSBtZWkuZ2V0QXR0cmlidXRlKCdtZWl2ZXJzaW9uJyk7XG4gIGlmIChtZWlWZXJzaW9uKSB7XG4gICAgcmV0dXJuIG1laVZlcnNpb247XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxufSIsIlxuLy8gSW5pdGlhbCBzYXZlZCBzdGF0dXNcbmxldCBzYXZlZCA9IHRydWU7XG5cblxuLyoqXG4gKiBVcGRhdGUgc3RhdHVzIG9mIHNhdmVkIHN0YXR1cyBpbmRpY2F0b3JcbiAqL1xuZnVuY3Rpb24gdXBkYXRlSW5kaWNhdG9yICgpOiB2b2lkIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oJyNmaWxlLXNhdmVkJyk7XG4gIGNvbnN0IHBhdGggPSBzYXZlZD8gYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3NhdmVkLWljb24uc3ZnYCA6IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy91bnNhdmVkLWljb24uc3ZnYDtcbiAgaW5kaWNhdG9yLnNldEF0dHJpYnV0ZSgnc3JjJywgcGF0aCk7XG4gIC8vIHNldCB0aGUgYWx0IGF0dHJpYnV0ZSBtZXNzYWdlIGRlcGVuZGluZyBvbiB3aGV0aGVyIGxhdGVzdCBjaGFuZ2VzIGFyZSBzYXZlIG9yIG5vdFxuICBjb25zdCBhbHRNZXNzYWdlID0gc2F2ZWQ/IFwiWW91ciB3b3JrIGlzIHNhdmVkXCIgOiBcIllvdSBoYXZlIHVuc2F2ZWQgd29ya1wiO1xuICBpbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdhbHQnLCBhbHRNZXNzYWdlKTtcbn1cblxuXG4vKipcbiAqIFNldCB0aGUgc2F2ZWQgc3RhdHVzIG9mIHRoZSBmb2xpb1xuICogXG4gKiBAcGFyYW0gc3RhdHVzIGJvb2xlYW4gdmFsdWUuIHRydWUgaWYgc3RhdHVzIGlzIFwic2F2ZWRcIiwgZmFsc2UgaWYgXCJub3Qgc2F2ZWRcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2F2ZWRTdGF0dXMgKHN0YXR1czogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gIHNhdmVkID0gc3RhdHVzO1xuICB1cGRhdGVJbmRpY2F0b3IoKTtcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBldmVudCBsaXN0ZW5lciB0aGF0IGNoZWNrcyBmb3IgdW5zYXZlZCBjaGFuZ2VzIG9uIHBhZ2UgcmVsb2FkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5VbnNhdmVkQ2hhbmdlcyAoKTogdm9pZCB7XG4gIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IChlOiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICAgIGlmICghc2F2ZWQpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzISc7XG4gICAgfVxuICB9O1xufSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCIvKiogQG1vZHVsZSBTcXVhcmVFZGl0L0NvbnRyb2xzICovXG5cbmltcG9ydCAqIGFzIENvbnRlbnRzIGZyb20gJy4vQ29udGVudHMnO1xuaW1wb3J0IHsgc2V0R3JvdXBpbmdIaWdobGlnaHQgfSBmcm9tICcuLi91dGlscy9Db2xvcic7XG5pbXBvcnQgeyB1bnNlbGVjdCB9IGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCBJbnNlcnRIYW5kbGVyIGZyb20gJy4vSW5zZXJ0SGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncywgc2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCB7IEluc2VydFRhYlR5cGUsIEluc2VydFR5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogQmluZCBsaXN0ZW5lcnMgdG8gaW5zZXJ0IHRhYnMuJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEluc2VydFRhYnMgKGluc2VydEhhbmRsZXI6IEluc2VydEhhbmRsZXIpOiB2b2lkIHtcbiAgY29uc3QgaW5zZXJ0VGFiczogRWxlbWVudFtdID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnNlcnRUYWInKSk7XG4gIGNvbnN0IHRhYklkczogc3RyaW5nW10gPSBpbnNlcnRUYWJzLm1hcCgodGFiKSA9PiB7IHJldHVybiB0YWIuaWQ7IH0pO1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZ0LmNvZGUubWF0Y2goL15EaWdpdFxcZCQvKSAmJiBldnQuc2hpZnRLZXkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKGV2dC5jb2RlW2V2dC5jb2RlLmxlbmd0aCAtIDFdKSAtIDE7XG4gICAgICAgIGNvbnN0IGluc2VydE9wdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnNlcnRlbCcpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGluc2VydE9wdGlvbnNbaW5kZXhdO1xuICAgICAgICAoPEhUTUxCdXR0b25FbGVtZW50PiBzZWxlY3RlZE9wdGlvbikuY2xpY2soKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHRhYklkcy5mb3JFYWNoKCh0YWIpID0+IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWIpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgZGVhY3RpdmF0ZSgnLmluc2VydFRhYicpO1xuICAgICAgYWN0aXZhdGUodGFiLCBpbnNlcnRIYW5kbGVyKTtcbiAgICAgIHNldFNldHRpbmdzKHsgaW5zZXJ0VGFiOiB0YWIgYXMgSW5zZXJ0VGFiVHlwZSB9KTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnNlcnRfZGF0YScpLmlubmVySFRNTCA9IENvbnRlbnRzLmluc2VydFRhYkh0bWxbdGFiXTtcbiAgICAgIGJpbmRFbGVtZW50cyhpbnNlcnRIYW5kbGVyKTtcbiAgICAgIGRlYWN0aXZhdGUoJy5pbnNlcnRlbCcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBpbnNlcnRNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICBhY3RpdmF0ZShpbnNlcnRNb2RlLCBpbnNlcnRIYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgZmlyc3RPcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnNlcnRlbCcpWzBdO1xuICAgICAgICBhY3RpdmF0ZShmaXJzdE9wdGlvbi5pZCwgaW5zZXJ0SGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgRWRpdCBhbmQgSW5zZXJ0IGNvbnRyb2wgcGFuZWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEluc2VydEVkaXRDb250cm9scyAoKTogdm9pZCB7XG5cbiAgY29uc3QgaW5zZXJ0UGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zZXJ0X2NvbnRyb2xzJyk7XG4gIGNvbnN0IGluc2VydEhlYWRpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zZXJ0TWVudScpO1xuICBjb25zdCBpbnNlcnRIZWFkaW5nVGl0bGUgPSBpbnNlcnRIZWFkaW5nLnF1ZXJ5U2VsZWN0b3IoJy5wYW5lbC1oZWFkaW5nLXRpdGxlJyk7XG4gIGNvbnN0IGluc2VydENvbnRlbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydENvbnRlbnRzJyk7XG4gIGNvbnN0IGluc2VydERyb3Bkb3duSWNvbiA9IGluc2VydEhlYWRpbmcucXVlcnlTZWxlY3Rvcignc3ZnID4gdXNlJyk7XG5cbiAgY29uc3QgZWRpdFBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRfY29udHJvbHMnKTtcbiAgY29uc3QgZWRpdEhlYWRpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdE1lbnUnKTtcbiAgY29uc3QgZGlzcGxheUhlYWRpbmdUaXRsZSA9IGVkaXRIZWFkaW5nLnF1ZXJ5U2VsZWN0b3IoJy5wYW5lbC1oZWFkaW5nLXRpdGxlJyk7XG4gIGNvbnN0IGVkaXRDb250ZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0Q29udGVudHMnKTtcbiAgY29uc3QgZWRpdERyb3Bkb3duSWNvbiA9IGVkaXRIZWFkaW5nLnF1ZXJ5U2VsZWN0b3IoJ3N2ZyA+IHVzZScpO1xuXG5cbiAgLy8gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gdXNlciBjbGlja3MgaW5zaWRlIEluc2VydCBwYW5lbFxuICAvLyBpbnNlcnQgbW9kZSBpcyBhY3RpdmF0ZWRcbiAgaW5zZXJ0UGFuZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZGlzcGxheUhlYWRpbmdUaXRsZS5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gICAgaW5zZXJ0SGVhZGluZ1RpdGxlLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcblxuICAgIHNldFNldHRpbmdzKHsgdXNlck1vZGU6ICdpbnNlcnQnIH0pO1xuXG4gICAgKDxIVE1MQnV0dG9uRWxlbWVudD4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmluc2VydGVsLmlzLWFjdGl2ZScpKS5jbGljaygpO1xuICAgIGVkaXRQYW5lbC5xdWVyeVNlbGVjdG9yKCcuc2lkZS1wYW5lbC1idG4uc2VsLWJ5LmlzLWFjdGl2ZScpLmNsYXNzTGlzdC5hZGQoJ3VuZm9jdXNlZCcpO1xuICAgIGluc2VydFBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5zaWRlLXBhbmVsLWJ0bi5pbnNlcnRlbC5pcy1hY3RpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCd1bmZvY3VzZWQnKTtcbiAgfSk7XG5cbiAgLy8gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gdXNlciBjbGlja3MgaW5zaWRlIEVkaXQgcGFuZWxcbiAgLy8gZWRpdCBtb2RlIGlzIGFjdGl2YXRlZFxuICBlZGl0UGFuZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaW5zZXJ0SGVhZGluZ1RpdGxlLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcbiAgICBkaXNwbGF5SGVhZGluZ1RpdGxlLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgICBcbiAgICBzZXRTZXR0aW5ncyh7IHVzZXJNb2RlOiAnZWRpdCcgfSk7XG5cbiAgICBpbnNlcnRQYW5lbC5xdWVyeVNlbGVjdG9yKCcuc2lkZS1wYW5lbC1idG4uaW5zZXJ0ZWwuaXMtYWN0aXZlJykuY2xhc3NMaXN0LmFkZCgndW5mb2N1c2VkJyk7XG4gICAgZWRpdFBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5zaWRlLXBhbmVsLWJ0bi5zZWwtYnkuaXMtYWN0aXZlJykuY2xhc3NMaXN0LnJlbW92ZSgndW5mb2N1c2VkJyk7XG4gIH0pO1xuXG5cbiAgaW5zZXJ0SGVhZGluZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyBpZiBpbnNlcnQgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGluc2VydENvbnRlbnRzLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykpIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGFuIG9wZW4gcGFuZWxcbiAgICAgIGluc2VydENvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgaW5zZXJ0Q29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGluc2VydENvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGluc2VydERyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9IFxuICAgIC8vIGlmIGluc2VydCBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdFxuICAgIGVsc2Uge1xuICAgICAgLy8gc2V0IGNsYXNzZXMgYW5kIHN0eWxlcyBmb3IgYSBjbG9zZWQgcGFuZWxcbiAgICAgIGluc2VydENvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ2Nsb3NlZCcpO1xuICAgICAgaW5zZXJ0Q29udGVudHMuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpbnNlcnRDb250ZW50cy5zdHlsZS5wYWRkaW5nID0gJzBweCc7XG4gICAgICB9LCAyMDApO1xuICAgICAgaW5zZXJ0RHJvcGRvd25JY29uLnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tc2lkZWApO1xuICAgIH1cbiAgfSk7XG5cbiAgZWRpdEhlYWRpbmcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gaWYgZWRpdCBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdFxuICAgIGlmIChlZGl0Q29udGVudHMuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKSkge1xuICAgICAgLy8gc2V0IGNsYXNzZXMgYW5kIHN0eWxlcyBmb3IgYW4gb3BlbiBwYW5lbFxuICAgICAgZWRpdENvbnRlbnRzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nsb3NlZCcpO1xuICAgICAgZWRpdENvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMC41ZW0gMC43NWVtJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlZGl0Q29udGVudHMuc3R5bGUub3ZlcmZsb3cgPSAndmlzaWJsZSc7XG4gICAgICB9LCAyMDApO1xuICAgICAgZWRpdERyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25gKTtcbiAgICB9XG4gICAgLy8gaWYgZWRpdCBwYW5lbCBpcyBjbG9zZWQsIG9wZW4gaXRcbiAgICBlbHNlIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGEgY2xvc2VkIHBhbmVsXG4gICAgICBlZGl0Q29udGVudHMuY2xhc3NMaXN0LmFkZCgnY2xvc2VkJyk7XG4gICAgICBlZGl0Q29udGVudHMuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlZGl0Q29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwcHgnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGVkaXREcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1zaWRlYCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBBY3RpdmF0ZSBhIGNlcnRhaW4gaW5zZXJ0IGFjdGlvbi5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgYWN0aXZhdGluZyBpbnNlcnQgUEFORUxTXG4gKiBhbmQgaW5zZXJ0IElDT05TICh3aHl5eSkuXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGluc2VydCBhY3Rpb24gdGFiLlxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZSAoaWQ6IHN0cmluZywgaW5zZXJ0SGFuZGxlcjogSW5zZXJ0SGFuZGxlcik6IHZvaWQge1xuICBjb25zdCBzZWxlY3RlZFRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgc2VsZWN0ZWRUYWIuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdpbnNlcnRlbCcpKSB7XG4gICAgaW5zZXJ0SGFuZGxlci5pbnNlcnRBY3RpdmUoaWQpO1xuICAgIHNldFNldHRpbmdzKHsgaW5zZXJ0TW9kZTogaWQgYXMgSW5zZXJ0VHlwZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERlYWN0aXZhdGUgYSBjZXJ0YWluIGluc2VydCBhY3Rpb24uXG4gKiBAcGFyYW0gdHlwZSAtIEEgQ1NTIHNlbGVjdG9yIGZvciB0aGUgYWN0aW9uIHRhYi5cbiAqL1xuZnVuY3Rpb24gZGVhY3RpdmF0ZSAodHlwZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVsTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHlwZSk7XG4gIGVsTGlzdC5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd1bmZvY3VzZWQnKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQmluZCBsaXN0ZW5lcnMgdG8gaW5zZXJ0IHRhYiBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gYmluZEVsZW1lbnRzIChpbnNlcnRIYW5kbGVyOiBJbnNlcnRIYW5kbGVyKSB7XG4gIGNvbnN0IGluc2VydEVsZW1lbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnNlcnRlbCcpKTtcbiAgY29uc3QgZWxlbWVudElkcyA9IGluc2VydEVsZW1lbnRzLm1hcChlbCA9PiBlbC5pZCk7XG4gIGVsZW1lbnRJZHMuZm9yRWFjaChlbCA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgZGVhY3RpdmF0ZSgnLmluc2VydGVsJyk7XG4gICAgICBhY3RpdmF0ZShlbCwgaW5zZXJ0SGFuZGxlcik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCBsaXN0ZW5lcnMgb24gdGhlIGJ1dHRvbnMgdG8gY2hhbmdlIHNlbGVjdGlvbiBtb2Rlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRTZWxlY3Rpb25CdXR0b25zICgpOiB2b2lkIHtcbiAgY29uc3Qgc2VsQnlTeWxsYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeVN5bGxhYmxlJyk7XG4gIGNvbnN0IHNlbEJ5TmV1bWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlOZXVtZScpO1xuICBjb25zdCBzZWxCeU5jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5TmMnKTtcbiAgY29uc3Qgc2VsQnlTdGFmZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeVN0YWZmJyk7XG4gIGNvbnN0IHNlbEJ5TGF5ZXJFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5TGF5ZXJFbGVtZW50Jyk7XG5cbiAgc2VsQnlTeWxsYWJsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGVjdEJ5U3lsbGFibGVIYW5kbGVyKTtcbiAgc2VsQnlOZXVtZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGVjdEJ5TmV1bWVIYW5kbGVyKTtcbiAgc2VsQnlOYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGVjdEJ5TmNIYW5kbGVyKTtcbiAgc2VsQnlTdGFmZi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGVjdEJ5U3RhZmZIYW5kbGVyKTtcbiAgc2VsQnlMYXllckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxCeUxheWVyRWxlbWVudEhhbmRsZXIpO1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJzEnKSBzZWxCeVN5bGxhYmxlLmNsaWNrKCk7XG4gICAgaWYgKGV2dC5rZXkgPT09ICcyJykgc2VsQnlOZXVtZS5jbGljaygpO1xuICAgIGlmIChldnQua2V5ID09PSAnMycpIHNlbEJ5TmMuY2xpY2soKTtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJzQnKSBzZWxCeVN0YWZmLmNsaWNrKCk7XG4gICAgaWYgKGV2dC5rZXkgPT09ICc1Jykgc2VsQnlMYXllckVsZW1lbnQuY2xpY2soKTtcbiAgfSk7XG5cblxuICBmdW5jdGlvbiBzZWxlY3RCeVN5bGxhYmxlSGFuZGxlciAoKSB7XG4gICAgaWYgKCFzZWxCeVN5bGxhYmxlLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICAgIHNldFNldHRpbmdzKHsgc2VsZWN0aW9uTW9kZTogJ3NlbEJ5U3lsbGFibGUnIH0pO1xuXG4gICAgICB1bnNlbGVjdCgpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBzZWxCeVN5bGxhYmxlLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICBzZWxCeU5ldW1lLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlOYy5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5U3RhZmYuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeUxheWVyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmlkID09PSAnaGlnaGxpZ2h0LXNlbGVjdGlvbicpIHtcbiAgICAgICAgICBzZXRHcm91cGluZ0hpZ2hsaWdodCgnc3lsbGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3RCeU5ldW1lSGFuZGxlciAoKSB7XG4gICAgaWYgKCFzZWxCeU5ldW1lLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICAgIHNldFNldHRpbmdzKHsgc2VsZWN0aW9uTW9kZTogJ3NlbEJ5TmV1bWUnIH0pO1xuXG4gICAgICB1bnNlbGVjdCgpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBzZWxCeU5ldW1lLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlOYy5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5U3lsbGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeVN0YWZmLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlMYXllckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94JykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5pZCA9PT0gJ2hpZ2hsaWdodC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoJ25ldW1lJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0QnlOY0hhbmRsZXIgKCkge1xuICAgIGlmICghc2VsQnlOYy5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICBzZXRTZXR0aW5ncyh7IHNlbGVjdGlvbk1vZGU6ICdzZWxCeU5jJyB9KTtcblxuICAgICAgdW5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgc2VsQnlOYy5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5TmV1bWUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeVN5bGxhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlTdGFmZi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5TGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGlnaGxpZ2h0LXNlbGVjdGVkJykuaWQgPT09ICdoaWdobGlnaHQtc2VsZWN0aW9uJykge1xuICAgICAgICAgIHNldEdyb3VwaW5nSGlnaGxpZ2h0KCduZXVtZScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdEJ5U3RhZmZIYW5kbGVyICgpIHtcbiAgICBpZiAoIXNlbEJ5U3RhZmYuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgc2V0U2V0dGluZ3MoeyBzZWxlY3Rpb25Nb2RlOiAnc2VsQnlTdGFmZicgfSk7XG5cbiAgICAgIHVuc2VsZWN0KCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHNlbEJ5U3RhZmYuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeU5ldW1lLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlOYy5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5U3lsbGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeUxheWVyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmlkID09PSAnaGlnaGxpZ2h0LXNlbGVjdGlvbicpIHtcbiAgICAgICAgICBzZXRHcm91cGluZ0hpZ2hsaWdodCgnc3RhZmYnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZWxCeUxheWVyRWxlbWVudEhhbmRsZXIgKCkge1xuICAgIGlmICghc2VsQnlMYXllckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgc2V0U2V0dGluZ3MoeyBzZWxlY3Rpb25Nb2RlOiAnc2VsQnlMYXllckVsZW1lbnQnIH0pO1xuXG4gICAgICB1bnNlbGVjdCgpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBzZWxCeUxheWVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5TmV1bWUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeU5jLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlTdGFmZi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5U3lsbGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94JykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5pZCA9PT0gJ2hpZ2hsaWdodC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoJ2xheWVyRWxlbWVudCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCB7IEVkaXRvckFjdGlvbiwgSW5zZXJ0QWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgZ2V0U1ZHUmVsQ29vcmRzLCBpc091dE9mU1ZHQm91bmRzLCBQb2ludCB9IGZyb20gJy4uL3V0aWxzL0Nvb3JkaW5hdGVzJztcbmltcG9ydCB7IHF1ZXVlTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IHNldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5cbi8qKlxuICogQ2xhc3MgdGhhdCBoYW5kbGVzIGluc2VydCBtb2RlLCBldmVudHMsIGFuZCBhY3Rpb25zLlxuICovXG5jbGFzcyBJbnNlcnRIYW5kbGVyIHtcbiAgdHlwZTogc3RyaW5nO1xuICBmaXJzdENsaWNrID0gdHJ1ZTtcbiAgY29vcmQ6IFBvaW50O1xuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBuZW9uVmlldzogTmVvblZpZXc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBuZW9uVmlldyAtIE5lb25WaWV3IHBhcmVudC5cbiAgICogQHBhcmFtIHNlbCAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gYXBwbHkgaW5zZXJ0IGxpc3RlbmVycyB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHNlbDogc3RyaW5nKSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWw7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gaW5zZXJ0IGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBUcmlnZ2VycyB0aGUgc3RhcnQgb2YgaW5zZXJ0IG1vZGUuXG4gICAqIEBwYXJhbSBidXR0b25JZCAtIFRoZSBJRCBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIGNsaWNrZWQuXG4gICAqL1xuICBpbnNlcnRBY3RpdmUgKGJ1dHRvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhbHJlYWR5SW5JbnNlcnRNb2RlID0gdGhpcy5pc0luc2VydE1vZGUoKTtcbiAgICBzd2l0Y2ggKGJ1dHRvbklkKSB7XG4gICAgICBjYXNlICdwdW5jdHVtJzpcbiAgICAgICAgdGhpcy50eXBlID0gJ25jJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkaWFtb25kJzpcbiAgICAgICAgdGhpcy50eXBlID0gJ25jJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0geyB0aWx0OiAnc2UnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmlyZ2EnOlxuICAgICAgICB0aGlzLnR5cGUgPSAnbmMnO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7IHRpbHQ6ICdzJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIC8vdGhlcmUgYXJlIG11bHRpcGxlIHBvc3NpYmxlIGxpcXVlc2NlbnQgY29tYmluYXRpb25zXG4gICAgICBjYXNlICdsaXF1ZXNjZW50QSc6XG4gICAgICAgIHRoaXMudHlwZSA9ICduYyc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgY3VydmU6ICdhJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xpcXVlc2NlbnRDJzpcbiAgICAgICAgdGhpcy50eXBlID0gJ25jJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0geyBjdXJ2ZTogJ2MnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmlyZ2FSZXZlcnNlZCc6XG4gICAgICAgIHRoaXMudHlwZSA9ICduYyc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgdGlsdDogJ24nIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGVzJzpcbiAgICAgIGNhc2UgJ2NsaXZpcyc6XG4gICAgICBjYXNlICdzY2FuZGljdXMnOlxuICAgICAgY2FzZSAnY2xpbWFjdXMnOlxuICAgICAgY2FzZSAndG9yY3VsdXMnOlxuICAgICAgY2FzZSAncG9ycmVjdHVzJzpcbiAgICAgIGNhc2UgJ3ByZXNzdXMnOlxuICAgICAgICBjb25zdCBjb250b3VyID0gdGhpcy5uZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAgIGJ1dHRvbklkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgYnV0dG9uSWQuc2xpY2UoMSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2dyb3VwaW5nJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0geyBjb250b3VyOiBjb250b3VyIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY0NsZWYnOlxuICAgICAgY2FzZSAnZkNsZWYnOlxuICAgICAgICB0aGlzLnR5cGUgPSAnY2xlZic7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgc2hhcGU6IGJ1dHRvbklkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3VzdG9zJzpcbiAgICAgICAgdGhpcy50eXBlID0gJ2N1c3Rvcyc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGl2TGluZU1heGltYSc6XG4gICAgICAgIHRoaXMudHlwZSA9ICdkaXZMaW5lJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0geyBmb3JtOiAnbWF4aW1hJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0YWZmJzpcbiAgICAgICAgdGhpcy50eXBlID0gJ3N0YWZmJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmbGF0JzpcbiAgICAgICAgdGhpcy50eXBlID0gJ2FjY2lkJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0geyBhY2NpZDogJ2YnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbmF0dXJhbCc6XG4gICAgICAgIHRoaXMudHlwZSA9ICdhY2NpZCc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgYWNjaWQ6ICduJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMudHlwZSA9ICcnO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGJ1dHRvbiBmb3IgaW5zZXJ0aW9uOiAnICsgYnV0dG9uSWQgKyAnLicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVJbnNlcnRDbGlja0hhbmRsZXJzKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzdGFmZicpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9yKVxuICAgICAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3RhZmZIYW5kbGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zZWxlY3RvcilcbiAgICAgICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAvLyBEaXNhYmxlIGVkaXQgbW9kZSBsaXN0ZW5lcnNcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRJbnNlcnRIYW5kbGVyKTtcblxuICAgIC8vIEFkZCAncmV0dXJuIHRvIGVkaXQgbW9kZScgYnV0dG9uXG4gICAgaWYgKCFhbHJlYWR5SW5JbnNlcnRNb2RlKSB7XG4gICAgICBjb25zdCBlZGl0TW9kZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgZWRpdE1vZGVCdXR0b24uaWQgPSAncmV0dXJuVG9FZGl0TW9kZSc7XG4gICAgICBlZGl0TW9kZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzaWRlLXBhbmVsLWJ0bicpO1xuICAgICAgZWRpdE1vZGVCdXR0b24uaW5uZXJIVE1MID0gJ1JldHVybiB0byBFZGl0IE1vZGUnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZG8nKS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGVkaXRNb2RlQnV0dG9uKTtcbiAgICAgIGVkaXRNb2RlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5pbnNlcnREaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRDb250ZW50cycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGluc2VydCBtb2RlIGFuZCByZW1vdmUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgaW5zZXJ0RGlzYWJsZWQgPSAoZnVuY3Rpb24gaW5zZXJ0RGlzYWJsZWQgKCk6IHZvaWQge1xuICAgIHRoaXMudHlwZSA9ICcnO1xuICAgIHRoaXMucmVtb3ZlSW5zZXJ0Q2xpY2tIYW5kbGVycygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXNldEluc2VydEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrYXdheUhhbmRsZXIpO1xuXG4gICAgdGhpcy5maXJzdENsaWNrID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldHVyblRvRWRpdE1vZGUnKS5yZW1vdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb25zb2xlLmRlYnVnKGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGluc2VydFBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydF9jb250cm9scycpO1xuICAgIGNvbnN0IGluc2VydEhlYWRpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zZXJ0TWVudScpO1xuICAgIGNvbnN0IGluc2VydEhlYWRpbmdUaXRsZSA9IGluc2VydEhlYWRpbmcucXVlcnlTZWxlY3RvcignLnBhbmVsLWhlYWRpbmctdGl0bGUnKTtcblxuICAgIGNvbnN0IGVkaXRQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0X2NvbnRyb2xzJyk7XG4gICAgY29uc3QgZWRpdEhlYWRpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdE1lbnUnKTtcbiAgICBjb25zdCBkaXNwbGF5SGVhZGluZ1RpdGxlID0gZWRpdEhlYWRpbmcucXVlcnlTZWxlY3RvcignLnBhbmVsLWhlYWRpbmctdGl0bGUnKTtcblxuICAgIGluc2VydEhlYWRpbmdUaXRsZS5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gICAgZGlzcGxheUhlYWRpbmdUaXRsZS5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG5cbiAgICBpbnNlcnRQYW5lbC5xdWVyeVNlbGVjdG9yKCcuc2lkZS1wYW5lbC1idG4uaW5zZXJ0ZWwuaXMtYWN0aXZlJykuY2xhc3NMaXN0LmFkZCgndW5mb2N1c2VkJyk7XG4gICAgZWRpdFBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5zaWRlLXBhbmVsLWJ0bi5zZWwtYnkuaXMtYWN0aXZlJykuY2xhc3NMaXN0LnJlbW92ZSgndW5mb2N1c2VkJyk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IHVzZXJNb2RlOiAnZWRpdCcgfSk7XG4gICAgXG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGhhbmRsZXIgdG8gaGFuZGxlIGEgdXNlciBjbGlja2luZyBhd2F5IGZyb20gdGhlIGFjdGl2ZSBwYWdlXG4gICAqIGNhdXNpbmcgaW5zZXJ0IG1vZGUgdG8gZW5kLlxuICAgKi9cbiAgY2xpY2thd2F5SGFuZGxlciA9IChmdW5jdGlvbiBjbGlja2F3YXlIYW5kbGVyIChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmFjdGl2ZS1wYWdlJykgPT09IG51bGwgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KCcjaW5zZXJ0X2NvbnRyb2xzJykgPT09IG51bGwgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KCcjc3ZnX2dyb3VwJykgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaW5zZXJ0RGlzYWJsZWQoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsXG4gICAgICAgIHRoaXMuc3RhZmZIYW5kbGVyKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsXG4gICAgICAgIHRoaXMuaGFuZGxlcik7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBSZXNldHMgYW4gaW5zZXJ0IGV2ZW50IGxpc3RlbmVyIGFmdGVyIHRlbXBvcmFyaWx5IHJlbW92aW5nIGl0LlxuICAgKi9cbiAgcmVzZXRJbnNlcnRIYW5kbGVyID0gKGZ1bmN0aW9uIHJlc2V0SW5zZXJ0SGFuZGxlciAoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zZWxlY3RvcilcbiAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy50eXBlID09PSAnc3RhZmYnID9cbiAgICAgICAgICB0aGlzLnN0YWZmSGFuZGxlciA6IHRoaXMuaGFuZGxlcik7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIHRvIGtleSBwcmVzc2VzIHRvIGVpdGhlciBleGl0IGVkaXQgbW9kZSAoaWYgRXNjYXBlKSBvclxuICAgKiB0ZW1wb3JhcmlseSByZW1vdmUgaW5zZXJ0IGV2ZW50IGxpc3RlbmVycyAoaWYgU2hpZnQpLlxuICAgKi9cbiAga2V5ZG93bkxpc3RlbmVyID0gKGZ1bmN0aW9uIGtleWRvd25MaXN0ZW5lciAoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLmluc2VydERpc2FibGVkKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnN0YWZmSGFuZGxlcik7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZXIpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgdGhpcy5yZW1vdmVJbnNlcnRDbGlja0hhbmRsZXJzKCk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBoYW5kbGVyIGZvciBjbGlja2luZyB0byBpbnNlcnQgYW55IGVsZW1lbnQgZXhjZXB0IGEgc3RhZmYuXG4gICAqL1xuICBoYW5kbGVyID0gKGZ1bmN0aW9uIGhhbmRsZXIgKGV2dDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgb3V0IG9mIGJvdW5kcywgbm90aGluZyBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gICAgY29uc3QgY3Vyc29yID0gZ2V0U1ZHUmVsQ29vcmRzKGV2dC5jbGllbnRYLCBldnQuY2xpZW50WSk7XG4gICAgaWYgKGlzT3V0T2ZTVkdCb3VuZHMoY3Vyc29yLngsIGN1cnNvci55KSlcbiAgICAgIHJldHVybiBxdWV1ZU5vdGlmaWNhdGlvbignW0ZBSUxdIEdseXBoIHdhcyBwbGFjZWQgb3V0IG9mIGJvdW5kcyEgSW5zZXJ0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogSW5zZXJ0QWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnaW5zZXJ0JyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIHN0YWZmSWQ6ICdhdXRvJyxcbiAgICAgICAgdWx4OiBjdXJzb3IueCxcbiAgICAgICAgdWx5OiBjdXJzb3IueSxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgICAgZWRpdG9yQWN0aW9uLnBhcmFtLmF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzWydzaGFwZSddID09PSAnRicpIHtcbiAgICAgICAgZWRpdG9yQWN0aW9uWydwYXJhbSddWyd1bHgnXSAtPSA1MDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9yKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlcik7XG4gICAgfSk7XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGhhbmRsZXIgdG8gaW5zZXJ0IGEgc3RhZmYuXG4gICAqL1xuICBzdGFmZkhhbmRsZXIgPSAoZnVuY3Rpb24gc3RhZmZIYW5kbGVyIChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJzb3IgPSBnZXRTVkdSZWxDb29yZHMoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcblxuICAgIGlmIChpc091dE9mU1ZHQm91bmRzKGN1cnNvci54LCBjdXJzb3IueSkpIHtcbiAgICAgIHJldHVybiBxdWV1ZU5vdGlmaWNhdGlvbignU3RhZmYgY2Fubm90IGJlIHBsYWNlZCBvdXQgb2YgYm91bmRzIScsICdlcnJvcicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZSA+IC5kZWZpbml0aW9uLXNjYWxlJyk7XG5cbiAgICBpZiAodGhpcy5maXJzdENsaWNrKSB7XG4gICAgICB0aGlzLmNvb3JkID0gY3Vyc29yO1xuICAgICAgZDMuc2VsZWN0KGNvbnRhaW5lcikuYXBwZW5kKCdjaXJjbGUnKS5hdHRyKCdjeCcsIGN1cnNvci54KVxuICAgICAgICAuYXR0cignY3knLCBjdXJzb3IueSlcbiAgICAgICAgLmF0dHIoJ3InLCAxMClcbiAgICAgICAgLmF0dHIoJ2lkJywgJ3N0YWZmLWNpcmNsZScpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ2dyZWVuJyk7XG4gICAgICB0aGlzLmZpcnN0Q2xpY2sgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVsOiBQb2ludCwgbHI6IFBvaW50O1xuICAgICAgaWYgKGN1cnNvci54IDwgdGhpcy5jb29yZC54IHx8IGN1cnNvci55IDwgdGhpcy5jb29yZC55KSB7IC8vIHNlY29uZCBwb2ludCBpcyBub3QgbHJcbiAgICAgICAgdWwgPSBjdXJzb3I7XG4gICAgICAgIGxyID0gdGhpcy5jb29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVsID0gdGhpcy5jb29yZDtcbiAgICAgICAgbHIgPSBjdXJzb3I7XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhZmYtY2lyY2xlJykucmVtb3ZlKCk7XG4gICAgICBjb25zdCBhY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnaW5zZXJ0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50VHlwZTogJ3N0YWZmJyxcbiAgICAgICAgICBzdGFmZklkOiAnYXV0bycsXG4gICAgICAgICAgdWx4OiB1bC54LFxuICAgICAgICAgIHVseTogdWwueSxcbiAgICAgICAgICBscng6IGxyLngsXG4gICAgICAgICAgbHJ5OiBsci55XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMubmVvblZpZXcuZWRpdChhY3Rpb24sIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLmZpcnN0Q2xpY2sgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGluc2VydCBsaXN0ZW5lcnMgd2hpbGUgbm90IGxlYXZpbmcgaW5zZXJ0IG1vZGUgZW50aXJlbHkuXG4gICAqL1xuICByZW1vdmVJbnNlcnRDbGlja0hhbmRsZXJzID0gKGZ1bmN0aW9uIHJlbW92ZUluc2VydENsaWNrSGFuZGxlcnMgKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuc2VsZWN0b3IpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zdGFmZkhhbmRsZXIpO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9yKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlcik7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSkuYmluZCh0aGlzKTtcblxuICBpc0luc2VydE1vZGUgKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy50eXBlICE9PSAnJyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSW5zZXJ0SGFuZGxlciBhcyBkZWZhdWx0IH07XG4iLCIvKipcbiAqIENvbnRlbnRzIG9mIG5hdmJhciBtZW51IGFmdGVyIHN3aXRjaGluZyB0byBlZGl0IG1vZGUuXG4gKi9cblxuLy8gXCJGaWxlXCIgRHJvcGRvd25cbmV4cG9ydCBjb25zdCBuYXZiYXJEcm9wZG93bkZpbGVNZW51OiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xubmF2YmFyRHJvcGRvd25GaWxlTWVudS5jbGFzc0xpc3QuYWRkKCduYXZiYXItaXRlbScsICdoYXMtZHJvcGRvd24nLCAnaXMtaG92ZXJhYmxlJyk7XG5jb25zdCBmaWxlRHJvcGRvd25CdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbmZpbGVEcm9wZG93bkJ0bi5jbGFzc0xpc3QuYWRkKCduYXZiYXItYnRuJyk7XG5maWxlRHJvcGRvd25CdG4uaW5uZXJIVE1MID0gJzxkaXY+RmlsZTwvZGl2Pic7XG5jb25zdCBmaWxlTmF2YmFyQ29udGVudHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbmZpbGVOYXZiYXJDb250ZW50cy5jbGFzc0xpc3QuYWRkKCduYXZiYXItZHJvcGRvd24nKTtcbmZpbGVOYXZiYXJDb250ZW50cy5pZCA9ICduYXZiYXItZHJvcGRvd24tb3B0aW9ucyc7XG5cbmNvbnN0IGZpbGVEcm9wZG93bkNvbnRlbnRzID0gW1xuICBbJ3NhdmUnLCAnU2F2ZSddLFxuICBbJ2V4cG9ydCcsICdTYXZlIGFuZCBFeHBvcnQgdG8gRmlsZSddLFxuICBbJ2dldG1laScsICdEb3dubG9hZCBNRUknXVxuXTtcblxuZmlsZURyb3Bkb3duQ29udGVudHMuZm9yRWFjaChjb250ZW50ID0+IHtcbiAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBpdGVtLmlkID0gY29udGVudFswXTtcbiAgaXRlbS5jbGFzc0xpc3QuYWRkKCduYXZiYXItZHJvcGRvd24taXRlbScpO1xuICBpdGVtLnRleHRDb250ZW50ID0gY29udGVudFsxXTtcbiAgZmlsZU5hdmJhckNvbnRlbnRzLmFwcGVuZENoaWxkKGl0ZW0pO1xufSk7XG5cbm5hdmJhckRyb3Bkb3duRmlsZU1lbnUuYXBwZW5kQ2hpbGQoZmlsZURyb3Bkb3duQnRuKTtcbm5hdmJhckRyb3Bkb3duRmlsZU1lbnUuYXBwZW5kQ2hpbGQoZmlsZU5hdmJhckNvbnRlbnRzKTtcblxuLy8gXCJNRUkgQWN0aW9uc1wiIERyb3Bkb3duXG5leHBvcnQgY29uc3QgbmF2YmFyRHJvcGRvd25NRUlBY3Rpb25zTWVudTogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbm5hdmJhckRyb3Bkb3duTUVJQWN0aW9uc01lbnUuY2xhc3NMaXN0LmFkZCgnbmF2YmFyLWl0ZW0nLCAnaGFzLWRyb3Bkb3duJywgJ2lzLWhvdmVyYWJsZScpO1xuY29uc3QgbWVpQWN0aW9uc0Ryb3Bkb3duQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5tZWlBY3Rpb25zRHJvcGRvd25CdG4uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLWJ0bicpO1xubWVpQWN0aW9uc0Ryb3Bkb3duQnRuLmlubmVySFRNTCA9ICc8ZGl2Pk1FSSBBY3Rpb25zPC9kaXY+JztcbmNvbnN0IG1laUFjdGlvbnNOYXZiYXJDb250ZW50cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xubWVpQWN0aW9uc05hdmJhckNvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ25hdmJhci1kcm9wZG93bicpO1xubWVpQWN0aW9uc05hdmJhckNvbnRlbnRzLmlkID0gJ25hdmJhci1kcm9wZG93bi1vcHRpb25zJztcbmNvbnN0IG1laUFjdGlvbnNEcm9wZG93bkNvbnRlbnRzID0gW1xuICBbJ3JlbW92ZS1lbXB0eS1zeWxzJywgJ1JlbW92ZSBFbXB0eSBTeWxsYWJsZXMnXSxcbiAgWydyZW1vdmUtZW1wdHktbmV1bWVzJywgJ1JlbW92ZSBFbXB0eSBOZXVtZXMnXSxcbiAgWydyZXZlcnQnLCAnUmV2ZXJ0J11cbl07XG5cbm1laUFjdGlvbnNEcm9wZG93bkNvbnRlbnRzLmZvckVhY2goY29udGVudCA9PiB7XG4gIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaXRlbS5pZCA9IGNvbnRlbnRbMF07XG4gIGl0ZW0uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLWRyb3Bkb3duLWl0ZW0nKTtcbiAgaXRlbS50ZXh0Q29udGVudCA9IGNvbnRlbnRbMV07XG4gIG1laUFjdGlvbnNOYXZiYXJDb250ZW50cy5hcHBlbmRDaGlsZChpdGVtKTtcbn0pO1xuXG5uYXZiYXJEcm9wZG93bk1FSUFjdGlvbnNNZW51LmFwcGVuZENoaWxkKG1laUFjdGlvbnNEcm9wZG93bkJ0bik7XG5uYXZiYXJEcm9wZG93bk1FSUFjdGlvbnNNZW51LmFwcGVuZENoaWxkKG1laUFjdGlvbnNOYXZiYXJDb250ZW50cyk7XG5cbi8qKlxuICogRmluYWxpemUgb3B0aW9uIGluIHRoZSBuYXZiYXIgZm9yIHJvZGFuXG4gKi9cbmV4cG9ydCBjb25zdCBuYXZiYXJGaW5hbGl6ZSA9XG4gICAgJzxhIGlkPVwiZmluYWxpemVcIiBjbGFzcz1cIm5hdmJhci1pdGVtXCI+IEZpbmFsaXplIE1FSSA8L2E+JztcblxuLyoqXG4gKiBDb250ZW50cyBvZiB0aGUgdW5kby9yZWRvIHBhbmVsIHdpdGggYnV0dG9uc1xuICovXG5leHBvcnQgY29uc3QgdW5kb1JlZG9QYW5lbCA9XG4gIGA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInVuZG9cIj5VbmRvPC9idXR0b24+XG4gIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwicmVkb1wiPlJlZG88L2J1dHRvbj5gO1xuIiwiaW1wb3J0ICogYXMgTm90aWZpY2F0aW9uIGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBjb252ZXJ0VG9OZW9uIH0gZnJvbSAnLi9Db252ZXJ0TWVpJztcbmltcG9ydCB7IEVkaXRvckFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcblxuLyoqXG4gKiBTZXQgdG9wIG5hdmJhciBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TmF2YmFyKG5lb25WaWV3OiBOZW9uVmlldyk6IHZvaWQge1xuICAvLyBzZXR1cCBuYXZiYXIgbGlzdGVuZXJzXG4gIGNvbnN0IG5hdmJhckRyb3Bkb3ducyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgJy5uYXZiYXItaXRlbS5oYXMtZHJvcGRvd24uaXMtaG92ZXJhYmxlJyxcbiAgKTtcbiAgQXJyYXkuZnJvbShuYXZiYXJEcm9wZG93bnMpLmZvckVhY2goKGRyb3BEb3duKSA9PiB7XG4gICAgZHJvcERvd24uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgLy9cbiAgICB9KTtcbiAgfSk7XG5cbiAgLyogXCJGSUxFXCIgbWVudSAqL1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG5lb25WaWV3LnNhdmUoKS50aGVuKCgpID0+IHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2F2ZWQnLCAnc3VjY2VzcycpO1xuICAgIH0pO1xuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIGlmIChldnQua2V5ID09PSAncycpIHtcbiAgICAgIG5lb25WaWV3LnNhdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTYXZlZCcsICdzdWNjZXNzJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBvcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBuZW9uVmlldy5leHBvcnQoKS50aGVuKChtYW5pZmVzdCkgPT4ge1xuICAgICAgY29uc3QgbGluazogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBsaW5rLmhyZWYgPSBtYW5pZmVzdCBhcyBzdHJpbmc7XG4gICAgICBsaW5rLmRvd25sb2FkID0gbmVvblZpZXcubmFtZSArICcuanNvbmxkJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICBsaW5rLnJlbW92ZSgpO1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTYXZlZCcsICdzdWNjZXNzJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIERvd25sb2FkIGxpbmsgZm9yIE1FSVxuICAvLyBJcyBhbiBhY3R1YWwgZmlsZSB3aXRoIGEgdmFsaWQgVVJJIGV4Y2VwdCBpbiBsb2NhbCBtb2RlIHdoZXJlIGl0IG11c3QgYmUgZ2VuZXJhdGVkLlxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2V0bWVpJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3QgdXJpID0gbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpO1xuICAgIG5lb25WaWV3LmdldFBhZ2VNRUkodXJpKS50aGVuKChtZWkpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPVxuICAgICAgICAnZGF0YTphcHBsaWNhdGlvbi9tZWkreG1sO2Jhc2U2NCwnICsgd2luZG93LmJ0b2EoY29udmVydFRvTmVvbihtZWkpKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZXRtZWknKS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBkYXRhKTtcbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5nZXRFbGVtZW50QnlJZCgnZ2V0bWVpJylcbiAgICAgICAgLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBuZW9uVmlldy52aWV3LmdldFBhZ2VOYW1lKCkgKyAnLm1laScpO1xuICAgIH0pO1xuICB9KTtcblxuICAvKiBcIk1FSSBBQ1RJT05TXCIgbWVudSAqL1xuICAvLyBFdmVudCBsaXN0ZW5lciBmb3IgXCJSZW1vdmUgRW1wdHkgU3lsbGFibGVzXCIgYnV0dG9uIGluc2lkZSBcIk1FSSBBY3Rpb25zXCIgZHJvcGRvd25cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoJ3JlbW92ZS1lbXB0eS1zeWxzJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1cmkgPSBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCk7XG5cbiAgICAgIG5lb25WaWV3LmdldFBhZ2VNRUkodXJpKS50aGVuKChtZWlTdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1laVN0cmluZywgJ3RleHQveG1sJyk7XG4gICAgICAgIGNvbnN0IG1laSA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHN5bGxhYmxlcyA9IEFycmF5LmZyb20obWVpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzeWxsYWJsZScpKTtcblxuICAgICAgICAvLyBDaGVjayBmb3Igc3lsbGFibGVzIHdpdGhvdXQgbmV1bWVzXG4gICAgICAgIGxldCBoYXNFbXB0eVN5bGxhYmxlcyA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZW1vdmVTeWxsYWJsZUFjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzeWxsYWJsZSBvZiBzeWxsYWJsZXMpIHtcbiAgICAgICAgICAvLyBpZiBlbXB0eSBzeWxsYWJsZSBmb3VuZCwgY3JlYXRlIGFjdGlvbiBvYmplY3QgZm9yIHJlbW92aW5nIGl0XG4gICAgICAgICAgaWYgKHN5bGxhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCduZXVtZScpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgdG9SZW1vdmU6IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgICAgICAgYWN0aW9uOiAncmVtb3ZlJyxcbiAgICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gYWRkIGFjdGlvbiBvYmplY3QgdG8gYXJyYXkgKGNoYWluKSBvZiBhY3Rpb24gb2JqZWN0c1xuICAgICAgICAgICAgcmVtb3ZlU3lsbGFibGVBY3Rpb25zLnB1c2godG9SZW1vdmUpO1xuICAgICAgICAgICAgaGFzRW1wdHlTeWxsYWJsZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGVtcHR5IHN5bGxhYmxlcyB3ZXJlIGZvdW5kXG4gICAgICAgIGlmICghaGFzRW1wdHlTeWxsYWJsZXMpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ05vIGVtcHR5IHN5bGxhYmxlcyBmb3VuZCcsICd3YXJuaW5nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY3JlYXRlIFwiY2hhaW4gYWN0aW9uXCIgb2JqZWN0XG4gICAgICAgICAgY29uc3QgY2hhaW5SZW1vdmVBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiByZW1vdmVTeWxsYWJsZUFjdGlvbnMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIGV4ZWN1dGUgYWN0aW9uIHRoYXQgcmVtb3ZlcyBhbGwgZW1wdHkgc3lsbGFibGVzXG4gICAgICAgICAgLy8gXCJyZXN1bHRcIiB2YWx1ZSBpcyB0cnVlIG9yIGZhbHNlICh0cnVlIGlmIGNoYWluIG9mIGFjdGlvbnMgd2FzIHN1Y2Nlc3NmdWwpXG4gICAgICAgICAgbmVvblZpZXcuZWRpdChjaGFpblJlbW92ZUFjdGlvbiwgdXJpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAgICdSZW1vdmVkIGVtcHR5IFN5bGxhYmxlcycsXG4gICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcmVtb3ZlIGVtcHR5IFN5bGxhYmxlcycsXG4gICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXIgZm9yIFwiUmVtb3ZlIEVtcHR5IE5ldW1lc1wiIGJ1dHRvbiBpbnNpZGUgXCJNRUkgQWN0aW9uc1wiIGRyb3Bkb3duXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdyZW1vdmUtZW1wdHktbmV1bWVzJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1cmkgPSBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCk7XG5cbiAgICAgIG5lb25WaWV3LmdldFBhZ2VNRUkodXJpKS50aGVuKChtZWlTdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1laVN0cmluZywgJ3RleHQveG1sJyk7XG4gICAgICAgIGNvbnN0IG1laSA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG5ldW1lcyA9IEFycmF5LmZyb20obWVpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCduZXVtZScpKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgbmV1bWVzIHdpdGhvdXQgbmV1bWUgY29tcG9uZW50c1xuICAgICAgICBsZXQgaGFzRW1wdHlOZXVtZXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVtb3ZlTmV1bWVBY3Rpb25zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbmV1bWUgb2YgbmV1bWVzKSB7XG4gICAgICAgICAgLy8gaWYgZW1wdHkgbmV1bWUgZm91bmQsIGNyZWF0ZSBhY3Rpb24gb2JqZWN0IGZvciByZW1vdmluZyBpdFxuICAgICAgICAgIGlmIChuZXVtZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbmMnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGFjdGlvbjogJ3JlbW92ZScsXG4gICAgICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudElkOiBuZXVtZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGFkZCBhY3Rpb24gb2JqZWN0IHRvIGFycmF5IChjaGFpbikgb2YgYWN0aW9uIG9iamVjdHNcbiAgICAgICAgICAgIHJlbW92ZU5ldW1lQWN0aW9ucy5wdXNoKHRvUmVtb3ZlKTtcbiAgICAgICAgICAgIGhhc0VtcHR5TmV1bWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBlbXB0eSBuZXVtZXMgd2VyZSBmb3VuZFxuICAgICAgICBpZiAoIWhhc0VtcHR5TmV1bWVzKSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdObyBlbXB0eSBOZXVtZXMgZm91bmQnLCAnd2FybmluZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNyZWF0ZSBcImNoYWluIGFjdGlvblwiIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNoYWluUmVtb3ZlQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgICAgICAgICBwYXJhbTogcmVtb3ZlTmV1bWVBY3Rpb25zLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBleGVjdXRlIGFjdGlvbiB0aGF0IHJlbW92ZXMgYWxsIGVtcHR5IG5ldW1lc1xuICAgICAgICAgIC8vIFwicmVzdWx0XCIgdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZSAodHJ1ZSBpZiBjaGFpbiBvZiBhY3Rpb25zIHdhcyBzdWNjZXNzZnVsKVxuICAgICAgICAgIG5lb25WaWV3LmVkaXQoY2hhaW5SZW1vdmVBY3Rpb24sIHVyaSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignUmVtb3ZlZCBlbXB0eSBOZXVtZXMnLCAnc3VjY2VzcycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcmVtb3ZlIGVtcHR5IE5ldW1lcycsXG4gICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoJ3JlbW92ZS1vdXQtb2YtYm91bmRzLWdseXBocycpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXJpID0gbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpO1xuICAgICAgbmVvblZpZXcuZ2V0UGFnZU1FSSh1cmkpLnRoZW4oKG1laVN0cmluZykgPT4ge1xuICAgICAgICAvLyBMb2FkIE1FSSBkb2N1bWVudCBpbnRvIHBhcnNlclxuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobWVpU3RyaW5nLCAndGV4dC94bWwnKTtcbiAgICAgICAgY29uc3QgbWVpID0gbWVpRG9jLmRvY3VtZW50RWxlbWVudDtcblxuICAgICAgICAvLyBHZXQgYm91bmRzIG9mIHRoZSBNRUlcbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IG1laS5xdWVyeVNlbGVjdG9yKCdzdXJmYWNlJyk7XG4gICAgICAgIGNvbnN0IG1laUxyeCA9IE51bWJlcihkaW1lbnNpb25zLmdldEF0dHJpYnV0ZSgnbHJ4JykpLFxuICAgICAgICAgIG1laUxyeSA9IE51bWJlcihkaW1lbnNpb25zLmdldEF0dHJpYnV0ZSgnbHJ5JykpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGlzQXR0ck91dE9mQm91bmRzKHpvbmU6IEVsZW1lbnQsIGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgIGNvbnN0IGNvb3JkID0gTnVtYmVyKHpvbmUuZ2V0QXR0cmlidXRlKGF0dHIpKTtcbiAgICAgICAgICBjb25zdCBjb21wID0gYXR0ciA9PSAnbHJ4JyB8fCBhdHRyID09ICd1bHgnID8gbWVpTHJ4IDogbWVpTHJ5O1xuICAgICAgICAgIHJldHVybiBjb29yZCA8IDAgfHwgY29vcmQgPiBjb21wO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFycmF5IG9mIHpvbmVzIHRoYXQgYXJlIG91dCBvZiBib3VuZCwgYW5kIGNyZWF0ZSBhIGhhc2ggbWFwXG4gICAgICAgIC8vIGZvciBmYXN0IHJldHJpZXZhbFxuICAgICAgICBjb25zdCB6b25lcyA9IEFycmF5LmZyb20obWVpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3pvbmUnKSk7XG4gICAgICAgIGNvbnN0IG91dE9mQm91bmRab25lcyA9IHpvbmVzLmZpbHRlcigoem9uZSkgPT5cbiAgICAgICAgICBbJ3VseCcsICd1bHknLCAnbHJ4JywgJ2xyeSddLnNvbWUoKGF0dHIpID0+XG4gICAgICAgICAgICBpc0F0dHJPdXRPZkJvdW5kcyh6b25lLCBhdHRyKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB6b25lTWFwID0gbmV3IE1hcChcbiAgICAgICAgICBvdXRPZkJvdW5kWm9uZXMubWFwKCh6b25lKSA9PiBbem9uZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLCB6b25lXSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRmlsdGVyIG91dCB0aGUgbmV1bWUgY29tcG9uZW50cyBhbmQgZGl2bGluZXMgdGhhdCBoYXZlIGEgem9uZSBvdXQgb2YgYm91bmRzXG4gICAgICAgIGNvbnN0IGdseXBocyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgbWVpLnF1ZXJ5U2VsZWN0b3JBbGwoJ25jLCBkaXZMaW5lLCBjbGVmLCBhY2NpZCcpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBvdXRPZkJvdW5kR2x5cGhzID0gZ2x5cGhzLmZpbHRlcigoZ2x5cGgpID0+IHtcbiAgICAgICAgICBpZiAoZ2x5cGguaGFzQXR0cmlidXRlKCdmYWNzJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZhY3NJZCA9IGdseXBoLmdldEF0dHJpYnV0ZSgnZmFjcycpLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIHpvbmVNYXAuaGFzKGZhY3NJZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgbm8gb3V0LW9mLWJvdW5kIGdseXBocywgYW5kXG4gICAgICAgIC8vIGV4aXQsIHNpbmNlIG5vIGVkaXQgbmVlZHMgdG8gYmUgbWFkZS5cbiAgICAgICAgaWYgKG91dE9mQm91bmRHbHlwaHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGVyZSBhcmUgbm8gb3V0LW9mLWJvdW5kIGdseXBocyB0byByZW1vdmUuJyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHJlbW92ZSBhY3Rpb25zIGFuZCBjaGFpbiBhY3Rpb24gdG8gc2VuZCB0byBWZXJvdmlvXG4gICAgICAgIGNvbnN0IHJlbW92ZUFjdGlvbnM6IEVkaXRvckFjdGlvbltdID0gb3V0T2ZCb3VuZEdseXBocy5tYXAoKGdseXBoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3JlbW92ZScsXG4gICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICBlbGVtZW50SWQ6IGdseXBoLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgICAgICAgIHBhcmFtOiByZW1vdmVBY3Rpb25zLFxuICAgICAgICB9O1xuXG4gICAgICAgIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIHVyaSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSByZW1vdmVkIG91dC1vZi1ib3VuZHMgc3lsbGFibGVzLicsXG4gICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgJ0ZhaWxlZCB0byByZW1vdmUgb3V0LW9mLWJvdW5kIHN5bGxhYmxlcy4nLFxuICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoJ3VudG9nZ2xlLWludmFsaWQtb2JsaXF1ZScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXJpID0gbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpO1xuICAgICAgbmVvblZpZXcuZ2V0UGFnZU1FSSh1cmkpLnRoZW4oKG1laVN0cmluZykgPT4ge1xuICAgICAgICAvLyBMb2FkIE1FSSBkb2N1bWVudCBpbnRvIHBhcnNlclxuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobWVpU3RyaW5nLCAndGV4dC94bWwnKTtcbiAgICAgICAgY29uc3QgbWVpID0gbWVpRG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgY29uc3QgbmNzID0gQXJyYXkuZnJvbShtZWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ25jJykpO1xuXG4gICAgICAgIGxldCBoYXNJbnZhbGlkT2JsaXF1ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjaGFpbkFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICBwYXJhbTogW10sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcbiAgICAgICAgbGV0IG5jSWR4ID0gMDtcbiAgICAgICAgd2hpbGUgKG5jSWR4IDwgbmNzLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChuY3NbbmNJZHhdLmdldEF0dHJpYnV0ZSgnbGlnYXRlZCcpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChuY0lkeCA8IG5jcy5sZW5ndGggLSAxICYmXG4gICAgICAgICAgICAgICAgIW5jc1tuY0lkeCArIDFdLmdldEF0dHJpYnV0ZSgnbGlnYXRlZCcpKSB8fFxuICAgICAgICAgICAgICBuY0lkeCA9PSBuY3MubGVuZ3RoIC0gMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIElmIG5jIGlzIGxpZ2F0ZWQsIGFuZCB0aGUgbmV4dCBuYyBpcyBub3RcbiAgICAgICAgICAgICAgLy8gT3IsIG5jIGlzIGxpZ2F0ZWQsIGJ1dCBhbHJlYWR5IGF0IHRoZSBlbmQgKHRoZXJlIGlzIG5vIG5leHQpXFxcbiAgICAgICAgICAgICAgaGFzSW52YWxpZE9ibGlxdWUgPSB0cnVlO1xuICAgICAgICAgICAgICBwYXJhbS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IG5jc1tuY0lkeF0uZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICAgICAgIGF0dHJUeXBlOiAnbGlnYXRlZCcsXG4gICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmNJZHggKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmNJZHggKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzSW52YWxpZE9ibGlxdWUpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnTm8gaW52YWxpZCBvYmxpcXVlcyBmb3VuZCcsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFpbkFjdGlvbi5wYXJhbSA9IHBhcmFtO1xuICAgICAgICAgIG5lb25WaWV3XG4gICAgICAgICAgICAuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAgICAgJ1VudG9nZ2xlZCBpbnZhbGlkIG9ibGlxdWVzJyxcbiAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gdW50b2dnbGUgaW52YWxpZCBvYmxpcXVlcycsXG4gICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZCgndW50b2dnbGUtaW52YWxpZC1zeWxzJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1cmkgPSBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCk7XG4gICAgICBuZW9uVmlldy5nZXRQYWdlTUVJKHVyaSkudGhlbigobWVpU3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIExvYWQgTUVJIGRvY3VtZW50IGludG8gcGFyc2VyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgbWVpRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhtZWlTdHJpbmcsICd0ZXh0L3htbCcpO1xuICAgICAgICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKG1laS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3lsbGFibGUnKSk7XG5cbiAgICAgICAgY29uc3QgaW52YWxpZFN5bGxhYmxlcyA9IGdldEludmFsaWRTeWxsYWJsZXMoc3lsbGFibGVzKTtcblxuICAgICAgICBpZiAoaW52YWxpZFN5bGxhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnTm8gaW52YWxpZCBzeWxsYWJsZXMgZm91bmQnLFxuICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY2hhaW5BY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN5bGxhYmxlIG9mIGludmFsaWRTeWxsYWJsZXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc3lsbGFibGUuaGFzQXR0cmlidXRlKCdwcmVjZWRlcycpICYmXG4gICAgICAgICAgICAgIHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgnZm9sbG93cycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlY2VkZXNTeWxsYWJsZSA9IHN5bGxhYmxlcy5maW5kKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PVxuICAgICAgICAgICAgICAgICAgc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdwcmVjZWRlcycpLnN1YnN0cmluZygxKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgZm9sbG93c1N5bGxhYmxlID0gc3lsbGFibGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZSgneG1sOmlkJykgPT09XG4gICAgICAgICAgICAgICAgICBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ2ZvbGxvd3MnKS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICAgICAgYXR0clR5cGU6ICdwcmVjZWRlcycsXG4gICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwYXJhbS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICAgICAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiBwcmVjZWRlc1N5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICAgICAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiBmb2xsb3dzU3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICAgICAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBwYXJhbS5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLmFkZFN5bEFjdGlvbihbc3lsbGFibGUsIHByZWNlZGVzU3lsbGFibGUsIGZvbGxvd3NTeWxsYWJsZV0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ3ByZWNlZGVzJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlY2VkZXNTeWxsYWJsZSA9IHN5bGxhYmxlcy5maW5kKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PVxuICAgICAgICAgICAgICAgICAgc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdwcmVjZWRlcycpLnN1YnN0cmluZygxKSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBwYXJhbS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogcHJlY2VkZXNTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICAgICAgYXR0clR5cGU6ICdmb2xsb3dzJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goLi4uYWRkU3lsQWN0aW9uKFtzeWxsYWJsZSwgcHJlY2VkZXNTeWxsYWJsZV0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdmb2xsb3dzJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm9sbG93c1N5bGxhYmxlID0gc3lsbGFibGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZSgneG1sOmlkJykgPT09XG4gICAgICAgICAgICAgICAgICBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ2ZvbGxvd3MnKS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICAgICAgYXR0clR5cGU6ICdmb2xsb3dzJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogZm9sbG93c1N5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goLi4uYWRkU3lsQWN0aW9uKFtzeWxsYWJsZSwgZm9sbG93c1N5bGxhYmxlXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoYWluQWN0aW9uLnBhcmFtID0gcGFyYW07XG4gICAgICAgICAgbmVvblZpZXdcbiAgICAgICAgICAgIC5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAgICAgICAnVW50b2dnbGVkIGludmFsaWQgc3lsbGFibGVzJyxcbiAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gdW50b2dnbGUgaW52YWxpZCBzeWxsYWJsZXMnLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXIgZm9yIFwiUmV2ZXJ0XCIgYnV0dG9uIGluc2lkZSBcIk1FSSBBY3Rpb25zXCIgZHJvcGRvd25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldmVydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGlmIChcbiAgICAgIHdpbmRvdy5jb25maXJtKFxuICAgICAgICAnUmV2ZXJ0aW5nIHdpbGwgY2F1c2UgYWxsIGNoYW5nZXMgdG8gYmUgbG9zdC4gUHJlc3MgT0sgdG8gY29udGludWUuJyxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIG5lb25WaWV3LmRlbGV0ZURiKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLyogXCJWSUVXXCIgbWVudSAqL1xuXG4gIC8qXG5cbiAgLy8gRXZlbnQgbGlzdGVuZXJzIGZvciBzZXR0aW5nIGRlZmF1bHQgem9vbSBzZXR0aW5ncyBpbnNpZGUgXCJWaWV3XCIgZHJvcGRvd25cbiAgY29uc3QgZml0Q29udGVudEJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6b29tLWZpdC1jb250ZW50Jyk7XG4gIGNvbnN0IGZpdENvbnRlbnRDaGVja21hcmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjem9vbS1maXQtY29udGVudC1pY29uJyk7XG4gIGNvbnN0IGVhc3lFZGl0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pvb20tZWFzeS1lZGl0Jyk7XG4gIGNvbnN0IGVhc3lFZGl0Q2hlY2ttYXJrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pvb20tZWFzeS1lZGl0LWljb24nKTtcblxuICAvLyBmaXQgY29udGVudCBsaXN0ZW5lclxuICBmaXRDb250ZW50QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGVhc3lFZGl0QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2NoZWNrZWQnKTtcbiAgICBmaXRDb250ZW50QnRuLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcblxuICAgIGVhc3lFZGl0Q2hlY2ttYXJrLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgZml0Q29udGVudENoZWNrbWFyay5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuXG4gICAgLy8gVE9ETzogU2F2ZSBkZWZhdWx0IHpvb20gc2V0dGluZ3MgaW4gbG9jYWwgc3RvcmFnZVxuXG4gIH0pO1xuICAvLyBlYXN5IGVkaXQgbGlzdGVuZXJcbiAgZWFzeUVkaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZml0Q29udGVudEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJyk7XG4gICAgZWFzeUVkaXRCdG4uY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuXG4gICAgZml0Q29udGVudENoZWNrbWFyay5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIGVhc3lFZGl0Q2hlY2ttYXJrLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG5cbiAgICAvLyBUT0RPOiBTYXZlIGRlZmF1bHQgem9vbSBzZXR0aW5ncyBpbiBsb2NhbCBzdG9yYWdlXG5cbiAgfSk7XG4gICovXG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgdW5kby9yZWRvIHBhbmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0VW5kb1JlZG9QYW5lbChuZW9uVmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgLyoqXG4gICAqIFRyaWVzIHRvIHVuZG8gYW4gYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHBhZ2UgaWYgaXQgc3VjY2VlZHMuXG4gICAqL1xuICBmdW5jdGlvbiB1bmRvSGFuZGxlcigpOiB2b2lkIHtcbiAgICBuZW9uVmlldy51bmRvKCkudGhlbigocmVzdWx0OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1RoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byB1bmRvLicpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byB1bmRvIGFjdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJlZG8gYW4gYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHBhZ2UgaWYgaXQgc3VjY2VlZHMuXG4gICAqL1xuICBmdW5jdGlvbiByZWRvSGFuZGxlcigpOiB2b2lkIHtcbiAgICBuZW9uVmlldy5yZWRvKCkudGhlbigocmVzdWx0OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1RoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZWRvLicpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZWRvIGFjdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG8nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHVuZG9IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIGlmIChldnQua2V5ID09PSAneicgJiYgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KSkge1xuICAgICAgdW5kb0hhbmRsZXIoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWRvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWRvSGFuZGxlcik7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICBpZiAoXG4gICAgICAoZXZ0LmtleSA9PT0gJ1onIHx8IChldnQua2V5ID09PSAneicgJiYgZXZ0LnNoaWZ0S2V5KSkgJiZcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgICApIHtcbiAgICAgIHJlZG9IYW5kbGVyKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkU3lsQWN0aW9uKHN5bGxhYmxlczogRWxlbWVudFtdKTogQXJyYXk8RWRpdG9yQWN0aW9uPiB7XG4gIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcblxuICBmb3IgKGNvbnN0IHN5bGxhYmxlIG9mIHN5bGxhYmxlcykge1xuICAgIGlmIChzeWxsYWJsZSAmJiAhc3lsbGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N5bCcpLmxlbmd0aCkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldFRleHQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJhbTtcbn1cblxuZnVuY3Rpb24gZ2V0SW52YWxpZFN5bGxhYmxlcyhzeWxsYWJsZXM6IEVsZW1lbnRbXSk6IEVsZW1lbnRbXSB7XG4gIGNvbnN0IGludmFsaWRTeWxsYWJsZXM6IEVsZW1lbnRbXSA9IFtdO1xuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBzeWxsYWJsZXMubGVuZ3RoOyBpZHgrKykge1xuICAgIGNvbnN0IHN5bGxhYmxlID0gc3lsbGFibGVzLmF0KGlkeCk7XG4gICAgaWYgKHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgncHJlY2VkZXMnKSkge1xuICAgICAgLy8gR2V0IHhtbDppZCBvZiB0aGUgbmV4dCBzeWxsYWJsZSAod2l0aG91dCB0aGUgIywgaWYgaXQgZXhpc3RzKVxuICAgICAgY29uc3QgbmV4dFN5bGxhYmxlSWQgPSBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3ByZWNlZGVzJykucmVwbGFjZSgnIycsICcnKTtcblxuICAgICAgLy8gRmluZCB0aGUgbmV4dCBzeWxsYWJsZSBhbmQgaXRzIGluZGV4IGluIHRoZSBhcnJheVxuICAgICAgbGV0IG5leHRTeWxsYWJsZUlkeDogbnVtYmVyO1xuICAgICAgY29uc3QgbmV4dFN5bGxhYmxlID0gc3lsbGFibGVzLmZpbmQoKGVsZW1lbnQsIGlkeCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PSBuZXh0U3lsbGFibGVJZCkge1xuICAgICAgICAgIG5leHRTeWxsYWJsZUlkeCA9IGlkeDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDb25kaXRpb24gMTogVGhlIG5leHQgKGZvbGxvd2luZykgc3lsbGFibGUgY2Fubm90IGJlIGZvdW5kXG4gICAgICBpZiAoIW5leHRTeWxsYWJsZSkge1xuICAgICAgICBpbnZhbGlkU3lsbGFibGVzLnB1c2goc3lsbGFibGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIG5leHQgc3lsbGFibGUgaGFzIGJlZW4gZm91bmQsIGJ1dCB0aGUgQGZvbGxvd3MgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIW5leHRTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ2ZvbGxvd3MnKSkge1xuICAgICAgICBpbnZhbGlkU3lsbGFibGVzLnB1c2goc3lsbGFibGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMzogVGhlIG5leHQgc3lsbGFibGUncyBAZm9sbG93cyBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgaXQgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdCAjaWRcbiAgICAgIGlmIChcbiAgICAgICAgbmV4dFN5bGxhYmxlLmdldEF0dHJpYnV0ZSgnZm9sbG93cycpICE9XG4gICAgICAgICcjJyArIHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJylcbiAgICAgICkge1xuICAgICAgICBpbnZhbGlkU3lsbGFibGVzLnB1c2goc3lsbGFibGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gNDpcbiAgICAgIC8vIFNpbmNlIHRoZSBAZm9sbG93cyB2YWx1ZSBpcyBjb3JyZWN0LCBhIHBhaXIgb2Ygc3lsbGFibGVzIGV4aXN0IGZvciB0aGUgdG9nZ2xlLWxpbmtlZCBzeWxsYWJsZS5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBAZm9sbG93cyBzeWxsYWJsZSBpcyB0aGUgbmV4dCBzeWxsYWJsZSAoaW5kZXgtd2lzZSkgaW4gdGhlIGFycmF5OlxuICAgICAgaWYgKG5leHRTeWxsYWJsZUlkeCAhPT0gaWR4ICsgMSkge1xuICAgICAgICBpbnZhbGlkU3lsbGFibGVzLnB1c2goc3lsbGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdmb2xsb3dzJykpIHtcbiAgICAgIGNvbnN0IHByZXZTeWxsYWJsZUlkID0gc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdmb2xsb3dzJykucmVwbGFjZSgnIycsICcnKTtcbiAgICAgIGNvbnN0IHByZXZTeWxsYWJsZSA9IHN5bGxhYmxlcy5maW5kKFxuICAgICAgICAoc3lsbGFibGUpID0+IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJykgPT09IHByZXZTeWxsYWJsZUlkLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29uZGl0aW9uIDE6IFRoZSBwcmV2aW91cyBzeWxsYWJsZSBkb2VzIG5vdCBleGlzdFxuICAgICAgaWYgKCFwcmV2U3lsbGFibGUpIHtcbiAgICAgICAgaW52YWxpZFN5bGxhYmxlcy5wdXNoKHN5bGxhYmxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uZGl0aW9uIDI6IFRoZSBwcmV2aW91cyBzeWxsYWJsZSBleGlzdHMsIGJ1dCB0aGUgQHByZWNlZGVzIGF0dHJpYnV0ZSBkb2VzIE5PVCBFWElTVFxuICAgICAgaWYgKCFwcmV2U3lsbGFibGUuaGFzQXR0cmlidXRlKCdwcmVjZWRlcycpKSB7XG4gICAgICAgIGludmFsaWRTeWxsYWJsZXMucHVzaChzeWxsYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgcHJldmlvdXMgc3lsbGFibGUncyBAcHJlY2VkZXMgYXR0cmlidXRlIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQgI2lkXG4gICAgICBpZiAoXG4gICAgICAgIHByZXZTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3ByZWNlZGVzJykgIT1cbiAgICAgICAgJyMnICsgc3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKVxuICAgICAgKSB7XG4gICAgICAgIGludmFsaWRTeWxsYWJsZXMucHVzaChzeWxsYWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnZhbGlkU3lsbGFibGVzO1xufVxuIiwiaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uLy4uL3NyYy9OZW9uVmlldyc7XG5pbXBvcnQgRGlzcGxheVBhbmVsIGZyb20gJy4uLy4uL3NyYy9EaXNwbGF5UGFuZWwvRGlzcGxheVBhbmVsJztcbmltcG9ydCBEaXZhVmlldyBmcm9tICcuLi8uLi9zcmMvRGl2YVZpZXcnO1xuaW1wb3J0IFNpbmdsZVZpZXcgZnJvbSAnLi4vLi4vc3JjL1NpbmdsZVZpZXcvU2luZ2xlVmlldyc7XG5pbXBvcnQgRGl2YUVkaXQgZnJvbSAnLi4vLi4vc3JjL1NxdWFyZUVkaXQvRGl2YUVkaXRNb2RlJztcbmltcG9ydCBTaW5nbGVFZGl0TW9kZSBmcm9tICcuLi8uLi9zcmMvU3F1YXJlRWRpdC9TaW5nbGVFZGl0TW9kZSc7XG5pbXBvcnQgSW5mb01vZHVsZSBmcm9tICcuLi8uLi9zcmMvSW5mb01vZHVsZSc7XG5pbXBvcnQgVGV4dFZpZXcgZnJvbSAnLi4vLi4vc3JjL1RleHRWaWV3JztcbmltcG9ydCBUZXh0RWRpdE1vZGUgZnJvbSAnLi4vLi4vc3JjL1RleHRFZGl0TW9kZSc7XG5pbXBvcnQgeyBOZW9uVmlld1BhcmFtcyB9IGZyb20gJy4uLy4uL3NyYy9JbnRlcmZhY2VzJztcbmltcG9ydCB7IE5lb25NYW5pZmVzdCB9IGZyb20gJy4uLy4uL3NyYy9UeXBlcyc7XG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcblxuY29uc3QgbmFtZSA9IGdldEdldFBhcmFtKCdtYW5pZmVzdCcpO1xuY29uc3Qgc3RvcmFnZSA9IGdldEdldFBhcmFtKCdzdG9yYWdlJyk7XG5cbmlmIChuYW1lKSB7XG4gIGNvbnN0IG1hbmlmZXN0TG9jYXRpb24gPSBgLi9zYW1wbGVzL21hbmlmZXN0cy8ke25hbWV9Lmpzb25sZGA7XG4gIHdpbmRvdy5mZXRjaChtYW5pZmVzdExvY2F0aW9uKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICB9XG4gIH0pLnRoZW4oYXN5bmMgdGV4dCA9PiB7XG4gICAgbGV0IG1hbmlmZXN0OiBOZW9uTWFuaWZlc3Q7XG4gICAgdHJ5IHtcbiAgICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgY29uc29sZS5kZWJ1Zyh0ZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lIGlmIGl0IGlzIGEgc2luZ2xlIHBhZ2Ugb3IgbXVsdGlwbGUgYnkgbWVkaWEgdHlwZVxuICAgIGNvbnN0IG1lZGlhVHlwZTogc3RyaW5nID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd2luZG93LmZldGNoKG1hbmlmZXN0LmltYWdlKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgcmVzb2x2ZSg8c3RyaW5nPnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSk7XG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgbGV0IHBhcmFtczogTmVvblZpZXdQYXJhbXM7XG4gICAgaWYgKG1lZGlhVHlwZS5tYXRjaCgvaW1hZ2VcXC8qLykpIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgbWFuaWZlc3Q6IG1hbmlmZXN0LFxuICAgICAgICBEaXNwbGF5OiBEaXNwbGF5UGFuZWwsXG4gICAgICAgIEluZm86IEluZm9Nb2R1bGUsXG4gICAgICAgIFRleHRWaWV3OiBUZXh0VmlldyxcbiAgICAgICAgVGV4dEVkaXQ6IFRleHRFZGl0TW9kZSxcbiAgICAgICAgVmlldzogU2luZ2xlVmlldyxcbiAgICAgICAgTmV1bWVFZGl0OiBTaW5nbGVFZGl0TW9kZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zID0ge1xuICAgICAgICBtYW5pZmVzdDogbWFuaWZlc3QsXG4gICAgICAgIERpc3BsYXk6IERpc3BsYXlQYW5lbCxcbiAgICAgICAgSW5mbzogSW5mb01vZHVsZSxcbiAgICAgICAgVGV4dFZpZXc6IFRleHRWaWV3LFxuICAgICAgICBUZXh0RWRpdDogVGV4dEVkaXRNb2RlLFxuICAgICAgICBWaWV3OiBEaXZhVmlldyxcbiAgICAgICAgTmV1bWVFZGl0OiBEaXZhRWRpdFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3ID0gbmV3IE5lb25WaWV3KHBhcmFtcyk7XG4gICAgdmlldy5zdGFydCgpO1xuICB9KTtcbn0gZWxzZSB7XG4gIGNvbnN0IGRiID0gbmV3IFBvdWNoREIoJ05lb24tVXNlci1TdG9yYWdlJyk7XG4gIGRiLmdldEF0dGFjaG1lbnQoc3RvcmFnZSwgJ21hbmlmZXN0JykudGhlbihibG9iID0+IHtcbiAgICByZXR1cm4gbmV3IHdpbmRvdy5SZXNwb25zZShibG9iKS5qc29uKCk7XG4gIH0pLnRoZW4oYXN5bmMgbWFuaWZlc3QgPT4ge1xuICAgIGNvbnN0IG1lZGlhVHlwZTogc3RyaW5nID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd2luZG93LmZldGNoKG1hbmlmZXN0LmltYWdlKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgcmVzb2x2ZSg8c3RyaW5nPnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSk7XG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgbGV0IHBhcmFtczogTmVvblZpZXdQYXJhbXM7XG4gICAgaWYgKG1lZGlhVHlwZS5tYXRjaCgvaW1hZ2VcXC8qLykpIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgbWFuaWZlc3Q6IG1hbmlmZXN0LFxuICAgICAgICBEaXNwbGF5OiBEaXNwbGF5UGFuZWwsXG4gICAgICAgIEluZm86IEluZm9Nb2R1bGUsXG4gICAgICAgIFRleHRWaWV3OiBUZXh0VmlldyxcbiAgICAgICAgVGV4dEVkaXQ6IFRleHRFZGl0TW9kZSxcbiAgICAgICAgVmlldzogU2luZ2xlVmlldyxcbiAgICAgICAgTmV1bWVFZGl0OiBTaW5nbGVFZGl0TW9kZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zID0ge1xuICAgICAgICBtYW5pZmVzdDogbWFuaWZlc3QsXG4gICAgICAgIERpc3BsYXk6IERpc3BsYXlQYW5lbCxcbiAgICAgICAgSW5mbzogSW5mb01vZHVsZSxcbiAgICAgICAgVGV4dFZpZXc6IFRleHRWaWV3LFxuICAgICAgICBUZXh0RWRpdDogVGV4dEVkaXRNb2RlLFxuICAgICAgICBWaWV3OiBEaXZhVmlldyxcbiAgICAgICAgTmV1bWVFZGl0OiBEaXZhRWRpdFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3ID0gbmV3IE5lb25WaWV3KHBhcmFtcyk7XG4gICAgdmlldy5zdGFydCgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0R2V0UGFyYW0ocGFyYW1OYW1lKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdDtcblxuICB3aW5kb3cubG9jYXRpb24uc2VhcmNoXG4gICAgLnN1YnN0cigxKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHRtcCA9IGl0ZW0uc3BsaXQoJz0nKTtcbiAgICAgIGlmICh0bXBbMF0gPT09IHBhcmFtTmFtZSkge1xuICAgICAgICByZXN1bHQgPSBkZWNvZGVVUklDb21wb25lbnQodG1wWzFdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCBOZW9uQ29yZSBmcm9tICcuL05lb25Db3JlJztcbmltcG9ydCAqIGFzIFZhbGlkYXRpb24gZnJvbSAnLi9WYWxpZGF0aW9uJztcbmltcG9ydCB7IHBhcnNlTWFuaWZlc3QgfSBmcm9tICcuL3V0aWxzL05lb25NYW5pZmVzdCc7XG5pbXBvcnQgc2V0Qm9keSBmcm9tICcuL3V0aWxzL3RlbXBsYXRlL1RlbXBsYXRlJztcbmltcG9ydCB7IE1vZGFsV2luZG93IH0gZnJvbSAnLi91dGlscy9Nb2RhbFdpbmRvdyc7XG5pbXBvcnQgeyBOZW9uTWFuaWZlc3QsIEVkaXRvckFjdGlvbiwgQXR0cmlidXRlcywgVXNlclR5cGUgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7XG4gIEluZm9JbnRlcmZhY2UsXG4gIE1vZGFsV2luZG93SW50ZXJmYWNlLFxuICBOZW9uVmlld1BhcmFtcyxcbiAgTmV1bWVFZGl0SW50ZXJmYWNlLFxuICBUZXh0RWRpdEludGVyZmFjZSxcbiAgVGV4dFZpZXdJbnRlcmZhY2UsXG4gIFZpZXdJbnRlcmZhY2Vcbn0gZnJvbSAnLi9JbnRlcmZhY2VzJztcbmltcG9ydCB7IHNldERlYnVnTW9kZSB9IGZyb20gJy4vdXRpbHMvRGVidWdNb2RlJztcbmltcG9ydCB7IHNldFNhdmVkU3RhdHVzLCBsaXN0ZW5VbnNhdmVkQ2hhbmdlcyB9IGZyb20gJy4vdXRpbHMvVW5zYXZlZCc7XG5pbXBvcnQgTG9jYWxTZXR0aW5ncywgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5cblxuLyoqXG4gKiBOZW9uVmlldyBjbGFzcy4gTWFuYWdlcyB0aGUgb3RoZXIgbW9kdWxlcyBvZiBOZW9uIGFuZCBjb21tdW5pY2F0ZXMgd2l0aFxuICogTmVvbkNvcmUuXG4gKi9cbmNsYXNzIE5lb25WaWV3IHtcbiAgLyoqIFRoZSBtYW5pZmVzdCBkZXNjcmliaW5nIHdoYXQgdG8gbG9hZCBhbmQgd2hlcmUgdG8gZmluZCBpdC4gKi9cbiAgbWFuaWZlc3Q6IE5lb25NYW5pZmVzdDtcbiAgLyoqIE1vZHVsZSB0aGF0IGRpc3BsYXlzIHJlbmRlcmVkIE1FSS4gKi9cbiAgdmlldzogVmlld0ludGVyZmFjZTtcbiAgLyoqIE5hbWUgb2YgdGhlIGRvY3VtZW50IGxvYWRlZC4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTW9kdWxlIHRoYXQgaGFuZGxlcyBtYW5hZ2luZyByZXNvdXJjZXMsIHJlbmRlcmluZyBTVkdzLiAqL1xuICBjb3JlOiBOZW9uQ29yZTtcbiAgLyoqIE1vZHVsZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gbXVzaWNhbCBlbGVtZW50cy4gKi9cbiAgaW5mbzogSW5mb0ludGVyZmFjZTtcbiAgLyoqIE1vZHVsZSB0aGF0IGFsbG93cyBlZGl0aW5nIG9mIG11c2ljYWwgZWxlbWVudHMuICovXG4gIE5ldW1lRWRpdDogTmV1bWVFZGl0SW50ZXJmYWNlO1xuICAvKiogTW9kdWxlIHRoYXQgYWxsb3dzIHZpZXdpbmcgb2Ygc3lsbGFibGUgdGV4dC4gKi9cbiAgdGV4dFZpZXc6IFRleHRWaWV3SW50ZXJmYWNlO1xuICAvKiogTW9kdWxlIHRoYXQgYWxsb3dzIGVkaXRpbmcgb2Ygc3lsbGFibGUgdGV4dC4gKi9cbiAgVGV4dEVkaXQ6IFRleHRFZGl0SW50ZXJmYWNlO1xuICAvKiogTW9kdWxlIHRoYXQgY29udHJvbHMgc3RhdGUgYW5kIGNvbnRlbnQgb2YgTmVvbiBtb2RhbCB3aW5kb3dzICovXG4gIG1vZGFsOiBNb2RhbFdpbmRvd0ludGVyZmFjZTtcbiAgLyoqIE1vZHVsZSB0aGF0IGhhbmRsZXMgdXNlcidzIHNldHRpbmdzIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UgKi9cbiAgbG9jYWxTZXR0aW5nczogTG9jYWxTZXR0aW5ncztcblxuICBwYXJhbXM6IE5lb25WaWV3UGFyYW1zO1xuXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBOZW9uVmlldy4gU2V0cyBtb2RlIGFuZCBwYXNzZXMgY29uc3RydWN0b3JzLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKHBhcmFtczogTmVvblZpZXdQYXJhbXMpIHtcbiAgICBpZiAoIXBhcnNlTWFuaWZlc3QocGFyYW1zLm1hbmlmZXN0KSkge1xuICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIHBhcnNlIHRoZSBtYW5pZmVzdCcpO1xuICAgIH1cblxuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMubWFuaWZlc3QgPSBwYXJhbXMubWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIE5lb24gZm9yIGFueSBwcm92aWRlZCBlZGl0aW5nIG1vZHVsZXMuXG4gICAqL1xuICBzZXR1cEVkaXQocGFyYW1zOiBOZW9uVmlld1BhcmFtcyk6IHZvaWQge1xuICAgIC8vIFNldCB1cCBhbmQgc3RhcnQgdGhlIGNvcnJlY3QgZWRpdGluZyBtb2RlXG4gICAgaWYgKHBhcmFtcy5UZXh0VmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRleHRWaWV3ID0gbmV3IHBhcmFtcy5UZXh0Vmlldyh0aGlzKTtcbiAgICAgIGlmIChwYXJhbXMuVGV4dEVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLlRleHRFZGl0ID0gbmV3IHBhcmFtcy5UZXh0RWRpdCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmFtcy5OZXVtZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5OZXVtZUVkaXQgPSBuZXcgcGFyYW1zLk5ldW1lRWRpdCh0aGlzKTtcbiAgICAgIHRoaXMudGV4dFZpZXcudXBkYXRlQkJveFZpc2liaWxpdHkoKTtcbiAgICAgIGNvbnN0IHsgdXNlck1vZGUsIGluc2VydE1vZGUsIHNlbGVjdGlvbk1vZGUgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnNlcnRNb2RlKS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdGlvbk1vZGUpLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgc3dpdGNoICh1c2VyTW9kZSkge1xuICAgICAgICBjYXNlICdpbnNlcnQnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGluc2VydE1vZGUpLmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdGlvbk1vZGUpLmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IE5lb25cbiAgICovXG4gIHN0YXJ0ICgpOiB2b2lkIHtcbiAgICAvKiB0aGlzLmNvcmUuZGIuaW5mbygpLnRoZW4oKGluZm8pID0+IHtcbiAgICAgIGlmIChpbmZvLmRvY19jb3VudCA9PT0gMCkge1xuICAgICAgICB0aGlzLmNvcmUuaW5pdERiKCkudGhlbigoKSA9PiB7IHRoaXMudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTsgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0V4aXN0aW5nIGRhdGFiYXNlIGZvdW5kLiBSZXZlcnQgdG8gc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nLicpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICB9XG4gICAgfSk7ICovXG4gICAgc2V0Qm9keSh0aGlzKS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGxvYWQgdGhlIGNvbXBvbmVudHNcbiAgICAgIHRoaXMubG9jYWxTZXR0aW5ncyA9IG5ldyBMb2NhbFNldHRpbmdzKHRoaXMubWFuaWZlc3RbJ0BpZCddKTtcbiAgICAgIHRoaXMudmlldyA9IG5ldyB0aGlzLnBhcmFtcy5WaWV3KHRoaXMsIHRoaXMucGFyYW1zLkRpc3BsYXksIHRoaXMubWFuaWZlc3QuaW1hZ2UpO1xuICAgICAgdGhpcy5uYW1lID0gdGhpcy5tYW5pZmVzdC50aXRsZTtcbiAgICAgIHRoaXMuY29yZSA9IG5ldyBOZW9uQ29yZSh0aGlzLm1hbmlmZXN0KTtcbiAgICAgIHRoaXMuaW5mbyA9IG5ldyB0aGlzLnBhcmFtcy5JbmZvKHRoaXMpO1xuICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbFdpbmRvdyh0aGlzKTtcbiAgICAgIFZhbGlkYXRpb24uaW5pdCh0aGlzKTsgLy8gaW5pdGlhbGl6ZSB2YWxpZGF0aW9uXG4gICAgICBzZXREZWJ1Z01vZGUoKTsgXG4gICAgICBsaXN0ZW5VbnNhdmVkQ2hhbmdlcygpO1xuXG4gICAgICB0aGlzLnNldHVwRWRpdCh0aGlzLnBhcmFtcyk7XG4gICAgICByZXR1cm4gdGhpcy5jb3JlLmluaXREYigpO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gbG9hZCB0aGUgU1ZHXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVGb3JDdXJyZW50UGFnZSh0cnVlKTtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGFkZCB0aGUgZXZlbnQgbGlzdGVuZXJzIGRlcGVuZGVudCBvbiB0aGUgU1ZHXG4gICAgICB0aGlzLnZpZXcub25TVkdMb2FkKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHBhZ2UgZnJvbSB0aGUgbG9hZGVkIHZpZXcgYW5kIHRoZW4gZGlzcGxheSB0aGVcbiAgICogbW9zdCB1cCB0byBkYXRlIFNWRy5cbiAgICovXG4gIHVwZGF0ZUZvckN1cnJlbnRQYWdlIChkZWxheSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFnZU5vID0gdGhpcy52aWV3LmdldEN1cnJlbnRQYWdlKCk7XG4gICAgcmV0dXJuIHRoaXMudmlldy5jaGFuZ2VQYWdlKHBhZ2VObywgZGVsYXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZG8gYW4gYWN0aW9uIHBlcmZvcm1lZCBvbiB0aGUgY3VycmVudCBwYWdlIChpZiB0aGVyZSBpcyBvbmUpLlxuICAgKi9cbiAgcmVkbyAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgc2V0U2F2ZWRTdGF0dXMoZmFsc2UpO1xuICAgIHJldHVybiB0aGlzLmNvcmUucmVkbyh0aGlzLnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5kbyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIHRoZSBjdXJyZW50IHBhZ2UgKGlmIHRoZXJlIGlzIG9uZSkuXG4gICAqL1xuICB1bmRvICgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBzZXRTYXZlZFN0YXR1cyhmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXMuY29yZS51bmRvKHRoaXMudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vZGUgTmVvbiBpcyBpbi5cbiAgICogQHJldHVybnMgVmFsdWUgaXMgXCJ2aWV3ZXJcIiwgXCJpbnNlcnRcIiwgb3IgXCJlZGl0XCIuXG4gICAqL1xuICBnZXRVc2VyTW9kZSAoKTogVXNlclR5cGUge1xuICAgIGNvbnN0IHsgdXNlck1vZGUgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIHVzZXJNb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gcGVyZm9ybSBhbiBlZGl0b3IgYWN0aW9uLlxuICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGVkaXRvciB0b29sa2l0IGFjdGlvbiBvYmplY3QuXG4gICAqIEBwYXJhbSBwYWdlVVJJIC0gVGhlIFVSSSBvZiB0aGUgcGFnZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gb25cbiAgICovXG4gIGVkaXQgKGFjdGlvbjogRWRpdG9yQWN0aW9uLCBwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmVkaXQoYWN0aW9uLCBwYWdlVVJJKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgbXVzaWNhbCBlbGVtZW50LlxuICAgKiBAcGFyYW0gZWxlbWVudElkIC0gVGhlIHVuaXF1ZSBJRCBvZiB0aGUgbXVzaWNhbCBlbGVtZW50LlxuICAgKiBAcGFyYW0gcGFnZVVSSSAtIFRoZSBVUkkgb2YgdGhlIHBhZ2UgdGhlIGVsZW1lbnQgaXMgZm91bmQgb24uXG4gICAqL1xuICBnZXRFbGVtZW50QXR0ciAoZWxlbWVudElEOiBzdHJpbmcsIHBhZ2VVUkk6IHN0cmluZyk6IFByb21pc2U8QXR0cmlidXRlcz4ge1xuICAgIHJldHVybiB0aGlzLmNvcmUuZ2V0RWxlbWVudEF0dHIoZWxlbWVudElELCBwYWdlVVJJKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGJyb3dzZXIgZGF0YWJhc2UgYW5kIGNyZWF0ZXMgSlNPTi1MRCBzYXZlIGZpbGUuXG4gICAqIEByZXR1cm5zIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUuXG4gICAqL1xuICBleHBvcnQgKCk6IFByb21pc2U8c3RyaW5nIHwgQXJyYXlCdWZmZXI+IHtcbiAgICByZXR1cm4gKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuY29yZS51cGRhdGVEYXRhYmFzZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLm1hbmlmZXN0WydtZWlfYW5ub3RhdGlvbnMnXSA9IHRoaXMuY29yZS5nZXRBbm5vdGF0aW9ucygpO1xuICAgICAgICB0aGlzLm1hbmlmZXN0LnRpbWVzdGFtcCA9IChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhID0gbmV3IHdpbmRvdy5CbG9iKFtKU09OLnN0cmluZ2lmeSh0aGlzLm1hbmlmZXN0LCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2xkK2pzb24nIH0pO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZGF0YSk7XG4gICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoZXJyKTsgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgdG8gdGhlIGJyb3dzZXIgZGF0YWJhc2UuXG4gICAqL1xuICBzYXZlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzZXRTYXZlZFN0YXR1cyh0cnVlKTtcbiAgICByZXR1cm4gdGhpcy5jb3JlLnVwZGF0ZURhdGFiYXNlKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgbG9jYWwgZGF0YWJhc2Ugb2YgdGhlIGxvYWRlZCBNRUkgZmlsZShzKS5cbiAgICovXG4gIGRlbGV0ZURiICgpOiBQcm9taXNlPHZvaWRbXT4ge1xuICAgIHJldHVybiB0aGlzLmNvcmUuZGVsZXRlRGIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBhZ2UncyBNRUkgZmlsZSBlbmNvZGVkIGFzIGEgZGF0YSBVUkkuXG4gICAqIEBwYXJhbSBwYWdlTm8gLSBUaGUgVVJJIHNwZWNpZnlpbmcgdGhlIHBhZ2UuXG4gICAqIEByZXR1cm5zIEEgW0RhdGEgVVJJXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRhX1VSSV9zY2hlbWUpLlxuICAgKi9cbiAgZ2V0UGFnZVVSSSAocGFnZU5vPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocGFnZU5vID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VObyA9IHRoaXMudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuY29yZS5nZXRNRUkocGFnZU5vKS50aGVuKChtZWkpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgnZGF0YTphcHBsaWNhdGlvbi9tZWkreG1sO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChtZWkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGFnZSdzIE1FSSBmaWxlIGFzIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0gcGFnZU5vIC0gVGhlIGlkZW50aWZ5aW5nIFVSSSBvZiB0aGUgcGFnZS5cbiAgICovXG4gIGdldFBhZ2VNRUkgKHBhZ2VObzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmdldE1FSShwYWdlTm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGFnZSdzIFNWRy5cbiAgICogQHBhcmFtIHBhZ2VObyAtIFRoZSBpZGVudGlmeWluZyBVUkkgb2YgdGhlIHBhZ2UuXG4gICAqL1xuICBnZXRQYWdlU1ZHIChwYWdlTm86IHN0cmluZyk6IFByb21pc2U8U1ZHU1ZHRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmNvcmUuZ2V0U1ZHKHBhZ2VObyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTmVvblZpZXcgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IHsgY2hlY2tPdXRPZkJvdW5kc0dseXBocywgY29udmVydFRvVmVyb3ZpbywgcmVtb3ZlQ29sdW1uTGFiZWwgfSBmcm9tICcuL3V0aWxzL0NvbnZlcnRNZWknO1xuaW1wb3J0ICogYXMgVmFsaWRhdGlvbiBmcm9tICcuL1ZhbGlkYXRpb24nO1xuaW1wb3J0IFZlcm92aW9XcmFwcGVyIGZyb20gJy4vVmVyb3Zpb1dyYXBwZXInO1xuaW1wb3J0IHsgV2ViQW5ub3RhdGlvbiwgQXR0cmlidXRlcywgRWRpdG9yQWN0aW9uLCBOZW9uTWFuaWZlc3QsIFZlcm92aW9NZXNzYWdlIH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuL3V0aWxzL3JhbmRvbSc7XG5cbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xuaW1wb3J0IHsgc2V0U2F2ZWRTdGF0dXMgfSBmcm9tICcuL3V0aWxzL1Vuc2F2ZWQnO1xuXG4vKipcbiAqIEEgY2FjaGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgaGFzIGhhcHBlbmVkXG4gKiBhY3Jvc3MgbXVsdGlwbGUgcGFnZXMgaW4gYSBtYW51c2NyaXB0IHdpdGhvdXQgaGF2aW5nXG4gKiB0byBtYWtlIG1hbnkgY2FsbHMgdG8gdGhlIFBvdWNoaERiIGRhdGFiYXNlLlxuICovXG5pbnRlcmZhY2UgQ2FjaGVFbnRyeSB7XG4gIGRpcnR5OiBib29sZWFuO1xuICBtZWk6IHN0cmluZztcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xufVxuXG4vKipcbiAqIFRoZSBjb3JlIGNvbXBvbmVudCBvZiBOZW9uLiBUaGlzIG1hbmFnZXMgdGhlIGRhdGFiYXNlLFxuICogdGhlIHZlcm92aW8gdG9vbGtpdCwgdGhlIGNhY2hlLCBhbmQgdW5kby9yZWRvIHN0YWNrcy5cbiAqL1xuY2xhc3MgTmVvbkNvcmUge1xuICAvKiogV3JhcHBlciBmb3IgdGhlIFZlcm92aW8gV2ViV29ya2VyLiAqL1xuICBwcml2YXRlIHZlcm92aW9XcmFwcGVyOiBWZXJvdmlvV3JhcHBlcjtcbiAgLyoqIFN0YWNrcyBvZiBhY3Rpb25zIHRoYXQgY2FuIGJlIHVuZG9uZSBwZXIgcGFnZS4gKi9cbiAgcHJpdmF0ZSB1bmRvU3RhY2tzOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKiBTdGFja3Mgb2YgYWN0aW9ucyB0aGF0IGNhbiBiZSByZWRvbmUgcGVyIHBhZ2UuICovXG4gIHByaXZhdGUgcmVkb1N0YWNrczogTWFwPHN0cmluZywgc3RyaW5nW10+O1xuICAvKiogQ2FjaGUgY29udGFpbmluZyBlbnRyaWVzIGZvciBlYWNoIHBhZ2UuICovXG4gIHByaXZhdGUgbmVvbkNhY2hlOiBNYXA8c3RyaW5nLCBDYWNoZUVudHJ5PjtcbiAgcHJpdmF0ZSBkYjogUG91Y2hEQi5EYXRhYmFzZTtcbiAgcHJpdmF0ZSBwYXJzZXI6IERPTVBhcnNlcjtcbiAgLyoqIFBhZ2VzIGtub3duIG5vdCB0byBoYXZlIGFueSBhc3NvY2lhdGVkIE1FSS4gKi9cbiAgcHJpdmF0ZSBibGFua1BhZ2VzOiBBcnJheTxzdHJpbmc+O1xuICAvKiogQSBjb2xsZWN0aW9uIG9mIFczIFdlYiBBbm5vdGF0aW9ucy4gKi9cbiAgcHJpdmF0ZSBhbm5vdGF0aW9uczogV2ViQW5ub3RhdGlvbltdO1xuICBwcml2YXRlIG1hbmlmZXN0OiBOZW9uTWFuaWZlc3Q7XG4gIHByaXZhdGUgbGFzdFBhZ2VMb2FkZWQ6IHN0cmluZztcblxuICBnZXRBbm5vdGF0aW9ucyAoKTogV2ViQW5ub3RhdGlvbltdIHsgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnM7IH1cblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIE5lb25Db3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobWFuaWZlc3Q6IE5lb25NYW5pZmVzdCkge1xuICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIgPSBuZXcgVmVyb3Zpb1dyYXBwZXIoKTtcbiAgICAvL1ZhbGlkYXRpb24uaW5pdCgpO1xuXG4gICAgLyoqXG4gICAgICogU3RhY2tzIG9mIHByZXZpb3VzIE1FSSBmaWxlcyByZXByZXNlbnRpbmcgYWN0aW9ucyB0aGF0IGNhbiBiZSB1bmRvbmUgZm9yIGVhY2ggcGFnZS5cbiAgICAgKiBAdHlwZSB7TWFwLjxzdHJpbmcsIEFycmF5LjxzdHJpbmc+Pn1cbiAgICAgKi9cbiAgICB0aGlzLnVuZG9TdGFja3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTdGFja3Mgb2YgcHJldmlvdXMgTUVJIGZpbGVzIHJlcHJlc2VudGluZyBhY3Rpb25zIHRoYXQgY2FuIGJlIHJlZG9uZSBmb3IgZWFjaCBwYWdlLlxuICAgICAqIEB0eXBlIHtNYXAuPHN0cmluZywgQXJyYXkuPHN0cmluZz4+fVxuICAgICAqL1xuICAgIHRoaXMucmVkb1N0YWNrcyA9IG5ldyBNYXAoKTtcblxuICAgIHRoaXMubmVvbkNhY2hlID0gbmV3IE1hcCgpO1xuXG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cbiAgICB0aGlzLmRiID0gbmV3IFBvdWNoREIoJ05lb24nKTtcblxuICAgIHRoaXMuYmxhbmtQYWdlcyA9IFtdO1xuXG4gICAgLy8gQWRkIGVhY2ggTUVJIHRvIHRoZSBkYXRhYmFzZVxuICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICB0aGlzLmFubm90YXRpb25zID0gbWFuaWZlc3QubWVpX2Fubm90YXRpb25zO1xuICAgIHRoaXMubGFzdFBhZ2VMb2FkZWQgPSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBQb3VjaERiIGRhdGFiYXNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtYW5pZmVzdC5cbiAgICogSWYgYSBuZXdlciB2ZXJzaW9uIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXRhYmFzZSwgdGhpcyB3aWxsXG4gICAqIG5vdCB1cGRhdGUgdGhlIGRhdGFiYXNlIHVubGVzcyBmb3JjZWQuXG4gICAqIEBwYXJhbSBmb3JjZSAtIElmIGEgZGF0YWJhc2UgdXBkYXRlIHNob3VsZCBiZSBmb3JjZWQuXG4gICAqL1xuICBhc3luYyBpbml0RGIgKGZvcmNlID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBDaGVjayBmb3IgZXhpc3RpbmcgbWFuaWZlc3RcbiAgICB0eXBlIERiQW5ub3RhdGlvbiA9IFBvdWNoREIuQ29yZS5JZE1ldGEgJiBQb3VjaERCLkNvcmUuR2V0TWV0YSAmIFdlYkFubm90YXRpb247XG4gICAgdHlwZSBEb2MgPSBQb3VjaERCLkNvcmUuSWRNZXRhICYgUG91Y2hEQi5Db3JlLkdldE1ldGEgJiB7IHRpbWVzdGFtcDogc3RyaW5nOyBhbm5vdGF0aW9uczogc3RyaW5nW119O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5kYi5nZXQodGhpcy5tYW5pZmVzdFsnQGlkJ10pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ25vdF9mb3VuZCcpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IGRvY3VtZW50LlxuICAgICAgICAgIGNvbnN0IGRvYyA9IHtcbiAgICAgICAgICAgIF9pZDogdGhpcy5tYW5pZmVzdFsnQGlkJ10sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRoaXMubWFuaWZlc3QudGltZXN0YW1wLFxuICAgICAgICAgICAgaW1hZ2U6IHRoaXMubWFuaWZlc3QuaW1hZ2UsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5tYW5pZmVzdC50aXRsZSxcbiAgICAgICAgICAgIGFubm90YXRpb25zOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuICAgICAgICAgICAgZG9jLmFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbi5pZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGRvYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKGFzeW5jIChkb2M6IERvYykgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiBkb2MgdGltZXN0YW1wIGlzIG5ld2VyIHRoYW4gbWFuaWZlc3RcbiAgICAgICAgY29uc3QgZG9jVGltZSA9IChuZXcgRGF0ZShkb2MudGltZXN0YW1wKSkuZ2V0VGltZSgpO1xuICAgICAgICAvLyBGb3JtYXQgdGltZXN0YW1wIHRvIHNwZWNpZmljIElTTyA4NjAxIHZhcmlhbnQgYmVjYXVzZVxuICAgICAgICAvLyBTYWZhcmkgcmVxdWlyZXMgdGltZXpvbmUgb2Zmc2V0cyB0byBiZSArLy1ISDpNTSBhbmQgZmFpbHMgb25cbiAgICAgICAgLy8gdGhlIGVxdWFsbHkgdmFsaWQgKy8tSEhNTS4gVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZCB0b1xuICAgICAgICAvLyB0aGUgYnJvd3NlciBnZW5lcmF0ZWQgdGltZXN0YW1wIHNpbmNlIHRoYXQgYWx3YXlzIGdlbmVyYXRlcyBhXG4gICAgICAgIC8vIHRpbWVzdGFtcCBpbiBVVEMgd2l0aCB0aGUgWiBlbmRpbmcuXG4gICAgICAgIGNvbnN0IHRpbWVab25lUmVnZXhwID0gLyguK1stK1xcdTIyMTJdXFxkXFxkKShcXGRcXGQpJC87XG4gICAgICAgIGNvbnN0IG1hblRpbWUgPSAodGltZVpvbmVSZWdleHAudGVzdCh0aGlzLm1hbmlmZXN0LnRpbWVzdGFtcCkpID9cbiAgICAgICAgICAobmV3IERhdGUodGhpcy5tYW5pZmVzdC50aW1lc3RhbXAucmVwbGFjZSh0aW1lWm9uZVJlZ2V4cCwgJyQxOiQyJykpKS5nZXRUaW1lKClcbiAgICAgICAgICA6IChuZXcgRGF0ZSh0aGlzLm1hbmlmZXN0LnRpbWVzdGFtcCkpLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKGRvY1RpbWUgPiBtYW5UaW1lKSB7XG4gICAgICAgICAgaWYgKCFmb3JjZSkge1xuICAgICAgICAgICAgLy8gRmlsbCBhbm5vdGF0aW9ucyBsaXN0IHdpdGggZGIgYW5ub3RhdGlvbnNcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gZG9jLmFubm90YXRpb25zLm1hcCgoaWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGIuZ2V0KGlkKS50aGVuKChhbm5vdGF0aW9uOiBEYkFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBhbm5vdGF0aW9uLl9pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0Fubm90YXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBhbm5vdGF0aW9uLmJvZHksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogYW5ub3RhdGlvbi50YXJnZXRcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgcmVzKCcnKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgcmVzKCcnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIHRoaXMuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAvLyBBZGQgYW5ub3RhdGlvbnMgdG8gZGF0YWJhc2VcbiAgICAgICAgICBhd2FpdCB0aGlzLmRiLmdldChhbm5vdGF0aW9uLmlkKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyci5uYW1lID09PSAnbm90X2ZvdW5kJykge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9pZDogYW5ub3RhdGlvbi5pZFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkudGhlbigobmV3QW5ub3RhdGlvbjogRGJBbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBuZXdBbm5vdGF0aW9uLmJvZHkgPSBhbm5vdGF0aW9uLmJvZHk7XG4gICAgICAgICAgICBuZXdBbm5vdGF0aW9uLnRhcmdldCA9IGFubm90YXRpb24udGFyZ2V0O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGIucHV0KG5ld0Fubm90YXRpb24pO1xuICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYi5wdXQoZG9jKTtcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgcGFnZSBpbnRvIHRoZSB2ZXJvdmlvIHRvb2xraXQuIFRoaXMgd2lsbCBmZXRjaCB0aGVcbiAgICogcGFnZSBmcm9tIHRoZSBjYWNoZSBvciBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBwYWdlLlxuICAgKi9cbiAgbG9hZFBhZ2UgKHBhZ2VVUkk6IHN0cmluZyk6IFByb21pc2U8Q2FjaGVFbnRyeT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICAvLyBXYXMgdGhpcyBhbHJlYWR5IHRoZSBsb2FkZWQgcGFnZT9cbiAgICAgIGlmICh0aGlzLmxhc3RQYWdlTG9hZGVkID09PSBwYWdlVVJJICYmIHRoaXMubmVvbkNhY2hlLmhhcyhwYWdlVVJJKSkge1xuICAgICAgICByZXNvbHZlKHRoaXMubmVvbkNhY2hlLmdldChwYWdlVVJJKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubmVvbkNhY2hlLmhhcyhwYWdlVVJJKSkge1xuICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2VVUkksIHRoaXMubmVvbkNhY2hlLmdldChwYWdlVVJJKS5tZWkpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5uZW9uQ2FjaGUuZ2V0KHBhZ2VVUkkpKTtcbiAgICAgICAgfSk7XG4gICAgICAvLyBEbyB3ZSBrbm93IHRoaXMgcGFnZSBoYXMgbm8gTUVJIGNvbnRlbnQ/XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYmxhbmtQYWdlcy5pbmNsdWRlcyhwYWdlVVJJKSkge1xuICAgICAgICBWYWxpZGF0aW9uLmJsYW5rUGFnZSgpO1xuICAgICAgICBjb25zdCBlID0gbmV3IEVycm9yKCdObyBNRUkgZmlsZSBmb3IgcGFnZSAnICsgcGFnZVVSSSk7XG4gICAgICAgIGUubmFtZSA9ICdtaXNzaW5nX21laSc7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpbmQgYW5ub3RhdGlvblxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gdGhpcy5hbm5vdGF0aW9ucy5maW5kKGVsZW0gPT4ge1xuICAgICAgICAgIHJldHVybiBlbGVtLnRhcmdldCA9PT0gcGFnZVVSSTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uKSB7XG4gICAgICAgICAgd2luZG93LmZldGNoKGFubm90YXRpb24uYm9keSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIE1FSSBmaWxlIGlzIHNiLWJhc2VkLiBJZiBzbywgY29udmVydCB0byBzdGFmZi1iYXNlZC5cbiAgICAgICAgICAgIGlmICghLzxzZWN0aW9uXFxiW14+XSpcXGJ0eXBlPVwibmVvbi1uZXVtZS1saW5lXCJbXj5dKj4vLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICAgICAgZGF0YSA9IGNvbnZlcnRUb1Zlcm92aW8oZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNHbHlwaHMoZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2VVUkksIGRhdGEpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHRoaXMubmVvbkNhY2hlLmdldChwYWdlVVJJKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm8gYW5ub3RhdGlvbiB3YXMgZm91bmQgdHJlYXQgdGhlIHBhZ2UgYXNcbiAgICAgICAgICAvLyBiZWluZyBibGFua1xuICAgICAgICAgIFZhbGlkYXRpb24uYmxhbmtQYWdlKCk7XG4gICAgICAgICAgdGhpcy5ibGFua1BhZ2VzLnB1c2gocGFnZVVSSSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGRhdGEgaW50byB0aGUgdmVyb3ZpbyB0b29sa2l0IGFuZCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgKiBAcGFyYW0gcGFnZVVSSSAtIFRoZSBVUkkgb2YgdGhlIHNlbGVjdGVkIHBhZ2UuXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIE1FSSBvZiB0aGUgcGFnZSBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIGRpcnR5IC0gSWYgdGhlIGNhY2hlIGVudHJ5IHNob3VsZCBiZSBtYXJrZWQgYXMgZGlydHkuXG4gICAqL1xuICBsb2FkRGF0YSAocGFnZVVSSTogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGRpcnR5ID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBWYWxpZGF0aW9uLnNlbmRGb3JWYWxpZGF0aW9uKHJlbW92ZUNvbHVtbkxhYmVsKGRhdGEpKTtcbiAgICB0aGlzLmxhc3RQYWdlTG9hZGVkID0gcGFnZVVSSTtcbiAgICAvKiBBIHByb21pc2UgaXMgcmV0dXJuZWQgdGhhdCB3aWxsIHJlc29sdmUgdG8gdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uLlxuICAgICAqIEhvd2V2ZXIgdGhlIHZhbHVlIHRoYXQgaXMgbXVzdCByZXR1cm4gY29tZXMgZnJvbSB0aGUgV2ViIFdvcmtlciBhbmRcbiAgICAgKiBpbmZvcm1hdGlvbiBwYXNzZWQgYmV0d2VlbiB0aGUgd29ya2VyIGFuZCBtYWluIGNvbnRleHQgbXVjaCBiZSBpbiBhXG4gICAgICogbWVzc2FnZS4gU28gYW4gZXZlbnQgaGFuZGxlciBpcyBwdXQgb24gdmVyb3Zpb1dyYXBwZXIgZm9yIHdoZW4gYSBtZXNzYWdlXG4gICAgICogaXMgcmVjZWlldmVkIGZyb20gdGhlIHdvcmtlci4gVGhlbiBhIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgd29ya2VyIHRvXG4gICAgICogdGFrZSBhbiBhY3Rpb24uIEEgcmVzcG9uc2UgaXMgc2VudCBiYWNrIGFuZCB0aGUgcHJldmlvdXNseSBtZW50aW9uZWRcbiAgICAgKiBldmVudCBoYW5kbGVyIGhhbmRsZXMgdGhlIHJlc3BvbnNlLiBTaW5jZSBpdCBpcyBkZWZpbmVkIHdpdGhpbiB0aGVcbiAgICAgKiBwcm9taXNlIGl0IGhhcyBhY2Nlc3MgdG8gdGhlIG5lY2Vzc2FyeSByZXNvbHZlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZTogVmVyb3Zpb01lc3NhZ2UgPSB7XG4gICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgYWN0aW9uOiAncmVuZGVyRGF0YScsXG4gICAgICAgIG1laTogZGF0YVxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZSAoZXZ0OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2dC5kYXRhLmlkID09PSBtZXNzYWdlLmlkKSB7XG4gICAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5wYXJzZXIucGFyc2VGcm9tU3RyaW5nKFxuICAgICAgICAgICAgZXZ0LmRhdGEuc3ZnLFxuICAgICAgICAgICAgJ2ltYWdlL3N2Zyt4bWwnXG4gICAgICAgICAgKS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgdGhpcy5uZW9uQ2FjaGUuc2V0KHBhZ2VVUkksIHtcbiAgICAgICAgICAgIHN2Zzogc3ZnLFxuICAgICAgICAgICAgbWVpOiBkYXRhLFxuICAgICAgICAgICAgZGlydHk6IGRpcnR5XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZ0LnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBTVkcgZm9yIGEgc3BlY2lmaWMgcGFnZS5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBwYWdlLlxuICAgKi9cbiAgZ2V0U1ZHIChwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5sb2FkUGFnZShwYWdlVVJJKS50aGVuKChlbnRyeSkgPT4ge1xuICAgICAgICByZXNvbHZlKGVudHJ5LnN2Zyk7XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7IHJlamVjdChlcnIpOyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIE1FSSBmb3IgYSBzcGVjaWZpYyBwYWdlLlxuICAgKiBAcGFyYW0gcGFnZVVSSSAtIFRoZSBVUkkgb2YgdGhlIHNlbGVjdGVkIHBhZ2UuXG4gICAqL1xuICBnZXRNRUkgKHBhZ2VVUkk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMubG9hZFBhZ2UocGFnZVVSSSkudGhlbigoZW50cnkpID0+IHtcbiAgICAgICAgcmVzb2x2ZShlbnRyeS5tZWkpO1xuICAgICAgfSkuY2F0Y2goKGVycikgPT4geyByZWplY3QoZXJyKTsgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG11c2ljYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGZyb20gdGhlIHZlcm92aW8gdG9vbGtpdC5cbiAgICogQHBhcmFtIGVsZW1lbnRJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG11c2ljYWwgZWxlbWVudC5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBwYWdlLlxuICAgKi9cbiAgZ2V0RWxlbWVudEF0dHIgKGVsZW1lbnRJZDogc3RyaW5nLCBwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPEF0dHJpYnV0ZXM+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMubG9hZFBhZ2UocGFnZVVSSSkudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IFZlcm92aW9NZXNzYWdlID0ge1xuICAgICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgICBhY3Rpb246ICdnZXRFbGVtZW50QXR0cicsXG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50SWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy52ZXJvdmlvV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gaGFuZGxlIChldnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgICAgIGlmIChldnQuZGF0YS5pZCA9PT0gbWVzc2FnZS5pZCkge1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlKTtcbiAgICAgICAgICAgIHJlc29sdmUoZXZ0LmRhdGEuYXR0cmlidXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52ZXJvdmlvV3JhcHBlci5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYW4gZWRpdG9yIGFjdGlvbiBvbiBhIHNwZWNpZmljIHBhZ2UuXG4gICAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgZWRpdG9yIHRvb2xraXQgYWN0aW9uIG9iamVjdC5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBwYWdlLlxuICAgKi9cbiAgZWRpdCAoZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24sIHBhZ2VVUkk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCBwcm9taXNlOiBQcm9taXNlPENhY2hlRW50cnk+O1xuICAgIGlmICh0aGlzLmxhc3RQYWdlTG9hZGVkID09PSBwYWdlVVJJKSB7XG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMubmVvbkNhY2hlLmdldChwYWdlVVJJKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UgPSB0aGlzLmxvYWRQYWdlKHBhZ2VVUkkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICAgIHByb21pc2UudGhlbihlbnRyeSA9PiB7XG4gICAgICAgIC8vIGRlbGV0ZSB1bm5lY2Vzc2FyeSBTVkcgb2JqZWN0IHJlZmVyZW5jZTtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCB0aGlzIGlzIG5vdCBnYXJiYWdlIGNvbGxlY3RlZCFcbiAgICAgICAgZW50cnkuc3ZnID0gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50TUVJID0gZW50cnkubWVpO1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBWZXJvdmlvTWVzc2FnZSA9IHtcbiAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgYWN0aW9uOiAnZWRpdCcsXG4gICAgICAgICAgZWRpdG9yQWN0aW9uOiBlZGl0b3JBY3Rpb25cbiAgICAgICAgfTtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlICh0aGlzOiBOZW9uQ29yZSwgZXZ0OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoZXZ0LmRhdGEuaWQgPT09IG1lc3NhZ2UuaWQpIHtcbiAgICAgICAgICAgIGlmIChldnQuZGF0YS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnVuZG9TdGFja3MuaGFzKHBhZ2VVUkkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmRvU3RhY2tzLnNldChwYWdlVVJJLCBbXSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBBZGQgdG8gdW5kbyBzdGFjazpcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBib3R0b21tb3N0IE1FSSBzdHJpbmcgb24gdGhlIHN0YWNrXG4gICAgICAgICAgICAgIC8vIGlmIHRoZSBzdGFjayBpcyA+IDEwIHN0cmluZ3NcbiAgICAgICAgICAgICAgY29uc3QgdW5kb1N0YWNrID0gdGhpcy51bmRvU3RhY2tzLmdldChwYWdlVVJJKTtcbiAgICAgICAgICAgICAgY29uc3QgbGVuID0gdW5kb1N0YWNrLnB1c2goY3VycmVudE1FSSk7XG5cbiAgICAgICAgICAgICAgaWYgKGxlbiA+IDEwKVxuICAgICAgICAgICAgICAgIHRoaXMudW5kb1N0YWNrcy5zZXQocGFnZVVSSSwgdW5kb1N0YWNrLnNsaWNlKDEpKTtcblxuICAgICAgICAgICAgICAvLyBDbGVhciByZWRvIHN0YWNrOlxuICAgICAgICAgICAgICB0aGlzLnJlZG9TdGFja3Muc2V0KHBhZ2VVUkksIFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2dC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKHBhZ2VVUkksIHRydWUpLnRoZW4oKCkgPT4geyByZXNvbHZlKGV2dC5kYXRhLnJlc3VsdCk7IH0pO1xuICAgICAgICAgICAgc2V0U2F2ZWRTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29udGVudHMgb2YgdGhlIGNhY2hlIHVzaW5nIGluZm9ybWF0aW9uIGluIHZlcm92aW8gdG9vbGtpdC5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBQYWdlIHRvIGJlIHVwZGF0ZWQgaW4gY2FjaGUuXG4gICAqIEBwYXJhbSBkaXJ0eSAtIElmIHRoZSBlbnRyeSBzaG91bGQgYmUgbWFya2VkIGFzIGRpcnR5XG4gICAqL1xuICB1cGRhdGVDYWNoZSAocGFnZVVSSTogc3RyaW5nLCBkaXJ0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgLy8gTXVzdCBnZXQgTUVJIGFuZCB0aGVuIGdldCBTVkcgdGhlbiBmaW5pc2guXG4gICAgICBsZXQgbWVpOiBzdHJpbmcsIHN2Z1RleHQ6IHN0cmluZztcbiAgICAgIGNvbnN0IG1laVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBWZXJvdmlvTWVzc2FnZSA9IHtcbiAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgYWN0aW9uOiAnZ2V0TUVJJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBoYW5kbGUgKGV2dDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgICAgaWYgKGV2dC5kYXRhLmlkID09PSBtZXNzYWdlLmlkKSB7XG4gICAgICAgICAgICBtZWkgPSBldnQuZGF0YS5tZWk7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGUpO1xuICAgICAgICAgICAgVmFsaWRhdGlvbi5zZW5kRm9yVmFsaWRhdGlvbihyZW1vdmVDb2x1bW5MYWJlbChtZWkpKTtcbiAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN2Z1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBWZXJvdmlvTWVzc2FnZSA9IHtcbiAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgYWN0aW9uOiAncmVuZGVyVG9TVkcnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIGhhbmRsZSAoZXZ0OiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZ0LmRhdGEuaWQgPT09IG1lc3NhZ2UuaWQpIHtcbiAgICAgICAgICAgIHN2Z1RleHQgPSBldnQuZGF0YS5zdmc7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGUpO1xuICAgICAgICAgICAgcmVzb2x2ZSgnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52ZXJvdmlvV3JhcHBlci5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIH0pO1xuXG4gICAgICBtZWlQcm9taXNlLnRoZW4oKCkgPT4geyByZXR1cm4gc3ZnUHJvbWlzZTsgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMucGFyc2VyLnBhcnNlRnJvbVN0cmluZyhcbiAgICAgICAgICBzdmdUZXh0LFxuICAgICAgICAgICdpbWFnZS9zdmcreG1sJ1xuICAgICAgICApLmRvY3VtZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCAmIFNWR1NWR0VsZW1lbnQ7XG4gICAgICAgIHRoaXMubmVvbkNhY2hlLnNldChwYWdlVVJJLCB7XG4gICAgICAgICAgbWVpOiBtZWksXG4gICAgICAgICAgc3ZnOiBzdmcsXG4gICAgICAgICAgZGlydHk6IGRpcnR5XG4gICAgICAgIH0pO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVkaXQgaW5mbyBzdHJpbmcgZnJvbSB0aGUgdmVyb3ZpbyB0b29sa2l0LlxuICAgKiBAcGFyYW0gcGFnZVVSSSAtIFRoZSBVUkkgb2YgdGhlIHBhZ2UgdG8gZ2V0IHRoZSBlZGl0IGluZm8gc3RyaW5nIGZyb20uXG4gICAqL1xuICBpbmZvIChwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBwcm9taXNlOiBQcm9taXNlPENhY2hlRW50cnkgfCB2b2lkPjtcbiAgICBpZiAodGhpcy5sYXN0UGFnZUxvYWRlZCA9PT0gcGFnZVVSSSkge1xuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlID0gdGhpcy5sb2FkUGFnZShwYWdlVVJJKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBWZXJvdmlvTWVzc2FnZSA9IHtcbiAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgYWN0aW9uOiAnZWRpdEluZm8nXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIGhhbmRsZSAoZXZ0OiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZ0LmRhdGEuaWQgPT09IG1lc3NhZ2UuaWQpIHtcbiAgICAgICAgICAgIGV2dC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZSk7XG4gICAgICAgICAgICByZXNvbHZlKGV2dC5kYXRhLmluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmRvIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBzcGVjaWZpYyBwYWdlLlxuICAgKiBAcGFyYW0gcGFnZVVSSSAtIFRoZSBVUkkgb2YgdGhlIHNlbGVjdGVkIHBhZ2UuXG4gICAqIEByZXR1cm5zIElmIHRoZSBhY3Rpb24gd2FzIHVuZG9uZS5cbiAgICovXG4gIHVuZG8gKHBhZ2VVUkk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnVuZG9TdGFja3MuaGFzKHBhZ2VVUkkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy51bmRvU3RhY2tzLmdldChwYWdlVVJJKS5wb3AoKTtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybiByZXNvbHZlKGZhbHNlKTtcblxuICAgICAgY29uc3QgbWVpID0gYXdhaXQgdGhpcy5nZXRNRUkocGFnZVVSSSk7XG4gICAgICB0aGlzLnJlZG9TdGFja3MuZ2V0KHBhZ2VVUkkpLnB1c2gobWVpKTtcbiAgICAgIGF3YWl0IHRoaXMubG9hZERhdGEocGFnZVVSSSwgc3RhdGUsIHRydWUpO1xuXG4gICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRvIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBwYWdlLlxuICAgKiBAcGFyYW0gcGFnZVVSSSAtIFRoZSBwYWdlIFVSSS5cbiAgICogQHJldHVybnMgSWYgdGhlIGFjdGlvbiB3YXMgcmVkb25lLlxuICAgKi9cbiAgcmVkbyAocGFnZVVSSTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucmVkb1N0YWNrcy5oYXMocGFnZVVSSSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlZG9TdGFja3MuZ2V0KHBhZ2VVUkkpLnBvcCgpO1xuICAgICAgaWYgKCFzdGF0ZSkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZWkgPSBhd2FpdCB0aGlzLmdldE1FSShwYWdlVVJJKTtcbiAgICAgIHRoaXMudW5kb1N0YWNrcy5nZXQocGFnZVVSSSkucHVzaChtZWkpO1xuICAgICAgYXdhaXQgdGhpcy5sb2FkRGF0YShwYWdlVVJJLCBzdGF0ZSwgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgUG91Y2hEYiBkYXRhYmFzZSBzdG9yZWQgaW4gdGhlIGJyb3dzZXIuXG4gICAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBjYWNoZS4gVG8gc2F2ZSB0aW1lLFxuICAgKiBvbmx5IGVudHJpZXMgbWFya2VkIGFzIGRpcnR5IHdpbGwgYmUgdXBkYXRlZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZURhdGFiYXNlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0eXBlIERvYyA9IFBvdWNoREIuQ29yZS5HZXRNZXRhICYgUG91Y2hEQi5Db3JlLklkTWV0YSAmIHsgYm9keTogc3RyaW5nOyB0aW1lc3RhbXA6IHN0cmluZyB9O1xuICAgIGxldCB1cGRhdGVUaW1lc3RhbXAgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgdGhpcy5uZW9uQ2FjaGUpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhaXJbMF07XG4gICAgICBjb25zdCB2YWx1ZSA9IHBhaXJbMV07XG4gICAgICBpZiAodmFsdWUuZGlydHkpIHtcbiAgICAgICAgdXBkYXRlVGltZXN0YW1wID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmFubm90YXRpb25zLmZpbmRJbmRleChlbGVtID0+IHsgcmV0dXJuIGVsZW0udGFyZ2V0ID09PSBrZXk7IH0pO1xuICAgICAgICAvLyB0cnkgdG8gdXBkYXRlIHNlcnZlciB3aXRoIFBVVCByZXF1ZXN0IChpZiBhcHBsaWNhYmxlKVxuICAgICAgICAvLyB0aGlzIGlzIHNpbXBsZXIgdGhhbiBleHBlY3RpbmcgYSBzcGVjaWZpYyBBUEkgb24gdGhlIHNlcnZlclxuICAgICAgICAvLyBhbmQgdXNpbmcgUE9TVCByZXF1ZXN0cywgYWx0aG91Z2ggdGhhdCB3b3VsZCBiZSBiZXR0ZXIgaWYgdGhlcmVcbiAgICAgICAgLy8gaXMgZXZlciBhIGRlZGljYXRlZCBwdWJsaWMgc2VydmVyIGZvciBOZW9uISBBdCB0aW1lIG9mIHdyaXRpbmcsXG4gICAgICAgIC8vIG9ubHkgZGV2L3Rlc3Rpbmcgc2VydmVyIGFjY2VwdHMgUFVUIHJlcXVlc3RzLlxuICAgICAgICAvLyBvbmx5IGF0dGVtcHQgaWYgbm90IGEgZGF0YSBVUklcbiAgICAgICAgbGV0IHVyaTogc3RyaW5nO1xuICAgICAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbnNbaW5kZXhdLmJvZHkubWF0Y2goL15kYXRhOi8pKSB7XG4gICAgICAgICAgYXdhaXQgd2luZG93LmZldGNoKHRoaXMuYW5ub3RhdGlvbnNbaW5kZXhdLmJvZHksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9tZWkreG1sJyB9LFxuICAgICAgICAgICAgICBib2R5OiB2YWx1ZS5tZWlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgIHVyaSA9IHRoaXMuYW5ub3RhdGlvbnNbaW5kZXhdLmJvZHk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1cmkgPSAnZGF0YTphcHBsaWNhdGlvbi9tZWkreG1sO2Jhc2U2NCwnICsgd2luZG93LmJ0b2EodmFsdWUubWVpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdGYWxsaW5nIGJhY2sgdG8gZGF0YSBVUkknKTtcbiAgICAgICAgICAgIHVyaSA9ICdkYXRhOmFwcGxpY2F0aW9uL21laSt4bWw7YmFzZTY0LCcgKyB3aW5kb3cuYnRvYSh2YWx1ZS5tZWkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVyaSA9ICdkYXRhOmFwcGxpY2F0aW9uL21laSt4bWw7YmFzZTY0LCcgKyB3aW5kb3cuYnRvYSh2YWx1ZS5tZWkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBVUkkgaW4gYW5ub3RhdGlvbnMsIGRhdGFiYXNlXG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnNbaW5kZXhdLmJvZHkgPSB1cmk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIuZ2V0KHRoaXMuYW5ub3RhdGlvbnNbaW5kZXhdLmlkKS50aGVuKChkb2M6IERvYykgPT4ge1xuICAgICAgICAgIGRvYy5ib2R5ID0gdXJpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmRiLnB1dChkb2MpO1xuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICB2YWx1ZS5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVRpbWVzdGFtcCkge1xuICAgICAgYXdhaXQgdGhpcy5kYi5nZXQodGhpcy5tYW5pZmVzdFsnQGlkJ10pLnRoZW4oKGRvYzogRG9jKSA9PiB7XG4gICAgICAgIGRvYy50aW1lc3RhbXAgPSAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGIucHV0KGRvYyk7XG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGFiYXNlLiAqL1xuICBhc3luYyBkZWxldGVEYiAoKTogUHJvbWlzZTx2b2lkW10+IHtcbiAgICB0eXBlIERvYyA9IFBvdWNoREIuQ29yZS5JZE1ldGEgJiBQb3VjaERCLkNvcmUuR2V0TWV0YSAmIHsgdGltZXN0YW1wOiBzdHJpbmc7IGFubm90YXRpb25zOiBzdHJpbmdbXX07XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSBhd2FpdCB0aGlzLmRiLmdldCh0aGlzLm1hbmlmZXN0WydAaWQnXSlcbiAgICAgIC50aGVuKChkb2M6IERvYykgPT4geyByZXR1cm4gZG9jLmFubm90YXRpb25zOyB9ICk7XG4gICAgYW5ub3RhdGlvbnMucHVzaCh0aGlzLm1hbmlmZXN0WydAaWQnXSk7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IGFubm90YXRpb25zLm1hcCgoaWQpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXMgPT4ge1xuICAgICAgICB0aGlzLmRiLmdldChpZClcbiAgICAgICAgICAudGhlbihkb2MgPT4geyByZXR1cm4gdGhpcy5kYi5yZW1vdmUoZG9jKTsgfSlcbiAgICAgICAgICAudGhlbigoKSA9PiByZXMoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9XG59XG5cbmV4cG9ydCB7IE5lb25Db3JlIGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IFZlcm92aW9NZXNzYWdlIH0gZnJvbSAnLi9UeXBlcyc7XG5cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgdmVyb3ZpbyB3ZWIgd29ya2VyIHRvIHBlcm1pdCBtb2NraW5nIGluIHRlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJvdmlvV3JhcHBlciB7XG4gIHZlcm92aW9Xb3JrZXI6IFdvcmtlcjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHRoaXMudmVyb3Zpb1dvcmtlciA9IG5ldyBXb3JrZXIoXG4gICAgICAgIF9fQVNTRVRfUFJFRklYX18gKyAnd29ya2Vycy9WZXJvdmlvV29ya2VyLmpzJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52ZXJvdmlvV29ya2VyID0gbmV3IFdvcmtlcihcbiAgICAgICAgX19BU1NFVF9QUkVGSVhfXyArICd3b3JrZXJzL1Zlcm92aW9Xb3JrZXItZGV2LmpzJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGV2ZW50IGxpc3RlbmVyIG9udG8gdGhlIGFjdHVhbCB3ZWIgd29ya2VyLlxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcihcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy52ZXJvdmlvV29ya2VyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGFjdHVhbCB3ZWIgd29ya2VyLlxuICAgKi9cbiAgcG9zdE1lc3NhZ2UobWVzc2FnZTogVmVyb3Zpb01lc3NhZ2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy52ZXJvdmlvV29ya2VyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzICovXG5pbXBvcnQgeyBOZW9uTWFuaWZlc3QgfSBmcm9tICcuLi9UeXBlcyc7XG5jb25zdCBOZW9uU2NoZW1hID0gcmVxdWlyZSgnLi9tYW5pZmVzdC9OZW9uU2NoZW1hLmpzb24nKTtcbmNvbnN0IE5lb25Db250ZXh0ID0gcmVxdWlyZSgnLi9tYW5pZmVzdC9jb250ZXh0Lmpzb24nKTtcbmltcG9ydCB7IHZhbGlkYXRlIH0gZnJvbSAnanNvbnNjaGVtYSc7XG5cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcHJvdmlkZWQgTmVvbiBtYW5pZmVzdCBpcyBwYXJzZWFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFuaWZlc3RTdHJpbmcgLSBUaGUgTmVvbiBtYW5pZmVzdCBhcyBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWFuaWZlc3QgKG1hbmlmZXN0U3RyaW5nOiBOZW9uTWFuaWZlc3QpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzdWx0cyA9IHZhbGlkYXRlKG1hbmlmZXN0U3RyaW5nLCBOZW9uU2NoZW1hKTtcbiAgY29uc3QgaW5zdGFuY2UgPSByZXN1bHRzLmluc3RhbmNlO1xuICBpZiAocmVzdWx0cy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IocmVzdWx0cy5lcnJvcnMpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjb250ZXh0ID0gaW5zdGFuY2VbJ0Bjb250ZXh0J107XG4gIGlmIChjb250ZXh0ID09PSAnaHR0cHM6Ly9kZG1hbC5tdXNpYy5tY2dpbGwuY2EvTmVvbi9jb250ZXh0cy8xL21hbmlmZXN0Lmpzb25sZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoKGNvbnRleHRbMF0gPT09IE5lb25Db250ZXh0WzBdKSAmJlxuICAgICAgKGNvbnRleHRbMV1bJ3NjaGVtYSddID09PSBOZW9uQ29udGV4dFsxXVsnc2NoZW1hJ10pICYmXG4gICAgICAoY29udGV4dFsxXVsndGl0bGUnXSA9PT0gTmVvbkNvbnRleHRbMV1bJ3RpdGxlJ10pICYmXG4gICAgICAoY29udGV4dFsxXVsndGltZXN0YW1wJ10gPT09IE5lb25Db250ZXh0WzFdWyd0aW1lc3RhbXAnXSkgJiZcbiAgICAgIChjb250ZXh0WzFdWydpbWFnZSddWydAaWQnXSA9PT0gTmVvbkNvbnRleHRbMV1bJ2ltYWdlJ11bJ0BpZCddKSAmJlxuICAgICAgKGNvbnRleHRbMV1bJ2ltYWdlJ11bJ0B0eXBlJ10gPT09IE5lb25Db250ZXh0WzFdWydpbWFnZSddWydAdHlwZSddKSAmJlxuICAgICAgKGNvbnRleHRbMV1bJ21laV9hbm5vdGF0aW9ucyddWydAaWQnXSA9PT0gTmVvbkNvbnRleHRbMV1bJ21laV9hbm5vdGF0aW9ucyddWydAaWQnXSkgJiZcbiAgICAgIChjb250ZXh0WzFdWydtZWlfYW5ub3RhdGlvbnMnXVsnQHR5cGUnXSA9PT0gTmVvbkNvbnRleHRbMV1bJ21laV9hbm5vdGF0aW9ucyddWydAdHlwZSddKSAmJlxuICAgICAgKGNvbnRleHRbMV1bJ21laV9hbm5vdGF0aW9ucyddWydAY29udGFpbmVyJ10gPT09IE5lb25Db250ZXh0WzFdWydtZWlfYW5ub3RhdGlvbnMnXVsnQGNvbnRhaW5lciddKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0NvbnRleHQgbWlzbWF0Y2gnKTtcbiAgICBjb25zb2xlLmVycm9yKGNvbnRleHQpO1xuICAgIGNvbnNvbGUuZXJyb3IoTmVvbkNvbnRleHQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdG9yID0gbW9kdWxlLmV4cG9ydHMuVmFsaWRhdG9yID0gcmVxdWlyZSgnLi92YWxpZGF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMuVmFsaWRhdG9yUmVzdWx0ID0gcmVxdWlyZSgnLi9oZWxwZXJzJykuVmFsaWRhdG9yUmVzdWx0O1xubW9kdWxlLmV4cG9ydHMuVmFsaWRhdG9yUmVzdWx0RXJyb3IgPSByZXF1aXJlKCcuL2hlbHBlcnMnKS5WYWxpZGF0b3JSZXN1bHRFcnJvcjtcbm1vZHVsZS5leHBvcnRzLlZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4vaGVscGVycycpLlZhbGlkYXRpb25FcnJvcjtcbm1vZHVsZS5leHBvcnRzLlNjaGVtYUVycm9yID0gcmVxdWlyZSgnLi9oZWxwZXJzJykuU2NoZW1hRXJyb3I7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWFTY2FuUmVzdWx0ID0gcmVxdWlyZSgnLi9zY2FuJykuU2NoZW1hU2NhblJlc3VsdDtcbm1vZHVsZS5leHBvcnRzLnNjYW4gPSByZXF1aXJlKCcuL3NjYW4nKS5zY2FuO1xuXG5tb2R1bGUuZXhwb3J0cy52YWxpZGF0ZSA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zKSB7XG4gIHZhciB2ID0gbmV3IFZhbGlkYXRvcigpO1xuICByZXR1cm4gdi52YWxpZGF0ZShpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1cmlsaWIgPSByZXF1aXJlKCd1cmwnKTtcblxudmFyIGF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYXR0cmlidXRlJyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xudmFyIHNjYW5TY2hlbWEgPSByZXF1aXJlKCcuL3NjYW4nKS5zY2FuO1xudmFyIFZhbGlkYXRvclJlc3VsdCA9IGhlbHBlcnMuVmFsaWRhdG9yUmVzdWx0O1xudmFyIFZhbGlkYXRvclJlc3VsdEVycm9yID0gaGVscGVycy5WYWxpZGF0b3JSZXN1bHRFcnJvcjtcbnZhciBTY2hlbWFFcnJvciA9IGhlbHBlcnMuU2NoZW1hRXJyb3I7XG52YXIgU2NoZW1hQ29udGV4dCA9IGhlbHBlcnMuU2NoZW1hQ29udGV4dDtcbi8vdmFyIGFub255bW91c0Jhc2UgPSAndm5kLmpzb25zY2hlbWE6Ly8vJztcbnZhciBhbm9ueW1vdXNCYXNlID0gJy8nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVmFsaWRhdG9yIG9iamVjdFxuICogQG5hbWUgVmFsaWRhdG9yXG4gKiBAY29uc3RydWN0b3JcbiAqL1xudmFyIFZhbGlkYXRvciA9IGZ1bmN0aW9uIFZhbGlkYXRvciAoKSB7XG4gIC8vIEFsbG93IGEgdmFsaWRhdG9yIGluc3RhbmNlIHRvIG92ZXJyaWRlIGdsb2JhbCBjdXN0b20gZm9ybWF0cyBvciB0byBoYXZlIHRoZWlyXG4gIC8vIG93biBjdXN0b20gZm9ybWF0cy5cbiAgdGhpcy5jdXN0b21Gb3JtYXRzID0gT2JqZWN0LmNyZWF0ZShWYWxpZGF0b3IucHJvdG90eXBlLmN1c3RvbUZvcm1hdHMpO1xuICB0aGlzLnNjaGVtYXMgPSB7fTtcbiAgdGhpcy51bnJlc29sdmVkUmVmcyA9IFtdO1xuXG4gIC8vIFVzZSBPYmplY3QuY3JlYXRlIHRvIG1ha2UgdGhpcyBleHRlbnNpYmxlIHdpdGhvdXQgVmFsaWRhdG9yIGluc3RhbmNlcyBzdGVwcGluZyBvbiBlYWNoIG90aGVyJ3MgdG9lcy5cbiAgdGhpcy50eXBlcyA9IE9iamVjdC5jcmVhdGUodHlwZXMpO1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBPYmplY3QuY3JlYXRlKGF0dHJpYnV0ZS52YWxpZGF0b3JzKTtcbn07XG5cbi8vIEFsbG93IGZvcm1hdHMgdG8gYmUgcmVnaXN0ZXJlZCBnbG9iYWxseS5cblZhbGlkYXRvci5wcm90b3R5cGUuY3VzdG9tRm9ybWF0cyA9IHt9O1xuXG4vLyBIaW50IGF0IHRoZSBwcmVzZW5jZSBvZiBhIHByb3BlcnR5XG5WYWxpZGF0b3IucHJvdG90eXBlLnNjaGVtYXMgPSBudWxsO1xuVmFsaWRhdG9yLnByb3RvdHlwZS50eXBlcyA9IG51bGw7XG5WYWxpZGF0b3IucHJvdG90eXBlLmF0dHJpYnV0ZXMgPSBudWxsO1xuVmFsaWRhdG9yLnByb3RvdHlwZS51bnJlc29sdmVkUmVmcyA9IG51bGw7XG5cbi8qKlxuICogQWRkcyBhIHNjaGVtYSB3aXRoIGEgY2VydGFpbiB1cm4gdG8gdGhlIFZhbGlkYXRvciBpbnN0YW5jZS5cbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSB1cm5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuVmFsaWRhdG9yLnByb3RvdHlwZS5hZGRTY2hlbWEgPSBmdW5jdGlvbiBhZGRTY2hlbWEgKHNjaGVtYSwgYmFzZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHNjYW4gPSBzY2FuU2NoZW1hKGJhc2V8fGFub255bW91c0Jhc2UsIHNjaGVtYSk7XG4gIHZhciBvdXJVcmkgPSBiYXNlIHx8IHNjaGVtYS4kaWQgfHwgc2NoZW1hLmlkO1xuICBmb3IodmFyIHVyaSBpbiBzY2FuLmlkKXtcbiAgICB0aGlzLnNjaGVtYXNbdXJpXSA9IHNjYW4uaWRbdXJpXTtcbiAgfVxuICBmb3IodmFyIHVyaSBpbiBzY2FuLnJlZil7XG4gICAgLy8gSWYgdGhpcyBzY2hlbWEgaXMgYWxyZWFkeSBkZWZpbmVkLCBpdCB3aWxsIGJlIGZpbHRlcmVkIG91dCBieSB0aGUgbmV4dCBzdGVwXG4gICAgdGhpcy51bnJlc29sdmVkUmVmcy5wdXNoKHVyaSk7XG4gIH1cbiAgLy8gUmVtb3ZlIG5ld2x5IGRlZmluZWQgc2NoZW1hcyBmcm9tIHVucmVzb2x2ZWRSZWZzXG4gIHRoaXMudW5yZXNvbHZlZFJlZnMgPSB0aGlzLnVucmVzb2x2ZWRSZWZzLmZpbHRlcihmdW5jdGlvbih1cmkpe1xuICAgIHJldHVybiB0eXBlb2Ygc2VsZi5zY2hlbWFzW3VyaV09PT0ndW5kZWZpbmVkJztcbiAgfSk7XG4gIHJldHVybiB0aGlzLnNjaGVtYXNbb3VyVXJpXTtcbn07XG5cblZhbGlkYXRvci5wcm90b3R5cGUuYWRkU3ViU2NoZW1hQXJyYXkgPSBmdW5jdGlvbiBhZGRTdWJTY2hlbWFBcnJheShiYXNldXJpLCBzY2hlbWFzKSB7XG4gIGlmKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSByZXR1cm47XG4gIGZvcih2YXIgaT0wOyBpPHNjaGVtYXMubGVuZ3RoOyBpKyspe1xuICAgIHRoaXMuYWRkU3ViU2NoZW1hKGJhc2V1cmksIHNjaGVtYXNbaV0pO1xuICB9XG59O1xuXG5WYWxpZGF0b3IucHJvdG90eXBlLmFkZFN1YlNjaGVtYU9iamVjdCA9IGZ1bmN0aW9uIGFkZFN1YlNjaGVtYUFycmF5KGJhc2V1cmksIHNjaGVtYXMpIHtcbiAgaWYoIXNjaGVtYXMgfHwgdHlwZW9mIHNjaGVtYXMhPSdvYmplY3QnKSByZXR1cm47XG4gIGZvcih2YXIgcCBpbiBzY2hlbWFzKXtcbiAgICB0aGlzLmFkZFN1YlNjaGVtYShiYXNldXJpLCBzY2hlbWFzW3BdKTtcbiAgfVxufTtcblxuXG5cbi8qKlxuICogU2V0cyBhbGwgdGhlIHNjaGVtYXMgb2YgdGhlIFZhbGlkYXRvciBpbnN0YW5jZS5cbiAqIEBwYXJhbSBzY2hlbWFzXG4gKi9cblZhbGlkYXRvci5wcm90b3R5cGUuc2V0U2NoZW1hcyA9IGZ1bmN0aW9uIHNldFNjaGVtYXMgKHNjaGVtYXMpIHtcbiAgdGhpcy5zY2hlbWFzID0gc2NoZW1hcztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2NoZW1hIG9mIGEgY2VydGFpbiB1cm5cbiAqIEBwYXJhbSB1cm5cbiAqL1xuVmFsaWRhdG9yLnByb3RvdHlwZS5nZXRTY2hlbWEgPSBmdW5jdGlvbiBnZXRTY2hlbWEgKHVybikge1xuICByZXR1cm4gdGhpcy5zY2hlbWFzW3Vybl07XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBpbnN0YW5jZSBhZ2FpbnN0IHRoZSBwcm92aWRlZCBzY2hlbWFcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIFtvcHRpb25zXVxuICogQHBhcmFtIFtjdHhdXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYoKHR5cGVvZiBzY2hlbWEgIT09ICdib29sZWFuJyAmJiB0eXBlb2Ygc2NoZW1hICE9PSAnb2JqZWN0JykgfHwgc2NoZW1hID09PSBudWxsKXtcbiAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IoJ0V4cGVjdGVkIGBzY2hlbWFgIHRvIGJlIGFuIG9iamVjdCBvciBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIC8vIFRoaXMgc2VjdGlvbiBpbmRleGVzIHN1YnNjaGVtYXMgaW4gdGhlIHByb3ZpZGVkIHNjaGVtYSwgc28gdGhleSBkb24ndCBuZWVkIHRvIGJlIGFkZGVkIHdpdGggVmFsaWRhdG9yI2FkZFNjaGVtYVxuICAvLyBUaGlzIHdpbGwgd29yayBzbyBsb25nIGFzIHRoZSBmdW5jdGlvbiBhdCB1cmkucmVzb2x2ZSgpIHdpbGwgcmVzb2x2ZSBhIHJlbGF0aXZlIFVSSSB0byBhIHJlbGF0aXZlIFVSSVxuICB2YXIgaWQgPSBzY2hlbWEuJGlkIHx8IHNjaGVtYS5pZDtcbiAgdmFyIGJhc2UgPSB1cmlsaWIucmVzb2x2ZShvcHRpb25zLmJhc2V8fGFub255bW91c0Jhc2UsIGlkfHwnJyk7XG4gIGlmKCFjdHgpe1xuICAgIGN0eCA9IG5ldyBTY2hlbWFDb250ZXh0KHNjaGVtYSwgb3B0aW9ucywgW10sIGJhc2UsIE9iamVjdC5jcmVhdGUodGhpcy5zY2hlbWFzKSk7XG4gICAgaWYgKCFjdHguc2NoZW1hc1tiYXNlXSkge1xuICAgICAgY3R4LnNjaGVtYXNbYmFzZV0gPSBzY2hlbWE7XG4gICAgfVxuICAgIHZhciBmb3VuZCA9IHNjYW5TY2hlbWEoYmFzZSwgc2NoZW1hKTtcbiAgICBmb3IodmFyIG4gaW4gZm91bmQuaWQpe1xuICAgICAgdmFyIHNjaCA9IGZvdW5kLmlkW25dO1xuICAgICAgY3R4LnNjaGVtYXNbbl0gPSBzY2g7XG4gICAgfVxuICB9XG4gIGlmKG9wdGlvbnMucmVxdWlyZWQgJiYgaW5zdGFuY2U9PT11bmRlZmluZWQpe1xuICAgIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdpcyByZXF1aXJlZCwgYnV0IGlzIHVuZGVmaW5lZCcpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VsdCB1bmRlZmluZWQnKTtcbiAgfWVsc2UgaWYob3B0aW9ucy50aHJvd0FsbCAmJiByZXN1bHQuZXJyb3JzLmxlbmd0aCl7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRvclJlc3VsdEVycm9yKHJlc3VsdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuKiBAcGFyYW0gT2JqZWN0IHNjaGVtYVxuKiBAcmV0dXJuIG1peGVkIHNjaGVtYSB1cmkgb3IgZmFsc2VcbiovXG5mdW5jdGlvbiBzaG91bGRSZXNvbHZlKHNjaGVtYSkge1xuICB2YXIgcmVmID0gKHR5cGVvZiBzY2hlbWEgPT09ICdzdHJpbmcnKSA/IHNjaGVtYSA6IHNjaGVtYS4kcmVmO1xuICBpZiAodHlwZW9mIHJlZj09J3N0cmluZycpIHJldHVybiByZWY7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gaW5zdGFuY2UgYWdhaW5zdCB0aGUgc2NoZW1hICh0aGUgYWN0dWFsIHdvcmsgaG9yc2UpXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7VmFsaWRhdG9yUmVzdWx0fVxuICovXG5WYWxpZGF0b3IucHJvdG90eXBlLnZhbGlkYXRlU2NoZW1hID0gZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuXG4gIC8vIFN1cHBvcnQgZm9yIHRoZSB0cnVlL2ZhbHNlIHNjaGVtYXNcbiAgaWYodHlwZW9mIHNjaGVtYT09PSdib29sZWFuJykge1xuICAgIGlmKHNjaGVtYT09PXRydWUpe1xuICAgICAgLy8gYHRydWVgIGlzIGFsd2F5cyB2YWxpZFxuICAgICAgc2NoZW1hID0ge307XG4gICAgfWVsc2UgaWYoc2NoZW1hPT09ZmFsc2Upe1xuICAgICAgLy8gYGZhbHNlYCBpcyBhbHdheXMgaW52YWxpZFxuICAgICAgc2NoZW1hID0ge3R5cGU6IFtdfTtcbiAgICB9XG4gIH1lbHNlIGlmKCFzY2hlbWEpe1xuICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBzdHJpbmdcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY2hlbWEgaXMgdW5kZWZpbmVkXCIpO1xuICB9XG5cbiAgaWYgKHNjaGVtYVsnZXh0ZW5kcyddKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hWydleHRlbmRzJ10pKSB7XG4gICAgICB2YXIgc2NoZW1hb2JqID0ge3NjaGVtYTogc2NoZW1hLCBjdHg6IGN0eH07XG4gICAgICBzY2hlbWFbJ2V4dGVuZHMnXS5mb3JFYWNoKHRoaXMuc2NoZW1hVHJhdmVyc2VyLmJpbmQodGhpcywgc2NoZW1hb2JqKSk7XG4gICAgICBzY2hlbWEgPSBzY2hlbWFvYmouc2NoZW1hO1xuICAgICAgc2NoZW1hb2JqLnNjaGVtYSA9IG51bGw7XG4gICAgICBzY2hlbWFvYmouY3R4ID0gbnVsbDtcbiAgICAgIHNjaGVtYW9iaiA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVtYSA9IGhlbHBlcnMuZGVlcE1lcmdlKHNjaGVtYSwgdGhpcy5zdXBlclJlc29sdmUoc2NoZW1hWydleHRlbmRzJ10sIGN0eCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHBhc3NlZCBhIHN0cmluZyBhcmd1bWVudCwgbG9hZCB0aGF0IHNjaGVtYSBVUklcbiAgdmFyIHN3aXRjaFNjaGVtYSA9IHNob3VsZFJlc29sdmUoc2NoZW1hKTtcbiAgaWYgKHN3aXRjaFNjaGVtYSkge1xuICAgIHZhciByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZShzY2hlbWEsIHN3aXRjaFNjaGVtYSwgY3R4KTtcbiAgICB2YXIgc3ViY3R4ID0gbmV3IFNjaGVtYUNvbnRleHQocmVzb2x2ZWQuc3Vic2NoZW1hLCBvcHRpb25zLCBjdHgucGF0aCwgcmVzb2x2ZWQuc3dpdGNoU2NoZW1hLCBjdHguc2NoZW1hcyk7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2UsIHJlc29sdmVkLnN1YnNjaGVtYSwgb3B0aW9ucywgc3ViY3R4KTtcbiAgfVxuXG4gIHZhciBza2lwQXR0cmlidXRlcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5za2lwQXR0cmlidXRlcyB8fCBbXTtcbiAgLy8gVmFsaWRhdGUgZWFjaCBzY2hlbWEgYXR0cmlidXRlIGFnYWluc3QgdGhlIGluc3RhbmNlXG4gIGZvciAodmFyIGtleSBpbiBzY2hlbWEpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZS5pZ25vcmVQcm9wZXJ0aWVzW2tleV0gJiYgc2tpcEF0dHJpYnV0ZXMuaW5kZXhPZihrZXkpIDwgMCkge1xuICAgICAgdmFyIHZhbGlkYXRvckVyciA9IG51bGw7XG4gICAgICB2YXIgdmFsaWRhdG9yID0gdGhpcy5hdHRyaWJ1dGVzW2tleV07XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHZhbGlkYXRvckVyciA9IHZhbGlkYXRvci5jYWxsKHRoaXMsIGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuYWxsb3dVbmtub3duQXR0cmlidXRlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgLy8gVGhpcyByZXByZXNlbnRzIGFuIGVycm9yIHdpdGggdGhlIHNjaGVtYSBpdHNlbGYsIG5vdCBhbiBpbnZhbGlkIGluc3RhbmNlXG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcihcIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZTogXCIgKyBrZXksIHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWRhdG9yRXJyKSB7XG4gICAgICAgIHJlc3VsdC5pbXBvcnRFcnJvcnModmFsaWRhdG9yRXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMucmV3cml0ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy5yZXdyaXRlLmNhbGwodGhpcywgaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgICByZXN1bHQuaW5zdGFuY2UgPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4qIEBwcml2YXRlXG4qIEBwYXJhbSBPYmplY3Qgc2NoZW1hXG4qIEBwYXJhbSBTY2hlbWFDb250ZXh0IGN0eFxuKiBAcmV0dXJucyBPYmplY3Qgc2NoZW1hIG9yIHJlc29sdmVkIHNjaGVtYVxuKi9cblZhbGlkYXRvci5wcm90b3R5cGUuc2NoZW1hVHJhdmVyc2VyID0gZnVuY3Rpb24gc2NoZW1hVHJhdmVyc2VyIChzY2hlbWFvYmosIHMpIHtcbiAgc2NoZW1hb2JqLnNjaGVtYSA9IGhlbHBlcnMuZGVlcE1lcmdlKHNjaGVtYW9iai5zY2hlbWEsIHRoaXMuc3VwZXJSZXNvbHZlKHMsIHNjaGVtYW9iai5jdHgpKTtcbn07XG5cbi8qKlxuKiBAcHJpdmF0ZVxuKiBAcGFyYW0gT2JqZWN0IHNjaGVtYVxuKiBAcGFyYW0gU2NoZW1hQ29udGV4dCBjdHhcbiogQHJldHVybnMgT2JqZWN0IHNjaGVtYSBvciByZXNvbHZlZCBzY2hlbWFcbiovXG5WYWxpZGF0b3IucHJvdG90eXBlLnN1cGVyUmVzb2x2ZSA9IGZ1bmN0aW9uIHN1cGVyUmVzb2x2ZSAoc2NoZW1hLCBjdHgpIHtcbiAgdmFyIHJlZiA9IHNob3VsZFJlc29sdmUoc2NoZW1hKTtcbiAgaWYocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZShzY2hlbWEsIHJlZiwgY3R4KS5zdWJzY2hlbWE7XG4gIH1cbiAgcmV0dXJuIHNjaGVtYTtcbn07XG5cbi8qKlxuKiBAcHJpdmF0ZVxuKiBAcGFyYW0gT2JqZWN0IHNjaGVtYVxuKiBAcGFyYW0gT2JqZWN0IHN3aXRjaFNjaGVtYVxuKiBAcGFyYW0gU2NoZW1hQ29udGV4dCBjdHhcbiogQHJldHVybiBPYmplY3QgcmVzb2x2ZWQgc2NoZW1hcyB7c3Vic2NoZW1hOlN0cmluZywgc3dpdGNoU2NoZW1hOiBTdHJpbmd9XG4qIEB0aHJvd3MgU2NoZW1hRXJyb3JcbiovXG5WYWxpZGF0b3IucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlIChzY2hlbWEsIHN3aXRjaFNjaGVtYSwgY3R4KSB7XG4gIHN3aXRjaFNjaGVtYSA9IGN0eC5yZXNvbHZlKHN3aXRjaFNjaGVtYSk7XG4gIC8vIEZpcnN0IHNlZSBpZiB0aGUgc2NoZW1hIGV4aXN0cyB1bmRlciB0aGUgcHJvdmlkZWQgVVJJXG4gIGlmIChjdHguc2NoZW1hc1tzd2l0Y2hTY2hlbWFdKSB7XG4gICAgcmV0dXJuIHtzdWJzY2hlbWE6IGN0eC5zY2hlbWFzW3N3aXRjaFNjaGVtYV0sIHN3aXRjaFNjaGVtYTogc3dpdGNoU2NoZW1hfTtcbiAgfVxuICAvLyBFbHNlIHRyeSB3YWxraW5nIHRoZSBwcm9wZXJ0eSBwb2ludGVyXG4gIHZhciBwYXJzZWQgPSB1cmlsaWIucGFyc2Uoc3dpdGNoU2NoZW1hKTtcbiAgdmFyIGZyYWdtZW50ID0gcGFyc2VkICYmIHBhcnNlZC5oYXNoO1xuICB2YXIgZG9jdW1lbnQgPSBmcmFnbWVudCAmJiBmcmFnbWVudC5sZW5ndGggJiYgc3dpdGNoU2NoZW1hLnN1YnN0cigwLCBzd2l0Y2hTY2hlbWEubGVuZ3RoIC0gZnJhZ21lbnQubGVuZ3RoKTtcbiAgaWYgKCFkb2N1bWVudCB8fCAhY3R4LnNjaGVtYXNbZG9jdW1lbnRdKSB7XG4gICAgdGhyb3cgbmV3IFNjaGVtYUVycm9yKFwibm8gc3VjaCBzY2hlbWEgPFwiICsgc3dpdGNoU2NoZW1hICsgXCI+XCIsIHNjaGVtYSk7XG4gIH1cbiAgdmFyIHN1YnNjaGVtYSA9IGhlbHBlcnMub2JqZWN0R2V0UGF0aChjdHguc2NoZW1hc1tkb2N1bWVudF0sIGZyYWdtZW50LnN1YnN0cigxKSk7XG4gIGlmKHN1YnNjaGVtYT09PXVuZGVmaW5lZCl7XG4gICAgdGhyb3cgbmV3IFNjaGVtYUVycm9yKFwibm8gc3VjaCBzY2hlbWEgXCIgKyBmcmFnbWVudCArIFwiIGxvY2F0ZWQgaW4gPFwiICsgZG9jdW1lbnQgKyBcIj5cIiwgc2NoZW1hKTtcbiAgfVxuICByZXR1cm4ge3N1YnNjaGVtYTogc3Vic2NoZW1hLCBzd2l0Y2hTY2hlbWE6IHN3aXRjaFNjaGVtYX07XG59O1xuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgdGhlIGluc3RhbmNlIGlmIG9mIGEgY2VydGFpbiB0eXBlLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEBwYXJhbSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5WYWxpZGF0b3IucHJvdG90eXBlLnRlc3RUeXBlID0gZnVuY3Rpb24gdmFsaWRhdGVUeXBlIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgsIHR5cGUpIHtcbiAgaWYodHlwZT09PXVuZGVmaW5lZCl7XG4gICAgcmV0dXJuO1xuICB9ZWxzZSBpZih0eXBlPT09bnVsbCl7XG4gICAgdGhyb3cgbmV3IFNjaGVtYUVycm9yKCdVbmV4cGVjdGVkIG51bGwgaW4gXCJ0eXBlXCIga2V5d29yZCcpO1xuICB9XG4gIGlmICh0eXBlb2YgdGhpcy50eXBlc1t0eXBlXSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXNbdHlwZV0uY2FsbCh0aGlzLCBpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKHR5cGUgJiYgdHlwZW9mIHR5cGUgPT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShpbnN0YW5jZSwgdHlwZSwgb3B0aW9ucywgY3R4KTtcbiAgICByZXR1cm4gcmVzID09PSB1bmRlZmluZWQgfHwgIShyZXMgJiYgcmVzLmVycm9ycy5sZW5ndGgpO1xuICB9XG4gIC8vIFVuZGVmaW5lZCBvciBwcm9wZXJ0aWVzIG5vdCBvbiB0aGUgbGlzdCBhcmUgYWNjZXB0YWJsZSwgc2FtZSBhcyBub3QgYmVpbmcgZGVmaW5lZFxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciB0eXBlcyA9IFZhbGlkYXRvci5wcm90b3R5cGUudHlwZXMgPSB7fTtcbnR5cGVzLnN0cmluZyA9IGZ1bmN0aW9uIHRlc3RTdHJpbmcgKGluc3RhbmNlKSB7XG4gIHJldHVybiB0eXBlb2YgaW5zdGFuY2UgPT0gJ3N0cmluZyc7XG59O1xudHlwZXMubnVtYmVyID0gZnVuY3Rpb24gdGVzdE51bWJlciAoaW5zdGFuY2UpIHtcbiAgLy8gaXNGaW5pdGUgcmV0dXJucyBmYWxzZSBmb3IgTmFOLCBJbmZpbml0eSwgYW5kIC1JbmZpbml0eVxuICByZXR1cm4gdHlwZW9mIGluc3RhbmNlID09ICdudW1iZXInICYmIGlzRmluaXRlKGluc3RhbmNlKTtcbn07XG50eXBlcy5pbnRlZ2VyID0gZnVuY3Rpb24gdGVzdEludGVnZXIgKGluc3RhbmNlKSB7XG4gIHJldHVybiAodHlwZW9mIGluc3RhbmNlID09ICdudW1iZXInKSAmJiBpbnN0YW5jZSAlIDEgPT09IDA7XG59O1xudHlwZXMuYm9vbGVhbiA9IGZ1bmN0aW9uIHRlc3RCb29sZWFuIChpbnN0YW5jZSkge1xuICByZXR1cm4gdHlwZW9mIGluc3RhbmNlID09ICdib29sZWFuJztcbn07XG50eXBlcy5hcnJheSA9IGZ1bmN0aW9uIHRlc3RBcnJheSAoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5zdGFuY2UpO1xufTtcbnR5cGVzWydudWxsJ10gPSBmdW5jdGlvbiB0ZXN0TnVsbCAoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlID09PSBudWxsO1xufTtcbnR5cGVzLmRhdGUgPSBmdW5jdGlvbiB0ZXN0RGF0ZSAoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlIGluc3RhbmNlb2YgRGF0ZTtcbn07XG50eXBlcy5hbnkgPSBmdW5jdGlvbiB0ZXN0QW55IChpbnN0YW5jZSkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG50eXBlcy5vYmplY3QgPSBmdW5jdGlvbiB0ZXN0T2JqZWN0IChpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBmaXggdGhpcyAtIHNlZSAjMTVcbiAgcmV0dXJuIGluc3RhbmNlICYmICh0eXBlb2YgaW5zdGFuY2UgPT09ICdvYmplY3QnKSAmJiAhKEFycmF5LmlzQXJyYXkoaW5zdGFuY2UpKSAmJiAhKGluc3RhbmNlIGluc3RhbmNlb2YgRGF0ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZhbGlkYXRvcjtcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuNC4xIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiZcblx0XHQhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0IW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChcblx0XHRmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC5zZWxmID09PSBmcmVlR2xvYmFsXG5cdCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW15cXHgyMC1cXHg3RV0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cblx0LyoqIEVycm9yIG1lc3NhZ2VzICovXG5cdGVycm9ycyA9IHtcblx0XHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHRcdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcblx0fSxcblxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5cdGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbixcblx0Zmxvb3IgPSBNYXRoLmZsb29yLFxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxuXG5cdC8qKiBUZW1wb3JhcnkgdmFyaWFibGUgKi9cblx0a2V5O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG5cdCAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcblx0ICogaXRlbS5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwKGFycmF5LCBmbikge1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXHRcdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3Mgb3IgZW1haWxcblx0ICogYWRkcmVzc2VzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcblx0ICogY2hhcmFjdGVyLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFja1xuXHQgKiBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcERvbWFpbihzdHJpbmcsIGZuKSB7XG5cdFx0dmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XG5cdFx0dmFyIHJlc3VsdCA9ICcnO1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG5cdFx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdFx0cmVzdWx0ID0gcGFydHNbMF0gKyAnQCc7XG5cdFx0XHRzdHJpbmcgPSBwYXJ0c1sxXTtcblx0XHR9XG5cdFx0Ly8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuXHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG5cdFx0dmFyIGxhYmVscyA9IHN0cmluZy5zcGxpdCgnLicpO1xuXHRcdHZhciBlbmNvZGVkID0gbWFwKGxhYmVscywgZm4pLmpvaW4oJy4nKTtcblx0XHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG5cdCAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcblx0ICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2hcblx0ICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG5cdCAqIG1hdGNoaW5nIFVURi0xNi5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5lbmNvZGVgXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBkZWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cblx0ICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGNvdW50ZXIgPSAwLFxuXHRcdCAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuXHRcdCAgICB2YWx1ZSxcblx0XHQgICAgZXh0cmE7XG5cdFx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdFx0Ly8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG5cdFx0XHRcdGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcblx0XHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG5cdFx0XHRcdFx0Ly8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzdHJpbmcgYmFzZWQgb24gYW4gYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGVuY29kZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdFx0cmV0dXJuIG1hcChhcnJheSwgZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHRcdGlmICh2YWx1ZSA+IDB4RkZGRikge1xuXHRcdFx0XHR2YWx1ZSAtPSAweDEwMDAwO1xuXHRcdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdFx0dmFsdWUgPSAweERDMDAgfCB2YWx1ZSAmIDB4M0ZGO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cblx0ICogQHNlZSBgZGlnaXRUb0Jhc2ljKClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50IChmb3IgdXNlIGluXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcblx0ICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XG5cdFx0aWYgKGNvZGVQb2ludCAtIDQ4IDwgMTApIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSAyMjtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDY1IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA2NTtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDk3IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA5Nztcblx0XHR9XG5cdFx0cmV0dXJuIGJhc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3Jcblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2Vcblx0ICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG5cdCAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG5cdCAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG5cdCAqL1xuXHRmdW5jdGlvbiBkaWdpdFRvQmFzaWMoZGlnaXQsIGZsYWcpIHtcblx0XHQvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuXHRcdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRcdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XG5cdH1cblxuXHQvKipcblx0ICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cblx0ICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHRcdHZhciBrID0gMDtcblx0XHRkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuXHRcdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0XHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuXHRcdFx0ZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuXHQgKiBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcblx0XHQvLyBEb24ndCB1c2UgVUNTLTJcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLFxuXHRcdCAgICBvdXQsXG5cdFx0ICAgIGkgPSAwLFxuXHRcdCAgICBuID0gaW5pdGlhbE4sXG5cdFx0ICAgIGJpYXMgPSBpbml0aWFsQmlhcyxcblx0XHQgICAgYmFzaWMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIGluZGV4LFxuXHRcdCAgICBvbGRpLFxuXHRcdCAgICB3LFxuXHRcdCAgICBrLFxuXHRcdCAgICBkaWdpdCxcblx0XHQgICAgdCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGJhc2VNaW51c1Q7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiBsZXQgYGJhc2ljYCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IGNvZGVcblx0XHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHRcdC8vIHRoZSBmaXJzdCBiYXNpYyBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LlxuXG5cdFx0YmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRcdGlmIChiYXNpYyA8IDApIHtcblx0XHRcdGJhc2ljID0gMDtcblx0XHR9XG5cblx0XHRmb3IgKGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuXHRcdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0XHRpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAweDgwKSB7XG5cdFx0XHRcdGVycm9yKCdub3QtYmFzaWMnKTtcblx0XHRcdH1cblx0XHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcblx0XHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdFx0Zm9yIChpbmRleCA9IGJhc2ljID4gMCA/IGJhc2ljICsgMSA6IDA7IGluZGV4IDwgaW5wdXRMZW5ndGg7IC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi8pIHtcblxuXHRcdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxuXHRcdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdFx0Ly8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcblx0XHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXG5cdFx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdFx0Zm9yIChvbGRpID0gaSwgdyA9IDEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXG5cdFx0XHRcdGlmIChpbmRleCA+PSBpbnB1dExlbmd0aCkge1xuXHRcdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0IDwgdCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0ID0gb3V0cHV0Lmxlbmd0aCArIDE7XG5cdFx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcblx0XHRcdC8vIGluY3JlbWVudGluZyBgbmAgZWFjaCB0aW1lLCBzbyB3ZSdsbCBmaXggdGhhdCBub3c6XG5cdFx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdFx0aSAlPSBvdXQ7XG5cblx0XHRcdC8vIEluc2VydCBgbmAgYXQgcG9zaXRpb24gYGlgIG9mIHRoZSBvdXRwdXRcblx0XHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1Y3MyZW5jb2RlKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcblx0ICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZW5jb2RlKGlucHV0KSB7XG5cdFx0dmFyIG4sXG5cdFx0ICAgIGRlbHRhLFxuXHRcdCAgICBoYW5kbGVkQ1BDb3VudCxcblx0XHQgICAgYmFzaWNMZW5ndGgsXG5cdFx0ICAgIGJpYXMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIG0sXG5cdFx0ICAgIHEsXG5cdFx0ICAgIGssXG5cdFx0ICAgIHQsXG5cdFx0ICAgIGN1cnJlbnRWYWx1ZSxcblx0XHQgICAgb3V0cHV0ID0gW10sXG5cdFx0ICAgIC8qKiBgaW5wdXRMZW5ndGhgIHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIGBpbnB1dGAuICovXG5cdFx0ICAgIGlucHV0TGVuZ3RoLFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgaGFuZGxlZENQQ291bnRQbHVzT25lLFxuXHRcdCAgICBiYXNlTWludXNULFxuXHRcdCAgICBxTWludXNUO1xuXG5cdFx0Ly8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gVW5pY29kZVxuXHRcdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0XHQvLyBDYWNoZSB0aGUgbGVuZ3RoXG5cdFx0aW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cblx0XHQvLyBJbml0aWFsaXplIHRoZSBzdGF0ZVxuXHRcdG4gPSBpbml0aWFsTjtcblx0XHRkZWx0YSA9IDA7XG5cdFx0YmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50c1xuXHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblxuXHRcdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHRcdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHRcdC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIC0gaWYgaXQgaXMgbm90IGVtcHR5IC0gd2l0aCBhIGRlbGltaXRlclxuXHRcdGlmIChiYXNpY0xlbmd0aCkge1xuXHRcdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGVuY29kaW5nIGxvb3A6XG5cdFx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdFx0Ly8gbGFyZ2VyIG9uZTpcblx0XHRcdGZvciAobSA9IG1heEludCwgaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuXHRcdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdFx0Ly8gYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3dcblx0XHRcdGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRcdGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuXHRcdFx0biA9IG07XG5cblx0XHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT0gbikge1xuXHRcdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyXG5cdFx0XHRcdFx0Zm9yIChxID0gZGVsdGEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXHRcdFx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cdFx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRxTWludXNUID0gcSAtIHQ7XG5cdFx0XHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChcblx0XHRcdFx0XHRcdFx0c3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xuXHRcdFx0XHRcdGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG5cdFx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0KytkZWx0YTtcblx0XHRcdCsrbjtcblxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3Ncblx0ICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuXHQgKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cblx0ICogY29udmVydGVkIHRvIFVuaWNvZGUuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIGNvbnZlcnQgdG8gVW5pY29kZS5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG5cdCAqIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvVW5pY29kZShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3MgdG9cblx0ICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG5cdCAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuXHQgKiBBU0NJSS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG5cdCAqIFVuaWNvZGUgc3RyaW5nLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG5cdCAqIGVtYWlsIGFkZHJlc3MuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0FTQ0lJKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyAneG4tLScgKyBlbmNvZGUoc3RyaW5nKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cblx0cHVueWNvZGUgPSB7XG5cdFx0LyoqXG5cdFx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFB1bnljb2RlLmpzIHZlcnNpb24gbnVtYmVyLlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdCd2ZXJzaW9uJzogJzEuNC4xJyxcblx0XHQvKipcblx0XHQgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuXHRcdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdFx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgT2JqZWN0XG5cdFx0ICovXG5cdFx0J3VjczInOiB7XG5cdFx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdFx0fSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiBlbmNvZGUsXG5cdFx0J3RvQVNDSUknOiB0b0FTQ0lJLFxuXHRcdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcblx0fTtcblxuXHQvKiogRXhwb3NlIGBwdW55Y29kZWAgKi9cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoJ3B1bnljb2RlJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcHVueWNvZGU7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSkge1xuXHRcdGlmIChtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cykge1xuXHRcdFx0Ly8gaW4gTm9kZS5qcywgaW8uanMsIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gcHVueWNvZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKGtleSBpbiBwdW55Y29kZSkge1xuXHRcdFx0XHRwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnB1bnljb2RlID0gcHVueWNvZGU7XG5cdH1cblxufSh0aGlzKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc1N0cmluZzogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZihhcmcpID09PSAnc3RyaW5nJztcbiAgfSxcbiAgaXNPYmplY3Q6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xuICB9LFxuICBpc051bGw6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgPT09IG51bGw7XG4gIH0sXG4gIGlzTnVsbE9yVW5kZWZpbmVkOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09IG51bGw7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5leHBvcnRzLmVuY29kZSA9IGV4cG9ydHMuc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8vIElmIG9iai5oYXNPd25Qcm9wZXJ0eSBoYXMgYmVlbiBvdmVycmlkZGVuLCB0aGVuIGNhbGxpbmdcbi8vIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSB3aWxsIGJyZWFrLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MDdcbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocXMsIHNlcCwgZXEsIG9wdGlvbnMpIHtcbiAgc2VwID0gc2VwIHx8ICcmJztcbiAgZXEgPSBlcSB8fCAnPSc7XG4gIHZhciBvYmogPSB7fTtcblxuICBpZiAodHlwZW9mIHFzICE9PSAnc3RyaW5nJyB8fCBxcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgdmFyIHJlZ2V4cCA9IC9cXCsvZztcbiAgcXMgPSBxcy5zcGxpdChzZXApO1xuXG4gIHZhciBtYXhLZXlzID0gMTAwMDtcbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMubWF4S2V5cyA9PT0gJ251bWJlcicpIHtcbiAgICBtYXhLZXlzID0gb3B0aW9ucy5tYXhLZXlzO1xuICB9XG5cbiAgdmFyIGxlbiA9IHFzLmxlbmd0aDtcbiAgLy8gbWF4S2V5cyA8PSAwIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIG5vdCBsaW1pdCBrZXlzIGNvdW50XG4gIGlmIChtYXhLZXlzID4gMCAmJiBsZW4gPiBtYXhLZXlzKSB7XG4gICAgbGVuID0gbWF4S2V5cztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICB2YXIgeCA9IHFzW2ldLnJlcGxhY2UocmVnZXhwLCAnJTIwJyksXG4gICAgICAgIGlkeCA9IHguaW5kZXhPZihlcSksXG4gICAgICAgIGtzdHIsIHZzdHIsIGssIHY7XG5cbiAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgIGtzdHIgPSB4LnN1YnN0cigwLCBpZHgpO1xuICAgICAgdnN0ciA9IHguc3Vic3RyKGlkeCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrc3RyID0geDtcbiAgICAgIHZzdHIgPSAnJztcbiAgICB9XG5cbiAgICBrID0gZGVjb2RlVVJJQ29tcG9uZW50KGtzdHIpO1xuICAgIHYgPSBkZWNvZGVVUklDb21wb25lbnQodnN0cik7XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5KG9iaiwgaykpIHtcbiAgICAgIG9ialtrXSA9IHY7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG9ialtrXSkpIHtcbiAgICAgIG9ialtrXS5wdXNoKHYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba10gPSBbb2JqW2tdLCB2XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh4cykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5UHJpbWl0aXZlID0gZnVuY3Rpb24odikge1xuICBzd2l0Y2ggKHR5cGVvZiB2KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiB2O1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gdiA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIGlzRmluaXRlKHYpID8gdiA6ICcnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmosIHNlcCwgZXEsIG5hbWUpIHtcbiAgc2VwID0gc2VwIHx8ICcmJztcbiAgZXEgPSBlcSB8fCAnPSc7XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICBvYmogPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbWFwKG9iamVjdEtleXMob2JqKSwgZnVuY3Rpb24oaykge1xuICAgICAgdmFyIGtzID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShrKSkgKyBlcTtcbiAgICAgIGlmIChpc0FycmF5KG9ialtrXSkpIHtcbiAgICAgICAgcmV0dXJuIG1hcChvYmpba10sIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTtcbiAgICAgICAgfSkuam9pbihzZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTtcbiAgICAgIH1cbiAgICB9KS5qb2luKHNlcCk7XG5cbiAgfVxuXG4gIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShuYW1lKSkgKyBlcSArXG4gICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9iaikpO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh4cykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbmZ1bmN0aW9uIG1hcCAoeHMsIGYpIHtcbiAgaWYgKHhzLm1hcCkgcmV0dXJuIHhzLm1hcChmKTtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnB1c2goZih4c1tpXSwgaSkpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgcmVzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcblxuLyoqIEB0eXBlIFZhbGlkYXRvclJlc3VsdCAqL1xudmFyIFZhbGlkYXRvclJlc3VsdCA9IGhlbHBlcnMuVmFsaWRhdG9yUmVzdWx0O1xuLyoqIEB0eXBlIFNjaGVtYUVycm9yICovXG52YXIgU2NoZW1hRXJyb3IgPSBoZWxwZXJzLlNjaGVtYUVycm9yO1xuXG52YXIgYXR0cmlidXRlID0ge307XG5cbmF0dHJpYnV0ZS5pZ25vcmVQcm9wZXJ0aWVzID0ge1xuICAvLyBpbmZvcm1hdGl2ZSBwcm9wZXJ0aWVzXG4gICdpZCc6IHRydWUsXG4gICdkZWZhdWx0JzogdHJ1ZSxcbiAgJ2Rlc2NyaXB0aW9uJzogdHJ1ZSxcbiAgJ3RpdGxlJzogdHJ1ZSxcbiAgLy8gYXJndW1lbnRzIHRvIG90aGVyIHByb3BlcnRpZXNcbiAgJ2FkZGl0aW9uYWxJdGVtcyc6IHRydWUsXG4gICd0aGVuJzogdHJ1ZSxcbiAgJ2Vsc2UnOiB0cnVlLFxuICAvLyBzcGVjaWFsLWhhbmRsZWQgcHJvcGVydGllc1xuICAnJHNjaGVtYSc6IHRydWUsXG4gICckcmVmJzogdHJ1ZSxcbiAgJ2V4dGVuZHMnOiB0cnVlLFxufTtcblxuLyoqXG4gKiBAbmFtZSB2YWxpZGF0b3JzXG4gKi9cbnZhciB2YWxpZGF0b3JzID0gYXR0cmlidXRlLnZhbGlkYXRvcnMgPSB7fTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgaWYgb2YgYSBjZXJ0YWluIHR5cGVcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge1ZhbGlkYXRvclJlc3VsdHxudWxsfVxuICovXG52YWxpZGF0b3JzLnR5cGUgPSBmdW5jdGlvbiB2YWxpZGF0ZVR5cGUgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICAvLyBJZ25vcmUgdW5kZWZpbmVkIGluc3RhbmNlc1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciB0eXBlcyA9IEFycmF5LmlzQXJyYXkoc2NoZW1hLnR5cGUpID8gc2NoZW1hLnR5cGUgOiBbc2NoZW1hLnR5cGVdO1xuICBpZiAoIXR5cGVzLnNvbWUodGhpcy50ZXN0VHlwZS5iaW5kKHRoaXMsIGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkpKSB7XG4gICAgdmFyIGxpc3QgPSB0eXBlcy5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgIGlmKCF2KSByZXR1cm47XG4gICAgICB2YXIgaWQgPSB2LiRpZCB8fCB2LmlkO1xuICAgICAgcmV0dXJuIGlkID8gKCc8JyArIGlkICsgJz4nKSA6ICh2KycnKTtcbiAgICB9KTtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ3R5cGUnLFxuICAgICAgYXJndW1lbnQ6IGxpc3QsXG4gICAgICBtZXNzYWdlOiBcImlzIG5vdCBvZiBhIHR5cGUocykgXCIgKyBsaXN0LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5mdW5jdGlvbiB0ZXN0U2NoZW1hTm9UaHJvdyhpbnN0YW5jZSwgb3B0aW9ucywgY3R4LCBjYWxsYmFjaywgc2NoZW1hKXtcbiAgdmFyIHRocm93RXJyb3IgPSBvcHRpb25zLnRocm93RXJyb3I7XG4gIHZhciB0aHJvd0FsbCA9IG9wdGlvbnMudGhyb3dBbGw7XG4gIG9wdGlvbnMudGhyb3dFcnJvciA9IGZhbHNlO1xuICBvcHRpb25zLnRocm93QWxsID0gZmFsc2U7XG4gIHZhciByZXMgPSB0aGlzLnZhbGlkYXRlU2NoZW1hKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIG9wdGlvbnMudGhyb3dFcnJvciA9IHRocm93RXJyb3I7XG4gIG9wdGlvbnMudGhyb3dBbGwgPSB0aHJvd0FsbDtcblxuICBpZiAoIXJlcy52YWxpZCAmJiBjYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgY2FsbGJhY2socmVzKTtcbiAgfVxuICByZXR1cm4gcmVzLnZhbGlkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBtYXRjaGVzIHNvbWUgb2YgdGhlIGdpdmVuIHNjaGVtYXNcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge1ZhbGlkYXRvclJlc3VsdHxudWxsfVxuICovXG52YWxpZGF0b3JzLmFueU9mID0gZnVuY3Rpb24gdmFsaWRhdGVBbnlPZiAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIC8vIElnbm9yZSB1bmRlZmluZWQgaW5zdGFuY2VzXG4gIGlmIChpbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIGlubmVyID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSl7XG4gICAgdGhyb3cgbmV3IFNjaGVtYUVycm9yKFwiYW55T2YgbXVzdCBiZSBhbiBhcnJheVwiKTtcbiAgfVxuICBpZiAoIXNjaGVtYS5hbnlPZi5zb21lKFxuICAgIHRlc3RTY2hlbWFOb1Rocm93LmJpbmQoXG4gICAgICB0aGlzLCBpbnN0YW5jZSwgb3B0aW9ucywgY3R4LCBmdW5jdGlvbihyZXMpe2lubmVyLmltcG9ydEVycm9ycyhyZXMpO31cbiAgICApKSkge1xuICAgIHZhciBsaXN0ID0gc2NoZW1hLmFueU9mLm1hcChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgdmFyIGlkID0gdi4kaWQgfHwgdi5pZDtcbiAgICAgIGlmKGlkKSByZXR1cm4gJzwnICsgaWQgKyAnPic7XG4gICAgICByZXR1cm4odi50aXRsZSAmJiBKU09OLnN0cmluZ2lmeSh2LnRpdGxlKSkgfHwgKHZbJyRyZWYnXSAmJiAoJzwnICsgdlsnJHJlZiddICsgJz4nKSkgfHwgJ1tzdWJzY2hlbWEgJytpKyddJztcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5uZXN0ZWRFcnJvcnMpIHtcbiAgICAgIHJlc3VsdC5pbXBvcnRFcnJvcnMoaW5uZXIpO1xuICAgIH1cbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ2FueU9mJyxcbiAgICAgIGFyZ3VtZW50OiBsaXN0LFxuICAgICAgbWVzc2FnZTogXCJpcyBub3QgYW55IG9mIFwiICsgbGlzdC5qb2luKCcsJyksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGluc3RhbmNlIG1hdGNoZXMgZXZlcnkgZ2l2ZW4gc2NoZW1hXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5hbGxPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlQWxsT2YgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICAvLyBJZ25vcmUgdW5kZWZpbmVkIGluc3RhbmNlc1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEuYWxsT2YpKXtcbiAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IoXCJhbGxPZiBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2NoZW1hLmFsbE9mLmZvckVhY2goZnVuY3Rpb24odiwgaSl7XG4gICAgdmFyIHZhbGlkID0gc2VsZi52YWxpZGF0ZVNjaGVtYShpbnN0YW5jZSwgdiwgb3B0aW9ucywgY3R4KTtcbiAgICBpZighdmFsaWQudmFsaWQpe1xuICAgICAgdmFyIGlkID0gdi4kaWQgfHwgdi5pZDtcbiAgICAgIHZhciBtc2cgPSBpZCB8fCAodi50aXRsZSAmJiBKU09OLnN0cmluZ2lmeSh2LnRpdGxlKSkgfHwgKHZbJyRyZWYnXSAmJiAoJzwnICsgdlsnJHJlZiddICsgJz4nKSkgfHwgJ1tzdWJzY2hlbWEgJytpKyddJztcbiAgICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICAgIG5hbWU6ICdhbGxPZicsXG4gICAgICAgIGFyZ3VtZW50OiB7IGlkOiBtc2csIGxlbmd0aDogdmFsaWQuZXJyb3JzLmxlbmd0aCwgdmFsaWQ6IHZhbGlkIH0sXG4gICAgICAgIG1lc3NhZ2U6ICdkb2VzIG5vdCBtYXRjaCBhbGxPZiBzY2hlbWEgJyArIG1zZyArICcgd2l0aCAnICsgdmFsaWQuZXJyb3JzLmxlbmd0aCArICcgZXJyb3Jbc106JyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LmltcG9ydEVycm9ycyh2YWxpZCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGluc3RhbmNlIG1hdGNoZXMgZXhhY3RseSBvbmUgb2YgdGhlIGdpdmVuIHNjaGVtYXNcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLm9uZU9mID0gZnVuY3Rpb24gdmFsaWRhdGVPbmVPZiAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIC8vIElnbm9yZSB1bmRlZmluZWQgaW5zdGFuY2VzXG4gIGlmIChpbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpe1xuICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcihcIm9uZU9mIG11c3QgYmUgYW4gYXJyYXlcIik7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIGlubmVyID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgY291bnQgPSBzY2hlbWEub25lT2YuZmlsdGVyKFxuICAgIHRlc3RTY2hlbWFOb1Rocm93LmJpbmQoXG4gICAgICB0aGlzLCBpbnN0YW5jZSwgb3B0aW9ucywgY3R4LCBmdW5jdGlvbihyZXMpIHtpbm5lci5pbXBvcnRFcnJvcnMocmVzKTt9XG4gICAgKSApLmxlbmd0aDtcbiAgdmFyIGxpc3QgPSBzY2hlbWEub25lT2YubWFwKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgdmFyIGlkID0gdi4kaWQgfHwgdi5pZDtcbiAgICByZXR1cm4gaWQgfHwgKHYudGl0bGUgJiYgSlNPTi5zdHJpbmdpZnkodi50aXRsZSkpIHx8ICh2WyckcmVmJ10gJiYgKCc8JyArIHZbJyRyZWYnXSArICc+JykpIHx8ICdbc3Vic2NoZW1hICcraSsnXSc7XG4gIH0pO1xuICBpZiAoY291bnQhPT0xKSB7XG4gICAgaWYgKG9wdGlvbnMubmVzdGVkRXJyb3JzKSB7XG4gICAgICByZXN1bHQuaW1wb3J0RXJyb3JzKGlubmVyKTtcbiAgICB9XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdvbmVPZicsXG4gICAgICBhcmd1bWVudDogbGlzdCxcbiAgICAgIG1lc3NhZ2U6IFwiaXMgbm90IGV4YWN0bHkgb25lIGZyb20gXCIgKyBsaXN0LmpvaW4oJywnKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgXCJ0aGVuXCIgb3IgXCJlbHNlXCIgZGVwZW5kaW5nIG9uIHRoZSByZXN1bHQgb2YgdmFsaWRhdGluZyBcImlmXCJcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLmlmID0gZnVuY3Rpb24gdmFsaWRhdGVJZiAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIC8vIElnbm9yZSB1bmRlZmluZWQgaW5zdGFuY2VzXG4gIGlmIChpbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFoZWxwZXJzLmlzU2NoZW1hKHNjaGVtYS5pZikpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCJpZlwiIGtleXdvcmQgdG8gYmUgYSBzY2hlbWEnKTtcbiAgdmFyIGlmVmFsaWQgPSB0ZXN0U2NoZW1hTm9UaHJvdy5jYWxsKHRoaXMsIGluc3RhbmNlLCBvcHRpb25zLCBjdHgsIG51bGwsIHNjaGVtYS5pZik7XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciByZXM7XG4gIGlmKGlmVmFsaWQpe1xuICAgIGlmIChzY2hlbWEudGhlbiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgaWYgKCFoZWxwZXJzLmlzU2NoZW1hKHNjaGVtYS50aGVuKSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBcInRoZW5cIiBrZXl3b3JkIHRvIGJlIGEgc2NoZW1hJyk7XG4gICAgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShpbnN0YW5jZSwgc2NoZW1hLnRoZW4sIG9wdGlvbnMsIGN0eC5tYWtlQ2hpbGQoc2NoZW1hLnRoZW4pKTtcbiAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHJlcyk7XG4gIH1lbHNle1xuICAgIGlmIChzY2hlbWEuZWxzZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgaWYgKCFoZWxwZXJzLmlzU2NoZW1hKHNjaGVtYS5lbHNlKSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBcImVsc2VcIiBrZXl3b3JkIHRvIGJlIGEgc2NoZW1hJyk7XG4gICAgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShpbnN0YW5jZSwgc2NoZW1hLmVsc2UsIG9wdGlvbnMsIGN0eC5tYWtlQ2hpbGQoc2NoZW1hLmVsc2UpKTtcbiAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIGdldEVudW1lcmFibGVQcm9wZXJ0eShvYmplY3QsIGtleSl7XG4gIC8vIERldGVybWluZSBpZiBga2V5YCBzaG93cyB1cCBpbiBgZm9yKHZhciBrZXkgaW4gb2JqZWN0KWBcbiAgLy8gRmlyc3QgdGVzdCBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCBhcyBhbiBvcHRpbWl6YXRpb246IHRoYXQgZ3VhcmFudGVlcyBpdCBkb2VzXG4gIGlmKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgcmV0dXJuIG9iamVjdFtrZXldO1xuICAvLyBUZXN0IGBrZXkgaW4gb2JqZWN0YCBhcyBhbiBvcHRpbWl6YXRpb247IGZhbHNlIG1lYW5zIGl0IHdvbid0XG4gIGlmKCEoa2V5IGluIG9iamVjdCkpIHJldHVybjtcbiAgd2hpbGUoIChvYmplY3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KSkgKXtcbiAgICBpZihPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIGtleSkpIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBwcm9wZXJ0eU5hbWVzXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMucHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlOYW1lcyAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmKCF0aGlzLnR5cGVzLm9iamVjdChpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIHN1YnNjaGVtYSA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzIT09dW5kZWZpbmVkID8gc2NoZW1hLnByb3BlcnR5TmFtZXMgOiB7fTtcbiAgaWYoIWhlbHBlcnMuaXNTY2hlbWEoc3Vic2NoZW1hKSkgdGhyb3cgbmV3IFNjaGVtYUVycm9yKCdFeHBlY3RlZCBcInByb3BlcnR5TmFtZXNcIiB0byBiZSBhIHNjaGVtYSAob2JqZWN0IG9yIGJvb2xlYW4pJyk7XG5cbiAgZm9yICh2YXIgcHJvcGVydHkgaW4gaW5zdGFuY2UpIHtcbiAgICBpZihnZXRFbnVtZXJhYmxlUHJvcGVydHkoaW5zdGFuY2UsIHByb3BlcnR5KSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHZhciByZXMgPSB0aGlzLnZhbGlkYXRlU2NoZW1hKHByb3BlcnR5LCBzdWJzY2hlbWEsIG9wdGlvbnMsIGN0eC5tYWtlQ2hpbGQoc3Vic2NoZW1hKSk7XG4gICAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHJlcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfFZhbGlkYXRvclJlc3VsdH1cbiAqL1xudmFsaWRhdG9ycy5wcm9wZXJ0aWVzID0gZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYoIXRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzIHx8IHt9O1xuICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIHN1YnNjaGVtYSA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgIGlmKHN1YnNjaGVtYT09PXVuZGVmaW5lZCl7XG4gICAgICBjb250aW51ZTtcbiAgICB9ZWxzZSBpZihzdWJzY2hlbWE9PT1udWxsKXtcbiAgICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcignVW5leHBlY3RlZCBudWxsLCBleHBlY3RlZCBzY2hlbWEgaW4gXCJwcm9wZXJ0aWVzXCInKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnByZVZhbGlkYXRlUHJvcGVydHkgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucy5wcmVWYWxpZGF0ZVByb3BlcnR5KGluc3RhbmNlLCBwcm9wZXJ0eSwgc3Vic2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICAgIH1cbiAgICB2YXIgcHJvcCA9IGdldEVudW1lcmFibGVQcm9wZXJ0eShpbnN0YW5jZSwgcHJvcGVydHkpO1xuICAgIHZhciByZXMgPSB0aGlzLnZhbGlkYXRlU2NoZW1hKHByb3AsIHN1YnNjaGVtYSwgb3B0aW9ucywgY3R4Lm1ha2VDaGlsZChzdWJzY2hlbWEsIHByb3BlcnR5KSk7XG4gICAgaWYocmVzLmluc3RhbmNlICE9PSByZXN1bHQuaW5zdGFuY2VbcHJvcGVydHldKSByZXN1bHQuaW5zdGFuY2VbcHJvcGVydHldID0gcmVzLmluc3RhbmNlO1xuICAgIHJlc3VsdC5pbXBvcnRFcnJvcnMocmVzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBUZXN0IGEgc3BlY2lmaWMgcHJvcGVydHkgd2l0aGluIGluIGluc3RhbmNlIGFnYWluc3QgdGhlIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIHNjaGVtYSBhdHRyaWJ1dGVcbiAqIFRoaXMgaWdub3JlcyBwcm9wZXJ0aWVzIHdpdGggZGVmaW5pdGlvbnMgaW4gdGhlIHByb3BlcnRpZXMgc2NoZW1hIGF0dHJpYnV0ZSwgYnV0IG5vIG90aGVyIGF0dHJpYnV0ZXMuXG4gKiBJZiB0b28gbWFueSBtb3JlIHR5cGVzIG9mIHByb3BlcnR5LWV4aXN0ZW5jZSB0ZXN0cyBwb3AgdXAgdGhleSBtYXkgbmVlZCB0aGVpciBvd24gY2xhc3Mgb2YgdGVzdHMgKGxpa2UgYHR5cGVgIGhhcylcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0ZXN0QWRkaXRpb25hbFByb3BlcnR5IChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgsIHByb3BlcnR5LCByZXN1bHQpIHtcbiAgaWYoIXRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSkgcmV0dXJuO1xuICBpZiAoc2NoZW1hLnByb3BlcnRpZXMgJiYgc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgICAgIGFyZ3VtZW50OiBwcm9wZXJ0eSxcbiAgICAgIG1lc3NhZ2U6IFwiaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSB0aGUgYWRkaXRpb25hbCBwcm9wZXJ0eSBcIiArIEpTT04uc3RyaW5naWZ5KHByb3BlcnR5KSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgfHwge307XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJlVmFsaWRhdGVQcm9wZXJ0eSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRpb25zLnByZVZhbGlkYXRlUHJvcGVydHkoaW5zdGFuY2UsIHByb3BlcnR5LCBhZGRpdGlvbmFsUHJvcGVydGllcywgb3B0aW9ucywgY3R4KTtcbiAgICB9XG5cbiAgICB2YXIgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShpbnN0YW5jZVtwcm9wZXJ0eV0sIGFkZGl0aW9uYWxQcm9wZXJ0aWVzLCBvcHRpb25zLCBjdHgubWFrZUNoaWxkKGFkZGl0aW9uYWxQcm9wZXJ0aWVzLCBwcm9wZXJ0eSkpO1xuICAgIGlmKHJlcy5pbnN0YW5jZSAhPT0gcmVzdWx0Lmluc3RhbmNlW3Byb3BlcnR5XSkgcmVzdWx0Lmluc3RhbmNlW3Byb3BlcnR5XSA9IHJlcy5pbnN0YW5jZTtcbiAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHJlcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgcGF0dGVyblByb3BlcnRpZXNcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfFZhbGlkYXRvclJlc3VsdH1cbiAqL1xudmFsaWRhdG9ycy5wYXR0ZXJuUHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUGF0dGVyblByb3BlcnRpZXMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZighdGhpcy50eXBlcy5vYmplY3QoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBwYXR0ZXJuUHJvcGVydGllcyA9IHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyB8fCB7fTtcblxuICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBpbnN0YW5jZSkge1xuICAgIHZhciB0ZXN0ID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBwYXR0ZXJuIGluIHBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgc3Vic2NoZW1hID0gcGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl07XG4gICAgICBpZihzdWJzY2hlbWE9PT11bmRlZmluZWQpe1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1lbHNlIGlmKHN1YnNjaGVtYT09PW51bGwpe1xuICAgICAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IoJ1VuZXhwZWN0ZWQgbnVsbCwgZXhwZWN0ZWQgc2NoZW1hIGluIFwicGF0dGVyblByb3BlcnRpZXNcIicpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ3UnKTtcbiAgICAgIH0gY2F0Y2goX2UpIHtcbiAgICAgICAgLy8gSW4gdGhlIGV2ZW50IHRoZSBzdHJpY3RlciBoYW5kbGluZyBjYXVzZXMgYW4gZXJyb3IsIGZhbGwgYmFjayBvbiB0aGUgZm9yZ2l2aW5nIGhhbmRsaW5nXG4gICAgICAgIC8vIERFUFJFQ0FURURcbiAgICAgICAgcmVnZXhwID0gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVnZXhwLnRlc3QocHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGVzdCA9IGZhbHNlO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJlVmFsaWRhdGVQcm9wZXJ0eSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMucHJlVmFsaWRhdGVQcm9wZXJ0eShpbnN0YW5jZSwgcHJvcGVydHksIHN1YnNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlcyA9IHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2VbcHJvcGVydHldLCBzdWJzY2hlbWEsIG9wdGlvbnMsIGN0eC5tYWtlQ2hpbGQoc3Vic2NoZW1hLCBwcm9wZXJ0eSkpO1xuICAgICAgaWYocmVzLmluc3RhbmNlICE9PSByZXN1bHQuaW5zdGFuY2VbcHJvcGVydHldKSByZXN1bHQuaW5zdGFuY2VbcHJvcGVydHldID0gcmVzLmluc3RhbmNlO1xuICAgICAgcmVzdWx0LmltcG9ydEVycm9ycyhyZXMpO1xuICAgIH1cbiAgICBpZiAodGVzdCkge1xuICAgICAgdGVzdEFkZGl0aW9uYWxQcm9wZXJ0eS5jYWxsKHRoaXMsIGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCwgcHJvcGVydHksIHJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYoIXRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSkgcmV0dXJuO1xuICAvLyBpZiBwYXR0ZXJuUHJvcGVydGllcyBpcyBkZWZpbmVkIHRoZW4gd2UnbGwgdGVzdCB3aGVuIHRoYXQgb25lIGlzIGNhbGxlZCBpbnN0ZWFkXG4gIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBpbnN0YW5jZSkge1xuICAgIHRlc3RBZGRpdGlvbmFsUHJvcGVydHkuY2FsbCh0aGlzLCBpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgsIHByb3BlcnR5LCByZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhdCBsZWFzdCBvZiBhIGNlcnRhaW4gbGVuZ3RoLCB3aGVuIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMubWluUHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlTWluUHJvcGVydGllcyAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmICghdGhpcy50eXBlcy5vYmplY3QoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaW5zdGFuY2UpO1xuICBpZiAoIShrZXlzLmxlbmd0aCA+PSBzY2hlbWEubWluUHJvcGVydGllcykpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ21pblByb3BlcnRpZXMnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5taW5Qcm9wZXJ0aWVzLFxuICAgICAgbWVzc2FnZTogXCJkb2VzIG5vdCBtZWV0IG1pbmltdW0gcHJvcGVydHkgbGVuZ3RoIG9mIFwiICsgc2NoZW1hLm1pblByb3BlcnRpZXMsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGluc3RhbmNlIHZhbHVlIGlzIGF0IG1vc3Qgb2YgYSBjZXJ0YWluIGxlbmd0aCwgd2hlbiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBzdHJpbmcuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLm1heFByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU1heFByb3BlcnRpZXMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGluc3RhbmNlKTtcbiAgaWYgKCEoa2V5cy5sZW5ndGggPD0gc2NoZW1hLm1heFByb3BlcnRpZXMpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdtYXhQcm9wZXJ0aWVzJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEubWF4UHJvcGVydGllcyxcbiAgICAgIG1lc3NhZ2U6IFwiZG9lcyBub3QgbWVldCBtYXhpbXVtIHByb3BlcnR5IGxlbmd0aCBvZiBcIiArIHNjaGVtYS5tYXhQcm9wZXJ0aWVzLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBpdGVtcyB3aGVuIGluc3RhbmNlIGlzIGFuIGFycmF5XG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMuaXRlbXMgPSBmdW5jdGlvbiB2YWxpZGF0ZUl0ZW1zIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoIXRoaXMudHlwZXMuYXJyYXkoaW5zdGFuY2UpKSByZXR1cm47XG4gIGlmIChzY2hlbWEuaXRlbXM9PT11bmRlZmluZWQpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaW5zdGFuY2UuZXZlcnkoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpKXtcbiAgICAgIHZhciBpdGVtcyA9ICBzY2hlbWEuaXRlbXNbaV09PT11bmRlZmluZWQgPyBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zIDogc2NoZW1hLml0ZW1zW2ldO1xuICAgIH1lbHNle1xuICAgICAgdmFyIGl0ZW1zID0gc2NoZW1hLml0ZW1zO1xuICAgIH1cbiAgICBpZiAoaXRlbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChpdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICAgIG5hbWU6ICdpdGVtcycsXG4gICAgICAgIG1lc3NhZ2U6IFwiYWRkaXRpb25hbEl0ZW1zIG5vdCBwZXJtaXR0ZWRcIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgcmVzID0gc2VsZi52YWxpZGF0ZVNjaGVtYSh2YWx1ZSwgaXRlbXMsIG9wdGlvbnMsIGN0eC5tYWtlQ2hpbGQoaXRlbXMsIGkpKTtcbiAgICBpZihyZXMuaW5zdGFuY2UgIT09IHJlc3VsdC5pbnN0YW5jZVtpXSkgcmVzdWx0Lmluc3RhbmNlW2ldID0gcmVzLmluc3RhbmNlO1xuICAgIHJlc3VsdC5pbXBvcnRFcnJvcnMocmVzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgXCJjb250YWluc1wiIGtleXdvcmRcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfFZhbGlkYXRvclJlc3VsdH1cbiAqL1xudmFsaWRhdG9ycy5jb250YWlucyA9IGZ1bmN0aW9uIHZhbGlkYXRlQ29udGFpbnMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICghdGhpcy50eXBlcy5hcnJheShpbnN0YW5jZSkpIHJldHVybjtcbiAgaWYgKHNjaGVtYS5jb250YWlucz09PXVuZGVmaW5lZCkgcmV0dXJuO1xuICBpZiAoIWhlbHBlcnMuaXNTY2hlbWEoc2NoZW1hLmNvbnRhaW5zKSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBcImNvbnRhaW5zXCIga2V5d29yZCB0byBiZSBhIHNjaGVtYScpO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgY291bnQgPSBpbnN0YW5jZS5zb21lKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgIHZhciByZXMgPSBzZWxmLnZhbGlkYXRlU2NoZW1hKHZhbHVlLCBzY2hlbWEuY29udGFpbnMsIG9wdGlvbnMsIGN0eC5tYWtlQ2hpbGQoc2NoZW1hLmNvbnRhaW5zLCBpKSk7XG4gICAgcmV0dXJuIHJlcy5lcnJvcnMubGVuZ3RoPT09MDtcbiAgfSk7XG4gIGlmKGNvdW50PT09ZmFsc2Upe1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnY29udGFpbnMnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5jb250YWlucyxcbiAgICAgIG1lc3NhZ2U6IFwibXVzdCBjb250YWluIGFuIGl0ZW0gbWF0Y2hpbmcgZ2l2ZW4gc2NoZW1hXCIsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIG1pbmltdW0gYW5kIGV4Y2x1c2l2ZU1pbmltdW0gd2hlbiB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLm1pbmltdW0gPSBmdW5jdGlvbiB2YWxpZGF0ZU1pbmltdW0gKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMubnVtYmVyKGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gJiYgc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IHRydWUpIHtcbiAgICBpZighKGluc3RhbmNlID4gc2NoZW1hLm1pbmltdW0pKXtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICAgIG5hbWU6ICdtaW5pbXVtJyxcbiAgICAgICAgYXJndW1lbnQ6IHNjaGVtYS5taW5pbXVtLFxuICAgICAgICBtZXNzYWdlOiBcIm11c3QgYmUgZ3JlYXRlciB0aGFuIFwiICsgc2NoZW1hLm1pbmltdW0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYoIShpbnN0YW5jZSA+PSBzY2hlbWEubWluaW11bSkpe1xuICAgICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgICAgbmFtZTogJ21pbmltdW0nLFxuICAgICAgICBhcmd1bWVudDogc2NoZW1hLm1pbmltdW0sXG4gICAgICAgIG1lc3NhZ2U6IFwibXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXCIgKyBzY2hlbWEubWluaW11bSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgbWF4aW11bSBhbmQgZXhjbHVzaXZlTWF4aW11bSB3aGVuIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMubWF4aW11bSA9IGZ1bmN0aW9uIHZhbGlkYXRlTWF4aW11bSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmICghdGhpcy50eXBlcy5udW1iZXIoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgIGlmKCEoaW5zdGFuY2UgPCBzY2hlbWEubWF4aW11bSkpe1xuICAgICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgICAgbmFtZTogJ21heGltdW0nLFxuICAgICAgICBhcmd1bWVudDogc2NoZW1hLm1heGltdW0sXG4gICAgICAgIG1lc3NhZ2U6IFwibXVzdCBiZSBsZXNzIHRoYW4gXCIgKyBzY2hlbWEubWF4aW11bSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZighKGluc3RhbmNlIDw9IHNjaGVtYS5tYXhpbXVtKSl7XG4gICAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgICBuYW1lOiAnbWF4aW11bScsXG4gICAgICAgIGFyZ3VtZW50OiBzY2hlbWEubWF4aW11bSxcbiAgICAgICAgbWVzc2FnZTogXCJtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBcIiArIHNjaGVtYS5tYXhpbXVtLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgbnVtYmVyIGZvcm0gb2YgZXhjbHVzaXZlTWluaW11bSB3aGVuIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMuZXhjbHVzaXZlTWluaW11bSA9IGZ1bmN0aW9uIHZhbGlkYXRlRXhjbHVzaXZlTWluaW11bSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIC8vIFN1cHBvcnQgdGhlIGJvb2xlYW4gZm9ybSBvZiBleGNsdXNpdmVNaW5pbXVtLCB3aGljaCBpcyBoYW5kbGVkIGJ5IHRoZSBcIm1pbmltdW1cIiBrZXl3b3JkLlxuICBpZih0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09ICdib29sZWFuJykgcmV0dXJuO1xuICBpZiAoIXRoaXMudHlwZXMubnVtYmVyKGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgdmFsaWQgPSBpbnN0YW5jZSA+IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtO1xuICBpZiAoIXZhbGlkKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdleGNsdXNpdmVNaW5pbXVtJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSxcbiAgICAgIG1lc3NhZ2U6IFwibXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gXCIgKyBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIG51bWJlciBmb3JtIG9mIGV4Y2x1c2l2ZU1heGltdW0gd2hlbiB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLmV4Y2x1c2l2ZU1heGltdW0gPSBmdW5jdGlvbiB2YWxpZGF0ZUV4Y2x1c2l2ZU1heGltdW0gKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICAvLyBTdXBwb3J0IHRoZSBib29sZWFuIGZvcm0gb2YgZXhjbHVzaXZlTWF4aW11bSwgd2hpY2ggaXMgaGFuZGxlZCBieSB0aGUgXCJtYXhpbXVtXCIga2V5d29yZC5cbiAgaWYodHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSAnYm9vbGVhbicpIHJldHVybjtcbiAgaWYgKCF0aGlzLnR5cGVzLm51bWJlcihpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIHZhbGlkID0gaW5zdGFuY2UgPCBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bTtcbiAgaWYgKCF2YWxpZCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnZXhjbHVzaXZlTWF4aW11bScsXG4gICAgICBhcmd1bWVudDogc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0sXG4gICAgICBtZXNzYWdlOiBcIm11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIFwiICsgc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSB2YWxpZGF0aW9uIGZvciBtdWx0aXBsZU9mIGFuZCBkaXZpc2libGVCeSwgd2hpY2ggYXJlIGVzc2VudGlhbGx5IHRoZSBzYW1lLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gdmFsaWRhdGlvblR5cGVcbiAqIEBwYXJhbSBlcnJvck1lc3NhZ2VcbiAqIEByZXR1cm5zIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFyIHZhbGlkYXRlTXVsdGlwbGVPZk9yRGl2aXNibGVCeSA9IGZ1bmN0aW9uIHZhbGlkYXRlTXVsdGlwbGVPZk9yRGl2aXNibGVCeSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4LCB2YWxpZGF0aW9uVHlwZSwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghdGhpcy50eXBlcy5udW1iZXIoaW5zdGFuY2UpKSByZXR1cm47XG5cbiAgdmFyIHZhbGlkYXRpb25Bcmd1bWVudCA9IHNjaGVtYVt2YWxpZGF0aW9uVHlwZV07XG4gIGlmICh2YWxpZGF0aW9uQXJndW1lbnQgPT0gMCkge1xuICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcih2YWxpZGF0aW9uVHlwZSArIFwiIGNhbm5vdCBiZSB6ZXJvXCIpO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcblxuICB2YXIgaW5zdGFuY2VEZWNpbWFscyA9IGhlbHBlcnMuZ2V0RGVjaW1hbFBsYWNlcyhpbnN0YW5jZSk7XG4gIHZhciBkaXZpc29yRGVjaW1hbHMgPSBoZWxwZXJzLmdldERlY2ltYWxQbGFjZXModmFsaWRhdGlvbkFyZ3VtZW50KTtcblxuICB2YXIgbWF4RGVjaW1hbHMgPSBNYXRoLm1heChpbnN0YW5jZURlY2ltYWxzICwgZGl2aXNvckRlY2ltYWxzKTtcbiAgdmFyIG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgbWF4RGVjaW1hbHMpO1xuXG4gIGlmIChNYXRoLnJvdW5kKGluc3RhbmNlICogbXVsdGlwbGllcikgJSBNYXRoLnJvdW5kKHZhbGlkYXRpb25Bcmd1bWVudCAqIG11bHRpcGxpZXIpICE9PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6IHZhbGlkYXRpb25UeXBlLFxuICAgICAgYXJndW1lbnQ6ICB2YWxpZGF0aW9uQXJndW1lbnQsXG4gICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgKyBKU09OLnN0cmluZ2lmeSh2YWxpZGF0aW9uQXJndW1lbnQpLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGRpdmlzaWJsZUJ5IHdoZW4gdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5tdWx0aXBsZU9mID0gZnVuY3Rpb24gdmFsaWRhdGVNdWx0aXBsZU9mIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgcmV0dXJuIHZhbGlkYXRlTXVsdGlwbGVPZk9yRGl2aXNibGVCeS5jYWxsKHRoaXMsIGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCwgXCJtdWx0aXBsZU9mXCIsIFwiaXMgbm90IGEgbXVsdGlwbGUgb2YgKGRpdmlzaWJsZSBieSkgXCIpO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgbXVsdGlwbGVPZiB3aGVuIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMuZGl2aXNpYmxlQnkgPSBmdW5jdGlvbiB2YWxpZGF0ZURpdmlzaWJsZUJ5IChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgcmV0dXJuIHZhbGlkYXRlTXVsdGlwbGVPZk9yRGl2aXNibGVCeS5jYWxsKHRoaXMsIGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCwgXCJkaXZpc2libGVCeVwiLCBcImlzIG5vdCBkaXZpc2libGUgYnkgKG11bHRpcGxlIG9mKSBcIik7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBwcmVzZW50LlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5yZXF1aXJlZCA9IGZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWQgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAvLyBBIGJvb2xlYW4gZm9ybSBpcyBpbXBsZW1lbnRlZCBmb3IgcmV2ZXJzZS1jb21wYXRpYmlsaXR5IHdpdGggc2NoZW1hcyB3cml0dGVuIGFnYWluc3Qgb2xkZXIgZHJhZnRzXG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdyZXF1aXJlZCcsXG4gICAgICBtZXNzYWdlOiBcImlzIHJlcXVpcmVkXCIsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodGhpcy50eXBlcy5vYmplY3QoaW5zdGFuY2UpICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLnJlcXVpcmVkKSkge1xuICAgIHNjaGVtYS5yZXF1aXJlZC5mb3JFYWNoKGZ1bmN0aW9uKG4pe1xuICAgICAgaWYoZ2V0RW51bWVyYWJsZVByb3BlcnR5KGluc3RhbmNlLCBuKT09PXVuZGVmaW5lZCl7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICAgICAgbmFtZTogJ3JlcXVpcmVkJyxcbiAgICAgICAgICBhcmd1bWVudDogbixcbiAgICAgICAgICBtZXNzYWdlOiBcInJlcXVpcmVzIHByb3BlcnR5IFwiICsgSlNPTi5zdHJpbmdpZnkobiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIHdoZW4gdGhlIGluc3RhbmNlIHZhbHVlIGlzIGEgc3RyaW5nLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5wYXR0ZXJuID0gZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJuIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKCF0aGlzLnR5cGVzLnN0cmluZyhpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIHBhdHRlcm4gPSBzY2hlbWEucGF0dGVybjtcbiAgdHJ5IHtcbiAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCAndScpO1xuICB9IGNhdGNoKF9lKSB7XG4gICAgLy8gSW4gdGhlIGV2ZW50IHRoZSBzdHJpY3RlciBoYW5kbGluZyBjYXVzZXMgYW4gZXJyb3IsIGZhbGwgYmFjayBvbiB0aGUgZm9yZ2l2aW5nIGhhbmRsaW5nXG4gICAgLy8gREVQUkVDQVRFRFxuICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAocGF0dGVybik7XG4gIH1cbiAgaWYgKCFpbnN0YW5jZS5tYXRjaChyZWdleHApKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdwYXR0ZXJuJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEucGF0dGVybixcbiAgICAgIG1lc3NhZ2U6IFwiZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBcIiArIEpTT04uc3RyaW5naWZ5KHNjaGVtYS5wYXR0ZXJuLnRvU3RyaW5nKCkpLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBvZiBhIGNlcnRhaW4gZGVmaW5lZCBmb3JtYXQgb3IgYSBjdXN0b21cbiAqIGZvcm1hdC5cbiAqIFRoZSBmb2xsb3dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIGZvciBzdHJpbmcgdHlwZXM6XG4gKiAgIC0gZGF0ZS10aW1lXG4gKiAgIC0gZGF0ZVxuICogICAtIHRpbWVcbiAqICAgLSBpcC1hZGRyZXNzXG4gKiAgIC0gaXB2NlxuICogICAtIHVyaVxuICogICAtIGNvbG9yXG4gKiAgIC0gaG9zdC1uYW1lXG4gKiAgIC0gYWxwaGFcbiAqICAgLSBhbHBoYS1udW1lcmljXG4gKiAgIC0gdXRjLW1pbGxpc2VjXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBbb3B0aW9uc11cbiAqIEBwYXJhbSBbY3R4XVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMuZm9ybWF0ID0gZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoaW5zdGFuY2U9PT11bmRlZmluZWQpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaWYgKCFyZXN1bHQuZGlzYWJsZUZvcm1hdCAmJiAhaGVscGVycy5pc0Zvcm1hdChpbnN0YW5jZSwgc2NoZW1hLmZvcm1hdCwgdGhpcykpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ2Zvcm1hdCcsXG4gICAgICBhcmd1bWVudDogc2NoZW1hLmZvcm1hdCxcbiAgICAgIG1lc3NhZ2U6IFwiZG9lcyBub3QgY29uZm9ybSB0byB0aGUgXCIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEuZm9ybWF0KSArIFwiIGZvcm1hdFwiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhdCBsZWFzdCBvZiBhIGNlcnRhaW4gbGVuZ3RoLCB3aGVuIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMubWluTGVuZ3RoID0gZnVuY3Rpb24gdmFsaWRhdGVNaW5MZW5ndGggKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMuc3RyaW5nKGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgaHNwID0gaW5zdGFuY2UubWF0Y2goL1tcXHVEQzAwLVxcdURGRkZdL2cpO1xuICB2YXIgbGVuZ3RoID0gaW5zdGFuY2UubGVuZ3RoIC0gKGhzcCA/IGhzcC5sZW5ndGggOiAwKTtcbiAgaWYgKCEobGVuZ3RoID49IHNjaGVtYS5taW5MZW5ndGgpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdtaW5MZW5ndGgnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5taW5MZW5ndGgsXG4gICAgICBtZXNzYWdlOiBcImRvZXMgbm90IG1lZXQgbWluaW11bSBsZW5ndGggb2YgXCIgKyBzY2hlbWEubWluTGVuZ3RoLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhdCBtb3N0IG9mIGEgY2VydGFpbiBsZW5ndGgsIHdoZW4gdGhlIGluc3RhbmNlIHZhbHVlIGlzIGEgc3RyaW5nLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5tYXhMZW5ndGggPSBmdW5jdGlvbiB2YWxpZGF0ZU1heExlbmd0aCAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmICghdGhpcy50eXBlcy5zdHJpbmcoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIC8vIFRPRE8gaWYgdGhpcyB3YXMgYWxyZWFkeSBjb21wdXRlZCBpbiBcIm1pbkxlbmd0aFwiLCB1c2UgdGhhdCB2YWx1ZSBpbnN0ZWFkIG9mIHJlLWNvbXB1dGluZ1xuICB2YXIgaHNwID0gaW5zdGFuY2UubWF0Y2goL1tcXHVEQzAwLVxcdURGRkZdL2cpO1xuICB2YXIgbGVuZ3RoID0gaW5zdGFuY2UubGVuZ3RoIC0gKGhzcCA/IGhzcC5sZW5ndGggOiAwKTtcbiAgaWYgKCEobGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdtYXhMZW5ndGgnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5tYXhMZW5ndGgsXG4gICAgICBtZXNzYWdlOiBcImRvZXMgbm90IG1lZXQgbWF4aW11bSBsZW5ndGggb2YgXCIgKyBzY2hlbWEubWF4TGVuZ3RoLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIGluc3RhbmNlIGNvbnRhaW5zIGF0IGxlYXN0IGEgbWluaW11bSBudW1iZXIgb2YgaXRlbXMsIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFuIEFycmF5LlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5taW5JdGVtcyA9IGZ1bmN0aW9uIHZhbGlkYXRlTWluSXRlbXMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMuYXJyYXkoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGlmICghKGluc3RhbmNlLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdtaW5JdGVtcycsXG4gICAgICBhcmd1bWVudDogc2NoZW1hLm1pbkl0ZW1zLFxuICAgICAgbWVzc2FnZTogXCJkb2VzIG5vdCBtZWV0IG1pbmltdW0gbGVuZ3RoIG9mIFwiICsgc2NoZW1hLm1pbkl0ZW1zLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIGluc3RhbmNlIGNvbnRhaW5zIG5vIG1vcmUgdGhhbiBhIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zLCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhbiBBcnJheS5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMubWF4SXRlbXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU1heEl0ZW1zIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKCF0aGlzLnR5cGVzLmFycmF5KGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoIShpbnN0YW5jZS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnbWF4SXRlbXMnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5tYXhJdGVtcyxcbiAgICAgIG1lc3NhZ2U6IFwiZG9lcyBub3QgbWVldCBtYXhpbXVtIGxlbmd0aCBvZiBcIiArIHNjaGVtYS5tYXhJdGVtcyxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBEZWVwIGNvbXBhcmVzIGFycmF5cyBmb3IgZHVwbGljYXRlc1xuICogQHBhcmFtIHZcbiAqIEBwYXJhbSBpXG4gKiBAcGFyYW0gYVxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRlc3RBcnJheXMgKHYsIGksIGEpIHtcbiAgdmFyIGosIGxlbiA9IGEubGVuZ3RoO1xuICBmb3IgKGogPSBpICsgMSwgbGVuOyBqIDwgbGVuOyBqKyspIHtcbiAgICBpZiAoaGVscGVycy5kZWVwQ29tcGFyZVN0cmljdCh2LCBhW2pdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcywgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYW4gQXJyYXkuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLnVuaXF1ZUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVVbmlxdWVJdGVtcyAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmIChzY2hlbWEudW5pcXVlSXRlbXMhPT10cnVlKSByZXR1cm47XG4gIGlmICghdGhpcy50eXBlcy5hcnJheShpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaWYgKCFpbnN0YW5jZS5ldmVyeSh0ZXN0QXJyYXlzKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAndW5pcXVlSXRlbXMnLFxuICAgICAgbWVzc2FnZTogXCJjb250YWlucyBkdXBsaWNhdGUgaXRlbVwiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlIGZvciB0aGUgcHJlc2VuY2Ugb2YgZGVwZW5kZW5jeSBwcm9wZXJ0aWVzLCBpZiB0aGUgaW5zdGFuY2UgaXMgYW4gb2JqZWN0LlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGN0eFxuICogQHJldHVybiB7bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMuZGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gdmFsaWRhdGVEZXBlbmRlbmNpZXMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKGluc3RhbmNlW3Byb3BlcnR5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGRlcCA9IHNjaGVtYS5kZXBlbmRlbmNpZXNbcHJvcGVydHldO1xuICAgIHZhciBjaGlsZENvbnRleHQgPSBjdHgubWFrZUNoaWxkKGRlcCwgcHJvcGVydHkpO1xuICAgIGlmICh0eXBlb2YgZGVwID09ICdzdHJpbmcnKSB7XG4gICAgICBkZXAgPSBbZGVwXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwKSkge1xuICAgICAgZGVwLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgaWYgKGluc3RhbmNlW3Byb3BdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgICAgICAgLy8gRklYTUUgdGhlcmUncyB0d28gZGlmZmVyZW50IFwiZGVwZW5kZW5jaWVzXCIgZXJyb3JzIGhlcmUgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgb3V0cHV0c1xuICAgICAgICAgICAgLy8gQ2FuIHdlIG1ha2UgdGhlc2UgdGhlIHNhbWU/IE9yIHNob3VsZCB3ZSBjcmVhdGUgZGlmZmVyZW50IGVycm9yIHR5cGVzP1xuICAgICAgICAgICAgbmFtZTogJ2RlcGVuZGVuY2llcycsXG4gICAgICAgICAgICBhcmd1bWVudDogY2hpbGRDb250ZXh0LnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwicHJvcGVydHkgXCIgKyBwcm9wICsgXCIgbm90IGZvdW5kLCByZXF1aXJlZCBieSBcIiArIGNoaWxkQ29udGV4dC5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShpbnN0YW5jZSwgZGVwLCBvcHRpb25zLCBjaGlsZENvbnRleHQpO1xuICAgICAgaWYocmVzdWx0Lmluc3RhbmNlICE9PSByZXMuaW5zdGFuY2UpIHJlc3VsdC5pbnN0YW5jZSA9IHJlcy5pbnN0YW5jZTtcbiAgICAgIGlmIChyZXMgJiYgcmVzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgICAgICBuYW1lOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICBhcmd1bWVudDogY2hpbGRDb250ZXh0LnByb3BlcnR5UGF0aCxcbiAgICAgICAgICBtZXNzYWdlOiBcImRvZXMgbm90IG1lZXQgZGVwZW5kZW5jeSByZXF1aXJlZCBieSBcIiArIGNoaWxkQ29udGV4dC5wcm9wZXJ0eVBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHJlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGVudW1lcmF0ZWQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7VmFsaWRhdG9yUmVzdWx0fG51bGx9XG4gKi9cbnZhbGlkYXRvcnNbJ2VudW0nXSA9IGZ1bmN0aW9uIHZhbGlkYXRlRW51bSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmIChpbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYVsnZW51bSddKSkge1xuICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcihcImVudW0gZXhwZWN0cyBhbiBhcnJheVwiLCBzY2hlbWEpO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGlmICghc2NoZW1hWydlbnVtJ10uc29tZShoZWxwZXJzLmRlZXBDb21wYXJlU3RyaWN0LmJpbmQobnVsbCwgaW5zdGFuY2UpKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnZW51bScsXG4gICAgICBhcmd1bWVudDogc2NoZW1hWydlbnVtJ10sXG4gICAgICBtZXNzYWdlOiBcImlzIG5vdCBvbmUgb2YgZW51bSB2YWx1ZXM6IFwiICsgc2NoZW1hWydlbnVtJ10ubWFwKFN0cmluZykuam9pbignLCcpLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBleGFjdGx5IG1hdGNoZXMgYSBnaXZlbiB2YWx1ZVxuICpcbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7VmFsaWRhdG9yUmVzdWx0fG51bGx9XG4gKi9cbnZhbGlkYXRvcnNbJ2NvbnN0J10gPSBmdW5jdGlvbiB2YWxpZGF0ZUVudW0gKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGlmICghaGVscGVycy5kZWVwQ29tcGFyZVN0cmljdChzY2hlbWFbJ2NvbnN0J10sIGluc3RhbmNlKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnY29uc3QnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYVsnY29uc3QnXSxcbiAgICAgIG1lc3NhZ2U6IFwiZG9lcyBub3QgZXhhY3RseSBtYXRjaCBleHBlY3RlZCBjb25zdGFudDogXCIgKyBzY2hlbWFbJ2NvbnN0J10sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGluc3RhbmNlIGlmIG9mIGEgcHJvaGliaXRlZCB0eXBlLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGN0eFxuICogQHJldHVybiB7bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMubm90ID0gdmFsaWRhdG9ycy5kaXNhbGxvdyA9IGZ1bmN0aW9uIHZhbGlkYXRlTm90IChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZihpbnN0YW5jZT09PXVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBub3RUeXBlcyA9IHNjaGVtYS5ub3QgfHwgc2NoZW1hLmRpc2FsbG93O1xuICBpZighbm90VHlwZXMpIHJldHVybiBudWxsO1xuICBpZighQXJyYXkuaXNBcnJheShub3RUeXBlcykpIG5vdFR5cGVzPVtub3RUeXBlc107XG4gIG5vdFR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBpZiAoc2VsZi50ZXN0VHlwZShpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgsIHR5cGUpKSB7XG4gICAgICB2YXIgaWQgPSB0eXBlICYmICh0eXBlLiRpZCB8fCB0eXBlLmlkKTtcbiAgICAgIHZhciBzY2hlbWFJZCA9IGlkIHx8IHR5cGU7XG4gICAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgICBuYW1lOiAnbm90JyxcbiAgICAgICAgYXJndW1lbnQ6IHNjaGVtYUlkLFxuICAgICAgICBtZXNzYWdlOiBcImlzIG9mIHByb2hpYml0ZWQgdHlwZSBcIiArIHNjaGVtYUlkLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYXR0cmlidXRlO1xuIiwiaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uLy4uL05lb25WaWV3JztcbmltcG9ydCB7IE1vZGFsV2luZG93VmlldyB9IGZyb20gJy4uL01vZGFsV2luZG93JztcblxuYXN5bmMgZnVuY3Rpb24gc2V0Qm9keSAobmVvblZpZXc6IE5lb25WaWV3KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy90ZW1wbGF0ZS5odG1sYCk7XG4gIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hvbWUtbGluaycpIGFzIEhUTUxBbmNob3JFbGVtZW50KS5ocmVmID0gX19MSU5LX0xPQ0FUSU9OX187XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLXZlcnNpb24nKS50ZXh0Q29udGVudCA9IF9fTkVPTl9WRVJTSU9OX187XG4gICg8SFRNTEltYWdlRWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbWFpbi1pY29uJykpLnNyYyA9IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9OZW9uX0ljb25fMy5zdmdgO1xuICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2V4dGVybmFsLWxpbmstaWNvbicpKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICg8SFRNTEltYWdlRWxlbWVudD4gZWwpLnNyYyA9IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9leHRlcm5hbC1saW5rLnN2Z2A7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlbmFtZScpLmlubmVyVGV4dCA9IG5lb25WaWV3Lm1hbmlmZXN0LnRpdGxlO1xuICBkb2N1bWVudC50aXRsZSA9IG5lb25WaWV3Lm1hbmlmZXN0LnRpdGxlO1xuICBcbiAgLy8gaG90a2V5IGJ0biBvbmNsaWNrIGV2ZW50IGxpc3RlbmVyXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXZiYXItaXRlbS1ob3RrZXlzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICBuZW9uVmlldy5tb2RhbC5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVMpO1xuICAgIG5lb25WaWV3Lm1vZGFsLm9wZW5Nb2RhbFdpbmRvdygpO1xuICB9KTtcblxuICAvLyBzZXQgXG4gIGNvbnN0IGRlYnVnTW9kZVRvb2x0aXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignI2RlYnVnLW1vZGUtdG9vbHRpcC1pY29uJyk7XG4gIGRlYnVnTW9kZVRvb2x0aXAuc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvZGVidWctdG9vbHRpcC1saWdodC5zdmdgKTtcblxuICAvLyBzZXQgaW5pdGlhbCBzYXZlZCBzdGF0dXNcbiAgY29uc3QgaW5kaWNhdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oJyNmaWxlLXNhdmVkJyk7XG4gIGluZGljYXRvci5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zYXZlZC1pY29uLnN2Z2ApO1xuICBpbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdhbHQnLCAnWW91ciB3b3JrIGlzIHNhdmVkJyk7XG59XG5cbmV4cG9ydCB7IHNldEJvZHkgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IHsgaW5pdEVycm9yTG9nLCB1cGRhdGVFcnJvckxvZ1Zpc2liaWxpdHkgfSBmcm9tICcuL0Vycm9yTG9nJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCBzZXRTZXR0aW5ncyB9IGZyb20gJy4vTG9jYWxTZXR0aW5ncyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWJ1Z01vZGUoKTogdm9pZCB7XG4gIGNvbnN0IGRlYnVnTW9kZUNoZWNrYm94ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI2RlYnVnLW1vZGUtY2hlY2tib3gnKTtcblxuICBjb25zdCB7IGRlYnVnTW9kZSB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICBkZWJ1Z01vZGVDaGVja2JveC5jaGVja2VkID0gZGVidWdNb2RlO1xuXG4gIGluaXRFcnJvckxvZygpO1xuXG4gIHVwZGF0ZURlYnVnTW9kZVN0YXR1cygpO1xuXG4gIGRlYnVnTW9kZUNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHVwZGF0ZURlYnVnTW9kZVN0YXR1cygpO1xuICB9KTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGVidWdNb2RlU3RhdHVzKCk6IHZvaWQge1xuICBjb25zdCBkZWJ1Z01vZGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWJ1Zy1tb2RlLWNoZWNrYm94JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgc2V0U2V0dGluZ3MoeyBkZWJ1Z01vZGU6IGRlYnVnTW9kZUNoZWNrYm94LmNoZWNrZWQgfSk7XG5cbiAgY29uc3QgZXJyb3JMb2dMYWJlbCA9ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1lcnJvcnMnKS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xuICBjb25zdCBub3RpZlBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBpZiAoZGVidWdNb2RlQ2hlY2tib3guY2hlY2tlZCkge1xuICAgIGVycm9yTG9nTGFiZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG4gIGVsc2Uge1xuICAgIGVycm9yTG9nTGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBub3RpZlBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgfVxuXG4gIHVwZGF0ZUVycm9yTG9nVmlzaWJpbGl0eSgpO1xufSIsImltcG9ydCAqIGFzIERpc3BsYXlDb250cm9scyBmcm9tICcuL0Rpc3BsYXlDb250cm9scyc7XG5pbXBvcnQgWm9vbUhhbmRsZXIgZnJvbSAnLi4vU2luZ2xlVmlldy9ab29tJztcbmltcG9ydCB7IERpc3BsYXlJbnRlcmZhY2UsIFZpZXdJbnRlcmZhY2UgfSBmcm9tICcuLi9JbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBIVE1MIGZvciB0aGUgZGlzcGxheSBwYW5lbC5cbiAqIEBwYXJhbSB7Wm9vbUhhbmRsZXJ9IGhhbmRsZVpvb20gLSBJbmNsdWRlcyB6b29tIGNvbnRyb2xzIGlmIGRlZmluZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBkaXNwbGF5Q29udHJvbHNQYW5lbCAoaGFuZGxlWm9vbTogWm9vbUhhbmRsZXIpOiBzdHJpbmcge1xuICBsZXQgY29udGVudHMgPSBgXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiBpZD1cImRpc3BsYXlIZWFkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlXCI+RElTUExBWTwvZGl2PlxuICAgICAgPHN2ZyBjbGFzcz1cImljb24gaXMtcHVsbGVkLXJpZ2h0XCI+XG4gICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVEaXNwbGF5XCIgY2xhc3M9XCJwYW5lbC1kcm9wZG93bi1pY29uXCIgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiZGlzcGxheUNvbnRlbnRzXCIgY2xhc3M9XCJwYW5lbC1jb250ZW50c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCIgaWQ9XCJkaXNwbGF5LXNsaWRlci1zZWN0aW9uXCI+XG4gIGA7XG5cbiAgaWYgKGhhbmRsZVpvb20gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnRlbnRzICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1hbmQtc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyIGRpc3BsYXktcGFuZWxcIiBzdHlsZT1cImN1cnNvcjogZGVmYXVsdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LXNsaWRlci10aXRsZVwiPlpvb208L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzbGlkZXItYnRuXCIgaWQ9XCJyZXNldC16b29tXCIgdGl0bGU9XCJSZXNldCB6b29tIHNldHRpbmdcIj5cbiAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInNsaWRlci1idG4taW1nXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvYXJyb3ctcm90YXRlLWxlZnQtc29saWQuc3ZnXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzbGlkZXItYnRuXCIgaWQ9XCJzZXQtem9vbS1lYXN5LWVkaXRcIiB0aXRsZT1cIkZpdCB0byBwYWdlXCI+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzbGlkZXItYnRuLWltZ1wiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2V4cGFuZC1pY29uLnN2Z1wiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICBzdGVwPVwiNVwiIG1pbj1cIjI1XCIgbWF4PVwiNDAwXCIgdmFsdWU9XCIxMDBcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJyZXNldC16b29tXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbGlkZXIgaXMtZnVsbHdpZHRoIGlzLWxhcmdlXCJcbiAgICAgICAgICAgICAgaWQ9XCJ6b29tU2xpZGVyXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDFyZW07IHBhZGRpbmctcmlnaHQ6IDFyZW07XCJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG91dHB1dCBpZD1cInpvb21PdXRwdXRcIiBmb3I9XCJ6b29tU2xpZGVyXCI+MTAwPC9vdXRwdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gIH1cbiAgY29udGVudHMgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWFuZC1zbGlkZXItYWN0aW9ucy1jb250YWluZXIgZGlzcGxheS1wYW5lbFwiIHN0eWxlPVwiY3Vyc29yOiBkZWZhdWx0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1hY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LXNsaWRlci10aXRsZVwiPkdseXBoIE9wYWNpdHk8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzbGlkZXItYnRuXCIgaWQ9XCJ0b2dnbGUtZ2x5cGgtb3BhY2l0eVwiPlxuICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwic2xpZGVyLWJ0bi1pbWdcIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvaGlkZS1pY29uLnN2Z1wiPlxuICAgICAgICAgICAgPC9idXR0b24+ICAgXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICBzdGVwPVwiNVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiB2YWx1ZT1cIjEwMFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cInRvZ2dsZS1nbHlwaC1vcGFjaXR5XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbGlkZXIgaXMtZnVsbHdpZHRoIGlzLWxhcmdlXCJcbiAgICAgICAgICAgICAgaWQ9XCJvcGFjaXR5U2xpZGVyXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDFyZW07IHBhZGRpbmctcmlnaHQ6IDFyZW07XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8b3V0cHV0IGlkPVwib3BhY2l0eU91dHB1dFwiIGZvcj1cIm9wYWNpdHlTbGlkZXJcIj4xMDA8L291dHB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWFuZC1zbGlkZXItYWN0aW9ucy1jb250YWluZXIgZGlzcGxheS1wYW5lbFwiIHN0eWxlPVwiY3Vyc29yOiBkZWZhdWx0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1hY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LXNsaWRlci10aXRsZVwiPkltYWdlIE9wYWNpdHk8L2Rpdj4gXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2xpZGVyLWJ0blwiIGlkPVwidG9nZ2xlLWJnLW9wYWNpdHlcIj5cbiAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInNsaWRlci1idG4taW1nXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL2hpZGUtaWNvbi5zdmdcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPiAgIFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjVcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgdmFsdWU9XCIxMDBcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJ0b2dnbGUtYmctb3BhY2l0eVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2xpZGVyIGlzLWZ1bGx3aWR0aCBpcy1sYXJnZVwiXG4gICAgICAgICAgICAgIGlkPVwiYmdPcGFjaXR5U2xpZGVyXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDFyZW07IHBhZGRpbmctcmlnaHQ6IDFyZW07XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8b3V0cHV0IGlkPVwiYmdPcGFjaXR5T3V0cHV0XCIgZm9yPVwiYmdPcGFjaXR5U2xpZGVyXCI+MTAwPC9vdXRwdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb25cIj5cblxuICAgICAgICA8ZGl2IGlkPVwiaGlnaGxpZ2h0LW9wdGlvbnMtdGl0bGVcIiBjbGFzcz1cInBhbmVsLXN1Yi10aXRsZVwiPkhpZ2hsaWdodCBPcHRpb25zOjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIiBpZD1cImhpZ2hsaWdodC1kcm9wZG93blwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImhpZ2hsaWdodC1idXR0b25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJoaWdobGlnaHQtbWVudVwiIHN0eWxlPVwid2lkdGg6IGF1dG9cIj5cbiAgICAgICAgICAgICAgPHNwYW4+SGlnaGxpZ2h0PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImhpZ2hsaWdodC10eXBlXCI+Jm5ic3A7LSBPZmY8L3NwYW4+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+XG4gICAgICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZURpc3BsYXlcIiB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwiaGlnaGxpZ2h0LW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGEgYXJpYS1yb2xlPVwibWVudWl0ZW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBpZD1cImhpZ2hsaWdodC1zZWxlY3Rpb25cIj5CeSBTZWxlY3Rpb24gTW9kZTwvYT5cbiAgICAgICAgICAgICAgPGhyIGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiLz5cbiAgICAgICAgICAgICAgPGEgYXJpYS1yb2xlPVwibWVudWl0ZW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBpZD1cImhpZ2hsaWdodC1jb2x1bW5cIj5Db2x1bW48L2E+XG4gICAgICAgICAgICAgIDxhIGFyaWEtcm9sZT1cIm1lbnVpdGVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaWQ9XCJoaWdobGlnaHQtc3RhZmZcIj5TdGFmZjwvYT5cbiAgICAgICAgICAgICAgPGEgYXJpYS1yb2xlPVwibWVudWl0ZW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBpZD1cImhpZ2hsaWdodC1zeWxsYWJsZVwiPlN5bGxhYmxlPC9hPlxuICAgICAgICAgICAgICA8YSBhcmlhLXJvbGU9XCJtZW51aXRlbVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGlkPVwiaGlnaGxpZ2h0LW5ldW1lXCI+TmV1bWU8L2E+XG4gICAgICAgICAgICAgIDxhIGFyaWEtcm9sZT1cIm1lbnVpdGVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaWQ9XCJoaWdobGlnaHQtbGF5ZXJFbGVtZW50XCI+TGF5ZXJFbGVtZW50PC9hPlxuICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCIvPlxuICAgICAgICAgICAgICA8YSBhcmlhLXJvbGU9XCJtZW51aXRlbVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGlkPVwiaGlnaGxpZ2h0LW5vbmVcIj5Ob25lPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktb3B0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGlzcGxheS1vcHRpb25zLXRpdGxlXCIgY2xhc3M9XCJwYW5lbC1zdWItdGl0bGVcIj5EaXNwbGF5IE9wdGlvbnM6PC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGlzcGxheS1vcHRpb25zLWl0ZW1zXCI+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjaGVja2JveC1kaXNwbGF5LW9wdGlvbnNcIj5cblxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGlzcGxheS1hbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktb3B0aW9ucy1zZXBhcmF0b3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRpc3BsYXktYWxsLWJ0blwiPkRpc3BsYXkgQWxsPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGlzcGxheS1zaW5nbGUtY29udGFpbmVyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICA8L2Rpdj5gO1xuXG4gIHJldHVybiBjb250ZW50cztcbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgc2V0cyB0aGUgY29udGVudCBvZiB0aGUgZGlzcGxheSBwYW5lbCB0byB0aGUgcmlnaHQgYW5kXG4gKiBtYW5hZ2VzIGNvbnRyb2xzIGZvciB2aWV3aW5nLlxuICovXG5jbGFzcyBEaXNwbGF5UGFuZWwgaW1wbGVtZW50cyBEaXNwbGF5SW50ZXJmYWNlIHtcbiAgdmlldzogVmlld0ludGVyZmFjZTtcbiAgbWVpQ2xhc3M6IHN0cmluZztcbiAgYmFja2dyb3VuZDogc3RyaW5nO1xuICB6b29tSGFuZGxlcjogWm9vbUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBEaXNwbGF5UGFuZWwuXG4gICAqIEBwYXJhbSB7U2luZ2xlVmlldyB8IERpdmFWaWV3fSB2aWV3IC0gVGhlIFZpZXcgcGFyZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVpIC0gVGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBTVkctcmVuZGVyZWQgTUVJLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFja2dyb3VuZCAtIFRoZSBjbGFzcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFja2dyb3VuZC5cbiAgICogQHBhcmFtIHtab29tSGFuZGxlcn0gW3pvb21IYW5kbGVyXSAtIFRoZSBab29tSGFuZGxlciBvYmplY3QsIGlmIFNpbmdsZVZpZXcuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAodmlldzogVmlld0ludGVyZmFjZSwgbWVpOiBzdHJpbmcsXG4gICAgYmFja2dyb3VuZDogc3RyaW5nLCB6b29tSGFuZGxlcjogWm9vbUhhbmRsZXIgPSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgIHRoaXMubWVpQ2xhc3MgPSBtZWk7XG4gICAgdGhpcy5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcbiAgICB0aGlzLnpvb21IYW5kbGVyID0gem9vbUhhbmRsZXI7XG5cbiAgICBjb25zdCBkaXNwbGF5UGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheV9jb250cm9scycpO1xuICAgIGRpc3BsYXlQYW5lbC5pbm5lckhUTUwgPSBkaXNwbGF5Q29udHJvbHNQYW5lbCh0aGlzLnpvb21IYW5kbGVyKTtcblxuICAgIHRoaXMubG9hZFNldHRpbmdzKCk7XG5cbiAgICB0aGlzLnZpZXcuYWRkVXBkYXRlQ2FsbGJhY2sodGhpcy51cGRhdGVWaXN1YWxpemF0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGV2ZW50IGxpc3RlbmVycyByZWxhdGVkIHRvIHRoZSBEaXNwbGF5UGFuZWwuXG4gICAqL1xuICBzZXREaXNwbGF5TGlzdGVuZXJzICgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy56b29tSGFuZGxlcikge1xuICAgICAgLy8gWm9vbSBoYW5kbGVyIHN0dWZmXG4gICAgICBEaXNwbGF5Q29udHJvbHMuc2V0Wm9vbUNvbnRyb2xzKHRoaXMuem9vbUhhbmRsZXIpO1xuICAgIH1cbiAgICBEaXNwbGF5Q29udHJvbHMuaW5pdERpc3BsYXlDb250cm9scyh0aGlzLm1laUNsYXNzLCB0aGlzLmJhY2tncm91bmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbG9jYWxTdG9yYWdlIHZhbHVlcyBiZWZvcmUgU1ZHIGlzIGxvYWRlZFxuICAgKiBcbiAgICogTk9URTogdGhpcyBmdW5jdGlvbiBvbmx5IGNhdXNlcyB2aXN1YWwgY2hhbmdlcywgbm90IGZ1bmN0aW9uYWwgY2hhbmdlcy5cbiAgICogICAgRnVuY3Rpb25hbCBjaGFuZ2VzIGFyZSBkb25lIGluIHNlcGFyYXRlIG1vZHVsZXMgd2hpY2ggZGVwZW5kIG9uIHNwZWNpZmljIGNvbmRpdGlvbnMuXG4gICAqL1xuICBsb2FkU2V0dGluZ3MgKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgem9vbSwgZ2x5cGhPcGFjaXR5LCBpbWFnZU9wYWNpdHksIGhpZ2hsaWdodE1vZGUgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgXG4gICAgLy8gWm9vbVxuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjem9vbU91dHB1dCcpKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjem9vbU91dHB1dCcpLnZhbHVlID0gU3RyaW5nKHpvb20pO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI3pvb21TbGlkZXInKS52YWx1ZSA9IFN0cmluZyh6b29tKTtcbiAgICB9ICAgIFxuXG4gICAgLy8gSW1hZ2Ugb3BhY2l0eVxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNiZ09wYWNpdHlPdXRwdXQnKS52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNiZ09wYWNpdHlTbGlkZXInKS52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuXG4gICAgLy8gR2x5cGggb3BhY2l0eVxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNvcGFjaXR5T3V0cHV0JykudmFsdWUgPSBTdHJpbmcoZ2x5cGhPcGFjaXR5KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjb3BhY2l0eVNsaWRlcicpLnZhbHVlID0gU3RyaW5nKGdseXBoT3BhY2l0eSk7XG5cbiAgICAvLyBIaWdobGlnaHQgbW9kZTpcbiAgICAvLyBUZXh0ID0gY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiBoaWdobGlnaHQtJHtpZH1cbiAgICBjb25zdCB0ZXh0ID0gaGlnaGxpZ2h0TW9kZSA9PT0gJ25vbmUnID8gJ09mZicgOiBoaWdobGlnaHRNb2RlWzBdLnRvVXBwZXJDYXNlKCkgKyBoaWdobGlnaHRNb2RlLnNsaWNlKDEpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNoaWdobGlnaHQtdHlwZScpLnRleHRDb250ZW50ID0gYFxceEEwLSAke3RleHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgU1ZHIGJhc2VkIG9uIHZpc3VhbGl6YXRpb24gc2V0dGluZ3NcbiAgICovXG4gIHVwZGF0ZVZpc3VhbGl6YXRpb24gKCk6IHZvaWQge1xuICAgIERpc3BsYXlDb250cm9scy5zZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyKHRoaXMubWVpQ2xhc3MpO1xuICAgIERpc3BsYXlDb250cm9scy5zZXRCZ09wYWNpdHlGcm9tU2xpZGVyKHRoaXMuYmFja2dyb3VuZCk7XG4gICAgRGlzcGxheUNvbnRyb2xzLnVwZGF0ZUhpZ2hsaWdodCgpO1xuICB9XG59XG5cbmV4cG9ydCB7IERpc3BsYXlQYW5lbCBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi9OZW9uVmlldyc7XG5pbXBvcnQgRGlzcGxheVBhbmVsIGZyb20gJy4vRGlzcGxheVBhbmVsL0Rpc3BsYXlQYW5lbCc7XG5pbXBvcnQgeyBEaXNwbGF5Q29uc3RydWN0YWJsZSwgVmlld0ludGVyZmFjZSB9IGZyb20gJy4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgWm9vbUhhbmRsZXIgZnJvbSAnLi9TaW5nbGVWaWV3L1pvb20nO1xuXG5pbXBvcnQgRGl2YSBmcm9tICdkaXZhLmpzJztcblxuLyoqXG4gKiBWaWV3IG1vZHVsZSB0aGF0IHVzZXMgdGhlIGRpdmEuanMgdmlld2VyIHRvIHJlbmRlciB0aGUgcGFnZXMgb2YgYSBJSUlGIG1hbmlmZXN0c1xuICogYW5kIHRoZW4gZGlzcGxheSB0aGUgcmVuZGVyZWQgTUVJIGZpbGVzIG92ZXIgdGhlIHByb3BlciBwYWdlcy5cbiAqL1xuY2xhc3MgRGl2YVZpZXcgaW1wbGVtZW50cyBWaWV3SW50ZXJmYWNlIHtcbiAgcmVhZG9ubHkgbmVvblZpZXc6IE5lb25WaWV3O1xuICAvKiogQ2FsbGJhY2tzIHRoYXQgcnVuIHdoZW5ldmVyIHRoZSBkaXNwbGF5IHVwZGF0ZXMuICovXG4gIHByaXZhdGUgdXBkYXRlQ2FsbGJhY2tzOiBBcnJheTwoKSA9PiB2b2lkPjtcbiAgZGl2YVJlYWR5OiBib29sZWFuO1xuICAvKiogVGhlIGRpdmEuanMgaW5zdGFuY2UuICovXG4gIHByaXZhdGUgZGl2YTogRGl2YTtcbiAgLyoqIE1hcCB6ZXJvLWluZGV4IHBhZ2UgbnVtYmVycyB0byB0aGUgYWN0dWFsIFVSSS9JUkkgaWRlbnRpZmllci4gKi9cbiAgcHJpdmF0ZSBpbmRleE1hcDogTWFwPG51bWJlciwgc3RyaW5nPjtcbiAgcHJpdmF0ZSBkaXNwbGF5UGFuZWw6IERpc3BsYXlQYW5lbDtcbiAgLyoqIFRpbWUgdG8gd2FpdCBhZnRlciBhIHBhZ2UgYmVjb21lcyBhY3RpdmUgYmVmb3JlIGxvYWRpbmcgaXQuIEluIG1pbGxpc2Vjb25kcy4gKi9cbiAgcHJpdmF0ZSBsb2FkRGVsYXk6IG51bWJlcjtcbiAgem9vbUhhbmRsZXI6IFpvb21IYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWFuaWZlc3QgLSBVUkkvSVJJIHRvIHRoZSBJSUlGIG1hbmlmZXN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldywgRGlzcGxheTogRGlzcGxheUNvbnN0cnVjdGFibGUsIG1hbmlmZXN0OiBzdHJpbmcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy51cGRhdGVDYWxsYmFja3MgPSBbXTtcbiAgICB0aGlzLmRpdmFSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuZGl2YSA9IG5ldyBEaXZhKCdjb250YWluZXInLCB7XG4gICAgICBvYmplY3REYXRhOiBtYW5pZmVzdFxuICAgIH0pO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5zdHlsZS5taW5IZWlnaHQgPSAnMTAwJSc7XG4gICAgdGhpcy5pbmRleE1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmRpdmEuZGlzYWJsZURyYWdTY3JvbGxhYmxlKCk7XG4gICAgdGhpcy5kaXNwbGF5UGFuZWwgPSBuZXcgRGlzcGxheSh0aGlzLCAnbmVvbi1jb250YWluZXInLCAnZGl2YS12aWV3ZXItY2FudmFzJyk7XG4gICAgdGhpcy5sb2FkRGVsYXkgPSA1MDA7IC8vIGluIG1pbGxpc2Vjb25kc1xuICAgIHRoaXMuaW5pdERpdmFFdmVudHMoKTtcbiAgICAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRpdmEtaW5uZXInKSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuY3Vyc29yID0gJ2F1dG8nO1xuXG4gICAgd2luZG93Lm9ucmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblxuICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoKGhlaWdodCA9PT0gd2luZG93LmlubmVySGVpZ2h0KSAmJiAod2lkdGggPT09IHdpbmRvdy5pbm5lcldpZHRoKSkge1xuICAgICAgICAgIHRoaXMuY2hhbmdlUGFnZSh0aGlzLmdldEN1cnJlbnRQYWdlKCksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcy5sb2FkRGVsYXkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBsaXN0ZW5lcnMgZm9yIGNlcnRhaW4gZXZlbnRzIGludGVybmFsIHRvIGRpdmEuanNcbiAgICovXG4gIGluaXREaXZhRXZlbnRzICgpOiB2b2lkIHtcbiAgICBEaXZhLkV2ZW50cy5zdWJzY3JpYmUoJ01hbmlmZXN0RGlkTG9hZCcsIHRoaXMucGFyc2VNYW5pZmVzdC5iaW5kKHRoaXMpLCB0aGlzLmRpdmEuc2V0dGluZ3MuSUQpO1xuICAgIERpdmEuRXZlbnRzLnN1YnNjcmliZSgnT2JqZWN0RGlkTG9hZCcsIHRoaXMuZGlkTG9hZC5iaW5kKHRoaXMpLCB0aGlzLmRpdmEuc2V0dGluZ3MuSUQpO1xuICAgIERpdmEuRXZlbnRzLnN1YnNjcmliZSgnQWN0aXZlUGFnZURpZENoYW5nZScsIHRoaXMuY2hhbmdlUGFnZS5iaW5kKHRoaXMpLCB0aGlzLmRpdmEuc2V0dGluZ3MuSUQpO1xuICAgIERpdmEuRXZlbnRzLnN1YnNjcmliZSgnWm9vbUxldmVsRGlkQ2hhbmdlJywgdGhpcy5hZGp1c3Rab29tLmJpbmQodGhpcyksIHRoaXMuZGl2YS5zZXR0aW5ncy5JRCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHZpc2libGUgcGFnZSBjaGFuZ2VzIGluIHRoZSBkaXZhLmpzIHZpZXdlci5cbiAgICogQHBhcmFtIHBhZ2VJbmRleCAtIFRoZSB6ZXJvLWluZGV4ZWQgcGFnZSB0aGF0IGlzIG1vc3QgdmlzaWJsZS5cbiAgICogQHBhcmFtIGRlbGF5IC0gV2hldGhlciB0byBkZWxheSB0aGUgbG9hZGluZyBvZiB0aGUgcGFnZSBzbyB0aGF0IG5lb24gZG9lc24ndCBsYWcgd2hpbGUgc2Nyb2xsaW5nLlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlUGFnZSAocGFnZUluZGV4OiBudW1iZXIsIGRlbGF5ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZ1bmN0aW9uIGNoZWNrQW5kTG9hZCAocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICBpZiAocGFnZSA9PT0gdGhpcy5nZXRDdXJyZW50UGFnZSgpKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VVUkkgPSB0aGlzLmluZGV4TWFwLmdldChwYWdlKTtcbiAgICAgICAgdGhpcy5uZW9uVmlldy5nZXRQYWdlU1ZHKHBhZ2VVUkkpLnRoZW4oKHN2ZzogU1ZHU1ZHRWxlbWVudCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlU1ZHKHN2ZywgcGFnZSk7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVySWQgPSAnbmVvbi1jb250YWluZXItJyArIHBhZ2U7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpO1xuICAgICAgICAgIGlmIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdhY3RpdmUtcGFnZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjazogRnVuY3Rpb24pID0+IGNhbGxiYWNrKCkpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyOiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgaWYgKGVyci5uYW1lICE9PSAnbm90X2ZvdW5kJyAmJiBlcnIubmFtZSAhPT0gJ21pc3NpbmdfbWVpJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUluZGV4ZXMgPSBbcGFnZUluZGV4XTtcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FjdGl2ZS1wYWdlJykpLmZvckVhY2goZWxlbSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZS1wYWdlJyk7XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VJbmRleGVzKSB7XG4gICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2hlY2tBbmRMb2FkLmJpbmQodGhpcyksICh0aGlzLmxvYWREZWxheSksIHBhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tBbmRMb2FkLmJpbmQodGhpcykocGFnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFjdGl2ZSB6ZXJvLWluZGV4ZWQgcGFnZSBpbiB0aGUgZGl2YS5qcyB2aWV3ZXIuXG4gICAqL1xuICBnZXRDdXJyZW50UGFnZSAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kaXZhLmdldEFjdGl2ZVBhZ2VJbmRleCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBhY3RpdmUgcGFnZSBVUkkgaW4gdGhlIGRpdmEuanMgdmlld2VyLlxuICAgKi9cbiAgZ2V0Q3VycmVudFBhZ2VVUkkgKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhNYXAuZ2V0KHRoaXMuZ2V0Q3VycmVudFBhZ2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0IHRoZSByZW5kZXJlZCBTVkcocykgdG8gYmUgdGhlIGNvcnJlY3Qgc2l6ZSBhZnRlciB6b29taW5nLlxuICAgKi9cbiAgYWRqdXN0Wm9vbSAoKTogdm9pZCB7XG4gICAgKG5ldyBQcm9taXNlKChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tY29udGFpbmVyJykpXG4gICAgICAgIC5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4geyBlbGVtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0pO1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCB0aGlzLmRpdmEuc2V0dGluZ3Muem9vbUR1cmF0aW9uICsgMTAwKTtcbiAgICB9KSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmNoYW5nZVBhZ2UodGhpcy5kaXZhLmdldEFjdGl2ZVBhZ2VJbmRleCgpLCB0cnVlKTtcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1jb250YWluZXInKSlcbiAgICAgICAgLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3ZnID0gZWxlbS5maXJzdENoaWxkIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgcGFnZU5vID0gcGFyc2VJbnQoZWxlbS5pZC5tYXRjaCgvXFxkKy8pWzBdKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNWRyhzdmcsIHBhZ2VObyk7XG4gICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25TVkdMb2FkICgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZpZXdFdmVudEhhbmRsZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBTVkcgYmVpbmcgZGlzcGxheWVkIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuXG4gICAqIEBwYXJhbSBzdmcgLSBUaGUgU1ZHIG9mIHRoZSBwYWdlIHRvIHVwZGF0ZSB0by5cbiAgICogQHBhcmFtIHBhZ2VObyAtIFRoZSB6ZXJvLWluZGV4ZWQgcGFnZSBudW1iZXIuXG4gICAqL1xuICB1cGRhdGVTVkcgKHN2ZzogU1ZHU1ZHRWxlbWVudCwgcGFnZU5vOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXZhLTEtaW5uZXInKTtcbiAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5kaXZhLmdldFBhZ2VEaW1lbnNpb25zQXRDdXJyZW50Wm9vbUxldmVsKHBhZ2VObyk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5kaXZhLnNldHRpbmdzLnZpZXdIYW5kbGVyLl92aWV3ZXJDb3JlLmdldFBhZ2VSZWdpb24ocGFnZU5vLCB7XG4gICAgICBpbmNsdWRlUGFkZGluZzogdHJ1ZSxcbiAgICAgIGluY29ycG9yYXRlVmlld3BvcnQ6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCBtYXJnaW5MZWZ0ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoaW5uZXIsIG51bGwpXG4gICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLWxlZnQnKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lcklkID0gJ25lb24tY29udGFpbmVyLScgKyBwYWdlTm8udG9TdHJpbmcoKTtcbiAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpO1xuICAgIGlmIChjb250YWluZXIgPT09IG51bGwpIHtcbiAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29udGFpbmVyLmlkID0gY29udGFpbmVySWQ7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbmVvbi1jb250YWluZXInKTtcbiAgICAgIGlubmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgd2hpbGUgKGNvbnRhaW5lci5maXJzdENoaWxkKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgZGltZW5zaW9ucy53aWR0aC50b1N0cmluZygpKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBkaW1lbnNpb25zLmhlaWdodC50b1N0cmluZygpKTtcbiAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHtvZmZzZXQudG9wfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IGAke29mZnNldC5sZWZ0IC0gcGFyc2VJbnQobWFyZ2luTGVmdCl9cHhgO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN2Zyk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gZGl2YS5qcyBmaW5pc2hlcyBsb2FkaW5nLlxuICAgKi9cbiAgZGlkTG9hZCAoKTogdm9pZCB7XG4gICAgdGhpcy5kaXZhUmVhZHkgPSB0cnVlO1xuICAgIHRoaXMuZGlzcGxheVBhbmVsLnNldERpc3BsYXlMaXN0ZW5lcnMoKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biB3aGVuZXZlciBhbiBTVkcgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGNiIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKi9cbiAgYWRkVXBkYXRlQ2FsbGJhY2sgKGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYWxsYmFja3MucHVzaChjYik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY2FsbGJhY2sgZnVuY3Rpb24gcHJldmlvdXNseSBhZGRlZCB0byB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgdG8gY2FsbC5cbiAgICogQHBhcmFtIGNiIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVtb3ZlVXBkYXRlQ2FsbGJhY2sgKGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnVwZGF0ZUNhbGxiYWNrcy5maW5kSW5kZXgoKGVsZW0pID0+IHtcbiAgICAgIHJldHVybiBlbGVtID09PSBjYjtcbiAgICB9KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbGlzdGVuZXJzIG9uIHRoZSBib2R5IGVsZW1lbnQgZm9yIGdsb2JhbCBldmVudHMuXG4gICAqL1xuICBzZXRWaWV3RXZlbnRIYW5kbGVycyAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tY29udGFpbmVyJykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD4pIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZ0KSA9PiB7XG4gICAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1jb250YWluZXInKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxFbGVtZW50Pikge1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgSUlJRiBtYW5pZmVzdCB0byBjcmVhdGUgYSBtYXAgYmV0d2VlbiBJSUlGIGNhbnZhc2VzIGFuZCBwYWdlIGluZGV4ZXMuXG4gICAqIEBwYXJhbSBtYW5pZmVzdCAtIFRoZSBJSUlGIG1hbmlmZXN0IG9iamVjdC5cbiAgICovXG4gIHBhcnNlTWFuaWZlc3QgKG1hbmlmZXN0OiB7IHNlcXVlbmNlczogeyBjYW52YXNlczogb2JqZWN0W10gfVtdIH0pOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4TWFwLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiBtYW5pZmVzdC5zZXF1ZW5jZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY2FudmFzIG9mIHNlcXVlbmNlLmNhbnZhc2VzKSB7XG4gICAgICAgIHRoaXMuaW5kZXhNYXAuc2V0KHNlcXVlbmNlLmNhbnZhc2VzLmluZGV4T2YoY2FudmFzKSwgY2FudmFzWydAaWQnXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBhY3RpdmUgcGFnZS9jYW52YXMgY29tYmluZWQgd2l0aCB0aGUgbWFudXNjcmlwdCBuYW1lLlxuICAgKi9cbiAgZ2V0UGFnZU5hbWUgKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWFudXNjcmlwdE5hbWUgPSB0aGlzLmRpdmEuc2V0dGluZ3MubWFuaWZlc3QuaXRlbVRpdGxlO1xuICAgIGNvbnN0IHBhZ2VOYW1lID0gdGhpcy5kaXZhLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3RoaXMuZ2V0Q3VycmVudFBhZ2UoKV0ubDtcbiAgICByZXR1cm4gbWFudXNjcmlwdE5hbWUgKyAnIFxcdTIwMTQgJyArIHBhZ2VOYW1lO1xuICB9XG59XG5cbmV4cG9ydCB7IERpdmFWaWV3IGFzIGRlZmF1bHQgfTtcbiIsIi8qXG4gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gQ29weXJpZ2h0IChjKSA8MjAxMT4gPERhdmUgVGF5bG9yIGh0dHA6Ly90aGUtdGF5bG9ycy5vcmc+XG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZFxuIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1NcbiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1JcbiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTlxuIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbiBQb3J0IHRvIHZhbmlsbGEgSmF2YXNjcmlwdCBieSBKYWNlayBOb3dhY2tpIGh0dHA6Ly9qYWNlay1ub3dhY2tpLm5ldC9cbioqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yYWYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG4gICAgdmFyIF9pc1RvdWNoID0gJ29udG91Y2hlbmQnIGluIGRvY3VtZW50O1xuXG4gICAgLy8gdGhpcyBpcyBzaW1wbGUsIG5vIFwiZGVlcFwiIHN1cHBvcnRcbiAgICB2YXIgX2V4dGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpPTE7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYXJndW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1swXVtrZXldID0gYXJndW1lbnRzW2ldW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgfTtcblxuICAgIHZhciBWYW5pbGxhS2luZXRpYyA9IGZ1bmN0aW9uKGVsZW1lbnQsIHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBfZXh0ZW5kKHt9LCBWYW5pbGxhS2luZXRpYy5ERUZBVUxUUywgc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLmVsICAgICAgID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5BQ1RJVkVfQ0xBU1MgPSBcImtpbmV0aWMtYWN0aXZlXCI7XG5cbiAgICAgICAgdGhpcy5faW5pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgdGhpcy5lbC5fVmFuaWxsYUtpbmV0aWMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMuREVGQVVMVFMgPSB7XG4gICAgICAgIGN1cnNvcjogJ21vdmUnLFxuICAgICAgICBkZWNlbGVyYXRlOiB0cnVlLFxuICAgICAgICB0cmlnZ2VySGFyZHdhcmU6IGZhbHNlLFxuICAgICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICAgIHk6IHRydWUsXG4gICAgICAgIHg6IHRydWUsXG4gICAgICAgIHNsb3dkb3duOiAwLjksXG4gICAgICAgIG1heHZlbG9jaXR5OiA0MCxcbiAgICAgICAgdGhyb3R0bGVGUFM6IDYwLFxuICAgICAgICBpbnZlcnQ6IGZhbHNlLFxuICAgICAgICBtb3ZpbmdDbGFzczoge1xuICAgICAgICAgICAgdXA6ICdraW5ldGljLW1vdmluZy11cCcsXG4gICAgICAgICAgICBkb3duOiAna2luZXRpYy1tb3ZpbmctZG93bicsXG4gICAgICAgICAgICBsZWZ0OiAna2luZXRpYy1tb3ZpbmctbGVmdCcsXG4gICAgICAgICAgICByaWdodDogJ2tpbmV0aWMtbW92aW5nLXJpZ2h0J1xuICAgICAgICB9LFxuICAgICAgICBkZWNlbGVyYXRpbmdDbGFzczoge1xuICAgICAgICAgICAgdXA6ICdraW5ldGljLWRlY2VsZXJhdGluZy11cCcsXG4gICAgICAgICAgICBkb3duOiAna2luZXRpYy1kZWNlbGVyYXRpbmctZG93bicsXG4gICAgICAgICAgICBsZWZ0OiAna2luZXRpYy1kZWNlbGVyYXRpbmctbGVmdCcsXG4gICAgICAgICAgICByaWdodDogJ2tpbmV0aWMtZGVjZWxlcmF0aW5nLXJpZ2h0J1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIFB1YmxpYyBmdW5jdGlvbnNcbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBfZXh0ZW5kKHRoaXMuc2V0dGluZ3MsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnZlbG9jaXR5ID0gb3B0aW9ucy52ZWxvY2l0eSB8fCB0aGlzLnZlbG9jaXR5O1xuICAgICAgICB0aGlzLnZlbG9jaXR5WSA9IG9wdGlvbnMudmVsb2NpdHlZIHx8IHRoaXMudmVsb2NpdHlZO1xuICAgICAgICB0aGlzLnNldHRpbmdzLmRlY2VsZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbW92ZSgpO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MuZGVjZWxlcmF0ZSA9IHRydWU7XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgICAgICB0aGlzLnZlbG9jaXR5WSA9IDA7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MuZGVjZWxlcmF0ZSA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXR0aW5ncy5zdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLnN0b3BwZWQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2RldGFjaExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5BQ1RJVkVfQ0xBU1MpO1xuICAgICAgICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9ICcnO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkFDVElWRV9DTEFTUykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hdHRhY2hMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKHRoaXMuQUNUSVZFX0NMQVNTKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5jdXJzb3IgPSB0aGlzLnNldHRpbmdzLmN1cnNvcjtcbiAgICB9O1xuXG4gICAgLy8gSW50ZXJuYWwgZnVuY3Rpb25zXG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX2luaXRFbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQodGhpcy5BQ1RJVkVfQ0xBU1MpO1xuXG4gICAgICAgIF9leHRlbmQodGhpcywge1xuICAgICAgICAgICAgeHBvczogbnVsbCxcbiAgICAgICAgICAgIHByZXZYUG9zOiBmYWxzZSxcbiAgICAgICAgICAgIHlwb3M6IG51bGwsXG4gICAgICAgICAgICBwcmV2WVBvczogZmFsc2UsXG4gICAgICAgICAgICBtb3VzZURvd246IGZhbHNlLFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0OiAxMDAwIC8gdGhpcy5zZXR0aW5ncy50aHJvdHRsZUZQUyxcbiAgICAgICAgICAgIGxhc3RNb3ZlOiBudWxsLFxuICAgICAgICAgICAgZWxlbWVudEZvY3VzZWQ6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZWxvY2l0eSA9IDA7XG4gICAgICAgIHRoaXMudmVsb2NpdHlZID0gMDtcblxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRSZXNldEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoYXQuX3Jlc2V0TW91c2UuYXBwbHkodGhhdCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRklYTUUgbWFrZSBzdXJlIHRvIHJlbW92ZSB0aGlzXG4gICAgICAgIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuZG9jdW1lbnRSZXNldEhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5kb2N1bWVudFJlc2V0SGFuZGxlciwgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuX2luaXRFdmVudHMoKTtcblxuICAgICAgICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IHRoaXMuc2V0dGluZ3MuY3Vyc29yO1xuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnRyaWdnZXJIYXJkd2FyZSkge1xuICAgICAgICAgICAgdmFyIHByZWZpeGVzID0gWycnLCAnLW1zLScsICctd2Via2l0LScsICctbW96LSddO1xuICAgICAgICAgICAgdmFyIHN0eWxlcyA9IHtcbiAgICAgICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKDAsMCwwKScsXG4gICAgICAgICAgICAgICAgJ3BlcnNwZWN0aXZlJzogJzEwMDAnLCAvLyBUT0RPIGlzIHRoaXMgZXZlbiB2YWxpZD8gaXMgdGhpcyBldmVuIG5lZWRlZD9cbiAgICAgICAgICAgICAgICAnYmFja2ZhY2UtdmlzaWJpbGl0eSc6ICdoaWRkZW4nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWwuc3R5bGVbcHJlZml4K2tleV0gPSBzdHlsZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX2luaXRFdmVudHMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnNldHRpbmdzLmV2ZW50cyA9IHtcbiAgICAgICAgICAgIHRvdWNoU3RhcnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG91Y2g7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuX3VzZVRhcmdldChlLnRhcmdldCwgZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG91Y2ggPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi50aHJlc2hvbGQgPSBzZWxmLl90aHJlc2hvbGQoZS50YXJnZXQsIGUpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGFydCh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG91Y2hNb3ZlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvdWNoO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm1vdXNlRG93bikge1xuICAgICAgICAgICAgICAgICAgICB0b3VjaCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dG1vdmUodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXREb3duOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuX3VzZVRhcmdldChlLnRhcmdldCwgZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi50aHJlc2hvbGQgPSBzZWxmLl90aHJlc2hvbGQoZS50YXJnZXQsIGUpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGFydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudEZvY3VzZWQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0Lm5vZGVOYW1lID09PSBcIklNR1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRFbmQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fdXNlVGFyZ2V0KGUudGFyZ2V0LCBlKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50Rm9jdXNlZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRNb3ZlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubW91c2VEb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0bW92ZShlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2Nyb2xsOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNldHRpbmdzLm1vdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dGluZ3MubW92ZWQuY2FsbChzZWxmLCBzZWxmLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnB1dENsaWNrOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNlbGYudmVsb2NpdHkpID4gMCB8fCBNYXRoLmFicyhzZWxmLnZlbG9jaXR5WSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHJhZ1N0YXJ0OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuX3VzZVRhcmdldChlLnRhcmdldCwgZSkgJiYgc2VsZi5lbGVtZW50Rm9jdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbGVjdFN0YXJ0OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNldHRpbmdzLnNlbGVjdFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNldHRpbmdzLnNlbGVjdFN0YXJ0LmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGYuX3VzZVRhcmdldChlLnRhcmdldCwgZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hdHRhY2hMaXN0ZW5lcnMoKTtcbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9pbnB1dG1vdmUgPSBmdW5jdGlvbihjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXN0TW92ZSB8fCBuZXcgRGF0ZSgpID4gbmV3IERhdGUodGhpcy5sYXN0TW92ZS5nZXRUaW1lKCkgKyB0aGlzLnRocm90dGxlVGltZW91dCkpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdE1vdmUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tb3VzZURvd24gJiYgKHRoaXMueHBvcyB8fCB0aGlzLnlwb3MpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1vdmVkWCA9IChjbGllbnRYIC0gdGhpcy54cG9zKTtcbiAgICAgICAgICAgICAgICB2YXIgbW92ZWRZID0gKGNsaWVudFkgLSB0aGlzLnlwb3MpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmludmVydCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlZFggKj0gLTE7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVkWSAqPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGhyZXNob2xkPjApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vdmVkID0gTWF0aC5zcXJ0KG1vdmVkWCptb3ZlZFggKyBtb3ZlZFkqbW92ZWRZKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGhyZXNob2xkPm1vdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocmVzaG9sZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudEZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Rm9jdXNlZC5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEZvY3VzZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5kZWNlbGVyYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy52ZWxvY2l0eSA9IHRoaXMudmVsb2NpdHlZID0gMDtcblxuICAgICAgICAgICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gdGhpcy5zY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVG9wKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQodGhpcy5zZXR0aW5ncy54ID8gc2Nyb2xsTGVmdCAtIG1vdmVkWCA6IHNjcm9sbExlZnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wKHRoaXMuc2V0dGluZ3MueSA/IHNjcm9sbFRvcCAtIG1vdmVkWSA6IHNjcm9sbFRvcCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnByZXZYUG9zID0gdGhpcy54cG9zO1xuICAgICAgICAgICAgICAgIHRoaXMucHJldllQb3MgPSB0aGlzLnlwb3M7XG4gICAgICAgICAgICAgICAgdGhpcy54cG9zID0gY2xpZW50WDtcbiAgICAgICAgICAgICAgICB0aGlzLnlwb3MgPSBjbGllbnRZO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlVmVsb2NpdGllcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldE1vdmVDbGFzc2VzKHRoaXMuc2V0dGluZ3MubW92aW5nQ2xhc3MpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzLm1vdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubW92ZWQuY2FsbCh0aGlzLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9jYWxjdWxhdGVWZWxvY2l0aWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudmVsb2NpdHkgPSB0aGlzLl9jYXBWZWxvY2l0eSh0aGlzLnByZXZYUG9zIC0gdGhpcy54cG9zLCB0aGlzLnNldHRpbmdzLm1heHZlbG9jaXR5KTtcbiAgICAgICAgdGhpcy52ZWxvY2l0eVkgPSB0aGlzLl9jYXBWZWxvY2l0eSh0aGlzLnByZXZZUG9zIC0gdGhpcy55cG9zLCB0aGlzLnNldHRpbmdzLm1heHZlbG9jaXR5KTtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuaW52ZXJ0KSB7XG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5ICo9IC0xO1xuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eVkgKj0gLTE7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMueHBvcyAmJiB0aGlzLnByZXZYUG9zICYmIHRoaXMuc2V0dGluZ3MuZGVjZWxlcmF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZGVjZWxlcmF0ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVWZWxvY2l0aWVzKCk7XG4gICAgICAgICAgICB0aGlzLnhwb3MgPSB0aGlzLnByZXZYUG9zID0gdGhpcy5tb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX21vdmUoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX3VzZVRhcmdldCA9IGZ1bmN0aW9uKHRhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzLmZpbHRlclRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuZmlsdGVyVGFyZ2V0LmNhbGwodGhpcywgdGFyZ2V0LCBldmVudCkgIT09IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fdGhyZXNob2xkID0gZnVuY3Rpb24odGFyZ2V0LCBldmVudCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3MudGhyZXNob2xkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy50aHJlc2hvbGQuY2FsbCh0aGlzLCB0YXJnZXQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy50aHJlc2hvbGQ7XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fc3RhcnQgPSBmdW5jdGlvbihjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgICAgIHRoaXMubW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52ZWxvY2l0eSA9IHRoaXMucHJldlhQb3MgPSAwO1xuICAgICAgICB0aGlzLnZlbG9jaXR5WSA9IHRoaXMucHJldllQb3MgPSAwO1xuICAgICAgICB0aGlzLnhwb3MgPSBjbGllbnRYO1xuICAgICAgICB0aGlzLnlwb3MgPSBjbGllbnRZO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX3Jlc2V0TW91c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54cG9zID0gZmFsc2U7XG4gICAgICAgIHRoaXMueXBvcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlRG93biA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX2RlY2VsZXJhdGVWZWxvY2l0eSA9IGZ1bmN0aW9uKHZlbG9jaXR5LCBzbG93ZG93bikge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLmFicyh2ZWxvY2l0eSkpID09PSAwID8gMCAvLyBpcyB2ZWxvY2l0eSBsZXNzIHRoYW4gMT9cbiAgICAgICAgICAgIDogdmVsb2NpdHkgKiBzbG93ZG93bjsgLy8gcmVkdWNlIHNsb3dkb3duXG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fY2FwVmVsb2NpdHkgPSBmdW5jdGlvbih2ZWxvY2l0eSwgbWF4KSB7XG4gICAgICAgIHZhciBuZXdWZWxvY2l0eSA9IHZlbG9jaXR5O1xuICAgICAgICBpZiAodmVsb2NpdHkgPiAwKXtcbiAgICAgICAgICAgIGlmICh2ZWxvY2l0eSA+IG1heCl7XG4gICAgICAgICAgICAgICAgbmV3VmVsb2NpdHkgPSBtYXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmVsb2NpdHkgPCAoMCAtIG1heCkpe1xuICAgICAgICAgICAgICAgIG5ld1ZlbG9jaXR5ID0gKDAgLSBtYXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdWZWxvY2l0eTtcbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9zZXRNb3ZlQ2xhc3NlcyA9IGZ1bmN0aW9uKGNsYXNzZXMpIHtcbiAgICAgICAgLy8gVGhlIGZpeC1tZSBjb21tZW50IGJlbG93IGlzIGZyb20gb3JpZ2luYWwgalF1ZXJ5LmtpbmV0aWMgcHJvamVjdFxuICAgICAgICAvLyBGSVhNRTogY29uc2lkZXIgaWYgd2Ugd2FudCB0byBhcHBseSBQTCAjNDQsIHRoaXMgc2hvdWxkIG5vdCByZW1vdmVcbiAgICAgICAgLy8gY2xhc3NlcyB3ZSBoYXZlIG5vdCBkZWZpbmVkIG9uIHRoZSBlbGVtZW50IVxuICAgICAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsO1xuXG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoc2V0dGluZ3MubW92aW5nQ2xhc3MudXApO1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKHNldHRpbmdzLm1vdmluZ0NsYXNzLmRvd24pO1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKHNldHRpbmdzLm1vdmluZ0NsYXNzLmxlZnQpO1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKHNldHRpbmdzLm1vdmluZ0NsYXNzLnJpZ2h0KTtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShzZXR0aW5ncy5kZWNlbGVyYXRpbmdDbGFzcy51cCk7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoc2V0dGluZ3MuZGVjZWxlcmF0aW5nQ2xhc3MuZG93bik7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoc2V0dGluZ3MuZGVjZWxlcmF0aW5nQ2xhc3MubGVmdCk7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoc2V0dGluZ3MuZGVjZWxlcmF0aW5nQ2xhc3MucmlnaHQpO1xuXG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5ID4gMCl7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzZXMucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5IDwgMCl7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzZXMubGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmVsb2NpdHlZID4gMCl7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzZXMuZG93bik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmVsb2NpdHlZIDwgMCl7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzZXMudXApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc2Nyb2xsZXIgPSB0aGlzLl9nZXRTY3JvbGxlcigpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLnggJiYgc2Nyb2xsZXIuc2Nyb2xsV2lkdGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQodGhpcy5zY3JvbGxMZWZ0KCkgKyB0aGlzLnZlbG9jaXR5KTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnZlbG9jaXR5KSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlbG9jaXR5ID0gc2V0dGluZ3MuZGVjZWxlcmF0ZSA/XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RlY2VsZXJhdGVWZWxvY2l0eSh0aGlzLnZlbG9jaXR5LCBzZXR0aW5ncy5zbG93ZG93bikgOiB0aGlzLnZlbG9jaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MueSAmJiBzY3JvbGxlci5zY3JvbGxIZWlnaHQgPiAwKXtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsVG9wKCkgKyB0aGlzLnZlbG9jaXR5WSk7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy52ZWxvY2l0eVkpID4gMCl7XG4gICAgICAgICAgICAgICAgdGhpcy52ZWxvY2l0eVkgPSBzZXR0aW5ncy5kZWNlbGVyYXRlID9cbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGVjZWxlcmF0ZVZlbG9jaXR5KHRoaXMudmVsb2NpdHlZLCBzZXR0aW5ncy5zbG93ZG93bikgOiB0aGlzLnZlbG9jaXR5WTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHlZID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuX3NldE1vdmVDbGFzc2VzKHNldHRpbmdzLmRlY2VsZXJhdGluZ0NsYXNzKTtcblxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLm1vdmVkID09PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgIHNldHRpbmdzLm1vdmVkLmNhbGwodGhpcywgc2V0dGluZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMudmVsb2NpdHkpID4gMCB8fCBNYXRoLmFicyh0aGlzLnZlbG9jaXR5WSkgPiAwKXtcbiAgICAgICAgICAgIGlmICghdGhpcy5tb3ZpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gdGljayBmb3IgbmV4dCBtb3ZlbWVudFxuICAgICAgICAgICAgICAgIF9yYWYoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubW92aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX21vdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuc3RvcCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fZ2V0U2Nyb2xsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRklYTUUgd2UgbWF5IHdhbnQgdG8gbm9ybWFsaXplIGJlaGF2aW91ciBhY3Jvc3MgYnJvd3NlcnMgYXMgaW4gb3JpZ2luYWwgalF1ZXJ5LmtpbmV0aWNcbiAgICAgICAgLy8gY3VycmVudGx5IHRoaXMgd29uJ3Qgd29yayBjb3JyZWN0bHkgb24gYWxsIGJyd29zZXJzIHdoZW4gYXR0YWNoZWQgdG8gaHRtbCBvciBib2R5IGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIHRoaXMuZWw7XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5zY3JvbGxMZWZ0ID0gZnVuY3Rpb24obGVmdCkge1xuICAgICAgICB2YXIgc2Nyb2xsZXIgPSB0aGlzLl9nZXRTY3JvbGxlcigpO1xuICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc2Nyb2xsZXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuc2Nyb2xsVG9wID0gZnVuY3Rpb24odG9wKSB7XG4gICAgICAgIHZhciBzY3JvbGxlciA9IHRoaXMuX2dldFNjcm9sbGVyKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdG9wID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc2Nyb2xsZXIuc2Nyb2xsVG9wO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fYXR0YWNoTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZWw7XG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG5cbiAgICAgICAgaWYgKF9pc1RvdWNoKSB7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgc2V0dGluZ3MuZXZlbnRzLnRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0RW5kLCBmYWxzZSk7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzZXR0aW5ncy5ldmVudHMudG91Y2hNb3ZlLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBzZXR0aW5ncy5ldmVudHMuaW5wdXREb3duLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBzZXR0aW5ncy5ldmVudHMuaW5wdXRFbmQsIGZhbHNlKTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0TW92ZSwgZmFsc2UpO1xuXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0Q2xpY2ssIGZhbHNlKTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2V0dGluZ3MuZXZlbnRzLnNjcm9sbCwgZmFsc2UpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIHNldHRpbmdzLmV2ZW50cy5zZWxlY3RTdGFydCwgZmFsc2UpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBzZXR0aW5ncy5ldmVudHMuZHJhZ1N0YXJ0LCBmYWxzZSk7XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fZGV0YWNoTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZWw7XG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG5cbiAgICAgICAgaWYgKF9pc1RvdWNoKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgc2V0dGluZ3MuZXZlbnRzLnRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0RW5kLCBmYWxzZSk7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzZXR0aW5ncy5ldmVudHMudG91Y2hNb3ZlLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBzZXR0aW5ncy5ldmVudHMuaW5wdXREb3duLCBmYWxzZSk7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBzZXR0aW5ncy5ldmVudHMuaW5wdXRFbmQsIGZhbHNlKTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0TW92ZSwgZmFsc2UpO1xuXG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0Q2xpY2ssIGZhbHNlKTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2V0dGluZ3MuZXZlbnRzLnNjcm9sbCwgZmFsc2UpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIHNldHRpbmdzLmV2ZW50cy5zZWxlY3RTdGFydCwgZmFsc2UpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBzZXR0aW5ncy5ldmVudHMuZHJhZ1N0YXJ0LCBmYWxzZSk7XG4gICAgfTtcblxuXG4gICAgd2luZG93LlZhbmlsbGFLaW5ldGljID0gVmFuaWxsYUtpbmV0aWM7XG59KSgpO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGRyYWdzY3JvbGwgLSBzY3JvbGwgYXJlYSBieSBkcmFnZ2luZ1xuICogQHZlcnNpb24gMC4wLjhcbiAqXG4gKiBAbGljZW5zZSBNSVQsIHNlZSBodHRwOi8vZ2l0aHViLmNvbS9hc3ZkL2RyYWdzY3JvbGxcbiAqIEBjb3B5cmlnaHQgMjAxNSBhc3ZkIDxoZWxpb3NmcmFtZXdvcmtAZ21haWwuY29tPlxuICovXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpXG57XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcbiAgICB7XG4gICAgICAgIGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJylcbiAgICB7XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGZhY3RvcnkoKHJvb3QuZHJhZ3Njcm9sbCA9IHt9KSk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cylcbntcbiAgICB2YXIgX3dpbmRvdyA9IHdpbmRvdztcbiAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgdmFyIG1vdXNlbW92ZSA9ICdtb3VzZW1vdmUnO1xuICAgIHZhciBtb3VzZXVwID0gJ21vdXNldXAnO1xuICAgIHZhciBtb3VzZWRvd24gPSAnbW91c2Vkb3duJztcbiAgICB2YXIgRXZlbnRMaXN0ZW5lciA9ICdFdmVudExpc3RlbmVyJztcbiAgICB2YXIgYWRkRXZlbnRMaXN0ZW5lciA9ICdhZGQnICsgRXZlbnRMaXN0ZW5lcjtcbiAgICB2YXIgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9ICdyZW1vdmUnICsgRXZlbnRMaXN0ZW5lcjtcbiAgICB2YXIgbmV3U2Nyb2xsWCwgbmV3U2Nyb2xsWTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICB2YXIgZHJhZ2dlZCA9IFtdO1xuXG4gICAgdmFyIHJlc2V0ID0gZnVuY3Rpb24gKGksIGVsKVxuICAgIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGRyYWdnZWQubGVuZ3RoOylcbiAgICAgICAge1xuICAgICAgICAgICAgZWwgPSBkcmFnZ2VkW2krK107XG4gICAgICAgICAgICBlbCA9IGVsLmNvbnRhaW5lciB8fCBlbDtcbiAgICAgICAgICAgIGVsW3JlbW92ZUV2ZW50TGlzdGVuZXJdKG1vdXNlZG93biwgZWwubWQsIDApO1xuICAgICAgICAgICAgX3dpbmRvd1tyZW1vdmVFdmVudExpc3RlbmVyXShtb3VzZXVwLCBlbC5tdSwgMCk7XG4gICAgICAgICAgICBfd2luZG93W3JlbW92ZUV2ZW50TGlzdGVuZXJdKG1vdXNlbW92ZSwgZWwubW0sIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZyBhYm91dCBmdW5jdGlvbnMgaW4gbG9vcHMuXG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgLy8gY2xvbmluZyBpbnRvIGFycmF5IHNpbmNlIEhUTUxDb2xsZWN0aW9uIGlzIHVwZGF0ZWQgZHluYW1pY2FsbHlcbiAgICAgICAgZHJhZ2dlZCA9IFtdLnNsaWNlLmNhbGwoX2RvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RyYWdzY3JvbGwnKSk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcmFnZ2VkLmxlbmd0aDspXG4gICAgICAgIHtcbiAgICAgICAgICAgIChmdW5jdGlvbiAoZWwsIGxhc3RDbGllbnRYLCBsYXN0Q2xpZW50WSwgcHVzaGVkLCBzY3JvbGxlciwgY29udClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAoY29udCA9IGVsLmNvbnRhaW5lciB8fCBlbClbYWRkRXZlbnRMaXN0ZW5lcl0oXG4gICAgICAgICAgICAgICAgICAgIG1vdXNlZG93bixcbiAgICAgICAgICAgICAgICAgICAgY29udC5tZCA9IGZ1bmN0aW9uIChlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZSgnbm9jaGlsZGRyYWcnKSB8fCBfZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLnBhZ2VYLCBlLnBhZ2VZKSA9PT0gY29udClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoZWQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDbGllbnRYID0gZS5jbGllbnRYO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDbGllbnRZID0gZS5jbGllbnRZO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCAwXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIF93aW5kb3dbYWRkRXZlbnRMaXN0ZW5lcl0obW91c2V1cCwgY29udC5tdSA9IGZ1bmN0aW9uICgpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgICAgICAgICAgX3dpbmRvd1thZGRFdmVudExpc3RlbmVyXShtb3VzZW1vdmUsIGNvbnQubW0gPSBmdW5jdGlvbiAoZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB1c2hlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Nyb2xsZXIgPSBlbC5zY3JvbGxlciB8fCBlbCkuc2Nyb2xsTGVmdCAtPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTY3JvbGxYID0gKC1sYXN0Q2xpZW50WCArIChsYXN0Q2xpZW50WCA9IGUuY2xpZW50WCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyLnNjcm9sbFRvcCAtPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTY3JvbGxZID0gKC1sYXN0Q2xpZW50WSArIChsYXN0Q2xpZW50WSA9IGUuY2xpZW50WSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gX2RvY3VtZW50LmJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Nyb2xsZXIgPSBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5zY3JvbGxMZWZ0IC09IG5ld1Njcm9sbFg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyLnNjcm9sbFRvcCAtPSBuZXdTY3JvbGxZO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KShkcmFnZ2VkW2krK10pO1xuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfTtcblxuICAgIGlmIChfZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJylcbiAgICB7XG4gICAgICAgIHJlc2V0KCk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIF93aW5kb3dbYWRkRXZlbnRMaXN0ZW5lcl0oJ2xvYWQnLCByZXNldCwgMCk7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5yZXNldCA9IHJlc2V0O1xuICAgIHdpbmRvdy5yZXNldERyYWdzY3JvbGwgPSByZXNldDtcbn0pKTtcbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnNsaWNlKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsImltcG9ydCB7IHVwZGF0ZUhpZ2hsaWdodCwgc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciwgc2V0QmdPcGFjaXR5RnJvbVNsaWRlciB9IGZyb20gJy4uL0Rpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMnO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCBEaXNwbGF5UGFuZWwgZnJvbSAnLi4vRGlzcGxheVBhbmVsL0Rpc3BsYXlQYW5lbCc7XG5pbXBvcnQgWm9vbUhhbmRsZXIgZnJvbSAnLi9ab29tJztcbmltcG9ydCB7IFZpZXdJbnRlcmZhY2UsIERpc3BsYXlDb25zdHJ1Y3RhYmxlIH0gZnJvbSAnLi4vSW50ZXJmYWNlcyc7XG5cbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5cbi8qKlxuICogQSB2aWV3IG1vZHVsZSBmb3IgZGlzcGxheWluZyBhIHNpbmdsZSBwYWdlIG9mIGEgbWFudXNjcmlwdC5cbiAqL1xuY2xhc3MgU2luZ2xlVmlldyBpbXBsZW1lbnRzIFZpZXdJbnRlcmZhY2Uge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSB1cGRhdGVDYWxsYmFja3M6IEFycmF5PCgpID0+IHZvaWQ+O1xuICBwcml2YXRlIGdyb3VwOiBTVkdTVkdFbGVtZW50O1xuICBwcml2YXRlIGJnOiBTVkdJbWFnZUVsZW1lbnQ7XG4gIHByaXZhdGUgc3ZnOiBTVkdTVkdFbGVtZW50O1xuICB6b29tSGFuZGxlcjogWm9vbUhhbmRsZXI7XG4gIHByaXZhdGUgZGlzcGxheVBhbmVsOiBEaXNwbGF5UGFuZWw7XG4gIHJlYWRvbmx5IHBhZ2VVUkk6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBTaW5nbGVWaWV3LlxuICAgKiBAcGFyYW0gaW1hZ2UgLSBUaGUgVVJJIHRvIHRoZSBiYWNrZ3JvdW5kIGltYWdlIGZvciB0aGUgcGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHBhbmVsOiBEaXNwbGF5Q29uc3RydWN0YWJsZSwgaW1hZ2U6IHN0cmluZykge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrcyA9IG5ldyBBcnJheSgwKTtcbiAgICAvLyBHcm91cCB3aWxsIGNvbnRhaW4gdGhlIGltYWdlIGFuZCB0aGUgcmVuZGVyZWQgU1ZHXG4gICAgdGhpcy5ncm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgdGhpcy5ncm91cC5pZCA9ICdzdmdfZ3JvdXAnO1xuICAgIHRoaXMuZ3JvdXAuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB3aW5kb3cuaW5uZXJIZWlnaHQudG9TdHJpbmcoKSk7XG4gICAgdGhpcy5ncm91cC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzEwMCUnKTtcblxuICAgIHRoaXMuYmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2ltYWdlJyk7XG4gICAgdGhpcy5iZy5pZCA9ICdiZ2ltZyc7XG4gICAgdGhpcy5iZy5jbGFzc0xpc3QuYWRkKCdiYWNrZ3JvdW5kJyk7XG4gICAgdGhpcy5iZy5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpO1xuICAgIHRoaXMuYmcuc2V0QXR0cmlidXRlKCd5JywgJzAnKTtcblxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZmV0Y2goaW1hZ2UpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQub2spIHtcbiAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5iZy5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsICdocmVmJywgcmVhZGVyLnJlc3VsdC50b1N0cmluZygpKTtcbiAgICAgICAgICBjb25zdCBiYm94ID0gdGhpcy5iZy5nZXRCQm94KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmdyb3VwLmhhc0F0dHJpYnV0ZSgndmlld0JveCcpKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICBJZiB0aGUgU1ZHIGRvZXMgbm90IGhhdmUgYSB2aWV3Qm94LCBsb2FkIHRoZSBwcmV2aW91cyB2aWV3Qm94XG4gICAgICAgICAgICAgIHZhbHVlIGZyb20gbG9jYWxTdG9yYWdlLiBJZiBub25lIGhhcyBiZWVuIHN0b3JlZCAodmlld0JveCBpcyBudWxsKSxcbiAgICAgICAgICAgICAgc2V0IGl0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBiYWNrZ3JvdW5kIGltYWdlXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBOb3RlOiBhbiBTVkcncyB2aWV3Qm94IGdpdmVzIHRoZSBcImJveFwiIHRoYXQgdGhlIHVzZXIgY2FuIHNlZSB0aGUgU1ZHIHRocm91Z2guXG4gICAgICAgICAgICAgIFRoZSB1c2VyIG1heSBiZSB6b29tZWQgaW50byBhIHZlcnkgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgU1ZHLCBpbiB3aGljaCBjYXNlIHRoZVxuICAgICAgICAgICAgICB2aWV3Qm94IHNob3VsZCBnaXZlIGNvb3JkaW5hdGVzIG9mIHRoYXQgc3BlY2lmaWMgYm94LlxuXG4gICAgICAgICAgICAgIFNlZSBtb3JlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlL3ZpZXdCb3hcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBsZXQgeyB2aWV3Qm94IH0gPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICAgICAgaWYgKCF2aWV3Qm94KVxuICAgICAgICAgICAgICB2aWV3Qm94ID0gJzAgMCAnICsgYmJveC53aWR0aC50b1N0cmluZygpICsgJyAnICsgYmJveC5oZWlnaHQudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgdGhpcy5ncm91cC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCB2aWV3Qm94KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0LmJsb2IoKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKGJsb2IgPT4ge1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgfSk7XG5cbiAgICAvLyBJdCBpcyBiZXR0ZXIgbmFtZWQgc3ZnLCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgYWN0dWFsIE1FSSBmaWxlLlxuICAgIHRoaXMuc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy9zdmcnLCAnc3ZnJykgYXMgU1ZHU1ZHRWxlbWVudDtcbiAgICB0aGlzLnN2Zy5pZCA9ICdtZWlfb3V0cHV0JztcbiAgICB0aGlzLnN2Zy5jbGFzc0xpc3QuYWRkKCduZW9uLWNvbnRhaW5lcicsICdhY3RpdmUtcGFnZScpO1xuXG4gICAgdGhpcy5ncm91cC5hcHBlbmRDaGlsZCh0aGlzLmJnKTtcbiAgICB0aGlzLmdyb3VwLmFwcGVuZENoaWxkKHRoaXMuc3ZnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmdyb3VwKTtcblxuICAgIHRoaXMuem9vbUhhbmRsZXIgPSBuZXcgWm9vbUhhbmRsZXIoKTtcbiAgICB0aGlzLmRpc3BsYXlQYW5lbCA9IG5ldyBwYW5lbCh0aGlzLCAnbmVvbi1jb250YWluZXInLCAnYmFja2dyb3VuZCcsIHRoaXMuem9vbUhhbmRsZXIpO1xuXG4gICAgdGhpcy5wYWdlVVJJID0gaW1hZ2U7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBvblNWR0xvYWQgKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0Vmlld0V2ZW50SGFuZGxlcnMoKTtcbiAgICB0aGlzLmRpc3BsYXlQYW5lbC5zZXREaXNwbGF5TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBTVkcgYmVpbmcgZGlzcGxheWVkLlxuICAgKiBAcGFyYW0gc3ZnIC0gTmV3IHJlbmRlcmVkIFNWRyB0byB1c2UuXG4gICAqL1xuICB1cGRhdGVTVkcgKHN2ZzogU1ZHU1ZHRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXAucmVwbGFjZUNoaWxkKHN2ZywgdGhpcy5zdmcpO1xuICAgIHRoaXMuc3ZnID0gc3ZnO1xuICAgIHRoaXMuc3ZnLmlkID0gJ21laV9vdXRwdXQnO1xuICAgIHRoaXMuc3ZnLmNsYXNzTGlzdC5hZGQoJ25lb24tY29udGFpbmVyJywgJ2FjdGl2ZS1wYWdlJyk7XG4gICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQodGhpcy5zdmcuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG4gICAgY29uc3Qgd2lkdGggPSBwYXJzZUludCh0aGlzLnN2Zy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpO1xuXG4gICAgdGhpcy5iZy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodC50b1N0cmluZygpKTtcbiAgICB0aGlzLmJnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3aWR0aC50b1N0cmluZygpKTtcblxuICAgIGNvbnN0IHsgdmlld0JveCB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoIXZpZXdCb3gpXG4gICAgICB0aGlzLmdyb3VwLnNldEF0dHJpYnV0ZSgndmlld0JveCcsICcwIDAgJyArIHdpZHRoICsgJyAnICsgaGVpZ2h0KTtcbiAgICBlbHNlXG4gICAgICB0aGlzLmdyb3VwLnNldEF0dHJpYnV0ZSgndmlld0JveCcsIHZpZXdCb3gpO1xuXG4gICAgdXBkYXRlSGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5yZXNldFRyYW5zZm9ybWF0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2tzLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRvIGEgY2VydGFpbiBwYWdlXG4gICAqIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIHBhZ2UsIHRoaXMgaXMgZXNzZW50aWFsbHkgYSB3cmFwcGVyIGZvciB1cGRhdGVTVkdcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhZ2UgKF9wYWdlOiBudW1iZXIsIF9kZWxheTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN2ZyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0UGFnZVNWRyh0aGlzLmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgIHRoaXMudXBkYXRlU1ZHKHN2Zyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY2FsbGJhY2sgdG8gdGhlIGxpc3Qgb2YgdGhvc2UgYmUgY2FsbGVkIHdoZW4gdGhlIHBhZ2UgdXBkYXRlcy5cbiAgICogQHBhcmFtIGNiIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKi9cbiAgYWRkVXBkYXRlQ2FsbGJhY2sgKGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYWxsYmFja3MucHVzaChjYik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdCBvZiBjYWxsYmFja3MgaWYgaXQgaXMgcGFydCBvZiB0aGUgbGlzdC5cbiAgICogQHBhcmFtIGNiIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVtb3ZlVXBkYXRlQ2FsbGJhY2sgKGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnVwZGF0ZUNhbGxiYWNrcy5maW5kSW5kZXgoKGVsZW0pID0+IHtcbiAgICAgIHJldHVybiBlbGVtID09PSBjYjtcbiAgICB9KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdHJhbnNmb3JtYXRpb25zIHRoYXQgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gdGhlIFNWRyB1cG9uIHVwZGF0ZS5cbiAgICovXG4gIHJlc2V0VHJhbnNmb3JtYXRpb25zICgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlQYW5lbC56b29tSGFuZGxlci5yZXN0b3JlVHJhbnNmb3JtYXRpb24oKTtcbiAgICBzZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyKCk7XG4gICAgc2V0QmdPcGFjaXR5RnJvbVNsaWRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSB6ZXJvLWluZGV4ZWQgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBhZ2UuIFRoaXMgd2lsbCBhbHdheXMgYmUgemVyby5cbiAgICovXG4gIGdldEN1cnJlbnRQYWdlICgpOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBVUkkgb2YgdGhlIHBhZ2UuXG4gICAqL1xuICBnZXRDdXJyZW50UGFnZVVSSSAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlVVJJO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBldmVudCBoYW5kbGVycyBmb3IgdGhlIHZpZXcgYW5kIGRpc3BsYXkgcGFuZWwuXG4gICAqL1xuICBzZXRWaWV3RXZlbnRIYW5kbGVycyAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ1NoaWZ0JzpcbiAgICAgICAgICBkMy5zZWxlY3QoJyNzdmdfZ3JvdXAnKS5vbignLmRyYWcnLCBudWxsKTtcbiAgICAgICAgICBkMy5zZWxlY3QoJyNzdmdfZ3JvdXAnKS5jYWxsKFxuICAgICAgICAgICAgZDMuZHJhZygpLm9uKCdzdGFydCcsIHRoaXMuZGlzcGxheVBhbmVsLnpvb21IYW5kbGVyLnN0YXJ0RHJhZy5iaW5kKHRoaXMuZGlzcGxheVBhbmVsLnpvb21IYW5kbGVyKSlcbiAgICAgICAgICAgICAgLm9uKCdkcmFnJywgdGhpcy5kaXNwbGF5UGFuZWwuem9vbUhhbmRsZXIuZHJhZ2dpbmcuYmluZCh0aGlzLmRpc3BsYXlQYW5lbC56b29tSGFuZGxlcikpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21laV9vdXRwdXQnKS5zZXRBdHRyaWJ1dGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZ0KSA9PiB7XG4gICAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgICAgY2FzZSAnU2hpZnQnOlxuICAgICAgICAgIGQzLnNlbGVjdCgnI3N2Z19ncm91cCcpLm9uKCcuZHJhZycsIG51bGwpO1xuICAgICAgICAgIGlmICh0aGlzLm5lb25WaWV3LmdldFVzZXJNb2RlKCkgIT09ICd2aWV3ZXInKSB7XG4gICAgICAgICAgICB0aGlzLm5lb25WaWV3Lk5ldW1lRWRpdC5zZXRTZWxlY3RMaXN0ZW5lcnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWlfb3V0cHV0Jykuc2V0QXR0cmlidXRlKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkMy5zZWxlY3QoJyNjb250YWluZXInKS5vbigndG91Y2hzdGFydCcsICgpID0+IHtcbiAgICAgIGlmIChkMy5ldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICB0aGlzLmRpc3BsYXlQYW5lbC56b29tSGFuZGxlci5zdGFydERyYWcoKTtcbiAgICAgICAgZDMuc2VsZWN0KCcjY29udGFpbmVyJykub24oJ3RvdWNobW92ZScsIHRoaXMuZGlzcGxheVBhbmVsLnpvb21IYW5kbGVyLmRyYWdnaW5nLmJpbmQodGhpcy5kaXNwbGF5UGFuZWwuem9vbUhhbmRsZXIpKTtcbiAgICAgICAgZDMuc2VsZWN0KCcjY29udGFpbmVyJykub24oJ3RvdWNoZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGQzLnNlbGVjdCgnI2NvbnRhaW5lcicpLm9uKCd0b3VjaG1vdmUnLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZDMuc2VsZWN0KCcjY29udGFpbmVyJykub24oJ3doZWVsJywgdGhpcy5kaXNwbGF5UGFuZWwuem9vbUhhbmRsZXIuc2Nyb2xsWm9vbS5iaW5kKHRoaXMuZGlzcGxheVBhbmVsLnpvb21IYW5kbGVyKSwgZmFsc2UpO1xuICAgIC8vIFVwZGF0ZSBoZWlnaHQgb2YgY29udGFpbmVyIGJhc2VkIG9uIHdpbmRvd1xuICAgIHdpbmRvdy5vbnJlc2l6ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKTtcbiAgICAgIGlmIChuZXdIZWlnaHQgPiBOdW1iZXIoY29udGFpbmVyLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpKSB7XG4gICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIG5ld0hlaWdodC50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhlIHBhZ2UuIFVzZWQgZm9yIGRvd25sb2Fkcy5cbiAgICovXG4gIGdldFBhZ2VOYW1lICgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5lb25WaWV3Lm5hbWU7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2luZ2xlVmlldyBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBzZXRTZXR0aW5ncyB9IGZyb20gJy4uL3V0aWxzL0xvY2FsU2V0dGluZ3MnO1xuXG5leHBvcnQgY2xhc3MgVmlld0JveCB7XG4gIC8vIHZpZUJveCBhdHRyaWJ1dGUgb2YgYW4gU1ZHIHZpZXdwb3J0OlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlL3ZpZXdCb3hcbiAgbWluWDogbnVtYmVyO1xuICBtaW5ZOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuXG4gIGltYWdlSGVpZ2h0OiBudW1iZXI7XG4gIGltYWdlV2lkdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIGltYWdlV2lkdGggLSBXaWR0aCBvZiB0aGUgY29udGFpbmVkIGltYWdlLlxuICAgKiBAcGFyYW0gaW1hZ2VIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGNvbnRhaW5lZCBpbWFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChpbWFnZVdpZHRoOiBudW1iZXIsIGltYWdlSGVpZ2h0OiBudW1iZXIpIHtcbiAgICB0aGlzLm1pblggPSAwO1xuICAgIHRoaXMubWluWSA9IDA7XG4gICAgdGhpcy53aWR0aCA9IGltYWdlV2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBpbWFnZUhlaWdodDtcblxuICAgIHRoaXMuaW1hZ2VXaWR0aCA9IGltYWdlV2lkdGg7XG4gICAgdGhpcy5pbWFnZUhlaWdodCA9IGltYWdlSGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgb2YgdGhlIHZpZXdCb3ggbWFudWFsbHkuXG4gICAqIEBwYXJhbSBtaW5YIC0gdG9wIGxlZnQgeC1jb29yZGluYXRlIG9mIFNWR1xuICAgKiBAcGFyYW0gbWluWSAtIHRvcCBsZWZ0IHktY29vcmRpbmF0ZSBvZiBTVkdcbiAgICogQHBhcmFtIHdpZHRoIC0gd2lkdGggb2YgU1ZHXG4gICAqIEBwYXJhbSBoZWlnaHQgLSBoZWlnaHQgb2YgU1ZHXG4gICAqL1xuICBzZXQgKG1pblg6IG51bWJlciwgbWluWTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWluWCA9IG1pblg7XG4gICAgdGhpcy5taW5ZID0gbWluWTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICAvKiogQHJldHVybnMgVmFsdWUgZm9yIHRoZSB2aWV3Qm94IHBhcmFtZXRlci4gKi9cbiAgZ2V0ICgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1pblgudG9TdHJpbmcoKSArICcgJyArIHRoaXMubWluWS50b1N0cmluZygpICsgJyAnICtcbiAgICAgIHRoaXMud2lkdGggKyAnICcgKyB0aGlzLmhlaWdodDtcbiAgfVxuXG4gIC8qKiBAcGFyYW0gayAtIEZhY3RvciB0byB6b29tIHRvLiAqL1xuICB6b29tVG8gKGs6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHpvb21IZWlnaHQgPSAodGhpcy5pbWFnZUhlaWdodCAvIGspO1xuICAgIGNvbnN0IHpvb21XaWR0aCA9ICh0aGlzLmltYWdlV2lkdGggLyBrKTtcblxuICAgIHRoaXMud2lkdGggPSB6b29tV2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSB6b29tSGVpZ2h0O1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIEN1cnJlbnQgem9vbSBmYWN0b3IuICovXG4gIGdldFpvb20gKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXaWR0aCAvIHRoaXMud2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlIHZpZXdwb3J0LlxuICAgKiBAcGFyYW0geERpZmYgLSBBbW91bnQgdG8gc2hpZnQgb24geC1heGlzLlxuICAgKiBAcGFyYW0geURpZmYgLSBBbW91bnQgdG8gc2hpZnQgb24geS1heGlzLlxuICAgKi9cbiAgdHJhbnNsYXRlICh4RGlmZjogbnVtYmVyLCB5RGlmZjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5taW5YICs9IHhEaWZmO1xuICAgIHRoaXMubWluWSArPSB5RGlmZjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgWm9vbUhhbmRsZXIge1xuICBkcmFnQ29vcmRpbmF0ZXM6IERPTVBvaW50O1xuICB2aWV3Qm94OiBWaWV3Qm94O1xuICBtYXRyaXg6IERPTU1hdHJpeDtcblxuICAvKipcbiAgICogUmVzZXQgdGhlIHpvb20gYW5kIHBhbiBvZiB0aGUgU1ZHIHZpZXdib3hcbiAgICovXG4gIHJlc2V0Wm9vbUFuZFBhbiAocmVzZXRTZXR0aW5ncyA9IHRydWUpOiB2b2lkIHtcbiAgICBjb25zdCBiZ2ltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgdGhpcy52aWV3Qm94ID0gbmV3IFZpZXdCb3gocGFyc2VJbnQoYmdpbWcuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKSwgcGFyc2VJbnQoYmdpbWcuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSkpO1xuXG4gICAgaWYgKHJlc2V0U2V0dGluZ3MpIHtcbiAgICAgIHRoaXMudXBkYXRlU1ZHVmlld0JveCgpO1xuICAgICAgc2V0U2V0dGluZ3MoeyB6b29tOiAxMDAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBrIC0gRmFjdG9yIHRvIHpvb20gdG8uXG4gICAqL1xuICB6b29tVG8gKGs6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0Vmlld0JveCgpO1xuICAgIHRoaXMudmlld0JveC56b29tVG8oayk7XG4gICAgdGhpcy51cGRhdGVTVkdWaWV3Qm94KCk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IHpvb206IE1hdGguZmxvb3IoayAqIDEwMCkgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlIHRoZSB2aWV3IGJveCBieSByZWxhdGl2ZSBjb29yZGluYXRlcy5cbiAgKiBAcGFyYW0geERpZmYgLSBBbW91bnQgdG8gc2hpZnQgb24geC1heGlzLlxuICAqIEBwYXJhbSB5RGlmZiAtIEFtb3VudCB0byBzaGlmdCBvbiB5LWF4aXMuXG4gICovXG4gIHRyYW5zbGF0ZSAoeERpZmY6IG51bWJlciwgeURpZmY6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0Vmlld0JveCgpO1xuICAgIHRoaXMudmlld0JveC50cmFuc2xhdGUoeERpZmYsIHlEaWZmKTtcbiAgICB0aGlzLnVwZGF0ZVNWR1ZpZXdCb3goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSB2aWV3IGJveCB0byBpdHMgcG9zaXRpb24gYmVmb3JlIHRoZSBlZGl0b3IgYWN0aW9uLlxuICAgKi9cbiAgcmVzdG9yZVRyYW5zZm9ybWF0aW9uICgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3Qm94ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVzZXRab29tQW5kUGFuKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTVkdWaWV3Qm94KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmlldyBib3ggb2YgdGhlIFNWRy5cbiAgICovXG4gIHNldFZpZXdCb3ggKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdCb3ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmdpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgICAgdGhpcy52aWV3Qm94ID0gbmV3IFZpZXdCb3gocGFyc2VJbnQoYmdpbWcuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKSwgcGFyc2VJbnQoYmdpbWcuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSkpO1xuICAgIH1cbiAgICBjb25zdCByYXdWaWV3Qm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Z19ncm91cCcpXG4gICAgICAuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JylcbiAgICAgIC5zcGxpdCgnICcpO1xuICAgIHRoaXMudmlld0JveC5zZXQoXG4gICAgICBwYXJzZUludChyYXdWaWV3Qm94WzBdKSxcbiAgICAgIHBhcnNlSW50KHJhd1ZpZXdCb3hbMV0pLFxuICAgICAgcGFyc2VJbnQocmF3Vmlld0JveFsyXSksXG4gICAgICBwYXJzZUludChyYXdWaWV3Qm94WzNdKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSB2aWV3Qm94IGF0dHJpYnV0ZSBvZiBzdmdfZ3JvdXBcbiAgICovXG4gIHVwZGF0ZVNWR1ZpZXdCb3ggKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdCb3hTdHJpbmcgPSB0aGlzLnZpZXdCb3guZ2V0KCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Z19ncm91cCcpLnNldEF0dHJpYnV0ZSgndmlld0JveCcsIHZpZXdCb3hTdHJpbmcpO1xuICAgIHNldFNldHRpbmdzKHsgdmlld0JveDogdmlld0JveFN0cmluZyB9KTtcbiAgfVxuXG4gIHN0YXJ0RHJhZyAoKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZnX2dyb3VwJykgYXMgdW5rbm93biBhcyBTVkdTVkdFbGVtZW50O1xuICAgIHRoaXMuZHJhZ0Nvb3JkaW5hdGVzID0gZ3JvdXAuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICBpZiAoZDMuZXZlbnQudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7XG4gICAgICAvLyBJZiBkcmFnIGlzIHRyaWdnZXJlZCBieSBhIHRvdWNoIGV2ZW50XG4gICAgICB0aGlzLmRyYWdDb29yZGluYXRlcy54ID0gZDMuZXZlbnQudG91Y2hlc1swXS5zY3JlZW5YO1xuICAgICAgdGhpcy5kcmFnQ29vcmRpbmF0ZXMueSA9IGQzLmV2ZW50LnRvdWNoZXNbMF0uc2NyZWVuWTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIHRyaWdnZXJlZCBieSBhIG1vdXNlIGNsaWNrXG4gICAgICB0aGlzLmRyYWdDb29yZGluYXRlcy54ID0gZDMuZXZlbnQueDtcbiAgICAgIHRoaXMuZHJhZ0Nvb3JkaW5hdGVzLnkgPSBkMy5ldmVudC55O1xuICAgIH1cblxuICAgIHRoaXMubWF0cml4ID0gZ3JvdXAuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpO1xuICB9XG5cbiAgZHJhZ2dpbmcgKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Z19ncm91cCcpIGFzIHVua25vd24gYXMgU1ZHU1ZHRWxlbWVudDtcbiAgICBjb25zdCBuZXdDb29yZGluYXRlcyA9IGdyb3VwLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgLy8gU2FtZSBraW5kIG9mIGNoZWNraW5nIGFzIGluIHN0YXJ0RHJhZ1xuICAgIGlmIChkMy5ldmVudC50eXBlID09PSAndG91Y2htb3ZlJykge1xuICAgICAgbmV3Q29vcmRpbmF0ZXMueCA9IGQzLmV2ZW50LnRvdWNoZXNbMF0uc2NyZWVuWDtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnkgPSBkMy5ldmVudC50b3VjaGVzWzBdLnNjcmVlblk7XG4gICAgfSBlbHNlIGlmIChkMy5ldmVudC50eXBlID09PSAnd2hlZWwnICYmIGQzLmV2ZW50LnNoaWZ0S2V5ID09PSBmYWxzZSkge1xuICAgICAgaWYgKHRoaXMubWF0cml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tYXRyaXggPSBncm91cC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmFnQ29vcmRpbmF0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmRyYWdDb29yZGluYXRlcyA9IGdyb3VwLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRyYWdDb29yZGluYXRlcy54ID0gZDMuZXZlbnQueDtcbiAgICAgIHRoaXMuZHJhZ0Nvb3JkaW5hdGVzLnkgPSBkMy5ldmVudC55O1xuICAgICAgbmV3Q29vcmRpbmF0ZXMueCA9IHRoaXMuZHJhZ0Nvb3JkaW5hdGVzLnggLSBkMy5ldmVudC5kZWx0YVg7XG4gICAgICBuZXdDb29yZGluYXRlcy55ID0gdGhpcy5kcmFnQ29vcmRpbmF0ZXMueSAtIGQzLmV2ZW50LmRlbHRhWTtcbiAgICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnggPSBkMy5ldmVudC54O1xuICAgICAgbmV3Q29vcmRpbmF0ZXMueSA9IGQzLmV2ZW50Lnk7XG4gICAgfVxuICAgIGNvbnN0IG5ld1RyYW5zZm9ybSA9IG5ld0Nvb3JkaW5hdGVzLm1hdHJpeFRyYW5zZm9ybSh0aGlzLm1hdHJpeCk7XG4gICAgY29uc3QgZHJhZ1RyYW5zZm9ybSA9IHRoaXMuZHJhZ0Nvb3JkaW5hdGVzLm1hdHJpeFRyYW5zZm9ybSh0aGlzLm1hdHJpeCk7XG4gICAgdGhpcy50cmFuc2xhdGUoLW5ld1RyYW5zZm9ybS54ICsgZHJhZ1RyYW5zZm9ybS54LCAtbmV3VHJhbnNmb3JtLnkgKyBkcmFnVHJhbnNmb3JtLnkpO1xuICAgIHRoaXMuZHJhZ0Nvb3JkaW5hdGVzID0gbmV3Q29vcmRpbmF0ZXM7XG4gIH1cblxuICBzY3JvbGxab29tICgpOiB2b2lkIHtcbiAgICBpZiAoZDMuZXZlbnQudHlwZSAhPT0gJ3doZWVsJykgcmV0dXJuO1xuICAgIGlmICghZDMuZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21TbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0Vmlld0JveCgpO1xuICAgIGNvbnN0IGsgPSB0aGlzLnZpZXdCb3guZ2V0Wm9vbSgpO1xuICAgIGxldCBuZXdLID0gayAtIGQzLmV2ZW50LmRlbHRhWCAvIDEwMDtcbiAgICBpZiAobmV3SyA8IHBhcnNlSW50KHNsaWRlci5nZXRBdHRyaWJ1dGUoJ21pbicpKSAvIDEwMCkgbmV3SyA9IDAuMjU7XG4gICAgaWYgKG5ld0sgPiBwYXJzZUludChzbGlkZXIuZ2V0QXR0cmlidXRlKCdtYXgnKSkgLyAxMDApIG5ld0sgPSA0O1xuICAgIHRoaXMuem9vbVRvKG5ld0spO1xuXG4gICAgLy8gVXBkYXRlIHpvb20gc2xpZGVyXG4gICAgc2xpZGVyLnZhbHVlID0gKG5ld0sgKiAxMDApLnRvU3RyaW5nKCk7XG4gICAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6b29tT3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQpLnZhbHVlID0gU3RyaW5nKE1hdGgucm91bmQobmV3SyAqIDEwMCkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFpvb21IYW5kbGVyIGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IGJpbmRJbnNlcnRUYWJzLCBpbml0SW5zZXJ0RWRpdENvbnRyb2xzLCBpbml0U2VsZWN0aW9uQnV0dG9ucyB9IGZyb20gJy4vQ29udHJvbHMnO1xuaW1wb3J0ICogYXMgU2VsZWN0IGZyb20gJy4uL3V0aWxzL1NlbGVjdCc7XG5pbXBvcnQgSW5zZXJ0SGFuZGxlciBmcm9tICcuL0luc2VydEhhbmRsZXInO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi9TZWxlY3RPcHRpb25zJztcbmltcG9ydCB7IHNldEhpZ2hsaWdodFNlbGVjdGlvbkNvbnRyb2xzIH0gZnJvbSAnLi4vRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scyc7XG5pbXBvcnQgRHJhZ0hhbmRsZXIgZnJvbSAnLi4vdXRpbHMvRHJhZ0hhbmRsZXInO1xuaW1wb3J0IHsgTmV1bWVFZGl0SW50ZXJmYWNlIH0gZnJvbSAnLi4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgKiBhcyBDb250ZW50cyBmcm9tICcuL0NvbnRlbnRzJztcbmltcG9ydCB7IHVuZG9SZWRvUGFuZWwgfSBmcm9tICcuLi91dGlscy9FZGl0Q29udGVudHMnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCB7IFVzZXJUeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuXG5jbGFzcyBEaXZhRWRpdCBpbXBsZW1lbnRzIE5ldW1lRWRpdEludGVyZmFjZSB7XG4gIG5lb25WaWV3OiBOZW9uVmlldztcbiAgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyO1xuICBpbnNlcnRIYW5kbGVyOiBJbnNlcnRIYW5kbGVyO1xuICBjb25zdHJ1Y3RvciAobmVvblZpZXc6IE5lb25WaWV3KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMuaW5pdEVkaXRNb2RlKCk7XG4gIH1cblxuICBpbml0RWRpdE1vZGUgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnNlcnRfY29udHJvbHMnKS5pbm5lckhUTUwgKz0gQ29udGVudHMuaW5zZXJ0Q29udHJvbHNQYW5lbDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdF9jb250cm9scycpLmlubmVySFRNTCArPSBDb250ZW50cy5lZGl0Q29udHJvbHNQYW5lbDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndW5kb1JlZG9fY29udHJvbHMnKS5pbm5lckhUTUwgPSB1bmRvUmVkb1BhbmVsO1xuXG4gICAgdGhpcy5kcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnLmFjdGl2ZS1wYWdlID4gc3ZnJyk7XG4gICAgdGhpcy5pbnNlcnRIYW5kbGVyID0gbmV3IEluc2VydEhhbmRsZXIodGhpcy5uZW9uVmlldywgJy5hY3RpdmUtcGFnZSA+IHN2ZycpO1xuICAgIGJpbmRJbnNlcnRUYWJzKHRoaXMuaW5zZXJ0SGFuZGxlcik7XG4gICAgY29uc3QgeyBpbnNlcnRUYWIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5zZXJ0VGFiKS5jbGljaygpO1xuICAgIFNlbGVjdC5zZXRTZWxlY3RIZWxwZXJPYmplY3RzKHRoaXMubmVvblZpZXcsIHRoaXMuZHJhZ0hhbmRsZXIpO1xuICAgIHRoaXMuc2V0U2VsZWN0TGlzdGVuZXJzKCk7XG4gICAgU2VsZWN0T3B0aW9ucy5pbml0TmVvblZpZXcodGhpcy5uZW9uVmlldyk7XG4gICAgaW5pdEluc2VydEVkaXRDb250cm9scygpO1xuICAgIFNlbGVjdC5zZXRTZWxlY3RTdHJva2VXaWR0aCgxKTtcbiAgICBpbml0U2VsZWN0aW9uQnV0dG9ucygpO1xuICAgIHNldEhpZ2hsaWdodFNlbGVjdGlvbkNvbnRyb2xzKCk7XG4gICAgdGhpcy5uZW9uVmlldy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMuc2V0U2VsZWN0TGlzdGVuZXJzLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlciBtb2RlIHRoYXQgTmVvbiBpcyBpbi4gRWl0aGVyIGluc2VydCwgZWRpdCwgb3Igdmlld2VyLlxuICAgKiBAcmV0dXJucyB7VXNlclR5cGV9XG4gICAqL1xuICBnZXRVc2VyTW9kZSAoKTogVXNlclR5cGUge1xuICAgIGNvbnN0IHsgdXNlck1vZGUgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIHVzZXJNb2RlO1xuICB9XG5cbiAgc2V0U2VsZWN0TGlzdGVuZXJzICgpOiB2b2lkIHtcbiAgICBTZWxlY3QuY2xpY2tTZWxlY3QoJy5hY3RpdmUtcGFnZSA+IHN2ZyA+IHN2ZywgLmFjdGl2ZS1wYWdlID4gc3ZnID4gc3ZnIHVzZSwgLmFjdGl2ZS1wYWdlID4gc3ZnID4gc3ZnIHJlY3QnKTtcbiAgICBTZWxlY3QuZHJhZ1NlbGVjdCgnLmFjdGl2ZS1wYWdlIHN2ZycpO1xuICB9XG59XG5cbmV4cG9ydCB7IERpdmFFZGl0IGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IGJpbmRJbnNlcnRUYWJzLCBpbml0SW5zZXJ0RWRpdENvbnRyb2xzLCBpbml0U2VsZWN0aW9uQnV0dG9ucyB9IGZyb20gJy4vQ29udHJvbHMnO1xuaW1wb3J0IHsgc2V0SGlnaGxpZ2h0T3B0aW9uIH0gZnJvbSAnLi4vRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scyc7XG5pbXBvcnQgeyBpbml0VW5kb1JlZG9QYW5lbCB9IGZyb20gJy4uL3V0aWxzL0VkaXRDb250cm9scyc7XG5pbXBvcnQgKiBhcyBTZWxlY3QgZnJvbSAnLi4vdXRpbHMvU2VsZWN0JztcbmltcG9ydCBJbnNlcnRIYW5kbGVyIGZyb20gJy4vSW5zZXJ0SGFuZGxlcic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0ICogYXMgU2VsZWN0T3B0aW9ucyBmcm9tICcuL1NlbGVjdE9wdGlvbnMnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4uL3V0aWxzL0RyYWdIYW5kbGVyJztcbmltcG9ydCB7IE5ldW1lRWRpdEludGVyZmFjZSB9IGZyb20gJy4uL0ludGVyZmFjZXMnO1xuaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgeyB1bmRvUmVkb1BhbmVsIH0gZnJvbSAnLi4vdXRpbHMvRWRpdENvbnRlbnRzJztcbmltcG9ydCB7IGluaXROYXZiYXIgfSBmcm9tICcuLi91dGlscy9FZGl0Q29udHJvbHMnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCB7IFVzZXJUeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuXG4vKipcbiAqIEFuIEVkaXQgTW9kdWxlIGZvciBhIHNpbmdsZSBwYWdlIG9mIGEgbWFudXNjcmlwdC5cbiAqIFdvcmtzIHdpdGggdGhlIFNpbmdsZVZpZXcgbW9kdWxlLlxuICovXG5jbGFzcyBTaW5nbGVFZGl0TW9kZSBpbXBsZW1lbnRzIE5ldW1lRWRpdEludGVyZmFjZSB7XG4gIG5lb25WaWV3OiBOZW9uVmlldztcbiAgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyO1xuICBpbnNlcnRIYW5kbGVyOiBJbnNlcnRIYW5kbGVyO1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGFuIEVkaXRNb2RlIG9iamVjdC5cbiAgICogQHBhcmFtIHtOZW9uVmlld30gbmVvblZpZXcgLSBUaGUgTmVvblZpZXcgcGFyZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldykge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLmluaXRFZGl0TW9kZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgRWRpdCBtb2RlIChkZWZhdWx0KS5cbiAgICovXG4gIGluaXRFZGl0TW9kZSAoKTogdm9pZCB7XG5cbiAgICBpbml0TmF2YmFyKHRoaXMubmVvblZpZXcpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnNlcnRfY29udHJvbHMnKS5pbm5lckhUTUwgKz0gQ29udGVudHMuaW5zZXJ0Q29udHJvbHNQYW5lbDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdF9jb250cm9scycpLmlubmVySFRNTCArPSBDb250ZW50cy5lZGl0Q29udHJvbHNQYW5lbDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndW5kb1JlZG9fY29udHJvbHMnKS5pbm5lckhUTUwgPSB1bmRvUmVkb1BhbmVsO1xuXG4gICAgdGhpcy5kcmFnSGFuZGxlciA9IG5ldyBEcmFnSGFuZGxlcih0aGlzLm5lb25WaWV3LCAnI3N2Z19ncm91cCcpO1xuICAgIHRoaXMuaW5zZXJ0SGFuZGxlciA9IG5ldyBJbnNlcnRIYW5kbGVyKHRoaXMubmVvblZpZXcsICcjc3ZnX2dyb3VwJyk7XG4gICAgYmluZEluc2VydFRhYnModGhpcy5pbnNlcnRIYW5kbGVyKTtcbiAgICBjb25zdCB7IGluc2VydFRhYiB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnNlcnRUYWIpLmNsaWNrKCk7XG4gICAgU2VsZWN0LnNldFNlbGVjdEhlbHBlck9iamVjdHModGhpcy5uZW9uVmlldywgdGhpcy5kcmFnSGFuZGxlcik7XG4gICAgdGhpcy5zZXRTZWxlY3RMaXN0ZW5lcnMoKTtcblxuICAgIFNlbGVjdE9wdGlvbnMuaW5pdE5lb25WaWV3KHRoaXMubmVvblZpZXcpO1xuICAgIGluaXRJbnNlcnRFZGl0Q29udHJvbHMoKTtcbiAgICBpbml0U2VsZWN0aW9uQnV0dG9ucygpO1xuICAgIGluaXRVbmRvUmVkb1BhbmVsKHRoaXMubmVvblZpZXcpO1xuICAgIHNldEhpZ2hsaWdodE9wdGlvbignc2VsZWN0aW9uJyk7XG4gICAgdGhpcy5uZW9uVmlldy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMuc2V0U2VsZWN0TGlzdGVuZXJzLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlciBtb2RlIHRoYXQgTmVvbiBpcyBpbi4gRWl0aGVyIGluc2VydCwgZWRpdCwgb3Igdmlld2VyLlxuICAgKiBAcmV0dXJucyB7VXNlclR5cGV9XG4gICAqL1xuICBnZXRVc2VyTW9kZSAoKTogVXNlclR5cGUge1xuICAgIGNvbnN0IHsgdXNlck1vZGUgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIHVzZXJNb2RlO1xuICB9XG5cbiAgc2V0U2VsZWN0TGlzdGVuZXJzICgpOiB2b2lkIHtcbiAgICBTZWxlY3QuY2xpY2tTZWxlY3QoJyNzdmdfZ3JvdXAsICNzdmdfZ3JvdXAgdXNlLCAjc3ZnX2dyb3VwIHJlY3QnKTtcbiAgICBTZWxlY3QuZHJhZ1NlbGVjdCgnI3N2Z19ncm91cCcpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpbmdsZUVkaXRNb2RlIGFzIGRlZmF1bHQgfTtcbiIsIi8qKiBAbW9kdWxlIEluZm9Nb2R1bGUgKi9cblxuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4vTmVvblZpZXcnO1xuaW1wb3J0IHsgSW5mb0ludGVyZmFjZSB9IGZyb20gJy4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBDbGVmQXR0cmlidXRlcyB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MsIHNldFNldHRpbmdzIH0gZnJvbSAnLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCB7IHVwZGF0ZURpc3BsYXlBbGxCdG4gfSBmcm9tICcuL0Rpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMnO1xuXG4vKipcbiAqIE1hcCBvZiBjb250b3VycyB0byBuZXVtZSBuYW1lcy5cbiAqL1xuY29uc3QgbmV1bWVHcm91cHMgPSBuZXcgTWFwKFxuICBbWycnLCAnUHVuY3R1bSddLCBbJ3UnLCAnUGVzJ10sIFsnZCcsICdDbGl2aXMnXSwgWyd1dScsICdTY2FuZGljdXMnXSwgWyd1ZCcsICdUb3JjdWx1cyddLCBbJ2R1JywgJ1BvcnJlY3R1cyddLCBbJ3MnLCAnRGlzdHJvcGhhJ10sIFsnc3MnLCAnVHJpc3RvcGhhJ10sXG4gICAgWydzZCcsICdQcmVzc3VzJ10sIFsnZGQnLCAnQ2xpbWFjdXMnXSwgWydkZHUnLCAnQ2xpbWFjdXNSZXN1cGludXMnXSwgWyd1ZHUnLCAnVG9yY3VsdXNSZXN1cGludXMnXSwgWydkdWQnLCAnUG9ycmVjdHVzRmxleHVzJ10sXG4gICAgWyd1ZGQnLCAnUGVzU3VicHVuY3RpcyddLCBbJ3V1ZCcsICdTY2FuZGljdXNGbGV4dXMnXSwgWyd1dWRkJywgJ1NjYW5kaWN1c1N1YnB1bmN0aXMnXSwgWydkdWRkJywgJ1BvcnJlY3R1c1N1YnB1bmN0aXMnXV1cbik7XG5cbmZ1bmN0aW9uIHN0YXJ0SW5mb1Zpc2liaWxpdHkgKCk6IHZvaWQge1xuICBjb25zdCBlbGVtZW50SW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbGVtZW50X2luZm8nKTtcbiAgZWxlbWVudEluZm8uaW5uZXJIVE1MID1cbiAgICBgPGRpdiBjbGFzcz1cImluZm8tYnViYmxlLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImluZm8tYnViYmxlLWhlYWRlclwiPkVsZW1lbnQgSW5mbzwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImluZm8tYnViYmxlLWJvZHlcIj48aT5Ib3ZlciBvdmVyIGFueSBlbGVtZW50IHRvIHNlZSBpdHMgbWV0YWRhdGE8L2k+PC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VsZW1lbnRfaW5mbycpLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZScpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBpbmZvQm94XG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUluZm9WaXNpYmlsaXR5ICgpOiB2b2lkIHtcbiAgY29uc3QgZWxlbWVudEluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWxlbWVudF9pbmZvJyk7XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlJbmZvJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgXG4gIC8vIHNhdmUgc2V0dGluZyB0byBsb2NhbFN0b3JhZ2VcbiAgc2V0U2V0dGluZ3MoeyBkaXNwbGF5SW5mbzogZGlzcGxheUluZm8uY2hlY2tlZCB9KTtcblxuICBpZiAoZGlzcGxheUluZm8uY2hlY2tlZCkge1xuICAgIGVsZW1lbnRJbmZvLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJyk7XG4gICAgLy8gc2Nyb2xsIG5ldW1lIGluZm8gaW50byB2aWV3XG4gICAgLy9lbGVtZW50SW5mby5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50SW5mby5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUnKTtcbiAgfVxuICB1cGRhdGVEaXNwbGF5QWxsQnRuKCk7XG59XG5cbi8qKlxuICogTG9hZCBkaXNwbGF5SW5mbyBzZXR0aW5ncyBmcm9tIGxvY2FsU3RvcmFnZVxuICovXG5mdW5jdGlvbiBsb2FkU2V0dGluZ3MgKCk6IHZvaWQge1xuICBjb25zdCB7IGRpc3BsYXlJbmZvIH0gPSBnZXRTZXR0aW5ncygpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjZGlzcGxheUluZm8nKS5jaGVja2VkID0gZGlzcGxheUluZm87XG59XG5cbi8qKlxuICogU2V0IGxpc3RlbmVyIG9uIGluZm8gdmlzaWJpbGl0eSBjaGVja2JveC5cbiAqL1xuZnVuY3Rpb24gc2V0SW5mb0NvbnRyb2xzICgpOiB2b2lkIHtcbiAgc3RhcnRJbmZvVmlzaWJpbGl0eSgpO1xuICBsb2FkU2V0dGluZ3MoKTtcbiAgdXBkYXRlSW5mb1Zpc2liaWxpdHkoKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlJbmZvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1cGRhdGVJbmZvVmlzaWJpbGl0eSk7XG59XG5cbi8qKlxuICogQ2xhc3MgdGhhdCBtYW5hZ2VzIGdldHRpbmcgaW5mb3JtYXRpb24gZm9yIGVsZW1lbnRzIGluIE5lb24gZnJvbSBWZXJvdmlvLlxuICovXG5jbGFzcyBJbmZvTW9kdWxlIGltcGxlbWVudHMgSW5mb0ludGVyZmFjZSB7XG4gIHByaXZhdGUgbmVvblZpZXc6IE5lb25WaWV3O1xuICBpc0hvdmVyaW5nQ2hpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgY29uc3RydWN0b3IgZm9yIGFuIEluZm9Nb2R1bGUuXG4gICAqIEBwYXJhbSB7TmVvblZpZXd9IG5lb25WaWV3IC0gVGhlIE5lb25WaWV3IHBhcmVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgLy8gQWRkIGluZm8gYm94IGVuYWJsZS9kaXNhYmxlIGNoZWNrIGJveFxuICAgIGNvbnN0IGNoZWNrYm94ZXNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1zaW5nbGUtY29udGFpbmVyJyk7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLmNsYXNzTGlzdC5hZGQoJ2NoZWNrYm94LWNvbnRhaW5lcicsICdzaWRlLXBhbmVsLWJ0bicpO1xuICAgIGxhYmVsLnRleHRDb250ZW50ID0gJ0luZm8nO1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnB1dC5pZCA9ICdkaXNwbGF5SW5mbyc7XG4gICAgaW5wdXQuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTtcbiAgICBpbnB1dC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBpbnB1dC5jaGVja2VkID0gZmFsc2U7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgIGNoZWNrYm94ZXNDb250YWluZXIucHJlcGVuZChsYWJlbCk7XG5cbiAgICB0aGlzLm5lb25WaWV3LnZpZXcuYWRkVXBkYXRlQ2FsbGJhY2sodGhpcy5yZXNldEluZm9MaXN0ZW5lcnMuYmluZCh0aGlzKSk7XG4gICAgc2V0SW5mb0NvbnRyb2xzKCk7XG4gICAgdGhpcy5yZXNldEluZm9MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbGlzdGVuZXJzIGZvciB0aGUgSW5mb01vZHVsZS5cbiAgICogVHJpZ2dlciBhY3Rpb24gb24gbW91c2VvdmVyIG9mIHNwZWNpZmljIG11c2ljYWwgZWxlbWVudCBjbGFzc2VzLlxuICAgKi9cbiAgaW5mb0xpc3RlbmVycyAoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FjdGl2ZS1wYWdlJylbMF1cbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZSwuY3VzdG9zLC5jbGVmLC5hY2NpZCwuZGl2TGluZSwuc3RhZmYnKVxuICAgICAgICAuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFub2RlLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkgdGhpcy5pc0hvdmVyaW5nQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbmZvKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FjdGl2ZS1wYWdlJylbMF1cbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZSwuY3VzdG9zLC5jbGVmLC5hY2NpZCwuZGl2TGluZScpXG4gICAgICAgIC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNIb3ZlcmluZ0NoaWxkID0gZmFsc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBsaXN0ZW5lcnMgZm9yIHRoZSBJbmZvTW9kdWxlLlxuICAgKi9cbiAgc3RvcExpc3RlbmVycyAoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lLC5jdXN0b3MsLmNsZWYsLmFjY2lkLC5kaXZMaW5lLC5zdGFmZicpLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMudXBkYXRlSW5mby5iaW5kKHRoaXMpKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUsIC5jdXN0b3MsIC5jbGVmLCAuYWNjaWQsIC5kaXZMaW5lJykuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0hvdmVyaW5nQ2hpbGQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RhcnQgbGlzdGVuZXJzIGZvciB0aGUgSW5mb01vZHVsZS5cbiAgICovXG4gIHJlc2V0SW5mb0xpc3RlbmVycyAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5pbmZvTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVwZGF0ZWQgaW5mbyBmb3IgdGhlIGNhbGxpbmcgZWxlbWVudCBiYXNlZCBvbiBpdHMgZWxlbWVudCB0eXBlLlxuICAgKiBNYWtlcyBjYWxscyB0byBOZW9uQ29yZSB0byBnZXQgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeS5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUluZm8gKGV2ZW50OiBNb3VzZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEZvciBub3csIHNpbmNlIENsZWZzIGRvIG5vdCBoYXZlIHRoZWlyIG93biBlbGVtZW50IHRhZyBpbiBtZWk0LCB0aGVyZSBpcyBub3QgYSB3YXkgdG8gc2VsZWN0IHRoZSA8Zz4gZWxlbWVudFxuICAvLyBTbyB3ZSB3aWxsIHNpbXBseSByZXR1cm4gaWYgSUQgZG9lcyBub3QgZXhpc3QgZm9yIG5vd1xuICAgIGNvbnN0IGlkID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkO1xuICAgIGlmIChpZCA9PT0gJycpIHtcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VsZW1lbnRfaW5mbycpLmNoaWxkcmVuKS5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCdObyBpZCEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGNvbnN0IGNsYXNzUmUgPSAvbmV1bWV8Y2xlZnxjdXN0b3N8c3RhZmZ8YWNjaWR8ZGl2TGluZS87XG4gICAgY29uc3QgZWxlbWVudENsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykubWF0Y2goY2xhc3NSZSlbMF07XG4gICAgbGV0IGJvZHkgPSAnJztcbiAgICBsZXQgYXR0cmlidXRlczogQXR0cmlidXRlcztcblxuICAgIC8vIEdldHMgdGhlIHBpdGNoZXMgZGVwZW5kaW5nIG9uIGVsZW1lbnQgdHlwZSBhbmRcbiAgICBzd2l0Y2ggKGVsZW1lbnRDbGFzcykge1xuICAgICAgY2FzZSAnbmV1bWUnOiB7XG4gICAgICAgIC8vIFNlbGVjdCBuZXVtZSBjb21wb25lbnRzIG9mIHNlbGVjdGVkIG5ldW1lXG4gICAgICAgIGNvbnN0IG5jcyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5jJykgYXMgTm9kZUxpc3RPZjxTVkdHcmFwaGljc0VsZW1lbnQ+O1xuICAgICAgICBpZiAobmNzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGF0dHI6IEF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLm5lb25WaWV3LmdldEVsZW1lbnRBdHRyKG5jc1swXS5pZCwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgICAgICAgIGlmIChhdHRyLmN1cnZlID09PSAnYScgfHwgYXR0ci5jdXJ2ZSA9PT0gJ2MnKSB7XG4gICAgICAgICAgICBsZXQgcGl0Y2hlcyA9IGF3YWl0IHRoaXMuZ2V0UGl0Y2hlcyhuY3MpO1xuXG4gICAgICAgICAgICBwaXRjaGVzID0gcGl0Y2hlcy50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGJvZHkgPSAnU2hhcGU6IExpcXVlc2NlbnQnICsgJ1xcclxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnUGl0Y2goZXMpOiAnICsgcGl0Y2hlcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250b3VyID0gYXdhaXQgdGhpcy5nZXRDb250b3VyKG5jcyk7XG4gICAgICAgIGlmIChuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29uc3QgYXR0cjogQXR0cmlidXRlcyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIobmNzWzBdLmlkLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSk7XG4gICAgICAgICAgaWYoYXR0ci50aWx0ID09PSAncycpIHtcbiAgICAgICAgICAgIGxldCBwaXRjaGVzID0gYXdhaXQgdGhpcy5nZXRQaXRjaGVzKG5jcyk7XG5cbiAgICAgICAgICAgIHBpdGNoZXMgPSBwaXRjaGVzLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgYm9keSA9ICdTaGFwZTogVmlyZ2EgXFxyXFxuJyAgK1xuICAgICAgICAgICAgICAgICAgICAnUGl0Y2goZXMpOiAnICsgcGl0Y2hlcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmKGF0dHIudGlsdCA9PT0gJ24nKXtcbiAgICAgICAgICAgIGxldCBwaXRjaGVzID0gYXdhaXQgdGhpcy5nZXRQaXRjaGVzKG5jcyk7XG5cbiAgICAgICAgICAgIHBpdGNoZXMgPSBwaXRjaGVzLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgYm9keSA9ICdTaGFwZTogUmV2ZXJzZWQgVmlyZ2EgXFxyXFxuJyAgK1xuICAgICAgICAgICAgICAgICAgICAnUGl0Y2goZXMpOiAnICsgcGl0Y2hlcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udG91ciA9PT0gJ0NsaXZpcycpIHtcbiAgICAgICAgICBjb25zdCBhdHRyOiBBdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5uZW9uVmlldy5nZXRFbGVtZW50QXR0cihuY3NbMF0uaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICAgICAgICBpZiAoYXR0ci5saWdhdGVkKSB7XG4gICAgICAgICAgICBjb250b3VyID0gJ0xpZ2F0dXJlJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBpdGNoZXMgPSBhd2FpdCB0aGlzLmdldFBpdGNoZXMobmNzKTtcblxuICAgICAgICBwaXRjaGVzID0gcGl0Y2hlcy50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgYm9keSA9ICdTaGFwZTogJyArIChjb250b3VyID09PSB1bmRlZmluZWQgPyAnQ29tcG91bmQnIDogY29udG91cikgKyAnXFxyXFxuJyArXG4gICAgICAgICAgICAgICAgJ1BpdGNoKGVzKTogJyArIHBpdGNoZXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY3VzdG9zJzoge1xuICAgICAgICBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5uZW9uVmlldy5nZXRFbGVtZW50QXR0cihpZCwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgICAgICBib2R5ICs9ICdQaXRjaDogJyArIChhdHRyaWJ1dGVzWydwbmFtZSddKS50b1VwcGVyQ2FzZSgpICsgYXR0cmlidXRlc1snb2N0J107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnYWNjaWQnOiB7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLm5lb25WaWV3LmdldEVsZW1lbnRBdHRyKGlkLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSk7XG4gICAgICAgIGxldCB0eXBlID0gJyc7XG4gICAgICAgIGlmICgoYXR0cmlidXRlc1snYWNjaWQnXSkudG9VcHBlckNhc2UoKSA9PSAnRicpe1xuICAgICAgICAgIHR5cGUgPSAnRmxhdCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZigoYXR0cmlidXRlc1snYWNjaWQnXSkudG9VcHBlckNhc2UoKSA9PSAnTicpe1xuICAgICAgICAgIHR5cGUgPSAnTmF0dXJhbCc7XG4gICAgICAgIH1cbiAgICAgICAgYm9keSArPSAnQWNjaWQgVHlwZTogJyArIHR5cGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY2xlZic6IHtcbiAgICAgICAgY29uc3QgYXR0ciA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKSBhcyBDbGVmQXR0cmlidXRlcztcblxuICAgICAgICAvLyBJZiBjbGVmIGhhcyBiZWVuIGRpc3BsYWNlZCwgZm9ybWF0IGFuZCBzaG93IHRoZSBkaXNwbGFjZW1lbnQgYXNcbiAgICAgICAgLy8gbnVtYmVyIG9mIG9jdGF2ZXMgbm90IG51bWJlciBvZiBmdWxsIHN0ZXBzXG4gICAgICAgIGlmIChhdHRyWydkaXMucGxhY2UnXSAmJiBhdHRyLmRpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQ29tYmluZSBhbmQgZm9ybWF0IGBkaXMucGxhY2VgIGFuZCBgZGlzYDpcbiAgICAgICAgICAvLyBFLmcuLCBmb3JtYXQoJ2Fib3ZlJywgOCkgPT4gJysxJ1xuICAgICAgICAgIC8vIEUuZy4sIGZvcm1hdCgnYmVsb3cnLCAyMikgPT4gJy0yMidcbiAgICAgICAgICBjb25zdCBmb3JtYXQgPSAoZGlzcGxhY2U6IHN0cmluZywgZGlzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IGRpc3BsYWNlID09PSAnYWJvdmUnID8gJysnIDogJy0nO1xuICAgICAgICAgICAgY29uc3Qgb2N0YXZlID0gU3RyaW5nKE1hdGguZmxvb3IoTnVtYmVyKGRpcykgLyA3KSk7XG4gICAgICAgICAgICByZXR1cm4gZGlyICsgb2N0YXZlO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBib2R5ICs9ICdPY3RhdmUgRGlzcGxhY2VtZW50OiAnICsgZm9ybWF0KGF0dHJbJ2Rpcy5wbGFjZSddLCBhdHRyLmRpcykgKyAnXFxyXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBib2R5ICs9ICdPY3RhdmUgRGlzcGxhY2VtZW50OiBOb25lXFxyXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHkgKz0gJ1NoYXBlOiAnICsgYXR0ci5zaGFwZSArICdcXHJcXG4nICsgJ0xpbmU6ICcgKyBhdHRyLmxpbmU7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdkaXZMaW5lJzoge1xuICAgICAgICBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5uZW9uVmlldy5nZXRFbGVtZW50QXR0cihpZCwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgICAgICBib2R5ICs9ICdEaXZMaW5lIFR5cGU6ICcgKyBhdHRyaWJ1dGVzWydmb3JtJ107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RhZmYnOiB7XG4gICAgICAgIGlmICh0aGlzLmlzSG92ZXJpbmdDaGlsZCkgcmV0dXJuO1xuICAgICAgICBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5uZW9uVmlldy5nZXRFbGVtZW50QXR0cihpZCwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgICAgICBpZiAoYXR0cmlidXRlc1sndHlwZSddKSBib2R5ICs9ICdDb2x1bW46ICcgKyBhdHRyaWJ1dGVzWyd0eXBlJ10ucmVwbGFjZSgvXmNvbHVtbi8sICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJvZHkgKz0gJ25vdGhpbmcnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYm9keSA9IGBFbGVtZW50IFR5cGU6ICR7ZWxlbWVudENsYXNzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZWxlbWVudENsYXNzLnNsaWNlKDEpfVxcbiR7Ym9keX1gO1xuICAgIHRoaXMudXBkYXRlSW5mb01vZHVsZShib2R5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluZGl2aWR1YWwgcGl0Y2hlcyBvZiBhIG5ldW1lLlxuICAgKiBAcGFyYW0gbmNzIC0gTmV1bWUgY29tcG9uZW50cyBpbiB0aGUgbmV1bWUuXG4gICAqIEByZXR1cm5zIFNwYWNlIHNlcGFyYXRlZCBwaXRjaGVzIG9mIHRoZSBuZXVtZSBjb21wb25lbnRzIGluIG9yZGVyLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGl0Y2hlcyAobmNzOiBJdGVyYWJsZTxTVkdHcmFwaGljc0VsZW1lbnQ+KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcGl0Y2hlcyA9ICcnO1xuICAgIGZvciAoY29uc3QgbmMgb2YgbmNzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5uZW9uVmlldy5nZXRFbGVtZW50QXR0cihuYy5pZCwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgICAgcGl0Y2hlcyArPSBhdHRyaWJ1dGVzWydwbmFtZSddICsgYXR0cmlidXRlc1snb2N0J10gKyAnICc7XG4gICAgfVxuICAgIHJldHVybiBwaXRjaGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29udG91ciBvZiBhIG5ldW1lLlxuICAgKiBAcGFyYW0gbmNzIC0gTmV1bWUgY29tcG9uZW50cyBpbiB0aGUgbmV1bWUuXG4gICAqL1xuICBhc3luYyBnZXRDb250b3VyIChuY3M6IEl0ZXJhYmxlPFNWR0dyYXBoaWNzRWxlbWVudD4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBjb250b3VyID0gJyc7XG4gICAgbGV0IHByZXZpb3VzOiBBdHRyaWJ1dGVzID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IG5jIG9mIG5jcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlczogQXR0cmlidXRlcyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIobmMuaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICAgIGlmIChwcmV2aW91cyAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocHJldmlvdXNbJ29jdCddID4gYXR0cmlidXRlc1snb2N0J10pIHtcbiAgICAgICAgICBjb250b3VyICs9ICdkJztcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c1snb2N0J10gPCBhdHRyaWJ1dGVzWydvY3QnXSkge1xuICAgICAgICAgIGNvbnRvdXIgKz0gJ3UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnBpdGNoTmFtZVRvTnVtKHByZXZpb3VzWydwbmFtZSddKSA8IHRoaXMucGl0Y2hOYW1lVG9OdW0oYXR0cmlidXRlc1sncG5hbWUnXSkpIHtcbiAgICAgICAgICAgIGNvbnRvdXIgKz0gJ3UnO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5waXRjaE5hbWVUb051bShwcmV2aW91c1sncG5hbWUnXSkgPiB0aGlzLnBpdGNoTmFtZVRvTnVtKGF0dHJpYnV0ZXNbJ3BuYW1lJ10pKSB7XG4gICAgICAgICAgICBjb250b3VyICs9ICdkJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udG91ciArPSAncyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcmV2aW91cyA9IGF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIGlmIChuZXVtZUdyb3Vwcy5nZXQoY29udG91cikgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIGNvbnRvdXI6ICcgKyBjb250b3VyKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldW1lR3JvdXBzLmdldChjb250b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IGFuZCB1cGRhdGUgdGhlIGluZm8gYm94LlxuICAgKiBAcGFyYW0gYm9keSAtIFRoZSBpbmZvIGJveCBjb250ZW50cy5cbiAgICovXG4gIHVwZGF0ZUluZm9Nb2R1bGUgKGJvZHk6IHN0cmluZyk6IHZvaWQge1xuICAgICg8SFRNTEVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2luZm8tYnViYmxlLWJvZHknKVswXSkuaW5uZXJUZXh0ID0gYm9keTtcblxuICAgIGlmICgoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlJbmZvJykgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCkge1xuICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2luZm8tYnViYmxlLWNvbnRhaW5lcicpWzBdIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBwaXRjaCBuYW1lIChhLWcpIHRvIGEgbnVtYmVyICh3aGVyZSBjIGlzIDEsIGQgaXMgMiwgLi4uYW5kIGIgaXMgNykuXG4gICAqIEBwYXJhbSBwbmFtZSAtIFRoZSBwaXRjaCBuYW1lLlxuICAgKiBAcmV0dXJucyBFcXVpdmFsZW50IHBpdGNoIG5hbWUgYXMgYSBudW1iZXIgZnJvbSAxIHRvIDcuXG4gICAqL1xuICBwaXRjaE5hbWVUb051bSAocG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgc3dpdGNoIChwbmFtZSkge1xuICAgICAgY2FzZSAnYyc6XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgY2FzZSAnZCc6XG4gICAgICAgIHJldHVybiAyO1xuICAgICAgY2FzZSAnZSc6XG4gICAgICAgIHJldHVybiAzO1xuICAgICAgY2FzZSAnZic6XG4gICAgICAgIHJldHVybiA0O1xuICAgICAgY2FzZSAnZyc6XG4gICAgICAgIHJldHVybiA1O1xuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIHJldHVybiA2O1xuICAgICAgY2FzZSAnYic6XG4gICAgICAgIHJldHVybiA3O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5sb2coJ1Vua25vd24gcGl0Y2ggbmFtZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBjb250b3VyIG9mIGFuIG5ldW1lIGdyb3VwaW5nIGJhc2VkIG9uIHRoZSBncm91cGluZyBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29udG91ciBuYW1lLlxuICAgKiBAcmV0dXJucyBCZXN0IGd1ZXNzIG5hbWUgb2YgdGhlIG5ldW1lIHNoYXBlLlxuICAgKi9cbiAgZ2V0Q29udG91ckJ5VmFsdWUgKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIFxuICAgIGZvciAoY29uc3QgW2NvbnQsIHZdIG9mIG5ldW1lR3JvdXBzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHYgPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjb250O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBJbmZvTW9kdWxlIGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuL3V0aWxzL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi9OZW9uVmlldyc7XG5pbXBvcnQgeyB1bnNlbGVjdCB9IGZyb20gJy4vdXRpbHMvU2VsZWN0VG9vbHMnO1xuaW1wb3J0IHsgdXBkYXRlRGlzcGxheUFsbEJ0biwgdXBkYXRlSGlnaGxpZ2h0IH0gZnJvbSAnLi9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzJztcbmltcG9ydCB7IFRleHRWaWV3SW50ZXJmYWNlIH0gZnJvbSAnLi9JbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCBzZXRTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5cbi8qXG4gKiBDbGFzcyB0aGF0IG1hbmFnZXMgZ2V0dGluZyB0aGUgdGV4dCBmb3Igc3lsbGFibGVzIGluIE5lb24gZnJvbSB0aGUgbWVpIGZpbGVcbiAqL1xuY2xhc3MgVGV4dFZpZXcgaW1wbGVtZW50cyBUZXh0Vmlld0ludGVyZmFjZSB7XG4gIHByaXZhdGUgbmVvblZpZXc6IE5lb25WaWV3O1xuICAvKiogV2hldGhlciBvciBub3QgdGhlIHVzZXIgaGFzIGJlZW4gbm90aWZpZWQgYWJvdXQgYmxhbmsgc3lsbGFibGVzLiAqL1xuICBwcml2YXRlIG5vdGlmaWNhdGlvblNlbnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBIGNvbnN0cnVjdG9yIGZvciBhIFRleHRWaWV3LlxuICAgKiBAcGFyYW0gbmVvblZpZXcgLSBUaGUgY2FsbGluZyBbW05lb25WaWV3XV0gZm9yIHRoZSBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5ub3RpZmljYXRpb25TZW50ID0gZmFsc2U7XG5cbiAgICAvLyBhZGQgY2hlY2tib3ggdG8gZW5hYmxlL2Rpc2FibGUgdGhlIHZpZXdcbiAgICBjb25zdCBjaGVja2JveGVzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktc2luZ2xlLWNvbnRhaW5lcicpO1xuICAgIGNvbnN0IHRleHRMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgY29uc3QgYmJveExhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBjb25zdCB0ZXh0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjb25zdCBiYm94QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0ZXh0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2NoZWNrYm94Jyk7XG4gICAgYmJveEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdjaGVja2JveCcpO1xuICAgIHRleHRMYWJlbC5jbGFzc0xpc3QuYWRkKCdjaGVja2JveC1jb250YWluZXInLCAnc2lkZS1wYW5lbC1idG4nKTtcbiAgICBiYm94TGFiZWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtY29udGFpbmVyJywgJ3NpZGUtcGFuZWwtYnRuJyk7XG4gICAgdGV4dExhYmVsLnRleHRDb250ZW50ID0gJ1RleHQnO1xuICAgIGJib3hMYWJlbC50ZXh0Q29udGVudCA9ICdCQm94ZXMnO1xuICAgIHRleHRCdXR0b24uaWQgPSAnZGlzcGxheVRleHQnO1xuICAgIHRleHRCdXR0b24udHlwZSA9ICdjaGVja2JveCc7XG4gICAgYmJveEJ1dHRvbi5pZCA9ICdkaXNwbGF5QkJveCc7XG4gICAgYmJveEJ1dHRvbi50eXBlID0gJ2NoZWNrYm94JztcbiAgICB0ZXh0QnV0dG9uLmNoZWNrZWQgPSBmYWxzZTtcbiAgICBiYm94QnV0dG9uLmNoZWNrZWQgPSBmYWxzZTtcbiAgICB0ZXh0TGFiZWwuYXBwZW5kQ2hpbGQodGV4dEJ1dHRvbik7XG4gICAgYmJveExhYmVsLmFwcGVuZENoaWxkKGJib3hCdXR0b24pO1xuICAgIGNoZWNrYm94ZXNDb250YWluZXIucHJlcGVuZChiYm94TGFiZWwpO1xuICAgIGNoZWNrYm94ZXNDb250YWluZXIucHJlcGVuZCh0ZXh0TGFiZWwpO1xuXG4gICAgdGhpcy5sb2FkU2V0dGluZ3MoKTtcbiAgICB0aGlzLnNldFRleHRWaWV3Q29udHJvbHMoKTtcbiAgICB0aGlzLm5lb25WaWV3LnZpZXcuYWRkVXBkYXRlQ2FsbGJhY2sodGhpcy51cGRhdGVUZXh0Vmlld1Zpc2liaWxpdHkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5uZW9uVmlldy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMudXBkYXRlQkJveFZpc2liaWxpdHkuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgKiBTZXQgbGlzdGVuZXJzIG9uIHRleHR2aWV3IHZpc2liaWxpdHkgY2hlY2tib3hcbiAgKi9cbiAgc2V0VGV4dFZpZXdDb250cm9scyAoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVUZXh0Vmlld1Zpc2liaWxpdHkoKTtcbiAgICB0aGlzLnVwZGF0ZUJCb3hWaXNpYmlsaXR5KCk7XG4gIFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5VGV4dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVUZXh0Vmlld1Zpc2liaWxpdHkoKTtcbiAgICAgIHVwZGF0ZURpc3BsYXlBbGxCdG4oKTtcbiAgICB9KTtcbiAgXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlCQm94JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUJCb3hWaXNpYmlsaXR5KCk7XG4gICAgICB1cGRhdGVEaXNwbGF5QWxsQnRuKCk7XG4gICAgfSk7XG4gIH1cblxuICBsb2FkU2V0dGluZ3MgKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGlzcGxheVRleHQsIGRpc3BsYXlCQm94IH0gPSBnZXRTZXR0aW5ncygpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNkaXNwbGF5VGV4dCcpLmNoZWNrZWQgPSBkaXNwbGF5VGV4dDtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjZGlzcGxheUJCb3gnKS5jaGVja2VkID0gZGlzcGxheUJCb3g7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHZpc2liaWxpdHkgb2YgdGV4dCBib3VuZGluZyBib3hlc1xuICAgKi9cbiAgdXBkYXRlQkJveFZpc2liaWxpdHkgKCk6IHZvaWQge1xuXG4gICAgY29uc3QgZGlzcGxheUJCb3hlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5QkJveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgXG4gICAgLy8gc2F2ZSB0byBsb2NhbFN0b3JhZ2VcbiAgICBzZXRTZXR0aW5ncyh7IGRpc3BsYXlCQm94OiBkaXNwbGF5QkJveGVzLmNoZWNrZWQgfSk7XG5cbiAgICBpZiAoZGlzcGxheUJCb3hlcy5jaGVja2VkKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QnKS5mb3JFYWNoKHJlY3QgPT4ge1xuICAgICAgICByZWN0LmNsYXNzTGlzdC5hZGQoJ3N5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgICAgcmVjdC5jbGFzc0xpc3QucmVtb3ZlKCdzeWxUZXh0UmVjdCcpO1xuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsLnNlbGVjdGVkIC5zeWxUZXh0UmVjdC1kaXNwbGF5JylcbiAgICAgICAgLmZvckVhY2goKHJlY3Q6IEhUTUxFbGVtZW50KSA9PiB7IHJlY3Quc3R5bGUuZmlsbCA9ICdyZWQnOyB9KTtcblxuICAgICAgaWYgKHRoaXMubmVvblZpZXcuZ2V0VXNlck1vZGUoKSAhPT0gJ3ZpZXdlcicgJiYgdGhpcy5uZW9uVmlldy5UZXh0RWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubmVvblZpZXcuVGV4dEVkaXQuaW5pdFNlbGVjdEJ5QkJveEJ1dHRvbigpO1xuICAgICAgICB0aGlzLm5lb25WaWV3LlRleHRFZGl0LmluaXRCQm94Q2lyY2xlU2xpZGVyKCk7XG4gICAgICAgIGNvbnN0IHsgY2lyY2xlU2l6ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI2NpcmNsZU91dHB1dCcpLnZhbHVlID0gU3RyaW5nKGNpcmNsZVNpemUpO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjY2lyY2xlU2xpZGVyJykudmFsdWUgPSBTdHJpbmcoY2lyY2xlU2l6ZSk7XG4gICAgICB9XG4gICAgfSBcbiAgICBlbHNlIHtcbiAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94Jyk/LmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICAgICAgdW5zZWxlY3QoKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTeWxsYWJsZScpLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICBzZXRTZXR0aW5ncyh7IHNlbGVjdGlvbk1vZGU6ICAnc2VsQnlTeWxsYWJsZScgfSk7XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JykuZm9yRWFjaChyZWN0ID0+IHtcbiAgICAgICAgcmVjdC5jbGFzc0xpc3QuYWRkKCdzeWxUZXh0UmVjdCcpO1xuICAgICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ3N5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsLnNlbGVjdGVkIC5zeWxUZXh0UmVjdCcpLmZvckVhY2goKHJlY3Q6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICdub25lJztcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH0gXG4gICAgICBjYXRjaCAoZSkge31cbiAgICAgIHRyeSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYm94LWNpcmNsZS1zbGlkZXInKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfSBcbiAgICAgIGNhdGNoIChlKSB7fVxuICAgIH1cblxuICAgIHVwZGF0ZUhpZ2hsaWdodCgpO1xuICB9XG5cbiAgLyoqXG4gICogVXBkYXRlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSB0ZXh0dmlldyBib3hcbiAgKiBhbmQgYWRkIHRoZSBldmVudCBsaXN0ZW5lcnMgdG8gbWFrZSBzdXJlIHRoZSBzeWwgaGlnaGxpZ2h0cyB3aGVuIG1vdXNlZCBvdmVyXG4gICovXG4gIHVwZGF0ZVRleHRWaWV3VmlzaWJpbGl0eSAoKTogdm9pZCB7XG5cbiAgICBjb25zdCBkaXNwbGF5VGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5VGV4dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgXG4gICAgLy8gc2F2ZSB0byBsb2NhbFN0b3JhZ2VcbiAgICBzZXRTZXR0aW5ncyh7IGRpc3BsYXlUZXh0OiBkaXNwbGF5VGV4dC5jaGVja2VkIH0pO1xuXG4gICAgaWYgKGRpc3BsYXlUZXh0LmNoZWNrZWQpIHtcbiAgICAgIGNvbnN0IHN5bFRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKTtcbiAgICAgIHN5bFRleHQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgc3lsVGV4dC5pbm5lckhUTUwgPSBcbiAgICAgICAgYDxkaXYgY2xhc3M9XCJpbmZvLWJ1YmJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1idWJibGUtaGVhZGVyXCI+U3lsbGFibGVzIG9uIHRoaXMgcGFnZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJ1YmJsZS1ib2R5XCI+JHt0aGlzLmdldFN5bFRleHQoKX08L2Rpdj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIGNvbnN0IHNwYW5zID0gc3lsVGV4dC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuJyk7XG4gICAgICBzcGFucy5mb3JFYWNoKHNwYW4gPT4ge1xuICAgICAgICBjb25zdCBzeWxsYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNwYW4uY2xhc3NMaXN0WzBdKTtcbiAgICAgICAgY29uc3Qgc3lsID0gc3lsbGFibGUucXVlcnlTZWxlY3RvcignLnN5bCcpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gc3lsLnF1ZXJ5U2VsZWN0b3IoJ3RleHQnKTtcbiAgICAgICAgY29uc3QgcmVjdCA9IHN5bC5xdWVyeVNlbGVjdG9yKCdyZWN0Jyk7XG4gICAgICAgIGlmICh0ZXh0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0ZXh0LmNsYXNzTGlzdC5hZGQoJ3RleHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNwYW4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgICAgIGlmIChzeWxsYWJsZS5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICBzeWxsYWJsZS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgIHN5bGxhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpLmZvckVhY2gobmV1bWUgPT4ge1xuICAgICAgICAgICAgbmV1bWUuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzeWwuYXR0cignZmlsbCcsICcjZmZjN2M3Jyk7XG4gICAgICAgICAgLy8gdGhpcy5oaWdobGlnaHRCb3VuZGluZ0JveChzcGFuKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3Bhbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgIGlmIChzeWxsYWJsZS5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICBzeWxsYWJsZS5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICAgIHN5bGxhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpLmZvckVhY2gobmV1bWUgPT4ge1xuICAgICAgICAgICAgbmV1bWUuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHN5bGxhYmxlLnN0eWxlLmZpbGwgIT09ICdyZ2IoMCwgMCwgMCknKSB7IC8vIHN5bGxhYmxlLmdldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL1NWRycsICdmaWxsJyk7XG4gICAgICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgnZmlsbCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gJ2JsdWUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzeWwuYXR0cignZmlsbCcsIG51bGwpO1xuICAgICAgICAgIC8vIHRoaXMucmVtb3ZlQm91bmRpbmdCb3goc3Bhbik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLm5lb25WaWV3LmdldFVzZXJNb2RlKCkgIT09ICd2aWV3ZXInICYmIHRoaXMubmVvblZpZXcuVGV4dEVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5lb25WaWV3LlRleHRFZGl0LmluaXRUZXh0RWRpdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBzY3JvbGwgdGhlIHN5bGxhYmxlIHRleHQgYnViYmxlIGludG8gdmlld1xuICAgICAgLy9zeWxUZXh0LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gXG4gICAgZWxzZSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN5bGxhYmxlIHRleHQgb2YgdGhlIGxvYWRlZCBmaWxlXG4gICAqL1xuICBnZXRTeWxUZXh0ICgpOiBzdHJpbmcge1xuICAgIGxldCBseXJpY3MgPSAnJztcbiAgICBjb25zdCB1bmlUb0Rhc2ggPSAvXFx1ZTU1MS9nO1xuICAgIGNvbnN0IHN5bGxhYmxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hY3RpdmUtcGFnZSAuc3lsbGFibGUnKTtcbiAgICBzeWxsYWJsZXMuZm9yRWFjaChzeWxsYWJsZSA9PiB7XG4gICAgICBpZiAoc3lsbGFibGUucXVlcnlTZWxlY3RvcignLnN5bCcpICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHN5bCA9IHN5bGxhYmxlLnF1ZXJ5U2VsZWN0b3IoJy5zeWwnKTtcbiAgICAgICAgbHlyaWNzICs9IGA8c3BhbiBjbGFzcz1cIiR7c3lsbGFibGUuaWR9IHN5bC10ZXh0LXNpZGUtcGFuZWxcIj5gO1xuICAgICAgICBpZiAoc3lsLnRleHRDb250ZW50LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBseXJpY3MgKz0gJyYjeDI1Q0E7ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQXJyYXkuZnJvbShzeWwuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW4pLmZvckVhY2godGV4dCA9PiB7XG4gICAgICAgICAgICBseXJpY3MgKz0gdGV4dC50ZXh0Q29udGVudCAhPT0gJycgPyB0ZXh0LnRleHRDb250ZW50IDogJyYjeDI1Q0E7ICc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbHlyaWNzICs9ICcgPC9zcGFuPic7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLm5vdGlmaWNhdGlvblNlbnQpIHtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQmxhbmsgc3lsbGFibGVzIGFyZSByZXByZXNlbnRlZCBieSDil4ohJyk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlbnQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gbHlyaWNzLnJlcGxhY2UodW5pVG9EYXNoLCAnLScpO1xuICB9XG59XG5cbmV4cG9ydCB7IFRleHRWaWV3IGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IHVuc2VsZWN0IH0gZnJvbSAnLi91dGlscy9TZWxlY3RUb29scyc7XG5pbXBvcnQgRHJhZ0hhbmRsZXIgZnJvbSAnLi91dGlscy9EcmFnSGFuZGxlcic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi9OZW9uVmlldyc7XG5pbXBvcnQge1xuICBzZXRTZWxlY3RIZWxwZXJPYmplY3RzLFxuICBkcmFnU2VsZWN0LFxuICBjbGlja1NlbGVjdCxcbn0gZnJvbSAnLi91dGlscy9TZWxlY3QnO1xuaW1wb3J0IHsgc2V0R3JvdXBpbmdIaWdobGlnaHQgfSBmcm9tICcuL3V0aWxzL0NvbG9yJztcbmltcG9ydCB7IFRleHRFZGl0SW50ZXJmYWNlIH0gZnJvbSAnLi9JbnRlcmZhY2VzJztcbmltcG9ydCB7IE1vZGFsV2luZG93VmlldyB9IGZyb20gJy4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuaW1wb3J0IHsgc2V0U2V0dGluZ3MgfSBmcm9tICcuL3V0aWxzL0xvY2FsU2V0dGluZ3MnO1xuaW1wb3J0IHsgc2V0Q2lyY2xlU2l6ZUNvbnRyb2xzIH0gZnJvbSAnLi9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzJztcblxuLyoqXG4gKiBGb3JtYXQgYSBzdHJpbmcgZm9yIHByb21wdGluZyB0aGUgdXNlci5cbiAqIEBwYXJhbSByYXdTdHJpbmcgLSBUaGUgdW5mb3JtYXR0ZWQgc3RyaW5nLlxuICovXG4vKlxuZnVuY3Rpb24gZm9ybWF0UmF3IChyYXdTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlbW92ZVN5bWJvbCA9IC9cXHV7MjVDQX0vdTtcbiAgcmV0dXJuIHJhd1N0cmluZy5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcbn1cbiovXG5cbmZ1bmN0aW9uIHNlbEJ5QkJveExpc3RlbmVyKCk6IHZvaWQge1xuICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKSB7XG4gICAgdW5zZWxlY3QoKTtcbiAgICBzZXRTZXR0aW5ncyh7IHNlbGVjdGlvbk1vZGU6ICdzZWxCeUJCb3gnIH0pO1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBkb2N1bWVudFxuICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpXG4gICAgICAgIC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlOYycpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5TmV1bWUnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeVN0YWZmJykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTeWxsYWJsZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLmdldEVsZW1lbnRCeUlkKCdzZWxCeUxheWVyRWxlbWVudCcpXG4gICAgICAgIC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5pZCA9PT1cbiAgICAgICAgJ2hpZ2hsaWdodC1zZWxlY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N5bGxhYmxlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICB0aGlzLmFkZEJCb3hMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBBIFRleHQgZWRpdGluZyBtb2R1bGUgdGhhdCB3b3JrcyB3aXRoIHRoZSBTaW5nbGVWaWV3IGFuZCBEaXZhVmlldyBtb2R1bGVzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHRFZGl0TW9kZSBpbXBsZW1lbnRzIFRleHRFZGl0SW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXI7XG4gIHByaXZhdGUgbmVvblZpZXc6IE5lb25WaWV3O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBUZXh0RWRpdFxuICAgKiBAcGFyYW0gbmVvblZpZXcgLSBUaGUgY2FsbGluZyBbW05lb25WaWV3XV0gZm9yIHRoZSBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5lb25WaWV3OiBOZW9uVmlldykge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLmluaXRUZXh0RWRpdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0ZXh0IHRvIGVkaXQgbW9kZVxuICAgKi9cbiAgaW5pdFRleHRFZGl0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNwYW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0JykucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5uZW9uVmlldy5tb2RhbDtcbiAgICBzcGFucy5mb3JFYWNoKChzcGFuOiBIVE1MU3BhbkVsZW1lbnQpID0+IHtcbiAgICAgIGZ1bmN0aW9uIHNlbGVjdFN5bFRleHQoKTogdm9pZCB7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQtdG8tZWRpdCcpO1xuICAgICAgICBtb2RhbC5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkVESVRfVEVYVCk7XG4gICAgICAgIG1vZGFsLm9wZW5Nb2RhbFdpbmRvdygpO1xuICAgICAgfVxuXG4gICAgICBzcGFuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VsZWN0U3lsVGV4dCk7XG4gICAgICBzcGFuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VsZWN0U3lsVGV4dCk7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ID09PSAnVCcpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTeWxUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRleHQtc2VsZWN0Jyk7XG4gICAgICAgIGlmIChzZWxlY3RlZFN5bFRleHQpIHtcbiAgICAgICAgICBzZWxlY3RlZFN5bFRleHQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHNlbGVjdEJ5QkJveCBidXR0b24uXG4gICAqIElmIG5ldW1lIGVkaXQgbW9kZSBpcyB0aGVyZSwgYWRkIGl0IHRvIHRoZSBiYXIgd2l0aCB0aGUgb3RoZXIgc2VsZWN0IGJ5IGJ1dHRvbnMuXG4gICAqIE90aGVyd2lzZSBhZGQgYW4gaW52aXNpYmxlIGJ1dHRvblxuICAgKiBzaW5jZSB0aGUgb25seSBlZGl0IG1vZGUgaXMgc2VsZWN0QnlSZWN0IGluIHRoYXQgY2FzZVxuICAgKi9cbiAgaW5pdFNlbGVjdEJ5QkJveEJ1dHRvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uZW9uVmlldy5OZXVtZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2VsQnlCQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpO1xuICAgICAgaWYgKHNlbEJ5QkJveCkge1xuICAgICAgICBzZWxCeUJCb3guc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdGlvbi1tb2RlLWJ0bnMtY29udGFpbmVyJyk7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzaWRlLXBhbmVsLWJ0bicsICdzZWwtYnknKTtcbiAgICAgIGJ1dHRvbi5pZCA9ICdzZWxCeUJCb3gnO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0JCb3gnO1xuICAgICAgYmxvY2suYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbEJ5QkJveExpc3RlbmVyLmJpbmQodGhpcykpO1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgICAgICBpZiAoZXZ0LmtleSA9PT0gJzYnKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xuICAgICAgICAgICAgc2VsQnlCQm94TGlzdGVuZXIuYmluZCh0aGlzKSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm5lb25WaWV3LnZpZXcuYWRkVXBkYXRlQ2FsbGJhY2sodGhpcy5hZGRCQm94TGlzdGVuZXJzLmJpbmQodGhpcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBibG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmRvJykuY2xvc2VzdCgnLmNvbnRyb2wnKTtcbiAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICBwLmNsYXNzTGlzdC5hZGQoJ2NvbnRyb2wnKTtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3NpZGUtcGFuZWwtYnRuJywgJ3NlbC1ieScpO1xuICAgICAgYnV0dG9uLmlkID0gJ3NlbEJ5QkJveCc7XG4gICAgICBidXR0b24udGV4dENvbnRlbnQgPSAnQkJveCc7XG4gICAgICBwLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gICAgICBibG9jay5hcHBlbmRDaGlsZChwKTtcbiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5hZGRCQm94TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLm5lb25WaWV3LnZpZXcuYWRkVXBkYXRlQ2FsbGJhY2sodGhpcy5hZGRCQm94TGlzdGVuZXJzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHNlbGVjdCBieSBiYm94IG1vZGVcbiAgICovXG4gIGFkZEJCb3hMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICB1bnNlbGVjdCgpO1xuICAgICAgaWYgKHRoaXMubmVvblZpZXcuTmV1bWVFZGl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8ganVzdCBpbiBjYXNlXG4gICAgICAgIHRoaXMuZHJhZ0hhbmRsZXIgPSBuZXcgRHJhZ0hhbmRsZXIoXG4gICAgICAgICAgdGhpcy5uZW9uVmlldyxcbiAgICAgICAgICAnLnN5bFRleHRSZWN0LWRpc3BsYXknLFxuICAgICAgICApO1xuICAgICAgICBzZXRTZWxlY3RIZWxwZXJPYmplY3RzKHRoaXMubmVvblZpZXcsIHRoaXMuZHJhZ0hhbmRsZXIpO1xuICAgICAgICBpZiAodGhpcy5uZW9uVmlldy52aWV3LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdTaW5nbGVWaWV3Jykge1xuICAgICAgICAgIGNsaWNrU2VsZWN0KCcjbWVpX291dHB1dCwgI21laV9vdXRwdXQgcmVjdCcpO1xuICAgICAgICAgIGRyYWdTZWxlY3QoJyNzdmdfZ3JvdXAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGlja1NlbGVjdChcbiAgICAgICAgICAgICcuYWN0aXZlLXBhZ2UgPiBzdmcgPiBzdmcsIC5hY3RpdmUtcGFnZSA+IHN2ZyA+IHN2ZyByZWN0JyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGRyYWdTZWxlY3QoJy5hY3RpdmUtcGFnZSBzdmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGJib3ggY2lyY2xlIHNpemUgc2xpZGVyLlxuICAgKi9cbiAgaW5pdEJCb3hDaXJjbGVTbGlkZXIoKTogdm9pZCB7XG4gICAgY29uc3QgY2lyY2xlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jib3gtY2lyY2xlLXNsaWRlcicpO1xuICAgIGlmIChjaXJjbGVTbGlkZXIpIHtcbiAgICAgIGNpcmNsZVNsaWRlci5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpZGVyU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5LXNsaWRlci1zZWN0aW9uJyk7XG4gICAgY29uc3QgY2lyY2xlU2xpZGVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2lyY2xlU2xpZGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXG4gICAgICAnc2xpZGVyLWFuZC1zbGlkZXItYWN0aW9ucy1jb250YWluZXInLFxuICAgICAgJ2Rpc3BsYXktcGFuZWwnLFxuICAgICk7XG4gICAgY2lyY2xlU2xpZGVyQ29udGFpbmVyLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICBjaXJjbGVTbGlkZXJDb250YWluZXIuaWQgPSAnYmJveC1jaXJjbGUtc2xpZGVyJztcbiAgICBjaXJjbGVTbGlkZXJDb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXktc2xpZGVyLXRpdGxlXCI+QkJveCBDaXJjbGU8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNsaWRlci1idG5cIiBpZD1cInJlc2V0LWNpcmNsZS1zaXplXCIgdGl0bGU9XCJSZXNldCBjaXJjbGUgc2l6ZVwiPlxuICAgICAgICAgICAgPGltZyBjbGFzcz1cInNsaWRlci1idG4taW1nXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvYXJyb3ctcm90YXRlLWxlZnQtc29saWQuc3ZnXCI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgc3RlcD1cIjFcIiBtaW49XCIwXCIgbWF4PVwiNTBcIiB2YWx1ZT1cIjI1XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cInJlc2V0LWNpcmNsZS1zaXplXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2xpZGVyIGlzLWZ1bGx3aWR0aCBpcy1sYXJnZVwiXG4gICAgICAgICAgICBpZD1cImNpcmNsZVNsaWRlclwiXG4gICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMXJlbTsgcGFkZGluZy1yaWdodDogMXJlbTtcIlxuICAgICAgICAgICAgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxvdXRwdXQgaWQ9XCJjaXJjbGVPdXRwdXRcIiBmb3I9XCJjaXJjbGVTbGlkZXJcIj4yNTwvb3V0cHV0PlxuICAgIDwvZGl2PmA7XG4gICAgc2xpZGVyU2VjdGlvbi5hcHBlbmRDaGlsZChjaXJjbGVTbGlkZXJDb250YWluZXIpO1xuXG4gICAgaWYgKHRoaXMubmVvblZpZXcuTmV1bWVFZGl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNpcmNsZVNsaWRlckNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIHNldENpcmNsZVNpemVDb250cm9scygpO1xuICB9XG59XG4iLCJleHBvcnQgeyBzZXRET01BdHRyaWJ1dGVzIGFzIHNldEF0dHJpYnV0ZXMgfTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBET00gZWxlbWVudCwgc2V0IGF0dHJpYnV0ZXMgb24gaXQsIGFuZFxuICogYXBwZW5kIGNoaWxkcmVuLiBBbGwgYXJndW1lbnRzIHdoaWNoIGFyZSBub3Qgb2YgcHJpbWl0aXZlIHR5cGUsIGFyZSBub3RcbiAqIGFycmF5cywgYW5kIGFyZSBub3QgRE9NIG5vZGVzIGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZSBoYXNoZXMgYW5kIGFyZVxuICogaGFuZGxlZCBhcyBkZXNjcmliZWQgZm9yIHNldERPTUF0dHJpYnV0ZXMuIENoaWxkcmVuIGNhbiBlaXRoZXIgYmUgYSBET01cbiAqIG5vZGUgb3IgYSBwcmltaXRpdmUgdmFsdWUsIHdoaWNoIGlzIGNvbnZlcnRlZCB0byBhIHRleHQgbm9kZS4gQXJyYXlzIGFyZVxuICogaGFuZGxlZCByZWN1cnNpdmVseS4gTnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAqXG4gKiBJbnNwaXJlZCBieSB0aGUgUHJvc2VNaXJyb3IgaGVscGVyIG9mIHRoZSBzYW1lIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbHQgKHRhZylcbntcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICAgIHdoaWxlIChhcmdzLmxlbmd0aClcbiAgICB7XG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgaGFuZGxlRWx0Q29uc3RydWN0b3JBcmcoZWwsIGFyZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFbHRDb25zdHJ1Y3RvckFyZyAoZWwsIGFyZylcbntcbiAgICBpZiAoYXJnID09IG51bGwpICAvLyBOQjogPT0gaXMgY29ycmVjdDtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdvYmplY3QnICYmIHR5cGVvZiBhcmcgIT09ICdmdW5jdGlvbicpXG4gICAge1xuICAgICAgICAvLyBDb2VyY2UgdG8gc3RyaW5nXG4gICAgICAgIGVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFyZykpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZSlcbiAgICB7XG4gICAgICAgIGVsLmFwcGVuZENoaWxkKGFyZyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEFycmF5KVxuICAgIHtcbiAgICAgICAgY29uc3QgY2hpbGRDb3VudCA9IGFyZy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICAgICAgaGFuZGxlRWx0Q29uc3RydWN0b3JBcmcoZWwsIGFyZ1tpXSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHNldERPTUF0dHJpYnV0ZXMoZWwsIGFyZyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFNldCBhdHRyaWJ1dGVzIG9mIGEgRE9NIGVsZW1lbnQuIFRoZSBgc3R5bGVgIHByb3BlcnR5IGlzIHNwZWNpYWwtY2FzZWQgdG9cbiAqIGFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IHdob3NlIG93biBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCB0b1xuICogZWwuc3R5bGUuXG4gKi9cbmZ1bmN0aW9uIHNldERPTUF0dHJpYnV0ZXMgKGVsLCBhdHRyaWJ1dGVzKVxue1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBhdHRyaWJ1dGVzKVxuICAgIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHByb3ApKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgaWYgKHByb3AgPT09ICdzdHlsZScpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNldFN0eWxlKGVsLCBhdHRyaWJ1dGVzLnN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShwcm9wLCBhdHRyaWJ1dGVzW3Byb3BdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0U3R5bGUgKGVsLCBzdHlsZSlcbntcbiAgICBpZiAoIXN0eWxlKVxuICAgICAgICByZXR1cm47XG5cbiAgICBpZiAodHlwZW9mIHN0eWxlICE9PSAnb2JqZWN0JylcbiAgICB7XG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSBzdHlsZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY3NzUHJvcCBpbiBzdHlsZSlcbiAgICB7XG4gICAgICAgIGlmICghc3R5bGUuaGFzT3duUHJvcGVydHkoY3NzUHJvcCkpXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBlbC5zdHlsZVtjc3NQcm9wXSA9IHN0eWxlW2Nzc1Byb3BdO1xuICAgIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBEaXZhUGFyZW50RWxlbWVudE5vdEZvdW5kRXhjZXB0aW9uIChtZXNzYWdlKVxue1xuICAgIHRoaXMubmFtZSA9IFwiRGl2YVBhcmVudEVsZW1lbnROb3RGb3VuZEV4Y2VwdGlvblwiO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG59XG5cbkRpdmFQYXJlbnRFbGVtZW50Tm90Rm91bmRFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBOb3RBbklJSUZNYW5pZmVzdEV4Y2VwdGlvbiAobWVzc2FnZSlcbntcbiAgICB0aGlzLm5hbWUgPSBcIk5vdEFuSUlJRk1hbmlmZXN0RXhjZXB0aW9uXCI7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbn1cblxuTm90QW5JSUlGTWFuaWZlc3RFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBPYmplY3REYXRhTm90U3VwcGxpZWRFeGNlcHRpb24gKG1lc3NhZ2UpXG57XG4gICAgdGhpcy5uYW1lID0gXCJPYmplY3REYXRhTm90U3VwcGxpZWRFeGNlcHRpb25cIjtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xufVxuXG5PYmplY3REYXRhTm90U3VwcGxpZWRFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG4iLCJpbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuL3V0aWxzL2V2ZW50cyc7XG5cbmNvbnN0IGRpdmEgPSB7XG4gICAgRXZlbnRzOiBFdmVudHMsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkaXZhO1xuIiwiLyoqXG4gKiBFdmVudHMuIFB1Yi9TdWIgc3lzdGVtIGZvciBMb29zZWx5IENvdXBsZWQgbG9naWMuXG4gKiBCYXNlZCBvbiBQZXRlciBIaWdnaW5zJyBwb3J0IGZyb20gRG9qbyB0byBqUXVlcnlcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9waGlnZ2luczQyL2Jsb29keS1qcXVlcnktcGx1Z2lucy9ibG9iL21hc3Rlci9wdWJzdWIuanNcbiAqXG4gKiBSZS1hZGFwdGVkIHRvIHZhbmlsbGEgSmF2YXNjcmlwdFxuICpcbiAqIEBjbGFzcyBFdmVudHNcbiAqL1xuXG5jbGFzcyBEaXZhRXZlbnRzXG57XG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkaXZhLkV2ZW50cy5wdWJsaXNoXG4gICAgICogZS5nLjogZGl2YS5FdmVudHMucHVibGlzaChcIlBhZ2VEaWRMb2FkXCIsIFtwYWdlSW5kZXgsIGZpbGVuYW1lLCBwYWdlU2VsZWN0b3JdLCB0aGlzKTtcbiAgICAgKlxuICAgICAqIEBjbGFzcyBFdmVudHNcbiAgICAgKiBAbWV0aG9kIHB1Ymxpc2hcbiAgICAgKiBAcGFyYW0gdG9waWMge1N0cmluZ31cbiAgICAgKiBAcGFyYW0gYXJncyAge0FycmF5fVxuICAgICAqIEBwYXJhbSBzY29wZSB7T2JqZWN0PX0gT3B0aW9uYWwgLSBTdWJzY3JpYmVkIGZ1bmN0aW9ucyB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHN1cHBsaWVkIG9iamVjdCBhcyBgdGhpc2AuXG4gICAgICogICAgIEl0IGlzIG5lY2Vzc2FyeSB0byBzdXBwbHkgdGhpcyBhcmd1bWVudCB3aXRoIHRoZSBzZWxmIHZhcmlhYmxlIHdoZW4gd2l0aGluIGEgRGl2YSBpbnN0YW5jZS5cbiAgICAgKiAgICAgVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG1hdGNoZWQgd2l0aCB0aGUgaW5zdGFuY2UgSUQgb2Ygc3Vic2NyaWJlcnMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleVxuICAgICAqICAgICAgICAgc2hvdWxkIGJlIGV4ZWN1dGVkLiAoU2VlIGluc3RhbmNlSUQgYXJndW1lbnQgb2Ygc3Vic2NyaWJlLilcbiAgICAgKi9cbiAgICBwdWJsaXNoKHRvcGljLCBhcmdzLCBzY29wZSlcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLl9jYWNoZVt0b3BpY10pXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHRoaXNUb3BpYyA9IHRoaXMuX2NhY2hlW3RvcGljXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzVG9waWMuZ2xvYmFsICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGlzVG9waWNHbG9iYWwgPSB0aGlzVG9waWMuZ2xvYmFsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbENvdW50ID0gdGhpc1RvcGljR2xvYmFsLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGdsb2JhbENvdW50OyBpKyspXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzVG9waWNHbG9iYWxbaV0uYXBwbHkoc2NvcGUgfHwgbnVsbCwgYXJncyB8fCBbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NvcGUgJiYgdHlwZW9mIHNjb3BlLmdldEluc3RhbmNlSWQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGdldCBwdWJsaXNoZXIgaW5zdGFuY2UgSUQgZnJvbSBzY29wZSBhcmcsIGNvbXBhcmUsIGFuZCBleGVjdXRlIGlmIG1hdGNoXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VJRCA9IHNjb3BlLmdldEluc3RhbmNlSWQoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZVt0b3BpY11baW5zdGFuY2VJRF0pXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzVG9waWNJbnN0YW5jZSA9IHRoaXMuX2NhY2hlW3RvcGljXVtpbnN0YW5jZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkQ291bnQgPSB0aGlzVG9waWNJbnN0YW5jZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgc2NvcGVkQ291bnQ7IGorKylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1RvcGljSW5zdGFuY2Vbal0uYXBwbHkoc2NvcGUsIGFyZ3MgfHwgW10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGl2YS5FdmVudHMuc3Vic2NyaWJlXG4gICAgICogZS5nLjogZGl2YS5FdmVudHMuc3Vic2NyaWJlKFwiUGFnZURpZExvYWRcIiwgaGlnaGxpZ2h0LCBzZXR0aW5ncy5JRClcbiAgICAgKlxuICAgICAqIEBjbGFzcyBFdmVudHNcbiAgICAgKiBAbWV0aG9kIHN1YnNjcmliZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBpbnN0YW5jZUlEICBPcHRpb25hbCAtIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIElEIG9mIGEgRGl2YSBpbnN0YW5jZTsgaWYgcHJvdmlkZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayBvbmx5IGZpcmVzIGZvciBldmVudHMgcHVibGlzaGVkIGZyb20gdGhhdCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIEV2ZW50IGhhbmRsZXIge0FycmF5fVxuICAgICAqL1xuICAgIHN1YnNjcmliZSh0b3BpYywgY2FsbGJhY2ssIGluc3RhbmNlSUQpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlW3RvcGljXSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGVbdG9waWNdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlSUQgPT09ICdzdHJpbmcnKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NhY2hlW3RvcGljXVtpbnN0YW5jZUlEXSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZVt0b3BpY11baW5zdGFuY2VJRF0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2FjaGVbdG9waWNdW2luc3RhbmNlSURdLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jYWNoZVt0b3BpY10uZ2xvYmFsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlW3RvcGljXS5nbG9iYWwgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2FjaGVbdG9waWNdLmdsb2JhbC5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZUlEID8gW3RvcGljLCBjYWxsYmFjaywgaW5zdGFuY2VJRF0gOiBbdG9waWMsIGNhbGxiYWNrXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkaXZhLkV2ZW50cy51bnN1YnNjcmliZVxuICAgICAqIGUuZy46IHZhciBoYW5kbGUgPSBFdmVudHMuc3Vic2NyaWJlKFwiUGFnZURpZExvYWRcIiwgaGlnaGxpZ2h0KTtcbiAgICAgKiAgICAgICAgIEV2ZW50cy51bnN1YnNjcmliZShoYW5kbGUpO1xuICAgICAqXG4gICAgICogQGNsYXNzIEV2ZW50c1xuICAgICAqIEBtZXRob2QgdW5zdWJzY3JpYmVcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBoYW5kbGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBjb21wbGV0ZWx5IC0gVW5zdWJzY3JpYmUgYWxsIGV2ZW50cyBmb3IgYSBnaXZlbiB0b3BpYy5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBzdWNjZXNzXG4gICAgICovXG4gICAgdW5zdWJzY3JpYmUoaGFuZGxlLCBjb21wbGV0ZWx5KVxuICAgIHtcbiAgICAgICAgY29uc3QgdCA9IGhhbmRsZVswXTtcblxuICAgICAgICBpZiAodGhpcy5fY2FjaGVbdF0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCB0b3BpY0FycmF5O1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VJRCA9IGhhbmRsZS5sZW5ndGggPT09IDMgPyBoYW5kbGVbMl0gOiAnZ2xvYmFsJztcblxuICAgICAgICAgICAgdG9waWNBcnJheSA9IHRoaXMuX2NhY2hlW3RdW2luc3RhbmNlSURdO1xuXG4gICAgICAgICAgICBpZiAoIXRvcGljQXJyYXkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tcGxldGVseSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FjaGVbdF1baW5zdGFuY2VJRF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvcGljQXJyYXkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGkgPSB0b3BpY0FycmF5Lmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKGktLSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodG9waWNBcnJheVtpXSA9PT0gaGFuZGxlWzFdKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVbdF1baW5zdGFuY2VJRF0uc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGl2YS5FdmVudHMudW5zdWJzY3JpYmVBbGxcbiAgICAgKiBlLmcuOiBkaXZhLkV2ZW50cy51bnN1YnNjcmliZUFsbCgnZ2xvYmFsJyk7XG4gICAgICpcbiAgICAgKiBAY2xhc3MgRXZlbnRzXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBpbnN0YW5jZUlEIE9wdGlvbmFsIC0gaW5zdGFuY2UgSUQgdG8gcmVtb3ZlIHN1YnNjcmliZXJzIGZyb20gb3IgJ2dsb2JhbCcgKGlmIG9taXR0ZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVycyBpbiBhbGwgc2NvcGVzIHJlbW92ZWQpXG4gICAgICogQG1ldGhvZCB1bnN1YnNjcmliZUFsbFxuICAgICAqL1xuICAgIHVuc3Vic2NyaWJlQWxsKGluc3RhbmNlSUQpXG4gICAge1xuICAgICAgICBpZiAoaW5zdGFuY2VJRClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdG9waWNzID0gT2JqZWN0LmtleXModGhpcy5fY2FjaGUpO1xuICAgICAgICAgICAgbGV0IGkgPSB0b3BpY3MubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHRvcGljO1xuXG4gICAgICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRvcGljID0gdG9waWNzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jYWNoZVt0b3BpY11baW5zdGFuY2VJRF0gIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlW3RvcGljXVtpbnN0YW5jZUlEXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IEV2ZW50cyA9IG5ldyBEaXZhRXZlbnRzKCk7XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgb25Eb3VibGVDbGljayxcbiAgICBvblBpbmNoLFxuICAgIG9uRG91YmxlVGFwXG59O1xuXG5jb25zdCBET1VCTEVfQ0xJQ0tfVElNRU9VVCA9IDUwMDtcbmNvbnN0IERPVUJMRV9UQVBfRElTVEFOQ0VfVEhSRVNIT0xEID0gNTA7XG5jb25zdCBET1VCTEVfVEFQX1RJTUVPVVQgPSAyNTA7XG5cbmZ1bmN0aW9uIG9uRG91YmxlQ2xpY2soZWxlbSwgY2FsbGJhY2spXG57XG4gICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIGZ1bmN0aW9uIChldmVudClcbiAgICB7XG4gICAgICAgIGlmICghZXZlbnQuY3RybEtleSlcbiAgICAgICAge1xuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQsIGdldFJlbGF0aXZlT2Zmc2V0KGV2ZW50LmN1cnJlbnRUYXJnZXQsIGV2ZW50KSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSB0aGUgY29udHJvbCBrZXkgZm9yIG1hY3MgKGluIGNvbmp1bmN0aW9uIHdpdGggZG91YmxlLWNsaWNraW5nKVxuICAgIC8vIEZJWE1FOiBEb2VzIGEgY2xpY2sgZ2V0IGhhbmRsZWQgd2l0aCBjdHJsIHByZXNzZWQgb24gbm9uLU1hY3M/XG4gICAgY29uc3QgdHJhY2tlciA9IGNyZWF0ZURvdWJsZUV2ZW50VHJhY2tlcihET1VCTEVfQ0xJQ0tfVElNRU9VVCk7XG5cbiAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGV2ZW50KVxuICAgIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoZXZlbnQuY3RybEtleSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRyYWNrZXIuaXNUcmlnZ2VyZWQoKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0cmFja2VyLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQsIGdldFJlbGF0aXZlT2Zmc2V0KGV2ZW50LmN1cnJlbnRUYXJnZXQsIGV2ZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHJhY2tlci50cmlnZ2VyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb25QaW5jaChlbGVtLCBjYWxsYmFjaylcbntcbiAgICBsZXQgc3RhcnREaXN0YW5jZSA9IDA7XG5cbiAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbiAoZXZlbnQpXG4gICAge1xuICAgICAgICAvLyBQcmV2ZW50IG1vdXNlIGV2ZW50IGZyb20gZmlyaW5nXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2UgPSBkaXN0YW5jZShcbiAgICAgICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSxcbiAgICAgICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMV0uY2xpZW50WCxcbiAgICAgICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMV0uY2xpZW50WVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbihldmVudClcbiAgICB7XG4gICAgICAgIC8vIFByZXZlbnQgbW91c2UgZXZlbnQgZnJvbSBmaXJpbmdcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMilcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdG91Y2hlcyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcztcblxuICAgICAgICAgICAgY29uc3QgbW92ZURpc3RhbmNlID0gZGlzdGFuY2UoXG4gICAgICAgICAgICAgICAgdG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uY2xpZW50WSxcbiAgICAgICAgICAgICAgICB0b3VjaGVzWzFdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgdG91Y2hlc1sxXS5jbGllbnRZXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB6b29tRGVsdGEgPSBtb3ZlRGlzdGFuY2UgLSBzdGFydERpc3RhbmNlO1xuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoem9vbURlbHRhKSA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hDZW50ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VYOiAodG91Y2hlc1swXS5jbGllbnRYICsgdG91Y2hlc1sxXS5jbGllbnRYKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VZOiAodG91Y2hlc1swXS5jbGllbnRZICsgdG91Y2hlc1sxXS5jbGllbnRZKSAvIDJcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQsIGdldFJlbGF0aXZlT2Zmc2V0KGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRvdWNoQ2VudGVyKSwgc3RhcnREaXN0YW5jZSwgbW92ZURpc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkRvdWJsZVRhcChlbGVtLCBjYWxsYmFjaylcbntcbiAgICBjb25zdCB0cmFja2VyID0gY3JlYXRlRG91YmxlRXZlbnRUcmFja2VyKERPVUJMRV9UQVBfVElNRU9VVCk7XG4gICAgbGV0IGZpcnN0VGFwID0gbnVsbDtcblxuICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCAoZXZlbnQpID0+XG4gICAge1xuICAgICAgICAvLyBQcmV2ZW50IG1vdXNlIGV2ZW50IGZyb20gZmlyaW5nXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKHRyYWNrZXIuaXNUcmlnZ2VyZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdHJhY2tlci5yZXNldCgpO1xuXG4gICAgICAgICAgICAvLyBEb3VibGV0YXAgaGFzIG9jY3VycmVkXG4gICAgICAgICAgICBjb25zdCBzZWNvbmRUYXAgPSB7XG4gICAgICAgICAgICAgICAgcGFnZVg6IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICAgICAgICBwYWdlWTogZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBJZiBmaXJzdCB0YXAgaXMgY2xvc2UgdG8gc2Vjb25kIHRhcCAocHJldmVudHMgaW50ZXJmZXJlbmNlIHdpdGggc2NhbGUgZXZlbnQpXG4gICAgICAgICAgICBjb25zdCB0YXBEaXN0YW5jZSA9IGRpc3RhbmNlKGZpcnN0VGFwLnBhZ2VYLCBmaXJzdFRhcC5wYWdlWSwgc2Vjb25kVGFwLnBhZ2VYLCBzZWNvbmRUYXAucGFnZVkpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBDb3VsZCBnaXZlIHNvbWV0aGluZyBoaWdoZXItbGV2ZWwgdGhhbiBzZWNvbmRUYXAgdG8gY2FsbGJhY2tcbiAgICAgICAgICAgIGlmICh0YXBEaXN0YW5jZSA8IERPVUJMRV9UQVBfRElTVEFOQ0VfVEhSRVNIT0xEKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBnZXRSZWxhdGl2ZU9mZnNldChldmVudC5jdXJyZW50VGFyZ2V0LCBzZWNvbmRUYXApKTtcblxuICAgICAgICAgICAgZmlyc3RUYXAgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZmlyc3RUYXAgPSB7XG4gICAgICAgICAgICAgICAgcGFnZVg6IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICAgICAgICBwYWdlWTogZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0cmFja2VyLnRyaWdnZXIoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vLyBQeXRoYWdvcmVhbiB0aGVvcmVtIHRvIGdldCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzICh1c2VkIGZvclxuLy8gY2FsY3VsYXRpbmcgZmluZ2VyIGRpc3RhbmNlIGZvciBkb3VibGUtdGFwIGFuZCBwaW5jaC16b29tKVxuZnVuY3Rpb24gZGlzdGFuY2UoeDEsIHkxLCB4MiwgeTIpXG57XG4gICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xufVxuXG4vLyBVdGlsaXR5IHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBhbiBldmVudCBoYXMgYmVlbiB0cmlnZ2VyZWQgdHdpY2Vcbi8vIGR1cmluZyBhIGEgZ2l2ZW4gZHVyYXRpb25cbmZ1bmN0aW9uIGNyZWF0ZURvdWJsZUV2ZW50VHJhY2tlcih0aW1lb3V0RHVyYXRpb24pXG57XG4gICAgbGV0IHRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lb3V0SWQgPSBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHJpZ2dlcigpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgICByZXNldFRpbWVvdXQoKTtcbiAgICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aW1lb3V0SWQgPSBudWxsO1xuICAgICAgICAgICAgfSwgdGltZW91dER1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgaXNUcmlnZ2VyZWQoKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdHJpZ2dlcmVkO1xuICAgICAgICB9LFxuICAgICAgICByZXNldCgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzZXRUaW1lb3V0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVzZXRUaW1lb3V0KClcbiAgICB7XG4gICAgICAgIGlmICh0aW1lb3V0SWQgIT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgICAgdGltZW91dElkID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVsYXRpdmVPZmZzZXQoZWxlbSwgcGFnZUNvb3JkcylcbntcbiAgICBjb25zdCBib3VuZHMgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogcGFnZUNvb3Jkcy5wYWdlWCAtIGJvdW5kcy5sZWZ0LFxuICAgICAgICB0b3A6IHBhZ2VDb29yZHMucGFnZVkgLSBib3VuZHMudG9wXG4gICAgfTtcbn1cbiIsImltcG9ydCB7IGVsdCB9IGZyb20gJy4vdXRpbHMvZWx0Jztcbi8qKlxuKlxuKlxuKiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlVG9vbHNPdmVybGF5XG57XG4gICAgY29uc3RydWN0b3IgKHBhZ2VJbmRleCwgdmlld2VyQ29yZSlcbiAgICB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2VJbmRleDtcblxuICAgICAgICB0aGlzLl92aWV3ZXJDb3JlID0gdmlld2VyQ29yZTtcblxuICAgICAgICB0aGlzLl9pbm5lckVsZW1lbnQgPSB0aGlzLl92aWV3ZXJDb3JlLmdldFNldHRpbmdzKCkuaW5uZXJFbGVtZW50O1xuICAgICAgICB0aGlzLl9wYWdlVG9vbHNFbGVtID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYWJlbFdpZHRoID0gMDtcbiAgICB9XG5cbiAgICBtb3VudCAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VUb29sc0VsZW0gPT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbnMgPSB0aGlzLl9pbml0aWFsaXplUGFnZVRvb2xCdXR0b25zKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3BhZ2VUb29sc0VsZW0gPSBlbHQoJ2RpdicsIHsgY2xhc3M6ICdkaXZhLXBhZ2UtdG9vbHMtd3JhcHBlcicgfSxcbiAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdkaXZhLXBhZ2UtdG9vbHMnIH0sIHRoaXMuX2J1dHRvbnMpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLl9wYWdlTGFiZWxzRWxlbSA9IGVsdCgnZGl2JywgeyBjbGFzczogJ2RpdmEtcGFnZS1sYWJlbHMtd3JhcHBlcid9LFxuICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgeyBjbGFzczogJ2RpdmEtcGFnZS1sYWJlbHMnIH0sIHRoaXMuX3ZpZXdlckNvcmUuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbdGhpcy5wYWdlXS5sKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB0aGlzLl9pbm5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcGFnZVRvb2xzRWxlbSk7XG4gICAgICAgIHRoaXMuX2lubmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wYWdlTGFiZWxzRWxlbSk7XG4gICAgfVxuXG4gICAgX2luaXRpYWxpemVQYWdlVG9vbEJ1dHRvbnMgKClcbiAgICB7XG4gICAgICAgIC8vIENhbGxiYWNrIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLl92aWV3ZXJDb3JlLmdldFNldHRpbmdzKCk7XG4gICAgICAgIGNvbnN0IHB1YmxpY0luc3RhbmNlID0gdGhpcy5fdmlld2VyQ29yZS5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLnBhZ2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdlckNvcmUuZ2V0UGFnZVRvb2xzKCkubWFwKCAocGx1Z2luKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICAvLyAhISEgVGhlIG5vZGUgbmVlZHMgdG8gYmUgY2xvbmVkIG90aGVyd2lzZSBpdCBpcyBkZXRhY2hlZCBmcm9tXG4gICAgICAgICAgICAvLyAgb25lIGFuZCByZWF0dGFjaGVkIHRvIHRoZSBvdGhlci5cbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IHBsdWdpbi5wYWdlVG9vbHNJY29uLmNsb25lTm9kZSh0cnVlKTtcblxuICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBwbHVnaW4gaW5zdGFuY2UgaXMgaGFuZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjYWxsO1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIHNldCB0aGUgY29udGV4dCAoaS5lLiwgYHRoaXNgKSBvZiB0aGUgaGFuZGxlQ2xpY2sgY2FsbCB0byB0aGUgcGx1Z2luIGluc3RhbmNlXG4gICAgICAgICAgICAvLyBpdHNlbGYuXG4gICAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmhhbmRsZUNsaWNrLmNhbGwocGx1Z2luLCBldmVudCwgc2V0dGluZ3MsIHB1YmxpY0luc3RhbmNlLCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCAoZXZlbnQpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBmaXJpbmcgb2YgZW11bGF0ZWQgbW91c2UgZXZlbnRzXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHBsdWdpbi5oYW5kbGVDbGljay5jYWxsKHBsdWdpbiwgZXZlbnQsIHNldHRpbmdzLCBwdWJsaWNJbnN0YW5jZSwgcGFnZUluZGV4KTtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbjtcblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1bm1vdW50ICgpXG4gICAge1xuICAgICAgICB0aGlzLl9pbm5lckVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fcGFnZVRvb2xzRWxlbSk7XG4gICAgICAgIHRoaXMuX2lubmVyRWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLl9wYWdlTGFiZWxzRWxlbSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaCAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fdmlld2VyQ29yZS5nZXRQYWdlUmVnaW9uKHRoaXMucGFnZSwge1xuICAgICAgICAgICAgaW5jbHVkZVBhZGRpbmc6IHRydWUsXG4gICAgICAgICAgICBpbmNvcnBvcmF0ZVZpZXdwb3J0OiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIHdpbmRvdyBpcyByZXNpemVkIGxhcmdlciwgYSBtYXJnaW4gaXMgY3JlYXRlZCAtIG5lZWQgdG8gc3VidHJhY3QgdGhpcyBmcm9tIG9mZnNldHNcbiAgICAgICAgbGV0IG1hcmdpbkxlZnQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9pbm5lckVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1sZWZ0Jyk7XG5cbiAgICAgICAgdGhpcy5fcGFnZVRvb2xzRWxlbS5zdHlsZS50b3AgPSBgJHtwb3MudG9wfXB4YDtcbiAgICAgICAgdGhpcy5fcGFnZVRvb2xzRWxlbS5zdHlsZS5sZWZ0ID0gYCR7cG9zLmxlZnQgLSBwYXJzZUludChtYXJnaW5MZWZ0KX1weGA7XG5cbiAgICAgICAgdGhpcy5fcGFnZUxhYmVsc0VsZW0uc3R5bGUudG9wID0gYCR7cG9zLnRvcH1weGA7XG4gICAgICAgIHRoaXMuX3BhZ2VMYWJlbHNFbGVtLnN0eWxlLmxlZnQgPSBgJHtwb3MucmlnaHQgLSBwYXJzZUludChtYXJnaW5MZWZ0KSAtIHRoaXMubGFiZWxXaWR0aCAtIDV9cHhgO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IG1heEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQYWdlVG9vbHNPdmVybGF5IGZyb20gJy4vcGFnZS10b29scy1vdmVybGF5JztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb2N1bWVudEhhbmRsZXJcbntcbiAgICBjb25zdHJ1Y3RvciAodmlld2VyQ29yZSlcbiAgICB7XG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUgPSB2aWV3ZXJDb3JlO1xuICAgICAgICB0aGlzLl92aWV3ZXJTdGF0ZSA9IHZpZXdlckNvcmUuZ2V0SW50ZXJuYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLl9vdmVybGF5cyA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLl92aWV3ZXJDb3JlLmdldFBhZ2VUb29scygpLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbnVtUGFnZXMgPSB2aWV3ZXJDb3JlLmdldFNldHRpbmdzKCkubnVtUGFnZXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFnZXM7IGkrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVybGF5ID0gbmV3IFBhZ2VUb29sc092ZXJsYXkoaSwgdmlld2VyQ29yZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheXMucHVzaChvdmVybGF5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLmFkZFBhZ2VPdmVybGF5KG92ZXJsYXkpO1xuXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGR1bW15IGxhYmVsIGZvciB3aWR0aCBjYWxjdWxhdGlvblxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIF9wYWdlVG9vbHNFbGVtIGlzIG9ubHkgY3JlYXRlZCBvbiBtb3VudFxuICAgICAgICAgICAgICAgIC8vIHNvIHRoZXJlJ3Mgbm8gb3RoZXIgd2F5IHRvIGdldCBpdHMgd2lkdGggYmVmb3JlIHRoZSBwYWdlcyBhcmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgLy8gKHdoaWNoIHdlIG5lZWQgdG8gYXZvaWQgdGhlaXIgd2lkdGggdGVtcG9yYXJpbHkgYmVpbmcgMCB3aGlsZSBsb2FkaW5nKVxuICAgICAgICAgICAgICAgIGxldCBkdW1teUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgIGR1bW15TGFiZWwuaW5uZXJIVE1MID0gdmlld2VyQ29yZS5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlc1tpXS5sO1xuICAgICAgICAgICAgICAgIGR1bW15TGFiZWwuY2xhc3NMaXN0LmFkZCgnZGl2YS1wYWdlLWxhYmVscycpO1xuICAgICAgICAgICAgICAgIGR1bW15TGFiZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Jyk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkdW1teUxhYmVsKTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxXaWR0aCA9IGR1bW15TGFiZWwuY2xpZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkdW1teUxhYmVsKTtcblxuICAgICAgICAgICAgICAgIG92ZXJsYXkubGFiZWxXaWR0aCA9IGxhYmVsV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVU0VSIEVWRU5UU1xuICAgIG9uRG91YmxlQ2xpY2sgKGV2ZW50LCBjb29yZHMpXG4gICAge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgY29uc3QgbmV3Wm9vbUxldmVsID0gZXZlbnQuY3RybEtleSA/IHNldHRpbmdzLnpvb21MZXZlbCAtIDEgOiBzZXR0aW5ncy56b29tTGV2ZWwgKyAxO1xuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fdmlld2VyQ29yZS5nZXRQYWdlUG9zaXRpb25BdFZpZXdwb3J0T2Zmc2V0KGNvb3Jkcyk7XG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUuem9vbShuZXdab29tTGV2ZWwsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBvblBpbmNoIChldmVudCwgY29vcmRzLCBzdGFydERpc3RhbmNlLCBlbmREaXN0YW5jZSlcbiAgICB7XG4gICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIGNoZWNrIGluIGEgd2F5IHdoaWNoIGlzIGxlc3Mgc3BhZ2hldHRpIGNvZGUteVxuICAgICAgICBjb25zdCB2aWV3ZXJTdGF0ZSA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0SW50ZXJuYWxTdGF0ZSgpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgICBsZXQgbmV3Wm9vbUxldmVsID0gTWF0aC5sb2coTWF0aC5wb3coMiwgc2V0dGluZ3Muem9vbUxldmVsKSAqIGVuZERpc3RhbmNlIC8gKHN0YXJ0RGlzdGFuY2UgKiBNYXRoLmxvZygyKSkpIC8gTWF0aC5sb2coMik7XG4gICAgICAgIG5ld1pvb21MZXZlbCA9IE1hdGgubWF4KHNldHRpbmdzLm1pblpvb21MZXZlbCwgbmV3Wm9vbUxldmVsKTtcbiAgICAgICAgbmV3Wm9vbUxldmVsID0gTWF0aC5taW4oc2V0dGluZ3MubWF4Wm9vbUxldmVsLCBuZXdab29tTGV2ZWwpO1xuXG4gICAgICAgIGlmIChuZXdab29tTGV2ZWwgPT09IHNldHRpbmdzLnpvb21MZXZlbClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl92aWV3ZXJDb3JlLmdldFBhZ2VQb3NpdGlvbkF0Vmlld3BvcnRPZmZzZXQoY29vcmRzKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLl92aWV3ZXJDb3JlLmdldEN1cnJlbnRMYXlvdXQoKTtcbiAgICAgICAgY29uc3QgY2VudGVyT2Zmc2V0ID0gbGF5b3V0LmdldFBhZ2VUb1ZpZXdwb3J0Q2VudGVyT2Zmc2V0KHBvc2l0aW9uLmFuY2hvclBhZ2UsIHZpZXdlclN0YXRlLnZpZXdwb3J0KTtcbiAgICAgICAgY29uc3Qgc2NhbGVSYXRpbyA9IDEgLyBNYXRoLnBvdygyLCBzZXR0aW5ncy56b29tTGV2ZWwgLSBuZXdab29tTGV2ZWwpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucmVsb2FkKHtcbiAgICAgICAgICAgIHpvb21MZXZlbDogbmV3Wm9vbUxldmVsLFxuICAgICAgICAgICAgZ29EaXJlY3RseVRvOiBwb3NpdGlvbi5hbmNob3JQYWdlLFxuICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldDogKGNlbnRlck9mZnNldC54IC0gcG9zaXRpb24ub2Zmc2V0LmxlZnQpICsgcG9zaXRpb24ub2Zmc2V0LmxlZnQgKiBzY2FsZVJhdGlvLFxuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IChjZW50ZXJPZmZzZXQueSAtIHBvc2l0aW9uLm9mZnNldC50b3ApICsgcG9zaXRpb24ub2Zmc2V0LnRvcCAqIHNjYWxlUmF0aW9cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVklFVyBFVkVOVFNcbiAgICBvblZpZXdXaWxsTG9hZCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5wdWJsaXNoKCdEb2N1bWVudFdpbGxMb2FkJywgdGhpcy5fdmlld2VyQ29yZS5nZXRTZXR0aW5ncygpKTtcbiAgICB9XG5cbiAgICBvblZpZXdEaWRMb2FkICgpXG4gICAge1xuICAgICAgICAvLyBUT0RPOiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgdG8gaGFuZGxlIGNoYW5nZXMgb24gdmlldyB1cGRhdGUsIG5vdFxuICAgICAgICAvLyBpbml0aWFsIGxvYWRcbiAgICAgICAgdGhpcy5faGFuZGxlWm9vbUxldmVsQ2hhbmdlKCk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0U2V0dGluZ3MoKS5hY3RpdmVQYWdlSW5kZXg7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5fdmlld2VyQ29yZS5nZXRQYWdlTmFtZShjdXJyZW50UGFnZUluZGV4KTtcbiAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5wdWJsaXNoKFwiRG9jdW1lbnREaWRMb2FkXCIsIGN1cnJlbnRQYWdlSW5kZXgsIGZpbGVOYW1lKTtcbiAgICB9XG5cbiAgICBvblZpZXdEaWRVcGRhdGUgKHJlbmRlcmVkUGFnZXMsIHRhcmdldFBhZ2UpXG4gICAge1xuICAgICAgICBjb25zdCBjdXJyZW50UGFnZSA9ICh0YXJnZXRQYWdlICE9PSBudWxsKSA/XG4gICAgICAgICAgICB0YXJnZXRQYWdlIDpcbiAgICAgICAgICAgIGdldENlbnRlcm1vc3RQYWdlKHJlbmRlcmVkUGFnZXMsIHRoaXMuX3ZpZXdlckNvcmUuZ2V0Q3VycmVudExheW91dCgpLCB0aGlzLl92aWV3ZXJDb3JlLmdldFZpZXdwb3J0KCkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSBwYWdlcyBmcm9tIHRoZSByZW5kZXJlZCBwYWdlc1xuICAgICAgICBsZXQgdGVtcCA9IHRoaXMuX3ZpZXdlclN0YXRlLnZpZXdwb3J0LmludGVyc2VjdGlvblRvbGVyYW5jZTtcbiAgICAgICAgLy8gd2l0aG91dCBzZXR0aW5nIHRvIDAsIGlzUGFnZVZpc2libGUgcmV0dXJucyB0cnVlIGZvciBwYWdlcyBvdXQgb2Ygdmlld3BvcnQgYnkgaW50ZXJzZWN0aW9uVG9sZXJhbmNlXG4gICAgICAgIHRoaXMuX3ZpZXdlclN0YXRlLnZpZXdwb3J0LmludGVyc2VjdGlvblRvbGVyYW5jZSA9IDA7XG4gICAgICAgIGxldCB2aXNpYmxlUGFnZXMgPSByZW5kZXJlZFBhZ2VzLmZpbHRlcihpbmRleCA9PiB0aGlzLl92aWV3ZXJTdGF0ZS5yZW5kZXJlci5pc1BhZ2VWaXNpYmxlKGluZGV4KSk7XG4gICAgICAgIC8vIHJlc2V0IGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgYWZ0ZXIgZ2V0dGluZyB0cnVlIHZpc2libGUgcGFnZXNcbiAgICAgICAgdGhpcy5fdmlld2VyU3RhdGUudmlld3BvcnQuaW50ZXJzZWN0aW9uVG9sZXJhbmNlID0gdGVtcDtcblxuICAgICAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSBpcyBubyBwYWdlIGluIHRoZSB2aWV3cG9ydFxuICAgICAgICAvLyBGSVhNRTogV291bGQgYmUgYmV0dGVyIHRvIGZhbGwgYmFjayB0byB0aGUgcGFnZSBjbG9zZXN0IHRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBpZiAoY3VycmVudFBhZ2UgIT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdlckNvcmUuc2V0Q3VycmVudFBhZ2VzKGN1cnJlbnRQYWdlLCB2aXNpYmxlUGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2UgIT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucHVibGlzaChcIlZpZXdlckRpZEp1bXBcIiwgdGFyZ2V0UGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9oYW5kbGVab29tTGV2ZWxDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBfaGFuZGxlWm9vbUxldmVsQ2hhbmdlICgpXG4gICAge1xuICAgICAgICBjb25zdCB2aWV3ZXJTdGF0ZSA9IHRoaXMuX3ZpZXdlclN0YXRlO1xuICAgICAgICBjb25zdCB6b29tTGV2ZWwgPSB2aWV3ZXJTdGF0ZS5vcHRpb25zLnpvb21MZXZlbDtcblxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgaW5pdGlhbCBsb2FkLCB0cmlnZ2VyIHRoZSB6b29tIGV2ZW50c1xuICAgICAgICBpZiAodmlld2VyU3RhdGUub2xkWm9vbUxldmVsICE9PSB6b29tTGV2ZWwgJiYgdmlld2VyU3RhdGUub2xkWm9vbUxldmVsID49IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh2aWV3ZXJTdGF0ZS5vbGRab29tTGV2ZWwgPCB6b29tTGV2ZWwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5wdWJsaXNoKFwiVmlld2VyRGlkWm9vbUluXCIsIHpvb21MZXZlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5wdWJsaXNoKFwiVmlld2VyRGlkWm9vbU91dFwiLCB6b29tTGV2ZWwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnB1Ymxpc2goXCJWaWV3ZXJEaWRab29tXCIsIHpvb21MZXZlbCk7XG4gICAgICAgIH1cblxuICAgICAgICB2aWV3ZXJTdGF0ZS5vbGRab29tTGV2ZWwgPSB6b29tTGV2ZWw7XG4gICAgfVxuXG4gICAgZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheXMuZm9yRWFjaCgob3ZlcmxheSkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5yZW1vdmVQYWdlT3ZlcmxheShvdmVybGF5KTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRDZW50ZXJtb3N0UGFnZSAocmVuZGVyZWRQYWdlcywgbGF5b3V0LCB2aWV3cG9ydClcbntcbiAgICBjb25zdCBjZW50ZXJZID0gdmlld3BvcnQudG9wICsgKHZpZXdwb3J0LmhlaWdodCAvIDIpO1xuICAgIGNvbnN0IGNlbnRlclggPSB2aWV3cG9ydC5sZWZ0ICsgKHZpZXdwb3J0LndpZHRoIC8gMik7XG5cbiAgICAvLyBGaW5kIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGZyb20gdGhlIHZpZXdwb3J0IGNlbnRlciB0byBhIHBhZ2UuXG4gICAgLy8gQ29tcHV0ZSBtaW51cyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBmcm9tIHZpZXdwb3J0IGNlbnRlciB0byB0aGUgcGFnZSdzIGJvcmRlci5cbiAgICAvLyBodHRwOi8vZ2FtZWRldi5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvNDQ0ODMvaG93LWRvLWktY2FsY3VsYXRlLWRpc3RhbmNlLWJldHdlZW4tYS1wb2ludC1hbmQtYW4tYXhpcy1hbGlnbmVkLXJlY3RhbmdsZVxuICAgIGNvbnN0IGNlbnRlclBhZ2UgPSBtYXhCeShyZW5kZXJlZFBhZ2VzLCBwYWdlSW5kZXggPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IGRpbXMgPSBsYXlvdXQuZ2V0UGFnZURpbWVuc2lvbnMocGFnZUluZGV4KTtcbiAgICAgICAgY29uc3QgaW1hZ2VPZmZzZXQgPSBsYXlvdXQuZ2V0UGFnZU9mZnNldChwYWdlSW5kZXgsIHtpbmNsdWRlUGFkZGluZzogdHJ1ZX0pO1xuXG4gICAgICAgIGNvbnN0IG1pZFggPSBpbWFnZU9mZnNldC5sZWZ0ICsgKGRpbXMud2lkdGggLyAyKTtcbiAgICAgICAgY29uc3QgbWlkWSA9IGltYWdlT2Zmc2V0LnRvcCArIChkaW1zLmhlaWdodCAvIDIpO1xuXG4gICAgICAgIGNvbnN0IGR4ID0gTWF0aC5tYXgoTWF0aC5hYnMoY2VudGVyWCAtIG1pZFgpIC0gKGRpbXMud2lkdGggLyAyKSwgMCk7XG4gICAgICAgIGNvbnN0IGR5ID0gTWF0aC5tYXgoTWF0aC5hYnMoY2VudGVyWSAtIG1pZFkpIC0gKGRpbXMuaGVpZ2h0IC8gMiksIDApO1xuXG4gICAgICAgIHJldHVybiAtKGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjZW50ZXJQYWdlICE9IG51bGwgPyBjZW50ZXJQYWdlIDogbnVsbDtcbn1cbiIsImltcG9ydCB7IG1heEJ5IH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JpZEhhbmRsZXJcbntcbiAgICBjb25zdHJ1Y3RvciAodmlld2VyQ29yZSlcbiAgICB7XG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUgPSB2aWV3ZXJDb3JlO1xuICAgIH1cblxuICAgIC8vIFVTRVIgRVZFTlRTXG4gICAgb25Eb3VibGVDbGljayAoZXZlbnQsIGNvb3JkcylcbiAgICB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fdmlld2VyQ29yZS5nZXRQYWdlUG9zaXRpb25BdFZpZXdwb3J0T2Zmc2V0KGNvb3Jkcyk7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5fdmlld2VyQ29yZS5nZXRDdXJyZW50TGF5b3V0KCk7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdmlld2VyQ29yZS5nZXRWaWV3cG9ydCgpO1xuICAgICAgICBjb25zdCBwYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldCA9IGxheW91dC5nZXRQYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldChwb3NpdGlvbi5hbmNob3JQYWdlLCB2aWV3cG9ydCk7XG5cbiAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5yZWxvYWQoe1xuICAgICAgICAgICAgaW5HcmlkOiBmYWxzZSxcbiAgICAgICAgICAgIGdvRGlyZWN0bHlUbzogcG9zaXRpb24uYW5jaG9yUGFnZSxcbiAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IHBhZ2VUb1ZpZXdwb3J0Q2VudGVyT2Zmc2V0LnggKyBwb3NpdGlvbi5vZmZzZXQubGVmdCxcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBwYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldC55ICsgcG9zaXRpb24ub2Zmc2V0LnRvcFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblBpbmNoICgpXG4gICAge1xuICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnJlbG9hZCh7aW5HcmlkOiBmYWxzZX0pO1xuICAgIH1cblxuICAgIC8vIFZJRVcgRVZFTlRTXG4gICAgb25WaWV3V2lsbExvYWQgKClcbiAgICB7XG4gICAgICAgIC8vIEZJWE1FKHdhYmFpbik6IFNob3VsZCBzb21ldGhpbmcgaGFwcGVuIGhlcmU/XG4gICAgICAgIC8qIE5vLW9wICovXG4gICAgfVxuXG4gICAgb25WaWV3RGlkTG9hZCAoKVxuICAgIHtcbiAgICAgICAgLy8gRklYTUUod2FiYWluKTogU2hvdWxkIHNvbWV0aGluZyBoYXBwZW4gaGVyZT9cbiAgICAgICAgLyogTm8tb3AgKi9cbiAgICB9XG5cbiAgICBvblZpZXdEaWRVcGRhdGUgKHJlbmRlcmVkUGFnZXMsIHRhcmdldFBhZ2UpXG4gICAge1xuICAgICAgICAvLyByZXR1cm4gZWFybHkgaWYgdGhlcmUgYXJlIG5vIHJlbmRlcmVkIHBhZ2VzIGluIHZpZXcuXG4gICAgICAgIGlmIChyZW5kZXJlZFBhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSBwYWdlcyBmcm9tIHRoZSByZW5kZXJlZCBwYWdlc1xuICAgICAgICBsZXQgdGVtcCA9IHRoaXMuX3ZpZXdlckNvcmUudmlld2VyU3RhdGUudmlld3BvcnQuaW50ZXJzZWN0aW9uVG9sZXJhbmNlO1xuICAgICAgICAvLyB3aXRob3V0IHNldHRpbmcgdG8gMCwgaXNQYWdlVmlzaWJsZSByZXR1cm5zIHRydWUgZm9yIHBhZ2VzIG91dCBvZiB2aWV3cG9ydCBieSBpbnRlcnNlY3Rpb25Ub2xlcmFuY2VcbiAgICAgICAgdGhpcy5fdmlld2VyQ29yZS52aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnRlcnNlY3Rpb25Ub2xlcmFuY2UgPSAwO1xuICAgICAgICBsZXQgdmlzaWJsZVBhZ2VzID0gcmVuZGVyZWRQYWdlcy5maWx0ZXIoaW5kZXggPT4gdGhpcy5fdmlld2VyQ29yZS52aWV3ZXJTdGF0ZS5yZW5kZXJlci5pc1BhZ2VWaXNpYmxlKGluZGV4KSk7XG4gICAgICAgIC8vIHJlc2V0IGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgYWZ0ZXIgZ2V0dGluZyB0cnVlIHZpc2libGUgcGFnZXNcbiAgICAgICAgdGhpcy5fdmlld2VyQ29yZS52aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnRlcnNlY3Rpb25Ub2xlcmFuY2UgPSB0ZW1wO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlICE9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnNldEN1cnJlbnRQYWdlcyh0YXJnZXRQYWdlLCB2aXNpYmxlUGFnZXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBjdXJyZW50IHBhZ2UgZnJvbSB0aGUgZmlyc3Qgcm93IGlmIGl0IGlzIGZ1bGx5IHZpc2libGUsIG9yIGZyb21cbiAgICAgICAgLy8gdGhlIHNlY29uZCByb3cgaWYgaXQgaXMgZnVsbHkgdmlzaWJsZSwgb3IgZnJvbSB0aGUgY2VudGVybW9zdCByb3cgb3RoZXJ3aXNlLlxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBwYWdlIGlzIGluIHRoYXQgZ3JvdXAgdGhlbiBkb24ndCBjaGFuZ2UgaXQuIE90aGVyd2lzZSwgc2V0XG4gICAgICAgIC8vIHRoZSBjdXJyZW50IHBhZ2UgdG8gdGhlIGdyb3VwJ3MgZmlyc3QgcGFnZS5cblxuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLl92aWV3ZXJDb3JlLmdldEN1cnJlbnRMYXlvdXQoKTtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gW107XG5cbiAgICAgICAgcmVuZGVyZWRQYWdlcy5mb3JFYWNoKHBhZ2VJbmRleCA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGxheW91dC5nZXRQYWdlSW5mbyhwYWdlSW5kZXgpLmdyb3VwO1xuICAgICAgICAgICAgaWYgKGdyb3Vwcy5sZW5ndGggPT09IDAgfHwgZ3JvdXAgIT09IGdyb3Vwc1tncm91cHMubGVuZ3RoIC0gMV0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0Vmlld3BvcnQoKTtcbiAgICAgICAgbGV0IGNob3Nlbkdyb3VwO1xuXG4gICAgICAgIGlmIChncm91cHMubGVuZ3RoID09PSAxIHx8IGdyb3Vwc1swXS5yZWdpb24udG9wID49IHZpZXdwb3J0LnRvcClcbiAgICAgICAge1xuICAgICAgICAgICAgY2hvc2VuR3JvdXAgPSBncm91cHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ3JvdXBzWzFdLnJlZ2lvbi5ib3R0b20gPD0gdmlld3BvcnQuYm90dG9tKVxuICAgICAgICB7XG4gICAgICAgICAgICBjaG9zZW5Hcm91cCA9IGdyb3Vwc1sxXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNob3Nlbkdyb3VwID0gZ2V0Q2VudGVybW9zdEdyb3VwKGdyb3Vwcywgdmlld3BvcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLl92aWV3ZXJDb3JlLmdldFNldHRpbmdzKCkuYWN0aXZlUGFnZUluZGV4O1xuXG4gICAgICAgIGNvbnN0IGhhc0N1cnJlbnRQYWdlID0gY2hvc2VuR3JvdXAucGFnZXMuc29tZShwYWdlID0+IHBhZ2UuaW5kZXggPT09IGN1cnJlbnRQYWdlKTtcblxuICAgICAgICBpZiAoIWhhc0N1cnJlbnRQYWdlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnNldEN1cnJlbnRQYWdlcyhjaG9zZW5Hcm91cC5wYWdlc1swXS5pbmRleCwgdmlzaWJsZVBhZ2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3kgKClcbiAgICB7XG4gICAgICAgIC8vIE5vLW9wXG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRDZW50ZXJtb3N0R3JvdXAgKGdyb3Vwcywgdmlld3BvcnQpXG57XG4gICAgY29uc3Qgdmlld3BvcnRNaWRkbGUgPSB2aWV3cG9ydC50b3AgKyB2aWV3cG9ydC5oZWlnaHQgLyAyO1xuXG4gICAgcmV0dXJuIG1heEJ5KGdyb3VwcywgZ3JvdXAgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IGdyb3VwTWlkZGxlID0gZ3JvdXAucmVnaW9uLnRvcCArIGdyb3VwLmRpbWVuc2lvbnMuaGVpZ2h0IC8gMjtcbiAgICAgICAgcmV0dXJuIC1NYXRoLmFicyh2aWV3cG9ydE1pZGRsZSAtIGdyb3VwTWlkZGxlKTtcbiAgICB9KTtcbn1cbiIsIi8qKlxuICogTWFuYWdlcyBhIGNvbGxlY3Rpb24gb2YgcGFnZSBvdmVybGF5cywgd2hpY2ggaW1wbGVtZW50IGEgbG93LWxldmVsXG4gKiBBUEkgZm9yIHN5bmNocm9uaXppbmcgSFRNTCBwYWdlcyB0byB0aGUgY2FudmFzLiBFYWNoIG92ZXJsYXkgbmVlZHNcbiAqIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHByb3RvY29sOlxuICpcbiAqICAgbW91bnQoKTogQ2FsbGVkIHdoZW4gYSBwYWdlIGlzIGZpcnN0IHJlbmRlcmVkXG4gKiAgIHJlZnJlc2goKTogQ2FsbGVkIHdoZW4gYSBwYWdlIGlzIG1vdmVkXG4gKiAgIHVubW91bnQoKTogQ2FsbGVkIHdoZW4gYSBwcmV2aW91c2x5IHJlbmRlcmVkIHBhZ2UgaGFzIHN0b3BwZWQgYmVpbmcgcmVuZGVyZWRcbiAqXG4gKiBAY2xhc3NcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlT3ZlcmxheU1hbmFnZXJcbntcbiAgICBjb25zdHJ1Y3RvciAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcGFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWRQYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZFBhZ2VNYXAgPSB7fTtcbiAgICB9XG5cbiAgICBhZGRPdmVybGF5IChvdmVybGF5KVxuICAgIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheXNCeVBhZ2UgPSB0aGlzLl9wYWdlc1tvdmVybGF5LnBhZ2VdIHx8ICh0aGlzLl9wYWdlc1tvdmVybGF5LnBhZ2VdID0gW10pO1xuXG4gICAgICAgIG92ZXJsYXlzQnlQYWdlLnB1c2gob3ZlcmxheSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkUGFnZU1hcFtvdmVybGF5LnBhZ2VdKVxuICAgICAgICAgICAgb3ZlcmxheS5tb3VudCgpO1xuICAgIH1cblxuICAgIHJlbW92ZU92ZXJsYXkgKG92ZXJsYXkpXG4gICAge1xuICAgICAgICBjb25zdCBwYWdlID0gb3ZlcmxheS5wYWdlO1xuICAgICAgICBjb25zdCBvdmVybGF5c0J5UGFnZSA9IHRoaXMuX3BhZ2VzW3BhZ2VdO1xuXG4gICAgICAgIGlmICghb3ZlcmxheXNCeVBhZ2UpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgb3ZlcmxheUluZGV4ID0gb3ZlcmxheXNCeVBhZ2UuaW5kZXhPZihvdmVybGF5KTtcblxuICAgICAgICBpZiAob3ZlcmxheUluZGV4ID09PSAtMSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fcmVuZGVyZWRQYWdlTWFwW3BhZ2VdKVxuICAgICAgICAgICAgb3ZlcmxheXNCeVBhZ2Vbb3ZlcmxheUluZGV4XS51bm1vdW50KCk7XG5cbiAgICAgICAgb3ZlcmxheXNCeVBhZ2Uuc3BsaWNlKG92ZXJsYXlJbmRleCwgMSk7XG5cbiAgICAgICAgaWYgKG92ZXJsYXlzQnlQYWdlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYWdlc1twYWdlXTtcbiAgICB9XG5cbiAgICB1cGRhdGVPdmVybGF5cyAocmVuZGVyZWRQYWdlcylcbiAgICB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzbHlSZW5kZXJlZCA9IHRoaXMuX3JlbmRlcmVkUGFnZXM7XG4gICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkTWFwID0ge307XG5cbiAgICAgICAgcmVuZGVyZWRQYWdlcy5tYXAoIChwYWdlSW5kZXgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIG5ld1JlbmRlcmVkTWFwW3BhZ2VJbmRleF0gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JlbmRlcmVkUGFnZU1hcFtwYWdlSW5kZXhdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkUGFnZU1hcFtwYWdlSW5kZXhdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZU9uT3ZlcmxheXMocGFnZUluZGV4LCBvdmVybGF5ID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvdmVybGF5Lm1vdW50KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByZXZpb3VzbHlSZW5kZXJlZC5tYXAoIChwYWdlSW5kZXgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdSZW5kZXJlZE1hcFtwYWdlSW5kZXhdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZU9uT3ZlcmxheXMocGFnZUluZGV4LCAob3ZlcmxheSkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZW5kZXJlZFBhZ2VNYXBbcGFnZUluZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VPbk92ZXJsYXlzKHBhZ2VJbmRleCwgb3ZlcmxheSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS51bm1vdW50KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcmVkUGFnZXMgPSByZW5kZXJlZFBhZ2VzO1xuICAgIH1cblxuICAgIF9pbnZva2VPbk92ZXJsYXlzIChwYWdlSW5kZXgsIGZ1bmMpXG4gICAge1xuICAgICAgICBjb25zdCBvdmVybGF5cyA9IHRoaXMuX3BhZ2VzW3BhZ2VJbmRleF07XG4gICAgICAgIGlmIChvdmVybGF5cylcbiAgICAgICAgICAgIG92ZXJsYXlzLm1hcCggKG8pID0+IGZ1bmMobykgKTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlQ292ZXJhZ2VNYXBcbntcbiAgICBjb25zdHJ1Y3RvciAocm93cywgY29scylcbiAgICB7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSByb3dzO1xuICAgICAgICB0aGlzLl9jb2xzID0gY29scztcbiAgICAgICAgdGhpcy5fbWFwID0gbmV3IEFycmF5KHJvd3MpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheShjb2xzKS5maWxsKGZhbHNlKSk7XG4gICAgfVxuXG4gICAgaXNMb2FkZWQgKHJvdywgY29sKVxuICAgIHtcbiAgICAgICAgLy8gUmV0dXJuIHRydWUgZm9yIG91dCBvZiBib3VuZHMgdGlsZXMgYmVjYXVzZSB0aGV5XG4gICAgICAgIC8vIGRvbid0IG5lZWQgdG8gbG9hZC4gKFVuZm9ydHVuYXRlbHkgdGhpcyB3aWxsIGFsc29cbiAgICAgICAgLy8gbWFzayBsb2dpY2FsIGVycm9ycy4pXG4gICAgICAgIGlmIChyb3cgPj0gdGhpcy5fcm93cyB8fCBjb2wgPj0gdGhpcy5fY29scylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXBbcm93XVtjb2xdO1xuICAgIH1cblxuICAgIHNldChyb3csIGNvbCwgdmFsdWUpXG4gICAge1xuICAgICAgICB0aGlzLl9tYXBbcm93XVtjb2xdID0gdmFsdWU7XG4gICAgfVxufSIsImltcG9ydCBUaWxlQ292ZXJhZ2VNYXAgZnJvbSBcIi4vdGlsZS1jb3ZlcmFnZS1tYXBcIjtcblxuLyoqXG4gKiBAY2xhc3MgQ29tcG9zaXRlSW1hZ2VcbiAqIEBwcml2YXRlXG4gKlxuICogVXRpbGl0eSBjbGFzcyB0byBjb21wb3NpdGUgdGlsZXMgaW50byBhIGNvbXBsZXRlIGltYWdlXG4gKiBhbmQgdHJhY2sgdGhlIHJlbmRlcmVkIHN0YXRlIG9mIGFuIGltYWdlIGFzIG5ldyB0aWxlc1xuICogbG9hZC5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSBsZXZlbHMge0FycmF5LjxBcnJheS48VGlsZT4+fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBvc2l0ZUltYWdlXG57XG4gICAgY29uc3RydWN0b3IobGV2ZWxzKVxuICAgIHtcbiAgICAgICAgdGhpcy5fbGV2ZWxzID0gbGV2ZWxzOyAgLy8gQXNzdW1lIGxldmVscyBzb3J0ZWQgaGlnaC1yZXMgZmlyc3RcbiAgICAgICAgY29uc3QgdXJsc1RvVGlsZXMgPSB0aGlzLl91cmxzVG9UaWxlcyA9IHt9O1xuXG4gICAgICAgIGxldmVscy5mb3JFYWNoKGxldmVsID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldmVsLnRpbGVzLmZvckVhY2godGlsZSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVybHNUb1RpbGVzW3RpbGUudXJsXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgem9vbUxldmVsOiBsZXZlbC56b29tTGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgIHJvdzogdGlsZS5yb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbDogdGlsZS5jb2xcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBjbGVhciAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgbG9hZGVkQnlMZXZlbCA9IHRoaXMuX2xvYWRlZEJ5TGV2ZWwgPSB7fTtcblxuICAgICAgICB0aGlzLl9sZXZlbHMuZm9yRWFjaChsZXZlbCA9PiB7XG4gICAgICAgICAgICBsb2FkZWRCeUxldmVsW2xldmVsLnpvb21MZXZlbF0gPSBuZXcgVGlsZUNvdmVyYWdlTWFwKGxldmVsLnJvd3MsIGxldmVsLmNvbHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUaWxlcyAoYmFzZVpvb21MZXZlbClcbiAgICB7XG4gICAgICAgIGNvbnN0IHRvUmVuZGVyQnlMZXZlbCA9IFtdO1xuICAgICAgICBjb25zdCBoaWdoZXN0Wm9vbUxldmVsID0gdGhpcy5fbGV2ZWxzWzBdLnpvb21MZXZlbDtcbiAgICAgICAgY29uc3QgY292ZXJlZCA9IG5ldyBUaWxlQ292ZXJhZ2VNYXAodGhpcy5fbGV2ZWxzWzBdLnJvd3MsIHRoaXMuX2xldmVsc1swXS5jb2xzKTtcblxuICAgICAgICBsZXQgYmVzdExldmVsSW5kZXg7XG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byB0aGUgbG93ZXN0IHpvb20gbGV2ZWxcbiAgICAgICAgaWYgKGJhc2Vab29tTGV2ZWwgPT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJlc3RMZXZlbEluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGNlaWxMZXZlbCA9IE1hdGguY2VpbChiYXNlWm9vbUxldmVsKTtcbiAgICAgICAgICAgIGJlc3RMZXZlbEluZGV4ID0gZmluZEluZGV4KHRoaXMuX2xldmVscywgbGV2ZWwgPT4gbGV2ZWwuem9vbUxldmVsIDw9IGNlaWxMZXZlbCk7XG4gICAgICAgICAgICAvLyBiZXN0TGV2ZWxJbmRleCA9IHRoaXMuX2xldmVscy5maW5kSW5kZXgoKGxldmVsKSA9PiBsZXZlbC56b29tTGV2ZWwgPD0gY2VpbExldmVsKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gVGhlIGJlc3QgbGV2ZWwsIGZvbGxvd2VkIGJ5IGhpZ2hlci1yZXMgbGV2ZWxzIGluIGFzY2VuZGluZyBvcmRlciBvZiByZXNvbHV0aW9uLFxuICAgICAgICAvLyBmb2xsb3dlZCBieSBsb3dlci1yZXMgbGV2ZWxzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgcmVzb2x1dGlvblxuICAgICAgICBjb25zdCBsZXZlbHNCeVByZWZlcmVuY2UgPSB0aGlzLl9sZXZlbHMuc2xpY2UoMCwgYmVzdExldmVsSW5kZXggKyAxKS5yZXZlcnNlKClcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5fbGV2ZWxzLnNsaWNlKGJlc3RMZXZlbEluZGV4ICsgMSkpO1xuXG4gICAgICAgIGxldmVsc0J5UHJlZmVyZW5jZS5mb3JFYWNoKCAobGV2ZWwpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMuX2xvYWRlZEJ5TGV2ZWxbbGV2ZWwuem9vbUxldmVsXTtcblxuICAgICAgICAgICAgbGV0IGFkZGl0aW9uYWxUaWxlcyA9IGxldmVsLnRpbGVzLmZpbHRlcih0aWxlID0+IGxvYWRlZC5pc0xvYWRlZCh0aWxlLnJvdywgdGlsZS5jb2wpKTtcblxuICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBlbnRpcmVseSBjb3ZlcmVkIHRpbGVzXG5cbiAgICAgICAgICAgIC8vIEZJWE1FOiBJcyBpdCBiZXR0ZXIgdG8gZHJhdyBhbGwgb2YgYSBwYXJ0aWFsbHkgY292ZXJlZCB0aWxlLFxuICAgICAgICAgICAgLy8gd2l0aCBzb21lIG9mIGl0IHVsdGltYXRlbHkgY292ZXJlZCwgb3IgdG8gcGljayBvdXQgdGhlIHJlZ2lvblxuICAgICAgICAgICAgLy8gd2hpY2ggbmVlZHMgdG8gYmUgZHJhd24/XG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0RETUFML2RpdmEuanMvaXNzdWVzLzM1OFxuICAgICAgICAgICAgY29uc3Qgc2NhbGVSYXRpbyA9IE1hdGgucG93KDIsIGhpZ2hlc3Rab29tTGV2ZWwgLSBsZXZlbC56b29tTGV2ZWwpO1xuXG4gICAgICAgICAgICBhZGRpdGlvbmFsVGlsZXMgPSBhZGRpdGlvbmFsVGlsZXMuZmlsdGVyKHRpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc05lZWRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGlnaFJlc1JvdyA9IHRpbGUucm93ICogc2NhbGVSYXRpbztcbiAgICAgICAgICAgICAgICBjb25zdCBoaWdoUmVzQ29sID0gdGlsZS5jb2wgKiBzY2FsZVJhdGlvO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc2NhbGVSYXRpbzsgaSsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgc2NhbGVSYXRpbzsgaisrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvdmVyZWQuaXNMb2FkZWQoaGlnaFJlc1JvdyArIGksIGhpZ2hSZXNDb2wgKyBqKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05lZWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJlZC5zZXQoaGlnaFJlc1JvdyArIGksIGhpZ2hSZXNDb2wgKyBqLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBpc05lZWRlZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0b1JlbmRlckJ5TGV2ZWwucHVzaChhZGRpdGlvbmFsVGlsZXMpO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICAvLyBMZXNzLXByZWZlcnJlZCB0aWxlcyBzaG91bGQgY29tZSBmaXJzdFxuICAgICAgICB0b1JlbmRlckJ5TGV2ZWwucmV2ZXJzZSgpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVzID0gW107XG5cbiAgICAgICAgdG9SZW5kZXJCeUxldmVsLmZvckVhY2goYnlMZXZlbCA9PiB7XG4gICAgICAgICAgICB0aWxlcy5wdXNoLmFwcGx5KHRpbGVzLCBieUxldmVsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRpbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgY29tcG9zaXRlIGltYWdlIHRvIHRha2UgaW50byBhY2NvdW50IGFsbCB0aGUgVVJMc1xuICAgICAqIGxvYWRlZCBpbiBhbiBpbWFnZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWNoZSB7SW1hZ2VDYWNoZX1cbiAgICAgKi9cbiAgICB1cGRhdGVGcm9tQ2FjaGUgKGNhY2hlKVxuICAgIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuXG4gICAgICAgIHRoaXMuX2xldmVscy5mb3JFYWNoKCAobGV2ZWwpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMuX2xvYWRlZEJ5TGV2ZWxbbGV2ZWwuem9vbUxldmVsXTtcblxuICAgICAgICAgICAgbGV2ZWwudGlsZXMuZm9yRWFjaCh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUuaGFzKHRpbGUudXJsKSlcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkLnNldCh0aWxlLnJvdywgdGlsZS5jb2wsIHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIHVwZGF0ZVdpdGhMb2FkZWRVcmxzICh1cmxzKVxuICAgIHtcbiAgICAgICAgdXJscy5mb3JFYWNoKCAodXJsKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX3VybHNUb1RpbGVzW3VybF07XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWRCeUxldmVsW2VudHJ5Lnpvb21MZXZlbF0uc2V0KGVudHJ5LnJvdywgZW50cnkuY29sLCB0cnVlKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufVxuXG4vLyBmdW5jdGlvbiBmaWxsIChjb3VudCwgdmFsdWUpXG4vLyB7XG4vLyAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGNvdW50KTtcbi8vXG4vLyAgICAgZm9yIChsZXQgaT0wOyBpIDwgY291bnQ7IGkrKylcbi8vICAgICAgICAgYXJyW2ldID0gdmFsdWU7XG4vL1xuLy8gICAgIHJldHVybiBhcnI7XG4vLyB9XG5cbmZ1bmN0aW9uIGZpbmRJbmRleCAoYXJyYXksIHByZWRpY2F0ZSlcbntcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaV0sIGkpKVxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xufVxuIiwiLyoqXG4gKiBUcmFuc2xhdGUgcGFnZSBsYXlvdXRzLCBhcyBnZW5lcmF0ZWQgYnkgcGFnZS1sYXlvdXRzLCBpbnRvIGFuXG4gKiBvYmplY3Qgd2hpY2ggY29tcHV0ZXMgbGF5b3V0IGluZm9ybWF0aW9uIGZvciB0aGUgZG9jdW1lbnQgYXNcbiAqIGEgd2hvbGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvY3VtZW50TGF5b3V0XG57XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZywgem9vbUxldmVsKVxuICAgIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRMYXlvdXQgPSBnZXRDb21wdXRlZExheW91dChjb25maWcsIHpvb21MZXZlbCk7XG5cbiAgICAgICAgdGhpcy5kaW1lbnNpb25zID0gY29tcHV0ZWRMYXlvdXQuZGltZW5zaW9ucztcbiAgICAgICAgdGhpcy5wYWdlR3JvdXBzID0gY29tcHV0ZWRMYXlvdXQucGFnZUdyb3VwcztcbiAgICAgICAgdGhpcy5fcGFnZUxvb2t1cCA9IGdldFBhZ2VMb29rdXAoY29tcHV0ZWRMYXlvdXQucGFnZUdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gUGFnZUluZm9cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXhcbiAgICAgKiBAcHJvcGVydHkge3tpbmRleCwgZGltZW5zaW9ucywgcGFnZXMsIHJlZ2lvbiwgcGFkZGluZ319IGdyb3VwXG4gICAgICogQHByb3BlcnR5IHt7aGVpZ2h0OiBudW1iZXIsIHdpZHRoOiBudW1iZXJ9fSBkaW1lbnNpb25zXG4gICAgICogQHByb3BlcnR5IHt7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcn19IGdyb3VwT2Zmc2V0XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcGFnZUluZGV4XG4gICAgICogQHJldHVybnMge1BhZ2VJbmZvfG51bGx9XG4gICAgICovXG4gICAgZ2V0UGFnZUluZm8gKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlTG9va3VwW3BhZ2VJbmRleF0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRpbWVuc2lvbnMgb2YgYSBwYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZUluZGV4XG4gICAgICogQHJldHVybnMge3toZWlnaHQ6IG51bWJlciwgd2lkdGg6IG51bWJlcn19XG4gICAgICovXG4gICAgZ2V0UGFnZURpbWVuc2lvbnMgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5fcGFnZUxvb2t1cCB8fCAhdGhpcy5fcGFnZUxvb2t1cFtwYWdlSW5kZXhdKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgcmVnaW9uID0gZ2V0UGFnZVJlZ2lvbkZyb21QYWdlSW5mbyh0aGlzLl9wYWdlTG9va3VwW3BhZ2VJbmRleF0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoZWlnaHQ6IHJlZ2lvbi5ib3R0b20gLSByZWdpb24udG9wLFxuICAgICAgICAgICAgd2lkdGg6IHJlZ2lvbi5yaWdodCAtIHJlZ2lvbi5sZWZ0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVE9ETyh3YWJhaW4pOiBHZXQgcmlkIG9mIHRoaXM7IGl0J3MgYSBzdWJzZXQgb2YgdGhlIHBhZ2UgcmVnaW9uLCBzb1xuICAgIC8vIGdpdmUgdGhhdCBpbnN0ZWFkXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0b3AtbGVmdCBjb29yZGluYXRlcyBvZiBhIHBhZ2UsIGluY2x1ZGluZyoqKiBwYWRkaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZUluZGV4XG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7e3RvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXJ9IHwgbnVsbH1cbiAgICAgKi9cbiAgICBnZXRQYWdlT2Zmc2V0IChwYWdlSW5kZXgsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBjb25zdCByZWdpb24gPSB0aGlzLmdldFBhZ2VSZWdpb24ocGFnZUluZGV4LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoIXJlZ2lvbilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IHJlZ2lvbi50b3AsXG4gICAgICAgICAgICBsZWZ0OiByZWdpb24ubGVmdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFBhZ2VSZWdpb24gKHBhZ2VJbmRleCwgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIGNvbnN0IHBhZ2VJbmZvID0gdGhpcy5fcGFnZUxvb2t1cFtwYWdlSW5kZXhdO1xuXG4gICAgICAgIGlmICghcGFnZUluZm8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByZWdpb24gPSBnZXRQYWdlUmVnaW9uRnJvbVBhZ2VJbmZvKHBhZ2VJbmZvKTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IHBhZ2VJbmZvLmdyb3VwLnBhZGRpbmc7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlUGFkZGluZylcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b3A6IHJlZ2lvbi50b3AgKyBwYWRkaW5nLnRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiByZWdpb24ubGVmdCArIHBhZGRpbmcubGVmdCxcbiAgICAgICAgICAgICAgICBib3R0b206IHJlZ2lvbi5ib3R0b20sXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHJlZ2lvbi5yaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IHJlZ2lvbi50b3AsXG4gICAgICAgICAgICBsZWZ0OiByZWdpb24ubGVmdCxcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gYWNjb3VudCBmb3IgcGx1Z2luIGljb25zIGJlbG93IHRoZSBwYWdlLCBzZWUgXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vRERNQUwvZGl2YS5qcy9pc3N1ZXMvNDM2XG4gICAgICAgICAgICBib3R0b206IHJlZ2lvbi5ib3R0b20gKyBwYWRkaW5nLnRvcCwgXG4gICAgICAgICAgICByaWdodDogcmVnaW9uLnJpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3AtcmlnaHQgb2YgdGhlIHBhZ2UgdG8gdGhlIGNlbnRlciBvZiB0aGVcbiAgICAgKiBzcGVjaWZpZWQgdmlld3BvcnQgcmVnaW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZUluZGV4XG4gICAgICogQHBhcmFtIHZpZXdwb3J0IHt7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHJpZ2h0OiBudW1iZXJ9fVxuICAgICAqIEByZXR1cm5zIHt7eDogbnVtYmVyLCB5OiBudW1iZXJ9fVxuICAgICAqL1xuICAgIGdldFBhZ2VUb1ZpZXdwb3J0Q2VudGVyT2Zmc2V0IChwYWdlSW5kZXgsIHZpZXdwb3J0KVxuICAgIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHZpZXdwb3J0LmxlZnQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHZpZXdwb3J0LnJpZ2h0IC0gdmlld3BvcnQubGVmdDtcblxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmdldFBhZ2VPZmZzZXQocGFnZUluZGV4KTtcblxuICAgICAgICBjb25zdCB4ID0gc2Nyb2xsTGVmdCAtIG9mZnNldC5sZWZ0ICsgcGFyc2VJbnQoZWxlbWVudFdpZHRoIC8gMiwgMTApO1xuXG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHZpZXdwb3J0LnRvcDtcbiAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHZpZXdwb3J0LmJvdHRvbSAtIHZpZXdwb3J0LnRvcDtcblxuICAgICAgICBjb25zdCB5ID0gc2Nyb2xsVG9wIC0gb2Zmc2V0LnRvcCArIHBhcnNlSW50KGVsZW1lbnRIZWlnaHQgLyAyLCAxMCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYWdlUmVnaW9uRnJvbVBhZ2VJbmZvIChwYWdlKVxue1xuICAgIGNvbnN0IHRvcCAgICA9IHBhZ2UuZ3JvdXBPZmZzZXQudG9wICArIHBhZ2UuZ3JvdXAucmVnaW9uLnRvcDtcbiAgICBjb25zdCBib3R0b20gPSB0b3AgKyBwYWdlLmRpbWVuc2lvbnMuaGVpZ2h0O1xuICAgIGNvbnN0IGxlZnQgICA9IHBhZ2UuZ3JvdXBPZmZzZXQubGVmdCArIHBhZ2UuZ3JvdXAucmVnaW9uLmxlZnQ7XG4gICAgY29uc3QgcmlnaHQgID0gbGVmdCArIHBhZ2UuZGltZW5zaW9ucy53aWR0aDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBib3R0b206IGJvdHRvbSxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFnZUxvb2t1cCAocGFnZUdyb3VwcylcbntcbiAgICBjb25zdCBwYWdlTG9va3VwID0ge307XG5cbiAgICBwYWdlR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBncm91cC5wYWdlcy5mb3JFYWNoKHBhZ2UgPT4ge1xuICAgICAgICAgICAgcGFnZUxvb2t1cFtwYWdlLmluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICBpbmRleDogcGFnZS5pbmRleCxcbiAgICAgICAgICAgICAgICBncm91cDogZ3JvdXAsXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogcGFnZS5kaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgIGdyb3VwT2Zmc2V0OiBwYWdlLmdyb3VwT2Zmc2V0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwYWdlTG9va3VwO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wdXRlZExheW91dCAoY29uZmlnLCB6b29tTGV2ZWwpXG57XG4gICAgY29uc3Qgc2NhbGVkTGF5b3V0cyA9IHpvb21MZXZlbCA9PT0gbnVsbCA/IGNvbmZpZy5wYWdlTGF5b3V0cyA6IGdldFNjYWxlZFBhZ2VMYXlvdXRzKGNvbmZpZywgem9vbUxldmVsKTtcblxuICAgIGNvbnN0IGRvY3VtZW50U2Vjb25kYXJ5RXh0ZW50ID0gZ2V0RXh0ZW50QWxvbmdTZWNvbmRhcnlBeGlzKGNvbmZpZywgc2NhbGVkTGF5b3V0cyk7XG5cbiAgICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYWxvbmcgdGhlIHByaW1hcnkgYXhpc1xuICAgIGxldCBwcmltYXJ5RG9jUG9zaXRpb24gPSBjb25maWcudmVydGljYWxseU9yaWVudGVkID9cbiAgICAgICAgY29uZmlnLnBhZGRpbmcuZG9jdW1lbnQudG9wIDpcbiAgICAgICAgY29uZmlnLnBhZGRpbmcuZG9jdW1lbnQubGVmdDtcblxuICAgIGNvbnN0IHBhZ2VHcm91cHMgPSBbXTtcblxuICAgIC8vIFRPRE86IFVzZSBib3R0b20sIHJpZ2h0IGFzIHdlbGxcbiAgICBjb25zdCBwYWdlUGFkZGluZyA9IHtcbiAgICAgICAgdG9wOiBjb25maWcucGFkZGluZy5wYWdlLnRvcCxcbiAgICAgICAgbGVmdDogY29uZmlnLnBhZGRpbmcucGFnZS5sZWZ0XG4gICAgfTtcblxuICAgIHNjYWxlZExheW91dHMuZm9yRWFjaCgobGF5b3V0LCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgdG9wLCBsZWZ0O1xuXG4gICAgICAgIGlmIChjb25maWcudmVydGljYWxseU9yaWVudGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0b3AgPSBwcmltYXJ5RG9jUG9zaXRpb247XG4gICAgICAgICAgICBsZWZ0ID0gKGRvY3VtZW50U2Vjb25kYXJ5RXh0ZW50IC0gbGF5b3V0LmRpbWVuc2lvbnMud2lkdGgpIC8gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRvcCA9IChkb2N1bWVudFNlY29uZGFyeUV4dGVudCAtIGxheW91dC5kaW1lbnNpb25zLmhlaWdodCkgLyAyO1xuICAgICAgICAgICAgbGVmdCA9IHByaW1hcnlEb2NQb3NpdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHtcbiAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgYm90dG9tOiB0b3AgKyBwYWdlUGFkZGluZy50b3AgKyBsYXlvdXQuZGltZW5zaW9ucy5oZWlnaHQsXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IGxlZnQgKyBwYWdlUGFkZGluZy5sZWZ0ICsgbGF5b3V0LmRpbWVuc2lvbnMud2lkdGhcbiAgICAgICAgfTtcblxuICAgICAgICBwYWdlR3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgZGltZW5zaW9uczogbGF5b3V0LmRpbWVuc2lvbnMsXG4gICAgICAgICAgICBwYWdlczogbGF5b3V0LnBhZ2VzLFxuICAgICAgICAgICAgcmVnaW9uOiByZWdpb24sXG4gICAgICAgICAgICBwYWRkaW5nOiBwYWdlUGFkZGluZ1xuICAgICAgICB9KTtcblxuICAgICAgICBwcmltYXJ5RG9jUG9zaXRpb24gPSBjb25maWcudmVydGljYWxseU9yaWVudGVkID8gcmVnaW9uLmJvdHRvbSA6IHJlZ2lvbi5yaWdodDtcbiAgICB9KTtcblxuICAgIGxldCBoZWlnaHQsIHdpZHRoO1xuXG4gICAgaWYgKGNvbmZpZy52ZXJ0aWNhbGx5T3JpZW50ZWQpXG4gICAge1xuICAgICAgICBoZWlnaHQgPSBwcmltYXJ5RG9jUG9zaXRpb24gKyBwYWdlUGFkZGluZy50b3A7XG4gICAgICAgIHdpZHRoID0gZG9jdW1lbnRTZWNvbmRhcnlFeHRlbnQ7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGhlaWdodCA9IGRvY3VtZW50U2Vjb25kYXJ5RXh0ZW50O1xuICAgICAgICB3aWR0aCA9IHByaW1hcnlEb2NQb3NpdGlvbiArIHBhZ2VQYWRkaW5nLmxlZnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGhcbiAgICAgICAgfSxcbiAgICAgICAgcGFnZUdyb3VwczogcGFnZUdyb3Vwc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldFNjYWxlZFBhZ2VMYXlvdXRzIChjb25maWcsIHpvb21MZXZlbClcbntcbiAgICBjb25zdCBzY2FsZVJhdGlvID0gTWF0aC5wb3coMiwgem9vbUxldmVsIC0gY29uZmlnLm1heFpvb21MZXZlbCk7XG5cbiAgICByZXR1cm4gY29uZmlnLnBhZ2VMYXlvdXRzLm1hcChncm91cCA9PiAoe1xuICAgICAgICBkaW1lbnNpb25zOiBzY2FsZURpbWVuc2lvbnMoZ3JvdXAuZGltZW5zaW9ucywgc2NhbGVSYXRpbyksXG5cbiAgICAgICAgcGFnZXM6IGdyb3VwLnBhZ2VzLm1hcChwYWdlID0+ICh7XG4gICAgICAgICAgICBpbmRleDogcGFnZS5pbmRleCxcblxuICAgICAgICAgICAgZ3JvdXBPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICB0b3A6IE1hdGguZmxvb3IocGFnZS5ncm91cE9mZnNldC50b3AgKiBzY2FsZVJhdGlvKSxcbiAgICAgICAgICAgICAgICBsZWZ0OiBNYXRoLmZsb29yKHBhZ2UuZ3JvdXBPZmZzZXQubGVmdCAqIHNjYWxlUmF0aW8pXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBzY2FsZURpbWVuc2lvbnMocGFnZS5kaW1lbnNpb25zLCBzY2FsZVJhdGlvKVxuICAgICAgICB9KSlcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIHNjYWxlRGltZW5zaW9ucyAoZGltZW5zaW9ucywgc2NhbGVSYXRpbylcbntcbiAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IE1hdGguZmxvb3IoZGltZW5zaW9ucy5oZWlnaHQgKiBzY2FsZVJhdGlvKSxcbiAgICAgICAgd2lkdGg6IE1hdGguZmxvb3IoZGltZW5zaW9ucy53aWR0aCAqIHNjYWxlUmF0aW8pXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0ZW50QWxvbmdTZWNvbmRhcnlBeGlzIChjb25maWcsIHNjYWxlZExheW91dHMpXG57XG4gICAgLy8gR2V0IHRoZSBleHRlbnQgb2YgdGhlIGRvY3VtZW50IGFsb25nIHRoZSBzZWNvbmRhcnkgYXhpc1xuICAgIGxldCBzZWNvbmRhcnlEaW0sIHNlY29uZGFyeVBhZGRpbmc7XG4gICAgY29uc3QgZG9jUGFkZGluZyA9IGNvbmZpZy5wYWRkaW5nLmRvY3VtZW50O1xuXG4gICAgaWYgKGNvbmZpZy52ZXJ0aWNhbGx5T3JpZW50ZWQpXG4gICAge1xuICAgICAgICBzZWNvbmRhcnlEaW0gPSAnd2lkdGgnO1xuICAgICAgICBzZWNvbmRhcnlQYWRkaW5nID0gZG9jUGFkZGluZy5sZWZ0ICsgZG9jUGFkZGluZy5yaWdodDtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgc2Vjb25kYXJ5RGltID0gJ2hlaWdodCc7XG4gICAgICAgIHNlY29uZGFyeVBhZGRpbmcgPSBkb2NQYWRkaW5nLnRvcCArIGRvY1BhZGRpbmcuYm90dG9tO1xuICAgIH1cblxuICAgIHJldHVybiBzZWNvbmRhcnlQYWRkaW5nICsgc2NhbGVkTGF5b3V0cy5yZWR1Y2UoKG1heERpbSwgbGF5b3V0KSA9PiBNYXRoLm1heChsYXlvdXQuZGltZW5zaW9uc1tzZWNvbmRhcnlEaW1dLCBtYXhEaW0pLCAwKTtcbn1cbiIsImNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZGl2YTpJbWFnZUNhY2hlJyk7XG5cbi8qIEZJWE1FKHdhYmFpbik6IFRoZSBjYWNoaW5nIHN0cmF0ZWd5IGhlcmUgaXMgY29tcGxldGVseVxuICogYXJiaXRyYXJ5IGFuZCB0aGUgaW1wbGVtZW50YXRpb24gaXNuJ3QgZXNwZWNpYWxseSBlZmZpY2llbnQuXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX0tFWVMgPSAxMDA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlQ2FjaGVcbntcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHsgbWF4S2V5czogREVGQVVMVF9NQVhfS0VZUyB9O1xuICAgICAgICB0aGlzLm1heEtleXMgPSBvcHRpb25zLm1heEtleXMgfHwgREVGQVVMVF9NQVhfS0VZUztcblxuICAgICAgICB0aGlzLl9oZWxkID0ge307XG4gICAgICAgIHRoaXMuX3VybHMgPSB7fTtcbiAgICAgICAgdGhpcy5fbHJ1ID0gW107XG4gICAgfVxuXG4gICAgZ2V0ICh1cmwpXG4gICAge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLl91cmxzW3VybF07XG4gICAgICAgIHJldHVybiByZWNvcmQgPyByZWNvcmQuaW1nIDogbnVsbDtcbiAgICB9XG5cbiAgICBoYXMgKHVybClcbiAgICB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3VybHNbdXJsXTtcbiAgICB9XG5cbiAgICBwdXQgKHVybCwgaW1nKVxuICAgIHtcbiAgICAgICAgbGV0IHJlY29yZCA9IHRoaXMuX3VybHNbdXJsXTtcbiAgICAgICAgaWYgKHJlY29yZClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gRklYTUU6IERvZXMgdGhpcyBtYWtlIHNlbnNlIGZvciB0aGlzIHVzZSBjYXNlP1xuICAgICAgICAgICAgcmVjb3JkLmltZyA9IGltZztcbiAgICAgICAgICAgIHRoaXMuX3Byb21vdGUocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlY29yZCA9IHtcbiAgICAgICAgICAgICAgICBpbWc6IGltZyxcbiAgICAgICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fdXJsc1t1cmxdID0gcmVjb3JkO1xuICAgICAgICAgICAgdGhpcy5fdHJ5RXZpY3QoMSk7XG4gICAgICAgICAgICB0aGlzLl9scnUudW5zaGlmdChyZWNvcmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3Byb21vdGUgKHJlY29yZClcbiAgICB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbHJ1LmluZGV4T2YocmVjb3JkKTtcbiAgICAgICAgdGhpcy5fbHJ1LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuX2xydS51bnNoaWZ0KHJlY29yZCk7XG4gICAgfVxuXG4gICAgX3RyeUV2aWN0IChleHRyYUNhcGFjaXR5KVxuICAgIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZEVudHJ5Q291bnQgPSB0aGlzLm1heEtleXMgLSBleHRyYUNhcGFjaXR5O1xuXG4gICAgICAgIGlmICh0aGlzLl9scnUubGVuZ3RoIDw9IGFsbG93ZWRFbnRyeUNvdW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBldmljdGlvbkluZGV4ID0gdGhpcy5fbHJ1Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgZm9yICg7OylcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5fbHJ1W2V2aWN0aW9uSW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2hlbGRbdGFyZ2V0LnVybF0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ0V2aWN0aW5nIGltYWdlICVzJywgdGFyZ2V0LnVybCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbHJ1LnNwbGljZShldmljdGlvbkluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdXJsc1t0YXJnZXQudXJsXTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9scnUubGVuZ3RoIDw9IGFsbG93ZWRFbnRyeUNvdW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV2aWN0aW9uSW5kZXggPT09IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgICAgICBkZWJ1Zy5lbmFibGVkICYmIGRlYnVnKCdDYWNoZSBvdmVyZnVsbCBieSAlcyAoYWxsIGVudHJpZXMgYXJlIGJlaW5nIGhlbGQpJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbHJ1Lmxlbmd0aCAtIGFsbG93ZWRFbnRyeUNvdW50KTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBldmljdGlvbkluZGV4LS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhY3F1aXJlICh1cmwpXG4gICAge1xuICAgICAgICB0aGlzLl9oZWxkW3VybF0gPSAodGhpcy5faGVsZFt1cmxdIHx8IDApICsgMTtcbiAgICAgICAgdGhpcy5fcHJvbW90ZSh0aGlzLl91cmxzW3VybF0pO1xuICAgIH1cblxuICAgIHJlbGVhc2UgKHVybClcbiAgICB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5faGVsZFt1cmxdO1xuXG4gICAgICAgIGlmIChjb3VudCA+IDEpXG4gICAgICAgICAgICB0aGlzLl9oZWxkW3VybF0tLTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2hlbGRbdXJsXTtcblxuICAgICAgICB0aGlzLl90cnlFdmljdCgwKTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEhhbmRsZXIgZm9yIHRoZSByZXF1ZXN0IGZvciBhbiBpbWFnZSB0aWxlXG4gKlxuICogQHBhcmFtIHVybFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2VSZXF1ZXN0SGFuZGxlclxue1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gb3B0aW9ucy5sb2FkO1xuICAgICAgICB0aGlzLl9lcnJvckNhbGxiYWNrID0gb3B0aW9ucy5lcnJvcjtcbiAgICAgICAgdGhpcy50aW1lb3V0VGltZSA9IG9wdGlvbnMudGltZW91dFRpbWUgfHwgMDtcbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IHRoaXMuX2NvbXBsZXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Nyb3NzT3JpZ2luID0gb3B0aW9ucy5zZXR0aW5ncy5pbWFnZUNyb3NzT3JpZ2luO1xuXG4gICAgICAgIC8vVXNlIGEgdGltZW91dCB0byBhbGxvdyB0aGUgcmVxdWVzdHMgdG8gYmUgZGVib3VuY2VkIChhcyB0aGV5IGFyZSBpbiByZW5kZXJlcilcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBJbml0aWF0ZSB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgdGhpcy5faW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5fY3Jvc3NPcmlnaW47XG4gICAgICAgICAgICB0aGlzLl9pbWFnZS5vbmxvYWQgPSB0aGlzLl9oYW5kbGVMb2FkLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbWFnZS5vbmVycm9yID0gdGhpcy5faGFuZGxlRXJyb3IuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlLnNyYyA9IG9wdGlvbnMudXJsO1xuXG4gICAgICAgIH0sIHRoaXMudGltZW91dFRpbWUpO1xuICAgIH1cblxuICAgIGFib3J0ICgpXG4gICAge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcblxuICAgICAgICAvLyBGSVhNRVxuICAgICAgICAvLyBQZW9wbGUgb24gdGhlIEludGVybmV0IHNheSB0aGF0IGRvaW5nIHRoaXMge3tzaG91bGQvc2hvdWxkIG5vdH19IGFib3J0IHRoZSByZXF1ZXN0LiBJIGJlbGlldmVcbiAgICAgICAgLy8gaXQgY29ycmVzcG9uZHMgdG8gd2hhdCB0aGUgV0hBVFdHIEhUTUwgc3BlYyBzYXlzIHNob3VsZCBoYXBwZW4gd2hlbiB0aGUgVUFcbiAgICAgICAgLy8gdXBkYXRlcyB0aGUgaW1hZ2UgZGF0YSBpZiBzZWxlY3RlZCBzb3VyY2UgaXMgbnVsbC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU291cmNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RoZS1pbWctZWxlbWVudFxuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzczOTA4ODgvZG9lcy1jaGFuZ2luZy10aGUtc3JjLWF0dHJpYnV0ZS1vZi1hbi1pbWFnZS1zdG9wLXRoZS1pbWFnZS1mcm9tLWRvd25sb2FkaW5nXG4gICAgICAgIGlmICh0aGlzLl9pbWFnZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5faW1hZ2Uub25sb2FkID0gdGhpcy5faW1hZ2Uub25lcnJvciA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMuX2ltYWdlLnNyYyA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2hhbmRsZUxvYWQgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLl9hYm9ydGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbWFnZVJlcXVlc3RIYW5kbGVyIGludm9rZWQgb24gY2FuY2VsbGVkIHJlcXVlc3QgZm9yICcgKyB0aGlzLl91cmwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbXBsZXRlKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbWFnZVJlcXVlc3RIYW5kbGVyIGludm9rZWQgb24gY29tcGxldGVkIHJlcXVlc3QgZm9yICcgKyB0aGlzLl91cmwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29tcGxldGUgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrKHRoaXMuX2ltYWdlKTtcbiAgICB9XG5cbiAgICBfaGFuZGxlRXJyb3IgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2Vycm9yQ2FsbGJhY2sodGhpcy5faW1hZ2UpO1xuICAgIH1cbn1cbiIsIi8vIFRPRE86IHJlcXVlc3RBbmltYXRpb25GcmFtZSBmYWxsYmFja1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgYW5pbWF0ZSxcbiAgICBlYXNpbmc6IHtcbiAgICAgICAgbGluZWFyOiBsaW5lYXJFYXNpbmcsXG4gICAgICAgIGN1YmljOiBpbk91dEN1YmljRWFzaW5nXG4gICAgfVxufTtcblxubGV0IG5vdztcblxuaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgJiYgcGVyZm9ybWFuY2Uubm93KVxue1xuICAgIG5vdyA9ICgpID0+IHsgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOyB9O1xufVxuZWxzZVxue1xuICAgIG5vdyA9ICgpID0+IHsgcmV0dXJuIERhdGUubm93KCk7IH07XG59XG5cblxuZnVuY3Rpb24gYW5pbWF0ZSAob3B0aW9ucylcbntcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gb3B0aW9ucy5kdXJhdGlvbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gb3B0aW9ucy5wYXJhbWV0ZXJzO1xuICAgIGNvbnN0IG9uVXBkYXRlID0gb3B0aW9ucy5vblVwZGF0ZTtcbiAgICBjb25zdCBvbkVuZCA9IG9wdGlvbnMub25FbmQ7XG5cbiAgICAvLyBTZXR1cFxuICAgIC8vIFRpbWVzIGFyZSBpbiBtaWxsaXNlY29uZHMgZnJvbSBhIGJhc2ljYWxseSBhcmJpdHJhcnkgc3RhcnRcbiAgICBjb25zdCBzdGFydCA9IG5vdygpO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgZHVyYXRpb25NcztcblxuICAgIGNvbnN0IHR3ZWVuRm5zID0ge307XG4gICAgY29uc3QgdmFsdWVzID0ge307XG4gICAgY29uc3QgcGFyYW1LZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVycyk7XG5cbiAgICBwYXJhbUtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBjb25maWcgPSBwYXJhbWV0ZXJzW2tleV07XG4gICAgICAgIHR3ZWVuRm5zW2tleV0gPSBpbnRlcnBvbGF0ZShjb25maWcuZnJvbSwgY29uZmlnLnRvLCBjb25maWcuZWFzaW5nIHx8IGluT3V0Q3ViaWNFYXNpbmcpO1xuICAgIH0pO1xuXG4gICAgLy8gUnVuIGl0IVxuICAgIGxldCByZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbCgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgIT09IG51bGwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVBbmltYXRpb25Db21wbGV0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiB1cGRhdGUoKVxuICAgIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IG5vdygpO1xuICAgICAgICBjb25zdCBlbGFwc2VkID0gTWF0aC5taW4oKGN1cnJlbnQgLSBzdGFydCkgLyBkdXJhdGlvbk1zLCAxKTtcblxuICAgICAgICB1cGRhdGVWYWx1ZXMoZWxhcHNlZCk7XG4gICAgICAgIG9uVXBkYXRlKHZhbHVlcyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPCBlbmQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlQW5pbWF0aW9uQ29tcGxldGlvbih7XG4gICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZhbHVlcyhlbGFwc2VkKVxuICAgIHtcbiAgICAgICAgcGFyYW1LZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdHdlZW5GbnNba2V5XShlbGFwc2VkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlQW5pbWF0aW9uQ29tcGxldGlvbihpbmZvKVxuICAgIHtcbiAgICAgICAgcmVxdWVzdElkID0gbnVsbDtcblxuICAgICAgICBpZiAob25FbmQpXG4gICAgICAgICAgICBvbkVuZChpbmZvKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlKHN0YXJ0LCBlbmQsIGVhc2luZylcbntcbiAgICByZXR1cm4gKGVsYXBzZWQpID0+IHsgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIGVhc2luZyhlbGFwc2VkKTsgfTtcbn1cblxuLyoqXG4gKiBFYXNpbmcgZnVuY3Rpb25zLiBpbk91dEN1YmljRWFzaW5nIGlzIHRoZSBkZWZhdWx0LCBidXRcbiAqIG90aGVycyBhcmUgZ2l2ZW4gZm9yIGNvbnZlbmllbmNlLlxuICpcbiAqKi9cbmZ1bmN0aW9uIGxpbmVhckVhc2luZyhlKVxue1xuICAgIHJldHVybiBlO1xufVxuXG4vKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5mdW5jdGlvbiBpbk91dFF1YWRFYXNpbmcgKGUpXG57XG4gICAgcmV0dXJuIGUgPCAuNSA/IDIgKiBlICogZSA6IC0xKyg0LTIgKiBlKSAqIGVcbn1cbi8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cblxuZnVuY3Rpb24gaW5PdXRDdWJpY0Vhc2luZyAodClcbntcbiAgICByZXR1cm4gdCA8IDAuNSA/IDQgKiB0ICogdCAqIHQgOiAoIHQgLSAxICkgKiAoIDIgKiB0IC0gMiApICogKCAyICogdCAtIDIgKSArIDE7XG59XG4iLCJpbXBvcnQgeyBlbHQsIHNldEF0dHJpYnV0ZXMgfSBmcm9tICcuL3V0aWxzL2VsdCc7XG5pbXBvcnQgQ29tcG9zaXRlSW1hZ2UgZnJvbSAnLi9jb21wb3NpdGUtaW1hZ2UnO1xuaW1wb3J0IERvY3VtZW50TGF5b3V0IGZyb20gJy4vZG9jdW1lbnQtbGF5b3V0JztcbmltcG9ydCBJbWFnZUNhY2hlIGZyb20gJy4vaW1hZ2UtY2FjaGUnO1xuaW1wb3J0IEltYWdlUmVxdWVzdEhhbmRsZXIgZnJvbSAnLi9pbWFnZS1yZXF1ZXN0LWhhbmRsZXInO1xuaW1wb3J0IEludGVycG9sYXRlQW5pbWF0aW9uIGZyb20gJy4vaW50ZXJwb2xhdGUtYW5pbWF0aW9uJztcblxuY29uc3QgUkVRVUVTVF9ERUJPVU5DRV9JTlRFUlZBTCA9IDI1MDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZXJcbntcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucywgaG9va3MpXG4gICAge1xuICAgICAgICB0aGlzLl92aWV3cG9ydCA9IG9wdGlvbnMudmlld3BvcnQ7XG4gICAgICAgIHRoaXMuX291dGVyRWxlbWVudCA9IG9wdGlvbnMub3V0ZXJFbGVtZW50O1xuICAgICAgICB0aGlzLl9kb2N1bWVudEVsZW1lbnQgPSBvcHRpb25zLmlubmVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBvcHRpb25zLnNldHRpbmdzO1xuXG4gICAgICAgIHRoaXMuX2hvb2tzID0gaG9va3MgfHwge307XG5cbiAgICAgICAgdGhpcy5fY2FudmFzID0gZWx0KCdjYW52YXMnLCB7IGNsYXNzOiAnZGl2YS12aWV3ZXItY2FudmFzJyB9KTtcbiAgICAgICAgdGhpcy5fY3R4ID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgdGhpcy5sYXlvdXQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3NvdXJjZVJlc29sdmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWRQYWdlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3pvb21MZXZlbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvbXBvc2l0ZUltYWdlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkVGlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9hbmltYXRpb24gPSBudWxsO1xuXG4gICAgICAgIC8vIEZJWE1FKHdhYmFpbik6IFdoYXQgbGV2ZWwgc2hvdWxkIHRoaXMgYmUgbWFpbnRhaW5lZCBhdD9cbiAgICAgICAgLy8gRGl2YSBnbG9iYWw/XG4gICAgICAgIHRoaXMuX2NhY2hlID0gbmV3IEltYWdlQ2FjaGUoKTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlcXVlc3RzID0ge307XG4gICAgfVxuXG4gICAgc3RhdGljIGdldENvbXBhdGliaWxpdHlFcnJvcnMgKClcbiAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnWW91ciBicm93c2VyIGxhY2tzIHN1cHBvcnQgZm9yIHRoZSAnLCBlbHQoJ3ByZScsICdjYW52YXMnKSxcbiAgICAgICAgICAgICcgZWxlbWVudC4gUGxlYXNlIHVwZ3JhZGUgeW91ciBicm93c2VyLidcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBsb2FkIChjb25maWcsIHZpZXdwb3J0UG9zaXRpb24sIHNvdXJjZVJlc29sdmVyKVxuICAgIHtcbiAgICAgICAgdGhpcy5fY2xlYXJBbmltYXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5faG9va3Mub25WaWV3V2lsbExvYWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2hvb2tzLm9uVmlld1dpbGxMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zb3VyY2VSZXNvbHZlciA9IHNvdXJjZVJlc29sdmVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2NvbXBvc2l0ZUltYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLl9zZXRMYXlvdXRUb1pvb21MZXZlbCh2aWV3cG9ydFBvc2l0aW9uLnpvb21MZXZlbCk7XG5cbiAgICAgICAgLy8gRklYTUUod2FiYWluKTogUmVtb3ZlIHRoaXMgd2hlbiB0aGVyZSdzIG1vcmUgY29uZmlkZW5jZSB0aGUgY2hlY2sgc2hvdWxkbid0IGJlIG5lZWRlZFxuICAgICAgICBpZiAoIXRoaXMubGF5b3V0LmdldFBhZ2VJbmZvKHZpZXdwb3J0UG9zaXRpb24uYW5jaG9yUGFnZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYWdlOiAnICsgdmlld3BvcnRQb3NpdGlvbi5hbmNob3JQYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jYW52YXMud2lkdGggIT09IHRoaXMuX3ZpZXdwb3J0LndpZHRoIHx8IHRoaXMuX2NhbnZhcy5oZWlnaHQgIT09IHRoaXMuX3ZpZXdwb3J0LmhlaWdodClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fY2FudmFzLndpZHRoID0gdGhpcy5fdmlld3BvcnQud2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9jYW52YXMuaGVpZ2h0ID0gdGhpcy5fdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRklYTUU6IFdoYXQgaG9va3Mgc2hvdWxkIGJlIGNhbGxlZCBoZXJlP1xuICAgICAgICB0aGlzLmdvdG8odmlld3BvcnRQb3NpdGlvbi5hbmNob3JQYWdlLCB2aWV3cG9ydFBvc2l0aW9uLnZlcnRpY2FsT2Zmc2V0LCB2aWV3cG9ydFBvc2l0aW9uLmhvcml6b250YWxPZmZzZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jYW52YXMucGFyZW50Tm9kZSAhPT0gdGhpcy5fb3V0ZXJFbGVtZW50KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9vdXRlckVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2NhbnZhcywgdGhpcy5fb3V0ZXJFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2hvb2tzLm9uVmlld0RpZExvYWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2hvb2tzLm9uVmlld0RpZExvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXRWaWV3cG9ydFBvc2l0aW9uICh2aWV3cG9ydFBvc2l0aW9uKVxuICAgIHtcbiAgICAgICAgaWYgKHZpZXdwb3J0UG9zaXRpb24uem9vbUxldmVsICE9PSB0aGlzLl96b29tTGV2ZWwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl96b29tTGV2ZWwgPT09IG51bGwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGN1cnJlbnQgdmlldyBpcyBub3Qgem9vbWFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZpZXdwb3J0UG9zaXRpb24uem9vbUxldmVsID09PSBudWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjdXJyZW50IHZpZXcgcmVxdWlyZXMgYSB6b29tIGxldmVsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3NldExheW91dFRvWm9vbUxldmVsKHZpZXdwb3J0UG9zaXRpb24uem9vbUxldmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dvdG8odmlld3BvcnRQb3NpdGlvbi5hbmNob3JQYWdlLCB2aWV3cG9ydFBvc2l0aW9uLnZlcnRpY2FsT2Zmc2V0LCB2aWV3cG9ydFBvc2l0aW9uLmhvcml6b250YWxPZmZzZXQpO1xuICAgIH1cblxuICAgIF9zZXRMYXlvdXRUb1pvb21MZXZlbCAoem9vbUxldmVsKVxuICAgIHtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBuZXcgRG9jdW1lbnRMYXlvdXQodGhpcy5fY29uZmlnLCB6b29tTGV2ZWwpO1xuICAgICAgICB0aGlzLl96b29tTGV2ZWwgPSB6b29tTGV2ZWw7XG5cbiAgICAgICAgc2V0QXR0cmlidXRlcyh0aGlzLl9kb2N1bWVudEVsZW1lbnQsIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmxheW91dC5kaW1lbnNpb25zLmhlaWdodCArICdweCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMubGF5b3V0LmRpbWVuc2lvbnMud2lkdGggKyAncHgnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0LnNldElubmVyRGltZW5zaW9ucyh0aGlzLmxheW91dC5kaW1lbnNpb25zKTtcbiAgICB9XG5cbiAgICBhZGp1c3QgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2NsZWFyQW5pbWF0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2hvb2tzLm9uVmlld0RpZFVwZGF0ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5faG9va3Mub25WaWV3RGlkVXBkYXRlKHRoaXMuX3JlbmRlcmVkUGFnZXMuc2xpY2UoKSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVuZGVyICgpXG4gICAge1xuICAgICAgICBjb25zdCBuZXdSZW5kZXJlZFBhZ2VzID0gW107XG4gICAgICAgIHRoaXMubGF5b3V0LnBhZ2VHcm91cHMuZm9yRWFjaCgoZ3JvdXApID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fdmlld3BvcnQuaW50ZXJzZWN0c1JlZ2lvbihncm91cC5yZWdpb24pKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmlzaWJsZVBhZ2VzID0gZ3JvdXAucGFnZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChwYWdlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNQYWdlVmlzaWJsZShwYWdlLmluZGV4KTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICAgICAgICAgIC5tYXAocGFnZSA9PiBwYWdlLmluZGV4KTtcblxuICAgICAgICAgICAgbmV3UmVuZGVyZWRQYWdlcy5wdXNoLmFwcGx5KG5ld1JlbmRlcmVkUGFnZXMsIHZpc2libGVQYWdlcyk7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2N0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5fY2FudmFzLndpZHRoLCB0aGlzLl9jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5fcGFpbnRPdXRsaW5lKG5ld1JlbmRlcmVkUGFnZXMpO1xuXG4gICAgICAgIG5ld1JlbmRlcmVkUGFnZXMuZm9yRWFjaCgocGFnZUluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NvbXBvc2l0ZUltYWdlc1twYWdlSW5kZXhdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmxheW91dC5nZXRQYWdlSW5mbyhwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHpvb21MZXZlbHMgPSB0aGlzLl9zb3VyY2VSZXNvbHZlci5nZXRBbGxab29tTGV2ZWxzRm9yUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSW1hZ2Uoem9vbUxldmVscyk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLnVwZGF0ZUZyb21DYWNoZSh0aGlzLl9jYWNoZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRlSW1hZ2VzW3BhZ2VJbmRleF0gPSBjb21wb3NpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2luaXRpYXRlVGlsZVJlcXVlc3RzKG5ld1JlbmRlcmVkUGFnZXMpO1xuXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBmaW5kQ2hhbmdlcyh0aGlzLl9yZW5kZXJlZFBhZ2VzIHx8IFtdLCBuZXdSZW5kZXJlZFBhZ2VzKTtcblxuICAgICAgICBjaGFuZ2VzLnJlbW92ZWQuZm9yRWFjaCgocGFnZUluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY29tcG9zaXRlSW1hZ2VzW3BhZ2VJbmRleF07XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcmVkUGFnZXMgPSBuZXdSZW5kZXJlZFBhZ2VzO1xuICAgICAgICB0aGlzLl9wYWludCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9ob29rcy5vblBhZ2VXaWxsTG9hZClcbiAgICAgICAge1xuICAgICAgICAgICAgY2hhbmdlcy5hZGRlZC5mb3JFYWNoKChwYWdlSW5kZXgpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5faG9va3Mub25QYWdlV2lsbExvYWQocGFnZUluZGV4KTtcbiAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3BhaW50ICgpXG4gICAge1xuICAgICAgICBjb25zdCByZW5kZXJlZFRpbGVzID0gW107XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyZWRQYWdlcy5mb3JFYWNoKCAocGFnZUluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9jb21wb3NpdGVJbWFnZXNbcGFnZUluZGV4XS5nZXRUaWxlcyh0aGlzLl96b29tTGV2ZWwpLmZvckVhY2goKHNvdXJjZSkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2FsZWQgPSBnZXRTY2FsZWRUaWxlUmVjb3JkKHNvdXJjZSwgdGhpcy5fem9vbUxldmVsKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1RpbGVWaXNpYmxlKHBhZ2VJbmRleCwgc2NhbGVkKSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkVGlsZXMucHVzaChzb3VyY2UudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd1RpbGUocGFnZUluZGV4LCBzY2FsZWQsIHRoaXMuX2NhY2hlLmdldChzb3VyY2UudXJsKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IGZpbmRDaGFuZ2VzKHRoaXMuX3JlbmRlcmVkVGlsZXMgfHwgW10sIHJlbmRlcmVkVGlsZXMpO1xuXG4gICAgICAgIGNoYW5nZXMuYWRkZWQuZm9yRWFjaCh1cmwgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY2FjaGUuYWNxdWlyZSh1cmwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjaGFuZ2VzLnJlbW92ZWQuZm9yRWFjaCh1cmwgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY2FjaGUucmVsZWFzZSh1cmwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2hhbmdlcy5yZW1vdmVkKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBGSVhNRTogU2hvdWxkIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIGNvbXBvc2l0ZSBpbWFnZXNcbiAgICAgICAgICAgIC8vIGZvciB3aGljaCB0aWxlcyB3ZXJlIHJlbW92ZWRcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkUGFnZXMuZm9yRWFjaCgocGFnZUluZGV4KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0ZUltYWdlc1twYWdlSW5kZXhdLnVwZGF0ZUZyb21DYWNoZSh0aGlzLl9jYWNoZSk7XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbmRlcmVkVGlsZXMgPSByZW5kZXJlZFRpbGVzO1xuICAgIH1cblxuICAgIC8vIFBhaW50IGEgcGFnZSBvdXRsaW5lIHdoaWxlIHRoZSB0aWxlcyBhcmUgbG9hZGluZy5cbiAgICBfcGFpbnRPdXRsaW5lIChwYWdlcylcbiAgICB7XG4gICAgICAgIHBhZ2VzLmZvckVhY2goIChwYWdlSW5kZXgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBwYWdlSW5mbyA9IHRoaXMubGF5b3V0LmdldFBhZ2VJbmZvKHBhZ2VJbmRleCk7XG4gICAgICAgICAgICBsZXQgcGFnZU9mZnNldCA9IHRoaXMuX2dldEltYWdlT2Zmc2V0KHBhZ2VJbmRleCk7XG5cbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZG9jdW1lbnQgaXMgZHJhd24gdG8gdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGxldCB2aWV3cG9ydFBhZGRpbmdYID0gTWF0aC5tYXgoMCwgKHRoaXMuX3ZpZXdwb3J0LndpZHRoIC0gdGhpcy5sYXlvdXQuZGltZW5zaW9ucy53aWR0aCkgLyAyKTtcbiAgICAgICAgICAgIGxldCB2aWV3cG9ydFBhZGRpbmdZID0gTWF0aC5tYXgoMCwgKHRoaXMuX3ZpZXdwb3J0LmhlaWdodCAtIHRoaXMubGF5b3V0LmRpbWVuc2lvbnMuaGVpZ2h0KSAvIDIpO1xuXG4gICAgICAgICAgICBsZXQgdmlld3BvcnRPZmZzZXRYID0gcGFnZU9mZnNldC5sZWZ0IC0gdGhpcy5fdmlld3BvcnQubGVmdCArIHZpZXdwb3J0UGFkZGluZ1g7XG4gICAgICAgICAgICBsZXQgdmlld3BvcnRPZmZzZXRZID0gcGFnZU9mZnNldC50b3AgLSB0aGlzLl92aWV3cG9ydC50b3AgKyB2aWV3cG9ydFBhZGRpbmdZO1xuXG4gICAgICAgICAgICBsZXQgZGVzdFhPZmZzZXQgPSB2aWV3cG9ydE9mZnNldFggPCAwID8gLXZpZXdwb3J0T2Zmc2V0WCA6IDA7XG4gICAgICAgICAgICBsZXQgZGVzdFlPZmZzZXQgPSB2aWV3cG9ydE9mZnNldFkgPCAwID8gLXZpZXdwb3J0T2Zmc2V0WSA6IDA7XG5cbiAgICAgICAgICAgIGxldCBjYW52YXNYID0gTWF0aC5tYXgoMCwgdmlld3BvcnRPZmZzZXRYKTtcbiAgICAgICAgICAgIGxldCBjYW52YXNZID0gTWF0aC5tYXgoMCwgdmlld3BvcnRPZmZzZXRZKTtcblxuICAgICAgICAgICAgbGV0IGRlc3RXaWR0aCA9IHBhZ2VJbmZvLmRpbWVuc2lvbnMud2lkdGggLSBkZXN0WE9mZnNldDtcbiAgICAgICAgICAgIGxldCBkZXN0SGVpZ2h0ID0gcGFnZUluZm8uZGltZW5zaW9ucy5oZWlnaHQgLSBkZXN0WU9mZnNldDtcblxuICAgICAgICAgICAgdGhpcy5fY3R4LnN0cm9rZVN0eWxlID0gJyNBQUEnO1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZ2V0IGEgMXB4IHdpZGUgbGluZSB1c2luZyBzdHJva2VzLCB3ZSBuZWVkIHRvIHN0YXJ0IGF0IGEgJ2hhbGYgcGl4ZWwnXG4gICAgICAgICAgICB0aGlzLl9jdHguc3Ryb2tlUmVjdChjYW52YXNYICsgMC41LCBjYW52YXNZICsgMC41LCBkZXN0V2lkdGgsIGRlc3RIZWlnaHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgc2VudCBhbGwgdmlzaWJsZSBwYWdlcyBhdCBvbmNlIGJlY2F1c2UgaXQgd2lsbCBpbml0aWF0ZVxuICAgIC8vIGFsbCBpbWFnZSByZXF1ZXN0cyBhbmQgY2FuY2VsIGFueSByZW1haW5pbmcgaW1hZ2UgcmVxdWVzdHMuIEluIHRoZSBjYXNlIHRoYXRcbiAgICAvLyBhIHJlcXVlc3QgaXMgb25nb2luZyBhbmQgdGhlIHRpbGUgaXMgc3RpbGwgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnQsIHRoZSBvbGQgcmVxdWVzdFxuICAgIC8vIGlzIGtlcHQgYWN0aXZlIGluc3RlYWQgb2YgcmVzdGFydGluZyBpdC4gVGhlIGltYWdlIHJlcXVlc3RzIGFyZSBnaXZlbiBhIHRpbWVvdXRcbiAgICAvLyBiZWZvcmUgbG9hZGluZyBpbiBvcmRlciB0byBkZWJvdW5jZSB0aGVtIGFuZCBoYXZlIGEgc21hbGwgcmVhY3Rpb24gdGltZVxuICAgIC8vIHRvIGNhbmNlbCB0aGVtIGFuZCBhdm9pZCB1c2VsZXNzIHJlcXVlc3RzLlxuICAgIF9pbml0aWF0ZVRpbGVSZXF1ZXN0cyAocGFnZXMpXG4gICAge1xuICAgICAgICAvLyBPbmx5IHJlcXVlc3RzIGluIHRoaXMgb2JqZWN0IGFyZSBrZXB0IGFsaXZlLCBzaW5jZSBhbGwgb3RoZXJzIGFyZSBub3QgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAgY29uc3QgbmV3UGVuZGluZ1JlcXVlc3RzID0ge307XG5cbiAgICAgICAgLy8gVXNlZCBsYXRlciBhcyBhIGNsb3N1cmUgdG8gaW5pdGlhdGUgdGhlIGltYWdlIHJlcXVlc3RzIHdpdGggdGhlIHJpZ2h0IHNvdXJjZSBhbmQgcGFnZUluZGV4XG4gICAgICAgIGNvbnN0IGluaXRpYXRlUmVxdWVzdCA9IChzb3VyY2UsIHBhZ2VJbmRleCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlID0gdGhpcy5fY29tcG9zaXRlSW1hZ2VzW3BhZ2VJbmRleF07XG5cbiAgICAgICAgICAgIG5ld1BlbmRpbmdSZXF1ZXN0c1tzb3VyY2UudXJsXSA9IG5ldyBJbWFnZVJlcXVlc3RIYW5kbGVyKHtcbiAgICAgICAgICAgICAgICB1cmw6IHNvdXJjZS51cmwsXG4gICAgICAgICAgICAgICAgdGltZW91dFRpbWU6IFJFUVVFU1RfREVCT1VOQ0VfSU5URVJWQUwsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuX3NldHRpbmdzLFxuICAgICAgICAgICAgICAgIGxvYWQ6IGltZyA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tzb3VyY2UudXJsXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGUucHV0KHNvdXJjZS51cmwsIGltZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXdrd2FyZCB3YXkgdG8gY2hlY2sgZm9yIHVwZGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSA9PT0gdGhpcy5fY29tcG9zaXRlSW1hZ2VzW3BhZ2VJbmRleF0pXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS51cGRhdGVXaXRoTG9hZGVkVXJscyhbc291cmNlLnVybF0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNUaWxlRm9yU291cmNlVmlzaWJsZShwYWdlSW5kZXgsIHNvdXJjZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFpbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1RpbGVGb3JTb3VyY2VWaXNpYmxlKHBhZ2VJbmRleCwgc291cmNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYWludCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENvdWxkIG1ha2UgYSBsaW1pdGVkIG51bWJlciBvZiByZXRyaWVzLCBldGMuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbc291cmNlLnVybF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gcGFnZXNbaV07XG4gICAgICAgICAgICBjb25zdCB0aWxlcyA9IHRoaXMuX3NvdXJjZVJlc29sdmVyLmdldEJlc3Rab29tTGV2ZWxGb3JQYWdlKHRoaXMubGF5b3V0LmdldFBhZ2VJbmZvKHBhZ2VJbmRleCkpLnRpbGVzO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRpbGVzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRpbGVzW2pdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZS5oYXMoc291cmNlLnVybCkgfHwgIXRoaXMuX2lzVGlsZUZvclNvdXJjZVZpc2libGUocGFnZUluZGV4LCBzb3VyY2UpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY3JlYXRlIGEgbmV3IHJlcXVlc3QgaWYgdGhlIHRpbGUgaXMgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1JlcXVlc3RzW3NvdXJjZS51cmxdKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGVuZGluZ1JlcXVlc3RzW3NvdXJjZS51cmxdID0gdGhpcy5fcGVuZGluZ1JlcXVlc3RzW3NvdXJjZS51cmxdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1JlcXVlc3RzW3NvdXJjZS51cmxdO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBVc2UgYSBjbG9zdXJlIHNpbmNlIHRoZSBsb2FkIGFuZCBlcnJvciBtZXRob2RzIGFyZSBnb2luZyB0byBiZSBjYWxsZWQgbGF0ZXIgYW5kXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBrZWVwIHRoZSByaWdodCByZWZlcmVuY2UgdG8gdGhlIHNvdXJjZSBhbmQgdGhlIHBhZ2UgaW5kZXhcbiAgICAgICAgICAgICAgICBpbml0aWF0ZVJlcXVlc3Qoc291cmNlLCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB1cmwgaW4gdGhpcy5fcGVuZGluZ1JlcXVlc3RzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbdXJsXS5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdSZXF1ZXN0cyA9IG5ld1BlbmRpbmdSZXF1ZXN0cztcbiAgICB9XG5cbiAgICBfZHJhd1RpbGUgKHBhZ2VJbmRleCwgc2NhbGVkVGlsZSwgaW1nKVxuICAgIHtcbiAgICAgICAgbGV0IHRpbGVPZmZzZXQgPSB0aGlzLl9nZXRUaWxlVG9Eb2N1bWVudE9mZnNldChwYWdlSW5kZXgsIHNjYWxlZFRpbGUpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGUgZG9jdW1lbnQgaXMgZHJhd24gdG8gdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgbGV0IHZpZXdwb3J0UGFkZGluZ1ggPSBNYXRoLm1heCgwLCAodGhpcy5fdmlld3BvcnQud2lkdGggLSB0aGlzLmxheW91dC5kaW1lbnNpb25zLndpZHRoKSAvIDIpO1xuICAgICAgICBsZXQgdmlld3BvcnRQYWRkaW5nWSA9IE1hdGgubWF4KDAsICh0aGlzLl92aWV3cG9ydC5oZWlnaHQgLSB0aGlzLmxheW91dC5kaW1lbnNpb25zLmhlaWdodCkgLyAyKTtcblxuICAgICAgICBsZXQgdmlld3BvcnRPZmZzZXRYID0gdGlsZU9mZnNldC5sZWZ0IC0gdGhpcy5fdmlld3BvcnQubGVmdCArIHZpZXdwb3J0UGFkZGluZ1g7XG4gICAgICAgIGxldCB2aWV3cG9ydE9mZnNldFkgPSB0aWxlT2Zmc2V0LnRvcCAtIHRoaXMuX3ZpZXdwb3J0LnRvcCArIHZpZXdwb3J0UGFkZGluZ1k7XG5cbiAgICAgICAgbGV0IGRlc3RYT2Zmc2V0ID0gdmlld3BvcnRPZmZzZXRYIDwgMCA/IC12aWV3cG9ydE9mZnNldFggOiAwO1xuICAgICAgICBsZXQgZGVzdFlPZmZzZXQgPSB2aWV3cG9ydE9mZnNldFkgPCAwID8gLXZpZXdwb3J0T2Zmc2V0WSA6IDA7XG5cbiAgICAgICAgbGV0IGNhbnZhc1ggPSBNYXRoLm1heCgwLCB2aWV3cG9ydE9mZnNldFgpO1xuICAgICAgICBsZXQgY2FudmFzWSA9IE1hdGgubWF4KDAsIHZpZXdwb3J0T2Zmc2V0WSk7XG5cbiAgICAgICAgbGV0IHNvdXJjZVhPZmZzZXQgPSBkZXN0WE9mZnNldCAvIHNjYWxlZFRpbGUuc2NhbGVSYXRpbztcbiAgICAgICAgbGV0IHNvdXJjZVlPZmZzZXQgPSBkZXN0WU9mZnNldCAvIHNjYWxlZFRpbGUuc2NhbGVSYXRpbztcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMgYXJlIG5vIGdyZWF0ZXIgdGhhbiB0aGUgYWN0dWFsXG4gICAgICAgIC8vIHNpemUgb2YgdGhlIGltYWdlLiBTYWZhcmkgd29uJ3QgZGlzcGxheSB0aGUgdGlsZSBpZiB0aGV5IGFyZS5cbiAgICAgICAgbGV0IGRlc3RJbWdXaWR0aCA9IE1hdGgubWluKHNjYWxlZFRpbGUuZGltZW5zaW9ucy53aWR0aCwgaW1nLndpZHRoICogc2NhbGVkVGlsZS5zY2FsZVJhdGlvKSAtIGRlc3RYT2Zmc2V0O1xuICAgICAgICBsZXQgZGVzdEltZ0hlaWdodCA9IE1hdGgubWluKHNjYWxlZFRpbGUuZGltZW5zaW9ucy5oZWlnaHQsIGltZy5oZWlnaHQgKiBzY2FsZWRUaWxlLnNjYWxlUmF0aW8pIC0gZGVzdFlPZmZzZXQ7XG5cbiAgICAgICAgbGV0IGRlc3RXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZGVzdEltZ1dpZHRoKSk7XG4gICAgICAgIGxldCBkZXN0SGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChkZXN0SW1nSGVpZ2h0KSk7XG5cbiAgICAgICAgbGV0IHNvdXJjZVdpZHRoID0gZGVzdFdpZHRoIC8gc2NhbGVkVGlsZS5zY2FsZVJhdGlvO1xuICAgICAgICBsZXQgc291cmNlSGVpZ2h0ID0gZGVzdEhlaWdodCAvIHNjYWxlZFRpbGUuc2NhbGVSYXRpbztcblxuICAgICAgICB0aGlzLl9jdHguZHJhd0ltYWdlKFxuICAgICAgICAgICAgaW1nLFxuICAgICAgICAgICAgc291cmNlWE9mZnNldCwgc291cmNlWU9mZnNldCxcbiAgICAgICAgICAgIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsXG4gICAgICAgICAgICBjYW52YXNYLCBjYW52YXNZLFxuICAgICAgICAgICAgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0KTtcbiAgICB9XG5cbiAgICBfaXNUaWxlRm9yU291cmNlVmlzaWJsZSAocGFnZUluZGV4LCB0aWxlU291cmNlKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVGlsZVZpc2libGUocGFnZUluZGV4LCBnZXRTY2FsZWRUaWxlUmVjb3JkKHRpbGVTb3VyY2UsIHRoaXMuX3pvb21MZXZlbCkpO1xuICAgIH1cblxuICAgIF9pc1RpbGVWaXNpYmxlIChwYWdlSW5kZXgsIHNjYWxlZFRpbGUpXG4gICAge1xuICAgICAgICBjb25zdCB0aWxlT2Zmc2V0ID0gdGhpcy5fZ2V0VGlsZVRvRG9jdW1lbnRPZmZzZXQocGFnZUluZGV4LCBzY2FsZWRUaWxlKTtcblxuICAgICAgICAvLyBGSVhNRSh3YWJhaW4pOiBUaGlzIGNoZWNrIGlzIGluc3VmZmljaWVudCBkdXJpbmcgYSB6b29tIHRyYW5zaXRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0LmludGVyc2VjdHNSZWdpb24oe1xuICAgICAgICAgICAgdG9wOiB0aWxlT2Zmc2V0LnRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogdGlsZU9mZnNldC50b3AgKyBzY2FsZWRUaWxlLmRpbWVuc2lvbnMuaGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogdGlsZU9mZnNldC5sZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IHRpbGVPZmZzZXQubGVmdCArIHNjYWxlZFRpbGUuZGltZW5zaW9ucy53aWR0aFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZ2V0VGlsZVRvRG9jdW1lbnRPZmZzZXQgKHBhZ2VJbmRleCwgc2NhbGVkVGlsZSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGltYWdlT2Zmc2V0ID0gdGhpcy5fZ2V0SW1hZ2VPZmZzZXQocGFnZUluZGV4KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiBpbWFnZU9mZnNldC50b3AgKyBzY2FsZWRUaWxlLm9mZnNldC50b3AsXG4gICAgICAgICAgICBsZWZ0OiBpbWFnZU9mZnNldC5sZWZ0ICsgc2NhbGVkVGlsZS5vZmZzZXQubGVmdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9nZXRJbWFnZU9mZnNldCAocGFnZUluZGV4KVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmdldFBhZ2VPZmZzZXQocGFnZUluZGV4LCB7aW5jbHVkZVBhZGRpbmc6IHRydWV9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVcGRhdGUgc2lnbmF0dXJlXG4gICAgZ290byAocGFnZUluZGV4LCB2ZXJ0aWNhbE9mZnNldCwgaG9yaXpvbnRhbE9mZnNldClcbiAgICB7XG4gICAgICAgIHRoaXMuX2NsZWFyQW5pbWF0aW9uKCk7XG4gICAgICAgIHRoaXMuX2dvdG8ocGFnZUluZGV4LCB2ZXJ0aWNhbE9mZnNldCwgaG9yaXpvbnRhbE9mZnNldCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2hvb2tzLm9uVmlld0RpZFVwZGF0ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5faG9va3Mub25WaWV3RGlkVXBkYXRlKHRoaXMuX3JlbmRlcmVkUGFnZXMuc2xpY2UoKSwgcGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nb3RvIChwYWdlSW5kZXgsIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KVxuICAgIHtcbiAgICAgICAgLy8gRklYTUUod2FiYWluKTogTW92ZSB0aGlzIGxvZ2ljIHRvIHRoZSB2aWV3ZXJcbiAgICAgICAgY29uc3QgcGFnZU9mZnNldCA9IHRoaXMubGF5b3V0LmdldFBhZ2VPZmZzZXQocGFnZUluZGV4KTtcblxuICAgICAgICBjb25zdCBkZXNpcmVkVmVydGljYWxDZW50ZXIgPSBwYWdlT2Zmc2V0LnRvcCArIHZlcnRpY2FsT2Zmc2V0O1xuICAgICAgICBjb25zdCB0b3AgPSBkZXNpcmVkVmVydGljYWxDZW50ZXIgLSBNYXRoLnJvdW5kKHRoaXMuX3ZpZXdwb3J0LmhlaWdodCAvIDIpO1xuXG4gICAgICAgIGNvbnN0IGRlc2lyZWRIb3Jpem9udGFsQ2VudGVyID0gcGFnZU9mZnNldC5sZWZ0ICsgaG9yaXpvbnRhbE9mZnNldDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRlc2lyZWRIb3Jpem9udGFsQ2VudGVyIC0gTWF0aC5yb3VuZCh0aGlzLl92aWV3cG9ydC53aWR0aCAvIDIpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0LnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5fdmlld3BvcnQubGVmdCA9IGxlZnQ7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvblZpZXdwb3J0UG9zaXRpb24gKG9wdGlvbnMpXG4gICAge1xuICAgICAgICB0aGlzLl9jbGVhckFuaW1hdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IGdldFBvc2l0aW9uID0gb3B0aW9ucy5nZXRQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgb25WaWV3RGlkVHJhbnNpdGlvbiA9IHRoaXMuX2hvb2tzLm9uVmlld0RpZFRyYW5zaXRpb247XG5cbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uID0gSW50ZXJwb2xhdGVBbmltYXRpb24uYW5pbWF0ZSh7XG4gICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycyxcbiAgICAgICAgICAgIG9uVXBkYXRlOiAodmFsdWVzKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpZXdwb3J0UG9zaXRpb24oZ2V0UG9zaXRpb24odmFsdWVzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5faG9va3Mub25ab29tTGV2ZWxXaWxsQ2hhbmdlKHZhbHVlcy56b29tTGV2ZWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9uVmlld0RpZFRyYW5zaXRpb24pXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvblZpZXdEaWRUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRW5kOiAoaW5mbykgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vbkVuZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25FbmQoaW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hvb2tzLm9uVmlld0RpZFVwZGF0ZSAmJiAhaW5mby5pbnRlcnJ1cHRlZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hvb2tzLm9uVmlld0RpZFVwZGF0ZSh0aGlzLl9yZW5kZXJlZFBhZ2VzLnNsaWNlKCksIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NsZWFyQW5pbWF0aW9uICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9hbmltYXRpb24uY2FuY2VsKCk7XG4gICAgICAgICAgICB0aGlzLl9hbmltYXRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNQYWdlVmlzaWJsZSAocGFnZUluZGV4KVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMubGF5b3V0LmdldFBhZ2VJbmZvKHBhZ2VJbmRleCk7XG5cbiAgICAgICAgaWYgKCFwYWdlKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnQuaW50ZXJzZWN0c1JlZ2lvbih0aGlzLmxheW91dC5nZXRQYWdlUmVnaW9uKHBhZ2VJbmRleCkpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmVkUGFnZXMgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZFBhZ2VzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fY2xlYXJBbmltYXRpb24oKTtcblxuICAgICAgICAvLyBGSVhNRSh3YWJhaW4pOiBJIGRvbid0IGtub3cgaWYgd2Ugc2hvdWxkIGFjdHVhbGx5IGRvIHRoaXNcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fcGVuZGluZ1JlcXVlc3RzKS5mb3JFYWNoKChyZXEpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbcmVxXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbcmVxXTtcblxuICAgICAgICAgICAgaGFuZGxlci5hYm9ydCgpO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICB0aGlzLl9jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jYW52YXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2NhbGVkVGlsZVJlY29yZCAoc291cmNlLCBzY2FsZUZhY3RvcilcbntcbiAgICBsZXQgc2NhbGVSYXRpbztcblxuICAgIGlmIChzY2FsZUZhY3RvciA9PT0gbnVsbClcbiAgICB7XG4gICAgICAgIHNjYWxlUmF0aW8gPSAxO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBzY2FsZVJhdGlvID0gTWF0aC5wb3coMiwgc2NhbGVGYWN0b3IgLSBzb3VyY2Uuem9vbUxldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2Vab29tTGV2ZWw6IHNvdXJjZS56b29tTGV2ZWwsXG4gICAgICAgIHNjYWxlUmF0aW86IHNjYWxlUmF0aW8sXG4gICAgICAgIHJvdzogc291cmNlLnJvdyxcbiAgICAgICAgY29sOiBzb3VyY2UuY29sLFxuICAgICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgICAgICB3aWR0aDogc291cmNlLmRpbWVuc2lvbnMud2lkdGggKiBzY2FsZVJhdGlvLFxuICAgICAgICAgICAgaGVpZ2h0OiBzb3VyY2UuZGltZW5zaW9ucy5oZWlnaHQgKiBzY2FsZVJhdGlvXG4gICAgICAgIH0sXG4gICAgICAgIG9mZnNldDoge1xuICAgICAgICAgICAgbGVmdDogc291cmNlLm9mZnNldC5sZWZ0ICogc2NhbGVSYXRpbyxcbiAgICAgICAgICAgIHRvcDogc291cmNlLm9mZnNldC50b3AgKiBzY2FsZVJhdGlvXG4gICAgICAgIH0sXG4gICAgICAgIHVybDogc291cmNlLnVybFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGFuZ2VzIChvbGRBcnJheSwgbmV3QXJyYXkpXG57XG4gICAgaWYgKG9sZEFycmF5ID09PSBuZXdBcnJheSlcbiAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRlZDogW10sXG4gICAgICAgICAgICByZW1vdmVkOiBbXVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlbW92ZWQgPSBvbGRBcnJheS5maWx0ZXIob2xkRW50cnkgPT4gbmV3QXJyYXkuaW5kZXhPZihvbGRFbnRyeSkgPT09IC0xKTtcblxuICAgIGNvbnN0IGFkZGVkID0gbmV3QXJyYXkuZmlsdGVyKG5ld0VudHJ5ID0+IG9sZEFycmF5LmluZGV4T2YobmV3RW50cnkpID09PSAtMSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgIHJlbW92ZWQ6IHJlbW92ZWRcbiAgICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFnZURpbWVuc2lvbnMgKHBhZ2VJbmRleCwgbWFuaWZlc3QpXG57XG4gICAgY29uc3QgZGltcyA9IG1hbmlmZXN0LmdldE1heFBhZ2VEaW1lbnNpb25zKHBhZ2VJbmRleCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogTWF0aC5mbG9vcihkaW1zLndpZHRoKSxcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmZsb29yKGRpbXMuaGVpZ2h0KVxuICAgIH07XG59XG4iLCJpbXBvcnQgZ2V0UGFnZURpbWVuc2lvbnMgZnJvbSAnLi9wYWdlLWRpbWVuc2lvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb29rTGF5b3V0R3JvdXBzICh2aWV3ZXJDb25maWcpXG57XG4gICAgY29uc3QgZ3JvdXBpbmdzID0gZ2V0R3JvdXBpbmdzKHZpZXdlckNvbmZpZyk7XG5cbiAgICByZXR1cm4gZ3JvdXBpbmdzLm1hcChncm91cGluZyA9PiBnZXRHcm91cExheW91dHNGcm9tUGFnZUdyb3VwaW5nKHZpZXdlckNvbmZpZywgZ3JvdXBpbmcpKTtcbn1cblxuZnVuY3Rpb24gZ2V0R3JvdXBpbmdzKHZpZXdlckNvbmZpZylcbntcbiAgICBjb25zdCBtYW5pZmVzdCA9IHZpZXdlckNvbmZpZy5tYW5pZmVzdDtcblxuICAgIGNvbnN0IHBhZ2VzQnlHcm91cCA9IFtdO1xuICAgIGxldCBsZWZ0UGFnZSA9IG51bGw7XG4gICAgbGV0IG5vblBhZ2VkUGFnZXMgPSBbXTsgLy8gUGFnZXMgdG8gZGlzcGxheSBiZWxvdyB0aGUgY3VycmVudCBncm91cFxuXG4gICAgY29uc3QgX2FkZE5vblBhZ2VkUGFnZXMgPSAoKSA9PlxuICAgIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG5sZW4gPSBub25QYWdlZFBhZ2VzLmxlbmd0aDsgaSA8IG5sZW47IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgcGFnZXNCeUdyb3VwLnB1c2goWyBub25QYWdlZFBhZ2VzW2ldIF0pO1xuICAgICAgICB9XG4gICAgICAgIG5vblBhZ2VkUGFnZXMgPSBbXTtcbiAgICB9O1xuXG4gICAgbWFuaWZlc3QucGFnZXMuZm9yRWFjaCggKHBhZ2UsIGluZGV4KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgcGFnZVJlY29yZCA9IHtcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGdldFBhZ2VEaW1lbnNpb25zKGluZGV4LCBtYW5pZmVzdCksXG4gICAgICAgICAgICBwYWdlZDogKCFtYW5pZmVzdC5wYWdlZCB8fCBwYWdlLnBhZ2VkKVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE9ubHkgZGlzcGxheSBub24tcGFnZWQgcGFnZXMgaWYgc3BlY2lmaWVkIGluIHRoZSBzZXR0aW5nc1xuICAgICAgICBpZiAoIXZpZXdlckNvbmZpZy5zaG93Tm9uUGFnZWRQYWdlcyAmJiAhcGFnZVJlY29yZC5wYWdlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoIXBhZ2VSZWNvcmQucGFnZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5vblBhZ2VkUGFnZXMucHVzaChwYWdlUmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gMCB8fCBwYWdlLmZhY2luZ1BhZ2VzKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgcGFnZSBpcyBwbGFjZWQgb24gaXRzIG93blxuICAgICAgICAgICAgcGFnZXNCeUdyb3VwLnB1c2goW3BhZ2VSZWNvcmRdKTtcbiAgICAgICAgICAgIF9hZGROb25QYWdlZFBhZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVmdFBhZ2UgPT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxlZnRQYWdlID0gcGFnZVJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBhZ2VzQnlHcm91cC5wdXNoKFtsZWZ0UGFnZSwgcGFnZVJlY29yZF0pO1xuICAgICAgICAgICAgbGVmdFBhZ2UgPSBudWxsO1xuICAgICAgICAgICAgX2FkZE5vblBhZ2VkUGFnZXMoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRmx1c2ggYSBmaW5hbCBsZWZ0IHBhZ2VcbiAgICBpZiAobGVmdFBhZ2UgIT09IG51bGwpXG4gICAge1xuICAgICAgICBwYWdlc0J5R3JvdXAucHVzaChbbGVmdFBhZ2VdKTtcbiAgICAgICAgX2FkZE5vblBhZ2VkUGFnZXMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFnZXNCeUdyb3VwO1xufVxuXG5mdW5jdGlvbiBnZXRHcm91cExheW91dHNGcm9tUGFnZUdyb3VwaW5nKHZpZXdlckNvbmZpZywgZ3JvdXBpbmcpXG57XG4gICAgY29uc3QgdmVydGljYWxseU9yaWVudGVkID0gdmlld2VyQ29uZmlnLnZlcnRpY2FsbHlPcmllbnRlZDtcblxuICAgIGlmIChncm91cGluZy5sZW5ndGggPT09IDIpXG4gICAgICAgIHJldHVybiBnZXRGYWNpbmdQYWdlR3JvdXAoZ3JvdXBpbmdbMF0sIGdyb3VwaW5nWzFdLCB2ZXJ0aWNhbGx5T3JpZW50ZWQpO1xuXG4gICAgY29uc3QgcGFnZSA9IGdyb3VwaW5nWzBdO1xuICAgIGNvbnN0IHBhZ2VEaW1zID0gcGFnZS5kaW1lbnNpb25zO1xuXG4gICAgLy8gVGhlIGZpcnN0IHBhZ2UgaXMgcGxhY2VkIG9uIGl0cyBvd24gdG8gdGhlIHJpZ2h0IGluIHZlcnRpY2FsIG9yaWVudGF0aW9uLlxuICAgIC8vIE5CIHRoYXQgdGhpcyBuZWVkcyB0byBiZSB0aGUgcGFnZSB3aXRoIGluZGV4IDA7IGlmIHRoZSBmaXJzdCBwYWdlIGlzIGV4Y2x1ZGVkXG4gICAgLy8gZnJvbSB0aGUgbGF5b3V0IHRoZW4gdGhpcyBzcGVjaWFsIGNhc2Ugc2hvdWxkbid0IGFwcGx5LlxuICAgIC8vIElmIHRoZSBwYWdlIGlzIHRhZ2dlZCBhcyAnbm9uLXBhZ2VkJywgY2VudGVyIGl0IGhvcml6b250YWxseVxuICAgIGxldCBsZWZ0T2Zmc2V0O1xuICAgIGlmIChwYWdlLnBhZ2VkKVxuICAgICAgICBsZWZ0T2Zmc2V0ID0gKHBhZ2UuaW5kZXggPT09IDAgJiYgdmVydGljYWxseU9yaWVudGVkKSA/IHBhZ2VEaW1zLndpZHRoIDogMDtcbiAgICBlbHNlXG4gICAgICAgIGxlZnRPZmZzZXQgPSAodmVydGljYWxseU9yaWVudGVkKSA/IHBhZ2VEaW1zLndpZHRoIC8gMiA6IDA7XG5cbiAgICBjb25zdCBzaG91bGRCZUhvcml6b250YWxseUFkanVzdGVkID1cbiAgICAgICAgdmVydGljYWxseU9yaWVudGVkICYmICF2aWV3ZXJDb25maWcubWFuaWZlc3QucGFnZXNbcGFnZS5pbmRleF0uZmFjaW5nUGFnZXM7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGxlZnQtYWxpZ24gdGhlIHBhZ2UgaW4gdmVydGljYWwgb3JpZW50YXRpb24sIHNvIHdlIGRvdWJsZVxuICAgIC8vIHRoZSBncm91cCB3aWR0aFxuICAgIHJldHVybiB7XG4gICAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgICAgIGhlaWdodDogcGFnZURpbXMuaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IHNob3VsZEJlSG9yaXpvbnRhbGx5QWRqdXN0ZWQgPyBwYWdlRGltcy53aWR0aCAqIDIgOiBwYWdlRGltcy53aWR0aFxuICAgICAgICB9LFxuICAgICAgICBwYWdlczogW3tcbiAgICAgICAgICAgIGluZGV4OiBwYWdlLmluZGV4LFxuICAgICAgICAgICAgZ3JvdXBPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgbGVmdDogbGVmdE9mZnNldFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IHBhZ2VEaW1zXG4gICAgICAgIH1dXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RmFjaW5nUGFnZUdyb3VwKGxlZnRQYWdlLCByaWdodFBhZ2UsIHZlcnRpY2FsbHlPcmllbnRlZClcbntcbiAgICBjb25zdCBsZWZ0RGltcyA9IGxlZnRQYWdlLmRpbWVuc2lvbnM7XG4gICAgY29uc3QgcmlnaHREaW1zID0gcmlnaHRQYWdlLmRpbWVuc2lvbnM7XG5cbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heChsZWZ0RGltcy5oZWlnaHQsIHJpZ2h0RGltcy5oZWlnaHQpO1xuXG4gICAgbGV0IHdpZHRoLCBmaXJzdExlZnRPZmZzZXQsIHNlY29uZExlZnRPZmZzZXQ7XG5cbiAgICBpZiAodmVydGljYWxseU9yaWVudGVkKVxuICAgIHtcbiAgICAgICAgY29uc3QgbWlkV2lkdGggPSBNYXRoLm1heChsZWZ0RGltcy53aWR0aCwgcmlnaHREaW1zLndpZHRoKTtcblxuICAgICAgICB3aWR0aCA9IG1pZFdpZHRoICogMjtcblxuICAgICAgICBmaXJzdExlZnRPZmZzZXQgPSBtaWRXaWR0aCAtIGxlZnREaW1zLndpZHRoO1xuICAgICAgICBzZWNvbmRMZWZ0T2Zmc2V0ID0gbWlkV2lkdGg7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHdpZHRoID0gbGVmdERpbXMud2lkdGggKyByaWdodERpbXMud2lkdGg7XG4gICAgICAgIGZpcnN0TGVmdE9mZnNldCA9IDA7XG4gICAgICAgIHNlY29uZExlZnRPZmZzZXQgPSBsZWZ0RGltcy53aWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aFxuICAgICAgICB9LFxuICAgICAgICBwYWdlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluZGV4OiBsZWZ0UGFnZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBsZWZ0RGltcyxcbiAgICAgICAgICAgICAgICBncm91cE9mZnNldDoge1xuICAgICAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGZpcnN0TGVmdE9mZnNldFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHJpZ2h0UGFnZS5pbmRleCxcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiByaWdodERpbXMsXG4gICAgICAgICAgICAgICAgZ3JvdXBPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBzZWNvbmRMZWZ0T2Zmc2V0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0R3JpZExheW91dEdyb3VwcyAodmlld2VyQ29uZmlnKVxue1xuICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB2aWV3ZXJDb25maWcudmlld3BvcnQud2lkdGg7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB2aWV3ZXJDb25maWcubWFuaWZlc3Q7XG4gICAgY29uc3QgcGFnZXNQZXJSb3cgPSB2aWV3ZXJDb25maWcucGFnZXNQZXJSb3c7XG4gICAgY29uc3QgZml4ZWRIZWlnaHRHcmlkID0gdmlld2VyQ29uZmlnLmZpeGVkSGVpZ2h0R3JpZDtcbiAgICBjb25zdCBmaXhlZFBhZGRpbmcgPSB2aWV3ZXJDb25maWcuZml4ZWRQYWRkaW5nO1xuICAgIGNvbnN0IHNob3dOb25QYWdlZFBhZ2VzID0gdmlld2VyQ29uZmlnLnNob3dOb25QYWdlZFBhZ2VzO1xuXG4gICAgY29uc3QgaG9yaXpvbnRhbFBhZGRpbmcgPSBmaXhlZFBhZGRpbmcgKiAocGFnZXNQZXJSb3cgKyAxKTtcbiAgICBjb25zdCBwYWdlV2lkdGggPSAodmlld3BvcnRXaWR0aCAtIGhvcml6b250YWxQYWRkaW5nKSAvIHBhZ2VzUGVyUm93O1xuICAgIGNvbnN0IGdyaWRQYWdlV2lkdGggPSBwYWdlV2lkdGg7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJvdyBoZWlnaHQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBmaXggdGhlIHdpZHRoIG9yIHRoZSBoZWlnaHRcbiAgICBjb25zdCByb3dIZWlnaHQgPSAoZml4ZWRIZWlnaHRHcmlkKSA/IGZpeGVkUGFkZGluZyArIG1hbmlmZXN0Lm1pblJhdGlvICogcGFnZVdpZHRoIDogZml4ZWRQYWRkaW5nICsgbWFuaWZlc3QubWF4UmF0aW8gKiBwYWdlV2lkdGg7XG5cbiAgICBjb25zdCBncm91cHMgPSBbXTtcbiAgICBsZXQgY3VycmVudFBhZ2VzID0gW107XG5cbiAgICBjb25zdCBnZXRHcmlkUGFnZURpbWVuc2lvbnMgPSBwYWdlRGF0YSA9PlxuICAgIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0aGlzIHBhZ2VcbiAgICAgICAgLy8gR2V0IGRpbWVuc2lvbnMgYXQgbWF4IHpvb20gbGV2ZWwsIGFsdGhvdWdoIGFueSBsZXZlbCBzaG91bGQgYmUgZmluZVxuICAgICAgICBjb25zdCBwYWdlRGltZW5EYXRhID0gcGFnZURhdGEuZFtwYWdlRGF0YS5kLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBoZWlnaHRUb1dpZHRoUmF0aW8gPSBwYWdlRGltZW5EYXRhLmggLyBwYWdlRGltZW5EYXRhLnc7XG5cbiAgICAgICAgbGV0IHBhZ2VXaWR0aCwgcGFnZUhlaWdodDtcblxuICAgICAgICBpZiAoZml4ZWRIZWlnaHRHcmlkKVxuICAgICAgICB7XG4gICAgICAgICAgICBwYWdlV2lkdGggPSAocm93SGVpZ2h0IC0gZml4ZWRQYWRkaW5nKSAvIGhlaWdodFRvV2lkdGhSYXRpbztcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQgPSByb3dIZWlnaHQgLSBmaXhlZFBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBwYWdlV2lkdGggPSBncmlkUGFnZVdpZHRoO1xuICAgICAgICAgICAgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIGhlaWdodFRvV2lkdGhSYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZChwYWdlV2lkdGgpLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHBhZ2VIZWlnaHQpXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IHJvd0RpbWVuc2lvbnMgPSB7XG4gICAgICAgIGhlaWdodDogcm93SGVpZ2h0LFxuICAgICAgICB3aWR0aDogdmlld3BvcnRXaWR0aFxuICAgIH07XG5cbiAgICBtYW5pZmVzdC5wYWdlcy5mb3JFYWNoKCAocGFnZSwgcGFnZUluZGV4KSA9PlxuICAgIHtcbiAgICAgICAgaWYgKCFzaG93Tm9uUGFnZWRQYWdlcyAmJiBtYW5pZmVzdC5wYWdlZCAmJiAhcGFnZS5wYWdlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHdpZHRoLCBoZWlnaHQgYW5kIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRoaXMgcGFnZVxuICAgICAgICBjb25zdCBwYWdlRGltZW5zID0gZ2V0R3JpZFBhZ2VEaW1lbnNpb25zKHBhZ2UpO1xuICAgICAgICBsZXQgbGVmdE9mZnNldCA9IE1hdGguZmxvb3IoY3VycmVudFBhZ2VzLmxlbmd0aCAqIChmaXhlZFBhZGRpbmcgKyBncmlkUGFnZVdpZHRoKSArIGZpeGVkUGFkZGluZyk7XG5cbiAgICAgICAgLy8gQ2VudGVyIHRoZSBwYWdlIGlmIHRoZSBoZWlnaHQgaXMgZml4ZWQgKG90aGVyd2lzZSwgdGhlcmUgaXMgbm8gaG9yaXpvbnRhbCBwYWRkaW5nKVxuICAgICAgICBpZiAoZml4ZWRIZWlnaHRHcmlkKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZWZ0T2Zmc2V0ICs9IChncmlkUGFnZVdpZHRoIC0gcGFnZURpbWVucy53aWR0aCkgLyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogUHJlY29tcHV0ZSBwYWdlIGRpbWVuc2lvbnMgZXZlcnl3aGVyZVxuICAgICAgICBjdXJyZW50UGFnZXMucHVzaCh7XG4gICAgICAgICAgICBpbmRleDogcGFnZUluZGV4LFxuICAgICAgICAgICAgZGltZW5zaW9uczogcGFnZURpbWVucyxcbiAgICAgICAgICAgIGdyb3VwT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnRPZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRQYWdlcy5sZW5ndGggPT09IHBhZ2VzUGVyUm93KVxuICAgICAgICB7XG4gICAgICAgICAgICBncm91cHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogcm93RGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICBwYWdlczogY3VycmVudFBhZ2VzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY3VycmVudFBhZ2VzID0gW107XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjdXJyZW50UGFnZXMubGVuZ3RoID4gMClcbiAgICB7XG4gICAgICAgIGdyb3Vwcy5wdXNoKHtcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IHJvd0RpbWVuc2lvbnMsXG4gICAgICAgICAgICBwYWdlczogY3VycmVudFBhZ2VzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cHM7XG59XG4iLCJpbXBvcnQgZ2V0Qm9va0xheW91dEdyb3VwcyBmcm9tICcuL2Jvb2stbGF5b3V0JztcbmltcG9ydCBnZXRTaW5nbGVzTGF5b3V0R3JvdXBzIGZyb20gJy4vc2luZ2xlcy1sYXlvdXQnO1xuaW1wb3J0IGdldEdyaWRMYXlvdXRHcm91cHMgZnJvbSAnLi9ncmlkLWxheW91dCc7XG5cbi8qKiBHZXQgdGhlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIG9mIHBhZ2VzIGZvciB0aGUgY3VycmVudCB2aWV3ICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYWdlTGF5b3V0cyAoc2V0dGluZ3MpXG57XG4gICAgaWYgKHNldHRpbmdzLmluR3JpZClcbiAgICB7XG4gICAgICAgIHJldHVybiBnZXRHcmlkTGF5b3V0R3JvdXBzKHBsdWNrKHNldHRpbmdzLCBbXG4gICAgICAgICAgICAnbWFuaWZlc3QnLFxuICAgICAgICAgICAgJ3ZpZXdwb3J0JyxcbiAgICAgICAgICAgICdwYWdlc1BlclJvdycsXG4gICAgICAgICAgICAnZml4ZWRIZWlnaHRHcmlkJyxcbiAgICAgICAgICAgICdmaXhlZFBhZGRpbmcnLFxuICAgICAgICAgICAgJ3Nob3dOb25QYWdlZFBhZ2VzJ1xuICAgICAgICBdKSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHBsdWNrKHNldHRpbmdzLCBbJ21hbmlmZXN0JywgJ3ZlcnRpY2FsbHlPcmllbnRlZCcsICdzaG93Tm9uUGFnZWRQYWdlcyddKTtcblxuICAgICAgICBpZiAoc2V0dGluZ3MuaW5Cb29rTGF5b3V0KVxuICAgICAgICAgICAgcmV0dXJuIGdldEJvb2tMYXlvdXRHcm91cHMoY29uZmlnKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGdldFNpbmdsZXNMYXlvdXRHcm91cHMoY29uZmlnKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBsdWNrIChvYmosIGtleXMpXG57XG4gICAgY29uc3Qgb3V0ID0ge307XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpXG4gICAge1xuICAgICAgICBvdXRba2V5XSA9IG9ialtrZXldO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG59XG4iLCJpbXBvcnQgZ2V0UGFnZURpbWVuc2lvbnMgZnJvbSAnLi9wYWdlLWRpbWVuc2lvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTaW5nbGVzTGF5b3V0R3JvdXBzICh2aWV3ZXJDb25maWcpXG57XG4gICAgY29uc3QgbWFuaWZlc3QgPSB2aWV3ZXJDb25maWcubWFuaWZlc3Q7XG5cbiAgICAvLyBSZW5kZXIgZWFjaCBwYWdlIGFsb25lIGluIGEgZ3JvdXBcbiAgICBjb25zdCBwYWdlcyA9IFtdO1xuICAgIG1hbmlmZXN0LnBhZ2VzLmZvckVhY2goIChwYWdlLCBpbmRleCkgPT5cbiAgICB7XG4gICAgICAgIGlmICghdmlld2VyQ29uZmlnLnNob3dOb25QYWdlZFBhZ2VzICYmIG1hbmlmZXN0LnBhZ2VkICYmICFwYWdlLnBhZ2VkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VEaW1zID0gZ2V0UGFnZURpbWVuc2lvbnMoaW5kZXgsIG1hbmlmZXN0KTtcblxuICAgICAgICBwYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IHBhZ2VEaW1zLFxuICAgICAgICAgICAgcGFnZXM6IFt7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgIGdyb3VwT2Zmc2V0OiB7IHRvcDogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IHBhZ2VEaW1zXG4gICAgICAgICAgICB9XVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwYWdlcztcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlU2V0dGluZ3NWaWV3KHNvdXJjZXMpXG57XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICBzb3VyY2VzLmZvckVhY2goIChzb3VyY2UpID0+XG4gICAge1xuICAgICAgICByZWdpc3Rlck1peGluKG9iaiwgc291cmNlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTWl4aW4ob2JqLCBtaXhpbilcbntcbiAgICBPYmplY3Qua2V5cyhtaXhpbikuZm9yRWFjaCggKGtleSkgPT5cbiAgICB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBtaXhpbltrZXldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYWtlIGV2ZXJ5dGhpbmcgc3RyaWN0IG1vZGUgc28gdGhpcyBpc24ndCBuZWVkZWRcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3Qgc2V0IHNldHRpbmdzLicgKyBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRpb25SdW5uZXJcbntcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIHRoaXMud2hpdGVsaXN0ZWRLZXlzID0gb3B0aW9ucy53aGl0ZWxpc3RlZEtleXMgfHwgW107XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBvcHRpb25zLmFkZGl0aW9uYWxQcm9wZXJ0aWVzIHx8IFtdO1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25zID0gb3B0aW9ucy52YWxpZGF0aW9ucztcbiAgICB9XG5cbiAgICBpc1ZhbGlkIChrZXksIHZhbHVlLCBzZXR0aW5ncylcbiAgICB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsaWRhdGlvbiBpbmRleFxuICAgICAgICBsZXQgdmFsaWRhdGlvbkluZGV4ID0gbnVsbDtcblxuICAgICAgICB0aGlzLnZhbGlkYXRpb25zLnNvbWUoKHZhbGlkYXRpb24sIGluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbi5rZXkgIT09IGtleSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRpb25JbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh2YWxpZGF0aW9uSW5kZXggPT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIHRoZSB2YWxpZGF0aW9uXG4gICAgICAgIGNvbnN0IGR1bW15Q2hhbmdlcyA9IHt9O1xuICAgICAgICBkdW1teUNoYW5nZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICBjb25zdCBwcm94aWVyID0gY3JlYXRlU2V0dGluZ3NQcm94aWVyKHNldHRpbmdzLCBkdW1teUNoYW5nZXMsIHRoaXMpO1xuXG4gICAgICAgIHJldHVybiAhdGhpcy5fcnVuVmFsaWRhdGlvbih2YWxpZGF0aW9uSW5kZXgsIHZhbHVlLCBwcm94aWVyKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZSAoc2V0dGluZ3MpXG4gICAge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZU9wdGlvbnMoe30sIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBnZXRWYWxpZGF0ZWRPcHRpb25zIChzZXR0aW5ncywgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIGNvbnN0IGNsb25lZCA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl92YWxpZGF0ZU9wdGlvbnMoc2V0dGluZ3MsIGNsb25lZCk7XG4gICAgICAgIHJldHVybiBjbG9uZWQ7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlT3B0aW9ucyAoc2V0dGluZ3MsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBjb25zdCBzZXR0aW5nc1Byb3hpZXIgPSBjcmVhdGVTZXR0aW5nc1Byb3hpZXIoc2V0dGluZ3MsIG9wdGlvbnMsIHRoaXMpO1xuICAgICAgICB0aGlzLl9hcHBseVZhbGlkYXRpb25zKG9wdGlvbnMsIHNldHRpbmdzUHJveGllcik7XG4gICAgfVxuXG4gICAgX2FwcGx5VmFsaWRhdGlvbnMgKG9wdGlvbnMsIHByb3hpZXIpXG4gICAge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25zLmZvckVhY2goKHZhbGlkYXRpb24sIGluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkodmFsaWRhdGlvbi5rZXkpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBvcHRpb25zW3ZhbGlkYXRpb24ua2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RlZCA9IHRoaXMuX3J1blZhbGlkYXRpb24oaW5kZXgsIGlucHV0LCBwcm94aWVyKTtcblxuICAgICAgICAgICAgaWYgKGNvcnJlY3RlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvcnJlY3RlZC53YXJuaW5nU3VwcHJlc3NlZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRXYXJuaW5nKHZhbGlkYXRpb24ua2V5LCBpbnB1dCwgY29ycmVjdGVkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBvcHRpb25zW3ZhbGlkYXRpb24ua2V5XSA9IGNvcnJlY3RlZC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxuXG4gICAgX3J1blZhbGlkYXRpb24gKGluZGV4LCBpbnB1dCwgcHJveGllcilcbiAgICB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRpb25zW2luZGV4XTtcblxuICAgICAgICBwcm94aWVyLmluZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgbGV0IHdhcm5pbmdTdXBwcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgIHN1cHByZXNzV2FybmluZzogKCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nU3VwcHJlc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSB2YWxpZGF0aW9uLnZhbGlkYXRlKGlucHV0LCBwcm94aWVyLnByb3h5LCBjb25maWcpO1xuXG4gICAgICAgIGlmIChvdXRwdXRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IG91dHB1dFZhbHVlID09PSBpbnB1dClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG91dHB1dFZhbHVlLFxuICAgICAgICAgICAgd2FybmluZ1N1cHByZXNzZWQ6IHdhcm5pbmdTdXBwcmVzc2VkXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyBwcm94eSB3cmFwcyB0aGUgc2V0dGluZ3Mgb2JqZWN0IGFuZCBlbnN1cmVzIHRoYXRcbiAqIG9ubHkgdmFsdWVzIHdoaWNoIGhhdmUgcHJldmlvdXNseSBiZWVuIHZhbGlkYXRlZCBhcmUgYWNjZXNzZWQsXG4gKiB0aHJvd2luZyBhIFR5cGVFcnJvciBvdGhlcndpc2UuXG4gKlxuICogRklYTUUod2FiYWluKTogSXMgaXQgd29ydGgga2VlcGluZyB0aGlzPyBXaGVuIEkgd3JvdGUgaXQgSSBoYWRcbiAqIG11bHRpcGxlIHZhbGlkYXRpb24gc3RhZ2VzIGFuZCBpdCB3YXMgYSBsb3QgaGFyZGVyIHRvIGtlZXAgdHJhY2tcbiAqIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoaXMgd2FzIG1vcmUgdmFsdWFibGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNldHRpbmdzUHJveGllciAoc2V0dGluZ3MsIG9wdGlvbnMsIHJ1bm5lcilcbntcbiAgICBjb25zdCBwcm94aWVyID0ge1xuICAgICAgICBwcm94eToge30sXG4gICAgICAgIGluZGV4OiBudWxsXG4gICAgfTtcblxuICAgIGNvbnN0IGxvb2t1cCA9IGxvb2t1cFZhbHVlLmJpbmQobnVsbCwgc2V0dGluZ3MsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuXG4gICAgcnVubmVyLndoaXRlbGlzdGVkS2V5cy5mb3JFYWNoKCh3aGl0ZWxpc3RlZCkgPT5cbiAgICB7XG4gICAgICAgIHByb3BlcnRpZXNbd2hpdGVsaXN0ZWRdID0ge1xuICAgICAgICAgICAgZ2V0OiBsb29rdXAuYmluZChudWxsLCB3aGl0ZWxpc3RlZClcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJ1bm5lci5hZGRpdGlvbmFsUHJvcGVydGllcy5mb3JFYWNoKChhZGRpdGlvbmFsKSA9PlxuICAgIHtcbiAgICAgICAgcHJvcGVydGllc1thZGRpdGlvbmFsLmtleV0gPSB7XG4gICAgICAgICAgICBnZXQ6IGFkZGl0aW9uYWwuZ2V0XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBydW5uZXIudmFsaWRhdGlvbnMuZm9yRWFjaCggKHZhbGlkYXRpb24sIHZhbGlkYXRpb25JbmRleCkgPT5cbiAgICB7XG4gICAgICAgIHByb3BlcnRpZXNbdmFsaWRhdGlvbi5rZXldID0ge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uSW5kZXggPCBwcm94aWVyLmluZGV4KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cCh2YWxpZGF0aW9uLmtleSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHJ1bm5lci52YWxpZGF0aW9uc1twcm94aWVyLmluZGV4XS5rZXk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGFjY2VzcyBzZXR0aW5nICcgKyB2YWxpZGF0aW9uLmtleSArICcgd2hpbGUgdmFsaWRhdGluZyAnICsgY3VycmVudEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwcm94aWVyLnByb3h5LCBwcm9wZXJ0aWVzKTtcblxuICAgIHJldHVybiBwcm94aWVyO1xufVxuXG5mdW5jdGlvbiBlbWl0V2FybmluZyAoa2V5LCBvcmlnaW5hbCwgY29ycmVjdGVkKVxue1xuICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSBmb3IgJyArIGtleSArICc6ICcgKyBvcmlnaW5hbCArICcuIFVzaW5nICcgKyBjb3JyZWN0ZWQgKyAnIGluc3RlYWQuJyk7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cFZhbHVlIChiYXNlLCBleHRlbnNpb24sIGtleSlcbntcbiAgICBpZiAoa2V5IGluIGV4dGVuc2lvbilcbiAgICB7XG4gICAgICAgIHJldHVybiBleHRlbnNpb25ba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZVtrZXldO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld3BvcnRcbntcbiAgICBjb25zdHJ1Y3RvciAob3V0ZXIsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmludGVyc2VjdGlvblRvbGVyYW5jZSA9IG9wdGlvbnMuaW50ZXJzZWN0aW9uVG9sZXJhbmNlIHx8IDA7XG4gICAgICAgIHRoaXMub3V0ZXIgPSBvdXRlcjtcbiAgICAgICAgdGhpcy5fdG9wID0gdGhpcy5fbGVmdCA9IHRoaXMuX3dpZHRoID0gdGhpcy5faGVpZ2h0ID0gdGhpcy5faW5uZXJEaW1lbnNpb25zID0gbnVsbDtcblxuICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICB9XG5cbiAgICBpbnRlcnNlY3RzUmVnaW9uIChyZWdpb24pXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNIb3Jpem9udGFsT3ZlcmxhcChyZWdpb24pICYmIHRoaXMuaGFzVmVydGljYWxPdmVybGFwKHJlZ2lvbik7XG4gICAgfVxuXG4gICAgaGFzVmVydGljYWxPdmVybGFwIChyZWdpb24pXG4gICAge1xuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnRvcCAtIHRoaXMuaW50ZXJzZWN0aW9uVG9sZXJhbmNlO1xuICAgICAgICBjb25zdCBib3R0b20gPSB0aGlzLmJvdHRvbSArIHRoaXMuaW50ZXJzZWN0aW9uVG9sZXJhbmNlO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBmYWxsc0JldHdlZW4ocmVnaW9uLnRvcCwgdG9wLCBib3R0b20pIHx8XG4gICAgICAgICAgICBmYWxsc0JldHdlZW4ocmVnaW9uLmJvdHRvbSwgdG9wLCBib3R0b20pIHx8XG4gICAgICAgICAgICAocmVnaW9uLnRvcCA8PSB0b3AgJiYgcmVnaW9uLmJvdHRvbSA+PSBib3R0b20pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaGFzSG9yaXpvbnRhbE92ZXJsYXAgKHJlZ2lvbilcbiAgICB7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmxlZnQgLSB0aGlzLmludGVyc2VjdGlvblRvbGVyYW5jZTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnJpZ2h0ICsgdGhpcy5pbnRlcnNlY3Rpb25Ub2xlcmFuY2U7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGZhbGxzQmV0d2VlbihyZWdpb24ubGVmdCwgbGVmdCwgcmlnaHQpIHx8XG4gICAgICAgICAgICBmYWxsc0JldHdlZW4ocmVnaW9uLnJpZ2h0LCBsZWZ0LCByaWdodCkgfHxcbiAgICAgICAgICAgIChyZWdpb24ubGVmdCA8PSBsZWZ0ICYmIHJlZ2lvbi5yaWdodCA+PSByaWdodClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpbnZhbGlkYXRlICgpXG4gICAge1xuICAgICAgICAvLyBGSVhNRTogU2hvdWxkIHRoaXMgY2hlY2sgdGhlIGlubmVyIGRpbWVuc2lvbnMgYXMgd2VsbD9cbiAgICAgICAgdGhpcy5fd2lkdGggPSB0aGlzLm91dGVyLmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLm91dGVyLmNsaWVudEhlaWdodDtcblxuICAgICAgICB0aGlzLl90b3AgPSB0aGlzLm91dGVyLnNjcm9sbFRvcDtcbiAgICAgICAgdGhpcy5fbGVmdCA9IHRoaXMub3V0ZXIuc2Nyb2xsTGVmdDtcbiAgICB9XG5cbiAgICBzZXRJbm5lckRpbWVuc2lvbnMgKGRpbWVuc2lvbnMpXG4gICAge1xuICAgICAgICB0aGlzLl9pbm5lckRpbWVuc2lvbnMgPSBkaW1lbnNpb25zO1xuXG4gICAgICAgIGlmIChkaW1lbnNpb25zKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90b3AgPSBjbGFtcCh0aGlzLl90b3AsIDAsIGRpbWVuc2lvbnMuaGVpZ2h0IC0gdGhpcy5faGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuX2xlZnQgPSBjbGFtcCh0aGlzLl9sZWZ0LCAwLCBkaW1lbnNpb25zLndpZHRoIC0gdGhpcy5fd2lkdGgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhWaWV3cG9ydC5wcm90b3R5cGUsIHtcbiAgICB0b3A6IGdldENvb3JkaW5hdGVEZXNjcmlwdG9yKCd0b3AnLCAnaGVpZ2h0JyksXG4gICAgbGVmdDogZ2V0Q29vcmRpbmF0ZURlc2NyaXB0b3IoJ2xlZnQnLCAnd2lkdGgnKSxcblxuICAgIHdpZHRoOiBnZXREaW1lbnNpb25EZXNjcmlwdG9yKCd3aWR0aCcpLFxuICAgIGhlaWdodDogZ2V0RGltZW5zaW9uRGVzY3JpcHRvcignaGVpZ2h0JyksXG5cbiAgICBib3R0b206IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdG9wICsgdGhpcy5faGVpZ2h0O1xuICAgICAgICB9XG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sZWZ0ICsgdGhpcy5fd2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZnVuY3Rpb24gZ2V0Q29vcmRpbmF0ZURlc2NyaXB0b3IgKGNvb3JkLCBhc3NvY2lhdGVkRGltZW5zaW9uKVxue1xuICAgIGNvbnN0IHByaXZhdGVQcm9wID0gJ18nICsgY29vcmQ7XG4gICAgY29uc3Qgc291cmNlID0gJ3Njcm9sbCcgKyBjb29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGNvb3JkLnNsaWNlKDEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1twcml2YXRlUHJvcF07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1ZhbHVlKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2lubmVyRGltZW5zaW9ucylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhBbGxvd2VkID0gdGhpcy5faW5uZXJEaW1lbnNpb25zW2Fzc29jaWF0ZWREaW1lbnNpb25dIC0gdGhpc1thc3NvY2lhdGVkRGltZW5zaW9uXTtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkID0gY2xhbXAobmV3VmFsdWUsIDAsIG1heEFsbG93ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBjbGFtcE1pbihuZXdWYWx1ZSwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXNbcHJpdmF0ZVByb3BdID0gdGhpcy5vdXRlcltzb3VyY2VdID0gbm9ybWFsaXplZDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldERpbWVuc2lvbkRlc2NyaXB0b3IgKGRpbWVuKVxue1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbJ18nICsgZGltZW5dO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZmFsbHNCZXR3ZWVuIChwb2ludCwgc3RhcnQsIGVuZClcbntcbiAgICByZXR1cm4gcG9pbnQgPj0gc3RhcnQgJiYgcG9pbnQgPD0gZW5kO1xufVxuXG5mdW5jdGlvbiBjbGFtcCAodmFsdWUsIG1pbiwgbWF4KVxue1xuICAgIHJldHVybiBjbGFtcE1pbihjbGFtcE1heCh2YWx1ZSwgbWF4KSwgbWluKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBNaW4gKHZhbHVlLCBtaW4pXG57XG4gICAgcmV0dXJuIE1hdGgubWF4KHZhbHVlLCBtaW4pO1xufVxuXG5mdW5jdGlvbiBjbGFtcE1heCAodmFsdWUsIG1heClcbntcbiAgICByZXR1cm4gTWF0aC5taW4odmFsdWUsIG1heCk7XG59XG4iLCJpbXBvcnQgeyBlbHQgfSBmcm9tICcuL3V0aWxzL2VsdCc7XG5pbXBvcnQgZ2V0U2Nyb2xsYmFyV2lkdGggZnJvbSAnLi91dGlscy9nZXQtc2Nyb2xsYmFyLXdpZHRoJztcbmltcG9ydCBnZXN0dXJlRXZlbnRzIGZyb20gJy4vZ2VzdHVyZS1ldmVudHMnO1xuaW1wb3J0IGRpdmEgZnJvbSAnLi9kaXZhLWdsb2JhbCc7XG5pbXBvcnQgRG9jdW1lbnRIYW5kbGVyIGZyb20gJy4vZG9jdW1lbnQtaGFuZGxlcic7XG5pbXBvcnQgR3JpZEhhbmRsZXIgZnJvbSAnLi9ncmlkLWhhbmRsZXInO1xuaW1wb3J0IFBhZ2VPdmVybGF5TWFuYWdlciBmcm9tICcuL3BhZ2Utb3ZlcmxheS1tYW5hZ2VyJztcbmltcG9ydCBSZW5kZXJlciBmcm9tICcuL3JlbmRlcmVyJztcbmltcG9ydCBnZXRQYWdlTGF5b3V0cyBmcm9tICcuL3BhZ2UtbGF5b3V0cyc7XG5pbXBvcnQgY3JlYXRlU2V0dGluZ3NWaWV3IGZyb20gJy4vc2V0dGluZ3Mtdmlldyc7XG5pbXBvcnQgVmFsaWRhdGlvblJ1bm5lciBmcm9tICcuL3ZhbGlkYXRpb24tcnVubmVyJztcbmltcG9ydCBWaWV3cG9ydCBmcm9tICcuL3ZpZXdwb3J0JztcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdkaXZhOlZpZXdlckNvcmUnKTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVJZC5jb3VudGVyKys7XG59XG5nZW5lcmF0ZUlkLmNvdW50ZXIgPSAxO1xuXG5cbi8vIERlZmluZSB2YWxpZGF0aW9uc1xuY29uc3Qgb3B0aW9uc1ZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgICAga2V5OiAnZ29EaXJlY3RseVRvJyxcbiAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSwgc2V0dGluZ3MpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gc2V0dGluZ3MubWFuaWZlc3QucGFnZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIGtleTogJ21pblBhZ2VzUGVyUm93JyxcbiAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBrZXk6ICdtYXhQYWdlc1BlclJvdycsXG4gICAgICAgIHZhbGlkYXRlOiAodmFsdWUsIHNldHRpbmdzKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodmFsdWUsIHNldHRpbmdzLm1pblBhZ2VzUGVyUm93KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBrZXk6ICdwYWdlc1BlclJvdycsXG4gICAgICAgIHZhbGlkYXRlOiAodmFsdWUsIHNldHRpbmdzKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIHRoZSBtYXhpbXVtXG4gICAgICAgICAgICBpZiAodmFsdWUgPCBzZXR0aW5ncy5taW5QYWdlc1BlclJvdyB8fCB2YWx1ZSA+IHNldHRpbmdzLm1heFBhZ2VzUGVyUm93KVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5tYXhQYWdlc1BlclJvdztcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBrZXk6ICdtYXhab29tTGV2ZWwnLFxuICAgICAgICB2YWxpZGF0ZTogKHZhbHVlLCBzZXR0aW5ncywgY29uZmlnKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBDaGFuZ2luZyB0aGlzIHZhbHVlIGlzbid0IHJlYWxseSBhbiBlcnJvciwgaXQganVzdCBkZXBlbmRzIG9uIHRoZVxuICAgICAgICAgICAgLy8gc291cmNlIG1hbmlmZXN0XG4gICAgICAgICAgICBjb25maWcuc3VwcHJlc3NXYXJuaW5nKCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiBzZXR0aW5ncy5tYW5pZmVzdC5tYXhab29tKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5tYW5pZmVzdC5tYXhab29tO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIGtleTogJ21pblpvb21MZXZlbCcsXG4gICAgICAgIHZhbGlkYXRlOiAodmFsdWUsIHNldHRpbmdzLCBjb25maWcpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIENoYW5nZXMgYmFzZWQgb24gdGhlIG1hbmlmZXN0IHZhbHVlIHNob3VsZG4ndCB0cmlnZ2VyIGFcbiAgICAgICAgICAgIC8vIHdhcm5pbmdcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IHNldHRpbmdzLm1hbmlmZXN0Lm1heFpvb20pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnN1cHByZXNzV2FybmluZygpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gc2V0dGluZ3MubWF4Wm9vbUxldmVsKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIGtleTogJ3pvb21MZXZlbCcsXG4gICAgICAgIHZhbGlkYXRlOiAodmFsdWUsIHNldHRpbmdzLCBjb25maWcpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IHNldHRpbmdzLm1hbmlmZXN0Lm1heFpvb20pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnN1cHByZXNzV2FybmluZygpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPCBzZXR0aW5ncy5taW5ab29tTGV2ZWwgfHwgdmFsdWUgPiBzZXR0aW5ncy5tYXhab29tTGV2ZWwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldHRpbmdzLm1pblpvb21MZXZlbDtcbiAgICAgICAgfVxuICAgIH1cbl07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXdlckNvcmVcbntcbiAgICBjb25zdHJ1Y3RvciAoZWxlbWVudCwgb3B0aW9ucywgcHVibGljSW5zdGFuY2UpXG4gICAge1xuICAgICAgICB0aGlzLnBhcmVudE9iamVjdCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMucHVibGljSW5zdGFuY2UgPSBwdWJsaWNJbnN0YW5jZTtcblxuICAgICAgICAvLyBUaGluZ3MgdGhhdCBjYW5ub3QgYmUgY2hhbmdlZCBiZWNhdXNlIG9mIHRoZSB3YXkgdGhleSBhcmUgdXNlZCBieSB0aGUgc2NyaXB0XG4gICAgICAgIC8vIE1hbnkgb2YgdGhlc2UgYXJlIGRlY2xhcmVkIHdpdGggYXJiaXRyYXJ5IHZhbHVlcyB0aGF0IGFyZSBjaGFuZ2VkIGxhdGVyIG9uXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUgPSB7XG4gICAgICAgICAgICBjdXJyZW50UGFnZUluZGljZXM6IFswXSwgICAgLy8gVGhlIHZpc2libGUgcGFnZXMgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgICAgICBhY3RpdmVQYWdlSW5kZXg6IDAsICAgICAgICAgLy8gVGhlIGN1cnJlbnQgJ2FjdGl2ZScgcGFnZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IDAsICAgICAgICAvLyBEaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGRpdmEgZWxlbWVudCB0byB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgIGhvcml6b250YWxQYWRkaW5nOiAwLCAgICAgICAvLyBFaXRoZXIgdGhlIGZpeGVkIHBhZGRpbmcgb3IgYWRhcHRpdmUgcGFkZGluZ1xuICAgICAgICAgICAgSUQ6IG51bGwsICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVmaXggb2YgdGhlIElEcyBvZiB0aGUgZWxlbWVudHMgKHVzdWFsbHkgMS1kaXZhLSlcbiAgICAgICAgICAgIGluaXRpYWxLZXlTY3JvbGw6IGZhbHNlLCAgICAvLyBIb2xkcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBlbmFibGVLZXlTY3JvbGxcbiAgICAgICAgICAgIGluaXRpYWxTcGFjZVNjcm9sbDogZmFsc2UsICAvLyBIb2xkcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBlbmFibGVTcGFjZVNjcm9sbFxuICAgICAgICAgICAgaW5uZXJFbGVtZW50OiBudWxsLCAgICAgICAgIC8vIFRoZSBuYXRpdmUgLmRpdmEtb3V0ZXIgRE9NIG9iamVjdFxuICAgICAgICAgICAgaW5uZXJPYmplY3Q6IHt9LCAgICAgICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNldHRpbmdzLklEICsgJ2lubmVyJyksIGZvciBzZWxlY3RpbmcgdGhlIC5kaXZhLWlubmVyIGVsZW1lbnRcbiAgICAgICAgICAgIGlzQWN0aXZlRGl2YTogdHJ1ZSwgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IG11bHRpcGxlIGRpdmEgcGFuZXMgZXhpc3Qgb24gdGhlIHNhbWUgcGFnZSwgdGhpcyBzaG91bGQgaGF2ZSBldmVudHMgZnVubmVsZWQgdG8gaXQuXG4gICAgICAgICAgICBpc1Njcm9sbGFibGU6IHRydWUsICAgICAgICAgLy8gVXNlZCBpbiBlbmFibGUvZGlzYWJsZVNjcm9sbGFibGUgcHVibGljIG1ldGhvZHNcbiAgICAgICAgICAgIGlzWm9vbWluZzogZmFsc2UsICAgICAgICAgICAvLyBGbGFnIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB6b29taW5nIGlzIHN0aWxsIGluIHByb2dyZXNzLCBmb3IgaGFuZGxlWm9vbVxuICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSwgICAgICAgICAgICAgIC8vIEEgZmxhZyBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGxvYWRlZCBhbmQgcmVhZHkgdG8gZ28uXG4gICAgICAgICAgICBtYW5pZmVzdDogbnVsbCxcbiAgICAgICAgICAgIG1vYmlsZVdlYmtpdDogZmFsc2UsICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHVzZXIgaXMgb24gYSB0b3VjaCBkZXZpY2UgKGlQYWQvaVBvZC9pUGhvbmUvQW5kcm9pZClcbiAgICAgICAgICAgIG51bVBhZ2VzOiAwLCAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcGFnZXMgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBvbGRab29tTGV2ZWw6IC0xLCAgICAgICAgICAgLy8gSG9sZHMgdGhlIHByZXZpb3VzIHpvb20gbGV2ZWwgYWZ0ZXIgem9vbWluZyBpbiBvciBvdXRcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgICAgICBvdXRlckVsZW1lbnQ6IG51bGwsICAgICAgICAgLy8gVGhlIG5hdGl2ZSAuZGl2YS1vdXRlciBET00gb2JqZWN0XG4gICAgICAgICAgICBvdXRlck9iamVjdDoge30sICAgICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2V0dGluZ3MuSUQgKyAnb3V0ZXInKSwgZm9yIHNlbGVjdGluZyB0aGUgLmRpdmEtb3V0ZXIgZWxlbWVudFxuICAgICAgICAgICAgcGFnZU92ZXJsYXlzOiBuZXcgUGFnZU92ZXJsYXlNYW5hZ2VyKCksXG4gICAgICAgICAgICBwYWdlVG9vbHM6IFtdLCAgICAgICAgICAgICAgLy8gVGhlIHBsdWdpbnMgd2hpY2ggYXJlIGVuYWJsZWQgYXMgcGFnZSB0b29sc1xuICAgICAgICAgICAgcGFyZW50T2JqZWN0OiB0aGlzLnBhcmVudE9iamVjdCwgLy8gSlF1ZXJ5IG9iamVjdCByZWZlcmVuY2luZyB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIHBlbmRpbmdNYW5pZmVzdFJlcXVlc3Q6IG51bGwsIC8vIFJlZmVyZW5jZSB0byB0aGUgeGhyIHJlcXVlc3QgcmV0cmlldmluZyB0aGUgbWFuaWZlc3QuIFVzZWQgdG8gY2FuY2VsIHRoZSByZXF1ZXN0IG9uIGRlc3Ryb3koKVxuICAgICAgICAgICAgcGx1Z2luSW5zdGFuY2VzOiBbXSwgICAgICAgICAgICAgICAgLy8gRmlsbGVkIHdpdGggdGhlIGVuYWJsZWQgcGx1Z2lucyBmcm9tIHRoZSByZWdpc3RyeVxuICAgICAgICAgICAgcmVuZGVyZXI6IG51bGwsXG4gICAgICAgICAgICByZXNpemVUaW1lcjogLTEsICAgICAgICAgICAgLy8gSG9sZHMgdGhlIElEIG9mIHRoZSB0aW1lb3V0IHVzZWQgd2hlbiByZXNpemluZyB0aGUgd2luZG93IChmb3IgY2xlYXJpbmcpXG4gICAgICAgICAgICBzY3JvbGxiYXJXaWR0aDogMCwgICAgICAgICAgLy8gU2V0IHRvIHRoZSBhY3R1YWwgc2Nyb2xsYmFyIHdpZHRoIGluIGluaXQoKVxuICAgICAgICAgICAgc2VsZWN0b3I6ICcnLCAgICAgICAgICAgICAgIC8vIFVzZXMgdGhlIGdlbmVyYXRlZCBJRCBwcmVmaXggdG8gZWFzaWx5IHNlbGVjdCBlbGVtZW50c1xuICAgICAgICAgICAgdGhyb2JiZXJUaW1lb3V0SUQ6IC0xLCAgICAgIC8vIEhvbGRzIHRoZSBJRCBvZiB0aGUgdGhyb2JiZXIgbG9hZGluZyB0aW1lb3V0XG4gICAgICAgICAgICB0b29sYmFyOiBudWxsLCAgICAgICAgICAgICAgLy8gSG9sZHMgYW4gb2JqZWN0IHdpdGggc29tZSB0b29sYmFyLXJlbGF0ZWQgZnVuY3Rpb25zXG4gICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogMCwgICAgICAgICAgLy8gRGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBkaXZhIGVsZW1lbnQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgICAgICB2ZXJ0aWNhbFBhZGRpbmc6IDAsICAgICAgICAgLy8gRWl0aGVyIHRoZSBmaXhlZCBwYWRkaW5nIG9yIGFkYXB0aXZlIHBhZGRpbmdcbiAgICAgICAgICAgIHZpZXdIYW5kbGVyOiBudWxsLFxuICAgICAgICAgICAgdmlld3BvcnQ6IG51bGwsICAgICAgICAgICAgIC8vIE9iamVjdCBjYWNoaW5nIHRoZSB2aWV3cG9ydCBkaW1lbnNpb25zXG4gICAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICB2aWV3cG9ydE9iamVjdDogbnVsbCxcbiAgICAgICAgICAgIHpvb21EdXJhdGlvbjogNDAwXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IGNyZWF0ZVNldHRpbmdzVmlldyhbb3B0aW9ucywgdGhpcy52aWV3ZXJTdGF0ZV0pO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIGFuIElEIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwcmVmaXggZm9yIGFsbCB0aGUgb3RoZXIgSURzXG4gICAgICAgIGNvbnN0IGlkTnVtYmVyID0gZ2VuZXJhdGVJZCgpO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLklEID0gJ2RpdmEtJyArIGlkTnVtYmVyICsgJy0nO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnNlbGVjdG9yID0gdGhpcy5zZXR0aW5ncy5JRDtcblxuICAgICAgICAvLyBBbGlhc2VzIGZvciBjb21wYXRpYmlsaXR5XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMuc2V0dGluZ3MsIHtcbiAgICAgICAgICAgIC8vIEhlaWdodCBvZiB0aGUgZG9jdW1lbnQgdmlld2VyIHBhbmVcbiAgICAgICAgICAgIHBhbmVsSGVpZ2h0OiB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBXaWR0aCBvZiB0aGUgZG9jdW1lbnQgdmlld2VyIHBhbmVcbiAgICAgICAgICAgIHBhbmVsV2lkdGg6IHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3B0aW9uc1ZhbGlkYXRvciA9IG5ldyBWYWxpZGF0aW9uUnVubmVyKHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdtYW5pZmVzdCcsXG4gICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGUubWFuaWZlc3Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICB2YWxpZGF0aW9uczogb3B0aW9uc1ZhbGlkYXRpb25zXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUuc2Nyb2xsYmFyV2lkdGggPSBnZXRTY3JvbGxiYXJXaWR0aCgpO1xuXG4gICAgICAgIC8vIElmIHdpbmRvdy5vcmllbnRhdGlvbiBpcyBkZWZpbmVkLCB0aGVuIGl0J3MgcHJvYmFibHkgbW9iaWxlV2Via2l0XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUubW9iaWxlV2Via2l0ID0gd2luZG93Lm9yaWVudGF0aW9uICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaGFzaFBhcmFtU3VmZml4ID09PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBPbWl0IHRoZSBzdWZmaXggZnJvbSB0aGUgZmlyc3QgaW5zdGFuY2VcbiAgICAgICAgICAgIGlmIChpZE51bWJlciA9PT0gMSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhhc2hQYXJhbVN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuaGFzaFBhcmFtU3VmZml4ID0gaWROdW1iZXIgKyAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5uZXIgYW5kIG91dGVyIHBhbmVsc1xuICAgICAgICBjb25zdCBpbm5lckVsZW0gPSBlbHQoJ2RpdicsIHRoaXMuZWxlbUF0dHJzKCdpbm5lcicsIHsgY2xhc3M6ICdkaXZhLWlubmVyJyB9KSk7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbSA9IGVsdCgnZGl2JywgdGhpcy5lbGVtQXR0cnMoJ3ZpZXdwb3J0JyksIGlubmVyRWxlbSk7XG4gICAgICAgIGNvbnN0IG91dGVyRWxlbSA9IGVsdCgnZGl2JywgdGhpcy5lbGVtQXR0cnMoJ291dGVyJyksXG4gICAgICAgICAgICB2aWV3cG9ydEVsZW0sXG4gICAgICAgICAgICBlbHQoJ2RpdicsIHRoaXMuZWxlbUF0dHJzKCd0aHJvYmJlcicpLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdkaXYnLCB7IGNsYXNzOiAnY3ViZSBjdWJlMScgfSksXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgeyBjbGFzczogJ2N1YmUgY3ViZTInIH0pLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdjdWJlIGN1YmUzJyB9KSxcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdkaXYnLCB7IGNsYXNzOiAnY3ViZSBjdWJlNCcgfSksXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgeyBjbGFzczogJ2N1YmUgY3ViZTUnIH0pLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdjdWJlIGN1YmU2JyB9KSxcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdkaXYnLCB7IGNsYXNzOiAnY3ViZSBjdWJlNycgfSksXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgeyBjbGFzczogJ2N1YmUgY3ViZTgnIH0pLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdjdWJlIGN1YmU5JyB9KSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApKTtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmlubmVyRWxlbWVudCA9IGlubmVyRWxlbTtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydEVsZW1lbnQgPSB2aWV3cG9ydEVsZW07XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUub3V0ZXJFbGVtZW50ID0gb3V0ZXJFbGVtO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUuaW5uZXJPYmplY3QgPSBpbm5lckVsZW07XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QgPSB2aWV3cG9ydEVsZW07XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUub3V0ZXJPYmplY3QgPSBvdXRlckVsZW07XG5cbiAgICAgICAgdGhpcy5zZXR0aW5ncy5wYXJlbnRPYmplY3QuYXBwZW5kKG91dGVyRWxlbSk7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCh0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0RWxlbWVudCwge1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uVG9sZXJhbmNlOiB0aGlzLnNldHRpbmdzLnZpZXdwb3J0TWFyZ2luXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYm91bmRTY3JvbGxGdW5jdGlvbiA9IHRoaXMuc2Nyb2xsRnVuY3Rpb24uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5ib3VuZEVzY2FwZUxpc3RlbmVyID0gdGhpcy5lc2NhcGVMaXN0ZW5lci5iaW5kKHRoaXMpO1xuXG4gICAgICAgIC8vIERvIGFsbCB0aGUgcGx1Z2luIGluaXRpYWxpc2F0aW9uXG4gICAgICAgIHRoaXMuaW5pdFBsdWdpbnMoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudHMoKTtcblxuICAgICAgICAvLyBTaG93IHRoZSB0aHJvYmJlciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbWFuaWZlc3QgdG8gbG9hZFxuICAgICAgICB0aGlzLnNob3dUaHJvYmJlcigpO1xuICAgIH1cblxuICAgIGlzVmFsaWRPcHRpb24gKGtleSwgdmFsdWUpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zVmFsaWRhdG9yLmlzVmFsaWQoa2V5LCB2YWx1ZSwgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zKTtcbiAgICB9XG5cbiAgICBlbGVtQXR0cnMgKGlkZW50LCBiYXNlKVxuICAgIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5JRCArIGlkZW50LFxuICAgICAgICAgICAgY2xhc3M6ICdkaXZhLScgKyBpZGVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChiYXNlKVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXR0cnMsIGJhc2UpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuXG4gICAgZ2V0UGFnZURhdGEgKHBhZ2VJbmRleCwgYXR0cmlidXRlKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbcGFnZUluZGV4XS5kW3RoaXMuc2V0dGluZ3Muem9vbUxldmVsXVthdHRyaWJ1dGVdO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHNvbWUgc2V0dGluZ3MgYW5kIGVtcHR5IHRoZSB2aWV3cG9ydFxuICAgIGNsZWFyVmlld2VyICgpXG4gICAge1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LnRvcCA9IDA7XG5cbiAgICAgICAgLy8gQ2xlYXIgYWxsIHRoZSB0aW1lb3V0cyB0byBwcmV2ZW50IHVuZGVzaXJlZCBwYWdlcyBmcm9tIGxvYWRpbmdcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld2VyU3RhdGUucmVzaXplVGltZXIpO1xuICAgIH1cblxuICAgIGhhc0NoYW5nZWRPcHRpb24gKG9wdGlvbnMsIGtleSlcbiAgICB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gb3B0aW9ucyAmJiBvcHRpb25zW2tleV0gIT09IHRoaXMuc2V0dGluZ3Nba2V5XTtcbiAgICB9XG5cbiAgICAvL1Nob3J0Y3V0IGZvciBjbG9zaW5nIGZ1bGxzY3JlZW4gd2l0aCB0aGUgZXNjYXBlIGtleVxuICAgIGVzY2FwZUxpc3RlbmVyIChlKVxuICAgIHtcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucHVibGljSW5zdGFuY2UubGVhdmVGdWxsc2NyZWVuTW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHNldHRpbmdzIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgb3B0aW9ucy4gTG9hZCB0aGUgdmlld2VyLFxuICAgICAqIGZpcmUgYXBwcm9wcmlhdGUgZXZlbnRzIGZvciBjaGFuZ2VkIG9wdGlvbnMuXG4gICAgICovXG4gICAgcmVsb2FkVmlld2VyIChuZXdPcHRpb25zKVxuICAgIHtcbiAgICAgICAgY29uc3QgcXVldWVkRXZlbnRzID0gW107XG5cbiAgICAgICAgbmV3T3B0aW9ucyA9IHRoaXMub3B0aW9uc1ZhbGlkYXRvci5nZXRWYWxpZGF0ZWRPcHRpb25zKHRoaXMuc2V0dGluZ3MsIG5ld09wdGlvbnMpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgem9vbSBsZXZlbCBpZiB2YWxpZCBhbmQgZmlyZSBhIFpvb21MZXZlbERpZENoYW5nZSBldmVudFxuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VkT3B0aW9uKG5ld09wdGlvbnMsICd6b29tTGV2ZWwnKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vbGRab29tTGV2ZWwgPSB0aGlzLnNldHRpbmdzLnpvb21MZXZlbDtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy56b29tTGV2ZWwgPSBuZXdPcHRpb25zLnpvb21MZXZlbDtcbiAgICAgICAgICAgIHF1ZXVlZEV2ZW50cy5wdXNoKFtcIlpvb21MZXZlbERpZENoYW5nZVwiLCBuZXdPcHRpb25zLnpvb21MZXZlbF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwYWdlcyBwZXIgcm93IGlmIHZhbGlkIGFuZCBmaXJlIGFuIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLmhhc0NoYW5nZWRPcHRpb24obmV3T3B0aW9ucywgJ3BhZ2VzUGVyUm93JykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5wYWdlc1BlclJvdyA9IG5ld09wdGlvbnMucGFnZXNQZXJSb3c7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMucHVzaChbXCJHcmlkUm93TnVtYmVyRGlkQ2hhbmdlXCIsIG5ld09wdGlvbnMucGFnZXNQZXJSb3ddKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB2ZXJ0aWNhbGx5T3JpZW50ZWQgKG5vIGV2ZW50IGZpcmVkKVxuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VkT3B0aW9uKG5ld09wdGlvbnMsICd2ZXJ0aWNhbGx5T3JpZW50ZWQnKSlcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy52ZXJ0aWNhbGx5T3JpZW50ZWQgPSBuZXdPcHRpb25zLnZlcnRpY2FsbHlPcmllbnRlZDtcblxuICAgICAgICAvLyBTaG93L0hpZGUgbm9uLXBhZ2VkIHBhZ2VzXG4gICAgICAgIGlmICh0aGlzLmhhc0NoYW5nZWRPcHRpb24obmV3T3B0aW9ucywgJ3Nob3dOb25QYWdlZFBhZ2VzJykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5zaG93Tm9uUGFnZWRQYWdlcyA9IG5ld09wdGlvbnMuc2hvd05vblBhZ2VkUGFnZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgcGFnZSBwb3NpdGlvbiAobm8gZXZlbnQgZmlyZWQgaGVyZSlcbiAgICAgICAgaWYgKCdnb0RpcmVjdGx5VG8nIGluIG5ld09wdGlvbnMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5nb0RpcmVjdGx5VG8gPSBuZXdPcHRpb25zLmdvRGlyZWN0bHlUbztcblxuICAgICAgICAgICAgaWYgKCd2ZXJ0aWNhbE9mZnNldCcgaW4gbmV3T3B0aW9ucylcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsT2Zmc2V0ID0gbmV3T3B0aW9ucy52ZXJ0aWNhbE9mZnNldDtcblxuICAgICAgICAgICAgaWYgKCdob3Jpem9udGFsT2Zmc2V0JyBpbiBuZXdPcHRpb25zKVxuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbE9mZnNldCA9IG5ld09wdGlvbnMuaG9yaXpvbnRhbE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSB0aGUgZGVmYXVsdCBpcyB0byByZW1haW4gb24gdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zLmdvRGlyZWN0bHlUbyA9IHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlZE9wdGlvbihuZXdPcHRpb25zLCAnaW5HcmlkJykgfHwgdGhpcy5oYXNDaGFuZ2VkT3B0aW9uKG5ld09wdGlvbnMsICdpbkJvb2tMYXlvdXQnKSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCdpbkdyaWQnIGluIG5ld09wdGlvbnMpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zLmluR3JpZCA9IG5ld09wdGlvbnMuaW5HcmlkO1xuXG4gICAgICAgICAgICBpZiAoJ2luQm9va0xheW91dCcgaW4gbmV3T3B0aW9ucylcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuaW5Cb29rTGF5b3V0ID0gbmV3T3B0aW9ucy5pbkJvb2tMYXlvdXQ7XG5cbiAgICAgICAgICAgIHF1ZXVlZEV2ZW50cy5wdXNoKFtcIlZpZXdEaWRTd2l0Y2hcIiwgdGhpcy5zZXR0aW5ncy5pbkdyaWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGU6IHByZXBhcmVNb2RlQ2hhbmdlKCkgZGVwZW5kcyBvbiBpbkdyaWQgYW5kIHRoZSB2ZXJ0aWNhbC9ob3Jpem9udGFsT2Zmc2V0IChmb3Igbm93KVxuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VkT3B0aW9uKG5ld09wdGlvbnMsICdpbkZ1bGxzY3JlZW4nKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zLmluRnVsbHNjcmVlbiA9IG5ld09wdGlvbnMuaW5GdWxsc2NyZWVuO1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlTW9kZUNoYW5nZShuZXdPcHRpb25zKTtcbiAgICAgICAgICAgIHF1ZXVlZEV2ZW50cy5wdXNoKFtcIk1vZGVEaWRTd2l0Y2hcIiwgdGhpcy5zZXR0aW5ncy5pbkZ1bGxzY3JlZW5dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJWaWV3ZXIoKTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3SGFuZGxlckFuZFJlbmRlcmluZygpO1xuXG4gICAgICAgIGlmICh0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGUgdXNhZ2Ugb2YgcGFkZGluZyB2YXJpYWJsZXMgaXMgc3RpbGwgcmVhbGx5XG4gICAgICAgICAgICAvLyBtZXNzeSBhbmQgaW5jb25zaXN0ZW50XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlckNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBwYWdlTGF5b3V0czogZ2V0UGFnZUxheW91dHModGhpcy5zZXR0aW5ncyksXG4gICAgICAgICAgICAgICAgcGFkZGluZzogdGhpcy5nZXRQYWRkaW5nKCksXG4gICAgICAgICAgICAgICAgbWF4Wm9vbUxldmVsOiB0aGlzLnNldHRpbmdzLmluR3JpZCA/IG51bGwgOiB0aGlzLnZpZXdlclN0YXRlLm1hbmlmZXN0Lm1heFpvb20sXG4gICAgICAgICAgICAgICAgdmVydGljYWxseU9yaWVudGVkOiB0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZCB8fCB0aGlzLnNldHRpbmdzLmluR3JpZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0UG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgem9vbUxldmVsOiB0aGlzLnNldHRpbmdzLmluR3JpZCA/IG51bGwgOiB0aGlzLnNldHRpbmdzLnpvb21MZXZlbCxcbiAgICAgICAgICAgICAgICBhbmNob3JQYWdlOiB0aGlzLnNldHRpbmdzLmdvRGlyZWN0bHlUbyxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbE9mZnNldCxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxPZmZzZXRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVByb3ZpZGVyID0gdGhpcy5nZXRDdXJyZW50U291cmNlUHJvdmlkZXIoKTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnLmVuYWJsZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IE9iamVjdC5rZXlzKHJlbmRlcmVyQ29uZmlnKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChrZXkpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvbyBsb25nXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5ICE9PSAncGFnZUxheW91dHMnICYmIGtleSAhPT0gJ3BhZGRpbmcnO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChrZXkpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVuZGVyZXJDb25maWdba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkgKyAnOiAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnKCdyZWxvYWQgd2l0aCAlcycsIHNlcmlhbGl6ZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmxvYWQocmVuZGVyZXJDb25maWcsIHZpZXdwb3J0UG9zaXRpb24sIHNvdXJjZVByb3ZpZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlZEV2ZW50cy5mb3JFYWNoKCAocGFyYW1zKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2guYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlcyBzd2l0Y2hpbmcgaW4gYW5kIG91dCBvZiBmdWxsc2NyZWVuIG1vZGVcbiAgICBwcmVwYXJlTW9kZUNoYW5nZSAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIC8vIFRvZ2dsZSB0aGUgY2xhc3Nlc1xuICAgICAgICBjb25zdCBjaGFuZ2VDbGFzcyA9IG9wdGlvbnMuaW5GdWxsc2NyZWVuID8gJ2FkZCcgOiAncmVtb3ZlJztcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vdXRlck9iamVjdC5jbGFzc0xpc3RbY2hhbmdlQ2xhc3NdKCdkaXZhLWZ1bGxzY3JlZW4nKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3RbY2hhbmdlQ2xhc3NdKCdkaXZhLWhpZGUtc2Nyb2xsYmFyJyk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MucGFyZW50T2JqZWN0LmNsYXNzTGlzdFtjaGFuZ2VDbGFzc10oJ2RpdmEtZnVsbC13aWR0aCcpO1xuXG4gICAgICAgIC8vIEFkanVzdCBEaXZhJ3MgaW50ZXJuYWwgcGFuZWwgc2l6ZSwga2VlcGluZyB0aGUgb2xkIHZhbHVlc1xuICAgICAgICBjb25zdCBzdG9yZWRIZWlnaHQgPSB0aGlzLnNldHRpbmdzLnBhbmVsSGVpZ2h0O1xuICAgICAgICBjb25zdCBzdG9yZWRXaWR0aCA9IHRoaXMuc2V0dGluZ3MucGFuZWxXaWR0aDtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnZhbGlkYXRlKCk7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCB0aGUgb3JpZ2luYWwgbG9hZCwgdGhlIG9mZnNldHMgbWF0dGVyLCBhbmQgdGhlIHBvc2l0aW9uIGlzbid0IGJlaW5nIGNoYW5nZWQuLi5cbiAgICAgICAgaWYgKCF0aGlzLnZpZXdlclN0YXRlLmxvYWRlZCAmJiAhdGhpcy5zZXR0aW5ncy5pbkdyaWQgJiYgISgndmVydGljYWxPZmZzZXQnIGluIG9wdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICAvL2dldCB0aGUgdXBkYXRlZCBwYW5lbCBzaXplXG4gICAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSB0aGlzLnNldHRpbmdzLnBhbmVsSGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLnNldHRpbmdzLnBhbmVsV2lkdGg7XG5cbiAgICAgICAgICAgIC8vYW5kIHJlLWNlbnRlciB0aGUgbmV3IHBhbmVsIG9uIHRoZSBzYW1lIHBvaW50XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsT2Zmc2V0ICs9ICgoc3RvcmVkSGVpZ2h0IC0gbmV3SGVpZ2h0KSAvIDIpO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsT2Zmc2V0ICs9ICgoc3RvcmVkV2lkdGggLSBuZXdXaWR0aCkgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdHVybiBvbi9vZmYgZXNjYXBlIGtleSBsaXN0ZW5lclxuICAgICAgICBpZiAob3B0aW9ucy5pbkZ1bGxzY3JlZW4pXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuYm91bmRFc2NhcGVMaXN0ZW5lcik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5ib3VuZEVzY2FwZUxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHZpZXcgaGFuZGxlciBhbmQgdGhlIHZpZXcgcmVuZGVyaW5nIGZvciB0aGUgY3VycmVudCB2aWV3XG4gICAgdXBkYXRlVmlld0hhbmRsZXJBbmRSZW5kZXJpbmcgKClcbiAgICB7XG4gICAgICAgIGNvbnN0IEhhbmRsZXIgPSB0aGlzLnNldHRpbmdzLmluR3JpZCA/IEdyaWRIYW5kbGVyIDogRG9jdW1lbnRIYW5kbGVyO1xuXG4gICAgICAgIGlmICh0aGlzLnZpZXdlclN0YXRlLnZpZXdIYW5kbGVyICYmICEodGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlciBpbnN0YW5jZW9mIEhhbmRsZXIpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnZpZXdlclN0YXRlLnZpZXdIYW5kbGVyKVxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlciA9IG5ldyBIYW5kbGVyKHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlcilcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVJlbmRlcmVyKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVGhpcyBjb3VsZCBwcm9iYWJseSBiZSBkb25lIHVwb24gVmlld2VyQ29yZSBpbml0aWFsaXphdGlvblxuICAgIGluaXRpYWxpemVSZW5kZXJlciAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgY29tcGF0RXJyb3JzID0gUmVuZGVyZXIuZ2V0Q29tcGF0aWJpbGl0eUVycm9ycygpO1xuXG4gICAgICAgIGlmIChjb21wYXRFcnJvcnMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKGNvbXBhdEVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0OiB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LFxuICAgICAgICAgICAgICAgIG91dGVyRWxlbWVudDogdGhpcy52aWV3ZXJTdGF0ZS5vdXRlckVsZW1lbnQsXG4gICAgICAgICAgICAgICAgaW5uZXJFbGVtZW50OiB0aGlzLnZpZXdlclN0YXRlLmlubmVyRWxlbWVudCxcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5nc1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgaG9va3MgPSB7XG4gICAgICAgICAgICAgICAgb25WaWV3V2lsbExvYWQ6ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdIYW5kbGVyLm9uVmlld1dpbGxMb2FkKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblZpZXdEaWRMb2FkOiAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYWdlT3ZlcmxheXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlci5vblZpZXdEaWRMb2FkKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblZpZXdEaWRVcGRhdGU6IChwYWdlcywgdGFyZ2V0UGFnZSkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnZU92ZXJsYXlzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIub25WaWV3RGlkVXBkYXRlKHBhZ2VzLCB0YXJnZXRQYWdlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uVmlld0RpZFRyYW5zaXRpb246ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VPdmVybGF5cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25QYWdlV2lsbExvYWQ6IChwYWdlSW5kZXgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2goJ1BhZ2VXaWxsTG9hZCcsIHBhZ2VJbmRleCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblpvb21MZXZlbFdpbGxDaGFuZ2U6ICh6b29tTGV2ZWwpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2goJ1pvb21MZXZlbFdpbGxDaGFuZ2UnLCB6b29tTGV2ZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIob3B0aW9ucywgaG9va3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNvdXJjZVByb3ZpZGVyICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGdyaWRTb3VyY2VQcm92aWRlciA9IHtcbiAgICAgICAgICAgICAgICBnZXRBbGxab29tTGV2ZWxzRm9yUGFnZTogKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2dyaWRTb3VyY2VQcm92aWRlci5nZXRCZXN0Wm9vbUxldmVsRm9yUGFnZShwYWdlKV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRCZXN0Wm9vbUxldmVsRm9yUGFnZTogKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LmdldFBhZ2VJbWFnZVVSTChwYWdlLmluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogcGFnZS5kaW1lbnNpb25zLndpZHRoXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6b29tTGV2ZWw6IDEsIC8vIEZJWE1FXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21MZXZlbDogMSwgLy8gRklYTUVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IHBhZ2UuZGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gZ3JpZFNvdXJjZVByb3ZpZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGlsZURpbWVuc2lvbnMgPSB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy5zZXR0aW5ncy50aWxlV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc2V0dGluZ3MudGlsZUhlaWdodFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXRCZXN0Wm9vbUxldmVsRm9yUGFnZTogKHBhZ2UpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QuZ2V0UGFnZUltYWdlVGlsZXMocGFnZS5pbmRleCwgTWF0aC5jZWlsKHRoaXMuc2V0dGluZ3Muem9vbUxldmVsKSwgdGlsZURpbWVuc2lvbnMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEFsbFpvb21MZXZlbHNGb3JQYWdlOiAocGFnZSkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbENvdW50ID0gdGhpcy52aWV3ZXJTdGF0ZS5tYW5pZmVzdC5tYXhab29tO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbGV2ZWw9MDsgbGV2ZWwgPD0gbGV2ZWxDb3VudDsgbGV2ZWwrKylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldmVscy5wdXNoKHRoaXMuc2V0dGluZ3MubWFuaWZlc3QuZ2V0UGFnZUltYWdlVGlsZXMocGFnZS5pbmRleCwgbGV2ZWwsIHRpbGVEaW1lbnNpb25zKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV2ZWxzLnJldmVyc2UoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0UGFkZGluZyAoKVxuICAgIHtcbiAgICAgICAgbGV0IHRvcFBhZGRpbmcsIGxlZnRQYWRkaW5nO1xuICAgICAgICBsZXQgZG9jVlBhZGRpbmcsIGRvY0hQYWRkaW5nO1xuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmluR3JpZClcbiAgICAgICAge1xuICAgICAgICAgICAgZG9jVlBhZGRpbmcgPSB0aGlzLnNldHRpbmdzLmZpeGVkUGFkZGluZztcbiAgICAgICAgICAgIHRvcFBhZGRpbmcgPSBsZWZ0UGFkZGluZyA9IGRvY0hQYWRkaW5nID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRvcFBhZGRpbmcgPSB0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZCA/IHRoaXMudmlld2VyU3RhdGUudmVydGljYWxQYWRkaW5nIDogMDtcbiAgICAgICAgICAgIGxlZnRQYWRkaW5nID0gdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgPyAwIDogdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsUGFkZGluZztcblxuICAgICAgICAgICAgZG9jVlBhZGRpbmcgPSB0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZCA/IDAgOiB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsUGFkZGluZztcbiAgICAgICAgICAgIGRvY0hQYWRkaW5nID0gdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgPyB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxQYWRkaW5nIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb2N1bWVudDoge1xuICAgICAgICAgICAgICAgIHRvcDogZG9jVlBhZGRpbmcsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBkb2NWUGFkZGluZyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBkb2NIUGFkZGluZyxcbiAgICAgICAgICAgICAgICByaWdodDogZG9jSFBhZGRpbmdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICAgICAgdG9wOiB0b3BQYWRkaW5nLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0UGFkZGluZyxcbiAgICAgICAgICAgICAgICByaWdodDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHVwZGF0ZVBhZ2VPdmVybGF5cyAoKVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5wYWdlT3ZlcmxheXMudXBkYXRlT3ZlcmxheXMoXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmdldFJlbmRlcmVkUGFnZXMoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCB0byBoYW5kbGUgYW55IHpvb20gbGV2ZWxcbiAgICBoYW5kbGVab29tIChuZXdab29tTGV2ZWwsIGZvY2FsUG9pbnQpXG4gICAge1xuICAgICAgICAvLyBJZiB0aGUgem9vbSBsZXZlbCBwcm92aWRlZCBpcyBpbnZhbGlkLCByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRPcHRpb24oJ3pvb21MZXZlbCcsIG5ld1pvb21MZXZlbCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gV2hpbGUgem9vbWluZywgZG9uJ3QgdXBkYXRlIHNjcm9sbCBvZmZzZXRzIGJhc2VkIG9uIHRoZSBzY2FsZWQgdmVyc2lvbiBvZiBkaXZhLWlubmVyXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ib3VuZFNjcm9sbEZ1bmN0aW9uKTtcblxuICAgICAgICAvLyBJZiBubyBmb2NhbCBwb2ludCB3YXMgZ2l2ZW4sIHpvb20gb24gdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgaWYgKCFmb2NhbFBvaW50KVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmVnaW9uID0gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5sYXlvdXQuZ2V0UGFnZVJlZ2lvbih0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCk7XG5cbiAgICAgICAgICAgIGZvY2FsUG9pbnQgPSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yUGFnZTogdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6ICh2aWV3cG9ydC53aWR0aCAvIDIpIC0gKGN1cnJlbnRSZWdpb24ubGVmdCAtIHZpZXdwb3J0LmxlZnQpLFxuICAgICAgICAgICAgICAgICAgICB0b3A6ICh2aWV3cG9ydC5oZWlnaHQgLyAyKSAtIChjdXJyZW50UmVnaW9uLnRvcCAtIHZpZXdwb3J0LnRvcClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZVJlZ2lvbiA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIubGF5b3V0LmdldFBhZ2VSZWdpb24oZm9jYWxQb2ludC5hbmNob3JQYWdlKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgZGlzdGFuY2UgZnJvbSBjdXJzb3IgY29vcmRpbmF0ZXMgdG8gY2VudGVyIG9mIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IGZvY2FsWFRvQ2VudGVyID0gKHBhZ2VSZWdpb24ubGVmdCArIGZvY2FsUG9pbnQub2Zmc2V0LmxlZnQpIC1cbiAgICAgICAgICAgICh0aGlzLnNldHRpbmdzLnZpZXdwb3J0LmxlZnQgKyAodGhpcy5zZXR0aW5ncy52aWV3cG9ydC53aWR0aCAvIDIpKTtcbiAgICAgICAgY29uc3QgZm9jYWxZVG9DZW50ZXIgPSAocGFnZVJlZ2lvbi50b3AgKyBmb2NhbFBvaW50Lm9mZnNldC50b3ApIC1cbiAgICAgICAgICAgICh0aGlzLnNldHRpbmdzLnZpZXdwb3J0LnRvcCArICh0aGlzLnNldHRpbmdzLnZpZXdwb3J0LmhlaWdodCAvIDIpKTtcblxuICAgICAgICBjb25zdCBnZXRQb3NpdGlvbkZvclpvb21MZXZlbCA9ICAoem9vbUxldmVsLCBpbml0Wm9vbSkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgem9vbVJhdGlvID0gTWF0aC5wb3coMiwgem9vbUxldmVsIC0gaW5pdFpvb20pO1xuXG4gICAgICAgICAgICAvL1RPRE8oamVyb21lcGwpOiBDYWxjdWxhdGUgcG9zaXRpb24gZnJvbSBwYWdlIHRvcCBsZWZ0IHRvIHZpZXdwb3J0IHRvcCBsZWZ0XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgaG9yaXpvbnRhbC92ZXJ0aWNhbE9mZnNldDogZGlzdGFuY2UgZnJvbSB2aWV3cG9ydCBjZW50ZXIgdG8gcGFnZSB1cHBlciBsZWZ0IGNvcm5lclxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9IChmb2NhbFBvaW50Lm9mZnNldC5sZWZ0ICogem9vbVJhdGlvKSAtIGZvY2FsWFRvQ2VudGVyO1xuICAgICAgICAgICAgY29uc3QgdmVydGljYWxPZmZzZXQgPSAoZm9jYWxQb2ludC5vZmZzZXQudG9wICogem9vbVJhdGlvKSAtIGZvY2FsWVRvQ2VudGVyO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHpvb21MZXZlbDogem9vbUxldmVsLFxuICAgICAgICAgICAgICAgIGFuY2hvclBhZ2U6IGZvY2FsUG9pbnQuYW5jaG9yUGFnZSxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogdmVydGljYWxPZmZzZXQsXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldDogaG9yaXpvbnRhbE9mZnNldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuem9vbUxldmVsID0gbmV3Wm9vbUxldmVsO1xuICAgICAgICBsZXQgaW5pdGlhbFpvb21MZXZlbCA9IHRoaXMudmlld2VyU3RhdGUub2xkWm9vbUxldmVsO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9sZFpvb21MZXZlbCA9IHRoaXMuc2V0dGluZ3Muem9vbUxldmVsO1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IGdldFBvc2l0aW9uRm9yWm9vbUxldmVsKG5ld1pvb21MZXZlbCwgaW5pdGlhbFpvb21MZXZlbCk7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5nb0RpcmVjdGx5VG8gPSBlbmRQb3NpdGlvbi5hbmNob3JQYWdlO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsT2Zmc2V0ID0gZW5kUG9zaXRpb24udmVydGljYWxPZmZzZXQ7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbE9mZnNldCA9IGVuZFBvc2l0aW9uLmhvcml6b250YWxPZmZzZXQ7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci50cmFuc2l0aW9uVmlld3BvcnRQb3NpdGlvbih7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5zZXR0aW5ncy56b29tRHVyYXRpb24sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgem9vbUxldmVsOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206IGluaXRpYWxab29tTGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgIHRvOiBuZXdab29tTGV2ZWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UG9zaXRpb246IChwYXJhbWV0ZXJzKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRQb3NpdGlvbkZvclpvb21MZXZlbChwYXJhbWV0ZXJzLnpvb21MZXZlbCwgaW5pdGlhbFpvb21MZXZlbCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25FbmQ6IChpbmZvKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ib3VuZFNjcm9sbEZ1bmN0aW9uKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmZvLmludGVycnVwdGVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9sZFpvb21MZXZlbCA9IG5ld1pvb21MZXZlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVhY3RpdmF0ZSB6b29tIGJ1dHRvbnMgd2hpbGUgem9vbWluZ1xuICAgICAgICBsZXQgem9vbUluQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5zZWxlY3RvciArICd6b29tLWluLWJ1dHRvbicpO1xuICAgICAgICBsZXQgem9vbU91dEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2VsZWN0b3IgKyAnem9vbS1vdXQtYnV0dG9uJyk7XG4gICAgICAgIHpvb21JbkJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHpvb21PdXRCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHpvb21JbkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgem9vbU91dEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzLnNldHRpbmdzLnpvb21EdXJhdGlvbik7XG5cbiAgICAgICAgLy8gU2VuZCBvZmYgdGhlIHpvb20gbGV2ZWwgZGlkIGNoYW5nZSBldmVudC5cbiAgICAgICAgdGhpcy5wdWJsaXNoKFwiWm9vbUxldmVsRGlkQ2hhbmdlXCIsIG5ld1pvb21MZXZlbCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLypcbiAgICAgR2V0cyB0aGUgWS1vZmZzZXQgZm9yIGEgc3BlY2lmaWMgcG9pbnQgb24gYSBzcGVjaWZpYyBwYWdlXG4gICAgIEFjY2VwdGFibGUgdmFsdWVzIGZvciBcImFuY2hvclwiOlxuICAgICBcInRvcFwiIChkZWZhdWx0KSAtIHdpbGwgYW5jaG9yIHRvcCBvZiB0aGUgcGFnZSB0byB0aGUgdG9wIG9mIHRoZSBkaXZhLW91dGVyIGVsZW1lbnRcbiAgICAgXCJib3R0b21cIiAtIHRvcCwgcy90b3AvYm90dG9tXG4gICAgIFwiY2VudGVyXCIgLSB3aWxsIGNlbnRlciB0aGUgcGFnZSBvbiB0aGUgZGl2YSBlbGVtZW50XG4gICAgIFJldHVybmVkIHZhbHVlIHdpbGwgYmUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgZGl2YS1vdXRlciBlbGVtZW50IHRvIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgcGFnZSBmb3IgdGhlIHNwZWNpZmllZCBhbmNob3JcbiAgICAgKi9cbiAgICBnZXRZT2Zmc2V0IChwYWdlSW5kZXgsIGFuY2hvcilcbiAgICB7XG4gICAgICAgIGxldCBwaWR4ID0gKHR5cGVvZihwYWdlSW5kZXgpID09PSBcInVuZGVmaW5lZFwiID8gdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXggOiBwYWdlSW5kZXgpO1xuXG4gICAgICAgIGlmIChhbmNob3IgPT09IFwiY2VudGVyXCIgfHwgYW5jaG9yID09PSBcImNlbnRyZVwiKSAvL2hvdyB5b3UgY2FuIHRlbGwgYW4gQW1lcmljYW4gY29kZWQgdGhpc1xuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRQYWdlRGF0YShwaWR4LCBcImhcIikgLyAyLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYW5jaG9yID09PSBcImJvdHRvbVwiKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRQYWdlRGF0YShwaWR4LCBcImhcIikgLSB0aGlzLnNldHRpbmdzLnBhbmVsSGVpZ2h0IC8gMiwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuc2V0dGluZ3MucGFuZWxIZWlnaHQgLyAyLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL1NhbWUgYXMgZ2V0WU9mZnNldCB3aXRoIFwibGVmdFwiIGFuZCBcInJpZ2h0XCIgYXMgYWNjZXB0YWJsZSB2YWx1ZXMgaW5zdGVhZCBvZiBcInRvcFwiIGFuZCBcImJvdHRvbVwiXG4gICAgZ2V0WE9mZnNldCAocGFnZUluZGV4LCBhbmNob3IpXG4gICAge1xuICAgICAgICBsZXQgcGlkeCA9ICh0eXBlb2YocGFnZUluZGV4KSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4IDogcGFnZUluZGV4KTtcblxuICAgICAgICBpZiAoYW5jaG9yID09PSBcImxlZnRcIilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuc2V0dGluZ3MucGFuZWxXaWR0aCAvIDIsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbmNob3IgPT09IFwicmlnaHRcIilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0UGFnZURhdGEocGlkeCwgXCJ3XCIpIC0gdGhpcy5zZXR0aW5ncy5wYW5lbFdpZHRoIC8gMiwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0UGFnZURhdGEocGlkeCwgXCJ3XCIpIC8gMiwgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlcyBwYW5lbEhlaWdodC9wYW5lbFdpZHRoIG9uIHJlc2l6ZVxuICAgIHVwZGF0ZVBhbmVsU2l6ZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnZhbGlkYXRlKCk7XG5cbiAgICAgICAgLy8gRklYTUUod2FiYWluKTogVGhpcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGluaXRpYWwgbG9hZFxuICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlcilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRzKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmdvdG8odGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsIHRoaXMudmlld2VyU3RhdGUudmVydGljYWxPZmZzZXQsIHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVPZmZzZXRzICgpXG4gICAge1xuICAgICAgICBjb25zdCBwYWdlT2Zmc2V0ID0gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5sYXlvdXQuZ2V0UGFnZVRvVmlld3BvcnRDZW50ZXJPZmZzZXQodGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQpO1xuXG4gICAgICAgIGlmIChwYWdlT2Zmc2V0KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxPZmZzZXQgPSBwYWdlT2Zmc2V0Lng7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsT2Zmc2V0ID0gcGFnZU9mZnNldC55O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmluZCBtb3VzZSBldmVudHMgKGRyYWcgdG8gc2Nyb2xsLCBkb3VibGUtY2xpY2spXG4gICAgYmluZE1vdXNlRXZlbnRzICgpXG4gICAge1xuICAgICAgICAvLyBTZXQgZHJhZyBzY3JvbGwgb24gdGhlIHZpZXdwb3J0IG9iamVjdFxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LmNsYXNzTGlzdC5hZGQoJ2RyYWdzY3JvbGwnKTtcblxuICAgICAgICBnZXN0dXJlRXZlbnRzLm9uRG91YmxlQ2xpY2sodGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydE9iamVjdCwgKGV2ZW50LCBjb29yZHMpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlYnVnKCdEb3VibGUgY2xpY2sgYXQgJXMsICVzJywgY29vcmRzLmxlZnQsIGNvb3Jkcy50b3ApO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlci5vbkRvdWJsZUNsaWNrKGV2ZW50LCBjb29yZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblJlc2l6ZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYW5lbFNpemUoKTtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBwcmV2aW91c2x5LXNldCByZXNpemUgdGltZW91dHNcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld2VyU3RhdGUucmVzaXplVGltZXIpO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUucmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KCAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwYWdlT2Zmc2V0ID0gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5sYXlvdXQuZ2V0UGFnZVRvVmlld3BvcnRDZW50ZXJPZmZzZXQodGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQpO1xuXG4gICAgICAgICAgICBpZiAocGFnZU9mZnNldClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICAgICAgICAgIGdvRGlyZWN0bHlUbzogdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBwYWdlT2Zmc2V0LnksXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IHBhZ2VPZmZzZXQueFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkVmlld2VyKHtcbiAgICAgICAgICAgICAgICAgICAgZ29EaXJlY3RseVRvOiB0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAyMDApO1xuICAgIH1cblxuICAgIC8vIEJpbmQgdG91Y2ggYW5kIG9yaWVudGF0aW9uIGNoYW5nZSBldmVudHNcbiAgICBiaW5kVG91Y2hFdmVudHMgKClcbiAgICB7XG4gICAgICAgIC8vIEJsb2NrIHRoZSB1c2VyIGZyb20gbW92aW5nIHRoZSB3aW5kb3cgb25seSBpZiBpdCdzIG5vdCBpbnRlZ3JhdGVkXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmJsb2NrTW9iaWxlTW92ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCAoZXZlbnQpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQ7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUb3VjaCBldmVudHMgZm9yIHN3aXBpbmcgaW4gdGhlIHZpZXdwb3J0IHRvIHNjcm9sbCBwYWdlc1xuICAgICAgICAvLyB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsRnVuY3Rpb24uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZ2VzdHVyZUV2ZW50cy5vblBpbmNoKHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QsIGZ1bmN0aW9uIChldmVudCwgY29vcmRzLCBzdGFydCwgZW5kKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZWJ1ZygnUGluY2ggJXMgYXQgJXMsICVzJywgZW5kIC0gc3RhcnQsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIub25QaW5jaChldmVudCwgY29vcmRzLCBzdGFydCwgZW5kKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ2VzdHVyZUV2ZW50cy5vbkRvdWJsZVRhcCh0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LCBmdW5jdGlvbiAoZXZlbnQsIGNvb3JkcylcbiAgICAgICAge1xuICAgICAgICAgICAgZGVidWcoJ0RvdWJsZSB0YXAgYXQgJXMsICVzJywgY29vcmRzLmxlZnQsIGNvb3Jkcy50b3ApO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlci5vbkRvdWJsZUNsaWNrKGV2ZW50LCBjb29yZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHNjcm9sbFxuICAgIHNjcm9sbEZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICBjb25zdCBwcmV2aW91c1RvcFNjcm9sbCA9IHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQudG9wO1xuICAgICAgICBjb25zdCBwcmV2aW91c0xlZnRTY3JvbGwgPSB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LmxlZnQ7XG5cbiAgICAgICAgbGV0IGRpcmVjdGlvbjtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LmludmFsaWRhdGUoKTtcblxuICAgICAgICBjb25zdCBuZXdTY3JvbGxUb3AgPSB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LnRvcDtcbiAgICAgICAgY29uc3QgbmV3U2Nyb2xsTGVmdCA9IHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQubGVmdDtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgfHwgdGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgICAgICBkaXJlY3Rpb24gPSBuZXdTY3JvbGxUb3AgLSBwcmV2aW91c1RvcFNjcm9sbDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGlyZWN0aW9uID0gbmV3U2Nyb2xsTGVmdCAtIHByZXZpb3VzTGVmdFNjcm9sbDtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmFkanVzdCgpO1xuXG4gICAgICAgIGNvbnN0IHByaW1hcnlTY3JvbGwgPSAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgfHwgdGhpcy5zZXR0aW5ncy5pbkdyaWQpID8gbmV3U2Nyb2xsVG9wIDogbmV3U2Nyb2xsTGVmdDtcblxuICAgICAgICB0aGlzLnB1Ymxpc2goXCJWaWV3ZXJEaWRTY3JvbGxcIiwgcHJpbWFyeVNjcm9sbCk7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucHVibGlzaChcIlZpZXdlckRpZFNjcm9sbERvd25cIiwgcHJpbWFyeVNjcm9sbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uIDwgMClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wdWJsaXNoKFwiVmlld2VyRGlkU2Nyb2xsVXBcIiwgcHJpbWFyeVNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldHMoKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kcyBtb3N0IG9mIHRoZSBldmVudCBoYW5kbGVycyAoc29tZSBtb3JlIGluIGNyZWF0ZVRvb2xiYXIpXG4gICAgaGFuZGxlRXZlbnRzICgpXG4gICAge1xuICAgICAgICAvLyBDaGFuZ2UgdGhlIGN1cnNvciBmb3IgZHJhZ2dpbmdcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pbm5lck9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmlubmVyT2JqZWN0LmNsYXNzTGlzdC5hZGQoJ2RpdmEtZ3JhYmJpbmcnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pbm5lck9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pbm5lck9iamVjdC5jbGFzc0xpc3QucmVtb3ZlKCdkaXZhLWdyYWJiaW5nJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYmluZE1vdXNlRXZlbnRzKCk7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ib3VuZFNjcm9sbEZ1bmN0aW9uKTtcblxuICAgICAgICBjb25zdCB1cEFycm93S2V5ID0gMzgsIGRvd25BcnJvd0tleSA9IDQwLCBsZWZ0QXJyb3dLZXkgPSAzNywgcmlnaHRBcnJvd0tleSA9IDM5LCBzcGFjZUtleSA9IDMyLCBwYWdlVXBLZXkgPSAzMywgcGFnZURvd25LZXkgPSAzNCwgaG9tZUtleSA9IDM2LCBlbmRLZXkgPSAzNTtcblxuICAgICAgICAvLyBDYXRjaCB0aGUga2V5IHByZXNzZXMgaW4gZG9jdW1lbnRcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bi5kaXZhJywgKGV2ZW50KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld2VyU3RhdGUuaXNBY3RpdmVEaXZhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvLyBTcGFjZSBvciBwYWdlIGRvd24gLSBnbyB0byB0aGUgbmV4dCBwYWdlXG4gICAgICAgICAgICBpZiAoKHRoaXMuc2V0dGluZ3MuZW5hYmxlU3BhY2VTY3JvbGwgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IHNwYWNlS2V5KSB8fCAodGhpcy5zZXR0aW5ncy5lbmFibGVLZXlTY3JvbGwgJiYgZXZlbnQua2V5Q29kZSA9PT0gcGFnZURvd25LZXkpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQudG9wICs9IHRoaXMuc2V0dGluZ3MucGFuZWxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlU3BhY2VTY3JvbGwgJiYgZXZlbnQua2V5Q29kZSA9PT0gc3BhY2VLZXkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlS2V5U2Nyb2xsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IHN0ZWFsIGtleWJvYXJkIHNob3J0Y3V0cyAobWV0YUtleSA9IGNvbW1hbmQgW09TIFhdLCBzdXBlciBbV2luL0xpbnV4XSlcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgcGFnZVVwS2V5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFnZSB1cCAtIGdvIHRvIHRoZSBwcmV2aW91cyBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LnRvcCAtPSB0aGlzLnNldHRpbmdzLnBhbmVsSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdXBBcnJvd0tleTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwIGFycm93IC0gc2Nyb2xsIHVwXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LnRvcCAtPSB0aGlzLnNldHRpbmdzLmFycm93U2Nyb2xsQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZG93bkFycm93S2V5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG93biBhcnJvdyAtIHNjcm9sbCBkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LnRvcCArPSB0aGlzLnNldHRpbmdzLmFycm93U2Nyb2xsQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbGVmdEFycm93S2V5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVmdCBhcnJvdyAtIHNjcm9sbCBsZWZ0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LmxlZnQgLT0gdGhpcy5zZXR0aW5ncy5hcnJvd1Njcm9sbEFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIHJpZ2h0QXJyb3dLZXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSaWdodCBhcnJvdyAtIHNjcm9sbCByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5sZWZ0ICs9IHRoaXMuc2V0dGluZ3MuYXJyb3dTY3JvbGxBbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBob21lS2V5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9tZSBrZXkgLSBnbyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3AgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZW5kS2V5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5kIGtleSAtIGdvIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBvbiB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZSB2YWx1ZSBiZWluZyBub3JtYWxpemVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3AgPSBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LmxlZnQgPSBJbmZpbml0eTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGl2YS5FdmVudHMuc3Vic2NyaWJlKCdWaWV3ZXJEaWRUZXJtaW5hdGUnLCBmdW5jdGlvbigpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24uZGl2YScpO1xuICAgICAgICB9LCB0aGlzLnNldHRpbmdzLklEKTtcblxuICAgICAgICAvLyB0aGlzLmJpbmRUb3VjaEV2ZW50cygpO1xuXG4gICAgICAgIC8vIEhhbmRsZSB3aW5kb3cgcmVzaXppbmcgZXZlbnRzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplLmJpbmQodGhpcyksIGZhbHNlKTtcblxuICAgICAgICBkaXZhLkV2ZW50cy5zdWJzY3JpYmUoJ1ZpZXdlckRpZFRlcm1pbmF0ZScsIGZ1bmN0aW9uKClcbiAgICAgICAge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy5JRCk7XG5cbiAgICAgICAgLy8gSGFuZGxlIG9yaWVudGF0aW9uIGNoYW5nZSBzZXBhcmF0ZWx5XG4gICAgICAgIGlmICgnb25vcmllbnRhdGlvbmNoYW5nZScgaW4gd2luZG93KVxuICAgICAgICB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG5cbiAgICAgICAgICAgIGRpdmEuRXZlbnRzLnN1YnNjcmliZSgnVmlld2VyRGlkVGVybWluYXRlJywgZnVuY3Rpb24oKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sIHRoaXMuc2V0dGluZ3MuSUQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGl2YS5FdmVudHMuc3Vic2NyaWJlKCdQYW5lbFNpemVEaWRDaGFuZ2UnLCB0aGlzLnVwZGF0ZVBhbmVsU2l6ZSwgdGhpcy5zZXR0aW5ncy5JRCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgcGFnZSBhbmQgcmVzaXplIHRpbWVvdXRzIHdoZW4gdGhlIHZpZXdlciBpcyBkZXN0cm95ZWRcbiAgICAgICAgZGl2YS5FdmVudHMuc3Vic2NyaWJlKCdWaWV3ZXJEaWRUZXJtaW5hdGUnLCAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlcilcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmRlc3Ryb3koKTtcblxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld2VyU3RhdGUucmVzaXplVGltZXIpO1xuICAgICAgICB9LCB0aGlzLnNldHRpbmdzLklEKTtcbiAgICB9XG5cbiAgICBpbml0UGx1Z2lucyAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmhhc093blByb3BlcnR5KCdwbHVnaW5zJykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnBsdWdpbkluc3RhbmNlcyA9IHRoaXMuc2V0dGluZ3MucGx1Z2lucy5tYXAoIChwbHVnaW4pID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgcGx1Z2luKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAocC5pc1BhZ2VUb29sKVxuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUucGFnZVRvb2xzLnB1c2gocCk7XG5cbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93VGhyb2JiZXIgKClcbiAgICB7XG4gICAgICAgIHRoaXMuaGlkZVRocm9iYmVyKCk7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS50aHJvYmJlclRpbWVvdXRJRCA9IHNldFRpbWVvdXQoICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCB0aGIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLnNlbGVjdG9yICsgJ3Rocm9iYmVyJyk7XG4gICAgICAgICAgICBpZiAodGhiKSB0aGIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0sIHRoaXMuc2V0dGluZ3MudGhyb2JiZXJUaW1lb3V0KTtcbiAgICB9XG5cbiAgICBoaWRlVGhyb2JiZXIgKClcbiAgICB7XG4gICAgICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0LCBpZiBpdCBoYXNuJ3QgZXhlY3V0ZWQgeWV0XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdlclN0YXRlLnRocm9iYmVyVGltZW91dElEKTtcblxuICAgICAgICBsZXQgdGhiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5zZWxlY3RvciArICd0aHJvYmJlcicpO1xuICAgICAgICAvLyBIaWRlIHRoZSB0aHJvYmJlciBpZiBpdCBoYXMgYWxyZWFkeSBleGVjdXRlZFxuICAgICAgICBpZiAodGhiKSB0aGIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBzaG93RXJyb3IgKG1lc3NhZ2UpXG4gICAge1xuICAgICAgICBjb25zdCBlcnJvckVsZW1lbnQgPSBlbHQoJ2RpdicsIHRoaXMuZWxlbUF0dHJzKCdlcnJvcicpLCBbXG4gICAgICAgICAgICBlbHQoJ2J1dHRvbicsIHRoaXMuZWxlbUF0dHJzKCdlcnJvci1jbG9zZScsIHsnYXJpYS1sYWJlbCc6ICdDbG9zZSBkaWFsb2cnfSkpLFxuICAgICAgICAgICAgZWx0KCdwJyxcbiAgICAgICAgICAgICAgICBlbHQoJ3N0cm9uZycsICdFcnJvcicpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZWx0KCdkaXYnLCBtZXNzYWdlKVxuICAgICAgICBdKTtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm91dGVyT2JqZWN0LmFwcGVuZENoaWxkKGVycm9yRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQmluZCBkaWFsb2cgY2xvc2UgYnV0dG9uXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2VsZWN0b3IgKyAnZXJyb3ItY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVycm9yRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldE1hbmlmZXN0IChtYW5pZmVzdCwgbG9hZE9wdGlvbnMpXG4gICAge1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG5cbiAgICAgICAgdGhpcy5oaWRlVGhyb2JiZXIoKTtcblxuICAgICAgICAvLyBDb252ZW5pZW5jZSB2YWx1ZVxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm51bVBhZ2VzID0gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlcy5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zVmFsaWRhdG9yLnZhbGlkYXRlKHRoaXMudmlld2VyU3RhdGUub3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5wdWJsaXNoKCdOdW1iZXJPZlBhZ2VzRGlkQ2hhbmdlJywgdGhpcy5zZXR0aW5ncy5udW1QYWdlcyk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlci1wYWdlIHBhZGRpbmcgYmFzZWQgb24gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGF2ZXJhZ2Ugem9vbSBsZXZlbFxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5hZGFwdGl2ZVBhZGRpbmcgPiAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB6ID0gTWF0aC5mbG9vcigodGhpcy5zZXR0aW5ncy5taW5ab29tTGV2ZWwgKyB0aGlzLnNldHRpbmdzLm1heFpvb21MZXZlbCkgLyAyKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbFBhZGRpbmcgPSBwYXJzZUludCh0aGlzLnNldHRpbmdzLm1hbmlmZXN0LmdldEF2ZXJhZ2VXaWR0aCh6KSAqIHRoaXMuc2V0dGluZ3MuYWRhcHRpdmVQYWRkaW5nLCAxMCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsUGFkZGluZyA9IHBhcnNlSW50KHRoaXMuc2V0dGluZ3MubWFuaWZlc3QuZ2V0QXZlcmFnZUhlaWdodCh6KSAqIHRoaXMuc2V0dGluZ3MuYWRhcHRpdmVQYWRkaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBJdCdzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwOyB1c2UgZml4ZWRQYWRkaW5nIGluc3RlYWRcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbFBhZGRpbmcgPSB0aGlzLnNldHRpbmdzLmZpeGVkUGFkZGluZztcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmVydGljYWxQYWRkaW5nID0gdGhpcy5zZXR0aW5ncy5maXhlZFBhZGRpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHZlcnRpY2FsIHBhZGRpbmcgaXMgYXQgbGVhc3QgNDAsIGlmIHBsdWdpbiBpY29ucyBhcmUgZW5hYmxlZFxuICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS5wYWdlVG9vbHMubGVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsUGFkZGluZyA9IE1hdGgubWF4KDQwLCB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsUGFkZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBkZXRlY3QgYSB2aWV3aW5nSGludCBvZiAncGFnZWQnIGluIHRoZSBtYW5pZmVzdCBvciBzZXF1ZW5jZSwgZW5hYmxlIGJvb2sgdmlldyBieSBkZWZhdWx0XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuaW5Cb29rTGF5b3V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBsdWdpbiBzZXR1cCBob29rcyBzaG91bGQgYmUgYm91bmQgdG8gdGhlIE9iamVjdERpZExvYWQgZXZlbnRcbiAgICAgICAgdGhpcy5wdWJsaXNoKCdPYmplY3REaWRMb2FkJywgdGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gQWRqdXN0IHRoZSBkb2N1bWVudCBwYW5lbCBkaW1lbnNpb25zXG4gICAgICAgIHRoaXMudXBkYXRlUGFuZWxTaXplKCk7XG5cbiAgICAgICAgbGV0IG5lZWRzWENvb3JkLCBuZWVkc1lDb29yZDtcblxuICAgICAgICBsZXQgYW5jaG9yZWRWZXJ0aWNhbGx5ID0gZmFsc2U7XG4gICAgICAgIGxldCBhbmNob3JlZEhvcml6b250YWxseSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIE5COiBgPT1gIGhlcmUgd2lsbCBjaGVjayBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgICBpZiAobG9hZE9wdGlvbnMuZ29EaXJlY3RseVRvID09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxvYWRPcHRpb25zLmdvRGlyZWN0bHlUbyA9IHRoaXMuc2V0dGluZ3MuZ29EaXJlY3RseVRvO1xuICAgICAgICAgICAgbmVlZHNYQ29vcmQgPSBuZWVkc1lDb29yZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBuZWVkc1hDb29yZCA9IGxvYWRPcHRpb25zLmhvcml6b250YWxPZmZzZXQgPT0gbnVsbCB8fCBpc05hTihsb2FkT3B0aW9ucy5ob3Jpem9udGFsT2Zmc2V0KTtcbiAgICAgICAgICAgIG5lZWRzWUNvb3JkID0gbG9hZE9wdGlvbnMudmVydGljYWxPZmZzZXQgPT0gbnVsbCB8fCBpc05hTihsb2FkT3B0aW9ucy52ZXJ0aWNhbE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBvZmZzZXRzXG4gICAgICAgIGlmIChuZWVkc1hDb29yZClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gRklYTUU6IFdoYXQgaWYgaW5Cb29rTGF5b3V0L3ZlcnRpY2FsbHlPcmllbnRlZCBpcyBjaGFuZ2VkIGJ5IGxvYWRPcHRpb25zP1xuICAgICAgICAgICAgaWYgKGxvYWRPcHRpb25zLmdvRGlyZWN0bHlUbyA9PT0gMCAmJiB0aGlzLnNldHRpbmdzLmluQm9va0xheW91dCAmJiB0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBpbiBib29rIGxheW91dCwgY2VudGVyIHRoZSBmaXJzdCBvcGVuaW5nIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICBsb2FkT3B0aW9ucy5ob3Jpem9udGFsT2Zmc2V0ID0gdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsUGFkZGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbmNob3JlZEhvcml6b250YWxseSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMuaG9yaXpvbnRhbE9mZnNldCA9IHRoaXMuZ2V0WE9mZnNldChsb2FkT3B0aW9ucy5nb0RpcmVjdGx5VG8sIFwiY2VudGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5lZWRzWUNvb3JkKVxuICAgICAgICB7XG4gICAgICAgICAgICBhbmNob3JlZFZlcnRpY2FsbHkgPSB0cnVlO1xuICAgICAgICAgICAgbG9hZE9wdGlvbnMudmVydGljYWxPZmZzZXQgPSB0aGlzLmdldFlPZmZzZXQobG9hZE9wdGlvbnMuZ29EaXJlY3RseVRvLCBcInRvcFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVsb2FkVmlld2VyKGxvYWRPcHRpb25zKTtcblxuICAgICAgICAvL3ByZXAgZGltZW5zaW9ucyBvbmUgbGFzdCB0aW1lIG5vdyB0aGF0IHBhZ2VzIGhhdmUgbG9hZGVkXG4gICAgICAgIHRoaXMudXBkYXRlUGFuZWxTaXplKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlQXV0b1RpdGxlKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLnNlbGVjdG9yICsgJ3RpdGxlJyk7XG5cbiAgICAgICAgICAgIGlmICh0aXRsZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aXRsZS5pbm5lckhUTUwgPSB0aGlzLnNldHRpbmdzLm1hbmlmZXN0Lml0ZW1UaXRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLnBhcmVudE9iamVjdC5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgdGhpcy5lbGVtQXR0cnMoJ3RpdGxlJyksIFt0aGlzLnNldHRpbmdzLm1hbmlmZXN0Lml0ZW1UaXRsZV0pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLnBhcmVudE9iamVjdC5maXJzdENoaWxkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgaGFjayB0byBlbnN1cmUgdGhhdCB0aGUgb3V0ZXJFbGVtZW50IHNjcm9sbGJhcnMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQpXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmlubmVyRWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IHRoaXMuc2V0dGluZ3MucGFuZWxXaWR0aCArICdweCc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaW5uZXJFbGVtZW50LnN0eWxlLm1pbkhlaWdodCA9IHRoaXMuc2V0dGluZ3MucGFuZWxIZWlnaHQgKyAncHgnO1xuXG4gICAgICAgIC8vIEZJWE1FOiBJZiB0aGUgcGFnZSB3YXMgc3VwcG9zZWQgdG8gYmUgcG9zaXRpb25lZCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgd2UgbmVlZCB0b1xuICAgICAgICAvLyByZWNhbGN1bGF0ZSBpdCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgc2Nyb2xsYmFyc1xuICAgICAgICBpZiAoYW5jaG9yZWRWZXJ0aWNhbGx5IHx8IGFuY2hvcmVkSG9yaXpvbnRhbGx5KVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoYW5jaG9yZWRWZXJ0aWNhbGx5KVxuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmVydGljYWxPZmZzZXQgPSB0aGlzLmdldFlPZmZzZXQodGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsIFwidG9wXCIpO1xuXG4gICAgICAgICAgICBpZiAoYW5jaG9yZWRIb3Jpem9udGFsbHkpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsT2Zmc2V0ID0gdGhpcy5nZXRYT2Zmc2V0KHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LCBcImNlbnRlclwiKTtcblxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5nb3RvKHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LCB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsT2Zmc2V0LCB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2lnbmFsIHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUgc2V0IHVwIGFuZCByZWFkeSB0byBnby5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMucHVibGlzaChcIlZpZXdlckRpZExvYWRcIiwgdGhpcy5zZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgcHVibGlzaCAoZXZlbnQpXG4gICAge1xuICAgICAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgZGl2YS5FdmVudHMucHVibGlzaChldmVudCwgYXJncywgdGhpcy5wdWJsaWNJbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgZ2V0U2V0dGluZ3MgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzO1xuICAgIH1cblxuICAgIC8vIFRlbXBvcmFyeSBhY2Nlc3NvciBmb3IgdGhlIHN0YXRlIG9mIHRoZSB2aWV3ZXIgY29yZVxuICAgIC8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGEgbW9yZSByZXN0cmljdGVkIHZpZXcgb2Ygd2hhdGV2ZXIgbmVlZHNcbiAgICAvLyBiZSBleHBvc2VkIHRocm91Z2ggc2V0dGluZ3MgZm9yIGJhY2t3YXJkcyBjb21wYXRcbiAgICBnZXRJbnRlcm5hbFN0YXRlICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3ZXJTdGF0ZTtcbiAgICB9XG5cbiAgICBnZXRQdWJsaWNJbnN0YW5jZSAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVibGljSW5zdGFuY2U7XG4gICAgfVxuXG4gICAgZ2V0UGFnZVRvb2xzICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3ZXJTdGF0ZS5wYWdlVG9vbHM7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudExheW91dCAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIgPyB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmxheW91dCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEdldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgdmlld3BvcnQgZGltZW5zaW9ucyAqL1xuICAgIGdldFZpZXdwb3J0ICgpXG4gICAge1xuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogdmlld3BvcnQudG9wLFxuICAgICAgICAgICAgbGVmdDogdmlld3BvcnQubGVmdCxcbiAgICAgICAgICAgIGJvdHRvbTogdmlld3BvcnQuYm90dG9tLFxuICAgICAgICAgICAgcmlnaHQ6IHZpZXdwb3J0LnJpZ2h0LFxuXG4gICAgICAgICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFkZFBhZ2VPdmVybGF5IChvdmVybGF5KVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5wYWdlT3ZlcmxheXMuYWRkT3ZlcmxheShvdmVybGF5KTtcbiAgICB9XG5cbiAgICByZW1vdmVQYWdlT3ZlcmxheSAob3ZlcmxheSlcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUucGFnZU92ZXJsYXlzLnJlbW92ZU92ZXJsYXkob3ZlcmxheSk7XG4gICAgfVxuXG4gICAgZ2V0UGFnZVJlZ2lvbiAocGFnZUluZGV4LCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IGxheW91dC5nZXRQYWdlUmVnaW9uKHBhZ2VJbmRleCwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNvcnBvcmF0ZVZpZXdwb3J0KVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBzZWNvbmRhcnlEaW0gPSB0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICAgICAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRbc2Vjb25kYXJ5RGltXSA+IGxheW91dC5kaW1lbnNpb25zW3NlY29uZGFyeURpbV0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG9jT2Zmc2V0ID0gKHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRbc2Vjb25kYXJ5RGltXSAtIGxheW91dC5kaW1lbnNpb25zW3NlY29uZGFyeURpbV0pIC8gMjtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHJlZ2lvbi50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IHJlZ2lvbi5ib3R0b20sXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHJlZ2lvbi5sZWZ0ICsgZG9jT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJlZ2lvbi5yaWdodCArIGRvY09mZnNldFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiByZWdpb24udG9wICsgZG9jT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiByZWdpb24uYm90dG9tICsgZG9jT2Zmc2V0LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZWdpb24ubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByZWdpb24ucmlnaHRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnaW9uO1xuICAgIH1cblxuICAgIGdldFBhZ2VQb3NpdGlvbkF0Vmlld3BvcnRPZmZzZXQgKGNvb3JkcylcbiAgICB7XG4gICAgICAgIGNvbnN0IGRvY0Nvb3JkcyA9IHtcbiAgICAgICAgICAgIGxlZnQ6IGNvb3Jkcy5sZWZ0ICsgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5sZWZ0LFxuICAgICAgICAgICAgdG9wOiBjb29yZHMudG9wICsgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3BcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZW5kZXJlZFBhZ2VzID0gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5nZXRSZW5kZXJlZFBhZ2VzKCk7XG4gICAgICAgIGNvbnN0IHBhZ2VDb3VudCA9IHJlbmRlcmVkUGFnZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIHBhZ2Ugb24gd2hpY2ggdGhlIGNvb3JkcyBvY2N1clxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBwYWdlQ291bnQ7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gcmVuZGVyZWRQYWdlc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIubGF5b3V0LmdldFBhZ2VSZWdpb24ocGFnZUluZGV4KTtcblxuICAgICAgICAgICAgaWYgKHJlZ2lvbi5sZWZ0IDw9IGRvY0Nvb3Jkcy5sZWZ0ICYmIHJlZ2lvbi5yaWdodCA+PSBkb2NDb29yZHMubGVmdCAmJlxuICAgICAgICAgICAgICAgIHJlZ2lvbi50b3AgPD0gZG9jQ29vcmRzLnRvcCAmJiByZWdpb24uYm90dG9tID49IGRvY0Nvb3Jkcy50b3ApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yUGFnZTogcGFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IGRvY0Nvb3Jkcy5sZWZ0IC0gcmVnaW9uLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGRvY0Nvb3Jkcy50b3AgLSByZWdpb24udG9wXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGN1cnJlbnQgcGFnZVxuICAgICAgICAvLyBGSVhNRTogV291bGQgYmUgYmV0dGVyIHRvIHVzZSB0aGUgY2xvc2VzdCBwYWdlIG9yIHNvbWV0aGluZ1xuICAgICAgICBjb25zdCBjdXJyZW50UmVnaW9uID0gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5sYXlvdXQuZ2V0UGFnZVJlZ2lvbih0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFuY2hvclBhZ2U6IHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LFxuICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgbGVmdDogZG9jQ29vcmRzLmxlZnQgLSBjdXJyZW50UmVnaW9uLmxlZnQsXG4gICAgICAgICAgICAgICAgdG9wOiBkb2NDb29yZHMudG9wIC0gY3VycmVudFJlZ2lvbi50b3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzZXRNYW5pZmVzdCAobWFuaWZlc3QsIGxvYWRPcHRpb25zKVxuICAgIC8vIHtcbiAgICAvLyAgICAgc2V0TWFuaWZlc3QobWFuaWZlc3QsIGxvYWRPcHRpb25zIHx8IHt9KTtcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcGFnZSB0byB0aGUgZ2l2ZW4gaW5kZXgsIGZpcmluZyBWaXNpYmxlUGFnZURpZENoYW5nZVxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2VJbmRleFxuICAgICAqL1xuICAgIHNldEN1cnJlbnRQYWdlcyAoYWN0aXZlUGFnZSwgdmlzaWJsZVBhZ2VzKVxuICAgIHtcbiAgICAgICAgaWYgKCFhcnJheXNFcXVhbCh0aGlzLnZpZXdlclN0YXRlLmN1cnJlbnRQYWdlSW5kaWNlcywgdmlzaWJsZVBhZ2VzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5jdXJyZW50UGFnZUluZGljZXMgPSB2aXNpYmxlUGFnZXM7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS5hY3RpdmVQYWdlSW5kZXggIT09IGFjdGl2ZVBhZ2UpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5hY3RpdmVQYWdlSW5kZXggPSBhY3RpdmVQYWdlO1xuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaChcIkFjdGl2ZVBhZ2VEaWRDaGFuZ2VcIiwgYWN0aXZlUGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2goXCJWaXNpYmxlUGFnZURpZENoYW5nZVwiLCB2aXNpYmxlUGFnZXMpO1xuXG4gICAgICAgICAgICAvLyBQdWJsaXNoIGFuIGV2ZW50IGlmIHRoZSBwYWdlIHdlJ3JlIHN3aXRjaGluZyB0byBoYXMgb3RoZXIgaW1hZ2VzLlxuICAgICAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUubWFuaWZlc3QucGFnZXNbYWN0aXZlUGFnZV0ub3RoZXJJbWFnZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2goJ1Zpc2libGVQYWdlSGFzQWx0ZXJuYXRlVmlld3MnLCBhY3RpdmVQYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnZpZXdlclN0YXRlLmFjdGl2ZVBhZ2VJbmRleCAhPT0gYWN0aXZlUGFnZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5hY3RpdmVQYWdlSW5kZXggPSBhY3RpdmVQYWdlO1xuICAgICAgICAgICAgdGhpcy5wdWJsaXNoKFwiQWN0aXZlUGFnZURpZENoYW5nZVwiLCBhY3RpdmVQYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFycmF5c0VxdWFsIChhLCBiKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGEubGVuZ3RoOyBpIDwgbGVuOyBpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UGFnZU5hbWUgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN0YXRlLm1hbmlmZXN0LnBhZ2VzW3BhZ2VJbmRleF0uZjtcbiAgICB9XG5cbiAgICByZWxvYWQgKG5ld09wdGlvbnMpXG4gICAge1xuICAgICAgICB0aGlzLnJlbG9hZFZpZXdlcihuZXdPcHRpb25zKTtcbiAgICB9XG5cbiAgICB6b29tICh6b29tTGV2ZWwsIGZvY2FsUG9pbnQpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVab29tKHpvb21MZXZlbCwgZm9jYWxQb2ludCk7XG4gICAgfVxuXG4gICAgZW5hYmxlU2Nyb2xsYWJsZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdlclN0YXRlLmlzU2Nyb2xsYWJsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5iaW5kTW91c2VFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRHJhZ1Njcm9sbGFibGUoKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5lbmFibGVLZXlTY3JvbGwgPSB0aGlzLnZpZXdlclN0YXRlLmluaXRpYWxLZXlTY3JvbGw7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuZW5hYmxlU3BhY2VTY3JvbGwgPSB0aGlzLnZpZXdlclN0YXRlLmluaXRpYWxTcGFjZVNjcm9sbDtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pc1Njcm9sbGFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5hYmxlRHJhZ1Njcm9sbGFibGUgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0Lmhhc0F0dHJpYnV0ZSgnbm9jaGlsZGRyYWcnKSlcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QucmVtb3ZlQXR0cmlidXRlKCdub2NoaWxkZHJhZycpO1xuICAgIH1cblxuICAgIGRpc2FibGVTY3JvbGxhYmxlICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS5pc1Njcm9sbGFibGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGJsb2NrIGRyYWdnaW5nXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVEcmFnU2Nyb2xsYWJsZSgpO1xuXG4gICAgICAgICAgICAvLyBibG9jayBkb3VibGUtY2xpY2sgem9vbWluZ1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vdXRlck9iamVjdC5kYmxjbGljayA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm91dGVyT2JqZWN0LmNvbnRleHRtZW51ID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gZGlzYWJsZSBhbGwgb3RoZXIgc2Nyb2xsaW5nIGFjdGlvbnNcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAgICAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyBrZXlzIGJlaGF2aW9yLCByZXNwZWN0aW5nIGluaXRpYWwgc2Nyb2xsIHNldHRpbmdzXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmluaXRpYWxLZXlTY3JvbGwgPSB0aGlzLnNldHRpbmdzLmVuYWJsZUtleVNjcm9sbDtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaW5pdGlhbFNwYWNlU2Nyb2xsID0gdGhpcy5zZXR0aW5ncy5lbmFibGVTcGFjZVNjcm9sbDtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5lbmFibGVLZXlTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5lbmFibGVTcGFjZVNjcm9sbCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmlzU2Nyb2xsYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZURyYWdTY3JvbGxhYmxlICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QuaGFzQXR0cmlidXRlKCdub2NoaWxkZHJhZycpKVxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydE9iamVjdC5zZXRBdHRyaWJ1dGUoJ25vY2hpbGRkcmFnJywgXCJcIik7XG4gICAgfVxuXG4gICAgLy8gaXNWYWxpZE9wdGlvbiAoa2V5LCB2YWx1ZSlcbiAgICAvLyB7XG4gICAgLy8gICAgIHJldHVybiBpc1ZhbGlkT3B0aW9uKGtleSwgdmFsdWUpO1xuICAgIC8vIH1cblxuICAgIC8vIGdldFhPZmZzZXQgKHBhZ2VJbmRleCwgeEFuY2hvcilcbiAgICAvLyB7XG4gICAgLy8gICAgIHJldHVybiBnZXRYT2Zmc2V0KHBhZ2VJbmRleCwgeEFuY2hvcik7XG4gICAgLy8gfVxuXG4gICAgLy8gZ2V0WU9mZnNldCAocGFnZUluZGV4LCB5QW5jaG9yKVxuICAgIC8vIHtcbiAgICAvLyAgICAgcmV0dXJuIGdldFlPZmZzZXQocGFnZUluZGV4LCB5QW5jaG9yKTtcbiAgICAvLyB9XG5cbiAgICAvLyB0aGlzLnB1Ymxpc2ggPSBwdWJsaXNoO1xuXG4gICAgY2xlYXIgKClcbiAgICB7XG4gICAgICAgIHRoaXMuY2xlYXJWaWV3ZXIoKTtcbiAgICB9XG5cbiAgICBzZXRQZW5kaW5nTWFuaWZlc3RSZXF1ZXN0IChwZW5kaW5nTWFuaWZlc3RSZXF1ZXN0KVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5wZW5kaW5nTWFuaWZlc3RSZXF1ZXN0ID0gcGVuZGluZ01hbmlmZXN0UmVxdWVzdDtcbiAgICB9XG5cbiAgICBkZXN0cm95ICgpXG4gICAge1xuICAgICAgICAvLyBVc2VmdWwgZXZlbnQgdG8gYWNjZXNzIGVsZW1lbnRzIGluIGRpdmEgYmVmb3JlIHRoZXkgZ2V0IGRlc3Ryb3llZC4gVXNlZCBieSB0aGUgaGlnaGxpZ2h0IHBsdWdpbi5cbiAgICAgICAgdGhpcy5wdWJsaXNoKCdWaWV3ZXJXaWxsVGVybWluYXRlJywgdGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlcXVlc3QgcmV0cmlldmluZyBhIG1hbmlmZXN0XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnBlbmRpbmdNYW5pZmVzdFJlcXVlc3QpXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLnBlbmRpbmdNYW5pZmVzdFJlcXVlc3QuYWJvcnQoKTtcblxuICAgICAgICAvLyBSZW1vdmVzIHRoZSBoaWRlLXNjcm9sbGJhciBjbGFzcyBmcm9tIHRoZSBib2R5XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2xhc3MoJ2RpdmEtaGlkZS1zY3JvbGxiYXInKTtcblxuICAgICAgICAvLyBFbXB0eSB0aGUgcGFyZW50IGNvbnRhaW5lciBhbmQgcmVtb3ZlIGFueSBkaXZhLXJlbGF0ZWQgZGF0YVxuICAgICAgICB0aGlzLnNldHRpbmdzLnBhcmVudE9iamVjdC5wYXJlbnQoKS5lbXB0eSgpLnJlbW92ZURhdGEoJ2RpdmEnKTtcblxuICAgICAgICAvLyBSZW1vdmUgYW55IGFkZGl0aW9uYWwgc3R5bGluZyBvbiB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5wYXJlbnRPYmplY3QucGFyZW50KCkucmVtb3ZlQXR0cignc3R5bGUnKS5yZW1vdmVBdHRyKCdjbGFzcycpO1xuXG4gICAgICAgIHRoaXMucHVibGlzaCgnVmlld2VyRGlkVGVybWluYXRlJywgdGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIEV2ZW50cyBjYWNoZVxuICAgICAgICBkaXZhLkV2ZW50cy51bnN1YnNjcmliZUFsbCh0aGlzLnNldHRpbmdzLklEKTtcbiAgICB9XG59XG4iLCIvLyBGcm9tIGh0dHA6Ly93d3cuYWxleGFuZHJlLWdvbWVzLmNvbS8/cD0xMTUsIG1vZGlmaWVkIHNsaWdodGx5XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxiYXJXaWR0aCgpXG57XG4gICAgbGV0IGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIGlubmVyLnN0eWxlLmhlaWdodCA9ICcyMDBweCc7XG5cbiAgICBsZXQgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBvdXRlci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgb3V0ZXIuc3R5bGUudG9wID0gJzBweCc7XG4gICAgb3V0ZXIuc3R5bGUubGVmdCA9ICcwcHgnO1xuICAgIG91dGVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICBvdXRlci5zdHlsZS53aWR0aCA9ICcyMDBweCc7XG4gICAgb3V0ZXIuc3R5bGUuaGVpZ2h0ID0gJzE1MHB4JztcbiAgICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIG91dGVyLmFwcGVuZENoaWxkKGlubmVyKTtcblxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xuXG4gICAgbGV0IHcxID0gaW5uZXIub2Zmc2V0V2lkdGg7XG4gICAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgICBsZXQgdzIgPSBpbm5lci5vZmZzZXRXaWR0aDtcbiAgICBpZiAodzEgPT09IHcyKSB7XG4gICAgICAgIHcyID0gb3V0ZXIuY2xpZW50V2lkdGg7IC8vIGZvciBJRSBpIHRoaW5rXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdXRlcik7XG4gICAgcmV0dXJuIHcxIC0gdzI7XG59XG4iLCIvKipcbiAqIFBhcnNlcyBhIHYzIG1hbmlmZXN0J3MgbGFiZWwvdmFsdWUgcGFpciBmcm9tIGFuIG9iamVjdCAmIGFycmF5IHRvIGEgc3RyaW5nXG4gKlxuICogQHB1YmxpY1xuICogQHBhcmFtcyB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IGZyb20gd2hpY2ggYSBsYWJlbC92YWx1ZSBwYWlyIHNob3VsZCBiZSBleHRyYWN0ZWQuXG4gKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBsYWJlbC92YWx1ZSBwYWlyIGFzIHN0cmluZ3MuXG4gKiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZUxhYmVsVmFsdWUgKGtleSlcbntcbiAgICBsZXQgbCA9IGtleS5sYWJlbDsgXG4gICAgbGV0IGxhYmVsID0gKHR5cGVvZiBsID09PSAnb2JqZWN0JykgPyBsW09iamVjdC5rZXlzKGwpWzBdXVswXSA6IGw7XG5cbiAgICBsZXQgdiA9IGtleS52YWx1ZTtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikpXG4gICAgeyAvLyBpcyBhcnJheSBvZiBvYmplY3RzXG4gICAgICAgIHZhbHVlID0gdi5tYXAoZSA9PiBlW09iamVjdC5rZXlzKGUpWzBdXSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7IC8vIGlzIG9iamVjdCB3aGVyZSB2YWx1ZSBpcyBwb3NzaWJseSBhbiBhcnJheVxuICAgICAgICB2YWx1ZSA9ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpID8gdltPYmplY3Qua2V5cyh2KVswXV0gOiB2O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbignLCAnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH07XG59IiwiaW1wb3J0IHBhcnNlTGFiZWxWYWx1ZSBmcm9tICcuL3V0aWxzL3BhcnNlLWxhYmVsLXZhbHVlJztcblxuY29uc3QgZ2V0TWF4Wm9vbUxldmVsID0gKHdpZHRoLCBoZWlnaHQpID0+XG57XG4gICAgY29uc3QgbGFyZ2VzdERpbWVuc2lvbiA9IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChsYXJnZXN0RGltZW5zaW9uIDwgMTI4KSBcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZygobGFyZ2VzdERpbWVuc2lvbiArIDEpIC8gKDI1NiArIDEpKSAvIE1hdGgubG9nKDIpKTtcbn07XG5cbmNvbnN0IGluY29ycG9yYXRlWm9vbSA9IChpbWFnZURpbWVuc2lvbiwgem9vbURpZmZlcmVuY2UpID0+IGltYWdlRGltZW5zaW9uIC8gKE1hdGgucG93KDIsIHpvb21EaWZmZXJlbmNlKSk7XG5cbmNvbnN0IGdldE90aGVySW1hZ2VEYXRhID0gKG90aGVySW1hZ2VzLCBsb3dlc3RNYXhab29tKSA9Plxue1xuICAgIHJldHVybiBvdGhlckltYWdlcy5tYXAoIChpdG0pID0+XG4gICAge1xuICAgICAgICBjb25zdCB3ID0gaXRtLndpZHRoO1xuICAgICAgICBjb25zdCBoID0gaXRtLmhlaWdodDtcbiAgICAgICAgY29uc3QgaW5mbyA9IHBhcnNlSW1hZ2VJbmZvKGl0bSk7XG4gICAgICAgIGNvbnN0IHVybCA9IGluZm8udXJsLnNsaWNlKC0xKSAhPT0gJy8nID8gaW5mby51cmwgKyAnLycgOiBpbmZvLnVybDsgIC8vIGFwcGVuZCB0cmFpbGluZyBzbGFzaCB0byB1cmwgaWYgaXQncyBub3QgdGhlcmUuXG5cbiAgICAgICAgY29uc3QgZGltcyA9IG5ldyBBcnJheShsb3dlc3RNYXhab29tICsgMSk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG93ZXN0TWF4Wm9vbSArIDE7IGorKylcbiAgICAgICAge1xuICAgICAgICAgICAgZGltc1tqXSA9IHtcbiAgICAgICAgICAgICAgICBoOiBNYXRoLmZsb29yKGluY29ycG9yYXRlWm9vbShoLCBsb3dlc3RNYXhab29tIC0gaikpLFxuICAgICAgICAgICAgICAgIHc6IE1hdGguZmxvb3IoaW5jb3Jwb3JhdGVab29tKHcsIGxvd2VzdE1heFpvb20gLSBqKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZjogaW5mby51cmwsXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIGlsOiBpdG0ubGFiZWwgfHwgXCJcIixcbiAgICAgICAgICAgIGQ6IGRpbXNcbiAgICAgICAgfTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGdldElJSUZQcmVzZW50YXRpb25WZXJzaW9uID0gKGNvbnRleHQpID0+XG57XG4gICAgaWYgKGNvbnRleHQgPT09IFwiaHR0cDovL2lpaWYuaW8vYXBpL3ByZXNlbnRhdGlvbi8yL2NvbnRleHQuanNvblwiKVxuICAgICAgICByZXR1cm4gMjtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRleHQpICYmIGNvbnRleHQuaW5jbHVkZXMoXCJodHRwOi8vaWlpZi5pby9hcGkvcHJlc2VudGF0aW9uLzIvY29udGV4dC5qc29uXCIpKVxuICAgICAgICByZXR1cm4gMjtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRleHQpICYmIGNvbnRleHQuaW5jbHVkZXMoXCJodHRwOi8vaWlpZi5pby9hcGkvcHJlc2VudGF0aW9uLzMvY29udGV4dC5qc29uXCIpKVxuICAgICAgICByZXR1cm4gMztcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiAyOyAvLyBBc3N1bWUgYSB2MiBtYW5pZmVzdC5cbn07XG5cbi8qKlxuICogUGFyc2VzIGFuIElJSUYgUHJlc2VudGF0aW9uIEFQSSBNYW5pZmVzdCBhbmQgY29udmVydHMgaXQgaW50byBhIERpdmEuanMtZm9ybWF0IG9iamVjdFxuICogKFNlZSBodHRwczovL2dpdGh1Yi5jb20vRERNQUwvZGl2YS5qcy93aWtpL0RldmVsb3BtZW50LW5vdGVzI2RhdGEtcmVjZWl2ZWQtdGhyb3VnaC1hamF4LXJlcXVlc3QpXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1hbmlmZXN0IC0gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHZhbGlkIElJSUYgbWFuaWZlc3RcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRpdmFTZXJ2aWNlQmxvY2sgLSB0aGUgZGF0YSBuZWVkZWQgYnkgRGl2YSB0byBzaG93IGEgdmlldyBvZiBhIHNpbmdsZSBkb2N1bWVudFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZUlJSUZNYW5pZmVzdCAobWFuaWZlc3QpXG57XG4gICAgbGV0IGN0eCA9IG1hbmlmZXN0W1wiQGNvbnRleHRcIl07XG5cbiAgICBpZiAoIWN0eClcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIElJSUYgTWFuaWZlc3Q7IE5vIEBjb250ZXh0IGZvdW5kLlwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdmVyc2lvbiA9IGdldElJSUZQcmVzZW50YXRpb25WZXJzaW9uKGN0eCk7XG4gICAgY29uc3Qgc2VxdWVuY2UgPSBtYW5pZmVzdC5zZXF1ZW5jZXMgPyBtYW5pZmVzdC5zZXF1ZW5jZXNbMF0gOiBudWxsO1xuICAgIGNvbnN0IGNhbnZhc2VzID0gc2VxdWVuY2UgPyBzZXF1ZW5jZS5jYW52YXNlcyA6IG1hbmlmZXN0Lml0ZW1zO1xuICAgIGNvbnN0IG51bUNhbnZhc2VzID0gY2FudmFzZXMubGVuZ3RoO1xuXG4gICAgY29uc3QgcGFnZXMgPSBuZXcgQXJyYXkoY2FudmFzZXMubGVuZ3RoKTtcblxuICAgIGxldCB0aGlzQ2FudmFzLCBcbiAgICAgICAgdGhpc1Jlc291cmNlLCBcbiAgICAgICAgdGhpc0ltYWdlLFxuICAgICAgICBzZWNvbmRhcnlJbWFnZXMsXG4gICAgICAgIG90aGVySW1hZ2VzID0gW10sXG4gICAgICAgIGNvbnRleHQsIFxuICAgICAgICB1cmwsIFxuICAgICAgICBpbmZvLCBcbiAgICAgICAgaW1hZ2VBUElWZXJzaW9uLCBcbiAgICAgICAgd2lkdGgsIFxuICAgICAgICBoZWlnaHQsIFxuICAgICAgICBtYXhab29tLCBcbiAgICAgICAgY2FudmFzLCBcbiAgICAgICAgbGFiZWwsIFxuICAgICAgICBpbWFnZUxhYmVsLCBcbiAgICAgICAgem9vbURpbWVuc2lvbnMsIFxuICAgICAgICB3aWR0aEF0Q3VycmVudFpvb21MZXZlbCwgXG4gICAgICAgIGhlaWdodEF0Q3VycmVudFpvb21MZXZlbDtcblxuICAgIGxldCBsb3dlc3RNYXhab29tID0gMTAwO1xuICAgIGxldCBtYXhSYXRpbyA9IDA7XG4gICAgbGV0IG1pblJhdGlvID0gMTAwO1xuXG4gICAgLy8gcXVpY2tseSBkZXRlcm1pbmUgdGhlIGxvd2VzdCBwb3NzaWJsZSBtYXggem9vbSBsZXZlbCAoaS5lLiwgdGhlIHVwcGVyIGJvdW5kIGZvciBpbWFnZXMpIGFjcm9zcyBhbGwgY2FudmFzZXMuXG4gICAgLy8gd2hpbGUgd2UncmUgaGVyZSwgY29tcHV0ZSB0aGUgZ2xvYmFsIHJhdGlvcyBhcyB3ZWxsLlxuICAgIGZvciAobGV0IHogPSAwOyB6IDwgbnVtQ2FudmFzZXM7IHorKylcbiAgICB7XG4gICAgICAgIGNvbnN0IGMgPSBjYW52YXNlc1t6XTtcbiAgICAgICAgY29uc3QgdyA9IGMud2lkdGg7XG4gICAgICAgIGNvbnN0IGggPSBjLmhlaWdodDtcbiAgICAgICAgY29uc3QgbXogPSBnZXRNYXhab29tTGV2ZWwodywgaCk7XG4gICAgICAgIGNvbnN0IHJhdGlvID0gaCAvIHc7XG4gICAgICAgIG1heFJhdGlvID0gTWF0aC5tYXgocmF0aW8sIG1heFJhdGlvKTtcbiAgICAgICAgbWluUmF0aW8gPSBNYXRoLm1pbihyYXRpbywgbWluUmF0aW8pO1xuXG4gICAgICAgIGxvd2VzdE1heFpvb20gPSBNYXRoLm1pbihsb3dlc3RNYXhab29tLCBteik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgICAgVGhlc2UgYXJyYXlzIG5lZWQgdG8gYmUgcHJlLWluaXRpYWxpemVkIHNpbmNlIHdlIHdpbGwgZG8gYXJpdGhtZXRpYyBhbmQgdmFsdWUgY2hlY2tpbmcgb24gdGhlbVxuICAgICovXG4gICAgY29uc3QgdG90YWxXaWR0aHMgPSBuZXcgQXJyYXkobG93ZXN0TWF4Wm9vbSArIDEpLmZpbGwoMCk7XG4gICAgY29uc3QgdG90YWxIZWlnaHRzID0gbmV3IEFycmF5KGxvd2VzdE1heFpvb20gKyAxKS5maWxsKDApO1xuICAgIGNvbnN0IG1heFdpZHRocyA9IG5ldyBBcnJheShsb3dlc3RNYXhab29tICsgMSkuZmlsbCgwKTtcbiAgICBjb25zdCBtYXhIZWlnaHRzID0gbmV3IEFycmF5KGxvd2VzdE1heFpvb20gKyAxKS5maWxsKDApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1DYW52YXNlczsgaSsrKVxuICAgIHtcbiAgICAgICAgdGhpc0NhbnZhcyA9IGNhbnZhc2VzW2ldO1xuICAgICAgICBjYW52YXMgPSB0aGlzQ2FudmFzWydAaWQnXSB8fCB0aGlzQ2FudmFzLmlkO1xuICAgICAgICBsYWJlbCA9IHRoaXNDYW52YXMubGFiZWw7XG4gICAgICAgIHRoaXNSZXNvdXJjZSA9IHRoaXNDYW52YXMuaW1hZ2VzID8gdGhpc0NhbnZhcy5pbWFnZXNbMF0ucmVzb3VyY2UgOiB0aGlzQ2FudmFzLml0ZW1zWzBdLml0ZW1zWzBdLmJvZHk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogSWYgYSBjYW52YXMgaGFzIG11bHRpcGxlIGltYWdlcyBpdCB3aWxsIGJlIGVuY29kZWRcbiAgICAgICAgICogd2l0aCBhIHJlc291cmNlIHR5cGUgb2YgXCJvYTpDaG9pY2VcIiAodjIpIG9yIFwiQ2hvaWNlXCIgKHYzKS5cbiAgICAgICAgICoqL1xuICAgICAgICBvdGhlckltYWdlcyA9IFtdOyAvLyByZXNldCBhcnJheVxuICAgICAgICBpZiAodGhpc1Jlc291cmNlWydAdHlwZSddID09PSBcIm9hOkNob2ljZVwiIHx8IHRoaXNSZXNvdXJjZS50eXBlID09PSBcIkNob2ljZVwiKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzSW1hZ2UgPSB0aGlzUmVzb3VyY2UuZGVmYXVsdCB8fCB0aGlzUmVzb3VyY2UuaXRlbXNbMF07XG4gICAgICAgICAgICBzZWNvbmRhcnlJbWFnZXMgPSB0aGlzUmVzb3VyY2UuaXRlbSB8fCB0aGlzUmVzb3VyY2UuaXRlbXMuc2xpY2UoMSk7XG4gICAgICAgICAgICBvdGhlckltYWdlcyA9IGdldE90aGVySW1hZ2VEYXRhKHNlY29uZGFyeUltYWdlcywgbG93ZXN0TWF4Wm9vbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzSW1hZ2UgPSB0aGlzUmVzb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmlvcml0aXplIHRoZSBjYW52YXMgaGVpZ2h0IC8gd2lkdGggZmlyc3QsIHNpbmNlIGltYWdlcyBtYXkgbm90IGhhdmUgaC93XG4gICAgICAgIHdpZHRoID0gdGhpc0NhbnZhcy53aWR0aCB8fCB0aGlzSW1hZ2Uud2lkdGg7XG4gICAgICAgIGhlaWdodCA9IHRoaXNDYW52YXMuaGVpZ2h0IHx8IHRoaXNJbWFnZS5oZWlnaHQ7XG5cbiAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB3aWR0aCBvciBoZWlnaHQgZm9yIGNhbnZhcyAnICsgbGFiZWwgKyAnLiBTa2lwcGluZycpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtYXhab29tID0gZ2V0TWF4Wm9vbUxldmVsKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIGltYWdlTGFiZWwgPSB0aGlzSW1hZ2UubGFiZWwgfHwgbnVsbDtcblxuICAgICAgICBpbmZvID0gcGFyc2VJbWFnZUluZm8odGhpc0ltYWdlKTtcbiAgICAgICAgdXJsID0gaW5mby51cmwuc2xpY2UoLTEpICE9PSAnLycgPyBpbmZvLnVybCArICcvJyA6IGluZm8udXJsOyAgLy8gYXBwZW5kIHRyYWlsaW5nIHNsYXNoIHRvIHVybCBpZiBpdCdzIG5vdCB0aGVyZS5cblxuICAgICAgICBjb250ZXh0ID0gdGhpc0ltYWdlLnNlcnZpY2VbJ0Bjb250ZXh0J10gfHwgdGhpc0ltYWdlLnNlcnZpY2UudHlwZTtcblxuICAgICAgICBpZiAoY29udGV4dCA9PT0gJ2h0dHA6Ly9paWlmLmlvL2FwaS9pbWFnZS8yL2NvbnRleHQuanNvbicgfHwgY29udGV4dCA9PT0gXCJJbWFnZVNlcnZpY2UyXCIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGltYWdlQVBJVmVyc2lvbiA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGV4dCA9PT0gJ2h0dHA6Ly9saWJyYXJ5LnN0YW5mb3JkLmVkdS9paWlmL2ltYWdlLWFwaS8xLjEvY29udGV4dC5qc29uJylcbiAgICAgICAge1xuICAgICAgICAgICAgaW1hZ2VBUElWZXJzaW9uID0gMS4xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaW1hZ2VBUElWZXJzaW9uID0gMS4wO1xuICAgICAgICB9XG5cbiAgICAgICAgem9vbURpbWVuc2lvbnMgPSBuZXcgQXJyYXkobG93ZXN0TWF4Wm9vbSArIDEpO1xuXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbG93ZXN0TWF4Wm9vbSArIDE7IGsrKylcbiAgICAgICAge1xuICAgICAgICAgICAgd2lkdGhBdEN1cnJlbnRab29tTGV2ZWwgPSBNYXRoLmZsb29yKGluY29ycG9yYXRlWm9vbSh3aWR0aCwgbG93ZXN0TWF4Wm9vbSAtIGspKTtcbiAgICAgICAgICAgIGhlaWdodEF0Q3VycmVudFpvb21MZXZlbCA9IE1hdGguZmxvb3IoaW5jb3Jwb3JhdGVab29tKGhlaWdodCwgbG93ZXN0TWF4Wm9vbSAtIGspKTtcbiAgICAgICAgICAgIHpvb21EaW1lbnNpb25zW2tdID0ge1xuICAgICAgICAgICAgICAgIGg6IGhlaWdodEF0Q3VycmVudFpvb21MZXZlbCxcbiAgICAgICAgICAgICAgICB3OiB3aWR0aEF0Q3VycmVudFpvb21MZXZlbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdG90YWxXaWR0aHNba10gKz0gd2lkdGhBdEN1cnJlbnRab29tTGV2ZWw7XG4gICAgICAgICAgICB0b3RhbEhlaWdodHNba10gKz0gaGVpZ2h0QXRDdXJyZW50Wm9vbUxldmVsO1xuICAgICAgICAgICAgbWF4V2lkdGhzW2tdID0gTWF0aC5tYXgod2lkdGhBdEN1cnJlbnRab29tTGV2ZWwsIG1heFdpZHRoc1trXSk7XG4gICAgICAgICAgICBtYXhIZWlnaHRzW2tdID0gTWF0aC5tYXgoaGVpZ2h0QXRDdXJyZW50Wm9vbUxldmVsLCBtYXhIZWlnaHRzW2tdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1BhZ2VkID0gdGhpc0NhbnZhcy52aWV3aW5nSGludCAhPT0gJ25vbi1wYWdlZCcgfHwgKHRoaXNDYW52YXMuYmVoYXZpb3IgPyB0aGlzQ2FudmFzLmJlaGF2aW9yWzBdICE9PSAnbm9uLXBhZ2VkJyA6IGZhbHNlKTtcbiAgICAgICAgbGV0IGlzRmFjaW5nID0gdGhpc0NhbnZhcy52aWV3aW5nSGludCA9PT0gJ2ZhY2luZy1wYWdlcycgfHwgKHRoaXNDYW52YXMuYmVoYXZpb3IgPyB0aGlzQ2FudmFzLmJlaGF2aW9yWzBdID09PSAnZmFjaW5nLXBhZ2VzJyA6IGZhbHNlKTtcblxuICAgICAgICBwYWdlc1tpXSA9IHtcbiAgICAgICAgICAgIGQ6IHpvb21EaW1lbnNpb25zLFxuICAgICAgICAgICAgbTogbWF4Wm9vbSxcbiAgICAgICAgICAgIGw6IGxhYmVsLCAgICAgICAgIC8vIGNhbnZhcyBsYWJlbCAoJ3BhZ2UgMSwgcGFnZSAyJywgZXRjLilcbiAgICAgICAgICAgIGlsOiBpbWFnZUxhYmVsLCAgIC8vIGRlZmF1bHQgaW1hZ2UgbGFiZWwgKCdwcmltYXJ5IGltYWdlJywgJ1VWIGxpZ2h0JywgZXRjLilcbiAgICAgICAgICAgIGY6IGluZm8udXJsLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBhcGk6IGltYWdlQVBJVmVyc2lvbixcbiAgICAgICAgICAgIHBhZ2VkOiBpc1BhZ2VkLFxuICAgICAgICAgICAgZmFjaW5nUGFnZXM6IGlzRmFjaW5nLFxuICAgICAgICAgICAgY2FudmFzOiBjYW52YXMsXG4gICAgICAgICAgICBvdGhlckltYWdlczogb3RoZXJJbWFnZXMsXG4gICAgICAgICAgICB4b2Zmc2V0OiBpbmZvLnggfHwgbnVsbCxcbiAgICAgICAgICAgIHlvZmZzZXQ6IGluZm8ueSB8fCBudWxsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgYXZlcmFnZVdpZHRocyA9IG5ldyBBcnJheShsb3dlc3RNYXhab29tICsgMSk7XG4gICAgY29uc3QgYXZlcmFnZUhlaWdodHMgPSBuZXcgQXJyYXkobG93ZXN0TWF4Wm9vbSArIDEpO1xuXG4gICAgZm9yIChsZXQgYSA9IDA7IGEgPCBsb3dlc3RNYXhab29tICsgMTsgYSsrKVxuICAgIHtcbiAgICAgICAgYXZlcmFnZVdpZHRoc1thXSA9IHRvdGFsV2lkdGhzW2FdIC8gbnVtQ2FudmFzZXM7XG4gICAgICAgIGF2ZXJhZ2VIZWlnaHRzW2FdID0gdG90YWxIZWlnaHRzW2FdIC8gbnVtQ2FudmFzZXM7XG4gICAgfVxuXG4gICAgY29uc3QgZGltcyA9IHtcbiAgICAgICAgYV93aWQ6IGF2ZXJhZ2VXaWR0aHMsXG4gICAgICAgIGFfaGVpOiBhdmVyYWdlSGVpZ2h0cyxcbiAgICAgICAgbWF4X3c6IG1heFdpZHRocyxcbiAgICAgICAgbWF4X2g6IG1heEhlaWdodHMsXG4gICAgICAgIG1heF9yYXRpbzogbWF4UmF0aW8sXG4gICAgICAgIG1pbl9yYXRpbzogbWluUmF0aW8sXG4gICAgICAgIHRfaGVpOiB0b3RhbEhlaWdodHMsXG4gICAgICAgIHRfd2lkOiB0b3RhbFdpZHRoc1xuICAgIH07XG5cbiAgICAvLyBhc3N1bWVzIHBhZ2VkIGlzIGZhbHNlIGZvciBub24tcGFnZWQgdmFsdWVzXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgaXRlbV90aXRsZTogcGFyc2VMYWJlbFZhbHVlKG1hbmlmZXN0KS5sYWJlbCxcbiAgICAgICAgbWV0YWRhdGE6IG1hbmlmZXN0Lm1ldGFkYXRhIHx8IG51bGwsXG4gICAgICAgIGRpbXM6IGRpbXMsXG4gICAgICAgIG1heF96b29tOiBsb3dlc3RNYXhab29tLFxuICAgICAgICBwZ3M6IHBhZ2VzLFxuICAgICAgICBwYWdlZDogbWFuaWZlc3Qudmlld2luZ0hpbnQgPT09ICdwYWdlZCcgfHwgKG1hbmlmZXN0LmJlaGF2aW91ciA/IG1hbmlmZXN0LmJlaGF2aW91clswXSA9PT0gJ3BhZ2VkJyA6IGZhbHNlKSB8fCAoc2VxdWVuY2UgPyBzZXF1ZW5jZS52aWV3aW5nSGludCA9PT0gJ3BhZ2VkJyA6IGZhbHNlKVxuICAgIH07XG59XG5cbi8qKlxuICogVGFrZXMgaW4gYSByZXNvdXJjZSBibG9jayBmcm9tIGEgY2FudmFzIGFuZCBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVzb3VyY2U6XG4gKiAtIEltYWdlIFVSTFxuICogLSBJbWFnZSByZWdpb24gdG8gYmUgZGlzcGxheWVkXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlc291cmNlIC0gYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2UgYmxvY2sgb2YgYSBjYW52YXMgc2VjdGlvbiBpbiBhIElJSUYgbWFuaWZlc3RcbiAqIEByZXR1cm5zIHtPYmplY3R9IGltYWdlSW5mbyAtIGFuIG9iamVjdCBjb250YWluaW5nIGltYWdlIFVSTCBhbmQgcmVnaW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSW1hZ2VJbmZvIChyZXNvdXJjZSlcbntcbiAgICBsZXQgdXJsID0gcmVzb3VyY2VbJ0BpZCddIHx8IHJlc291cmNlLmlkO1xuICAgIGNvbnN0IGZyYWdtZW50UmVnZXggPSAvI3h5d2g9KFswLTldKyxbMC05XSssWzAtOV0rLFswLTldKykvO1xuICAgIGxldCB4eXdoID0gJyc7XG4gICAgbGV0IHN0cmlwVVJMID0gdHJ1ZTtcblxuICAgIGlmICgvXFwvKFswLTldKyxbMC05XSssWzAtOV0rLFswLTldKylcXC8vLnRlc3QodXJsKSlcbiAgICB7XG4gICAgICAgIC8vIGlmIHJlc291cmNlIGluIGltYWdlIEFQSSBmb3JtYXQsIGV4dHJhY3QgcmVnaW9uIHgseSx3LGggZnJvbSBVUkwgKGFmdGVyIDR0aCBzbGFzaCBmcm9tIGxhc3QpXG4gICAgICAgIC8vIG1hdGNoZXMgY29vcmRpbmF0ZXMgaW4gVVJMcyBvZiB0aGUgZm9ybSBodHRwOi8vd3d3LmV4YW1wbGUub3JnL2lpaWYvYm9vazEtcGFnZTEvNDAsNTAsMTIwMCwxODAwL2Z1bGwvMC9kZWZhdWx0LmpwZ1xuICAgICAgICBjb25zdCB1cmxBcnJheSA9IHVybC5zcGxpdCgnLycpO1xuICAgICAgICB4eXdoID0gdXJsQXJyYXlbdXJsQXJyYXkubGVuZ3RoIC0gNF07XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyYWdtZW50UmVnZXgudGVzdCh1cmwpKVxuICAgIHtcbiAgICAgICAgLy8gbWF0Y2hlcyBjb29yZGluYXRlcyBvZiB0aGUgc3R5bGUgaHR0cDovL3d3dy5leGFtcGxlLm9yZy9paWlmL2Jvb2sxL2NhbnZhcy9wMSN4eXdoPTUwLDUwLDMyMCwyNDBcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZnJhZ21lbnRSZWdleC5leGVjKHVybCk7XG4gICAgICAgIHh5d2ggPSByZXN1bHRbMV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc291cmNlLnNlcnZpY2UgJiYgKHJlc291cmNlLnNlcnZpY2VbJ0BpZCddIHx8IHJlc291cmNlLnNlcnZpY2UuaWQpKVxuICAgIHtcbiAgICAgICAgLy8gdGhpcyBVUkwgZXhjbHVkZXMgcmVnaW9uIHBhcmFtZXRlcnMgc28gd2UgZG9uJ3QgbmVlZCB0byByZW1vdmUgdGhlbVxuICAgICAgICB1cmwgPSByZXNvdXJjZS5zZXJ2aWNlWydAaWQnXSB8fCByZXNvdXJjZS5zZXJ2aWNlLmlkO1xuICAgICAgICBzdHJpcFVSTCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJpcFVSTClcbiAgICB7XG4gICAgICAgIC8vIGV4dHJhY3QgVVJMIHVwIHRvIGlkZW50aWZpZXIgKHdlIGVsaW1pbmF0ZSB0aGUgbGFzdCA1IHBhcmFtZXRlcnM6IC9yZWdpb24vc2l6ZS9yb3RhdGlvbi9xdWFsaXR5LmZvcm1hdClcbiAgICAgICAgdXJsID0gdXJsLnNwbGl0KCcvJykuc2xpY2UoMCwgLTQpLmpvaW4oJy8nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWFnZUluZm8gPSB7XG4gICAgICAgIHVybDogdXJsXG4gICAgfTtcblxuICAgIGlmICh4eXdoLmxlbmd0aClcbiAgICB7XG4gICAgICAgIC8vIHBhcnNlIGludG8gc2VwYXJhdGUgY29tcG9uZW50c1xuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0geHl3aC5zcGxpdCgnLCcpO1xuICAgICAgICBpbWFnZUluZm8ueCA9IHBhcnNlSW50KGRpbWVuc2lvbnNbMF0sIDEwKTtcbiAgICAgICAgaW1hZ2VJbmZvLnkgPSBwYXJzZUludChkaW1lbnNpb25zWzFdLCAxMCk7XG4gICAgICAgIGltYWdlSW5mby53ID0gcGFyc2VJbnQoZGltZW5zaW9uc1syXSwgMTApO1xuICAgICAgICBpbWFnZUluZm8uaCA9IHBhcnNlSW50KGRpbWVuc2lvbnNbM10sIDEwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2VJbmZvO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgSUlJRlNvdXJjZUFkYXB0ZXJcbntcbiAgICBnZXRQYWdlSW1hZ2VVUkwgKG1hbmlmZXN0LCBwYWdlSW5kZXgsIHNpemUpXG4gICAge1xuICAgICAgICBsZXQgZGltZW5zO1xuXG4gICAgICAgIGlmICghc2l6ZSB8fCAoc2l6ZS53aWR0aCA9PSBudWxsICYmIHNpemUuaGVpZ2h0ID09IG51bGwpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkaW1lbnMgPSAnZnVsbCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBkaW1lbnMgPSAoc2l6ZS53aWR0aCA9PSBudWxsID8gJycgOiBzaXplLndpZHRoKSArICcsJyArIChzaXplLmhlaWdodCA9PSBudWxsID8gJycgOiBzaXplLmhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYWdlID0gbWFuaWZlc3QucGFnZXNbcGFnZUluZGV4XTtcbiAgICAgICAgY29uc3QgcXVhbGl0eSA9IChwYWdlLmFwaSA+IDEuMSkgPyAnZGVmYXVsdCcgOiAnbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gZW5jb2RlVVJJKHBhZ2UudXJsICsgJ2Z1bGwvJyArIGRpbWVucyArICcvMC8nICsgcXVhbGl0eSArICcuanBnJyk7XG4gICAgfVxuXG4gICAgZ2V0VGlsZUltYWdlVVJMIChtYW5pZmVzdCwgcGFnZUluZGV4LCBwYXJhbXMpXG4gICAge1xuICAgICAgICBjb25zdCBwYWdlID0gbWFuaWZlc3QucGFnZXNbcGFnZUluZGV4XTtcblxuICAgICAgICBsZXQgaGVpZ2h0LCB3aWR0aDtcblxuICAgICAgICBpZiAocGFyYW1zLnJvdyA9PT0gcGFyYW1zLnJvd0NvdW50IC0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgaGVpZ2h0ID0gcGFnZS5kW3BhcmFtcy56b29tTGV2ZWxdLmggLSAocGFyYW1zLnJvd0NvdW50IC0gMSkgKiBwYXJhbXMudGlsZURpbWVuc2lvbnMuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaGVpZ2h0ID0gcGFyYW1zLnRpbGVEaW1lbnNpb25zLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJhbXMuY29sID09PSBwYXJhbXMuY29sQ291bnQgLSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhZ2UuZFtwYXJhbXMuem9vbUxldmVsXS53IC0gKHBhcmFtcy5jb2xDb3VudCAtIDEpICogcGFyYW1zLnRpbGVEaW1lbnNpb25zLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgd2lkdGggPSBwYXJhbXMudGlsZURpbWVuc2lvbnMud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b29tRGlmZmVyZW5jZSA9IE1hdGgucG93KDIsIG1hbmlmZXN0Lm1heFpvb20gLSBwYXJhbXMuem9vbUxldmVsKTtcblxuICAgICAgICBsZXQgeCA9IHBhcmFtcy5jb2wgKiBwYXJhbXMudGlsZURpbWVuc2lvbnMud2lkdGggKiB6b29tRGlmZmVyZW5jZTtcbiAgICAgICAgbGV0IHkgPSBwYXJhbXMucm93ICogcGFyYW1zLnRpbGVEaW1lbnNpb25zLmhlaWdodCAqIHpvb21EaWZmZXJlbmNlO1xuXG4gICAgICAgIGlmIChwYWdlLmhhc093blByb3BlcnR5KCd4b2Zmc2V0JykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHggKz0gcGFnZS54b2Zmc2V0O1xuICAgICAgICAgICAgeSArPSBwYWdlLnlvZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWdpb24gPSBbeCwgeSwgd2lkdGggKiB6b29tRGlmZmVyZW5jZSwgaGVpZ2h0ICogem9vbURpZmZlcmVuY2VdLmpvaW4oJywnKTtcblxuICAgICAgICBjb25zdCBxdWFsaXR5ID0gKHBhZ2UuYXBpID4gMS4xKSA/ICdkZWZhdWx0JyA6ICduYXRpdmUnO1xuXG4gICAgICAgIHJldHVybiBlbmNvZGVVUkkocGFnZS51cmwgKyByZWdpb24gKyAnLycgKyB3aWR0aCArICcsJyArIGhlaWdodCArICcvMC8nICsgcXVhbGl0eSArICcuanBnJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHBhcnNlSUlJRk1hbmlmZXN0IGZyb20gJy4vcGFyc2UtaWlpZi1tYW5pZmVzdCc7XG5pbXBvcnQgSUlJRlNvdXJjZUFkYXB0ZXIgZnJvbSBcIi4vaWlpZi1zb3VyY2UtYWRhcHRlclwiO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlTWFuaWZlc3RcbntcbiAgICBjb25zdHJ1Y3RvciAoZGF0YSwgdXJsQWRhcHRlcilcbiAgICB7XG4gICAgICAgIC8vIFNhdmUgYWxsIHRoZSBkYXRhIHdlIG5lZWRcbiAgICAgICAgdGhpcy5wYWdlcyA9IGRhdGEucGdzO1xuICAgICAgICB0aGlzLm1heFpvb20gPSBkYXRhLm1heF96b29tO1xuICAgICAgICB0aGlzLm1heFJhdGlvID0gZGF0YS5kaW1zLm1heF9yYXRpbztcbiAgICAgICAgdGhpcy5taW5SYXRpbyA9IGRhdGEuZGltcy5taW5fcmF0aW87XG4gICAgICAgIHRoaXMuaXRlbVRpdGxlID0gZGF0YS5pdGVtX3RpdGxlO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gZGF0YS5tZXRhZGF0YTtcblxuICAgICAgICAvLyBPbmx5IGdpdmVuIGZvciBJSUlGIG1hbmlmZXN0c1xuICAgICAgICB0aGlzLnBhZ2VkID0gISFkYXRhLnBhZ2VkO1xuXG4gICAgICAgIC8vIFRoZXNlIGFyZSBhcnJheXMsIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSB6b29tIGxldmVsXG4gICAgICAgIHRoaXMuX21heFdpZHRocyA9IGRhdGEuZGltcy5tYXhfdztcbiAgICAgICAgdGhpcy5fbWF4SGVpZ2h0cyA9IGRhdGEuZGltcy5tYXhfaDtcbiAgICAgICAgdGhpcy5fYXZlcmFnZVdpZHRocyA9IGRhdGEuZGltcy5hX3dpZDtcbiAgICAgICAgdGhpcy5fYXZlcmFnZUhlaWdodHMgPSBkYXRhLmRpbXMuYV9oZWk7XG4gICAgICAgIHRoaXMuX3RvdGFsSGVpZ2h0cyA9IGRhdGEuZGltcy50X2hlaTtcbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aHMgPSBkYXRhLmRpbXMudF93aWQ7XG5cbiAgICAgICAgdGhpcy5fdXJsQWRhcHRlciA9IHVybEFkYXB0ZXI7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21JSUlGIChpaWlmTWFuaWZlc3QpXG4gICAge1xuICAgICAgICBjb25zdCBkYXRhID0gcGFyc2VJSUlGTWFuaWZlc3QoaWlpZk1hbmlmZXN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZU1hbmlmZXN0KGRhdGEsIG5ldyBJSUlGU291cmNlQWRhcHRlcigpKTtcbiAgICB9XG5cbiAgICBpc1BhZ2VWYWxpZCAocGFnZUluZGV4LCBzaG93Tm9uUGFnZWRQYWdlcylcbiAgICB7XG4gICAgICAgIGlmICghc2hvd05vblBhZ2VkUGFnZXMgJiYgdGhpcy5wYWdlZCAmJiAhdGhpcy5wYWdlc1twYWdlSW5kZXhdLnBhZ2VkKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFnZUluZGV4ID49IDAgJiYgcGFnZUluZGV4IDwgdGhpcy5wYWdlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0TWF4UGFnZURpbWVuc2lvbnMgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIGNvbnN0IG1heERpbXMgPSB0aGlzLnBhZ2VzW3BhZ2VJbmRleF0uZFt0aGlzLm1heFpvb21dO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoZWlnaHQ6IG1heERpbXMuaCxcbiAgICAgICAgICAgIHdpZHRoOiBtYXhEaW1zLndcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRQYWdlRGltZW5zaW9uc0F0Wm9vbUxldmVsIChwYWdlSW5kZXgsIHpvb21MZXZlbClcbiAgICB7XG4gICAgICAgIGNvbnN0IG1heERpbXMgPSB0aGlzLnBhZ2VzW3BhZ2VJbmRleF0uZFt0aGlzLm1heFpvb21dO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlUmF0aW8gPSBnZXRTY2FsZVJhdGlvKHRoaXMubWF4Wm9vbSwgem9vbUxldmVsKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVpZ2h0OiBtYXhEaW1zLmggKiBzY2FsZVJhdGlvLFxuICAgICAgICAgICAgd2lkdGg6IG1heERpbXMudyAqIHNjYWxlUmF0aW9cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVVJMIGZvciB0aGUgaW1hZ2Ugb2YgdGhlIGdpdmVuIHBhZ2UuIFRoZSBvcHRpb25hbCBzaXplXG4gICAgICogcGFyYW1ldGVyIHN1cHBvcnRzIHNldHRpbmcgdGhlIGltYWdlIHdpZHRoIG9yIGhlaWdodCAoZGVmYXVsdCBpc1xuICAgICAqIGZ1bGwtc2l6ZWQpLlxuICAgICAqL1xuICAgIGdldFBhZ2VJbWFnZVVSTCAocGFnZUluZGV4LCBzaXplKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VybEFkYXB0ZXIuZ2V0UGFnZUltYWdlVVJMKHRoaXMsIHBhZ2VJbmRleCwgc2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIHRpbGUgb2JqZWN0cyBmb3IgdGhlIHNwZWNpZmllZCBwYWdlIGFuZCBpbnRlZ2VyIHpvb20gbGV2ZWxcbiAgICAgKi9cbiAgICBnZXRQYWdlSW1hZ2VUaWxlcyAocGFnZUluZGV4LCB6b29tTGV2ZWwsIHRpbGVEaW1lbnNpb25zKVxuICAgIHtcbiAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMucGFnZXNbcGFnZUluZGV4XTtcblxuICAgICAgICBpZiAoIWlzRmluaXRlKHpvb21MZXZlbCkgfHwgem9vbUxldmVsICUgMSAhPT0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWm9vbSBsZXZlbCBtdXN0IGJlIGFuIGludGVnZXI6ICcgKyB6b29tTGV2ZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IE1hdGguY2VpbChwYWdlLmRbem9vbUxldmVsXS5oIC8gdGlsZURpbWVuc2lvbnMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgY29scyA9IE1hdGguY2VpbChwYWdlLmRbem9vbUxldmVsXS53IC8gdGlsZURpbWVuc2lvbnMud2lkdGgpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVzID0gW107XG5cbiAgICAgICAgbGV0IHJvdywgY29sLCB1cmw7XG5cbiAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCByb3dzOyByb3crKylcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1cmwgPSB0aGlzLl91cmxBZGFwdGVyLmdldFRpbGVJbWFnZVVSTCh0aGlzLCBwYWdlSW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbDogY29sLFxuICAgICAgICAgICAgICAgICAgICByb3dDb3VudDogcm93cyxcbiAgICAgICAgICAgICAgICAgICAgY29sQ291bnQ6IGNvbHMsXG4gICAgICAgICAgICAgICAgICAgIHpvb21MZXZlbDogem9vbUxldmVsLFxuICAgICAgICAgICAgICAgICAgICB0aWxlRGltZW5zaW9uczogdGlsZURpbWVuc2lvbnNcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBEaW1lbnNpb25zIHNob3VsZCBhY2NvdW50IGZvciBwYXJ0aWFsIHRpbGVzIChlLmcuIHRoZVxuICAgICAgICAgICAgICAgIC8vIGxhc3Qgcm93IGFuZCBjb2x1bW4gaW4gYSB0aWxlZCBpbWFnZSlcbiAgICAgICAgICAgICAgICB0aWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbDogY29sLFxuICAgICAgICAgICAgICAgICAgICB6b29tTGV2ZWw6IHpvb21MZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aWxlRGltZW5zaW9ucy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGlsZURpbWVuc2lvbnMud2lkdGhcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHJvdyAqIHRpbGVEaW1lbnNpb25zLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IGNvbCAqIHRpbGVEaW1lbnNpb25zLndpZHRoXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgem9vbUxldmVsOiB6b29tTGV2ZWwsXG4gICAgICAgICAgICByb3dzOiByb3dzLFxuICAgICAgICAgICAgY29sczogY29scyxcbiAgICAgICAgICAgIHRpbGVzOiB0aWxlc1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuSW1hZ2VNYW5pZmVzdC5wcm90b3R5cGUuZ2V0TWF4V2lkdGggPSB6b29tZWRQcm9wZXJ0eUdldHRlcignX21heFdpZHRocycpO1xuSW1hZ2VNYW5pZmVzdC5wcm90b3R5cGUuZ2V0TWF4SGVpZ2h0ID0gem9vbWVkUHJvcGVydHlHZXR0ZXIoJ19tYXhIZWlnaHRzJyk7XG5JbWFnZU1hbmlmZXN0LnByb3RvdHlwZS5nZXRBdmVyYWdlV2lkdGggPSB6b29tZWRQcm9wZXJ0eUdldHRlcignX2F2ZXJhZ2VXaWR0aHMnKTtcbkltYWdlTWFuaWZlc3QucHJvdG90eXBlLmdldEF2ZXJhZ2VIZWlnaHQgPSB6b29tZWRQcm9wZXJ0eUdldHRlcignX2F2ZXJhZ2VIZWlnaHRzJyk7XG5JbWFnZU1hbmlmZXN0LnByb3RvdHlwZS5nZXRUb3RhbFdpZHRoID0gem9vbWVkUHJvcGVydHlHZXR0ZXIoJ190b3RhbFdpZHRocycpO1xuSW1hZ2VNYW5pZmVzdC5wcm90b3R5cGUuZ2V0VG90YWxIZWlnaHQgPSB6b29tZWRQcm9wZXJ0eUdldHRlcignX3RvdGFsSGVpZ2h0cycpO1xuXG5mdW5jdGlvbiB6b29tZWRQcm9wZXJ0eUdldHRlciAocHJpdmF0ZU5hbWUpXG57XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh6b29tTGV2ZWwpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpc1twcml2YXRlTmFtZV1bem9vbUxldmVsXTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZVJhdGlvIChzb3VyY2Vab29tTGV2ZWwsIHRhcmdldFpvb21MZXZlbClcbntcbiAgICByZXR1cm4gMSAvIE1hdGgucG93KDIsIHNvdXJjZVpvb21MZXZlbCAtIHRhcmdldFpvb21MZXZlbCk7XG59XG4iLCJpbXBvcnQgZGl2YSBmcm9tICcuL2RpdmEtZ2xvYmFsJztcbmltcG9ydCB7IGVsdCB9IGZyb20gJy4vdXRpbHMvZWx0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9vbGJhclxue1xuICAgIGNvbnN0cnVjdG9yICh2aWV3ZXIpXG4gICAge1xuICAgICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHZpZXdlci5zZXR0aW5ncztcbiAgICB9XG5cbiAgICBfZWxlbUF0dHJzIChpZGVudCwgYmFzZSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuSUQgKyBpZGVudCxcbiAgICAgICAgICAgIGNsYXNzOiAnZGl2YS0nICsgaWRlbnRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYmFzZSlcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF0dHJzLCBiYXNlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGF0dHJzO1xuICAgIH1cblxuXG4gICAgLyoqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHN1YnNjcmliZSB0byBhIERpdmEgZXZlbnQgKi9cbiAgICBfc3Vic2NyaWJlIChldmVudCwgY2FsbGJhY2spXG4gICAge1xuICAgICAgICBkaXZhLkV2ZW50cy5zdWJzY3JpYmUoZXZlbnQsIGNhbGxiYWNrLCB0aGlzLnNldHRpbmdzLklEKTtcbiAgICB9XG5cblxuICAgIGNyZWF0ZUJ1dHRvbiAobmFtZSwgbGFiZWwsIGNhbGxiYWNrLCBpY29uKVxuICAgIHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gZWx0KCdidXR0b24nLCB7XG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIGlkOiB0aGlzLnNldHRpbmdzLklEICsgbmFtZSxcbiAgICAgICAgICAgIGNsYXNzOiAnZGl2YS0nICsgbmFtZSArICcgZGl2YS1idXR0b24nLFxuICAgICAgICAgICAgdGl0bGU6IGxhYmVsLFxuICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiBsYWJlbFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaWNvbilcbiAgICAgICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcblxuICAgICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxsYmFjayk7XG5cbiAgICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICB9XG5cbiAgICBjcmVhdGVMYWJlbCAobmFtZSwgaWQsIGxhYmVsLCBpbm5lck5hbWUsIGlubmVyVmFsdWUpXG4gICAge1xuICAgICAgICByZXR1cm4gZWx0KCdkaXYnLCB7IGlkOiB0aGlzLnNldHRpbmdzLklEICsgaWQsIGNsYXNzOiBuYW1lICsgJyBkaXZhLWxhYmVsJ30sXG4gICAgICAgICAgICAgICAgICAgIFsgbGFiZWwsIGVsdCgnc3BhbicsIHsgaWQ6IHRoaXMuc2V0dGluZ3MuSUQgKyBpbm5lck5hbWUgfSwgaW5uZXJWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgY3JlYXRlWm9vbUJ1dHRvbnMgKClcbiAgICB7XG4gICAgICAgIGxldCB6b29tT3V0SWNvbiA9IHRoaXMuX2NyZWF0ZVpvb21PdXRJY29uKCk7XG4gICAgICAgIGxldCB6b29tSW5JY29uID0gdGhpcy5fY3JlYXRlWm9vbUluSWNvbigpO1xuXG4gICAgICAgIGxldCB6b29tQnV0dG9ucyA9IFtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQnV0dG9uKCd6b29tLW91dC1idXR0b24nLCAnWm9vbSBPdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXIuc2V0Wm9vbUxldmVsKHRoaXMuc2V0dGluZ3Muem9vbUxldmVsIC0gMSk7XG4gICAgICAgICAgICB9LCB6b29tT3V0SWNvbiksXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbignem9vbS1pbi1idXR0b24nLCAnWm9vbSBJbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlci5zZXRab29tTGV2ZWwodGhpcy5zZXR0aW5ncy56b29tTGV2ZWwgKyAxKTtcbiAgICAgICAgICAgIH0sIHpvb21Jbkljb24pLFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVMYWJlbCgnZGl2YS16b29tLWxhYmVsJywgJ3pvb20tbGFiZWwnLCAnWm9vbSBsZXZlbDogJywgJ3pvb20tbGV2ZWwnLCB0aGlzLnNldHRpbmdzLnpvb21MZXZlbCArIDEpXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IHpvb21IYW5kbGVyID0gZnVuY3Rpb24gKClcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGxhYmVsRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLklEICsgJ3pvb20tbGV2ZWwnKTtcbiAgICAgICAgICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSB0aGlzLnNldHRpbmdzLnpvb21MZXZlbCArIDE7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCdab29tTGV2ZWxEaWRDaGFuZ2UnLCB6b29tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgnVmlld2VyRGlkTG9hZCcsIHpvb21IYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gZWx0KCdkaXYnLCB7IGlkOiB0aGlzLnNldHRpbmdzLklEICsgXCJ6b29tLWNvbnRyb2xzXCIsIHN0eWxlOiBcImRpc3BsYXk6IG5vbmVcIn0sIHpvb21CdXR0b25zKTtcbiAgICB9XG5cbiAgICBjcmVhdGVHcmlkQ29udHJvbHMgKClcbiAgICB7XG4gICAgICAgIGxldCBncmlkTW9yZUljb24gPSB0aGlzLl9jcmVhdGVHcmlkTW9yZUljb24oKTtcbiAgICAgICAgbGV0IGdyaWRGZXdlckljb24gPSB0aGlzLl9jcmVhdGVHcmlkRmV3ZXJJY29uKCk7XG5cbiAgICAgICAgbGV0IGdyaWRCdXR0b25zID0gW1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVCdXR0b24oJ2dyaWQtb3V0LWJ1dHRvbicsICdGZXdlcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlci5zZXRHcmlkUGFnZXNQZXJSb3codGhpcy5zZXR0aW5ncy5wYWdlc1BlclJvdyAtIDEpO1xuICAgICAgICAgICAgfSwgZ3JpZEZld2VySWNvbiksXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbignZ3JpZC1pbi1idXR0b24nLCAnTW9yZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlci5zZXRHcmlkUGFnZXNQZXJSb3codGhpcy5zZXR0aW5ncy5wYWdlc1BlclJvdyArIDEpO1xuICAgICAgICAgICAgfSwgZ3JpZE1vcmVJY29uKSxcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTGFiZWwoJ2RpdmEtZ3JpZC1sYWJlbCcsICdncmlkLWxhYmVsJywgJ1BhZ2VzIHBlciByb3c6ICcsICdwYWdlcy1wZXItcm93JywgdGhpcy5zZXR0aW5ncy5wYWdlc1BlclJvdylcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgZ3JpZENoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbiAoKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbGFiZWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3MuSUQgKyAncGFnZXMtcGVyLXJvdycpO1xuICAgICAgICAgICAgbGFiZWxFbC50ZXh0Q29udGVudCA9IHRoaXMuc2V0dGluZ3MucGFnZXNQZXJSb3c7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCdHcmlkUm93TnVtYmVyRGlkQ2hhbmdlJywgZ3JpZENoYW5nZUhhbmRsZXIpO1xuXG4gICAgICAgIHJldHVybiBlbHQoJ2RpdicsIHtpZDogdGhpcy5zZXR0aW5ncy5JRCArIFwiZ3JpZC1jb250cm9sc1wiLCBzdHlsZTogXCJkaXNwbGF5Om5vbmVcIiB9LCBncmlkQnV0dG9ucyk7XG4gICAgfVxuXG4gICAgY3JlYXRlUGFnZUxhYmVsICgpXG4gICAge1xuICAgICAgICAvLyBDdXJyZW50IHBhZ2VcbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSBlbHQoJ3NwYW4nLCB7XG4gICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5JRCArICdjdXJyZW50LXBhZ2UnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZUN1cnJlbnRQYWdlID0gKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgLy8gZ2V0IGxhYmVscyBmb3IgaW5kZXggcmFuZ2VcbiAgICAgICAgICAgIGxldCBpbmRpY2VzID0gdGhpcy52aWV3ZXIuZ2V0Q3VycmVudFBhZ2VJbmRpY2VzKCk7XG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IGluZGljZXNbMF07XG4gICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBsZXQgc3RhcnRMYWJlbCA9IHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbc3RhcnRJbmRleF0ubDtcbiAgICAgICAgICAgIGxldCBlbmRMYWJlbCA9IHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbZW5kSW5kZXhdLmw7XG5cbiAgICAgICAgICAgIGlmIChzdGFydEluZGV4ICE9PSBlbmRJbmRleClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIFx0aWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlSW5kZXhBc0xhYmVsKVxuICAgICAgICAgICAgICAgIFx0Y3VycmVudFBhZ2UudGV4dENvbnRlbnQgPSBzdGFydEluZGV4ICsgXCIgLSBcIiArIGVuZEluZGV4O1xuICAgICAgICAgICAgXHRlbHNlXG4gICAgICAgICAgICBcdFx0Y3VycmVudFBhZ2UudGV4dENvbnRlbnQgPSBzdGFydExhYmVsICsgXCIgLSBcIiArIGVuZExhYmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICBcdHtcbiAgICAgICAgICAgIFx0aWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlSW5kZXhBc0xhYmVsKVxuICAgICAgICAgICAgXHRcdGN1cnJlbnRQYWdlLnRleHRDb250ZW50ID0gc3RhcnRJbmRleDtcbiAgICAgICAgICAgIFx0ZWxzZVxuICAgICAgICAgICAgXHRcdGN1cnJlbnRQYWdlLnRleHRDb250ZW50ID0gc3RhcnRMYWJlbDtcbiAgICAgICAgXHR9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCdWaXNpYmxlUGFnZURpZENoYW5nZScsIHVwZGF0ZUN1cnJlbnRQYWdlKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCdWaWV3ZXJEaWRMb2FkJywgdXBkYXRlQ3VycmVudFBhZ2UpO1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoJ1ZpZXdEaWRTd2l0Y2gnLCB1cGRhdGVDdXJyZW50UGFnZSk7XG5cbiAgICAgICAgcmV0dXJuIGVsdCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogJ2RpdmEtcGFnZS1sYWJlbCBkaXZhLWxhYmVsJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY3JlYXRlR290b1BhZ2VGb3JtICgpXG4gICAge1xuICAgICAgICBjb25zdCBnb3RvUGFnZUlucHV0ID0gZWx0KCdpbnB1dCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNldHRpbmdzLklEICsgJ2dvdG8tcGFnZS1pbnB1dCcsXG4gICAgICAgICAgICBjbGFzczogJ2RpdmEtaW5wdXQgZGl2YS1nb3RvLXBhZ2UtaW5wdXQnLFxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlOiAnb2ZmJyxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJzogJ1BhZ2UgSW5wdXQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGdvdG9QYWdlU3VibWl0ID0gZWx0KCdpbnB1dCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNldHRpbmdzLklEICsgJ2dvdG8tcGFnZS1zdWJtaXQnLFxuICAgICAgICAgICAgY2xhc3M6ICdkaXZhLWJ1dHRvbiBkaXZhLWJ1dHRvbi10ZXh0JyxcbiAgICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgICAgdmFsdWU6ICdHbydcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW5wdXRTdWdnZXN0aW9ucyA9IGVsdCgnZGl2Jywge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNldHRpbmdzLklEICsgJ2lucHV0LXN1Z2dlc3Rpb25zJyxcbiAgICAgICAgICAgICAgICBjbGFzczogJ2RpdmEtaW5wdXQtc3VnZ2VzdGlvbnMnXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZ290b0Zvcm0gPSBlbHQoJ2Zvcm0nLCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuSUQgKyAnZ290by1wYWdlJyxcbiAgICAgICAgICAgICAgICBjbGFzczogJ2RpdmEtZ290by1mb3JtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdvdG9QYWdlSW5wdXQsXG4gICAgICAgICAgICBnb3RvUGFnZVN1Ym1pdCxcbiAgICAgICAgICAgIGlucHV0U3VnZ2VzdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICBnb3RvRm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZSkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBkZXNpcmVkUGFnZUxhYmVsID0gZ290b1BhZ2VJbnB1dC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3Mub25Hb3RvU3VibWl0ICYmIHR5cGVvZiB0aGlzLnNldHRpbmdzLm9uR290b1N1Ym1pdCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IHRoaXMuc2V0dGluZ3Mub25Hb3RvU3VibWl0KGRlc2lyZWRQYWdlTGFiZWwpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy52aWV3ZXIuZ290b1BhZ2VCeUluZGV4KHBhZ2VJbmRleCkpXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChcIk5vIHBhZ2UgY291bGQgYmUgZm91bmQgd2l0aCB0aGF0IGxhYmVsIG9yIHBhZ2UgbnVtYmVyXCIpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIC8vIERlZmF1bHQgaWYgbm8gZnVuY3Rpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBzZXR0aW5nc1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy52aWV3ZXIuZ290b1BhZ2VCeUxhYmVsKGRlc2lyZWRQYWdlTGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXCJObyBwYWdlIGNvdWxkIGJlIGZvdW5kIHdpdGggdGhhdCBsYWJlbCBvciBwYWdlIG51bWJlclwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGlkZSB0aGUgc3VnZ2VzdGlvbnNcbiAgICAgICAgICAgIGlucHV0U3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgLy8gUHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgcmVsb2FkaW5nIHRoZSBwYWdlXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFsnaW5wdXQnLCAnZm9jdXMnXS5mb3JFYWNoKGV2ZW50ID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGdvdG9QYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0U3VnZ2VzdGlvbnMuaW5uZXJIVE1MID0gJyc7IC8vIFJlbW92ZSBhbGwgcHJldmlvdXMgc3VnZ2VzdGlvbnNcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ290b1BhZ2VJbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtU3VnZ2VzdGlvbnMgPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmVuYWJsZUdvdG9TdWdnZXN0aW9ucyAmJiB2YWx1ZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlcztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aDsgaSA8IGxlbiAmJiBudW1TdWdnZXN0aW9ucyA8IDEwOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlc1tpXS5sLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih2YWx1ZS50b0xvd2VyQ2FzZSgpKSA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0lucHV0U3VnZ2VzdGlvbiA9IGVsdCgnZGl2Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdkaXZhLWlucHV0LXN1Z2dlc3Rpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VzW2ldLmxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdWdnZXN0aW9ucy5hcHBlbmRDaGlsZChuZXdJbnB1dFN1Z2dlc3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3cgbGFiZWwgc3VnZ2VzdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN1Z2dlc3Rpb25zID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRTdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGdvdG9QYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4ge1xuICAgICAgICAgICAgbGV0IGVsO1xuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIC8vICdFbnRlcicga2V5XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWN0aXZlJylbMF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3RpdmUgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgICAgICBnb3RvUGFnZUlucHV0LnZhbHVlID0gYWN0aXZlLmlubmVyVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDM4KSAvLyBVcCBhcnJvdyBrZXlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FjdGl2ZScpWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZFbCA9IGVsID8gZWwucHJldmlvdXNTaWJsaW5nIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJldkVsICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldkVsICE9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkVsLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RpdmEtaW5wdXQtc3VnZ2VzdGlvbicpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RpdmEtaW5wdXQtc3VnZ2VzdGlvbicpW2xhc3RdLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gNDApIC8vIERvd24gYXJyb3cga2V5XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhY3RpdmUnKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWwgPSBlbCA/IGVsLm5leHRTaWJsaW5nIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmV4dEVsICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVsICE9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkaXZhLWlucHV0LXN1Z2dlc3Rpb24nKVswXS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uRXZlbnQoaW5wdXRTdWdnZXN0aW9ucywgJ21vdXNlZG93bicsICcuZGl2YS1pbnB1dC1zdWdnZXN0aW9uJywgZnVuY3Rpb24gKClcbiAgICAgICAge1xuICAgICAgICAgICAgZ290b1BhZ2VJbnB1dC52YWx1ZSA9IHRoaXMudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICBpbnB1dFN1Z2dlc3Rpb25zLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBsZXQgc3VibWl0RXZlbnQgPSBuZXcgRXZlbnQoJ3N1Ym1pdCcsIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGdvdG9Gb3JtLmRpc3BhdGNoRXZlbnQoc3VibWl0RXZlbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBqYXZhc2NyaXB0IGVxdWl2YWxlbnQgdG8ganF1ZXJ5IC5vbihldmVudCwgc2VsZWN0b3IsIGZ1bmN0aW9uKVxuICAgICAgICBmdW5jdGlvbiBvbkV2ZW50IChlbGVtLCBldnQsIHNlbCwgaGFuZGxlcilcbiAgICAgICAge1xuICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2dCwgZnVuY3Rpb24gKGV2ZW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHdoaWxlICh0ICYmIHQgIT09IHRoaXMpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodC5tYXRjaGVzKHNlbCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0ID0gdC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ290b1BhZ2VJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gSGlkZSBsYWJlbCBzdWdnZXN0aW9uc1xuICAgICAgICAgICAgaW5wdXRTdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZ290b0Zvcm07XG4gICAgfVxuXG4gICAgY3JlYXRlVmlld01lbnUgKClcbiAgICB7XG4gICAgICAgIGNvbnN0IHZpZXdPcHRpb25zTGlzdCA9IGVsdCgnZGl2JywgdGhpcy5fZWxlbUF0dHJzKCd2aWV3LW9wdGlvbnMnKSk7XG4gICAgICAgIGNvbnN0IGdyaWRWaWV3SWNvbiA9IHRoaXMuX2NyZWF0ZUdyaWRWaWV3SWNvbigpO1xuICAgICAgICBjb25zdCBib29rVmlld0ljb24gPSB0aGlzLl9jcmVhdGVCb29rVmlld0ljb24oKTtcbiAgICAgICAgY29uc3QgcGFnZVZpZXdJY29uID0gdGhpcy5fY3JlYXRlUGFnZVZpZXdJY29uKCk7XG5cbiAgICAgICAgY29uc3Qgdmlld09wdGlvbnNUb2dnbGUgPSAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB2aWV3T3B0aW9uc0xpc3Quc3R5bGUuZGlzcGxheSA9IHZpZXdPcHRpb25zTGlzdC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiYmxvY2tcIiA6IFwibm9uZVwiO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNoYW5nZVZpZXdCdXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbigndmlldy1pY29uJywgJ0NoYW5nZSB2aWV3Jywgdmlld09wdGlvbnNUb2dnbGUpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdFZpZXcgPSAodmlldykgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXIuY2hhbmdlVmlldyh2aWV3KTtcblxuICAgICAgICAgICAgLy9oaWRlIHZpZXcgbWVudVxuICAgICAgICAgICAgdmlld09wdGlvbnNMaXN0LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVWaWV3TWVudSA9ICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdJY29uQ2xhc3NlcyA9ICcgZGl2YS12aWV3LWljb24gZGl2YS1idXR0b24nO1xuXG5cbiAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIGljb24gb2YgdGhlIG1vZGUgd2UncmUgY3VycmVudGx5IGluICg/KVxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuaW5HcmlkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNoYW5nZVZpZXdCdXR0b24uYXBwZW5kQ2hpbGQoZ3JpZFZpZXdJY29uKTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWV3QnV0dG9uLmNsYXNzTmFtZSA9ICdkaXZhLWdyaWQtaWNvbicgKyB2aWV3SWNvbkNsYXNzZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNldHRpbmdzLmluQm9va0xheW91dClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWV3QnV0dG9uLmFwcGVuZENoaWxkKGJvb2tWaWV3SWNvbik7XG4gICAgICAgICAgICAgICAgY2hhbmdlVmlld0J1dHRvbi5jbGFzc05hbWUgPSAnZGl2YS1ib29rLWljb24nICsgdmlld0ljb25DbGFzc2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNoYW5nZVZpZXdCdXR0b24uYXBwZW5kQ2hpbGQocGFnZVZpZXdJY29uKTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWV3QnV0dG9uLmNsYXNzTmFtZSA9ICdkaXZhLWRvY3VtZW50LWljb24nICsgdmlld0ljb25DbGFzc2VzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2aWV3T3B0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgICAgICAgICAgLy8gdGhlbiBkaXNwbGF5IGRvY3VtZW50LCBib29rLCBhbmQgZ3JpZCBidXR0b25zIGluIHRoYXQgb3JkZXIsIGV4Y2x1ZGluZyB0aGUgY3VycmVudCB2aWV3XG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkdyaWQgfHwgdGhpcy5zZXR0aW5ncy5pbkJvb2tMYXlvdXQpXG4gICAgICAgICAgICAgICAgdmlld09wdGlvbnMuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVCdXR0b24oJ2RvY3VtZW50LWljb24nLCAnRG9jdW1lbnQgVmlldycsIHNlbGVjdFZpZXcuYmluZChudWxsLCAnZG9jdW1lbnQnKSwgcGFnZVZpZXdJY29uKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmluR3JpZCB8fCAhdGhpcy5zZXR0aW5ncy5pbkJvb2tMYXlvdXQpXG4gICAgICAgICAgICAgICAgdmlld09wdGlvbnMuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVCdXR0b24oJ2Jvb2staWNvbicsICdCb29rIFZpZXcnLCBzZWxlY3RWaWV3LmJpbmQobnVsbCwgJ2Jvb2snKSwgYm9va1ZpZXdJY29uKSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgICAgICAgICAgdmlld09wdGlvbnMuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVCdXR0b24oJ2dyaWQtaWNvbicsICdHcmlkIFZpZXcnLCBzZWxlY3RWaWV3LmJpbmQobnVsbCwgJ2dyaWQnKSwgZ3JpZFZpZXdJY29uKSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgbWVudVxuICAgICAgICAgICAgd2hpbGUgKHZpZXdPcHRpb25zTGlzdC5maXJzdENoaWxkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZpZXdPcHRpb25zTGlzdC5yZW1vdmVDaGlsZCh2aWV3T3B0aW9uc0xpc3QuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluc2VydCBuZXcgbWVudVxuICAgICAgICAgICAgdmlld09wdGlvbnNMaXN0LmFwcGVuZENoaWxkKHZpZXdPcHRpb25zKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZXZlbnQgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHZpZXdPcHRpb25zTGlzdCAhPT0gZXZlbnQudGFyZ2V0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZpZXdPcHRpb25zTGlzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoJ1ZpZXdEaWRTd2l0Y2gnLCB1cGRhdGVWaWV3TWVudSk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgnT2JqZWN0RGlkTG9hZCcsIHVwZGF0ZVZpZXdNZW51KTtcblxuICAgICAgICByZXR1cm4gZWx0KCdkaXYnLCB0aGlzLl9lbGVtQXR0cnMoJ3ZpZXctbWVudScpLFxuICAgICAgICAgICAgY2hhbmdlVmlld0J1dHRvbixcbiAgICAgICAgICAgIHZpZXdPcHRpb25zTGlzdFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNyZWF0ZUZ1bGxzY3JlZW5CdXR0b24gKClcbiAgICB7XG4gICAgICAgIGxldCBmdWxsc2NyZWVuSWNvbiA9IHRoaXMuX2NyZWF0ZUZ1bGxzY3JlZW5JY29uKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKCdmdWxsc2NyZWVuLWljb24nLCAnVG9nZ2xlIGZ1bGxzY3JlZW4gbW9kZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyLnRvZ2dsZUZ1bGxzY3JlZW5Nb2RlKCk7XG4gICAgICAgIH0sIGZ1bGxzY3JlZW5JY29uKTtcbiAgICB9XG5cbiAgICB0b2dnbGVab29tR3JpZENvbnRyb2xzICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuaW5HcmlkKVxuICAgICAgICB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLklEICsgXCJ6b29tLWNvbnRyb2xzXCIpLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLklEICsgXCJncmlkLWNvbnRyb2xzXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3MuSUQgKyBcInpvb20tY29udHJvbHNcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5JRCArIFwiZ3JpZC1jb250cm9sc1wiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZW5kZXIgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZShcIlZpZXdEaWRTd2l0Y2hcIiwgdGhpcy50b2dnbGVab29tR3JpZENvbnRyb2xzKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKFwiT2JqZWN0RGlkTG9hZFwiLCB0aGlzLnRvZ2dsZVpvb21HcmlkQ29udHJvbHMpO1xuXG4gICAgICAgIGxldCBsZWZ0VG9vbHMgPSBbXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVpvb21CdXR0b25zKCksXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyaWRDb250cm9scygpXG4gICAgICAgIF07XG4gICAgICAgIGxldCByaWdodFRvb2xzID0gW1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVQYWdlTGFiZWwoKSxcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVmlld01lbnUoKVxuICAgICAgICBdO1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVGdWxsc2NyZWVuKVxuICAgICAgICAgICAgcmlnaHRUb29scy5wdXNoKHRoaXMuY3JlYXRlRnVsbHNjcmVlbkJ1dHRvbigpKTtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlR290b1BhZ2UpXG4gICAgICAgICAgICByaWdodFRvb2xzLnNwbGljZSgxLCAwLCB0aGlzLmNyZWF0ZUdvdG9QYWdlRm9ybSgpKTtcblxuICAgICAgICAvLyBhc3NpZ24gdG9vbGJhciBwbHVnaW5zIHRvIHByb3BlciBzaWRlXG4gICAgICAgIGxldCBwbHVnaW5zID0gdGhpcy52aWV3ZXIudmlld2VyU3RhdGUucGx1Z2luSW5zdGFuY2VzO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGx1Z2lucy5sZW5ndGg7IGkgPCBsZW47IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnNbaV07XG5cbiAgICAgICAgICAgIGlmICghcGx1Z2luLnRvb2xiYXJTaWRlKSAvLyBub3QgYSB0b29sYmFyIHRvb2xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgcGx1Z2luLnRvb2xiYXJJY29uID0gcGx1Z2luLmNyZWF0ZUljb24oKTtcbiAgICAgICAgICAgIGlmICghcGx1Z2luLnRvb2xiYXJJY29uKSAvLyBpY29uIGNvdWxkbid0IGJlIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gYWRkIHBsdWdpbiB0b29scyBhZnRlciB0aGUgZ28tdG8tcGFnZSBhbmQgcGFnZS1sYWJlbCB0b29sc1xuICAgICAgICAgICAgaWYgKHBsdWdpbi50b29sYmFyU2lkZSA9PT0gJ3JpZ2h0JylcbiAgICAgICAgICAgICAgICByaWdodFRvb2xzLnNwbGljZSgyLCAwLCBwbHVnaW4udG9vbGJhckljb24pO1xuICAgICAgICAgICAgZWxzZSBpZiAocGx1Z2luLnRvb2xiYXJTaWRlID09PSAnbGVmdCcpXG4gICAgICAgICAgICAgICAgbGVmdFRvb2xzLnNwbGljZSgyLCAwLCBwbHVnaW4udG9vbGJhckljb24pO1xuXG4gICAgICAgICAgICBwbHVnaW4udG9vbGJhckljb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVQbHVnaW5DbGljay5iaW5kKHRoaXMsIHBsdWdpbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUGx1Z2luQ2xpY2sgKHBsdWdpbilcbiAgICAgICAge1xuICAgICAgICAgICAgcGx1Z2luLmhhbmRsZUNsaWNrKHRoaXMudmlld2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvb2xzID0gZWx0KCdkaXYnLCB0aGlzLl9lbGVtQXR0cnMoJ3Rvb2xzJyksXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgdGhpcy5fZWxlbUF0dHJzKCd0b29scy1sZWZ0JyksIGxlZnRUb29scyksXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgdGhpcy5fZWxlbUF0dHJzKCd0b29scy1yaWdodCcpLCByaWdodFRvb2xzKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXR0aW5ncy50b29sYmFyUGFyZW50T2JqZWN0Lmluc2VydEJlZm9yZShcbiAgICAgICAgICAgIHRvb2xzLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy50b29sYmFyUGFyZW50T2JqZWN0LmZpcnN0Q2hpbGRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlVG9vbGJhckljb24gKHBhdGhzKVxuICAgIHtcbiAgICAgICAgbGV0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInN2Z1wiKTtcbiAgICAgICAgaWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAndmlld0JveCcsIFwiMCAwIDI1IDI1XCIpO1xuICAgICAgICBpY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd4JywgJzBweCcpO1xuICAgICAgICBpY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd5JywgJzBweCcpO1xuICAgICAgICBpY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICdzdHlsZScsIFwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0OCA0ODtcIik7XG5cbiAgICAgICAgbGV0IGdseXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgICAgICBnbHlwaC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBcIm1hdHJpeCgxLCAwLCAwLCAxLCAtMTIsIC0xMilcIik7XG5cbiAgICAgICAgcGF0aHMuZm9yRWFjaCggKHBhdGgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgICAgICAgICBwRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIHBhdGgpO1xuICAgICAgICAgICAgZ2x5cGguYXBwZW5kQ2hpbGQocEVsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWNvbi5hcHBlbmRDaGlsZChnbHlwaCk7XG4gICAgICAgIHJldHVybiBpY29uO1xuICAgIH1cblxuICAgIF9jcmVhdGVab29tT3V0SWNvbiAoKVxuICAgIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW1xuICAgICAgICAgICAgXCJNMTkuNSwyM2MtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtMWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDdjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXYxYzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMTkuNXpcIixcbiAgICAgICAgICAgIFwiTTM3LjIxOSwzNC4yNTdsLTIuMjEzLDIuMjEyYy0wLjIwMiwwLjIwMi0wLjUzNCwwLjIwMi0wLjczNiwwbC02LjA5OC02LjA5OWMtMS41MzcsMC45OTMtMy4zNjIsMS41NzctNS4zMjMsMS41NzdjLTUuNDMxLDAtOS44NDktNC40MTgtOS44NDktOS44NDljMC01LjQzMSw0LjQxOC05Ljg0OSw5Ljg0OS05Ljg0OWM1LjQzMSwwLDkuODQ5LDQuNDE4LDkuODQ5LDkuODQ5YzAsMS45NjEtMC41ODQsMy43ODYtMS41NzYsNS4zMjNsNi4wOTgsNi4wOThDMzcuNDIyLDMzLjcyMiwzNy40MjIsMzQuMDU0LDM3LjIxOSwzNC4yNTd6IE0yOS41NjgsMjIuMDk5YzAtMy43MDYtMy4wMTQtNi43Mi02LjcyLTYuNzJjLTMuNzA2LDAtNi43MiwzLjAxNC02LjcyLDYuNzJjMCwzLjcwNiwzLjAxNCw2LjcyLDYuNzIsNi43MkMyNi41NTUsMjguODE4LDI5LjU2OCwyNS44MDUsMjkuNTY4LDIyLjA5OXpcIlxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVUb29sYmFySWNvbihwYXRocyk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVpvb21Jbkljb24gKClcbiAgICB7XG4gICAgICAgIGxldCBwYXRocyA9IFtcbiAgICAgICAgICAgIFwiTTM3LjQ2OSwzNC4yNTdsLTIuMjEzLDIuMjEyYy0wLjIwMiwwLjIwMi0wLjUzNCwwLjIwMi0wLjczNiwwbC02LjA5OC02LjA5OWMtMS41MzcsMC45OTMtMy4zNjIsMS41NzctNS4zMjMsMS41NzdjLTUuNDMxLDAtOS44NDktNC40MTgtOS44NDktOS44NDljMC01LjQzMSw0LjQxOC05Ljg0OSw5Ljg0OS05Ljg0OWM1LjQzMSwwLDkuODQ5LDQuNDE4LDkuODQ5LDkuODQ5YzAsMS45NjEtMC41ODQsMy43ODYtMS41NzYsNS4zMjNsNi4wOTgsNi4wOThDMzcuNjcyLDMzLjcyMiwzNy42NzIsMzQuMDU0LDM3LjQ2OSwzNC4yNTd6IE0yOS44MTgsMjIuMDk5YzAtMy43MDYtMy4wMTQtNi43Mi02LjcyLTYuNzJjLTMuNzA2LDAtNi43MiwzLjAxNC02LjcyLDYuNzJjMCwzLjcwNiwzLjAxNCw2LjcyLDYuNzIsNi43MkMyNi44MDUsMjguODE4LDI5LjgxOCwyNS44MDUsMjkuODE4LDIyLjA5OXogTTI2LjUsMjFIMjR2LTIuNWMwLTAuMjc1LTAuMjI1LTAuNS0wLjUtMC41aC0xYy0wLjI3NSwwLTAuNSwwLjIyNS0wLjUsMC41VjIxaC0yLjVjLTAuMjc1LDAtMC41LDAuMjI1LTAuNSwwLjV2MWMwLDAuMjc1LDAuMjI1LDAuNSwwLjUsMC41SDIydjIuNWMwLDAuMjc1LDAuMjI1LDAuNSwwLjUsMC41aDFjMC4yNzUsMCwwLjUtMC4yMjUsMC41LTAuNVYyM2gyLjVjMC4yNzUsMCwwLjUtMC4yMjUsMC41LTAuNXYtMUMyNywyMS4yMjUsMjYuNzc1LDIxLDI2LjUsMjF6XCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVRvb2xiYXJJY29uKHBhdGhzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlR3JpZE1vcmVJY29uICgpXG4gICAge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXG4gICAgICAgICAgICBcIk0yOS41LDM1Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyOS41eiBNMjEuNSwzNWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjEuNXogTTEzLjUsMzVjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDEzLjV6IE0yOS41LDI3Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyOS41eiBNMjEuNSwyN2MtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjEuNXogTTEzLjUsMjdjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDEzLjV6IE0yOS41LDE5Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyOS41eiBNMjEuNSwxOWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjEuNXogTTEzLjUsMTljLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDEzLjV6XCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVRvb2xiYXJJY29uKHBhdGhzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlR3JpZEZld2VySWNvbiAoKVxuICAgIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW1xuICAgICAgICAgICAgXCJNMjUuNSwzNWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtOWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDljMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY5YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjUuNXogTTIyLjUsMzVjMC4yNzUsMCwwLjUtMC4yMjUsMC41LTAuNXYtOWMwLTAuMjc1LTAuMjI1LTAuNS0wLjUtMC41aC05Yy0wLjI3NSwwLTAuNSwwLjIyNS0wLjUsMC41djljMCwwLjI3NSwwLjIyNSwwLjUsMC41LDAuNUgyMi41eiBNMzQuNSwyM2MwLjI3NSwwLDAuNS0wLjIyNSwwLjUtMC41di05YzAtMC4yNzUtMC4yMjUtMC41LTAuNS0wLjVoLTljLTAuMjc1LDAtMC41LDAuMjI1LTAuNSwwLjV2OWMwLDAuMjc1LDAuMjI1LDAuNSwwLjUsMC41SDM0LjV6IE0yMi41LDIzYzAuMjc1LDAsMC41LTAuMjI1LDAuNS0wLjV2LTljMC0wLjI3NS0wLjIyNS0wLjUtMC41LTAuNWgtOWMtMC4yNzUsMC0wLjUsMC4yMjUtMC41LDAuNXY5YzAsMC4yNzUsMC4yMjUsMC41LDAuNSwwLjVIMjIuNXpcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVG9vbGJhckljb24ocGF0aHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVHcmlkVmlld0ljb24gKClcbiAgICB7XG4gICAgICAgIGxldCBwYXRocyA9IFtcbiAgICAgICAgICAgIFwiTTI5LjUsMzVjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDI5LjV6IE0yMS41LDM1Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyMS41eiBNMTMuNSwzNWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMTMuNXogTTI5LjUsMjdjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDI5LjV6IE0yMS41LDI3Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyMS41eiBNMTMuNSwyN2MtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMTMuNXogTTI5LjUsMTljLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDI5LjV6IE0yMS41LDE5Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyMS41eiBNMTMuNSwxOWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMTMuNXpcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVG9vbGJhckljb24ocGF0aHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVCb29rVmlld0ljb24gKClcbiAgICB7XG4gICAgICAgIGxldCBwYXRocyA9IFtcbiAgICAgICAgICAgIFwiTTM1LDE2Ljh2LTEuMzIzYzAsMC0yLjI5Mi0xLjMyOC01Ljc0LTEuMzI4Yy0zLjQ0OCwwLTUuMjYsMS4yNS01LjI2LDEuMjVzLTEuODEzLTEuMjUtNS4yNi0xLjI1Yy0zLjQ0OCwwLTUuNzQsMS4zMjgtNS43NCwxLjMyOFYxNi44bC0xLDAuNTMxdjAuMDIxdjE1LjY4N2MwLDAsNC41MzEtMS41NzgsNi45OTktMS41NzhjMi40NjgsMCw1LjAwMSwwLjg4NSw1LjAwMSwwLjg4NXMyLjUzMi0wLjg4NSw1LTAuODg1YzAuMzA2LDAsMC42NDMsMC4wMjQsMSwwLjA2NnY0LjMyNWwxLjUzMS0yLjAxNkwzMywzNS44NTJ2LTMuNzJjMiwwLjQzLDMsMC45MDYsMywwLjkwNlYxNy4zNTJ2LTAuMDIxTDM1LDE2Ljh6IE0yMywyOS4wM2MtMS0wLjI5Mi0yLjU4NC0wLjY3OS0zLjk4MS0wLjY3OWMtMi4yNDYsMC0zLjAxOSwwLjQwNC00LjAxOSwwLjY5OVYxNi42MzRjMCwwLDEuMTI1LTAuNjk5LDQuMDE5LTAuNjk5YzEuNjk0LDAsMi45ODEsMC40MTcsMy45ODEsMS4xMjZWMjkuMDN6IE0zMywyOS4wNTFjLTEtMC4yOTUtMS43NzMtMC42OTktNC4wMi0wLjY5OWMtMS4zOTYsMC0yLjk4MSwwLjM4Ny0zLjk4LDAuNjc5VjE3LjA2YzEtMC43MDksMi4yODYtMS4xMjYsMy45OC0xLjEyNmMyLjg5NSwwLDQuMDIsMC42OTksNC4wMiwwLjY5OVYyOS4wNTF6XCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVRvb2xiYXJJY29uKHBhdGhzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlUGFnZVZpZXdJY29uICgpXG4gICAge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXG4gICAgICAgICAgICBcIk0yOS40MjUsMjloNC40N0wyOSwzMy45MzR2LTQuNDdDMjksMjkuMTksMjkuMTUxLDI5LDI5LjQyNSwyOXogTTM0LDE0LjU2M1YyOGgtNS41NjlDMjguMTU3LDI4LDI4LDI4LjE5NiwyOCwyOC40N1YzNEgxNC40OTdDMTQuMjIzLDM0LDE0LDMzLjcxLDE0LDMzLjQzN1YxNC41NjNDMTQsMTQuMjksMTQuMjIzLDE0LDE0LjQ5NywxNGgxOC45QzMzLjY3MiwxNCwzNCwxNC4yOSwzNCwxNC41NjN6IE0yNS40OTcsMjYuNDk3QzI1LjQ5NywyNi4yMjMsMjUuMjc1LDI2LDI1LDI2aC03Yy0wLjI3NSwwLTAuNDk3LDAuMjIzLTAuNDk3LDAuNDk3djEuMDA2QzE3LjUwMywyNy43NzcsMTcuNzI1LDI4LDE4LDI4aDdjMC4yNzUsMCwwLjQ5Ny0wLjIyMywwLjQ5Ny0wLjQ5N1YyNi40OTd6IE0zMC40OTcsMjIuNDk3QzMwLjQ5NywyMi4yMjMsMzAuMjc1LDIyLDMwLDIySDE4Yy0wLjI3NSwwLTAuNDk3LDAuMjIzLTAuNDk3LDAuNDk3djEuMDA2QzE3LjUwMywyMy43NzcsMTcuNzI1LDI0LDE4LDI0aDEyYzAuMjc1LDAsMC40OTctMC4yMjMsMC40OTctMC40OTdWMjIuNDk3eiBNMzAuNDk3LDE4LjQ5N0MzMC40OTcsMTguMjIzLDMwLjI3NSwxOCwzMCwxOEgxOGMtMC4yNzUsMC0wLjQ5NywwLjIyMy0wLjQ5NywwLjQ5N3YxLjAwNkMxNy41MDMsMTkuNzc3LDE3LjcyNSwyMCwxOCwyMGgxMmMwLjI3NSwwLDAuNDk3LTAuMjIzLDAuNDk3LTAuNDk3VjE4LjQ5N3pcIlxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVUb29sYmFySWNvbihwYXRocyk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUZ1bGxzY3JlZW5JY29uICgpXG4gICAge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXG4gICAgICAgICAgICBcIk0zNSwxMkgxM2MtMC41NSwwLTEsMC40NS0xLDF2MjJjMCwwLjU1LDAuNDUsMSwxLDFoMjJjMC41NSwwLDEtMC40NSwxLTFWMTNDMzYsMTIuNDUsMzUuNTUsMTIsMzUsMTJ6IE0zNCwzNEgxNFYxNGgyMFYzNHpcIixcbiAgICAgICAgICAgIFwiTTE3LDIxLjc1di00LjVjMC0wLjEzOCwwLjExMi0wLjI1LDAuMjUtMC4yNWg0LjVjMC4xMzgsMCwwLjE3LDAuMDgsMC4wNzMsMC4xNzdsLTEuNjE2LDEuNjE2bDEuODIzLDEuODIzYzAuMDk3LDAuMDk3LDAuMDk3LDAuMjU2LDAsMC4zNTRsLTEuMDYxLDEuMDZjLTAuMDk3LDAuMDk3LTAuMjU2LDAuMDk3LTAuMzU0LDBsLTEuODIzLTEuODIzbC0xLjYxNiwxLjYxNkMxNy4wOCwyMS45MiwxNywyMS44ODgsMTcsMjEuNzV6IE0yMC45NywyNS45N2MtMC4wOTctMC4wOTctMC4yNTYtMC4wOTctMC4zNTQsMGwtMS44MjMsMS44MjNsLTEuNjE2LTEuNjE2QzE3LjA4LDI2LjA4LDE3LDI2LjExMiwxNywyNi4yNXY0LjVjMCwwLjEzOCwwLjExMiwwLjI1LDAuMjUsMC4yNWg0LjVjMC4xMzgsMCwwLjE3LTAuMDgsMC4wNzMtMC4xNzdsLTEuNjE2LTEuNjE2bDEuODIzLTEuODIzYzAuMDk3LTAuMDk3LDAuMDk3LTAuMjU2LDAtMC4zNTRMMjAuOTcsMjUuOTd6IE0zMC43NSwxN2gtNC41Yy0wLjEzOCwwLTAuMTcsMC4wOC0wLjA3MywwLjE3N2wxLjYxNiwxLjYxNmwtMS44MjMsMS44MjNjLTAuMDk3LDAuMDk3LTAuMDk3LDAuMjU2LDAsMC4zNTRsMS4wNjEsMS4wNmMwLjA5NywwLjA5NywwLjI1NiwwLjA5NywwLjM1NCwwbDEuODIzLTEuODIzbDEuNjE2LDEuNjE2QzMwLjkyLDIxLjkyLDMxLDIxLjg4OCwzMSwyMS43NXYtNC41QzMxLDE3LjExMiwzMC44ODgsMTcsMzAuNzUsMTd6IE0zMC44MjMsMjYuMTc3bC0xLjYxNiwxLjYxNmwtMS44MjMtMS44MjNjLTAuMDk3LTAuMDk3LTAuMjU2LTAuMDk3LTAuMzU0LDBsLTEuMDYxLDEuMDZjLTAuMDk3LDAuMDk3LTAuMDk3LDAuMjU2LDAsMC4zNTRsMS44MjMsMS44MjNsLTEuNjE2LDEuNjE2QzI2LjA4LDMwLjkyLDI2LjExMiwzMSwyNi4yNSwzMWg0LjVjMC4xMzgsMCwwLjI1LTAuMTEyLDAuMjUtMC4yNXYtNC41QzMxLDI2LjExMiwzMC45MiwyNi4wOCwzMC44MjMsMjYuMTc3eiBNMjYsMjIuNWMwLTAuMjc1LTAuMjI1LTAuNS0wLjUtMC41aC0zYy0wLjI3NSwwLTAuNSwwLjIyNS0wLjUsMC41djNjMCwwLjI3NSwwLjIyNSwwLjUsMC41LDAuNWgzYzAuMjc1LDAsMC41LTAuMjI1LDAuNS0wLjVWMjIuNXpcIlxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVUb29sYmFySWNvbihwYXRocyk7XG4gICAgfVxufVxuIiwibGV0IEhhc2hQYXJhbXMgPSB7XG4gICAgZ2V0OiBnZXRIYXNoUGFyYW0sXG4gICAgdXBkYXRlOiB1cGRhdGVIYXNoUGFyYW1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEhhc2hQYXJhbXM7XG5cblxuLy8gRm9yIGdldHRpbmcgdGhlICNrZXkgdmFsdWVzIGZyb20gdGhlIFVSTC4gRm9yIHNwZWNpZnlpbmcgYSBwYWdlIGFuZCB6b29tIGxldmVsXG4vLyBMb29rIGludG8gY2FjaGluZywgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdG8gZ2V0IHRoaXMgZHVyaW5nIHRoZSBpbml0aWFsIGxvYWRcbi8vIEFsdGhvdWdoIGZvciB0aGUgdGVzdHMgSSBndWVzcyB3ZSB3b3VsZCBuZWVkIHRvIG92ZXJyaWRlIGNhY2hpbmcgc29tZWhvd1xuZnVuY3Rpb24gZ2V0SGFzaFBhcmFtIChrZXkpXG57XG4gICAgY29uc3QgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXG4gICAgaWYgKGhhc2ggIT09ICcnKVxuICAgIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBlaXRoZXIgJmtleT0gb3IgI2tleT1cbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAoaGFzaC5pbmRleE9mKCcmJyArIGtleSArICc9JykgPiAwKSA/IGhhc2guaW5kZXhPZignJicgKyBrZXkgKyAnPScpIDogaGFzaC5pbmRleE9mKCcjJyArIGtleSArICc9Jyk7XG5cbiAgICAgICAgLy8gSWYgc3RhcnRJbmRleCBpcyBzdGlsbCAtMSwgaXQgbWVhbnMgaXQgY2FuJ3QgZmluZCBlaXRoZXJcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPj0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSBsZW5ndGggb2YgdGhlIGtleSBwbHVzIHRoZSAmIGFuZCA9XG4gICAgICAgICAgICBzdGFydEluZGV4ICs9IGtleS5sZW5ndGggKyAyO1xuXG4gICAgICAgICAgICAvLyBFaXRoZXIgdG8gdGhlIG5leHQgYW1wZXJzYW5kIG9yIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZ1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBoYXNoLmluZGV4T2YoJyYnLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgIGlmIChlbmRJbmRleCA+IHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoYXNoLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW5kSW5kZXggPCAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhpcyBoYXNoIHBhcmFtIGlzIHRoZSBsYXN0IG9uZVxuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGFzaC5zdWJzdHJpbmcoc3RhcnRJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIGtleSBkb2Vzbid0IGhhdmUgYSB2YWx1ZSBJIHRoaW5rXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBJZiBpdCBjYW4ndCBmaW5kIHRoZSBrZXlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaGFzaCBwYXJhbXMganVzdCByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSGFzaFBhcmFtIChrZXksIHZhbHVlKVxue1xuICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55IHdvcmsgYXQgYWxsXG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IGdldEhhc2hQYXJhbShrZXkpO1xuICAgIGNvbnN0IGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcblxuICAgIGlmIChvcmlnaW5hbFZhbHVlICE9PSB2YWx1ZSlcbiAgICB7XG4gICAgICAgIC8vIElzIHRoZSBrZXkgYWxyZWFkeSBpbiB0aGUgVVJMP1xuICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsVmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGluIHRoZSBVUkwuIEp1c3QgZ2V0IHJpZCBvZiB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoaGFzaC5pbmRleE9mKCcmJyArIGtleSArICc9JykgPiAwKSA/IGhhc2guaW5kZXhPZignJicgKyBrZXkgKyAnPScpIDogaGFzaC5pbmRleE9mKCcjJyArIGtleSArICc9Jyk7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBrZXkubGVuZ3RoICsgMiArIG9yaWdpbmFsVmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgLy8gIyBpZiBpdCdzIHRoZSBmaXJzdCwgJiBvdGhlcndpc2VcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGhpbmcgPSAoc3RhcnRJbmRleCA9PT0gMCkgPyAnIycgOiAnJic7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShoYXNoLnN1YnN0cmluZygwLCBzdGFydEluZGV4KSArIHN0YXJ0VGhpbmcgKyBrZXkgKyAnPScgKyB2YWx1ZSArIGhhc2guc3Vic3RyaW5nKGVuZEluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBJdCdzIG5vdCBwcmVzZW50IC0gYWRkIGl0XG4gICAgICAgICAgICBpZiAoaGFzaC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoJyMnICsga2V5ICsgJz0nICsgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBpdFxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGhhc2ggKyAnJicgKyBrZXkgKyAnPScgKyB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgJy4vdXRpbHMvdmFuaWxsYS5raW5ldGljJztcbmltcG9ydCAnLi91dGlscy9kcmFnc2Nyb2xsJztcbmltcG9ydCB7IGVsdCB9IGZyb20gXCIuL3V0aWxzL2VsdFwiO1xuaW1wb3J0IHtcbiAgICBEaXZhUGFyZW50RWxlbWVudE5vdEZvdW5kRXhjZXB0aW9uLFxuICAgIE5vdEFuSUlJRk1hbmlmZXN0RXhjZXB0aW9uLFxuICAgIE9iamVjdERhdGFOb3RTdXBwbGllZEV4Y2VwdGlvblxufSBmcm9tIFwiLi9leGNlcHRpb25zXCI7XG5pbXBvcnQgZGl2YSBmcm9tIFwiLi9kaXZhLWdsb2JhbFwiO1xuaW1wb3J0IFZpZXdlckNvcmUgZnJvbSBcIi4vdmlld2VyLWNvcmVcIjtcbmltcG9ydCBJbWFnZU1hbmlmZXN0IGZyb20gXCIuL2ltYWdlLW1hbmlmZXN0XCI7XG5pbXBvcnQgVG9vbGJhciBmcm9tIFwiLi90b29sYmFyXCI7XG5pbXBvcnQgSGFzaFBhcmFtcyBmcm9tIFwiLi91dGlscy9oYXNoLXBhcmFtc1wiO1xuXG5cbi8qKlxuICogVGhlIHRvcC1sZXZlbCBjbGFzcyBmb3IgRGl2YSBvYmplY3RzLiBUaGlzIGlzIGluc3RhbnRpYXRlZCBieSBwYXNzaW5nIGluIGFuIEhUTUwgZWxlbWVudFxuICogSUQgb3IgSFRNTCBFbGVtZW50IG5vZGUgYW5kIGFuIG9iamVjdCBjb250YWluaW5nIGEgbGlzdCBvZiBvcHRpb25zLCBvZiB3aGljaCB0aGUgJ29iamVjdERhdGEnXG4gKiBvcHRpb24gaXMgcmVxdWlyZWQgYW5kIHdoaWNoIG11c3QgcG9pbnQgdG8gYSBJSUlGIFByZXNlbnRhdGlvbiBBUEkgTWFuaWZlc3Q6XG4gKlxuICogdmFyIGRpdmEgPSBuZXcgRGl2YSgnZWxlbWVudC1pZCcsIHtcbiAqICAgICBvYmplY3REYXRhOiBcImh0dHA6Ly9leGFtcGxlLmNvbS9paWlmLW1hbmlmZXN0Lmpzb25cIlxuICogfSk7XG4gKlxuICogVGhpcyBjbGFzcyBhbHNvIHNlcnZlcyBhcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBFdmVudHMgc3lzdGVtLCBpbiB3aGljaCBhcHBsaWNhdGlvbnMgY2FuIHN1YnNjcmliZVxuICogdG8gbm90aWZpY2F0aW9ucyBzZW50IGZyb20gRGl2YSBpbnN0YW5jZXM6XG4gKlxuICogRGl2YS5FdmVudHMuc3Vic2NyaWJlKCdWaXNpYmxlUGFnZURpZENoYW5nZScsIGZ1bmN0aW9uICgpIHsgY29uc29sZS5sb2coXCJWaXNpYmxlIFBhZ2UgQ2hhbmdlZFwiKTsgfSk7XG4gKlxuICpcbiAqXG4gKiovXG5jbGFzcyBEaXZhXG57XG4gICAgY29uc3RydWN0b3IgKGVsZW1lbnQsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJZiBhIHN0cmluZyBpcyBwYXNzZWQgaW4sIGNvbnZlcnQgdGhhdCB0byBhbiBlbGVtZW50LlxuICAgICAgICAgKiAqL1xuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudCA9PT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGl2YVBhcmVudEVsZW1lbnROb3RGb3VuZEV4Y2VwdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLm9iamVjdERhdGEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REYXRhTm90U3VwcGxpZWRFeGNlcHRpb24oJ1lvdSBtdXN0IHN1cHBseSBlaXRoZXIgYSBVUkwgb3IgYSBsaXRlcmFsIG9iamVjdCB0byB0aGUgYG9iamVjdERhdGFgIGtleS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYWRhcHRpdmVQYWRkaW5nOiAwLjA1LCAgICAgIC8vIFRoZSByYXRpbyBvZiBwYWRkaW5nIHRvIHRoZSBwYWdlIGRpbWVuc2lvblxuICAgICAgICAgICAgYXJyb3dTY3JvbGxBbW91bnQ6IDQwLCAgICAgIC8vIFRoZSBhbW91bnQgKGluIHBpeGVscykgdG8gc2Nyb2xsIGJ5IHdoZW4gdXNpbmcgYXJyb3cga2V5c1xuICAgICAgICAgICAgYmxvY2tNb2JpbGVNb3ZlOiBmYWxzZSwgICAgIC8vIFByZXZlbnQgbW92aW5nIG9yIHNjcm9sbGluZyB0aGUgcGFnZSBvbiBtb2JpbGUgZGV2aWNlc1xuICAgICAgICAgICAgb2JqZWN0RGF0YTogJycsICAgICAgICAgICAgIC8vIEEgSUlJRiBNYW5pZmVzdCBvciBhIEpTT04gZmlsZSBnZW5lcmF0ZWQgYnkgcHJvY2Vzcy5weSB0aGF0IHByb3ZpZGVzIHRoZSBvYmplY3QgZGltZW5zaW9uIGRhdGEsIG9yIGEgVVJMIHBvaW50aW5nIHRvIHN1Y2ggZGF0YSAtICpSRVFVSVJFRCpcbiAgICAgICAgICAgIGVuYWJsZUF1dG9UaXRsZTogdHJ1ZSwgICAgICAvLyBTaG93cyB0aGUgdGl0bGUgd2l0aGluIGEgZGl2IG9mIGlkIGRpdmEtdGl0bGVcbiAgICAgICAgICAgIGVuYWJsZUZpbGVuYW1lOiB0cnVlLCAgICAgICAvLyBVc2VzIGZpbGVuYW1lcyBhbmQgbm90IHBhZ2UgbnVtYmVycyBmb3IgbGlua3MgKGk9Ym1fMDAxLnRpZiwgbm90IHA9MSlcbiAgICAgICAgICAgIGVuYWJsZUZ1bGxzY3JlZW46IHRydWUsICAgICAvLyBFbmFibGUgb3IgZGlzYWJsZSBmdWxsc2NyZWVuIGljb24gKG1vZGUgc3RpbGwgYXZhaWxhYmxlKVxuICAgICAgICAgICAgZW5hYmxlR290b1BhZ2U6IHRydWUsICAgICAgIC8vIEEgXCJnbyB0byBwYWdlXCIganVtcCBib3hcbiAgICAgICAgICAgIGVuYWJsZUdvdG9TdWdnZXN0aW9uczogdHJ1ZSwgLy8gQ29udHJvbHMgd2hldGhlciBzdWdnZXN0aW9ucyBhcmUgc2hvd24gdW5kZXIgdGhlIGlucHV0IGZpZWxkIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nIGluIHRoZSAnZ28gdG8gcGFnZScgZm9ybVxuICAgICAgICAgICAgZW5hYmxlR3JpZEljb246IHRydWUsICAgICAgIC8vIEEgZ3JpZCB2aWV3IG9mIGFsbCB0aGUgcGFnZXNcbiAgICAgICAgICAgIGVuYWJsZUdyaWRDb250cm9sczogJ2J1dHRvbnMnLCAgLy8gU3BlY2lmeSBjb250cm9sIG9mIHBhZ2VzIHBlciBncmlkIHJvdyBpbiBHcmlkIHZpZXcuIFBvc3NpYmxlIHZhbHVlczogJ2J1dHRvbnMnICgrLy0pLCAnc2xpZGVyJy4gQW55IG90aGVyIHZhbHVlIGRpc2FibGVzIHRoZSBjb250cm9scy5cbiAgICAgICAgICAgIGVuYWJsZUltYWdlVGl0bGVzOiB0cnVlLCAgICAvLyBBZGRzIFwiUGFnZSB7bn1cIiB0aXRsZSB0byBwYWdlIGltYWdlcyBpZiB0cnVlXG4gICAgICAgICAgICBlbmFibGVJbmRleEFzTGFiZWw6IGZhbHNlLCAgLy8gVXNlIGluZGV4IG51bWJlcnMgaW5zdGVhZCBvZiBwYWdlIGxhYmVscyBpbiB0aGUgcGFnZSBuLW0gZGlzcGxheS5cbiAgICAgICAgICAgIGVuYWJsZUtleVNjcm9sbDogdHJ1ZSwgICAgICAvLyBDYXB0dXJlcyBzY3JvbGxpbmcgdXNpbmcgdGhlIGFycm93IGFuZCBwYWdlIHVwL2Rvd24ga2V5cyByZWdhcmRsZXNzIG9mIHBhZ2UgZm9jdXMuIFdoZW4gb2ZmLCBkZWZlcnMgdG8gZGVmYXVsdCBicm93c2VyIHNjcm9sbGluZyBiZWhhdmlvci5cbiAgICAgICAgICAgIGVuYWJsZUxpbmtJY29uOiB0cnVlLCAgICAgICAvLyBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgbGluayBpY29uXG4gICAgICAgICAgICBlbmFibGVOb25QYWdlZFZpc2liaWxpdHlJY29uOiB0cnVlLCAvLyBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaWNvbiB0byB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2Ygbm9uLXBhZ2VkIHBhZ2VzLiAoQXV0b21hdGljYWxseSBoaWRkZW4gaWYgbm8gJ25vbi1wYWdlZCcgcGFnZXMpLlxuICAgICAgICAgICAgZW5hYmxlU3BhY2VTY3JvbGw6IGZhbHNlLCAgIC8vIFNjcm9sbGluZyBkb3duIGJ5IHByZXNzaW5nIHRoZSBzcGFjZSBrZXlcbiAgICAgICAgICAgIGVuYWJsZVRvb2xiYXI6IHRydWUsICAgICAgICAvLyBFbmFibGVzIHRoZSB0b29sYmFyLiBOb3RlIHRoYXQgZGlzYWJsaW5nIHRoaXMgbWVhbnMgeW91IGhhdmUgdG8gaGFuZGxlIGFsbCBjb250cm9scyB5b3Vyc2VsZi5cbiAgICAgICAgICAgIGVuYWJsZVpvb21Db250cm9sczogJ2J1dHRvbnMnLCAvLyBTcGVjaWZ5IGNvbnRyb2xzIGZvciB6b29taW5nIGluIGFuZCBvdXQuIFBvc3NpYmxlIHZhbHVlczogJ2J1dHRvbnMnICgrLy0pLCAnc2xpZGVyJy4gQW55IG90aGVyIHZhbHVlIGRpc2FibGVzIHRoZSBjb250cm9scy5cbiAgICAgICAgICAgIGZpbGxQYXJlbnRIZWlnaHQ6IHRydWUsICAgICAvLyBVc2UgYSBmbGV4Ym94IGxheW91dCB0byBhbGxvdyBEaXZhIHRvIGZpbGwgaXRzIHBhcmVudCdzIGhlaWdodFxuICAgICAgICAgICAgZml4ZWRQYWRkaW5nOiAxMCwgICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIGFkYXB0aXZlIHBhZGRpbmcgaXMgc2V0IHRvIDBcbiAgICAgICAgICAgIGZpeGVkSGVpZ2h0R3JpZDogdHJ1ZSwgICAgICAvLyBTbyBlYWNoIHBhZ2UgaW4gZ3JpZCB2aWV3IGhhcyB0aGUgc2FtZSBoZWlnaHQgKG9ubHkgd2lkdGhzIGRpZmZlcilcbiAgICAgICAgICAgIGdvRGlyZWN0bHlUbzogMCwgICAgICAgICAgICAvLyBEZWZhdWx0IGluaXRpYWwgcGFnZSB0byBzaG93ICgwLWluZGV4ZWQpXG4gICAgICAgICAgICBoYXNoUGFyYW1TdWZmaXg6IG51bGwsICAgICAgLy8gVXNlZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBkb2N1bWVudCB2aWV3ZXJzIG9uIGEgcGFnZVxuICAgICAgICAgICAgaW1hZ2VDcm9zc09yaWdpbjogJ2Fub255bW91cycsIC8vIFNldCBjcm9zc09yaWdpbiBwcm9wZXJ0eSBmb3IgaW1hZ2UgcmVxdWVzdHNcbiAgICAgICAgICAgIGluRnVsbHNjcmVlbjogZmFsc2UsICAgICAgICAvLyBTZXQgdG8gdHJ1ZSB0byBsb2FkIGZ1bGxzY3JlZW4gbW9kZSBpbml0aWFsbHlcbiAgICAgICAgICAgIGluQm9va0xheW91dDogZmFsc2UsICAgICAgIC8vIFNldCB0byB0cnVlIHRvIHZpZXcgdGhlIGRvY3VtZW50IHdpdGggZmFjaW5nIHBhZ2VzIGluIGRvY3VtZW50IG1vZGVcbiAgICAgICAgICAgIGluR3JpZDogZmFsc2UsICAgICAgICAgICAgICAvLyBTZXQgdG8gdHJ1ZSB0byBsb2FkIGdyaWQgdmlldyBpbml0aWFsbHlcbiAgICAgICAgICAgIG1heFBhZ2VzUGVyUm93OiA4LCAgICAgICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBwYWdlcyBwZXIgcm93IGluIGdyaWQgdmlld1xuICAgICAgICAgICAgbWF4Wm9vbUxldmVsOiAtMSwgICAgICAgICAgIC8vIE9wdGlvbmFsOyBkZWZhdWx0cyB0byB0aGUgbWF4IHpvb20gcmV0dXJuZWQgaW4gdGhlIEpTT04gcmVzcG9uc2VcbiAgICAgICAgICAgIG1pblBhZ2VzUGVyUm93OiAyLCAgICAgICAgICAvLyBNaW5pbXVtIHBhZ2VzIHBlciByb3cgaW4gZ3JpZCB2aWV3LiBSZWNvbW1lbmRlZCBkZWZhdWx0LlxuICAgICAgICAgICAgbWluWm9vbUxldmVsOiAwLCAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIDAgKHRoZSBtaW5pbXVtIHpvb20pXG4gICAgICAgICAgICBvbkdvdG9TdWJtaXQ6IG51bGwsICAgICAgICAgLy8gV2hlbiBzZXQgdG8gYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgcGFnZSBpbmRleCwgdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgJ2dvIHRvIHBhZ2UnIGZvcm0gc3VibWlzc2lvblxuICAgICAgICAgICAgcGFnZUFsaWFzZXM6IHt9LCAgICAgICAgICAgIC8vIEFuIG9iamVjdCBtYXBwaW5nIHNwZWNpZmljIHBhZ2UgaW5kaWNlcyB0byBhbGlhc2VzIChoYXMgcHJpb3JpdHkgb3ZlciAncGFnZUFsaWFzRnVuY3Rpb24nXG4gICAgICAgICAgICBwYWdlQWxpYXNGdW5jdGlvbjogZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2U7fSwgIC8vIEEgZnVuY3Rpb24gbWFwcGluZyBwYWdlIGluZGljZXMgdG8gYW4gYWxpYXMuIElmIGZhbHNlIGlzIHJldHVybmVkLCBkZWZhdWx0IHBhZ2UgbnVtYmVyIGlzIGRpc3BsYXllZFxuICAgICAgICAgICAgcGFnZUxvYWRUaW1lb3V0OiAyMDAsICAgICAgIC8vIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgbG9hZGluZyBwYWdlc1xuICAgICAgICAgICAgcGFnZXNQZXJSb3c6IDUsICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IG51bWJlciBvZiBwYWdlcyBwZXIgcm93IGluIGdyaWQgdmlld1xuICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnM6IHtcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIn0sIC8vIERlZmF1bHQgaGVhZGVyIHNlbnQgb2ZmIHRvIHRoZSBzZXJ2ZXIgaW4gY29udGVudCBuZWdvdGlhdGlvblxuICAgICAgICAgICAgc2hvd05vblBhZ2VkUGFnZXM6IGZhbHNlLCAgIC8vIFdoZXRoZXIgcGFnZXMgdGFnZ2VkIGFzICdub24tcGFnZWQnIChpbiBJSUlGIG1hbmlmZXN0cyBvbmx5KSBzaG91bGQgYmUgdmlzaWJsZSBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgICAgICAgIHRocm9iYmVyVGltZW91dDogMTAwLCAgICAgICAvLyBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNob3dpbmcgdGhyb2JiZXJcbiAgICAgICAgICAgIHRpbGVIZWlnaHQ6IDI1NiwgICAgICAgICAgICAvLyBUaGUgaGVpZ2h0IG9mIGVhY2ggdGlsZSwgaW4gcGl4ZWxzOyB1c3VhbGx5IDI1NlxuICAgICAgICAgICAgdGlsZVdpZHRoOiAyNTYsICAgICAgICAgICAgIC8vIFRoZSB3aWR0aCBvZiBlYWNoIHRpbGUsIGluIHBpeGVsczsgdXN1YWxseSAyNTZcbiAgICAgICAgICAgIHRvb2xiYXJQYXJlbnRPYmplY3Q6IG51bGwsICAvLyBUaGUgdG9vbGJhciBwYXJlbnQgb2JqZWN0LlxuICAgICAgICAgICAgdmVydGljYWxseU9yaWVudGVkOiB0cnVlLCAgIC8vIERldGVybWluZXMgdmVydGljYWwgdnMuIGhvcml6b250YWwgb3JpZW50YXRpb25cbiAgICAgICAgICAgIHZpZXdwb3J0TWFyZ2luOiAyMDAsICAgICAgICAvLyBQcmV0ZW5kIHRpbGVzICsvLSAyMDBweCBhd2F5IGZyb20gdmlld3BvcnQgYXJlIGluXG4gICAgICAgICAgICB6b29tTGV2ZWw6IDIgICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWwgem9vbSBsZXZlbCAodXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCB6b29tIGxldmVsKVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBJbiBvcmRlciB0byBmaWxsIHRoZSBoZWlnaHQsIHVzZSBhIHdyYXBwZXIgZGl2IGRpc3BsYXllZCB1c2luZyBhIGZsZXhib3ggbGF5b3V0XG4gICAgICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gZWx0KCdkaXYnLCB7XG4gICAgICAgICAgICBjbGFzczogYGRpdmEtd3JhcHBlciR7dGhpcy5vcHRpb25zLmZpbGxQYXJlbnRIZWlnaHQgPyBcIiBkaXZhLXdyYXBwZXItZmxleGJveFwiIDogXCJcIn1gXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh3cmFwcGVyRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLnRvb2xiYXJQYXJlbnRPYmplY3QgPSB0aGlzLm9wdGlvbnMudG9vbGJhclBhcmVudE9iamVjdCB8fCB3cmFwcGVyRWxlbWVudDtcblxuICAgICAgICBjb25zdCB2aWV3ZXJDb3JlID0gbmV3IFZpZXdlckNvcmUod3JhcHBlckVsZW1lbnQsIHRoaXMub3B0aW9ucywgdGhpcyk7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZSA9IHZpZXdlckNvcmUuZ2V0SW50ZXJuYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gdmlld2VyQ29yZS5nZXRTZXR0aW5ncygpO1xuICAgICAgICB0aGlzLnRvb2xiYXIgPSB0aGlzLnNldHRpbmdzLmVuYWJsZVRvb2xiYXIgPyBuZXcgVG9vbGJhcih0aGlzKSA6IG51bGw7XG5cbiAgICAgICAgd3JhcHBlckVsZW1lbnQuaWQgPSB0aGlzLnNldHRpbmdzLklEICsgJ3dyYXBwZXInO1xuXG4gICAgICAgIHRoaXMuZGl2YVN0YXRlID0ge1xuICAgICAgICAgICAgdmlld2VyQ29yZTogdmlld2VyQ29yZSxcbiAgICAgICAgICAgIHRvb2xiYXI6IHRoaXMudG9vbGJhclxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG9ubHkgcmVuZGVyIHRoZSB0b29sYmFyIGFmdGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAgIGxldCBoYW5kbGUgPSBkaXZhLkV2ZW50cy5zdWJzY3JpYmUoJ09iamVjdERpZExvYWQnLCAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy50b29sYmFyICE9PSBudWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbGJhci5yZW5kZXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGl2YS5FdmVudHMudW5zdWJzY3JpYmUoaGFuZGxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oYXNoU3RhdGUgPSB0aGlzLl9nZXRIYXNoUGFyYW1TdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuX2xvYWRPckZldGNoT2JqZWN0RGF0YSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF9sb2FkT3JGZXRjaE9iamVjdERhdGEgKClcbiAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXR0aW5ncy5vYmplY3REYXRhID09PSAnb2JqZWN0JylcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gRGVmZXIgZXhlY3V0aW9uIHVudGlsIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWRcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkT2JqZWN0RGF0YSh0aGlzLnNldHRpbmdzLm9iamVjdERhdGEsIHRoaXMuaGFzaFN0YXRlKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcGVuZGluZ01hbmlmZXN0UmVxdWVzdCA9IGZldGNoKHRoaXMuc2V0dGluZ3Mub2JqZWN0RGF0YSwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuc2V0dGluZ3MucmVxdWVzdEhlYWRlcnNcbiAgICAgICAgICAgIH0pLnRoZW4oIChyZXNwb25zZSkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBtYW5pZmVzdCBsb2FkIGVycm9yIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGRpdmEuRXZlbnRzLnB1Ymxpc2goJ01hbmlmZXN0RmV0Y2hFcnJvcicsIFtyZXNwb25zZV0sIHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FqYXhFcnJvcihyZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICAgICAgfSkudGhlbiggKGRhdGEpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZE9iamVjdERhdGEoZGF0YSwgdGhpcy5oYXNoU3RhdGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBwZW5kaW5nIHJlcXVlc3Qgc28gdGhhdCBpdCBjYW4gYmUgY2FuY2VsbGVkIGluIHRoZSBldmVudCB0aGF0IERpdmEgbmVlZHMgdG8gYmUgZGVzdHJveWVkXG4gICAgICAgICAgICB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLnNldFBlbmRpbmdNYW5pZmVzdFJlcXVlc3QocGVuZGluZ01hbmlmZXN0UmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqKi9cbiAgICBfc2hvd0Vycm9yIChtZXNzYWdlKVxuICAgIHtcbiAgICAgICAgdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiAqL1xuICAgIF9hamF4RXJyb3IgKHJlc3BvbnNlKVxuICAgIHtcbiAgICAgICAgLy8gU2hvdyBhIGJhc2ljIGVycm9yIG1lc3NhZ2Ugd2l0aGluIHRoZSBkb2N1bWVudCB2aWV3ZXIgcGFuZVxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBbJ0ludmFsaWQgb2JqZWN0RGF0YSBzZXR0aW5nLiBFcnJvciBjb2RlOiAnICsgcmVzcG9uc2Uuc3RhdHVzICsgJyAnICsgcmVzcG9uc2Uuc3RhdHVzVGV4dF07XG5cbiAgICAgICAgLy8gRGV0ZWN0IGFuZCBoYW5kbGUgQ09SUyBlcnJvcnNcbiAgICAgICAgY29uc3QgZGF0YUhhc0Fic29sdXRlUGF0aCA9IHRoaXMuc2V0dGluZ3Mub2JqZWN0RGF0YS5sYXN0SW5kZXhPZignaHR0cCcsIDApID09PSAwO1xuXG4gICAgICAgIGlmIChkYXRhSGFzQWJzb2x1dGVQYXRoKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBqc29uSG9zdCA9IHRoaXMuc2V0dGluZ3Mub2JqZWN0RGF0YS5yZXBsYWNlKC9odHRwcz86XFwvXFwvL2ksIFwiXCIpLnNwbGl0KC9bLz8jXS8pWzBdO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICE9PSBqc29uSG9zdClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdwJywgJ0F0dGVtcHRlZCB0byBhY2Nlc3MgY3Jvc3Mtb3JpZ2luIGRhdGEgd2l0aG91dCBDT1JTLicpLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ3AnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1lvdSBtYXkgbmVlZCB0byB1cGRhdGUgeW91ciBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0byBzdXBwb3J0IENPUlMuIEZvciBoZWxwLCBzZWUgdGhlICcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHQoJ2EnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogJ2h0dHBzOi8vZ2l0aHViLmNvbS9ERE1BTC9kaXZhLmpzL3dpa2kvSW5zdGFsbGF0aW9uI2Etbm90ZS1hYm91dC1jcm9zcy1zaXRlLXJlcXVlc3RzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdfYmxhbmsnXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnY3Jvc3Mtc2l0ZSByZXF1ZXN0IGRvY3VtZW50YXRpb24uJylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zaG93RXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqKi9cbiAgICBfbG9hZE9iamVjdERhdGEgKHJlc3BvbnNlRGF0YSwgaGFzaFN0YXRlKVxuICAgIHtcbiAgICAgICAgbGV0IG1hbmlmZXN0O1xuXG4gICAgICAgIC8vIFRPRE8gaW1wcm92ZSBJSUlGIGRldGVjdGlvbiBtZXRob2RcbiAgICAgICAgaWYgKCFyZXNwb25zZURhdGEuaGFzT3duUHJvcGVydHkoJ0Bjb250ZXh0JykgJiYgKHJlc3BvbnNlRGF0YVsnQGNvbnRleHQnXS5pbmRleE9mKCdpaWlmJykgPT09IC0xIHx8IHJlc3BvbnNlRGF0YVsnQGNvbnRleHQnXS5pbmRleE9mKCdzaGFyZWQtY2FudmFzJykgPT09IC0xKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEFuSUlJRk1hbmlmZXN0RXhjZXB0aW9uKCdUaGlzIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIElJSUYgTWFuaWZlc3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIE1hbmlmZXN0RGlkTG9hZCBldmVudFxuICAgICAgICBkaXZhLkV2ZW50cy5wdWJsaXNoKCdNYW5pZmVzdERpZExvYWQnLCBbcmVzcG9uc2VEYXRhXSwgdGhpcyk7XG4gICAgICAgIG1hbmlmZXN0ID0gSW1hZ2VNYW5pZmVzdC5mcm9tSUlJRihyZXNwb25zZURhdGEpO1xuICAgICAgICBjb25zdCBsb2FkT3B0aW9ucyA9IGhhc2hTdGF0ZSA/IHRoaXMuX2dldExvYWRPcHRpb25zRm9yU3RhdGUoaGFzaFN0YXRlLCBtYW5pZmVzdCkgOiB7fTtcblxuICAgICAgICB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLnNldE1hbmlmZXN0KG1hbmlmZXN0LCBsb2FkT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIGhhc2ggcGFyYW1ldGVycyBpbnRvIHRoZSBmb3JtYXQgdXNlZCBieSBnZXRTdGF0ZSBhbmQgc2V0U3RhdGVcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF9nZXRIYXNoUGFyYW1TdGF0ZSAoKVxuICAgIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7fTtcblxuICAgICAgICBbJ2YnLCAndicsICd6JywgJ24nLCAnaScsICdwJywgJ3knLCAneCddLmZvckVhY2goIChwYXJhbSkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBIYXNoUGFyYW1zLmdldChwYXJhbSArIHRoaXMuc2V0dGluZ3MuaGFzaFBhcmFtU3VmZml4KTtcblxuICAgICAgICAgICAgLy8gYGZhbHNlYCBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgaXMgbWlzc2luZ1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICBzdGF0ZVtwYXJhbV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRG8gc29tZSBhd2t3YXJkIHNwZWNpYWwtY2FzaW5nLCBzaW5jZSB0aGlzIGZvcm1hdCBpcyBraW5kIG9mIHdlaXJkLlxuXG4gICAgICAgIC8vIEZvciBpbkZ1bGxzY3JlZW4gKGYpLCB0cnVlIGFuZCBmYWxzZSBzdHJpbmdzIHNob3VsZCBiZSBpbnRlcnByZXRlZFxuICAgICAgICAvLyBhcyBib29sZWFucy5cbiAgICAgICAgaWYgKHN0YXRlLmYgPT09ICd0cnVlJylcbiAgICAgICAgICAgIHN0YXRlLmYgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChzdGF0ZS5mID09PSAnZmFsc2UnKVxuICAgICAgICAgICAgc3RhdGUuZiA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgbnVtZXJpY2FsIHZhbHVlcyB0byBpbnRlZ2VycywgaWYgcHJvdmlkZWRcbiAgICAgICAgWyd6JywgJ24nLCAncCcsICd4JywgJ3knXS5mb3JFYWNoKCAocGFyYW0pID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChwYXJhbSBpbiBzdGF0ZSlcbiAgICAgICAgICAgICAgICBzdGF0ZVtwYXJhbV0gPSBwYXJzZUludChzdGF0ZVtwYXJhbV0sIDEwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF9nZXRMb2FkT3B0aW9uc0ZvclN0YXRlIChzdGF0ZSwgbWFuaWZlc3QpXG4gICAge1xuICAgICAgICBtYW5pZmVzdCA9IG1hbmlmZXN0IHx8IHRoaXMuc2V0dGluZ3MubWFuaWZlc3Q7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9ICgndicgaW4gc3RhdGUpID8gdGhpcy5fZ2V0Vmlld1N0YXRlKHN0YXRlLnYpIDoge307XG5cbiAgICAgICAgaWYgKCdmJyBpbiBzdGF0ZSlcbiAgICAgICAgICAgIG9wdGlvbnMuaW5GdWxsc2NyZWVuID0gc3RhdGUuZjtcblxuICAgICAgICBpZiAoJ3onIGluIHN0YXRlKVxuICAgICAgICAgICAgb3B0aW9ucy56b29tTGV2ZWwgPSBzdGF0ZS56O1xuXG4gICAgICAgIGlmICgnbicgaW4gc3RhdGUpXG4gICAgICAgICAgICBvcHRpb25zLnBhZ2VzUGVyUm93ID0gc3RhdGUubjtcblxuICAgICAgICAvLyBPbmx5IGNoYW5nZSBzcGVjaWZ5IHRoZSBwYWdlIGlmIHN0YXRlLmkgb3Igc3RhdGUucCBpcyB2YWxpZFxuICAgICAgICBsZXQgcGFnZUluZGV4ID0gdGhpcy5fZ2V0UGFnZUluZGV4Rm9yTWFuaWZlc3QobWFuaWZlc3QsIHN0YXRlLmkpO1xuXG4gICAgICAgIGlmICghKHBhZ2VJbmRleCA+PSAwICYmIHBhZ2VJbmRleCA8IG1hbmlmZXN0LnBhZ2VzLmxlbmd0aCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBhZ2VJbmRleCA9IHN0YXRlLnAgLSAxO1xuXG4gICAgICAgICAgICAvLyBQb3NzaWJseSBOYU5cbiAgICAgICAgICAgIGlmICghKHBhZ2VJbmRleCA+PSAwICYmIHBhZ2VJbmRleCA8IG1hbmlmZXN0LnBhZ2VzLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgcGFnZUluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWdlSW5kZXggIT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPSBwYXJzZUludChzdGF0ZS54LCAxMCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldCA9IHBhcnNlSW50KHN0YXRlLnksIDEwKTtcblxuICAgICAgICAgICAgb3B0aW9ucy5nb0RpcmVjdGx5VG8gPSBwYWdlSW5kZXg7XG4gICAgICAgICAgICBvcHRpb25zLmhvcml6b250YWxPZmZzZXQgPSBob3Jpem9udGFsT2Zmc2V0O1xuICAgICAgICAgICAgb3B0aW9ucy52ZXJ0aWNhbE9mZnNldCA9IHZlcnRpY2FsT2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiAqL1xuICAgIF9nZXRWaWV3U3RhdGUgKHZpZXcpXG4gICAge1xuICAgICAgICBzd2l0Y2ggKHZpZXcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGluR3JpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGluQm9va0xheW91dDogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpbkdyaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbkJvb2tMYXlvdXQ6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjYXNlICdnJzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpbkdyaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGluQm9va0xheW91dDogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogKi9cbiAgICBfZ2V0UGFnZUluZGV4Rm9yTWFuaWZlc3QgKG1hbmlmZXN0LCBmaWxlbmFtZSlcbiAgICB7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBjb25zdCBucCA9IG1hbmlmZXN0LnBhZ2VzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnA7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKG1hbmlmZXN0LnBhZ2VzW2ldLmYgPT09IGZpbGVuYW1lKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogKi9cbiAgICBfZ2V0U3RhdGUgKClcbiAgICB7XG4gICAgICAgIGxldCB2aWV3O1xuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmluR3JpZClcbiAgICAgICAge1xuICAgICAgICAgICAgdmlldyA9ICdnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNldHRpbmdzLmluQm9va0xheW91dClcbiAgICAgICAge1xuICAgICAgICAgICAgdmlldyA9ICdiJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZpZXcgPSAnZCc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldEN1cnJlbnRMYXlvdXQoKTtcbiAgICAgICAgY29uc3QgcGFnZU9mZnNldCA9IGxheW91dC5nZXRQYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldCh0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCwgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdmJzogdGhpcy5zZXR0aW5ncy5pbkZ1bGxzY3JlZW4sXG4gICAgICAgICAgICAndic6IHZpZXcsXG4gICAgICAgICAgICAneic6IHRoaXMuc2V0dGluZ3Muem9vbUxldmVsLFxuICAgICAgICAgICAgJ24nOiB0aGlzLnNldHRpbmdzLnBhZ2VzUGVyUm93LFxuICAgICAgICAgICAgJ2knOiB0aGlzLnNldHRpbmdzLmVuYWJsZUZpbGVuYW1lID8gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlc1t0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleF0uZiA6IGZhbHNlLFxuICAgICAgICAgICAgJ3AnOiB0aGlzLnNldHRpbmdzLmVuYWJsZUZpbGVuYW1lID8gZmFsc2UgOiB0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCArIDEsXG4gICAgICAgICAgICAneSc6IHBhZ2VPZmZzZXQgPyBwYWdlT2Zmc2V0LnkgOiBmYWxzZSxcbiAgICAgICAgICAgICd4JzogcGFnZU9mZnNldCA/IHBhZ2VPZmZzZXQueCA6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiovXG4gICAgX2dldFVSTEhhc2ggKClcbiAgICB7XG4gICAgICAgIGNvbnN0IGhhc2hQYXJhbXMgPSB0aGlzLl9nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBoYXNoU3RyaW5nQnVpbGRlciA9IFtdO1xuICAgICAgICBsZXQgcGFyYW07XG5cbiAgICAgICAgZm9yIChwYXJhbSBpbiBoYXNoUGFyYW1zKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoaGFzaFBhcmFtc1twYXJhbV0gIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIGhhc2hTdHJpbmdCdWlsZGVyLnB1c2gocGFyYW0gKyB0aGlzLnNldHRpbmdzLmhhc2hQYXJhbVN1ZmZpeCArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChoYXNoUGFyYW1zW3BhcmFtXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc2hTdHJpbmdCdWlsZGVyLmpvaW4oJyYnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwYWdlIGluZGV4IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZW5hbWU7IG11c3QgY2FsbGVkIGFmdGVyIHNldHRpbmcgc2V0dGluZ3MubWFuaWZlc3RcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF9nZXRQYWdlSW5kZXggKGZpbGVuYW1lKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFBhZ2VJbmRleEZvck1hbmlmZXN0KHRoaXMuc2V0dGluZ3MubWFuaWZlc3QsIGZpbGVuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqICovXG4gICAgX2NoZWNrTG9hZGVkICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMudmlld2VyU3RhdGUubG9hZGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgdmlld2VyIGlzIG5vdCBjb21wbGV0ZWx5IGluaXRpYWxpemVkLiBUaGlzIGlzIGxpa2VseSBiZWNhdXNlIGl0IGlzIHN0aWxsIGRvd25sb2FkaW5nIGRhdGEuIFRvIGZpeCB0aGlzLCBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB0aGUgaXNSZWFkeSgpIG1ldGhvZCByZXR1cm5zIHRydWUuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBmdWxsc2NyZWVuIGljb24gaXMgY2xpY2tlZFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiovXG4gICAgX3RvZ2dsZUZ1bGxzY3JlZW4gKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3JlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICBpbkZ1bGxzY3JlZW46ICF0aGlzLnNldHRpbmdzLmluRnVsbHNjcmVlblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBoYW5kbGUgdG9vbGJhciBvcGFjaXR5IGluIGZ1bGxzY3JlZW5cbiAgICAgICAgbGV0IHQ7XG4gICAgICAgIGxldCBob3ZlciA9IGZhbHNlO1xuICAgICAgICBsZXQgdG9vbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLnNlbGVjdG9yICsgJ3Rvb2xzJyk7XG4gICAgICAgIGNvbnN0IFRJTUVPVVQgPSAyMDAwO1xuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmluRnVsbHNjcmVlbilcbiAgICAgICAge1xuICAgICAgICAgICAgdG9vbHMuY2xhc3NMaXN0LmFkZChcImRpdmEtZnVsbHNjcmVlbi10b29sc1wiKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdG9nZ2xlT3BhY2l0eS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RpdmEtdmlld3BvcnQnKVswXS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0b2dnbGVPcGFjaXR5LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdG9vbHMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBob3ZlciA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRvb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdG9vbHMuY2xhc3NMaXN0LnJlbW92ZShcImRpdmEtZnVsbHNjcmVlbi10b29sc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZU9wYWNpdHkgKClcbiAgICAgICAge1xuICAgICAgICAgICAgdG9vbHMuc3R5bGUub3BhY2l0eSA9IDE7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodCk7XG4gICAgICAgICAgICBpZiAoIWhvdmVyICYmIHRoaXMuc2V0dGluZ3MuaW5GdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRvb2xzLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgICAgICAgICAgIH0sIFRJTUVPVVQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyBiZXR3ZWVuIG9yaWVudGF0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiAqL1xuICAgIF90b2dnbGVQYWdlTGF5b3V0T3JpZW50YXRpb24gKClcbiAgICB7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsbHlPcmllbnRlZCA9ICF0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZDtcblxuICAgICAgICAvL2lmIGluIGdyaWQsIHN3aXRjaCBvdXQgb2YgZ3JpZFxuICAgICAgICB0aGlzLl9yZWxvYWRWaWV3ZXIoe1xuICAgICAgICAgICAgaW5HcmlkOiBmYWxzZSxcbiAgICAgICAgICAgIHZlcnRpY2FsbHlPcmllbnRlZDogdmVydGljYWxseU9yaWVudGVkLFxuICAgICAgICAgICAgZ29EaXJlY3RseVRvOiB0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCxcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldFlPZmZzZXQoKSxcbiAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZ2V0WE9mZnNldCgpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2ZXJ0aWNhbGx5T3JpZW50ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNoYW5nZSB2aWV3IGljb24gaXMgY2xpY2tlZFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiovXG4gICAgX2NoYW5nZVZpZXcgKGRlc3RpbmF0aW9uVmlldylcbiAgICB7XG4gICAgICAgIHN3aXRjaCAoZGVzdGluYXRpb25WaWV3KVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICAgICAgICAgIGluR3JpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGluQm9va0xheW91dDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2FzZSAnYm9vayc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICAgICAgICAgIGluR3JpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGluQm9va0xheW91dDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYXNlICdncmlkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVsb2FkVmlld2VyKHtcbiAgICAgICAgICAgICAgICAgICAgaW5HcmlkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwYWdlSW5kZXggLSAwLWJhc2VkIHBhZ2UgaW5kZXguXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHhBbmNob3IgLSB4IGNvb3JkaW5hdGUgdG8ganVtcCB0byBvbiByZXN1bHRpbmcgcGFnZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0geUFuY2hvciAtIHkgY29vcmRpbmF0ZSB0byBqdW1wIHRvIG9uIHJlc3VsdGluZyBwYWdlLlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSAtIFdoZXRoZXIgdGhlIGp1bXAgd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICoqL1xuICAgIF9nb3RvUGFnZUJ5SW5kZXggKHBhZ2VJbmRleCwgeEFuY2hvciwgeUFuY2hvcilcbiAgICB7XG4gICAgICAgIGxldCBwaWR4ID0gcGFyc2VJbnQocGFnZUluZGV4LCAxMCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzUGFnZUluZGV4VmFsaWQocGlkeCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQgPSB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldFhPZmZzZXQocGlkeCwgeEFuY2hvcik7XG4gICAgICAgICAgICBjb25zdCB5T2Zmc2V0ID0gdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5nZXRZT2Zmc2V0KHBpZHgsIHlBbmNob3IpO1xuXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmdvdG8ocGlkeCwgeU9mZnNldCwgeE9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHBhZ2UgaW5kZXggaXMgdmFsaWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBhZ2VJbmRleCAtIE51bWVyaWMgKDAtYmFzZWQpIHBhZ2UgaW5kZXhcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB3aGV0aGVyIHRoZSBwYWdlIGluZGV4IGlzIHZhbGlkIG9yIG5vdC5cbiAgICAgKi9cbiAgICBfaXNQYWdlSW5kZXhWYWxpZCAocGFnZUluZGV4KVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QuaXNQYWdlVmFsaWQocGFnZUluZGV4LCB0aGlzLnNldHRpbmdzLnNob3dOb25QYWdlZFBhZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBhZ2VYIGFuZCBwYWdlWSB2YWx1ZSwgcmV0dXJucyBlaXRoZXIgdGhlIHBhZ2UgdmlzaWJsZSBhdCB0aGF0ICh4LHkpXG4gICAgICogcG9zaXRpb24gb3IgLTEgaWYgbm8gcGFnZSBpcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldFBhZ2VJbmRleEZvclBhZ2VYWVZhbHVlcyAocGFnZVgsIHBhZ2VZKVxuICAgIHtcbiAgICAgICAgLy9nZXQgdGhlIGZvdXIgZWRnZXMgb2YgdGhlIG91dGVyIGVsZW1lbnRcbiAgICAgICAgY29uc3Qgb3V0ZXJPZmZzZXQgPSB0aGlzLnZpZXdlclN0YXRlLm91dGVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgb3V0ZXJUb3AgPSBvdXRlck9mZnNldC50b3A7XG4gICAgICAgIGNvbnN0IG91dGVyTGVmdCA9IG91dGVyT2Zmc2V0LmxlZnQ7XG4gICAgICAgIGNvbnN0IG91dGVyQm90dG9tID0gb3V0ZXJPZmZzZXQuYm90dG9tO1xuICAgICAgICBjb25zdCBvdXRlclJpZ2h0ID0gb3V0ZXJPZmZzZXQucmlnaHQ7XG5cbiAgICAgICAgLy9pZiB0aGUgY2xpY2tlZCBwb3NpdGlvbiB3YXMgb3V0c2lkZSB0aGUgZGl2YS1vdXRlciBvYmplY3QsIGl0IHdhcyBub3Qgb24gYSB2aXNpYmxlIHBvcnRpb24gb2YgYSBwYWdlXG4gICAgICAgIGlmIChwYWdlWCA8IG91dGVyTGVmdCB8fCBwYWdlWCA+IG91dGVyUmlnaHQpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG5cbiAgICAgICAgaWYgKHBhZ2VZIDwgb3V0ZXJUb3AgfHwgcGFnZVkgPiBvdXRlckJvdHRvbSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcblxuICAgICAgICAvL25hdmlnYXRlIHRocm91Z2ggYWxsIGRpdmEgcGFnZSBvYmplY3RzXG4gICAgICAgIGNvbnN0IHBhZ2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZGl2YS1wYWdlJyk7XG4gICAgICAgIGxldCBjdXJQYWdlSWR4ID0gcGFnZXMubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoY3VyUGFnZUlkeC0tKVxuICAgICAgICB7XG4gICAgICAgICAgICAvL2dldCB0aGUgb2Zmc2V0IGZvciBlYWNoIHBhZ2VcbiAgICAgICAgICAgIGNvbnN0IGN1clBhZ2UgPSBwYWdlc1tjdXJQYWdlSWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGN1ck9mZnNldCA9IGN1clBhZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIC8vaWYgdGhpcyBwb2ludCBpcyBvdXRzaWRlIHRoZSBob3Jpem9udGFsIGJvdW5kYXJpZXMgb2YgdGhlIHBhZ2UsIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAocGFnZVggPCBjdXJPZmZzZXQubGVmdCB8fCBwYWdlWCA+IGN1ck9mZnNldC5yaWdodClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgLy9zYW1lIHdpdGggdmVydGljYWwgYm91bmRhcmllc1xuICAgICAgICAgICAgaWYgKHBhZ2VZIDwgY3VyT2Zmc2V0LnRvcCB8fCBwYWdlWSA+IGN1ck9mZnNldC5ib3R0b20pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vaWYgd2UgbWFkZSBpdCB0aHJvdWdoIHRoZSBhYm92ZSB0d28sIHdlIGZvdW5kIHRoZSBwYWdlIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICAgICAgICByZXR1cm4gY3VyUGFnZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWYgd2UgbWFkZSBpdCB0aHJvdWdoIHRoYXQgZW50aXJlIHdoaWxlIGxvb3AsIHdlIGRpZG4ndCBjbGljayBvbiBhIHBhZ2VcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF9yZWxvYWRWaWV3ZXIgKG5ld09wdGlvbnMpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5yZWxvYWQobmV3T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0Q3VycmVudFVSTCAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QgKyBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaCArICcjJyArIHRoaXMuX2dldFVSTEhhc2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAqICAgICAgICAgICAgICAgIFBVQkxJQyBGVU5DVElPTlNcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAqKi9cblxuICAgIC8qKlxuICAgICAqICBBY3RpdmF0ZSB0aGlzIGluc3RhbmNlIG9mIGRpdmEgdmlhIHRoZSBhY3RpdmUgRGl2YSBjb250cm9sbGVyLlxuICAgICAqXG4gICAgICogIEBwdWJsaWNcbiAgICAgKi9cbiAgICBhY3RpdmF0ZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pc0FjdGl2ZURpdmEgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb2JqZWN0IChvYmplY3REYXRhKSBwYXJhbWV0ZXIgY3VycmVudGx5IGJlaW5nIHJlbmRlcmVkIGJ5IERpdmEuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7b2JqZWN0fSBvYmplY3REYXRhIC0gQW4gSUlJRiBNYW5pZmVzdCBvYmplY3QgT1IgYSBVUkwgdG8gYSBJSUlGIG1hbmlmZXN0LlxuICAgICAqL1xuICAgIGNoYW5nZU9iamVjdCAob2JqZWN0RGF0YSlcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuY2xlYXIoKTtcblxuICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlcilcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIuZGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5vYmplY3REYXRhID0gb2JqZWN0RGF0YTtcblxuICAgICAgICB0aGlzLl9sb2FkT3JGZXRjaE9iamVjdERhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2Ugdmlld3MuIFRha2VzICdkb2N1bWVudCcsICdib29rJywgb3IgJ2dyaWQnIHRvIHNwZWNpZnkgd2hpY2ggdmlldyB0byBzd2l0Y2ggaW50b1xuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge3N0cmluZ30gZGVzdGluYXRpb25WaWV3IC0gdGhlIGRlc3RpbmF0aW9uIHZpZXcgdG8gY2hhbmdlIHRvLlxuICAgICAqL1xuICAgIGNoYW5nZVZpZXcgKGRlc3RpbmF0aW9uVmlldylcbiAgICB7XG4gICAgICAgIHRoaXMuX2NoYW5nZVZpZXcoZGVzdGluYXRpb25WaWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGVhY3RpdmF0ZSB0aGlzIGRpdmEgaW5zdGFuY2UgdGhyb3VnaCB0aGUgYWN0aXZlIERpdmEgY29udHJvbGxlci5cbiAgICAgKlxuICAgICAqICBAcHVibGljXG4gICAgICoqL1xuICAgIGRlYWN0aXZhdGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUuaXNBY3RpdmVEaXZhID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhpcyBpbnN0YW5jZSwgdGVsbHMgcGx1Z2lucyB0byBkbyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqKi9cbiAgICBkZXN0cm95ICgpXG4gICAge1xuICAgICAgICB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBkb2N1bWVudCBkcmFnZ2luZywgc2Nyb2xsaW5nIChieSBrZXlib2FyZCBpZiBzZXQpLCBhbmQgem9vbWluZyBieSBkb3VibGUtY2xpY2tpbmdcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiovXG4gICAgZGlzYWJsZVNjcm9sbGFibGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZGlzYWJsZVNjcm9sbGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZS1lbmFibGVzIGRvY3VtZW50IGRyYWdnaW5nLCBzY3JvbGxpbmcgKGJ5IGtleWJvYXJkIGlmIHNldCksIGFuZCB6b29taW5nIGJ5IGRvdWJsZS1jbGlja2luZ1xuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqKi9cbiAgICBlbmFibGVTY3JvbGxhYmxlICgpXG4gICAge1xuICAgICAgICB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmVuYWJsZVNjcm9sbGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBkb2N1bWVudCBkcmFnIHNjcm9sbGluZ1xuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGRpc2FibGVEcmFnU2Nyb2xsYWJsZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5kaXNhYmxlRHJhZ1Njcm9sbGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGRvY3VtZW50IGRyYWcgc2Nyb2xsaW5nXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZW5hYmxlRHJhZ1Njcm9sbGFibGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZW5hYmxlRHJhZ1Njcm9sbGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnRlciBmdWxsc2NyZWVuIG1vZGUgaWYgY3VycmVudGx5IG5vdCBpbiBmdWxsc2NyZWVuIG1vZGUuIElmIGN1cnJlbnRseSBpbiBmdWxsc2NyZWVuXG4gICAgICogbW9kZSB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgd29yayBldmVuIGlmIGVuYWJsZUZ1bGxzY3JlZW4gaXMgc2V0IHRvIGZhbHNlIGluIHRoZSBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHN3aXRjaCB0byBmdWxsc2NyZWVuIHdhcyBzdWNjZXNzZnVsIG9yIG5vdC5cbiAgICAgKiovXG4gICAgZW50ZXJGdWxsc2NyZWVuTW9kZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmluRnVsbHNjcmVlbilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlRnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW50ZXIgZ3JpZCB2aWV3IGlmIGN1cnJlbnRseSBub3QgaW4gZ3JpZCB2aWV3LiBJZiBjdXJyZW50bHkgaW4gZ3JpZCB2aWV3IG1vZGVcbiAgICAgKiB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgc3dpdGNoIHRvIGdyaWQgdmlldyB3YXMgc3VjY2Vzc2Z1bCBvciBub3QuXG4gICAgICoqL1xuICAgIGVudGVyR3JpZFZpZXcgKClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVZpZXcoJ2dyaWQnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHBhZ2UgaW1hZ2UgVVJJcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge0FycmF5fSAtIEFuIGFycmF5IG9mIGFsbCB0aGUgVVJJcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICogKi9cbiAgICBnZXRBbGxQYWdlVVJJcyAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXMubWFwKCAocGcpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwZy5mO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNhbnZhcyBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudGx5IHZpc2libGUgcGFnZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBVUkkgb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGNhbnZhcy5cbiAgICAgKiovXG4gICAgZ2V0Q3VycmVudENhbnZhcyAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXhdLmNhbnZhcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBjdXJyZW50IHBhZ2UgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC4gQWxzbyB3b3JrcyBpblxuICAgICAqIGdyaWQgdmlldy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHBhZ2UgZGltZW5zaW9ucyBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqKi9cbiAgICBnZXRDdXJyZW50UGFnZURpbWVuc2lvbnNBdEN1cnJlbnRab29tTGV2ZWwgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VEaW1lbnNpb25zQXRDdXJyZW50Wm9vbUxldmVsKHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGZpbGVuYW1lIChkZXByZWNhdGVkKS4gUmV0dXJucyB0aGUgVVJJIGZvciBjdXJyZW50IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBVUkkgZm9yIHRoZSBjdXJyZW50IHBhZ2UgaW1hZ2UuXG4gICAgICoqL1xuICAgIGdldEN1cnJlbnRQYWdlRmlsZW5hbWUgKClcbiAgICB7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhpcyBtZXRob2Qgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgRGl2YS4gUGxlYXNlIHVzZSBnZXRDdXJyZW50UGFnZVVSSSBpbnN0ZWFkLicpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlc1t0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleF0uZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhZ2UgaW5kaWNlcyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7YXJyYXl9IC0gVGhlIDAtYmFzZWQgaW5kaWNlcyBhcnJheSBmb3IgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhZ2VzLlxuICAgICAqKi9cbiAgICBnZXRDdXJyZW50UGFnZUluZGljZXMgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmN1cnJlbnRQYWdlSW5kaWNlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSAwLWJhc2VkIGluZGV4IGZvciB0aGUgY3VycmVudCBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIDAtYmFzZWQgaW5kZXggZm9yIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBwYWdlLlxuICAgICAqKi9cbiAgICAgZ2V0QWN0aXZlUGFnZUluZGV4ICgpXG4gICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4O1xuICAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG9ydGN1dCB0byBnZXRQYWdlT2Zmc2V0IGZvciBjdXJyZW50IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge30gLVxuICAgICAqICovXG4gICAgZ2V0Q3VycmVudFBhZ2VPZmZzZXQgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VPZmZzZXQodGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgVVJJIGZvciB0aGUgdmlzaWJsZSBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIFVSSSBmb3IgdGhlIGN1cnJlbnQgcGFnZSBpbWFnZS5cbiAgICAgKiovXG4gICAgZ2V0Q3VycmVudFBhZ2VVUkkgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3RoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4XS5mO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY3VycmVudCBVUkwgZm9yIHRoZSB2aWV3ZXIsIGluY2x1ZGluZyB0aGUgaGFzaCBwYXJhbWV0ZXJzIHJlZmxlY3RpbmdcbiAgICAgKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmlld2VyLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIFVSTCBmb3IgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZS5cbiAgICAgKiAqL1xuICAgIGdldEN1cnJlbnRVUkwgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDdXJyZW50VVJMKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZmlsZW5hbWVzIGluIHRoZSBkb2N1bWVudC4gRGVwcmVjYXRlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gLSBBbiBhcnJheSBvZiBhbGwgdGhlIFVSSXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqICovXG4gICAgZ2V0RmlsZW5hbWVzICgpXG4gICAge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoaXMgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgRGl2YS4gVXNlIGdldEFsbFBhZ2VVUklzIGluc3RlYWQuJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXMubWFwKCAocGcpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwZy5mO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBncmlkIHBhZ2VzIHBlciByb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgbnVtYmVyIG9mIGdyaWQgcGFnZXMgcGVyIHJvdy5cbiAgICAgKiovXG4gICAgZ2V0R3JpZFBhZ2VzUGVyUm93ICgpXG4gICAge1xuICAgICAgICAvLyBUT0RPKHdhYmFpbik6IEFkZCB0ZXN0IGNhc2VcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucGFnZXNQZXJSb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBpbnN0YW5jZSBJRCBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgaW5zdGFuY2UgSUQuXG4gICAgICogKi9cbiAgICAvL1xuICAgIGdldEluc3RhbmNlSWQgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLklEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaW5zdGFuY2Ugc2VsZWN0b3IgZm9yIHRoaXMgaW5zdGFuY2UuIFRoaXMgaXMgdGhlIHNlbGVjdG9yIGZvciB0aGUgcGFyZW50XG4gICAgICogZGl2LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHZpZXdwb3J0IHNlbGVjdG9yLlxuICAgICAqICovXG4gICAgZ2V0SW5zdGFuY2VTZWxlY3RvciAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LCBiYXNlZCBvbiB0aGUgbGFiZWwgaW4gdGhlIElJSUYgbWFuaWZlc3QuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgY3VycmVudCB0aXRsZSBvZiB0aGUgb2JqZWN0IGZyb20gdGhlIGxhYmVsIGtleSBpbiB0aGUgSUlJRiBNYW5pZmVzdC5cbiAgICAgKiovXG4gICAgZ2V0SXRlbVRpdGxlICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5pdGVtVGl0bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWF4aW11bSB6b29tIGxldmVsIGZvciB0aGUgZW50aXJlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIG1heGltdW0gem9vbSBsZXZlbCBmb3IgdGhlIGRvY3VtZW50XG4gICAgICogKi9cbiAgICBnZXRNYXhab29tTGV2ZWwgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1heFpvb21MZXZlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXggem9vbSBsZXZlbCBmb3IgYSBnaXZlbiBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlSWR4IC0gVGhlIDAtYmFzZWQgaW5kZXggbnVtYmVyIGZvciB0aGUgcGFnZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgZm9yIHRoYXQgcGFnZS5cbiAgICAgKiAqL1xuICAgIGdldE1heFpvb21MZXZlbEZvclBhZ2UgKHBhZ2VJZHgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrTG9hZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbcGFnZUlkeF0ubTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgZm9yIHRoZSBlbnRpcmUgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgbWluaW11bSB6b29tIGxldmVsIGZvciB0aGUgZG9jdW1lbnRcbiAgICAgKiAqL1xuICAgIGdldE1pblpvb21MZXZlbCAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWluWm9vbUxldmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKiAqL1xuICAgIGdldE51bWJlck9mUGFnZXMgKClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tMb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5udW1QYWdlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBhIGNhbnZhcyBoYXMgbXVsdGlwbGUgaW1hZ2VzIGRlZmluZWQsIHJldHVybnMgdGhlIG5vbi1wcmltYXJ5IGltYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge251bWJlcn0gcGFnZUluZGV4IC0gVGhlIHBhZ2UgaW5kZXggZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgb3RoZXIgaW1hZ2VzLlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvdGhlciBpbWFnZXMuXG4gICAgICoqL1xuICAgIGdldE90aGVySW1hZ2VzIChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlc1twYWdlSW5kZXhdLm90aGVySW1hZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBwYWdlIGRpbWVuc2lvbnMgaW4gdGhlIGN1cnJlbnQgdmlldyBhbmQgem9vbSBsZXZlbFxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge251bWJlcn0gcGFnZUluZGV4IC0gQSB2YWxpZCAwLWJhc2VkIHBhZ2UgaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwYWdlXG4gICAgICogKi9cbiAgICBnZXRQYWdlRGltZW5zaW9ucyAocGFnZUluZGV4KVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja0xvYWRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZ2V0Q3VycmVudExheW91dCgpLmdldFBhZ2VEaW1lbnNpb25zKHBhZ2VJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiBhIGdpdmVuIHBhZ2UgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKiBBbHNvIHdvcmtzIGluIEdyaWQgdmlld1xuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlSW5kZXggLSBUaGUgMC1iYXNlZCBwYWdlIGluZGV4XG4gICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFnZSBkaW1lbnNpb25zIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICogKi9cbiAgICBnZXRQYWdlRGltZW5zaW9uc0F0Q3VycmVudFpvb21MZXZlbCAocGFnZUluZGV4KVxuICAgIHtcbiAgICAgICAgbGV0IHBpZHggPSBwYXJzZUludChwYWdlSW5kZXgsIDEwKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2lzUGFnZUluZGV4VmFsaWQocGlkeCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUGFnZSBJbmRleCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldEN1cnJlbnRMYXlvdXQoKS5nZXRQYWdlRGltZW5zaW9ucyhwaWR4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcGFnZSBkaW1lbnNpb25zIGF0IGEgZ2l2ZW4gem9vbSBsZXZlbFxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge251bWJlcn0gcGFnZUlkeCAtIEEgdmFsaWQgMC1iYXNlZCBwYWdlIGluZGV4XG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSB6b29tTGV2ZWwgLSBBIGNhbmRpZGF0ZSB6b29tIGxldmVsLlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHBhZ2UgYXQgdGhlIGdpdmVuIHpvb20gbGV2ZWwuXG4gICAgICoqL1xuICAgIGdldFBhZ2VEaW1lbnNpb25zQXRab29tTGV2ZWwgKHBhZ2VJZHgsIHpvb21MZXZlbClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tMb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoem9vbUxldmVsID4gdGhpcy5zZXR0aW5ncy5tYXhab29tTGV2ZWwpXG4gICAgICAgICAgICB6b29tTGV2ZWwgPSB0aGlzLnNldHRpbmdzLm1heFpvb21MZXZlbDtcblxuICAgICAgICBjb25zdCBwZyA9IHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbcGFyc2VJbnQocGFnZUlkeCwgMTApXTtcbiAgICAgICAgY29uc3QgcGdBdFpvb20gPSBwZy5kW3BhcnNlSW50KHpvb21MZXZlbCwgMTApXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IHBnQXRab29tLncsXG4gICAgICAgICAgICBoZWlnaHQ6IHBnQXRab29tLmhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVVJMIGZvciB0aGUgaW1hZ2Ugb2YgdGhlIHBhZ2UgYXQgdGhlIGdpdmVuIGluZGV4LiBUaGVcbiAgICAgKiBvcHRpb25hbCBzaXplIHBhcmFtZXRlciBzdXBwb3J0cyBzZXR0aW5nIHRoZSBpbWFnZSB3aWR0aCBvciBoZWlnaHRcbiAgICAgKiAoZGVmYXVsdCBpcyBmdWxsLXNpemVkKS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIDAtYmFzZWQgcGFnZSBpbmRleFxuICAgICAqIEBwYXJhbXMgez9vYmplY3R9IHNpemUgLSBhbiBvYmplY3QgY29udGFpbmluZyB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgSUlJRiBVUkwgZm9yIGEgZ2l2ZW4gcGFnZSBhdCBhbiBvcHRpb25hbCBzaXplXG4gICAgICovXG4gICAgZ2V0UGFnZUltYWdlVVJMIChwYWdlSW5kZXgsIHNpemUpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5nZXRQYWdlSW1hZ2VVUkwocGFnZUluZGV4LCBzaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHNldCBvZiBjby1vcmRpbmF0ZXMgKGUuZy4sIGZyb20gYSBtb3VzZSBjbGljayksIHJldHVybiB0aGUgMC1iYXNlZCBwYWdlIGluZGV4XG4gICAgICogZm9yIHdoaWNoIGl0IG1hdGNoZXMuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBwYWdlWCAtIFRoZSB4IGNvLW9yZGluYXRlXG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBwYWdlWSAtIFRoZSB5IGNvLW9yZGluYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgcGFnZSBpbmRleCBtYXRjaGluZyB0aGUgY28tb3JkaW5hdGVzLlxuICAgICAqICovXG4gICAgZ2V0UGFnZUluZGV4Rm9yUGFnZVhZVmFsdWVzIChwYWdlWCwgcGFnZVkpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UGFnZUluZGV4Rm9yUGFnZVhZVmFsdWVzKHBhZ2VYLCBwYWdlWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBub3J0aHdlc3QgY29ybmVycyBvZiBkaXZhLWlubmVyIGFuZCBwYWdlIGluZGV4LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge251bWJlcn0gcGFnZUluZGV4IC0gVGhlIDAtYmFzZWQgcGFnZSBpbmRleFxuICAgICAqIEBwYXJhbXMgez9vcHRpb25zfSBvcHRpb25zIC0gQSBzZXQgb2Ygb3B0aW9ucyB0byBwYXNzIGluLlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIG9mZnNldCBiZXR3ZWVuIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBhbmQgdGhlIHBhZ2UuXG4gICAgICpcbiAgICAgKiAqL1xuICAgIGdldFBhZ2VPZmZzZXQgKHBhZ2VJbmRleCwgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZ2V0UGFnZVJlZ2lvbihwYWdlSW5kZXgsIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IHJlZ2lvbi50b3AsXG4gICAgICAgICAgICBsZWZ0OiByZWdpb24ubGVmdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaW5zdGFuY2Ugc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge29iamVjdH0gLSBUaGUgY3VycmVudCBpbnN0YW5jZSBzZXR0aW5ncy5cbiAgICAgKiAqL1xuICAgIGdldFNldHRpbmdzICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29tcGxldGUgc3RhdGUgb2YgdGhlIHZpZXdlci5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBjdXJyZW50IGluc3RhbmNlIHN0YXRlLlxuICAgICAqICovXG4gICAgZ2V0U3RhdGUgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKiAqL1xuICAgIGdldFpvb21MZXZlbCAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Muem9vbUxldmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBHbyB0byBhIHBhcnRpY3VsYXIgcGFnZSAod2l0aCBpbmRleGluZyBzdGFydGluZyBhdCAwKS5cbiAgICAgKiAgVGhlICh4QW5jaG9yKSBzaWRlIG9mIHRoZSBwYWdlIHdpbGwgYmUgYW5jaG9yZWQgdG8gdGhlICh4QW5jaG9yKSBzaWRlIG9mIHRoZSBkaXZhLW91dGVyIGVsZW1lbnRcbiAgICAgKlxuICAgICAqICBAcHVibGljXG4gICAgICogIEBwYXJhbXMge251bWJlcn0gcGFnZUluZGV4IC0gMC1iYXNlZCBwYWdlIGluZGV4LlxuICAgICAqICBAcGFyYW1zIHs/c3RyaW5nfSB4QW5jaG9yIC0gbWF5IGVpdGhlciBiZSBcImxlZnRcIiwgXCJyaWdodFwiLCBvciBkZWZhdWx0IFwiY2VudGVyXCJcbiAgICAgKiAgQHBhcmFtcyB7P3N0cmluZ30geUFuY2hvciAtIG1heSBlaXRoZXIgYmUgXCJ0b3BcIiwgXCJib3R0b21cIiwgb3IgZGVmYXVsdCBcImNlbnRlclwiOyBzYW1lIHByb2Nlc3MgYXMgeEFuY2hvci5cbiAgICAgKiAgQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgcGFnZSBpbmRleCBpcyB2YWxpZDsgZmFsc2UgaWYgaXQgaXMgbm90LlxuICAgICAqICovXG4gICAgZ290b1BhZ2VCeUluZGV4IChwYWdlSW5kZXgsIHhBbmNob3IsIHlBbmNob3IpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ290b1BhZ2VCeUluZGV4KHBhZ2VJbmRleCwgeEFuY2hvciwgeUFuY2hvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBjYW52YXMgbGFiZWwsIGF0dGVtcHQgdG8gZ28gdG8gdGhhdCBwYWdlLiBJZiBubyBsYWJlbCB3YXMgZm91bmQuXG4gICAgICogdGhlIGxhYmVsIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIG1hdGNoIGFnYWluc3QgdGhlIHBhZ2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7c3RyaW5nfSBsYWJlbCAtIFRoZSBsYWJlbCB0byBzZWFyY2ggb24uXG4gICAgICogQHBhcmFtcyB7P3N0cmluZ30geEFuY2hvciAtIG1heSBlaXRoZXIgYmUgXCJsZWZ0XCIsIFwicmlnaHRcIiwgb3IgZGVmYXVsdCBcImNlbnRlclwiXG4gICAgICogQHBhcmFtcyB7P3N0cmluZ30geUFuY2hvciAtIG1heSBlaXRoZXIgYmUgXCJ0b3BcIiwgXCJib3R0b21cIiwgb3IgZGVmYXVsdCBcImNlbnRlclwiXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgcGFnZSBpbmRleCBpcyB2YWxpZDsgZmFsc2UgaWYgaXQgaXMgbm90LlxuICAgICAqICovXG4gICAgZ290b1BhZ2VCeUxhYmVsIChsYWJlbCwgeEFuY2hvciwgeUFuY2hvcilcbiAgICB7XG4gICAgICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlcztcbiAgICAgICAgbGV0IGxsYyA9IGxhYmVsLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAocGFnZXNbaV0ubC50b0xvd2VyQ2FzZSgpLmluZGV4T2YobGxjKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nb3RvUGFnZUJ5SW5kZXgoaSwgeEFuY2hvciwgeUFuY2hvcik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBwYXJzZUludChsYWJlbCwgMTApIC0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dvdG9QYWdlQnlJbmRleChwYWdlSW5kZXgsIHhBbmNob3IsIHlBbmNob3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gYSBwYWdlIGJhc2VkIG9uIGl0cyBmaWxlbmFtZS4gRGVwcmVjYXRlZC4gVXNlIGdvdG9QYWdlQnlVUkkgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtzdHJpbmd9IGZpbGVuYW1lIC0gVGhlIGZpbGVuYW1lIG9mIHRoZSBpbWFnZSB0byBqdW1wIHRvLlxuICAgICAqIEBwYXJhbXMgez9zdHJpbmd9IHhBbmNob3IgLSBtYXkgZWl0aGVyIGJlIFwibGVmdFwiLCBcInJpZ2h0XCIsIG9yIGRlZmF1bHQgXCJjZW50ZXJcIlxuICAgICAqIEBwYXJhbXMgez9zdHJpbmd9IHlBbmNob3IgLSBtYXkgZWl0aGVyIGJlIFwidG9wXCIsIFwiYm90dG9tXCIsIG9yIGRlZmF1bHQgXCJjZW50ZXJcIlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlIGlmIHRoZSBmaWxlbmFtZSBpcyBub3QgZm91bmQuXG4gICAgKi9cbiAgICBnb3RvUGFnZUJ5TmFtZSAoZmlsZW5hbWUsIHhBbmNob3IsIHlBbmNob3IpXG4gICAge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIERpdmEuanMuIFVzZSBnb3RvUGFnZUJ5VVJJIGluc3RlYWQuJyk7XG4gICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IHRoaXMuX2dldFBhZ2VJbmRleChmaWxlbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nb3RvUGFnZUJ5SW5kZXgocGFnZUluZGV4LCB4QW5jaG9yLCB5QW5jaG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIGEgcGFnZSBiYXNlZCBvbiBpdHMgVVJJLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge3N0cmluZ30gdXJpIC0gVGhlIFVSSSBvZiB0aGUgaW1hZ2UgdG8ganVtcCB0by5cbiAgICAgKiBAcGFyYW1zIHs/c3RyaW5nfSB4QW5jaG9yIC0gbWF5IGVpdGhlciBiZSBcImxlZnRcIiwgXCJyaWdodFwiLCBvciBkZWZhdWx0IFwiY2VudGVyXCJcbiAgICAgKiBAcGFyYW1zIHs/c3RyaW5nfSB5QW5jaG9yIC0gbWF5IGVpdGhlciBiZSBcInRvcFwiLCBcImJvdHRvbVwiLCBvciBkZWZhdWx0IFwiY2VudGVyXCJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBzdWNjZXNzZnVsIGFuZCBmYWxzZSBpZiB0aGUgVVJJIGlzIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBnb3RvUGFnZUJ5VVJJICh1cmksIHhBbmNob3IsIHlBbmNob3IpXG4gICAge1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLl9nZXRQYWdlSW5kZXgodXJpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dvdG9QYWdlQnlJbmRleChwYWdlSW5kZXgsIHhBbmNob3IsIHlBbmNob3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHBhZ2UgaGFzIG90aGVyIGltYWdlcyB0byBkaXNwbGF5LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge251bWJlcn0gcGFnZUluZGV4IC0gVGhlIDAtYmFzZWQgcGFnZSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBwYWdlIGhhcyBvdGhlciBpbWFnZXMgdG8gZGlzcGxheS5cbiAgICAgKiovXG4gICAgaGFzT3RoZXJJbWFnZXMgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3BhZ2VJbmRleF0ub3RoZXJJbWFnZXMgPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHBhZ2VzIHRoYXQgYXJlIG1hcmtlZCBcIm5vbi1wYWdlZFwiIGluIHRoZSBJSUlGIG1hbmlmZXN0LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqKi9cbiAgICBoaWRlTm9uUGFnZWRQYWdlcyAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcmVsb2FkVmlld2VyKHsgc2hvd05vblBhZ2VkUGFnZXM6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIHRoZSB2aWV3ZXIgY3VycmVudGx5IGluIGZ1bGwtc2NyZWVuIG1vZGU/XG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgdmlld2VyIGlzIGluIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKiovXG4gICAgaXNJbkZ1bGxzY3JlZW4gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmluRnVsbHNjcmVlbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHBhZ2UgaW5kZXggaXMgd2l0aGluIHRoZSByYW5nZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBwYWdlIGluZGV4IGlzIHZhbGlkLlxuICAgICAqKi9cbiAgICBpc1BhZ2VJbmRleFZhbGlkIChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNQYWdlSW5kZXhWYWxpZChwYWdlSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBwYWdlIGlzIGN1cnJlbnRseSBpbiB0aGUgdmlld3BvcnRcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIFRoZSAwLWJhc2VkIHBhZ2UgaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBwYWdlIGlzIGN1cnJlbnRseSBpbiB0aGUgdmlld3BvcnQuXG4gICAgICoqL1xuICAgIGlzUGFnZUluVmlld3BvcnQgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmlzUGFnZVZpc2libGUocGFnZUluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBEaXZhIHZpZXdlciBoYXMgYmVlbiBmdWxseSBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSB2aWV3ZXIgaXMgaW5pdGlhbGl6ZWQ7IGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiovXG4gICAgaXNSZWFkeSAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGUubG9hZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHNvbWV0aGluZyAoZS5nLiBhIGhpZ2hsaWdodCBib3ggb24gYSBwYXJ0aWN1bGFyIHBhZ2UpIGlzIHZpc2libGVcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIFRoZSAwLWJhc2VkIHBhZ2UgaW5kZXhcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IGxlZnRPZmZzZXQgLSBUaGUgZGlzdGFuY2Ugb2YgdGhlIHJlZ2lvbiBmcm9tIHRoZSBsZWZ0IG9mIHRoZSB2aWV3cG9ydFxuICAgICAqIEBwYXJhbXMge251bWJlcn0gdG9wT2Zmc2V0IC0gVGhlIGRpc3RhbmNlIG9mIHRoZSByZWdpb24gZnJvbSB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydFxuICAgICAqIEBwYXJhbXMge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvblxuICAgICAqIEBwYXJhbXMge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcmVnaW9uIGlzIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKiovXG4gICAgaXNSZWdpb25JblZpZXdwb3J0IChwYWdlSW5kZXgsIGxlZnRPZmZzZXQsIHRvcE9mZnNldCwgd2lkdGgsIGhlaWdodClcbiAgICB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZ2V0Q3VycmVudExheW91dCgpO1xuXG4gICAgICAgIGlmICghbGF5b3V0KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGxheW91dC5nZXRQYWdlT2Zmc2V0KHBhZ2VJbmRleCk7XG5cbiAgICAgICAgY29uc3QgdG9wID0gb2Zmc2V0LnRvcCArIHRvcE9mZnNldDtcbiAgICAgICAgY29uc3QgbGVmdCA9IG9mZnNldC5sZWZ0ICsgbGVmdE9mZnNldDtcblxuICAgICAgICByZXR1cm4gdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnRlcnNlY3RzUmVnaW9uKHtcbiAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgYm90dG9tOiB0b3AgKyBoZWlnaHQsXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IGxlZnQgKyB3aWR0aFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBwYWdlIGxheW91dCBpcyB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseSBvcmllbnRlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHZlcnRpY2FsOyBmYWxzZSBpZiBob3Jpem9udGFsLlxuICAgICAqKi9cbiAgICBpc1ZlcnRpY2FsbHlPcmllbnRlZCAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudmVydGljYWxseU9yaWVudGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlYXZlIGZ1bGxzY3JlZW4gbW9kZSBpZiBjdXJyZW50bHkgaW4gZnVsbHNjcmVlbiBtb2RlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgaWYgaW4gZnVsbHNjcmVlbiBtb2RlIGludGl0aWFsbHksIGZhbHNlIG90aGVyd2lzZVxuICAgICAqKi9cbiAgICBsZWF2ZUZ1bGxzY3JlZW5Nb2RlICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkZ1bGxzY3JlZW4pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlYXZlIGdyaWQgdmlldyBpZiBjdXJyZW50bHkgaW4gZ3JpZCB2aWV3LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgaWYgaW4gZ3JpZCB2aWV3IGluaXRpYWxseSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICoqL1xuICAgIGxlYXZlR3JpZFZpZXcgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmluR3JpZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fcmVsb2FkVmlld2VyKHsgaW5HcmlkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGdyaWQgcGFnZXMgcGVyIHJvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VzUGVyUm93IC0gVGhlIG51bWJlciBvZiBwYWdlcyBwZXIgcm93XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqKi9cbiAgICBzZXRHcmlkUGFnZXNQZXJSb3cgKHBhZ2VzUGVyUm93KVxuICAgIHtcbiAgICAgICAgLy8gVE9ETyh3YWJhaW4pOiBBZGQgdGVzdCBjYXNlXG4gICAgICAgIGlmICghdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5pc1ZhbGlkT3B0aW9uKCdwYWdlc1BlclJvdycsIHBhZ2VzUGVyUm93KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcmVsb2FkVmlld2VyKHtcbiAgICAgICAgICAgIGluR3JpZDogdHJ1ZSxcbiAgICAgICAgICAgIHBhZ2VzUGVyUm93OiBwYWdlc1BlclJvd1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlnbiB0aGlzIGRpdmEgaW5zdGFuY2Ugd2l0aCBhIHN0YXRlIG9iamVjdCAoYXMgcmV0dXJuZWQgYnkgZ2V0U3RhdGUpXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7b2JqZWN0fSBzdGF0ZSAtIEEgRGl2YSBzdGF0ZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqKi9cbiAgICBzZXRTdGF0ZSAoc3RhdGUpXG4gICAge1xuICAgICAgICB0aGlzLl9yZWxvYWRWaWV3ZXIodGhpcy5fZ2V0TG9hZE9wdGlvbnNGb3JTdGF0ZShzdGF0ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqKi9cbiAgICBzZXRab29tTGV2ZWwgKHpvb21MZXZlbClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmluR3JpZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fcmVsb2FkVmlld2VyKHtcbiAgICAgICAgICAgICAgICBpbkdyaWQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLnpvb20oem9vbUxldmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IG5vbi1wYWdlZCBwYWdlcy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICoqL1xuICAgIHNob3dOb25QYWdlZFBhZ2VzICgpXG4gICAge1xuICAgICAgICB0aGlzLl9yZWxvYWRWaWV3ZXIoeyBzaG93Tm9uUGFnZWRQYWdlczogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZnVsbHNjcmVlbiBtb2RlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiovXG4gICAgdG9nZ2xlRnVsbHNjcmVlbk1vZGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3RvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93L0hpZGUgbm9uLXBhZ2VkIHBhZ2VzXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqKi9cbiAgICB0b2dnbGVOb25QYWdlZFBhZ2VzVmlzaWJpbGl0eSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcmVsb2FkVmlld2VyKHtcbiAgICAgICAgICAgIHNob3dOb25QYWdlZFBhZ2VzOiAhdGhpcy5zZXR0aW5ncy5zaG93Tm9uUGFnZWRQYWdlc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL0NoYW5nZXMgYmV0d2VlbiBob3Jpem9udGFsIGxheW91dCBhbmQgdmVydGljYWwgbGF5b3V0LiBSZXR1cm5zIHRydWUgaWYgZG9jdW1lbnQgaXMgbm93IHZlcnRpY2FsbHkgb3JpZW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICB0b2dnbGVPcmllbnRhdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvZ2dsZVBhZ2VMYXlvdXRPcmllbnRhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZXMgYSBtZWFzdXJlbWVudCBmcm9tIHRoZSB6b29tIGxldmVsIG9uIHRoZSBsYXJnZXN0IHNpemVcbiAgICAgKiB0byBvbmUgb24gdGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBhIHBvaW50IDEwMDAgb24gYW4gaW1hZ2UgdGhhdCBpcyBvbiB6b29tIGxldmVsIDIgb2YgNVxuICAgICAqIHRyYW5zbGF0ZXMgdG8gYSBwb3NpdGlvbiBvZiAxMTEuMTExLi4uICgxMDAwIC8gKDUgLSAyKV4yKS5cbiAgICAgKlxuICAgICAqIFdvcmtzIGZvciBhIHNpbmdsZSBwaXhlbCBjby1vcmRpbmF0ZSBvciBhIGRpbWVuc2lvbiAoZS5nLiwgdHJhbnNsYXRlcyBhIGJveFxuICAgICAqIHRoYXQgaXMgMTAwMCBwaXhlbHMgd2lkZSBvbiB0aGUgb3JpZ2luYWwgdG8gb25lIHRoYXQgaXMgMTExLjExMSBwaXhlbHMgd2lkZVxuICAgICAqIG9uIHRoZSBjdXJyZW50IHpvb20gbGV2ZWwpLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge251bWJlcn0gcG9zaXRpb24gLSBBIHBvaW50IG9uIHRoZSBtYXggem9vbSBsZXZlbFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHNhbWUgcG9pbnQgb24gdGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAqL1xuICAgIHRyYW5zbGF0ZUZyb21NYXhab29tTGV2ZWwgKHBvc2l0aW9uKVxuICAgIHtcbiAgICAgICAgY29uc3Qgem9vbURpZmZlcmVuY2UgPSB0aGlzLnNldHRpbmdzLm1heFpvb21MZXZlbCAtIHRoaXMuc2V0dGluZ3Muem9vbUxldmVsO1xuICAgICAgICByZXR1cm4gcG9zaXRpb24gLyBNYXRoLnBvdygyLCB6b29tRGlmZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlcyBhIG1lYXN1cmVtZW50IGZyb20gdGhlIGN1cnJlbnQgem9vbSBsZXZlbCB0byB0aGUgcG9zaXRpb24gb24gdGhlXG4gICAgICogbGFyZ2VzdCB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogV29ya3MgZm9yIGEgc2luZ2xlIHBpeGVsIGNvLW9yZGluYXRlIG9yIGEgZGltZW5zaW9uIChlLmcuLCB0cmFuc2xhdGVzIGEgYm94XG4gICAgICogdGhhdCBpcyAxMTEuMTExIHBpeGVscyB3aWRlIG9uIHRoZSBjdXJyZW50IGltYWdlIHRvIG9uZSB0aGF0IGlzIDEwMDAgcGl4ZWxzIHdpZGVcbiAgICAgKiBvbiB0aGUgY3VycmVudCB6b29tIGxldmVsKS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBvc2l0aW9uIC0gQSBwb2ludCBvbiB0aGUgY3VycmVudCB6b29tIGxldmVsXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgc2FtZSBwb2ludCBvbiB0aGUgbWF4IHpvb20gbGV2ZWwuXG4gICAgKi9cbiAgICB0cmFuc2xhdGVUb01heFpvb21MZXZlbCAocG9zaXRpb24pXG4gICAge1xuICAgICAgICBjb25zdCB6b29tRGlmZmVyZW5jZSA9IHRoaXMuc2V0dGluZ3MubWF4Wm9vbUxldmVsIC0gdGhpcy5zZXR0aW5ncy56b29tTGV2ZWw7XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSwgaXQncyBhIGJveCBvbiB0aGUgbWF4IHpvb20gbGV2ZWwgYW5kXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHJldHVybiB0aGUgcG9zaXRpb24uXG4gICAgICAgIGlmICh6b29tRGlmZmVyZW5jZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcblxuICAgICAgICByZXR1cm4gcG9zaXRpb24gKiBNYXRoLnBvdygyLCB6b29tRGlmZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbSBpbi5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBmYWxzZSBpZiBpdCdzIGF0IHRoZSBtYXhpbXVtIHpvb21cbiAgICAgKiovXG4gICAgem9vbUluICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRab29tTGV2ZWwodGhpcy5zZXR0aW5ncy56b29tTGV2ZWwgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBab29tIG91dC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBmYWxzZSBpZiBpdCdzIGF0IHRoZSBtaW5pbXVtIHpvb21cbiAgICAgKiovXG4gICAgem9vbU91dCAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Wm9vbUxldmVsKHRoaXMuc2V0dGluZ3Muem9vbUxldmVsIC0gMSk7XG4gICAgfVxufVxuXG5EaXZhLkV2ZW50cyA9IGRpdmEuRXZlbnRzO1xuXG5leHBvcnQgZGVmYXVsdCBEaXZhO1xuXG4vKipcbiAqIE1ha2UgYERpdmFgIGF2YWlsYWJsZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG4gKiAqL1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgKGZ1bmN0aW9uIChnbG9iYWwpXG4gICAge1xuICAgICAgICBnbG9iYWwuRGl2YSA9IGdsb2JhbC5EaXZhIHx8IERpdmE7XG4gICAgfSkod2luZG93KTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file + */r=[t],void 0===(s="function"==typeof(i=function(e){var t,n,i=window,r=document,s=[],o=function(e,o){for(e=0;e{if("%%"===n)return"%";o++;const s=t.formatters[r];if("function"==typeof s){const t=e[o];n=s.call(i,t),e.splice(o,1),o--}return n}),t.formatArgs.call(i,e);(i.log||t.log).apply(i,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=i,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(r!==t.namespaces&&(r=t.namespaces,s=t.enabled(e)),s),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function i(e,n){const i=t(this.namespace+(void 0===n?":":n)+e);return i.log=this.log,i}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map(e=>"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const i=("string"==typeof e?e:"").split(/[\s,]+/),r=i.length;for(n=0;n{t[n]=e[n]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t=1.5*n;return Math.round(e/n)+" "+i+(r?"s":"")}e.exports=function(e,t){t=t||{};var a=typeof e;if("string"===a&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var o=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*o;case"weeks":case"week":case"w":return 6048e5*o;case"days":case"day":case"d":return o*s;case"hours":case"hour":case"hrs":case"hr":case"h":return o*r;case"minutes":case"minute":case"mins":case"min":case"m":return o*i;case"seconds":case"second":case"secs":case"sec":case"s":return o*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return o;default:return}}(e);if("number"===a&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=s)return o(e,t,s,"day");if(t>=r)return o(e,t,r,"hour");if(t>=i)return o(e,t,i,"minute");if(t>=n)return o(e,t,n,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=s)return Math.round(e/s)+"d";if(t>=r)return Math.round(e/r)+"h";if(t>=i)return Math.round(e/i)+"m";if(t>=n)return Math.round(e/n)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(13),r=n(82),s=n(7),o=n(4);t.default=class{constructor(e,t,n){this.neonView=e,this.container=document.getElementById("container"),this.updateCallbacks=new Array(0),this.group=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.group.id="svg_group",this.group.setAttribute("height",window.innerHeight.toString()),this.group.setAttribute("width","100%"),this.bg=document.createElementNS("http://www.w3.org/2000/svg","image"),this.bg.id="bgimg",this.bg.classList.add("background"),this.bg.setAttribute("x","0"),this.bg.setAttribute("y","0");const i=new FileReader;fetch(n).then(e=>{if(e.ok)return i.addEventListener("load",()=>{this.bg.setAttributeNS("http://www.w3.org/1999/xlink","href",i.result.toString());const e=this.bg.getBBox();if(!this.group.hasAttribute("viewBox")){let{viewBox:t}=(0,o.getSettings)();t||(t="0 0 "+e.width.toString()+" "+e.height.toString()),this.group.setAttribute("viewBox",t)}}),e.blob()}).then(e=>{i.readAsDataURL(e)}),this.svg=document.createElementNS("http://www.w3.org/svg","svg"),this.svg.id="mei_output",this.svg.classList.add("neon-container","active-page"),this.group.appendChild(this.bg),this.group.appendChild(this.svg),this.container.appendChild(this.group),this.zoomHandler=new r.default,this.displayPanel=new t(this,"neon-container","background",this.zoomHandler),this.pageURI=n,document.getElementById("loading").style.display="none"}onSVGLoad(){this.setViewEventHandlers(),this.displayPanel.setDisplayListeners()}updateSVG(e){this.group.replaceChild(e,this.svg),this.svg=e,this.svg.id="mei_output",this.svg.classList.add("neon-container","active-page");const t=parseInt(this.svg.getAttribute("height")),n=parseInt(this.svg.getAttribute("width"));this.bg.setAttribute("height",t.toString()),this.bg.setAttribute("width",n.toString());const{viewBox:r}=(0,o.getSettings)();r?this.group.setAttribute("viewBox",r):this.group.setAttribute("viewBox","0 0 "+n+" "+t),(0,i.updateHighlight)(),this.resetTransformations(),this.updateCallbacks.forEach(e=>e())}async changePage(e,t){const n=await this.neonView.getPageSVG(this.getCurrentPageURI());this.updateSVG(n)}addUpdateCallback(e){this.updateCallbacks.push(e)}removeUpdateCallback(e){const t=this.updateCallbacks.findIndex(t=>t===e);-1!==t&&this.updateCallbacks.splice(t,1)}resetTransformations(){this.displayPanel.zoomHandler.restoreTransformation(),(0,i.setGlyphOpacityFromSlider)(),(0,i.setBgOpacityFromSlider)()}getCurrentPage(){return 0}getCurrentPageURI(){return this.pageURI}setViewEventHandlers(){document.body.addEventListener("keydown",e=>{switch(e.key){case"Shift":s.select("#svg_group").on(".drag",null),s.select("#svg_group").call(s.drag().on("start",this.displayPanel.zoomHandler.startDrag.bind(this.displayPanel.zoomHandler)).on("drag",this.displayPanel.zoomHandler.dragging.bind(this.displayPanel.zoomHandler)));break;case"h":document.getElementById("mei_output").setAttribute("visibility","hidden")}}),document.body.addEventListener("keyup",e=>{switch(e.key){case"Shift":s.select("#svg_group").on(".drag",null),"viewer"!==this.neonView.getUserMode()&&this.neonView.NeumeEdit.setSelectListeners();break;case"h":document.getElementById("mei_output").setAttribute("visibility","visible")}}),s.select("#container").on("touchstart",()=>{2===s.event.touches.length&&(this.displayPanel.zoomHandler.startDrag(),s.select("#container").on("touchmove",this.displayPanel.zoomHandler.dragging.bind(this.displayPanel.zoomHandler)),s.select("#container").on("touchend",()=>{s.select("#container").on("touchmove",null)}))}),s.select("#container").on("wheel",this.displayPanel.zoomHandler.scrollZoom.bind(this.displayPanel.zoomHandler),!1),window.onresize=()=>{const e=window.innerHeight,t=document.getElementById("container");e>Number(t.getAttribute("height"))&&t.setAttribute("height",e.toString())}}getPageName(){return this.neonView.name}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.ZoomHandler=t.ViewBox=void 0;const i=n(7),r=n(4);class s{constructor(e,t){this.minX=0,this.minY=0,this.width=e,this.height=t,this.imageWidth=e,this.imageHeight=t}set(e,t,n,i){this.minX=e,this.minY=t,this.width=n,this.height=i}get(){return this.minX.toString()+" "+this.minY.toString()+" "+this.width+" "+this.height}zoomTo(e){const t=this.imageHeight/e,n=this.imageWidth/e;this.width=n,this.height=t}getZoom(){return this.imageWidth/this.width}translate(e,t){this.minX+=e,this.minY+=t}}t.ViewBox=s;class o{resetZoomAndPan(e=!0){const t=document.getElementById("bgimg");this.viewBox=new s(parseInt(t.getAttribute("width")),parseInt(t.getAttribute("height"))),e&&(this.updateSVGViewBox(),(0,r.setSettings)({zoom:100}))}zoomTo(e){this.setViewBox(),this.viewBox.zoomTo(e),this.updateSVGViewBox(),(0,r.setSettings)({zoom:Math.floor(100*e)})}translate(e,t){this.setViewBox(),this.viewBox.translate(e,t),this.updateSVGViewBox()}restoreTransformation(){void 0===this.viewBox?this.resetZoomAndPan(!1):this.updateSVGViewBox()}setViewBox(){if(void 0===this.viewBox){const e=document.getElementById("bgimg");this.viewBox=new s(parseInt(e.getAttribute("width")),parseInt(e.getAttribute("height")))}const e=document.getElementById("svg_group").getAttribute("viewBox").split(" ");this.viewBox.set(parseInt(e[0]),parseInt(e[1]),parseInt(e[2]),parseInt(e[3]))}updateSVGViewBox(){const e=this.viewBox.get();document.getElementById("svg_group").setAttribute("viewBox",e),(0,r.setSettings)({viewBox:e})}startDrag(){const e=document.getElementById("svg_group");this.dragCoordinates=e.createSVGPoint(),"touchstart"===i.event.type?(this.dragCoordinates.x=i.event.touches[0].screenX,this.dragCoordinates.y=i.event.touches[0].screenY):(this.dragCoordinates.x=i.event.x,this.dragCoordinates.y=i.event.y),this.matrix=e.getScreenCTM().inverse()}dragging(){const e=document.getElementById("svg_group"),t=e.createSVGPoint();"touchmove"===i.event.type?(t.x=i.event.touches[0].screenX,t.y=i.event.touches[0].screenY):"wheel"===i.event.type&&!1===i.event.shiftKey?(void 0===this.matrix&&(this.matrix=e.getScreenCTM().inverse()),void 0===this.dragCoordinates&&(this.dragCoordinates=e.createSVGPoint()),this.dragCoordinates.x=i.event.x,this.dragCoordinates.y=i.event.y,t.x=this.dragCoordinates.x-i.event.deltaX,t.y=this.dragCoordinates.y-i.event.deltaY,i.event.preventDefault()):(t.x=i.event.x,t.y=i.event.y);const n=t.matrixTransform(this.matrix),r=this.dragCoordinates.matrixTransform(this.matrix);this.translate(-n.x+r.x,-n.y+r.y),this.dragCoordinates=t}scrollZoom(){if("wheel"!==i.event.type)return;if(!i.event.shiftKey)return void this.dragging();const e=document.getElementById("zoomSlider");this.setViewBox();let t=this.viewBox.getZoom()-i.event.deltaX/100;tparseInt(e.getAttribute("max"))/100&&(t=4),this.zoomTo(t),e.value=(100*t).toString(),document.getElementById("zoomOutput").value=String(Math.round(100*t))}}t.ZoomHandler=o,t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(52),r=n(45),s=n(53),o=n(14),a=n(13),c=n(23),l=n(8),u=n(54),d=n(4);t.default=class{constructor(e){this.neonView=e,this.initEditMode()}initEditMode(){document.getElementById("insert_controls").innerHTML+=l.insertControlsPanel,document.getElementById("edit_controls").innerHTML+=l.editControlsPanel,document.getElementById("undoRedo_controls").innerHTML=u.undoRedoPanel,this.dragHandler=new c.default(this.neonView,".active-page > svg"),this.insertHandler=new s.default(this.neonView,".active-page > svg"),(0,i.bindInsertTabs)(this.insertHandler);const{insertTab:e}=(0,d.getSettings)();document.getElementById(e).click(),r.setSelectHelperObjects(this.neonView,this.dragHandler),this.setSelectListeners(),o.initNeonView(this.neonView),(0,i.initInsertEditControls)(),r.setSelectStrokeWidth(1),(0,i.initSelectionButtons)(),(0,a.setHighlightSelectionControls)(),this.neonView.view.addUpdateCallback(this.setSelectListeners.bind(this))}getUserMode(){const{userMode:e}=(0,d.getSettings)();return e}setSelectListeners(){r.clickSelect(".active-page > svg > svg, .active-page > svg > svg use, .active-page > svg > svg rect"),r.dragSelect(".active-page svg")}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(52),r=n(13),s=n(55),o=n(45),a=n(53),c=n(14),l=n(23),u=n(8),d=n(54),h=n(55),f=n(4);t.default=class{constructor(e){this.neonView=e,this.initEditMode()}initEditMode(){(0,h.initNavbar)(this.neonView),document.getElementById("insert_controls").innerHTML+=u.insertControlsPanel,document.getElementById("edit_controls").innerHTML+=u.editControlsPanel,document.getElementById("undoRedo_controls").innerHTML=d.undoRedoPanel,this.dragHandler=new l.default(this.neonView,"#svg_group"),this.insertHandler=new a.default(this.neonView,"#svg_group"),(0,i.bindInsertTabs)(this.insertHandler);const{insertTab:e}=(0,f.getSettings)();document.getElementById(e).click(),o.setSelectHelperObjects(this.neonView,this.dragHandler),this.setSelectListeners(),c.initNeonView(this.neonView),(0,i.initInsertEditControls)(),(0,i.initSelectionButtons)(),(0,s.initUndoRedoPanel)(this.neonView),(0,r.setHighlightOption)("selection"),this.neonView.view.addUpdateCallback(this.setSelectListeners.bind(this))}getUserMode(){const{userMode:e}=(0,f.getSettings)();return e}setSelectListeners(){o.clickSelect("#svg_group, #svg_group use, #svg_group rect"),o.dragSelect("#svg_group")}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(4),r=n(13),s=new Map([["","Punctum"],["u","Pes"],["d","Clivis"],["uu","Scandicus"],["ud","Torculus"],["du","Porrectus"],["s","Distropha"],["ss","Tristopha"],["sd","Pressus"],["dd","Climacus"],["ddu","ClimacusResupinus"],["udu","TorculusResupinus"],["dud","PorrectusFlexus"],["udd","PesSubpunctis"],["uud","ScandicusFlexus"],["uudd","ScandicusSubpunctis"],["dudd","PorrectusSubpunctis"]]);function o(){const e=document.getElementById("element_info"),t=document.getElementById("displayInfo");(0,i.setSettings)({displayInfo:t.checked}),t.checked?e.setAttribute("style",""):e.setAttribute("style","display: none"),(0,r.updateDisplayAllBtn)()}function a(){document.getElementById("element_info").innerHTML='
\n
Element Info
\n
Hover over any element to see its metadata
\n
',document.getElementById("element_info").setAttribute("style","display: none"),function(){const{displayInfo:e}=(0,i.getSettings)();document.querySelector("#displayInfo").checked=e}(),o(),document.getElementById("displayInfo").addEventListener("click",o)}t.default=class{constructor(e){this.neonView=e;const t=document.getElementById("display-single-container"),n=document.createElement("label");n.classList.add("checkbox-container","side-panel-btn"),n.textContent="Info";const i=document.createElement("input");i.id="displayInfo",i.classList.add("checkbox"),i.type="checkbox",i.checked=!1,n.appendChild(i),t.prepend(n),this.neonView.view.addUpdateCallback(this.resetInfoListeners.bind(this)),a(),this.resetInfoListeners()}infoListeners(){try{document.getElementsByClassName("active-page")[0].querySelectorAll(".neume,.custos,.clef,.accid,.divLine,.staff").forEach(e=>{e.addEventListener("mouseover",t=>{e.classList.contains("staff")||(this.isHoveringChild=!0),this.updateInfo(t)})}),document.getElementsByClassName("active-page")[0].querySelectorAll(".neume,.custos,.clef,.accid,.divLine").forEach(e=>{e.addEventListener("mouseleave",()=>{this.isHoveringChild=!1})})}catch(e){}}stopListeners(){document.querySelectorAll(".neume,.custos,.clef,.accid,.divLine,.staff").forEach(e=>{e.removeEventListener("mouseover",this.updateInfo.bind(this))}),document.querySelectorAll(".neume, .custos, .clef, .accid, .divLine").forEach(e=>{e.removeEventListener("mouseleave",()=>{this.isHoveringChild=!1})})}resetInfoListeners(){this.stopListeners(),this.infoListeners()}async updateInfo(e){const t=e.currentTarget.id;if(""===t)return Array.from(document.getElementById("element_info").children).forEach(e=>{e.remove()}),void console.log("No id!");const n=document.getElementById(t),i=n.getAttribute("class").match(/neume|clef|custos|staff|accid|divLine/)[0];let r,s="";switch(i){case"neume":{const e=n.querySelectorAll(".nc");if(1===e.length){const t=await this.neonView.getElementAttr(e[0].id,this.neonView.view.getCurrentPageURI());if("a"===t.curve||"c"===t.curve){let t=await this.getPitches(e);t=t.trim().toUpperCase(),s="Shape: Liquescent\r\nPitch(es): "+t;break}}let t=await this.getContour(e);if(1===e.length){const t=await this.neonView.getElementAttr(e[0].id,this.neonView.view.getCurrentPageURI());if("s"===t.tilt){let t=await this.getPitches(e);t=t.trim().toUpperCase(),s="Shape: Virga \r\nPitch(es): "+t;break}if("n"===t.tilt){let t=await this.getPitches(e);t=t.trim().toUpperCase(),s="Shape: Reversed Virga \r\nPitch(es): "+t;break}}if("Clivis"===t){(await this.neonView.getElementAttr(e[0].id,this.neonView.view.getCurrentPageURI())).ligated&&(t="Ligature")}let i=await this.getPitches(e);i=i.trim().toUpperCase(),s="Shape: "+(void 0===t?"Compound":t)+"\r\nPitch(es): "+i;break}case"custos":r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI()),s+="Pitch: "+r.pname.toUpperCase()+r.oct;break;case"accid":{r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI());let e="";"F"==r.accid.toUpperCase()?e="Flat":"N"==r.accid.toUpperCase()&&(e="Natural"),s+="Accid Type: "+e;break}case"clef":{const e=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI());if(e["dis.place"]&&void 0!==e.dis){s+="Octave Displacement: "+((e,t)=>("above"===e?"+":"-")+String(Math.floor(Number(t)/7)))(e["dis.place"],e.dis)+"\r\n"}else s+="Octave Displacement: None\r\n";s+="Shape: "+e.shape+"\r\nLine: "+e.line;break}case"divLine":r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI()),s+="DivLine Type: "+r.form;break;case"staff":if(this.isHoveringChild)return;r=await this.neonView.getElementAttr(t,this.neonView.view.getCurrentPageURI()),r.type&&(s+="Column: "+r.type.replace(/^column/,""));break;default:s+="nothing"}s=`Element Type: ${i.charAt(0).toUpperCase()+i.slice(1)}\n${s}`,this.updateInfoModule(s)}async getPitches(e){let t="";for(const n of e){const e=await this.neonView.getElementAttr(n.id,this.neonView.view.getCurrentPageURI());t+=e.pname+e.oct+" "}return t}async getContour(e){let t="",n=null;for(const i of e){const e=await this.neonView.getElementAttr(i.id,this.neonView.view.getCurrentPageURI());null!==n&&(n.oct>e.oct?t+="d":n.octthis.pitchNameToNum(e.pname)?t+="d":t+="s"),n=e}return void 0===s.get(t)&&console.warn("Unknown contour: "+t),s.get(t)}updateInfoModule(e){document.getElementsByClassName("info-bubble-body")[0].innerText=e,document.getElementById("displayInfo").checked&&(document.getElementsByClassName("info-bubble-container")[0].style.display="")}pitchNameToNum(e){switch(e){case"c":return 1;case"d":return 2;case"e":return 3;case"f":return 4;case"g":return 5;case"a":return 6;case"b":return 7;default:console.log("Unknown pitch name")}}getContourByValue(e){for(const[t,n]of s.entries())if(n===e)return t}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const i=n(3),r=n(5),s=n(13),o=n(4);t.default=class{constructor(e){this.neonView=e,this.notificationSent=!1;const t=document.getElementById("display-single-container"),n=document.createElement("label"),i=document.createElement("label"),r=document.createElement("input"),s=document.createElement("input");r.classList.add("checkbox"),s.classList.add("checkbox"),n.classList.add("checkbox-container","side-panel-btn"),i.classList.add("checkbox-container","side-panel-btn"),n.textContent="Text",i.textContent="BBoxes",r.id="displayText",r.type="checkbox",s.id="displayBBox",s.type="checkbox",r.checked=!1,s.checked=!1,n.appendChild(r),i.appendChild(s),t.prepend(i),t.prepend(n),this.loadSettings(),this.setTextViewControls(),this.neonView.view.addUpdateCallback(this.updateTextViewVisibility.bind(this)),this.neonView.view.addUpdateCallback(this.updateBBoxVisibility.bind(this))}setTextViewControls(){this.updateTextViewVisibility(),this.updateBBoxVisibility(),document.getElementById("displayText").addEventListener("click",()=>{this.updateTextViewVisibility(),(0,s.updateDisplayAllBtn)()}),document.getElementById("displayBBox").addEventListener("click",()=>{this.updateBBoxVisibility(),(0,s.updateDisplayAllBtn)()})}loadSettings(){const{displayText:e,displayBBox:t}=(0,o.getSettings)();document.querySelector("#displayText").checked=e,document.querySelector("#displayBBox").checked=t}updateBBoxVisibility(){var e;const t=document.getElementById("displayBBox");if((0,o.setSettings)({displayBBox:t.checked}),t.checked){if(document.querySelectorAll(".sylTextRect").forEach(e=>{e.classList.add("sylTextRect-display"),e.classList.remove("sylTextRect")}),document.querySelectorAll(".syl.selected .sylTextRect-display").forEach(e=>{e.style.fill="red"}),"viewer"!==this.neonView.getUserMode()&&void 0!==this.neonView.TextEdit){this.neonView.TextEdit.initSelectByBBoxButton(),this.neonView.TextEdit.initBBoxCircleSlider();const{circleSize:e}=(0,o.getSettings)();document.querySelector("#circleOutput").value=String(e),document.querySelector("#circleSlider").value=String(e)}}else{(null===(e=document.getElementById("selByBBox"))||void 0===e?void 0:e.classList.contains("is-active"))&&((0,r.unselect)(),document.getElementById("selByBBox").classList.remove("is-active"),document.getElementById("selBySyllable").classList.add("is-active"),(0,o.setSettings)({selectionMode:"selBySyllable"})),document.querySelectorAll(".sylTextRect-display").forEach(e=>{e.classList.add("sylTextRect"),e.classList.remove("sylTextRect-display")}),document.querySelectorAll(".syl.selected .sylTextRect").forEach(e=>{e.style.fill="none"});try{document.getElementById("selByBBox").style.display="none"}catch(e){}try{document.getElementById("bbox-circle-slider").style.display="none"}catch(e){}}(0,s.updateHighlight)()}updateTextViewVisibility(){const e=document.getElementById("displayText");if((0,o.setSettings)({displayText:e.checked}),e.checked){const e=document.getElementById("syl_text");e.style.display="",e.innerHTML=`
\n
Syllables on this page
\n
${this.getSylText()}
\n
`;e.querySelectorAll("span").forEach(e=>{const t=document.getElementById(e.classList[0]),n=t.querySelector(".syl"),i=n.querySelector("text"),r=n.querySelector("rect");0===i.classList.length&&i.classList.add("text"),e.addEventListener("mouseover",()=>{t.classList.contains("syllable-highlighted")||(t.classList.add("selected"),t.querySelectorAll(".neume").forEach(e=>{e.classList.add("selected")}),null!==r&&(r.style.fill="#d00"))}),e.addEventListener("mouseleave",()=>{t.classList.contains("syllable-highlighted")||(t.classList.remove("selected"),t.querySelectorAll(".neume").forEach(e=>{e.classList.remove("selected")}),null!==r&&("rgb(0, 0, 0)"!==t.style.fill?r.style.fill=t.getAttribute("fill"):r.style.fill="blue"))})}),"viewer"!==this.neonView.getUserMode()&&void 0!==this.neonView.TextEdit&&this.neonView.TextEdit.initTextEdit()}else document.getElementById("syl_text").style.display="none"}getSylText(){let e="";return document.querySelectorAll(".active-page .syllable").forEach(t=>{if(null!==t.querySelector(".syl")){const n=t.querySelector(".syl");e+=``,""===n.textContent.trim()?e+="◊ ":Array.from(n.children[0].children[0].children).forEach(t=>{e+=""!==t.textContent?t.textContent:"◊ "}),e+=" "}}),this.notificationSent||(i.queueNotification("Blank syllables are represented by ◊!"),this.notificationSent=!0),e.replace(/\ue551/g,"-")}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const i=n(5),r=n(23),s=n(45),o=n(18),a=n(9),c=n(4),l=n(13);function u(){if(!document.getElementById("selByBBox").classList.contains("is-active")){(0,i.unselect)(),(0,c.setSettings)({selectionMode:"selByBBox"});try{document.getElementById("moreEdit").innerHTML="",document.getElementById("extraEdit").innerHTML="",document.getElementById("moreEdit").parentElement.classList.add("hidden"),document.getElementById("extraEdit").parentElement.classList.add("hidden")}catch(e){}document.getElementById("selByBBox").classList.add("is-active");try{document.getElementById("selByNc").classList.remove("is-active"),document.getElementById("selByNeume").classList.remove("is-active"),document.getElementById("selByStaff").classList.remove("is-active"),document.getElementById("selBySyllable").classList.remove("is-active"),document.getElementById("selByLayerElement").classList.remove("is-active")}catch(e){}try{"highlight-selection"===document.querySelector(".highlight-selected").id&&(0,o.setGroupingHighlight)("syllable")}catch(e){}}this.addBBoxListeners()}t.default=class{constructor(e){this.neonView=e,this.initTextEdit()}initTextEdit(){const e=document.getElementById("syl_text").querySelectorAll("span"),t=this.neonView.modal;e.forEach(e=>{function n(){e.classList.add("selected-to-edit"),t.setModalWindowView(a.ModalWindowView.EDIT_TEXT),t.openModalWindow()}e.removeEventListener("click",n),e.addEventListener("click",n)}),document.addEventListener("keydown",e=>{if(e.shiftKey&&"T"===e.key){const e=document.querySelector(".text-select");e&&e.scrollIntoView({behavior:"smooth"})}})}initSelectByBBoxButton(){if(void 0!==this.neonView.NeumeEdit){const e=document.getElementById("selByBBox");if(e)return void(e.style.display="");const t=document.getElementById("selection-mode-btns-container"),n=document.createElement("button");n.classList.add("side-panel-btn","sel-by"),n.id="selByBBox",n.textContent="BBox",t.appendChild(n),n.addEventListener("click",u.bind(this)),document.body.addEventListener("keydown",e=>{"6"===e.key&&""===document.getElementById("selByBBox").style.display&&u.bind(this)()}),this.neonView.view.addUpdateCallback(this.addBBoxListeners.bind(this))}else{const e=document.getElementById("undo").closest(".control"),t=document.createElement("p");t.classList.add("control");const n=document.createElement("button");n.classList.add("side-panel-btn","sel-by"),n.id="selByBBox",n.textContent="BBox",t.appendChild(n),e.appendChild(t),n.classList.add("is-active"),n.style.display="none",this.addBBoxListeners(),this.neonView.view.addUpdateCallback(this.addBBoxListeners.bind(this))}}addBBoxListeners(){document.getElementById("selByBBox").classList.contains("is-active")&&((0,i.unselect)(),void 0===this.neonView.NeumeEdit&&(this.dragHandler=new r.default(this.neonView,".sylTextRect-display"),(0,s.setSelectHelperObjects)(this.neonView,this.dragHandler),"SingleView"===this.neonView.view.constructor.name?((0,s.clickSelect)("#mei_output, #mei_output rect"),(0,s.dragSelect)("#svg_group")):((0,s.clickSelect)(".active-page > svg > svg, .active-page > svg > svg rect"),(0,s.dragSelect)(".active-page svg"))))}initBBoxCircleSlider(){const e=document.getElementById("bbox-circle-slider");if(e)return void(e.style.display="");const t=document.getElementById("display-slider-section"),n=document.createElement("div");n.classList.add("slider-and-slider-actions-container","display-panel"),n.style.cursor="default",n.id="bbox-circle-slider",n.innerHTML='\n
\n
BBox Circle
\n \n
\n
\n \n 25\n
',t.appendChild(n),void 0===this.neonView.NeumeEdit&&(n.style.display="none"),(0,l.setCircleSizeControls)()}}},,,,,,,,,,,,function(e,t,n){"use strict";n.r(t);n(77),n(78);function i(e){const t=document.createElement(e),n=Array.prototype.slice.call(arguments,1);for(;n.length;){r(t,n.shift())}return t}function r(e,t){if(null!=t)if("object"!=typeof t&&"function"!=typeof t)e.appendChild(document.createTextNode(t));else if(t instanceof window.Node)e.appendChild(t);else if(t instanceof Array){const n=t.length;for(let i=0;i0;let s=i.length;for(;s--;)if(i[s]===e[1])return this._cache[n][r].splice(s,1),!0}return!1}unsubscribeAll(e){if(e){const t=Object.keys(this._cache);let n,i=t.length;for(;i--;)n=t[i],void 0!==this._cache[n][e]&&delete this._cache[n][e]}else this._cache={}}}};var d={onDoubleClick:function(e,t){e.addEventListener("dblclick",(function(e){e.ctrlKey||t(e,g(e.currentTarget,e))}));const n=f(500);e.addEventListener("contextmenu",(function(e){e.preventDefault(),e.ctrlKey&&(n.isTriggered()?(n.reset(),t(e,g(e.currentTarget,e))):n.trigger())}))},onPinch:function(e,t){let n=0;e.addEventListener("touchstart",(function(e){e.preventDefault(),2===e.originalEvent.touches.length&&(n=h(e.originalEvent.touches[0].clientX,e.originalEvent.touches[0].clientY,e.originalEvent.touches[1].clientX,e.originalEvent.touches[1].clientY))})),e.addEventListener("touchmove",(function(e){if(e.preventDefault(),2===e.originalEvent.touches.length){const i=e.originalEvent.touches,r=h(i[0].clientX,i[0].clientY,i[1].clientX,i[1].clientY),s=r-n;if(Math.abs(s)>0){const s={pageX:(i[0].clientX+i[1].clientX)/2,pageY:(i[0].clientY+i[1].clientY)/2};t(e,g(e.currentTarget,s),n,r)}}}))},onDoubleTap:function(e,t){const n=f(250);let i=null;e.addEventListener("touchend",e=>{if(e.preventDefault(),n.isTriggered()){n.reset();const r={pageX:e.originalEvent.changedTouches[0].clientX,pageY:e.originalEvent.changedTouches[0].clientY};h(i.pageX,i.pageY,r.pageX,r.pageY)<50&&t(e,g(e.currentTarget,r)),i=null}else i={pageX:e.originalEvent.changedTouches[0].clientX,pageY:e.originalEvent.changedTouches[0].clientY},n.trigger()})}};function h(e,t,n,i){return Math.sqrt((n-e)*(n-e)+(i-t)*(i-t))}function f(e){let t=!1,n=null;return{trigger(){t=!0,i(),n=setTimeout((function(){t=!1,n=null}),e)},isTriggered:()=>t,reset(){t=!1,i()}};function i(){null!==n&&(clearTimeout(n),n=null)}}function g(e,t){const n=e.getBoundingClientRect();return{left:t.pageX-n.left,top:t.pageY-n.top}}var p=n(31);class m{constructor(e,t){this.page=e,this._viewerCore=t,this._innerElement=this._viewerCore.getSettings().innerElement,this._pageToolsElem=null,this.labelWidth=0}mount(){null===this._pageToolsElem&&(this._buttons=this._initializePageToolButtons(),this._pageToolsElem=i("div",{class:"diva-page-tools-wrapper"},i("div",{class:"diva-page-tools"},this._buttons)),this._pageLabelsElem=i("div",{class:"diva-page-labels-wrapper"},i("div",{class:"diva-page-labels"},this._viewerCore.settings.manifest.pages[this.page].l))),this.refresh(),this._innerElement.appendChild(this._pageToolsElem),this._innerElement.appendChild(this._pageLabelsElem)}_initializePageToolButtons(){const e=this._viewerCore.getSettings(),t=this._viewerCore.getPublicInstance(),n=this.page;return this._viewerCore.getPageTools().map(i=>{const r=i.pageToolsIcon.cloneNode(!0);return r.addEventListener("click",r=>{i.handleClick.call(i,r,e,t,n)},!1),r.addEventListener("touchend",r=>{r.preventDefault(),i.handleClick.call(i,r,e,t,n)},!1),r})}unmount(){this._innerElement.removeChild(this._pageToolsElem),this._innerElement.removeChild(this._pageLabelsElem)}refresh(){const e=this._viewerCore.getPageRegion(this.page,{includePadding:!0,incorporateViewport:!0});let t=window.getComputedStyle(this._innerElement,null).getPropertyValue("margin-left");this._pageToolsElem.style.top=e.top+"px",this._pageToolsElem.style.left=e.left-parseInt(t)+"px",this._pageLabelsElem.style.top=e.top+"px",this._pageLabelsElem.style.left=e.right-parseInt(t)-this.labelWidth-5+"px"}}class v{constructor(e){if(this._viewerCore=e,this._viewerState=e.getInternalState(),this._overlays=[],this._viewerCore.getPageTools().length){const t=e.getSettings().numPages;for(let n=0;n{const n=t.getPageDimensions(e),s=t.getPageOffset(e,{includePadding:!0}),o=s.left+n.width/2,a=s.top+n.height/2,c=Math.max(Math.abs(r-o)-n.width/2,0),l=Math.max(Math.abs(i-a)-n.height/2,0);return-(c*c+l*l)});return null!=s?s:null}(e,this._viewerCore.getCurrentLayout(),this._viewerCore.getViewport());let i=this._viewerState.viewport.intersectionTolerance;this._viewerState.viewport.intersectionTolerance=0;let r=e.filter(e=>this._viewerState.renderer.isPageVisible(e));this._viewerState.viewport.intersectionTolerance=i,null!==n&&this._viewerCore.setCurrentPages(n,r),null!==t&&this._viewerCore.publish("ViewerDidJump",t),this._handleZoomLevelChange()}_handleZoomLevelChange(){const e=this._viewerState,t=e.options.zoomLevel;e.oldZoomLevel!==t&&e.oldZoomLevel>=0&&(e.oldZoomLevel{this._viewerCore.removePageOverlay(e)},this)}}class y{constructor(e){this._viewerCore=e}onDoubleClick(e,t){const n=this._viewerCore.getPagePositionAtViewportOffset(t),i=this._viewerCore.getCurrentLayout(),r=this._viewerCore.getViewport(),s=i.getPageToViewportCenterOffset(n.anchorPage,r);this._viewerCore.reload({inGrid:!1,goDirectlyTo:n.anchorPage,horizontalOffset:s.x+n.offset.left,verticalOffset:s.y+n.offset.top})}onPinch(){this._viewerCore.reload({inGrid:!1})}onViewWillLoad(){}onViewDidLoad(){}onViewDidUpdate(e,t){if(0===e.length)return;let n=this._viewerCore.viewerState.viewport.intersectionTolerance;this._viewerCore.viewerState.viewport.intersectionTolerance=0;let i=e.filter(e=>this._viewerCore.viewerState.renderer.isPageVisible(e));if(this._viewerCore.viewerState.viewport.intersectionTolerance=n,null!==t)return void this._viewerCore.setCurrentPages(t,i);const r=this._viewerCore.getCurrentLayout(),s=[];e.forEach(e=>{const t=r.getPageInfo(e).group;0!==s.length&&t===s[s.length-1]||s.push(t)});const o=this._viewerCore.getViewport();let a;a=1===s.length||s[0].region.top>=o.top?s[0]:s[1].region.bottom<=o.bottom?s[1]:function(e,t){const n=t.top+t.height/2;return Object(p.maxBy)(e,e=>{const t=e.region.top+e.dimensions.height/2;return-Math.abs(n-t)})}(s,o);const c=this._viewerCore.getSettings().activePageIndex;a.pages.some(e=>e.index===c)||this._viewerCore.setCurrentPages(a.pages[0].index,i)}destroy(){}}class b{constructor(){this._pages={},this._renderedPages=[],this._renderedPageMap={}}addOverlay(e){(this._pages[e.page]||(this._pages[e.page]=[])).push(e),this._renderedPageMap[e.page]&&e.mount()}removeOverlay(e){const t=e.page,n=this._pages[t];if(!n)return;const i=n.indexOf(e);-1!==i&&(this._renderedPageMap[t]&&n[i].unmount(),n.splice(i,1),0===n.length&&delete this._pages[t])}updateOverlays(e){const t=this._renderedPages,n={};e.map(e=>{n[e]=!0,this._renderedPageMap[e]||(this._renderedPageMap[e]=!0,this._invokeOnOverlays(e,e=>{e.mount()}))}),t.map(e=>{n[e]?this._invokeOnOverlays(e,e=>{e.refresh()}):(delete this._renderedPageMap[e],this._invokeOnOverlays(e,e=>{e.unmount()}))}),this._renderedPages=e}_invokeOnOverlays(e,t){const n=this._pages[e];n&&n.map(e=>t(e))}}class w{constructor(e,t){this._rows=e,this._cols=t,this._map=new Array(e).fill(null).map(()=>new Array(t).fill(!1))}isLoaded(e,t){return e>=this._rows||t>=this._cols||this._map[e][t]}set(e,t,n){this._map[e][t]=n}}class _{constructor(e){this._levels=e;const t=this._urlsToTiles={};e.forEach(e=>{e.tiles.forEach(n=>{t[n.url]={zoomLevel:e.zoomLevel,row:n.row,col:n.col}})}),this.clear()}clear(){const e=this._loadedByLevel={};this._levels.forEach(t=>{e[t.zoomLevel]=new w(t.rows,t.cols)})}getTiles(e){const t=[],n=this._levels[0].zoomLevel,i=new w(this._levels[0].rows,this._levels[0].cols);let r;if(null===e)r=0;else{const t=Math.ceil(e);r=function(e,t){const n=e.length;for(let i=0;ie.zoomLevel<=t)}this._levels.slice(0,r+1).reverse().concat(this._levels.slice(r+1)).forEach(e=>{const r=this._loadedByLevel[e.zoomLevel];let s=e.tiles.filter(e=>r.isLoaded(e.row,e.col));const o=Math.pow(2,n-e.zoomLevel);s=s.filter(e=>{let t=!1;const n=e.row*o,r=e.col*o;for(let e=0;e{s.push.apply(s,e)}),s}updateFromCache(e){this.clear(),this._levels.forEach(t=>{const n=this._loadedByLevel[t.zoomLevel];t.tiles.forEach(t=>{e.has(t.url)&&n.set(t.row,t.col,!0)})},this)}updateWithLoadedUrls(e){e.forEach(e=>{const t=this._urlsToTiles[e];this._loadedByLevel[t.zoomLevel].set(t.row,t.col,!0)},this)}}class E{constructor(e,t){const n=function(e,t){const n=null===t?e.pageLayouts:function(e,t){const n=Math.pow(2,t-e.maxZoomLevel);return e.pageLayouts.map(e=>({dimensions:x(e.dimensions,n),pages:e.pages.map(e=>({index:e.index,groupOffset:{top:Math.floor(e.groupOffset.top*n),left:Math.floor(e.groupOffset.left*n)},dimensions:x(e.dimensions,n)}))}))}(e,t),i=function(e,t){let n,i;const r=e.padding.document;e.verticallyOriented?(n="width",i=r.left+r.right):(n="height",i=r.top+r.bottom);return i+t.reduce((e,t)=>Math.max(t.dimensions[n],e),0)}(e,n);let r=e.verticallyOriented?e.padding.document.top:e.padding.document.left;const s=[],o={top:e.padding.page.top,left:e.padding.page.left};let a,c;n.forEach((t,n)=>{let a,c;e.verticallyOriented?(a=r,c=(i-t.dimensions.width)/2):(a=(i-t.dimensions.height)/2,c=r);const l={top:a,bottom:a+o.top+t.dimensions.height,left:c,right:c+o.left+t.dimensions.width};s.push({index:n,dimensions:t.dimensions,pages:t.pages,region:l,padding:o}),r=e.verticallyOriented?l.bottom:l.right}),e.verticallyOriented?(a=r+o.top,c=i):(a=i,c=r+o.left);return{dimensions:{height:a,width:c},pageGroups:s}}(e,t);this.dimensions=n.dimensions,this.pageGroups=n.pageGroups,this._pageLookup=function(e){const t={};return e.forEach(e=>{e.pages.forEach(n=>{t[n.index]={index:n.index,group:e,dimensions:n.dimensions,groupOffset:n.groupOffset}})}),t}(n.pageGroups)}getPageInfo(e){return this._pageLookup[e]||null}getPageDimensions(e){if(!this._pageLookup||!this._pageLookup[e])return null;const t=S(this._pageLookup[e]);return{height:t.bottom-t.top,width:t.right-t.left}}getPageOffset(e,t){const n=this.getPageRegion(e,t);return n?{top:n.top,left:n.left}:null}getPageRegion(e,t){const n=this._pageLookup[e];if(!n)return null;const i=S(n),r=n.group.padding;return t&&t.includePadding?{top:i.top+r.top,left:i.left+r.left,bottom:i.bottom,right:i.right}:{top:i.top,left:i.left,bottom:i.bottom+r.top,right:i.right}}getPageToViewportCenterOffset(e,t){const n=t.left,i=t.right-t.left,r=this.getPageOffset(e),s=n-r.left+parseInt(i/2,10),o=t.top,a=t.bottom-t.top;return{x:s,y:o-r.top+parseInt(a/2,10)}}}function S(e){const t=e.groupOffset.top+e.group.region.top,n=t+e.dimensions.height,i=e.groupOffset.left+e.group.region.left;return{top:t,bottom:n,left:i,right:i+e.dimensions.width}}function x(e,t){return{height:Math.floor(e.height*t),width:Math.floor(e.width*t)}}const L=n(51)("diva:ImageCache");class A{constructor(e){e=e||{maxKeys:100},this.maxKeys=e.maxKeys||100,this._held={},this._urls={},this._lru=[]}get(e){const t=this._urls[e];return t?t.img:null}has(e){return!!this._urls[e]}put(e,t){let n=this._urls[e];n?(n.img=t,this._promote(n)):(n={img:t,url:e},this._urls[e]=n,this._tryEvict(1),this._lru.unshift(n))}_promote(e){const t=this._lru.indexOf(e);this._lru.splice(t,1),this._lru.unshift(e)}_tryEvict(e){const t=this.maxKeys-e;if(this._lru.length<=t)return;let n=this._lru.length-1;for(;;){const e=this._lru[n];if(!this._held[e.url]&&(L("Evicting image %s",e.url),this._lru.splice(n,1),delete this._urls[e.url],this._lru.length<=t))break;if(0===n){L.enabled&&L("Cache overfull by %s (all entries are being held)",this._lru.length-t);break}n--}}acquire(e){this._held[e]=(this._held[e]||0)+1,this._promote(this._urls[e])}release(e){this._held[e]>1?this._held[e]--:delete this._held[e],this._tryEvict(0)}}class k{constructor(e){this._url=e.url,this._callback=e.load,this._errorCallback=e.error,this.timeoutTime=e.timeoutTime||0,this._aborted=this._complete=!1,this._crossOrigin=e.settings.imageCrossOrigin,this.timeout=setTimeout(()=>{this._image=new Image,this._image.crossOrigin=this._crossOrigin,this._image.onload=this._handleLoad.bind(this),this._image.onerror=this._handleError.bind(this),this._image.src=e.url},this.timeoutTime)}abort(){clearTimeout(this.timeout),this._image&&(this._image.onload=this._image.onerror=null,this._image.src=""),this._aborted=!0}_handleLoad(){this._aborted?console.error("ImageRequestHandler invoked on cancelled request for "+this._url):this._complete?console.error("ImageRequestHandler invoked on completed request for "+this._url):(this._complete=!0,this._callback(this._image))}_handleError(){this._errorCallback(this._image)}}var C={animate:function(e){const t=e.duration,n=e.parameters,i=e.onUpdate,r=e.onEnd,s=I(),o=s+t,a={},c={},l=Object.keys(n);l.forEach(e=>{const t=n[e];a[e]=function(e,t,n){return i=>e+(t-e)*n(i)}(t.from,t.to,t.easing||P)});let u=requestAnimationFrame((function e(){const n=I();(function(e){l.forEach(t=>{c[t]=a[t](e)})})(Math.min((n-s)/t,1)),i(c),nperformance.now():()=>Date.now();class O{constructor(e,t){this._viewport=e.viewport,this._outerElement=e.outerElement,this._documentElement=e.innerElement,this._settings=e.settings,this._hooks=t||{},this._canvas=i("canvas",{class:"diva-viewer-canvas"}),this._ctx=this._canvas.getContext("2d"),this.layout=null,this._sourceResolver=null,this._renderedPages=null,this._config=null,this._zoomLevel=null,this._compositeImages=null,this._renderedTiles=null,this._animation=null,this._cache=new A,this._pendingRequests={}}static getCompatibilityErrors(){return"undefined"!=typeof HTMLCanvasElement?null:["Your browser lacks support for the ",i("pre","canvas")," element. Please upgrade your browser."]}load(e,t,n){if(this._clearAnimation(),this._hooks.onViewWillLoad&&this._hooks.onViewWillLoad(),this._sourceResolver=n,this._config=e,this._compositeImages={},this._setLayoutToZoomLevel(t.zoomLevel),!this.layout.getPageInfo(t.anchorPage))throw new Error("invalid page: "+t.anchorPage);this._canvas.width===this._viewport.width&&this._canvas.height===this._viewport.height||(this._canvas.width=this._viewport.width,this._canvas.height=this._viewport.height),this.goto(t.anchorPage,t.verticalOffset,t.horizontalOffset),this._canvas.parentNode!==this._outerElement&&this._outerElement.insertBefore(this._canvas,this._outerElement.firstChild),this._hooks.onViewDidLoad&&this._hooks.onViewDidLoad()}_setViewportPosition(e){if(e.zoomLevel!==this._zoomLevel){if(null===this._zoomLevel)throw new TypeError("The current view is not zoomable");if(null===e.zoomLevel)throw new TypeError("The current view requires a zoom level");this._setLayoutToZoomLevel(e.zoomLevel)}this._goto(e.anchorPage,e.verticalOffset,e.horizontalOffset)}_setLayoutToZoomLevel(e){this.layout=new E(this._config,e),this._zoomLevel=e,s(this._documentElement,{style:{height:this.layout.dimensions.height+"px",width:this.layout.dimensions.width+"px"}}),this._viewport.setInnerDimensions(this.layout.dimensions)}adjust(){this._clearAnimation(),this._render(),this._hooks.onViewDidUpdate&&this._hooks.onViewDidUpdate(this._renderedPages.slice(),null)}_render(){const e=[];this.layout.pageGroups.forEach(t=>{if(!this._viewport.intersectsRegion(t.region))return;const n=t.pages.filter((function(e){return this.isPageVisible(e.index)}),this).map(e=>e.index);e.push.apply(e,n)},this),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._paintOutline(e),e.forEach(e=>{if(!this._compositeImages[e]){const t=this.layout.getPageInfo(e),n=this._sourceResolver.getAllZoomLevelsForPage(t),i=new _(n);i.updateFromCache(this._cache),this._compositeImages[e]=i}},this),this._initiateTileRequests(e);const t=T(this._renderedPages||[],e);t.removed.forEach(e=>{delete this._compositeImages[e]},this),this._renderedPages=e,this._paint(),this._hooks.onPageWillLoad&&t.added.forEach(e=>{this._hooks.onPageWillLoad(e)},this)}_paint(){const e=[];this._renderedPages.forEach(t=>{this._compositeImages[t].getTiles(this._zoomLevel).forEach(n=>{const i=B(n,this._zoomLevel);this._isTileVisible(t,i)&&(e.push(n.url),this._drawTile(t,i,this._cache.get(n.url)))})});const t=this._cache,n=T(this._renderedTiles||[],e);n.added.forEach(e=>{t.acquire(e)}),n.removed.forEach(e=>{t.release(e)}),n.removed&&this._renderedPages.forEach(e=>{this._compositeImages[e].updateFromCache(this._cache)},this),this._renderedTiles=e}_paintOutline(e){e.forEach(e=>{let t=this.layout.getPageInfo(e),n=this._getImageOffset(e),i=Math.max(0,(this._viewport.width-this.layout.dimensions.width)/2),r=Math.max(0,(this._viewport.height-this.layout.dimensions.height)/2),s=n.left-this._viewport.left+i,o=n.top-this._viewport.top+r,a=s<0?-s:0,c=o<0?-o:0,l=Math.max(0,s),u=Math.max(0,o),d=t.dimensions.width-a,h=t.dimensions.height-c;this._ctx.strokeStyle="#AAA",this._ctx.strokeRect(l+.5,u+.5,d,h)})}_initiateTileRequests(e){const t={},n=(e,n)=>{const i=this._compositeImages[n];t[e.url]=new k({url:e.url,timeoutTime:250,settings:this._settings,load:t=>{delete this._pendingRequests[e.url],this._cache.put(e.url,t),i===this._compositeImages[n]?(i.updateWithLoadedUrls([e.url]),this._isTileForSourceVisible(n,e)&&this._paint()):this._isTileForSourceVisible(n,e)&&this._paint()},error:()=>{delete this._pendingRequests[e.url]}})};for(let i=0;i{this._setViewportPosition(t(e)),this._hooks.onZoomLevelWillChange(e.zoomLevel),n&&n()},onEnd:t=>{e.onEnd&&e.onEnd(t),this._hooks.onViewDidUpdate&&!t.interrupted&&this._hooks.onViewDidUpdate(this._renderedPages.slice(),null)}})}_clearAnimation(){this._animation&&(this._animation.cancel(),this._animation=null)}isPageVisible(e){if(!this.layout)return!1;return!!this.layout.getPageInfo(e)&&this._viewport.intersectsRegion(this.layout.getPageRegion(e))}getRenderedPages(){return this._renderedPages.slice()}destroy(){this._clearAnimation(),Object.keys(this._pendingRequests).forEach(e=>{const t=this._pendingRequests[e];delete this._pendingRequests[e],t.abort()},this),this._canvas.parentNode.removeChild(this._canvas)}}function B(e,t){let n;return n=null===t?1:Math.pow(2,t-e.zoomLevel),{sourceZoomLevel:e.zoomLevel,scaleRatio:n,row:e.row,col:e.col,dimensions:{width:e.dimensions.width*n,height:e.dimensions.height*n},offset:{left:e.offset.left*n,top:e.offset.top*n},url:e.url}}function T(e,t){if(e===t)return{added:[],removed:[]};const n=e.filter(e=>-1===t.indexOf(e));return{added:t.filter(t=>-1===e.indexOf(t)),removed:n}}function N(e,t){const n=t.getMaxPageDimensions(e);return{width:Math.floor(n.width),height:Math.floor(n.height)}}function M(e){return function(e){const t=e.manifest,n=[];let i=null,r=[];const s=()=>{for(let e=0,t=r.length;e{const c={index:a,dimensions:N(a,t),paged:!t.paged||o.paged};(e.showNonPagedPages||c.paged)&&(c.paged?0===a||o.facingPages?(n.push([c]),s()):null===i?i=c:(n.push([i,c]),i=null,s()):r.push(c))}),null!==i&&(n.push([i]),s());return n}(e).map(t=>function(e,t){const n=e.verticallyOriented;if(2===t.length)return function(e,t,n){const i=e.dimensions,r=t.dimensions,s=Math.max(i.height,r.height);let o,a,c;if(n){const e=Math.max(i.width,r.width);o=2*e,a=e-i.width,c=e}else o=i.width+r.width,a=0,c=i.width;return{dimensions:{height:s,width:o},pages:[{index:e.index,dimensions:i,groupOffset:{top:0,left:a}},{index:t.index,dimensions:r,groupOffset:{top:0,left:c}}]}}(t[0],t[1],n);const i=t[0],r=i.dimensions;let s;s=i.paged?0===i.index&&n?r.width:0:n?r.width/2:0;const o=n&&!e.manifest.pages[i.index].facingPages;return{dimensions:{height:r.height,width:o?2*r.width:r.width},pages:[{index:i.index,groupOffset:{top:0,left:s},dimensions:r}]}}(e,t))}function q(e){const t=e.viewport.width,n=e.manifest,i=e.pagesPerRow,r=e.fixedHeightGrid,s=e.fixedPadding,o=e.showNonPagedPages,a=(t-s*(i+1))/i,c=a,l=r?s+n.minRatio*a:s+n.maxRatio*a,u=[];let d=[];const h={height:l,width:t};return n.pages.forEach((e,t)=>{if(!o&&n.paged&&!e.paged)return;const a=(e=>{const t=e.d[e.d.length-1],n=t.h/t.w;let i,o;return r?(i=(l-s)/n,o=l-s):(i=c,o=i*n),{width:Math.round(i),height:Math.round(o)}})(e);let f=Math.floor(d.length*(s+c)+s);r&&(f+=(c-a.width)/2),d.push({index:t,dimensions:a,groupOffset:{top:0,left:f}}),d.length===i&&(u.push({dimensions:h,pages:d}),d=[])}),d.length>0&&u.push({dimensions:h,pages:d}),u}function D(e){if(e.inGrid)return q(F(e,["manifest","viewport","pagesPerRow","fixedHeightGrid","fixedPadding","showNonPagedPages"]));{const t=F(e,["manifest","verticallyOriented","showNonPagedPages"]);return e.inBookLayout?M(t):function(e){const t=e.manifest,n=[];return t.pages.forEach((i,r)=>{if(!e.showNonPagedPages&&t.paged&&!i.paged)return;const s=N(r,t);n.push({dimensions:s,pages:[{index:r,groupOffset:{top:0,left:0},dimensions:s}]})}),n}(t)}}function F(e,t){const n={};return t.forEach((function(t){n[t]=e[t]})),n}function j(e){const t={};return e.forEach(e=>{!function(e,t){Object.keys(t).forEach(n=>{Object.defineProperty(e,n,{get:()=>t[n],set:()=>{throw new TypeError("Cannot set settings."+n)}})})}(t,e)}),t}class R{constructor(e){this.whitelistedKeys=e.whitelistedKeys||[],this.additionalProperties=e.additionalProperties||[],this.validations=e.validations}isValid(e,t,n){let i=null;if(this.validations.some((t,n)=>t.key===e&&(i=n,!0)),null===i)return!0;const r={};r[e]=t;const s=V(n,r,this);return!this._runValidation(i,t,s)}validate(e){this._validateOptions({},e)}getValidatedOptions(e,t){const n=Object.assign({},t);return this._validateOptions(e,n),n}_validateOptions(e,t){const n=V(e,t,this);this._applyValidations(t,n)}_applyValidations(e,t){this.validations.forEach((n,i)=>{if(!e.hasOwnProperty(n.key))return;const r=e[n.key],s=this._runValidation(i,r,t);s&&(s.warningSuppressed||function(e,t,n){console.warn("Invalid value for "+e+": "+t+". Using "+n+" instead.")}(n.key,r,s.value),e[n.key]=s.value)},this)}_runValidation(e,t,n){const i=this.validations[e];n.index=e;let r=!1;const s={suppressWarning:()=>{r=!0}},o=i.validate(t,n.proxy,s);return void 0===o||o===t?null:{value:o,warningSuppressed:r}}}function V(e,t,n){const i={proxy:{},index:null},r=z.bind(null,e,t),s={};return n.whitelistedKeys.forEach(e=>{s[e]={get:r.bind(null,e)}}),n.additionalProperties.forEach(e=>{s[e.key]={get:e.get}}),n.validations.forEach((e,t)=>{s[e.key]={get:()=>{if(t=n}hasHorizontalOverlap(e){const t=this.left-this.intersectionTolerance,n=this.right+this.intersectionTolerance;return Z(e.left,t,n)||Z(e.right,t,n)||e.left<=t&&e.right>=n}invalidate(){this._width=this.outer.clientWidth,this._height=this.outer.clientHeight,this._top=this.outer.scrollTop,this._left=this.outer.scrollLeft}setInnerDimensions(e){this._innerDimensions=e,e&&(this._top=G(this._top,0,e.height-this._height),this._left=G(this._left,0,e.width-this._width))}}function U(e,t){const n="_"+e,i="scroll"+e.charAt(0).toUpperCase()+e.slice(1);return{get:function(){return this[n]},set:function(e){let r;if(this._innerDimensions){r=G(e,0,this._innerDimensions[t]-this[t])}else r=W(e,0);this[n]=this.outer[i]=r}}}function $(e){return{get:function(){return this["_"+e]}}}function Z(e,t,n){return e>=t&&e<=n}function G(e,t,n){return W(function(e,t){return Math.min(e,t)}(e,n),t)}function W(e,t){return Math.max(e,t)}Object.defineProperties(H.prototype,{top:U("top","height"),left:U("left","width"),width:$("width"),height:$("height"),bottom:{get:function(){return this._top+this._height}},right:{get:function(){return this._left+this._width}}});const K=n(51)("diva:ViewerCore");function Y(){return Y.counter++}Y.counter=1;const X=[{key:"goDirectlyTo",validate:(e,t)=>{if(e<0||e>=t.manifest.pages.length)return 0}},{key:"minPagesPerRow",validate:e=>Math.max(2,e)},{key:"maxPagesPerRow",validate:(e,t)=>Math.max(e,t.minPagesPerRow)},{key:"pagesPerRow",validate:(e,t)=>{if(et.maxPagesPerRow)return t.maxPagesPerRow}},{key:"maxZoomLevel",validate:(e,t,n)=>{if(n.suppressWarning(),e<0||e>t.manifest.maxZoom)return t.manifest.maxZoom}},{key:"minZoomLevel",validate:(e,t,n)=>e>t.manifest.maxZoom?(n.suppressWarning(),0):e<0||e>t.maxZoomLevel?0:void 0},{key:"zoomLevel",validate:(e,t,n)=>e>t.manifest.maxZoom?(n.suppressWarning(),0):et.maxZoomLevel?t.minZoomLevel:void 0}];class J{constructor(e,t,n){this.parentObject=e,this.publicInstance=n,this.viewerState={currentPageIndices:[0],activePageIndex:0,horizontalOffset:0,horizontalPadding:0,ID:null,initialKeyScroll:!1,initialSpaceScroll:!1,innerElement:null,innerObject:{},isActiveDiva:!0,isScrollable:!0,isZooming:!1,loaded:!1,manifest:null,mobileWebkit:!1,numPages:0,oldZoomLevel:-1,options:t,outerElement:null,outerObject:{},pageOverlays:new b,pageTools:[],parentObject:this.parentObject,pendingManifestRequest:null,pluginInstances:[],renderer:null,resizeTimer:-1,scrollbarWidth:0,selector:"",throbberTimeoutID:-1,toolbar:null,verticalOffset:0,verticalPadding:0,viewHandler:null,viewport:null,viewportElement:null,viewportObject:null,zoomDuration:400},this.settings=j([t,this.viewerState]);const r=Y();this.viewerState.ID="diva-"+r+"-",this.viewerState.selector=this.settings.ID,Object.defineProperties(this.settings,{panelHeight:{get:()=>this.viewerState.viewport.height},panelWidth:{get:()=>this.viewerState.viewport.width}}),this.optionsValidator=new R({additionalProperties:[{key:"manifest",get:()=>this.viewerState.manifest}],validations:X}),this.viewerState.scrollbarWidth=function(){let e=document.createElement("p");e.style.width="100%",e.style.height="200px";let t=document.createElement("div");t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.visibility="hidden",t.style.width="200px",t.style.height="150px",t.style.overflow="hidden",t.appendChild(e),document.body.appendChild(t);let n=e.offsetWidth;t.style.overflow="scroll";let i=e.offsetWidth;return n===i&&(i=t.clientWidth),document.body.removeChild(t),n-i}(),this.viewerState.mobileWebkit=void 0!==window.orientation,null===t.hashParamSuffix&&(t.hashParamSuffix=1===r?"":r+"");const s=i("div",this.elemAttrs("inner",{class:"diva-inner"})),o=i("div",this.elemAttrs("viewport"),s),a=i("div",this.elemAttrs("outer"),o,i("div",this.elemAttrs("throbber"),[i("div",{class:"cube cube1"}),i("div",{class:"cube cube2"}),i("div",{class:"cube cube3"}),i("div",{class:"cube cube4"}),i("div",{class:"cube cube5"}),i("div",{class:"cube cube6"}),i("div",{class:"cube cube7"}),i("div",{class:"cube cube8"}),i("div",{class:"cube cube9"})]));this.viewerState.innerElement=s,this.viewerState.viewportElement=o,this.viewerState.outerElement=a,this.viewerState.innerObject=s,this.viewerState.viewportObject=o,this.viewerState.outerObject=a,this.settings.parentObject.append(a),this.viewerState.viewport=new H(this.viewerState.viewportElement,{intersectionTolerance:this.settings.viewportMargin}),this.boundScrollFunction=this.scrollFunction.bind(this),this.boundEscapeListener=this.escapeListener.bind(this),this.initPlugins(),this.handleEvents(),this.showThrobber()}isValidOption(e,t){return this.optionsValidator.isValid(e,t,this.viewerState.options)}elemAttrs(e,t){const n={id:this.settings.ID+e,class:"diva-"+e};return t?Object.assign(n,t):n}getPageData(e,t){return this.settings.manifest.pages[e].d[this.settings.zoomLevel][t]}clearViewer(){this.viewerState.viewport.top=0,clearTimeout(this.viewerState.resizeTimer)}hasChangedOption(e,t){return t in e&&e[t]!==this.settings[t]}escapeListener(e){27===e.keyCode&&this.publicInstance.leaveFullscreenMode()}reloadViewer(e){const t=[];if(e=this.optionsValidator.getValidatedOptions(this.settings,e),this.hasChangedOption(e,"zoomLevel")&&(this.viewerState.oldZoomLevel=this.settings.zoomLevel,this.viewerState.options.zoomLevel=e.zoomLevel,t.push(["ZoomLevelDidChange",e.zoomLevel])),this.hasChangedOption(e,"pagesPerRow")&&(this.viewerState.options.pagesPerRow=e.pagesPerRow,t.push(["GridRowNumberDidChange",e.pagesPerRow])),this.hasChangedOption(e,"verticallyOriented")&&(this.viewerState.options.verticallyOriented=e.verticallyOriented),this.hasChangedOption(e,"showNonPagedPages")&&(this.viewerState.options.showNonPagedPages=e.showNonPagedPages),"goDirectlyTo"in e?(this.viewerState.options.goDirectlyTo=e.goDirectlyTo,"verticalOffset"in e&&(this.viewerState.verticalOffset=e.verticalOffset),"horizontalOffset"in e&&(this.viewerState.horizontalOffset=e.horizontalOffset)):this.viewerState.options.goDirectlyTo=this.settings.activePageIndex,(this.hasChangedOption(e,"inGrid")||this.hasChangedOption(e,"inBookLayout"))&&("inGrid"in e&&(this.viewerState.options.inGrid=e.inGrid),"inBookLayout"in e&&(this.viewerState.options.inBookLayout=e.inBookLayout),t.push(["ViewDidSwitch",this.settings.inGrid])),this.hasChangedOption(e,"inFullscreen")&&(this.viewerState.options.inFullscreen=e.inFullscreen,this.prepareModeChange(e),t.push(["ModeDidSwitch",this.settings.inFullscreen])),this.clearViewer(),this.updateViewHandlerAndRendering(),this.viewerState.renderer){const e={pageLayouts:D(this.settings),padding:this.getPadding(),maxZoomLevel:this.settings.inGrid?null:this.viewerState.manifest.maxZoom,verticallyOriented:this.settings.verticallyOriented||this.settings.inGrid},t={zoomLevel:this.settings.inGrid?null:this.settings.zoomLevel,anchorPage:this.settings.goDirectlyTo,verticalOffset:this.viewerState.verticalOffset,horizontalOffset:this.viewerState.horizontalOffset},n=this.getCurrentSourceProvider();if(K.enabled){const t=Object.keys(e).filter((function(e){return"pageLayouts"!==e&&"padding"!==e})).map((function(t){const n=e[t];return t+": "+JSON.stringify(n)})).join(", ");K("reload with %s",t)}this.viewerState.renderer.load(e,t,n)}return t.forEach(e=>{this.publish.apply(this,e)}),!0}prepareModeChange(e){const t=e.inFullscreen?"add":"remove";this.viewerState.outerObject.classList[t]("diva-fullscreen"),document.body.classList[t]("diva-hide-scrollbar"),this.settings.parentObject.classList[t]("diva-full-width");const n=this.settings.panelHeight,i=this.settings.panelWidth;if(this.viewerState.viewport.invalidate(),!this.viewerState.loaded&&!this.settings.inGrid&&!("verticalOffset"in e)){const e=this.settings.panelHeight,t=this.settings.panelWidth;this.viewerState.verticalOffset+=(n-e)/2,this.viewerState.horizontalOffset+=(i-t)/2}e.inFullscreen?document.addEventListener("keyup",this.boundEscapeListener):document.removeEventListener("keyup",this.boundEscapeListener)}updateViewHandlerAndRendering(){const e=this.settings.inGrid?y:v;!this.viewerState.viewHandler||this.viewerState.viewHandler instanceof e||(this.viewerState.viewHandler.destroy(),this.viewerState.viewHandler=null),this.viewerState.viewHandler||(this.viewerState.viewHandler=new e(this)),this.viewerState.renderer||this.initializeRenderer()}initializeRenderer(){const e=O.getCompatibilityErrors();if(e)this.showError(e);else{const e={viewport:this.viewerState.viewport,outerElement:this.viewerState.outerElement,innerElement:this.viewerState.innerElement,settings:this.settings},t={onViewWillLoad:()=>{this.viewerState.viewHandler.onViewWillLoad()},onViewDidLoad:()=>{this.updatePageOverlays(),this.viewerState.viewHandler.onViewDidLoad()},onViewDidUpdate:(e,t)=>{this.updatePageOverlays(),this.viewerState.viewHandler.onViewDidUpdate(e,t)},onViewDidTransition:()=>{this.updatePageOverlays()},onPageWillLoad:e=>{this.publish("PageWillLoad",e)},onZoomLevelWillChange:e=>{this.publish("ZoomLevelWillChange",e)}};this.viewerState.renderer=new O(e,t)}}getCurrentSourceProvider(){if(this.settings.inGrid){const e={getAllZoomLevelsForPage:t=>[e.getBestZoomLevelForPage(t)],getBestZoomLevelForPage:e=>({zoomLevel:1,rows:1,cols:1,tiles:[{url:this.settings.manifest.getPageImageURL(e.index,{width:e.dimensions.width}),zoomLevel:1,row:0,col:0,dimensions:e.dimensions,offset:{top:0,left:0}}]})};return e}const e={width:this.settings.tileWidth,height:this.settings.tileHeight};return{getBestZoomLevelForPage:t=>this.settings.manifest.getPageImageTiles(t.index,Math.ceil(this.settings.zoomLevel),e),getAllZoomLevelsForPage:t=>{const n=[],i=this.viewerState.manifest.maxZoom;for(let r=0;r<=i;r++)n.push(this.settings.manifest.getPageImageTiles(t.index,r,e));return n.reverse(),n}}}getPadding(){let e,t,n,i;return this.settings.inGrid?(n=this.settings.fixedPadding,e=t=i=0):(e=this.settings.verticallyOriented?this.viewerState.verticalPadding:0,t=this.settings.verticallyOriented?0:this.viewerState.horizontalPadding,n=this.settings.verticallyOriented?0:this.viewerState.verticalPadding,i=this.settings.verticallyOriented?this.viewerState.horizontalPadding:0),{document:{top:n,bottom:n,left:i,right:i},page:{top:e,bottom:0,left:t,right:0}}}updatePageOverlays(){this.viewerState.pageOverlays.updateOverlays(this.viewerState.renderer.getRenderedPages())}handleZoom(e,t){if(!this.isValidOption("zoomLevel",e))return!1;if(this.viewerState.viewportObject.removeEventListener("scroll",this.boundScrollFunction),!t){const e=this.viewerState.viewport,n=this.viewerState.renderer.layout.getPageRegion(this.settings.activePageIndex);t={anchorPage:this.settings.activePageIndex,offset:{left:e.width/2-(n.left-e.left),top:e.height/2-(n.top-e.top)}}}const n=this.viewerState.renderer.layout.getPageRegion(t.anchorPage),i=n.left+t.offset.left-(this.settings.viewport.left+this.settings.viewport.width/2),r=n.top+t.offset.top-(this.settings.viewport.top+this.settings.viewport.height/2),s=(e,n)=>{const s=Math.pow(2,e-n),o=t.offset.left*s-i,a=t.offset.top*s-r;return{zoomLevel:e,anchorPage:t.anchorPage,verticalOffset:a,horizontalOffset:o}};this.viewerState.options.zoomLevel=e;let o=this.viewerState.oldZoomLevel;this.viewerState.oldZoomLevel=this.settings.zoomLevel;const a=s(e,o);this.viewerState.options.goDirectlyTo=a.anchorPage,this.viewerState.verticalOffset=a.verticalOffset,this.viewerState.horizontalOffset=a.horizontalOffset,this.viewerState.renderer.transitionViewportPosition({duration:this.settings.zoomDuration,parameters:{zoomLevel:{from:o,to:e}},getPosition:e=>s(e.zoomLevel,o),onEnd:t=>{this.viewerState.viewportObject.addEventListener("scroll",this.boundScrollFunction),t.interrupted&&(this.viewerState.oldZoomLevel=e)}});let c=document.getElementById(this.settings.selector+"zoom-in-button"),l=document.getElementById(this.settings.selector+"zoom-out-button");return c.disabled=!0,l.disabled=!0,setTimeout(()=>{c.disabled=!1,l.disabled=!1},this.settings.zoomDuration),this.publish("ZoomLevelDidChange",e),!0}getYOffset(e,t){let n=void 0===e?this.settings.activePageIndex:e;return"center"===t||"centre"===t?parseInt(this.getPageData(n,"h")/2,10):"bottom"===t?parseInt(this.getPageData(n,"h")-this.settings.panelHeight/2,10):parseInt(this.settings.panelHeight/2,10)}getXOffset(e,t){let n=void 0===e?this.settings.activePageIndex:e;return"left"===t?parseInt(this.settings.panelWidth/2,10):"right"===t?parseInt(this.getPageData(n,"w")-this.settings.panelWidth/2,10):parseInt(this.getPageData(n,"w")/2,10)}updatePanelSize(){return this.viewerState.viewport.invalidate(),this.viewerState.renderer&&(this.updateOffsets(),this.viewerState.renderer.goto(this.settings.activePageIndex,this.viewerState.verticalOffset,this.viewerState.horizontalOffset)),!0}updateOffsets(){const e=this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.activePageIndex,this.viewerState.viewport);e&&(this.viewerState.horizontalOffset=e.x,this.viewerState.verticalOffset=e.y)}bindMouseEvents(){this.viewerState.viewportObject.classList.add("dragscroll"),d.onDoubleClick(this.viewerState.viewportObject,(e,t)=>{K("Double click at %s, %s",t.left,t.top),this.viewerState.viewHandler.onDoubleClick(e,t)})}onResize(){this.updatePanelSize(),clearTimeout(this.viewerState.resizeTimer),this.viewerState.resizeTimer=setTimeout(()=>{const e=this.viewerState.renderer.layout.getPageToViewportCenterOffset(this.settings.activePageIndex,this.viewerState.viewport);e?this.reloadViewer({goDirectlyTo:this.settings.activePageIndex,verticalOffset:e.y,horizontalOffset:e.x}):this.reloadViewer({goDirectlyTo:this.settings.activePageIndex})},200)}bindTouchEvents(){this.settings.blockMobileMove&&document.body.addEventListener("touchmove",e=>(e.originalEvent.preventDefault(),!1)),d.onPinch(this.viewerState.viewportObject,(function(e,t,n,i){K("Pinch %s at %s, %s",i-n,t.left,t.top),this.viewerState.viewHandler.onPinch(e,t,n,i)})),d.onDoubleTap(this.viewerState.viewportObject,(function(e,t){K("Double tap at %s, %s",t.left,t.top),this.viewerState.viewHandler.onDoubleClick(e,t)}))}scrollFunction(){const e=this.viewerState.viewport.top,t=this.viewerState.viewport.left;let n;this.viewerState.viewport.invalidate();const i=this.viewerState.viewport.top,r=this.viewerState.viewport.left;n=this.settings.verticallyOriented||this.settings.inGrid?i-e:r-t,this.viewerState.renderer.adjust();const s=this.settings.verticallyOriented||this.settings.inGrid?i:r;this.publish("ViewerDidScroll",s),n>0?this.publish("ViewerDidScrollDown",s):n<0&&this.publish("ViewerDidScrollUp",s),this.updateOffsets()}handleEvents(){this.viewerState.innerObject.addEventListener("mousedown",()=>{this.viewerState.innerObject.classList.add("diva-grabbing")}),this.viewerState.innerObject.addEventListener("mouseup",()=>{this.viewerState.innerObject.classList.remove("diva-grabbing")}),this.bindMouseEvents(),this.viewerState.viewportObject.addEventListener("scroll",this.boundScrollFunction);document.addEventListener("keydown.diva",e=>{if(!this.viewerState.isActiveDiva)return!0;if(this.settings.enableSpaceScroll&&!e.shiftKey&&32===e.keyCode||this.settings.enableKeyScroll&&34===e.keyCode)return this.viewerState.viewport.top+=this.settings.panelHeight,!1;if(this.settings.enableSpaceScroll||32!==e.keyCode||e.preventDefault(),this.settings.enableKeyScroll){if(e.shiftKey||e.ctrlKey||e.metaKey)return!0;switch(e.keyCode){case 33:return this.viewerState.viewport.top-=this.settings.panelHeight,!1;case 38:return this.viewerState.viewport.top-=this.settings.arrowScrollAmount,!1;case 40:return this.viewerState.viewport.top+=this.settings.arrowScrollAmount,!1;case 37:return this.viewerState.viewport.left-=this.settings.arrowScrollAmount,!1;case 39:return this.viewerState.viewport.left+=this.settings.arrowScrollAmount,!1;case 36:return this.viewerState.viewport.top=0,!1;case 35:return this.settings.verticallyOriented?this.viewerState.viewport.top=1/0:this.viewerState.viewport.left=1/0,!1;default:return!0}}return!0}),u.Events.subscribe("ViewerDidTerminate",(function(){document.removeEventListener("keydown.diva")}),this.settings.ID),window.addEventListener("resize",this.onResize.bind(this),!1),u.Events.subscribe("ViewerDidTerminate",(function(){window.removeEventListener("resize",this.onResize,!1)}),this.settings.ID),"onorientationchange"in window&&(window.addEventListener("orientationchange",this.onResize,!1),u.Events.subscribe("ViewerDidTerminate",(function(){window.removeEventListener("orientationchange",this.onResize,!1)}),this.settings.ID)),u.Events.subscribe("PanelSizeDidChange",this.updatePanelSize,this.settings.ID),u.Events.subscribe("ViewerDidTerminate",()=>{this.viewerState.renderer&&this.viewerState.renderer.destroy(),clearTimeout(this.viewerState.resizeTimer)},this.settings.ID)}initPlugins(){if(!this.settings.hasOwnProperty("plugins"))return null;this.viewerState.pluginInstances=this.settings.plugins.map(e=>{const t=new e(this);return t.isPageTool&&this.viewerState.pageTools.push(t),t})}showThrobber(){this.hideThrobber(),this.viewerState.throbberTimeoutID=setTimeout(()=>{let e=document.getElementById(this.settings.selector+"throbber");e&&(e.style.display="block")},this.settings.throbberTimeout)}hideThrobber(){clearTimeout(this.viewerState.throbberTimeoutID);let e=document.getElementById(this.settings.selector+"throbber");e&&(e.style.display="none")}showError(e){const t=i("div",this.elemAttrs("error"),[i("button",this.elemAttrs("error-close",{"aria-label":"Close dialog"})),i("p",i("strong","Error")),i("div",e)]);this.viewerState.outerObject.appendChild(t),document.getElementById(this.settings.selector+"error-close").addEventListener("click",()=>{t.parentNode.removeChild(t)})}setManifest(e,t){if(this.viewerState.manifest=e,this.hideThrobber(),this.viewerState.numPages=this.settings.manifest.pages.length,this.optionsValidator.validate(this.viewerState.options),this.publish("NumberOfPagesDidChange",this.settings.numPages),this.settings.adaptivePadding>0){const e=Math.floor((this.settings.minZoomLevel+this.settings.maxZoomLevel)/2);this.viewerState.horizontalPadding=parseInt(this.settings.manifest.getAverageWidth(e)*this.settings.adaptivePadding,10),this.viewerState.verticalPadding=parseInt(this.settings.manifest.getAverageHeight(e)*this.settings.adaptivePadding,10)}else this.viewerState.horizontalPadding=this.settings.fixedPadding,this.viewerState.verticalPadding=this.settings.fixedPadding;let n,r;this.viewerState.pageTools.length&&(this.viewerState.verticalPadding=Math.max(40,this.viewerState.verticalPadding)),this.settings.manifest.paged&&(this.viewerState.options.inBookLayout=!0),this.publish("ObjectDidLoad",this.settings),this.updatePanelSize();let s=!1,o=!1;if(null==t.goDirectlyTo?(t.goDirectlyTo=this.settings.goDirectlyTo,n=r=!0):(n=null==t.horizontalOffset||isNaN(t.horizontalOffset),r=null==t.verticalOffset||isNaN(t.verticalOffset)),n&&(0===t.goDirectlyTo&&this.settings.inBookLayout&&this.settings.verticallyOriented?t.horizontalOffset=this.viewerState.horizontalPadding:(o=!0,t.horizontalOffset=this.getXOffset(t.goDirectlyTo,"center"))),r&&(s=!0,t.verticalOffset=this.getYOffset(t.goDirectlyTo,"top")),this.reloadViewer(t),this.updatePanelSize(),this.settings.enableAutoTitle){let e=document.getElementById(this.settings.selector+"title");e?e.innerHTML=this.settings.manifest.itemTitle:this.settings.parentObject.insertBefore(i("div",this.elemAttrs("title"),[this.settings.manifest.itemTitle]),this.settings.parentObject.firstChild)}this.settings.verticallyOriented?this.viewerState.innerElement.style.minWidth=this.settings.panelWidth+"px":this.viewerState.innerElement.style.minHeight=this.settings.panelHeight+"px",(s||o)&&(s&&(this.viewerState.verticalOffset=this.getYOffset(this.settings.activePageIndex,"top")),o&&(this.viewerState.horizontalOffset=this.getXOffset(this.settings.activePageIndex,"center")),this.viewerState.renderer.goto(this.settings.activePageIndex,this.viewerState.verticalOffset,this.viewerState.horizontalOffset)),this.viewerState.loaded=!0,this.publish("ViewerDidLoad",this.settings)}publish(e){const t=Array.prototype.slice.call(arguments,1);u.Events.publish(e,t,this.publicInstance)}getSettings(){return this.settings}getInternalState(){return this.viewerState}getPublicInstance(){return this.publicInstance}getPageTools(){return this.viewerState.pageTools}getCurrentLayout(){return this.viewerState.renderer?this.viewerState.renderer.layout:null}getViewport(){const e=this.viewerState.viewport;return{top:e.top,left:e.left,bottom:e.bottom,right:e.right,width:e.width,height:e.height}}addPageOverlay(e){this.viewerState.pageOverlays.addOverlay(e)}removePageOverlay(e){this.viewerState.pageOverlays.removeOverlay(e)}getPageRegion(e,t){const n=this.viewerState.renderer.layout,i=n.getPageRegion(e,t);if(t&&t.incorporateViewport){const e=this.settings.verticallyOriented?"width":"height";if(this.viewerState.viewport[e]>n.dimensions[e]){const t=(this.viewerState.viewport[e]-n.dimensions[e])/2;return this.settings.verticallyOriented?{top:i.top,bottom:i.bottom,left:i.left+t,right:i.right+t}:{top:i.top+t,bottom:i.bottom+t,left:i.left,right:i.right}}}return i}getPagePositionAtViewportOffset(e){const t=e.left+this.viewerState.viewport.left,n=e.top+this.viewerState.viewport.top,i=this.viewerState.renderer.getRenderedPages(),r=i.length;for(let e=0;e=t&&s.top<=n&&s.bottom>=n)return{anchorPage:r,offset:{left:t-s.left,top:n-s.top}}}const s=this.viewerState.renderer.layout.getPageRegion(this.settings.activePageIndex);return{anchorPage:this.settings.activePageIndex,offset:{left:t-s.left,top:n-s.top}}}setCurrentPages(e,t){!function(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&this.publish("VisiblePageHasAlternateViews",e)):this.viewerState.activePageIndex!==e&&(this.viewerState.activePageIndex=e,this.publish("ActivePageDidChange",e))}getPageName(e){return this.viewerState.manifest.pages[e].f}reload(e){this.reloadViewer(e)}zoom(e,t){return this.handleZoom(e,t)}enableScrollable(){this.viewerState.isScrollable||(this.bindMouseEvents(),this.enableDragScrollable(),this.viewerState.options.enableKeyScroll=this.viewerState.initialKeyScroll,this.viewerState.options.enableSpaceScroll=this.viewerState.initialSpaceScroll,this.viewerState.viewportElement.style.overflow="auto",this.viewerState.isScrollable=!0)}enableDragScrollable(){this.viewerState.viewportObject.hasAttribute("nochilddrag")&&this.viewerState.viewportObject.removeAttribute("nochilddrag")}disableScrollable(){this.viewerState.isScrollable&&(this.disableDragScrollable(),this.viewerState.outerObject.dblclick=null,this.viewerState.outerObject.contextmenu=null,this.viewerState.viewportElement.style.overflow="hidden",this.viewerState.initialKeyScroll=this.settings.enableKeyScroll,this.viewerState.initialSpaceScroll=this.settings.enableSpaceScroll,this.viewerState.options.enableKeyScroll=!1,this.viewerState.options.enableSpaceScroll=!1,this.viewerState.isScrollable=!1)}disableDragScrollable(){this.viewerState.viewportObject.hasAttribute("nochilddrag")||this.viewerState.viewportObject.setAttribute("nochilddrag","")}clear(){this.clearViewer()}setPendingManifestRequest(e){this.viewerState.pendingManifestRequest=e}destroy(){this.publish("ViewerWillTerminate",this.settings),this.settings.pendingManifestRequest&&this.settings.pendingManifestRequest.abort(),document.body.removeClass("diva-hide-scrollbar"),this.settings.parentObject.parent().empty().removeData("diva"),this.settings.parentObject.parent().removeAttr("style").removeAttr("class"),this.publish("ViewerDidTerminate",this.settings),u.Events.unsubscribeAll(this.settings.ID)}}function Q(e){let t,n=e.label,i="object"==typeof n?n[Object.keys(n)[0]][0]:n,r=e.value;return t=Array.isArray(r)?r.map(e=>e[Object.keys(e)[0]]):"object"==typeof r?r[Object.keys(r)[0]]:r,Array.isArray(t)&&(t=t.join(", ")),{label:i,value:t}}const ee=(e,t)=>{const n=Math.max(e,t);return n<128?0:Math.ceil(Math.log((n+1)/257)/Math.log(2))},te=(e,t)=>e/Math.pow(2,t),ne=(e,t)=>e.map(e=>{const n=e.width,i=e.height,r=re(e),s="/"!==r.url.slice(-1)?r.url+"/":r.url,o=new Array(t+1);for(let e=0;e"http://iiif.io/api/presentation/2/context.json"===e||Array.isArray(e)&&e.includes("http://iiif.io/api/presentation/2/context.json")?2:Array.isArray(e)&&e.includes("http://iiif.io/api/presentation/3/context.json")?3:2)(t),i=e.sequences?e.sequences[0]:null,r=i?i.canvases:e.items,s=r.length,o=new Array(r.length);let a,c,l,u,d,h,f,g,p,m,v,y,b,w,_,E,S,x=[],L=100,A=0,k=100;for(let e=0;e1.1?"default":"native";return encodeURI(r.url+"full/"+i+"/0/"+s+".jpg")}getTileImageURL(e,t,n){const i=e.pages[t];let r,s;r=n.row===n.rowCount-1?i.d[n.zoomLevel].h-(n.rowCount-1)*n.tileDimensions.height:n.tileDimensions.height,s=n.col===n.colCount-1?i.d[n.zoomLevel].w-(n.colCount-1)*n.tileDimensions.width:n.tileDimensions.width;const o=Math.pow(2,e.maxZoom-n.zoomLevel);let a=n.col*n.tileDimensions.width*o,c=n.row*n.tileDimensions.height*o;i.hasOwnProperty("xoffset")&&(a+=i.xoffset,c+=i.yoffset);const l=[a,c,s*o,r*o].join(","),u=i.api>1.1?"default":"native";return encodeURI(i.url+l+"/"+s+","+r+"/0/"+u+".jpg")}}class oe{constructor(e,t){this.pages=e.pgs,this.maxZoom=e.max_zoom,this.maxRatio=e.dims.max_ratio,this.minRatio=e.dims.min_ratio,this.itemTitle=e.item_title,this.metadata=e.metadata,this.paged=!!e.paged,this._maxWidths=e.dims.max_w,this._maxHeights=e.dims.max_h,this._averageWidths=e.dims.a_wid,this._averageHeights=e.dims.a_hei,this._totalHeights=e.dims.t_hei,this._totalWidths=e.dims.t_wid,this._urlAdapter=t}static fromIIIF(e){const t=ie(e);return new oe(t,new se)}isPageValid(e,t){return!(!t&&this.paged&&!this.pages[e].paged)&&(e>=0&&e{this.viewer.setZoomLevel(this.settings.zoomLevel-1)},e),this.createButton("zoom-in-button","Zoom In",()=>{this.viewer.setZoomLevel(this.settings.zoomLevel+1)},t),this.createLabel("diva-zoom-label","zoom-label","Zoom level: ","zoom-level",this.settings.zoomLevel+1)],r=function(){document.getElementById(this.settings.ID+"zoom-level").textContent=this.settings.zoomLevel+1};return this._subscribe("ZoomLevelDidChange",r),this._subscribe("ViewerDidLoad",r),i("div",{id:this.settings.ID+"zoom-controls",style:"display: none"},n)}createGridControls(){let e=this._createGridMoreIcon(),t=this._createGridFewerIcon(),n=[this.createButton("grid-out-button","Fewer",()=>{this.viewer.setGridPagesPerRow(this.settings.pagesPerRow-1)},t),this.createButton("grid-in-button","More",()=>{this.viewer.setGridPagesPerRow(this.settings.pagesPerRow+1)},e),this.createLabel("diva-grid-label","grid-label","Pages per row: ","pages-per-row",this.settings.pagesPerRow)];return this._subscribe("GridRowNumberDidChange",(function(){document.getElementById(this.settings.ID+"pages-per-row").textContent=this.settings.pagesPerRow})),i("div",{id:this.settings.ID+"grid-controls",style:"display:none"},n)}createPageLabel(){const e=i("span",{id:this.settings.ID+"current-page"}),t=()=>{let t=this.viewer.getCurrentPageIndices(),n=t[0],i=t[t.length-1],r=this.settings.manifest.pages[n].l,s=this.settings.manifest.pages[i].l;n!==i?this.settings.enableIndexAsLabel?e.textContent=n+" - "+i:e.textContent=r+" - "+s:this.settings.enableIndexAsLabel?e.textContent=n:e.textContent=r};return this._subscribe("VisiblePageDidChange",t),this._subscribe("ViewerDidLoad",t),this._subscribe("ViewDidSwitch",t),i("span",{class:"diva-page-label diva-label"},e)}createGotoPageForm(){const e=i("input",{id:this.settings.ID+"goto-page-input",class:"diva-input diva-goto-page-input",autocomplete:"off",type:"text","aria-label":"Page Input"}),t=i("input",{id:this.settings.ID+"goto-page-submit",class:"diva-button diva-button-text",type:"submit",value:"Go"}),n=i("div",{id:this.settings.ID+"input-suggestions",class:"diva-input-suggestions"}),r=i("form",{id:this.settings.ID+"goto-page",class:"diva-goto-form"},e,t,n);var s,o,a;return r.addEventListener("submit",t=>{t.preventDefault();const i=e.value;if(this.settings.onGotoSubmit&&"function"==typeof this.settings.onGotoSubmit){const e=this.settings.onGotoSubmit(i);this.viewer.gotoPageByIndex(e)||window.alert("No page could be found with that label or page number")}else this.viewer.gotoPageByLabel(i)||window.alert("No page could be found with that label or page number");return n.style.display="none",!1}),["input","focus"].forEach(t=>{e.addEventListener(t,()=>{n.innerHTML="";const t=e.value;let r=0;if(this.settings.enableGotoSuggestions&&t){const e=this.settings.manifest.pages;for(let s=0,o=e.length;s-1){const t=i("div",{class:"diva-input-suggestion"},e[s].l);n.appendChild(t),r++}r>0&&(n.style.display="block")}else n.style.display="none"})}),e.addEventListener("keydown",t=>{let n;if(13===t.keyCode){const t=document.getElementsByClassName("active")[0];void 0!==t&&(e.value=t.innerText)}if(38===t.keyCode){n=document.getElementsByClassName("active")[0];const e=n?n.previousSibling:void 0;if(void 0!==e)n.classList.remove("active"),null!==e&&e.classList.add("active");else{let e=document.getElementsByClassName("diva-input-suggestion").length-1;document.getElementsByClassName("diva-input-suggestion")[e].classList.add("active")}}else if(40===t.keyCode){n=document.getElementsByClassName("active")[0];const e=n?n.nextSibling:void 0;void 0!==e?(n.classList.remove("active"),null!==e&&e.classList.add("active")):document.getElementsByClassName("diva-input-suggestion")[0].classList.add("active")}}),s="mousedown",o=".diva-input-suggestion",a=function(){e.value=this.textContent,n.style.display="none";let t=new Event("submit",{cancelable:!0});r.dispatchEvent(t)},n.addEventListener(s,(function(e){for(var t=e.target;t&&t!==this;)t.matches(o)&&a.call(t,e),t=t.parentNode})),e.addEventListener("blur",()=>{n.style.display="none"}),r}createViewMenu(){const e=i("div",this._elemAttrs("view-options")),t=this._createGridViewIcon(),n=this._createBookViewIcon(),r=this._createPageViewIcon(),s=this.createButton("view-icon","Change view",()=>{e.style.display="none"===e.style.display?"block":"none"}),o=t=>{this.viewer.changeView(t),e.style.display="none"},a=()=>{this.settings.inGrid?(s.appendChild(t),s.className="diva-grid-icon diva-view-icon diva-button"):this.settings.inBookLayout?(s.appendChild(n),s.className="diva-book-icon diva-view-icon diva-button"):(s.appendChild(r),s.className="diva-document-icon diva-view-icon diva-button");const i=document.createDocumentFragment();for((this.settings.inGrid||this.settings.inBookLayout)&&i.appendChild(this.createButton("document-icon","Document View",o.bind(null,"document"),r)),!this.settings.inGrid&&this.settings.inBookLayout||i.appendChild(this.createButton("book-icon","Book View",o.bind(null,"book"),n)),this.settings.inGrid||i.appendChild(this.createButton("grid-icon","Grid View",o.bind(null,"grid"),t));e.firstChild;)e.removeChild(e.firstChild);e.appendChild(i)};return document.addEventListener("mouseup",t=>{e!==t.target&&(e.style.display="none")}),this._subscribe("ViewDidSwitch",a),this._subscribe("ObjectDidLoad",a),i("div",this._elemAttrs("view-menu"),s,e)}createFullscreenButton(){let e=this._createFullscreenIcon();return this.createButton("fullscreen-icon","Toggle fullscreen mode",()=>{this.viewer.toggleFullscreenMode()},e)}toggleZoomGridControls(){this.settings.inGrid?(document.getElementById(this.settings.ID+"zoom-controls").style.display="none",document.getElementById(this.settings.ID+"grid-controls").style.display="block"):(document.getElementById(this.settings.ID+"zoom-controls").style.display="block",document.getElementById(this.settings.ID+"grid-controls").style.display="none")}render(){this._subscribe("ViewDidSwitch",this.toggleZoomGridControls),this._subscribe("ObjectDidLoad",this.toggleZoomGridControls);let e=[this.createZoomButtons(),this.createGridControls()],t=[this.createPageLabel(),this.createViewMenu()];this.settings.enableFullscreen&&t.push(this.createFullscreenButton()),this.settings.enableGotoPage&&t.splice(1,0,this.createGotoPageForm());let n=this.viewer.viewerState.pluginInstances;for(let i=0,s=n.length;i{let t=document.createElementNS("http://www.w3.org/2000/svg","path");t.setAttributeNS(null,"d",e),n.appendChild(t)}),t.appendChild(n),t}_createZoomOutIcon(){return this._createToolbarIcon(["M19.5,23c-0.275,0-0.5-0.225-0.5-0.5v-1c0-0.275,0.225-0.5,0.5-0.5h7c0.275,0,0.5,0.225,0.5,0.5v1c0,0.275-0.225,0.5-0.5,0.5H19.5z","M37.219,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.422,33.722,37.422,34.054,37.219,34.257z M29.568,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.555,28.818,29.568,25.805,29.568,22.099z"])}_createZoomInIcon(){return this._createToolbarIcon(["M37.469,34.257l-2.213,2.212c-0.202,0.202-0.534,0.202-0.736,0l-6.098-6.099c-1.537,0.993-3.362,1.577-5.323,1.577c-5.431,0-9.849-4.418-9.849-9.849c0-5.431,4.418-9.849,9.849-9.849c5.431,0,9.849,4.418,9.849,9.849c0,1.961-0.584,3.786-1.576,5.323l6.098,6.098C37.672,33.722,37.672,34.054,37.469,34.257z M29.818,22.099c0-3.706-3.014-6.72-6.72-6.72c-3.706,0-6.72,3.014-6.72,6.72c0,3.706,3.014,6.72,6.72,6.72C26.805,28.818,29.818,25.805,29.818,22.099z M26.5,21H24v-2.5c0-0.275-0.225-0.5-0.5-0.5h-1c-0.275,0-0.5,0.225-0.5,0.5V21h-2.5c-0.275,0-0.5,0.225-0.5,0.5v1c0,0.275,0.225,0.5,0.5,0.5H22v2.5c0,0.275,0.225,0.5,0.5,0.5h1c0.275,0,0.5-0.225,0.5-0.5V23h2.5c0.275,0,0.5-0.225,0.5-0.5v-1C27,21.225,26.775,21,26.5,21z"])}_createGridMoreIcon(){return this._createToolbarIcon(["M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z"])}_createGridFewerIcon(){return this._createToolbarIcon(["M25.5,35c-0.275,0-0.5-0.225-0.5-0.5v-9c0-0.275,0.225-0.5,0.5-0.5h9c0.275,0,0.5,0.225,0.5,0.5v9c0,0.275-0.225,0.5-0.5,0.5H25.5z M22.5,35c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z M34.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H34.5z M22.5,23c0.275,0,0.5-0.225,0.5-0.5v-9c0-0.275-0.225-0.5-0.5-0.5h-9c-0.275,0-0.5,0.225-0.5,0.5v9c0,0.275,0.225,0.5,0.5,0.5H22.5z"])}_createGridViewIcon(){return this._createToolbarIcon(["M29.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,35c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,27c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z M29.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H29.5z M21.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H21.5z M13.5,19c-0.275,0-0.5-0.225-0.5-0.5v-5c0-0.275,0.225-0.5,0.5-0.5h5c0.275,0,0.5,0.225,0.5,0.5v5c0,0.275-0.225,0.5-0.5,0.5H13.5z"])}_createBookViewIcon(){return this._createToolbarIcon(["M35,16.8v-1.323c0,0-2.292-1.328-5.74-1.328c-3.448,0-5.26,1.25-5.26,1.25s-1.813-1.25-5.26-1.25c-3.448,0-5.74,1.328-5.74,1.328V16.8l-1,0.531v0.021v15.687c0,0,4.531-1.578,6.999-1.578c2.468,0,5.001,0.885,5.001,0.885s2.532-0.885,5-0.885c0.306,0,0.643,0.024,1,0.066v4.325l1.531-2.016L33,35.852v-3.72c2,0.43,3,0.906,3,0.906V17.352v-0.021L35,16.8z M23,29.03c-1-0.292-2.584-0.679-3.981-0.679c-2.246,0-3.019,0.404-4.019,0.699V16.634c0,0,1.125-0.699,4.019-0.699c1.694,0,2.981,0.417,3.981,1.126V29.03z M33,29.051c-1-0.295-1.773-0.699-4.02-0.699c-1.396,0-2.981,0.387-3.98,0.679V17.06c1-0.709,2.286-1.126,3.98-1.126c2.895,0,4.02,0.699,4.02,0.699V29.051z"])}_createPageViewIcon(){return this._createToolbarIcon(["M29.425,29h4.47L29,33.934v-4.47C29,29.19,29.151,29,29.425,29z M34,14.563V28h-5.569C28.157,28,28,28.196,28,28.47V34H14.497C14.223,34,14,33.71,14,33.437V14.563C14,14.29,14.223,14,14.497,14h18.9C33.672,14,34,14.29,34,14.563z M25.497,26.497C25.497,26.223,25.275,26,25,26h-7c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,27.777,17.725,28,18,28h7c0.275,0,0.497-0.223,0.497-0.497V26.497z M30.497,22.497C30.497,22.223,30.275,22,30,22H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,23.777,17.725,24,18,24h12c0.275,0,0.497-0.223,0.497-0.497V22.497z M30.497,18.497C30.497,18.223,30.275,18,30,18H18c-0.275,0-0.497,0.223-0.497,0.497v1.006C17.503,19.777,17.725,20,18,20h12c0.275,0,0.497-0.223,0.497-0.497V18.497z"])}_createFullscreenIcon(){return this._createToolbarIcon(["M35,12H13c-0.55,0-1,0.45-1,1v22c0,0.55,0.45,1,1,1h22c0.55,0,1-0.45,1-1V13C36,12.45,35.55,12,35,12z M34,34H14V14h20V34z","M17,21.75v-4.5c0-0.138,0.112-0.25,0.25-0.25h4.5c0.138,0,0.17,0.08,0.073,0.177l-1.616,1.616l1.823,1.823c0.097,0.097,0.097,0.256,0,0.354l-1.061,1.06c-0.097,0.097-0.256,0.097-0.354,0l-1.823-1.823l-1.616,1.616C17.08,21.92,17,21.888,17,21.75z M20.97,25.97c-0.097-0.097-0.256-0.097-0.354,0l-1.823,1.823l-1.616-1.616C17.08,26.08,17,26.112,17,26.25v4.5c0,0.138,0.112,0.25,0.25,0.25h4.5c0.138,0,0.17-0.08,0.073-0.177l-1.616-1.616l1.823-1.823c0.097-0.097,0.097-0.256,0-0.354L20.97,25.97z M30.75,17h-4.5c-0.138,0-0.17,0.08-0.073,0.177l1.616,1.616l-1.823,1.823c-0.097,0.097-0.097,0.256,0,0.354l1.061,1.06c0.097,0.097,0.256,0.097,0.354,0l1.823-1.823l1.616,1.616C30.92,21.92,31,21.888,31,21.75v-4.5C31,17.112,30.888,17,30.75,17z M30.823,26.177l-1.616,1.616l-1.823-1.823c-0.097-0.097-0.256-0.097-0.354,0l-1.061,1.06c-0.097,0.097-0.097,0.256,0,0.354l1.823,1.823l-1.616,1.616C26.08,30.92,26.112,31,26.25,31h4.5c0.138,0,0.25-0.112,0.25-0.25v-4.5C31,26.112,30.92,26.08,30.823,26.177z M26,22.5c0-0.275-0.225-0.5-0.5-0.5h-3c-0.275,0-0.5,0.225-0.5,0.5v3c0,0.275,0.225,0.5,0.5,0.5h3c0.275,0,0.5-0.225,0.5-0.5V22.5z"])}}var le={get:ue,update:function(e,t){const n=ue(e),i=window.location.hash;if(n!==t)if("string"==typeof n){const r=i.indexOf("&"+e+"=")>0?i.indexOf("&"+e+"="):i.indexOf("#"+e+"="),s=r+e.length+2+n.length,o=0===r?"#":"&";window.location.replace(i.substring(0,r)+o+e+"="+t+i.substring(s))}else 0===i.length?window.location.replace("#"+e+"="+t):window.location.replace(i+"&"+e+"="+t)}};function ue(e){const t=window.location.hash;if(""!==t){let n=t.indexOf("&"+e+"=")>0?t.indexOf("&"+e+"="):t.indexOf("#"+e+"=");if(n>=0){n+=e.length+2;const i=t.indexOf("&",n);return i>n?decodeURIComponent(t.substring(n,i)):i<0?decodeURIComponent(t.substring(n)):""}return!1}return!1}class de{constructor(e,t){if(!(e instanceof HTMLElement)&&(this.element=document.getElementById(e),null===this.element))throw new a;if(!t.objectData)throw new l("You must supply either a URL or a literal object to the `objectData` key.");this.options=Object.assign({adaptivePadding:.05,arrowScrollAmount:40,blockMobileMove:!1,objectData:"",enableAutoTitle:!0,enableFilename:!0,enableFullscreen:!0,enableGotoPage:!0,enableGotoSuggestions:!0,enableGridIcon:!0,enableGridControls:"buttons",enableImageTitles:!0,enableIndexAsLabel:!1,enableKeyScroll:!0,enableLinkIcon:!0,enableNonPagedVisibilityIcon:!0,enableSpaceScroll:!1,enableToolbar:!0,enableZoomControls:"buttons",fillParentHeight:!0,fixedPadding:10,fixedHeightGrid:!0,goDirectlyTo:0,hashParamSuffix:null,imageCrossOrigin:"anonymous",inFullscreen:!1,inBookLayout:!1,inGrid:!1,maxPagesPerRow:8,maxZoomLevel:-1,minPagesPerRow:2,minZoomLevel:0,onGotoSubmit:null,pageAliases:{},pageAliasFunction:function(){return!1},pageLoadTimeout:200,pagesPerRow:5,requestHeaders:{Accept:"application/json"},showNonPagedPages:!1,throbberTimeout:100,tileHeight:256,tileWidth:256,toolbarParentObject:null,verticallyOriented:!0,viewportMargin:200,zoomLevel:2},t);const n=i("div",{class:"diva-wrapper"+(this.options.fillParentHeight?" diva-wrapper-flexbox":"")});this.element.appendChild(n),this.options.toolbarParentObject=this.options.toolbarParentObject||n;const r=new J(n,this.options,this);this.viewerState=r.getInternalState(),this.settings=r.getSettings(),this.toolbar=this.settings.enableToolbar?new ce(this):null,n.id=this.settings.ID+"wrapper",this.divaState={viewerCore:r,toolbar:this.toolbar};let s=u.Events.subscribe("ObjectDidLoad",()=>{null!==this.toolbar&&this.toolbar.render(),u.Events.unsubscribe(s)});this.hashState=this._getHashParamState(),this._loadOrFetchObjectData()}_loadOrFetchObjectData(){if("object"==typeof this.settings.objectData)setTimeout(()=>{this._loadObjectData(this.settings.objectData,this.hashState)},0);else{const e=fetch(this.settings.objectData,{headers:this.settings.requestHeaders}).then(e=>{if(!e.ok){u.Events.publish("ManifestFetchError",[e],this),this._ajaxError(e);let t=new Error(e.statusText);throw t.response=e,t}return e.json()}).then(e=>{this._loadObjectData(e,this.hashState)});this.divaState.viewerCore.setPendingManifestRequest(e)}}_showError(e){this.divaState.viewerCore.showError(e)}_ajaxError(e){const t=["Invalid objectData setting. Error code: "+e.status+" "+e.statusText];if(0===this.settings.objectData.lastIndexOf("http",0)){const e=this.settings.objectData.replace(/https?:\/\//i,"").split(/[/?#]/)[0];window.location.hostname!==e&&t.push(i("p","Attempted to access cross-origin data without CORS."),i("p","You may need to update your server configuration to support CORS. For help, see the ",i("a",{href:"https://github.com/DDMAL/diva.js/wiki/Installation#a-note-about-cross-site-requests",target:"_blank"},"cross-site request documentation.")))}this._showError(t)}_loadObjectData(e,t){let n;if(!e.hasOwnProperty("@context")&&(-1===e["@context"].indexOf("iiif")||-1===e["@context"].indexOf("shared-canvas")))throw new c("This does not appear to be a IIIF Manifest.");u.Events.publish("ManifestDidLoad",[e],this),n=oe.fromIIIF(e);const i=t?this._getLoadOptionsForState(t,n):{};this.divaState.viewerCore.setManifest(n,i)}_getHashParamState(){const e={};return["f","v","z","n","i","p","y","x"].forEach(t=>{const n=le.get(t+this.settings.hashParamSuffix);!1!==n&&(e[t]=n)}),"true"===e.f?e.f=!0:"false"===e.f&&(e.f=!1),["z","n","p","x","y"].forEach(t=>{t in e&&(e[t]=parseInt(e[t],10))}),e}_getLoadOptionsForState(e,t){t=t||this.settings.manifest;const n="v"in e?this._getViewState(e.v):{};"f"in e&&(n.inFullscreen=e.f),"z"in e&&(n.zoomLevel=e.z),"n"in e&&(n.pagesPerRow=e.n);let i=this._getPageIndexForManifest(t,e.i);if(i>=0&&i=0&&io)return-1;if(ts)return-1;const a=document.getElementsByClassName("diva-page");let c=a.length;for(;c--;){const n=a[c],i=n.getBoundingClientRect();if(!(ei.right)&&!(ti.bottom))return n.getAttribute("data-index")}return-1}_reloadViewer(e){return this.divaState.viewerCore.reload(e)}_getCurrentURL(){return location.protocol+"//"+location.host+location.pathname+location.search+"#"+this._getURLHash()}activate(){this.viewerState.isActiveDiva=!0}changeObject(e){this.viewerState.loaded=!1,this.divaState.viewerCore.clear(),this.viewerState.renderer&&this.viewerState.renderer.destroy(),this.viewerState.options.objectData=e,this._loadOrFetchObjectData()}changeView(e){this._changeView(e)}deactivate(){this.viewerState.isActiveDiva=!1}destroy(){this.divaState.viewerCore.destroy()}disableScrollable(){this.divaState.viewerCore.disableScrollable()}enableScrollable(){this.divaState.viewerCore.enableScrollable()}disableDragScrollable(){this.divaState.viewerCore.disableDragScrollable()}enableDragScrollable(){this.divaState.viewerCore.enableDragScrollable()}enterFullscreenMode(){return!this.settings.inFullscreen&&(this._toggleFullscreen(),!0)}enterGridView(){return!this.settings.inGrid&&(this._changeView("grid"),!0)}getAllPageURIs(){return this.settings.manifest.pages.map(e=>e.f)}getCurrentCanvas(){return this.settings.manifest.pages[this.settings.activePageIndex].canvas}getCurrentPageDimensionsAtCurrentZoomLevel(){return this.getPageDimensionsAtCurrentZoomLevel(this.settings.activePageIndex)}getCurrentPageFilename(){return console.warn("This method will be deprecated in the next version of Diva. Please use getCurrentPageURI instead."),this.settings.manifest.pages[this.settings.activePageIndex].f}getCurrentPageIndices(){return this.settings.currentPageIndices}getActivePageIndex(){return this.settings.activePageIndex}getCurrentPageOffset(){return this.getPageOffset(this.settings.activePageIndex)}getCurrentPageURI(){return this.settings.manifest.pages[this.settings.activePageIndex].f}getCurrentURL(){return this._getCurrentURL()}getFilenames(){return console.warn("This will be removed in the next version of Diva. Use getAllPageURIs instead."),this.settings.manifest.pages.map(e=>e.f)}getGridPagesPerRow(){return this.settings.pagesPerRow}getInstanceId(){return this.settings.ID}getInstanceSelector(){return this.divaState.viewerCore.selector}getItemTitle(){return this.settings.manifest.itemTitle}getMaxZoomLevel(){return this.settings.maxZoomLevel}getMaxZoomLevelForPage(e){return!!this._checkLoaded()&&this.settings.manifest.pages[e].m}getMinZoomLevel(){return this.settings.minZoomLevel}getNumberOfPages(){return!!this._checkLoaded()&&this.settings.numPages}getOtherImages(e){return this.settings.manifest.pages[e].otherImages}getPageDimensions(e){return this._checkLoaded()?this.divaState.viewerCore.getCurrentLayout().getPageDimensions(e):null}getPageDimensionsAtCurrentZoomLevel(e){let t=parseInt(e,10);if(!this._isPageIndexValid(t))throw new Error("Invalid Page Index");return this.divaState.viewerCore.getCurrentLayout().getPageDimensions(t)}getPageDimensionsAtZoomLevel(e,t){if(!this._checkLoaded())return!1;t>this.settings.maxZoomLevel&&(t=this.settings.maxZoomLevel);const n=this.settings.manifest.pages[parseInt(e,10)].d[parseInt(t,10)];return{width:n.w,height:n.h}}getPageImageURL(e,t){return this.settings.manifest.getPageImageURL(e,t)}getPageIndexForPageXYValues(e,t){return this._getPageIndexForPageXYValues(e,t)}getPageOffset(e,t){const n=this.divaState.viewerCore.getPageRegion(e,t);return{top:n.top,left:n.left}}getSettings(){return this.settings}getState(){return this._getState()}getZoomLevel(){return this.settings.zoomLevel}gotoPageByIndex(e,t,n){return this._gotoPageByIndex(e,t,n)}gotoPageByLabel(e,t,n){const i=this.settings.manifest.pages;let r=e.toLowerCase();for(let e=0,s=i.length;e-1)return this._gotoPageByIndex(e,t,n);const s=parseInt(e,10)-1;return this._gotoPageByIndex(s,t,n)}gotoPageByName(e,t,n){console.warn("This method will be removed in the next version of Diva.js. Use gotoPageByURI instead.");const i=this._getPageIndex(e);return this._gotoPageByIndex(i,t,n)}gotoPageByURI(e,t,n){const i=this._getPageIndex(e);return this._gotoPageByIndex(i,t,n)}hasOtherImages(e){return!0===this.settings.manifest.pages[e].otherImages}hideNonPagedPages(){this._reloadViewer({showNonPagedPages:!1})}isInFullscreen(){return this.settings.inFullscreen}isPageIndexValid(e){return this._isPageIndexValid(e)}isPageInViewport(e){return this.viewerState.renderer.isPageVisible(e)}isReady(){return this.viewerState.loaded}isRegionInViewport(e,t,n,i,r){const s=this.divaState.viewerCore.getCurrentLayout();if(!s)return!1;const o=s.getPageOffset(e),a=o.top+n,c=o.left+t;return this.viewerState.viewport.intersectsRegion({top:a,bottom:a+r,left:c,right:c+i})}isVerticallyOriented(){return this.settings.verticallyOriented}leaveFullscreenMode(){return!!this.settings.inFullscreen&&(this._toggleFullscreen(),!0)}leaveGridView(){return!!this.settings.inGrid&&(this._reloadViewer({inGrid:!1}),!0)}setGridPagesPerRow(e){return!!this.divaState.viewerCore.isValidOption("pagesPerRow",e)&&this._reloadViewer({inGrid:!0,pagesPerRow:e})}setState(e){this._reloadViewer(this._getLoadOptionsForState(e))}setZoomLevel(e){return this.settings.inGrid&&this._reloadViewer({inGrid:!1}),this.divaState.viewerCore.zoom(e)}showNonPagedPages(){this._reloadViewer({showNonPagedPages:!0})}toggleFullscreenMode(){this._toggleFullscreen()}toggleNonPagedPagesVisibility(){this._reloadViewer({showNonPagedPages:!this.settings.showNonPagedPages})}toggleOrientation(){return this._togglePageLayoutOrientation()}translateFromMaxZoomLevel(e){const t=this.settings.maxZoomLevel-this.settings.zoomLevel;return e/Math.pow(2,t)}translateToMaxZoomLevel(e){const t=this.settings.maxZoomLevel-this.settings.zoomLevel;return 0===t?e:e*Math.pow(2,t)}zoomIn(){return this.setZoomLevel(this.settings.zoomLevel+1)}zoomOut(){return this.setZoomLevel(this.settings.zoomLevel-1)}}de.Events=u.Events;var he;t.default=de;"undefined"!=typeof window&&((he=window).Diva=he.Diva||de)}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ltbWVkaWF0ZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL05vdGlmaWNhdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvTG9jYWxTZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvU2VsZWN0VG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FyZ3NhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJkM1wiIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L0NvbnRlbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Nb2RhbFdpbmRvdy50cyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db29yZGluYXRlcy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3BhcmstbWQ1L3NwYXJrLW1kNS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvcmFuZG9tLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9Db2xvci50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanNvbnNjaGVtYS9saWIvaGVscGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnV2dXplbGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRHJhZ0hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvR3JvdXBpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0Vycm9yTG9nLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9SZXNpemUudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3BvdWNoZGIvbGliL2luZGV4LWJyb3dzZXIuZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdmtiZWF1dGlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRGFzaGJvYXJkL0Rhc2hib2FyZENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dhcm5pbmdzLnRzIiwid2VicGFjazovLy8uL3NyYy9TcXVhcmVFZGl0L1N0YWZmVG9vbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvTmV1bWVUb29scy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9xdWV1ZU1pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9tdXRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9tZXNzYWdlQ2hhbm5lbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi9zdGF0ZUNoYW5nZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZWRpYXRlL2xpYi90aW1lb3V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91cmwvdXJsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qc29uc2NoZW1hL2xpYi9zY2FuLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9TZWxlY3QudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0NvbnZlcnRNZWkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1ZhbGlkYXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL1Vuc2F2ZWQudHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvQ29udHJvbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvSW5zZXJ0SGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvRWRpdENvbnRlbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9FZGl0Q29udHJvbHMudHMiLCJ3ZWJwYWNrOi8vLy4vZGVwbG95bWVudC9zY3JpcHRzL2VkaXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvTmVvblZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL05lb25Db3JlLnRzIiwid2VicGFjazovLy8uL3NyYy9WZXJvdmlvV3JhcHBlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvTmVvbk1hbmlmZXN0LnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qc29uc2NoZW1hL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanNvbnNjaGVtYS9saWIvdmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub2RlLWxpYnMtYnJvd3Nlci9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VybC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pzb25zY2hlbWEvbGliL2F0dHJpYnV0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvdGVtcGxhdGUvVGVtcGxhdGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL0RlYnVnTW9kZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGlzcGxheVBhbmVsL0Rpc3BsYXlQYW5lbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvRGl2YVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL3ZhbmlsbGEua2luZXRpYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdXRpbHMvZHJhZ3Njcm9sbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9TaW5nbGVWaWV3L1NpbmdsZVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpbmdsZVZpZXcvWm9vbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3F1YXJlRWRpdC9EaXZhRWRpdE1vZGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NxdWFyZUVkaXQvU2luZ2xlRWRpdE1vZGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0luZm9Nb2R1bGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1RleHRWaWV3LnRzIiwid2VicGFjazovLy8uL3NyYy9UZXh0RWRpdE1vZGUudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL2VsdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZXhjZXB0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZGl2YS1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZ2VzdHVyZS1ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3BhZ2UtdG9vbHMtb3ZlcmxheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZG9jdW1lbnQtaGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZ3JpZC1oYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLW92ZXJsYXktbWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdGlsZS1jb3ZlcmFnZS1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL2NvbXBvc2l0ZS1pbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvZG9jdW1lbnQtbGF5b3V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9pbWFnZS1jYWNoZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvaW1hZ2UtcmVxdWVzdC1oYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9pbnRlcnBvbGF0ZS1hbmltYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3JlbmRlcmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLWxheW91dHMvcGFnZS1kaW1lbnNpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLWxheW91dHMvYm9vay1sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3BhZ2UtbGF5b3V0cy9ncmlkLWxheW91dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvcGFnZS1sYXlvdXRzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYWdlLWxheW91dHMvc2luZ2xlcy1sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3NldHRpbmdzLXZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3ZhbGlkYXRpb24tcnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy92aWV3cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdmlld2VyLWNvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL2dldC1zY3JvbGxiYXItd2lkdGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL3V0aWxzL3BhcnNlLWxhYmVsLXZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9wYXJzZS1paWlmLW1hbmlmZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9paWlmLXNvdXJjZS1hZGFwdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kaXZhLmpzL3NvdXJjZS9qcy9pbWFnZS1tYW5pZmVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdG9vbGJhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGl2YS5qcy9zb3VyY2UvanMvdXRpbHMvaGFzaC1wYXJhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RpdmEuanMvc291cmNlL2pzL2RpdmEuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJSZWZsZWN0T3duS2V5cyIsIlIiLCJSZWZsZWN0IiwiUmVmbGVjdEFwcGx5IiwiYXBwbHkiLCJ0YXJnZXQiLCJyZWNlaXZlciIsImFyZ3MiLCJGdW5jdGlvbiIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiY29uY2F0IiwiTnVtYmVySXNOYU4iLCJOdW1iZXIiLCJpc05hTiIsIkV2ZW50RW1pdHRlciIsImluaXQiLCJ0aGlzIiwib25jZSIsImVtaXR0ZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImVycm9yTGlzdGVuZXIiLCJlcnIiLCJyZW1vdmVMaXN0ZW5lciIsInJlc29sdmVyIiwic2xpY2UiLCJhcmd1bWVudHMiLCJldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIiLCJoYW5kbGVyIiwiZmxhZ3MiLCJvbiIsImFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyIiwiX2V2ZW50cyIsInVuZGVmaW5lZCIsIl9ldmVudHNDb3VudCIsIl9tYXhMaXN0ZW5lcnMiLCJkZWZhdWx0TWF4TGlzdGVuZXJzIiwiY2hlY2tMaXN0ZW5lciIsImxpc3RlbmVyIiwiVHlwZUVycm9yIiwiX2dldE1heExpc3RlbmVycyIsInRoYXQiLCJfYWRkTGlzdGVuZXIiLCJ0eXBlIiwicHJlcGVuZCIsImV2ZW50cyIsImV4aXN0aW5nIiwid2FybmluZyIsIm5ld0xpc3RlbmVyIiwiZW1pdCIsInVuc2hpZnQiLCJwdXNoIiwibGVuZ3RoIiwid2FybmVkIiwidyIsIkVycm9yIiwiU3RyaW5nIiwiY291bnQiLCJjb25zb2xlIiwid2FybiIsIm9uY2VXcmFwcGVyIiwiZmlyZWQiLCJ3cmFwRm4iLCJfb25jZVdyYXAiLCJzdGF0ZSIsIndyYXBwZWQiLCJfbGlzdGVuZXJzIiwidW53cmFwIiwiZXZsaXN0ZW5lciIsImFyciIsInJldCIsIkFycmF5IiwidW53cmFwTGlzdGVuZXJzIiwiYXJyYXlDbG9uZSIsImxpc3RlbmVyQ291bnQiLCJjb3B5IiwiYWRkRXZlbnRMaXN0ZW5lciIsIndyYXBMaXN0ZW5lciIsImFyZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZXQiLCJSYW5nZUVycm9yIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJkb0Vycm9yIiwiZXJyb3IiLCJlciIsIm1lc3NhZ2UiLCJjb250ZXh0IiwibGVuIiwibGlzdGVuZXJzIiwiYWRkTGlzdGVuZXIiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdCIsInBvc2l0aW9uIiwib3JpZ2luYWxMaXN0ZW5lciIsInNoaWZ0IiwiaW5kZXgiLCJwb3AiLCJzcGxpY2VPbmUiLCJvZmYiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJrZXlzIiwicmF3TGlzdGVuZXJzIiwiZXZlbnROYW1lcyIsImN0b3IiLCJzdXBlckN0b3IiLCJzdXBlcl8iLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiVGVtcEN0b3IiLCJkcmFpbmluZyIsImN1cnJlbnRRdWV1ZSIsInNjaGVkdWxlRHJhaW4iLCJ0eXBlcyIsInF1ZXVlSW5kZXgiLCJxdWV1ZSIsInNjaGVkdWxlZCIsImNsZWFuVXBOZXh0VGljayIsIm5leHRUaWNrIiwidGltZW91dCIsInNldFRpbWVvdXQiLCJydW4iLCJjbGVhclRpbWVvdXQiLCJ0ZXN0IiwiaW5zdGFsbCIsIkl0ZW0iLCJmdW4iLCJhcnJheSIsInRhc2siLCJub3RpZmljYXRpb25zIiwiY3VycmVudE1vZGVNZXNzYWdlIiwibm90aWZpY2F0aW9uSWNvbiIsImRlZmF1bHQiLCJzdWNjZXNzIiwiTm90aWZpY2F0aW9uIiwibG9nSW5mbyIsImRpc3BsYXllZCIsImlkIiwidXVpZHY0IiwiaXNNb2RlTWVzc2FnZSIsInNlYXJjaCIsInRpbWVvdXRJRCIsIk1hdGgiLCJtYXgiLCJjbGVhck5vdGlmaWNhdGlvbiIsImN1cnJlbnRJZCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJyZW1vdmUiLCJzdGFydE5vdGlmaWNhdGlvbiIsIm5vdGlmaWNhdGlvbiIsIndpbmRvdyIsImdldElkIiwibm90aWZpY2F0aW9uQ29udGVudCIsIm5ld05vdGlmaWNhdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJpbm5lckhUTUwiLCJhcHBlbmQiLCJzdHlsZSIsImRpc3BsYXkiLCJkaXNwbGF5Tm90aWZpY2F0aW9uIiwic2V0VGltZW91dElkIiwicXVldWVOb3RpZmljYXRpb24iLCJyZWNvcmROb3RpZmljYXRpb24iLCJsb2NhbFNldHRpbmdzIiwiREVGQVVMVF9TRVRUSU5HUyIsInpvb20iLCJnbHlwaE9wYWNpdHkiLCJpbWFnZU9wYWNpdHkiLCJjaXJjbGVTaXplIiwiaGlnaGxpZ2h0TW9kZSIsInVzZXJNb2RlIiwiaW5zZXJ0TW9kZSIsImluc2VydFRhYiIsInNlbGVjdGlvbk1vZGUiLCJkZWJ1Z01vZGUiLCJkaXNwbGF5QkJveCIsImRpc3BsYXlUZXh0IiwiZGlzcGxheUluZm8iLCJkaXNwbGF5RXJyTG9nIiwidmlld0JveCIsInNldHRpbmdzIiwicGFyYW1zIiwiZm9saW9JZCIsImxvYWQiLCJzdG9yZWQiLCJKU09OIiwicGFyc2UiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic3luYyIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJnZXRTZWxlY3Rpb25UeXBlIiwiZWxlbWVudCIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJ1bnNlbGVjdCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwic2VsZWN0ZWQiLCJjb250YWlucyIsInJlbW92ZUF0dHJpYnV0ZSIsIkNvbG9yIiwidW5oaWdobGlnaHQiLCJmaWxsIiwiZnJvbSIsImRpdkxpbmUiLCJzdHJva2UiLCJzZXRBdHRyaWJ1dGUiLCJuZXVtZSIsInN5bFJlY3QiLCJwYXJlbnRFbGVtZW50IiwiZDMiLCJzZWxlY3RBbGwiLCJlbCIsImNvbG9yIiwiZm9udFdlaWdodCIsIlNlbGVjdE9wdGlvbnMiLCJlbmRPcHRpb25zU2VsZWN0aW9uIiwiR3JvdXBpbmciLCJlbmRHcm91cGluZ1NlbGVjdGlvbiIsInVwZGF0ZUhpZ2hsaWdodCIsInNlbGVjdFN0YWZmIiwic3RhZmYiLCJkcmFnSGFuZGxlciIsImhpZ2hsaWdodCIsInRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMiLCJpbml0R3JvdXBpbmdMaXN0ZW5lcnMiLCJkcmFnSW5pdCIsInNlbGVjdExheWVyRWxlbWVudCIsImxheWVyRWxlbWVudCIsInNlbGVjdCIsIm5lZWRzSGlnaGxpZ2h0VXBkYXRlIiwic3lsSWQiLCJlbGVtIiwiY2xvc2VzdCIsInNwYW4iLCJhc3luYyIsImlzTGlnYXR1cmUiLCJuYyIsIm5lb25WaWV3IiwiYXR0cmlidXRlcyIsImdldEVsZW1lbnRBdHRyIiwidmlldyIsImdldEN1cnJlbnRQYWdlVVJJIiwiQm9vbGVhbiIsImxpZ2F0ZWQiLCJlbGVtZW50c0hhdmVDb3JyZWN0VHlwZSIsInNlbGVjdGlvblR5cGUiLCJlbGVtZW50cyIsInNoYXJlZFNlY29uZExldmVsUGFyZW50IiwidGVtcEVsZW1lbnRzIiwic2Vjb25kUGFyZW50Iiwic2VsZWN0QkJveCIsImJib3giLCJzeWwiLCJyZXNpemUiLCJxdWVyeVNlbGVjdG9yIiwidHJpZ2dlckJCb3hBY3Rpb25zIiwicGFyZW50IiwicHJldk5jIiwicHJldmlvdXNTaWJsaW5nIiwibmV4dE5jIiwibmV4dFNpYmxpbmciLCJ0cmlnZ2VyR3JvdXBpbmciLCJ0cmlnZ2VyTmNBY3Rpb25zIiwiYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUiLCJzb3J0ZWRFbGVtZW50cyIsImoiLCJpc1NhbWVOb2RlIiwiZmlyc3RFbGVtIiwic2Vjb25kRWxlbSIsImluZGV4MSIsImluZGV4T2YiLCJpbmRleDIiLCJhYnMiLCJmaWx0ZXIiLCJyZWZlcmVuY2VQYXJlbnRTdGFmZiIsInJlZmVyZW5jZVBhcmVudFN5bGxhYmxlIiwiZWxlbWVudHNBcnJheSIsImFub3RoZXJTdGFmZiIsInVseCIsInVseSIsImxyeCIsImxyeSIsInJvdGF0ZSIsInBhdGgiLCJjb29yZGluYXRlcyIsImdldEF0dHJpYnV0ZSIsIm1hdGNoIiwibWFwIiwiYXRhbiIsIm1pbiIsIm5vdE5ldW1lcyIsIm5uIiwic2VsZWN0aW9uQ2xhc3MiLCJjb250YWluc0xheWVyRWxlbWVudHMiLCJjb250YWluc05jIiwiZ3JvdXBzVG9TZWxlY3QiLCJTZXQiLCJncm91cGluZyIsImZvbGxvd3MiLCJwcmVjZWRlcyIsImhhcyIsImdyb3VwIiwiZ3JvdXBzIiwidmFsdWVzIiwidHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zIiwic2l6ZSIsInRyaWdnZXJMYXllckVsZW1lbnRBY3Rpb25zIiwidHJpZ2dlckRlZmF1bHRBY3Rpb25zIiwidHJpZ2dlclN5bGxhYmxlQWN0aW9ucyIsImFkZEFkZFN5bExpc3RlbmVyIiwiaXNMaW5rYWJsZSIsImlzR3JvdXBhYmxlIiwidHJpZ2dlck5ldW1lQWN0aW9ucyIsImNoaWxkcmVuIiwiZmlyc3ROQyIsInNlY29uZE5DIiwiZmlyc3ROQ1giLCJ4IiwiYmFzZVZhbCIsInNlY29uZE5DWCIsImZpcnN0TkNZIiwieSIsInNlY29uZE5DWSIsImciLCJ0cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMiLCJpbnNlcnRUYWJIdG1sIiwicHJpbWl0aXZlVGFiIiwiZ3JvdXBpbmdUYWIiLCJzeXN0ZW1UYWIiLCJpbnNlcnRDb250cm9sc1BhbmVsIiwiZWRpdENvbnRyb2xzUGFuZWwiLCJuY0FjdGlvbkNvbnRlbnRzIiwiZGVmYXVsdE5ldW1lQWN0aW9uQ29udGVudHMiLCJuZXVtZUFjdGlvbkNvbnRlbnRzIiwiZGVmYXVsdEFjdGlvbkNvbnRlbnRzIiwiZGVmYXVsdFN5bEFjdGlvbkNvbnRlbnRzIiwiY3VzdG9zQWN0aW9uQ29udGVudHMiLCJsYXllckVsZW1lbnRPdXRBY3Rpb25Db250ZW50cyIsImxheWVyRWxlbWVudEluQWN0aW9uQ29udGVudHMiLCJhY2NpZEFjdGlvbkNvbnRlbnRzIiwic3RhZmZTcGxpdEFjdGlvbkNvbnRlbnRzIiwic3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzIiwiY29sdW1uQWN0aW9uQ29udGVudHMiLCJjbGVmQWN0aW9uQ29udGVudHMiLCJkaXZMaW5lQWN0aW9uQ29udGVudHMiLCJiYm94QWN0aW9uQ29udGVudHMiLCJncm91cGluZ01lbnUiLCJsaWdhdHVyZU5jIiwibGlnYXR1cmUiLCJzcGxpdFN5bGxhYmxlIiwiYWRkVGV4dE1vZGFsIiwiZWRpdFRleHRNb2RhbCIsImhvdGtleXNNb2RhbCIsInN5bGxhYmxlQWN0aW9uc0NvbnRlbnQiLCJlcnJvckxvZ3NQYW5lbENvbnRlbnRzIiwiTW9kYWxXaW5kb3dWaWV3IiwiTW9kYWxXaW5kb3dTdGF0ZSIsIm9wZW5BZGRTeWxUZXh0TW9kYWxXaW5kb3ciLCJoaWRlTW9kYWxXaW5kb3ciLCJhZGRTeWxUZXh0IiwiZm9jdXNNb2RhbFdpbmRvdyIsIm9wZW5FZGl0U3lsVGV4dE1vZGFsV2luZG93IiwidXBkYXRlU3lsVGV4dCIsImVkaXRvckFjdGlvbiIsImFjdGlvbiIsInBhcmFtIiwiZWxlbWVudElkIiwic3lsVGV4dCIsImVkaXQiLCJ0aGVuIiwicmVzcG9uc2UiLCJ1cGRhdGVGb3JDdXJyZW50UGFnZSIsIm9yaWciLCJ0ZXh0Q29udGVudCIsInJlcGxhY2UiLCJ0cmltIiwidXBkYXRlZFN5bFRleHQiLCJlbnRyaWVzIiwiY2xhc3NOYW1lIiwidGV4dCIsInVwZGF0ZVNlbGVjdGVkQkJveCIsImtleWRvd25MaXN0ZW5lciIsImUiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJtb2RhbFdpbmRvd1ZpZXciLCJBRERfVEVYVCIsIkVESVRfVEVYVCIsIkRPQ1VNRU5UX1VQTE9BRCIsIk5FV19GT0xERVIiLCJSRU5BTUUiLCJmb2N1cyIsIm1vZGFsV2luZG93U3RhdGUiLCJDTE9TRUQiLCJzZXR1cEV2ZW50TGlzdGVuZXJzIiwiY29udGVudCIsInNldE1vZGFsV2luZG93Q29udGVudCIsInRvU3RyaW5nIiwiSE9US0VZUyIsIk1PVkVfVE8iLCJib2R5Iiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwiT1BFTiIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwiY29udGFpbmVyIiwidGl0bGUiLCJpbm5lclRleHQiLCJyZW1vdmVTeW1ib2wiLCJFUlJPUl9MT0ciLCJlbmNvZGVVUkkiLCJ1cGxvYWRBcmVhSFRNTCIsIm5ld0ZvbGRlckhUTUwiLCJyZW5hbWVIVE1MIiwiYmJveElkIiwiZmluZCIsImNoZWNrZWQiLCJkaXNwbGF5UmVjdCIsImJ5dGVUb0hleCIsInN1YnN0ciIsIm9mZnNldCIsInV1aWQiLCJ0b0xvd2VyQ2FzZSIsImxhc3RHbHlwaE9wYWNpdHkiLCJsYXN0SW1hZ2VPcGFjaXR5IiwibGFzdENpcmNsZVNpemUiLCJzZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyIiwibWVpQ2xhc3NOYW1lIiwib3BhY2l0eU91dHB1dCIsInNldFNldHRpbmdzIiwiaGlkZUdseXBoSW1nIiwib3BhY2l0eSIsInNldEJnT3BhY2l0eUZyb21TbGlkZXIiLCJiYWNrZ3JvdW5kIiwiYmdPcGFjaXR5T3V0cHV0IiwiaGlkZUJnSW1nIiwiYmciLCJ1cGRhdGVIaWdobGlnaHRPcHRpb24iLCJvcHRpb24iLCJkcm9wZG93biIsImhpZ2hsaWdodFR5cGUiLCJ1bnNldEdyb3VwaW5nSGlnaGxpZ2h0IiwidG9VcHBlckNhc2UiLCJzZXRHcm91cGluZ0hpZ2hsaWdodCIsInNldEhpZ2hsaWdodE9wdGlvbiIsImhpZ2hsaWdodENsaWNrYXdheSIsInNldEhpZ2hsaWdodENvbnRyb2xzIiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwidG9nZ2xlIiwibG9hZEhpZ2hsaWdodFNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJ6b29tSGFuZGxlciIsInpvb21TbGlkZXIiLCJ6b29tT3V0cHV0Iiwiem9vbVRvIiwicmVzZXRab29tQW5kUGFuIiwiZGlzYWJsZWQiLCJjdXJyZW50Wm9vbSIsInBhcnNlSW50IiwicHJldmVudERlZmF1bHQiLCJuZXdab29tIiwiY2lyY2xlU2xpZGVyIiwiY2lyY2xlT3V0cHV0IiwiY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlciIsInJlc2l6ZVBvaW50cyIsImVtcHR5IiwiYXR0ciIsImhpZ2hsaWdodFNlbGVjdGlvbiIsImhpZ2hsaWdodElkIiwiZGlzcGxheUFsbEJ0biIsImRpc3BsYXlCQm94ZXMiLCJvcGFjaXR5U2xpZGVyIiwiaW5wdXRDaGFuZ2VPcGFjaXR5IiwidG9nZ2xlT3BhY2l0eUJ0biIsIm5ld09wYWNpdHkiLCJyb3VuZCIsInNldEdseXBoT3BhY2l0eUNvbnRyb2xzIiwiYmdPcGFjaXR5U2xpZGVyIiwiYmdJbnB1dENoYW5nZUhhbmRsZXIiLCJ0b2dnbGVCZ09wYWNpdHlCdG4iLCJzZXRCZ09wYWNpdHlDb250cm9scyIsIm1ldGFLZXkiLCJzZWxlY3RBbGxCdG4iLCJvcHRpb25zIiwiY2xpY2siLCJzZXREaXNwbGF5QWxsTGlzdGVuZXIiLCJkaXNwbGF5Q29udGVudHMiLCJ0b2dnbGVEaXNwbGF5IiwicGFkZGluZyIsIm92ZXJmbG93IiwidW5zZXRJbmNsaW5hdHVtQWN0aW9uIiwiYXR0clR5cGUiLCJhdHRyVmFsdWUiLCJ1bnNldFZpcmdhQWN0aW9uIiwidW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uIiwidW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uIiwidW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbiIsImN1cnZlIiwiZGVsZXRlQnV0dG9uSGFuZGxlciIsInJlbW92ZUhhbmRsZXIiLCJtb3JlRWRpdCIsImV4dHJhRWRpdCIsInRvUmVtb3ZlIiwiY2hhaW5BY3Rpb24iLCJjaGFuZ2VTdGFmZkhhbmRsZXIiLCJ0b0NoYW5nZSIsImluc2VydFRvU3lsbGFibGVIYW5kbGVyIiwidG9JbnNlcnQiLCJyZXN1bHQiLCJtb3ZlT3V0c2lkZVN5bGxhYmxlSGFuZGxlciIsInRvTW92ZSIsIm1hdGNoSGVpZ2h0SGFuZGxlciIsIm9wZW5BZGRTeWxXaW5kb3ciLCJtb2RhbFdpbmRvdyIsIm1vZGFsIiwic2V0TW9kYWxXaW5kb3dWaWV3Iiwib3Blbk1vZGFsV2luZG93IiwiYWRkRGVsZXRlTGlzdGVuZXIiLCJkZWwiLCJhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyIiwiY2hhbmdlU3RhZmYiLCJ1cGRhdGVDb2x1bW5JbmZvIiwiY29sSW5wdXQiLCJzdGF2ZXMiLCJjb2xJbmZvIiwiaGFzQ29sdW1uIiwiam9pbiIsInN0YWZmQ29sIiwiYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyIiwiZGVjcmVtZW50QnV0dG9uIiwiaW5jcmVtZW50QnV0dG9uIiwiY29uZmlybUJ1dHRvbiIsInVwZGF0ZU51bWJlciIsImNoYW5nZSIsImN1cnJlbnRWYWx1ZSIsInRvU2V0Q29sdW1uIiwic2V0RWRpdENvbnRyb2xzIiwiZWRpdFR5cGUiLCJjb250ZW50cyIsInBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24iLCJ0cmlnZ2VyU3RhZmZTcGxpdE1vZGUiLCJTcGxpdFN0YWZmSGFuZGxlciIsInN0YXJ0U3BsaXQiLCJpbml0T3B0aW9uc0xpc3RlbmVycyIsImRyb3AiLCJvcHRpb25zQ2xpY2thd2F5Iiwib3RoZXIiLCJpbml0TmVvblZpZXciLCJhZGRTeWwiLCJDb250ZW50cyIsInVuc2V0SW5jbGluYXR1bSIsInVuc2V0VmlyZ2EiLCJ1bnNldFZpcmdhUmV2ZXJzZWQiLCJ1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UiLCJ1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlIiwic2V0SW5jbGluYXR1bSIsInNldFZpcmdhIiwic2V0VmlyZ2FSZXZlcnNlZCIsInNldExpcXVlc2NlbnRDbG9ja3dpc2UiLCJzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSIsInRyaWdnZXJDaGFuZ2VHcm91cCIsImNvbnRvdXIiLCJjaGFuZ2VHcm91cGluZ0FjdGlvbiIsIlNwbGl0TmV1bWVIYW5kbGVyIiwiaW5mbyIsImdldENvbnRvdXJCeVZhbHVlIiwiZXh0cmFBY3Rpb25zSFRNTCIsImFjY2lkT3B0aW9uc0xpc3RlbmVyIiwiaW5jcmVtZW50T2N0YXZlIiwiZGlyZWN0aW9uIiwic2hhcGUiLCJjbGVmT3B0aW9uc0xpc3RlbmVyIiwiZGl2TGluZU9wdGlvbnNMaXN0ZW5lciIsIm1lcmdlU3RhdmVzIiwicG9pbnRzIiwiZ2V0U3RhZmZCQm94IiwieV9jaGFuZ2UiLCJ0YW4iLCJnZXRTVkdSZWxDb29yZHMiLCJjbGllbnRYIiwiY2xpZW50WSIsInB0IiwiRE9NUG9pbnQiLCJwYWdlTWFyZ2luIiwibWF0cml4VHJhbnNmb3JtIiwiZ2V0U2NyZWVuQ1RNIiwiaW52ZXJzZSIsImdldFN0YWZmSWRCeUNvb3JkcyIsInN0YWZmQkJveGVzIiwic3RhZmZJZCIsImJnSW1nIiwicmVjdCIsInRhZ05hbWUiLCJnZXRCQm94IiwicGFyZW50Tm9kZSIsIndpZHRoIiwiaGVpZ2h0IiwiaGV4X2NociIsIm1kNWN5Y2xlIiwiayIsImEiLCJiIiwibWQ1YmxrIiwibWQ1YmxrcyIsImNoYXJDb2RlQXQiLCJtZDVibGtfYXJyYXkiLCJtZDUxIiwidGFpbCIsInRtcCIsImxvIiwiaGkiLCJzdWJzdHJpbmciLCJyaGV4IiwiaGV4IiwidG9VdGY4Iiwic3RyIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJoZXhUb0JpbmFyeVN0cmluZyIsImJ5dGVzIiwiZnJvbUNoYXJDb2RlIiwiU3BhcmtNRDUiLCJyZXNldCIsIkFycmF5QnVmZmVyIiwiY2xhbXAiLCJ2YWwiLCJ0byIsIm51bSIsInRhcmdldEFycmF5Iiwic291cmNlQXJyYXkiLCJieXRlTGVuZ3RoIiwiYmVnaW4iLCJlbmQiLCJVaW50OEFycmF5IiwiYXBwZW5kQmluYXJ5IiwiX2J1ZmYiLCJfbGVuZ3RoIiwiX2hhc2giLCJyYXciLCJidWZmIiwiX2ZpbmlzaCIsImdldFN0YXRlIiwiaGFzaCIsInNldFN0YXRlIiwiZGVzdHJveSIsImhhc2hCaW5hcnkiLCJmaXJzdCIsInNlY29uZCIsInJldHVyblVJbnQ4QXJyYXkiLCJidWZmZXIiLCJzdWJhcnJheSIsInV0ZjhTdHIyQXJyYXlCdWZmZXIiLCJtZDUxX2FycmF5IiwiZmFjdG9yeSIsInVpbnQ4VG9VdWlkIiwiZGF0YSIsImNiIiwicHJldmlvdXMiLCJjdXJyZW50IiwicGFkU3RhcnQiLCJyZWR1Y2UiLCJjcnlwdG8iLCJvY3RldHMiLCJtb2RpZmllcnMiLCJnZXRSYW5kb21WYWx1ZXMiLCJDb2xvclBhbGV0dGUiLCJyZWN0cyIsInVuc2V0U3RhZmZIaWdobGlnaHQiLCJjaGlsZCIsImNjaGlsZCIsInNldFN0YWZmSGlnaGxpZ2h0Iiwic3RhZmZDb2xvciIsImNvbHVtbk51bSIsImNvbHVtbiIsInNldENvbHVtbkhpZ2hsaWdodCIsImdyb3VwQ29sb3IiLCJkaXZMaW5lQ2hpbGRyZW4iLCJ1cmkiLCJWYWxpZGF0aW9uRXJyb3IiLCJpbnN0YW5jZSIsInNjaGVtYSIsImFyZ3VtZW50IiwiaXNBcnJheSIsInN1bSIsIml0ZW0iLCJtYWtlU3VmZml4IiwiJGlkIiwic3RhY2siLCJWYWxpZGF0b3JSZXN1bHQiLCJjdHgiLCJwcm9wZXJ0eVBhdGgiLCJlcnJvcnMiLCJ0aHJvd0Vycm9yIiwidGhyb3dGaXJzdCIsInRocm93QWxsIiwiZGlzYWJsZUZvcm1hdCIsInN0cmluZ2l6ZXIiLCJ2IiwiVmFsaWRhdG9yUmVzdWx0RXJyb3IiLCJjYXB0dXJlU3RhY2tUcmFjZSIsImFkZEVycm9yIiwiZGV0YWlsIiwiaW1wb3J0RXJyb3JzIiwicmVzIiwidmFsaWRhdG9yVHlwZSIsIlNjaGVtYUVycm9yIiwibXNnIiwiU2NoZW1hQ29udGV4dCIsImJhc2UiLCJzY2hlbWFzIiwibWFrZUNoaWxkIiwicHJvcGVydHlOYW1lIiwiRk9STUFUX1JFR0VYUFMiLCJpbnB1dCIsInBhcnNlRmxvYXQiLCJSZWdFeHAiLCJyZWdleHAiLCJyZWdleCIsInBhdHRlcm4iLCJpcHY0IiwiaXNGb3JtYXQiLCJmb3JtYXQiLCJ2YWxpZGF0b3IiLCJjdXN0b21Gb3JtYXRzIiwiZGVlcE1lcmdlciIsImRzdCIsImRlZXBNZXJnZSIsImNvcHlpc3QiLCJzcmMiLCJjb3B5aXN0V2l0aERlZXBNZXJnZSIsInBhdGhFbmNvZGVyIiwiZGVlcENvbXBhcmVTdHJpY3QiLCJldmVyeSIsImFLZXlzIiwiYktleXMiLCJvYmplY3RHZXRQYXRoIiwicGFydHMiLCJzcGxpdCIsImRlY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVBhdGgiLCJnZXREZWNpbWFsUGxhY2VzIiwibnVtYmVyIiwiZGVjaW1hbFBsYWNlcyIsImRlY2ltYWxQYXJ0cyIsImlzU2NoZW1hIiwicm5kczgiLCJybmciLCJtc0NyeXB0byIsIm9iaiIsIm1ldGFTdGFjayIsImxhc3RNZXRhRWxlbWVudCIsImxhc3RFbGVtZW50SW5kZXgiLCJuZXh0IiwiYXJyYXlQcmVmaXgiLCJvYmpQcmVmaXgiLCJwcmVmaXgiLCJjb2xsYXRpb25JbmRleCIsInBhcnNlZE51bSIsIm51bUNoYXIiLCJwYXJzZWRTdHJpbmciLCJsYXN0Q2giLCJudW1Db25zZWN1dGl2ZVNsYXNoZXMiLCJjaCIsImFycmF5RWxlbWVudCIsIm9iakVsZW1lbnQiLCJidWYiLCJybmRzIiwicmFuZG9tIiwic2VsZWN0b3IiLCJkcmFnU3RhcnRDb29yZHMiLCJkcmFnQmVoYXZpb3VyIiwiZHJhZyIsImV2ZW50IiwiZHgiLCJkeSIsInNvdXJjZUV2ZW50IiwiZHJhZ2dpbmciLCJkcmFnRW5kZWQiLCJzZWxlY3Rpb24iLCJub01vdmVQcmVjZWRlcyIsImhhc0F0dHJpYnV0ZSIsIm1vdmVFbGVtZW50cyIsImJib3hlcyIsInhEaWZmIiwieURpZmYiLCJpc0N1cnNvck91dE9mQm91bmRzIiwiaXNEcmFnT3V0T2ZCb3VuZHMiLCJyZXR1cm5FbGVtZW50cyIsInBhcmFtQXJyYXkiLCJkcmFnQWN0aW9uIiwidG9SZXNlbGVjdCIsInJlc2VsZWN0IiwicmVzZWxlY3RlZCIsInJlc2V0VG9BY3Rpb24iLCJlbmRYIiwiZW5kWSIsImlzT3V0T2ZTVkdCb3VuZHMiLCJnbHlwaFNlbGVjdG9yIiwic2VsZWN0aW9uQkJveCIsImFjYyIsImdldEdseXBoQkJveCIsImN1cnIiLCJNQVhfVkFMVUUiLCJNSU5fVkFMVUUiLCJTZWxlY3RUb29scyIsInNoYXJlZExvZ2ljYWxQYXJlbnQiLCJhcmVBZGphY2VudCIsImNvbnRhaW5zTGlua2VkIiwiaXNMaW5rZWQiLCJjYW5CZUxpbmtlZCIsInNvcnQiLCJzdGFmZkEiLCJzdGFmZkIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzeWxsYWJsZXMiLCJjdXJyZW50U3lsbGFibGVJbmRleCIsImN1cnJlbnRTdGFmZiIsIm5leHRTdGFmZiIsImN1cnJlbnRTdGFmZkluZGV4IiwidW5saW5rZWRFbGVtZW50cyIsImZpcnN0VW5saW5rZWQiLCJET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkciLCJpZHgiLCJzeWxsYWJsZSIsImF0IiwibmV4dFN5bGxhYmxlSWQiLCJuZXh0U3lsbGFibGVJZHgiLCJuZXh0U3lsbGFibGUiLCJwcmV2U3lsbGFibGVJZCIsInByZXZTeWxsYWJsZSIsImhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZSIsInN5c3RlbXMiLCJlbGVtZW50SWRzIiwiZ3JvdXBpbmdBY3Rpb24iLCJnZXRDaGlsZHJlbklkcyIsImdldElkcyIsInRvZ2dsZUxpbmtlZFN5bGxhYmxlcyIsImdyb3VwVHlwZSIsIm5ldW1lUGFyZW50IiwibmNzIiwiZ2V0Q29udG91ciIsIldhcm5pbmdzIiwiZ3JvdXBpbmdOb3RSZWNvZ25pemVkIiwiZ2V0U1ZHR3JhcGhpY3NFbGVtZW50QnlJZCIsIlNWR0dyYXBoaWNzRWxlbWVudCIsInVubGluayIsImZpcnN0U3lsbGFibGUiLCJzZWNvbmRTeWxsYWJsZSIsInVubGlua2VkRWxlbWVudCIsImdldFRvZ2dsZVN5bGxhYmxlSWRzIiwibG9nIiwiaWRzIiwiY2hpbGRyZW5JZHMiLCJjcmVhdGVMb2dNZXNzYWdlIiwibm90aWYiLCJub3RpZkRpdiIsInJlbW92ZUJ0biIsIm9uY2xpY2siLCJpbmZvQnRuIiwiTW9kYWxXaW5kb3ciLCJvcGVuRXJyb3JMb2dXaW5kb3ciLCJpbml0RXJyb3JMb2dDb250cm9scyIsImVycm9yUGFuZWwiLCJoZWFkaW5nIiwiZHJvcGRvd25JY29uIiwiaW5pdERpc3BsYXlMaXN0ZW5lciIsImNoZWNrYm94ZXNDb250YWluZXIiLCJlcnJvcnNMYWJlbCIsImVyb3Jyc0J0biIsImFwcGVuZENoaWxkIiwidXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5Iiwibm90aWZQYW5lbCIsIlBvaW50TmFtZXMiLCJUb3BMZWZ0IiwiVG9wIiwiVG9wUmlnaHQiLCJSaWdodCIsIkJvdHRvbVJpZ2h0IiwiQm90dG9tIiwiQm90dG9tTGVmdCIsIkxlZnQiLCJnZXRQb2ludHMiLCJzaW4iLCJpbml0aWFsVWx4IiwiaW5pdGlhbExyeCIsImluaXRpYWxQb2ludCIsImluaXRpYWxVbHkiLCJpbml0aWFsTHJ5IiwiaW5pdGlhbFkiLCJpbml0aWFsUmVjdFkiLCJwb2x5TGVuIiwiaW5pdGlhbFJvdGF0ZSIsInJlZHJhdyIsInBvaW50U3RyaW5nIiwiX2VsZW0iLCJ0ZXh0UmVjdCIsInBvaW50TmFtZSIsInBvaW50IiwicG9pbnRTdHJpbmdSaWdodCIsInBvaW50U3RyaW5nTGVmdCIsImRyYXdJbml0aWFsUmVjdCIsIndoaWNoUG9pbnQiLCJfIiwidmlld3BvcnRFbGVtZW50IiwicmVzaXplU3RhcnQiLCJyZXNpemVEcmFnIiwicmVzaXplRW5kIiwicm90YXRlU3RhcnQiLCJ0ZW1wIiwibW91c2UiLCJ0ZW1wUm90YXRlIiwicm90YXRlRW5kIiwiY3VycmVudFBvaW50Iiwid2hpY2giLCJQSSIsIkV4cG9ydGVkU2V0IiwiRXhwb3J0ZWRNYXAiLCJtYW5nbGUiLCJ1bm1hbmdsZSIsIk1hcCQxIiwiX3N0b3JlIiwiU2V0JDEiLCJjbG9uZUJpbmFyeU9iamVjdCIsImNsb25lQXJyYXlCdWZmZXIiLCJ3ZWJraXRTbGljZSIsIm1hbmdsZWQiLCJkZWxldGUiLCJNYXAiLCJwcm9wIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic3BlY2llcyIsInN1cHBvcnRzTWFwQW5kU2V0IiwiZnVuY1RvU3RyaW5nIiwib2JqZWN0Q3RvclN0cmluZyIsImNsb25lIiwibmV3T2JqZWN0IiwiRGF0ZSIsImlzRmluaXRlIiwidG9JU09TdHJpbmciLCJCbG9iIiwiaXNCaW5hcnlPYmplY3QiLCJwcm90byIsIkN0b3IiLCJpc1BsYWluT2JqZWN0IiwiY2FsbGVkIiwidG9Qcm9taXNlIiwiZnVuYyIsInNlbGYiLCJ1c2VkQ0IiLCJwcm9taXNlIiwiZnVsZmlsbCIsInJlc3AiLCJjYWxsYmFjayIsIm1lc2ciLCJhZGFwdGVyRnVuIiwiX2Nsb3NlZCIsIl9kZXN0cm95ZWQiLCJsb2dBcmdzIiwib3JpZ0NhbGxiYWNrIiwicmVzcG9uc2VBcmdzIiwibG9nQXBpQ2FsbCIsInRhc2txdWV1ZSIsImlzUmVhZHkiLCJhZGRUYXNrIiwiZmFpbGVkIiwicGljayIsImhhc0xvY2FsIiwiaWRlbnRpdHlGdW5jdGlvbiIsImZvcm1hdFJlc3VsdEZvck9wZW5SZXZzR2V0Iiwib2siLCJidWxrR2V0IiwiZGIiLCJvcHRzIiwicmVxdWVzdHMiLCJkb2NzIiwicmVxdWVzdHNCeUlkIiwicmVxdWVzdCIsIm51bURvY3MiLCJudW1Eb25lIiwicGVyRG9jUmVzdWx0cyIsImNoZWNrRG9uZSIsInJlc3VsdHMiLCJhbGxSZXF1ZXN0cyIsIm5leHRCYXRjaCIsInVwVG8iLCJiYXRjaCIsImRvY0lkIiwiZG9jSWR4IiwiZG9jUmVxdWVzdHMiLCJkb2NPcHRzIiwib3Blbl9yZXZzIiwicmV2IiwiZm9ybWF0UmVzdWx0IiwicHJvY2Vzc0JhdGNoIiwiaGFzTG9jYWxTdG9yYWdlIiwiQ2hhbmdlcyIsImF0dGFjaEJyb3dzZXJFdmVudHMiLCJndWFyZGVkQ29uc29sZSIsIm1ldGhvZCIsImRlZmF1bHRCYWNrT2ZmIiwibWF4VGltZW91dCIsInJhbmRvbU51bWJlciIsImV4cGxhaW5FcnJvciIsInN0YXR1cyIsImRiTmFtZSIsImlucHJvZ3Jlc3MiLCJldmVudEZ1bmN0aW9uIiwiY2hhbmdlc09wdHMiLCJjaGFuZ2VzIiwic2VxIiwic2luY2UiLCJjYW5jZWxsZWQiLCJvbkNoYW5nZSIsIm5vdGlmeUxvY2FsV2luZG93cyIsIm5vdGlmeSIsIiRpbmplY3RfT2JqZWN0X2Fzc2lnbiIsImFzc2lnbiIsIm5leHRTb3VyY2UiLCJuZXh0S2V5IiwiUG91Y2hFcnJvciIsInJlYXNvbiIsIk1JU1NJTkdfQlVMS19ET0NTIiwiTUlTU0lOR19ET0MiLCJSRVZfQ09ORkxJQ1QiLCJJTlZBTElEX0lEIiwiTUlTU0lOR19JRCIsIlJFU0VSVkVEX0lEIiwiVU5LTk9XTl9FUlJPUiIsIkJBRF9BUkciLCJRVUVSWV9QQVJTRV9FUlJPUiIsIkRPQ19WQUxJREFUSU9OIiwiQkFEX1JFUVVFU1QiLCJOT1RfQU5fT0JKRUNUIiwiSURCX0VSUk9SIiwiSU5WQUxJRF9SRVYiLCJNSVNTSU5HX1NUVUIiLCJjcmVhdGVFcnJvciIsIkN1c3RvbVBvdWNoRXJyb3IiLCJuYW1lcyIsImdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UiLCJmaWx0ZXJDaGFuZ2UiLCJyZXEiLCJoYXNGaWx0ZXIiLCJxdWVyeSIsInF1ZXJ5X3BhcmFtcyIsImRvYyIsImZpbHRlclJldHVybiIsInRyeUZpbHRlciIsImluY2x1ZGVfZG9jcyIsImF0dGFjaG1lbnRzIiwiYXR0IiwiX2F0dGFjaG1lbnRzIiwic3R1YiIsImZsYXR0ZW4iLCJhcnJzIiwiaW52YWxpZElkRXJyb3IiLCJpc1JlbW90ZSIsIl9yZW1vdGUiLCJwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZSIsIm5vcm1hbGl6ZURlc2lnbkRvY0Z1bmN0aW9uTmFtZSIsIm5vcm1hbGl6ZWQiLCJxUGFyc2VyIiwicGFyc2VyIiwicGFyc2VVcmkiLCJleGVjIiwiZW5jb2RlZCIsIiQwIiwiJDEiLCIkMiIsInNjb3BlRXZhbCIsInNvdXJjZSIsInNjb3BlIiwidXBzZXJ0IiwiZGlmZkZ1biIsImNhdGNoIiwiZG9jUmV2IiwiX3JldiIsIm5ld0RvYyIsIl9pZCIsInB1dCIsInVwZGF0ZWQiLCJ0cnlBbmRQdXQiLCJ0aGlzQXRvYiIsImF0b2IiLCJ0aGlzQnRvYSIsImJ0b2EiLCJjcmVhdGVCbG9iIiwicHJvcGVydGllcyIsImJ1aWxkZXIiLCJCbG9iQnVpbGRlciIsIk1TQmxvYkJ1aWxkZXIiLCJNb3pCbG9iQnVpbGRlciIsIldlYktpdEJsb2JCdWlsZGVyIiwiZ2V0QmxvYiIsImJpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIiLCJiaW4iLCJiaW5TdHJpbmdUb0JsdWZmZXIiLCJiaW5TdHJpbmciLCJiNjRUb0JsdWZmZXIiLCJiNjQiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJibG9iIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsImhhc0JpbmFyeVN0cmluZyIsIm9ubG9hZGVuZCIsImJpbmFyeSIsImFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmciLCJyZWFkQXNBcnJheUJ1ZmZlciIsImJsb2JUb0JpbmFyeVN0cmluZyIsImJsb2JPckJ1ZmZlciIsImJsb2JUb0Jhc2U2NCIsImJhc2U2NCIsInNldEltbWVkaWF0ZVNoaW0iLCJzZXRJbW1lZGlhdGUiLCJhcHBlbmRCbG9iIiwic3RhcnQiLCJzbGljZUJsb2IiLCJhcnJheUJ1ZmZlciIsImFwcGVuZFN0cmluZyIsInN0cmluZyIsImJpbmFyeU1kNSIsImlucHV0SXNTdHJpbmciLCJjaHVua1NpemUiLCJjaHVua3MiLCJjZWlsIiwiY3VycmVudENodW5rIiwibG9hZE5leHRDaHVuayIsImRvbmUiLCJyYXdUb0Jhc2U2NCIsInN0cmluZ01kNSIsInJldiQkMSIsImRldGVybWluaXN0aWNfcmV2cyIsIm11dGF0ZWFibGVEb2MiLCJfcmV2X3RyZWUiLCJ3aW5uaW5nUmV2IiwibWV0YWRhdGEiLCJ3aW5uaW5nSWQiLCJ3aW5uaW5nUG9zIiwid2lubmluZ0RlbGV0ZWQiLCJub2RlIiwidG9WaXNpdCIsInJldl90cmVlIiwidHJlZSIsImJyYW5jaGVzIiwicG9zIiwiZGVsZXRlZCIsInRyYXZlcnNlUmV2VHJlZSIsInJldnMiLCJuZXdDdHgiLCJzb3J0QnlQb3MiLCJjb2xsZWN0TGVhdmVzIiwibGVhdmVzIiwiaXNMZWFmIiwicmV2ZXJzZSIsImNvbGxlY3RDb25mbGljdHMiLCJ3aW4iLCJjb25mbGljdHMiLCJsZWFmIiwicm9vdFRvTGVhZiIsInBhdGhzIiwiaGlzdG9yeSIsInNvcnRCeVBvcyQxIiwiaW5zZXJ0U29ydGVkIiwiY29tcGFyYXRvciIsIm1pZCIsImxvdyIsImhpZ2giLCJiaW5hcnlTZWFyY2giLCJzcGxpY2UiLCJwYXRoVG9UcmVlIiwibnVtU3RlbW1lZCIsInJvb3QiLCJjdXJyZW50TGVhZiIsImNvbXBhcmVUcmVlIiwibWVyZ2VUcmVlIiwiaW5fdHJlZTEiLCJpbl90cmVlMiIsInRyZWUxIiwidHJlZTIiLCJtZXJnZWQiLCJkb01lcmdlIiwiZG9udEV4cGFuZCIsInJlc3RyZWUiLCJicmFuY2giLCJ0MSIsInQyIiwiZGlmZiIsImNhbmRpZGF0ZVBhcmVudHMiLCJ0cmVlcyIsInBhcmVudElkeCIsImVsZW1lbnRzTGVuIiwibWVyZ2UiLCJkZXB0aCIsIm5ld1RyZWUiLCJzdGVtbWVkIiwic3RlbW1lZFJldnMiLCJyZXZIYXNoIiwic3RlbSIsImdldFRyZWVzIiwiaXNEZWxldGVkIiwiaXNMb2NhbElkIiwiQ2hhbmdlcyQxIiwiY29tcGxldGUiLCJlZSIsIm9uRGVzdHJveSIsImNhbmNlbCIsInBlbmRpbmciLCJsYXN0U2VxIiwiaXNDYW5jZWxsZWQiLCJ0cnlDYXRjaEluQ2hhbmdlTGlzdGVuZXIiLCJ2YWxpZGF0ZUNoYW5nZXMiLCJwcm9jZXNzQ2hhbmdlIiwiY2hhbmdlTGlzdCIsIl9jb25mbGljdHMiLCJjb21wYXJlIiwibGVmdCIsInJpZ2h0IiwieWFua0Vycm9yIiwiY29tcGFyZUJ5SWRUaGVuUmV2IiwiaWRDb21wYXJlIiwiX3JldmlzaW9ucyIsIkFic3RyYWN0UG91Y2hEQiIsIlRhc2tRdWV1ZSIsIlBvdWNoREIiLCJfX29wdHMiLCJhdXRvX2NvbXBhY3Rpb24iLCJiYWNrZW5kIiwiYWRhcHRlciIsImFkYXB0ZXJzIiwicHJlZmVycmVkQWRhcHRlcnMiLCJhZGFwdGVyTmFtZSIsInVzZV9wcmVmaXgiLCJwYXJzZUFkYXB0ZXIiLCJfYWRhcHRlciIsInZhbGlkIiwidmlld19hZGFwdGVyIiwiZmFpbCIsIm9uRGVzdHJveWVkIiwiZnJvbV9jb25zdHJ1Y3RvciIsIm9uQ2xvc2VkIiwicHJlcGFyZUZvckRlc3RydWN0aW9uIiwicmVhZHkiLCJfY2hhbmdlc0ZpbHRlclBsdWdpbiIsInZhbGlkYXRlIiwiZG9DaGFuZ2VzIiwiY29udGludW91cyIsImxpdmUiLCJub3JtYWxpemUiLCJzaG91bGRGaWx0ZXIiLCJkZXNjZW5kaW5nIiwibGltaXQiLCJuZXdQcm9taXNlIiwiX2NoYW5nZXMiLCJ1cGRhdGVfc2VxIiwicG9zdCIsImJ1bGtEb2NzIiwiX3B1dExvY2FsIiwiX2RlbGV0ZWQiLCJfcmVtb3ZlTG9jYWwiLCJvbGRSZXZJZCIsIm5ld1Jldk51bSIsIm5ld1JldklkIiwicHV0RG9jIiwiX3B1dCIsIm5ld19lZGl0cyIsImZvcmNlIiwicHV0QXR0YWNobWVudCIsImF0dGFjaG1lbnRJZCIsImFwaSIsImNyZWF0ZUF0dGFjaG1lbnQiLCJwcmV2cmV2cG9zIiwiY29udGVudF90eXBlIiwicmV2cG9zIiwicmVtb3ZlQXR0YWNobWVudCIsImRvY09ySWQiLCJvcHRzT3JSZXYiLCJ3YXNfZGVsZXRlIiwicmV2c0RpZmYiLCJtaXNzaW5nIiwiYWRkVG9NaXNzaW5nIiwicmV2SWQiLCJfZ2V0UmV2aXNpb25UcmVlIiwibWlzc2luZ0ZvcklkIiwicHJvY2Vzc0RvYyIsIm1pc3NpbmdPYmoiLCJjb21wYWN0RG9jdW1lbnQiLCJtYXhIZWlnaHQiLCJyZXZUcmVlIiwiZWRnZXMiLCJwcm50IiwiZWRnZSIsImNvbXB1dGVIZWlnaHQiLCJjYW5kaWRhdGVzIiwiX2RvQ29tcGFjdGlvbiIsImNvbXBhY3QiLCJfY29tcGFjdGlvblF1ZXVlIiwiZG9OZXh0Q29tcGFjdGlvbiIsImxhc3Rfc2VxIiwiX2NvbXBhY3QiLCJyZXR1cm5fZG9jcyIsInByb21pc2VzIiwicm93IiwiYWxsIiwiX2dldExvY2FsIiwiZmluaXNoT3BlblJldnMiLCJsYXRlc3QiLCJfZ2V0IiwicmV2c19pbmZvIiwic3BsaXR0ZWRSZXYiLCJyZXZObyIsImN1cnJlbnRQYXRoIiwiaGFzaEluZGV4IiwiaW5kZXhPZlJldiIsImhvd01hbnkiLCJfcmV2c19pbmZvIiwiX2dldEF0dGFjaG1lbnQiLCJnZXRBdHRhY2htZW50IiwiYWxsRG9jcyIsInNraXAiLCJzdGFydF9rZXkiLCJzdGFydGtleSIsImVuZF9rZXkiLCJlbmRrZXkiLCJpbmNvbXBhdGlibGVPcHQiLCJhbGxEb2NzS2V5c1BhcnNlIiwiX2FsbERvY3MiLCJjbG9zZSIsIl9jbG9zZSIsIl9pbmZvIiwiZGJfbmFtZSIsIl90eXBlIiwiYXR0YWNobWVudEVycm9yIiwiY2hhckF0IiwiYXR0YWNobWVudE5hbWVFcnJvciIsImF0dHMiLCJjbGVhbkRvY3MiLCJfYnVsa0RvY3MiLCJyZWdpc3RlckRlcGVuZGVudERhdGFiYXNlIiwiZGVwZW5kZW50RGIiLCJkYk9wdGlvbnMiLCJkZXBEQiIsImRlcGVuZGVudERicyIsInVzZVByZWZpeCIsImRlc3Ryb3lEYiIsIl9kZXN0cm95IiwibG9jYWxEb2MiLCJkZWxldGVkTWFwIiwidHJ1ZU5hbWUiLCJleGVjdXRlIiwiQWJvcnRDb250cm9sbGVyIiwiYWJvcnQiLCJmJDEiLCJmZXRjaCIsImgiLCJIZWFkZXJzIiwiZXZlbnRFbWl0dGVyIiwiUG91Y2giLCJkZXN0cnVjdExpc3RlbmVycyIsIl9kZXN0cnVjdGlvbkxpc3RlbmVycyIsImRiTGlzdCIsInNldFVwRXZlbnRFbWl0dGVyIiwiYWRkVG9QcmVmZXJyZWRBZGFwdGVycyIsInBsdWdpbiIsIl9fZGVmYXVsdHMiLCJkZWZhdWx0cyIsImRlZmF1bHRPcHRzIiwiUG91Y2hBbHQiLCJ1cmwiLCJnZXRGaWVsZEZyb21Eb2MiLCJwYXJzZWRGaWVsZCIsInBhcnNlRmllbGQiLCJmaWVsZE5hbWUiLCJmaWVsZHMiLCJjb21iaW5hdGlvbkZpZWxkcyIsImlzQ29tYmluYXRpb25hbEZpZWxkIiwiZmllbGQiLCJnZXRLZXkiLCJtZXJnZUFuZGVkU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwiJG9yIiwiJG5vciIsIm1hdGNoZXIiLCIkZXEiLCJsb25nZXN0IiwiZmllbGRNYXRjaGVycyIsIm9wZXJhdG9yIiwiJGd0ZSIsIiRndCIsIm1lcmdlR3RHdGUiLCIkbHRlIiwiJGx0IiwibWVyZ2VMdEx0ZSIsIiRuZSIsIm1lcmdlTmUiLCJtZXJnZUVxIiwiJHJlZ2V4IiwibWVyZ2VSZWdleCIsIm1hc3NhZ2VTZWxlY3RvciIsIndhc0FuZGVkIiwiaXNBbmRJblNlbGVjdG9yIiwiaXNBbmQiLCJtZXJnZUFuZGVkU2VsZWN0b3JzTmVzdGVkIiwib3JPck5vciIsInN1YlNlbGVjdG9yIiwiY29sbGF0ZSIsIm5vcm1hbGl6ZUtleSIsImFpIiwiYmkiLCJzdHJpbmdDb2xsYXRlIiwiYXJyYXlDb2xsYXRlIiwiYWsiLCJiayIsIm9iamVjdENvbGxhdGUiLCJJbmZpbml0eSIsIm9yaWdLZXkiLCJ0b0pTT04iLCJpbmRleGlmeSIsImV4cEZvcm1hdCIsInRvRXhwb25lbnRpYWwiLCJtYWduaXR1ZGUiLCJuZWciLCJtYWdTdHJpbmciLCJwYWRXaXRoIiwidXBUb0xlbmd0aCIsInRhcmdldExlbmd0aCIsInBhZCIsImZhY3RvciIsImZhY3RvclN0ciIsInRvRml4ZWQiLCJudW1Ub0luZGV4YWJsZVN0cmluZyIsInRvSW5kZXhhYmxlU3RyaW5nIiwib2JqS2V5IiwicGFyc2VOdW1iZXIiLCJvcmlnaW5hbElkeCIsIm51bUFzU3RyaW5nIiwibWFnQXNTdHJpbmciLCJmaWx0ZXJJbk1lbW9yeUZpZWxkcyIsInJvd3MiLCJyZXF1ZXN0RGVmIiwiaW5NZW1vcnlGaWVsZHMiLCJyb3dGaWx0ZXIiLCJmaWVsZFNvcnRlciIsImdldEZpZWxkVmFsdWVzQXNBcnJheSIsInNvcnRpbmciLCJhUm93IiwiYlJvdyIsImNvbGxhdGlvbiIsImNyZWF0ZUZpZWxkU29ydGVyIiwiZG9jRmllbGRWYWx1ZSIsInNvbWUiLCJvck1hdGNoZXJzIiwibWF0Y2hDb21pbmF0aW9uYWxTZWxlY3RvciIsIm1hdGNoU2VsZWN0b3IiLCJtYXliZVVzZXJPcGVyYXRvciIsInVzZXJWYWx1ZSIsInN1YlBhcnNlZEZpZWxkIiwic3ViRG9jRmllbGRWYWx1ZSIsInVzZXJPcGVyYXRvciIsIm1hdGNoZXJzIiwiZmllbGRFeGlzdHMiLCJmaWVsZElzTm90VW5kZWZpbmVkIiwiYXJyYXlDb250YWluc1ZhbHVlIiwiZG9jRmllbGRWYWx1ZUl0ZW0iLCJtb2RGaWVsZCIsIm5lVmFsdWUiLCJhcnJheVNpemUiLCJhcnJheUNvbnRhaW5zQWxsVmFsdWVzIiwicmVnZXhWYWx1ZSIsInJlZ2V4TWF0Y2giLCJ0eXBlTWF0Y2giLCJmaWx0ZXJOYW1lIiwiY2hhbmdlc0hhbmRsZXIiLCJkb2NfaWRzIiwidmlld05hbWUiLCJkZG9jIiwibWFwRnVuIiwidmlld3MiLCJyb3dzTWF0Y2hlZCIsIm1hdGNoZXNTZWxlY3RvciIsImZpbHRlckZ1biIsImZpbHRlcnMiLCJ0b09iamVjdCIsInZlcnNpb24iLCJyZXNlcnZlZFdvcmRzIiwiZGF0YVdvcmRzIiwicGFyc2VSZXZpc2lvbkluZm8iLCJwYXJzZURvYyIsIm5ld0VkaXRzIiwiZGJPcHRzIiwiblJldk51bSIsInJldkluZm8iLCJyZXZpc2lvbnMiLCJyZXZpc2lvbklkcyIsIm1ha2VSZXZUcmVlRnJvbVJldmlzaW9ucyIsInNwZWNpYWxLZXkiLCJwcmVwcm9jZXNzU3RyaW5nIiwiYmxvYlR5cGUiLCJhc0JpbmFyeSIsInBhcnNlQmFzZTY0IiwiZGlnZXN0IiwicHJlcHJvY2Vzc0F0dGFjaG1lbnQiLCJtZDUiLCJwcmVwcm9jZXNzQmxvYiIsInVwZGF0ZURvYyIsInJldkxpbWl0IiwicHJldiIsImRvY0luZm8iLCJ3cml0ZURvYyIsInNwbGl0UmV2IiwidGFyZ2V0UG9zIiwidGFyZ2V0SWQiLCJyZXZFeGlzdHMiLCJwcmV2aW91c1dpbm5pbmdSZXYiLCJwcmV2aW91c2x5RGVsZXRlZCIsImlzUm9vdCIsIm5ld1JldiIsInJldl9tYXAiLCJ3aW5uaW5nUmV2JCQxIiwid2lubmluZ1JldklzRGVsZXRlZCIsImRlbHRhIiwicHJvY2Vzc0RvY3MiLCJkb2NJbmZvcyIsImZldGNoZWREb2NzIiwidHgiLCJvdmVyYWxsQ2FsbGJhY2siLCJpZHNUb0RvY3MiLCJkb2NzRG9uZSIsImRvY3NUb0RvIiwiY2hlY2tBbGxEb2NzRG9uZSIsImN1cnJlbnREb2MiLCJyZXN1bHRzSWR4IiwiZG9jV3JpdHRlbiIsIm5leHREb2MiLCJyb290SXNNaXNzaW5nIiwiaW5zZXJ0RG9jIiwiRE9DX1NUT1JFIiwiTUVUQV9TVE9SRSIsInNhZmVKc29uU3RyaW5naWZ5IiwianNvbiIsImlkYkVycm9yIiwiZW5jb2RlTWV0YWRhdGEiLCJkZWxldGVkT3JMb2NhbCIsImRlY29kZU1ldGFkYXRhIiwic3RvcmVkT2JqZWN0Iiwic2FmZUpzb25QYXJzZSIsImRlY29kZURvYyIsIl9kb2NfaWRfcmV2IiwibGFzdEluZGV4T2YiLCJyZWFkQmxvYkRhdGEiLCJhc0Jsb2IiLCJmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3NhcnkiLCJ0eG4iLCJhdHRPYmoiLCJvYmplY3RTdG9yZSIsIm9uc3VjY2VzcyIsImZldGNoQXR0YWNobWVudCIsInBvc3RQcm9jZXNzQXR0YWNobWVudHMiLCJhdHROYW1lcyIsImNvbXBhY3RSZXZzIiwicG9zc2libHlPcnBoYW5lZERpZ2VzdHMiLCJzZXFTdG9yZSIsImF0dFN0b3JlIiwiYXR0QW5kU2VxU3RvcmUiLCJJREJLZXlSYW5nZSIsImJvdW5kIiwiZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cyIsIm9wZW5DdXJzb3IiLCJvbmx5IiwiY3Vyc29yIiwiZGlnZXN0U2VxIiwicHJpbWFyeUtleSIsImNvbnRpbnVlIiwib3BlblRyYW5zYWN0aW9uU2FmZWx5IiwiaWRiIiwic3RvcmVzIiwidHJhbnNhY3Rpb24iLCJpZGJCdWxrRG9jcyIsImRvY1N0b3JlIiwiYnlTZXFTdG9yZSIsImF0dGFjaFN0b3JlIiwiYXR0YWNoQW5kU2VxU3RvcmUiLCJtZXRhU3RvcmUiLCJkb2NJbmZvRXJyb3IiLCJtZXRhRG9jIiwiYWxsRG9jc1Byb2Nlc3NlZCIsImRvY0NvdW50RGVsdGEiLCJwcmVjb25kaXRpb25FcnJvcmVkIiwiX21ldGEiLCJibG9iU3VwcG9ydCIsIm9uQWxsRG9jc1Byb2Nlc3NlZCIsInVwZGF0ZURvY0NvdW50SWZSZWFkeSIsImRvY0NvdW50IiwibmV3UmV2SXNEZWxldGVkIiwiaXNVcGRhdGUiLCJjb2xsZWN0UmVzdWx0cyIsImZpbmlzaERvYyIsImF0dGFjaG1lbnRTYXZlZCIsIm5ld0F0dCIsInNhdmVBdHRhY2htZW50Iiwid3JpdGVBdHRhY2htZW50cyIsImFmdGVyUHV0RG9jIiwicmV2c1RvRGVsZXRlIiwiY29tcGFjdFRyZWUiLCJtZXRhZGF0YVRvU3RvcmUiLCJhZnRlclB1dE1ldGFkYXRhIiwiYXR0c0FkZGVkIiwiYXR0c1RvQWRkIiwib25lcnJvciIsImluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyIsInB1dFJlcSIsIm92ZXJhbGxFcnIiLCJkb2N2IiwicmVjdiIsInByb2Nlc3NlZEF0dGFjaG1lbnQiLCJwcmVwcm9jZXNzQXR0YWNobWVudHMiLCJ0eG5SZXN1bHQiLCJvbmFib3J0Iiwib250aW1lb3V0Iiwib25jb21wbGV0ZSIsImZpbmlzaCIsImRpZ2VzdHMiLCJmaWxlbmFtZSIsInZlcmlmeUF0dGFjaG1lbnQiLCJhdHRFcnIiLCJ2ZXJpZnlBdHRhY2htZW50cyIsIm51bUZldGNoZWQiLCJyZXZzX2xpbWl0IiwicmVhZE1ldGFkYXRhIiwiZmV0Y2hFeGlzdGluZ0RvY3MiLCJzdGFydFRyYW5zYWN0aW9uIiwicnVuQmF0Y2hlZEN1cnNvciIsImtleVJhbmdlIiwiYmF0Y2hTaXplIiwib25CYXRjaCIsImtleXNCYXRjaCIsInZhbHVlc0JhdGNoIiwicHNldWRvQ3Vyc29yIiwib25HZXRBbGwiLCJvbkdldEFsbEtleXMiLCJvbkN1cnNvciIsImdldEFsbCIsImdldEFsbEtleXMiLCJuZXdLZXlSYW5nZSIsImxhc3RLZXkiLCJ1cHBlciIsInVwcGVyT3BlbiIsImNvZGUiLCJsb3dlckJvdW5kIiwiaWRiQWxsRG9jcyIsImtleVJhbmdlRXJyb3IiLCJpbmNsdXNpdmVFbmQiLCJpbmNsdXNpdmVfZW5kIiwidXBwZXJCb3VuZCIsImNyZWF0ZUtleVJhbmdlIiwib25SZXN1bHRzUmVhZHkiLCJ1cGRhdGVTZXEiLCJvblN1Y2Nlc3MiLCJkb2NJZFJldkluZGV4IiwiYWxsRG9jc0lubmVyIiwiZmV0Y2hEb2NBc3luY2hyb25vdXNseSIsImJhdGNoVmFsdWVzIiwiYmF0Y2hWYWx1ZSIsImJhdGNoS2V5cyIsInJldHVyblZhbCIsInRvdGFsX3Jvd3MiLCJtYXhLZXkiLCJhbGxEb2NzS2V5cyIsInJ1bm5pbmciLCJhcHBseU5leHQiLCJkb2NJZHMiLCJudW1SZXN1bHRzIiwiZG9jSWRzVG9NZXRhZGF0YSIsIm9uR2V0TWV0YWRhdGEiLCJkb2NJZFJldiIsIm9iamVjdFN0b3JlcyIsIndpbm5pbmdEb2NzIiwibWV0YWRhdGFzIiwiZmV0Y2hXaW5uaW5nRG9jQW5kTWV0YWRhdGEiLCJ3aW5uaW5nRG9jIiwicHJvY2Vzc01ldGFkYXRhQW5kV2lubmluZ0RvYyIsIm9uQmF0Y2hEb25lIiwiZmlsdGVyZWQiLCJibG9iU3VwcG9ydFByb21pc2UiLCJjYWNoZWREQnMiLCJvcGVuUmVxTGlzdCIsIklkYlBvdWNoIiwidHJ5Q29kZSIsImVucXVldWVUYXNrIiwidGhpc0NhbGxiYWNrIiwiaWRiR2xvYmFsRmFpbHVyZUVycm9yIiwiZW5yaWNoQ2FsbGJhY2tFcnJvciIsImFkZERlbGV0ZWRPckxvY2FsSW5kZXgiLCJjcmVhdGVJbmRleCIsInVuaXF1ZSIsIm1pZ3JhdGVMb2NhbFN0b3JlIiwibG9jYWxTdG9yZSIsImxvY2FsIiwicmFuZ2UiLCJzZXFDdXJzb3IiLCJtaWdyYXRlQXR0c0FuZFNlcXMiLCJkaWdlc3RNYXAiLCJtaWdyYXRlTWV0YWRhdGEiLCJvbkdldE1ldGFkYXRhU2VxIiwibWV0YWRhdGFTZXEiLCJmZXRjaE1ldGFkYXRhU2VxIiwiaW5zdGFuY2VJZCIsInJlcU9wdHMiLCJoaXN0b3J5Tm9kZSIsImF0dGFjaElkIiwiYXR0YWNobWVudCIsImJsb2JEYXRhIiwiZG9jX2NvdW50IiwiaWRiX2F0dGFjaG1lbnRfZm9ybWF0Iiwib2xkUmV2Iiwib1N0b3JlIiwib2xkRG9jIiwib3BlblJlcSIsImluZGV4ZWREQiIsImRlbGV0ZURhdGFiYXNlIiwiY2FjaGVkIiwiZ2xvYmFsIiwib3BlbiIsIm9udXBncmFkZW5lZWRlZCIsIm9sZFZlcnNpb24iLCJjcmVhdGVPYmplY3RTdG9yZSIsImtleVBhdGgiLCJhdXRvSW5jcmVtZW50IiwiY3JlYXRlU2NoZW1hIiwiY3VycmVudFRhcmdldCIsImNyZWF0ZUxvY2FsU3RvcmVTY2hlbWEiLCJhZGRBdHRhY2hBbmRTZXFTdG9yZSIsIm1pZ3JhdGlvbnMiLCJtaWdyYXRpb24iLCJvbnZlcnNpb25jaGFuZ2UiLCJzdG9yZWRNZXRhRG9jIiwiY29tcGxldGVTZXR1cCIsInN0b3JlTWV0YURvY0lmUmVhZHkiLCJpbnN0YW5jZUtleSIsImNvdW50RG9jcyIsImJsb2IkJDEiLCJtYXRjaGVkQ2hyb21lIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF0Y2hlZEVkZ2UiLCJjaGVja0Jsb2JTdXBwb3J0Iiwic3VwcG9ydHNCdWxrR2V0TWFwIiwicmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIiLCJlbmNvZGVEb2NJZCIsInByZXByb2Nlc3NBdHRhY2htZW50cyQxIiwiZ2V0SG9zdCIsInByb3RvY29sIiwiaGFzVXJsUHJlZml4IiwidXNlciIsInBhc3N3b3JkIiwiYXV0aCIsInVzZXJuYW1lIiwiZ2VuREJVcmwiLCJnZW5VcmwiLCJwYXRoRGVsIiwiaG9zdCIsInBvcnQiLCJwYXJhbXNUb1N0ciIsIkh0dHBQb3VjaCIsImRiVXJsIiwic2V0dXBQcm9taXNlIiwib3VyRmV0Y2giLCJoZWFkZXJzIiwiY3JlZGVudGlhbHMiLCJuQXV0aCIsInRva2VuIiwidWEiLCJpc0lFIiwiaXNUcmlkZW50IiwiaXNFZGdlIiwiaXNHRVQiLCJzaG91bGRDYWNoZUJ1c3QiLCJub3ciLCJhZGFwdGVyRnVuJCQxIiwic2V0dXAiLCJmZXRjaEpTT04iLCJza2lwX3NldHVwIiwiZW5jb2RlQXR0YWNobWVudElkIiwidXVpZCQkMSIsInBpbmciLCJjb21wYWN0X3J1bm5pbmciLCJpbnRlcnZhbCIsImRvQnVsa0dldCIsImRvQnVsa0dldFNoaW0iLCJudW1CYXRjaGVzIiwib25SZXN1bHQiLCJiYXRjaE51bSIsInN1Yk9wdHMiLCJzdXBwb3J0c0J1bGtHZXQiLCJmZXRjaEF0dGFjaG1lbnRzIiwiZmlsZW5hbWVzIiwicHJvbWlzZUZhY3RvcmllcyIsImRvTmV4dCIsInJ1bk5leHRCYXRjaCIsIm9uRXJyb3IiLCJ0aGlzRXJyIiwicG9vbCIsInR5cGVGaWVsZERlc2NyaXB0b3IiLCJfX3Byb3RvX18iLCJmZXRjaERhdGEiLCJkb2NPckRvY3MiLCJjb250ZW50VHlwZSIsInByb2Nlc3MiLCJicm93c2VyIiwicGFyYW1TdHIiLCJiYXRjaF9zaXplIiwiaGVhcnRiZWF0IiwicmVxdWVzdFRpbWVvdXQiLCJsZWZ0VG9GZXRjaCIsImZlZWQiLCJzZXFfaW50ZXJ2YWwiLCJwYXJhbV9uYW1lIiwibGFzdEZldGNoZWRTZXEiLCJjb250cm9sbGVyIiwiYWJvcnRlZCIsImZldGNoT3B0cyIsInNpZ25hbCIsImZldGNoZWQiLCJyYXdfcmVzdWx0c19sZW5ndGgiLCJmaW5pc2hlZCIsIlF1ZXJ5UGFyc2VFcnJvciIsIk5vdEZvdW5kRXJyb3IiLCJCdWlsdEluRXJyb3IiLCJwcm9taXNlZENhbGxiYWNrIiwic2VxdWVudGlhbGl6ZSIsInByb21pc2VGYWN0b3J5IiwidW5pcSIsInRoZVNldCIsIm1hcFRvS2V5c0FycmF5IiwiY3JlYXRlQnVpbHRJbkVycm9yIiwiakxlbiIsImpOdW0iLCJldmFsRnVuY3Rpb25XaXRoRXZhbCIsIlRhc2tRdWV1ZSQxIiwiY3JlYXRlVmlldyIsInNvdXJjZURCIiwicmVkdWNlRnVuIiwidGVtcG9yYXJ5IiwibG9jYWxEb2NOYW1lIiwiY2FjaGVkVmlld3MiLCJ2aWV3U2lnbmF0dXJlIiwiY3JlYXRlVmlld1NpZ25hdHVyZSIsIl9jYWNoZWRWaWV3cyIsInByb21pc2VGb3JWaWV3IiwiZGVwRGJOYW1lIiwiZnVsbFZpZXdOYW1lIiwiZGVwRGJzIiwibGFzdFNlcURvYyIsInBlcnNpc3RlbnRRdWV1ZXMiLCJ0ZW1wVmlld1F1ZXVlIiwicGFyc2VWaWV3TmFtZSIsImVtaXRFcnJvciIsImJ1aWx0SW5SZWR1Y2UiLCJzdW1zcXIiLCJfc3Vtc3FyIiwiYWJzdHJhY3QiLCJtYXBwZXIiLCJyZWR1Y2VyIiwiZGRvY1ZhbGlkYXRvciIsInRyeU1hcCIsInRyeVJlZHVjZSIsInJlcmVkdWNlIiwib3V0cHV0Iiwic29ydEJ5S2V5VGhlblZhbHVlIiwia2V5Q29tcGFyZSIsInNsaWNlUmVzdWx0cyIsInJvd1RvRG9jSWQiLCJwb3N0cHJvY2Vzc0F0dGFjaG1lbnRzIiwiYWRkSHR0cFBhcmFtIiwicGFyYW1OYW1lIiwiYXNKc29uIiwiY29lcmNlSW50ZWdlciIsImludGVnZXJDYW5kaWRhdGUiLCJhc051bWJlciIsImNoZWNrUXVlcnlQYXJzZUVycm9yIiwic3RhcnRrZXlOYW1lIiwiZW5ka2V5TmFtZSIsImdyb3VwX2xldmVsIiwib3B0aW9uTmFtZSIsImNoZWNrUG9zaXRpdmVJbnRlZ2VyIiwiZGVmYXVsdHNUbyIsImdldERvY3NUb1BlcnNpc3QiLCJkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyIsIm1ldGFEb2NJZCIsImRlZmF1bHRNZXRhRG9jIiwiZG9jRGF0YSIsImluZGV4YWJsZUtleXNUb0tleVZhbHVlcyIsImlzR2VuT25lIiwiZ2V0S2V5VmFsdWVEb2NzIiwia3ZEb2NzUmVzIiwia3ZEb2NzIiwib2xkS2V5cyIsImtleVZhbHVlIiwibmV3S2V5cyIsImt2RG9jIiwicHJvY2Vzc0tleVZhbHVlRG9jcyIsImdldFF1ZXVlIiwidXBkYXRlVmlldyIsIm1hcFJlc3VsdHMiLCJjdXJyZW50U2VxIiwibGlzdE9mRG9jc1RvUGVyc2lzdCIsImRvY3NUb1BlcnNpc3QiLCJzYXZlS2V5VmFsdWVzIiwiaW5kZXhlZF9kb2NzIiwicHJvZ3Jlc3MiLCJwcm9jZXNzTmV4dEJhdGNoIiwiY2hhbmdlc19iYXRjaF9zaXplIiwiY3JlYXRlSW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzIiwiY3JlYXRlRG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMiLCJyZXN1bHRzX2NvdW50IiwiZW1pdHRlZEtleVZhbHVlIiwiY29tcGxleEtleSIsInVwZGF0ZVZpZXdJblF1ZXVlIiwicXVlcnlWaWV3IiwidG90YWxSb3dzIiwic2hvdWxkUmVkdWNlIiwiZmV0Y2hGcm9tVmlldyIsInZpZXdPcHRzIiwiZXhwZWN0ZWRLZXlzIiwicGFyc2VkS2V5QW5kRG9jSWQiLCJwYXJzZWRTdHIiLCJwYXJzZUluZGV4YWJsZVN0cmluZyIsIm9uTWFwUmVzdWx0c1JlYWR5IiwiZmluYWxSZXN1bHRzIiwic2hvdWxkR3JvdXAiLCJsdmwiLCJQT1NJVElWRV9JTkZJTklUWSIsImxhc3QiLCJncm91cEtleSIsInJlZHVjZVRyeSIsInJlZHVjZVZpZXciLCJhbGxEb2NzUmVzIiwiZG9jSWRzVG9Eb2NzIiwiZmV0Y2hQcm9taXNlcyIsImtleVN0YXJ0Iiwia2V5RW5kIiwicXVlcnlWaWV3SW5RdWV1ZSIsInF1ZXJ5UHJvbWlzZWQiLCJfcXVlcnkiLCJjdXN0b21RdWVyeSIsImtleXNBc1N0cmluZyIsImh0dHBRdWVyeSIsInVwZGF0ZVZpZXdPcHRzIiwidmlld191cGRhdGVfY2hhbmdlc19iYXRjaF9zaXplIiwiZmluYWxQcm9taXNlRmFjdG9yeSIsImRlc2lnbkRvY05hbWUiLCJzdGFsZSIsImNvZXJjZU9wdGlvbnMiLCJ2aWV3Q2xlYW51cCIsIl92aWV3Q2xlYW51cCIsImN1c3RvbVZpZXdDbGVhbnVwIiwiaHR0cFZpZXdDbGVhbnVwIiwiZG9jc1RvVmlld3MiLCJ2aWV3c1RvU3RhdHVzIiwiZGRvY05hbWUiLCJ2aWV3REJOYW1lcyIsInN0YXR1c0lzR29vZCIsInZpZXdEQk5hbWUiLCJkZXN0cm95UHJvbWlzZXMiLCJsb2NhbFZpZXdDbGVhbnVwIiwiY3JlYXRlQWJzdHJhY3RNYXBSZWR1Y2UiLCJvcmlnTWFwIiwicmVkdWNlRnVuU3RyaW5nIiwiYnVpbHRJbiIsImdldEJ1aWx0SW4iLCJtYXByZWR1Y2UiLCJpc0dlbk9uZSQxIiwiZ2V0RG9jQXR0YWNobWVudHMiLCJnZXREb2NzIiwiZGlmZnMiLCJyZXN1bHREb2NzIiwiZmV0Y2hSZXZpc2lvbk9uZURvY3MiLCJoYXNDb25mbGljdHMiLCJidWxrR2V0T3B0cyIsIm1pc3NpbmdSZXYiLCJjcmVhdGVCdWxrR2V0T3B0cyIsImJ1bGtHZXRSZXNwb25zZSIsImJ1bGtHZXRJbmZvIiwicmVtb3RlRG9jIiwiZG9DaGVja0ZvckxvY2FsQXR0YWNobWVudHMiLCJmaWxlSGFzQ2hhbmdlZCIsImdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlIiwidXBkYXRlQ2hlY2twb2ludCIsImNoZWNrcG9pbnQiLCJzZXNzaW9uIiwicmV0dXJuVmFsdWUiLCJzZXNzaW9uX2lkIiwicmVwbGljYXRvciIsIkNoZWNrcG9pbnRlciIsIndyaXRlQ2hlY2twb2ludCIsInVwZGF0ZVRhcmdldCIsInVwZGF0ZVNvdXJjZSIsIndyaXRlVGFyZ2V0Q2hlY2twb2ludCIsIndyaXRlU291cmNlQ2hlY2twb2ludCIsImlzRm9yYmlkZGVuRXJyb3IiLCJjb21wYXJpc29ucyIsInRhcmdldERvYyIsInNvdXJjZURvYyIsInNyY0RvYyIsInRndERvYyIsImNvbXBhcmVSZXBsaWNhdGlvbkhpc3RvcnkiLCJzb3VyY2VIaXN0b3J5IiwidGFyZ2V0SGlzdG9yeSIsIlMiLCJzb3VyY2VSZXN0IiwiVCIsInRhcmdldFJlc3QiLCJoYXNTZXNzaW9uSWQiLCJjb21wYXJlUmVwbGljYXRpb25Mb2dzIiwic2Vzc2lvbklkIiwicHJvcHMiLCJyZXN0IiwiZmxvb3IiLCJnZXRDaGVja3BvaW50IiwiZ2VuZXJhdGVSZXBsaWNhdGlvbklkIiwicXVlcnlQYXJhbXMiLCJmaWx0ZXJWaWV3TmFtZSIsInNvcnRPYmplY3RQcm9wZXJ0aWVzQnlLZXkiLCJxdWVyeURhdGEiLCJtZDVzdW0iLCJyZXBsaWNhdGUiLCJjdXJyZW50QmF0Y2giLCJyZXBJZCIsImNoZWNrcG9pbnRlciIsImJhdGNoZXMiLCJwZW5kaW5nQmF0Y2giLCJ3cml0aW5nQ2hlY2twb2ludCIsImNoYW5nZXNDb21wbGV0ZWQiLCJyZXBsaWNhdGlvbkNvbXBsZXRlZCIsImJhdGNoZXNfbGltaXQiLCJjaGFuZ2VzUGVuZGluZyIsImNoYW5nZWREb2NzIiwic3RhcnRfdGltZSIsImRvY3NfcmVhZCIsImRvY3Nfd3JpdHRlbiIsImRvY193cml0ZV9mYWlsdXJlcyIsImluaXRDaGVja3BvaW50ZXIiLCJjaGVja3BvaW50T3B0cyIsIndyaXRlRG9jcyIsImJ1bGtPcHRzIiwiY29tcGxldGVSZXBsaWNhdGlvbiIsImVycm9yc0J5SWQiLCJlcnJvcnNObyIsImVycm9yTmFtZSIsImZpbmlzaEJhdGNoIiwib3V0UmVzdWx0IiwiZ2V0Q2hhbmdlcyIsIm9uQ2hlY2twb2ludEVycm9yIiwiZ2V0QmF0Y2hEb2NzIiwiZ290Iiwic3RhcnROZXh0QmF0Y2giLCJhYm9ydFJlcGxpY2F0aW9uIiwicHJvY2Vzc1BlbmRpbmdCYXRjaCIsImltbWVkaWF0ZSQkMSIsImZhdGFsRXJyb3IiLCJlbmRfdGltZSIsInJldHJ5IiwiYmFja19vZmZfZnVuY3Rpb24iLCJiYWNrT2ZmU2V0IiwiY3VycmVudF9iYWNrX29mZiIsImJhY2tPZmYiLCJvbkNoYW5nZXNDb21wbGV0ZSIsIm9uQ2hhbmdlc0Vycm9yIiwiX2Fib3J0Q2hhbmdlcyIsImFib3J0Q2hhbmdlcyIsInN0YXJ0Q2hhbmdlcyIsIl9hZGRlZExpc3RlbmVycyIsIlJlcGxpY2F0aW9uIiwidG9Qb3VjaCIsIlBvdWNoQ29uc3RydWN0b3IiLCJyZXBsaWNhdGVXcmFwcGVyIiwicmVwbGljYXRlUmV0IiwiU3luYyIsImNhbmNlbGVkIiwib3B0c1B1c2giLCJvcHRzUHVsbCIsInB1bGwiLCJwdWxsQ2hhbmdlIiwicHVzaENoYW5nZSIsInB1c2hEZW5pZWQiLCJwdWxsRGVuaWVkIiwicHVzaFBhdXNlZCIsInB1bGxQYXVzZWQiLCJwdXNoQWN0aXZlIiwicHVsbEFjdGl2ZSIsInJlbW92ZWQiLCJyZW1vdmVBbGwiLCJhZGRPbmVMaXN0ZW5lciIsIm91dCIsImNsZWFudXAiLCJfcmVhZHlDYWxsZWQiLCJyZXBsaWNhdGVNZXRob2RzIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImRyYWluUXVldWUiLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJub29wIiwiZW52IiwiYXJndiIsInZlcnNpb25zIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwiZGlyIiwidW1hc2siLCJGVU5DX0VSUk9SX1RFWFQiLCJQTEFDRUhPTERFUiIsIndyYXBGbGFncyIsImFyZ3NUYWciLCJhcnJheVRhZyIsImJvb2xUYWciLCJkYXRlVGFnIiwiZXJyb3JUYWciLCJmdW5jVGFnIiwiZ2VuVGFnIiwibWFwVGFnIiwibnVtYmVyVGFnIiwib2JqZWN0VGFnIiwicmVnZXhwVGFnIiwic2V0VGFnIiwic3RyaW5nVGFnIiwic3ltYm9sVGFnIiwid2Vha01hcFRhZyIsImFycmF5QnVmZmVyVGFnIiwiZGF0YVZpZXdUYWciLCJmbG9hdDMyVGFnIiwiZmxvYXQ2NFRhZyIsImludDhUYWciLCJpbnQxNlRhZyIsImludDMyVGFnIiwidWludDhUYWciLCJ1aW50MTZUYWciLCJ1aW50MzJUYWciLCJyZUVtcHR5U3RyaW5nTGVhZGluZyIsInJlRW1wdHlTdHJpbmdNaWRkbGUiLCJyZUVtcHR5U3RyaW5nVHJhaWxpbmciLCJyZUVzY2FwZWRIdG1sIiwicmVVbmVzY2FwZWRIdG1sIiwicmVIYXNFc2NhcGVkSHRtbCIsInJlSGFzVW5lc2NhcGVkSHRtbCIsInJlRXNjYXBlIiwicmVFdmFsdWF0ZSIsInJlSW50ZXJwb2xhdGUiLCJyZUlzRGVlcFByb3AiLCJyZUlzUGxhaW5Qcm9wIiwicmVQcm9wTmFtZSIsInJlUmVnRXhwQ2hhciIsInJlSGFzUmVnRXhwQ2hhciIsInJlVHJpbVN0YXJ0IiwicmVXaGl0ZXNwYWNlIiwicmVXcmFwQ29tbWVudCIsInJlV3JhcERldGFpbHMiLCJyZVNwbGl0RGV0YWlscyIsInJlQXNjaWlXb3JkIiwicmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMiLCJyZUVzY2FwZUNoYXIiLCJyZUVzVGVtcGxhdGUiLCJyZUZsYWdzIiwicmVJc0JhZEhleCIsInJlSXNCaW5hcnkiLCJyZUlzSG9zdEN0b3IiLCJyZUlzT2N0YWwiLCJyZUlzVWludCIsInJlTGF0aW4iLCJyZU5vTWF0Y2giLCJyZVVuZXNjYXBlZFN0cmluZyIsInJzQ29tYm9SYW5nZSIsInJzQ29tYm9NYXJrc1JhbmdlIiwicnNCcmVha1JhbmdlIiwicnNNYXRoT3BSYW5nZSIsInJzQXN0cmFsIiwicnNCcmVhayIsInJzQ29tYm8iLCJyc0RpZ2l0cyIsInJzRGluZ2JhdCIsInJzTG93ZXIiLCJyc01pc2MiLCJyc0ZpdHoiLCJyc05vbkFzdHJhbCIsInJzUmVnaW9uYWwiLCJyc1N1cnJQYWlyIiwicnNVcHBlciIsInJzTWlzY0xvd2VyIiwicnNNaXNjVXBwZXIiLCJyZU9wdE1vZCIsInJzU2VxIiwicnNFbW9qaSIsInJzU3ltYm9sIiwicmVBcG9zIiwicmVDb21ib01hcmsiLCJyZVVuaWNvZGUiLCJyZVVuaWNvZGVXb3JkIiwicmVIYXNVbmljb2RlIiwicmVIYXNVbmljb2RlV29yZCIsImNvbnRleHRQcm9wcyIsInRlbXBsYXRlQ291bnRlciIsInR5cGVkQXJyYXlUYWdzIiwiY2xvbmVhYmxlVGFncyIsInN0cmluZ0VzY2FwZXMiLCJmcmVlUGFyc2VGbG9hdCIsImZyZWVQYXJzZUludCIsImZyZWVHbG9iYWwiLCJmcmVlU2VsZiIsImZyZWVFeHBvcnRzIiwibm9kZVR5cGUiLCJmcmVlTW9kdWxlIiwibW9kdWxlRXhwb3J0cyIsImZyZWVQcm9jZXNzIiwibm9kZVV0aWwiLCJyZXF1aXJlIiwibm9kZUlzQXJyYXlCdWZmZXIiLCJpc0FycmF5QnVmZmVyIiwibm9kZUlzRGF0ZSIsImlzRGF0ZSIsIm5vZGVJc01hcCIsImlzTWFwIiwibm9kZUlzUmVnRXhwIiwiaXNSZWdFeHAiLCJub2RlSXNTZXQiLCJpc1NldCIsIm5vZGVJc1R5cGVkQXJyYXkiLCJpc1R5cGVkQXJyYXkiLCJ0aGlzQXJnIiwiYXJyYXlBZ2dyZWdhdG9yIiwic2V0dGVyIiwiaXRlcmF0ZWUiLCJhY2N1bXVsYXRvciIsImFycmF5RWFjaCIsImFycmF5RWFjaFJpZ2h0IiwiYXJyYXlFdmVyeSIsInByZWRpY2F0ZSIsImFycmF5RmlsdGVyIiwicmVzSW5kZXgiLCJhcnJheUluY2x1ZGVzIiwiYmFzZUluZGV4T2YiLCJhcnJheUluY2x1ZGVzV2l0aCIsImFycmF5TWFwIiwiYXJyYXlQdXNoIiwiYXJyYXlSZWR1Y2UiLCJpbml0QWNjdW0iLCJhcnJheVJlZHVjZVJpZ2h0IiwiYXJyYXlTb21lIiwiYXNjaWlTaXplIiwiYmFzZVByb3BlcnR5IiwiYmFzZUZpbmRLZXkiLCJjb2xsZWN0aW9uIiwiZWFjaEZ1bmMiLCJiYXNlRmluZEluZGV4IiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0Iiwic3RyaWN0SW5kZXhPZiIsImJhc2VJc05hTiIsImJhc2VJbmRleE9mV2l0aCIsImJhc2VNZWFuIiwiYmFzZVN1bSIsImJhc2VQcm9wZXJ0eU9mIiwiYmFzZVJlZHVjZSIsImJhc2VUaW1lcyIsImJhc2VUcmltIiwidHJpbW1lZEVuZEluZGV4IiwiYmFzZVVuYXJ5IiwiYmFzZVZhbHVlcyIsImNhY2hlSGFzIiwiY2FjaGUiLCJjaGFyc1N0YXJ0SW5kZXgiLCJzdHJTeW1ib2xzIiwiY2hyU3ltYm9scyIsImNoYXJzRW5kSW5kZXgiLCJjb3VudEhvbGRlcnMiLCJwbGFjZWhvbGRlciIsImRlYnVyckxldHRlciIsImVzY2FwZUh0bWxDaGFyIiwiZXNjYXBlU3RyaW5nQ2hhciIsImNociIsImhhc1VuaWNvZGUiLCJtYXBUb0FycmF5Iiwib3ZlckFyZyIsInRyYW5zZm9ybSIsInJlcGxhY2VIb2xkZXJzIiwic2V0VG9BcnJheSIsInNldFRvUGFpcnMiLCJzdHJpbmdTaXplIiwibGFzdEluZGV4IiwidW5pY29kZVNpemUiLCJzdHJpbmdUb0FycmF5IiwidW5pY29kZVRvQXJyYXkiLCJhc2NpaVRvQXJyYXkiLCJ1bmVzY2FwZUh0bWxDaGFyIiwicnVuSW5Db250ZXh0IiwidWlkIiwiYXJyYXlQcm90byIsImZ1bmNQcm90byIsIm9iamVjdFByb3RvIiwiY29yZUpzRGF0YSIsImlkQ291bnRlciIsIm1hc2tTcmNLZXkiLCJJRV9QUk9UTyIsIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwib2xkRGFzaCIsInJlSXNOYXRpdmUiLCJCdWZmZXIiLCJhbGxvY1Vuc2FmZSIsImdldFByb3RvdHlwZSIsIm9iamVjdENyZWF0ZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwic3ByZWFkYWJsZVN5bWJvbCIsImlzQ29uY2F0U3ByZWFkYWJsZSIsInN5bUl0ZXJhdG9yIiwiaXRlcmF0b3IiLCJzeW1Ub1N0cmluZ1RhZyIsImdldE5hdGl2ZSIsImN0eENsZWFyVGltZW91dCIsImN0eE5vdyIsImN0eFNldFRpbWVvdXQiLCJuYXRpdmVDZWlsIiwibmF0aXZlRmxvb3IiLCJuYXRpdmVHZXRTeW1ib2xzIiwibmF0aXZlSXNCdWZmZXIiLCJpc0J1ZmZlciIsIm5hdGl2ZUlzRmluaXRlIiwibmF0aXZlSm9pbiIsIm5hdGl2ZUtleXMiLCJuYXRpdmVNYXgiLCJuYXRpdmVNaW4iLCJuYXRpdmVOb3ciLCJuYXRpdmVQYXJzZUludCIsIm5hdGl2ZVJhbmRvbSIsIm5hdGl2ZVJldmVyc2UiLCJEYXRhVmlldyIsIldlYWtNYXAiLCJuYXRpdmVDcmVhdGUiLCJtZXRhTWFwIiwicmVhbE5hbWVzIiwiZGF0YVZpZXdDdG9yU3RyaW5nIiwidG9Tb3VyY2UiLCJtYXBDdG9yU3RyaW5nIiwicHJvbWlzZUN0b3JTdHJpbmciLCJzZXRDdG9yU3RyaW5nIiwid2Vha01hcEN0b3JTdHJpbmciLCJzeW1ib2xQcm90byIsInN5bWJvbFZhbHVlT2YiLCJ2YWx1ZU9mIiwic3ltYm9sVG9TdHJpbmciLCJsb2Rhc2giLCJpc09iamVjdExpa2UiLCJMYXp5V3JhcHBlciIsIkxvZGFzaFdyYXBwZXIiLCJ3cmFwcGVyQ2xvbmUiLCJiYXNlQ3JlYXRlIiwiaXNPYmplY3QiLCJiYXNlTG9kYXNoIiwiY2hhaW5BbGwiLCJfX3dyYXBwZWRfXyIsIl9fYWN0aW9uc19fIiwiX19jaGFpbl9fIiwiX19pbmRleF9fIiwiX192YWx1ZXNfXyIsIl9fZGlyX18iLCJfX2ZpbHRlcmVkX18iLCJfX2l0ZXJhdGVlc19fIiwiX190YWtlQ291bnRfXyIsIl9fdmlld3NfXyIsIkhhc2giLCJjbGVhciIsImVudHJ5IiwiTGlzdENhY2hlIiwiTWFwQ2FjaGUiLCJTZXRDYWNoZSIsIl9fZGF0YV9fIiwiU3RhY2siLCJhcnJheUxpa2VLZXlzIiwiaW5oZXJpdGVkIiwiaXNBcnIiLCJpc0FyZyIsImlzQXJndW1lbnRzIiwiaXNCdWZmIiwiaXNUeXBlIiwic2tpcEluZGV4ZXMiLCJpc0luZGV4IiwiYXJyYXlTYW1wbGUiLCJiYXNlUmFuZG9tIiwiYXJyYXlTYW1wbGVTaXplIiwic2h1ZmZsZVNlbGYiLCJjb3B5QXJyYXkiLCJiYXNlQ2xhbXAiLCJhcnJheVNodWZmbGUiLCJhc3NpZ25NZXJnZVZhbHVlIiwiZXEiLCJiYXNlQXNzaWduVmFsdWUiLCJhc3NpZ25WYWx1ZSIsIm9ialZhbHVlIiwiYXNzb2NJbmRleE9mIiwiYmFzZUFnZ3JlZ2F0b3IiLCJiYXNlRWFjaCIsImJhc2VBc3NpZ24iLCJjb3B5T2JqZWN0IiwiYmFzZUF0IiwibG93ZXIiLCJiYXNlQ2xvbmUiLCJiaXRtYXNrIiwiY3VzdG9taXplciIsImlzRGVlcCIsImlzRmxhdCIsImlzRnVsbCIsImluaXRDbG9uZUFycmF5IiwidGFnIiwiZ2V0VGFnIiwiaXNGdW5jIiwiY2xvbmVCdWZmZXIiLCJpbml0Q2xvbmVPYmplY3QiLCJnZXRTeW1ib2xzSW4iLCJjb3B5U3ltYm9sc0luIiwia2V5c0luIiwiYmFzZUFzc2lnbkluIiwiZ2V0U3ltYm9scyIsImNvcHlTeW1ib2xzIiwiZGF0YVZpZXciLCJieXRlT2Zmc2V0IiwiY2xvbmVEYXRhVmlldyIsImNsb25lVHlwZWRBcnJheSIsImNsb25lUmVnRXhwIiwic3ltYm9sIiwiaW5pdENsb25lQnlUYWciLCJzdGFja2VkIiwic3ViVmFsdWUiLCJnZXRBbGxLZXlzSW4iLCJiYXNlQ29uZm9ybXNUbyIsImJhc2VEZWxheSIsIndhaXQiLCJiYXNlRGlmZmVyZW5jZSIsImluY2x1ZGVzIiwiaXNDb21tb24iLCJ2YWx1ZXNMZW5ndGgiLCJvdXRlciIsImNvbXB1dGVkIiwidmFsdWVzSW5kZXgiLCJ0ZW1wbGF0ZVNldHRpbmdzIiwiZ2V0TWFwRGF0YSIsInBhaXJzIiwiTEFSR0VfQVJSQVlfU0laRSIsImNyZWF0ZUJhc2VFYWNoIiwiYmFzZUZvck93biIsImJhc2VFYWNoUmlnaHQiLCJiYXNlRm9yT3duUmlnaHQiLCJiYXNlRXZlcnkiLCJiYXNlRXh0cmVtdW0iLCJpc1N5bWJvbCIsImJhc2VGaWx0ZXIiLCJiYXNlRmxhdHRlbiIsImlzU3RyaWN0IiwiaXNGbGF0dGVuYWJsZSIsImJhc2VGb3IiLCJjcmVhdGVCYXNlRm9yIiwiYmFzZUZvclJpZ2h0IiwiYmFzZUZ1bmN0aW9ucyIsImlzRnVuY3Rpb24iLCJiYXNlR2V0IiwiY2FzdFBhdGgiLCJ0b0tleSIsImJhc2VHZXRBbGxLZXlzIiwia2V5c0Z1bmMiLCJzeW1ib2xzRnVuYyIsImJhc2VHZXRUYWciLCJpc093biIsInVubWFza2VkIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJiYXNlR3QiLCJiYXNlSGFzIiwiYmFzZUhhc0luIiwiYmFzZUludGVyc2VjdGlvbiIsImFycmF5cyIsIm90aExlbmd0aCIsIm90aEluZGV4IiwiY2FjaGVzIiwibWF4TGVuZ3RoIiwic2VlbiIsImJhc2VJbnZva2UiLCJiYXNlSXNBcmd1bWVudHMiLCJiYXNlSXNFcXVhbCIsImVxdWFsRnVuYyIsIm9iaklzQXJyIiwib3RoSXNBcnIiLCJvYmpUYWciLCJvdGhUYWciLCJvYmpJc09iaiIsIm90aElzT2JqIiwiaXNTYW1lVGFnIiwiZXF1YWxBcnJheXMiLCJjb252ZXJ0IiwiaXNQYXJ0aWFsIiwiZXF1YWxCeVRhZyIsIm9iaklzV3JhcHBlZCIsIm90aElzV3JhcHBlZCIsIm9ialVud3JhcHBlZCIsIm90aFVud3JhcHBlZCIsIm9ialByb3BzIiwib2JqTGVuZ3RoIiwib2JqU3RhY2tlZCIsIm90aFN0YWNrZWQiLCJza2lwQ3RvciIsIm90aFZhbHVlIiwiY29tcGFyZWQiLCJvYmpDdG9yIiwib3RoQ3RvciIsImVxdWFsT2JqZWN0cyIsImJhc2VJc0VxdWFsRGVlcCIsImJhc2VJc01hdGNoIiwibWF0Y2hEYXRhIiwibm9DdXN0b21pemVyIiwic3JjVmFsdWUiLCJDT01QQVJFX1BBUlRJQUxfRkxBRyIsImJhc2VJc05hdGl2ZSIsImJhc2VJdGVyYXRlZSIsImlkZW50aXR5IiwiYmFzZU1hdGNoZXNQcm9wZXJ0eSIsImJhc2VNYXRjaGVzIiwiYmFzZUtleXMiLCJpc1Byb3RvdHlwZSIsImJhc2VLZXlzSW4iLCJuYXRpdmVLZXlzSW4iLCJpc1Byb3RvIiwiYmFzZUx0IiwiYmFzZU1hcCIsImlzQXJyYXlMaWtlIiwiZ2V0TWF0Y2hEYXRhIiwibWF0Y2hlc1N0cmljdENvbXBhcmFibGUiLCJpc0tleSIsImlzU3RyaWN0Q29tcGFyYWJsZSIsImhhc0luIiwiYmFzZU1lcmdlIiwic3JjSW5kZXgiLCJtZXJnZUZ1bmMiLCJzYWZlR2V0IiwibmV3VmFsdWUiLCJpc1R5cGVkIiwiaXNBcnJheUxpa2VPYmplY3QiLCJ0b1BsYWluT2JqZWN0IiwiYmFzZU1lcmdlRGVlcCIsImJhc2VOdGgiLCJiYXNlT3JkZXJCeSIsIml0ZXJhdGVlcyIsIm9yZGVycyIsImdldEl0ZXJhdGVlIiwiY29tcGFyZXIiLCJiYXNlU29ydEJ5Iiwib2JqQ3JpdGVyaWEiLCJjcml0ZXJpYSIsIm90aENyaXRlcmlhIiwib3JkZXJzTGVuZ3RoIiwiY29tcGFyZUFzY2VuZGluZyIsIm9yZGVyIiwiY29tcGFyZU11bHRpcGxlIiwiYmFzZVBpY2tCeSIsImJhc2VTZXQiLCJiYXNlUHVsbEFsbCIsImJhc2VQdWxsQXQiLCJpbmRleGVzIiwiYmFzZVVuc2V0IiwiYmFzZVJlcGVhdCIsImJhc2VSZXN0Iiwic2V0VG9TdHJpbmciLCJvdmVyUmVzdCIsImJhc2VTYW1wbGUiLCJiYXNlU2FtcGxlU2l6ZSIsIm5lc3RlZCIsImJhc2VTZXREYXRhIiwiYmFzZVNldFRvU3RyaW5nIiwiY29uc3RhbnQiLCJiYXNlU2h1ZmZsZSIsImJhc2VTbGljZSIsImJhc2VTb21lIiwiYmFzZVNvcnRlZEluZGV4IiwicmV0SGlnaGVzdCIsIk1BWF9BUlJBWV9MRU5HVEgiLCJiYXNlU29ydGVkSW5kZXhCeSIsInZhbElzTmFOIiwidmFsSXNOdWxsIiwidmFsSXNTeW1ib2wiLCJ2YWxJc1VuZGVmaW5lZCIsIm90aElzRGVmaW5lZCIsIm90aElzTnVsbCIsIm90aElzUmVmbGV4aXZlIiwib3RoSXNTeW1ib2wiLCJzZXRMb3ciLCJiYXNlU29ydGVkVW5pcSIsImJhc2VUb051bWJlciIsImJhc2VUb1N0cmluZyIsImJhc2VVbmlxIiwiY3JlYXRlU2V0Iiwic2VlbkluZGV4IiwiYmFzZVVwZGF0ZSIsInVwZGF0ZXIiLCJiYXNlV2hpbGUiLCJpc0Ryb3AiLCJiYXNlV3JhcHBlclZhbHVlIiwiYWN0aW9ucyIsImJhc2VYb3IiLCJiYXNlWmlwT2JqZWN0IiwiYXNzaWduRnVuYyIsInZhbHNMZW5ndGgiLCJjYXN0QXJyYXlMaWtlT2JqZWN0IiwiY2FzdEZ1bmN0aW9uIiwic3RyaW5nVG9QYXRoIiwiY2FzdFJlc3QiLCJjYXN0U2xpY2UiLCJ0eXBlZEFycmF5IiwidmFsSXNEZWZpbmVkIiwidmFsSXNSZWZsZXhpdmUiLCJjb21wb3NlQXJncyIsInBhcnRpYWxzIiwiaG9sZGVycyIsImlzQ3VycmllZCIsImFyZ3NJbmRleCIsImFyZ3NMZW5ndGgiLCJob2xkZXJzTGVuZ3RoIiwibGVmdEluZGV4IiwibGVmdExlbmd0aCIsInJhbmdlTGVuZ3RoIiwiaXNVbmN1cnJpZWQiLCJjb21wb3NlQXJnc1JpZ2h0IiwiaG9sZGVyc0luZGV4IiwicmlnaHRJbmRleCIsInJpZ2h0TGVuZ3RoIiwiaXNOZXciLCJjcmVhdGVBZ2dyZWdhdG9yIiwiaW5pdGlhbGl6ZXIiLCJjcmVhdGVBc3NpZ25lciIsImFzc2lnbmVyIiwic291cmNlcyIsImd1YXJkIiwiaXNJdGVyYXRlZUNhbGwiLCJpdGVyYWJsZSIsImNyZWF0ZUNhc2VGaXJzdCIsIm1ldGhvZE5hbWUiLCJ0cmFpbGluZyIsImNyZWF0ZUNvbXBvdW5kZXIiLCJ3b3JkcyIsImRlYnVyciIsImNyZWF0ZUN0b3IiLCJ0aGlzQmluZGluZyIsImNyZWF0ZUZpbmQiLCJmaW5kSW5kZXhGdW5jIiwiY3JlYXRlRmxvdyIsImZsYXRSZXN0IiwiZnVuY3MiLCJwcmVyZXEiLCJ0aHJ1Iiwid3JhcHBlciIsImdldEZ1bmNOYW1lIiwiZnVuY05hbWUiLCJnZXREYXRhIiwiaXNMYXppYWJsZSIsInBsYW50IiwiY3JlYXRlSHlicmlkIiwicGFydGlhbHNSaWdodCIsImhvbGRlcnNSaWdodCIsImFyZ1BvcyIsImFyeSIsImFyaXR5IiwiaXNBcnkiLCJpc0JpbmQiLCJpc0JpbmRLZXkiLCJpc0ZsaXAiLCJnZXRIb2xkZXIiLCJob2xkZXJzQ291bnQiLCJuZXdIb2xkZXJzIiwiY3JlYXRlUmVjdXJyeSIsImZuIiwicmVvcmRlciIsImNyZWF0ZUludmVydGVyIiwidG9JdGVyYXRlZSIsImJhc2VJbnZlcnRlciIsImNyZWF0ZU1hdGhPcGVyYXRpb24iLCJkZWZhdWx0VmFsdWUiLCJjcmVhdGVPdmVyIiwiYXJyYXlGdW5jIiwiY3JlYXRlUGFkZGluZyIsImNoYXJzIiwiY2hhcnNMZW5ndGgiLCJjcmVhdGVSYW5nZSIsInN0ZXAiLCJ0b0Zpbml0ZSIsImJhc2VSYW5nZSIsImNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24iLCJ0b051bWJlciIsIndyYXBGdW5jIiwiaXNDdXJyeSIsIm5ld0RhdGEiLCJzZXREYXRhIiwic2V0V3JhcFRvU3RyaW5nIiwiY3JlYXRlUm91bmQiLCJwcmVjaXNpb24iLCJ0b0ludGVnZXIiLCJwYWlyIiwiY3JlYXRlVG9QYWlycyIsImJhc2VUb1BhaXJzIiwiY3JlYXRlV3JhcCIsInNyY0JpdG1hc2siLCJuZXdCaXRtYXNrIiwiaXNDb21ibyIsIm1lcmdlRGF0YSIsImNyZWF0ZUN1cnJ5IiwiY3JlYXRlUGFydGlhbCIsImNyZWF0ZUJpbmQiLCJjdXN0b21EZWZhdWx0c0Fzc2lnbkluIiwiY3VzdG9tRGVmYXVsdHNNZXJnZSIsImN1c3RvbU9taXRDbG9uZSIsImFyckxlbmd0aCIsImFyclN0YWNrZWQiLCJhcnJWYWx1ZSIsIm90aGVyRnVuYyIsImdldFZhbHVlIiwic3R1YkFycmF5IiwiaGFzUGF0aCIsImhhc0Z1bmMiLCJpc0xlbmd0aCIsImN0b3JTdHJpbmciLCJpc01hc2thYmxlIiwic3R1YkZhbHNlIiwib3RoZXJBcmdzIiwib2xkQXJyYXkiLCJzaG9ydE91dCIsInJlZmVyZW5jZSIsImRldGFpbHMiLCJpbnNlcnRXcmFwRGV0YWlscyIsInVwZGF0ZVdyYXBEZXRhaWxzIiwiZ2V0V3JhcERldGFpbHMiLCJsYXN0Q2FsbGVkIiwic3RhbXAiLCJyZW1haW5pbmciLCJyYW5kIiwibWVtb2l6ZSIsIm1lbW9pemVDYXBwZWQiLCJxdW90ZSIsInN1YlN0cmluZyIsImRpZmZlcmVuY2UiLCJkaWZmZXJlbmNlQnkiLCJkaWZmZXJlbmNlV2l0aCIsImZpbmRJbmRleCIsImZpbmRMYXN0SW5kZXgiLCJoZWFkIiwiaW50ZXJzZWN0aW9uIiwibWFwcGVkIiwiaW50ZXJzZWN0aW9uQnkiLCJpbnRlcnNlY3Rpb25XaXRoIiwicHVsbEFsbCIsInB1bGxBdCIsInVuaW9uIiwidW5pb25CeSIsInVuaW9uV2l0aCIsInVuemlwIiwidW56aXBXaXRoIiwid2l0aG91dCIsInhvciIsInhvckJ5IiwieG9yV2l0aCIsInppcCIsInppcFdpdGgiLCJjaGFpbiIsImludGVyY2VwdG9yIiwid3JhcHBlckF0IiwiY291bnRCeSIsImZpbmRMYXN0IiwiZm9yRWFjaFJpZ2h0IiwiZ3JvdXBCeSIsImludm9rZU1hcCIsImtleUJ5IiwicGFydGl0aW9uIiwic29ydEJ5IiwiYmVmb3JlIiwiYmluZEtleSIsIldSQVBfQklORF9GTEFHIiwiZGVib3VuY2UiLCJsYXN0QXJncyIsImxhc3RUaGlzIiwibWF4V2FpdCIsInRpbWVySWQiLCJsYXN0Q2FsbFRpbWUiLCJsYXN0SW52b2tlVGltZSIsImxlYWRpbmciLCJtYXhpbmciLCJpbnZva2VGdW5jIiwidGltZSIsImxlYWRpbmdFZGdlIiwidGltZXJFeHBpcmVkIiwic2hvdWxkSW52b2tlIiwidGltZVNpbmNlTGFzdENhbGwiLCJ0cmFpbGluZ0VkZ2UiLCJ0aW1lV2FpdGluZyIsInJlbWFpbmluZ1dhaXQiLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwiZmx1c2giLCJkZWZlciIsImRlbGF5IiwibWVtb2l6ZWQiLCJDYWNoZSIsIm5lZ2F0ZSIsIm92ZXJBcmdzIiwidHJhbnNmb3JtcyIsImZ1bmNzTGVuZ3RoIiwicGFydGlhbCIsInBhcnRpYWxSaWdodCIsInJlYXJnIiwiZ3QiLCJndGUiLCJpc0Vycm9yIiwiaXNJbnRlZ2VyIiwiaXNOdW1iZXIiLCJpc1N0cmluZyIsImx0IiwibHRlIiwidG9BcnJheSIsIml0ZXJhdG9yVG9BcnJheSIsInJlbWFpbmRlciIsInRvTGVuZ3RoIiwiaXNCaW5hcnkiLCJhc3NpZ25JbiIsImFzc2lnbkluV2l0aCIsImFzc2lnbldpdGgiLCJwcm9wc0luZGV4IiwicHJvcHNMZW5ndGgiLCJkZWZhdWx0c0RlZXAiLCJtZXJnZVdpdGgiLCJpbnZlcnQiLCJpbnZlcnRCeSIsImludm9rZSIsIm9taXQiLCJDTE9ORV9ERUVQX0ZMQUciLCJiYXNlUGljayIsInBpY2tCeSIsInRvUGFpcnMiLCJ0b1BhaXJzSW4iLCJjYW1lbENhc2UiLCJ3b3JkIiwiY2FwaXRhbGl6ZSIsInVwcGVyRmlyc3QiLCJrZWJhYkNhc2UiLCJsb3dlckNhc2UiLCJsb3dlckZpcnN0Iiwic25ha2VDYXNlIiwic3RhcnRDYXNlIiwidXBwZXJDYXNlIiwiaGFzVW5pY29kZVdvcmQiLCJ1bmljb2RlV29yZHMiLCJhc2NpaVdvcmRzIiwiYXR0ZW1wdCIsImJpbmRBbGwiLCJtZXRob2ROYW1lcyIsImZsb3ciLCJmbG93UmlnaHQiLCJtZXRob2RPZiIsIm1peGluIiwib3ZlciIsIm92ZXJFdmVyeSIsIm92ZXJTb21lIiwiYmFzZVByb3BlcnR5RGVlcCIsInJhbmdlUmlnaHQiLCJhdWdlbmQiLCJhZGRlbmQiLCJkaXZpZGUiLCJkaXZpZGVuZCIsImRpdmlzb3IiLCJtdWx0aXBseSIsIm11bHRpcGxpZXIiLCJtdWx0aXBsaWNhbmQiLCJzdWJ0cmFjdCIsIm1pbnVlbmQiLCJzdWJ0cmFoZW5kIiwiYWZ0ZXIiLCJjYXN0QXJyYXkiLCJjaHVuayIsImNvbmQiLCJjb25mb3JtcyIsImJhc2VDb25mb3JtcyIsImN1cnJ5IiwiY3VycnlSaWdodCIsImRyb3BSaWdodCIsImRyb3BSaWdodFdoaWxlIiwiZHJvcFdoaWxlIiwiYmFzZUZpbGwiLCJmbGF0TWFwIiwiZmxhdE1hcERlZXAiLCJmbGF0TWFwRGVwdGgiLCJmbGF0dGVuRGVlcCIsImZsYXR0ZW5EZXB0aCIsImZsaXAiLCJmcm9tUGFpcnMiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbnNJbiIsImluaXRpYWwiLCJtYXBLZXlzIiwibWFwVmFsdWVzIiwibWF0Y2hlcyIsIm1hdGNoZXNQcm9wZXJ0eSIsIm50aEFyZyIsIm9taXRCeSIsIm9yZGVyQnkiLCJwcm9wZXJ0eU9mIiwicHVsbEFsbEJ5IiwicHVsbEFsbFdpdGgiLCJzYW1wbGVTaXplIiwic2V0V2l0aCIsInNodWZmbGUiLCJzb3J0ZWRVbmlxIiwic29ydGVkVW5pcUJ5Iiwic2VwYXJhdG9yIiwic3ByZWFkIiwidGFrZSIsInRha2VSaWdodCIsInRha2VSaWdodFdoaWxlIiwidGFrZVdoaWxlIiwidGFwIiwidGhyb3R0bGUiLCJ0b1BhdGgiLCJpc0Fyckxpa2UiLCJ1bmFyeSIsInVuaXFCeSIsInVuaXFXaXRoIiwidW5zZXQiLCJ1cGRhdGUiLCJ1cGRhdGVXaXRoIiwidmFsdWVzSW4iLCJ3cmFwIiwiemlwT2JqZWN0IiwiemlwT2JqZWN0RGVlcCIsImVudHJpZXNJbiIsImV4dGVuZCIsImV4dGVuZFdpdGgiLCJjbG9uZURlZXAiLCJjbG9uZURlZXBXaXRoIiwiY2xvbmVXaXRoIiwiY29uZm9ybXNUbyIsImRlZmF1bHRUbyIsImVuZHNXaXRoIiwiZXNjYXBlIiwiZXNjYXBlUmVnRXhwIiwiZmluZEtleSIsImZpbmRMYXN0S2V5IiwiZm9ySW4iLCJmb3JJblJpZ2h0IiwiZm9yT3duIiwiZm9yT3duUmlnaHQiLCJpblJhbmdlIiwiYmFzZUluUmFuZ2UiLCJpc0Jvb2xlYW4iLCJpc0VsZW1lbnQiLCJpc0VtcHR5IiwiaXNFcXVhbCIsImlzRXF1YWxXaXRoIiwiaXNNYXRjaCIsImlzTWF0Y2hXaXRoIiwiaXNOYXRpdmUiLCJpc05pbCIsImlzTnVsbCIsImlzU2FmZUludGVnZXIiLCJpc1VuZGVmaW5lZCIsImlzV2Vha01hcCIsImlzV2Vha1NldCIsInN0cmljdExhc3RJbmRleE9mIiwibWF4QnkiLCJtZWFuIiwibWVhbkJ5IiwibWluQnkiLCJzdHViT2JqZWN0Iiwic3R1YlN0cmluZyIsInN0dWJUcnVlIiwibnRoIiwibm9Db25mbGljdCIsInN0ckxlbmd0aCIsInBhZEVuZCIsInJhZGl4IiwiZmxvYXRpbmciLCJyZWR1Y2VSaWdodCIsInJlcGVhdCIsInNhbXBsZSIsInNvcnRlZEluZGV4Iiwic29ydGVkSW5kZXhCeSIsInNvcnRlZEluZGV4T2YiLCJzb3J0ZWRMYXN0SW5kZXgiLCJzb3J0ZWRMYXN0SW5kZXhCeSIsInNvcnRlZExhc3RJbmRleE9mIiwic3RhcnRzV2l0aCIsInN1bUJ5IiwidGVtcGxhdGUiLCJpc0VzY2FwaW5nIiwiaXNFdmFsdWF0aW5nIiwiaW1wb3J0cyIsImltcG9ydHNLZXlzIiwiaW1wb3J0c1ZhbHVlcyIsImludGVycG9sYXRlIiwicmVEZWxpbWl0ZXJzIiwiZXZhbHVhdGUiLCJzb3VyY2VVUkwiLCJlc2NhcGVWYWx1ZSIsImludGVycG9sYXRlVmFsdWUiLCJlc1RlbXBsYXRlVmFsdWUiLCJldmFsdWF0ZVZhbHVlIiwidmFyaWFibGUiLCJ0aW1lcyIsInRvTG93ZXIiLCJ0b1NhZmVJbnRlZ2VyIiwidG9VcHBlciIsInRyaW1FbmQiLCJ0cmltU3RhcnQiLCJ0cnVuY2F0ZSIsIm9taXNzaW9uIiwibmV3RW5kIiwidW5pcXVlSWQiLCJlYWNoIiwiZWFjaFJpZ2h0IiwiVkVSU0lPTiIsImlzRmlsdGVyIiwidGFrZU5hbWUiLCJkcm9wTmFtZSIsImNoZWNrSXRlcmF0ZWUiLCJpc1Rha2VyIiwibG9kYXNoRnVuYyIsInJldFVud3JhcHBlZCIsImlzTGF6eSIsInVzZUxhenkiLCJpc0h5YnJpZCIsImlzVW53cmFwcGVkIiwib25seUxhenkiLCJjaGFpbk5hbWUiLCJpc1JpZ2h0IiwiZ2V0VmlldyIsIml0ZXJMZW5ndGgiLCJ0YWtlQ291bnQiLCJpdGVySW5kZXgiLCJjb21taXQiLCJjcmVhdGVTaGlmdEFyciIsInNwYWNlIiwiaXgiLCJ2a2JlYXV0aWZ5IiwiaXNTdWJxdWVyeSIsInBhcmVudGhlc2lzTGV2ZWwiLCJzcGxpdF9zcWwiLCJ0YWIiLCJ4bWwiLCJhciIsImluQ29tbWVudCIsImRlZXAiLCJjc3MiLCJzcWwiLCJhcl9ieV9xdW90ZSIsInhtbG1pbiIsInByZXNlcnZlQ29tbWVudHMiLCJqc29ubWluIiwiY3NzbWluIiwic3FsbWluIiwiY29uZmlybSIsInNwbGl0RGlzYWJsZSIsImNhcHR1cmUiLCJjbGlja2F3YXlIYW5kbGVyIiwicmVzZXRIYW5kbGVyIiwibmNJZCIsInF1ZXVlTWljcm90YXNrIiwiTXV0YXRpb24iLCJNdXRhdGlvbk9ic2VydmVyIiwiV2ViS2l0TXV0YXRpb25PYnNlcnZlciIsImhhbmRsZSIsIm9ic2VydmVyIiwiY3JlYXRlVGV4dE5vZGUiLCJvYnNlcnZlIiwiY2hhcmFjdGVyRGF0YSIsIk1lc3NhZ2VDaGFubmVsIiwiY2hhbm5lbCIsInBvcnQxIiwib25tZXNzYWdlIiwicG9ydDIiLCJwb3N0TWVzc2FnZSIsInNjcmlwdEVsIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJkb2N1bWVudEVsZW1lbnQiLCJwdW55Y29kZSIsInV0aWwiLCJVcmwiLCJzbGFzaGVzIiwiaG9zdG5hbWUiLCJwYXRobmFtZSIsImhyZWYiLCJ1cmxQYXJzZSIsInJlbGF0aXZlIiwicmVzb2x2ZU9iamVjdCIsInByb3RvY29sUGF0dGVybiIsInBvcnRQYXR0ZXJuIiwic2ltcGxlUGF0aFBhdHRlcm4iLCJ1bndpc2UiLCJhdXRvRXNjYXBlIiwibm9uSG9zdENoYXJzIiwiaG9zdEVuZGluZ0NoYXJzIiwiaG9zdG5hbWVQYXJ0UGF0dGVybiIsImhvc3RuYW1lUGFydFN0YXJ0IiwidW5zYWZlUHJvdG9jb2wiLCJob3N0bGVzc1Byb3RvY29sIiwic2xhc2hlZFByb3RvY29sIiwicXVlcnlzdHJpbmciLCJwYXJzZVF1ZXJ5U3RyaW5nIiwic2xhc2hlc0Rlbm90ZUhvc3QiLCJ1IiwicXVlcnlJbmRleCIsInNwbGl0dGVyIiwidVNwbGl0Iiwic2ltcGxlUGF0aCIsImxvd2VyUHJvdG8iLCJhdFNpZ24iLCJob3N0RW5kIiwiaGVjIiwicGFyc2VIb3N0IiwiaXB2Nkhvc3RuYW1lIiwiaG9zdHBhcnRzIiwicGFydCIsIm5ld3BhcnQiLCJ2YWxpZFBhcnRzIiwibm90SG9zdCIsImJpdCIsInRvQVNDSUkiLCJhZSIsImVzYyIsInFtIiwicmVsIiwidGtleXMiLCJ0ayIsInRrZXkiLCJya2V5cyIsInJrIiwicmtleSIsInJlbFBhdGgiLCJpc1NvdXJjZUFicyIsImlzUmVsQWJzIiwibXVzdEVuZEFicyIsInJlbW92ZUFsbERvdHMiLCJzcmNQYXRoIiwicHN5Y2hvdGljIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJhdXRoSW5Ib3N0IiwiaGFzVHJhaWxpbmdTbGFzaCIsInVwIiwiaXNBYnNvbHV0ZSIsInVyaWxpYiIsImhlbHBlcnMiLCJTY2hlbWFTY2FuUmVzdWx0IiwiZm91bmQiLCJyZWYiLCJzY2FuIiwic2NhblNjaGVtYSIsImJhc2V1cmkiLCIkcmVmIiwicmVzb2x2ZWRVcmkiLCJvdXJCYXNlIiwic2NhbkFycmF5IiwiaXRlbXMiLCJleHRlbmRzIiwiYWRkaXRpb25hbEl0ZW1zIiwic2Nhbk9iamVjdCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiZGVmaW5pdGlvbnMiLCJwYXR0ZXJuUHJvcGVydGllcyIsImRlcGVuZGVuY2llcyIsImRpc2FsbG93IiwiYWxsT2YiLCJhbnlPZiIsIm9uZU9mIiwibm90Iiwic3Ryb2tlV2lkdGgiLCJlc2NhcGVLZXlMaXN0ZW5lciIsImluZm9MaXN0ZW5lcnMiLCJlbnRlcktleUxpc3RlbmVyIiwiYXJyb3dLZXlMaXN0ZW5lciIsInNoaWZ0S2V5IiwiYmJveFN5bGxhYmxlcyIsImluZCIsInNlbGVjdGVkU3lsVGV4dCIsInNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJpc1NlbEJ5QkJveCIsInNlbEJ5QkJveCIsInN0b3BQcm9wSGFuZGxlciIsImlzRWxlbWVudEluUmVjdCIsInVsIiwibHIiLCJnZXRCQm94Q29vcmRzIiwiYm94IiwiY2xpY2tIYW5kbGVyIiwiZ2V0VXNlck1vZGUiLCJmaXJzdExpZ2F0dXJlSGFsZiIsInNlY29uZExpZ2F0dXJlSGFsZiIsIm5jSW5kZXgiLCJmaXJzdFVzZSIsImFzc2VydCIsInNlY29uZFVzZSIsImlzTXVsdGlTZWxlY3QiLCJzZWxlY3RlZENsYXNzIiwic2VsQnlTdGFmZiIsInNlbEJ5TmV1bWUiLCJzZWxCeU5jIiwic2VsQnlMYXllckVsZW1lbnQiLCJnZXRTdGFmZkJ5Q29vcmRzIiwiZGlzcGF0Y2hFdmVudCIsIk1vdXNlRXZlbnQiLCJzY3JlZW5YIiwic2NyZWVuWSIsImN0cmxLZXkiLCJhbHRLZXkiLCJudiIsImRoIiwic2VsIiwiaW5pdGlhbFgiLCJwYW5uaW5nIiwiZHJhZ1NlbGVjdGluZyIsImNhbnZhcyIsImRyYWdTZWxlY3RBY3Rpb24iLCJub2RlTmFtZSIsInN0YXJ0RHJhZyIsImluaXRpYWxQIiwiY3VycmVudFB0IiwiY3VyWCIsImN1clkiLCJuZXdYIiwibmV3WSIsImN1cnJlbnRXaWR0aCIsImN1cnJlbnRIZWlnaHQiLCJ1cGRhdGVSZWN0Iiwic2VsZWN0UmVjdCIsInJ4IiwicnkiLCJseCIsImx5Iiwic2VsZWN0ZWRFbGVtZW50cyIsImdldEVsZW1lbnRzQnlTZWxlY3RvciIsInJlc2V0VG8iLCJjb3B5QXR0cmlidXRlcyIsImdldFN5bGxhYmxlVGV4dCIsImNoaWxkTm9kZXMiLCJub2RlVmFsdWUiLCJpc0ludmFsaWRCQm94IiwibWVpIiwiem9uZSIsImlzQWxsWmVybyIsImhhc05lZ2F0aXZlQ29vcmRpbmF0ZXMiLCJjaGVja1ByZWNlZGVzU3lsbGFibGUiLCJzeWxzVGV4dCIsImNoZWNrRm9sbG93c1N5bGxhYmxlIiwiY2hlY2tPYmxpcXVlIiwibmNJZHgiLCJjb2xsZWN0RmFjc0NoaWxkcmVuIiwiYXJyYXkxIiwiYXJyYXkyIiwic3RhZmZCYXNlZE1laSIsIkRPTVBhcnNlciIsInNlcmlhbGl6ZXIiLCJYTUxTZXJpYWxpemVyIiwibWVpRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwibkNvbCIsInNlY3Rpb25zIiwic2VjdGlvbiIsInBiIiwic2IiLCJuZXdTdGFmZiIsImNyZWF0ZUVsZW1lbnROUyIsIm5ld0xheWVyIiwic3VyZmFjZSIsInN1cmZhY2VJZCIsIm5lb25OZXVtZUxpbmVTZWN0aW9ucyIsIm5TdGFmZiIsImxhc3RDYiIsIm5lb25OZXVtZUxpbmVTZWN0aW9uIiwibGF5ZXIiLCJjYWxjdWxhdGVBbmRBZGRab25lIiwiY3VzdG9zIiwibGFzdEVsZW1lbnRDaGlsZCIsImZpcnN0RWxlbWVudENoaWxkIiwic2NvcmVEZWYiLCJjb2xMYXlvdXQiLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJzZXJpYWxpemVUb1N0cmluZyIsInN0YXJ0RWxlbWVudCIsImVuZEVsZW1lbnQiLCJlbGVtZW50c0JldHdlZW4iLCJjb2xsZWN0QWxsRWxlbWVudHNXaXRoRmFjcyIsIm5leHRFbGVtZW50U2libGluZyIsIkJCb3giLCJjYWxjdWxhdGVCQm94IiwiaW5zZXJ0QmVmb3JlIiwic2JCYXNlZE1laSIsImhhc0NvbHMiLCJoYXNJbnZhbGlkQkJveCIsInpvbmVzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbnZhbGlkWm9uZXNJbmZvIiwiaXNJbnZhbGlkIiwiaGFzRW1wdHlTeWxsYWJsZSIsImhhc0VtcHR5TmV1bWUiLCJoYXNJbnZhbGlkRGl2TGluZSIsImludmFsaWREaXZMaW5lSW5mbyIsImhhc0ludmFsaWRBY2NpZCIsImludmFsaWRBY2NpZEluZm8iLCJlbXB0eVN5bGxhYmxlSW5mbyIsImVtcHR5TmV1bWVJbmZvIiwibmV1bWVzIiwibGlxIiwib3JpZ2luYWxTdGF2ZXMiLCJuZXdQYiIsInNiQXJyYXkiLCJvcmlnU3lsbGFibGUiLCJuZXVtZUJlaGluZCIsIm5ldW1lQWhlYWQiLCJjaGlsZEFycmF5Iiwic2JJbmRleCIsIm5ld1N5bGxhYmxlIiwiY2xlZiIsImRlYnVnIiwic2JzIiwibGF5ZXJDaGlsZHJlbiIsImN1cnJlbnRTYiIsIm5leHRTYiIsIm5ld1NiIiwibmV3U2VjdGlvbiIsImN1cnJlbnRJZHgiLCJjYkZhY3MiLCJjYlpvbmUiLCJjaGlsZHJlbkFycmF5IiwiZmFjc0NoaWxkcmVuIiwieiIsIm5ld1N5bGxhYmxlcyIsImludmFsaWRMaW5rZWQiLCJpbnZhbGlkTGlua2VkSW5mbyIsImludmFsaWRPYmxpcXVlIiwiaW52YWxpZE9ibGlxdWVJbmZvIiwib2JsaXF1ZUluZm8iLCJzeWxsYWJsZUlkeCIsIm1laVN0cmluZyIsImRpbWVuc2lvbnMiLCJtZWlMcngiLCJtZWlMcnkiLCJpc091dE9mQm91bmRzIiwiY29vcmQiLCJpc0F0dHJPdXRPZkJvdW5kcyIsIm1laUZvclZhbGlkYXRpb24iLCJzY2hlbWFSZXNwb25zZSIsIndvcmtlciIsInZlcnNpb25GaWVsZCIsInN0YXR1c0ZpZWxkIiwidXBkYXRlU3RhdHVzVUkiLCJsaW5lIiwic3RhdHVzT25DbGljayIsIm1laVZlcnNpb24iLCJtZWlTdGF0dXMiLCJXb3JrZXIiLCJtZWlEYXRhIiwidXBkYXRlVmVyc2lvblVJIiwiZ2V0TWVpVmVyc2lvbiIsInNhdmVkIiwiaW5kaWNhdG9yIiwiYWx0TWVzc2FnZSIsInVwZGF0ZUluZGljYXRvciIsIm9uYmVmb3JldW5sb2FkIiwid2VicGFja1BvbHlmaWxsIiwiZGVwcmVjYXRlIiwiZm9ybWF0QXJncyIsInVzZUNvbG9ycyIsIm5hbWVzcGFjZSIsImh1bWFuaXplIiwibGFzdEMiLCJzYXZlIiwibmFtZXNwYWNlcyIsInN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiREVCVUciLCJfX253anMiLCJXZWJraXRBcHBlYXJhbmNlIiwiZmlyZWJ1ZyIsImV4Y2VwdGlvbiIsInRhYmxlIiwibG9jYWxzdG9yYWdlIiwiY29sb3JzIiwiZm9ybWF0dGVycyIsImFjdGl2YXRlIiwiaW5zZXJ0SGFuZGxlciIsImluc2VydEFjdGl2ZSIsImRlYWN0aXZhdGUiLCJ0YWJJZHMiLCJpbnNlcnRPcHRpb25zIiwiaW5zZXJ0RWxlbWVudHMiLCJiaW5kRWxlbWVudHMiLCJpbnNlcnRQYW5lbCIsImluc2VydEhlYWRpbmciLCJpbnNlcnRIZWFkaW5nVGl0bGUiLCJpbnNlcnRDb250ZW50cyIsImluc2VydERyb3Bkb3duSWNvbiIsImVkaXRQYW5lbCIsImVkaXRIZWFkaW5nIiwiZGlzcGxheUhlYWRpbmdUaXRsZSIsImVkaXRDb250ZW50cyIsImVkaXREcm9wZG93bkljb24iLCJzZWxCeVN5bGxhYmxlIiwiZmlyc3RDbGljayIsImluc2VydERpc2FibGVkIiwicmVtb3ZlSW5zZXJ0Q2xpY2tIYW5kbGVycyIsInJlc2V0SW5zZXJ0SGFuZGxlciIsInN0YWZmSGFuZGxlciIsImVsZW1lbnRUeXBlIiwiYnV0dG9uSWQiLCJhbHJlYWR5SW5JbnNlcnRNb2RlIiwiaXNJbnNlcnRNb2RlIiwidGlsdCIsImZvcm0iLCJhY2NpZCIsImVkaXRNb2RlQnV0dG9uIiwibmF2YmFyRHJvcGRvd25GaWxlTWVudSIsImZpbGVEcm9wZG93bkJ0biIsImZpbGVOYXZiYXJDb250ZW50cyIsIm5hdmJhckRyb3Bkb3duTUVJQWN0aW9uc01lbnUiLCJtZWlBY3Rpb25zRHJvcGRvd25CdG4iLCJtZWlBY3Rpb25zTmF2YmFyQ29udGVudHMiLCJuYXZiYXJGaW5hbGl6ZSIsInVuZG9SZWRvUGFuZWwiLCJhZGRTeWxBY3Rpb24iLCJuYXZiYXJEcm9wZG93bnMiLCJkcm9wRG93biIsImV4cG9ydCIsIm1hbmlmZXN0IiwibGluayIsImRvd25sb2FkIiwiZ2V0UGFnZU1FSSIsImNvbnZlcnRUb05lb24iLCJnZXRQYWdlTmFtZSIsImhhc0VtcHR5U3lsbGFibGVzIiwicmVtb3ZlU3lsbGFibGVBY3Rpb25zIiwiY2hhaW5SZW1vdmVBY3Rpb24iLCJoYXNFbXB0eU5ldW1lcyIsInJlbW92ZU5ldW1lQWN0aW9ucyIsIm91dE9mQm91bmRab25lcyIsInpvbmVNYXAiLCJvdXRPZkJvdW5kR2x5cGhzIiwiZ2x5cGgiLCJmYWNzSWQiLCJoYXNJbnZhbGlkT2JsaXF1ZSIsImludmFsaWRTeWxsYWJsZXMiLCJnZXRJbnZhbGlkU3lsbGFibGVzIiwicHJlY2VkZXNTeWxsYWJsZSIsImZvbGxvd3NTeWxsYWJsZSIsImRlbGV0ZURiIiwibG9jYXRpb24iLCJyZWxvYWQiLCJ1bmRvSGFuZGxlciIsInVuZG8iLCJyZWRvSGFuZGxlciIsInJlZG8iLCJnZXRHZXRQYXJhbSIsIm1hbmlmZXN0TG9jYXRpb24iLCJzdGF0dXNUZXh0IiwiaW1hZ2UiLCJEaXNwbGF5IiwiSW5mbyIsIlRleHRWaWV3IiwiVGV4dEVkaXQiLCJWaWV3IiwiTmV1bWVFZGl0IiwiUmVzcG9uc2UiLCJwYXJzZU1hbmlmZXN0IiwidGV4dFZpZXciLCJ1cGRhdGVCQm94VmlzaWJpbGl0eSIsImNvcmUiLCJWYWxpZGF0aW9uIiwic2V0RGVidWdNb2RlIiwibGlzdGVuVW5zYXZlZENoYW5nZXMiLCJzZXR1cEVkaXQiLCJpbml0RGIiLCJvblNWR0xvYWQiLCJwYWdlTm8iLCJnZXRDdXJyZW50UGFnZSIsImNoYW5nZVBhZ2UiLCJzZXRTYXZlZFN0YXR1cyIsInBhZ2VVUkkiLCJlbGVtZW50SUQiLCJ1cGRhdGVEYXRhYmFzZSIsImdldEFubm90YXRpb25zIiwidGltZXN0YW1wIiwicmVhZEFzRGF0YVVSTCIsImdldE1FSSIsImdldFNWRyIsInZlcm92aW9XcmFwcGVyIiwidW5kb1N0YWNrcyIsInJlZG9TdGFja3MiLCJuZW9uQ2FjaGUiLCJibGFua1BhZ2VzIiwiYW5ub3RhdGlvbnMiLCJtZWlfYW5ub3RhdGlvbnMiLCJsYXN0UGFnZUxvYWRlZCIsImFubm90YXRpb24iLCJ0aW1lWm9uZVJlZ2V4cCIsImdldFRpbWUiLCJuZXdBbm5vdGF0aW9uIiwibG9hZERhdGEiLCJibGFua1BhZ2UiLCJjb252ZXJ0VG9WZXJvdmlvIiwiY2hlY2tPdXRPZkJvdW5kc0dseXBocyIsImRpcnR5Iiwic2VuZEZvclZhbGlkYXRpb24iLCJyZW1vdmVDb2x1bW5MYWJlbCIsInN2ZyIsImxvYWRQYWdlIiwiY3VycmVudE1FSSIsInVuZG9TdGFjayIsInVwZGF0ZUNhY2hlIiwic3ZnVGV4dCIsIm1laVByb21pc2UiLCJzdmdQcm9taXNlIiwidXBkYXRlVGltZXN0YW1wIiwidmVyb3Zpb1dvcmtlciIsIk5lb25TY2hlbWEiLCJOZW9uQ29udGV4dCIsIm1hbmlmZXN0U3RyaW5nIiwiVmFsaWRhdG9yIiwiYXR0cmlidXRlIiwidW5yZXNvbHZlZFJlZnMiLCJ2YWxpZGF0b3JzIiwic2hvdWxkUmVzb2x2ZSIsImFkZFNjaGVtYSIsIm91clVyaSIsImFkZFN1YlNjaGVtYUFycmF5IiwiYWRkU3ViU2NoZW1hIiwiYWRkU3ViU2NoZW1hT2JqZWN0Iiwic2V0U2NoZW1hcyIsImdldFNjaGVtYSIsInVybiIsInNjaCIsInJlcXVpcmVkIiwidmFsaWRhdGVTY2hlbWEiLCJzY2hlbWFvYmoiLCJzY2hlbWFUcmF2ZXJzZXIiLCJzdXBlclJlc29sdmUiLCJzd2l0Y2hTY2hlbWEiLCJyZXNvbHZlZCIsInN1YmN0eCIsInN1YnNjaGVtYSIsInNraXBBdHRyaWJ1dGVzIiwiaWdub3JlUHJvcGVydGllcyIsInZhbGlkYXRvckVyciIsImFsbG93VW5rbm93bkF0dHJpYnV0ZXMiLCJyZXdyaXRlIiwicGFyc2VkIiwiZnJhZ21lbnQiLCJ0ZXN0VHlwZSIsImludGVnZXIiLCJib29sZWFuIiwiZGF0ZSIsImFueSIsIm1heEludCIsInJlZ2V4UHVueWNvZGUiLCJyZWdleE5vbkFTQ0lJIiwicmVnZXhTZXBhcmF0b3JzIiwic3RyaW5nRnJvbUNoYXJDb2RlIiwibWFwRG9tYWluIiwidWNzMmRlY29kZSIsImV4dHJhIiwiY291bnRlciIsInVjczJlbmNvZGUiLCJkaWdpdFRvQmFzaWMiLCJkaWdpdCIsImZsYWciLCJhZGFwdCIsIm51bVBvaW50cyIsImZpcnN0VGltZSIsImJhc2VNaW51c1RNaW4iLCJkZWNvZGUiLCJiYXNpYyIsIm9sZGkiLCJiYXNlTWludXNUIiwiY29kZVBvaW50IiwiaW5wdXRMZW5ndGgiLCJiaWFzIiwiZW5jb2RlIiwiaGFuZGxlZENQQ291bnQiLCJiYXNpY0xlbmd0aCIsInEiLCJoYW5kbGVkQ1BDb3VudFBsdXNPbmUiLCJxTWludXNUIiwicXMiLCJzZXAiLCJtYXhLZXlzIiwia3N0ciIsInZzdHIiLCJ4cyIsInN0cmluZ2lmeVByaW1pdGl2ZSIsIm9iamVjdEtleXMiLCJrcyIsImYiLCJ0ZXN0U2NoZW1hTm9UaHJvdyIsImdldEVudW1lcmFibGVQcm9wZXJ0eSIsInRlc3RBZGRpdGlvbmFsUHJvcGVydHkiLCJwcmVWYWxpZGF0ZVByb3BlcnR5IiwiaW5uZXIiLCJuZXN0ZWRFcnJvcnMiLCJpZiIsImlmVmFsaWQiLCJlbHNlIiwicHJvcGVydHlOYW1lcyIsIl9lIiwibWluUHJvcGVydGllcyIsIm1heFByb3BlcnRpZXMiLCJtaW5pbXVtIiwiZXhjbHVzaXZlTWluaW11bSIsIm1heGltdW0iLCJleGNsdXNpdmVNYXhpbXVtIiwidmFsaWRhdGVNdWx0aXBsZU9mT3JEaXZpc2JsZUJ5IiwidmFsaWRhdGlvblR5cGUiLCJlcnJvck1lc3NhZ2UiLCJ2YWxpZGF0aW9uQXJndW1lbnQiLCJpbnN0YW5jZURlY2ltYWxzIiwiZGl2aXNvckRlY2ltYWxzIiwibWF4RGVjaW1hbHMiLCJwb3ciLCJ0ZXN0QXJyYXlzIiwibXVsdGlwbGVPZiIsImRpdmlzaWJsZUJ5IiwibWluTGVuZ3RoIiwiaHNwIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsInVuaXF1ZUl0ZW1zIiwiZGVwIiwiY2hpbGRDb250ZXh0Iiwibm90VHlwZXMiLCJzY2hlbWFJZCIsInVwZGF0ZURlYnVnTW9kZVN0YXR1cyIsImRlYnVnTW9kZUNoZWNrYm94IiwiZXJyb3JMb2dMYWJlbCIsImluaXRFcnJvckxvZyIsIm1laUNsYXNzIiwiaGFuZGxlWm9vbSIsImRpc3BsYXlDb250cm9sc1BhbmVsIiwibG9hZFNldHRpbmdzIiwiYWRkVXBkYXRlQ2FsbGJhY2siLCJ1cGRhdGVWaXN1YWxpemF0aW9uIiwiRGlzcGxheUNvbnRyb2xzIiwic2V0Wm9vbUNvbnRyb2xzIiwiaW5pdERpc3BsYXlDb250cm9scyIsInVwZGF0ZUNhbGxiYWNrcyIsImRpdmFSZWFkeSIsImRpdmEiLCJvYmplY3REYXRhIiwibWluSGVpZ2h0IiwiaW5kZXhNYXAiLCJkaXNhYmxlRHJhZ1Njcm9sbGFibGUiLCJkaXNwbGF5UGFuZWwiLCJsb2FkRGVsYXkiLCJpbml0RGl2YUV2ZW50cyIsIm9ucmVzaXplIiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwiRXZlbnRzIiwic3Vic2NyaWJlIiwiSUQiLCJkaWRMb2FkIiwiYWRqdXN0Wm9vbSIsInBhZ2VJbmRleCIsImNoZWNrQW5kTG9hZCIsInBhZ2UiLCJnZXRQYWdlU1ZHIiwidXBkYXRlU1ZHIiwiY29udGFpbmVySWQiLCJwYWdlSW5kZXhlcyIsImdldEFjdGl2ZVBhZ2VJbmRleCIsInpvb21EdXJhdGlvbiIsImZpcnN0Q2hpbGQiLCJzZXRWaWV3RXZlbnRIYW5kbGVycyIsImdldFBhZ2VEaW1lbnNpb25zQXRDdXJyZW50Wm9vbUxldmVsIiwidmlld0hhbmRsZXIiLCJfdmlld2VyQ29yZSIsImdldFBhZ2VSZWdpb24iLCJpbmNsdWRlUGFkZGluZyIsImluY29ycG9yYXRlVmlld3BvcnQiLCJtYXJnaW5MZWZ0IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImdldFByb3BlcnR5VmFsdWUiLCJ0b3AiLCJzZXREaXNwbGF5TGlzdGVuZXJzIiwidmlzaWJpbGl0eSIsInNlcXVlbmNlIiwic2VxdWVuY2VzIiwiY2FudmFzZXMiLCJpdGVtVGl0bGUiLCJwYWdlcyIsIl9yYWYiLCJfaXNUb3VjaCIsIl9leHRlbmQiLCJWYW5pbGxhS2luZXRpYyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIkRFRkFVTFRTIiwiQUNUSVZFX0NMQVNTIiwiX2luaXRFbGVtZW50cyIsIl9WYW5pbGxhS2luZXRpYyIsImRlY2VsZXJhdGUiLCJ0cmlnZ2VySGFyZHdhcmUiLCJ0aHJlc2hvbGQiLCJzbG93ZG93biIsIm1heHZlbG9jaXR5IiwidGhyb3R0bGVGUFMiLCJtb3ZpbmdDbGFzcyIsImRvd24iLCJkZWNlbGVyYXRpbmdDbGFzcyIsInZlbG9jaXR5IiwidmVsb2NpdHlZIiwiX21vdmUiLCJzdG9wIiwic3RvcHBlZCIsImRldGFjaCIsIl9kZXRhY2hMaXN0ZW5lcnMiLCJhdHRhY2giLCJfYXR0YWNoTGlzdGVuZXJzIiwieHBvcyIsInByZXZYUG9zIiwieXBvcyIsInByZXZZUG9zIiwibW91c2VEb3duIiwidGhyb3R0bGVUaW1lb3V0IiwibGFzdE1vdmUiLCJlbGVtZW50Rm9jdXNlZCIsImRvY3VtZW50UmVzZXRIYW5kbGVyIiwiX3Jlc2V0TW91c2UiLCJodG1sIiwiX2luaXRFdmVudHMiLCJwcmVmaXhlcyIsInN0eWxlcyIsInRvdWNoU3RhcnQiLCJ0b3VjaCIsIl91c2VUYXJnZXQiLCJvcmlnaW5hbEV2ZW50IiwidG91Y2hlcyIsIl90aHJlc2hvbGQiLCJfc3RhcnQiLCJ0b3VjaE1vdmUiLCJfaW5wdXRtb3ZlIiwiaW5wdXREb3duIiwiaW5wdXRFbmQiLCJfZW5kIiwiaW5wdXRNb3ZlIiwic2Nyb2xsIiwibW92ZWQiLCJpbnB1dENsaWNrIiwiZHJhZ1N0YXJ0Iiwic2VsZWN0U3RhcnQiLCJtb3ZlZFgiLCJtb3ZlZFkiLCJzcXJ0IiwiYmx1ciIsInNjcm9sbExlZnQiLCJzY3JvbGxUb3AiLCJfY2FsY3VsYXRlVmVsb2NpdGllcyIsIl9zZXRNb3ZlQ2xhc3NlcyIsIl9jYXBWZWxvY2l0eSIsImZpbHRlclRhcmdldCIsIl9kZWNlbGVyYXRlVmVsb2NpdHkiLCJuZXdWZWxvY2l0eSIsImNsYXNzZXMiLCJzY3JvbGxlciIsIl9nZXRTY3JvbGxlciIsInNjcm9sbFdpZHRoIiwic2Nyb2xsSGVpZ2h0IiwibW92aW5nIiwibmV3U2Nyb2xsWCIsIm5ld1Njcm9sbFkiLCJfd2luZG93IiwiX2RvY3VtZW50IiwiZHJhZ2dlZCIsIm1kIiwibXUiLCJtbSIsImxhc3RDbGllbnRYIiwibGFzdENsaWVudFkiLCJwdXNoZWQiLCJjb250IiwiZWxlbWVudEZyb21Qb2ludCIsInBhZ2VYIiwicGFnZVkiLCJyZWFkeVN0YXRlIiwicmVzZXREcmFnc2Nyb2xsIiwiY3JlYXRlRGVidWciLCJwcmV2VGltZSIsIm5hbWVzcGFjZXNDYWNoZSIsImVuYWJsZWRDYWNoZSIsImVuYWJsZU92ZXJyaWRlIiwiZW5hYmxlZCIsIm1zIiwiY29lcmNlIiwiZm9ybWF0dGVyIiwic2VsZWN0Q29sb3IiLCJkZWxpbWl0ZXIiLCJuZXdEZWJ1ZyIsInRvTmFtZXNwYWNlIiwiZGlzYWJsZSIsInNraXBzIiwiZW5hYmxlIiwicGx1cmFsIiwibXNBYnMiLCJpc1BsdXJhbCIsImxvbmciLCJmbXRMb25nIiwiZm10U2hvcnQiLCJwYW5lbCIsInNldEF0dHJpYnV0ZU5TIiwicmVwbGFjZUNoaWxkIiwicmVzZXRUcmFuc2Zvcm1hdGlvbnMiLCJfcGFnZSIsIl9kZWxheSIsInJlc3RvcmVUcmFuc2Zvcm1hdGlvbiIsInNldFNlbGVjdExpc3RlbmVycyIsInNjcm9sbFpvb20iLCJuZXdIZWlnaHQiLCJWaWV3Qm94IiwiaW1hZ2VXaWR0aCIsImltYWdlSGVpZ2h0IiwibWluWCIsIm1pblkiLCJ6b29tSGVpZ2h0Iiwiem9vbVdpZHRoIiwiWm9vbUhhbmRsZXIiLCJyZXNldFNldHRpbmdzIiwiYmdpbWciLCJ1cGRhdGVTVkdWaWV3Qm94Iiwic2V0Vmlld0JveCIsInRyYW5zbGF0ZSIsInJhd1ZpZXdCb3giLCJ2aWV3Qm94U3RyaW5nIiwiZHJhZ0Nvb3JkaW5hdGVzIiwiY3JlYXRlU1ZHUG9pbnQiLCJtYXRyaXgiLCJuZXdDb29yZGluYXRlcyIsImRlbHRhWCIsImRlbHRhWSIsIm5ld1RyYW5zZm9ybSIsImRyYWdUcmFuc2Zvcm0iLCJzbGlkZXIiLCJuZXdLIiwiZ2V0Wm9vbSIsImluaXRFZGl0TW9kZSIsImJpbmRJbnNlcnRUYWJzIiwiU2VsZWN0Iiwic2V0U2VsZWN0SGVscGVyT2JqZWN0cyIsImluaXRJbnNlcnRFZGl0Q29udHJvbHMiLCJzZXRTZWxlY3RTdHJva2VXaWR0aCIsImluaXRTZWxlY3Rpb25CdXR0b25zIiwic2V0SGlnaGxpZ2h0U2VsZWN0aW9uQ29udHJvbHMiLCJjbGlja1NlbGVjdCIsImRyYWdTZWxlY3QiLCJpbml0TmF2YmFyIiwiaW5pdFVuZG9SZWRvUGFuZWwiLCJuZXVtZUdyb3VwcyIsInVwZGF0ZUluZm9WaXNpYmlsaXR5IiwiZWxlbWVudEluZm8iLCJ1cGRhdGVEaXNwbGF5QWxsQnRuIiwic2V0SW5mb0NvbnRyb2xzIiwibGFiZWwiLCJyZXNldEluZm9MaXN0ZW5lcnMiLCJpc0hvdmVyaW5nQ2hpbGQiLCJ1cGRhdGVJbmZvIiwic3RvcExpc3RlbmVycyIsImVsZW1lbnRDbGFzcyIsInBpdGNoZXMiLCJnZXRQaXRjaGVzIiwiZGlzIiwiZGlzcGxhY2UiLCJ1cGRhdGVJbmZvTW9kdWxlIiwicGl0Y2hOYW1lVG9OdW0iLCJwbmFtZSIsIm5vdGlmaWNhdGlvblNlbnQiLCJ0ZXh0TGFiZWwiLCJiYm94TGFiZWwiLCJ0ZXh0QnV0dG9uIiwiYmJveEJ1dHRvbiIsInNldFRleHRWaWV3Q29udHJvbHMiLCJ1cGRhdGVUZXh0Vmlld1Zpc2liaWxpdHkiLCJpbml0U2VsZWN0QnlCQm94QnV0dG9uIiwiaW5pdEJCb3hDaXJjbGVTbGlkZXIiLCJnZXRTeWxUZXh0IiwiaW5pdFRleHRFZGl0IiwibHlyaWNzIiwic2VsQnlCQm94TGlzdGVuZXIiLCJhZGRCQm94TGlzdGVuZXJzIiwic3BhbnMiLCJzZWxlY3RTeWxUZXh0IiwiYmxvY2siLCJidXR0b24iLCJzbGlkZXJTZWN0aW9uIiwiY2lyY2xlU2xpZGVyQ29udGFpbmVyIiwic2V0Q2lyY2xlU2l6ZUNvbnRyb2xzIiwiZWx0IiwiaGFuZGxlRWx0Q29uc3RydWN0b3JBcmciLCJjaGlsZENvdW50Iiwic2V0RE9NQXR0cmlidXRlcyIsInNldFN0eWxlIiwiY3NzUHJvcCIsImNzc1RleHQiLCJEaXZhUGFyZW50RWxlbWVudE5vdEZvdW5kRXhjZXB0aW9uIiwiTm90QW5JSUlGTWFuaWZlc3RFeGNlcHRpb24iLCJPYmplY3REYXRhTm90U3VwcGxpZWRFeGNlcHRpb24iLCJfY2FjaGUiLCJ0b3BpYyIsInRoaXNUb3BpYyIsInRoaXNUb3BpY0dsb2JhbCIsImdsb2JhbENvdW50IiwiZ2V0SW5zdGFuY2VJZCIsImluc3RhbmNlSUQiLCJ0aGlzVG9waWNJbnN0YW5jZSIsInNjb3BlZENvdW50IiwiY29tcGxldGVseSIsInRvcGljQXJyYXkiLCJ0b3BpY3MiLCJvbkRvdWJsZUNsaWNrIiwiZ2V0UmVsYXRpdmVPZmZzZXQiLCJ0cmFja2VyIiwiY3JlYXRlRG91YmxlRXZlbnRUcmFja2VyIiwiaXNUcmlnZ2VyZWQiLCJ0cmlnZ2VyIiwib25QaW5jaCIsInN0YXJ0RGlzdGFuY2UiLCJkaXN0YW5jZSIsIm1vdmVEaXN0YW5jZSIsInpvb21EZWx0YSIsInRvdWNoQ2VudGVyIiwib25Eb3VibGVUYXAiLCJmaXJzdFRhcCIsInNlY29uZFRhcCIsImNoYW5nZWRUb3VjaGVzIiwieDEiLCJ5MSIsIngyIiwieTIiLCJ0aW1lb3V0RHVyYXRpb24iLCJ0cmlnZ2VyZWQiLCJ0aW1lb3V0SWQiLCJyZXNldFRpbWVvdXQiLCJwYWdlQ29vcmRzIiwiYm91bmRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwidmlld2VyQ29yZSIsIl9pbm5lckVsZW1lbnQiLCJpbm5lckVsZW1lbnQiLCJfcGFnZVRvb2xzRWxlbSIsImxhYmVsV2lkdGgiLCJfYnV0dG9ucyIsIl9pbml0aWFsaXplUGFnZVRvb2xCdXR0b25zIiwiY2xhc3MiLCJfcGFnZUxhYmVsc0VsZW0iLCJyZWZyZXNoIiwicHVibGljSW5zdGFuY2UiLCJnZXRQdWJsaWNJbnN0YW5jZSIsImdldFBhZ2VUb29scyIsInBhZ2VUb29sc0ljb24iLCJjbG9uZU5vZGUiLCJoYW5kbGVDbGljayIsIl92aWV3ZXJTdGF0ZSIsImdldEludGVybmFsU3RhdGUiLCJfb3ZlcmxheXMiLCJudW1QYWdlcyIsIm92ZXJsYXkiLCJhZGRQYWdlT3ZlcmxheSIsImR1bW15TGFiZWwiLCJjbGllbnRXaWR0aCIsImNvb3JkcyIsIm5ld1pvb21MZXZlbCIsInpvb21MZXZlbCIsImdldFBhZ2VQb3NpdGlvbkF0Vmlld3BvcnRPZmZzZXQiLCJlbmREaXN0YW5jZSIsInZpZXdlclN0YXRlIiwibWluWm9vbUxldmVsIiwibWF4Wm9vbUxldmVsIiwiY2VudGVyT2Zmc2V0IiwiZ2V0Q3VycmVudExheW91dCIsImdldFBhZ2VUb1ZpZXdwb3J0Q2VudGVyT2Zmc2V0IiwiYW5jaG9yUGFnZSIsInZpZXdwb3J0Iiwic2NhbGVSYXRpbyIsImdvRGlyZWN0bHlUbyIsImhvcml6b250YWxPZmZzZXQiLCJ2ZXJ0aWNhbE9mZnNldCIsInB1Ymxpc2giLCJfaGFuZGxlWm9vbUxldmVsQ2hhbmdlIiwiY3VycmVudFBhZ2VJbmRleCIsImFjdGl2ZVBhZ2VJbmRleCIsImZpbGVOYW1lIiwicmVuZGVyZWRQYWdlcyIsInRhcmdldFBhZ2UiLCJjdXJyZW50UGFnZSIsImxheW91dCIsImNlbnRlclkiLCJjZW50ZXJYIiwiY2VudGVyUGFnZSIsImRpbXMiLCJnZXRQYWdlRGltZW5zaW9ucyIsImltYWdlT2Zmc2V0IiwiZ2V0UGFnZU9mZnNldCIsIm1pZFgiLCJtaWRZIiwiZ2V0Q2VudGVybW9zdFBhZ2UiLCJnZXRWaWV3cG9ydCIsImludGVyc2VjdGlvblRvbGVyYW5jZSIsInZpc2libGVQYWdlcyIsInJlbmRlcmVyIiwiaXNQYWdlVmlzaWJsZSIsInNldEN1cnJlbnRQYWdlcyIsIm9sZFpvb21MZXZlbCIsInJlbW92ZVBhZ2VPdmVybGF5IiwiR3JpZEhhbmRsZXIiLCJwYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldCIsImluR3JpZCIsImdldFBhZ2VJbmZvIiwiY2hvc2VuR3JvdXAiLCJyZWdpb24iLCJib3R0b20iLCJ2aWV3cG9ydE1pZGRsZSIsImdyb3VwTWlkZGxlIiwiZ2V0Q2VudGVybW9zdEdyb3VwIiwiUGFnZU92ZXJsYXlNYW5hZ2VyIiwiX3BhZ2VzIiwiX3JlbmRlcmVkUGFnZXMiLCJfcmVuZGVyZWRQYWdlTWFwIiwibW91bnQiLCJvdmVybGF5c0J5UGFnZSIsIm92ZXJsYXlJbmRleCIsInVubW91bnQiLCJwcmV2aW91c2x5UmVuZGVyZWQiLCJuZXdSZW5kZXJlZE1hcCIsIl9pbnZva2VPbk92ZXJsYXlzIiwib3ZlcmxheXMiLCJUaWxlQ292ZXJhZ2VNYXAiLCJjb2xzIiwiX3Jvd3MiLCJfY29scyIsIl9tYXAiLCJjb2wiLCJsZXZlbHMiLCJfbGV2ZWxzIiwidXJsc1RvVGlsZXMiLCJfdXJsc1RvVGlsZXMiLCJsZXZlbCIsInRpbGVzIiwidGlsZSIsImxvYWRlZEJ5TGV2ZWwiLCJfbG9hZGVkQnlMZXZlbCIsImJhc2Vab29tTGV2ZWwiLCJ0b1JlbmRlckJ5TGV2ZWwiLCJoaWdoZXN0Wm9vbUxldmVsIiwiY292ZXJlZCIsImJlc3RMZXZlbEluZGV4IiwiY2VpbExldmVsIiwibG9hZGVkIiwiYWRkaXRpb25hbFRpbGVzIiwiaXNMb2FkZWQiLCJpc05lZWRlZCIsImhpZ2hSZXNSb3ciLCJoaWdoUmVzQ29sIiwiYnlMZXZlbCIsInVybHMiLCJEb2N1bWVudExheW91dCIsImNvbmZpZyIsImNvbXB1dGVkTGF5b3V0Iiwic2NhbGVkTGF5b3V0cyIsInBhZ2VMYXlvdXRzIiwic2NhbGVEaW1lbnNpb25zIiwiZ3JvdXBPZmZzZXQiLCJnZXRTY2FsZWRQYWdlTGF5b3V0cyIsImRvY3VtZW50U2Vjb25kYXJ5RXh0ZW50Iiwic2Vjb25kYXJ5RGltIiwic2Vjb25kYXJ5UGFkZGluZyIsImRvY1BhZGRpbmciLCJ2ZXJ0aWNhbGx5T3JpZW50ZWQiLCJtYXhEaW0iLCJnZXRFeHRlbnRBbG9uZ1NlY29uZGFyeUF4aXMiLCJwcmltYXJ5RG9jUG9zaXRpb24iLCJwYWdlR3JvdXBzIiwicGFnZVBhZGRpbmciLCJnZXRDb21wdXRlZExheW91dCIsIl9wYWdlTG9va3VwIiwicGFnZUxvb2t1cCIsImdldFBhZ2VMb29rdXAiLCJnZXRQYWdlUmVnaW9uRnJvbVBhZ2VJbmZvIiwicGFnZUluZm8iLCJlbGVtZW50V2lkdGgiLCJlbGVtZW50SGVpZ2h0IiwiSW1hZ2VDYWNoZSIsIl9oZWxkIiwiX3VybHMiLCJfbHJ1IiwicmVjb3JkIiwiaW1nIiwiX3Byb21vdGUiLCJfdHJ5RXZpY3QiLCJleHRyYUNhcGFjaXR5IiwiYWxsb3dlZEVudHJ5Q291bnQiLCJldmljdGlvbkluZGV4IiwiSW1hZ2VSZXF1ZXN0SGFuZGxlciIsIl91cmwiLCJfY2FsbGJhY2siLCJfZXJyb3JDYWxsYmFjayIsInRpbWVvdXRUaW1lIiwiX2Fib3J0ZWQiLCJfY29tcGxldGUiLCJfY3Jvc3NPcmlnaW4iLCJpbWFnZUNyb3NzT3JpZ2luIiwiX2ltYWdlIiwiSW1hZ2UiLCJjcm9zc09yaWdpbiIsIm9ubG9hZCIsIl9oYW5kbGVMb2FkIiwiX2hhbmRsZUVycm9yIiwiYW5pbWF0ZSIsImR1cmF0aW9uTXMiLCJkdXJhdGlvbiIsInBhcmFtZXRlcnMiLCJvblVwZGF0ZSIsIm9uRW5kIiwidHdlZW5GbnMiLCJwYXJhbUtleXMiLCJlYXNpbmciLCJlbGFwc2VkIiwiaW5PdXRDdWJpY0Vhc2luZyIsInJlcXVlc3RJZCIsInVwZGF0ZVZhbHVlcyIsImhhbmRsZUFuaW1hdGlvbkNvbXBsZXRpb24iLCJpbnRlcnJ1cHRlZCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwibGluZWFyIiwiY3ViaWMiLCJwZXJmb3JtYW5jZSIsImhvb2tzIiwiX3ZpZXdwb3J0IiwiX291dGVyRWxlbWVudCIsIm91dGVyRWxlbWVudCIsIl9kb2N1bWVudEVsZW1lbnQiLCJfc2V0dGluZ3MiLCJfaG9va3MiLCJfY2FudmFzIiwiX2N0eCIsImdldENvbnRleHQiLCJfc291cmNlUmVzb2x2ZXIiLCJfY29uZmlnIiwiX3pvb21MZXZlbCIsIl9jb21wb3NpdGVJbWFnZXMiLCJfcmVuZGVyZWRUaWxlcyIsIl9hbmltYXRpb24iLCJfcGVuZGluZ1JlcXVlc3RzIiwiSFRNTENhbnZhc0VsZW1lbnQiLCJ2aWV3cG9ydFBvc2l0aW9uIiwic291cmNlUmVzb2x2ZXIiLCJfY2xlYXJBbmltYXRpb24iLCJvblZpZXdXaWxsTG9hZCIsIl9zZXRMYXlvdXRUb1pvb21MZXZlbCIsImdvdG8iLCJvblZpZXdEaWRMb2FkIiwiX2dvdG8iLCJzZXRJbm5lckRpbWVuc2lvbnMiLCJfcmVuZGVyIiwib25WaWV3RGlkVXBkYXRlIiwibmV3UmVuZGVyZWRQYWdlcyIsImludGVyc2VjdHNSZWdpb24iLCJjbGVhclJlY3QiLCJfcGFpbnRPdXRsaW5lIiwiem9vbUxldmVscyIsImdldEFsbFpvb21MZXZlbHNGb3JQYWdlIiwiY29tcG9zaXRlIiwidXBkYXRlRnJvbUNhY2hlIiwiX2luaXRpYXRlVGlsZVJlcXVlc3RzIiwiZmluZENoYW5nZXMiLCJfcGFpbnQiLCJvblBhZ2VXaWxsTG9hZCIsImFkZGVkIiwicmVuZGVyZWRUaWxlcyIsImdldFRpbGVzIiwic2NhbGVkIiwiZ2V0U2NhbGVkVGlsZVJlY29yZCIsIl9pc1RpbGVWaXNpYmxlIiwiX2RyYXdUaWxlIiwiYWNxdWlyZSIsInJlbGVhc2UiLCJwYWdlT2Zmc2V0IiwiX2dldEltYWdlT2Zmc2V0Iiwidmlld3BvcnRQYWRkaW5nWCIsInZpZXdwb3J0UGFkZGluZ1kiLCJ2aWV3cG9ydE9mZnNldFgiLCJ2aWV3cG9ydE9mZnNldFkiLCJkZXN0WE9mZnNldCIsImRlc3RZT2Zmc2V0IiwiY2FudmFzWCIsImNhbnZhc1kiLCJkZXN0V2lkdGgiLCJkZXN0SGVpZ2h0Iiwic3Ryb2tlU3R5bGUiLCJzdHJva2VSZWN0IiwibmV3UGVuZGluZ1JlcXVlc3RzIiwiaW5pdGlhdGVSZXF1ZXN0IiwidXBkYXRlV2l0aExvYWRlZFVybHMiLCJfaXNUaWxlRm9yU291cmNlVmlzaWJsZSIsImdldEJlc3Rab29tTGV2ZWxGb3JQYWdlIiwic2NhbGVkVGlsZSIsInRpbGVPZmZzZXQiLCJfZ2V0VGlsZVRvRG9jdW1lbnRPZmZzZXQiLCJzb3VyY2VYT2Zmc2V0Iiwic291cmNlWU9mZnNldCIsImRlc3RJbWdXaWR0aCIsImRlc3RJbWdIZWlnaHQiLCJzb3VyY2VXaWR0aCIsInNvdXJjZUhlaWdodCIsImRyYXdJbWFnZSIsInRpbGVTb3VyY2UiLCJnZXRQb3NpdGlvbiIsIm9uVmlld0RpZFRyYW5zaXRpb24iLCJfc2V0Vmlld3BvcnRQb3NpdGlvbiIsIm9uWm9vbUxldmVsV2lsbENoYW5nZSIsInNjYWxlRmFjdG9yIiwic291cmNlWm9vbUxldmVsIiwibmV3QXJyYXkiLCJvbGRFbnRyeSIsIm5ld0VudHJ5IiwiZ2V0TWF4UGFnZURpbWVuc2lvbnMiLCJnZXRCb29rTGF5b3V0R3JvdXBzIiwidmlld2VyQ29uZmlnIiwicGFnZXNCeUdyb3VwIiwibGVmdFBhZ2UiLCJub25QYWdlZFBhZ2VzIiwiX2FkZE5vblBhZ2VkUGFnZXMiLCJubGVuIiwicGFnZVJlY29yZCIsInBhZ2VkIiwic2hvd05vblBhZ2VkUGFnZXMiLCJmYWNpbmdQYWdlcyIsImdldEdyb3VwaW5ncyIsInJpZ2h0UGFnZSIsImxlZnREaW1zIiwicmlnaHREaW1zIiwiZmlyc3RMZWZ0T2Zmc2V0Iiwic2Vjb25kTGVmdE9mZnNldCIsIm1pZFdpZHRoIiwiZ2V0RmFjaW5nUGFnZUdyb3VwIiwicGFnZURpbXMiLCJsZWZ0T2Zmc2V0Iiwic2hvdWxkQmVIb3Jpem9udGFsbHlBZGp1c3RlZCIsImdldEdyb3VwTGF5b3V0c0Zyb21QYWdlR3JvdXBpbmciLCJnZXRHcmlkTGF5b3V0R3JvdXBzIiwidmlld3BvcnRXaWR0aCIsInBhZ2VzUGVyUm93IiwiZml4ZWRIZWlnaHRHcmlkIiwiZml4ZWRQYWRkaW5nIiwicGFnZVdpZHRoIiwiZ3JpZFBhZ2VXaWR0aCIsInJvd0hlaWdodCIsIm1pblJhdGlvIiwibWF4UmF0aW8iLCJjdXJyZW50UGFnZXMiLCJyb3dEaW1lbnNpb25zIiwicGFnZURpbWVucyIsInBhZ2VEYXRhIiwicGFnZURpbWVuRGF0YSIsImhlaWdodFRvV2lkdGhSYXRpbyIsInBhZ2VIZWlnaHQiLCJnZXRHcmlkUGFnZURpbWVuc2lvbnMiLCJnZXRQYWdlTGF5b3V0cyIsInBsdWNrIiwiaW5Cb29rTGF5b3V0IiwiZ2V0U2luZ2xlc0xheW91dEdyb3VwcyIsImNyZWF0ZVNldHRpbmdzVmlldyIsInJlZ2lzdGVyTWl4aW4iLCJWYWxpZGF0aW9uUnVubmVyIiwid2hpdGVsaXN0ZWRLZXlzIiwidmFsaWRhdGlvbnMiLCJ2YWxpZGF0aW9uSW5kZXgiLCJ2YWxpZGF0aW9uIiwiZHVtbXlDaGFuZ2VzIiwicHJveGllciIsImNyZWF0ZVNldHRpbmdzUHJveGllciIsIl9ydW5WYWxpZGF0aW9uIiwiX3ZhbGlkYXRlT3B0aW9ucyIsImNsb25lZCIsInNldHRpbmdzUHJveGllciIsIl9hcHBseVZhbGlkYXRpb25zIiwiY29ycmVjdGVkIiwid2FybmluZ1N1cHByZXNzZWQiLCJvcmlnaW5hbCIsImVtaXRXYXJuaW5nIiwic3VwcHJlc3NXYXJuaW5nIiwib3V0cHV0VmFsdWUiLCJwcm94eSIsInJ1bm5lciIsImxvb2t1cCIsImxvb2t1cFZhbHVlIiwid2hpdGVsaXN0ZWQiLCJhZGRpdGlvbmFsIiwiY3VycmVudEtleSIsImRlZmluZVByb3BlcnRpZXMiLCJleHRlbnNpb24iLCJWaWV3cG9ydCIsIl90b3AiLCJfbGVmdCIsIl93aWR0aCIsIl9oZWlnaHQiLCJfaW5uZXJEaW1lbnNpb25zIiwiaW52YWxpZGF0ZSIsImhhc0hvcml6b250YWxPdmVybGFwIiwiaGFzVmVydGljYWxPdmVybGFwIiwiZmFsbHNCZXR3ZWVuIiwiY2xpZW50SGVpZ2h0IiwiZ2V0Q29vcmRpbmF0ZURlc2NyaXB0b3IiLCJhc3NvY2lhdGVkRGltZW5zaW9uIiwicHJpdmF0ZVByb3AiLCJjbGFtcE1pbiIsImdldERpbWVuc2lvbkRlc2NyaXB0b3IiLCJkaW1lbiIsImNsYW1wTWF4IiwiZ2VuZXJhdGVJZCIsIm9wdGlvbnNWYWxpZGF0aW9ucyIsIm1pblBhZ2VzUGVyUm93IiwibWF4UGFnZXNQZXJSb3ciLCJtYXhab29tIiwicGFyZW50T2JqZWN0IiwiY3VycmVudFBhZ2VJbmRpY2VzIiwiaG9yaXpvbnRhbFBhZGRpbmciLCJpbml0aWFsS2V5U2Nyb2xsIiwiaW5pdGlhbFNwYWNlU2Nyb2xsIiwiaW5uZXJPYmplY3QiLCJpc0FjdGl2ZURpdmEiLCJpc1Njcm9sbGFibGUiLCJpc1pvb21pbmciLCJtb2JpbGVXZWJraXQiLCJvdXRlck9iamVjdCIsInBhZ2VPdmVybGF5cyIsInBhZ2VUb29scyIsInBlbmRpbmdNYW5pZmVzdFJlcXVlc3QiLCJwbHVnaW5JbnN0YW5jZXMiLCJyZXNpemVUaW1lciIsInNjcm9sbGJhcldpZHRoIiwidGhyb2JiZXJUaW1lb3V0SUQiLCJ0b29sYmFyIiwidmVydGljYWxQYWRkaW5nIiwidmlld3BvcnRPYmplY3QiLCJpZE51bWJlciIsInBhbmVsSGVpZ2h0IiwicGFuZWxXaWR0aCIsIm9wdGlvbnNWYWxpZGF0b3IiLCJ3MSIsIm9mZnNldFdpZHRoIiwidzIiLCJnZXRTY3JvbGxiYXJXaWR0aCIsIm9yaWVudGF0aW9uIiwiaGFzaFBhcmFtU3VmZml4IiwiaW5uZXJFbGVtIiwiZWxlbUF0dHJzIiwidmlld3BvcnRFbGVtIiwib3V0ZXJFbGVtIiwidmlld3BvcnRNYXJnaW4iLCJib3VuZFNjcm9sbEZ1bmN0aW9uIiwic2Nyb2xsRnVuY3Rpb24iLCJib3VuZEVzY2FwZUxpc3RlbmVyIiwiZXNjYXBlTGlzdGVuZXIiLCJpbml0UGx1Z2lucyIsImhhbmRsZUV2ZW50cyIsInNob3dUaHJvYmJlciIsImlzVmFsaWQiLCJpZGVudCIsImF0dHJzIiwia2V5Q29kZSIsImxlYXZlRnVsbHNjcmVlbk1vZGUiLCJuZXdPcHRpb25zIiwicXVldWVkRXZlbnRzIiwiZ2V0VmFsaWRhdGVkT3B0aW9ucyIsImhhc0NoYW5nZWRPcHRpb24iLCJpbkZ1bGxzY3JlZW4iLCJwcmVwYXJlTW9kZUNoYW5nZSIsImNsZWFyVmlld2VyIiwidXBkYXRlVmlld0hhbmRsZXJBbmRSZW5kZXJpbmciLCJyZW5kZXJlckNvbmZpZyIsImdldFBhZGRpbmciLCJzb3VyY2VQcm92aWRlciIsImdldEN1cnJlbnRTb3VyY2VQcm92aWRlciIsInNlcmlhbGl6ZWQiLCJjaGFuZ2VDbGFzcyIsInN0b3JlZEhlaWdodCIsInN0b3JlZFdpZHRoIiwibmV3V2lkdGgiLCJIYW5kbGVyIiwiaW5pdGlhbGl6ZVJlbmRlcmVyIiwiY29tcGF0RXJyb3JzIiwiZ2V0Q29tcGF0aWJpbGl0eUVycm9ycyIsInNob3dFcnJvciIsInVwZGF0ZVBhZ2VPdmVybGF5cyIsImdyaWRTb3VyY2VQcm92aWRlciIsImdldFBhZ2VJbWFnZVVSTCIsInRpbGVEaW1lbnNpb25zIiwidGlsZVdpZHRoIiwidGlsZUhlaWdodCIsImdldFBhZ2VJbWFnZVRpbGVzIiwibGV2ZWxDb3VudCIsInRvcFBhZGRpbmciLCJsZWZ0UGFkZGluZyIsImRvY1ZQYWRkaW5nIiwiZG9jSFBhZGRpbmciLCJ1cGRhdGVPdmVybGF5cyIsImdldFJlbmRlcmVkUGFnZXMiLCJmb2NhbFBvaW50IiwiaXNWYWxpZE9wdGlvbiIsImN1cnJlbnRSZWdpb24iLCJwYWdlUmVnaW9uIiwiZm9jYWxYVG9DZW50ZXIiLCJmb2NhbFlUb0NlbnRlciIsImdldFBvc2l0aW9uRm9yWm9vbUxldmVsIiwiaW5pdFpvb20iLCJ6b29tUmF0aW8iLCJpbml0aWFsWm9vbUxldmVsIiwiZW5kUG9zaXRpb24iLCJ0cmFuc2l0aW9uVmlld3BvcnRQb3NpdGlvbiIsInpvb21JbkJ1dHRvbiIsInpvb21PdXRCdXR0b24iLCJhbmNob3IiLCJwaWR4IiwiZ2V0UGFnZURhdGEiLCJ1cGRhdGVPZmZzZXRzIiwidXBkYXRlUGFuZWxTaXplIiwicmVsb2FkVmlld2VyIiwiYmxvY2tNb2JpbGVNb3ZlIiwicHJldmlvdXNUb3BTY3JvbGwiLCJwcmV2aW91c0xlZnRTY3JvbGwiLCJuZXdTY3JvbGxUb3AiLCJuZXdTY3JvbGxMZWZ0IiwiYWRqdXN0IiwicHJpbWFyeVNjcm9sbCIsImJpbmRNb3VzZUV2ZW50cyIsImVuYWJsZVNwYWNlU2Nyb2xsIiwiZW5hYmxlS2V5U2Nyb2xsIiwiYXJyb3dTY3JvbGxBbW91bnQiLCJvblJlc2l6ZSIsInBsdWdpbnMiLCJpc1BhZ2VUb29sIiwiaGlkZVRocm9iYmVyIiwidGhiIiwidGhyb2JiZXJUaW1lb3V0IiwiZXJyb3JFbGVtZW50IiwibG9hZE9wdGlvbnMiLCJhZGFwdGl2ZVBhZGRpbmciLCJnZXRBdmVyYWdlV2lkdGgiLCJnZXRBdmVyYWdlSGVpZ2h0IiwibmVlZHNYQ29vcmQiLCJuZWVkc1lDb29yZCIsImFuY2hvcmVkVmVydGljYWxseSIsImFuY2hvcmVkSG9yaXpvbnRhbGx5IiwiZ2V0WE9mZnNldCIsImdldFlPZmZzZXQiLCJlbmFibGVBdXRvVGl0bGUiLCJtaW5XaWR0aCIsImFkZE92ZXJsYXkiLCJyZW1vdmVPdmVybGF5IiwiZG9jT2Zmc2V0IiwiZG9jQ29vcmRzIiwicGFnZUNvdW50IiwiYWN0aXZlUGFnZSIsImFycmF5c0VxdWFsIiwib3RoZXJJbWFnZXMiLCJlbmFibGVEcmFnU2Nyb2xsYWJsZSIsImRibGNsaWNrIiwiY29udGV4dG1lbnUiLCJyZW1vdmVDbGFzcyIsInJlbW92ZURhdGEiLCJyZW1vdmVBdHRyIiwidW5zdWJzY3JpYmVBbGwiLCJwYXJzZUxhYmVsVmFsdWUiLCJnZXRNYXhab29tTGV2ZWwiLCJsYXJnZXN0RGltZW5zaW9uIiwiaW5jb3Jwb3JhdGVab29tIiwiaW1hZ2VEaW1lbnNpb24iLCJ6b29tRGlmZmVyZW5jZSIsImdldE90aGVySW1hZ2VEYXRhIiwibG93ZXN0TWF4Wm9vbSIsIml0bSIsInBhcnNlSW1hZ2VJbmZvIiwiaWwiLCJwYXJzZUlJSUZNYW5pZmVzdCIsImdldElJSUZQcmVzZW50YXRpb25WZXJzaW9uIiwibnVtQ2FudmFzZXMiLCJ0aGlzQ2FudmFzIiwidGhpc1Jlc291cmNlIiwidGhpc0ltYWdlIiwic2Vjb25kYXJ5SW1hZ2VzIiwiaW1hZ2VBUElWZXJzaW9uIiwiaW1hZ2VMYWJlbCIsInpvb21EaW1lbnNpb25zIiwid2lkdGhBdEN1cnJlbnRab29tTGV2ZWwiLCJoZWlnaHRBdEN1cnJlbnRab29tTGV2ZWwiLCJteiIsInJhdGlvIiwidG90YWxXaWR0aHMiLCJ0b3RhbEhlaWdodHMiLCJtYXhXaWR0aHMiLCJtYXhIZWlnaHRzIiwiaW1hZ2VzIiwicmVzb3VyY2UiLCJzZXJ2aWNlIiwiaXNQYWdlZCIsInZpZXdpbmdIaW50IiwiaXNGYWNpbmciLCJ4b2Zmc2V0IiwieW9mZnNldCIsImF2ZXJhZ2VXaWR0aHMiLCJhdmVyYWdlSGVpZ2h0cyIsImFfd2lkIiwiYV9oZWkiLCJtYXhfdyIsIm1heF9oIiwibWF4X3JhdGlvIiwibWluX3JhdGlvIiwidF9oZWkiLCJ0X3dpZCIsIml0ZW1fdGl0bGUiLCJtYXhfem9vbSIsInBncyIsImJlaGF2aW91ciIsImZyYWdtZW50UmVnZXgiLCJ4eXdoIiwic3RyaXBVUkwiLCJ1cmxBcnJheSIsImltYWdlSW5mbyIsIklJSUZTb3VyY2VBZGFwdGVyIiwiZGltZW5zIiwicXVhbGl0eSIsInJvd0NvdW50IiwiY29sQ291bnQiLCJ1cmxBZGFwdGVyIiwiX21heFdpZHRocyIsIl9tYXhIZWlnaHRzIiwiX2F2ZXJhZ2VXaWR0aHMiLCJfYXZlcmFnZUhlaWdodHMiLCJfdG90YWxIZWlnaHRzIiwiX3RvdGFsV2lkdGhzIiwiX3VybEFkYXB0ZXIiLCJpaWlmTWFuaWZlc3QiLCJtYXhEaW1zIiwidGFyZ2V0Wm9vbUxldmVsIiwiZ2V0VGlsZUltYWdlVVJMIiwiem9vbWVkUHJvcGVydHlHZXR0ZXIiLCJwcml2YXRlTmFtZSIsImdldE1heFdpZHRoIiwiZ2V0TWF4SGVpZ2h0IiwiZ2V0VG90YWxXaWR0aCIsImdldFRvdGFsSGVpZ2h0Iiwidmlld2VyIiwiaWNvbiIsImlubmVyTmFtZSIsImlubmVyVmFsdWUiLCJ6b29tT3V0SWNvbiIsIl9jcmVhdGVab29tT3V0SWNvbiIsInpvb21Jbkljb24iLCJfY3JlYXRlWm9vbUluSWNvbiIsInpvb21CdXR0b25zIiwiY3JlYXRlQnV0dG9uIiwic2V0Wm9vbUxldmVsIiwiY3JlYXRlTGFiZWwiLCJfc3Vic2NyaWJlIiwiZ3JpZE1vcmVJY29uIiwiX2NyZWF0ZUdyaWRNb3JlSWNvbiIsImdyaWRGZXdlckljb24iLCJfY3JlYXRlR3JpZEZld2VySWNvbiIsImdyaWRCdXR0b25zIiwic2V0R3JpZFBhZ2VzUGVyUm93IiwidXBkYXRlQ3VycmVudFBhZ2UiLCJpbmRpY2VzIiwiZ2V0Q3VycmVudFBhZ2VJbmRpY2VzIiwic3RhcnRJbmRleCIsImVuZEluZGV4Iiwic3RhcnRMYWJlbCIsImVuZExhYmVsIiwiZW5hYmxlSW5kZXhBc0xhYmVsIiwiZ290b1BhZ2VJbnB1dCIsImF1dG9jb21wbGV0ZSIsImdvdG9QYWdlU3VibWl0IiwiaW5wdXRTdWdnZXN0aW9ucyIsImdvdG9Gb3JtIiwiZGVzaXJlZFBhZ2VMYWJlbCIsIm9uR290b1N1Ym1pdCIsImdvdG9QYWdlQnlJbmRleCIsImFsZXJ0IiwiZ290b1BhZ2VCeUxhYmVsIiwibnVtU3VnZ2VzdGlvbnMiLCJlbmFibGVHb3RvU3VnZ2VzdGlvbnMiLCJuZXdJbnB1dFN1Z2dlc3Rpb24iLCJhY3RpdmUiLCJwcmV2RWwiLCJuZXh0RWwiLCJzdWJtaXRFdmVudCIsIkV2ZW50IiwiY2FuY2VsYWJsZSIsInZpZXdPcHRpb25zTGlzdCIsIl9lbGVtQXR0cnMiLCJncmlkVmlld0ljb24iLCJfY3JlYXRlR3JpZFZpZXdJY29uIiwiYm9va1ZpZXdJY29uIiwiX2NyZWF0ZUJvb2tWaWV3SWNvbiIsInBhZ2VWaWV3SWNvbiIsIl9jcmVhdGVQYWdlVmlld0ljb24iLCJjaGFuZ2VWaWV3QnV0dG9uIiwic2VsZWN0VmlldyIsImNoYW5nZVZpZXciLCJ1cGRhdGVWaWV3TWVudSIsInZpZXdPcHRpb25zIiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsImZ1bGxzY3JlZW5JY29uIiwiX2NyZWF0ZUZ1bGxzY3JlZW5JY29uIiwidG9nZ2xlRnVsbHNjcmVlbk1vZGUiLCJ0b2dnbGVab29tR3JpZENvbnRyb2xzIiwibGVmdFRvb2xzIiwiY3JlYXRlWm9vbUJ1dHRvbnMiLCJjcmVhdGVHcmlkQ29udHJvbHMiLCJyaWdodFRvb2xzIiwiY3JlYXRlUGFnZUxhYmVsIiwiY3JlYXRlVmlld01lbnUiLCJlbmFibGVGdWxsc2NyZWVuIiwiY3JlYXRlRnVsbHNjcmVlbkJ1dHRvbiIsImVuYWJsZUdvdG9QYWdlIiwiY3JlYXRlR290b1BhZ2VGb3JtIiwidG9vbGJhclNpZGUiLCJ0b29sYmFySWNvbiIsImNyZWF0ZUljb24iLCJoYW5kbGVQbHVnaW5DbGljayIsInRvb2xzIiwidG9vbGJhclBhcmVudE9iamVjdCIsInBFbCIsIl9jcmVhdGVUb29sYmFySWNvbiIsImdldEhhc2hQYXJhbSIsIm9yaWdpbmFsVmFsdWUiLCJzdGFydFRoaW5nIiwiSFRNTEVsZW1lbnQiLCJlbmFibGVGaWxlbmFtZSIsImVuYWJsZUdyaWRJY29uIiwiZW5hYmxlR3JpZENvbnRyb2xzIiwiZW5hYmxlSW1hZ2VUaXRsZXMiLCJlbmFibGVMaW5rSWNvbiIsImVuYWJsZU5vblBhZ2VkVmlzaWJpbGl0eUljb24iLCJlbmFibGVUb29sYmFyIiwiZW5hYmxlWm9vbUNvbnRyb2xzIiwiZmlsbFBhcmVudEhlaWdodCIsInBhZ2VBbGlhc2VzIiwicGFnZUFsaWFzRnVuY3Rpb24iLCJwYWdlTG9hZFRpbWVvdXQiLCJyZXF1ZXN0SGVhZGVycyIsIndyYXBwZXJFbGVtZW50IiwiZGl2YVN0YXRlIiwicmVuZGVyIiwidW5zdWJzY3JpYmUiLCJoYXNoU3RhdGUiLCJfZ2V0SGFzaFBhcmFtU3RhdGUiLCJfbG9hZE9yRmV0Y2hPYmplY3REYXRhIiwiX2xvYWRPYmplY3REYXRhIiwiX2FqYXhFcnJvciIsInNldFBlbmRpbmdNYW5pZmVzdFJlcXVlc3QiLCJqc29uSG9zdCIsIl9zaG93RXJyb3IiLCJyZXNwb25zZURhdGEiLCJmcm9tSUlJRiIsIl9nZXRMb2FkT3B0aW9uc0ZvclN0YXRlIiwic2V0TWFuaWZlc3QiLCJfZ2V0Vmlld1N0YXRlIiwiX2dldFBhZ2VJbmRleEZvck1hbmlmZXN0IiwibnAiLCJoYXNoUGFyYW1zIiwiX2dldFN0YXRlIiwiaGFzaFN0cmluZ0J1aWxkZXIiLCJfcmVsb2FkVmlld2VyIiwiaG92ZXIiLCJ0b2dnbGVPcGFjaXR5IiwiZGVzdGluYXRpb25WaWV3IiwieEFuY2hvciIsInlBbmNob3IiLCJfaXNQYWdlSW5kZXhWYWxpZCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiaXNQYWdlVmFsaWQiLCJvdXRlck9mZnNldCIsIm91dGVyVG9wIiwib3V0ZXJMZWZ0Iiwib3V0ZXJCb3R0b20iLCJvdXRlclJpZ2h0IiwiY3VyUGFnZUlkeCIsImN1clBhZ2UiLCJjdXJPZmZzZXQiLCJfZ2V0VVJMSGFzaCIsIl9jaGFuZ2VWaWV3IiwiZGlzYWJsZVNjcm9sbGFibGUiLCJlbmFibGVTY3JvbGxhYmxlIiwiX3RvZ2dsZUZ1bGxzY3JlZW4iLCJwZyIsIl9nZXRDdXJyZW50VVJMIiwicGFnZUlkeCIsIl9jaGVja0xvYWRlZCIsInBnQXRab29tIiwiX2dldFBhZ2VJbmRleEZvclBhZ2VYWVZhbHVlcyIsIl9nb3RvUGFnZUJ5SW5kZXgiLCJsbGMiLCJfZ2V0UGFnZUluZGV4IiwidG9wT2Zmc2V0IiwiX3RvZ2dsZVBhZ2VMYXlvdXRPcmllbnRhdGlvbiIsIkRpdmEiXSwibWFwcGluZ3MiOiJhQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFT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QUFLLElBQVEsSUFBSyxJQUFRLElBQ2hELElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFDaEQsSUFBUSxJQUFNLElBQVEsSUFDdEIsSUFBUSxJQUFNLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQzFFLElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUMxRSxJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQ2hELElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFDaEQsSUFBUSxJQUFNLElBQVEsSUFBSyxJQUFRLElBQ25DLElBQVEsS0FBTSxJQUFRLEtBQ3RCLElBQVEsS0FBTSxJQUFRLEtBQ3RCLElBQVEsS0FFUixJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3ZFLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3ZFLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3ZFLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3ZFLElBQVUsSUFBTSxJQUFVLElBQzFCLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN0RixJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDdEYsSUFBVSxJQUFNLElBQVUsSUFDMUIsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxLQUFNLElBQVUsS0FDMUIsSUFBVSxLQUFNLElBQVUsS0FDMUIsSUFBVSxLQUFNLElBQVUsTUFvdUJ4QmdCLEdBQWlCaEIsR0FodUJILENBQ2hCLElBQUssUUFDTCxJQUFLLE9BQ0wsSUFBSyxPQUNMLElBQUssU0FDTCxJQUFLLFVBb3VCUCxTQUFTaUIsR0FBaUJDLEdBQ3hCLE1BQU8sS0FBTzNFLEdBQWMyRSxHQXNCOUIsU0FBU0MsR0FBVzNvQyxHQUNsQixPQUFPeWpDLEdBQWFyaUUsS0FBSzQrQixHQXNDM0IsU0FBUzRvQyxHQUFXLzhELEdBQ2xCLElBQUlyTSxHQUFTLEVBQ1RrYSxFQUFTOWIsTUFBTWlPLEVBQUlrQixNQUt2QixPQUhBbEIsRUFBSTVGLFNBQVEsU0FBUzlOLEVBQU9NLEdBQzFCaWhCLElBQVNsYSxHQUFTLENBQUMvRyxFQUFLTixNQUVuQnVoQixFQVdULFNBQVNtdkQsR0FBUTN6QyxFQUFNNHpDLEdBQ3JCLE9BQU8sU0FBUzNxRSxHQUNkLE9BQU8rMkIsRUFBSzR6QyxFQUFVM3FFLEtBYTFCLFNBQVM0cUUsR0FBZXZuRSxFQUFPOG1FLEdBTTdCLElBTEEsSUFBSTlvRSxHQUFTLEVBQ1QvQyxFQUFTK0UsRUFBTS9FLE9BQ2Z3cEUsRUFBVyxFQUNYdnNELEVBQVMsS0FFSmxhLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUl0RSxFQUFRcUosRUFBTWhDLEdBQ2RySCxJQUFVbXdFLEdBQWVud0UsSUFBVWdtRSxJQUNyQzM4RCxFQUFNaEMsR0FBUzIrRCxFQUNmemtELEVBQU91c0QsS0FBY3ptRSxHQUd6QixPQUFPa2EsRUFVVCxTQUFTc3ZELEdBQVczcUUsR0FDbEIsSUFBSW1CLEdBQVMsRUFDVGthLEVBQVM5YixNQUFNUyxFQUFJME8sTUFLdkIsT0FIQTFPLEVBQUk0SCxTQUFRLFNBQVM5TixHQUNuQnVoQixJQUFTbGEsR0FBU3JILEtBRWJ1aEIsRUFVVCxTQUFTdXZELEdBQVc1cUUsR0FDbEIsSUFBSW1CLEdBQVMsRUFDVGthLEVBQVM5YixNQUFNUyxFQUFJME8sTUFLdkIsT0FIQTFPLEVBQUk0SCxTQUFRLFNBQVM5TixHQUNuQnVoQixJQUFTbGEsR0FBUyxDQUFDckgsRUFBT0EsTUFFckJ1aEIsRUFvRFQsU0FBU3d2RCxHQUFXbHBDLEdBQ2xCLE9BQU8yb0MsR0FBVzNvQyxHQWlEcEIsU0FBcUJBLEdBQ25CLElBQUl0bUIsRUFBUzZwRCxHQUFVNEYsVUFBWSxFQUNuQyxLQUFPNUYsR0FBVW5pRSxLQUFLNCtCLE1BQ2xCdG1CLEVBRUosT0FBT0EsRUFyREgwdkQsQ0FBWXBwQyxHQUNaMm1DLEdBQVUzbUMsR0FVaEIsU0FBU3FwQyxHQUFjcnBDLEdBQ3JCLE9BQU8yb0MsR0FBVzNvQyxHQW1EcEIsU0FBd0JBLEdBQ3RCLE9BQU9BLEVBQU9wMEIsTUFBTTIzRCxLQUFjLEdBbkQ5QitGLENBQWV0cEMsR0E3a0JyQixTQUFzQkEsR0FDcEIsT0FBT0EsRUFBT2pZLE1BQU0sSUE2a0JoQndoRCxDQUFhdnBDLEdBV25CLFNBQVM0bkMsR0FBZ0I1bkMsR0FHdkIsSUFGQSxJQUFJeGdDLEVBQVF3Z0MsRUFBT3ZqQyxPQUVaK0MsS0FBV3NoRSxFQUFhMS9ELEtBQUs0K0IsRUFBT3FOLE9BQU83dEMsTUFDbEQsT0FBT0EsRUFVVCxJQUFJZ3FFLEdBQW1CaEMsR0EzOEJILENBQ2xCLFFBQVMsSUFDVCxPQUFRLElBQ1IsT0FBUSxJQUNSLFNBQVUsSUFDVixRQUFTLE1BNGdDWCxJQXMzZUlsMUMsR0F0M2VlLFNBQVVtM0MsRUFBYTNxRSxHQUl4QyxJQTZCTTRxRSxFQTdCRjlyRSxHQUhKa0IsRUFBcUIsTUFBWEEsRUFBa0Jza0MsR0FBTzlRLEdBQUUrYyxTQUFTak0sR0FBS3hyQyxTQUFVa0gsRUFBU3d6QixHQUFFK0QsS0FBSytNLEdBQU11Z0MsTUFHL0QvbEUsTUFDaEI0MkIsRUFBTzExQixFQUFRMDFCLEtBQ2Y1M0IsRUFBUWtDLEVBQVFsQyxNQUNoQmxELEdBQVdvRixFQUFRcEYsU0FDbkI2SSxHQUFPekQsRUFBUXlELEtBQ2YzSyxHQUFTa0gsRUFBUWxILE9BQ2pCNnVCLEdBQVMzbkIsRUFBUTJuQixPQUNqQjVwQixHQUFTaUMsRUFBUWpDLE9BQ2pCakIsR0FBWWtELEVBQVFsRCxVQUdwQit0RSxHQUFhL3JFLEVBQU05RSxVQUNuQjh3RSxHQUFZbHdFLEdBQVNaLFVBQ3JCK3dFLEdBQWNqeUUsR0FBT2tCLFVBR3JCZ3hFLEdBQWFockUsRUFBUSxzQkFHckJzMUIsR0FBZXcxQyxHQUFVbDNELFNBR3pCM1osR0FBaUI4d0UsR0FBWTl3RSxlQUc3Qmd4RSxHQUFZLEVBR1pDLElBQ0VOLEVBQU0sU0FBU2x0QyxLQUFLc3RDLElBQWNBLEdBQVdqcUUsTUFBUWlxRSxHQUFXanFFLEtBQUtvcUUsVUFBWSxLQUN2RSxpQkFBbUJQLEVBQU8sR0FRdENRLEdBQXVCTCxHQUFZbjNELFNBR25DMmhCLEdBQW1CRCxHQUFhLzhCLEtBQUtPLElBR3JDdXlFLEdBQVUvbUMsR0FBSzlRLEVBR2Y4M0MsR0FBYTNqRCxHQUFPLElBQ3RCMk4sR0FBYS84QixLQUFLMEIsSUFBZ0JxWSxRQUFRdXZELEVBQWMsUUFDdkR2dkQsUUFBUSx5REFBMEQsU0FBVyxLQUk1RWk1RCxHQUFTOUYsR0FBZ0J6bEUsRUFBUXVyRSxZQXI5Q25DL3VFLEVBczlDRXJELEdBQVM2RyxFQUFRN0csT0FDakJzcEIsR0FBYXppQixFQUFReWlCLFdBQ3JCK29ELEdBQWNELEdBQVNBLEdBQU9DLGlCQXg5Q2hDaHZFLEVBeTlDRWl2RSxHQUFlMUIsR0FBUWp4RSxHQUFPMkcsZUFBZ0IzRyxJQUM5QzR5RSxHQUFlNXlFLEdBQU9ZLE9BQ3RCaXlFLEdBQXVCWixHQUFZWSxxQkFDbkN4bkMsR0FBUzBtQyxHQUFXMW1DLE9BQ3BCeW5DLEdBQW1CenlFLEdBQVNBLEdBQU8weUUsd0JBNzlDckNydkUsRUE4OUNFc3ZFLEdBQWMzeUUsR0FBU0EsR0FBTzR5RSxjQTk5Q2hDdnZFLEVBKzlDRXd2RSxHQUFpQjd5RSxHQUFTQSxHQUFPQyxpQkEvOUNuQ29ELEVBaStDRXpELEdBQWtCLFdBQ3BCLElBQ0UsSUFBSXE5QixFQUFPNjFDLEdBQVVuekUsR0FBUSxrQkFFN0IsT0FEQXM5QixFQUFLLEdBQUksR0FBSSxJQUNOQSxFQUNQLE1BQU90akIsS0FMVSxHQVNqQm81RCxHQUFrQmxzRSxFQUFRcUMsZUFBaUJpaUMsR0FBS2ppQyxjQUFnQnJDLEVBQVFxQyxhQUN4RThwRSxHQUFTejJDLEdBQVFBLEVBQUt5MEIsTUFBUTdsQixHQUFLNU8sS0FBS3kwQixLQUFPejBCLEVBQUt5MEIsSUFDcERpaUIsR0FBZ0Jwc0UsRUFBUW1DLGFBQWVtaUMsR0FBS25pQyxZQUFjbkMsRUFBUW1DLFdBR2xFa3FFLEdBQWE1b0UsR0FBSzg5QixLQUNsQitxQyxHQUFjN29FLEdBQUswMUQsTUFDbkJvVCxHQUFtQnp6RSxHQUFPZ0Msc0JBQzFCMHhFLEdBQWlCakIsR0FBU0EsR0FBT2tCLGNBbC9DbkNqd0UsRUFtL0NFa3dFLEdBQWlCMXNFLEVBQVEyMUIsU0FDekJnM0MsR0FBYTlCLEdBQVcvdUQsS0FDeEI4d0QsR0FBYTdDLEdBQVFqeEUsR0FBT2lJLEtBQU1qSSxJQUNsQyt6RSxHQUFZcHBFLEdBQUtDLElBQ2pCb3BFLEdBQVlycEUsR0FBS3dKLElBQ2pCOC9ELEdBQVlyM0MsRUFBS3kwQixJQUNqQjZpQixHQUFpQmh0RSxFQUFRMFgsU0FDekJ1MUQsR0FBZXhwRSxHQUFLc25CLE9BQ3BCbWlELEdBQWdCckMsR0FBV3puQyxRQUczQitwQyxHQUFXbEIsR0FBVWpzRSxFQUFTLFlBQzlCaTFCLEdBQU1nM0MsR0FBVWpzRSxFQUFTLE9BQ3pCdkUsR0FBVXd3RSxHQUFVanNFLEVBQVMsV0FDN0J3TixHQUFNeStELEdBQVVqc0UsRUFBUyxPQUN6Qm90RSxHQUFVbkIsR0FBVWpzRSxFQUFTLFdBQzdCcXRFLEdBQWVwQixHQUFVbnpFLEdBQVEsVUFHakN3MEUsR0FBVUYsSUFBVyxJQUFJQSxHQUd6QkcsR0FBWSxHQUdaQyxHQUFxQkMsR0FBU04sSUFDOUJPLEdBQWdCRCxHQUFTeDRDLElBQ3pCMDRDLEdBQW9CRixHQUFTaHlFLElBQzdCbXlFLEdBQWdCSCxHQUFTamdFLElBQ3pCcWdFLEdBQW9CSixHQUFTTCxJQUc3QlUsR0FBYzMwRSxHQUFTQSxHQUFPYSxlQW5oRGhDd0MsRUFvaERFdXhFLEdBQWdCRCxHQUFjQSxHQUFZRSxhQXBoRDVDeHhFLEVBcWhERXl4RSxHQUFpQkgsR0FBY0EsR0FBWWw2RCxjQXJoRDdDcFgsRUE4b0RGLFNBQVMweEUsR0FBTzcwRSxHQUNkLEdBQUk4MEUsR0FBYTkwRSxLQUFXcXNCLEdBQVFyc0IsTUFBWUEsYUFBaUIrMEUsSUFBYyxDQUM3RSxHQUFJLzBFLGFBQWlCZzFFLEdBQ25CLE9BQU9oMUUsRUFFVCxHQUFJWSxHQUFlMUIsS0FBS2MsRUFBTyxlQUM3QixPQUFPaTFFLEdBQWFqMUUsR0FHeEIsT0FBTyxJQUFJZzFFLEdBQWNoMUUsR0FXM0IsSUFBSWsxRSxHQUFjLFdBQ2hCLFNBQVN6MEUsS0FDVCxPQUFPLFNBQVNpOEIsR0FDZCxJQUFLeTRDLEdBQVN6NEMsR0FDWixNQUFPLEdBRVQsR0FBSTIxQyxHQUNGLE9BQU9BLEdBQWEzMUMsR0FFdEJqOEIsRUFBT0UsVUFBWSs3QixFQUNuQixJQUFJbmIsRUFBUyxJQUFJOWdCLEVBRWpCLE9BREFBLEVBQU9FLGVBN3FEVHdDLEVBOHFEU29lLEdBWk0sR0FxQmpCLFNBQVM2ekQsTUFXVCxTQUFTSixHQUFjaDFFLEVBQU9xMUUsR0FDNUJwekUsS0FBS3F6RSxZQUFjdDFFLEVBQ25CaUMsS0FBS3N6RSxZQUFjLEdBQ25CdHpFLEtBQUt1ekUsWUFBY0gsRUFDbkJwekUsS0FBS3d6RSxVQUFZLEVBQ2pCeHpFLEtBQUt5ekUsZ0JBdnNETHZ5RSxFQXV4REYsU0FBUzR4RSxHQUFZLzBFLEdBQ25CaUMsS0FBS3F6RSxZQUFjdDFFLEVBQ25CaUMsS0FBS3N6RSxZQUFjLEdBQ25CdHpFLEtBQUswekUsUUFBVSxFQUNmMXpFLEtBQUsyekUsY0FBZSxFQUNwQjN6RSxLQUFLNHpFLGNBQWdCLEdBQ3JCNXpFLEtBQUs2ekUsY0E5dERjLFdBK3REbkI3ekUsS0FBSzh6RSxVQUFZLEdBZ0huQixTQUFTQyxHQUFLNThELEdBQ1osSUFBSS9SLEdBQVMsRUFDVC9DLEVBQW9CLE1BQVg4VSxFQUFrQixFQUFJQSxFQUFROVUsT0FHM0MsSUFEQXJDLEtBQUtnMEUsVUFDSTV1RSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJNHhFLEVBQVE5OEQsRUFBUS9SLEdBQ3BCcEYsS0FBS2lFLElBQUlnd0UsRUFBTSxHQUFJQSxFQUFNLEtBaUc3QixTQUFTQyxHQUFVLzhELEdBQ2pCLElBQUkvUixHQUFTLEVBQ1QvQyxFQUFvQixNQUFYOFUsRUFBa0IsRUFBSUEsRUFBUTlVLE9BRzNDLElBREFyQyxLQUFLZzBFLFVBQ0k1dUUsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSTR4RSxFQUFROThELEVBQVEvUixHQUNwQnBGLEtBQUtpRSxJQUFJZ3dFLEVBQU0sR0FBSUEsRUFBTSxLQThHN0IsU0FBU0UsR0FBU2g5RCxHQUNoQixJQUFJL1IsR0FBUyxFQUNUL0MsRUFBb0IsTUFBWDhVLEVBQWtCLEVBQUlBLEVBQVE5VSxPQUczQyxJQURBckMsS0FBS2cwRSxVQUNJNXVFLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUk0eEUsRUFBUTk4RCxFQUFRL1IsR0FDcEJwRixLQUFLaUUsSUFBSWd3RSxFQUFNLEdBQUlBLEVBQU0sS0FpRzdCLFNBQVNHLEdBQVMzaEUsR0FDaEIsSUFBSXJOLEdBQVMsRUFDVC9DLEVBQW1CLE1BQVZvUSxFQUFpQixFQUFJQSxFQUFPcFEsT0FHekMsSUFEQXJDLEtBQUtxMEUsU0FBVyxJQUFJRixLQUNYL3VFLEVBQVEvQyxHQUNmckMsS0FBS2tKLElBQUl1SixFQUFPck4sSUE2Q3BCLFNBQVNrdkUsR0FBTW45RCxHQUNiLElBQUlzUixFQUFPem9CLEtBQUtxMEUsU0FBVyxJQUFJSCxHQUFVLzhELEdBQ3pDblgsS0FBSzJTLEtBQU84VixFQUFLOVYsS0FxR25CLFNBQVM0aEUsR0FBY3gyRSxFQUFPeTJFLEdBQzVCLElBQUlDLEVBQVFycUQsR0FBUXJzQixHQUNoQjIyRSxHQUFTRCxHQUFTRSxHQUFZNTJFLEdBQzlCNjJFLEdBQVVILElBQVVDLEdBQVN2RCxHQUFTcHpFLEdBQ3RDODJFLEdBQVVKLElBQVVDLElBQVVFLEdBQVUxSixHQUFhbnRFLEdBQ3JEKzJFLEVBQWNMLEdBQVNDLEdBQVNFLEdBQVVDLEVBQzFDdjFELEVBQVN3MUQsRUFBY3hILEdBQVV2dkUsRUFBTXNFLE9BQVFJLElBQVUsR0FDekRKLEVBQVNpZCxFQUFPamQsT0FFcEIsSUFBSyxJQUFJaEUsS0FBT04sR0FDVHkyRSxJQUFhNzFFLEdBQWUxQixLQUFLYyxFQUFPTSxJQUN2Q3kyRSxJQUVRLFVBQVB6MkUsR0FFQ3UyRSxJQUFrQixVQUFQdjJFLEdBQTBCLFVBQVBBLElBRTlCdzJFLElBQWtCLFVBQVB4MkUsR0FBMEIsY0FBUEEsR0FBOEIsY0FBUEEsSUFFdEQwMkUsR0FBUTEyRSxFQUFLZ0UsS0FFbEJpZCxFQUFPbGQsS0FBSy9ELEdBR2hCLE9BQU9paEIsRUFVVCxTQUFTMDFELEdBQVk1dEUsR0FDbkIsSUFBSS9FLEVBQVMrRSxFQUFNL0UsT0FDbkIsT0FBT0EsRUFBUytFLEVBQU02dEUsR0FBVyxFQUFHNXlFLEVBQVMsU0FqNUU3Q25CLEVBNDVFRixTQUFTZzBFLEdBQWdCOXRFLEVBQU83SSxHQUM5QixPQUFPNDJFLEdBQVlDLEdBQVVodUUsR0FBUWl1RSxHQUFVOTJFLEVBQUcsRUFBRzZJLEVBQU0vRSxTQVU3RCxTQUFTaXpFLEdBQWFsdUUsR0FDcEIsT0FBTyt0RSxHQUFZQyxHQUFVaHVFLElBWS9CLFNBQVNtdUUsR0FBaUIvMkUsRUFBUUgsRUFBS04sU0FwN0VyQ21ELElBcTdFS25ELElBQXdCeTNFLEdBQUdoM0UsRUFBT0gsR0FBTU4sU0FyN0U3Q21ELElBczdFS25ELEtBQXlCTSxLQUFPRyxLQUNuQ2kzRSxHQUFnQmozRSxFQUFRSCxFQUFLTixHQWNqQyxTQUFTMjNFLEdBQVlsM0UsRUFBUUgsRUFBS04sR0FDaEMsSUFBSTQzRSxFQUFXbjNFLEVBQU9ILEdBQ2hCTSxHQUFlMUIsS0FBS3VCLEVBQVFILElBQVFtM0UsR0FBR0csRUFBVTUzRSxVQXY4RXZEbUQsSUF3OEVLbkQsR0FBeUJNLEtBQU9HLElBQ25DaTNFLEdBQWdCajNFLEVBQVFILEVBQUtOLEdBWWpDLFNBQVM2M0UsR0FBYXh1RSxFQUFPL0ksR0FFM0IsSUFEQSxJQUFJZ0UsRUFBUytFLEVBQU0vRSxPQUNaQSxLQUNMLEdBQUltekUsR0FBR3B1RSxFQUFNL0UsR0FBUSxHQUFJaEUsR0FDdkIsT0FBT2dFLEVBR1gsT0FBUSxFQWNWLFNBQVN3ekUsR0FBZW5KLEVBQVlyQixFQUFRQyxFQUFVQyxHQUlwRCxPQUhBdUssR0FBU3BKLEdBQVksU0FBUzN1RSxFQUFPTSxFQUFLcXVFLEdBQ3hDckIsRUFBT0UsRUFBYXh0RSxFQUFPdXRFLEVBQVN2dEUsR0FBUTJ1RSxNQUV2Q25CLEVBWVQsU0FBU3dLLEdBQVd2M0UsRUFBUWtrQyxHQUMxQixPQUFPbGtDLEdBQVV3M0UsR0FBV3R6QyxFQUFRajlCLEdBQUtpOUIsR0FBU2xrQyxHQXlCcEQsU0FBU2kzRSxHQUFnQmozRSxFQUFRSCxFQUFLTixHQUN6QixhQUFQTSxHQUFzQlosR0FDeEJBLEdBQWVlLEVBQVFILEVBQUssQ0FDMUIsY0FBZ0IsRUFDaEIsWUFBYyxFQUNkLE1BQVNOLEVBQ1QsVUFBWSxJQUdkUyxFQUFPSCxHQUFPTixFQVlsQixTQUFTazRFLEdBQU96M0UsRUFBUTRwQyxHQU10QixJQUxBLElBQUloakMsR0FBUyxFQUNUL0MsRUFBUytsQyxFQUFNL2xDLE9BQ2ZpZCxFQUFTOWIsRUFBTW5CLEdBQ2Y4dkMsRUFBaUIsTUFBVjN6QyxJQUVGNEcsRUFBUS9DLEdBQ2ZpZCxFQUFPbGEsR0FBUytzQyxPQWhqRmxCanhDLEVBZ2pGcUN2RCxHQUFJYSxFQUFRNHBDLEVBQU1oakMsSUFFdkQsT0FBT2thLEVBWVQsU0FBUysxRCxHQUFVdG5ELEVBQVFtb0QsRUFBT3p2QixHQVNoQyxPQVJJMTRCLEdBQVdBLFNBL2pGZjdzQixJQWdrRk11bEQsSUFDRjE0QixFQUFTQSxHQUFVMDRCLEVBQVExNEIsRUFBUzA0QixRQWprRnhDdmxELElBbWtGTWcxRSxJQUNGbm9ELEVBQVNBLEdBQVVtb0QsRUFBUW5vRCxFQUFTbW9ELElBR2pDbm9ELEVBbUJULFNBQVNvb0QsR0FBVXA0RSxFQUFPcTRFLEVBQVNDLEVBQVloNEUsRUFBS0csRUFBUWlzQixHQUMxRCxJQUFJbkwsRUFDQWczRCxFQXJrRmMsRUFxa0ZMRixFQUNURyxFQXJrRmMsRUFxa0ZMSCxFQUNUSSxFQXJrRmlCLEVBcWtGUkosRUFLYixHQUhJQyxJQUNGLzJELEVBQVM5Z0IsRUFBUzYzRSxFQUFXdDRFLEVBQU9NLEVBQUtHLEVBQVFpc0IsR0FBUzRyRCxFQUFXdDRFLFNBam1GdkVtRCxJQW1tRklvZSxFQUNGLE9BQU9BLEVBRVQsSUFBSzR6RCxHQUFTbjFFLEdBQ1osT0FBT0EsRUFFVCxJQUFJMDJFLEVBQVFycUQsR0FBUXJzQixHQUNwQixHQUFJMDJFLEdBRUYsR0FEQW4xRCxFQTY4R0osU0FBd0JsWSxHQUN0QixJQUFJL0UsRUFBUytFLEVBQU0vRSxPQUNmaWQsRUFBUyxJQUFJbFksRUFBTXJCLFlBQVkxRCxHQUcvQkEsR0FBNkIsaUJBQVorRSxFQUFNLElBQWtCekksR0FBZTFCLEtBQUttSyxFQUFPLFdBQ3RFa1ksRUFBT2xhLE1BQVFnQyxFQUFNaEMsTUFDckJrYSxFQUFPNk0sTUFBUS9rQixFQUFNK2tCLE9BRXZCLE9BQU83TSxFQXQ5R0ltM0QsQ0FBZTE0RSxJQUNuQnU0RSxFQUNILE9BQU9sQixHQUFVcjNFLEVBQU91aEIsT0FFckIsQ0FDTCxJQUFJbzNELEVBQU1DLEdBQU81NEUsR0FDYjY0RSxFQUFTRixHQUFPcFMsR0FBV29TLEdBQU9uUyxFQUV0QyxHQUFJNE0sR0FBU3B6RSxHQUNYLE9BQU84NEUsR0FBWTk0RSxFQUFPdTRFLEdBRTVCLEdBQUlJLEdBQU9oUyxHQUFhZ1MsR0FBT3pTLEdBQVkyUyxJQUFXcDRFLEdBRXBELEdBREE4Z0IsRUFBVWkzRCxHQUFVSyxFQUFVLEdBQUtFLEdBQWdCLzRFLElBQzlDdTRFLEVBQ0gsT0FBT0MsRUErbkVmLFNBQXVCN3pDLEVBQVFsa0MsR0FDN0IsT0FBT3czRSxHQUFXdHpDLEVBQVFxMEMsR0FBYXIwQyxHQUFTbGtDLEdBL25FdEN3NEUsQ0FBY2o1RSxFQW5IMUIsU0FBc0JTLEVBQVFra0MsR0FDNUIsT0FBT2xrQyxHQUFVdzNFLEdBQVd0ekMsRUFBUXUwQyxHQUFPdjBDLEdBQVNsa0MsR0FrSHJCMDRFLENBQWE1M0QsRUFBUXZoQixJQWtuRXRELFNBQXFCMmtDLEVBQVFsa0MsR0FDM0IsT0FBT3czRSxHQUFXdHpDLEVBQVF5MEMsR0FBV3owQyxHQUFTbGtDLEdBbG5FcEM0NEUsQ0FBWXI1RSxFQUFPZzRFLEdBQVd6MkQsRUFBUXZoQixRQUV2QyxDQUNMLElBQUsyckUsR0FBY2dOLEdBQ2pCLE9BQU9sNEUsRUFBU1QsRUFBUSxHQUUxQnVoQixFQTQ5R04sU0FBd0I5Z0IsRUFBUWs0RSxFQUFLSixHQUNuQyxJQUFJNTdDLEVBQU9sOEIsRUFBT3VILFlBQ2xCLE9BQVEyd0UsR0FDTixLQUFLMVIsRUFDSCxPQUFPenJDLEdBQWlCLzZCLEdBRTFCLEtBQUsybEUsRUFDTCxLQUFLQyxFQUNILE9BQU8sSUFBSTFwQyxHQUFNbDhCLEdBRW5CLEtBQUt5bUUsRUFDSCxPQTVuRE4sU0FBdUJvUyxFQUFVZixHQUMvQixJQUFJbnVELEVBQVNtdUQsRUFBUy84QyxHQUFpQjg5QyxFQUFTbHZELFFBQVVrdkQsRUFBU2x2RCxPQUNuRSxPQUFPLElBQUlrdkQsRUFBU3R4RSxZQUFZb2lCLEVBQVFrdkQsRUFBU0MsV0FBWUQsRUFBU3J3RCxZQTBuRDNEdXdELENBQWMvNEUsRUFBUTgzRSxHQUUvQixLQUFLcFIsRUFBWSxLQUFLQyxFQUN0QixLQUFLQyxFQUFTLEtBQUtDLEVBQVUsS0FBS0MsRUFDbEMsS0FBS0MsRUFBVSxJQTUvTEMsNkJBNC9McUIsS0FBS0MsRUFBVyxLQUFLQyxFQUN4RCxPQUFPK1IsR0FBZ0JoNUUsRUFBUTgzRSxHQUVqQyxLQUFLOVIsRUFDSCxPQUFPLElBQUk5cEMsRUFFYixLQUFLK3BDLEVBQ0wsS0FBS0ksRUFDSCxPQUFPLElBQUlucUMsRUFBS2w4QixHQUVsQixLQUFLbW1FLEVBQ0gsT0EvbkROLFNBQXFCcjRDLEdBQ25CLElBQUloTixFQUFTLElBQUlnTixFQUFPdm1CLFlBQVl1bUIsRUFBT29XLE9BQVF3a0MsR0FBUTlrQyxLQUFLOVYsSUFFaEUsT0FEQWhOLEVBQU95dkQsVUFBWXppRCxFQUFPeWlELFVBQ25CenZELEVBNG5ESW00RCxDQUFZajVFLEdBRXJCLEtBQUtvbUUsRUFDSCxPQUFPLElBQUlscUMsRUFFYixLQUFLb3FDLEVBQ0gsT0F4bkRlNFMsRUF3bkRJbDVFLEVBdm5EaEJpMEUsR0FBZ0JqMUUsR0FBT2kxRSxHQUFjeDFFLEtBQUt5NkUsSUFBVyxHQUQ5RCxJQUFxQkEsRUFwNEROQyxDQUFlNTVFLEVBQU8yNEUsRUFBS0osSUFJeEM3ckQsSUFBVUEsRUFBUSxJQUFJNnBELElBQ3RCLElBQUlzRCxFQUFVbnRELEVBQU05c0IsSUFBSUksR0FDeEIsR0FBSTY1RSxFQUNGLE9BQU9BLEVBRVRudEQsRUFBTXhtQixJQUFJbEcsRUFBT3VoQixHQUViMHJELEdBQU1qdEUsR0FDUkEsRUFBTThOLFNBQVEsU0FBU2dzRSxHQUNyQnY0RCxFQUFPcFcsSUFBSWl0RSxHQUFVMEIsRUFBVXpCLEVBQVNDLEVBQVl3QixFQUFVOTVFLEVBQU8wc0IsT0FFOURtZ0QsR0FBTTdzRSxJQUNmQSxFQUFNOE4sU0FBUSxTQUFTZ3NFLEVBQVV4NUUsR0FDL0JpaEIsRUFBT3JiLElBQUk1RixFQUFLODNFLEdBQVUwQixFQUFVekIsRUFBU0MsRUFBWWg0RSxFQUFLTixFQUFPMHNCLE9BSXpFLElBSUlrekMsRUFBUThXLE9BMXBGWnZ6RSxHQXNwRmVzMUUsRUFDVkQsRUFBU3VCLEdBQWV4eEIsR0FDeEJpd0IsRUFBU1UsR0FBU3h4RSxJQUVrQjFILEdBU3pDLE9BUkF5dEUsR0FBVTdOLEdBQVM1L0QsR0FBTyxTQUFTODVFLEVBQVV4NUUsR0FDdkNzL0QsSUFFRmthLEVBQVc5NUUsRUFEWE0sRUFBTXc1RSxJQUlSbkMsR0FBWXAyRCxFQUFRamhCLEVBQUs4M0UsR0FBVTBCLEVBQVV6QixFQUFTQyxFQUFZaDRFLEVBQUtOLEVBQU8wc0IsT0FFekVuTCxFQXlCVCxTQUFTeTRELEdBQWV2NUUsRUFBUWtrQyxFQUFRaTdCLEdBQ3RDLElBQUl0N0QsRUFBU3M3RCxFQUFNdDdELE9BQ25CLEdBQWMsTUFBVjdELEVBQ0YsT0FBUTZELEVBR1YsSUFEQTdELEVBQVNoQixHQUFPZ0IsR0FDVDZELEtBQVUsQ0FDZixJQUFJaEUsRUFBTXMvRCxFQUFNdDdELEdBQ1pzcEUsRUFBWWpwQyxFQUFPcmtDLEdBQ25CTixFQUFRUyxFQUFPSCxHQUVuQixRQXZzRkY2QyxJQXVzRk9uRCxLQUF5Qk0sS0FBT0csS0FBYW10RSxFQUFVNXRFLEdBQzFELE9BQU8sRUFHWCxPQUFPLEVBYVQsU0FBU2k2RSxHQUFVbDlDLEVBQU1tOUMsRUFBTTU0RSxHQUM3QixHQUFtQixtQkFBUnk3QixFQUNULE1BQU0sSUFBSXQ1QixHQUFVc2lFLEdBRXRCLE9BQU9qOUQsSUFBVyxXQUFhaTBCLEVBQUs1N0IsV0E1dEZwQ2dDLEVBNHRGcUQ3QixLQUFVNDRFLEdBY2pFLFNBQVNDLEdBQWU5d0UsRUFBT3FMLEVBQVE2NEQsRUFBVTlpQyxHQUMvQyxJQUFJcGpDLEdBQVMsRUFDVCt5RSxFQUFXck0sR0FDWHNNLEdBQVcsRUFDWC8xRSxFQUFTK0UsRUFBTS9FLE9BQ2ZpZCxFQUFTLEdBQ1QrNEQsRUFBZTVsRSxFQUFPcFEsT0FFMUIsSUFBS0EsRUFDSCxPQUFPaWQsRUFFTGdzRCxJQUNGNzRELEVBQVN3NUQsR0FBU3g1RCxFQUFRZzdELEdBQVVuQyxLQUVsQzlpQyxHQUNGMnZDLEVBQVduTSxHQUNYb00sR0FBVyxHQUVKM2xFLEVBQU9wUSxRQXR2RkcsTUF1dkZqQjgxRSxFQUFXeEssR0FDWHlLLEdBQVcsRUFDWDNsRSxFQUFTLElBQUkyaEUsR0FBUzNoRSxJQUV4QjZsRSxFQUNBLE9BQVNsekUsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSXRFLEVBQVFxSixFQUFNaEMsR0FDZG16RSxFQUF1QixNQUFaak4sRUFBbUJ2dEUsRUFBUXV0RSxFQUFTdnRFLEdBR25ELEdBREFBLEVBQVN5cUMsR0FBd0IsSUFBVnpxQyxFQUFlQSxFQUFRLEVBQzFDcTZFLEdBQVlHLEdBQWFBLEVBQVUsQ0FFckMsSUFEQSxJQUFJQyxFQUFjSCxFQUNYRyxLQUNMLEdBQUkvbEUsRUFBTytsRSxLQUFpQkQsRUFDMUIsU0FBU0QsRUFHYmg1RCxFQUFPbGQsS0FBS3JFLFFBRUpvNkUsRUFBUzFsRSxFQUFROGxFLEVBQVUvdkMsSUFDbkNscEIsRUFBT2xkLEtBQUtyRSxHQUdoQixPQUFPdWhCLEVBamtDVHN6RCxHQUFPNkYsaUJBQW1CLENBUXhCLE9BQVV4UyxFQVFWLFNBQVlDLEVBUVosWUFBZUMsRUFRZixTQUFZLEdBUVosUUFBVyxDQVFULEVBQUt5TSxLQUtUQSxHQUFPbDBFLFVBQVl5MEUsR0FBV3owRSxVQUM5QmswRSxHQUFPbDBFLFVBQVVxSCxZQUFjNnNFLEdBRS9CRyxHQUFjcjBFLFVBQVl1MEUsR0FBV0UsR0FBV3owRSxXQUNoRHEwRSxHQUFjcjBFLFVBQVVxSCxZQUFjZ3RFLEdBc0h0Q0QsR0FBWXAwRSxVQUFZdTBFLEdBQVdFLEdBQVd6MEUsV0FDOUNvMEUsR0FBWXAwRSxVQUFVcUgsWUFBYytzRSxHQW9HcENpQixHQUFLcjFFLFVBQVVzMUUsTUF2RWYsV0FDRWgwRSxLQUFLcTBFLFNBQVd0QyxHQUFlQSxHQUFhLE1BQVEsR0FDcEQveEUsS0FBSzJTLEtBQU8sR0FzRWRvaEUsR0FBS3IxRSxVQUFrQixPQXpEdkIsU0FBb0JMLEdBQ2xCLElBQUlpaEIsRUFBU3RmLEtBQUtzUyxJQUFJalUsV0FBZTJCLEtBQUtxMEUsU0FBU2gyRSxHQUVuRCxPQURBMkIsS0FBSzJTLE1BQVEyTSxFQUFTLEVBQUksRUFDbkJBLEdBdURUeTBELEdBQUtyMUUsVUFBVWYsSUEzQ2YsU0FBaUJVLEdBQ2YsSUFBSW9xQixFQUFPem9CLEtBQUtxMEUsU0FDaEIsR0FBSXRDLEdBQWMsQ0FDaEIsSUFBSXp5RCxFQUFTbUosRUFBS3BxQixHQUNsQixNQXA3RGUsOEJBbzdEUmloQixPQWw4RFRwZSxFQWs4RGlEb2UsRUFFakQsT0FBTzNnQixHQUFlMUIsS0FBS3dyQixFQUFNcHFCLEdBQU9vcUIsRUFBS3BxQixRQXA4RDdDNkMsR0EwK0RGNnlFLEdBQUtyMUUsVUFBVTRULElBMUJmLFNBQWlCalUsR0FDZixJQUFJb3FCLEVBQU96b0IsS0FBS3EwRSxTQUNoQixPQUFPdEMsUUFsOURQN3dFLElBazlEdUJ1bkIsRUFBS3BxQixHQUFzQk0sR0FBZTFCLEtBQUt3ckIsRUFBTXBxQixJQXlCOUUwMUUsR0FBS3IxRSxVQUFVdUYsSUFaZixTQUFpQjVGLEVBQUtOLEdBQ3BCLElBQUkwcUIsRUFBT3pvQixLQUFLcTBFLFNBR2hCLE9BRkFyMEUsS0FBSzJTLE1BQVEzUyxLQUFLc1MsSUFBSWpVLEdBQU8sRUFBSSxFQUNqQ29xQixFQUFLcHFCLEdBQVEwekUsU0FsK0RiN3dFLElBaytENkJuRCxFQXA5RFosNEJBbzlEb0RBLEVBQzlEaUMsTUF5SFRrMEUsR0FBVXgxRSxVQUFVczFFLE1BcEZwQixXQUNFaDBFLEtBQUtxMEUsU0FBVyxHQUNoQnIwRSxLQUFLMlMsS0FBTyxHQW1GZHVoRSxHQUFVeDFFLFVBQWtCLE9BdkU1QixTQUF5QkwsR0FDdkIsSUFBSW9xQixFQUFPem9CLEtBQUtxMEUsU0FDWmp2RSxFQUFRd3dFLEdBQWFudEQsRUFBTXBxQixHQUUvQixRQUFJK0csRUFBUSxLQUlSQSxHQURZcWpCLEVBQUtwbUIsT0FBUyxFQUU1Qm9tQixFQUFLcGpCLE1BRUx3akMsR0FBTzVyQyxLQUFLd3JCLEVBQU1yakIsRUFBTyxLQUV6QnBGLEtBQUsyUyxNQUNBLElBMERUdWhFLEdBQVV4MUUsVUFBVWYsSUE5Q3BCLFNBQXNCVSxHQUNwQixJQUFJb3FCLEVBQU96b0IsS0FBS3EwRSxTQUNaanZFLEVBQVF3d0UsR0FBYW50RCxFQUFNcHFCLEdBRS9CLE9BQU8rRyxFQUFRLE9BcGpFZmxFLEVBb2pFK0J1bkIsRUFBS3JqQixHQUFPLElBMkM3Qzh1RSxHQUFVeDFFLFVBQVU0VCxJQS9CcEIsU0FBc0JqVSxHQUNwQixPQUFPdTNFLEdBQWE1MUUsS0FBS3EwRSxTQUFVaDJFLElBQVEsR0ErQjdDNjFFLEdBQVV4MUUsVUFBVXVGLElBbEJwQixTQUFzQjVGLEVBQUtOLEdBQ3pCLElBQUkwcUIsRUFBT3pvQixLQUFLcTBFLFNBQ1pqdkUsRUFBUXd3RSxHQUFhbnRELEVBQU1wcUIsR0FRL0IsT0FOSStHLEVBQVEsS0FDUnBGLEtBQUsyUyxLQUNQOFYsRUFBS3JtQixLQUFLLENBQUMvRCxFQUFLTixLQUVoQjBxQixFQUFLcmpCLEdBQU8sR0FBS3JILEVBRVppQyxNQTJHVG0wRSxHQUFTejFFLFVBQVVzMUUsTUF0RW5CLFdBQ0VoMEUsS0FBSzJTLEtBQU8sRUFDWjNTLEtBQUtxMEUsU0FBVyxDQUNkLEtBQVEsSUFBSU4sR0FDWixJQUFPLElBQUtwNkMsSUFBT3U2QyxJQUNuQixPQUFVLElBQUlILEtBa0VsQkksR0FBU3oxRSxVQUFrQixPQXJEM0IsU0FBd0JMLEdBQ3RCLElBQUlpaEIsRUFBU281RCxHQUFXMTRFLEtBQU0zQixHQUFhLE9BQUVBLEdBRTdDLE9BREEyQixLQUFLMlMsTUFBUTJNLEVBQVMsRUFBSSxFQUNuQkEsR0FtRFQ2MEQsR0FBU3oxRSxVQUFVZixJQXZDbkIsU0FBcUJVLEdBQ25CLE9BQU9xNkUsR0FBVzE0RSxLQUFNM0IsR0FBS1YsSUFBSVUsSUF1Q25DODFFLEdBQVN6MUUsVUFBVTRULElBM0JuQixTQUFxQmpVLEdBQ25CLE9BQU9xNkUsR0FBVzE0RSxLQUFNM0IsR0FBS2lVLElBQUlqVSxJQTJCbkM4MUUsR0FBU3oxRSxVQUFVdUYsSUFkbkIsU0FBcUI1RixFQUFLTixHQUN4QixJQUFJMHFCLEVBQU9pd0QsR0FBVzE0RSxLQUFNM0IsR0FDeEJzVSxFQUFPOFYsRUFBSzlWLEtBSWhCLE9BRkE4VixFQUFLeGtCLElBQUk1RixFQUFLTixHQUNkaUMsS0FBSzJTLE1BQVE4VixFQUFLOVYsTUFBUUEsRUFBTyxFQUFJLEVBQzlCM1MsTUEyRFRvMEUsR0FBUzExRSxVQUFVd0ssSUFBTWtyRSxHQUFTMTFFLFVBQVUwRCxLQW5CNUMsU0FBcUJyRSxHQUVuQixPQURBaUMsS0FBS3EwRSxTQUFTcHdFLElBQUlsRyxFQTF0RUQsNkJBMnRFVmlDLE1Ba0JUbzBFLEdBQVMxMUUsVUFBVTRULElBTm5CLFNBQXFCdlUsR0FDbkIsT0FBT2lDLEtBQUtxMEUsU0FBUy9oRSxJQUFJdlUsSUF1RzNCdTJFLEdBQU01MUUsVUFBVXMxRSxNQTNFaEIsV0FDRWgwRSxLQUFLcTBFLFNBQVcsSUFBSUgsR0FDcEJsMEUsS0FBSzJTLEtBQU8sR0EwRWQyaEUsR0FBTTUxRSxVQUFrQixPQTlEeEIsU0FBcUJMLEdBQ25CLElBQUlvcUIsRUFBT3pvQixLQUFLcTBFLFNBQ1ovMEQsRUFBU21KLEVBQWEsT0FBRXBxQixHQUc1QixPQURBMkIsS0FBSzJTLEtBQU84VixFQUFLOVYsS0FDVjJNLEdBMERUZzFELEdBQU01MUUsVUFBVWYsSUE5Q2hCLFNBQWtCVSxHQUNoQixPQUFPMkIsS0FBS3EwRSxTQUFTMTJFLElBQUlVLElBOEMzQmkyRSxHQUFNNTFFLFVBQVU0VCxJQWxDaEIsU0FBa0JqVSxHQUNoQixPQUFPMkIsS0FBS3EwRSxTQUFTL2hFLElBQUlqVSxJQWtDM0JpMkUsR0FBTTUxRSxVQUFVdUYsSUFyQmhCLFNBQWtCNUYsRUFBS04sR0FDckIsSUFBSTBxQixFQUFPem9CLEtBQUtxMEUsU0FDaEIsR0FBSTVyRCxhQUFnQnlyRCxHQUFXLENBQzdCLElBQUl5RSxFQUFRbHdELEVBQUs0ckQsU0FDakIsSUFBSzE2QyxJQUFRZy9DLEVBQU10MkUsT0FBU3UyRSxJQUcxQixPQUZBRCxFQUFNdjJFLEtBQUssQ0FBQy9ELEVBQUtOLElBQ2pCaUMsS0FBSzJTLE9BQVM4VixFQUFLOVYsS0FDWjNTLEtBRVR5b0IsRUFBT3pvQixLQUFLcTBFLFNBQVcsSUFBSUYsR0FBU3dFLEdBSXRDLE9BRkFsd0QsRUFBS3hrQixJQUFJNUYsRUFBS04sR0FDZGlDLEtBQUsyUyxLQUFPOFYsRUFBSzlWLEtBQ1YzUyxNQXNjVCxJQUFJODFFLEdBQVcrQyxHQUFlQyxJQVUxQkMsR0FBZ0JGLEdBQWVHLElBQWlCLEdBV3BELFNBQVNDLEdBQVV2TSxFQUFZZixHQUM3QixJQUFJcnNELEdBQVMsRUFLYixPQUpBdzJELEdBQVNwSixHQUFZLFNBQVMzdUUsRUFBT3FILEVBQU9zbkUsR0FFMUMsT0FEQXB0RCxJQUFXcXNELEVBQVU1dEUsRUFBT3FILEVBQU9zbkUsTUFHOUJwdEQsRUFhVCxTQUFTNDVELEdBQWE5eEUsRUFBT2trRSxFQUFVOWlDLEdBSXJDLElBSEEsSUFBSXBqQyxHQUFTLEVBQ1QvQyxFQUFTK0UsRUFBTS9FLFNBRVYrQyxFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBUXFKLEVBQU1oQyxHQUNkd2pCLEVBQVUwaUQsRUFBU3Z0RSxHQUV2QixHQUFlLE1BQVg2cUIsU0EvMEZOMW5CLElBKzBGMEJxM0UsRUFDZjN2RCxHQUFZQSxJQUFZdXdELEdBQVN2d0QsR0FDbEM0ZixFQUFXNWYsRUFBUzJ2RCxJQUUxQixJQUFJQSxFQUFXM3ZELEVBQ1h0SixFQUFTdmhCLEVBR2pCLE9BQU91aEIsRUF1Q1QsU0FBUzg1RCxHQUFXMU0sRUFBWWYsR0FDOUIsSUFBSXJzRCxFQUFTLEdBTWIsT0FMQXcyRCxHQUFTcEosR0FBWSxTQUFTM3VFLEVBQU9xSCxFQUFPc25FLEdBQ3RDZixFQUFVNXRFLEVBQU9xSCxFQUFPc25FLElBQzFCcHRELEVBQU9sZCxLQUFLckUsTUFHVHVoQixFQWNULFNBQVMrNUQsR0FBWWp5RSxFQUFPaWpDLEVBQU9zaEMsRUFBVzJOLEVBQVVoNkQsR0FDdEQsSUFBSWxhLEdBQVMsRUFDVC9DLEVBQVMrRSxFQUFNL0UsT0FLbkIsSUFIQXNwRSxJQUFjQSxFQUFZNE4sSUFDMUJqNkQsSUFBV0EsRUFBUyxNQUVYbGEsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSXRFLEVBQVFxSixFQUFNaEMsR0FDZGlsQyxFQUFRLEdBQUtzaEMsRUFBVTV0RSxHQUNyQnNzQyxFQUFRLEVBRVZndkMsR0FBWXQ3RSxFQUFPc3NDLEVBQVEsRUFBR3NoQyxFQUFXMk4sRUFBVWg2RCxHQUVuRDRzRCxHQUFVNXNELEVBQVF2aEIsR0FFVnU3RSxJQUNWaDZELEVBQU9BLEVBQU9qZCxRQUFVdEUsR0FHNUIsT0FBT3VoQixFQWNULElBQUlrNkQsR0FBVUMsS0FZVkMsR0FBZUQsSUFBYyxHQVVqQyxTQUFTWCxHQUFXdDZFLEVBQVE4c0UsR0FDMUIsT0FBTzlzRSxHQUFVZzdFLEdBQVFoN0UsRUFBUThzRSxFQUFVN2xFLElBVzdDLFNBQVN1ekUsR0FBZ0J4NkUsRUFBUThzRSxHQUMvQixPQUFPOXNFLEdBQVVrN0UsR0FBYWw3RSxFQUFROHNFLEVBQVU3bEUsSUFZbEQsU0FBU2swRSxHQUFjbjdFLEVBQVFtL0QsR0FDN0IsT0FBT2lPLEdBQVlqTyxHQUFPLFNBQVN0L0QsR0FDakMsT0FBT3U3RSxHQUFXcDdFLEVBQU9ILE9BWTdCLFNBQVN3N0UsR0FBUXI3RSxFQUFRNlMsR0FNdkIsSUFIQSxJQUFJak0sRUFBUSxFQUNSL0MsR0FISmdQLEVBQU95b0UsR0FBU3pvRSxFQUFNN1MsSUFHSjZELE9BRUQsTUFBVjdELEdBQWtCNEcsRUFBUS9DLEdBQy9CN0QsRUFBU0EsRUFBT3U3RSxHQUFNMW9FLEVBQUtqTSxPQUU3QixPQUFRQSxHQUFTQSxHQUFTL0MsRUFBVTdELE9BMy9GcEMwQyxFQXlnR0YsU0FBUzg0RSxHQUFleDdFLEVBQVF5N0UsRUFBVUMsR0FDeEMsSUFBSTU2RCxFQUFTMjZELEVBQVN6N0UsR0FDdEIsT0FBTzRyQixHQUFRNXJCLEdBQVU4Z0IsRUFBUzRzRCxHQUFVNXNELEVBQVE0NkQsRUFBWTE3RSxJQVVsRSxTQUFTMjdFLEdBQVdwOEUsR0FDbEIsT0FBYSxNQUFUQSxPQXRoR0ptRCxJQXVoR1NuRCxFQW43Rk0scUJBUkwsZ0JBNjdGRjJ5RSxJQUFrQkEsTUFBa0JsekUsR0FBT08sR0EyM0ZyRCxTQUFtQkEsR0FDakIsSUFBSXE4RSxFQUFRejdFLEdBQWUxQixLQUFLYyxFQUFPMnlFLElBQ25DZ0csRUFBTTM0RSxFQUFNMnlFLElBRWhCLElBQ0UzeUUsRUFBTTJ5RSxTQXo1TFJ4dkUsRUEwNUxFLElBQUltNUUsR0FBVyxFQUNmLE1BQU83aUUsSUFFVCxJQUFJOEgsRUFBU3d3RCxHQUFxQjd5RSxLQUFLYyxHQUNuQ3M4RSxJQUNFRCxFQUNGcjhFLEVBQU0yeUUsSUFBa0JnRyxTQUVqQjM0RSxFQUFNMnlFLEtBR2pCLE9BQU9weEQsRUEzNEZIZzdELENBQVV2OEUsR0ErNUdoQixTQUF3QkEsR0FDdEIsT0FBTyt4RSxHQUFxQjd5RSxLQUFLYyxHQS81RzdCdzhFLENBQWV4OEUsR0FZckIsU0FBU3k4RSxHQUFPejhFLEVBQU82akIsR0FDckIsT0FBTzdqQixFQUFRNmpCLEVBV2pCLFNBQVM2NEQsR0FBUWo4RSxFQUFRSCxHQUN2QixPQUFpQixNQUFWRyxHQUFrQkcsR0FBZTFCLEtBQUt1QixFQUFRSCxHQVd2RCxTQUFTcThFLEdBQVVsOEUsRUFBUUgsR0FDekIsT0FBaUIsTUFBVkcsR0FBa0JILEtBQU9iLEdBQU9nQixHQTBCekMsU0FBU204RSxHQUFpQkMsRUFBUXRQLEVBQVU5aUMsR0FTMUMsSUFSQSxJQUFJMnZDLEVBQVczdkMsRUFBYXdqQyxHQUFvQkYsR0FDNUN6cEUsRUFBU3U0RSxFQUFPLEdBQUd2NEUsT0FDbkJ3NEUsRUFBWUQsRUFBT3Y0RSxPQUNuQnk0RSxFQUFXRCxFQUNYRSxFQUFTdjNFLEVBQU1xM0UsR0FDZkcsRUFBWTlpQyxJQUNaNTRCLEVBQVMsR0FFTnc3RCxLQUFZLENBQ2pCLElBQUkxekUsRUFBUXd6RSxFQUFPRSxHQUNmQSxHQUFZeFAsSUFDZGxrRSxFQUFRNmtFLEdBQVM3a0UsRUFBT3FtRSxHQUFVbkMsS0FFcEMwUCxFQUFZeEosR0FBVXBxRSxFQUFNL0UsT0FBUTI0RSxHQUNwQ0QsRUFBT0QsSUFBYXR5QyxJQUFlOGlDLEdBQWFqcEUsR0FBVSxLQUFPK0UsRUFBTS9FLFFBQVUsS0FDN0UsSUFBSSt4RSxHQUFTMEcsR0FBWTF6RSxRQTFtRy9CbEcsRUE2bUdBa0csRUFBUXd6RSxFQUFPLEdBRWYsSUFBSXgxRSxHQUFTLEVBQ1Q2MUUsRUFBT0YsRUFBTyxHQUVsQnpDLEVBQ0EsT0FBU2x6RSxFQUFRL0MsR0FBVWlkLEVBQU9qZCxPQUFTMjRFLEdBQVcsQ0FDcEQsSUFBSWo5RSxFQUFRcUosRUFBTWhDLEdBQ2RtekUsRUFBV2pOLEVBQVdBLEVBQVN2dEUsR0FBU0EsRUFHNUMsR0FEQUEsRUFBU3lxQyxHQUF3QixJQUFWenFDLEVBQWVBLEVBQVEsSUFDeENrOUUsRUFDRXROLEdBQVNzTixFQUFNMUMsR0FDZkosRUFBUzc0RCxFQUFRaTVELEVBQVUvdkMsSUFDNUIsQ0FFTCxJQURBc3lDLEVBQVdELElBQ0ZDLEdBQVUsQ0FDakIsSUFBSWxOLEVBQVFtTixFQUFPRCxHQUNuQixLQUFNbE4sRUFDRUQsR0FBU0MsRUFBTzJLLEdBQ2hCSixFQUFTeUMsRUFBT0UsR0FBV3ZDLEVBQVUvdkMsSUFFM0MsU0FBUzh2QyxFQUdUMkMsR0FDRkEsRUFBSzc0RSxLQUFLbTJFLEdBRVpqNUQsRUFBT2xkLEtBQUtyRSxJQUdoQixPQUFPdWhCLEVBK0JULFNBQVM0N0QsR0FBVzE4RSxFQUFRNlMsRUFBTWhTLEdBR2hDLElBQUl5N0IsRUFBaUIsT0FEckJ0OEIsRUFBU2tSLEdBQU9sUixFQURoQjZTLEVBQU95b0UsR0FBU3pvRSxFQUFNN1MsS0FFTUEsRUFBU0EsRUFBT3U3RSxHQUFNdmhCLEdBQUtubkQsS0FDdkQsT0FBZSxNQUFSeXBCLE9BL3FHUDU1QixFQStxR2tDaEMsR0FBTTQ3QixFQUFNdDhCLEVBQVFhLEdBVXhELFNBQVM4N0UsR0FBZ0JwOUUsR0FDdkIsT0FBTzgwRSxHQUFhOTBFLElBQVVvOEUsR0FBV3A4RSxJQUFVa21FLEVBdUNyRCxTQUFTbVgsR0FBWXI5RSxFQUFPNmpCLEVBQU93MEQsRUFBU0MsRUFBWTVyRCxHQUN0RCxPQUFJMXNCLElBQVU2akIsSUFHRCxNQUFUN2pCLEdBQTBCLE1BQVQ2akIsSUFBbUJpeEQsR0FBYTkwRSxLQUFXODBFLEdBQWFqeEQsR0FDcEU3akIsR0FBVUEsR0FBUzZqQixHQUFVQSxFQW1CeEMsU0FBeUJwakIsRUFBUW9qQixFQUFPdzBELEVBQVNDLEVBQVlnRixFQUFXNXdELEdBQ3RFLElBQUk2d0QsRUFBV2x4RCxHQUFRNXJCLEdBQ25CKzhFLEVBQVdueEQsR0FBUXhJLEdBQ25CNDVELEVBQVNGLEVBQVdwWCxFQUFXeVMsR0FBT240RSxHQUN0Q2k5RSxFQUFTRixFQUFXclgsRUFBV3lTLEdBQU8vMEQsR0FLdEM4NUQsR0FISkYsRUFBU0EsR0FBVXZYLEVBQVVTLEVBQVk4VyxJQUdoQjlXLEVBQ3JCaVgsR0FISkYsRUFBU0EsR0FBVXhYLEVBQVVTLEVBQVkrVyxJQUdoQi9XLEVBQ3JCa1gsRUFBWUosR0FBVUMsRUFFMUIsR0FBSUcsR0FBYXpLLEdBQVMzeUUsR0FBUyxDQUNqQyxJQUFLMnlFLEdBQVN2dkQsR0FDWixPQUFPLEVBRVQwNUQsR0FBVyxFQUNYSSxHQUFXLEVBRWIsR0FBSUUsSUFBY0YsRUFFaEIsT0FEQWp4RCxJQUFVQSxFQUFRLElBQUk2cEQsSUFDZGdILEdBQVlwUSxHQUFhMXNFLEdBQzdCcTlFLEdBQVlyOUUsRUFBUW9qQixFQUFPdzBELEVBQVNDLEVBQVlnRixFQUFXNXdELEdBODFFbkUsU0FBb0Jqc0IsRUFBUW9qQixFQUFPODBELEVBQUtOLEVBQVNDLEVBQVlnRixFQUFXNXdELEdBQ3RFLE9BQVFpc0QsR0FDTixLQUFLelIsRUFDSCxHQUFLem1FLEVBQU93b0IsWUFBY3BGLEVBQU1vRixZQUMzQnhvQixFQUFPODRFLFlBQWMxMUQsRUFBTTAxRCxXQUM5QixPQUFPLEVBRVQ5NEUsRUFBU0EsRUFBTzJwQixPQUNoQnZHLEVBQVFBLEVBQU11RyxPQUVoQixLQUFLNjhDLEVBQ0gsUUFBS3htRSxFQUFPd29CLFlBQWNwRixFQUFNb0YsYUFDM0JxMEQsRUFBVSxJQUFJbDBELEdBQVczb0IsR0FBUyxJQUFJMm9CLEdBQVd2RixLQUt4RCxLQUFLdWlELEVBQ0wsS0FBS0MsRUFDTCxLQUFLSyxFQUdILE9BQU8rUSxJQUFJaDNFLEdBQVNvakIsR0FFdEIsS0FBS3lpRCxFQUNILE9BQU83bEUsRUFBT25CLE1BQVF1a0IsRUFBTXZrQixNQUFRbUIsRUFBT2lHLFNBQVdtZCxFQUFNbmQsUUFFOUQsS0FBS2tnRSxFQUNMLEtBQUtFLEVBSUgsT0FBT3JtRSxHQUFXb2pCLEVBQVEsR0FFNUIsS0FBSzRpRCxFQUNILElBQUlzWCxFQUFVdE4sR0FFaEIsS0FBSzVKLEVBQ0gsSUFBSW1YLEVBeG5MZSxFQXduTEgzRixFQUdoQixHQUZBMEYsSUFBWUEsRUFBVWxOLElBRWxCcHdFLEVBQU9tVSxNQUFRaVAsRUFBTWpQLE9BQVNvcEUsRUFDaEMsT0FBTyxFQUdULElBQUluRSxFQUFVbnRELEVBQU05c0IsSUFBSWEsR0FDeEIsR0FBSW81RSxFQUNGLE9BQU9BLEdBQVdoMkQsRUFFcEJ3MEQsR0Fsb0xxQixFQXFvTHJCM3JELEVBQU14bUIsSUFBSXpGLEVBQVFvakIsR0FDbEIsSUFBSXRDLEVBQVN1OEQsR0FBWUMsRUFBUXQ5RSxHQUFTczlFLEVBQVFsNkQsR0FBUXcwRCxFQUFTQyxFQUFZZ0YsRUFBVzV3RCxHQUUxRixPQURBQSxFQUFjLE9BQUVqc0IsR0FDVDhnQixFQUVULEtBQUt3bEQsRUFDSCxHQUFJMk4sR0FDRixPQUFPQSxHQUFjeDFFLEtBQUt1QixJQUFXaTBFLEdBQWN4MUUsS0FBSzJrQixHQUc5RCxPQUFPLEVBMzVFRG82RCxDQUFXeDlFLEVBQVFvakIsRUFBTzQ1RCxFQUFRcEYsRUFBU0MsRUFBWWdGLEVBQVc1d0QsR0FFeEUsS0F2dkd1QixFQXV2R2pCMnJELEdBQWlDLENBQ3JDLElBQUk2RixFQUFlUCxHQUFZLzhFLEdBQWUxQixLQUFLdUIsRUFBUSxlQUN2RDA5RSxFQUFlUCxHQUFZaDlFLEdBQWUxQixLQUFLMmtCLEVBQU8sZUFFMUQsR0FBSXE2RCxHQUFnQkMsRUFBYyxDQUNoQyxJQUFJQyxFQUFlRixFQUFlejlFLEVBQU9ULFFBQVVTLEVBQy9DNDlFLEVBQWVGLEVBQWV0NkQsRUFBTTdqQixRQUFVNmpCLEVBR2xELE9BREE2SSxJQUFVQSxFQUFRLElBQUk2cEQsSUFDZitHLEVBQVVjLEVBQWNDLEVBQWNoRyxFQUFTQyxFQUFZNXJELElBR3RFLElBQUtteEQsRUFDSCxPQUFPLEVBR1QsT0FEQW54RCxJQUFVQSxFQUFRLElBQUk2cEQsSUEwNUV4QixTQUFzQjkxRSxFQUFRb2pCLEVBQU93MEQsRUFBU0MsRUFBWWdGLEVBQVc1d0QsR0FDbkUsSUFBSXN4RCxFQWpxTG1CLEVBaXFMUDNGLEVBQ1ppRyxFQUFXLzFCLEdBQVc5bkQsR0FDdEI4OUUsRUFBWUQsRUFBU2g2RSxPQUVyQnc0RSxFQURXdjBCLEdBQVcxa0MsR0FDRHZmLE9BRXpCLEdBQUlpNkUsR0FBYXpCLElBQWNrQixFQUM3QixPQUFPLEVBRVQsSUFBSTMyRSxFQUFRazNFLEVBQ1osS0FBT2wzRSxLQUFTLENBQ2QsSUFBSS9HLEVBQU1nK0UsRUFBU2ozRSxHQUNuQixLQUFNMjJFLEVBQVkxOUUsS0FBT3VqQixFQUFRampCLEdBQWUxQixLQUFLMmtCLEVBQU92akIsSUFDMUQsT0FBTyxFQUlYLElBQUlrK0UsRUFBYTl4RCxFQUFNOXNCLElBQUlhLEdBQ3ZCZytFLEVBQWEveEQsRUFBTTlzQixJQUFJaWtCLEdBQzNCLEdBQUkyNkQsR0FBY0MsRUFDaEIsT0FBT0QsR0FBYzM2RCxHQUFTNDZELEdBQWNoK0UsRUFFOUMsSUFBSThnQixHQUFTLEVBQ2JtTCxFQUFNeG1CLElBQUl6RixFQUFRb2pCLEdBQ2xCNkksRUFBTXhtQixJQUFJMmQsRUFBT3BqQixHQUVqQixJQUFJaStFLEVBQVdWLEVBQ2YsT0FBUzMyRSxFQUFRazNFLEdBQVcsQ0FDMUJqK0UsRUFBTWcrRSxFQUFTajNFLEdBQ2YsSUFBSXV3RSxFQUFXbjNFLEVBQU9ILEdBQ2xCcStFLEVBQVc5NkQsRUFBTXZqQixHQUVyQixHQUFJZzRFLEVBQ0YsSUFBSXNHLEVBQVdaLEVBQ1gxRixFQUFXcUcsRUFBVS9HLEVBQVV0M0UsRUFBS3VqQixFQUFPcGpCLEVBQVFpc0IsR0FDbkQ0ckQsRUFBV1YsRUFBVStHLEVBQVVyK0UsRUFBS0csRUFBUW9qQixFQUFPNkksR0FHekQsVUFudUxGdnBCLElBbXVMUXk3RSxFQUNHaEgsSUFBYStHLEdBQVlyQixFQUFVMUYsRUFBVStHLEVBQVV0RyxFQUFTQyxFQUFZNXJELEdBQzdFa3lELEdBQ0QsQ0FDTHI5RCxHQUFTLEVBQ1QsTUFFRm05RCxJQUFhQSxFQUFrQixlQUFQcCtFLEdBRTFCLEdBQUlpaEIsSUFBV205RCxFQUFVLENBQ3ZCLElBQUlHLEVBQVVwK0UsRUFBT3VILFlBQ2pCODJFLEVBQVVqN0QsRUFBTTdiLFlBR2hCNjJFLEdBQVdDLEtBQ1YsZ0JBQWlCcitFLE1BQVUsZ0JBQWlCb2pCLElBQ3pCLG1CQUFYZzdELEdBQXlCQSxhQUFtQkEsR0FDakMsbUJBQVhDLEdBQXlCQSxhQUFtQkEsSUFDdkR2OUQsR0FBUyxHQUtiLE9BRkFtTCxFQUFjLE9BQUVqc0IsR0FDaEJpc0IsRUFBYyxPQUFFN0ksR0FDVHRDLEVBdjlFQXc5RCxDQUFhdCtFLEVBQVFvakIsRUFBT3cwRCxFQUFTQyxFQUFZZ0YsRUFBVzV3RCxHQTNENURzeUQsQ0FBZ0JoL0UsRUFBTzZqQixFQUFPdzBELEVBQVNDLEVBQVkrRSxHQUFhM3dELElBbUZ6RSxTQUFTdXlELEdBQVl4K0UsRUFBUWtrQyxFQUFRdTZDLEVBQVc1RyxHQUM5QyxJQUFJanhFLEVBQVE2M0UsRUFBVTU2RSxPQUNsQkEsRUFBUytDLEVBQ1Q4M0UsR0FBZ0I3RyxFQUVwQixHQUFjLE1BQVY3M0UsRUFDRixPQUFRNkQsRUFHVixJQURBN0QsRUFBU2hCLEdBQU9nQixHQUNUNEcsS0FBUyxDQUNkLElBQUlxakIsRUFBT3cwRCxFQUFVNzNFLEdBQ3JCLEdBQUs4M0UsR0FBZ0J6MEQsRUFBSyxHQUNsQkEsRUFBSyxLQUFPanFCLEVBQU9pcUIsRUFBSyxNQUN0QkEsRUFBSyxLQUFNanFCLEdBRW5CLE9BQU8sRUFHWCxPQUFTNEcsRUFBUS9DLEdBQVEsQ0FFdkIsSUFBSWhFLEdBREpvcUIsRUFBT3cwRCxFQUFVNzNFLElBQ0YsR0FDWHV3RSxFQUFXbjNFLEVBQU9ILEdBQ2xCOCtFLEVBQVcxMEQsRUFBSyxHQUVwQixHQUFJeTBELEdBQWdCejBELEVBQUssSUFDdkIsUUFwMUdKdm5CLElBbzFHUXkwRSxLQUE0QnQzRSxLQUFPRyxHQUNyQyxPQUFPLE1BRUosQ0FDTCxJQUFJaXNCLEVBQVEsSUFBSTZwRCxHQUNoQixHQUFJK0IsRUFDRixJQUFJLzJELEVBQVMrMkQsRUFBV1YsRUFBVXdILEVBQVU5K0UsRUFBS0csRUFBUWtrQyxFQUFRalksR0FFbkUsVUE1MUdKdnBCLElBNDFHVW9lLEVBQ0U4N0QsR0FBWStCLEVBQVV4SCxFQUFVeUgsRUFBK0MvRyxFQUFZNXJELEdBQzNGbkwsR0FFTixPQUFPLEdBSWIsT0FBTyxFQVdULFNBQVMrOUQsR0FBYXQvRSxHQUNwQixTQUFLbTFFLEdBQVNuMUUsS0EwNUZFKzhCLEVBMTVGaUIvOEIsRUEyNUZ4QjZ4RSxJQUFlQSxNQUFjOTBDLE1BeDVGeEI4K0MsR0FBVzc3RSxHQUFTaXlFLEdBQWEzSSxJQUNoQ3JnRSxLQUFLbXJFLEdBQVNwMEUsSUFzNUYvQixJQUFrQis4QixFQTEyRmxCLFNBQVN3aUQsR0FBYXYvRSxHQUdwQixNQUFvQixtQkFBVEEsRUFDRkEsRUFFSSxNQUFUQSxFQUNLdy9FLEdBRVcsaUJBQVR4L0UsRUFDRnFzQixHQUFRcnNCLEdBQ1h5L0UsR0FBb0J6L0UsRUFBTSxHQUFJQSxFQUFNLElBQ3BDMC9FLEdBQVkxL0UsR0FFWFUsR0FBU1YsR0FVbEIsU0FBUzIvRSxHQUFTbC9FLEdBQ2hCLElBQUttL0UsR0FBWW4vRSxHQUNmLE9BQU84eUUsR0FBVzl5RSxHQUVwQixJQUFJOGdCLEVBQVMsR0FDYixJQUFLLElBQUlqaEIsS0FBT2IsR0FBT2dCLEdBQ2pCRyxHQUFlMUIsS0FBS3VCLEVBQVFILElBQWUsZUFBUEEsR0FDdENpaEIsRUFBT2xkLEtBQUsvRCxHQUdoQixPQUFPaWhCLEVBVVQsU0FBU3MrRCxHQUFXcC9FLEdBQ2xCLElBQUswMEUsR0FBUzEwRSxHQUNaLE9BMDlGSixTQUFzQkEsR0FDcEIsSUFBSThnQixFQUFTLEdBQ2IsR0FBYyxNQUFWOWdCLEVBQ0YsSUFBSyxJQUFJSCxLQUFPYixHQUFPZ0IsR0FDckI4Z0IsRUFBT2xkLEtBQUsvRCxHQUdoQixPQUFPaWhCLEVBaitGRXUrRCxDQUFhci9FLEdBRXRCLElBQUlzL0UsRUFBVUgsR0FBWW4vRSxHQUN0QjhnQixFQUFTLEdBRWIsSUFBSyxJQUFJamhCLEtBQU9HLEdBQ0QsZUFBUEgsSUFBeUJ5L0UsR0FBWW4vRSxHQUFlMUIsS0FBS3VCLEVBQVFILEtBQ3JFaWhCLEVBQU9sZCxLQUFLL0QsR0FHaEIsT0FBT2loQixFQVlULFNBQVN5K0QsR0FBT2hnRixFQUFPNmpCLEdBQ3JCLE9BQU83akIsRUFBUTZqQixFQVdqQixTQUFTbzhELEdBQVF0UixFQUFZcEIsR0FDM0IsSUFBSWxtRSxHQUFTLEVBQ1RrYSxFQUFTMitELEdBQVl2UixHQUFjbHBFLEVBQU1rcEUsRUFBV3JxRSxRQUFVLEdBS2xFLE9BSEF5ekUsR0FBU3BKLEdBQVksU0FBUzN1RSxFQUFPTSxFQUFLcXVFLEdBQ3hDcHRELElBQVNsYSxHQUFTa21FLEVBQVN2dEUsRUFBT00sRUFBS3F1RSxNQUVsQ3B0RCxFQVVULFNBQVNtK0QsR0FBWS82QyxHQUNuQixJQUFJdTZDLEVBQVlpQixHQUFheDdDLEdBQzdCLE9BQXdCLEdBQXBCdTZDLEVBQVU1NkUsUUFBZTQ2RSxFQUFVLEdBQUcsR0FDakNrQixHQUF3QmxCLEVBQVUsR0FBRyxHQUFJQSxFQUFVLEdBQUcsSUFFeEQsU0FBU3orRSxHQUNkLE9BQU9BLElBQVdra0MsR0FBVXM2QyxHQUFZeCtFLEVBQVFra0MsRUFBUXU2QyxJQVk1RCxTQUFTTyxHQUFvQm5zRSxFQUFNOHJFLEdBQ2pDLE9BQUlpQixHQUFNL3NFLElBQVNndEUsR0FBbUJsQixHQUM3QmdCLEdBQXdCcEUsR0FBTTFvRSxHQUFPOHJFLEdBRXZDLFNBQVMzK0UsR0FDZCxJQUFJbTNFLEVBQVdoNEUsR0FBSWEsRUFBUTZTLEdBQzNCLFlBemhIRm5RLElBeWhIVXkwRSxHQUEwQkEsSUFBYXdILEVBQzNDbUIsR0FBTTkvRSxFQUFRNlMsR0FDZCtwRSxHQUFZK0IsRUFBVXhILEVBQVV5SCxJQWV4QyxTQUFTbUIsR0FBVS8vRSxFQUFRa2tDLEVBQVE4N0MsRUFBVW5JLEVBQVk1ckQsR0FDbkRqc0IsSUFBV2trQyxHQUdmODJDLEdBQVE5MkMsR0FBUSxTQUFTeTZDLEVBQVU5K0UsR0FFakMsR0FEQW9zQixJQUFVQSxFQUFRLElBQUk2cEQsSUFDbEJwQixHQUFTaUssSUErQmpCLFNBQXVCMytFLEVBQVFra0MsRUFBUXJrQyxFQUFLbWdGLEVBQVVDLEVBQVdwSSxFQUFZNXJELEdBQzNFLElBQUlrckQsRUFBVytJLEdBQVFsZ0YsRUFBUUgsR0FDM0I4K0UsRUFBV3VCLEdBQVFoOEMsRUFBUXJrQyxHQUMzQnU1RSxFQUFVbnRELEVBQU05c0IsSUFBSXcvRSxHQUV4QixHQUFJdkYsRUFFRixZQURBckMsR0FBaUIvMkUsRUFBUUgsRUFBS3U1RSxHQUdoQyxJQUFJK0csRUFBV3RJLEVBQ1hBLEVBQVdWLEVBQVV3SCxFQUFXOStFLEVBQU0sR0FBS0csRUFBUWtrQyxFQUFRalksUUF6bEgvRHZwQixFQTRsSElrM0UsT0E1bEhKbDNFLElBNGxIZXk5RSxFQUVmLEdBQUl2RyxFQUFVLENBQ1osSUFBSTNELEVBQVFycUQsR0FBUSt5RCxHQUNoQnZJLEdBQVVILEdBQVN0RCxHQUFTZ00sR0FDNUJ5QixHQUFXbkssSUFBVUcsR0FBVTFKLEdBQWFpUyxHQUVoRHdCLEVBQVd4QixFQUNQMUksR0FBU0csR0FBVWdLLEVBQ2pCeDBELEdBQVF1ckQsR0FDVmdKLEVBQVdoSixFQUVKa0osR0FBa0JsSixHQUN6QmdKLEVBQVd2SixHQUFVTyxHQUVkZixHQUNQd0QsR0FBVyxFQUNYdUcsRUFBVzlILEdBQVlzRyxHQUFVLElBRTFCeUIsR0FDUHhHLEdBQVcsRUFDWHVHLEVBQVduSCxHQUFnQjJGLEdBQVUsSUFHckN3QixFQUFXLEdBR05oa0QsR0FBY3dpRCxJQUFheEksR0FBWXdJLElBQzlDd0IsRUFBV2hKLEVBQ1BoQixHQUFZZ0IsR0FDZGdKLEVBQVdHLEdBQWNuSixHQUVqQnpDLEdBQVN5QyxLQUFhaUUsR0FBV2pFLEtBQ3pDZ0osRUFBVzdILEdBQWdCcUcsS0FJN0IvRSxHQUFXLEVBR1hBLElBRUYzdEQsRUFBTXhtQixJQUFJazVFLEVBQVV3QixHQUNwQkYsRUFBVUUsRUFBVXhCLEVBQVVxQixFQUFVbkksRUFBWTVyRCxHQUNwREEsRUFBYyxPQUFFMHlELElBRWxCNUgsR0FBaUIvMkUsRUFBUUgsRUFBS3NnRixHQXpGMUJJLENBQWN2Z0YsRUFBUWtrQyxFQUFRcmtDLEVBQUttZ0YsRUFBVUQsR0FBV2xJLEVBQVk1ckQsT0FFakUsQ0FDSCxJQUFJazBELEVBQVd0SSxFQUNYQSxFQUFXcUksR0FBUWxnRixFQUFRSCxHQUFNOCtFLEVBQVc5K0UsRUFBTSxHQUFLRyxFQUFRa2tDLEVBQVFqWSxRQXJqSC9FdnBCLFdBd2pIUXk5RSxJQUNGQSxFQUFXeEIsR0FFYjVILEdBQWlCLzJFLEVBQVFILEVBQUtzZ0YsTUFFL0IxSCxJQXdGTCxTQUFTK0gsR0FBUTUzRSxFQUFPN0ksR0FDdEIsSUFBSThELEVBQVMrRSxFQUFNL0UsT0FDbkIsR0FBS0EsRUFJTCxPQUFPMHlFLEdBRFB4MkUsR0FBS0EsRUFBSSxFQUFJOEQsRUFBUyxFQUNKQSxHQUFVK0UsRUFBTTdJLFFBM3BIbEMyQyxFQXVxSEYsU0FBUys5RSxHQUFZdlMsRUFBWXdTLEVBQVdDLEdBRXhDRCxFQURFQSxFQUFVNzhFLE9BQ0E0cEUsR0FBU2lULEdBQVcsU0FBUzVULEdBQ3ZDLE9BQUlsaEQsR0FBUWtoRCxHQUNILFNBQVN2dEUsR0FDZCxPQUFPODdFLEdBQVE5N0UsRUFBMkIsSUFBcEJ1dEUsRUFBU2pwRSxPQUFlaXBFLEVBQVMsR0FBS0EsSUFHekRBLEtBR0csQ0FBQ2lTLElBR2YsSUFBSW40RSxHQUFTLEVBVWIsT0FUQTg1RSxFQUFZalQsR0FBU2lULEVBQVd6UixHQUFVMlIsT0FueEY5QyxTQUFvQmg0RSxFQUFPaTRFLEdBQ3pCLElBQUloOUUsRUFBUytFLEVBQU0vRSxPQUduQixJQURBK0UsRUFBTWdyQixLQUFLaXRELEdBQ0poOUUsS0FDTCtFLEVBQU0vRSxHQUFVK0UsRUFBTS9FLEdBQVF0RSxNQUVoQyxPQUFPcUosRUFxeEZFazRFLENBUE10QixHQUFRdFIsR0FBWSxTQUFTM3VFLEVBQU9NLEVBQUtxdUUsR0FJcEQsTUFBTyxDQUFFLFNBSE1ULEdBQVNpVCxHQUFXLFNBQVM1VCxHQUMxQyxPQUFPQSxFQUFTdnRFLE1BRWEsUUFBV3FILEVBQU8sTUFBU3JILE9BR2xDLFNBQVNTLEVBQVFvakIsR0FDekMsT0EwNEJKLFNBQXlCcGpCLEVBQVFvakIsRUFBT3U5RCxHQUN0QyxJQUFJLzVFLEdBQVMsRUFDVG02RSxFQUFjL2dGLEVBQU9naEYsU0FDckJDLEVBQWM3OUQsRUFBTTQ5RCxTQUNwQm45RSxFQUFTazlFLEVBQVlsOUUsT0FDckJxOUUsRUFBZVAsRUFBTzk4RSxPQUUxQixPQUFTK0MsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSWlkLEVBQVNxZ0UsR0FBaUJKLEVBQVluNkUsR0FBUXE2RSxFQUFZcjZFLElBQzlELEdBQUlrYSxFQUFRLENBQ1YsR0FBSWxhLEdBQVNzNkUsRUFDWCxPQUFPcGdFLEVBRVQsSUFBSXNnRSxFQUFRVCxFQUFPLzVFLEdBQ25CLE9BQU9rYSxHQUFtQixRQUFUc2dFLEdBQW1CLEVBQUksSUFVNUMsT0FBT3BoRixFQUFPNEcsTUFBUXdjLEVBQU14YyxNQWw2Qm5CeTZFLENBQWdCcmhGLEVBQVFvakIsRUFBT3U5RCxNQTRCMUMsU0FBU1csR0FBV3RoRixFQUFRNHBDLEVBQU91akMsR0FLakMsSUFKQSxJQUFJdm1FLEdBQVMsRUFDVC9DLEVBQVMrbEMsRUFBTS9sQyxPQUNmaWQsRUFBUyxLQUVKbGEsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSWdQLEVBQU8rMkIsRUFBTWhqQyxHQUNickgsRUFBUTg3RSxHQUFRcjdFLEVBQVE2UyxHQUV4QnM2RCxFQUFVNXRFLEVBQU9zVCxJQUNuQjB1RSxHQUFRemdFLEVBQVF3NkQsR0FBU3pvRSxFQUFNN1MsR0FBU1QsR0FHNUMsT0FBT3VoQixFQTJCVCxTQUFTMGdFLEdBQVk1NEUsRUFBT3FMLEVBQVE2NEQsRUFBVTlpQyxHQUM1QyxJQUFJaDRCLEVBQVVnNEIsRUFBYXlrQyxHQUFrQmxCLEdBQ3pDM21FLEdBQVMsRUFDVC9DLEVBQVNvUSxFQUFPcFEsT0FDaEI0NEUsRUFBTzd6RSxFQVFYLElBTklBLElBQVVxTCxJQUNaQSxFQUFTMmlFLEdBQVUzaUUsSUFFakI2NEQsSUFDRjJQLEVBQU9oUCxHQUFTN2tFLEVBQU9xbUUsR0FBVW5DLE9BRTFCbG1FLEVBQVEvQyxHQUtmLElBSkEsSUFBSXdxRSxFQUFZLEVBQ1o5dUUsRUFBUTBVLEVBQU9yTixHQUNmbXpFLEVBQVdqTixFQUFXQSxFQUFTdnRFLEdBQVNBLEdBRXBDOHVFLEVBQVlyOEQsRUFBUXlxRSxFQUFNMUMsRUFBVTFMLEVBQVdya0MsS0FBZ0IsR0FDakV5eUMsSUFBUzd6RSxHQUNYeWhDLEdBQU81ckMsS0FBS2crRSxFQUFNcE8sRUFBVyxHQUUvQmhrQyxHQUFPNXJDLEtBQUttSyxFQUFPeWxFLEVBQVcsR0FHbEMsT0FBT3psRSxFQVlULFNBQVM2NEUsR0FBVzc0RSxFQUFPODRFLEdBSXpCLElBSEEsSUFBSTc5RSxFQUFTK0UsRUFBUTg0RSxFQUFRNzlFLE9BQVMsRUFDbEMwc0UsRUFBWTFzRSxFQUFTLEVBRWxCQSxLQUFVLENBQ2YsSUFBSStDLEVBQVE4NkUsRUFBUTc5RSxHQUNwQixHQUFJQSxHQUFVMHNFLEdBQWEzcEUsSUFBVXVqQixFQUFVLENBQzdDLElBQUlBLEVBQVd2akIsRUFDWDJ2RSxHQUFRM3ZFLEdBQ1Z5akMsR0FBTzVyQyxLQUFLbUssRUFBT2hDLEVBQU8sR0FFMUIrNkUsR0FBVS80RSxFQUFPaEMsSUFJdkIsT0FBT2dDLEVBWVQsU0FBUzZ0RSxHQUFXaUIsRUFBT3p2QixHQUN6QixPQUFPeXZCLEVBQVFsRixHQUFZVyxNQUFrQmxyQixFQUFReXZCLEVBQVEsSUFrQy9ELFNBQVNrSyxHQUFXeDZDLEVBQVFybkMsR0FDMUIsSUFBSStnQixFQUFTLEdBQ2IsSUFBS3NtQixHQUFVcm5DLEVBQUksR0FBS0EsRUE5eUhMLGlCQSt5SGpCLE9BQU8rZ0IsRUFJVCxHQUNNL2dCLEVBQUksSUFDTitnQixHQUFVc21CLElBRVpybkMsRUFBSXl5RSxHQUFZenlFLEVBQUksTUFFbEJxbkMsR0FBVUEsU0FFTHJuQyxHQUVULE9BQU8rZ0IsRUFXVCxTQUFTK2dFLEdBQVN2bEQsRUFBTTBLLEdBQ3RCLE9BQU84NkMsR0FBWUMsR0FBU3psRCxFQUFNMEssRUFBTyszQyxJQUFXemlELEVBQU8sSUFVN0QsU0FBUzBsRCxHQUFXOVQsR0FDbEIsT0FBT3NJLEdBQVl2aUUsR0FBT2k2RCxJQVc1QixTQUFTK1QsR0FBZS9ULEVBQVludUUsR0FDbEMsSUFBSTZJLEVBQVFxTCxHQUFPaTZELEdBQ25CLE9BQU95SSxHQUFZL3RFLEVBQU9pdUUsR0FBVTkyRSxFQUFHLEVBQUc2SSxFQUFNL0UsU0FhbEQsU0FBUzA5RSxHQUFRdmhGLEVBQVE2UyxFQUFNdFQsRUFBT3M0RSxHQUNwQyxJQUFLbkQsR0FBUzEwRSxHQUNaLE9BQU9BLEVBU1QsSUFMQSxJQUFJNEcsR0FBUyxFQUNUL0MsR0FISmdQLEVBQU95b0UsR0FBU3pvRSxFQUFNN1MsSUFHSjZELE9BQ2Qwc0UsRUFBWTFzRSxFQUFTLEVBQ3JCcStFLEVBQVNsaUYsRUFFSSxNQUFWa2lGLEtBQW9CdDdFLEVBQVEvQyxHQUFRLENBQ3pDLElBQUloRSxFQUFNMDdFLEdBQU0xb0UsRUFBS2pNLElBQ2pCdTVFLEVBQVc1Z0YsRUFFZixHQUFZLGNBQVJNLEdBQStCLGdCQUFSQSxHQUFpQyxjQUFSQSxFQUNsRCxPQUFPRyxFQUdULEdBQUk0RyxHQUFTMnBFLEVBQVcsQ0FDdEIsSUFBSTRHLEVBQVcrSyxFQUFPcmlGLFFBNTdIMUI2QyxLQTY3SEl5OUUsRUFBV3RJLEVBQWFBLEVBQVdWLEVBQVV0M0UsRUFBS3FpRixRQTc3SHREeC9FLEtBKzdITXk5RSxFQUFXekwsR0FBU3lDLEdBQ2hCQSxFQUNDWixHQUFRMWpFLEVBQUtqTSxFQUFRLElBQU0sR0FBSyxJQUd6Q3N3RSxHQUFZZ0wsRUFBUXJpRixFQUFLc2dGLEdBQ3pCK0IsRUFBU0EsRUFBT3JpRixHQUVsQixPQUFPRyxFQVdULElBQUltaUYsR0FBZTNPLEdBQXFCLFNBQVNsM0MsRUFBTXJTLEdBRXJELE9BREF1cEQsR0FBUS90RSxJQUFJNjJCLEVBQU1yUyxHQUNYcVMsR0FGb0J5aUQsR0FhekJxRCxHQUFtQm5qRixHQUE0QixTQUFTcTlCLEVBQU04SyxHQUNoRSxPQUFPbm9DLEdBQWVxOUIsRUFBTSxXQUFZLENBQ3RDLGNBQWdCLEVBQ2hCLFlBQWMsRUFDZCxNQUFTK2xELEdBQVNqN0MsR0FDbEIsVUFBWSxLQUx3QjIzQyxHQWdCeEMsU0FBU3VELEdBQVlwVSxHQUNuQixPQUFPeUksR0FBWTFpRSxHQUFPaTZELElBWTVCLFNBQVNxVSxHQUFVMzVFLEVBQU9vK0IsRUFBT3RlLEdBQy9CLElBQUk5aEIsR0FBUyxFQUNUL0MsRUFBUytFLEVBQU0vRSxPQUVmbWpDLEVBQVEsSUFDVkEsR0FBU0EsRUFBUW5qQyxFQUFTLEVBQUtBLEVBQVNtakMsSUFFMUN0ZSxFQUFNQSxFQUFNN2tCLEVBQVNBLEVBQVM2a0IsR0FDcEIsSUFDUkEsR0FBTzdrQixHQUVUQSxFQUFTbWpDLEVBQVF0ZSxFQUFNLEVBQU1BLEVBQU1zZSxJQUFXLEVBQzlDQSxLQUFXLEVBR1gsSUFEQSxJQUFJbG1CLEVBQVM5YixFQUFNbkIsS0FDVitDLEVBQVEvQyxHQUNmaWQsRUFBT2xhLEdBQVNnQyxFQUFNaEMsRUFBUW9nQyxHQUVoQyxPQUFPbG1CLEVBWVQsU0FBUzBoRSxHQUFTdFUsRUFBWWYsR0FDNUIsSUFBSXJzRCxFQU1KLE9BSkF3MkQsR0FBU3BKLEdBQVksU0FBUzN1RSxFQUFPcUgsRUFBT3NuRSxHQUUxQyxRQURBcHRELEVBQVNxc0QsRUFBVTV0RSxFQUFPcUgsRUFBT3NuRSxTQUcxQnB0RCxFQWVYLFNBQVMyaEUsR0FBZ0I3NUUsRUFBT3JKLEVBQU9takYsR0FDckMsSUFBSXg0QyxFQUFNLEVBQ05DLEVBQWdCLE1BQVR2aEMsRUFBZ0JzaEMsRUFBTXRoQyxFQUFNL0UsT0FFdkMsR0FBb0IsaUJBQVR0RSxHQUFxQkEsR0FBVUEsR0FBUzRxQyxHQW4vSDNCdzRDLFdBbS9IMEQsQ0FDaEYsS0FBT3o0QyxFQUFNQyxHQUFNLENBQ2pCLElBQUlGLEVBQU9DLEVBQU1DLElBQVUsRUFDdkI0dkMsRUFBV254RSxFQUFNcWhDLEdBRUosT0FBYjh2QyxJQUFzQlksR0FBU1osS0FDOUIySSxFQUFjM0ksR0FBWXg2RSxFQUFVdzZFLEVBQVd4NkUsR0FDbEQycUMsRUFBTUQsRUFBTSxFQUVaRSxFQUFPRixFQUdYLE9BQU9FLEVBRVQsT0FBT3k0QyxHQUFrQmg2RSxFQUFPckosRUFBT3cvRSxHQUFVMkQsR0FnQm5ELFNBQVNFLEdBQWtCaDZFLEVBQU9ySixFQUFPdXRFLEVBQVU0VixHQUNqRCxJQUFJeDRDLEVBQU0sRUFDTkMsRUFBZ0IsTUFBVHZoQyxFQUFnQixFQUFJQSxFQUFNL0UsT0FDckMsR0FBYSxJQUFUc21DLEVBQ0YsT0FBTyxFQVNULElBTEEsSUFBSTA0QyxHQURKdGpGLEVBQVF1dEUsRUFBU3Z0RSxLQUNRQSxFQUNyQnVqRixFQUFzQixPQUFWdmpGLEVBQ1p3akYsRUFBY3BJLEdBQVNwN0UsR0FDdkJ5akYsT0E3bElKdGdGLElBNmxJcUJuRCxFQUVkMnFDLEVBQU1DLEdBQU0sQ0FDakIsSUFBSUYsRUFBTXVvQyxJQUFhdG9DLEVBQU1DLEdBQVEsR0FDakM0dkMsRUFBV2pOLEVBQVNsa0UsRUFBTXFoQyxJQUMxQmc1QyxPQWxtSU52Z0YsSUFrbUlxQnEzRSxFQUNmbUosRUFBeUIsT0FBYm5KLEVBQ1pvSixFQUFpQnBKLEdBQWFBLEVBQzlCcUosRUFBY3pJLEdBQVNaLEdBRTNCLEdBQUk4SSxFQUNGLElBQUlRLEVBQVNYLEdBQWNTLE9BRTNCRSxFQURTTCxFQUNBRyxJQUFtQlQsR0FBY08sR0FDakNILEVBQ0FLLEdBQWtCRixJQUFpQlAsSUFBZVEsR0FDbERILEVBQ0FJLEdBQWtCRixJQUFpQkMsSUFBY1IsSUFBZVUsSUFDaEVGLElBQWFFLElBR2JWLEVBQWMzSSxHQUFZeDZFLEVBQVV3NkUsRUFBV3g2RSxHQUV0RDhqRixFQUNGbjVDLEVBQU1ELEVBQU0sRUFFWkUsRUFBT0YsRUFHWCxPQUFPK29DLEdBQVU3b0MsRUExaklDdzRDLFlBc2tJcEIsU0FBU1csR0FBZTE2RSxFQUFPa2tFLEdBTTdCLElBTEEsSUFBSWxtRSxHQUFTLEVBQ1QvQyxFQUFTK0UsRUFBTS9FLE9BQ2Z3cEUsRUFBVyxFQUNYdnNELEVBQVMsS0FFSmxhLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUl0RSxFQUFRcUosRUFBTWhDLEdBQ2RtekUsRUFBV2pOLEVBQVdBLEVBQVN2dEUsR0FBU0EsRUFFNUMsSUFBS3FILElBQVVvd0UsR0FBRytDLEVBQVUwQyxHQUFPLENBQ2pDLElBQUlBLEVBQU8xQyxFQUNYajVELEVBQU91c0QsS0FBd0IsSUFBVjl0RSxFQUFjLEVBQUlBLEdBRzNDLE9BQU91aEIsRUFXVCxTQUFTeWlFLEdBQWFoa0YsR0FDcEIsTUFBb0IsaUJBQVRBLEVBQ0ZBLEVBRUxvN0UsR0FBU3A3RSxHQXhtSVAsS0EybUlFQSxFQVdWLFNBQVNpa0YsR0FBYWprRixHQUVwQixHQUFvQixpQkFBVEEsRUFDVCxPQUFPQSxFQUVULEdBQUlxc0IsR0FBUXJzQixHQUVWLE9BQU9rdUUsR0FBU2x1RSxFQUFPaWtGLElBQWdCLEdBRXpDLEdBQUk3SSxHQUFTcDdFLEdBQ1gsT0FBTzQwRSxHQUFpQkEsR0FBZTExRSxLQUFLYyxHQUFTLEdBRXZELElBQUl1aEIsRUFBVXZoQixFQUFRLEdBQ3RCLE1BQWtCLEtBQVZ1aEIsR0FBa0IsRUFBSXZoQixJQXRvSW5CLElBc29JMEMsS0FBT3VoQixFQVk5RCxTQUFTMmlFLEdBQVM3NkUsRUFBT2trRSxFQUFVOWlDLEdBQ2pDLElBQUlwakMsR0FBUyxFQUNUK3lFLEVBQVdyTSxHQUNYenBFLEVBQVMrRSxFQUFNL0UsT0FDZisxRSxHQUFXLEVBQ1g5NEQsRUFBUyxHQUNUMjdELEVBQU8zN0QsRUFFWCxHQUFJa3BCLEVBQ0Y0dkMsR0FBVyxFQUNYRCxFQUFXbk0sUUFFUixHQUFJM3BFLEdBanRJVSxJQWl0SWtCLENBQ25DLElBQUk0QixFQUFNcW5FLEVBQVcsS0FBTzRXLEdBQVU5NkUsR0FDdEMsR0FBSW5ELEVBQ0YsT0FBTzJxRSxHQUFXM3FFLEdBRXBCbTBFLEdBQVcsRUFDWEQsRUFBV3hLLEdBQ1hzTixFQUFPLElBQUk3RyxRQUdYNkcsRUFBTzNQLEVBQVcsR0FBS2hzRCxFQUV6Qmc1RCxFQUNBLE9BQVNsekUsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSXRFLEVBQVFxSixFQUFNaEMsR0FDZG16RSxFQUFXak4sRUFBV0EsRUFBU3Z0RSxHQUFTQSxFQUc1QyxHQURBQSxFQUFTeXFDLEdBQXdCLElBQVZ6cUMsRUFBZUEsRUFBUSxFQUMxQ3E2RSxHQUFZRyxHQUFhQSxFQUFVLENBRXJDLElBREEsSUFBSTRKLEVBQVlsSCxFQUFLNTRFLE9BQ2Q4L0UsS0FDTCxHQUFJbEgsRUFBS2tILEtBQWU1SixFQUN0QixTQUFTRCxFQUdUaE4sR0FDRjJQLEVBQUs3NEUsS0FBS20yRSxHQUVaajVELEVBQU9sZCxLQUFLckUsUUFFSm82RSxFQUFTOEMsRUFBTTFDLEVBQVUvdkMsS0FDN0J5eUMsSUFBUzM3RCxHQUNYMjdELEVBQUs3NEUsS0FBS20yRSxHQUVaajVELEVBQU9sZCxLQUFLckUsSUFHaEIsT0FBT3VoQixFQVdULFNBQVM2Z0UsR0FBVTNoRixFQUFRNlMsR0FHekIsT0FBaUIsT0FEakI3UyxFQUFTa1IsR0FBT2xSLEVBRGhCNlMsRUFBT3lvRSxHQUFTem9FLEVBQU03UyxhQUVVQSxFQUFPdTdFLEdBQU12aEIsR0FBS25uRCxLQWFwRCxTQUFTK3dFLEdBQVc1akYsRUFBUTZTLEVBQU1neEUsRUFBU2hNLEdBQ3pDLE9BQU8wSixHQUFRdmhGLEVBQVE2UyxFQUFNZ3hFLEVBQVF4SSxHQUFRcjdFLEVBQVE2UyxJQUFRZ2xFLEdBYy9ELFNBQVNpTSxHQUFVbDdFLEVBQU91a0UsRUFBVzRXLEVBQVF6VixHQUkzQyxJQUhBLElBQUl6cUUsRUFBUytFLEVBQU0vRSxPQUNmK0MsRUFBUTBuRSxFQUFZenFFLEdBQVUsR0FFMUJ5cUUsRUFBWTFuRSxNQUFZQSxFQUFRL0MsSUFDdENzcEUsRUFBVXZrRSxFQUFNaEMsR0FBUUEsRUFBT2dDLEtBRWpDLE9BQU9tN0UsRUFDSHhCLEdBQVUzNUUsRUFBUTBsRSxFQUFZLEVBQUkxbkUsRUFBUzBuRSxFQUFZMW5FLEVBQVEsRUFBSS9DLEdBQ25FMCtFLEdBQVUzNUUsRUFBUTBsRSxFQUFZMW5FLEVBQVEsRUFBSSxFQUFLMG5FLEVBQVl6cUUsRUFBUytDLEdBYTFFLFNBQVNvOUUsR0FBaUJ6a0YsRUFBTzBrRixHQUMvQixJQUFJbmpFLEVBQVN2aEIsRUFJYixPQUhJdWhCLGFBQWtCd3pELEtBQ3BCeHpELEVBQVNBLEVBQU92aEIsU0FFWG91RSxHQUFZc1csR0FBUyxTQUFTbmpFLEVBQVFoSixHQUMzQyxPQUFPQSxFQUFPd2tCLEtBQUs1N0IsTUFBTW9YLEVBQU82MEQsUUFBU2UsR0FBVSxDQUFDNXNELEdBQVNoSixFQUFPalgsU0FDbkVpZ0IsR0FhTCxTQUFTb2pFLEdBQVE5SCxFQUFRdFAsRUFBVTlpQyxHQUNqQyxJQUFJbm1DLEVBQVN1NEUsRUFBT3Y0RSxPQUNwQixHQUFJQSxFQUFTLEVBQ1gsT0FBT0EsRUFBUzQvRSxHQUFTckgsRUFBTyxJQUFNLEdBS3hDLElBSEEsSUFBSXgxRSxHQUFTLEVBQ1RrYSxFQUFTOWIsRUFBTW5CLEtBRVYrQyxFQUFRL0MsR0FJZixJQUhBLElBQUkrRSxFQUFRd3pFLEVBQU94MUUsR0FDZjAxRSxHQUFZLElBRVBBLEVBQVd6NEUsR0FDZHk0RSxHQUFZMTFFLElBQ2RrYSxFQUFPbGEsR0FBUzh5RSxHQUFlNTRELEVBQU9sYSxJQUFVZ0MsRUFBT3d6RSxFQUFPRSxHQUFXeFAsRUFBVTlpQyxJQUl6RixPQUFPeTVDLEdBQVM1SSxHQUFZLzVELEVBQVEsR0FBSWdzRCxFQUFVOWlDLEdBWXBELFNBQVNtNkMsR0FBY2hsQixFQUFPbHJELEVBQVFtd0UsR0FNcEMsSUFMQSxJQUFJeDlFLEdBQVMsRUFDVC9DLEVBQVNzN0QsRUFBTXQ3RCxPQUNmd2dGLEVBQWFwd0UsRUFBT3BRLE9BQ3BCaWQsRUFBUyxLQUVKbGEsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSXRFLEVBQVFxSCxFQUFReTlFLEVBQWFwd0UsRUFBT3JOLFFBcjNJMUNsRSxFQXMzSUUwaEYsRUFBV3RqRSxFQUFRcStDLEVBQU12NEQsR0FBUXJILEdBRW5DLE9BQU91aEIsRUFVVCxTQUFTd2pFLEdBQW9CL2tGLEdBQzNCLE9BQU84Z0YsR0FBa0I5Z0YsR0FBU0EsRUFBUSxHQVU1QyxTQUFTZ2xGLEdBQWFobEYsR0FDcEIsTUFBdUIsbUJBQVRBLEVBQXNCQSxFQUFRdy9FLEdBVzlDLFNBQVN6RCxHQUFTLzdFLEVBQU9TLEdBQ3ZCLE9BQUk0ckIsR0FBUXJzQixHQUNIQSxFQUVGcWdGLEdBQU1yZ0YsRUFBT1MsR0FBVSxDQUFDVCxHQUFTaWxGLEdBQWExcUUsR0FBU3ZhLElBWWhFLElBQUlrbEYsR0FBVzVDLEdBV2YsU0FBUzZDLEdBQVU5N0UsRUFBT28rQixFQUFPdGUsR0FDL0IsSUFBSTdrQixFQUFTK0UsRUFBTS9FLE9BRW5CLE9BREE2a0IsT0F0N0lBaG1CLElBczdJTWdtQixFQUFvQjdrQixFQUFTNmtCLEdBQzFCc2UsR0FBU3RlLEdBQU83a0IsRUFBVStFLEVBQVEyNUUsR0FBVTM1RSxFQUFPbytCLEVBQU90ZSxHQVNyRSxJQUFJbmdCLEdBQWU2cEUsSUFBbUIsU0FBUzlvRSxHQUM3QyxPQUFPa2hDLEdBQUtqaUMsYUFBYWUsSUFXM0IsU0FBUyt1RSxHQUFZMXVELEVBQVFtdUQsR0FDM0IsR0FBSUEsRUFDRixPQUFPbnVELEVBQU96bkIsUUFFaEIsSUFBSTJCLEVBQVM4bEIsRUFBTzlsQixPQUNoQmlkLEVBQVM0d0QsR0FBY0EsR0FBWTd0RSxHQUFVLElBQUk4bEIsRUFBT3BpQixZQUFZMUQsR0FHeEUsT0FEQThsQixFQUFPdmtCLEtBQUswYixHQUNMQSxFQVVULFNBQVNpYSxHQUFpQm1NLEdBQ3hCLElBQUlwbUIsRUFBUyxJQUFJb21CLEVBQVkzL0IsWUFBWTIvQixFQUFZMWUsWUFFckQsT0FEQSxJQUFJRyxHQUFXN0gsR0FBUXJiLElBQUksSUFBSWtqQixHQUFXdWUsSUFDbkNwbUIsRUFnRFQsU0FBU2s0RCxHQUFnQjJMLEVBQVk3TSxHQUNuQyxJQUFJbnVELEVBQVNtdUQsRUFBUy84QyxHQUFpQjRwRCxFQUFXaDdELFFBQVVnN0QsRUFBV2g3RCxPQUN2RSxPQUFPLElBQUlnN0QsRUFBV3A5RSxZQUFZb2lCLEVBQVFnN0QsRUFBVzdMLFdBQVk2TCxFQUFXOWdGLFFBVzlFLFNBQVNzOUUsR0FBaUI1aEYsRUFBTzZqQixHQUMvQixHQUFJN2pCLElBQVU2akIsRUFBTyxDQUNuQixJQUFJd2hFLE9BaGlKTmxpRixJQWdpSnFCbkQsRUFDZnVqRixFQUFzQixPQUFWdmpGLEVBQ1pzbEYsRUFBaUJ0bEYsR0FBVUEsRUFDM0J3akYsRUFBY3BJLEdBQVNwN0UsR0FFdkIwakYsT0FyaUpOdmdGLElBcWlKcUIwZ0IsRUFDZjgvRCxFQUFzQixPQUFWOS9ELEVBQ1orL0QsRUFBaUIvL0QsR0FBVUEsRUFDM0JnZ0UsRUFBY3pJLEdBQVN2M0QsR0FFM0IsSUFBTTgvRCxJQUFjRSxJQUFnQkwsR0FBZXhqRixFQUFRNmpCLEdBQ3REMi9ELEdBQWVFLEdBQWdCRSxJQUFtQkQsSUFBY0UsR0FDaEVOLEdBQWFHLEdBQWdCRSxJQUM1QnlCLEdBQWdCekIsSUFDakIwQixFQUNILE9BQU8sRUFFVCxJQUFNL0IsSUFBY0MsSUFBZ0JLLEdBQWU3akYsRUFBUTZqQixHQUN0RGdnRSxHQUFld0IsR0FBZ0JDLElBQW1CL0IsSUFBY0MsR0FDaEVHLEdBQWEwQixHQUFnQkMsSUFDNUI1QixHQUFnQjRCLElBQ2pCMUIsRUFDSCxPQUFRLEVBR1osT0FBTyxFQXVEVCxTQUFTMkIsR0FBWWprRixFQUFNa2tGLEVBQVVDLEVBQVNDLEdBVTVDLElBVEEsSUFBSUMsR0FBYSxFQUNiQyxFQUFhdGtGLEVBQUtnRCxPQUNsQnVoRixFQUFnQkosRUFBUW5oRixPQUN4QndoRixHQUFhLEVBQ2JDLEVBQWFQLEVBQVNsaEYsT0FDdEIwaEYsRUFBY3hTLEdBQVVvUyxFQUFhQyxFQUFlLEdBQ3BEdGtFLEVBQVM5YixFQUFNc2dGLEVBQWFDLEdBQzVCQyxHQUFlUCxJQUVWSSxFQUFZQyxHQUNuQnhrRSxFQUFPdWtFLEdBQWFOLEVBQVNNLEdBRS9CLE9BQVNILEVBQVlFLElBQ2ZJLEdBQWVOLEVBQVlDLEtBQzdCcmtFLEVBQU9ra0UsRUFBUUUsSUFBY3JrRixFQUFLcWtGLElBR3RDLEtBQU9LLEtBQ0x6a0UsRUFBT3VrRSxLQUFleGtGLEVBQUtxa0YsS0FFN0IsT0FBT3BrRSxFQWNULFNBQVMya0UsR0FBaUI1a0YsRUFBTWtrRixFQUFVQyxFQUFTQyxHQVdqRCxJQVZBLElBQUlDLEdBQWEsRUFDYkMsRUFBYXRrRixFQUFLZ0QsT0FDbEI2aEYsR0FBZ0IsRUFDaEJOLEVBQWdCSixFQUFRbmhGLE9BQ3hCOGhGLEdBQWMsRUFDZEMsRUFBY2IsRUFBU2xoRixPQUN2QjBoRixFQUFjeFMsR0FBVW9TLEVBQWFDLEVBQWUsR0FDcER0a0UsRUFBUzliLEVBQU11Z0YsRUFBY0ssR0FDN0JKLEdBQWVQLElBRVZDLEVBQVlLLEdBQ25CemtFLEVBQU9va0UsR0FBYXJrRixFQUFLcWtGLEdBRzNCLElBREEsSUFBSTdwRSxFQUFTNnBFLElBQ0pTLEVBQWFDLEdBQ3BCOWtFLEVBQU96RixFQUFTc3FFLEdBQWNaLEVBQVNZLEdBRXpDLE9BQVNELEVBQWVOLElBQ2xCSSxHQUFlTixFQUFZQyxLQUM3QnJrRSxFQUFPekYsRUFBUzJwRSxFQUFRVSxJQUFpQjdrRixFQUFLcWtGLE1BR2xELE9BQU9wa0UsRUFXVCxTQUFTODFELEdBQVUxeUMsRUFBUXQ3QixHQUN6QixJQUFJaEMsR0FBUyxFQUNUL0MsRUFBU3FnQyxFQUFPcmdDLE9BR3BCLElBREErRSxJQUFVQSxFQUFRNUQsRUFBTW5CLE1BQ2YrQyxFQUFRL0MsR0FDZitFLEVBQU1oQyxHQUFTczlCLEVBQU90OUIsR0FFeEIsT0FBT2dDLEVBYVQsU0FBUzR1RSxHQUFXdHpDLEVBQVFpN0IsRUFBT24vRCxFQUFRNjNFLEdBQ3pDLElBQUlnTyxHQUFTN2xGLEVBQ2JBLElBQVdBLEVBQVMsSUFLcEIsSUFIQSxJQUFJNEcsR0FBUyxFQUNUL0MsRUFBU3M3RCxFQUFNdDdELFNBRVYrQyxFQUFRL0MsR0FBUSxDQUN2QixJQUFJaEUsRUFBTXMvRCxFQUFNdjRELEdBRVp1NUUsRUFBV3RJLEVBQ1hBLEVBQVc3M0UsRUFBT0gsR0FBTXFrQyxFQUFPcmtDLEdBQU1BLEVBQUtHLEVBQVFra0MsUUFydEp4RHhoQyxXQXd0Sk15OUUsSUFDRkEsRUFBV2o4QyxFQUFPcmtDLElBRWhCZ21GLEVBQ0Y1TyxHQUFnQmozRSxFQUFRSCxFQUFLc2dGLEdBRTdCakosR0FBWWwzRSxFQUFRSCxFQUFLc2dGLEdBRzdCLE9BQU9uZ0YsRUFtQ1QsU0FBUzhsRixHQUFpQmpaLEVBQVFrWixHQUNoQyxPQUFPLFNBQVM3WCxFQUFZcEIsR0FDMUIsSUFBSXh3QyxFQUFPMVEsR0FBUXNpRCxHQUFjdEIsR0FBa0J5SyxHQUMvQ3RLLEVBQWNnWixFQUFjQSxJQUFnQixHQUVoRCxPQUFPenBELEVBQUs0eEMsRUFBWXJCLEVBQVErVCxHQUFZOVQsRUFBVSxHQUFJQyxJQVc5RCxTQUFTaVosR0FBZUMsR0FDdEIsT0FBT3BFLElBQVMsU0FBUzdoRixFQUFRa21GLEdBQy9CLElBQUl0L0UsR0FBUyxFQUNUL0MsRUFBU3FpRixFQUFRcmlGLE9BQ2pCZzBFLEVBQWFoMEUsRUFBUyxFQUFJcWlGLEVBQVFyaUYsRUFBUyxRQXh4SmpEbkIsRUF5eEpNeWpGLEVBQVF0aUYsRUFBUyxFQUFJcWlGLEVBQVEsUUF6eEpuQ3hqRixFQW95SkUsSUFUQW0xRSxFQUFjb08sRUFBU3BpRixPQUFTLEdBQTBCLG1CQUFkZzBFLEdBQ3ZDaDBFLElBQVVnMEUsUUE1eEpqQm4xRSxFQSt4Sk15akYsR0FBU0MsR0FBZUYsRUFBUSxHQUFJQSxFQUFRLEdBQUlDLEtBQ2xEdE8sRUFBYWgwRSxFQUFTLE9BaHlKMUJuQixFQWd5SjBDbTFFLEVBQ3RDaDBFLEVBQVMsR0FFWDdELEVBQVNoQixHQUFPZ0IsS0FDUDRHLEVBQVEvQyxHQUFRLENBQ3ZCLElBQUlxZ0MsRUFBU2dpRCxFQUFRdC9FLEdBQ2pCczlCLEdBQ0YraEQsRUFBU2ptRixFQUFRa2tDLEVBQVF0OUIsRUFBT2l4RSxHQUdwQyxPQUFPNzNFLEtBWVgsU0FBU3E2RSxHQUFlbE0sRUFBVUcsR0FDaEMsT0FBTyxTQUFTSixFQUFZcEIsR0FDMUIsR0FBa0IsTUFBZG9CLEVBQ0YsT0FBT0EsRUFFVCxJQUFLdVIsR0FBWXZSLEdBQ2YsT0FBT0MsRUFBU0QsRUFBWXBCLEdBTTlCLElBSkEsSUFBSWpwRSxFQUFTcXFFLEVBQVdycUUsT0FDcEIrQyxFQUFRMG5FLEVBQVl6cUUsR0FBVSxFQUM5QndpRixFQUFXcm5GLEdBQU9rdkUsSUFFZEksRUFBWTFuRSxNQUFZQSxFQUFRL0MsS0FDYSxJQUEvQ2lwRSxFQUFTdVosRUFBU3ovRSxHQUFRQSxFQUFPeS9FLEtBSXZDLE9BQU9uWSxHQVdYLFNBQVMrTSxHQUFjM00sR0FDckIsT0FBTyxTQUFTdHVFLEVBQVE4c0UsRUFBVTJPLEdBTWhDLElBTEEsSUFBSTcwRSxHQUFTLEVBQ1R5L0UsRUFBV3JuRixHQUFPZ0IsR0FDbEJtL0QsRUFBUXNjLEVBQVN6N0UsR0FDakI2RCxFQUFTczdELEVBQU10N0QsT0FFWkEsS0FBVSxDQUNmLElBQUloRSxFQUFNcy9ELEVBQU1tUCxFQUFZenFFLElBQVcrQyxHQUN2QyxJQUErQyxJQUEzQ2ttRSxFQUFTdVosRUFBU3htRixHQUFNQSxFQUFLd21GLEdBQy9CLE1BR0osT0FBT3JtRixHQWdDWCxTQUFTc21GLEdBQWdCQyxHQUN2QixPQUFPLFNBQVNuL0MsR0FHZCxJQUFJa29DLEVBQWFTLEdBRmpCM29DLEVBQVN0dEIsR0FBU3N0QixJQUdkcXBDLEdBQWNycEMsUUFwNEpwQjFrQyxFQXU0Sk1vdEUsRUFBTVIsRUFDTkEsRUFBVyxHQUNYbG9DLEVBQU9xTixPQUFPLEdBRWQreEMsRUFBV2xYLEVBQ1hvVixHQUFVcFYsRUFBWSxHQUFHdHRELEtBQUssSUFDOUJvbEIsRUFBT2xsQyxNQUFNLEdBRWpCLE9BQU80dEUsRUFBSXlXLEtBQWdCQyxHQVcvQixTQUFTQyxHQUFpQjdwRCxHQUN4QixPQUFPLFNBQVN3SyxHQUNkLE9BQU91bUMsR0FBWStZLEdBQU1DLEdBQU92L0MsR0FBUTV1QixRQUFRaXlELEdBQVEsS0FBTTd0QyxFQUFVLEtBWTVFLFNBQVNncUQsR0FBVzFxRCxHQUNsQixPQUFPLFdBSUwsSUFBSXI3QixFQUFPc0IsVUFDWCxPQUFRdEIsRUFBS2dELFFBQ1gsS0FBSyxFQUFHLE9BQU8sSUFBSXE0QixFQUNuQixLQUFLLEVBQUcsT0FBTyxJQUFJQSxFQUFLcjdCLEVBQUssSUFDN0IsS0FBSyxFQUFHLE9BQU8sSUFBSXE3QixFQUFLcjdCLEVBQUssR0FBSUEsRUFBSyxJQUN0QyxLQUFLLEVBQUcsT0FBTyxJQUFJcTdCLEVBQUtyN0IsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssSUFDL0MsS0FBSyxFQUFHLE9BQU8sSUFBSXE3QixFQUFLcjdCLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssSUFDeEQsS0FBSyxFQUFHLE9BQU8sSUFBSXE3QixFQUFLcjdCLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxJQUNqRSxLQUFLLEVBQUcsT0FBTyxJQUFJcTdCLEVBQUtyN0IsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssSUFDMUUsS0FBSyxFQUFHLE9BQU8sSUFBSXE3QixFQUFLcjdCLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxHQUFJQSxFQUFLLEdBQUlBLEVBQUssSUFFckYsSUFBSWdtRixFQUFjcFMsR0FBV3Y0QyxFQUFLaDhCLFdBQzlCNGdCLEVBQVNvYixFQUFLeDdCLE1BQU1tbUYsRUFBYWhtRixHQUlyQyxPQUFPNnpFLEdBQVM1ekQsR0FBVUEsRUFBUytsRSxHQWdEdkMsU0FBU0MsR0FBV0MsR0FDbEIsT0FBTyxTQUFTN1ksRUFBWWYsRUFBV2tCLEdBQ3JDLElBQUlnWSxFQUFXcm5GLEdBQU9rdkUsR0FDdEIsSUFBS3VSLEdBQVl2UixHQUFhLENBQzVCLElBQUlwQixFQUFXOFQsR0FBWXpULEVBQVcsR0FDdENlLEVBQWFqbkUsR0FBS2luRSxHQUNsQmYsRUFBWSxTQUFTdHRFLEdBQU8sT0FBT2l0RSxFQUFTdVosRUFBU3htRixHQUFNQSxFQUFLd21GLElBRWxFLElBQUl6L0UsRUFBUW1nRixFQUFjN1ksRUFBWWYsRUFBV2tCLEdBQ2pELE9BQU96bkUsR0FBUyxFQUFJeS9FLEVBQVN2WixFQUFXb0IsRUFBV3RuRSxHQUFTQSxRQXQvSjlEbEUsR0FpZ0tGLFNBQVNza0YsR0FBVzFZLEdBQ2xCLE9BQU8yWSxJQUFTLFNBQVNDLEdBQ3ZCLElBQUlyakYsRUFBU3FqRixFQUFNcmpGLE9BQ2YrQyxFQUFRL0MsRUFDUnNqRixFQUFTNVMsR0FBY3IwRSxVQUFVa25GLEtBS3JDLElBSEk5WSxHQUNGNFksRUFBTTU5QyxVQUVEMWlDLEtBQVMsQ0FDZCxJQUFJMDFCLEVBQU80cUQsRUFBTXRnRixHQUNqQixHQUFtQixtQkFBUjAxQixFQUNULE1BQU0sSUFBSXQ1QixHQUFVc2lFLEdBRXRCLEdBQUk2aEIsSUFBV0UsR0FBZ0MsV0FBckJDLEdBQVlockQsR0FDcEMsSUFBSStxRCxFQUFVLElBQUk5UyxHQUFjLElBQUksR0FJeEMsSUFEQTN0RSxFQUFReWdGLEVBQVV6Z0YsRUFBUS9DLElBQ2pCK0MsRUFBUS9DLEdBQVEsQ0FHdkIsSUFBSTBqRixFQUFXRCxHQUZmaHJELEVBQU80cUQsRUFBTXRnRixJQUdUcWpCLEVBQW1CLFdBQVpzOUQsRUFBd0JDLEdBQVFsckQsUUF4aEsvQzU1QixFQThoS00ya0YsRUFKRXA5RCxHQUFRdzlELEdBQVd4OUQsRUFBSyxLQUNYLEtBQVhBLEVBQUssS0FDSkEsRUFBSyxHQUFHcG1CLFFBQXFCLEdBQVhvbUIsRUFBSyxHQUVsQm85RCxFQUFRQyxHQUFZcjlELEVBQUssS0FBS3ZwQixNQUFNMm1GLEVBQVNwOUQsRUFBSyxJQUVsQyxHQUFmcVMsRUFBS3o0QixRQUFlNGpGLEdBQVduckQsR0FDdEMrcUQsRUFBUUUsS0FDUkYsRUFBUUQsS0FBSzlxRCxHQUdyQixPQUFPLFdBQ0wsSUFBSXo3QixFQUFPc0IsVUFDUDVDLEVBQVFzQixFQUFLLEdBRWpCLEdBQUl3bUYsR0FBMEIsR0FBZnhtRixFQUFLZ0QsUUFBZStuQixHQUFRcnNCLEdBQ3pDLE9BQU84bkYsRUFBUUssTUFBTW5vRixHQUFPQSxRQUs5QixJQUhBLElBQUlxSCxFQUFRLEVBQ1JrYSxFQUFTamQsRUFBU3FqRixFQUFNdGdGLEdBQU9sRyxNQUFNYyxLQUFNWCxHQUFRdEIsSUFFOUNxSCxFQUFRL0MsR0FDZmlkLEVBQVNvbUUsRUFBTXRnRixHQUFPbkksS0FBSytDLEtBQU1zZixHQUVuQyxPQUFPQSxNQXdCYixTQUFTNm1FLEdBQWFyckQsRUFBTXM3QyxFQUFTakwsRUFBU29ZLEVBQVVDLEVBQVM0QyxFQUFlQyxFQUFjQyxFQUFRQyxFQUFLQyxHQUN6RyxJQUFJQyxFQXBpS1ksSUFvaUtKclEsRUFDUnNRLEVBNWlLYSxFQTRpS0p0USxFQUNUdVEsRUE1aUtpQixFQTRpS0x2USxFQUNacU4sRUFBc0IsR0FBVnJOLEVBQ1p3USxFQXRpS2EsSUFzaUtKeFEsRUFDVDE3QyxFQUFPaXNELE9BaGxLWHpsRixFQWdsS21Da2tGLEdBQVd0cUQsR0E2QzlDLE9BM0NBLFNBQVMrcUQsSUFLUCxJQUpBLElBQUl4akYsRUFBUzFCLFVBQVUwQixPQUNuQmhELEVBQU9tRSxFQUFNbkIsR0FDYitDLEVBQVEvQyxFQUVMK0MsS0FDTC9GLEVBQUsrRixHQUFTekUsVUFBVXlFLEdBRTFCLEdBQUlxK0UsRUFDRixJQUFJdlYsRUFBYzJZLEdBQVVoQixHQUN4QmlCLEVBQWU3WSxHQUFhNXVFLEVBQU02dUUsR0FTeEMsR0FQSXFWLElBQ0Zsa0YsRUFBT2lrRixHQUFZamtGLEVBQU1ra0YsRUFBVUMsRUFBU0MsSUFFMUMyQyxJQUNGL21GLEVBQU80a0YsR0FBaUI1a0YsRUFBTSttRixFQUFlQyxFQUFjNUMsSUFFN0RwaEYsR0FBVXlrRixFQUNOckQsR0FBYXBoRixFQUFTbWtGLEVBQU8sQ0FDL0IsSUFBSU8sRUFBYXBZLEdBQWV0dkUsRUFBTTZ1RSxHQUN0QyxPQUFPOFksR0FDTGxzRCxFQUFNczdDLEVBQVMrUCxHQUFjTixFQUFRM1gsWUFBYS9DLEVBQ2xEOXJFLEVBQU0wbkYsRUFBWVQsRUFBUUMsRUFBS0MsRUFBUW5rRixHQUczQyxJQUFJZ2pGLEVBQWNxQixFQUFTdmIsRUFBVW5yRSxLQUNqQ2luRixFQUFLTixFQUFZdEIsRUFBWXZxRCxHQUFRQSxFQWN6QyxPQVpBejRCLEVBQVNoRCxFQUFLZ0QsT0FDVmlrRixFQUNGam5GLEVBQU82bkYsR0FBUTduRixFQUFNaW5GLEdBQ1pNLEdBQVV2a0YsRUFBUyxHQUM1QmhELEVBQUt5b0MsVUFFSDIrQyxHQUFTRixFQUFNbGtGLElBQ2pCaEQsRUFBS2dELE9BQVNra0YsR0FFWnZtRixNQUFRQSxPQUFTZ3BDLElBQVFocEMsZ0JBQWdCNmxGLElBQzNDb0IsRUFBS3ZzRCxHQUFRMHFELEdBQVc2QixJQUVuQkEsRUFBRy9uRixNQUFNbW1GLEVBQWFobUYsSUFhakMsU0FBUzhuRixHQUFlOWIsRUFBUStiLEdBQzlCLE9BQU8sU0FBUzVvRixFQUFROHNFLEdBQ3RCLE9BaC9ESixTQUFzQjlzRSxFQUFRNnNFLEVBQVFDLEVBQVVDLEdBSTlDLE9BSEF1TixHQUFXdDZFLEdBQVEsU0FBU1QsRUFBT00sRUFBS0csR0FDdEM2c0UsRUFBT0UsRUFBYUQsRUFBU3Z0RSxHQUFRTSxFQUFLRyxNQUVyQytzRSxFQTQrREU4YixDQUFhN29GLEVBQVE2c0UsRUFBUStiLEVBQVc5YixHQUFXLEtBWTlELFNBQVNnYyxHQUFvQmh4QyxFQUFVaXhDLEdBQ3JDLE9BQU8sU0FBU3hwRixFQUFPNmpCLEdBQ3JCLElBQUl0QyxFQUNKLFFBenBLRnBlLElBeXBLTW5ELFFBenBLTm1ELElBeXBLNkIwZ0IsRUFDekIsT0FBTzJsRSxFQUtULFFBL3BLRnJtRixJQTRwS01uRCxJQUNGdWhCLEVBQVN2aEIsUUE3cEtibUQsSUErcEtNMGdCLEVBQXFCLENBQ3ZCLFFBaHFLSjFnQixJQWdxS1FvZSxFQUNGLE9BQU9zQyxFQUVXLGlCQUFUN2pCLEdBQXFDLGlCQUFUNmpCLEdBQ3JDN2pCLEVBQVFpa0YsR0FBYWprRixHQUNyQjZqQixFQUFRb2dFLEdBQWFwZ0UsS0FFckI3akIsRUFBUWdrRixHQUFhaGtGLEdBQ3JCNmpCLEVBQVFtZ0UsR0FBYW5nRSxJQUV2QnRDLEVBQVNnM0IsRUFBU3Y0QyxFQUFPNmpCLEdBRTNCLE9BQU90QyxHQVdYLFNBQVNrb0UsR0FBV0MsR0FDbEIsT0FBT2hDLElBQVMsU0FBU3ZHLEdBRXZCLE9BREFBLEVBQVlqVCxHQUFTaVQsRUFBV3pSLEdBQVUyUixPQUNuQ2lCLElBQVMsU0FBU2hoRixHQUN2QixJQUFJOHJFLEVBQVVuckUsS0FDZCxPQUFPeW5GLEVBQVV2SSxHQUFXLFNBQVM1VCxHQUNuQyxPQUFPcHNFLEdBQU1vc0UsRUFBVUgsRUFBUzlyRSxZQWV4QyxTQUFTcW9GLEdBQWNybEYsRUFBUXNsRixHQUc3QixJQUFJQyxHQUZKRCxPQTdzS0F6bUYsSUE2c0tReW1GLEVBQXNCLElBQU0zRixHQUFhMkYsSUFFekJ0bEYsT0FDeEIsR0FBSXVsRixFQUFjLEVBQ2hCLE9BQU9BLEVBQWN4SCxHQUFXdUgsRUFBT3RsRixHQUFVc2xGLEVBRW5ELElBQUlyb0UsRUFBUzhnRSxHQUFXdUgsRUFBTzVXLEdBQVcxdUUsRUFBU3lzRSxHQUFXNlksS0FDOUQsT0FBT3BaLEdBQVdvWixHQUNkekUsR0FBVWpVLEdBQWMzdkQsR0FBUyxFQUFHamQsR0FBUW1lLEtBQUssSUFDakRsQixFQUFPNWUsTUFBTSxFQUFHMkIsR0E2Q3RCLFNBQVN3bEYsR0FBWS9hLEdBQ25CLE9BQU8sU0FBU3RuQyxFQUFPdGUsRUFBSzRnRSxHQWExQixPQVpJQSxHQUF1QixpQkFBUkEsR0FBb0JsRCxHQUFlcC9DLEVBQU90ZSxFQUFLNGdFLEtBQ2hFNWdFLEVBQU00Z0UsT0F0d0tWNW1GLEdBeXdLRXNrQyxFQUFRdWlELEdBQVN2aUQsUUF6d0tuQnRrQyxJQTB3S01nbUIsR0FDRkEsRUFBTXNlLEVBQ05BLEVBQVEsR0FFUnRlLEVBQU02Z0UsR0FBUzdnRSxHQTU3Q3JCLFNBQW1Cc2UsRUFBT3RlLEVBQUs0Z0UsRUFBTWhiLEdBS25DLElBSkEsSUFBSTFuRSxHQUFTLEVBQ1QvQyxFQUFTa3ZFLEdBQVVSLElBQVk3cEQsRUFBTXNlLElBQVVzaUQsR0FBUSxJQUFLLEdBQzVEeG9FLEVBQVM5YixFQUFNbkIsR0FFWkEsS0FDTGlkLEVBQU93dEQsRUFBWXpxRSxJQUFXK0MsR0FBU29nQyxFQUN2Q0EsR0FBU3NpRCxFQUVYLE9BQU94b0UsRUFzN0NFMG9FLENBQVV4aUQsRUFBT3RlLEVBRHhCNGdFLE9BaHhLRjVtRixJQWd4S1M0bUYsRUFBc0J0aUQsRUFBUXRlLEVBQU0sR0FBSyxFQUFLNmdFLEdBQVNELEdBQzNCaGIsSUFXdkMsU0FBU21iLEdBQTBCM3hDLEdBQ2pDLE9BQU8sU0FBU3Y0QyxFQUFPNmpCLEdBS3JCLE1BSnNCLGlCQUFUN2pCLEdBQXFDLGlCQUFUNmpCLElBQ3ZDN2pCLEVBQVFtcUYsR0FBU25xRixHQUNqQjZqQixFQUFRc21FLEdBQVN0bUUsSUFFWjAwQixFQUFTdjRDLEVBQU82akIsSUFxQjNCLFNBQVNvbEUsR0FBY2xzRCxFQUFNczdDLEVBQVMrUixFQUFVamEsRUFBYS9DLEVBQVNvWSxFQUFVQyxFQUFTOEMsRUFBUUMsRUFBS0MsR0FDcEcsSUFBSTRCLEVBcnhLYyxFQXF4S0poUyxFQU1kQSxHQUFZZ1MsRUF6eEtRLEdBQ00sR0FKRixHQTZ4S3hCaFMsS0FBYWdTLEVBenhLYSxHQUROLE9BNnhLbEJoUyxJQUFXLEdBRWIsSUFBSWlTLEVBQVUsQ0FDWnZ0RCxFQUFNczdDLEVBQVNqTCxFQVZDaWQsRUFBVTdFLE9BM3pLNUJyaUYsRUF5ektpQmtuRixFQUFVNUUsT0F6ekszQnRpRixFQTR6S3VCa25GLE9BNXpLdkJsbkYsRUE0eks2Q3FpRixFQUZ2QjZFLE9BMXpLdEJsbkYsRUEweks0Q3NpRixFQVl6QjhDLEVBQVFDLEVBQUtDLEdBRzVCbG5FLEVBQVM2b0UsRUFBU2pwRixXQXowS3RCZ0MsRUF5MEt1Q21uRixHQUt2QyxPQUpJcEMsR0FBV25yRCxJQUNid3RELEdBQVFocEUsRUFBUStvRSxHQUVsQi9vRSxFQUFPNHVELFlBQWNBLEVBQ2RxYSxHQUFnQmpwRSxFQUFRd2IsRUFBTXM3QyxHQVV2QyxTQUFTb1MsR0FBWXpELEdBQ25CLElBQUlqcUQsRUFBTzN5QixHQUFLNDhFLEdBQ2hCLE9BQU8sU0FBU2gzRCxFQUFRMDZELEdBR3RCLEdBRkExNkQsRUFBU202RCxHQUFTbjZELElBQ2xCMDZELEVBQXlCLE1BQWJBLEVBQW9CLEVBQUlqWCxHQUFVa1gsR0FBVUQsR0FBWSxPQUNuRHJYLEdBQWVyakQsR0FBUyxDQUd2QyxJQUFJNDZELEdBQVFyd0UsR0FBU3lWLEdBQVUsS0FBS0osTUFBTSxLQUkxQyxTQURBZzdELEdBQVFyd0UsR0FGSXdpQixFQUFLNnRELEVBQUssR0FBSyxNQUFRQSxFQUFLLEdBQUtGLEtBRW5CLEtBQUs5NkQsTUFBTSxNQUN2QixHQUFLLE1BQVFnN0QsRUFBSyxHQUFLRixJQUV2QyxPQUFPM3RELEVBQUsvTSxJQVdoQixJQUFJbTBELEdBQWNod0UsSUFBUSxFQUFJMDhELEdBQVcsSUFBSTE4RCxHQUFJLENBQUMsRUFBRSxLQUFLLElBeHpLNUMsSUF3ektzRSxTQUFTTyxHQUMxRixPQUFPLElBQUlQLEdBQUlPLElBRDJENHdELEdBVzVFLFNBQVN1bEIsR0FBYzNPLEdBQ3JCLE9BQU8sU0FBU3o3RSxHQUNkLElBQUlrNEUsRUFBTUMsR0FBT240RSxHQUNqQixPQUFJazRFLEdBQU9sUyxFQUNGZ0ssR0FBV2h3RSxHQUVoQms0RSxHQUFPOVIsRUFDRmlLLEdBQVdyd0UsR0FuNkkxQixTQUFxQkEsRUFBUW0vRCxHQUMzQixPQUFPc08sR0FBU3RPLEdBQU8sU0FBU3QvRCxHQUM5QixNQUFPLENBQUNBLEVBQUtHLEVBQU9ILE9BbTZJWHdxRixDQUFZcnFGLEVBQVF5N0UsRUFBU3o3RSxLQTZCeEMsU0FBU3NxRixHQUFXaHVELEVBQU1zN0MsRUFBU2pMLEVBQVNvWSxFQUFVQyxFQUFTOEMsRUFBUUMsRUFBS0MsR0FDMUUsSUFBSUcsRUFsNEtpQixFQWs0S0x2USxFQUNoQixJQUFLdVEsR0FBNEIsbUJBQVI3ckQsRUFDdkIsTUFBTSxJQUFJdDVCLEdBQVVzaUUsR0FFdEIsSUFBSXpoRSxFQUFTa2hGLEVBQVdBLEVBQVNsaEYsT0FBUyxFQVMxQyxHQVJLQSxJQUNIK3pFLElBQVcsR0FDWG1OLEVBQVdDLE9BMTZLYnRpRixHQTQ2S0FxbEYsT0E1NktBcmxGLElBNDZLTXFsRixFQUFvQkEsRUFBTWhWLEdBQVVtWCxHQUFVbkMsR0FBTSxHQUMxREMsT0E3NktBdGxGLElBNjZLUXNsRixFQUFzQkEsRUFBUWtDLEdBQVVsQyxHQUNoRG5rRixHQUFVbWhGLEVBQVVBLEVBQVFuaEYsT0FBUyxFQXg0S1gsR0EwNEt0Qit6RSxFQUFtQyxDQUNyQyxJQUFJZ1EsRUFBZ0I3QyxFQUNoQjhDLEVBQWU3QyxFQUVuQkQsRUFBV0MsT0FwN0tidGlGLEVBczdLQSxJQUFJdW5CLEVBQU9rK0QsT0F0N0tYemxGLEVBczdLbUM4a0YsR0FBUWxyRCxHQUV2Q3V0RCxFQUFVLENBQ1p2dEQsRUFBTXM3QyxFQUFTakwsRUFBU29ZLEVBQVVDLEVBQVM0QyxFQUFlQyxFQUMxREMsRUFBUUMsRUFBS0MsR0FrQmYsR0FmSS85RCxHQTI2Qk4sU0FBbUJBLEVBQU1pYSxHQUN2QixJQUFJMHpDLEVBQVUzdEQsRUFBSyxHQUNmc2dFLEVBQWFybUQsRUFBTyxHQUNwQnNtRCxFQUFhNVMsRUFBVTJTLEVBQ3ZCM1EsRUFBVzRRLEVBQWEsSUFFeEJDLEVBdjBNWSxLQXcwTVpGLEdBNTBNYyxHQTQwTW1CM1MsR0F4ME1yQixLQXkwTVoyUyxHQXgwTWMsS0F3ME1tQjNTLEdBQWdDM3RELEVBQUssR0FBR3BtQixRQUFVcWdDLEVBQU8sSUFDNUUsS0FBZHFtRCxHQUFxRHJtRCxFQUFPLEdBQUdyZ0MsUUFBVXFnQyxFQUFPLElBOTBNbEUsR0E4ME0wRTB6QyxFQUc1RixJQUFNZ0MsSUFBWTZRLEVBQ2hCLE9BQU94Z0UsRUFyMU1RLEVBdzFNYnNnRSxJQUNGdGdFLEVBQUssR0FBS2lhLEVBQU8sR0FFakJzbUQsR0EzMU1lLEVBMjFNRDVTLEVBQTJCLEVBejFNbkIsR0E0MU14QixJQUFJcjRFLEVBQVEya0MsRUFBTyxHQUNuQixHQUFJM2tDLEVBQU8sQ0FDVCxJQUFJd2xGLEVBQVc5NkQsRUFBSyxHQUNwQkEsRUFBSyxHQUFLODZELEVBQVdELEdBQVlDLEVBQVV4bEYsRUFBTzJrQyxFQUFPLElBQU0za0MsRUFDL0QwcUIsRUFBSyxHQUFLODZELEVBQVc1VSxHQUFlbG1ELEVBQUssR0FBSXM3QyxHQUFlcmhDLEVBQU8sSUFHckUza0MsRUFBUTJrQyxFQUFPLE1BRWI2Z0QsRUFBVzk2RCxFQUFLLEdBQ2hCQSxFQUFLLEdBQUs4NkQsRUFBV1UsR0FBaUJWLEVBQVV4bEYsRUFBTzJrQyxFQUFPLElBQU0za0MsRUFDcEUwcUIsRUFBSyxHQUFLODZELEVBQVc1VSxHQUFlbG1ELEVBQUssR0FBSXM3QyxHQUFlcmhDLEVBQU8sS0FHckUza0MsRUFBUTJrQyxFQUFPLE1BRWJqYSxFQUFLLEdBQUsxcUIsR0F2Mk1JLElBMDJNWmdyRixJQUNGdGdFLEVBQUssR0FBZ0IsTUFBWEEsRUFBSyxHQUFhaWEsRUFBTyxHQUFLOHVDLEdBQVUvb0QsRUFBSyxHQUFJaWEsRUFBTyxLQUdyRCxNQUFYamEsRUFBSyxLQUNQQSxFQUFLLEdBQUtpYSxFQUFPLElBR25CamEsRUFBSyxHQUFLaWEsRUFBTyxHQUNqQmphLEVBQUssR0FBS3VnRSxFQTU5QlJFLENBQVViLEVBQVM1L0QsR0FFckJxUyxFQUFPdXRELEVBQVEsR0FDZmpTLEVBQVVpUyxFQUFRLEdBQ2xCbGQsRUFBVWtkLEVBQVEsR0FDbEI5RSxFQUFXOEUsRUFBUSxHQUNuQjdFLEVBQVU2RSxFQUFRLEtBQ2xCN0IsRUFBUTZCLEVBQVEsUUFyOEtoQm5uRixJQXE4S3FCbW5GLEVBQVEsR0FDeEIxQixFQUFZLEVBQUk3ckQsRUFBS3o0QixPQUN0Qmt2RSxHQUFVOFcsRUFBUSxHQUFLaG1GLEVBQVEsS0FFWCxHQUFWK3pFLElBQ1pBLElBQVcsSUFFUkEsR0E1NktZLEdBNDZLREEsRUFHZDkyRCxFQTU2S2dCLEdBMjZLUDgyRCxHQTE2S2EsSUEwNktpQkEsRUFwZ0IzQyxTQUFxQnQ3QyxFQUFNczdDLEVBQVNvUSxHQUNsQyxJQUFJOXJELEVBQU8wcUQsR0FBV3RxRCxHQXdCdEIsT0F0QkEsU0FBUytxRCxJQU1QLElBTEEsSUFBSXhqRixFQUFTMUIsVUFBVTBCLE9BQ25CaEQsRUFBT21FLEVBQU1uQixHQUNiK0MsRUFBUS9DLEVBQ1I2ckUsRUFBYzJZLEdBQVVoQixHQUVyQnpnRixLQUNML0YsRUFBSytGLEdBQVN6RSxVQUFVeUUsR0FFMUIsSUFBSW8rRSxFQUFXbmhGLEVBQVMsR0FBS2hELEVBQUssS0FBTzZ1RSxHQUFlN3VFLEVBQUtnRCxFQUFTLEtBQU82ckUsRUFDekUsR0FDQVMsR0FBZXR2RSxFQUFNNnVFLEdBR3pCLElBREE3ckUsR0FBVW1oRixFQUFRbmhGLFFBQ0xta0YsRUFDWCxPQUFPUSxHQUNMbHNELEVBQU1zN0MsRUFBUytQLEdBQWNOLEVBQVEzWCxpQkE3OUozQ2h0RSxFQTg5Sk03QixFQUFNbWtGLE9BOTlKWnRpRixTQTg5SjJDc2xGLEVBQVFua0YsR0FFakQsSUFBSTRrRixFQUFNam5GLE1BQVFBLE9BQVNncEMsSUFBUWhwQyxnQkFBZ0I2bEYsRUFBV25yRCxFQUFPSSxFQUNyRSxPQUFPNTdCLEdBQU0rbkYsRUFBSWpuRixLQUFNWCxJQThlZDhwRixDQUFZcnVELEVBQU1zN0MsRUFBU29RLEdBMTZLbEIsSUEyNktScFEsR0FBMkMsSUFBWEEsR0FBcURvTixFQUFRbmhGLE9BRzlGOGpGLEdBQWFqbkYsV0FuOUt4QmdDLEVBbTlLeUNtbkYsR0E5TzNDLFNBQXVCdnRELEVBQU1zN0MsRUFBU2pMLEVBQVNvWSxHQUM3QyxJQUFJbUQsRUF0c0thLEVBc3NLSnRRLEVBQ1QxN0MsRUFBTzBxRCxHQUFXdHFELEdBa0J0QixPQWhCQSxTQUFTK3FELElBUVAsSUFQQSxJQUFJbkMsR0FBYSxFQUNiQyxFQUFhaGpGLFVBQVUwQixPQUN2QndoRixHQUFhLEVBQ2JDLEVBQWFQLEVBQVNsaEYsT0FDdEJoRCxFQUFPbUUsRUFBTXNnRixFQUFhSCxHQUMxQnNELEVBQU1qbkYsTUFBUUEsT0FBU2dwQyxJQUFRaHBDLGdCQUFnQjZsRixFQUFXbnJELEVBQU9JLElBRTVEK29ELEVBQVlDLEdBQ25CemtGLEVBQUt3a0YsR0FBYU4sRUFBU00sR0FFN0IsS0FBT0YsS0FDTHRrRixFQUFLd2tGLEtBQWVsakYsWUFBWStpRixHQUVsQyxPQUFPeGtGLEdBQU0rbkYsRUFBSVAsRUFBU3ZiLEVBQVVuckUsS0FBTVgsSUEwTmpDK3BGLENBQWN0dUQsRUFBTXM3QyxFQUFTakwsRUFBU29ZLFFBSi9DLElBQUlqa0UsRUFobUJSLFNBQW9Cd2IsRUFBTXM3QyxFQUFTakwsR0FDakMsSUFBSXViLEVBOTBKYSxFQTgwSkp0USxFQUNUMTdDLEVBQU8wcUQsR0FBV3RxRCxHQU10QixPQUpBLFNBQVMrcUQsSUFDUCxJQUFJb0IsRUFBTWpuRixNQUFRQSxPQUFTZ3BDLElBQVFocEMsZ0JBQWdCNmxGLEVBQVduckQsRUFBT0ksRUFDckUsT0FBT21zRCxFQUFHL25GLE1BQU13bkYsRUFBU3ZiLEVBQVVuckUsS0FBTVcsWUEwbEI1QjBvRixDQUFXdnVELEVBQU1zN0MsRUFBU2pMLEdBU3pDLE9BQU9vZCxJQURNOS9ELEVBQU9rNEQsR0FBYzJILElBQ0pocEUsRUFBUStvRSxHQUFVdnRELEVBQU1zN0MsR0FleEQsU0FBU2tULEdBQXVCM1QsRUFBVXdILEVBQVU5K0UsRUFBS0csR0FDdkQsWUF0K0tBMEMsSUFzK0tJeTBFLEdBQ0NILEdBQUdHLEVBQVVsRyxHQUFZcHhFLE1BQVVNLEdBQWUxQixLQUFLdUIsRUFBUUgsR0FDM0Q4K0UsRUFFRnhILEVBaUJULFNBQVM0VCxHQUFvQjVULEVBQVV3SCxFQUFVOStFLEVBQUtHLEVBQVFra0MsRUFBUWpZLEdBT3BFLE9BTkl5b0QsR0FBU3lDLElBQWF6QyxHQUFTaUssS0FFakMxeUQsRUFBTXhtQixJQUFJazVFLEVBQVV4SCxHQUNwQjRJLEdBQVU1SSxFQUFVd0gsT0EvL0t0Qmo4RSxFQSsvSzJDcW9GLEdBQXFCOStELEdBQzlEQSxFQUFjLE9BQUUweUQsSUFFWHhILEVBWVQsU0FBUzZULEdBQWdCenJGLEdBQ3ZCLE9BQU80OEIsR0FBYzU4QixRQS9nTHJCbUQsRUErZ0wwQ25ELEVBZ0I1QyxTQUFTODlFLEdBQVl6MEUsRUFBT3dhLEVBQU93MEQsRUFBU0MsRUFBWWdGLEVBQVc1d0QsR0FDakUsSUFBSXN4RCxFQXBnTG1CLEVBb2dMUDNGLEVBQ1pxVCxFQUFZcmlGLEVBQU0vRSxPQUNsQnc0RSxFQUFZajVELEVBQU12ZixPQUV0QixHQUFJb25GLEdBQWE1TyxLQUFla0IsR0FBYWxCLEVBQVk0TyxHQUN2RCxPQUFPLEVBR1QsSUFBSUMsRUFBYWovRCxFQUFNOXNCLElBQUl5SixHQUN2Qm8xRSxFQUFhL3hELEVBQU05c0IsSUFBSWlrQixHQUMzQixHQUFJOG5FLEdBQWNsTixFQUNoQixPQUFPa04sR0FBYzluRSxHQUFTNDZELEdBQWNwMUUsRUFFOUMsSUFBSWhDLEdBQVMsRUFDVGthLEdBQVMsRUFDVDI3RCxFQWxoTHFCLEVBa2hMYjdFLEVBQW9DLElBQUloQyxRQS9pTHBEbHpFLEVBcWpMQSxJQUpBdXBCLEVBQU14bUIsSUFBSW1ELEVBQU93YSxHQUNqQjZJLEVBQU14bUIsSUFBSTJkLEVBQU94YSxLQUdSaEMsRUFBUXFrRixHQUFXLENBQzFCLElBQUlFLEVBQVd2aUYsRUFBTWhDLEdBQ2pCczNFLEVBQVc5NkQsRUFBTXhjLEdBRXJCLEdBQUlpeEUsRUFDRixJQUFJc0csRUFBV1osRUFDWDFGLEVBQVdxRyxFQUFVaU4sRUFBVXZrRixFQUFPd2MsRUFBT3hhLEVBQU9xakIsR0FDcEQ0ckQsRUFBV3NULEVBQVVqTixFQUFVdDNFLEVBQU9nQyxFQUFPd2EsRUFBTzZJLEdBRTFELFFBOWpMRnZwQixJQThqTE15N0UsRUFBd0IsQ0FDMUIsR0FBSUEsRUFDRixTQUVGcjlELEdBQVMsRUFDVCxNQUdGLEdBQUkyN0QsR0FDRixJQUFLM08sR0FBVTFxRCxHQUFPLFNBQVM4NkQsRUFBVTVCLEdBQ25DLElBQUtuTixHQUFTc04sRUFBTUgsS0FDZjZPLElBQWFqTixHQUFZckIsRUFBVXNPLEVBQVVqTixFQUFVdEcsRUFBU0MsRUFBWTVyRCxJQUMvRSxPQUFPd3dELEVBQUs3NEUsS0FBSzA0RSxNQUVqQixDQUNOeDdELEdBQVMsRUFDVCxZQUVHLEdBQ0RxcUUsSUFBYWpOLElBQ1hyQixFQUFVc08sRUFBVWpOLEVBQVV0RyxFQUFTQyxFQUFZNXJELEdBQ3BELENBQ0xuTCxHQUFTLEVBQ1QsT0FLSixPQUZBbUwsRUFBYyxPQUFFcmpCLEdBQ2hCcWpCLEVBQWMsT0FBRTdJLEdBQ1R0QyxFQTBLVCxTQUFTbW1FLEdBQVMzcUQsR0FDaEIsT0FBT3dsRCxHQUFZQyxHQUFTemxELE9BcndMNUI1NUIsRUFxd0w2Q3VnQyxJQUFVM0csRUFBTyxJQVVoRSxTQUFTd3JCLEdBQVc5bkQsR0FDbEIsT0FBT3c3RSxHQUFleDdFLEVBQVFpSCxHQUFNMHhFLElBV3RDLFNBQVNXLEdBQWF0NUUsR0FDcEIsT0FBT3c3RSxHQUFleDdFLEVBQVF5NEUsR0FBUUYsSUFVeEMsSUFBSWlQLEdBQVdoVSxHQUFpQixTQUFTbDNDLEdBQ3ZDLE9BQU9rM0MsR0FBUXIwRSxJQUFJbTlCLElBREl1b0MsR0FXekIsU0FBU3lpQixHQUFZaHJELEdBS25CLElBSkEsSUFBSXhiLEVBQVV3YixFQUFLejlCLEtBQU8sR0FDdEIrSixFQUFRNnFFLEdBQVUzeUQsR0FDbEJqZCxFQUFTMUQsR0FBZTFCLEtBQUtnMUUsR0FBVzN5RCxHQUFVbFksRUFBTS9FLE9BQVMsRUFFOURBLEtBQVUsQ0FDZixJQUFJb21CLEVBQU9yaEIsRUFBTS9FLEdBQ2J1bkYsRUFBWW5oRSxFQUFLcVMsS0FDckIsR0FBaUIsTUFBYjh1RCxHQUFxQkEsR0FBYTl1RCxFQUNwQyxPQUFPclMsRUFBS3ByQixLQUdoQixPQUFPaWlCLEVBVVQsU0FBU3VuRSxHQUFVL3JELEdBRWpCLE9BRGFuOEIsR0FBZTFCLEtBQUsyMUUsR0FBUSxlQUFpQkEsR0FBUzkzQyxHQUNyRG96QyxZQWNoQixTQUFTa1IsS0FDUCxJQUFJOS9ELEVBQVNzekQsR0FBT3RILFVBQVlBLEdBRWhDLE9BREFoc0QsRUFBU0EsSUFBV2dzRCxHQUFXZ1MsR0FBZWgrRCxFQUN2QzNlLFVBQVUwQixPQUFTaWQsRUFBTzNlLFVBQVUsR0FBSUEsVUFBVSxJQUFNMmUsRUFXakUsU0FBU281RCxHQUFXam5FLEVBQUtwVCxHQUN2QixJQWdZaUJOLEVBQ2I2RCxFQWpZQTZtQixFQUFPaFgsRUFBSTRpRSxTQUNmLE9BaVlnQixXQURaenlFLFNBRGE3RCxFQS9YQU0sS0FpWW1CLFVBQVJ1RCxHQUE0QixVQUFSQSxHQUE0QixXQUFSQSxFQUNyRCxjQUFWN0QsRUFDVSxPQUFWQSxHQWxZRDBxQixFQUFtQixpQkFBUHBxQixFQUFrQixTQUFXLFFBQ3pDb3FCLEVBQUtoWCxJQVVYLFNBQVN5c0UsR0FBYTEvRSxHQUlwQixJQUhBLElBQUk4Z0IsRUFBUzdaLEdBQUtqSCxHQUNkNkQsRUFBU2lkLEVBQU9qZCxPQUViQSxLQUFVLENBQ2YsSUFBSWhFLEVBQU1paEIsRUFBT2pkLEdBQ2J0RSxFQUFRUyxFQUFPSCxHQUVuQmloQixFQUFPamQsR0FBVSxDQUFDaEUsRUFBS04sRUFBT3NnRixHQUFtQnRnRixJQUVuRCxPQUFPdWhCLEVBV1QsU0FBU3F4RCxHQUFVbnlFLEVBQVFILEdBQ3pCLElBQUlOLEVBbHhKUixTQUFrQlMsRUFBUUgsR0FDeEIsT0FBaUIsTUFBVkcsT0F4bkNMMEMsRUF3bkNrQzFDLEVBQU9ILEdBaXhKN0J3ckYsQ0FBU3JyRixFQUFRSCxHQUM3QixPQUFPZy9FLEdBQWF0L0UsR0FBU0EsT0ExNEw3Qm1ELEVBKzZMRixJQUFJaTJFLEdBQWNsRyxHQUErQixTQUFTenlFLEdBQ3hELE9BQWMsTUFBVkEsRUFDSyxJQUVUQSxFQUFTaEIsR0FBT2dCLEdBQ1RvdEUsR0FBWXFGLEdBQWlCenlFLElBQVMsU0FBU2s1RSxHQUNwRCxPQUFPckgsR0FBcUJwekUsS0FBS3VCLEVBQVFrNUUsUUFOUm9TLEdBaUJqQy9TLEdBQWdCOUYsR0FBK0IsU0FBU3p5RSxHQUUxRCxJQURBLElBQUk4Z0IsRUFBUyxHQUNOOWdCLEdBQ0wwdEUsR0FBVTVzRCxFQUFRNjNELEdBQVczNEUsSUFDN0JBLEVBQVMyeEUsR0FBYTN4RSxHQUV4QixPQUFPOGdCLEdBTjhCd3FFLEdBZ0JuQ25ULEdBQVN3RCxHQTJFYixTQUFTNFAsR0FBUXZyRixFQUFRNlMsRUFBTTI0RSxHQU83QixJQUpBLElBQUk1a0YsR0FBUyxFQUNUL0MsR0FISmdQLEVBQU95b0UsR0FBU3pvRSxFQUFNN1MsSUFHSjZELE9BQ2RpZCxHQUFTLElBRUpsYSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJaEUsRUFBTTA3RSxHQUFNMW9FLEVBQUtqTSxJQUNyQixLQUFNa2EsRUFBbUIsTUFBVjlnQixHQUFrQndyRixFQUFReHJGLEVBQVFILElBQy9DLE1BRUZHLEVBQVNBLEVBQU9ILEdBRWxCLE9BQUlpaEIsS0FBWWxhLEdBQVMvQyxFQUNoQmlkLEtBRVRqZCxFQUFtQixNQUFWN0QsRUFBaUIsRUFBSUEsRUFBTzZELFNBQ2xCNG5GLEdBQVM1bkYsSUFBVzB5RSxHQUFRMTJFLEVBQUtnRSxLQUNqRCtuQixHQUFRNXJCLElBQVdtMkUsR0FBWW4yRSxJQTZCcEMsU0FBU3M0RSxHQUFnQnQ0RSxHQUN2QixNQUFxQyxtQkFBdEJBLEVBQU91SCxhQUE4QjQzRSxHQUFZbi9FLEdBRTVELEdBREF5MEUsR0FBVzlDLEdBQWEzeEUsSUE4RTlCLFNBQVMrNkUsR0FBY3g3RSxHQUNyQixPQUFPcXNCLEdBQVFyc0IsSUFBVTQyRSxHQUFZNTJFLE9BQ2hDdXlFLElBQW9CdnlFLEdBQVNBLEVBQU11eUUsS0FXMUMsU0FBU3lFLEdBQVFoM0UsRUFBT3NFLEdBQ3RCLElBQUlULFNBQWM3RCxFQUdsQixTQUZBc0UsRUFBbUIsTUFBVkEsRUFobk1VLGlCQWduTTBCQSxLQUdsQyxVQUFSVCxHQUNVLFVBQVJBLEdBQW9CMmxFLEdBQVN2Z0UsS0FBS2pKLEtBQ2hDQSxHQUFTLEdBQUtBLEVBQVEsR0FBSyxHQUFLQSxFQUFRc0UsRUFhakQsU0FBU3VpRixHQUFlN21GLEVBQU9xSCxFQUFPNUcsR0FDcEMsSUFBSzAwRSxHQUFTMTBFLEdBQ1osT0FBTyxFQUVULElBQUlvRCxTQUFjd0QsRUFDbEIsU0FBWSxVQUFSeEQsRUFDS3E4RSxHQUFZei9FLElBQVd1MkUsR0FBUTN2RSxFQUFPNUcsRUFBTzZELFFBQ3JDLFVBQVJULEdBQW9Cd0QsS0FBUzVHLElBRTdCZzNFLEdBQUdoM0UsRUFBTzRHLEdBQVFySCxHQWE3QixTQUFTcWdGLEdBQU1yZ0YsRUFBT1MsR0FDcEIsR0FBSTRyQixHQUFRcnNCLEdBQ1YsT0FBTyxFQUVULElBQUk2RCxTQUFjN0QsRUFDbEIsUUFBWSxVQUFSNkQsR0FBNEIsVUFBUkEsR0FBNEIsV0FBUkEsR0FDL0IsTUFBVDdELElBQWlCbzdFLEdBQVNwN0UsTUFHdkJzb0UsRUFBY3IvRCxLQUFLakosS0FBV3FvRSxFQUFhcC9ELEtBQUtqSixJQUMxQyxNQUFWUyxHQUFrQlQsS0FBU1AsR0FBT2dCLElBeUJ2QyxTQUFTeW5GLEdBQVduckQsR0FDbEIsSUFBSWlyRCxFQUFXRCxHQUFZaHJELEdBQ3ZCbFosRUFBUWd4RCxHQUFPbVQsR0FFbkIsR0FBb0IsbUJBQVRua0UsS0FBeUJta0UsS0FBWWpULEdBQVlwMEUsV0FDMUQsT0FBTyxFQUVULEdBQUlvOEIsSUFBU2xaLEVBQ1gsT0FBTyxFQUVULElBQUk2RyxFQUFPdTlELEdBQVFwa0UsR0FDbkIsUUFBUzZHLEdBQVFxUyxJQUFTclMsRUFBSyxJQTdTNUJvcEQsSUFBWThFLEdBQU8sSUFBSTlFLEdBQVMsSUFBSXByRCxZQUFZLE1BQVF3K0MsR0FDeER0ckMsSUFBT2c5QyxHQUFPLElBQUloOUMsS0FBUTZxQyxHQUMxQnJrRSxJQXYzTFUsb0JBdTNMQ3cyRSxHQUFPeDJFLEdBQVFDLFlBQzFCOFIsSUFBT3lrRSxHQUFPLElBQUl6a0UsS0FBUTB5RCxHQUMxQmtOLElBQVc2RSxHQUFPLElBQUk3RSxLQUFZL00sS0FDckM0UixHQUFTLFNBQVM1NEUsR0FDaEIsSUFBSXVoQixFQUFTNjZELEdBQVdwOEUsR0FDcEIyOEIsRUFBT3BiLEdBQVVvbEQsRUFBWTNtRSxFQUFNZ0ksaUJBMTlMekM3RSxFQTI5TE1ncEYsRUFBYXh2RCxFQUFPeTNDLEdBQVN6M0MsR0FBUSxHQUV6QyxHQUFJd3ZELEVBQ0YsT0FBUUEsR0FDTixLQUFLaFksR0FBb0IsT0FBT2pOLEVBQ2hDLEtBQUttTixHQUFlLE9BQU81TixFQUMzQixLQUFLNk4sR0FBbUIsTUFuNExqQixtQkFvNExQLEtBQUtDLEdBQWUsT0FBTzFOLEVBQzNCLEtBQUsyTixHQUFtQixPQUFPeE4sRUFHbkMsT0FBT3psRCxJQStTWCxJQUFJNnFFLEdBQWF6YSxHQUFha0ssR0FBYXdRLEdBUzNDLFNBQVN6TSxHQUFZNS9FLEdBQ25CLElBQUkyOEIsRUFBTzM4QixHQUFTQSxFQUFNZ0ksWUFHMUIsT0FBT2hJLEtBRnFCLG1CQUFSMjhCLEdBQXNCQSxFQUFLaDhCLFdBQWMrd0UsSUFhL0QsU0FBUzRPLEdBQW1CdGdGLEdBQzFCLE9BQU9BLEdBQVVBLElBQVVtMUUsR0FBU24xRSxHQVl0QyxTQUFTb2dGLEdBQXdCOS9FLEVBQUs4K0UsR0FDcEMsT0FBTyxTQUFTMytFLEdBQ2QsT0FBYyxNQUFWQSxJQUdHQSxFQUFPSCxLQUFTOCtFLFNBL3pNekJqOEUsSUFnME1LaThFLEdBQTJCOStFLEtBQU9iLEdBQU9nQixNQXNJaEQsU0FBUytoRixHQUFTemxELEVBQU0wSyxFQUFPa3BDLEdBRTdCLE9BREFscEMsRUFBUStyQyxRQXY4TVJyd0UsSUF1OE1rQnNrQyxFQUF1QjFLLEVBQUt6NEIsT0FBUyxFQUFLbWpDLEVBQU8sR0FDNUQsV0FNTCxJQUxBLElBQUlubUMsRUFBT3NCLFVBQ1B5RSxHQUFTLEVBQ1QvQyxFQUFTa3ZFLEdBQVVseUUsRUFBS2dELE9BQVNtakMsRUFBTyxHQUN4Q3ArQixFQUFRNUQsRUFBTW5CLEtBRVQrQyxFQUFRL0MsR0FDZitFLEVBQU1oQyxHQUFTL0YsRUFBS21tQyxFQUFRcGdDLEdBRTlCQSxHQUFTLEVBRVQsSUFEQSxJQUFJaWxGLEVBQVk3bUYsRUFBTWdpQyxFQUFRLEtBQ3JCcGdDLEVBQVFvZ0MsR0FDZjZrRCxFQUFVamxGLEdBQVMvRixFQUFLK0YsR0FHMUIsT0FEQWlsRixFQUFVN2tELEdBQVNrcEMsRUFBVXRuRSxHQUN0QmxJLEdBQU00N0IsRUFBTTk2QixLQUFNcXFGLElBWTdCLFNBQVMzNkUsR0FBT2xSLEVBQVE2UyxHQUN0QixPQUFPQSxFQUFLaFAsT0FBUyxFQUFJN0QsRUFBU3E3RSxHQUFRcjdFLEVBQVF1aUYsR0FBVTF2RSxFQUFNLEdBQUksSUFheEUsU0FBUzYxRSxHQUFROS9FLEVBQU84NEUsR0FLdEIsSUFKQSxJQUFJdUosRUFBWXJpRixFQUFNL0UsT0FDbEJBLEVBQVNtdkUsR0FBVTBPLEVBQVE3OUUsT0FBUW9uRixHQUNuQ2EsRUFBV2xWLEdBQVVodUUsR0FFbEIvRSxLQUFVLENBQ2YsSUFBSStDLEVBQVE4NkUsRUFBUTc5RSxHQUNwQitFLEVBQU0vRSxHQUFVMHlFLEdBQVEzdkUsRUFBT3FrRixHQUFhYSxFQUFTbGxGLFFBeC9NdkRsRSxFQTAvTUEsT0FBT2tHLEVBV1QsU0FBU3MzRSxHQUFRbGdGLEVBQVFILEdBQ3ZCLElBQVksZ0JBQVJBLEdBQWdELG1CQUFoQkcsRUFBT0gsS0FJaEMsYUFBUEEsRUFJSixPQUFPRyxFQUFPSCxHQWlCaEIsSUFBSWlxRixHQUFVaUMsR0FBUzVKLElBVW5COTVFLEdBQWFpcUUsSUFBaUIsU0FBU2gyQyxFQUFNbTlDLEdBQy9DLE9BQU9qdkMsR0FBS25pQyxXQUFXaTBCLEVBQU1tOUMsSUFXM0JxSSxHQUFjaUssR0FBUzNKLElBWTNCLFNBQVMySCxHQUFnQjFDLEVBQVMyRSxFQUFXcFUsR0FDM0MsSUFBSTF6QyxFQUFVOG5ELEVBQVksR0FDMUIsT0FBT2xLLEdBQVl1RixFQTFickIsU0FBMkJuakQsRUFBUStuRCxHQUNqQyxJQUFJcG9GLEVBQVNvb0YsRUFBUXBvRixPQUNyQixJQUFLQSxFQUNILE9BQU9xZ0MsRUFFVCxJQUFJcXNDLEVBQVkxc0UsRUFBUyxFQUd6QixPQUZBb29GLEVBQVExYixJQUFjMXNFLEVBQVMsRUFBSSxLQUFPLElBQU1vb0YsRUFBUTFiLEdBQ3hEMGIsRUFBVUEsRUFBUWpxRSxLQUFLbmUsRUFBUyxFQUFJLEtBQU8sS0FDcENxZ0MsRUFBTzFyQixRQUFRMnZELEVBQWUsdUJBQXlCOGpCLEVBQVUsVUFrYjVDQyxDQUFrQmhvRCxFQXFIaEQsU0FBMkIrbkQsRUFBU3JVLEdBT2xDLE9BTkE1SyxHQUFVeEgsR0FBVyxTQUFTMmtCLEdBQzVCLElBQUk1cUYsRUFBUSxLQUFPNHFGLEVBQUssR0FDbkJ2UyxFQUFVdVMsRUFBSyxLQUFRN2MsR0FBYzJlLEVBQVMxc0YsSUFDakQwc0YsRUFBUXJvRixLQUFLckUsTUFHVjBzRixFQUFRcjRELE9BNUh1Q3U0RCxDQXRqQnhELFNBQXdCam9ELEdBQ3RCLElBQUlseEIsRUFBUWt4QixFQUFPbHhCLE1BQU1vMUQsR0FDekIsT0FBT3AxRCxFQUFRQSxFQUFNLEdBQUdtYyxNQUFNazVDLEdBQWtCLEdBb2pCd0IrakIsQ0FBZWxvRCxHQUFTMHpDLEtBWWxHLFNBQVNtVSxHQUFTenZELEdBQ2hCLElBQUlwNEIsRUFBUSxFQUNSbW9GLEVBQWEsRUFFakIsT0FBTyxXQUNMLElBQUlDLEVBQVFyWixLQUNSc1osRUFwaU5LLElBb2lObUJELEVBQVFELEdBR3BDLEdBREFBLEVBQWFDLEVBQ1RDLEVBQVksR0FDZCxLQUFNcm9GLEdBemlORSxJQTBpTk4sT0FBTy9CLFVBQVUsUUFHbkIrQixFQUFRLEVBRVYsT0FBT280QixFQUFLNTdCLFdBL2xOZGdDLEVBK2xOK0JQLFlBWWpDLFNBQVN3MEUsR0FBWS90RSxFQUFPdUwsR0FDMUIsSUFBSXZOLEdBQVMsRUFDVC9DLEVBQVMrRSxFQUFNL0UsT0FDZjBzRSxFQUFZMXNFLEVBQVMsRUFHekIsSUFEQXNRLE9BaG5OQXpSLElBZ25OT3lSLEVBQXFCdFEsRUFBU3NRLElBQzVCdk4sRUFBUXVOLEdBQU0sQ0FDckIsSUFBSXE0RSxFQUFPL1YsR0FBVzd2RSxFQUFPMnBFLEdBQ3pCaHhFLEVBQVFxSixFQUFNNGpGLEdBRWxCNWpGLEVBQU00akYsR0FBUTVqRixFQUFNaEMsR0FDcEJnQyxFQUFNaEMsR0FBU3JILEVBR2pCLE9BREFxSixFQUFNL0UsT0FBU3NRLEVBQ1J2TCxFQVVULElBQUk0N0UsR0F2VEosU0FBdUJsb0QsR0FDckIsSUFBSXhiLEVBQVMyckUsR0FBUW53RCxHQUFNLFNBQVN6OEIsR0FJbEMsT0FoME1pQixNQTZ6TWJ1dkUsRUFBTWo3RCxNQUNSaTdELEVBQU1vRyxRQUVEMzFFLEtBR0x1dkUsRUFBUXR1RCxFQUFPc3VELE1BQ25CLE9BQU90dUQsRUE4U1U0ckUsRUFBYyxTQUFTdGxELEdBQ3hDLElBQUl0bUIsRUFBUyxHQU9iLE9BTjZCLEtBQXpCc21CLEVBQU90Z0IsV0FBVyxJQUNwQmhHLEVBQU9sZCxLQUFLLElBRWR3akMsRUFBTzV1QixRQUFRc3ZELEdBQVksU0FBUzkwRCxFQUFPdWMsRUFBUW85RCxFQUFPQyxHQUN4RDlyRSxFQUFPbGQsS0FBSytvRixFQUFRQyxFQUFVcDBFLFFBQVFnd0QsR0FBYyxNQUFTajVDLEdBQVV2YyxNQUVsRThOLEtBVVQsU0FBU3k2RCxHQUFNaDhFLEdBQ2IsR0FBb0IsaUJBQVRBLEdBQXFCbzdFLEdBQVNwN0UsR0FDdkMsT0FBT0EsRUFFVCxJQUFJdWhCLEVBQVV2aEIsRUFBUSxHQUN0QixNQUFrQixLQUFWdWhCLEdBQWtCLEVBQUl2aEIsSUFqbU5uQixJQWltTjBDLEtBQU91aEIsRUFVOUQsU0FBUzZ5RCxHQUFTcjNDLEdBQ2hCLEdBQVksTUFBUkEsRUFBYyxDQUNoQixJQUNFLE9BQU9kLEdBQWEvOEIsS0FBSzY5QixHQUN6QixNQUFPdGpCLElBQ1QsSUFDRSxPQUFRc2pCLEVBQU8sR0FDZixNQUFPdGpCLEtBRVgsTUFBTyxHQTRCVCxTQUFTdzdELEdBQWE2UyxHQUNwQixHQUFJQSxhQUFtQi9TLEdBQ3JCLE9BQU8rUyxFQUFRM3JELFFBRWpCLElBQUk1YSxFQUFTLElBQUl5ekQsR0FBYzhTLEVBQVF4UyxZQUFhd1MsRUFBUXRTLFdBSTVELE9BSEFqMEQsRUFBT2cwRCxZQUFjOEIsR0FBVXlRLEVBQVF2UyxhQUN2Q2gwRCxFQUFPazBELFVBQWFxUyxFQUFRclMsVUFDNUJsMEQsRUFBT20wRCxXQUFhb1MsRUFBUXBTLFdBQ3JCbjBELEVBc0lULElBQUkrckUsR0FBYWhMLElBQVMsU0FBU2o1RSxFQUFPcUwsR0FDeEMsT0FBT29zRSxHQUFrQnozRSxHQUNyQjh3RSxHQUFlOXdFLEVBQU9peUUsR0FBWTVtRSxFQUFRLEVBQUdvc0UsSUFBbUIsSUFDaEUsTUE2QkZ5TSxHQUFlakwsSUFBUyxTQUFTajVFLEVBQU9xTCxHQUMxQyxJQUFJNjRELEVBQVc5UyxHQUFLL2xELEdBSXBCLE9BSElvc0UsR0FBa0J2VCxLQUNwQkEsT0ExM05GcHFFLEdBNDNOTzI5RSxHQUFrQnozRSxHQUNyQjh3RSxHQUFlOXdFLEVBQU9peUUsR0FBWTVtRSxFQUFRLEVBQUdvc0UsSUFBbUIsR0FBT08sR0FBWTlULEVBQVUsSUFDN0YsTUEwQkZpZ0IsR0FBaUJsTCxJQUFTLFNBQVNqNUUsRUFBT3FMLEdBQzVDLElBQUkrMUIsRUFBYWd3QixHQUFLL2xELEdBSXRCLE9BSElvc0UsR0FBa0JyMkMsS0FDcEJBLE9BMzVORnRuQyxHQTY1Tk8yOUUsR0FBa0J6M0UsR0FDckI4d0UsR0FBZTl3RSxFQUFPaXlFLEdBQVk1bUUsRUFBUSxFQUFHb3NFLElBQW1CLFFBOTVOcEUzOUUsRUE4NU5zRnNuQyxHQUNsRixNQXNPTixTQUFTZ2pELEdBQVVwa0YsRUFBT3VrRSxFQUFXa0IsR0FDbkMsSUFBSXhxRSxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLElBQUtBLEVBQ0gsT0FBUSxFQUVWLElBQUkrQyxFQUFxQixNQUFieW5FLEVBQW9CLEVBQUk2YixHQUFVN2IsR0FJOUMsT0FISXpuRSxFQUFRLElBQ1ZBLEVBQVFtc0UsR0FBVWx2RSxFQUFTK0MsRUFBTyxJQUU3QnduRSxHQUFjeGxFLEVBQU9nNEUsR0FBWXpULEVBQVcsR0FBSXZtRSxHQXNDekQsU0FBU3FtRixHQUFjcmtGLEVBQU91a0UsRUFBV2tCLEdBQ3ZDLElBQUl4cUUsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxJQUFLQSxFQUNILE9BQVEsRUFFVixJQUFJK0MsRUFBUS9DLEVBQVMsRUFPckIsWUFoc09BbkIsSUEwck9JMnJFLElBQ0Z6bkUsRUFBUXNqRixHQUFVN2IsR0FDbEJ6bkUsRUFBUXluRSxFQUFZLEVBQ2hCMEUsR0FBVWx2RSxFQUFTK0MsRUFBTyxHQUMxQm9zRSxHQUFVcHNFLEVBQU8vQyxFQUFTLElBRXpCdXFFLEdBQWN4bEUsRUFBT2c0RSxHQUFZelQsRUFBVyxHQUFJdm1FLEdBQU8sR0FpQmhFLFNBQVNxOEIsR0FBUXI2QixHQUVmLE9BRHNCLE1BQVRBLEVBQWdCLEVBQUlBLEVBQU0vRSxRQUN2QmczRSxHQUFZanlFLEVBQU8sR0FBSyxHQWdHMUMsU0FBU3NrRixHQUFLdGtGLEdBQ1osT0FBUUEsR0FBU0EsRUFBTS9FLE9BQVUrRSxFQUFNLFFBcHpPdkNsRyxFQTgzT0YsSUFBSXlxRixHQUFldEwsSUFBUyxTQUFTekYsR0FDbkMsSUFBSWdSLEVBQVMzZixHQUFTMk8sRUFBUWtJLElBQzlCLE9BQVE4SSxFQUFPdnBGLFFBQVV1cEYsRUFBTyxLQUFPaFIsRUFBTyxHQUMxQ0QsR0FBaUJpUixHQUNqQixNQTBCRkMsR0FBaUJ4TCxJQUFTLFNBQVN6RixHQUNyQyxJQUFJdFAsRUFBVzlTLEdBQUtvaUIsR0FDaEJnUixFQUFTM2YsR0FBUzJPLEVBQVFrSSxJQU85QixPQUxJeFgsSUFBYTlTLEdBQUtvekIsR0FDcEJ0Z0IsT0FqNk9GcHFFLEVBbTZPRTBxRixFQUFPdm1GLE1BRUR1bUYsRUFBT3ZwRixRQUFVdXBGLEVBQU8sS0FBT2hSLEVBQU8sR0FDMUNELEdBQWlCaVIsRUFBUXhNLEdBQVk5VCxFQUFVLElBQy9DLE1Bd0JGd2dCLEdBQW1CekwsSUFBUyxTQUFTekYsR0FDdkMsSUFBSXB5QyxFQUFhZ3dCLEdBQUtvaUIsR0FDbEJnUixFQUFTM2YsR0FBUzJPLEVBQVFrSSxJQU05QixPQUpBdDZDLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0FuOE8vQ3RuQyxJQXE4T0UwcUYsRUFBT3ZtRixNQUVEdW1GLEVBQU92cEYsUUFBVXVwRixFQUFPLEtBQU9oUixFQUFPLEdBQzFDRCxHQUFpQmlSLE9BeDhPckIxcUYsRUF3OE93Q3NuQyxHQUNwQyxNQW9DTixTQUFTZ3dCLEdBQUtweEQsR0FDWixJQUFJL0UsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxPQUFPQSxFQUFTK0UsRUFBTS9FLEVBQVMsUUEvK08vQm5CLEVBc2tQRixJQUFJMmdFLEdBQU93ZSxHQUFTMEwsSUFzQnBCLFNBQVNBLEdBQVEza0YsRUFBT3FMLEdBQ3RCLE9BQVFyTCxHQUFTQSxFQUFNL0UsUUFBVW9RLEdBQVVBLEVBQU9wUSxPQUM5QzI5RSxHQUFZNTRFLEVBQU9xTCxHQUNuQnJMLEVBcUZOLElBQUk0a0YsR0FBU3ZHLElBQVMsU0FBU3IrRSxFQUFPODRFLEdBQ3BDLElBQUk3OUUsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUNuQ2lkLEVBQVMyMkQsR0FBTzd1RSxFQUFPODRFLEdBTTNCLE9BSkFELEdBQVc3NEUsRUFBTzZrRSxHQUFTaVUsR0FBUyxTQUFTOTZFLEdBQzNDLE9BQU8ydkUsR0FBUTN2RSxFQUFPL0MsSUFBVytDLEVBQVFBLEtBQ3hDZ3RCLEtBQUt1dEQsS0FFRHJnRSxLQTJFVCxTQUFTd29CLEdBQVExZ0MsR0FDZixPQUFnQixNQUFUQSxFQUFnQkEsRUFBUXdxRSxHQUFjMzBFLEtBQUttSyxHQWthcEQsSUFBSTZrRixHQUFRNUwsSUFBUyxTQUFTekYsR0FDNUIsT0FBT3FILEdBQVM1SSxHQUFZdUIsRUFBUSxFQUFHaUUsSUFBbUIsT0EwQnhEcU4sR0FBVTdMLElBQVMsU0FBU3pGLEdBQzlCLElBQUl0UCxFQUFXOVMsR0FBS29pQixHQUlwQixPQUhJaUUsR0FBa0J2VCxLQUNwQkEsT0F4c1FGcHFFLEdBMHNRTytnRixHQUFTNUksR0FBWXVCLEVBQVEsRUFBR2lFLElBQW1CLEdBQU9PLEdBQVk5VCxFQUFVLE9Bd0JyRjZnQixHQUFZOUwsSUFBUyxTQUFTekYsR0FDaEMsSUFBSXB5QyxFQUFhZ3dCLEdBQUtvaUIsR0FFdEIsT0FEQXB5QyxFQUFrQyxtQkFBZEEsRUFBMkJBLE9BcHVRL0N0bkMsRUFxdVFPK2dGLEdBQVM1SSxHQUFZdUIsRUFBUSxFQUFHaUUsSUFBbUIsUUFydVExRDM5RSxFQXF1UTRFc25DLE1BZ0c5RSxTQUFTNGpELEdBQU1obEYsR0FDYixJQUFNQSxJQUFTQSxFQUFNL0UsT0FDbkIsTUFBTyxHQUVULElBQUlBLEVBQVMsRUFPYixPQU5BK0UsRUFBUXdrRSxHQUFZeGtFLEdBQU8sU0FBU21MLEdBQ2xDLEdBQUlzc0UsR0FBa0J0c0UsR0FFcEIsT0FEQWxRLEVBQVNrdkUsR0FBVWgvRCxFQUFNbFEsT0FBUUEsSUFDMUIsS0FHSmlyRSxHQUFVanJFLEdBQVEsU0FBUytDLEdBQ2hDLE9BQU82bUUsR0FBUzdrRSxFQUFPb2xFLEdBQWFwbkUsT0F5QnhDLFNBQVNpbkYsR0FBVWpsRixFQUFPa2tFLEdBQ3hCLElBQU1sa0UsSUFBU0EsRUFBTS9FLE9BQ25CLE1BQU8sR0FFVCxJQUFJaWQsRUFBUzhzRSxHQUFNaGxGLEdBQ25CLE9BQWdCLE1BQVpra0UsRUFDS2hzRCxFQUVGMnNELEdBQVMzc0QsR0FBUSxTQUFTL00sR0FDL0IsT0FBT3JULEdBQU1vc0UsT0FuM1FmcHFFLEVBbTNRb0NxUixNQXdCdEMsSUFBSSs1RSxHQUFVak0sSUFBUyxTQUFTajVFLEVBQU9xTCxHQUNyQyxPQUFPb3NFLEdBQWtCejNFLEdBQ3JCOHdFLEdBQWU5d0UsRUFBT3FMLEdBQ3RCLE1BcUJGODVFLEdBQU1sTSxJQUFTLFNBQVN6RixHQUMxQixPQUFPOEgsR0FBUTlXLEdBQVlnUCxFQUFRaUUsUUEwQmpDMk4sR0FBUW5NLElBQVMsU0FBU3pGLEdBQzVCLElBQUl0UCxFQUFXOVMsR0FBS29pQixHQUlwQixPQUhJaUUsR0FBa0J2VCxLQUNwQkEsT0FqOFFGcHFFLEdBbThRT3doRixHQUFROVcsR0FBWWdQLEVBQVFpRSxJQUFvQk8sR0FBWTlULEVBQVUsT0F3QjNFbWhCLEdBQVVwTSxJQUFTLFNBQVN6RixHQUM5QixJQUFJcHlDLEVBQWFnd0IsR0FBS29pQixHQUV0QixPQURBcHlDLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0E3OVEvQ3RuQyxFQTg5UU93aEYsR0FBUTlXLEdBQVlnUCxFQUFRaUUsU0E5OVFuQzM5RSxFQTg5UWtFc25DLE1BbUJoRWtrRCxHQUFNck0sR0FBUytMLElBNkRuQixJQUFJTyxHQUFVdE0sSUFBUyxTQUFTekYsR0FDOUIsSUFBSXY0RSxFQUFTdTRFLEVBQU92NEUsT0FDaEJpcEUsRUFBV2pwRSxFQUFTLEVBQUl1NEUsRUFBT3Y0RSxFQUFTLFFBaGpSNUNuQixFQW1qUkEsT0FEQW9xRSxFQUE4QixtQkFBWkEsR0FBMEJzUCxFQUFPdjFFLE1BQU9pbUUsUUFsalIxRHBxRSxFQW1qUk9tckYsR0FBVXpSLEVBQVF0UCxNQWtDM0IsU0FBU3NoQixHQUFNN3VGLEdBQ2IsSUFBSXVoQixFQUFTc3pELEdBQU83MEUsR0FFcEIsT0FEQXVoQixFQUFPaTBELFdBQVksRUFDWmowRCxFQXNEVCxTQUFTc21FLEdBQUs3bkYsRUFBTzh1RixHQUNuQixPQUFPQSxFQUFZOXVGLEdBbUJyQixJQUFJK3VGLEdBQVlySCxJQUFTLFNBQVNyOUMsR0FDaEMsSUFBSS9sQyxFQUFTK2xDLEVBQU0vbEMsT0FDZm1qQyxFQUFRbmpDLEVBQVMrbEMsRUFBTSxHQUFLLEVBQzVCcnFDLEVBQVFpQyxLQUFLcXpFLFlBQ2J3WixFQUFjLFNBQVNydUYsR0FBVSxPQUFPeTNFLEdBQU96M0UsRUFBUTRwQyxJQUUzRCxRQUFJL2xDLEVBQVMsR0FBS3JDLEtBQUtzekUsWUFBWWp4RSxTQUM3QnRFLGFBQWlCKzBFLElBQWlCaUMsR0FBUXZ2QyxLQUdoRHpuQyxFQUFRQSxFQUFNMkMsTUFBTThrQyxHQUFRQSxHQUFTbmpDLEVBQVMsRUFBSSxLQUM1Q2l4RSxZQUFZbHhFLEtBQUssQ0FDckIsS0FBUXdqRixHQUNSLEtBQVEsQ0FBQ2lILEdBQ1QsYUFoclJGM3JGLElBa3JSTyxJQUFJNnhFLEdBQWNoMUUsRUFBT2lDLEtBQUt1ekUsV0FBV3FTLE1BQUssU0FBU3grRSxHQUk1RCxPQUhJL0UsSUFBVytFLEVBQU0vRSxRQUNuQitFLEVBQU1oRixVQXByUlZsQixHQXNyUlNrRyxNQVpBcEgsS0FBSzRsRixLQUFLaUgsTUErUHJCLElBQUlFLEdBQVV6SSxJQUFpQixTQUFTaGxFLEVBQVF2aEIsRUFBT00sR0FDakRNLEdBQWUxQixLQUFLcWlCLEVBQVFqaEIsS0FDNUJpaEIsRUFBT2poQixHQUVUbzNFLEdBQWdCbjJELEVBQVFqaEIsRUFBSyxNQXVJakMsSUFBSW1iLEdBQU84ckUsR0FBV2tHLElBcUJsQndCLEdBQVcxSCxHQUFXbUcsSUEyRzFCLFNBQVM1L0UsR0FBUTZnRSxFQUFZcEIsR0FFM0IsT0FEV2xoRCxHQUFRc2lELEdBQWNsQixHQUFZc0ssSUFDakNwSixFQUFZMFMsR0FBWTlULEVBQVUsSUF1QmhELFNBQVMyaEIsR0FBYXZnQixFQUFZcEIsR0FFaEMsT0FEV2xoRCxHQUFRc2lELEdBQWNqQixHQUFpQnNOLElBQ3RDck0sRUFBWTBTLEdBQVk5VCxFQUFVLElBMEJoRCxJQUFJNGhCLEdBQVU1SSxJQUFpQixTQUFTaGxFLEVBQVF2aEIsRUFBT00sR0FDakRNLEdBQWUxQixLQUFLcWlCLEVBQVFqaEIsR0FDOUJpaEIsRUFBT2poQixHQUFLK0QsS0FBS3JFLEdBRWpCMDNFLEdBQWdCbjJELEVBQVFqaEIsRUFBSyxDQUFDTixPQXNFbEMsSUFBSW92RixHQUFZOU0sSUFBUyxTQUFTM1QsRUFBWXI3RCxFQUFNaFMsR0FDbEQsSUFBSStGLEdBQVMsRUFDVHd4RSxFQUF3QixtQkFBUnZsRSxFQUNoQmlPLEVBQVMyK0QsR0FBWXZSLEdBQWNscEUsRUFBTWtwRSxFQUFXcnFFLFFBQVUsR0FLbEUsT0FIQXl6RSxHQUFTcEosR0FBWSxTQUFTM3VFLEdBQzVCdWhCLElBQVNsYSxHQUFTd3hFLEVBQVMxM0UsR0FBTW1TLEVBQU10VCxFQUFPc0IsR0FBUTY3RSxHQUFXbjlFLEVBQU9zVCxFQUFNaFMsTUFFekVpZ0IsS0ErQkw4dEUsR0FBUTlJLElBQWlCLFNBQVNobEUsRUFBUXZoQixFQUFPTSxHQUNuRG8zRSxHQUFnQm4yRCxFQUFRamhCLEVBQUtOLE1BNkMvQixTQUFTMFQsR0FBSWk3RCxFQUFZcEIsR0FFdkIsT0FEV2xoRCxHQUFRc2lELEdBQWNULEdBQVcrUixJQUNoQ3RSLEVBQVkwUyxHQUFZOVQsRUFBVSxJQWtGaEQsSUFBSStoQixHQUFZL0ksSUFBaUIsU0FBU2hsRSxFQUFRdmhCLEVBQU9NLEdBQ3ZEaWhCLEVBQU9qaEIsRUFBTSxFQUFJLEdBQUcrRCxLQUFLckUsTUFDeEIsV0FBYSxNQUFPLENBQUMsR0FBSSxPQW1TNUIsSUFBSXV2RixHQUFTak4sSUFBUyxTQUFTM1QsRUFBWXdTLEdBQ3pDLEdBQWtCLE1BQWR4UyxFQUNGLE1BQU8sR0FFVCxJQUFJcnFFLEVBQVM2OEUsRUFBVTc4RSxPQU12QixPQUxJQSxFQUFTLEdBQUt1aUYsR0FBZWxZLEVBQVl3UyxFQUFVLEdBQUlBLEVBQVUsSUFDbkVBLEVBQVksR0FDSDc4RSxFQUFTLEdBQUt1aUYsR0FBZTFGLEVBQVUsR0FBSUEsRUFBVSxHQUFJQSxFQUFVLE1BQzVFQSxFQUFZLENBQUNBLEVBQVUsS0FFbEJELEdBQVl2UyxFQUFZMk0sR0FBWTZGLEVBQVcsR0FBSSxPQXFCeERyd0IsR0FBTWdpQixJQUFVLFdBQ2xCLE9BQU83bkMsR0FBSzVPLEtBQUt5MEIsT0EwRG5CLFNBQVMwM0IsR0FBSXpyRCxFQUFNdjhCLEVBQUdvbUYsR0FHcEIsT0FGQXBtRixFQUFJb21GLE9BNTFUSnpqRixFQTQxVHdCM0MsRUFFakJ1cUYsR0FBV2h1RCxFQXZ6VEYsU0F2Q2hCNTVCLHVCQTYxVEEzQyxFQUFLdThCLEdBQWEsTUFBTHY4QixFQUFhdThCLEVBQUt6NEIsT0FBUzlELEdBcUIxQyxTQUFTZ3ZGLEdBQU9odkYsRUFBR3U4QixHQUNqQixJQUFJeGIsRUFDSixHQUFtQixtQkFBUndiLEVBQ1QsTUFBTSxJQUFJdDVCLEdBQVVzaUUsR0FHdEIsT0FEQXZsRSxFQUFJbXFGLEdBQVVucUYsR0FDUCxXQU9MLFFBTk1BLEVBQUksSUFDUitnQixFQUFTd2IsRUFBSzU3QixNQUFNYyxLQUFNVyxZQUV4QnBDLEdBQUssSUFDUHU4QixPQTczVEo1NUIsR0ErM1RTb2UsR0F1Q1gsSUFBSWhoQixHQUFPK2hGLElBQVMsU0FBU3ZsRCxFQUFNcXdDLEVBQVNvWSxHQUMxQyxJQUFJbk4sRUF2NFRhLEVBdzRUakIsR0FBSW1OLEVBQVNsaEYsT0FBUSxDQUNuQixJQUFJbWhGLEVBQVU3VSxHQUFlNFUsRUFBVXNELEdBQVV2b0YsS0FDakQ4M0UsR0FyNFRrQixHQXU0VHBCLE9BQU8wUyxHQUFXaHVELEVBQU1zN0MsRUFBU2pMLEVBQVNvWSxFQUFVQyxNQWdEbERnSyxHQUFVbk4sSUFBUyxTQUFTN2hGLEVBQVFILEVBQUtrbEYsR0FDM0MsSUFBSW5OLEVBQVVxWCxFQUNkLEdBQUlsSyxFQUFTbGhGLE9BQVEsQ0FDbkIsSUFBSW1oRixFQUFVN1UsR0FBZTRVLEVBQVVzRCxHQUFVMkcsS0FDakRwWCxHQTM3VGtCLEdBNjdUcEIsT0FBTzBTLEdBQVd6cUYsRUFBSyszRSxFQUFTNTNFLEVBQVEra0YsRUFBVUMsTUFzSnBELFNBQVNrSyxHQUFTNXlELEVBQU1tOUMsRUFBTXA2RCxHQUM1QixJQUFJOHZFLEVBQ0FDLEVBQ0FDLEVBQ0F2dUUsRUFDQXd1RSxFQUNBQyxFQUNBQyxFQUFpQixFQUNqQkMsR0FBVSxFQUNWQyxHQUFTLEVBQ1RsSixHQUFXLEVBRWYsR0FBbUIsbUJBQVJscUQsRUFDVCxNQUFNLElBQUl0NUIsR0FBVXNpRSxHQVV0QixTQUFTcXFCLEVBQVdDLEdBQ2xCLElBQUkvdUYsRUFBT3N1RixFQUNQeGlCLEVBQVV5aUIsRUFLZCxPQUhBRCxFQUFXQyxPQW5wVWIxc0YsRUFvcFVFOHNGLEVBQWlCSSxFQUNqQjl1RSxFQUFTd2IsRUFBSzU3QixNQUFNaXNFLEVBQVM5ckUsR0FJL0IsU0FBU2d2RixFQUFZRCxHQU1uQixPQUpBSixFQUFpQkksRUFFakJOLEVBQVVqbkYsR0FBV3luRixFQUFjclcsR0FFNUJnVyxFQUFVRSxFQUFXQyxHQUFROXVFLEVBYXRDLFNBQVNpdkUsRUFBYUgsR0FDcEIsSUFBSUksRUFBb0JKLEVBQU9MLEVBTS9CLFlBbnJVRjdzRixJQW1yVVU2c0YsR0FBK0JTLEdBQXFCdlcsR0FDekR1VyxFQUFvQixHQUFPTixHQU5KRSxFQUFPSixHQU04QkgsRUFHakUsU0FBU1MsSUFDUCxJQUFJRixFQUFPdi9CLEtBQ1gsR0FBSTAvQixFQUFhSCxHQUNmLE9BQU9LLEVBQWFMLEdBR3RCTixFQUFVam5GLEdBQVd5bkYsRUEzQnZCLFNBQXVCRixHQUNyQixJQUVJTSxFQUFjelcsR0FGTW1XLEVBQU9MLEdBSS9CLE9BQU9HLEVBQ0gxYyxHQUFVa2QsRUFBYWIsR0FKRE8sRUFBT0osSUFLN0JVLEVBb0IrQkMsQ0FBY1AsSUFHbkQsU0FBU0ssRUFBYUwsR0FLcEIsT0FKQU4sT0Fqc1VGNXNGLEVBcXNVTThqRixHQUFZMkksRUFDUFEsRUFBV0MsSUFFcEJULEVBQVdDLE9BeHNVYjFzRixFQXlzVVNvZSxHQWVULFNBQVNzdkUsSUFDUCxJQUFJUixFQUFPdi9CLEtBQ1BnZ0MsRUFBYU4sRUFBYUgsR0FNOUIsR0FKQVQsRUFBV2h0RixVQUNYaXRGLEVBQVc1dEYsS0FDWCt0RixFQUFlSyxFQUVYUyxFQUFZLENBQ2QsUUFqdVVKM3RGLElBaXVVUTRzRixFQUNGLE9BQU9PLEVBQVlOLEdBRXJCLEdBQUlHLEVBSUYsT0FGQW5uRixHQUFhK21GLEdBQ2JBLEVBQVVqbkYsR0FBV3luRixFQUFjclcsR0FDNUJrVyxFQUFXSixHQU10QixZQTl1VUY3c0YsSUEydVVNNHNGLElBQ0ZBLEVBQVVqbkYsR0FBV3luRixFQUFjclcsSUFFOUIzNEQsRUFJVCxPQTNHQTI0RCxFQUFPaVEsR0FBU2pRLElBQVMsRUFDckIvRSxHQUFTcjFELEtBQ1hvd0UsSUFBWXB3RSxFQUFRb3dFLFFBRXBCSixHQURBSyxFQUFTLFlBQWFyd0UsR0FDSDB6RCxHQUFVMlcsR0FBU3JxRSxFQUFRZ3dFLFVBQVksRUFBRzVWLEdBQVE0VixFQUNyRTdJLEVBQVcsYUFBY25uRSxJQUFZQSxFQUFRbW5FLFNBQVdBLEdBb0cxRDRKLEVBQVUxakQsT0FwQ1YsZ0JBNXNVQWhxQyxJQTZzVU00c0YsR0FDRi9tRixHQUFhK21GLEdBRWZFLEVBQWlCLEVBQ2pCTCxFQUFXSSxFQUFlSCxFQUFXRSxPQWp0VXZDNXNGLEdBaXZVQTB0RixFQUFVRSxNQTdCVixXQUNFLFlBcnRVRjV0RixJQXF0VVM0c0YsRUFBd0J4dUUsRUFBU212RSxFQUFhNS9CLE9BNkJoRCsvQixFQXFCVCxJQUFJRyxHQUFRMU8sSUFBUyxTQUFTdmxELEVBQU16N0IsR0FDbEMsT0FBTzI0RSxHQUFVbDlDLEVBQU0sRUFBR3o3QixNQXNCeEIydkYsR0FBUTNPLElBQVMsU0FBU3ZsRCxFQUFNbTlDLEVBQU01NEUsR0FDeEMsT0FBTzI0RSxHQUFVbDlDLEVBQU1vdEQsR0FBU2pRLElBQVMsRUFBRzU0RSxNQXFFOUMsU0FBUzRyRixHQUFRbndELEVBQU1yNkIsR0FDckIsR0FBbUIsbUJBQVJxNkIsR0FBbUMsTUFBWnI2QixHQUF1QyxtQkFBWkEsRUFDM0QsTUFBTSxJQUFJZSxHQUFVc2lFLEdBRXRCLElBQUltckIsRUFBVyxXQUNiLElBQUk1dkYsRUFBT3NCLFVBQ1B0QyxFQUFNb0MsRUFBV0EsRUFBU3ZCLE1BQU1jLEtBQU1YLEdBQVFBLEVBQUssR0FDbkR1dUUsRUFBUXFoQixFQUFTcmhCLE1BRXJCLEdBQUlBLEVBQU10N0QsSUFBSWpVLEdBQ1osT0FBT3V2RSxFQUFNandFLElBQUlVLEdBRW5CLElBQUlpaEIsRUFBU3diLEVBQUs1N0IsTUFBTWMsS0FBTVgsR0FFOUIsT0FEQTR2RixFQUFTcmhCLE1BQVFBLEVBQU0zcEUsSUFBSTVGLEVBQUtpaEIsSUFBV3N1RCxFQUNwQ3R1RCxHQUdULE9BREEydkUsRUFBU3JoQixNQUFRLElBQUtxZCxHQUFRaUUsT0FBUy9hLElBQ2hDOGEsRUEwQlQsU0FBU0UsR0FBT3hqQixHQUNkLEdBQXdCLG1CQUFiQSxFQUNULE1BQU0sSUFBSW5xRSxHQUFVc2lFLEdBRXRCLE9BQU8sV0FDTCxJQUFJemtFLEVBQU9zQixVQUNYLE9BQVF0QixFQUFLZ0QsUUFDWCxLQUFLLEVBQUcsT0FBUXNwRSxFQUFVMXVFLEtBQUsrQyxNQUMvQixLQUFLLEVBQUcsT0FBUTJyRSxFQUFVMXVFLEtBQUsrQyxLQUFNWCxFQUFLLElBQzFDLEtBQUssRUFBRyxPQUFRc3NFLEVBQVUxdUUsS0FBSytDLEtBQU1YLEVBQUssR0FBSUEsRUFBSyxJQUNuRCxLQUFLLEVBQUcsT0FBUXNzRSxFQUFVMXVFLEtBQUsrQyxLQUFNWCxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxJQUU5RCxPQUFRc3NFLEVBQVV6c0UsTUFBTWMsS0FBTVgsSUFsQ2xDNHJGLEdBQVFpRSxNQUFRL2EsR0EyRmhCLElBQUlpYixHQUFXbk0sSUFBUyxTQUFTbm9ELEVBQU11MEQsR0FLckMsSUFBSUMsR0FKSkQsRUFBbUMsR0FBckJBLEVBQVdodEYsUUFBZStuQixHQUFRaWxFLEVBQVcsSUFDdkRwakIsR0FBU29qQixFQUFXLEdBQUk1aEIsR0FBVTJSLE9BQ2xDblQsR0FBU29OLEdBQVlnVyxFQUFZLEdBQUk1aEIsR0FBVTJSLFFBRXRCLzhFLE9BQzdCLE9BQU9nK0UsSUFBUyxTQUFTaGhGLEdBSXZCLElBSEEsSUFBSStGLEdBQVMsRUFDVC9DLEVBQVNtdkUsR0FBVW55RSxFQUFLZ0QsT0FBUWl0RixLQUUzQmxxRixFQUFRL0MsR0FDZmhELEVBQUsrRixHQUFTaXFGLEVBQVdqcUYsR0FBT25JLEtBQUsrQyxLQUFNWCxFQUFLK0YsSUFFbEQsT0FBT2xHLEdBQU00N0IsRUFBTTk2QixLQUFNWCxTQXFDekJrd0YsR0FBVWxQLElBQVMsU0FBU3ZsRCxFQUFNeW9ELEdBRXBDLE9BQU91RixHQUFXaHVELEVBbitVRSxRQXJDcEI1NUIsRUF3Z1ZzRHFpRixFQUR4QzVVLEdBQWU0VSxFQUFVc0QsR0FBVTBJLFNBb0MvQ0MsR0FBZW5QLElBQVMsU0FBU3ZsRCxFQUFNeW9ELEdBRXpDLE9BQU91RixHQUFXaHVELEVBdmdWUSxRQXRDMUI1NUIsRUE2aVY0RHFpRixFQUQ5QzVVLEdBQWU0VSxFQUFVc0QsR0FBVTJJLFNBMEIvQ0MsR0FBUWhLLElBQVMsU0FBUzNxRCxFQUFNb2xELEdBQ2xDLE9BQU80SSxHQUFXaHVELEVBL2hWQSxTQXhDbEI1NUIsZ0JBdWtWMEVnL0UsTUFpYTVFLFNBQVMxSyxHQUFHejNFLEVBQU82akIsR0FDakIsT0FBTzdqQixJQUFVNmpCLEdBQVU3akIsR0FBVUEsR0FBUzZqQixHQUFVQSxFQTBCMUQsSUFBSTh0RSxHQUFLekgsR0FBMEJ6TixJQXlCL0JtVixHQUFNMUgsSUFBMEIsU0FBU2xxRixFQUFPNmpCLEdBQ2xELE9BQU83akIsR0FBUzZqQixLQXFCZCt5RCxHQUFjd0csR0FBZ0IsV0FBYSxPQUFPeDZFLFVBQXBCLElBQXNDdzZFLEdBQWtCLFNBQVNwOUUsR0FDakcsT0FBTzgwRSxHQUFhOTBFLElBQVVZLEdBQWUxQixLQUFLYyxFQUFPLFlBQ3REc3lFLEdBQXFCcHpFLEtBQUtjLEVBQU8sV0EwQmxDcXNCLEdBQVU1bUIsRUFBTTRtQixRQW1CaEJvZ0QsR0FBZ0JELEdBQW9Ca0QsR0FBVWxELElBNzVQbEQsU0FBMkJ4c0UsR0FDekIsT0FBTzgwRSxHQUFhOTBFLElBQVVvOEUsR0FBV3A4RSxJQUFVaW5FLEdBdTdQckQsU0FBU2laLEdBQVlsZ0YsR0FDbkIsT0FBZ0IsTUFBVEEsR0FBaUJrc0YsR0FBU2xzRixFQUFNc0UsVUFBWXUzRSxHQUFXNzdFLEdBNEJoRSxTQUFTOGdGLEdBQWtCOWdGLEdBQ3pCLE9BQU84MEUsR0FBYTkwRSxJQUFVa2dGLEdBQVlsZ0YsR0EwQzVDLElBQUlvekUsR0FBV0QsSUFBa0JrWixHQW1CN0IxZixHQUFTRCxHQUFhZ0QsR0FBVWhELElBeGdRcEMsU0FBb0Ixc0UsR0FDbEIsT0FBTzgwRSxHQUFhOTBFLElBQVVvOEUsR0FBV3A4RSxJQUFVcW1FLEdBK3FRckQsU0FBU3dyQixHQUFRN3hGLEdBQ2YsSUFBSzgwRSxHQUFhOTBFLEdBQ2hCLE9BQU8sRUFFVCxJQUFJMjRFLEVBQU15RCxHQUFXcDhFLEdBQ3JCLE9BQU8yNEUsR0FBT3JTLEdBOXlXRix5QkE4eVdjcVMsR0FDQyxpQkFBakIzNEUsRUFBTTBHLFNBQTRDLGlCQUFkMUcsRUFBTVYsT0FBcUJzOUIsR0FBYzU4QixHQWtEekYsU0FBUzY3RSxHQUFXNzdFLEdBQ2xCLElBQUttMUUsR0FBU24xRSxHQUNaLE9BQU8sRUFJVCxJQUFJMjRFLEVBQU15RCxHQUFXcDhFLEdBQ3JCLE9BQU8yNEUsR0FBT3BTLEdBQVdvUyxHQUFPblMsR0EzMldyQiwwQkEyMlcrQm1TLEdBLzFXL0Isa0JBKzFXa0RBLEVBNkIvRCxTQUFTbVosR0FBVTl4RixHQUNqQixNQUF1QixpQkFBVEEsR0FBcUJBLEdBQVMycUYsR0FBVTNxRixHQTZCeEQsU0FBU2tzRixHQUFTbHNGLEdBQ2hCLE1BQXVCLGlCQUFUQSxHQUNaQSxHQUFTLEdBQUtBLEVBQVEsR0FBSyxHQUFLQSxHQWo4V2YsaUJBNjlXckIsU0FBU20xRSxHQUFTbjFFLEdBQ2hCLElBQUk2RCxTQUFjN0QsRUFDbEIsT0FBZ0IsTUFBVEEsSUFBMEIsVUFBUjZELEdBQTRCLFlBQVJBLEdBMkIvQyxTQUFTaXhFLEdBQWE5MEUsR0FDcEIsT0FBZ0IsTUFBVEEsR0FBaUMsaUJBQVRBLEVBb0JqQyxJQUFJNnNFLEdBQVFELEdBQVk4QyxHQUFVOUMsSUE1eFFsQyxTQUFtQjVzRSxHQUNqQixPQUFPODBFLEdBQWE5MEUsSUFBVTQ0RSxHQUFPNTRFLElBQVV5bUUsR0E2K1FqRCxTQUFTc3JCLEdBQVMveEYsR0FDaEIsTUFBdUIsaUJBQVRBLEdBQ1g4MEUsR0FBYTkwRSxJQUFVbzhFLEdBQVdwOEUsSUFBVTBtRSxFQStCakQsU0FBUzlwQyxHQUFjNThCLEdBQ3JCLElBQUs4MEUsR0FBYTkwRSxJQUFVbzhFLEdBQVdwOEUsSUFBVTJtRSxFQUMvQyxPQUFPLEVBRVQsSUFBSWpxQyxFQUFRMDFDLEdBQWFweUUsR0FDekIsR0FBYyxPQUFWMDhCLEVBQ0YsT0FBTyxFQUVULElBQUlDLEVBQU8vN0IsR0FBZTFCLEtBQUt3OUIsRUFBTyxnQkFBa0JBLEVBQU0xMEIsWUFDOUQsTUFBc0IsbUJBQVIyMEIsR0FBc0JBLGFBQWdCQSxHQUNsRFYsR0FBYS84QixLQUFLeTlCLElBQVNULEdBb0IvQixJQUFJNndDLEdBQVdELEdBQWU0QyxHQUFVNUMsSUE1OVF4QyxTQUFzQjlzRSxHQUNwQixPQUFPODBFLEdBQWE5MEUsSUFBVW84RSxHQUFXcDhFLElBQVU0bUUsR0E2Z1JyRCxJQUFJcUcsR0FBUUQsR0FBWTBDLEdBQVUxQyxJQW5nUmxDLFNBQW1CaHRFLEdBQ2pCLE9BQU84MEUsR0FBYTkwRSxJQUFVNDRFLEdBQU81NEUsSUFBVTZtRSxHQXFoUmpELFNBQVNtckIsR0FBU2h5RixHQUNoQixNQUF1QixpQkFBVEEsSUFDVnFzQixHQUFRcnNCLElBQVU4MEUsR0FBYTkwRSxJQUFVbzhFLEdBQVdwOEUsSUFBVThtRSxFQW9CcEUsU0FBU3NVLEdBQVNwN0UsR0FDaEIsTUFBdUIsaUJBQVRBLEdBQ1g4MEUsR0FBYTkwRSxJQUFVbzhFLEdBQVdwOEUsSUFBVSttRSxFQW9CakQsSUFBSW9HLEdBQWVELEdBQW1Cd0MsR0FBVXhDLElBdmpSaEQsU0FBMEJsdEUsR0FDeEIsT0FBTzgwRSxHQUFhOTBFLElBQ2xCa3NGLEdBQVNsc0YsRUFBTXNFLFdBQWFvbkUsR0FBZTBRLEdBQVdwOEUsS0E2b1IxRCxJQUFJaXlGLEdBQUsvSCxHQUEwQmxLLElBeUIvQmtTLEdBQU1oSSxJQUEwQixTQUFTbHFGLEVBQU82akIsR0FDbEQsT0FBTzdqQixHQUFTNmpCLEtBMEJsQixTQUFTc3VFLEdBQVFueUYsR0FDZixJQUFLQSxFQUNILE1BQU8sR0FFVCxHQUFJa2dGLEdBQVlsZ0YsR0FDZCxPQUFPZ3lGLEdBQVNoeUYsR0FBU2t4RSxHQUFjbHhFLEdBQVNxM0UsR0FBVXIzRSxHQUU1RCxHQUFJeXlFLElBQWV6eUUsRUFBTXl5RSxJQUN2QixPQXY4Vk4sU0FBeUJDLEdBSXZCLElBSEEsSUFBSWhvRCxFQUNBbkosRUFBUyxLQUVKbUosRUFBT2dvRCxFQUFTL2hELFFBQVEwWCxNQUMvQjltQixFQUFPbGQsS0FBS3FtQixFQUFLMXFCLE9BRW5CLE9BQU91aEIsRUFnOFZJNndFLENBQWdCcHlGLEVBQU15eUUsT0FFL0IsSUFBSWtHLEVBQU1DLEdBQU81NEUsR0FHakIsT0FGVzI0RSxHQUFPbFMsRUFBU2dLLEdBQWNrSSxHQUFPOVIsRUFBU2dLLEdBQWFuOEQsSUFFMUQxVSxHQTBCZCxTQUFTZ3FGLEdBQVNocUYsR0FDaEIsT0FBS0EsR0FHTEEsRUFBUW1xRixHQUFTbnFGLE1BemtZTixLQTBrWWVBLEtBMWtZZixJQUVHLHVCQXlrWUFBLEVBQVEsR0FBSyxFQUFJLEdBR3hCQSxHQUFVQSxFQUFRQSxFQUFRLEVBUGQsSUFBVkEsRUFBY0EsRUFBUSxFQW9DakMsU0FBUzJxRixHQUFVM3FGLEdBQ2pCLElBQUl1aEIsRUFBU3lvRSxHQUFTaHFGLEdBQ2xCcXlGLEVBQVk5d0UsRUFBUyxFQUV6QixPQUFPQSxHQUFXQSxFQUFVOHdFLEVBQVk5d0UsRUFBUzh3RSxFQUFZOXdFLEVBQVUsRUE4QnpFLFNBQVMrd0UsR0FBU3R5RixHQUNoQixPQUFPQSxFQUFRczNFLEdBQVVxVCxHQUFVM3FGLEdBQVEsRUF4b1l4QixZQXdvWStDLEVBMEJwRSxTQUFTbXFGLEdBQVNucUYsR0FDaEIsR0FBb0IsaUJBQVRBLEVBQ1QsT0FBT0EsRUFFVCxHQUFJbzdFLEdBQVNwN0UsR0FDWCxPQTFxWUksSUE0cVlOLEdBQUltMUUsR0FBU24xRSxHQUFRLENBQ25CLElBQUk2akIsRUFBZ0MsbUJBQWpCN2pCLEVBQU0yMEUsUUFBd0IzMEUsRUFBTTIwRSxVQUFZMzBFLEVBQ25FQSxFQUFRbTFFLEdBQVN0eEQsR0FBVUEsRUFBUSxHQUFNQSxFQUUzQyxHQUFvQixpQkFBVDdqQixFQUNULE9BQWlCLElBQVZBLEVBQWNBLEdBQVNBLEVBRWhDQSxFQUFRd3ZFLEdBQVN4dkUsR0FDakIsSUFBSXV5RixFQUFXbHBCLEdBQVdwZ0UsS0FBS2pKLEdBQy9CLE9BQVF1eUYsR0FBWWhwQixHQUFVdGdFLEtBQUtqSixHQUMvQjhyRSxHQUFhOXJFLEVBQU0yQyxNQUFNLEdBQUk0dkYsRUFBVyxFQUFJLEdBQzNDbnBCLEdBQVduZ0UsS0FBS2pKLEdBdnJZZixLQXVyWStCQSxFQTJCdkMsU0FBUytnRixHQUFjL2dGLEdBQ3JCLE9BQU9pNEUsR0FBV2o0RSxFQUFPazVFLEdBQU9sNUUsSUFzRGxDLFNBQVN1YSxHQUFTdmEsR0FDaEIsT0FBZ0IsTUFBVEEsRUFBZ0IsR0FBS2lrRixHQUFhamtGLEdBcUMzQyxJQUFJcWhDLEdBQVNvbEQsSUFBZSxTQUFTaG1GLEVBQVFra0MsR0FDM0MsR0FBSWk3QyxHQUFZajdDLElBQVd1N0MsR0FBWXY3QyxHQUNyQ3N6QyxHQUFXdHpDLEVBQVFqOUIsR0FBS2k5QixHQUFTbGtDLFFBR25DLElBQUssSUFBSUgsS0FBT3FrQyxFQUNWL2pDLEdBQWUxQixLQUFLeWxDLEVBQVFya0MsSUFDOUJxM0UsR0FBWWwzRSxFQUFRSCxFQUFLcWtDLEVBQU9ya0MsT0FvQ2xDa3lGLEdBQVcvTCxJQUFlLFNBQVNobUYsRUFBUWtrQyxHQUM3Q3N6QyxHQUFXdHpDLEVBQVF1MEMsR0FBT3YwQyxHQUFTbGtDLE1BZ0NqQ2d5RixHQUFlaE0sSUFBZSxTQUFTaG1GLEVBQVFra0MsRUFBUTg3QyxFQUFVbkksR0FDbkVMLEdBQVd0ekMsRUFBUXUwQyxHQUFPdjBDLEdBQVNsa0MsRUFBUTYzRSxNQStCekNvYSxHQUFhak0sSUFBZSxTQUFTaG1GLEVBQVFra0MsRUFBUTg3QyxFQUFVbkksR0FDakVMLEdBQVd0ekMsRUFBUWo5QixHQUFLaTlCLEdBQVNsa0MsRUFBUTYzRSxNQW9CdkNqakQsR0FBS3F5RCxHQUFTeFAsSUE4RGxCLElBQUloaEMsR0FBV29yQyxJQUFTLFNBQVM3aEYsRUFBUWttRixHQUN2Q2xtRixFQUFTaEIsR0FBT2dCLEdBRWhCLElBQUk0RyxHQUFTLEVBQ1QvQyxFQUFTcWlGLEVBQVFyaUYsT0FDakJzaUYsRUFBUXRpRixFQUFTLEVBQUlxaUYsRUFBUSxRQS9pWmpDeGpGLEVBcWpaQSxJQUpJeWpGLEdBQVNDLEdBQWVGLEVBQVEsR0FBSUEsRUFBUSxHQUFJQyxLQUNsRHRpRixFQUFTLEtBR0YrQyxFQUFRL0MsR0FNZixJQUxBLElBQUlxZ0MsRUFBU2dpRCxFQUFRdC9FLEdBQ2pCdTRELEVBQVFzWixHQUFPdjBDLEdBQ2ZndUQsR0FBYyxFQUNkQyxFQUFjaHpCLEVBQU10N0QsU0FFZnF1RixFQUFhQyxHQUFhLENBQ2pDLElBQUl0eUYsRUFBTXMvRCxFQUFNK3lCLEdBQ1ozeUYsRUFBUVMsRUFBT0gsU0E3alp2QjZDLElBK2paUW5ELEdBQ0N5M0UsR0FBR3ozRSxFQUFPMHhFLEdBQVlweEUsTUFBVU0sR0FBZTFCLEtBQUt1QixFQUFRSCxNQUMvREcsRUFBT0gsR0FBT3FrQyxFQUFPcmtDLElBSzNCLE9BQU9HLEtBc0JMb3lGLEdBQWV2USxJQUFTLFNBQVNoaEYsR0FFbkMsT0FEQUEsRUFBSytDLFVBN2xaTGxCLEVBNmxacUJxb0YsSUFDZHJxRixHQUFNMnhGLFFBOWxaYjN2RixFQThsWm1DN0IsTUFnU3JDLFNBQVMxQixHQUFJYSxFQUFRNlMsRUFBTWsyRSxHQUN6QixJQUFJam9FLEVBQW1CLE1BQVY5Z0IsT0EvM1piMEMsRUErM1owQzI0RSxHQUFRcjdFLEVBQVE2UyxHQUMxRCxZQWg0WkFuUSxJQWc0Wk9vZSxFQUF1QmlvRSxFQUFlam9FLEVBNEQvQyxTQUFTZy9ELEdBQU05L0UsRUFBUTZTLEdBQ3JCLE9BQWlCLE1BQVY3UyxHQUFrQnVyRixHQUFRdnJGLEVBQVE2UyxFQUFNcXBFLElBcUJqRCxJQUFJb1csR0FBUzNKLElBQWUsU0FBUzduRSxFQUFRdmhCLEVBQU9NLEdBQ3JDLE1BQVROLEdBQ3lCLG1CQUFsQkEsRUFBTXVhLFdBQ2Z2YSxFQUFRK3hFLEdBQXFCN3lFLEtBQUtjLElBR3BDdWhCLEVBQU92aEIsR0FBU00sSUFDZndpRixHQUFTdEQsS0E0QlJ3VCxHQUFXNUosSUFBZSxTQUFTN25FLEVBQVF2aEIsRUFBT00sR0FDdkMsTUFBVE4sR0FDeUIsbUJBQWxCQSxFQUFNdWEsV0FDZnZhLEVBQVEreEUsR0FBcUI3eUUsS0FBS2MsSUFHaENZLEdBQWUxQixLQUFLcWlCLEVBQVF2aEIsR0FDOUJ1aEIsRUFBT3ZoQixHQUFPcUUsS0FBSy9ELEdBRW5CaWhCLEVBQU92aEIsR0FBUyxDQUFDTSxLQUVsQitnRixJQW9CQzRSLEdBQVMzUSxHQUFTbkYsSUE4QnRCLFNBQVN6MUUsR0FBS2pILEdBQ1osT0FBT3kvRSxHQUFZei9FLEdBQVUrMUUsR0FBYy8xRSxHQUFVay9FLEdBQVNsL0UsR0EwQmhFLFNBQVN5NEUsR0FBT3o0RSxHQUNkLE9BQU95L0UsR0FBWXovRSxHQUFVKzFFLEdBQWMvMUUsR0FBUSxHQUFRby9FLEdBQVdwL0UsR0F1R3hFLElBQUk0ckMsR0FBUW82QyxJQUFlLFNBQVNobUYsRUFBUWtrQyxFQUFRODdDLEdBQ2xERCxHQUFVLy9FLEVBQVFra0MsRUFBUTg3QyxNQWtDeEJxUyxHQUFZck0sSUFBZSxTQUFTaG1GLEVBQVFra0MsRUFBUTg3QyxFQUFVbkksR0FDaEVrSSxHQUFVLy9FLEVBQVFra0MsRUFBUTg3QyxFQUFVbkksTUF1QmxDNGEsR0FBT3hMLElBQVMsU0FBU2puRixFQUFRNHBDLEdBQ25DLElBQUk5b0IsRUFBUyxHQUNiLEdBQWMsTUFBVjlnQixFQUNGLE9BQU84Z0IsRUFFVCxJQUFJZzNELEdBQVMsRUFDYmx1QyxFQUFRNmpDLEdBQVM3akMsR0FBTyxTQUFTLzJCLEdBRy9CLE9BRkFBLEVBQU95b0UsR0FBU3pvRSxFQUFNN1MsR0FDdEI4M0UsSUFBV0EsRUFBU2psRSxFQUFLaFAsT0FBUyxHQUMzQmdQLEtBRVQya0UsR0FBV3gzRSxFQUFRczVFLEdBQWF0NUUsR0FBUzhnQixHQUNyQ2czRCxJQUNGaDNELEVBQVM2MkQsR0FBVTcyRCxFQUFRNHhFLEVBQXdEMUgsS0FHckYsSUFEQSxJQUFJbm5GLEVBQVMrbEMsRUFBTS9sQyxPQUNaQSxLQUNMODlFLEdBQVU3Z0UsRUFBUThvQixFQUFNL2xDLElBRTFCLE9BQU9pZCxLQTRDVCxJQUFJMmMsR0FBT3dwRCxJQUFTLFNBQVNqbkYsRUFBUTRwQyxHQUNuQyxPQUFpQixNQUFWNXBDLEVBQWlCLEdBbm1UMUIsU0FBa0JBLEVBQVE0cEMsR0FDeEIsT0FBTzAzQyxHQUFXdGhGLEVBQVE0cEMsR0FBTyxTQUFTcnFDLEVBQU9zVCxHQUMvQyxPQUFPaXRFLEdBQU05L0UsRUFBUTZTLE1BaW1UTTgvRSxDQUFTM3lGLEVBQVE0cEMsTUFxQmhELFNBQVNncEQsR0FBTzV5RixFQUFRbXRFLEdBQ3RCLEdBQWMsTUFBVm50RSxFQUNGLE1BQU8sR0FFVCxJQUFJbS9ELEVBQVFzTyxHQUFTNkwsR0FBYXQ1RSxJQUFTLFNBQVNvN0IsR0FDbEQsTUFBTyxDQUFDQSxNQUdWLE9BREEreEMsRUFBWXlULEdBQVl6VCxHQUNqQm1VLEdBQVd0aEYsRUFBUW0vRCxHQUFPLFNBQVM1L0QsRUFBT3NULEdBQy9DLE9BQU9zNkQsRUFBVTV0RSxFQUFPc1QsRUFBSyxPQTRJakMsSUFBSWdnRixHQUFVekksR0FBY25qRixJQTBCeEI2ckYsR0FBWTFJLEdBQWMzUixJQTRLOUIsU0FBU3hrRSxHQUFPalUsR0FDZCxPQUFpQixNQUFWQSxFQUFpQixHQUFLa3ZFLEdBQVdsdkUsRUFBUWlILEdBQUtqSCxJQWtOdkQsSUFBSSt5RixHQUFZdE0sSUFBaUIsU0FBUzNsRSxFQUFRa3lFLEVBQU1wc0YsR0FFdEQsT0FEQW9zRixFQUFPQSxFQUFLejNFLGNBQ0x1RixHQUFVbGEsRUFBUXFzRixHQUFXRCxHQUFRQSxNQWtCOUMsU0FBU0MsR0FBVzdyRCxHQUNsQixPQUFPOHJELEdBQVdwNUUsR0FBU3N0QixHQUFRN3JCLGVBcUJyQyxTQUFTb3JFLEdBQU92L0MsR0FFZCxPQURBQSxFQUFTdHRCLEdBQVNzdEIsS0FDREEsRUFBTzV1QixRQUFRd3dELEdBQVMyRyxJQUFjbjNELFFBQVFreUQsR0FBYSxJQXNIOUUsSUFBSXlvQixHQUFZMU0sSUFBaUIsU0FBUzNsRSxFQUFRa3lFLEVBQU1wc0YsR0FDdEQsT0FBT2thLEdBQVVsYSxFQUFRLElBQU0sSUFBTW9zRixFQUFLejNFLGlCQXVCeEM2M0UsR0FBWTNNLElBQWlCLFNBQVMzbEUsRUFBUWt5RSxFQUFNcHNGLEdBQ3RELE9BQU9rYSxHQUFVbGEsRUFBUSxJQUFNLElBQU1vc0YsRUFBS3ozRSxpQkFvQnhDODNFLEdBQWEvTSxHQUFnQixlQTBOakMsSUFBSWdOLEdBQVk3TSxJQUFpQixTQUFTM2xFLEVBQVFreUUsRUFBTXBzRixHQUN0RCxPQUFPa2EsR0FBVWxhLEVBQVEsSUFBTSxJQUFNb3NGLEVBQUt6M0UsaUJBZ0U1QyxJQUFJZzRFLEdBQVk5TSxJQUFpQixTQUFTM2xFLEVBQVFreUUsRUFBTXBzRixHQUN0RCxPQUFPa2EsR0FBVWxhLEVBQVEsSUFBTSxJQUFNc3NGLEdBQVdGLE1Bc2lCbEQsSUFBSVEsR0FBWS9NLElBQWlCLFNBQVMzbEUsRUFBUWt5RSxFQUFNcHNGLEdBQ3RELE9BQU9rYSxHQUFVbGEsRUFBUSxJQUFNLElBQU1vc0YsRUFBS3IyRSxpQkFvQnhDdTJFLEdBQWE1TSxHQUFnQixlQXFCakMsU0FBU0ksR0FBTXQvQyxFQUFRcFosRUFBU200RCxHQUk5QixPQUhBLytDLEVBQVN0dEIsR0FBU3N0QixRQS82ZGxCMWtDLEtBZzdkQXNyQixFQUFVbTRELE9BaDdkVnpqRixFQWc3ZDhCc3JCLEdBbnlibEMsU0FBd0JvWixHQUN0QixPQUFPMGpDLEdBQWlCdGlFLEtBQUs0K0IsR0FxeWJsQnFzRCxDQUFlcnNELEdBMWpiNUIsU0FBc0JBLEdBQ3BCLE9BQU9BLEVBQU9wMEIsTUFBTTQzRCxLQUFrQixHQXlqYkY4b0IsQ0FBYXRzRCxHQXpyY25ELFNBQW9CQSxHQUNsQixPQUFPQSxFQUFPcDBCLE1BQU1zMUQsSUFBZ0IsR0F3cmN1QnFyQixDQUFXdnNELEdBRTdEQSxFQUFPcDBCLE1BQU1nYixJQUFZLEdBMkJsQyxJQUFJNGxFLEdBQVUvUixJQUFTLFNBQVN2bEQsRUFBTXo3QixHQUNwQyxJQUNFLE9BQU9ILEdBQU00N0IsT0FsOWRmNTVCLEVBazlkZ0M3QixHQUM5QixNQUFPbVksR0FDUCxPQUFPbzRFLEdBQVFwNEUsR0FBS0EsRUFBSSxJQUFJaFYsRUFBTWdWLE9BOEJsQzY2RSxHQUFVNU0sSUFBUyxTQUFTam5GLEVBQVE4ekYsR0FLdEMsT0FKQTltQixHQUFVOG1CLEdBQWEsU0FBU2owRixHQUM5QkEsRUFBTTA3RSxHQUFNMTdFLEdBQ1pvM0UsR0FBZ0JqM0UsRUFBUUgsRUFBS0MsR0FBS0UsRUFBT0gsR0FBTUcsT0FFMUNBLEtBcUdULFNBQVNxaUYsR0FBUzlpRixHQUNoQixPQUFPLFdBQ0wsT0FBT0EsR0FrRFgsSUFBSXcwRixHQUFPL00sS0F1QlBnTixHQUFZaE4sSUFBVyxHQWtCM0IsU0FBU2pJLEdBQVN4L0UsR0FDaEIsT0FBT0EsRUE2Q1QsU0FBU3V0RSxHQUFTeHdDLEdBQ2hCLE9BQU93aUQsR0FBNEIsbUJBQVJ4aUQsRUFBcUJBLEVBQU9xN0MsR0FBVXI3QyxFQWp0ZS9DLElBd3plcEIsSUFBSW9ELEdBQVNtaUQsSUFBUyxTQUFTaHZFLEVBQU1oUyxHQUNuQyxPQUFPLFNBQVNiLEdBQ2QsT0FBTzA4RSxHQUFXMThFLEVBQVE2UyxFQUFNaFMsT0EyQmhDb3pGLEdBQVdwUyxJQUFTLFNBQVM3aEYsRUFBUWEsR0FDdkMsT0FBTyxTQUFTZ1MsR0FDZCxPQUFPNnBFLEdBQVcxOEUsRUFBUTZTLEVBQU1oUyxPQXdDcEMsU0FBU3F6RixHQUFNbDBGLEVBQVFra0MsRUFBUTdrQixHQUM3QixJQUFJOC9DLEVBQVFsNEQsR0FBS2k5QixHQUNiNHZELEVBQWMzWSxHQUFjajNDLEVBQVFpN0IsR0FFekIsTUFBWDkvQyxHQUNFcTFELEdBQVN4d0MsS0FBWTR2RCxFQUFZandGLFNBQVdzN0QsRUFBTXQ3RCxVQUN0RHdiLEVBQVU2a0IsRUFDVkEsRUFBU2xrQyxFQUNUQSxFQUFTd0IsS0FDVHN5RixFQUFjM1ksR0FBY2ozQyxFQUFRajlCLEdBQUtpOUIsS0FFM0MsSUFBSWtxRCxJQUFVMVosR0FBU3IxRCxJQUFZLFVBQVdBLElBQWNBLEVBQVErdUUsT0FDaEVoVyxFQUFTZ0QsR0FBV3A3RSxHQXFCeEIsT0FuQkFndEUsR0FBVThtQixHQUFhLFNBQVN2TixHQUM5QixJQUFJanFELEVBQU80SCxFQUFPcWlELEdBQ2xCdm1GLEVBQU91bUYsR0FBY2pxRCxFQUNqQjg3QyxJQUNGcDRFLEVBQU9FLFVBQVVxbUYsR0FBYyxXQUM3QixJQUFJM1IsRUFBV3B6RSxLQUFLdXpFLFVBQ3BCLEdBQUlxWixHQUFTeFosRUFBVSxDQUNyQixJQUFJOXpELEVBQVM5Z0IsRUFBT3dCLEtBQUtxekUsYUFDckJvUCxFQUFVbmpFLEVBQU9nMEQsWUFBYzhCLEdBQVVwMUUsS0FBS3N6RSxhQUlsRCxPQUZBbVAsRUFBUXJnRixLQUFLLENBQUUsS0FBUTA0QixFQUFNLEtBQVFuNkIsVUFBVyxRQUFXbkMsSUFDM0Q4Z0IsRUFBT2kwRCxVQUFZSCxFQUNaOXpELEVBRVQsT0FBT3diLEVBQUs1N0IsTUFBTVYsRUFBUTB0RSxHQUFVLENBQUNsc0UsS0FBS2pDLFNBQVU0QyxpQkFLbkRuQyxFQW1DVCxTQUFTNmtFLE1BaURULElBQUlzdkIsR0FBT25MLEdBQVd2YixJQThCbEIybUIsR0FBWXBMLEdBQVc5YixJQWlDdkJtbkIsR0FBV3JMLEdBQVdsYixJQXdCMUIsU0FBUzd0RSxHQUFTNFMsR0FDaEIsT0FBTytzRSxHQUFNL3NFLEdBQVFtN0QsR0FBYXVOLEdBQU0xb0UsSUFoM1gxQyxTQUEwQkEsR0FDeEIsT0FBTyxTQUFTN1MsR0FDZCxPQUFPcTdFLEdBQVFyN0UsRUFBUTZTLElBODJYd0J5aEYsQ0FBaUJ6aEYsR0F1RXBFLElBQUl5NEMsR0FBUSs5QixLQXNDUmtMLEdBQWFsTCxJQUFZLEdBb0I3QixTQUFTaUMsS0FDUCxNQUFPLEdBZ0JULFNBQVNNLEtBQ1AsT0FBTyxFQStKVCxJQUFJbGhGLEdBQU1vK0UsSUFBb0IsU0FBUzBMLEVBQVFDLEdBQzdDLE9BQU9ELEVBQVNDLElBQ2YsR0F1QkNodEQsR0FBT3VpRCxHQUFZLFFBaUJuQjBLLEdBQVM1TCxJQUFvQixTQUFTNkwsRUFBVUMsR0FDbEQsT0FBT0QsRUFBV0MsSUFDakIsR0F1QkN2MUIsR0FBUTJxQixHQUFZLFNBd0t4QixJQWdhTTlsRCxHQWhhRjJ3RCxHQUFXL0wsSUFBb0IsU0FBU2dNLEVBQVlDLEdBQ3RELE9BQU9ELEVBQWFDLElBQ25CLEdBdUJDbDJFLEdBQVFtckUsR0FBWSxTQWlCcEJnTCxHQUFXbE0sSUFBb0IsU0FBU21NLEVBQVNDLEdBQ25ELE9BQU9ELEVBQVVDLElBQ2hCLEdBZ21CSCxPQTFpQkE5Z0IsR0FBTytnQixNQXA2TVAsU0FBZXAxRixFQUFHdThCLEdBQ2hCLEdBQW1CLG1CQUFSQSxFQUNULE1BQU0sSUFBSXQ1QixHQUFVc2lFLEdBR3RCLE9BREF2bEUsRUFBSW1xRixHQUFVbnFGLEdBQ1AsV0FDTCxLQUFNQSxFQUFJLEVBQ1IsT0FBT3U4QixFQUFLNTdCLE1BQU1jLEtBQU1XLGFBODVNOUJpeUUsR0FBTzJULElBQU1BLEdBQ2IzVCxHQUFPeHpDLE9BQVNBLEdBQ2hCd3pDLEdBQU8yZCxTQUFXQSxHQUNsQjNkLEdBQU80ZCxhQUFlQSxHQUN0QjVkLEdBQU82ZCxXQUFhQSxHQUNwQjdkLEdBQU94L0MsR0FBS0EsR0FDWncvQyxHQUFPMmEsT0FBU0EsR0FDaEIzYSxHQUFPdDBFLEtBQU9BLEdBQ2RzMEUsR0FBT3lmLFFBQVVBLEdBQ2pCemYsR0FBTzRhLFFBQVVBLEdBQ2pCNWEsR0FBT2doQixVQWw4S1AsV0FDRSxJQUFLanpGLFVBQVUwQixPQUNiLE1BQU8sR0FFVCxJQUFJdEUsRUFBUTRDLFVBQVUsR0FDdEIsT0FBT3lwQixHQUFRcnNCLEdBQVNBLEVBQVEsQ0FBQ0EsSUE4N0tuQzYwRSxHQUFPZ2EsTUFBUUEsR0FDZmhhLEdBQU9paEIsTUFwZ1RQLFNBQWV6c0YsRUFBT3VMLEVBQU1neUUsR0FFeEJoeUUsR0FER2d5RSxFQUFRQyxHQUFleDlFLEVBQU91TCxFQUFNZ3lFLFFBNXVOekN6akYsSUE0dU5rRHlSLEdBQ3pDLEVBRUE0K0QsR0FBVW1YLEdBQVUvMUUsR0FBTyxHQUVwQyxJQUFJdFEsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxJQUFLQSxHQUFVc1EsRUFBTyxFQUNwQixNQUFPLEdBTVQsSUFKQSxJQUFJdk4sRUFBUSxFQUNSeW1FLEVBQVcsRUFDWHZzRCxFQUFTOWIsRUFBTXV0RSxHQUFXMXVFLEVBQVNzUSxJQUVoQ3ZOLEVBQVEvQyxHQUNiaWQsRUFBT3VzRCxLQUFja1YsR0FBVTM1RSxFQUFPaEMsRUFBUUEsR0FBU3VOLEdBRXpELE9BQU8yTSxHQW8vU1RzekQsR0FBT2ppQyxRQWwrU1AsU0FBaUJ2cEMsR0FNZixJQUxBLElBQUloQyxHQUFTLEVBQ1QvQyxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ25Dd3BFLEVBQVcsRUFDWHZzRCxFQUFTLEtBRUpsYSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBUXFKLEVBQU1oQyxHQUNkckgsSUFDRnVoQixFQUFPdXNELEtBQWM5dEUsR0FHekIsT0FBT3VoQixHQXU5U1RzekQsR0FBT2x6RSxPQTk3U1AsV0FDRSxJQUFJMkMsRUFBUzFCLFVBQVUwQixPQUN2QixJQUFLQSxFQUNILE1BQU8sR0FNVCxJQUpBLElBQUloRCxFQUFPbUUsRUFBTW5CLEVBQVMsR0FDdEIrRSxFQUFRekcsVUFBVSxHQUNsQnlFLEVBQVEvQyxFQUVMK0MsS0FDTC9GLEVBQUsrRixFQUFRLEdBQUt6RSxVQUFVeUUsR0FFOUIsT0FBTzhtRSxHQUFVOWhELEdBQVFoakIsR0FBU2d1RSxHQUFVaHVFLEdBQVMsQ0FBQ0EsR0FBUWl5RSxHQUFZaDZFLEVBQU0sS0FtN1NsRnV6RSxHQUFPa2hCLEtBM3RDUCxTQUFjbmIsR0FDWixJQUFJdDJFLEVBQWtCLE1BQVRzMkUsRUFBZ0IsRUFBSUEsRUFBTXQyRSxPQUNuQytrRixFQUFhaEksS0FTakIsT0FQQXpHLEVBQVN0MkUsRUFBYzRwRSxHQUFTME0sR0FBTyxTQUFTZ1EsR0FDOUMsR0FBc0IsbUJBQVhBLEVBQUssR0FDZCxNQUFNLElBQUlubkYsR0FBVXNpRSxHQUV0QixNQUFPLENBQUNzakIsRUFBV3VCLEVBQUssSUFBS0EsRUFBSyxPQUpsQixHQU9YdEksSUFBUyxTQUFTaGhGLEdBRXZCLElBREEsSUFBSStGLEdBQVMsSUFDSkEsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSXNtRixFQUFPaFEsRUFBTXZ6RSxHQUNqQixHQUFJbEcsR0FBTXlwRixFQUFLLEdBQUkzb0YsS0FBTVgsR0FDdkIsT0FBT0gsR0FBTXlwRixFQUFLLEdBQUkzb0YsS0FBTVgsUUE0c0NwQ3V6RSxHQUFPbWhCLFNBOXFDUCxTQUFrQnJ4RCxHQUNoQixPQXo1WUYsU0FBc0JBLEdBQ3BCLElBQUlpN0IsRUFBUWw0RCxHQUFLaTlCLEdBQ2pCLE9BQU8sU0FBU2xrQyxHQUNkLE9BQU91NUUsR0FBZXY1RSxFQUFRa2tDLEVBQVFpN0IsSUFzNVlqQ3EyQixDQUFhN2QsR0FBVXp6QyxFQS9pZVosS0E2dGdCcEJrd0MsR0FBT2lPLFNBQVdBLEdBQ2xCak8sR0FBT21hLFFBQVVBLEdBQ2pCbmEsR0FBT3gwRSxPQXR1SFAsU0FBZ0JNLEVBQVdpbEMsR0FDekIsSUFBSXJrQixFQUFTMnpELEdBQVd2MEUsR0FDeEIsT0FBcUIsTUFBZGlsQyxFQUFxQnJrQixFQUFTeTJELEdBQVd6MkQsRUFBUXFrQixJQXF1SDFEaXZDLEdBQU9xaEIsTUF6dU1QLFNBQVNBLEVBQU1uNUQsRUFBTTByRCxFQUFPN0IsR0FFMUIsSUFBSXJsRSxFQUFTd3BFLEdBQVdodUQsRUE3K1ROLE9BbkNsQjU1Qiw4QkErZ1VBc2xGLEVBQVE3QixPQS9nVVJ6akYsRUErZ1U0QnNsRixHQUc1QixPQURBbG5FLEVBQU80dUQsWUFBYytsQixFQUFNL2xCLFlBQ3BCNXVELEdBc3VNVHN6RCxHQUFPc2hCLFdBN3JNUCxTQUFTQSxFQUFXcDVELEVBQU0wckQsRUFBTzdCLEdBRS9CLElBQUlybEUsRUFBU3dwRSxHQUFXaHVELEVBemhVQSxRQXBDeEI1NUIsOEJBNGpVQXNsRixFQUFRN0IsT0E1alVSempGLEVBNGpVNEJzbEYsR0FHNUIsT0FEQWxuRSxFQUFPNHVELFlBQWNnbUIsRUFBV2htQixZQUN6QjV1RCxHQTByTVRzekQsR0FBTzhhLFNBQVdBLEdBQ2xCOWEsR0FBTzM5QixTQUFXQSxHQUNsQjI5QixHQUFPZ2UsYUFBZUEsR0FDdEJoZSxHQUFPbWMsTUFBUUEsR0FDZm5jLEdBQU9vYyxNQUFRQSxHQUNmcGMsR0FBT3lZLFdBQWFBLEdBQ3BCelksR0FBTzBZLGFBQWVBLEdBQ3RCMVksR0FBTzJZLGVBQWlCQSxHQUN4QjNZLEdBQU9seEQsS0F0MFNQLFNBQWN0YSxFQUFPN0ksRUFBR29tRixHQUN0QixJQUFJdGlGLEVBQWtCLE1BQVQrRSxFQUFnQixFQUFJQSxFQUFNL0UsT0FDdkMsT0FBS0EsRUFJRTArRSxHQUFVMzVFLEdBRGpCN0ksRUFBS29tRixRQWg4Tkx6akYsSUFnOE5jM0MsRUFBbUIsRUFBSW1xRixHQUFVbnFGLElBQ25CLEVBQUksRUFBSUEsRUFBRzhELEdBSDlCLElBbzBTWHV3RSxHQUFPdWhCLFVBcnlTUCxTQUFtQi9zRixFQUFPN0ksRUFBR29tRixHQUMzQixJQUFJdGlGLEVBQWtCLE1BQVQrRSxFQUFnQixFQUFJQSxFQUFNL0UsT0FDdkMsT0FBS0EsRUFLRTArRSxHQUFVMzVFLEVBQU8sR0FEeEI3SSxFQUFJOEQsR0FESjlELEVBQUtvbUYsUUFsK05MempGLElBaytOYzNDLEVBQW1CLEVBQUltcUYsR0FBVW5xRixLQUVoQixFQUFJLEVBQUlBLEdBSjlCLElBbXlTWHEwRSxHQUFPd2hCLGVBenZTUCxTQUF3Qmh0RixFQUFPdWtFLEdBQzdCLE9BQVF2a0UsR0FBU0EsRUFBTS9FLE9BQ25CaWdGLEdBQVVsN0UsRUFBT2c0RSxHQUFZelQsRUFBVyxJQUFJLEdBQU0sR0FDbEQsSUF1dlNOaUgsR0FBT3loQixVQWp0U1AsU0FBbUJqdEYsRUFBT3VrRSxHQUN4QixPQUFRdmtFLEdBQVNBLEVBQU0vRSxPQUNuQmlnRixHQUFVbDdFLEVBQU9nNEUsR0FBWXpULEVBQVcsSUFBSSxHQUM1QyxJQStzU05pSCxHQUFPem1FLEtBL3FTUCxTQUFjL0UsRUFBT3JKLEVBQU95bkMsRUFBT3RlLEdBQ2pDLElBQUk3a0IsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxPQUFLQSxHQUdEbWpDLEdBQXlCLGlCQUFUQSxHQUFxQm8vQyxHQUFleDlFLEVBQU9ySixFQUFPeW5DLEtBQ3BFQSxFQUFRLEVBQ1J0ZSxFQUFNN2tCLEdBenZJVixTQUFrQitFLEVBQU9ySixFQUFPeW5DLEVBQU90ZSxHQUNyQyxJQUFJN2tCLEVBQVMrRSxFQUFNL0UsT0FXbkIsS0FUQW1qQyxFQUFRa2pELEdBQVVsakQsSUFDTixJQUNWQSxHQUFTQSxFQUFRbmpDLEVBQVMsRUFBS0EsRUFBU21qQyxJQUUxQ3RlLE9BMzJGQWhtQixJQTIyRk9nbUIsR0FBcUJBLEVBQU03a0IsRUFBVUEsRUFBU3FtRixHQUFVeGhFLElBQ3JELElBQ1JBLEdBQU83a0IsR0FFVDZrQixFQUFNc2UsRUFBUXRlLEVBQU0sRUFBSW1wRSxHQUFTbnBFLEdBQzFCc2UsRUFBUXRlLEdBQ2I5ZixFQUFNbytCLEtBQVd6bkMsRUFFbkIsT0FBT3FKLEVBNHVJQWt0RixDQUFTbHRGLEVBQU9ySixFQUFPeW5DLEVBQU90ZSxJQU41QixJQTZxU1gwckQsR0FBT2ppRSxPQTN2T1AsU0FBZ0IrN0QsRUFBWWYsR0FFMUIsT0FEV3ZoRCxHQUFRc2lELEdBQWNkLEdBQWN3TixJQUNuQzFNLEVBQVkwUyxHQUFZelQsRUFBVyxLQTB2T2pEaUgsR0FBTzJoQixRQXZxT1AsU0FBaUI3bkIsRUFBWXBCLEdBQzNCLE9BQU8rTixHQUFZNW5FLEdBQUlpN0QsRUFBWXBCLEdBQVcsSUF1cU9oRHNILEdBQU80aEIsWUFocE9QLFNBQXFCOW5CLEVBQVlwQixHQUMvQixPQUFPK04sR0FBWTVuRSxHQUFJaTdELEVBQVlwQixHQWhrU3hCLE1BZ3RnQmJzSCxHQUFPNmhCLGFBeG5PUCxTQUFzQi9uQixFQUFZcEIsRUFBVWpoQyxHQUUxQyxPQURBQSxPQWxwU0FucEMsSUFrcFNRbXBDLEVBQXNCLEVBQUlxK0MsR0FBVXIrQyxHQUNyQ2d2QyxHQUFZNW5FLEdBQUlpN0QsRUFBWXBCLEdBQVdqaEMsSUF1bk9oRHVvQyxHQUFPbnhDLFFBQVVBLEdBQ2pCbXhDLEdBQU84aEIsWUF2aVNQLFNBQXFCdHRGLEdBRW5CLE9BRHNCLE1BQVRBLEVBQWdCLEVBQUlBLEVBQU0vRSxRQUN2QmczRSxHQUFZanlFLEVBN3FPakIsS0E2cU9vQyxJQXNpU2pEd3JFLEdBQU8raEIsYUEvZ1NQLFNBQXNCdnRGLEVBQU9pakMsR0FFM0IsT0FEc0IsTUFBVGpqQyxFQUFnQixFQUFJQSxFQUFNL0UsUUFLaENnM0UsR0FBWWp5RSxFQURuQmlqQyxPQWx3T0FucEMsSUFrd09RbXBDLEVBQXNCLEVBQUlxK0MsR0FBVXIrQyxJQUZuQyxJQTZnU1h1b0MsR0FBT2dpQixLQXo5TFAsU0FBYzk1RCxHQUNaLE9BQU9ndUQsR0FBV2h1RCxFQTV3VUQsTUFxdWdCbkI4M0MsR0FBTzJmLEtBQU9BLEdBQ2QzZixHQUFPNGYsVUFBWUEsR0FDbkI1ZixHQUFPaWlCLFVBMy9SUCxTQUFtQmxjLEdBS2pCLElBSkEsSUFBSXZ6RSxHQUFTLEVBQ1QvQyxFQUFrQixNQUFUczJFLEVBQWdCLEVBQUlBLEVBQU10MkUsT0FDbkNpZCxFQUFTLEtBRUpsYSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJc21GLEVBQU9oUSxFQUFNdnpFLEdBQ2pCa2EsRUFBT3FwRSxFQUFLLElBQU1BLEVBQUssR0FFekIsT0FBT3JwRSxHQW0vUlRzekQsR0FBT2tpQixVQTM4R1AsU0FBbUJ0MkYsR0FDakIsT0FBaUIsTUFBVkEsRUFBaUIsR0FBS203RSxHQUFjbjdFLEVBQVFpSCxHQUFLakgsS0EyOEcxRG8wRSxHQUFPbWlCLFlBajdHUCxTQUFxQnYyRixHQUNuQixPQUFpQixNQUFWQSxFQUFpQixHQUFLbTdFLEdBQWNuN0UsRUFBUXk0RSxHQUFPejRFLEtBaTdHNURvMEUsR0FBT3NhLFFBQVVBLEdBQ2pCdGEsR0FBT29pQixRQTU2UlAsU0FBaUI1dEYsR0FFZixPQURzQixNQUFUQSxFQUFnQixFQUFJQSxFQUFNL0UsUUFDdkIwK0UsR0FBVTM1RSxFQUFPLEdBQUksR0FBSyxJQTI2UjVDd3JFLEdBQU8rWSxhQUFlQSxHQUN0Qi9ZLEdBQU9pWixlQUFpQkEsR0FDeEJqWixHQUFPa1osaUJBQW1CQSxHQUMxQmxaLEdBQU9rZSxPQUFTQSxHQUNoQmxlLEdBQU9tZSxTQUFXQSxHQUNsQm5lLEdBQU91YSxVQUFZQSxHQUNuQnZhLEdBQU90SCxTQUFXQSxHQUNsQnNILEdBQU93YSxNQUFRQSxHQUNmeGEsR0FBT250RSxLQUFPQSxHQUNkbXRFLEdBQU9xRSxPQUFTQSxHQUNoQnJFLEdBQU9uaEUsSUFBTUEsR0FDYm1oRSxHQUFPcWlCLFFBMXJHUCxTQUFpQnoyRixFQUFROHNFLEdBQ3ZCLElBQUloc0QsRUFBUyxHQU1iLE9BTEFnc0QsRUFBVzhULEdBQVk5VCxFQUFVLEdBRWpDd04sR0FBV3Q2RSxHQUFRLFNBQVNULEVBQU9NLEVBQUtHLEdBQ3RDaTNFLEdBQWdCbjJELEVBQVFnc0QsRUFBU3Z0RSxFQUFPTSxFQUFLRyxHQUFTVCxNQUVqRHVoQixHQW9yR1RzekQsR0FBT3NpQixVQXJwR1AsU0FBbUIxMkYsRUFBUThzRSxHQUN6QixJQUFJaHNELEVBQVMsR0FNYixPQUxBZ3NELEVBQVc4VCxHQUFZOVQsRUFBVSxHQUVqQ3dOLEdBQVd0NkUsR0FBUSxTQUFTVCxFQUFPTSxFQUFLRyxHQUN0Q2kzRSxHQUFnQm4yRCxFQUFRamhCLEVBQUtpdEUsRUFBU3Z0RSxFQUFPTSxFQUFLRyxPQUU3QzhnQixHQStvR1RzekQsR0FBT3VpQixRQXBoQ1AsU0FBaUJ6eUQsR0FDZixPQUFPKzZDLEdBQVl0SCxHQUFVenpDLEVBeHZlWCxLQTR3Z0JwQmt3QyxHQUFPd2lCLGdCQWgvQlAsU0FBeUIvakYsRUFBTThyRSxHQUM3QixPQUFPSyxHQUFvQm5zRSxFQUFNOGtFLEdBQVVnSCxFQTd4ZXpCLEtBNndnQnBCdkssR0FBT3FZLFFBQVVBLEdBQ2pCclksR0FBT3hvQyxNQUFRQSxHQUNmd29DLEdBQU9pZSxVQUFZQSxHQUNuQmplLEdBQU8xMEMsT0FBU0EsR0FDaEIwMEMsR0FBTzZmLFNBQVdBLEdBQ2xCN2YsR0FBTzhmLE1BQVFBLEdBQ2Y5ZixHQUFPdWMsT0FBU0EsR0FDaEJ2YyxHQUFPeWlCLE9BenpCUCxTQUFnQjkyRixHQUVkLE9BREFBLEVBQUltcUYsR0FBVW5xRixHQUNQOGhGLElBQVMsU0FBU2hoRixHQUN2QixPQUFPMi9FLEdBQVEzL0UsRUFBTWQsT0F1ekJ6QnEwRSxHQUFPcWUsS0FBT0EsR0FDZHJlLEdBQU8waUIsT0FuaEdQLFNBQWdCOTJGLEVBQVFtdEUsR0FDdEIsT0FBT3lsQixHQUFPNXlGLEVBQVEyd0YsR0FBTy9QLEdBQVl6VCxNQW1oRzNDaUgsR0FBTzN5RSxLQTczTFAsU0FBYzY2QixHQUNaLE9BQU95eUQsR0FBTyxFQUFHenlELElBNjNMbkI4M0MsR0FBTzJpQixRQXI0TlAsU0FBaUI3b0IsRUFBWXdTLEVBQVdDLEVBQVF3RixHQUM5QyxPQUFrQixNQUFkalksRUFDSyxJQUVKdGlELEdBQVE4MEQsS0FDWEEsRUFBeUIsTUFBYkEsRUFBb0IsR0FBSyxDQUFDQSxJQUduQzkwRCxHQURMKzBELEVBQVN3RixPQWo3U1R6akYsRUFpN1M2QmkrRSxLQUUzQkEsRUFBbUIsTUFBVkEsRUFBaUIsR0FBSyxDQUFDQSxJQUUzQkYsR0FBWXZTLEVBQVl3UyxFQUFXQyxLQTIzTjVDdk0sR0FBTytmLEtBQU9BLEdBQ2QvZixHQUFPd2MsU0FBV0EsR0FDbEJ4YyxHQUFPZ2dCLFVBQVlBLEdBQ25CaGdCLEdBQU9pZ0IsU0FBV0EsR0FDbEJqZ0IsR0FBTzJjLFFBQVVBLEdBQ2pCM2MsR0FBTzRjLGFBQWVBLEdBQ3RCNWMsR0FBT3lhLFVBQVlBLEdBQ25CemEsR0FBTzMyQyxLQUFPQSxHQUNkMjJDLEdBQU93ZSxPQUFTQSxHQUNoQnhlLEdBQU9uMEUsU0FBV0EsR0FDbEJtMEUsR0FBTzRpQixXQS9yQlAsU0FBb0JoM0YsR0FDbEIsT0FBTyxTQUFTNlMsR0FDZCxPQUFpQixNQUFWN1MsT0E3bmZUMEMsRUE2bmZzQzI0RSxHQUFRcjdFLEVBQVE2UyxLQThyQnhEdWhFLEdBQU8vUSxLQUFPQSxHQUNkK1EsR0FBT21aLFFBQVVBLEdBQ2pCblosR0FBTzZpQixVQXBzUlAsU0FBbUJydUYsRUFBT3FMLEVBQVE2NEQsR0FDaEMsT0FBUWxrRSxHQUFTQSxFQUFNL0UsUUFBVW9RLEdBQVVBLEVBQU9wUSxPQUM5QzI5RSxHQUFZNTRFLEVBQU9xTCxFQUFRMnNFLEdBQVk5VCxFQUFVLElBQ2pEbGtFLEdBa3NSTndyRSxHQUFPOGlCLFlBeHFSUCxTQUFxQnR1RixFQUFPcUwsRUFBUSsxQixHQUNsQyxPQUFRcGhDLEdBQVNBLEVBQU0vRSxRQUFVb1EsR0FBVUEsRUFBT3BRLE9BQzlDMjlFLEdBQVk1NEUsRUFBT3FMLE9BeHBQdkJ2UixFQXdwUDBDc25DLEdBQ3RDcGhDLEdBc3FSTndyRSxHQUFPb1osT0FBU0EsR0FDaEJwWixHQUFPOW9CLE1BQVFBLEdBQ2Y4b0IsR0FBT21nQixXQUFhQSxHQUNwQm5nQixHQUFPNmMsTUFBUUEsR0FDZjdjLEdBQU92eUUsT0F4dk5QLFNBQWdCcXNFLEVBQVlmLEdBRTFCLE9BRFd2aEQsR0FBUXNpRCxHQUFjZCxHQUFjd04sSUFDbkMxTSxFQUFZeWlCLEdBQU8vUCxHQUFZelQsRUFBVyxNQXV2TnhEaUgsR0FBT25xRSxPQXptUlAsU0FBZ0JyQixFQUFPdWtFLEdBQ3JCLElBQUlyc0QsRUFBUyxHQUNiLElBQU1sWSxJQUFTQSxFQUFNL0UsT0FDbkIsT0FBT2lkLEVBRVQsSUFBSWxhLEdBQVMsRUFDVDg2RSxFQUFVLEdBQ1Y3OUUsRUFBUytFLEVBQU0vRSxPQUduQixJQURBc3BFLEVBQVl5VCxHQUFZelQsRUFBVyxLQUMxQnZtRSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBUXFKLEVBQU1oQyxHQUNkdW1FLEVBQVU1dEUsRUFBT3FILEVBQU9nQyxLQUMxQmtZLEVBQU9sZCxLQUFLckUsR0FDWm1pRixFQUFROTlFLEtBQUtnRCxJQUlqQixPQURBNjZFLEdBQVc3NEUsRUFBTzg0RSxHQUNYNWdFLEdBd2xSVHN6RCxHQUFPaFYsS0FsdUxQLFNBQWM5aUMsRUFBTTBLLEdBQ2xCLEdBQW1CLG1CQUFSMUssRUFDVCxNQUFNLElBQUl0NUIsR0FBVXNpRSxHQUd0QixPQUFPdWMsR0FBU3ZsRCxFQURoQjBLLE9Bdm1WQXRrQyxJQXVtVlFza0MsRUFBc0JBLEVBQVFrakQsR0FBVWxqRCxLQSt0TGxEb3RDLEdBQU85cUMsUUFBVUEsR0FDakI4cUMsR0FBTytpQixXQWh0TlAsU0FBb0JqcEIsRUFBWW51RSxFQUFHb21GLEdBT2pDLE9BTEVwbUYsR0FER29tRixFQUFRQyxHQUFlbFksRUFBWW51RSxFQUFHb21GLFFBeG5UM0N6akYsSUF3blRvRDNDLEdBQzlDLEVBRUFtcUYsR0FBVW5xRixJQUVMNnJCLEdBQVFzaUQsR0FBY3dJLEdBQWtCdUwsSUFDdkMvVCxFQUFZbnVFLElBMHNOMUJxMEUsR0FBTzN1RSxJQXY2RlAsU0FBYXpGLEVBQVE2UyxFQUFNdFQsR0FDekIsT0FBaUIsTUFBVlMsRUFBaUJBLEVBQVN1aEYsR0FBUXZoRixFQUFRNlMsRUFBTXRULElBdTZGekQ2MEUsR0FBT2dqQixRQTU0RlAsU0FBaUJwM0YsRUFBUTZTLEVBQU10VCxFQUFPczRFLEdBRXBDLE9BREFBLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0E5N2EvQ24xRSxFQSs3YWlCLE1BQVYxQyxFQUFpQkEsRUFBU3VoRixHQUFRdmhGLEVBQVE2UyxFQUFNdFQsRUFBT3M0RSxJQTI0RmhFekQsR0FBT2lqQixRQTFyTlAsU0FBaUJucEIsR0FFZixPQURXdGlELEdBQVFzaUQsR0FBYzRJLEdBQWV3TCxJQUNwQ3BVLElBeXJOZGtHLEdBQU9seUUsTUFoalJQLFNBQWUwRyxFQUFPbytCLEVBQU90ZSxHQUMzQixJQUFJN2tCLEVBQWtCLE1BQVQrRSxFQUFnQixFQUFJQSxFQUFNL0UsT0FDdkMsT0FBS0EsR0FHRDZrQixHQUFxQixpQkFBUEEsR0FBbUIwOUQsR0FBZXg5RSxFQUFPbytCLEVBQU90ZSxJQUNoRXNlLEVBQVEsRUFDUnRlLEVBQU03a0IsSUFHTm1qQyxFQUFpQixNQUFUQSxFQUFnQixFQUFJa2pELEdBQVVsakQsR0FDdEN0ZSxPQXR5UEZobUIsSUFzeVBRZ21CLEVBQW9CN2tCLEVBQVNxbUYsR0FBVXhoRSxJQUV4QzY1RCxHQUFVMzVFLEVBQU9vK0IsRUFBT3RlLElBVnRCLElBOGlSWDByRCxHQUFPMGEsT0FBU0EsR0FDaEIxYSxHQUFPa2pCLFdBeDNRUCxTQUFvQjF1RixHQUNsQixPQUFRQSxHQUFTQSxFQUFNL0UsT0FDbkJ5L0UsR0FBZTE2RSxHQUNmLElBczNRTndyRSxHQUFPbWpCLGFBbjJRUCxTQUFzQjN1RixFQUFPa2tFLEdBQzNCLE9BQVFsa0UsR0FBU0EsRUFBTS9FLE9BQ25CeS9FLEdBQWUxNkUsRUFBT2c0RSxHQUFZOVQsRUFBVSxJQUM1QyxJQWkyUU5zSCxHQUFPamxELE1BNWhFUCxTQUFlaVksRUFBUW93RCxFQUFXam9ELEdBS2hDLE9BSklBLEdBQXlCLGlCQUFUQSxHQUFxQjYyQyxHQUFlaC9DLEVBQVFvd0QsRUFBV2pvRCxLQUN6RWlvRCxFQUFZam9ELE9BcnpjZDdzQyxJQXV6Y0E2c0MsT0F2emNBN3NDLElBdXpjUTZzQyxFQXh2Y1csV0F3dmM4QkEsSUFBVSxJQUkzRG5JLEVBQVN0dEIsR0FBU3N0QixNQUVRLGlCQUFib3dELEdBQ08sTUFBYkEsSUFBc0JsckIsR0FBU2tyQixPQUVwQ0EsRUFBWWhVLEdBQWFnVSxLQUNQem5CLEdBQVczb0MsR0FDcEJzOUMsR0FBVWpVLEdBQWNycEMsR0FBUyxFQUFHbUksR0FHeENuSSxFQUFPalksTUFBTXFvRSxFQUFXam9ELEdBWnRCLElBdWhFWDZrQyxHQUFPcWpCLE9BbnNMUCxTQUFnQm43RCxFQUFNMEssR0FDcEIsR0FBbUIsbUJBQVIxSyxFQUNULE1BQU0sSUFBSXQ1QixHQUFVc2lFLEdBR3RCLE9BREF0K0IsRUFBaUIsTUFBVEEsRUFBZ0IsRUFBSStyQyxHQUFVbVgsR0FBVWxqRCxHQUFRLEdBQ2pENjZDLElBQVMsU0FBU2hoRixHQUN2QixJQUFJK0gsRUFBUS9ILEVBQUttbUMsR0FDYjZrRCxFQUFZbkgsR0FBVTdqRixFQUFNLEVBQUdtbUMsR0FLbkMsT0FISXArQixHQUNGOGtFLEdBQVVtZSxFQUFXampGLEdBRWhCbEksR0FBTTQ3QixFQUFNOTZCLEtBQU1xcUYsT0F3ckw3QnpYLEdBQU9udEQsS0FsMVFQLFNBQWNyZSxHQUNaLElBQUkvRSxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLE9BQU9BLEVBQVMwK0UsR0FBVTM1RSxFQUFPLEVBQUcvRSxHQUFVLElBaTFRaER1d0UsR0FBT3NqQixLQXJ6UVAsU0FBYzl1RixFQUFPN0ksRUFBR29tRixHQUN0QixPQUFNdjlFLEdBQVNBLEVBQU0vRSxPQUlkMCtFLEdBQVUzNUUsRUFBTyxHQUR4QjdJLEVBQUtvbUYsUUFqaVFMempGLElBaWlRYzNDLEVBQW1CLEVBQUltcUYsR0FBVW5xRixJQUNoQixFQUFJLEVBQUlBLEdBSDlCLElBb3pRWHEwRSxHQUFPdWpCLFVBcnhRUCxTQUFtQi91RixFQUFPN0ksRUFBR29tRixHQUMzQixJQUFJdGlGLEVBQWtCLE1BQVQrRSxFQUFnQixFQUFJQSxFQUFNL0UsT0FDdkMsT0FBS0EsRUFLRTArRSxHQUFVMzVFLEdBRGpCN0ksRUFBSThELEdBREo5RCxFQUFLb21GLFFBbmtRTHpqRixJQW1rUWMzQyxFQUFtQixFQUFJbXFGLEdBQVVucUYsS0FFbkIsRUFBSSxFQUFJQSxFQUFHOEQsR0FKOUIsSUFteFFYdXdFLEdBQU93akIsZUF6dVFQLFNBQXdCaHZGLEVBQU91a0UsR0FDN0IsT0FBUXZrRSxHQUFTQSxFQUFNL0UsT0FDbkJpZ0YsR0FBVWw3RSxFQUFPZzRFLEdBQVl6VCxFQUFXLElBQUksR0FBTyxHQUNuRCxJQXV1UU5pSCxHQUFPeWpCLFVBanNRUCxTQUFtQmp2RixFQUFPdWtFLEdBQ3hCLE9BQVF2a0UsR0FBU0EsRUFBTS9FLE9BQ25CaWdGLEdBQVVsN0UsRUFBT2c0RSxHQUFZelQsRUFBVyxJQUN4QyxJQStyUU5pSCxHQUFPMGpCLElBcHVQUCxTQUFhdjRGLEVBQU84dUYsR0FFbEIsT0FEQUEsRUFBWTl1RixHQUNMQSxHQW11UFQ2MEUsR0FBTzJqQixTQTlvTFAsU0FBa0J6N0QsRUFBTW05QyxFQUFNcDZELEdBQzVCLElBQUlvd0UsR0FBVSxFQUNWakosR0FBVyxFQUVmLEdBQW1CLG1CQUFSbHFELEVBQ1QsTUFBTSxJQUFJdDVCLEdBQVVzaUUsR0FNdEIsT0FKSW9QLEdBQVNyMUQsS0FDWG93RSxFQUFVLFlBQWFwd0UsSUFBWUEsRUFBUW93RSxRQUFVQSxFQUNyRGpKLEVBQVcsYUFBY25uRSxJQUFZQSxFQUFRbW5FLFNBQVdBLEdBRW5EMEksR0FBUzV5RCxFQUFNbTlDLEVBQU0sQ0FDMUIsUUFBV2dXLEVBQ1gsUUFBV2hXLEVBQ1gsU0FBWStNLEtBaW9MaEJwUyxHQUFPZ1QsS0FBT0EsR0FDZGhULEdBQU9zZCxRQUFVQSxHQUNqQnRkLEdBQU95ZSxRQUFVQSxHQUNqQnplLEdBQU8wZSxVQUFZQSxHQUNuQjFlLEdBQU80akIsT0FyZlAsU0FBZ0J6NEYsR0FDZCxPQUFJcXNCLEdBQVFyc0IsR0FDSGt1RSxHQUFTbHVFLEVBQU9nOEUsSUFFbEJaLEdBQVNwN0UsR0FBUyxDQUFDQSxHQUFTcTNFLEdBQVU0TixHQUFhMXFFLEdBQVN2YSxNQWtmckU2MEUsR0FBT2tNLGNBQWdCQSxHQUN2QmxNLEdBQU9sRSxVQTEwRlAsU0FBbUJsd0UsRUFBUThzRSxFQUFVQyxHQUNuQyxJQUFJa0osRUFBUXJxRCxHQUFRNXJCLEdBQ2hCaTRGLEVBQVloaUIsR0FBU3RELEdBQVMzeUUsSUFBVzBzRSxHQUFhMXNFLEdBRzFELEdBREE4c0UsRUFBVzhULEdBQVk5VCxFQUFVLEdBQ2QsTUFBZkMsRUFBcUIsQ0FDdkIsSUFBSTd3QyxFQUFPbDhCLEdBQVVBLEVBQU91SCxZQUUxQndsRSxFQURFa3JCLEVBQ1loaUIsRUFBUSxJQUFJLzVDLEVBQU8sR0FFMUJ3NEMsR0FBUzEwRSxJQUNGbzdFLEdBQVdsL0MsR0FBUXU0QyxHQUFXOUMsR0FBYTN4RSxJQUczQyxHQU1sQixPQUhDaTRGLEVBQVlqckIsR0FBWXNOLElBQVl0NkUsR0FBUSxTQUFTVCxFQUFPcUgsRUFBTzVHLEdBQ2xFLE9BQU84c0UsRUFBU0MsRUFBYXh0RSxFQUFPcUgsRUFBTzVHLE1BRXRDK3NFLEdBdXpGVHFILEdBQU84akIsTUFybkxQLFNBQWU1N0QsR0FDYixPQUFPeXJELEdBQUl6ckQsRUFBTSxJQXFuTG5CODNDLEdBQU9xWixNQUFRQSxHQUNmclosR0FBT3NaLFFBQVVBLEdBQ2pCdFosR0FBT3VaLFVBQVlBLEdBQ25CdlosR0FBT3pnQixLQXptUVAsU0FBYy9xRCxHQUNaLE9BQVFBLEdBQVNBLEVBQU0vRSxPQUFVNC9FLEdBQVM3NkUsR0FBUyxJQXltUXJEd3JFLEdBQU8rakIsT0Eva1FQLFNBQWdCdnZGLEVBQU9ra0UsR0FDckIsT0FBUWxrRSxHQUFTQSxFQUFNL0UsT0FBVTQvRSxHQUFTNzZFLEVBQU9nNEUsR0FBWTlULEVBQVUsSUFBTSxJQStrUS9Fc0gsR0FBT2drQixTQXhqUVAsU0FBa0J4dkYsRUFBT29oQyxHQUV2QixPQURBQSxFQUFrQyxtQkFBZEEsRUFBMkJBLE9BOXlRL0N0bkMsRUEreVFRa0csR0FBU0EsRUFBTS9FLE9BQVU0L0UsR0FBUzc2RSxPQS95UTFDbEcsRUEreVE0RHNuQyxHQUFjLElBdWpRNUVvcUMsR0FBT2lrQixNQWh5RlAsU0FBZXI0RixFQUFRNlMsR0FDckIsT0FBaUIsTUFBVjdTLEdBQXdCMmhGLEdBQVUzaEYsRUFBUTZTLElBZ3lGbkR1aEUsR0FBT3daLE1BQVFBLEdBQ2Z4WixHQUFPeVosVUFBWUEsR0FDbkJ6WixHQUFPa2tCLE9BcHdGUCxTQUFnQnQ0RixFQUFRNlMsRUFBTWd4RSxHQUM1QixPQUFpQixNQUFWN2pGLEVBQWlCQSxFQUFTNGpGLEdBQVc1akYsRUFBUTZTLEVBQU0weEUsR0FBYVYsS0Fvd0Z6RXpQLEdBQU9ta0IsV0F6dUZQLFNBQW9CdjRGLEVBQVE2UyxFQUFNZ3hFLEVBQVNoTSxHQUV6QyxPQURBQSxFQUFrQyxtQkFBZEEsRUFBMkJBLE9BbG9iL0NuMUUsRUFtb2JpQixNQUFWMUMsRUFBaUJBLEVBQVM0akYsR0FBVzVqRixFQUFRNlMsRUFBTTB4RSxHQUFhVixHQUFVaE0sSUF3dUZuRnpELEdBQU9uZ0UsT0FBU0EsR0FDaEJtZ0UsR0FBT29rQixTQWhyRlAsU0FBa0J4NEYsR0FDaEIsT0FBaUIsTUFBVkEsRUFBaUIsR0FBS2t2RSxHQUFXbHZFLEVBQVF5NEUsR0FBT3o0RSxLQWdyRnpEbzBFLEdBQU8wWixRQUFVQSxHQUNqQjFaLEdBQU9zUyxNQUFRQSxHQUNmdFMsR0FBT3FrQixLQTNtTFAsU0FBY2w1RixFQUFPOG5GLEdBQ25CLE9BQU8wSixHQUFReE0sR0FBYThDLEdBQVU5bkYsSUEybUx4QzYwRSxHQUFPMlosSUFBTUEsR0FDYjNaLEdBQU80WixNQUFRQSxHQUNmNVosR0FBTzZaLFFBQVVBLEdBQ2pCN1osR0FBTzhaLElBQU1BLEdBQ2I5WixHQUFPc2tCLFVBajNQUCxTQUFtQnY1QixFQUFPbHJELEdBQ3hCLE9BQU9rd0UsR0FBY2hsQixHQUFTLEdBQUlsckQsR0FBVSxHQUFJaWpFLEtBaTNQbEQ5QyxHQUFPdWtCLGNBLzFQUCxTQUF1Qng1QixFQUFPbHJELEdBQzVCLE9BQU9rd0UsR0FBY2hsQixHQUFTLEdBQUlsckQsR0FBVSxHQUFJc3RFLEtBKzFQbERuTixHQUFPK1osUUFBVUEsR0FHakIvWixHQUFPejdELFFBQVVrNkUsR0FDakJ6ZSxHQUFPd2tCLFVBQVk5RixHQUNuQjFlLEdBQU95a0IsT0FBUzlHLEdBQ2hCM2QsR0FBTzBrQixXQUFhOUcsR0FHcEJrQyxHQUFNOWYsR0FBUUEsSUFLZEEsR0FBTzFwRSxJQUFNQSxHQUNiMHBFLEdBQU93ZixRQUFVQSxHQUNqQnhmLEdBQU8yZSxVQUFZQSxHQUNuQjNlLEdBQU82ZSxXQUFhQSxHQUNwQjdlLEdBQU8zc0MsS0FBT0EsR0FDZDJzQyxHQUFPbHNELE1BcHJGUCxTQUFlcUgsRUFBUW1vRCxFQUFPenZCLEdBYTVCLFlBbHViQXZsRCxJQXN0Ykl1bEQsSUFDRkEsRUFBUXl2QixFQUNSQSxPQXh0YkZoMUUsWUEwdGJJdWxELElBRUZBLEdBREFBLEVBQVF5aEMsR0FBU3poQyxLQUNDQSxFQUFRQSxFQUFRLFFBNXRicEN2bEQsSUE4dGJJZzFFLElBRUZBLEdBREFBLEVBQVFnUyxHQUFTaFMsS0FDQ0EsRUFBUUEsRUFBUSxHQUU3QmIsR0FBVTZTLEdBQVNuNkQsR0FBU21vRCxFQUFPenZCLElBd3FGNUNtc0IsR0FBTzE0QyxNQTdqTFAsU0FBZW44QixHQUNiLE9BQU9vNEUsR0FBVXA0RSxFQXJ6VkksSUFrM2dCdkI2MEUsR0FBTzJrQixVQXBnTFAsU0FBbUJ4NUYsR0FDakIsT0FBT280RSxHQUFVcDRFLEVBQU9tekYsSUFvZ0wxQnRlLEdBQU80a0IsY0FyK0tQLFNBQXVCejVGLEVBQU9zNEUsR0FFNUIsT0FBT0YsR0FBVXA0RSxFQUFPbXpGLEVBRHhCN2EsRUFBa0MsbUJBQWRBLEVBQTJCQSxPQXg2Vi9DbjFFLElBNjRnQkYweEUsR0FBTzZrQixVQTdoTFAsU0FBbUIxNUYsRUFBT3M0RSxHQUV4QixPQUFPRixHQUFVcDRFLEVBejFWSSxFQXcxVnJCczRFLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0FqM1YvQ24xRSxJQTg0Z0JGMHhFLEdBQU84a0IsV0ExOEtQLFNBQW9CbDVGLEVBQVFra0MsR0FDMUIsT0FBaUIsTUFBVkEsR0FBa0JxMUMsR0FBZXY1RSxFQUFRa2tDLEVBQVFqOUIsR0FBS2k5QixLQTA4Sy9Ea3dDLEdBQU91UyxPQUFTQSxHQUNoQnZTLEdBQU8ra0IsVUExeENQLFNBQW1CNTVGLEVBQU93cEYsR0FDeEIsT0FBaUIsTUFBVHhwRixHQUFpQkEsR0FBVUEsRUFBU3dwRixFQUFleHBGLEdBMHhDN0Q2MEUsR0FBT3NnQixPQUFTQSxHQUNoQnRnQixHQUFPZ2xCLFNBejlFUCxTQUFrQmh5RCxFQUFRem1DLEVBQVE4RixHQUNoQzJnQyxFQUFTdHRCLEdBQVNzdEIsR0FDbEJ6bUMsRUFBUzZpRixHQUFhN2lGLEdBRXRCLElBQUlrRCxFQUFTdWpDLEVBQU92akMsT0FLaEI2a0IsRUFKSmppQixPQTk3YkEvRCxJQTg3YlcrRCxFQUNQNUMsRUFDQWd6RSxHQUFVcVQsR0FBVXpqRixHQUFXLEVBQUc1QyxHQUl0QyxPQURBNEMsR0FBWTlGLEVBQU9rRCxTQUNBLEdBQUt1akMsRUFBT2xsQyxNQUFNdUUsRUFBVWlpQixJQUFRL25CLEdBKzhFekR5ekUsR0FBTzRDLEdBQUtBLEdBQ1o1QyxHQUFPaWxCLE9BajdFUCxTQUFnQmp5RCxHQUVkLE9BREFBLEVBQVN0dEIsR0FBU3N0QixLQUNBb2dDLEVBQW1CaC9ELEtBQUs0K0IsR0FDdENBLEVBQU81dUIsUUFBUTh1RCxFQUFpQnNJLElBQ2hDeG9DLEdBODZFTmd0QyxHQUFPa2xCLGFBNTVFUCxTQUFzQmx5RCxHQUVwQixPQURBQSxFQUFTdHRCLEdBQVNzdEIsS0FDQTRnQyxFQUFnQngvRCxLQUFLNCtCLEdBQ25DQSxFQUFPNXVCLFFBQVF1dkQsRUFBYyxRQUM3QjNnQyxHQXk1RU5ndEMsR0FBT3RsRCxNQTU3T1AsU0FBZW8vQyxFQUFZZixFQUFXZ1osR0FDcEMsSUFBSTdwRCxFQUFPMVEsR0FBUXNpRCxHQUFjaEIsR0FBYXVOLEdBSTlDLE9BSEkwTCxHQUFTQyxHQUFlbFksRUFBWWYsRUFBV2daLEtBQ2pEaFosT0E3OVJGenFFLEdBKzlSTzQ1QixFQUFLNHhDLEVBQVkwUyxHQUFZelQsRUFBVyxLQXc3T2pEaUgsR0FBT3A1RCxLQUFPQSxHQUNkbzVELEdBQU80WSxVQUFZQSxHQUNuQjVZLEdBQU9tbEIsUUFyeEhQLFNBQWlCdjVGLEVBQVFtdEUsR0FDdkIsT0FBT2MsR0FBWWp1RSxFQUFRNGdGLEdBQVl6VCxFQUFXLEdBQUltTixLQXF4SHhEbEcsR0FBT29hLFNBQVdBLEdBQ2xCcGEsR0FBTzZZLGNBQWdCQSxHQUN2QjdZLEdBQU9vbEIsWUFqdkhQLFNBQXFCeDVGLEVBQVFtdEUsR0FDM0IsT0FBT2MsR0FBWWp1RSxFQUFRNGdGLEdBQVl6VCxFQUFXLEdBQUlxTixLQWl2SHhEcEcsR0FBTy9VLE1BQVFBLEdBQ2YrVSxHQUFPL21FLFFBQVVBLEdBQ2pCK21FLEdBQU9xYSxhQUFlQSxHQUN0QnJhLEdBQU9xbEIsTUFydEhQLFNBQWV6NUYsRUFBUThzRSxHQUNyQixPQUFpQixNQUFWOXNFLEVBQ0hBLEVBQ0FnN0UsR0FBUWg3RSxFQUFRNGdGLEdBQVk5VCxFQUFVLEdBQUkyTCxLQW10SGhEckUsR0FBT3NsQixXQXRySFAsU0FBb0IxNUYsRUFBUThzRSxHQUMxQixPQUFpQixNQUFWOXNFLEVBQ0hBLEVBQ0FrN0UsR0FBYWw3RSxFQUFRNGdGLEdBQVk5VCxFQUFVLEdBQUkyTCxLQW9ySHJEckUsR0FBT3VsQixPQXJwSFAsU0FBZ0IzNUYsRUFBUThzRSxHQUN0QixPQUFPOXNFLEdBQVVzNkUsR0FBV3Q2RSxFQUFRNGdGLEdBQVk5VCxFQUFVLEtBcXBINURzSCxHQUFPd2xCLFlBeG5IUCxTQUFxQjU1RixFQUFROHNFLEdBQzNCLE9BQU85c0UsR0FBVXc2RSxHQUFnQng2RSxFQUFRNGdGLEdBQVk5VCxFQUFVLEtBd25IakVzSCxHQUFPajFFLElBQU1BLEdBQ2JpMUUsR0FBTzhjLEdBQUtBLEdBQ1o5YyxHQUFPK2MsSUFBTUEsR0FDYi9jLEdBQU90Z0UsSUF6Z0hQLFNBQWE5VCxFQUFRNlMsR0FDbkIsT0FBaUIsTUFBVjdTLEdBQWtCdXJGLEdBQVF2ckYsRUFBUTZTLEVBQU1vcEUsS0F5Z0hqRDdILEdBQU8wTCxNQUFRQSxHQUNmMUwsR0FBTzhZLEtBQU9BLEdBQ2Q5WSxHQUFPMkssU0FBV0EsR0FDbEIzSyxHQUFPdUYsU0E1cE9QLFNBQWtCekwsRUFBWTN1RSxFQUFPOHVFLEVBQVc4WCxHQUM5Q2pZLEVBQWF1UixHQUFZdlIsR0FBY0EsRUFBYWo2RCxHQUFPaTZELEdBQzNERyxFQUFhQSxJQUFjOFgsRUFBUytELEdBQVU3YixHQUFhLEVBRTNELElBQUl4cUUsRUFBU3FxRSxFQUFXcnFFLE9BSXhCLE9BSEl3cUUsRUFBWSxJQUNkQSxFQUFZMEUsR0FBVWx2RSxFQUFTd3FFLEVBQVcsSUFFckNrakIsR0FBU3JqQixHQUNYRyxHQUFheHFFLEdBQVVxcUUsRUFBV2w4RCxRQUFRelMsRUFBTzh1RSxJQUFjLElBQzdEeHFFLEdBQVUwcEUsR0FBWVcsRUFBWTN1RSxFQUFPOHVFLElBQWMsR0FtcE9oRStGLEdBQU9waUUsUUE5bFNQLFNBQWlCcEosRUFBT3JKLEVBQU84dUUsR0FDN0IsSUFBSXhxRSxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLElBQUtBLEVBQ0gsT0FBUSxFQUVWLElBQUkrQyxFQUFxQixNQUFieW5FLEVBQW9CLEVBQUk2YixHQUFVN2IsR0FJOUMsT0FISXpuRSxFQUFRLElBQ1ZBLEVBQVFtc0UsR0FBVWx2RSxFQUFTK0MsRUFBTyxJQUU3QjJtRSxHQUFZM2tFLEVBQU9ySixFQUFPcUgsSUFzbFNuQ3d0RSxHQUFPeWxCLFFBbHFGUCxTQUFpQnRxRSxFQUFReVgsRUFBT3RlLEdBUzlCLE9BUkFzZSxFQUFRdWlELEdBQVN2aUQsUUE1d2JqQnRrQyxJQTZ3YklnbUIsR0FDRkEsRUFBTXNlLEVBQ05BLEVBQVEsR0FFUnRlLEVBQU02Z0UsR0FBUzdnRSxHQXJzVm5CLFNBQXFCNkcsRUFBUXlYLEVBQU90ZSxHQUNsQyxPQUFPNkcsR0FBVXlqRCxHQUFVaHNDLEVBQU90ZSxJQUFRNkcsRUFBU3dqRCxHQUFVL3JDLEVBQU90ZSxHQXVzVjdEb3hFLENBRFB2cUUsRUFBU202RCxHQUFTbjZELEdBQ1N5WCxFQUFPdGUsSUEwcEZwQzByRCxHQUFPb2UsT0FBU0EsR0FDaEJwZSxHQUFPK0IsWUFBY0EsR0FDckIvQixHQUFPeG9ELFFBQVVBLEdBQ2pCd29ELEdBQU9wSSxjQUFnQkEsR0FDdkJvSSxHQUFPcUwsWUFBY0EsR0FDckJyTCxHQUFPaU0sa0JBQW9CQSxHQUMzQmpNLEdBQU8ybEIsVUF0d0tQLFNBQW1CeDZGLEdBQ2pCLE9BQWlCLElBQVZBLElBQTRCLElBQVZBLEdBQ3RCODBFLEdBQWE5MEUsSUFBVW84RSxHQUFXcDhFLElBQVVvbUUsR0Fxd0tqRHlPLEdBQU96QixTQUFXQSxHQUNsQnlCLEdBQU9sSSxPQUFTQSxHQUNoQmtJLEdBQU80bEIsVUE3c0tQLFNBQW1CejZGLEdBQ2pCLE9BQU84MEUsR0FBYTkwRSxJQUE2QixJQUFuQkEsRUFBTWtzRSxXQUFtQnR2QyxHQUFjNThCLElBNnNLdkU2MEUsR0FBTzZsQixRQXpxS1AsU0FBaUIxNkYsR0FDZixHQUFhLE1BQVRBLEVBQ0YsT0FBTyxFQUVULEdBQUlrZ0YsR0FBWWxnRixLQUNYcXNCLEdBQVFyc0IsSUFBMEIsaUJBQVRBLEdBQTRDLG1CQUFoQkEsRUFBTThxQyxRQUMxRHNvQyxHQUFTcHpFLElBQVVtdEUsR0FBYW50RSxJQUFVNDJFLEdBQVk1MkUsSUFDMUQsT0FBUUEsRUFBTXNFLE9BRWhCLElBQUlxMEUsRUFBTUMsR0FBTzU0RSxHQUNqQixHQUFJMjRFLEdBQU9sUyxHQUFVa1MsR0FBTzlSLEVBQzFCLE9BQVE3bUUsRUFBTTRVLEtBRWhCLEdBQUlnckUsR0FBWTUvRSxHQUNkLE9BQVEyL0UsR0FBUzMvRSxHQUFPc0UsT0FFMUIsSUFBSyxJQUFJaEUsS0FBT04sRUFDZCxHQUFJWSxHQUFlMUIsS0FBS2MsRUFBT00sR0FDN0IsT0FBTyxFQUdYLE9BQU8sR0FxcEtUdTBFLEdBQU84bEIsUUF0bktQLFNBQWlCMzZGLEVBQU82akIsR0FDdEIsT0FBT3c1RCxHQUFZcjlFLEVBQU82akIsSUFzbks1Qmd4RCxHQUFPK2xCLFlBbmxLUCxTQUFxQjU2RixFQUFPNmpCLEVBQU95MEQsR0FFakMsSUFBSS8yRCxHQURKKzJELEVBQWtDLG1CQUFkQSxFQUEyQkEsT0F4MlcvQ24xRSxHQXkyVzBCbTFFLEVBQVd0NEUsRUFBTzZqQixRQXoyVzVDMWdCLEVBMDJXQSxZQTEyV0FBLElBMDJXT29lLEVBQXVCODdELEdBQVlyOUUsRUFBTzZqQixPQTEyV2pEMWdCLEVBMDJXbUVtMUUsS0FBZ0IvMkQsR0FpbEtyRnN6RCxHQUFPZ2QsUUFBVUEsR0FDakJoZCxHQUFPdjRDLFNBMWhLUCxTQUFrQnQ4QixHQUNoQixNQUF1QixpQkFBVEEsR0FBcUJxekUsR0FBZXJ6RSxJQTBoS3BENjBFLEdBQU9nSCxXQUFhQSxHQUNwQmhILEdBQU9pZCxVQUFZQSxHQUNuQmpkLEdBQU9xWCxTQUFXQSxHQUNsQnJYLEdBQU9oSSxNQUFRQSxHQUNmZ0ksR0FBT2dtQixRQTExSlAsU0FBaUJwNkYsRUFBUWtrQyxHQUN2QixPQUFPbGtDLElBQVdra0MsR0FBVXM2QyxHQUFZeCtFLEVBQVFra0MsRUFBUXc3QyxHQUFheDdDLEtBMDFKdkVrd0MsR0FBT2ltQixZQXZ6SlAsU0FBcUJyNkYsRUFBUWtrQyxFQUFRMnpDLEdBRW5DLE9BREFBLEVBQWtDLG1CQUFkQSxFQUEyQkEsT0E1b1gvQ24xRSxFQTZvWE84N0UsR0FBWXgrRSxFQUFRa2tDLEVBQVF3N0MsR0FBYXg3QyxHQUFTMnpDLElBc3pKM0R6RCxHQUFPL3lFLE1BdnhKUCxTQUFlOUIsR0FJYixPQUFPK3hGLEdBQVMveEYsSUFBVUEsSUFBVUEsR0FveEp0QzYwRSxHQUFPa21CLFNBdnZKUCxTQUFrQi82RixHQUNoQixHQUFJb3NGLEdBQVdwc0YsR0FDYixNQUFNLElBQUl5RSxFQXRzWE0sbUVBd3NYbEIsT0FBTzY2RSxHQUFhdC9FLElBb3ZKdEI2MEUsR0FBT21tQixNQXhzSlAsU0FBZWg3RixHQUNiLE9BQWdCLE1BQVRBLEdBd3NKVDYwRSxHQUFPb21CLE9BanVKUCxTQUFnQmo3RixHQUNkLE9BQWlCLE9BQVZBLEdBaXVKVDYwRSxHQUFPa2QsU0FBV0EsR0FDbEJsZCxHQUFPTSxTQUFXQSxHQUNsQk4sR0FBT0MsYUFBZUEsR0FDdEJELEdBQU9qNEMsY0FBZ0JBLEdBQ3ZCaTRDLEdBQU85SCxTQUFXQSxHQUNsQjhILEdBQU9xbUIsY0FybEpQLFNBQXVCbDdGLEdBQ3JCLE9BQU84eEYsR0FBVTl4RixJQUFVQSxJQTl6WFIsa0JBOHpYc0NBLEdBOXpYdEMsa0JBbTVnQnJCNjBFLEdBQU81SCxNQUFRQSxHQUNmNEgsR0FBT21kLFNBQVdBLEdBQ2xCbmQsR0FBT3VHLFNBQVdBLEdBQ2xCdkcsR0FBTzFILGFBQWVBLEdBQ3RCMEgsR0FBT3NtQixZQW4vSVAsU0FBcUJuN0YsR0FDbkIsWUEvOVhBbUQsSUErOVhPbkQsR0FtL0lUNjBFLEdBQU91bUIsVUEvOUlQLFNBQW1CcDdGLEdBQ2pCLE9BQU84MEUsR0FBYTkwRSxJQUFVNDRFLEdBQU81NEUsSUFBVWduRSxHQSs5SWpENk4sR0FBT3dtQixVQTM4SVAsU0FBbUJyN0YsR0FDakIsT0FBTzgwRSxHQUFhOTBFLElBbjZYUCxvQkFtNlhpQm84RSxHQUFXcDhFLElBMjhJM0M2MEUsR0FBT3B5RCxLQXovUlAsU0FBY3BaLEVBQU80dUYsR0FDbkIsT0FBZ0IsTUFBVDV1RixFQUFnQixHQUFLaXFFLEdBQVdwMEUsS0FBS21LLEVBQU80dUYsSUF5L1JyRHBqQixHQUFPK2UsVUFBWUEsR0FDbkIvZSxHQUFPcGEsS0FBT0EsR0FDZG9hLEdBQU9weUIsWUFoOVJQLFNBQXFCcDVDLEVBQU9ySixFQUFPOHVFLEdBQ2pDLElBQUl4cUUsRUFBa0IsTUFBVCtFLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUN2QyxJQUFLQSxFQUNILE9BQVEsRUFFVixJQUFJK0MsRUFBUS9DLEVBS1osWUFqaFBBbkIsSUE2Z1BJMnJFLElBRUZ6bkUsR0FEQUEsRUFBUXNqRixHQUFVN2IsSUFDRixFQUFJMEUsR0FBVWx2RSxFQUFTK0MsRUFBTyxHQUFLb3NFLEdBQVVwc0UsRUFBTy9DLEVBQVMsSUFFeEV0RSxHQUFVQSxFQXJ2TXJCLFNBQTJCcUosRUFBT3JKLEVBQU84dUUsR0FFdkMsSUFEQSxJQUFJem5FLEVBQVF5bkUsRUFBWSxFQUNqQnpuRSxLQUNMLEdBQUlnQyxFQUFNaEMsS0FBV3JILEVBQ25CLE9BQU9xSCxFQUdYLE9BQU9BLEVBK3VNRGkwRixDQUFrQmp5RixFQUFPckosRUFBT3FILEdBQ2hDd25FLEdBQWN4bEUsRUFBTzRsRSxHQUFXNW5FLEdBQU8sSUFxOFI3Q3d0RSxHQUFPZ2YsVUFBWUEsR0FDbkJoZixHQUFPaWYsV0FBYUEsR0FDcEJqZixHQUFPb2QsR0FBS0EsR0FDWnBkLEdBQU9xZCxJQUFNQSxHQUNicmQsR0FBT3hxRSxJQWhmUCxTQUFhaEIsR0FDWCxPQUFRQSxHQUFTQSxFQUFNL0UsT0FDbkI2MkUsR0FBYTl4RSxFQUFPbTJFLEdBQVUvQyxTQTkrZmxDdDVFLEdBNjlnQkYweEUsR0FBTzBtQixNQXBkUCxTQUFlbHlGLEVBQU9ra0UsR0FDcEIsT0FBUWxrRSxHQUFTQSxFQUFNL0UsT0FDbkI2MkUsR0FBYTl4RSxFQUFPZzRFLEdBQVk5VCxFQUFVLEdBQUlrUCxTQTNnZ0JsRHQ1RSxHQTg5Z0JGMHhFLEdBQU8ybUIsS0FqY1AsU0FBY255RixHQUNaLE9BQU84bEUsR0FBUzlsRSxFQUFPbTJFLEtBaWN6QjNLLEdBQU80bUIsT0F2YVAsU0FBZ0JweUYsRUFBT2trRSxHQUNyQixPQUFPNEIsR0FBUzlsRSxFQUFPZzRFLEdBQVk5VCxFQUFVLEtBdWEvQ3NILEdBQU9qaEUsSUFsWlAsU0FBYXZLLEdBQ1gsT0FBUUEsR0FBU0EsRUFBTS9FLE9BQ25CNjJFLEdBQWE5eEUsRUFBT20yRSxHQUFVUSxTQWhsZ0JsQzc4RSxHQWkrZ0JGMHhFLEdBQU82bUIsTUF0WFAsU0FBZXJ5RixFQUFPa2tFLEdBQ3BCLE9BQVFsa0UsR0FBU0EsRUFBTS9FLE9BQ25CNjJFLEdBQWE5eEUsRUFBT2c0RSxHQUFZOVQsRUFBVSxHQUFJeVMsU0E3bWdCbEQ3OEUsR0FrK2dCRjB4RSxHQUFPa1gsVUFBWUEsR0FDbkJsWCxHQUFPd1gsVUFBWUEsR0FDbkJ4WCxHQUFPOG1CLFdBenRCUCxXQUNFLE1BQU8sSUF5dEJUOW1CLEdBQU8rbUIsV0F6c0JQLFdBQ0UsTUFBTyxJQXlzQlQvbUIsR0FBT2duQixTQXpyQlAsV0FDRSxPQUFPLEdBeXJCVGhuQixHQUFPeWdCLFNBQVdBLEdBQ2xCemdCLEdBQU9pbkIsSUE3N1JQLFNBQWF6eUYsRUFBTzdJLEdBQ2xCLE9BQVE2SSxHQUFTQSxFQUFNL0UsT0FBVTI4RSxHQUFRNTNFLEVBQU9zaEYsR0FBVW5xRixTQTVpUDFEMkMsR0F5K2dCRjB4RSxHQUFPa25CLFdBbGlDUCxXQUlFLE9BSEk5d0QsR0FBSzlRLElBQU1sNEIsT0FDYmdwQyxHQUFLOVEsRUFBSTYzQyxJQUVKL3ZFLE1BK2hDVDR5RSxHQUFPdlAsS0FBT0EsR0FDZHVQLEdBQU8vakIsSUFBTUEsR0FDYitqQixHQUFPOTVCLElBajVFUCxTQUFhbFQsRUFBUXZqQyxFQUFRc2xGLEdBQzNCL2hELEVBQVN0dEIsR0FBU3N0QixHQUdsQixJQUFJbTBELEdBRkoxM0YsRUFBU3FtRixHQUFVcm1GLElBRU15c0UsR0FBV2xwQyxHQUFVLEVBQzlDLElBQUt2akMsR0FBVTAzRixHQUFhMTNGLEVBQzFCLE9BQU91akMsRUFFVCxJQUFJNkMsR0FBT3BtQyxFQUFTMDNGLEdBQWEsRUFDakMsT0FDRXJTLEdBQWMxVyxHQUFZdm9DLEdBQU1rL0MsR0FDaEMvaEQsRUFDQThoRCxHQUFjM1csR0FBV3RvQyxHQUFNay9DLElBczRFbkMvVSxHQUFPb25CLE9BMzJFUCxTQUFnQnAwRCxFQUFRdmpDLEVBQVFzbEYsR0FDOUIvaEQsRUFBU3R0QixHQUFTc3RCLEdBR2xCLElBQUltMEQsR0FGSjEzRixFQUFTcW1GLEdBQVVybUYsSUFFTXlzRSxHQUFXbHBDLEdBQVUsRUFDOUMsT0FBUXZqQyxHQUFVMDNGLEVBQVkxM0YsRUFDekJ1akMsRUFBUzhoRCxHQUFjcmxGLEVBQVMwM0YsRUFBV3BTLEdBQzVDL2hELEdBcTJFTmd0QyxHQUFPL3BELFNBMzBFUCxTQUFrQitjLEVBQVF2akMsRUFBUXNsRixHQUNoQy9oRCxFQUFTdHRCLEdBQVNzdEIsR0FHbEIsSUFBSW0wRCxHQUZKMTNGLEVBQVNxbUYsR0FBVXJtRixJQUVNeXNFLEdBQVdscEMsR0FBVSxFQUM5QyxPQUFRdmpDLEdBQVUwM0YsRUFBWTEzRixFQUN6QnFsRixHQUFjcmxGLEVBQVMwM0YsRUFBV3BTLEdBQVMvaEQsRUFDNUNBLEdBcTBFTmd0QyxHQUFPeDJELFNBMXlFUCxTQUFrQndwQixFQUFRcTBELEVBQU90VixHQU0vQixPQUxJQSxHQUFrQixNQUFUc1YsRUFDWEEsRUFBUSxFQUNDQSxJQUNUQSxHQUFTQSxHQUVKdm9CLEdBQWVwNUQsR0FBU3N0QixHQUFRNXVCLFFBQVF5dkQsRUFBYSxJQUFLd3pCLEdBQVMsSUFxeUU1RXJuQixHQUFPbmpELE9BMXJGUCxTQUFnQnltRCxFQUFPenZCLEVBQU95ekMsR0EyQjVCLEdBMUJJQSxHQUErQixrQkFBWkEsR0FBeUJ0VixHQUFlMU8sRUFBT3p2QixFQUFPeXpDLEtBQzNFenpDLEVBQVF5ekMsT0F4emJWaDVGLFlBMHpiSWc1RixJQUNrQixrQkFBVHp6QyxHQUNUeXpDLEVBQVd6ekMsRUFDWEEsT0E3emJKdmxELEdBK3piMkIsa0JBQVRnMUUsSUFDZGdrQixFQUFXaGtCLEVBQ1hBLE9BajBiSmgxRSxhQW8wYklnMUUsUUFwMGJKaDFFLElBbzBiMkJ1bEQsR0FDekJ5dkIsRUFBUSxFQUNSenZCLEVBQVEsSUFHUnl2QixFQUFRNlIsR0FBUzdSLFFBejBibkJoMUUsSUEwMGJNdWxELEdBQ0ZBLEVBQVF5dkIsRUFDUkEsRUFBUSxHQUVSenZCLEVBQVFzaEMsR0FBU3RoQyxJQUdqQnl2QixFQUFRenZCLEVBQU8sQ0FDakIsSUFBSWp1QixFQUFPMDlDLEVBQ1hBLEVBQVF6dkIsRUFDUkEsRUFBUWp1QixFQUVWLEdBQUkwaEUsR0FBWWhrQixFQUFRLEdBQUt6dkIsRUFBUSxFQUFHLENBQ3RDLElBQUl1a0MsRUFBT3JaLEtBQ1gsT0FBT0gsR0FBVTBFLEVBQVM4VSxHQUFRdmtDLEVBQVF5dkIsRUFBUXRNLEdBQWUsUUFBVW9oQixFQUFPLElBQUkzb0YsT0FBUyxLQUFPb2tELEdBRXhHLE9BQU93dUIsR0FBV2lCLEVBQU96dkIsSUF1cEYzQm1zQixHQUFPOXBELE9BNStOUCxTQUFnQjRqRCxFQUFZcEIsRUFBVUMsR0FDcEMsSUFBSXp3QyxFQUFPMVEsR0FBUXNpRCxHQUFjUCxHQUFja0IsR0FDM0NqQixFQUFZenJFLFVBQVUwQixPQUFTLEVBRW5DLE9BQU95NEIsRUFBSzR4QyxFQUFZMFMsR0FBWTlULEVBQVUsR0FBSUMsRUFBYWEsRUFBVzBKLEtBeStONUVsRCxHQUFPdW5CLFlBaDlOUCxTQUFxQnp0QixFQUFZcEIsRUFBVUMsR0FDekMsSUFBSXp3QyxFQUFPMVEsR0FBUXNpRCxHQUFjTCxHQUFtQmdCLEdBQ2hEakIsRUFBWXpyRSxVQUFVMEIsT0FBUyxFQUVuQyxPQUFPeTRCLEVBQUs0eEMsRUFBWTBTLEdBQVk5VCxFQUFVLEdBQUlDLEVBQWFhLEVBQVcyTSxLQTY4TjVFbkcsR0FBT3duQixPQS93RVAsU0FBZ0J4MEQsRUFBUXJuQyxFQUFHb21GLEdBTXpCLE9BSkVwbUYsR0FER29tRixFQUFRQyxHQUFlaC9DLEVBQVFybkMsRUFBR29tRixRQXJ1Y3ZDempGLElBcXVjZ0QzQyxHQUMxQyxFQUVBbXFGLEdBQVVucUYsR0FFVDZoRixHQUFXOW5FLEdBQVNzdEIsR0FBU3JuQyxJQTB3RXRDcTBFLEdBQU81N0QsUUFwdkVQLFdBQ0UsSUFBSTNYLEVBQU9zQixVQUNQaWxDLEVBQVN0dEIsR0FBU2paLEVBQUssSUFFM0IsT0FBT0EsRUFBS2dELE9BQVMsRUFBSXVqQyxFQUFTQSxFQUFPNXVCLFFBQVEzWCxFQUFLLEdBQUlBLEVBQUssS0FpdkVqRXV6RSxHQUFPdHpELE9BdG9HUCxTQUFnQjlnQixFQUFRNlMsRUFBTWsyRSxHQUc1QixJQUFJbmlGLEdBQVMsRUFDVC9DLEdBSEpnUCxFQUFPeW9FLEdBQVN6b0UsRUFBTTdTLElBR0o2RCxPQU9sQixJQUpLQSxJQUNIQSxFQUFTLEVBQ1Q3RCxPQXgzYUYwQyxLQTAzYVNrRSxFQUFRL0MsR0FBUSxDQUN2QixJQUFJdEUsRUFBa0IsTUFBVlMsT0EzM2FkMEMsRUEyM2EyQzFDLEVBQU91N0UsR0FBTTFvRSxFQUFLak0sVUEzM2E3RGxFLElBNDNhTW5ELElBQ0ZxSCxFQUFRL0MsRUFDUnRFLEVBQVF3cEYsR0FFVi9vRixFQUFTbzdFLEdBQVc3N0UsR0FBU0EsRUFBTWQsS0FBS3VCLEdBQVVULEVBRXBELE9BQU9TLEdBb25HVG8wRSxHQUFPdjFELE1BQVFBLEdBQ2Z1MUQsR0FBT3ZELGFBQWVBLEVBQ3RCdUQsR0FBT3luQixPQTE1TlAsU0FBZ0IzdEIsR0FFZCxPQURXdGlELEdBQVFzaUQsR0FBY3NJLEdBQWN3TCxJQUNuQzlULElBeTVOZGtHLEdBQU9qZ0UsS0EvME5QLFNBQWMrNUQsR0FDWixHQUFrQixNQUFkQSxFQUNGLE9BQU8sRUFFVCxHQUFJdVIsR0FBWXZSLEdBQ2QsT0FBT3FqQixHQUFTcmpCLEdBQWNvQyxHQUFXcEMsR0FBY0EsRUFBV3JxRSxPQUVwRSxJQUFJcTBFLEVBQU1DLEdBQU9qSyxHQUNqQixPQUFJZ0ssR0FBT2xTLEdBQVVrUyxHQUFPOVIsRUFDbkI4SCxFQUFXLzVELEtBRWIrcUUsR0FBU2hSLEdBQVlycUUsUUFxME45QnV3RSxHQUFPa2YsVUFBWUEsR0FDbkJsZixHQUFPdDRCLEtBL3hOUCxTQUFjb3lCLEVBQVlmLEVBQVdnWixHQUNuQyxJQUFJN3BELEVBQU8xUSxHQUFRc2lELEdBQWNKLEdBQVkwVSxHQUk3QyxPQUhJMkQsR0FBU0MsR0FBZWxZLEVBQVlmLEVBQVdnWixLQUNqRGhaLE9BL3RURnpxRSxHQWl1VE80NUIsRUFBSzR4QyxFQUFZMFMsR0FBWXpULEVBQVcsS0EyeE5qRGlILEdBQU8wbkIsWUFoc1JQLFNBQXFCbHpGLEVBQU9ySixHQUMxQixPQUFPa2pGLEdBQWdCNzVFLEVBQU9ySixJQWdzUmhDNjBFLEdBQU8ybkIsY0FwcVJQLFNBQXVCbnpGLEVBQU9ySixFQUFPdXRFLEdBQ25DLE9BQU84VixHQUFrQmg2RSxFQUFPckosRUFBT3FoRixHQUFZOVQsRUFBVSxLQW9xUi9Ec0gsR0FBTzRuQixjQWpwUlAsU0FBdUJwekYsRUFBT3JKLEdBQzVCLElBQUlzRSxFQUFrQixNQUFUK0UsRUFBZ0IsRUFBSUEsRUFBTS9FLE9BQ3ZDLEdBQUlBLEVBQVEsQ0FDVixJQUFJK0MsRUFBUTY3RSxHQUFnQjc1RSxFQUFPckosR0FDbkMsR0FBSXFILEVBQVEvQyxHQUFVbXpFLEdBQUdwdUUsRUFBTWhDLEdBQVFySCxHQUNyQyxPQUFPcUgsRUFHWCxPQUFRLEdBMG9SVnd0RSxHQUFPNm5CLGdCQXJuUlAsU0FBeUJyekYsRUFBT3JKLEdBQzlCLE9BQU9rakYsR0FBZ0I3NUUsRUFBT3JKLEdBQU8sSUFxblJ2QzYwRSxHQUFPOG5CLGtCQXpsUlAsU0FBMkJ0ekYsRUFBT3JKLEVBQU91dEUsR0FDdkMsT0FBTzhWLEdBQWtCaDZFLEVBQU9ySixFQUFPcWhGLEdBQVk5VCxFQUFVLElBQUksSUF5bFJuRXNILEdBQU8rbkIsa0JBdGtSUCxTQUEyQnZ6RixFQUFPckosR0FFaEMsR0FEc0IsTUFBVHFKLEVBQWdCLEVBQUlBLEVBQU0vRSxPQUMzQixDQUNWLElBQUkrQyxFQUFRNjdFLEdBQWdCNzVFLEVBQU9ySixHQUFPLEdBQVEsRUFDbEQsR0FBSXkzRSxHQUFHcHVFLEVBQU1oQyxHQUFRckgsR0FDbkIsT0FBT3FILEVBR1gsT0FBUSxHQStqUlZ3dEUsR0FBT21mLFVBQVlBLEdBQ25CbmYsR0FBT2dvQixXQTNvRVAsU0FBb0JoMUQsRUFBUXptQyxFQUFROEYsR0FPbEMsT0FOQTJnQyxFQUFTdHRCLEdBQVNzdEIsR0FDbEIzZ0MsRUFBdUIsTUFBWkEsRUFDUCxFQUNBb3dFLEdBQVVxVCxHQUFVempGLEdBQVcsRUFBRzJnQyxFQUFPdmpDLFFBRTdDbEQsRUFBUzZpRixHQUFhN2lGLEdBQ2Z5bUMsRUFBT2xsQyxNQUFNdUUsRUFBVUEsRUFBVzlGLEVBQU9rRCxTQUFXbEQsR0Fxb0U3RHl6RSxHQUFPNGdCLFNBQVdBLEdBQ2xCNWdCLEdBQU92b0QsSUF6VVAsU0FBYWpqQixHQUNYLE9BQVFBLEdBQVNBLEVBQU0vRSxPQUNuQjhxRSxHQUFRL2xFLEVBQU9tMkUsSUFDZixHQXVVTjNLLEdBQU9pb0IsTUE3U1AsU0FBZXp6RixFQUFPa2tFLEdBQ3BCLE9BQVFsa0UsR0FBU0EsRUFBTS9FLE9BQ25COHFFLEdBQVEvbEUsRUFBT2c0RSxHQUFZOVQsRUFBVSxJQUNyQyxHQTJTTnNILEdBQU9rb0IsU0E3aEVQLFNBQWtCbDFELEVBQVEvbkIsRUFBUzhtRSxHQUlqQyxJQUFJLzVFLEVBQVdnb0UsR0FBTzZGLGlCQUVsQmtNLEdBQVNDLEdBQWVoL0MsRUFBUS9uQixFQUFTOG1FLEtBQzNDOW1FLE9Bai9jRjNjLEdBbS9jQTBrQyxFQUFTdHRCLEdBQVNzdEIsR0FDbEIvbkIsRUFBVTJ5RSxHQUFhLEdBQUkzeUUsRUFBU2pULEVBQVUwK0UsSUFFOUMsSUFJSXlSLEVBQ0FDLEVBTEFDLEVBQVV6SyxHQUFhLEdBQUkzeUUsRUFBUW85RSxRQUFTcndGLEVBQVNxd0YsUUFBUzNSLElBQzlENFIsRUFBY3oxRixHQUFLdzFGLEdBQ25CRSxFQUFnQnp0QixHQUFXdXRCLEVBQVNDLEdBSXBDOTFGLEVBQVEsRUFDUmcyRixFQUFjdjlFLEVBQVF1OUUsYUFBZTN6QixHQUNyQy9rQyxFQUFTLFdBR1QyNEQsRUFBZWh2RSxJQUNoQnhPLEVBQVFnNkUsUUFBVXB3QixJQUFXL2tDLE9BQVMsSUFDdkMwNEQsRUFBWTE0RCxPQUFTLEtBQ3BCMDRELElBQWdCajFCLEVBQWdCYyxHQUFlUSxJQUFXL2tDLE9BQVMsS0FDbkU3a0IsRUFBUXk5RSxVQUFZN3pCLElBQVcva0MsT0FBUyxLQUN6QyxLQU1FNjRELEVBQVksa0JBQ2I1OEYsR0FBZTFCLEtBQUs0Z0IsRUFBUyxjQUN6QkEsRUFBUTA5RSxVQUFZLElBQUl2a0YsUUFBUSxNQUFPLEtBQ3ZDLDZCQUErQnd5RCxHQUFtQixLQUNuRCxLQUVONWpDLEVBQU81dUIsUUFBUXFrRixHQUFjLFNBQVM3cEYsRUFBT2dxRixFQUFhQyxFQUFrQkMsRUFBaUJDLEVBQWU5aEYsR0FzQjFHLE9BckJBNGhGLElBQXFCQSxFQUFtQkMsR0FHeENoNUQsR0FBVWtELEVBQU9sbEMsTUFBTTBFLEVBQU95VSxHQUFRN0MsUUFBUTB3RCxHQUFtQjJHLElBRzdEbXRCLElBQ0ZULEdBQWEsRUFDYnI0RCxHQUFVLFlBQWM4NEQsRUFBYyxVQUVwQ0csSUFDRlgsR0FBZSxFQUNmdDRELEdBQVUsT0FBU2k1RCxFQUFnQixlQUVqQ0YsSUFDRi80RCxHQUFVLGlCQUFtQis0RCxFQUFtQiwrQkFFbERyMkYsRUFBUXlVLEVBQVNySSxFQUFNblAsT0FJaEJtUCxLQUdUa3hCLEdBQVUsT0FJVixJQUFJazVELEVBQVdqOUYsR0FBZTFCLEtBQUs0Z0IsRUFBUyxhQUFlQSxFQUFRKzlFLFNBQ25FLEdBQUtBLEdBS0EsR0FBSTcwQixHQUEyQi8vRCxLQUFLNDBGLEdBQ3ZDLE1BQU0sSUFBSXA1RixFQTNpZG1CLDJEQXNpZDdCa2dDLEVBQVMsaUJBQW1CQSxFQUFTLFFBU3ZDQSxHQUFVczRELEVBQWV0NEQsRUFBTzFyQixRQUFRMHVELEVBQXNCLElBQU1oakMsR0FDakUxckIsUUFBUTJ1RCxFQUFxQixNQUM3QjN1RCxRQUFRNHVELEVBQXVCLE9BR2xDbGpDLEVBQVMsYUFBZWs1RCxHQUFZLE9BQVMsU0FDMUNBLEVBQ0csR0FDQSx3QkFFSixxQkFDQ2IsRUFDSSxtQkFDQSxLQUVKQyxFQUNHLHVGQUVBLE9BRUp0NEQsRUFDQSxnQkFFRixJQUFJcGpCLEVBQVM4eUUsSUFBUSxXQUNuQixPQUFPOXlGLEdBQVM0N0YsRUFBYUssRUFBWSxVQUFZNzRELEdBQ2xEeGpDLFdBbmxkTGdDLEVBbWxkc0JpNkYsTUFNdEIsR0FEQTc3RSxFQUFPb2pCLE9BQVNBLEVBQ1prdEQsR0FBUXR3RSxHQUNWLE1BQU1BLEVBRVIsT0FBT0EsR0E0NkRUc3pELEdBQU9pcEIsTUFwc0JQLFNBQWV0OUYsRUFBRytzRSxHQUVoQixJQURBL3NFLEVBQUltcUYsR0FBVW5xRixJQUNOLEdBQUtBLEVBNXdmTSxpQkE2d2ZqQixNQUFPLEdBRVQsSUFBSTZHLEVBMXdmZSxXQTJ3ZmYvQyxFQUFTbXZFLEdBQVVqekUsRUEzd2ZKLFlBOHdmbkJBLEdBOXdmbUIsV0FpeGZuQixJQURBLElBQUkrZ0IsRUFBU2d1RCxHQUFVanJFLEVBSHZCaXBFLEVBQVc4VCxHQUFZOVQsTUFJZGxtRSxFQUFRN0csR0FDZitzRSxFQUFTbG1FLEdBRVgsT0FBT2thLEdBc3JCVHN6RCxHQUFPbVYsU0FBV0EsR0FDbEJuVixHQUFPOFYsVUFBWUEsR0FDbkI5VixHQUFPeWQsU0FBV0EsR0FDbEJ6ZCxHQUFPa3BCLFFBeDVEUCxTQUFpQi85RixHQUNmLE9BQU91YSxHQUFTdmEsR0FBT2djLGVBdzVEekI2NEQsR0FBT3NWLFNBQVdBLEdBQ2xCdFYsR0FBT21wQixjQXB1SVAsU0FBdUJoK0YsR0FDckIsT0FBT0EsRUFDSHMzRSxHQUFVcVQsR0FBVTNxRixJQWx2WUwsbUNBbXZZSixJQUFWQSxFQUFjQSxFQUFRLEdBa3VJN0I2MEUsR0FBT3Q2RCxTQUFXQSxHQUNsQnM2RCxHQUFPb3BCLFFBbjREUCxTQUFpQmorRixHQUNmLE9BQU91YSxHQUFTdmEsR0FBT29kLGVBbTREekJ5M0QsR0FBTzM3RCxLQTEyRFAsU0FBYzJ1QixFQUFRK2hELEVBQU9oRCxHQUUzQixJQURBLytDLEVBQVN0dEIsR0FBU3N0QixNQUNIKytDLFFBenFkZnpqRixJQXlxZHdCeW1GLEdBQ3RCLE9BQU9wYSxHQUFTM25DLEdBRWxCLElBQUtBLEtBQVkraEQsRUFBUTNGLEdBQWEyRixJQUNwQyxPQUFPL2hELEVBRVQsSUFBSWtvQyxFQUFhbUIsR0FBY3JwQyxHQUMzQm1vQyxFQUFha0IsR0FBYzBZLEdBSS9CLE9BQU96RSxHQUFVcFYsRUFITEQsR0FBZ0JDLEVBQVlDLEdBQzlCQyxHQUFjRixFQUFZQyxHQUFjLEdBRVR2dEQsS0FBSyxLQTgxRGhEb3lELEdBQU9xcEIsUUF4MERQLFNBQWlCcjJELEVBQVEraEQsRUFBT2hELEdBRTlCLElBREEvK0MsRUFBU3R0QixHQUFTc3RCLE1BQ0grK0MsUUE1c2RmempGLElBNHNkd0J5bUYsR0FDdEIsT0FBTy9oRCxFQUFPbGxDLE1BQU0sRUFBRzhzRSxHQUFnQjVuQyxHQUFVLEdBRW5ELElBQUtBLEtBQVkraEQsRUFBUTNGLEdBQWEyRixJQUNwQyxPQUFPL2hELEVBRVQsSUFBSWtvQyxFQUFhbUIsR0FBY3JwQyxHQUcvQixPQUFPczlDLEdBQVVwVixFQUFZLEVBRm5CRSxHQUFjRixFQUFZbUIsR0FBYzBZLElBQVUsR0FFdkJubkUsS0FBSyxLQTh6RDVDb3lELEdBQU9zcEIsVUF4eURQLFNBQW1CdDJELEVBQVEraEQsRUFBT2hELEdBRWhDLElBREEvK0MsRUFBU3R0QixHQUFTc3RCLE1BQ0grK0MsUUE3dWRmempGLElBNnVkd0J5bUYsR0FDdEIsT0FBTy9oRCxFQUFPNXVCLFFBQVF5dkQsRUFBYSxJQUVyQyxJQUFLN2dDLEtBQVkraEQsRUFBUTNGLEdBQWEyRixJQUNwQyxPQUFPL2hELEVBRVQsSUFBSWtvQyxFQUFhbUIsR0FBY3JwQyxHQUcvQixPQUFPczlDLEdBQVVwVixFQUZMRCxHQUFnQkMsRUFBWW1CLEdBQWMwWSxLQUVsQm5uRSxLQUFLLEtBOHhEM0NveUQsR0FBT3VwQixTQXR2RFAsU0FBa0J2MkQsRUFBUS9uQixHQUN4QixJQUFJeGIsRUFudmRtQixHQW92ZG5CKzVGLEVBbnZkcUIsTUFxdmR6QixHQUFJbHBCLEdBQVNyMUQsR0FBVSxDQUNyQixJQUFJbTRFLEVBQVksY0FBZW40RSxFQUFVQSxFQUFRbTRFLFVBQVlBLEVBQzdEM3pGLEVBQVMsV0FBWXdiLEVBQVU2cUUsR0FBVTdxRSxFQUFReGIsUUFBVUEsRUFDM0QrNUYsRUFBVyxhQUFjditFLEVBQVVta0UsR0FBYW5rRSxFQUFRdStFLFVBQVlBLEVBSXRFLElBQUlyQyxHQUZKbjBELEVBQVN0dEIsR0FBU3N0QixJQUVLdmpDLE9BQ3ZCLEdBQUlrc0UsR0FBVzNvQyxHQUFTLENBQ3RCLElBQUlrb0MsRUFBYW1CLEdBQWNycEMsR0FDL0JtMEQsRUFBWWpzQixFQUFXenJFLE9BRXpCLEdBQUlBLEdBQVUwM0YsRUFDWixPQUFPbjBELEVBRVQsSUFBSTFlLEVBQU03a0IsRUFBU3lzRSxHQUFXc3RCLEdBQzlCLEdBQUlsMUUsRUFBTSxFQUNSLE9BQU9rMUUsRUFFVCxJQUFJOThFLEVBQVN3dUQsRUFDVG9WLEdBQVVwVixFQUFZLEVBQUc1bUQsR0FBSzFHLEtBQUssSUFDbkNvbEIsRUFBT2xsQyxNQUFNLEVBQUd3bUIsR0FFcEIsUUF6emRBaG1CLElBeXpkSTgwRixFQUNGLE9BQU8xMkUsRUFBUzg4RSxFQUtsQixHQUhJdHVCLElBQ0Y1bUQsR0FBUTVILEVBQU9qZCxPQUFTNmtCLEdBRXRCNGpELEdBQVNrckIsSUFDWCxHQUFJcHdELEVBQU9sbEMsTUFBTXdtQixHQUFLamYsT0FBTyt0RixHQUFZLENBQ3ZDLElBQUl4a0YsRUFDQXFVLEVBQVl2RyxFQU1oQixJQUpLMDJFLEVBQVUzcUMsU0FDYjJxQyxFQUFZM3BFLEdBQU8ycEUsRUFBVXR6RCxPQUFRcHFCLEdBQVM0dUQsR0FBUTlrQyxLQUFLNHpELElBQWMsTUFFM0VBLEVBQVVqbkIsVUFBWSxFQUNkdjlELEVBQVF3a0YsRUFBVTV6RCxLQUFLdmMsSUFDN0IsSUFBSXcyRSxFQUFTN3FGLEVBQU1wTSxNQUVyQmthLEVBQVNBLEVBQU81ZSxNQUFNLE9BMzBkMUJRLElBMjBkNkJtN0YsRUFBdUJuMUUsRUFBTW0xRSxTQUVuRCxHQUFJejJELEVBQU9wMUIsUUFBUXd4RSxHQUFhZ1UsR0FBWTl1RSxJQUFRQSxFQUFLLENBQzlELElBQUk5aEIsRUFBUWthLEVBQU9raEMsWUFBWXcxQyxHQUMzQjV3RixHQUFTLElBQ1hrYSxFQUFTQSxFQUFPNWUsTUFBTSxFQUFHMEUsSUFHN0IsT0FBT2thLEVBQVM4OEUsR0Frc0RsQnhwQixHQUFPMXNELFNBNXFEUCxTQUFrQjBmLEdBRWhCLE9BREFBLEVBQVN0dEIsR0FBU3N0QixLQUNBbWdDLEVBQWlCLytELEtBQUs0K0IsR0FDcENBLEVBQU81dUIsUUFBUTZ1RCxFQUFldUosSUFDOUJ4cEMsR0F5cUROZ3RDLEdBQU8wcEIsU0F2cEJQLFNBQWtCenRFLEdBQ2hCLElBQUkvbUIsSUFBTzZuRSxHQUNYLE9BQU9yM0QsR0FBU3VXLEdBQVUvbUIsR0FzcEI1QjhxRSxHQUFPb2YsVUFBWUEsR0FDbkJwZixHQUFPOGUsV0FBYUEsR0FHcEI5ZSxHQUFPMnBCLEtBQU8xd0YsR0FDZCttRSxHQUFPNHBCLFVBQVl2UCxHQUNuQnJhLEdBQU81cUQsTUFBUTBqRSxHQUVmZ0gsR0FBTTlmLElBQ0Fsd0MsR0FBUyxHQUNibzJDLEdBQVdsRyxJQUFRLFNBQVM5M0MsRUFBTWlxRCxHQUMzQnBtRixHQUFlMUIsS0FBSzIxRSxHQUFPbDBFLFVBQVdxbUYsS0FDekNyaUQsR0FBT3FpRCxHQUFjanFELE1BR2xCNEgsSUFDSCxDQUFFLE9BQVMsSUFXakJrd0MsR0FBTzZwQixRQS9paEJLLFVBa2poQlpqeEIsR0FBVSxDQUFDLE9BQVEsVUFBVyxRQUFTLGFBQWMsVUFBVyxpQkFBaUIsU0FBU3VaLEdBQ3hGblMsR0FBT21TLEdBQVk3VyxZQUFjMEUsTUFJbkNwSCxHQUFVLENBQUMsT0FBUSxTQUFTLFNBQVN1WixFQUFZMy9FLEdBQy9DMHRFLEdBQVlwMEUsVUFBVXFtRixHQUFjLFNBQVN4bUYsR0FDM0NBLE9BNWpoQkYyQyxJQTRqaEJNM0MsRUFBa0IsRUFBSWd6RSxHQUFVbVgsR0FBVW5xRixHQUFJLEdBRWxELElBQUkrZ0IsRUFBVXRmLEtBQUsyekUsZUFBaUJ2dUUsRUFDaEMsSUFBSTB0RSxHQUFZOXlFLE1BQ2hCQSxLQUFLazZCLFFBVVQsT0FSSTVhLEVBQU9xMEQsYUFDVHIwRCxFQUFPdTBELGNBQWdCckMsR0FBVWp6RSxFQUFHK2dCLEVBQU91MEQsZUFFM0N2MEQsRUFBT3cwRCxVQUFVMXhFLEtBQUssQ0FDcEIsS0FBUW92RSxHQUFVanpFLEVBdmdoQkwsWUF3Z2hCYixLQUFRd21GLEdBQWN6bEUsRUFBT28wRCxRQUFVLEVBQUksUUFBVSxNQUdsRHAwRCxHQUdUd3pELEdBQVlwMEUsVUFBVXFtRixFQUFhLFNBQVcsU0FBU3htRixHQUNyRCxPQUFPeUIsS0FBSzhuQyxVQUFVaTlDLEdBQVl4bUYsR0FBR3VwQyxjQUt6QzBqQyxHQUFVLENBQUMsU0FBVSxNQUFPLGNBQWMsU0FBU3VaLEVBQVkzL0UsR0FDN0QsSUFBSXhELEVBQU93RCxFQUFRLEVBQ2ZzM0YsRUFqaWhCZSxHQWlpaEJKOTZGLEdBL2hoQkcsR0EraGhCeUJBLEVBRTNDa3hFLEdBQVlwMEUsVUFBVXFtRixHQUFjLFNBQVN6WixHQUMzQyxJQUFJaHNELEVBQVN0ZixLQUFLazZCLFFBTWxCLE9BTEE1YSxFQUFPczBELGNBQWN4eEUsS0FBSyxDQUN4QixTQUFZZzlFLEdBQVk5VCxFQUFVLEdBQ2xDLEtBQVExcEUsSUFFVjBkLEVBQU9xMEQsYUFBZXIwRCxFQUFPcTBELGNBQWdCK29CLEVBQ3RDcDlFLE1BS1hrc0QsR0FBVSxDQUFDLE9BQVEsU0FBUyxTQUFTdVosRUFBWTMvRSxHQUMvQyxJQUFJdTNGLEVBQVcsUUFBVXYzRixFQUFRLFFBQVUsSUFFM0MwdEUsR0FBWXAwRSxVQUFVcW1GLEdBQWMsV0FDbEMsT0FBTy9rRixLQUFLMjhGLEdBQVUsR0FBRzUrRixRQUFRLE9BS3JDeXRFLEdBQVUsQ0FBQyxVQUFXLFNBQVMsU0FBU3VaLEVBQVkzL0UsR0FDbEQsSUFBSXczRixFQUFXLFFBQVV4M0YsRUFBUSxHQUFLLFNBRXRDMHRFLEdBQVlwMEUsVUFBVXFtRixHQUFjLFdBQ2xDLE9BQU8va0YsS0FBSzJ6RSxhQUFlLElBQUliLEdBQVk5eUUsTUFBUUEsS0FBSzQ4RixHQUFVLE9BSXRFOXBCLEdBQVlwMEUsVUFBVWl5QyxRQUFVLFdBQzlCLE9BQU8zd0MsS0FBSzJRLE9BQU80c0UsS0FHckJ6SyxHQUFZcDBFLFVBQVU4YSxLQUFPLFNBQVNteUQsR0FDcEMsT0FBTzNyRSxLQUFLMlEsT0FBT2c3RCxHQUFXK2YsUUFHaEM1WSxHQUFZcDBFLFVBQVVzdUYsU0FBVyxTQUFTcmhCLEdBQ3hDLE9BQU8zckUsS0FBSzhuQyxVQUFVdHVCLEtBQUtteUQsSUFHN0JtSCxHQUFZcDBFLFVBQVV5dUYsVUFBWTlNLElBQVMsU0FBU2h2RSxFQUFNaFMsR0FDeEQsTUFBbUIsbUJBQVJnUyxFQUNGLElBQUl5aEUsR0FBWTl5RSxNQUVsQkEsS0FBS3lSLEtBQUksU0FBUzFULEdBQ3ZCLE9BQU9tOUUsR0FBV245RSxFQUFPc1QsRUFBTWhTLFNBSW5DeXpFLEdBQVlwMEUsVUFBVTJCLE9BQVMsU0FBU3NyRSxHQUN0QyxPQUFPM3JFLEtBQUsyUSxPQUFPdytFLEdBQU8vUCxHQUFZelQsTUFHeENtSCxHQUFZcDBFLFVBQVVnQyxNQUFRLFNBQVM4a0MsRUFBT3RlLEdBQzVDc2UsRUFBUWtqRCxHQUFVbGpELEdBRWxCLElBQUlsbUIsRUFBU3RmLEtBQ2IsT0FBSXNmLEVBQU9xMEQsZUFBaUJudUMsRUFBUSxHQUFLdGUsRUFBTSxHQUN0QyxJQUFJNHJELEdBQVl4ekQsSUFFckJrbUIsRUFBUSxFQUNWbG1CLEVBQVNBLEVBQU82MkUsV0FBVzN3RCxHQUNsQkEsSUFDVGxtQixFQUFTQSxFQUFPb0MsS0FBSzhqQixTQXZwaEJ2QnRrQyxJQXlwaEJJZ21CLElBRUY1SCxHQURBNEgsRUFBTXdoRSxHQUFVeGhFLElBQ0QsRUFBSTVILEVBQU82MEUsV0FBV2p0RSxHQUFPNUgsRUFBTzQyRSxLQUFLaHZFLEVBQU1zZSxJQUV6RGxtQixJQUdUd3pELEdBQVlwMEUsVUFBVTAzRixlQUFpQixTQUFTenFCLEdBQzlDLE9BQU8zckUsS0FBSzhuQyxVQUFVdXVELFVBQVUxcUIsR0FBVzdqQyxXQUc3Q2dyQyxHQUFZcDBFLFVBQVV3eEYsUUFBVSxXQUM5QixPQUFPbHdGLEtBQUtrMkYsS0F0bWhCTyxhQTBtaEJyQnBkLEdBQVdoRyxHQUFZcDBFLFdBQVcsU0FBU284QixFQUFNaXFELEdBQy9DLElBQUk4WCxFQUFnQixxQ0FBcUM3MUYsS0FBSys5RSxHQUMxRCtYLEVBQVUsa0JBQWtCOTFGLEtBQUsrOUUsR0FDakNnWSxFQUFhbnFCLEdBQU9rcUIsRUFBVyxRQUF3QixRQUFkL1gsRUFBdUIsUUFBVSxJQUFPQSxHQUNqRmlZLEVBQWVGLEdBQVcsUUFBUTkxRixLQUFLKzlFLEdBRXRDZ1ksSUFHTG5xQixHQUFPbDBFLFVBQVVxbUYsR0FBYyxXQUM3QixJQUFJaG5GLEVBQVFpQyxLQUFLcXpFLFlBQ2JoMEUsRUFBT3k5RixFQUFVLENBQUMsR0FBS244RixVQUN2QnM4RixFQUFTbC9GLGFBQWlCKzBFLEdBQzFCeEgsRUFBV2pzRSxFQUFLLEdBQ2hCNjlGLEVBQVVELEdBQVU3eUUsR0FBUXJzQixHQUU1Qjh1RixFQUFjLFNBQVM5dUYsR0FDekIsSUFBSXVoQixFQUFTeTlFLEVBQVc3OUYsTUFBTTB6RSxHQUFRMUcsR0FBVSxDQUFDbnVFLEdBQVFzQixJQUN6RCxPQUFReTlGLEdBQVcxcEIsRUFBWTl6RCxFQUFPLEdBQUtBLEdBR3pDNDlFLEdBQVdMLEdBQW9DLG1CQUFadnhCLEdBQTZDLEdBQW5CQSxFQUFTanBFLFNBRXhFNDZGLEVBQVNDLEdBQVUsR0FFckIsSUFBSTlwQixFQUFXcHpFLEtBQUt1ekUsVUFDaEI0cEIsSUFBYW45RixLQUFLc3pFLFlBQVlqeEUsT0FDOUIrNkYsRUFBY0osSUFBaUI1cEIsRUFDL0JpcUIsRUFBV0osSUFBV0UsRUFFMUIsSUFBS0gsR0FBZ0JFLEVBQVMsQ0FDNUJuL0YsRUFBUXMvRixFQUFXdC9GLEVBQVEsSUFBSSswRSxHQUFZOXlFLE1BQzNDLElBQUlzZixFQUFTd2IsRUFBSzU3QixNQUFNbkIsRUFBT3NCLEdBRS9CLE9BREFpZ0IsRUFBT2cwRCxZQUFZbHhFLEtBQUssQ0FBRSxLQUFRd2pGLEdBQU0sS0FBUSxDQUFDaUgsR0FBYyxhQTFzaEJuRTNyRixJQTJzaEJXLElBQUk2eEUsR0FBY3p6RCxFQUFROHpELEdBRW5DLE9BQUlncUIsR0FBZUMsRUFDVnZpRSxFQUFLNTdCLE1BQU1jLEtBQU1YLElBRTFCaWdCLEVBQVN0ZixLQUFLNGxGLEtBQUtpSCxHQUNadVEsRUFBZU4sRUFBVXg5RSxFQUFPdmhCLFFBQVEsR0FBS3VoQixFQUFPdmhCLFFBQVd1aEIsUUFLMUVrc0QsR0FBVSxDQUFDLE1BQU8sT0FBUSxRQUFTLE9BQVEsU0FBVSxZQUFZLFNBQVN1WixHQUN4RSxJQUFJanFELEVBQU95MEMsR0FBV3dWLEdBQ2xCdVksRUFBWSwwQkFBMEJ0MkYsS0FBSys5RSxHQUFjLE1BQVEsT0FDakVpWSxFQUFlLGtCQUFrQmgyRixLQUFLKzlFLEdBRTFDblMsR0FBT2wwRSxVQUFVcW1GLEdBQWMsV0FDN0IsSUFBSTFsRixFQUFPc0IsVUFDWCxHQUFJcThGLElBQWlCaDlGLEtBQUt1ekUsVUFBVyxDQUNuQyxJQUFJeDFFLEVBQVFpQyxLQUFLakMsUUFDakIsT0FBTys4QixFQUFLNTdCLE1BQU1rckIsR0FBUXJzQixHQUFTQSxFQUFRLEdBQUlzQixHQUVqRCxPQUFPVyxLQUFLczlGLElBQVcsU0FBU3YvRixHQUM5QixPQUFPKzhCLEVBQUs1N0IsTUFBTWtyQixHQUFRcnNCLEdBQVNBLEVBQVEsR0FBSXNCLFVBTXJEeTVFLEdBQVdoRyxHQUFZcDBFLFdBQVcsU0FBU284QixFQUFNaXFELEdBQy9DLElBQUlnWSxFQUFhbnFCLEdBQU9tUyxHQUN4QixHQUFJZ1ksRUFBWSxDQUNkLElBQUkxK0YsRUFBTTArRixFQUFXMS9GLEtBQU8sR0FDdkJzQixHQUFlMUIsS0FBS2cxRSxHQUFXNXpFLEtBQ2xDNHpFLEdBQVU1ekUsR0FBTyxJQUVuQjR6RSxHQUFVNXpFLEdBQUsrRCxLQUFLLENBQUUsS0FBUTJpRixFQUFZLEtBQVFnWSxRQUl0RDlxQixHQUFVa1UsUUFudmhCUmpsRixFQWlDcUIsR0FrdGhCK0I3RCxNQUFRLENBQUMsQ0FDN0QsS0FBUSxVQUNSLFVBcnZoQkE2RCxJQXl2aEJGNHhFLEdBQVlwMEUsVUFBVXc3QixNQWg5ZHRCLFdBQ0UsSUFBSTVhLEVBQVMsSUFBSXd6RCxHQUFZOXlFLEtBQUtxekUsYUFPbEMsT0FOQS96RCxFQUFPZzBELFlBQWM4QixHQUFVcDFFLEtBQUtzekUsYUFDcENoMEQsRUFBT28wRCxRQUFVMXpFLEtBQUswekUsUUFDdEJwMEQsRUFBT3EwRCxhQUFlM3pFLEtBQUsyekUsYUFDM0JyMEQsRUFBT3MwRCxjQUFnQndCLEdBQVVwMUUsS0FBSzR6RSxlQUN0Q3QwRCxFQUFPdTBELGNBQWdCN3pFLEtBQUs2ekUsY0FDNUJ2MEQsRUFBT3cwRCxVQUFZc0IsR0FBVXAxRSxLQUFLOHpFLFdBQzNCeDBELEdBeThkVHd6RCxHQUFZcDBFLFVBQVVvcEMsUUE5N2R0QixXQUNFLEdBQUk5bkMsS0FBSzJ6RSxhQUFjLENBQ3JCLElBQUlyMEQsRUFBUyxJQUFJd3pELEdBQVk5eUUsTUFDN0JzZixFQUFPbzBELFNBQVcsRUFDbEJwMEQsRUFBT3EwRCxjQUFlLE9BRXRCcjBELEVBQVN0ZixLQUFLazZCLFNBQ1B3NUMsVUFBWSxFQUVyQixPQUFPcDBELEdBczdkVHd6RCxHQUFZcDBFLFVBQVVYLE1BMzZkdEIsV0FDRSxJQUFJcUosRUFBUXBILEtBQUtxekUsWUFBWXQxRSxRQUN6QjZsRSxFQUFNNWpFLEtBQUswekUsUUFDWGUsRUFBUXJxRCxHQUFRaGpCLEdBQ2hCbTJGLEVBQVUzNUIsRUFBTSxFQUNoQjZsQixFQUFZaFYsRUFBUXJ0RSxFQUFNL0UsT0FBUyxFQUNuQ3FNLEVBOHBJTixTQUFpQjgyQixFQUFPdGUsRUFBS21vRSxHQUMzQixJQUFJanFGLEdBQVMsRUFDVC9DLEVBQVNndEYsRUFBV2h0RixPQUV4QixPQUFTK0MsRUFBUS9DLEdBQVEsQ0FDdkIsSUFBSW9tQixFQUFPNG1FLEVBQVdqcUYsR0FDbEJ1TixFQUFPOFYsRUFBSzlWLEtBRWhCLE9BQVE4VixFQUFLN21CLE1BQ1gsSUFBSyxPQUFhNGpDLEdBQVM3eUIsRUFBTSxNQUNqQyxJQUFLLFlBQWF1VSxHQUFPdlUsRUFBTSxNQUMvQixJQUFLLE9BQWF1VSxFQUFNc3FELEdBQVV0cUQsRUFBS3NlLEVBQVE3eUIsR0FBTyxNQUN0RCxJQUFLLFlBQWE2eUIsRUFBUStyQyxHQUFVL3JDLEVBQU90ZSxFQUFNdlUsSUFHckQsTUFBTyxDQUFFLE1BQVM2eUIsRUFBTyxJQUFPdGUsR0E3cUlyQnMyRSxDQUFRLEVBQUcvVCxFQUFXenBGLEtBQUs4ekUsV0FDbEN0dUMsRUFBUTkyQixFQUFLODJCLE1BQ2J0ZSxFQUFNeFksRUFBS3dZLElBQ1g3a0IsRUFBUzZrQixFQUFNc2UsRUFDZnBnQyxFQUFRbTRGLEVBQVVyMkUsRUFBT3NlLEVBQVEsRUFDakMwNUMsRUFBWWwvRSxLQUFLNHpFLGNBQ2pCNnBCLEVBQWF2ZSxFQUFVNzhFLE9BQ3ZCd3BFLEVBQVcsRUFDWDZ4QixFQUFZbHNCLEdBQVVudkUsRUFBUXJDLEtBQUs2ekUsZUFFdkMsSUFBS1ksSUFBVzhvQixHQUFXOVQsR0FBYXBuRixHQUFVcTdGLEdBQWFyN0YsRUFDN0QsT0FBT21nRixHQUFpQnA3RSxFQUFPcEgsS0FBS3N6RSxhQUV0QyxJQUFJaDBELEVBQVMsR0FFYmc1RCxFQUNBLEtBQU9qMkUsS0FBWXdwRSxFQUFXNnhCLEdBQVcsQ0FNdkMsSUFIQSxJQUFJQyxHQUFhLEVBQ2I1L0YsRUFBUXFKLEVBSFpoQyxHQUFTdytELEtBS0ErNUIsRUFBWUYsR0FBWSxDQUMvQixJQUFJaDFFLEVBQU95MkQsRUFBVXllLEdBQ2pCcnlCLEVBQVc3aUQsRUFBSzZpRCxTQUNoQjFwRSxFQUFPNm1CLEVBQUs3bUIsS0FDWjIyRSxFQUFXak4sRUFBU3Z0RSxHQUV4QixHQTd6RFksR0E2ekRSNkQsRUFDRjdELEVBQVF3NkUsT0FDSCxJQUFLQSxFQUFVLENBQ3BCLEdBajBEYSxHQWkwRFQzMkUsRUFDRixTQUFTMDJFLEVBRVQsTUFBTUEsR0FJWmg1RCxFQUFPdXNELEtBQWM5dEUsRUFFdkIsT0FBT3VoQixHQWc0ZFRzekQsR0FBT2wwRSxVQUFVMDBCLEdBQUswNUQsR0FDdEJsYSxHQUFPbDBFLFVBQVVrdUYsTUExaVFqQixXQUNFLE9BQU9BLEdBQU01c0YsT0EwaVFmNHlFLEdBQU9sMEUsVUFBVWsvRixPQTdnUWpCLFdBQ0UsT0FBTyxJQUFJN3FCLEdBQWMveUUsS0FBS2pDLFFBQVNpQyxLQUFLdXpFLFlBNmdROUNYLEdBQU9sMEUsVUFBVWd3QixLQXAvUGpCLGdCQTd3UkV4dEIsSUE4d1JJbEIsS0FBS3l6RSxhQUNQenpFLEtBQUt5ekUsV0FBYXljLEdBQVFsd0YsS0FBS2pDLFVBRWpDLElBQUlxb0MsRUFBT3BtQyxLQUFLd3pFLFdBQWF4ekUsS0FBS3l6RSxXQUFXcHhFLE9BRzdDLE1BQU8sQ0FBRSxLQUFRK2pDLEVBQU0sTUFGWEEsT0FseFJabGxDLEVBa3hSK0JsQixLQUFLeXpFLFdBQVd6ekUsS0FBS3d6RSxlQWcvUHREWixHQUFPbDBFLFVBQVV3bkYsTUE3N1BqQixTQUFzQm5vRixHQUlwQixJQUhBLElBQUl1aEIsRUFDQTVQLEVBQVMxUCxLQUVOMFAsYUFBa0J5akUsSUFBWSxDQUNuQyxJQUFJajVDLEVBQVE4NEMsR0FBYXRqRSxHQUN6QndxQixFQUFNczVDLFVBQVksRUFDbEJ0NUMsRUFBTXU1QyxnQkE1MFJSdnlFLEVBNjBSTW9lLEVBQ0ZxSixFQUFTMHFELFlBQWNuNUMsRUFFdkI1YSxFQUFTNGEsRUFFWCxJQUFJdlIsRUFBV3VSLEVBQ2Z4cUIsRUFBU0EsRUFBTzJqRSxZQUdsQixPQURBMXFELEVBQVMwcUQsWUFBY3QxRSxFQUNoQnVoQixHQTY2UFRzekQsR0FBT2wwRSxVQUFVb3BDLFFBdDVQakIsV0FDRSxJQUFJL3BDLEVBQVFpQyxLQUFLcXpFLFlBQ2pCLEdBQUl0MUUsYUFBaUIrMEUsR0FBYSxDQUNoQyxJQUFJNXZFLEVBQVVuRixFQVVkLE9BVElpQyxLQUFLc3pFLFlBQVlqeEUsU0FDbkJhLEVBQVUsSUFBSTR2RSxHQUFZOXlFLFFBRTVCa0QsRUFBVUEsRUFBUTRrQyxXQUNWd3JDLFlBQVlseEUsS0FBSyxDQUN2QixLQUFRd2pGLEdBQ1IsS0FBUSxDQUFDOTlDLElBQ1QsYUF4M1JKNW1DLElBMDNSUyxJQUFJNnhFLEdBQWM3dkUsRUFBU2xELEtBQUt1ekUsV0FFekMsT0FBT3Z6RSxLQUFLNGxGLEtBQUs5OUMsS0F3NFBuQjhxQyxHQUFPbDBFLFVBQVUwNUMsT0FBU3c2QixHQUFPbDBFLFVBQVVnMEUsUUFBVUUsR0FBT2wwRSxVQUFVWCxNQXYzUHRFLFdBQ0UsT0FBT3lrRixHQUFpQnhpRixLQUFLcXpFLFlBQWFyekUsS0FBS3N6RSxjQXkzUGpEVixHQUFPbDBFLFVBQVVzcEIsTUFBUTRxRCxHQUFPbDBFLFVBQVVndEYsS0FFdENsYixLQUNGb0MsR0FBT2wwRSxVQUFVOHhFLElBaitQbkIsV0FDRSxPQUFPeHdFLE9BaytQRjR5RSxHQU1EdkQsR0FRTnJtQyxHQUFLOVEsRUFBSUEsUUExeGhCUGgzQixLQTh4aEJGLGFBQ0UsT0FBT2czQixJQUNSLGdDQWFIajdCLEtBQUsrQyxROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM3doQlAsU0FBUzY5RixFQUFlL1YsR0FFdkIsSUFBSWdXLEVBQVEsT0FFWixHQUFLaitGLE1BQU11YyxTQUFTMHJFLElBQ25CZ1csRUFBUWhXLE9BRVIsT0FBT0EsR0FDTixLQUFLLEVBQUdnVyxFQUFRLElBQUssTUFDckIsS0FBSyxFQUFHQSxFQUFRLEtBQU0sTUFDdEIsS0FBSyxFQUFHQSxFQUFRLE1BQU8sTUFDdkIsS0FBSyxFQUFHQSxFQUFRLE9BQVEsTUFDeEIsS0FBSyxFQUFHQSxFQUFRLFFBQVMsTUFDekIsS0FBSyxFQUFHQSxFQUFRLFNBQVUsTUFDMUIsS0FBSyxFQUFHQSxFQUFRLFVBQVcsTUFDM0IsS0FBSyxFQUFHQSxFQUFRLFdBQVksTUFDNUIsS0FBSyxFQUFHQSxFQUFRLFlBQWEsTUFDN0IsS0FBSyxHQUFJQSxFQUFRLGFBQWMsTUFDL0IsS0FBSyxHQUFJQSxFQUFRLGNBQWUsTUFDaEMsS0FBSyxHQUFJQSxFQUFRLGVBS25CLElBREEsSUFBSTM0RixFQUFRLENBQUMsTUFDTDQ0RixFQUFHLEVBQUVBLEVBQUcsSUFBSUEsSUFDbkI1NEYsRUFBTS9DLEtBQUsrQyxFQUFNNDRGLEdBQUlELEdBRXRCLE9BQU8zNEYsRUFHUixTQUFTNjRGLElBQ1JoK0YsS0FBSzhuRixLQUFPLE9BQ1o5bkYsS0FBS21GLE1BQVEwNEYsRUFBZTc5RixLQUFLOG5GLE1BdUhsQyxTQUFTbVcsRUFBV2g0RSxFQUFLaTRFLEdBQ3hCLE9BQVFBLEdBQW9CajRFLEVBQUlqUCxRQUFRLE1BQU0sSUFBSTNVLE9BQVM0akIsRUFBSWpQLFFBQVEsTUFBTSxJQUFJM1UsUUFHbEYsU0FBUzg3RixFQUFVbDRFLEVBQUttNEUsR0FFdkIsT0FBT240RSxFQUFJalAsUUFBUSxVQUFVLEtBRXpCQSxRQUFRLFVBQVUsT0FBT29uRixFQUFJQSxFQUFJLFFBQ2pDcG5GLFFBQVEsY0FBYyxPQUFPb25GLEVBQUksWUFDakNwbkYsUUFBUSxXQUFXLE9BQU9vbkYsRUFBSSxTQUM5QnBuRixRQUFRLFdBQVcsT0FBT29uRixFQUFJLFNBQzlCcG5GLFFBQVEsVUFBVSxPQUFPb25GLEVBQUksUUFDN0JwbkYsUUFBUSxXQUFXLGFBQ25CQSxRQUFRLG1CQUFtQixpQkFDM0JBLFFBQVEsYUFBYSxlQUVyQkEsUUFBUSxTQUFTLFFBRWpCQSxRQUFRLFdBQVcsYUFDbkJBLFFBQVEsd0JBQXdCLG1CQUNoQ0EsUUFBUSx3QkFBd0IsbUJBQ2hDQSxRQUFRLHVCQUF1QixrQkFDL0JBLFFBQVEsd0JBQXdCLG1CQUVoQ0EsUUFBUSxTQUFTLE9BQU9vbkYsRUFBSSxPQUM1QnBuRixRQUFRLFNBQVMsT0FBT29uRixFQUFJQSxFQUFJLE9BQ2hDcG5GLFFBQVEsbUJBQW1CLGlCQUMzQkEsUUFBUSxXQUFXLE9BQU9vbkYsRUFBSSxTQUU5QnBuRixRQUFRLG9CQUFvQixnQkFDNUJBLFFBQVEsb0JBQW9CLGdCQUU1QkEsUUFBUSxXQUFXLFlBQVlvbkYsR0FDL0JwbkYsUUFBUSxZQUFZLGlCQUNwQkEsUUFBUSxZQUFZLGNBQ3BCQSxRQUFRLFdBQVcsT0FBT29uRixFQUFJLFNBQzlCcG5GLFFBQVEsWUFBWSxjQUNwQkEsUUFBUSxXQUFXLGFBS25CQSxRQUFRLFVBQVUsU0FDbEJBLFFBQVEsU0FBUyxRQUNqQkEsUUFBUSxVQUFVLFNBQ2xCQSxRQUFRLFdBQVcsVUFDbkJBLFFBQVEsZUFBZSxjQUN2QkEsUUFBUSxhQUFhLFlBQ3JCQSxRQUFRLFVBQVUsU0FDbEJBLFFBQVEsV0FBVyxVQUNuQkEsUUFBUSxXQUFXLFVBQ25CQSxRQUFRLGtCQUFrQixXQUMxQkEsUUFBUSxrQkFBa0IsV0FDMUJBLFFBQVEsVUFBVSxTQUVsQkEsUUFBUSxZQUFZLFFBQ3BCMlcsTUFBTSxRQTdLWHF3RSxFQUFXdC9GLFVBQVUyL0YsSUFBTSxTQUFTaG5GLEVBQUt5d0UsR0FFeEMsSUFBSXdXLEVBQUtqbkYsRUFBS0wsUUFBUSxZQUFZLE1BQzdCQSxRQUFRLEtBQUssU0FDYkEsUUFBUSxjQUFjLGNBQ3RCQSxRQUFRLGNBQWMsY0FDdEIyVyxNQUFNLFFBQ1ZocEIsRUFBTTI1RixFQUFHajhGLE9BQ1RrOEYsR0FBWSxFQUNaQyxFQUFPLEVBQ1B2NEUsRUFBTSxHQUNOODNFLEVBQUssRUFDTDU0RixFQUFRMmlGLEVBQU8rVixFQUFlL1YsR0FBUTluRixLQUFLbUYsTUFFM0MsSUFBSTQ0RixFQUFHLEVBQUVBLEVBQUdwNUYsRUFBSW81RixJQUVaTyxFQUFHUCxHQUFJOTFGLE9BQU8sT0FBUyxHQUN6QmdlLEdBQU85Z0IsRUFBTXE1RixHQUFNRixFQUFHUCxHQUN0QlEsR0FBWSxHQUVURCxFQUFHUCxHQUFJOTFGLE9BQU8sUUFBVSxHQUFLcTJGLEVBQUdQLEdBQUk5MUYsT0FBTyxRQUFVLEdBQUtxMkYsRUFBR1AsR0FBSTkxRixPQUFPLGFBQWUsS0FDekZzMkYsR0FBWSxJQUlYRCxFQUFHUCxHQUFJOTFGLE9BQU8sUUFBVSxHQUFLcTJGLEVBQUdQLEdBQUk5MUYsT0FBTyxRQUFVLEdBQ3ZEZ2UsR0FBT3E0RSxFQUFHUCxHQUNWUSxHQUFZLEdBR1QsT0FBT244RCxLQUFLazhELEVBQUdQLEVBQUcsS0FBTyxTQUFTMzdELEtBQUtrOEQsRUFBR1AsS0FDN0MsaUJBQWlCMzdELEtBQUtrOEQsRUFBR1AsRUFBRyxLQUFPLG1CQUFtQjM3RCxLQUFLazhELEVBQUdQLElBQUssR0FBRy9tRixRQUFRLElBQUksS0FDbEZpUCxHQUFPcTRFLEVBQUdQLEdBQ05RLEdBQVdDLEtBR2JGLEVBQUdQLEdBQUk5MUYsT0FBTyxRQUFVLElBQThCLEdBQXpCcTJGLEVBQUdQLEdBQUk5MUYsT0FBTyxTQUF5QyxHQUF6QnEyRixFQUFHUCxHQUFJOTFGLE9BQU8sT0FDM0VnZSxFQUFpREEsR0FBMUNzNEUsRUFBaURELEVBQUdQLEdBQWpDNTRGLEVBQU1xNUYsS0FBUUYsRUFBR1AsR0FHekNPLEVBQUdQLEdBQUk5MUYsT0FBTyxRQUFVLEdBQUtxMkYsRUFBR1AsR0FBSTkxRixPQUFPLFFBQVUsRUFDdkRnZSxFQUErQ0EsR0FBeENzNEUsRUFBK0NELEVBQUdQLEdBQS9CNTRGLEVBQU1xNUYsR0FBTUYsRUFBR1AsR0FHdkNPLEVBQUdQLEdBQUk5MUYsT0FBTyxRQUFVLEVBQzFCZ2UsRUFBaURBLEdBQTFDczRFLEVBQWlERCxFQUFHUCxHQUFqQzU0RixJQUFRcTVGLEdBQU1GLEVBQUdQLEdBR3pDTyxFQUFHUCxHQUFJOTFGLE9BQU8sUUFBVSxFQUMxQmdlLEVBQStDQSxHQUF4Q3M0RSxFQUErQ0QsRUFBR1AsR0FBL0I1NEYsRUFBTXE1RixHQUFNRixFQUFHUCxHQUd2Q08sRUFBR1AsR0FBSTkxRixPQUFPLFFBQVUsR0FJdkJxMkYsRUFBR1AsR0FBSTkxRixPQUFPLFlBQWMsR0FBTXEyRixFQUFHUCxHQUFJOTFGLE9BQU8sWUFBYyxFQUhqRWdlLEdBQU85Z0IsRUFBTXE1RixHQUFNRixFQUFHUCxHQVF0QjkzRSxHQUFPcTRFLEVBQUdQLEdBSWIsTUFBbUIsTUFBVjkzRSxFQUFJLEdBQWNBLEVBQUl2bEIsTUFBTSxHQUFLdWxCLEdBRzNDKzNFLEVBQVd0L0YsVUFBVXFoRCxLQUFPLFNBQVMxb0MsRUFBS3l3RSxHQUVyQ0EsRUFBT0EsR0FBYzluRixLQUFLOG5GLEtBRTlCLE1BQW9CLG9CQUFUNzhFLEtBQThCb00sRUFFcEIsaUJBQVRBLEVBQTJCcE0sS0FBS00sVUFBVU4sS0FBS0MsTUFBTW1NLEdBQU8sS0FBTXl3RSxHQUN6RCxpQkFBVHp3RSxFQUEyQnBNLEtBQUtNLFVBQVU4TCxFQUFNLEtBQU15d0UsR0FFM0R6d0UsR0FHUjJtRixFQUFXdC9GLFVBQVUrL0YsSUFBTSxTQUFTcG5GLEVBQU15d0UsR0FFekMsSUFBSXdXLEVBQUtqbkYsRUFBS0wsUUFBUSxVQUFVLEtBQzVCQSxRQUFRLE1BQU0sU0FDZEEsUUFBUSxNQUFNLGFBQ2RBLFFBQVEsTUFBTSxTQUNkQSxRQUFRLFFBQVEsVUFDaEJBLFFBQVEsUUFBUSxVQUNoQkEsUUFBUSxrQkFBa0IsUUFDMUIyVyxNQUFNLFFBQ1RocEIsRUFBTTI1RixFQUFHajhGLE9BQ1RtOEYsRUFBTyxFQUNQdjRFLEVBQU0sR0FDTjgzRSxFQUFLLEVBQ0w1NEYsRUFBUTJpRixFQUFPK1YsRUFBZS9WLEdBQVE5bkYsS0FBS21GLE1BRTNDLElBQUk0NEYsRUFBRyxFQUFFQSxFQUFHcDVGLEVBQUlvNUYsSUFFWCxLQUFLMzdELEtBQUtrOEQsRUFBR1AsSUFDaEI5M0UsR0FBTzlnQixFQUFNcTVGLEtBQVFGLEVBQUdQLEdBRXJCLEtBQUszN0QsS0FBS2s4RCxFQUFHUCxJQUNoQjkzRSxHQUFPOWdCLElBQVFxNUYsR0FBTUYsRUFBR1AsSUFFckIsT0FBTzM3RCxLQUFLazhELEVBQUdQLElBQ2xCOTNFLEdBQU85Z0IsRUFBTXE1RixHQUFNRixFQUFHUCxJQU14QixPQUFPOTNFLEVBQUlqUCxRQUFRLFVBQVUsS0FpRS9CZ25GLEVBQVd0L0YsVUFBVWdnRyxJQUFNLFNBQVNybkYsRUFBS3l3RSxHQUV4QyxJQUFJNlcsRUFBY3RuRixFQUFLTCxRQUFRLFVBQVUsS0FDbENBLFFBQVEsT0FBTyxTQUNmMlcsTUFBTSxRQUNaaHBCLEVBQU1nNkYsRUFBWXQ4RixPQUNsQmk4RixFQUFLLEdBQ0xFLEVBQU8sRUFDUEosRUFBTXArRixLQUFLOG5GLEtBR1hvVyxFQUFtQixFQUNuQmo0RSxFQUFNLEdBQ044M0UsRUFBSyxFQUNMNTRGLEVBQVEyaUYsRUFBTytWLEVBQWUvVixHQUFROW5GLEtBQUttRixNQUUzQyxJQUFJNDRGLEVBQUcsRUFBRUEsRUFBR3A1RixFQUFJbzVGLElBRWRPLEVBREVQLEVBQUcsRUFDQU8sRUFBRzUrRixPQUFPaS9GLEVBQVlaLElBRXRCTyxFQUFHNStGLE9BQU95K0YsRUFBVVEsRUFBWVosR0FBS0ssSUFLNUMsSUFEQXo1RixFQUFNMjVGLEVBQUdqOEYsT0FDTDA3RixFQUFHLEVBQUVBLEVBQUdwNUYsRUFBSW81RixJQUFNLENBRXJCRyxFQUFtQkQsRUFBV0ssRUFBR1AsR0FBS0csR0FFbEMsMkJBQTJCOTdELEtBQUtrOEQsRUFBR1AsTUFDdENPLEVBQUdQLEdBQU1PLEVBQUdQLEdBQUkvbUYsUUFBUSxNQUFNLE1BQU1vbkYsRUFBSUEsSUFHckMsd0JBQXdCaDhELEtBQUtrOEQsRUFBR1AsTUFDbkNPLEVBQUdQLEdBQU1PLEVBQUdQLEdBQUkvbUYsUUFBUSxNQUFNLE1BQU1vbkYsRUFBSUEsSUFHckMsNkJBQTZCaDhELEtBQUtrOEQsRUFBR1AsSUFFeEM5M0UsR0FBTzlnQixJQURQcTVGLEdBQ21CRixFQUFHUCxHQUVuQixLQUFLMzdELEtBQUtrOEQsRUFBR1AsS0FDYkcsRUFBaUIsR0FBS00sR0FDeEJBLElBRUR2NEUsR0FBT3E0RSxFQUFHUCxLQUdWOTNFLEdBQU85Z0IsRUFBTXE1RixHQUFNRixFQUFHUCxHQUNuQkcsRUFBaUIsR0FBS00sR0FDeEJBLEtBT0gsT0FEQXY0RSxFQUFNQSxFQUFJalAsUUFBUSxVQUFVLElBQUlBLFFBQVEsVUFBVSxPQUtwRGduRixFQUFXdC9GLFVBQVVrZ0csT0FBUyxTQUFTdm5GLEVBQU13bkYsR0FLNUMsT0FIVUEsRUFBbUJ4bkYsRUFDbEJBLEVBQUtMLFFBQVEseURBQXlELElBQ3ZFQSxRQUFRLHNCQUF1QixXQUM3QkEsUUFBUSxZQUFZLE9BR2pDZ25GLEVBQVd0L0YsVUFBVW9nRyxRQUFVLFNBQVN6bkYsR0FFdkMsTUFBb0Isb0JBQVRwTSxLQUE4Qm9NLEVBRWxDcE0sS0FBS00sVUFBVU4sS0FBS0MsTUFBTW1NLEdBQU8sS0FBTSxJQUkvQzJtRixFQUFXdC9GLFVBQVVxZ0csT0FBUyxTQUFTMW5GLEVBQU13bkYsR0FLNUMsT0FIVUEsRUFBbUJ4bkYsRUFDbEJBLEVBQUtMLFFBQVEsK0NBQStDLEtBRTVEQSxRQUFRLFVBQVUsS0FDeEJBLFFBQVEsWUFBWSxLQUNwQkEsUUFBUSxZQUFZLEtBQ3BCQSxRQUFRLFlBQVksS0FDcEJBLFFBQVEsY0FBYyxNQUN0QkEsUUFBUSxjQUFjLE9BRzVCZ25GLEVBQVd0L0YsVUFBVXNnRyxPQUFTLFNBQVMzbkYsR0FDdEMsT0FBT0EsRUFBS0wsUUFBUSxVQUFVLEtBQUtBLFFBQVEsV0FBVyxLQUFLQSxRQUFRLFdBQVcsTUFHL0VuYSxFQUFPRCxRQUFVLElBQUlvaEcsRyxtSUM5VlIsRUFBQTVrRixlQUNYLHM4RUE2RVcsRUFBQUMsY0FBZ0Isc1JBV2hCLEVBQUFDLFdBQWEsd1IsNkdDcEYxQixtQ0FDUTFRLE9BQU9xMkYsUUFBUSw0RkFDbkIxMkYsU0FBU0MsZUFBZSxRQUFRc1YsVSx5R0NQcEMsYUFHQSxPQUNBLFFBQ0EsUUFHQSwwQkFPRSxZQUFhdlAsRUFBb0JqQixHQTZCakMsS0FBQXpNLFNBQVkyYSxJQUdWLE1BQU0xVCxFQUFLOUgsS0FBS3NOLE1BQU14RixHQUNoQis1QyxHQUFTLElBQUFqK0IsaUJBQWdCcEksRUFBSXFJLFFBQVNySSxFQUFJc0ksU0FDMUN6TixFQUE0QixDQUNoQ0MsT0FBUSxRQUNSQyxNQUFPLENBQ0xDLFVBQVcxTyxFQUNYeUwsRUFBR3N1QyxFQUFPdHVDLElBSWR2VCxLQUFLdU8sU0FBU21JLEtBQUtMLEVBQWNyVyxLQUFLdU8sU0FBU0csS0FBS0MscUJBQXFCZ0ksS0FBS3ZJLE1BQU9rUixJQUMvRUEsVUFDSXRmLEtBQUt1TyxTQUFTc0ksdUJBQ3BCbFAsRUFBYThCLGtCQUFrQiwwQkFBMkIsWUFFNUQsTUFBTThELEVBQWMsSUFBSSxVQUFZdk4sS0FBS3VPLFNBQVUsVUFDbkR2TyxLQUFLay9GLGdCQUNMLElBQUF0eUYsV0FBVSxDQUFDckUsU0FBU2lILGNBQWMsSUFBSTFILElBQVE5SCxLQUFLdU8sU0FBVWhCLEdBRTdELE1BQU11UixFQUFXdlcsU0FBU0MsZUFBZSxZQUNyQ3NXLElBQ0ZBLEVBQVMzVixVQUFZLEdBQ3JCMlYsRUFBU3BTLGNBQWN6RCxVQUFVQyxJQUFJLGVBR3hDNUssS0FBSzBCLE1BR1IsS0FBQXVYLGlCQUFvQmlFLElBQ0YsV0FBWkEsRUFBSW5kLElBQ04yQixLQUFLay9GLGVBQ2dCLFVBQVoxakYsRUFBSW5kLEtBQ2JrSyxTQUFTa1EsS0FBS3pVLG9CQUFvQixRQUFTaEUsS0FBS2EsUUFBUyxDQUFFcytGLFNBQVMsTUFFckU3Z0csS0FBSzBCLE1BR1IsS0FBQW8vRixrQkFBcUI1akYsSUFFb0IsT0FEeEJBLEVBQUlyYyxPQUNSK08sUUFBUSxrQkFDakJsTyxLQUFLay9GLGVBQ0wzMkYsU0FBU2tRLEtBQUt6VSxvQkFBb0IsUUFBU2hFLEtBQUthLFFBQVMsQ0FBRXMrRixTQUFTLE9BRXJFN2dHLEtBQUswQixNQUdSLEtBQUFxL0YsY0FBaUI3akYsSUFDQyxVQUFaQSxFQUFJbmQsS0FDTmtLLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFFBQVM3RCxLQUFLYSxRQUFTLENBQUVzK0YsU0FBUyxNQUVsRTdnRyxLQUFLMEIsTUFqRk5BLEtBQUt1TyxTQUFXQSxFQUNoQnZPLEtBQUtzTixNQUFRQSxFQU1mLGFBQ0V0TixLQUFLay9GLGVBRUwzMkYsU0FBU2tRLEtBQUs1VSxpQkFBaUIsUUFBUzdELEtBQUthLFFBQVMsQ0FBRXMrRixTQUFTLElBR2pFNTJGLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFVBQVc3RCxLQUFLdVgsaUJBQy9DaFAsU0FBU2tRLEtBQUs1VSxpQkFBaUIsUUFBUzdELEtBQUtxL0YsY0FDN0M5MkYsU0FBU2tRLEtBQUs1VSxpQkFBaUIsUUFBUzdELEtBQUtvL0Ysa0JBRTdDejNGLEVBQWE4QixrQkFBa0Isd0JBR2pDLGVBQ0VsQixTQUFTa1EsS0FBS3pVLG9CQUFvQixVQUFXaEUsS0FBS3VYLGlCQUNsRGhQLFNBQVNrUSxLQUFLelUsb0JBQW9CLFFBQVNoRSxLQUFLcS9GLGNBQ2hEOTJGLFNBQVNrUSxLQUFLelUsb0JBQW9CLFFBQVNoRSxLQUFLby9GLGtCQUNoRDcyRixTQUFTa1EsS0FBS3pVLG9CQUFvQixRQUFTaEUsS0FBS2EsUUFBUyxDQUFFcytGLFNBQVMsTyx5R0N4Q3hFLGFBS0EsMEJBT0UsWUFBYTV3RixFQUFvQi9CLEdBNkJqQyxLQUFBM0wsU0FBWTJhLElBQ1YsTUFPTW5GLEVBQWlDLENBQ3JDQyxPQUFRLGFBQ1JDLE1BQU8sQ0FDTEMsVUFWT3hXLEtBQUt3TSxNQUFNMUUsR0FXbEJ3M0YsS0FQUTlqRixFQUFJcmMsT0FBdUJ1TixjQUN2QjVFLEtBVWhCOUgsS0FBS3VPLFNBQVNtSSxLQUFLTCxFQUFjclcsS0FBS3VPLFNBQVNHLEtBQUtDLHFCQUFxQmdJLEtBQUt2SSxNQUFPa1IsSUFDL0VBLFNBQ0l0ZixLQUFLdU8sU0FBU3NJLHVCQUNwQmxQLEVBQWE4QixrQkFBa0IsMEJBQTJCLG1CQUdwRHpKLEtBQUt1TyxTQUFTc0ksdUJBQ3BCbFAsRUFBYThCLGtCQUFrQixzQkFBdUIsVUFJeER6SixLQUFLay9GLG1CQU9ONWdHLEtBQUswQixNQUdSLEtBQUF1WCxpQkFBb0JpRSxJQUNGLFdBQVpBLEVBQUluZCxJQUNOMkIsS0FBS2svRixlQUNnQixVQUFaMWpGLEVBQUluZCxLQUNia0ssU0FBU2tRLEtBQUt6VSxvQkFBb0IsUUFBU2hFLEtBQUthLFFBQVMsQ0FBRXMrRixTQUFTLE1BRXJFN2dHLEtBQUswQixNQUdSLEtBQUFvL0Ysa0JBQXFCNWpGLElBRW9CLE9BRHhCQSxFQUFJcmMsT0FDUitPLFFBQVEsa0JBQ2pCbE8sS0FBS2svRixlQUNMMzJGLFNBQVNrUSxLQUFLelUsb0JBQW9CLFFBQVNoRSxLQUFLYSxRQUFTLENBQUVzK0YsU0FBUyxPQUVyRTdnRyxLQUFLMEIsTUFHUixLQUFBcS9GLGNBQWlCN2pGLElBQ0MsVUFBWkEsRUFBSW5kLEtBQ05rSyxTQUFTa1EsS0FBSzVVLGlCQUFpQixRQUFTN0QsS0FBS2EsUUFBUyxDQUFFcytGLFNBQVMsTUFFbEU3Z0csS0FBSzBCLE1BdkZOQSxLQUFLdU8sU0FBV0EsRUFDaEJ2TyxLQUFLd00sTUFBUUEsRUFNZixhQUNFeE0sS0FBS2svRixlQUVMMzJGLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFFBQVM3RCxLQUFLYSxRQUFTLENBQUVzK0YsU0FBUyxJQUdqRTUyRixTQUFTa1EsS0FBSzVVLGlCQUFpQixVQUFXN0QsS0FBS3VYLGlCQUMvQ2hQLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFFBQVM3RCxLQUFLcS9GLGNBQzdDOTJGLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFFBQVM3RCxLQUFLby9GLGtCQUU3Q3ozRixFQUFhOEIsa0JBQWtCLDJDQUdqQyxlQUNFbEIsU0FBU2tRLEtBQUt6VSxvQkFBb0IsVUFBV2hFLEtBQUt1WCxpQkFDbERoUCxTQUFTa1EsS0FBS3pVLG9CQUFvQixRQUFTaEUsS0FBS3EvRixjQUNoRDkyRixTQUFTa1EsS0FBS3pVLG9CQUFvQixRQUFTaEUsS0FBS28vRixrQkFDaEQ3MkYsU0FBU2tRLEtBQUt6VSxvQkFBb0IsUUFBU2hFLEtBQUthLFFBQVMsQ0FBRXMrRixTQUFTLE8sOENDckN4RSxZQUNBdmlHLEVBQVFvSyxLQUFPLFdBQ2IsTUFBd0MsbUJBQTFCcWtELEVBQU9rMEMsZ0JBR3ZCM2lHLEVBQVFxSyxRQUFVLFNBQVU2ekIsR0FDMUIsT0FBTyxXQUNMdXdCLEVBQU9rMEMsZUFBZXprRSxPLGdEQ1AxQixZQUtBLElBQUkwa0UsRUFBV24wQyxFQUFPbzBDLGtCQUFvQnAwQyxFQUFPcTBDLHVCQUVqRDlpRyxFQUFRb0ssS0FBTyxXQUNiLE9BQU93NEYsR0FHVDVpRyxFQUFRcUssUUFBVSxTQUFVMDRGLEdBQzFCLElBQUkva0UsRUFBUyxFQUNUZ2xFLEVBQVcsSUFBSUosRUFBU0csR0FDeEJsMEYsRUFBVTQvQyxFQUFPOWlELFNBQVNzM0YsZUFBZSxJQUk3QyxPQUhBRCxFQUFTRSxRQUFRcjBGLEVBQVMsQ0FDeEJzMEYsZUFBZSxJQUVWLFdBQ0x0MEYsRUFBUWdkLEtBQVFtUyxJQUFXQSxFQUFTLE0sZ0RDbkJ4QyxZQUVBaCtCLEVBQVFvSyxLQUFPLFdBQ2IsT0FBSXFrRCxFQUFPL2xCLG1CQUs2QixJQUExQitsQixFQUFPMjBDLGdCQUd2QnBqRyxFQUFRcUssUUFBVSxTQUFVNnpCLEdBQzFCLElBQUltbEUsRUFBVSxJQUFJNTBDLEVBQU8yMEMsZUFFekIsT0FEQUMsRUFBUUMsTUFBTUMsVUFBWXJsRSxFQUNuQixXQUNMbWxFLEVBQVFHLE1BQU1DLFlBQVksTyxnRENmOUIsWUFFQXpqRyxFQUFRb0ssS0FBTyxXQUNiLE1BQU8sYUFBY3FrRCxHQUFVLHVCQUF3QkEsRUFBTzlpRCxTQUFTUyxjQUFjLFdBR3ZGcE0sRUFBUXFLLFFBQVUsU0FBVTA0RixHQUMxQixPQUFPLFdBSUwsSUFBSVcsRUFBV2oxQyxFQUFPOWlELFNBQVNTLGNBQWMsVUFVN0MsT0FUQXMzRixFQUFTQyxtQkFBcUIsV0FDNUJaLElBRUFXLEVBQVNDLG1CQUFxQixLQUM5QkQsRUFBUzE3RSxXQUFXNDdFLFlBQVlGLEdBQ2hDQSxFQUFXLE1BRWJqMUMsRUFBTzlpRCxTQUFTazRGLGdCQUFnQnhxRSxZQUFZcXFFLEdBRXJDWCxNLCtDQ3BCWC9pRyxFQUFRb0ssS0FBTyxXQUNiLE9BQU8sR0FHVHBLLEVBQVFxSyxRQUFVLFNBQVVqSixHQUMxQixPQUFPLFdBQ0w2SSxXQUFXN0ksRUFBRyxNLDZCQ2dCbEIsSUFBSTBpRyxFQUFXLEVBQVEsSUFDbkJDLEVBQU8sRUFBUSxJQVNuQixTQUFTQyxJQUNQNWdHLEtBQUttdEQsU0FBVyxLQUNoQm50RCxLQUFLNmdHLFFBQVUsS0FDZjdnRyxLQUFLdXRELEtBQU8sS0FDWnZ0RCxLQUFLNHRELEtBQU8sS0FDWjV0RCxLQUFLNnRELEtBQU8sS0FDWjd0RCxLQUFLOGdHLFNBQVcsS0FDaEI5Z0csS0FBSzRuQixLQUFPLEtBQ1o1bkIsS0FBS2lJLE9BQVMsS0FDZGpJLEtBQUsrZ0MsTUFBUSxLQUNiL2dDLEtBQUsrZ0csU0FBVyxLQUNoQi9nRyxLQUFLcVIsS0FBTyxLQUNaclIsS0FBS2doRyxLQUFPLEtBbkJkcGtHLEVBQVFzTyxNQUFRKzFGLEVBQ2hCcmtHLEVBQVF3RCxRQTBaUixTQUFvQnNpQyxFQUFRdytELEdBQzFCLE9BQU9ELEVBQVN2K0QsR0FBUSxHQUFPLEdBQU10aUMsUUFBUThnRyxJQTFaL0N0a0csRUFBUXVrRyxjQWlhUixTQUEwQnorRCxFQUFRdytELEdBQ2hDLE9BQUt4K0QsRUFDRXUrRCxFQUFTditELEdBQVEsR0FBTyxHQUFNeStELGNBQWNELEdBRC9CQSxHQWphdEJ0a0csRUFBUSt2QixPQXNWUixTQUFtQjJCLEdBS2JxeUUsRUFBSzVRLFNBQVN6aEUsS0FBTUEsRUFBTTJ5RSxFQUFTM3lFLElBQ3ZDLE9BQU1BLGFBQWVzeUUsRUFDZHR5RSxFQUFJM0IsU0FEdUJpMEUsRUFBSWxpRyxVQUFVaXVCLE9BQU8xdkIsS0FBS3F4QixJQTFWOUQxeEIsRUFBUWdrRyxJQUFNQSxFQXFCZCxJQUFJUSxFQUFrQixvQkFDbEJDLEVBQWMsV0FHZEMsRUFBb0IscUNBT3BCQyxFQUFTLENBQUMsSUFBSyxJQUFLLElBQUssS0FBTSxJQUFLLEtBQUs3aEcsT0FIaEMsQ0FBQyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssS0FBTSxLQUFNLE9BTS9DOGhHLEVBQWEsQ0FBQyxLQUFNOWhHLE9BQU82aEcsR0FLM0JFLEVBQWUsQ0FBQyxJQUFLLElBQUssSUFBSyxJQUFLLEtBQUsvaEcsT0FBTzhoRyxHQUNoREUsRUFBa0IsQ0FBQyxJQUFLLElBQUssS0FFN0JDLEVBQXNCLHlCQUN0QkMsRUFBb0IsK0JBRXBCQyxFQUFpQixDQUNmLFlBQWMsRUFDZCxlQUFlLEdBR2pCQyxFQUFtQixDQUNqQixZQUFjLEVBQ2QsZUFBZSxHQUdqQkMsRUFBa0IsQ0FDaEIsTUFBUSxFQUNSLE9BQVMsRUFDVCxLQUFPLEVBQ1AsUUFBVSxFQUNWLE1BQVEsRUFDUixTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxHQUVYQyxFQUFjLEVBQVEsSUFFMUIsU0FBU2YsRUFBUzdyRCxFQUFLNnNELEVBQWtCQyxHQUN2QyxHQUFJOXNELEdBQU91ckQsRUFBS3p0QixTQUFTOTlCLElBQVFBLGFBQWV3ckQsRUFBSyxPQUFPeHJELEVBRTVELElBQUkrc0QsRUFBSSxJQUFJdkIsRUFFWixPQURBdUIsRUFBRWozRixNQUFNa3FDLEVBQUs2c0QsRUFBa0JDLEdBQ3hCQyxFQUdUdkIsRUFBSWxpRyxVQUFVd00sTUFBUSxTQUFTa3FDLEVBQUs2c0QsRUFBa0JDLEdBQ3BELElBQUt2QixFQUFLNVEsU0FBUzM2QyxHQUNqQixNQUFNLElBQUk1ekMsVUFBVSxnREFBa0Q0ekMsR0FNeEUsSUFBSWd0RCxFQUFhaHRELEVBQUk1a0MsUUFBUSxLQUN6QjZ4RixHQUNxQixJQUFoQkQsR0FBcUJBLEVBQWFodEQsRUFBSTVrQyxRQUFRLEtBQVEsSUFBTSxJQUNqRTh4RixFQUFTbHRELEVBQUl6bkIsTUFBTTAwRSxHQUV2QkMsRUFBTyxHQUFLQSxFQUFPLEdBQUd0ckYsUUFETCxNQUN5QixLQUcxQyxJQUFJNG1ELEVBRkp4b0IsRUFBTWt0RCxFQUFPOWhGLEtBQUs2aEYsR0FRbEIsR0FGQXprQyxFQUFPQSxFQUFLM21ELFFBRVBpckYsR0FBK0MsSUFBMUI5c0QsRUFBSXpuQixNQUFNLEtBQUt0ckIsT0FBYyxDQUVyRCxJQUFJa2dHLEVBQWFqQixFQUFrQmwvRCxLQUFLdzdCLEdBQ3hDLEdBQUkya0MsRUFlRixPQWRBdmlHLEtBQUtxUixLQUFPdXNELEVBQ1o1OUQsS0FBS2doRyxLQUFPcGpDLEVBQ1o1OUQsS0FBSytnRyxTQUFXd0IsRUFBVyxHQUN2QkEsRUFBVyxJQUNidmlHLEtBQUtpSSxPQUFTczZGLEVBQVcsR0FFdkJ2aUcsS0FBSytnQyxNQURIa2hFLEVBQ1dELEVBQVk5MkYsTUFBTWxMLEtBQUtpSSxPQUFPMlIsT0FBTyxJQUVyQzVaLEtBQUtpSSxPQUFPMlIsT0FBTyxJQUV6QnFvRixJQUNUamlHLEtBQUtpSSxPQUFTLEdBQ2RqSSxLQUFLK2dDLE1BQVEsSUFFUi9nQyxLQUlYLElBQUl5NkIsRUFBUTJtRSxFQUFnQmgvRCxLQUFLdzdCLEdBQ2pDLEdBQUluakMsRUFBTyxDQUVULElBQUkrbkUsR0FESi9uRSxFQUFRQSxFQUFNLElBQ1MxZ0IsY0FDdkIvWixLQUFLbXRELFNBQVdxMUMsRUFDaEI1a0MsRUFBT0EsRUFBS2hrRCxPQUFPNmdCLEVBQU1wNEIsUUFPM0IsR0FBSTYvRixHQUFxQnpuRSxHQUFTbWpDLEVBQUtwc0QsTUFBTSx3QkFBeUIsQ0FDcEUsSUFBSXF2RixFQUFnQyxPQUF0QmpqQyxFQUFLaGtELE9BQU8sRUFBRyxJQUN6QmluRixHQUFhcG1FLEdBQVNxbkUsRUFBaUJybkUsS0FDekNtakMsRUFBT0EsRUFBS2hrRCxPQUFPLEdBQ25CNVosS0FBSzZnRyxTQUFVLEdBSW5CLElBQUtpQixFQUFpQnJuRSxLQUNqQm9tRSxHQUFZcG1FLElBQVVzbkUsRUFBZ0J0bkUsSUFBVSxDQW1CbkQsSUFEQSxJQVNJOHlCLEVBQU1rMUMsRUFUTkMsR0FBVyxFQUNONWxHLEVBQUksRUFBR0EsRUFBSTRrRyxFQUFnQnIvRixPQUFRdkYsSUFBSyxFQUVsQyxLQURUNmxHLEVBQU0va0MsRUFBS3B0RCxRQUFRa3hGLEVBQWdCNWtHLFFBQ1AsSUFBYjRsRyxHQUFrQkMsRUFBTUQsS0FDekNBLEVBQVVDLElBaUJFLEtBVGRGLEdBRmUsSUFBYkMsRUFFTzlrQyxFQUFLcGQsWUFBWSxLQUlqQm9kLEVBQUtwZCxZQUFZLElBQUtraUQsTUFNL0JuMUMsRUFBT3FRLEVBQUtsOUQsTUFBTSxFQUFHK2hHLEdBQ3JCN2tDLEVBQU9BLEVBQUtsOUQsTUFBTStoRyxFQUFTLEdBQzNCemlHLEtBQUt1dEQsS0FBTzMvQixtQkFBbUIyL0IsSUFJakNtMUMsR0FBVyxFQUNYLElBQVM1bEcsRUFBSSxFQUFHQSxFQUFJMmtHLEVBQWFwL0YsT0FBUXZGLElBQUssQ0FDNUMsSUFBSTZsRyxHQUNTLEtBRFRBLEVBQU0va0MsRUFBS3B0RCxRQUFRaXhGLEVBQWEza0csUUFDSixJQUFiNGxHLEdBQWtCQyxFQUFNRCxLQUN6Q0EsRUFBVUMsSUFHRyxJQUFiRCxJQUNGQSxFQUFVOWtDLEVBQUt2N0QsUUFFakJyQyxLQUFLNHRELEtBQU9nUSxFQUFLbDlELE1BQU0sRUFBR2dpRyxHQUMxQjlrQyxFQUFPQSxFQUFLbDlELE1BQU1naUcsR0FHbEIxaUcsS0FBSzRpRyxZQUlMNWlHLEtBQUs4Z0csU0FBVzlnRyxLQUFLOGdHLFVBQVksR0FJakMsSUFBSStCLEVBQW9DLE1BQXJCN2lHLEtBQUs4Z0csU0FBUyxJQUNlLE1BQTVDOWdHLEtBQUs4Z0csU0FBUzlnRyxLQUFLOGdHLFNBQVN6K0YsT0FBUyxHQUd6QyxJQUFLd2dHLEVBRUgsSUFEQSxJQUFJQyxFQUFZOWlHLEtBQUs4Z0csU0FBU256RSxNQUFNLE1BQ3BCNXdCLEdBQVBELEVBQUksRUFBT2dtRyxFQUFVemdHLFFBQVF2RixFQUFJQyxFQUFHRCxJQUFLLENBQ2hELElBQUlpbUcsRUFBT0QsRUFBVWhtRyxHQUNyQixHQUFLaW1HLElBQ0FBLEVBQUt2eEYsTUFBTW13RixHQUFzQixDQUVwQyxJQURBLElBQUlxQixFQUFVLEdBQ0w3eUYsRUFBSSxFQUFHOFUsRUFBSTg5RSxFQUFLMWdHLE9BQVE4TixFQUFJOFUsRUFBRzlVLElBQ2xDNHlGLEVBQUt6OUUsV0FBV25WLEdBQUssSUFJdkI2eUYsR0FBVyxJQUVYQSxHQUFXRCxFQUFLNXlGLEdBSXBCLElBQUs2eUYsRUFBUXh4RixNQUFNbXdGLEdBQXNCLENBQ3ZDLElBQUlzQixFQUFhSCxFQUFVcGlHLE1BQU0sRUFBRzVELEdBQ2hDb21HLEVBQVVKLEVBQVVwaUcsTUFBTTVELEVBQUksR0FDOUJxbUcsRUFBTUosRUFBS3Z4RixNQUFNb3dGLEdBQ2pCdUIsSUFDRkYsRUFBVzdnRyxLQUFLK2dHLEVBQUksSUFDcEJELEVBQVEvZ0csUUFBUWdoRyxFQUFJLEtBRWxCRCxFQUFRN2dHLFNBQ1Z1N0QsRUFBTyxJQUFNc2xDLEVBQVExaUYsS0FBSyxLQUFPbzlDLEdBRW5DNTlELEtBQUs4Z0csU0FBV21DLEVBQVd6aUYsS0FBSyxLQUNoQyxRQU1KeGdCLEtBQUs4Z0csU0FBU3orRixPQWpORCxJQWtOZnJDLEtBQUs4Z0csU0FBVyxHQUdoQjlnRyxLQUFLOGdHLFNBQVc5Z0csS0FBSzhnRyxTQUFTL21GLGNBRzNCOG9GLElBS0g3aUcsS0FBSzhnRyxTQUFXSixFQUFTMEMsUUFBUXBqRyxLQUFLOGdHLFdBR3hDLElBQUlsaUcsRUFBSW9CLEtBQUs2dEQsS0FBTyxJQUFNN3RELEtBQUs2dEQsS0FBTyxHQUNsQ3ZaLEVBQUl0MEMsS0FBSzhnRyxVQUFZLEdBQ3pCOWdHLEtBQUs0dEQsS0FBT3RaLEVBQUkxMUMsRUFDaEJvQixLQUFLZ2hHLE1BQVFoaEcsS0FBSzR0RCxLQUlkaTFDLElBQ0Y3aUcsS0FBSzhnRyxTQUFXOWdHLEtBQUs4Z0csU0FBU2xuRixPQUFPLEVBQUc1WixLQUFLOGdHLFNBQVN6K0YsT0FBUyxHQUMvQyxNQUFadTdELEVBQUssS0FDUEEsRUFBTyxJQUFNQSxJQU9uQixJQUFLaWtDLEVBQWVXLEdBS2xCLElBQVMxbEcsRUFBSSxFQUFHQyxFQUFJeWtHLEVBQVduL0YsT0FBUXZGLEVBQUlDLEVBQUdELElBQUssQ0FDakQsSUFBSXVtRyxFQUFLN0IsRUFBVzFrRyxHQUNwQixJQUEwQixJQUF0QjhnRSxFQUFLcHRELFFBQVE2eUYsR0FBakIsQ0FFQSxJQUFJQyxFQUFNbjlFLG1CQUFtQms5RSxHQUN6QkMsSUFBUUQsSUFDVkMsRUFBTXpMLE9BQU93TCxJQUVmemxDLEVBQU9BLEVBQUtqd0MsTUFBTTAxRSxHQUFJN2lGLEtBQUs4aUYsSUFNL0IsSUFBSTE3RSxFQUFPZzJDLEVBQUtwdEQsUUFBUSxNQUNWLElBQVZvWCxJQUVGNW5CLEtBQUs0bkIsS0FBT2cyQyxFQUFLaGtELE9BQU9nTyxHQUN4QmcyQyxFQUFPQSxFQUFLbDlELE1BQU0sRUFBR2tuQixJQUV2QixJQUFJMjdFLEVBQUszbEMsRUFBS3B0RCxRQUFRLEtBb0J0QixJQW5CWSxJQUFSK3lGLEdBQ0Z2akcsS0FBS2lJLE9BQVMyMUQsRUFBS2hrRCxPQUFPMnBGLEdBQzFCdmpHLEtBQUsrZ0MsTUFBUTY4QixFQUFLaGtELE9BQU8ycEYsRUFBSyxHQUMxQnRCLElBQ0ZqaUcsS0FBSytnQyxNQUFRaWhFLEVBQVk5MkYsTUFBTWxMLEtBQUsrZ0MsUUFFdEM2OEIsRUFBT0EsRUFBS2w5RCxNQUFNLEVBQUc2aUcsSUFDWnRCLElBRVRqaUcsS0FBS2lJLE9BQVMsR0FDZGpJLEtBQUsrZ0MsTUFBUSxJQUVYNjhCLElBQU01OUQsS0FBSytnRyxTQUFXbmpDLEdBQ3RCbWtDLEVBQWdCUyxJQUNoQnhpRyxLQUFLOGdHLFdBQWE5Z0csS0FBSytnRyxXQUN6Qi9nRyxLQUFLK2dHLFNBQVcsS0FJZC9nRyxLQUFLK2dHLFVBQVkvZ0csS0FBS2lJLE9BQVEsQ0FDNUJySixFQUFJb0IsS0FBSytnRyxVQUFZLEdBQXpCLElBQ0lsaUcsRUFBSW1CLEtBQUtpSSxRQUFVLEdBQ3ZCakksS0FBS3FSLEtBQU96UyxFQUFJQyxFQUtsQixPQURBbUIsS0FBS2doRyxLQUFPaGhHLEtBQUsyc0IsU0FDVjNzQixNQWNUNGdHLEVBQUlsaUcsVUFBVWl1QixPQUFTLFdBQ3JCLElBQUk0Z0MsRUFBT3Z0RCxLQUFLdXRELE1BQVEsR0FDcEJBLElBRUZBLEdBREFBLEVBQU9wbkMsbUJBQW1Cb25DLElBQ2R2MkMsUUFBUSxPQUFRLEtBQzVCdTJDLEdBQVEsS0FHVixJQUFJSixFQUFXbnRELEtBQUttdEQsVUFBWSxHQUM1QjR6QyxFQUFXL2dHLEtBQUsrZ0csVUFBWSxHQUM1Qm41RSxFQUFPNW5CLEtBQUs0bkIsTUFBUSxHQUNwQmdtQyxHQUFPLEVBQ1A3c0IsRUFBUSxHQUVSL2dDLEtBQUs0dEQsS0FDUEEsRUFBT0wsRUFBT3Z0RCxLQUFLNHRELEtBQ1Y1dEQsS0FBSzhnRyxXQUNkbHpDLEVBQU9MLElBQXdDLElBQWhDdnRELEtBQUs4Z0csU0FBU3R3RixRQUFRLEtBQ2pDeFEsS0FBSzhnRyxTQUNMLElBQU05Z0csS0FBSzhnRyxTQUFXLEtBQ3RCOWdHLEtBQUs2dEQsT0FDUEQsR0FBUSxJQUFNNXRELEtBQUs2dEQsT0FJbkI3dEQsS0FBSytnQyxPQUNMNC9ELEVBQUt6dEIsU0FBU2x6RSxLQUFLK2dDLFFBQ25CdmpDLE9BQU9pSSxLQUFLekYsS0FBSytnQyxPQUFPMStCLFNBQzFCMCtCLEVBQVFpaEUsRUFBWXoyRixVQUFVdkwsS0FBSytnQyxRQUdyQyxJQUFJOTRCLEVBQVNqSSxLQUFLaUksUUFBVzg0QixHQUFVLElBQU1BLEdBQVcsR0FzQnhELE9BcEJJb3NCLEdBQW9DLE1BQXhCQSxFQUFTdnpDLFFBQVEsS0FBWXV6QyxHQUFZLEtBSXJEbnRELEtBQUs2Z0csV0FDSDF6QyxHQUFZNDBDLEVBQWdCNTBDLE1BQXVCLElBQVRTLEdBQzlDQSxFQUFPLE1BQVFBLEdBQVEsSUFDbkJtekMsR0FBbUMsTUFBdkJBLEVBQVM5dEQsT0FBTyxLQUFZOHRELEVBQVcsSUFBTUEsSUFDbkRuekMsSUFDVkEsRUFBTyxJQUdMaG1DLEdBQTJCLE1BQW5CQSxFQUFLcXJCLE9BQU8sS0FBWXJyQixFQUFPLElBQU1BLEdBQzdDM2YsR0FBK0IsTUFBckJBLEVBQU9nckMsT0FBTyxLQUFZaHJDLEVBQVMsSUFBTUEsR0FPaERrbEQsRUFBV1MsR0FMbEJtekMsRUFBV0EsRUFBUy9wRixRQUFRLFNBQVMsU0FBU3hGLEdBQzVDLE9BQU8yVSxtQkFBbUIzVSxRQUU1QnZKLEVBQVNBLEVBQU8rTyxRQUFRLElBQUssUUFFZ0I0USxHQU8vQ2c1RSxFQUFJbGlHLFVBQVUwQixRQUFVLFNBQVM4Z0csR0FDL0IsT0FBT2xoRyxLQUFLbWhHLGNBQWNGLEVBQVNDLEdBQVUsR0FBTyxJQUFPdjBFLFVBUTdEaTBFLEVBQUlsaUcsVUFBVXlpRyxjQUFnQixTQUFTRCxHQUNyQyxHQUFJUCxFQUFLNVEsU0FBU21SLEdBQVcsQ0FDM0IsSUFBSXNDLEVBQU0sSUFBSTVDLEVBQ2Q0QyxFQUFJdDRGLE1BQU1nMkYsR0FBVSxHQUFPLEdBQzNCQSxFQUFXc0MsRUFLYixJQUZBLElBQUlsa0YsRUFBUyxJQUFJc2hGLEVBQ2I2QyxFQUFRam1HLE9BQU9pSSxLQUFLekYsTUFDZjBqRyxFQUFLLEVBQUdBLEVBQUtELEVBQU1waEcsT0FBUXFoRyxJQUFNLENBQ3hDLElBQUlDLEVBQU9GLEVBQU1DLEdBQ2pCcGtGLEVBQU9xa0YsR0FBUTNqRyxLQUFLMmpHLEdBUXRCLEdBSEFya0YsRUFBT3NJLEtBQU9zNUUsRUFBU3Q1RSxLQUdELEtBQWxCczVFLEVBQVNGLEtBRVgsT0FEQTFoRixFQUFPMGhGLEtBQU8xaEYsRUFBT3FOLFNBQ2RyTixFQUlULEdBQUk0aEYsRUFBU0wsVUFBWUssRUFBUy96QyxTQUFVLENBRzFDLElBREEsSUFBSXkyQyxFQUFRcG1HLE9BQU9pSSxLQUFLeTdGLEdBQ2YyQyxFQUFLLEVBQUdBLEVBQUtELEVBQU12aEcsT0FBUXdoRyxJQUFNLENBQ3hDLElBQUlDLEVBQU9GLEVBQU1DLEdBQ0osYUFBVEMsSUFDRnhrRixFQUFPd2tGLEdBQVE1QyxFQUFTNEMsSUFVNUIsT0FOSS9CLEVBQWdCemlGLEVBQU82dEMsV0FDdkI3dEMsRUFBT3doRixXQUFheGhGLEVBQU95aEYsV0FDN0J6aEYsRUFBT2pPLEtBQU9pTyxFQUFPeWhGLFNBQVcsS0FHbEN6aEYsRUFBTzBoRixLQUFPMWhGLEVBQU9xTixTQUNkck4sRUFHVCxHQUFJNGhGLEVBQVMvekMsVUFBWSt6QyxFQUFTL3pDLFdBQWE3dEMsRUFBTzZ0QyxTQUFVLENBUzlELElBQUs0MEMsRUFBZ0JiLEVBQVMvekMsVUFBVyxDQUV2QyxJQURBLElBQUkxbkQsRUFBT2pJLE9BQU9pSSxLQUFLeTdGLEdBQ2QvMUUsRUFBSSxFQUFHQSxFQUFJMWxCLEVBQUtwRCxPQUFROG9CLElBQUssQ0FDcEMsSUFBSWxHLEVBQUl4ZixFQUFLMGxCLEdBQ2I3TCxFQUFPMkYsR0FBS2k4RSxFQUFTajhFLEdBR3ZCLE9BREEzRixFQUFPMGhGLEtBQU8xaEYsRUFBT3FOLFNBQ2RyTixFQUlULEdBREFBLEVBQU82dEMsU0FBVyt6QyxFQUFTL3pDLFNBQ3RCK3pDLEVBQVN0ekMsTUFBU2swQyxFQUFpQlosRUFBUy96QyxVQVMvQzd0QyxFQUFPeWhGLFNBQVdHLEVBQVNILGFBVCtCLENBRTFELElBREEsSUFBSWdELEdBQVc3QyxFQUFTSCxVQUFZLElBQUlwekUsTUFBTSxLQUN2Q28yRSxFQUFRMWhHLFVBQVk2K0YsRUFBU3R6QyxLQUFPbTJDLEVBQVE1K0YsV0FDOUMrN0YsRUFBU3R6QyxPQUFNc3pDLEVBQVN0ekMsS0FBTyxJQUMvQnN6QyxFQUFTSixXQUFVSSxFQUFTSixTQUFXLElBQ3pCLEtBQWZpRCxFQUFRLElBQVdBLEVBQVE1aEcsUUFBUSxJQUNuQzRoRyxFQUFRMWhHLE9BQVMsR0FBRzBoRyxFQUFRNWhHLFFBQVEsSUFDeENtZCxFQUFPeWhGLFNBQVdnRCxFQUFRdmpGLEtBQUssS0FXakMsR0FQQWxCLEVBQU9yWCxPQUFTaTVGLEVBQVNqNUYsT0FDekJxWCxFQUFPeWhCLE1BQVFtZ0UsRUFBU25nRSxNQUN4QnpoQixFQUFPc3VDLEtBQU9zekMsRUFBU3R6QyxNQUFRLEdBQy9CdHVDLEVBQU9pdUMsS0FBTzJ6QyxFQUFTM3pDLEtBQ3ZCanVDLEVBQU93aEYsU0FBV0ksRUFBU0osVUFBWUksRUFBU3R6QyxLQUNoRHR1QyxFQUFPdXVDLEtBQU9xekMsRUFBU3J6QyxLQUVuQnZ1QyxFQUFPeWhGLFVBQVl6aEYsRUFBT3JYLE9BQVEsQ0FDcEMsSUFBSXJKLEVBQUkwZ0IsRUFBT3loRixVQUFZLEdBQ3ZCbGlHLEVBQUl5Z0IsRUFBT3JYLFFBQVUsR0FDekJxWCxFQUFPak8sS0FBT3pTLEVBQUlDLEVBSXBCLE9BRkF5Z0IsRUFBT3VoRixRQUFVdmhGLEVBQU91aEYsU0FBV0ssRUFBU0wsUUFDNUN2aEYsRUFBTzBoRixLQUFPMWhGLEVBQU9xTixTQUNkck4sRUFHVCxJQUFJMGtGLEVBQWUxa0YsRUFBT3loRixVQUEwQyxNQUE5QnpoRixFQUFPeWhGLFNBQVM5dEQsT0FBTyxHQUN6RGd4RCxFQUNJL0MsRUFBU3R6QyxNQUNUc3pDLEVBQVNILFVBQTRDLE1BQWhDRyxFQUFTSCxTQUFTOXRELE9BQU8sR0FFbERpeEQsRUFBY0QsR0FBWUQsR0FDWDFrRixFQUFPc3VDLE1BQVFzekMsRUFBU0gsU0FDdkNvRCxFQUFnQkQsRUFDaEJFLEVBQVU5a0YsRUFBT3loRixVQUFZemhGLEVBQU95aEYsU0FBU3B6RSxNQUFNLE1BQVEsR0FFM0QwMkUsR0FEQU4sRUFBVTdDLEVBQVNILFVBQVlHLEVBQVNILFNBQVNwekUsTUFBTSxNQUFRLEdBQ25Eck8sRUFBTzZ0QyxXQUFhNDBDLEVBQWdCemlGLEVBQU82dEMsV0EyQjNELEdBcEJJazNDLElBQ0Yva0YsRUFBT3doRixTQUFXLEdBQ2xCeGhGLEVBQU91dUMsS0FBTyxLQUNWdnVDLEVBQU9zdUMsT0FDVSxLQUFmdzJDLEVBQVEsR0FBV0EsRUFBUSxHQUFLOWtGLEVBQU9zdUMsS0FDdEN3MkMsRUFBUWppRyxRQUFRbWQsRUFBT3N1QyxPQUU5QnR1QyxFQUFPc3VDLEtBQU8sR0FDVnN6QyxFQUFTL3pDLFdBQ1grekMsRUFBU0osU0FBVyxLQUNwQkksRUFBU3J6QyxLQUFPLEtBQ1pxekMsRUFBU3R6QyxPQUNRLEtBQWZtMkMsRUFBUSxHQUFXQSxFQUFRLEdBQUs3QyxFQUFTdHpDLEtBQ3hDbTJDLEVBQVE1aEcsUUFBUSsrRixFQUFTdHpDLE9BRWhDc3pDLEVBQVN0ekMsS0FBTyxNQUVsQnMyQyxFQUFhQSxJQUE4QixLQUFmSCxFQUFRLElBQTRCLEtBQWZLLEVBQVEsS0FHdkRILEVBRUYza0YsRUFBT3N1QyxLQUFRc3pDLEVBQVN0ekMsTUFBMEIsS0FBbEJzekMsRUFBU3R6QyxLQUMzQnN6QyxFQUFTdHpDLEtBQU90dUMsRUFBT3N1QyxLQUNyQ3R1QyxFQUFPd2hGLFNBQVlJLEVBQVNKLFVBQWtDLEtBQXRCSSxFQUFTSixTQUMvQkksRUFBU0osU0FBV3hoRixFQUFPd2hGLFNBQzdDeGhGLEVBQU9yWCxPQUFTaTVGLEVBQVNqNUYsT0FDekJxWCxFQUFPeWhCLE1BQVFtZ0UsRUFBU25nRSxNQUN4QnFqRSxFQUFVTCxPQUVMLEdBQUlBLEVBQVExaEcsT0FHWitoRyxJQUFTQSxFQUFVLElBQ3hCQSxFQUFRLytGLE1BQ1IrK0YsRUFBVUEsRUFBUTFrRyxPQUFPcWtHLEdBQ3pCemtGLEVBQU9yWCxPQUFTaTVGLEVBQVNqNUYsT0FDekJxWCxFQUFPeWhCLE1BQVFtZ0UsRUFBU25nRSxXQUNuQixJQUFLNC9ELEVBQUsyRCxrQkFBa0JwRCxFQUFTajVGLFFBQVMsQ0FJbkQsR0FBSW84RixFQUNGL2tGLEVBQU93aEYsU0FBV3hoRixFQUFPc3VDLEtBQU93MkMsRUFBUWovRixTQUlwQ28vRixLQUFhamxGLEVBQU9zdUMsTUFBUXR1QyxFQUFPc3VDLEtBQUtwOUMsUUFBUSxLQUFPLElBQzFDOE8sRUFBT3N1QyxLQUFLamdDLE1BQU0sUUFFakNyTyxFQUFPaXVDLEtBQU9nM0MsRUFBV3AvRixRQUN6Qm1hLEVBQU9zdUMsS0FBT3R1QyxFQUFPd2hGLFNBQVd5RCxFQUFXcC9GLFNBVy9DLE9BUkFtYSxFQUFPclgsT0FBU2k1RixFQUFTajVGLE9BQ3pCcVgsRUFBT3loQixNQUFRbWdFLEVBQVNuZ0UsTUFFbkI0L0QsRUFBSzNILE9BQU8xNUUsRUFBT3loRixXQUFjSixFQUFLM0gsT0FBTzE1RSxFQUFPclgsVUFDdkRxWCxFQUFPak8sTUFBUWlPLEVBQU95aEYsU0FBV3poRixFQUFPeWhGLFNBQVcsS0FDcEN6aEYsRUFBT3JYLE9BQVNxWCxFQUFPclgsT0FBUyxLQUVqRHFYLEVBQU8waEYsS0FBTzFoRixFQUFPcU4sU0FDZHJOLEVBR1QsSUFBSzhrRixFQUFRL2hHLE9BV1gsT0FSQWlkLEVBQU95aEYsU0FBVyxLQUVkemhGLEVBQU9yWCxPQUNUcVgsRUFBT2pPLEtBQU8sSUFBTWlPLEVBQU9yWCxPQUUzQnFYLEVBQU9qTyxLQUFPLEtBRWhCaU8sRUFBTzBoRixLQUFPMWhGLEVBQU9xTixTQUNkck4sRUFjVCxJQVJBLElBQUlrNUMsRUFBTzRyQyxFQUFRMWpHLE9BQU8sR0FBRyxHQUN6QjhqRyxHQUNDbGxGLEVBQU9zdUMsTUFBUXN6QyxFQUFTdHpDLE1BQVF3MkMsRUFBUS9oRyxPQUFTLEtBQ3hDLE1BQVRtMkQsR0FBeUIsT0FBVEEsSUFBMkIsS0FBVEEsRUFJbkNpc0MsRUFBSyxFQUNBM25HLEVBQUlzbkcsRUFBUS9oRyxPQUFRdkYsR0FBSyxFQUFHQSxJQUV0QixPQURiMDdELEVBQU80ckMsRUFBUXRuRyxJQUVic25HLEVBQVF2N0QsT0FBTy9yQyxFQUFHLEdBQ0EsT0FBVDA3RCxHQUNUNHJDLEVBQVF2N0QsT0FBTy9yQyxFQUFHLEdBQ2xCMm5HLEtBQ1NBLElBQ1RMLEVBQVF2N0QsT0FBTy9yQyxFQUFHLEdBQ2xCMm5HLEtBS0osSUFBS1AsSUFBZUMsRUFDbEIsS0FBT00sSUFBTUEsRUFDWEwsRUFBUWppRyxRQUFRLE9BSWhCK2hHLEdBQTZCLEtBQWZFLEVBQVEsSUFDcEJBLEVBQVEsSUFBK0IsTUFBekJBLEVBQVEsR0FBR254RCxPQUFPLElBQ3BDbXhELEVBQVFqaUcsUUFBUSxJQUdkcWlHLEdBQXNELE1BQWpDSixFQUFRNWpGLEtBQUssS0FBSzVHLFFBQVEsSUFDakR3cUYsRUFBUWhpRyxLQUFLLElBR2YsSUFVTW1pRyxFQVZGRyxFQUE0QixLQUFmTixFQUFRLElBQ3BCQSxFQUFRLElBQStCLE1BQXpCQSxFQUFRLEdBQUdueEQsT0FBTyxHQUdqQ294RCxJQUNGL2tGLEVBQU93aEYsU0FBV3hoRixFQUFPc3VDLEtBQU84MkMsRUFBYSxHQUNiTixFQUFRL2hHLE9BQVMraEcsRUFBUWovRixRQUFVLElBSS9Eby9GLEtBQWFqbEYsRUFBT3N1QyxNQUFRdHVDLEVBQU9zdUMsS0FBS3A5QyxRQUFRLEtBQU8sSUFDMUM4TyxFQUFPc3VDLEtBQUtqZ0MsTUFBTSxRQUVqQ3JPLEVBQU9pdUMsS0FBT2czQyxFQUFXcC9GLFFBQ3pCbWEsRUFBT3N1QyxLQUFPdHVDLEVBQU93aEYsU0FBV3lELEVBQVdwL0YsVUF5Qi9DLE9BckJBKytGLEVBQWFBLEdBQWU1a0YsRUFBT3N1QyxNQUFRdzJDLEVBQVEvaEcsVUFFaENxaUcsR0FDakJOLEVBQVFqaUcsUUFBUSxJQUdiaWlHLEVBQVEvaEcsT0FJWGlkLEVBQU95aEYsU0FBV3FELEVBQVE1akYsS0FBSyxNQUgvQmxCLEVBQU95aEYsU0FBVyxLQUNsQnpoRixFQUFPak8sS0FBTyxNQU1Yc3ZGLEVBQUszSCxPQUFPMTVFLEVBQU95aEYsV0FBY0osRUFBSzNILE9BQU8xNUUsRUFBT3JYLFVBQ3ZEcVgsRUFBT2pPLE1BQVFpTyxFQUFPeWhGLFNBQVd6aEYsRUFBT3loRixTQUFXLEtBQ3BDemhGLEVBQU9yWCxPQUFTcVgsRUFBT3JYLE9BQVMsS0FFakRxWCxFQUFPaXVDLEtBQU8yekMsRUFBUzN6QyxNQUFRanVDLEVBQU9pdUMsS0FDdENqdUMsRUFBT3VoRixRQUFVdmhGLEVBQU91aEYsU0FBV0ssRUFBU0wsUUFDNUN2aEYsRUFBTzBoRixLQUFPMWhGLEVBQU9xTixTQUNkck4sR0FHVHNoRixFQUFJbGlHLFVBQVVra0csVUFBWSxXQUN4QixJQUFJaDFDLEVBQU81dEQsS0FBSzR0RCxLQUNaQyxFQUFPd3pDLEVBQVlqL0QsS0FBS3dyQixHQUN4QkMsSUFFVyxPQURiQSxFQUFPQSxFQUFLLE1BRVY3dEQsS0FBSzZ0RCxLQUFPQSxFQUFLajBDLE9BQU8sSUFFMUJnMEMsRUFBT0EsRUFBS2gwQyxPQUFPLEVBQUdnMEMsRUFBS3ZyRCxPQUFTd3JELEVBQUt4ckQsU0FFdkN1ckQsSUFBTTV0RCxLQUFLOGdHLFNBQVdsekMsSyw2QkN4dEI1QixJQUFJKzJDLEVBQVMsRUFBUSxJQUNqQkMsRUFBVSxFQUFRLElBR3RCLFNBQVNDLEVBQWlCQyxFQUFPQyxHQUMvQi9rRyxLQUFLOEgsR0FBS2c5RixFQUNWOWtHLEtBQUsra0csSUFBTUEsRUFIYmxvRyxFQUFPRCxRQUFRaW9HLGlCQUFtQkEsRUFZbENob0csRUFBT0QsUUFBUW9vRyxLQUFPLFNBQWNsNUUsRUFBTTVCLEdBQ3hDLFNBQVMrNkUsRUFBV0MsRUFBU2g3RSxHQUMzQixHQUFJQSxHQUF5QixpQkFBUkEsRUFFckIsR0FBR0EsRUFBT2k3RSxLQUFWLENBQ0UsSUFBSUMsRUFBY1QsRUFBT3ZrRyxRQUFROGtHLEVBQVNoN0UsRUFBT2k3RSxNQUNqREosRUFBSUssR0FBZUwsRUFBSUssR0FBZUwsRUFBSUssR0FBYSxFQUFJLE1BRjdELENBS0EsSUFBSXQ5RixFQUFLb2lCLEVBQU9NLEtBQU9OLEVBQU9waUIsR0FDMUJ1OUYsRUFBVXY5RixFQUFLNjhGLEVBQU92a0csUUFBUThrRyxFQUFTcDlGLEdBQU1vOUYsRUFDakQsR0FBSUcsRUFBUyxDQUdYLEdBREdBLEVBQVE3MEYsUUFBUSxLQUFLLElBQUc2MEYsR0FBVyxLQUNuQ1AsRUFBTU8sR0FBUyxDQUNoQixJQUFJVCxFQUFRdjNFLGtCQUFrQnkzRSxFQUFNTyxHQUFVbjdFLEdBQzVDLE1BQU0sSUFBSTFuQixNQUFNLFdBQVc2aUcsRUFBUSw4Q0FFckMsT0FBT1AsRUFBTU8sR0FFZlAsRUFBTU8sR0FBV243RSxFQUVhLEtBQTNCbTdFLEVBQVFBLEVBQVFoakcsT0FBTyxLQUN4QnlpRyxFQUFNTyxFQUFReC9FLFVBQVUsRUFBR3cvRSxFQUFRaGpHLE9BQU8sSUFBTTZuQixHQUdwRG83RSxFQUFVRCxFQUFRLFNBQVc3aEcsTUFBTTRtQixRQUFRRixFQUFPcTdFLE9BQU9yN0UsRUFBT3E3RSxNQUFNLENBQUNyN0UsRUFBT3E3RSxRQUM5RUQsRUFBVUQsRUFBUSxXQUFhN2hHLE1BQU00bUIsUUFBUUYsRUFBT3M3RSxTQUFTdDdFLEVBQU9zN0UsUUFBUSxDQUFDdDdFLEVBQU9zN0UsVUFDcEZQLEVBQVdJLEVBQVEsbUJBQW9CbjdFLEVBQU91N0UsaUJBQzlDQyxFQUFXTCxFQUFRLGNBQWVuN0UsRUFBT3laLFlBQ3pDc2hFLEVBQVdJLEVBQVEsd0JBQXlCbjdFLEVBQU95N0Usc0JBQ25ERCxFQUFXTCxFQUFRLGVBQWdCbjdFLEVBQU8wN0UsYUFDMUNGLEVBQVdMLEVBQVEscUJBQXNCbjdFLEVBQU8yN0UsbUJBQ2hESCxFQUFXTCxFQUFRLGdCQUFpQm43RSxFQUFPNDdFLGNBQzNDUixFQUFVRCxFQUFRLFlBQWFuN0UsRUFBTzY3RSxVQUN0Q1QsRUFBVUQsRUFBUSxTQUFVbjdFLEVBQU84N0UsT0FDbkNWLEVBQVVELEVBQVEsU0FBVW43RSxFQUFPKzdFLE9BQ25DWCxFQUFVRCxFQUFRLFNBQVVuN0UsRUFBT2c4RSxPQUNuQ2pCLEVBQVdJLEVBQVEsT0FBUW43RSxFQUFPaThFLE1BRXBDLFNBQVNiLEVBQVVKLEVBQVNuNUUsR0FDMUIsR0FBSXZvQixNQUFNNG1CLFFBQVEyQixHQUNsQixJQUFJLElBQUlqdkIsRUFBRSxFQUFHQSxFQUFFaXZCLEVBQVExcEIsT0FBUXZGLElBQzdCbW9HLEVBQVdDLEVBQVEsSUFBSXBvRyxFQUFHaXZCLEVBQVFqdkIsSUFHdEMsU0FBUzRvRyxFQUFXUixFQUFTbjVFLEdBQzNCLEdBQUlBLEdBQTJCLGlCQUFUQSxFQUN0QixJQUFJLElBQUludEIsS0FBS210QixFQUNYazVFLEVBQVdDLEVBQVEsSUFBSXRtRyxFQUFHbXRCLEVBQVFudEIsSUFJdEMsSUFBSWttRyxFQUFRLEdBQ1JDLEVBQU0sR0FFVixPQURBRSxFQUFXbjVFLEVBQU01QixHQUNWLElBQUkyNkUsRUFBaUJDLEVBQU9DLEssZ0tDdkVyQyxhQUNBLFFBTUEsT0FDQSxRQUVBLElBQUl4M0YsRUFBMEJnQixFQUFvQnVVLEVBQXFCakgsRUFDbkV1cUYsRUFBYyxFQW9CbEIsU0FBU0MsRUFBbUI3cUYsR0FDVixXQUFaQSxFQUFJbmQsTUFDRmtLLFNBQVNtRCx1QkFBdUIsWUFBWXJKLE9BQVMsR0FDdkR5Z0IsRUFBS3dqRixpQkFFUCxJQUFBMzZGLGFBTUosU0FBUzQ2RixFQUFrQi9xRixHQUV6QixHQUEyQixlQUF2QixJQUFBaFEsc0JBQ0dqRCxTQUFTQyxlQUFlLGVBQW9DaVIsU0FDbEQsVUFBWitCLEVBQUluZCxJQUVQLE9BRUYsTUFBTXlOLEVBQVd2RCxTQUFTaUgsY0FBYyx5QkFHeEMsR0FBSTFELEVBQVUsQ0FDQ3ZELFNBQVNpSCxjQUFjLFFBQVUxRCxFQUFTaEUsSUFLbERnVyxTQUlULFNBQVMwb0YsRUFBa0JockYsR0FDekIsR0FBMkIsZUFBdkIsSUFBQWhRLHFCQUFtRCxjQUFaZ1EsRUFBSW5kLEtBQW1DLGVBQVptZCxFQUFJbmQsS0FBb0MsUUFBWm1kLEVBQUluZCxLQUFpQm1kLEVBQUlpckYsU0FDekgsT0FDRmpyRixFQUFJYSxpQkFFSixNQUFNdlEsRUFBV3ZELFNBQVNpSCxjQUFjLHlCQUlsQ2szRixFQUhZbGpHLE1BQU00SSxLQUFLN0QsU0FBU3FELGlCQUFpQixjQUd2QitFLE9BQU9yQixHQUFxRCxPQUE5Q0EsRUFBSUUsY0FBYyx5QkFDMURtM0YsRUFBTUQsRUFBY2wyRixRQUFRMUUsR0FFbEMsSUFBaUIsY0FBWjBQLEVBQUluZCxLQUFvQyxRQUFabWQsRUFBSW5kLEtBQWlCbWQsRUFBSWlyRixXQUFjRSxFQUFNLEVBQUcsRUFDL0UsSUFBQWg3RixZQUVBLE1BQU0wRCxFQUFPcTNGLEVBQWNDLEVBQU0sR0FBR24zRixjQUFjLHlCQUNsRCxJQUFBNUMsV0FBVSxDQUFDeUMsR0FBNkJkLEVBQVVoQixRQUM3QyxJQUFpQixlQUFaaU8sRUFBSW5kLEtBQXFDLFFBQVptZCxFQUFJbmQsTUFBa0JtZCxFQUFJaXJGLFdBQWNFLEVBQU1ELEVBQWNya0csT0FBUyxFQUFHLEVBQy9HLElBQUFzSixZQUVBLE1BQU0wRCxFQUFPcTNGLEVBQWNDLEVBQU0sR0FBR24zRixjQUFjLHlCQUNsRCxJQUFBNUMsV0FBVSxDQUFDeUMsR0FBNkJkLEVBQVVoQixHQUlwRCxNQUFNcTVGLEVBQWtCcitGLFNBQVNpSCxjQUFjLGdCQUMzQ28zRixHQUNGQSxFQUFnQkMsZUFBZSxDQUFFQyxTQUFVLFdBSS9DLFNBQVNDLElBQ1AsTUFBTUMsRUFBWXorRixTQUFTQyxlQUFlLGFBQzFDLFFBQUl3K0YsR0FDS0EsRUFBVS85RixVQUFVOEMsU0FBUyxhQUt4QyxTQUFTazdGLEVBQWlCenJGLEdBQW9CQSxFQUFJQyxrQkFrQ2xELFNBQVN5ckYsRUFBZ0JyNkYsRUFBd0JzNkYsRUFBV0MsR0FDMUQsR0FBSUwsS0FBZ0MsUUFBZmw2RixFQUFHNlgsUUFBbUIsQ0FDekMsTUFBTXJWLEVBL0JWLFNBQXdCeEMsR0FDdEIsR0FBSWs2RixJQUFlLENBQ2pCLE1BQU0vMUYsRUFBTXBSLE9BQU9pTixFQUFHMEUsYUFBYSxNQUFPTixFQUFNclIsT0FBT2lOLEVBQUcwRSxhQUFhLE1BS3ZFLE1BQU8sQ0FBRVAsTUFBS0MsTUFBS0MsSUFIUEYsRUFBTXBSLE9BQVFpTixFQUFHMEUsYUFBYSxTQUFTN1EsTUFBTSxHQUFJLElBR3JDeVEsSUFGWkYsRUFBTXJSLE9BQVFpTixFQUFHMEUsYUFBYSxVQUFVN1EsTUFBTSxHQUFJLEtBS2hFLEdBQW1CLFFBQWZtTSxFQUFHNlgsUUFBbUIsQ0FDeEIsTUFBTUQsRUFBUTVYLEVBQUcrWCxXQUEyQkQsVUFFNUMsTUFBTyxDQUNMM1QsSUFBS3lULEVBQUtsUixFQUNWdEMsSUFBS3dULEVBQUs5USxFQUNWekMsSUFBS3VULEVBQUtsUixFQUFJa1IsRUFBS0ksTUFDbkIxVCxJQUFLc1QsRUFBSzlRLEVBQUk4USxFQUFLSyxRQUl2QixPQUFPLElBQUFyQixjQUFhNVcsR0FVTHc2RixDQUFjeDZGLEdBSzNCLFFBQVN1NkYsRUFBRzd6RixFQUFJbEUsRUFBSzJCLEtBQU9tMkYsRUFBRzV6RixFQUFJbEUsRUFBSzZCLEtBQU9rMkYsRUFBR3p6RixFQUFJdEUsRUFBSzRCLEtBQU9rMkYsRUFBR3h6RixFQUFJdEUsRUFBSzhCLEtBSWhGLE1BQU1tMkYsR0FBTSxJQUFBN2pGLGNBQWE1VyxHQUN6QixRQUFVczZGLEVBQUc1ekYsRUFBSSt6RixFQUFJdDJGLEtBQU9vMkYsRUFBRzd6RixFQUFJK3pGLEVBQUl0MkYsS0FBU20yRixFQUFHNXpGLEVBQUkrekYsRUFBSXAyRixLQUFPazJGLEVBQUc3ekYsRUFBSSt6RixFQUFJcDJGLEtBQ3BFaTJGLEVBQUd4ekYsRUFBSzJ6RixFQUFJcjJGLElBQU05SSxLQUFLdUksSUFBSTQyRixFQUFJdDJGLElBQU1tMkYsRUFBRzV6RixHQUFLcEwsS0FBS3diLElBQUkyakYsRUFBSWwyRixTQUN6RGcyRixFQUFHenpGLEVBQUsyekYsRUFBSXIyRixJQUFNOUksS0FBS3VJLElBQUk0MkYsRUFBSXQyRixJQUFNbTJGLEVBQUc1ekYsR0FBS3BMLEtBQUt3YixJQUFJMmpGLEVBQUlsMkYsU0FDM0QrMUYsRUFBR3h6RixFQUFLMnpGLEVBQUluMkYsSUFBTWhKLEtBQUt1SSxJQUFJNDJGLEVBQUluMkYsSUFBTWkyRixFQUFHenpGLEdBQUt4TCxLQUFLd2IsSUFBSTJqRixFQUFJbDJGLFNBQ3pEZzJGLEVBQUd6ekYsRUFBSzJ6RixFQUFJbjJGLElBQU1oSixLQUFLdUksSUFBSTQyRixFQUFJbjJGLElBQU1pMkYsRUFBR3p6RixHQUFLeEwsS0FBS3diLElBQUkyakYsRUFBSWwyRixTQXNDdEUsU0FBU20yRixFQUF3Qy9yRixHQUUvQyxHQUFLak4sR0FBdUMsV0FBM0JBLEVBQVNpNUYsZ0JBQThCaHNGLEVBQUlpckYsU0FTNUQsR0FBcUIsUUFBakJ6bUcsS0FBSzBrQixTQUE0QyxlQUF2QixJQUFBbFoscUJBQzVCLEdBQWtDLE9BQTlCeEwsS0FBS2tPLFFBQVEsYUFBdUIsQ0FDdEMsSUFBSWtpQixFQUFrQyxDQUFDcHdCLE1BR3ZDLE1BQU15bkcsRUFBb0IsYUFDcEJDLEVBQXFCLFlBQzNCLEdBQUkxbkcsS0FBS3VSLGFBQWEsY0FBY0MsTUFBTWsyRixHQUFxQixDQUU3RCxNQUFNcDVGLEVBQUt0TyxLQUFLa08sUUFBUSxPQUNsQjFCLEVBQVF4TSxLQUFLa08sUUFBUSxVQUNyQnk1RixFQUFVbmtHLE1BQU00SSxLQUFLSSxFQUFNMkcsVUFBVTNDLFFBQVFsQyxHQUM3Q3M1RixFQUFXcDdGLEVBQU0yRyxTQUFTdzBGLEVBQVUsR0FBR3gwRixTQUFTLEdBQ3REeFEsUUFBUWtsRyxPQUFPRCxFQUFTcjJGLGFBQWEsY0FBY0MsTUFBTWkyRixHQUFvQix1Q0FFdkMsT0FBbENHLEVBQVMxNUYsUUFBUSxjQUNuQmtpQixFQUFVanVCLFFBQVF5bEcsUUFFZixHQUFJNW5HLEtBQUt1UixhQUFhLGNBQWNDLE1BQU1pMkYsR0FBb0IsQ0FFbkUsTUFBTW41RixFQUFLdE8sS0FBS2tPLFFBQVEsT0FDbEIxQixFQUFReE0sS0FBS2tPLFFBQVEsVUFDckJ5NUYsRUFBVW5rRyxNQUFNNEksS0FBS0ksRUFBTTJHLFVBQVUzQyxRQUFRbEMsR0FDN0N3NUYsRUFBWXQ3RixFQUFNMkcsU0FBU3cwRixFQUFVLEdBQUd4MEYsU0FBUyxHQUN2RHhRLFFBQVFrbEcsT0FBT0MsRUFBVXYyRixhQUFhLGNBQWNDLE1BQU1rMkYsR0FBcUIsd0NBRXhDLE9BQW5DSSxFQUFVNTVGLFFBQVEsY0FDcEJraUIsRUFBVWh1QixLQUFLMGxHLEdBSWZDLE1BQ0YzM0UsRUFBWUEsRUFBVTF3QixPQUFPOEQsTUFBTTRJLEtBQUs3RCxTQUFTcUQsaUJBQWlCLGlCQUdwRSxJQUFBZ0IsV0FBVXdqQixFQUFXN2hCLEVBQVVoQixHQUUzQkEsR0FDRkEsRUFBWUksZ0JBSWQsR0FBSW82RixJQUFpQixDQUNuQixNQU9NQyxFQU5jLENBQ2xCQyxXQUFZLFNBQ1pDLFdBQVksU0FDWkMsUUFBUyxNQUNUQyxrQkFBbUIsVUFMQzcvRixTQUFTaUgsY0FBYyxzQkFBc0IxSCxLQU9mLFlBQzlDVyxFQUFTLENBQUN6SSxLQUFLa08sUUFBUTg1RixJQUU3QixJQUFJNTNFLEVBQVksR0FDaEJBLEVBQVk1c0IsTUFBTTRJLEtBQUs3RCxTQUFTbUQsdUJBQXVCLGFBQ3ZEMGtCLEVBQVlBLEVBQVV6ZixPQUFROUQsSUFBUXBFLEVBQU8wdkUsU0FBU3RyRSxLQUV0RCxJQUFBRCxXQUFVd2pCLEVBQVc3aEIsRUFBVWhCLEdBRTNCQSxHQUNGQSxFQUFZSSxpQkFJYixHQUE0QyxTQUF2QzZOLEVBQUlyYyxPQUF1QnVsQixTQUE2QyxlQUF2QixJQUFBbFosb0JBQzNELEdBQWtDLE9BQTlCeEwsS0FBS2tPLFFBQVEsYUFBdUIsQ0FDdEMsSUFBSWtpQixFQUFZLENBQUM1VSxFQUFJcmMsUUFDakI0b0csTUFDRjMzRSxFQUFZQSxFQUFVMXdCLE9BQU84RCxNQUFNNEksS0FBSzdELFNBQVNtRCx1QkFBdUIsY0FDeEUwa0IsRUFBWUEsRUFBVTNlLElBQU01RSxHQUNSLFFBQWRBLEVBQUc2WCxRQUNFN1gsRUFFRkEsRUFBRzJDLGNBQWMsMkJBRzVCLElBQUE1QyxXQUFVd2pCLEVBQVc3aEIsRUFBVWhCLEdBQzNCQSxHQUNGQSxFQUFZSSxlQUVULENBQ0wsSUFBSXlpQixFQUFZLEdBQ2hCLEdBQUkyM0UsSUFBaUIsQ0FDbkIsTUFBTXQvRixFQUFTLENBQUN6SSxNQUNoQm93QixFQUFZNXNCLE1BQU00SSxLQUFLN0QsU0FBU21ELHVCQUF1QixhQUN2RDBrQixFQUFZQSxFQUFVM2UsSUFBTTVFLEdBQ1IsUUFBZEEsRUFBRzZYLFFBQ0U3WCxFQUVGQSxFQUFHMkMsY0FBYyx5QkFFMUI0Z0IsRUFBWUEsRUFBVXpmLE9BQVM5RCxJQUNyQnBFLEVBQU8wdkUsU0FBU3RyRSxLQUUxQixJQUFBRCxXQUFVd2pCLEVBQVc3aEIsRUFBVWhCLEdBQzNCQSxHQUNGQSxFQUFZSSxnQkFJYixDQUNMLEdBQTJCLGdCQUF2QixJQUFBbkMsb0JBRUYsWUFEQXNYLEVBQUt3akYsZ0JBS0Z5QixNQUNILElBQUFwOEYsWUFHRixNQUFNMkIsR0FBUSxJQUFBKzZGLGtCQUFpQjdzRixFQUFJcUksUUFBU3JJLEVBQUlzSSxTQUVoRCxJQUFLeFcsRUFBTyxPQUVQQSxFQUFNckUsVUFBVThDLFNBQVMsZUFFNUIsSUFBQXNCLGFBQVlDLEVBQU9DLElBQ25CLElBQUFnQyxRQUFPakMsRUFBT2lCLEVBQVVoQixHQUNwQkEsR0FDRkEsRUFBWUksWUFJaEJMLEVBQU1nN0YsY0FBYyxJQUFJQyxXQUFXLFlBQWEsQ0FDOUNDLFFBQVNodEYsRUFBSWd0RixRQUNiQyxRQUFTanRGLEVBQUlpdEYsUUFDYjVrRixRQUFTckksRUFBSXFJLFFBQ2JDLFFBQVN0SSxFQUFJc0ksUUFDYjRrRixRQUFTbHRGLEVBQUlrdEYsUUFDYmpDLFNBQVVqckYsRUFBSWlyRixTQUNka0MsT0FBUW50RixFQUFJbXRGLE9BQ1pockYsUUFBU25DLEVBQUltQyxRQUNialAsS0FBTThNLEVBQUk5TSxRQTFJZCxTQUFTcTVGLElBQ1AsT0FBT24vRixPQUFPOGpELFVBQVVDLFVBQVVuN0MsTUFBTSxPQUFTZ0ssRUFBSW1DLFFBQVVuQyxFQUFJa3RGLFNBcEx2RSxnQ0FBc0M3akYsR0FDcEN1aEYsRUFBY3ZoRixHQU1oQixrQ0FBd0MrakYsRUFBY0MsR0FDcER0N0YsRUFBY3M3RixFQUNkdDZGLEVBQVdxNkYsRUFDWDlsRixFQUFPdlUsRUFBU3VVLEtBQ2hCakgsRUFBY3ROLEVBQVNHLEtBQUttTixhQW1JOUIsdUJBQTZCNlQsR0FDM0JubkIsU0FBU3FELGlCQUFpQjhqQixHQUFVN2pCLFFBQVFpOUYsSUFDMUNBLEVBQUk5a0csb0JBQW9CLFlBQWF1akcsR0FDckN1QixFQUFJamxHLGlCQUFpQixZQUFhMGpHLEtBSXBDaC9GLFNBQVNrUSxLQUFLelUsb0JBQW9CLFVBQVdxaUcsR0FDN0M5OUYsU0FBU2tRLEtBQUs1VSxpQkFBaUIsVUFBV3dpRyxHQUUxQzk5RixTQUFTa1EsS0FBS3pVLG9CQUFvQixVQUFXdWlHLEdBQzdDaCtGLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFVBQVcwaUcsR0FFMUNoK0YsU0FBU2tRLEtBQUt6VSxvQkFBb0IsVUFBV3dpRyxHQUM3Q2orRixTQUFTa1EsS0FBSzVVLGlCQUFpQixVQUFXMmlHLEdBRTFDaitGLFNBQVNDLGVBQWUsYUFDckIzRSxpQkFBaUIsY0FBZ0IyWCxJQUFVQSxFQUFJYSxtQkFFbEQ5VCxTQUFTcUQsaUJBQWlCLHNCQUFzQkMsUUFBUWk5RixJQUN0REEsRUFBSTlrRyxvQkFBb0IsUUFBU2lqRyxHQUNqQzZCLEVBQUlqbEcsaUJBQWlCLFFBQVNvakcsTUFtS2xDLHNCQUE0QnYzRSxHQUMxQixJQUFJcTVFLEVBQVcsRUFDWDN4RSxFQUFXLEVBQ1g0eEUsR0FBVSxFQUNWQyxHQUFnQixFQUdwQixNQUFNQyxFQUFTdjhGLEVBQUdtQixPQUFPNGhCLEdBdUt6Qi9pQixFQUFHQyxVQUFVOGlCLEVBQVMxWSxRQUFRLGVBQWdCLElBQUlDLFFBQy9DbFcsR0FBRyxRQUFTLE1BQ2YsTUFBTW9vRyxFQUFtQng4RixFQUFHa2pCLE9BQ3pCOXVCLEdBQUcsU0FsSU4sV0FDRSxJQUFLd04sRUFBVSxPQUNmLE1BQU1yRSxFQUFXcUUsRUFBU2k1RixjQUMxQixHQUE2QyxRQUF6Qzc2RixFQUFHbWpCLE1BQU1HLFlBQVk5d0IsT0FBT2lxRyxVQUFtQyxXQUFibC9GLEdBQWtFLFNBQXpDeUMsRUFBR21qQixNQUFNRyxZQUFZOXdCLE9BQU9pcUcsVUFDekcsR0FBS3o4RixFQUFHbWpCLE1BQU1HLFlBQVl3MkUsU0FXeEJ1QyxHQUFVLE9BQ1U5bkcsSUFBaEIyYSxHQUNGQSxFQUFZd3RGLGlCQVpkLElBQUs5Z0csU0FBU0MsZUFBZSxjQUFjUyxVQUFVOEMsU0FBUyxlQXZDMUNnWSxFQXdDRnBYLEVBQUc4ckIsTUFBTXo0QixNQTFCSCxJQWJid0QsTUFBTTRJLEtBQUs3RCxTQUFTbUQsdUJBQXVCLFVBQ2xDaUYsT0FBUXJELElBQzlCLE1BQU0rQixHQUFPLElBQUFvVSxjQUFhblcsR0FDcEIwRCxFQUFNM0IsRUFBSzJCLElBQ1hDLEVBQU01QixFQUFLNEIsSUFDWEMsRUFBTTdCLEVBQUs2QixJQUNYQyxFQUFNOUIsRUFBSzhCLElBQ1hDLEVBQVMvQixFQUFLK0IsT0FFcEIsT0FBUTJTLEVBQUcsR0FBSy9TLEdBQU8rUyxFQUFHLEdBQUs3UyxHQUM1QjZTLEVBQUcsR0FBTTlTLEdBQU84UyxFQUFHLEdBQUsvUyxHQUFPN0ksS0FBS3diLElBQUl2UyxJQUN4QzJTLEVBQUcsR0FBTTVTLEdBQU9ELEVBQU02UyxFQUFHLElBQU01YixLQUFLd2IsSUFBSXZTLEtBRTVCL08sUUEwQnNCLEVBQ2pDLElBQUFzSixZQUNBczlGLEdBQWdCLEVBQ2hCLE1BQU1LLEVBQVczOEYsRUFBRzhyQixNQUFNejRCLE1BQzFCK29HLEVBQVdPLEVBQVMsR0FDcEJseUUsRUFBV2t5RSxFQUFTLEdBdkJUdDRGLEVBd0JGKzNGLEVBeEJlOTNGLEVBd0JMbW1CLEVBdkJ6Qjh4RSxFQUFPOS9GLE9BQU8sUUFDWHdULEtBQUssSUFBSzVMLEdBQ1Y0TCxLQUFLLElBQUszTCxHQUNWMkwsS0FBSyxRQUFTLEdBQ2RBLEtBQUssU0FBVSxHQUNmQSxLQUFLLEtBQU0sY0FDWEEsS0FBSyxTQUFVLFNBQ2ZBLEtBQUssZUFBZ0J3cEYsR0FDckJ4cEYsS0FBSyxPQUFRLGNBdUJMalEsRUFBR21qQixNQUFNRyxZQUFZdzJFLFdBQzlCdUMsR0FBVSxPQUNVOW5HLElBQWhCMmEsR0FDRkEsRUFBWXd0RixhQW5DbEIsSUFBbUJyNEYsRUFBYUMsRUF0Qk44UyxLQXFLdkJoakIsR0FBRyxRQTlFTixXQUNFLElBQUtpb0csR0FBV0MsRUFBZSxDQUM3QixNQUFNTSxFQUFZNThGLEVBQUc4ckIsTUFBTXo0QixNQUNyQndwRyxFQUFPRCxFQUFVLEdBQ2pCRSxFQUFPRixFQUFVLElBdEIzQixTQUFxQkcsRUFBY0MsRUFBY0MsRUFBc0JDLEdBQ3JFbDlGLEVBQUdtQixPQUFPLGVBQ1A4TyxLQUFLLElBQUs4c0YsR0FDVjlzRixLQUFLLElBQUsrc0YsR0FDVi9zRixLQUFLLFFBQVNndEYsR0FDZGh0RixLQUFLLFNBQVVpdEYsR0F3QmhCQyxDQUxhTixFQUFPVCxFQUFXUyxFQUFPVCxFQUN6QlUsRUFBT3J5RSxFQUFXcXlFLEVBQU9yeUUsRUFDeEJveUUsRUFBT1QsRUFBV0EsRUFBV1MsRUFBT0EsRUFBT1QsRUFDMUNVLEVBQU9yeUUsRUFBV0EsRUFBV3F5RSxFQUFPQSxFQUFPcnlFLFFBR2pENHhFLFFBQ1c5bkcsSUFBaEIyYSxHQUNGQSxFQUFZcVUsY0FpRWZudkIsR0FBRyxPQTVETixXQUNFLElBQUtpb0csR0FBV0MsRUFBZSxDQUM3QixNQUFNYyxFQUFheGhHLFNBQVNDLGVBQWUsY0FDckN3aEcsRUFBSzV0RixTQUFTMnRGLEVBQVd4NEYsYUFBYSxNQUN0QzA0RixFQUFLN3RGLFNBQVMydEYsRUFBV3g0RixhQUFhLE1BQ3RDMjRGLEVBQUtGLEVBQUs1dEYsU0FBUzJ0RixFQUFXeDRGLGFBQWEsVUFDM0M0NEYsRUFBS0YsRUFBSzd0RixTQUFTMnRGLEVBQVd4NEYsYUFBYSxXQUczQ3kxQixFQUFPa2lFLEVBQU9saUUsT0FDcEIsSUFBSW1nRSxFQUFLLElBQUluakYsU0FBU2dtRixFQUFJQyxHQUFLN0MsRUFBSyxJQUFJcGpGLFNBQVNrbUYsRUFBSUMsR0FDckQsTUFBTXo3QixFQUFZMW5DLEVBQUs3aUIsZUFBZUMsVUFDbkNpdkUsU0FBVTZWLEVBQU9wN0YsT0FBTyxXQUFXazVCLE9BQThCN2lCLGdCQUNqRUMsVUFDSCtpRixFQUFLQSxFQUFHampGLGdCQUFnQndxRCxHQUN4QjA0QixFQUFLQSxFQUFHbGpGLGdCQUFnQndxRCxHQUd4QixNQUVNMDdCLEVBakRWLFNBQWdDMTZFLEdBQzlCLE9BQUlubkIsU0FBU0MsZUFBZSxjQUFjUyxVQUFVOEMsU0FBUyxhQUNwRHZJLE1BQU00SSxLQUFLN0QsU0FBU3FELGlCQUFpQjhqQixFQUFXLFNBQVdBLEVBQVcsWUFFM0VxM0UsSUFDS3ZqRyxNQUFNNEksS0FBSzdELFNBQVNxRCxpQkFBaUI4akIsRUFBVywwQkFFbERsc0IsTUFBTTRJLEtBQUs3RCxTQUFTcUQsaUJBQWlCOGpCLEVBQVcsU0F3Q3BDMjZFLENBQXNCMzZFLEdBRUwvZSxPQUFPOUQsR0FBTXE2RixFQUFnQnI2RixFQUFJczZGLEVBQUlDLElBR3ZFZ0QsRUFBaUJ2K0YsUUFBU0osSUFDeEIsR0FBd0IsUUFBcEJBLEVBQVFpWixTQUFxQmpaLEVBQVE4RixhQUFhLGNBQWNDLE1BQU0sa0JBQW1CLENBQzNGLE1BQU1oRixFQUFRZixFQUFReUMsUUFBUSxVQUN4Qnk1RixFQUFVbmtHLE1BQU00SSxLQUFLSSxFQUFNMkcsVUFBVTNDLFFBQVEvRSxFQUFReUMsUUFBUSxRQUNuRSxHQUFJekMsRUFBUThGLGFBQWEsY0FBY0MsTUFBTSxjQUFlLENBRTFELE1BQ01zMkYsRUFEV3Q3RixFQUFNMkcsU0FBU3cwRixFQUFVLEdBQ2ZuNEYsY0FBYyxPQUNyQzQ2RixFQUFpQjU1RixRQUFRczNGLEdBQWEsR0FDeENzQyxFQUFpQmhvRyxLQUFLMGxHLE9BRW5CLENBRUwsTUFDTUYsRUFEVXA3RixFQUFNMkcsU0FBU3cwRixFQUFVLEdBQ2hCbjRGLGNBQWMsT0FDbkM0NkYsRUFBaUI1NUYsUUFBUW8zRixHQUFZLEdBQ3ZDd0MsRUFBaUJob0csS0FBS3dsRyxRQUs5QixJQUFBaDdGLFdBQVV3OUYsRUFBa0I3N0YsRUFBVWhCLEdBRWxDQSxHQUNGQSxFQUFZSSxXQUVkaEIsRUFBR0MsVUFBVSxlQUFlbkUsU0FDNUJ3Z0csR0FBZ0IsRUFFbEJELEdBQVUsS0FTWkUsRUFBT2pzRyxLQUFLa3NHLEdBQ1I1N0YsR0FDRkEsRUFBWSs4RixRQUFRbkIsSyw4TUMvZ0J4QixjQUNBLFFBQ0EsT0FrQkEsU0FBU29CLEVBQWVyOUUsRUFBY0gsR0FDcEMsSUFBSyxNQUFNblEsS0FBUXNRLEVBQUkxZSxXQUNyQnVlLEVBQUl4Z0IsYUFBYXFRLEVBQUt2ZixLQUFNdWYsRUFBSzdlLE9BNk1yQyxTQUFnQnlzRyxFQUFnQnIzRSxHLE1BQzlCLE1BQU03akIsRUFBbUMsUUFBN0IsRUFBQTZqQixFQUFTM2pCLGNBQWMsY0FBTSxlQUFFaTdGLFdBQVcsR0FDdEQsSUFBSWgwRixFQU9KLE9BTEVBLEVBREVuSCxFQUNRQSxFQUFJbzdGLFVBRUosSUFHTGowRixFQU1ULFNBQWdCazBGLEVBQ2RDLEVBQ0FDLEdBRUEsTUFBTTM1RixFQUFNa0wsU0FBU3l1RixFQUFLdDVGLGFBQWEsUUFDakNKLEVBQU1pTCxTQUFTeXVGLEVBQUt0NUYsYUFBYSxRQUNqQ1AsRUFBTW9MLFNBQVN5dUYsRUFBS3Q1RixhQUFhLFFBQ2pDTixFQUFNbUwsU0FBU3l1RixFQUFLdDVGLGFBQWEsUUFFakN1NUYsRUFBb0IsSUFBUjU1RixHQUFxQixJQUFSQyxHQUFxQixJQUFSSCxHQUFxQixJQUFSQyxFQUNuRDg1RixFQUF5Qjc1RixFQUFNLEdBQUtDLEVBQU0sR0FBS0gsRUFBTSxHQUFLQyxFQUFNLEVBRWhFeEYsRUFBVW0vRixFQUFJcDdGLGNBQ2xCLFdBQVcsSUFBTXE3RixFQUFLdDVGLGFBQWEsZUFFckMsT0FBSXU1RixHQUFhQyxJQUEyQnQvRixFQUFnQixFQUFDLEVBQU1BLEdBQzVELEVBQUMsR0EwYVYsU0FBU3UvRixFQUNQNzNFLEVBQ0FELEVBQ0FSLEdBR0EsTUFBTVcsRUFBaUJGLEVBQVM1aEIsYUFBYSxZQUFZeUYsUUFBUSxJQUFLLElBR3RFLElBQUlzYyxFQUNKLE1BQU1DLEVBQWViLEVBQVVsWixLQUFLLENBQUMvTixFQUFTeW5CLElBQ3hDem5CLEVBQVE4RixhQUFhLFlBQWM4aEIsSUFDckNDLEVBQWtCSixHQUNYLElBT1gsSUFBS0ssRUFDSCxNQUFPLFNBQVNKLEVBQVN6TyxnQkFBZ0I4bEYsRUFDdkNyM0Usb0JBQ2lCQSxFQUFTNWhCLGFBQzFCLDRDQUtKLElBQUtnaUIsRUFBYWpELGFBQWEsV0FDN0IsTUFBTyxtQ0FDTDZDLEVBQVN6TyxnQkFDRjhsRixFQUFnQnIzRSxvQkFBMkJBLEVBQVM1aEIsYUFDM0QsNENBS0osR0FDRWdpQixFQUFhaGlCLGFBQWEsWUFDMUIsSUFBTTRoQixFQUFTNWhCLGFBQWEsVUFFNUIsTUFBTyxtQ0FDTDRoQixFQUFTek8sZ0JBQ0Y4bEYsRUFBZ0JyM0Usb0JBQTJCQSxFQUFTNWhCLGFBQzNELDhDQU9KLEdBQUkraEIsSUFBb0JKLEVBQU0sRUFBRyxDQUMvQixNQUtNKzNFLEVBQVcsQ0FMRFQsRUFBZ0JyM0UsTUFDTFQsRUFDeEJoeUIsTUFBTXd5QixFQUFNLEVBQUdJLEdBQ2Y3aEIsSUFBSzBoQixHQUFhcTNFLEVBQWdCcjNFLEtBRWEzUyxLQUFLLE9BQ3ZELE1BQU8scURBQ0wyUyxFQUFTek8sZ0JBQ0Z1bUYsbUJBQTBCOTNFLEVBQVM1aEIsYUFDMUMsK0NBS04sU0FBUzI1RixFQUFxQi8zRSxFQUFtQlQsR0FDL0MsTUFBTWMsRUFBaUJMLEVBQVM1aEIsYUFBYSxXQUFXeUYsUUFBUSxJQUFLLElBQy9EeWMsRUFBZWYsRUFBVWxaLEtBQzVCMlosR0FBYUEsRUFBUzVoQixhQUFhLFlBQWNpaUIsR0FJcEQsT0FBS0MsRUFTQUEsRUFBYW5ELGFBQWEsWUFVN0JtRCxFQUFhbGlCLGFBQWEsYUFDMUIsSUFBTTRoQixFQUFTNWhCLGFBQWEsVUFFckIsbUNBQ0w0aEIsRUFBU3pPLGdCQUNGOGxGLEVBQ1AvMkUsb0JBQ2lCTixFQUFTNWhCLGFBQzFCLG1EQVRKLEVBUlMsbUNBQ0w0aEIsRUFBU3pPLGdCQUNGOGxGLEVBQWdCcjNFLG9CQUEyQkEsRUFBUzVoQixhQUMzRCw0Q0FaSyxTQUFTNGhCLEVBQVN6TyxnQkFBZ0I4bEYsRUFDdkNyM0Usb0JBQ2lCQSxFQUFTNWhCLGFBQzFCLDRDQTRCTixTQUFTNDVGLEVBQWFoNEUsR0FDcEIsTUFBTWdCLEVBQU1oQixFQUFTdm5CLGlCQUFpQixNQUN0QyxJQUFJdy9GLEVBQVEsRUFDUnRvRixFQUFPLEdBQ1gsS0FBT3NvRixFQUFRajNFLEVBQUk5eEIsUUFDYjh4QixFQUFJaTNFLEdBQU83NUYsYUFBYSxjQUV2QjY1RixFQUFRajNFLEVBQUk5eEIsT0FBUyxJQUFNOHhCLEVBQUlpM0UsRUFBUSxHQUFHNzVGLGFBQWEsWUFDeEQ2NUYsR0FBU2ozRSxFQUFJOXhCLE9BQVMsS0FJdEJ5Z0IsR0FBUSw4QkFBOEIwbkYsRUFDcENyM0Usb0JBQ2lCQSxFQUFTNWhCLGFBQWEsZUFFM0M2NUYsR0FBUyxHQUVYQSxHQUFTLEVBR1gsT0FBT3RvRixFQW9CVCxTQUFTdW9GLEVBQW9CNS9GLEVBQWtCckUsR0FDekNxRSxFQUFRNmtCLGFBQWEsU0FBU2xwQixFQUFNaEYsS0FBS3FKLEdBQzdDLElBQUssTUFBTTZkLEtBQVM3ZCxFQUFRMEgsU0FFMUJrNEYsRUFBb0IvaEYsRUFBT2xpQixHQUU3QixPQUFPQSxFQTd6QlQsZUFBdUJra0csRUFBa0JDLEdBQ3ZDLE1BQU1qc0YsRUFBUyxHQUNmLElBQ0UsSUFBSXhpQixFQUFJLEVBQ1JBLEdBQUt3dUcsRUFBT2pwRyxPQUFTa3BHLEVBQU9scEcsT0FBU2twRyxFQUFPbHBHLE9BQVNpcEcsRUFBT2pwRyxRQUM1RHZGLElBRUF3aUIsRUFBT2xkLEtBQUssQ0FBQ2twRyxFQUFPeHVHLEdBQUl5dUcsRUFBT3p1RyxLQUVqQyxPQUFPd2lCLEdBU1QseUJBQThCa3NGLEdBQzVCLE1BQU10cEUsRUFBUyxJQUFJdXBFLFVBQ2JDLEVBQWEsSUFBSUMsY0FDakJDLEVBQVMxcEUsRUFBTzJwRSxnQkFBZ0JMLEVBQWUsWUFDL0NaLEVBQU1nQixFQUFPbkwsZ0JBQ25CLElBQUlxTCxFQUFPLEVBRVgsTUFBTUMsRUFBV3ZvRyxNQUFNNEksS0FDckJ3K0YsRUFBSWgvRixpQkFBaUIsMENBRXZCLElBQUssTUFBTW9nRyxLQUFXRCxFQUFVLENBRWxCQyxFQUFRcGdHLGlCQUFpQixNQUNqQ0MsUUFBU29nRyxHQUFPQSxFQUFHeGpHLFVBQ1h1akcsRUFBUXBnRyxpQkFBaUIsTUFDakNDLFFBQVNxZ0csR0FBT0EsRUFBR3pqRyxVQUV2QixNQUFNMGpHLEVBQVdQLEVBQU9RLGdCQUN0Qix1Q0FDQSxTQUVJQyxFQUFXVCxFQUFPUSxnQkFDdEIsdUNBQ0EsU0FFRkQsRUFBUzUvRixhQUFhLElBQUssS0FDM0I4L0YsRUFBUzkvRixhQUFhLElBQUssS0FDM0I0L0YsRUFBU2wyRSxZQUFZbzJFLEdBR3JCLE1BQU1DLEVBQVUxQixFQUFJcDdGLGNBQWMsV0FDNUIrOEYsRUFBWUQsRUFBUS82RixhQUFhLFVBQ2pDMDZGLEVBQUtMLEVBQU9RLGdCQUNoQix1Q0FDQSxNQUVGSCxFQUFHMS9GLGFBQWEsU0FBVSxNQUFPLElBQUF4RSxXQUNqQ2trRyxFQUFHMS9GLGFBQWEsT0FBUSxJQUFNZ2dHLEdBQzlCRixFQUFTcDJFLFlBQVlnMkUsR0FFckIsTUFBTU8sRUFBd0JocEcsTUFBTTRJLEtBQ2xDNC9GLEVBQVFwZ0csaUJBQWlCLG9DQUUzQixJQUFJNmdHLEVBQVMsRUFDVEMsRUFBa0IsS0FFdEIsSUFBSyxNQUFNQyxLQUF3QkgsRUFBdUIsQ0FDeERDLEdBQVUsRUFDVixNQUFNbi9GLEVBQVFxL0YsRUFBcUJuOUYsY0FBYyxTQUNqRCxJQUFLbEMsRUFBTyxDQUNWcS9GLEVBQXFCbGtHLFNBQ3JCLFNBRUYsTUFBTW1rRyxFQUFRdC9GLEVBQU1rQyxjQUFjLFNBSWxDLEdBQ0VsQyxFQUFNZ2pCLGFBQWEsU0FDbkJoakIsRUFBTWlFLGFBQWEsU0FBVyxTQUFXdTZGLEVBQUt4ekYsV0FDOUMsQ0FDQXd6RixHQUFRLEVBQ1IsTUFBTXBqRixFQUFLa2pGLEVBQU9RLGdCQUNoQix1Q0FDQSxNQUVGMWpGLEVBQUduYyxhQUFhLElBQUt1L0YsRUFBS3h6RixZQUMxQm9RLEVBQUduYyxhQUFhLFNBQVUsTUFBTyxJQUFBeEUsV0FDakMyZ0IsRUFBR25jLGFBQWEsT0FBUSxPQUFRLElBQUF4RSxXQUNoQ3NrRyxFQUFTcDJFLFlBQVl2TixHQUdqQmdrRixHQUNGRyxFQUFvQkgsRUFBUWhrRixFQUFJNGpGLEdBRWxDSSxFQUFTaGtGLEVBR1gsTUFBTXdqRixFQUFLTixFQUFPUSxnQkFDaEIsdUNBQ0EsTUFFRkYsRUFBRzMvRixhQUFhLElBQUtrZ0csRUFBT24wRixZQUM1QjR6RixFQUFHMy9GLGFBQWEsT0FBUWUsRUFBTWlFLGFBQWEsU0FDM0MyNkYsRUFBRzMvRixhQUFhLFNBQVVlLEVBQU1pRSxhQUFhLFdBRzdDLElBQUl1N0YsT0FBa0I1ckcsRUFZdEIsSUFWZ0MsT0FBOUJtckcsRUFBU1Usa0JBQzZCLFdBQXRDVixFQUFTVSxpQkFBaUJyb0YsVUFFMUJvb0YsRUFBU1QsRUFBUzdMLFlBQVk2TCxFQUFTVSx3QkFHMUI3ckcsSUFBWDRyRyxHQUFzQlQsRUFBU3AyRSxZQUFZNjJFLEdBQy9DVCxFQUFTcDJFLFlBQVlpMkUsR0FHYyxPQUE1QlUsRUFBTUksbUJBQ1hYLEVBQVNwMkUsWUFBWTIyRSxFQUFNSSxtQkFFN0JMLEVBQXFCbGtHLFNBSW5CaWtHLEdBQ0ZHLEVBQW9CSCxFQUFRLEtBQU1KLEdBRXBDTixFQUFRLzFFLFlBQVlrMkUsR0FJdEIsR0FBSUwsRUFBTSxDQUNSLE1BQU1tQixFQUFXckMsRUFBSXA3RixjQUFjLFlBQzdCMDlGLEVBQVl0QixFQUFPUSxnQkFDdkIsdUNBQ0EsYUFFRmMsRUFBVTNnRyxhQUFhLFNBQVUsTUFBTyxJQUFBeEUsV0FDeENtbEcsRUFBVTNnRyxhQUFhLElBQUt1L0YsRUFBS3h6RixZQUNqQzIwRixFQUFTRSxzQkFBc0IsV0FBWUQsR0FHN0MsT0FBT2xQLEVBQVdLLElBQUlxTixFQUFXMEIsa0JBQWtCeEIsSUFFbkQsU0FBU2lCLEVBQ1BRLEVBQ0FDLEVBQ0FoQixHQUdBLE1BQU1pQixFQXFCUixTQUFTQyxFQUNQL2hHLEVBQ0E2aEcsRUFDQUMsRUFBa0IsSUFFbEIsR0FBSTloRyxHQUFXQSxJQUFZNmhHLEVBQVksQ0FJckMsR0FGSTdoRyxFQUFRNmtCLGFBQWEsU0FBU2k5RSxFQUFnQm5yRyxLQUFLcUosR0FFbkRBLEVBQVEwSCxTQUFTOVEsT0FBUyxFQUM1QixJQUFLLE1BQU1pbkIsS0FBUzdkLEVBQVEwSCxTQUMxQnE2RixFQUEyQmxrRixFQUFPZ2tGLEVBQVlDLEdBSTlDOWhHLEVBQVFnaUcsb0JBQ1ZELEVBQ0UvaEcsRUFBUWdpRyxtQkFDUkgsRUFDQUMsR0FLTixPQUFPQSxFQTdDaUJDLENBQ3RCSCxFQUFhSSxtQkFDYkgsR0FJSXpDLEVBQU9lLEVBQU9RLGdCQUNsQix1Q0FDQSxRQUVJc0IsRUFzQ1IsU0FBdUIxK0YsRUFBcUJzOUYsR0FDMUMsSUFBSXA3RixFQUFNZ25DLElBQ04vbUMsRUFBTSxFQUNOSCxFQUFNLEVBQ05DLEVBQU1pbkMsSUFhVixPQVhBbHBDLEVBQVNuRCxRQUFTSixJQUNoQixNQUFNby9GLEVBQU9ybkcsTUFBTTRJLEtBQUtrZ0csRUFBUW41RixVQUFVcUcsS0FDdkNxeEYsR0FDQ0EsRUFBS3Q1RixhQUFhLFlBQWM5RixFQUFROEYsYUFBYSxRQUFRN1EsTUFBTSxJQUV2RXdRLEVBQU0vSSxLQUFLd0osSUFBSVQsRUFBS2tMLFNBQVN5dUYsRUFBS3Q1RixhQUFhLFNBQy9DSixFQUFNaEosS0FBS0MsSUFBSStJLEVBQUtpTCxTQUFTeXVGLEVBQUt0NUYsYUFBYSxTQUMvQ1AsRUFBTTdJLEtBQUtDLElBQUk0SSxFQUFLb0wsU0FBU3l1RixFQUFLdDVGLGFBQWEsU0FDL0NOLEVBQU05SSxLQUFLd0osSUFBSVYsRUFBS21MLFNBQVN5dUYsRUFBS3Q1RixhQUFhLFdBRzFDLENBQUVMLE1BQUtDLE1BQUtILE1BQUtDLE9BdkRYMDhGLENBQWNKLEVBQWlCakIsR0FDNUN6QixFQUFLdCtGLGFBQWEsTUFBT21oRyxFQUFLeDhGLElBQUlvSCxZQUNsQ3V5RixFQUFLdCtGLGFBQWEsTUFBT21oRyxFQUFLdjhGLElBQUltSCxZQUNsQ3V5RixFQUFLdCtGLGFBQWEsTUFBT21oRyxFQUFLMThGLElBQUlzSCxZQUNsQ3V5RixFQUFLdCtGLGFBQWEsTUFBT21oRyxFQUFLejhGLElBQUlxSCxZQUNsQ3V5RixFQUFLdCtGLGFBQWEsU0FBVThnRyxFQUFhOTdGLGFBQWEsUUFBUTdRLE1BQU0sSUFHcEU0ckcsRUFBUXNCLGFBQWEvQyxFQUFNeUIsRUFBUVUscUJBbUR2QyxvQkFlQSxrQkE0QkEsNEJBQWlDYSxHQUMvQixNQUNNakMsR0FEUyxJQUFJSCxXQUNHSSxnQkFBZ0JnQyxFQUFZLFlBQzVDakQsRUFBTWdCLEVBQU9uTCxnQkFDbkIsSUFBSXFOLEdBQVUsRUFFSWxELEVBQUlwN0YsY0FBYyxhQUMxQmpELGFBQWEsT0FBUSxpQkFJL0IsTUFBTSsvRixFQUFVMUIsRUFBSXA3RixjQUFjLFdBQ2xDLElBQUl1K0YsR0FBaUIsRUFDckIsTUFBTUMsRUFBUXhxRyxNQUFNNEksS0FBS2tnRyxFQUFRMkIscUJBQXFCLFNBQ3RELElBQUlDLEVBQW1CLHdDQUN2QixJQUFLLE1BQU1yRCxLQUFRbUQsRUFBTyxDQUN4QixNQUFPRyxFQUFXMWlHLEdBQVdrL0YsRUFBY0MsRUFBS0MsR0FDNUNzRCxJQUNGSixHQUFpQixFQUNqQkcsR0FBb0IsdUJBQXVCckQsRUFBS3Q1RixhQUFhLGFBRXpEOUYsR0FDRnlpRyxHQUFvQixXQUNsQnppRyxFQUFRaVosNEJBQ1dqWixFQUFROEYsYUFBYSxjQUMxQzlGLEVBQVFtWixXQUFXNDdFLFlBQVkvMEYsSUFFL0J5aUcsR0FBb0Isa0NBRXRCckQsRUFBS2ptRixXQUFXNDdFLFlBQVlxSyxJQUc1QmtELEdBQ0ZwbUcsRUFBYThCLGtCQUNYLCtDQUNBLFVBQ0F5a0csR0FNSixNQUFNaEIsRUFBWXRDLEVBQUlwN0YsY0FBYyxhQUNoQzA5RixJQUNGWSxHQUFVLEVBQ1ZaLEVBQVV0b0YsV0FBVzQ3RSxZQUFZME0sSUFNbkMsTUFBTXg2RSxFQUFZbHZCLE1BQU00SSxLQUFLdytGLEVBQUlxRCxxQkFBcUIsYUFDdEQsSUFBSUcsR0FBbUIsRUFDbkJDLEdBQWdCLEVBQ2hCQyxHQUFvQixFQUNwQkMsRUFDRiw2RUFDRUMsR0FBa0IsRUFDbEJDLEVBQ0YsMkVBQ0VDLEVBQW9CLGlEQUNwQkMsRUFBaUIsd0RBQ3JCLElBQUssTUFBTXg3RSxLQUFZVCxFQUFXLENBQ3NCLElBQWxEUyxFQUFTODZFLHFCQUFxQixTQUFTNXJHLFNBQ3pDK3JHLEdBQW1CLEVBQ25CTSxHQUFxQixTQUNuQnY3RSxFQUFTek8sNEJBQ1V5TyxFQUFTNWhCLGFBQWEsY0FDdkM0aEIsRUFBUzg2RSxxQkFBcUIsV0FBVzVyRyxPQUFTLElBQ3BEaXNHLEdBQW9CLEVBQ3BCQyxHQUFzQiwwREFBMERwN0UsRUFBUzVoQixhQUN2RixlQUdBNGhCLEVBQVM4NkUscUJBQXFCLFNBQVM1ckcsT0FBUyxJQUNsRG1zRyxHQUFrQixFQUNsQkMsR0FBb0Isd0RBQXdEdDdFLEVBQVM1aEIsYUFDbkYsZ0JBTU4sTUFBTXE5RixFQUFTejdFLEVBQVM4NkUscUJBQXFCLFNBQzdDLElBQUssTUFBTXpoRyxLQUFTb2lHLEVBQVEsQ0FDMUIsTUFBTXo2RSxFQUFNM3dCLE1BQU00SSxLQUFLSSxFQUFNeWhHLHFCQUFxQixPQUNsRCxHQUFtQixJQUFmOTVFLEVBQUk5eEIsT0FDTmdzRyxHQUFnQixFQUNoQk0sR0FBa0IsU0FDaEJuaUcsRUFBTWtZLDRCQUNhbFksRUFBTStFLGFBQWEsbUJBSXhDLElBQUssTUFBTWpELEtBQU02bEIsRUFDZixHQUFJN2xCLEVBQUdnaUIsYUFBYSxVQUFtQyxJQUF2QmhpQixFQUFHNkUsU0FBUzlRLE9BQWMsQ0FDeEQsTUFBTXdzRyxFQUFNakQsRUFBT1EsZ0JBQ2pCLHVDQUNBLGNBRUZ5QyxFQUFJdGlHLGFBQWEsU0FBVSxNQUFPLElBQUF4RSxXQUNsQ3VHLEVBQUcybkIsWUFBWTQ0RSxLQU9yQlQsR0FDRnptRyxFQUFhOEIsa0JBQ1gsZ0RBQ0EsVUFDQWlsRyxHQUdBTCxHQUNGMW1HLEVBQWE4QixrQkFDWCx1REFDQSxVQUNBa2xHLEdBR0FMLEdBQ0YzbUcsRUFBYThCLGtCQUNYLDBEQUNBLFVBQ0E4a0csR0FHQUMsR0FDRjdtRyxFQUFhOEIsa0JBQ1gsd0RBQ0EsVUFDQWdsRyxHQUtKLE1BQU0xQyxFQUFXdm9HLE1BQU00SSxLQUFLdytGLEVBQUlxRCxxQkFBcUIsWUFDckQsSUFBSyxNQUFNakMsS0FBV0QsRUFBVSxDQUc5QixNQUFNK0MsRUFBaUJ0ckcsTUFBTTRJLEtBQUs0L0YsRUFBUWlDLHFCQUFxQixVQUMvRCxJQUFLLE1BQU0zZ0csS0FBU3doRyxFQUFnQixDQUVsQyxNQUFNQyxFQUFRbkQsRUFBT1EsZ0JBQ25CLHVDQUNBLE1BRUYyQyxFQUFNeGlHLGFBQWEsT0FBUSxJQUFNKy9GLEVBQVEvNkYsYUFBYSxXQUN0RHk2RixFQUFRNEIsYUFBYW1CLEVBQU96aEcsR0FFNUIsTUFBTXMvRixFQUFRdC9GLEVBQU1rQyxjQUFjLFNBRTVCdy9GLEVBQVV4ckcsTUFBTTRJLEtBQUt3Z0csRUFBTXFCLHFCQUFxQixPQUd0RCxJQUFLLE1BQU0vQixLQUFNOEMsRUFDZixHQUFpQyxVQUE3QjlDLEVBQUd4L0YsY0FBY2dZLFFBQXFCLENBQ3hDLE1BQU11cUYsRUFBd0IvQyxFQUFHeC9GLGNBQ2pDLElBQUl3aUcsR0FBYyxFQUNoQkMsR0FBYSxFQUNmLE1BQU1DLEVBQWE1ckcsTUFBTTRJLEtBQUs2aUcsRUFBYTk3RixVQUNyQ2s4RixFQUFVRCxFQUFXNStGLFFBQVEwN0YsR0FDbkMsSUFBSyxNQUFNMS9GLEtBQVN5aUcsRUFBYWhCLHFCQUFxQixTQUFVLENBQzlELE1BQU10SCxFQUFNeUksRUFBVzUrRixRQUFRaEUsR0FDM0JtNkYsRUFBTTBJLEVBQ1JILEdBQWMsRUFDTHZJLEVBQU0wSSxJQUNmRixHQUFhLEdBTWpCLElBQUtELEdBQWVDLEVBQ2xCRixFQUFhOUIsc0JBQXNCLGNBQWVqQixRQUM3QyxHQUFJZ0QsSUFBZ0JDLEVBQ3pCRixFQUFhOUIsc0JBQXNCLFdBQVlqQixRQUMxQyxHQUFJZ0QsR0FBZUMsRUFBWSxDQUVwQyxNQUFNRyxFQUFjMUQsRUFBT1EsZ0JBQ3pCLHVDQUNBLFlBRUZrRCxFQUFZL2lHLGFBQWEsU0FBVSxNQUFPLElBQUF4RSxXQUMxQ3VuRyxFQUFZL2lHLGFBQ1YsVUFDQSxJQUFNMGlHLEVBQWExOUYsYUFBYSxXQUVsQzA5RixFQUFhMWlHLGFBQ1gsV0FDQSxJQUFNK2lHLEVBQVkvOUYsYUFBYSxXQUdqQyxNQUFNODlGLEVBQVVELEVBQVc1K0YsUUFBUTA3RixHQUVuQyxJQUFLLE1BQU01aUYsS0FBUzhsRixFQUFZLENBQ2hCQSxFQUFXNStGLFFBQVE4WSxHQUNyQitsRixHQUNWQyxFQUFZcjVFLFlBQVkzTSxHQUk1QjJsRixFQUFhOUIsc0JBQXNCLFdBQVlqQixHQUMvQ0EsRUFBR2lCLHNCQUFzQixXQUFZbUMsR0FHckMsSUFBSyxNQUFNeEMsS0FBVW1DLEVBQWFoQixxQkFBcUIsVUFDckRnQixFQUFhOUIsc0JBQXNCLFdBQVlMLEdBSWpELElBQUssTUFBTXlDLEtBQVFELEVBQVlyQixxQkFBcUIsUUFDbERxQixFQUFZbkMsc0JBQXNCLGNBQWVvQyxRQUduRDVzRyxRQUFRQyxLQUFLLDBCQUNiRCxRQUFRNnNHLE1BQU1QLEdBS3BCLE1BQU1RLEVBQU1qc0csTUFBTTRJLEtBQUt3Z0csRUFBTXFCLHFCQUFxQixPQUM1Q3lCLEVBQWdCbHNHLE1BQU00SSxLQUFLd2dHLEVBQU16NUYsVUFDdkMsSUFBSTI0RixFQUFPLEVBQ1gsSUFBSyxJQUFJaHZHLEVBQUksRUFBR0EsRUFBSTJ5RyxFQUFJcHRHLE9BQVF2RixJQUFLLENBQ25DLE1BQU02eUcsRUFBWUYsRUFBSTN5RyxHQUNoQjh5RyxFQUFTSCxFQUFJcHRHLE9BQVN2RixFQUFJLEVBQUkyeUcsRUFBSTN5RyxFQUFJLFFBQUtvRSxFQUUzQzJ1RyxFQUFRakUsRUFBT1EsZ0JBQ25CLHVDQUNBLE1BRUZ5RCxFQUFNdGpHLGFBQWEsU0FBVSxNQUFPLElBQUF4RSxXQUNwQzhuRyxFQUFNdGpHLGFBQWEsT0FBUW9qRyxFQUFVcCtGLGFBQWEsU0FFbEQsTUFBTXUrRixFQUFhbEUsRUFBT1EsZ0JBQ3hCLHVDQUNBLFdBRUYwRCxFQUFXdmpHLGFBQWEsT0FBUSxtQkFFaEMsTUFBTTQvRixFQUFXUCxFQUFPUSxnQkFDdEIsdUNBQ0EsU0FFRjdCLEVBQWVvRixFQUFXeEQsR0FDMUJBLEVBQVM1L0YsYUFBYSxJQUFLLEtBQzNCLE1BQU13akcsRUFBYUwsRUFBY2wvRixRQUFRbS9GLEdBQ3pDLEdBQUk3QixFQUFTLENBQ1gsR0FBaUQsT0FBN0M0QixFQUFjdDhFLEdBQUcyOEUsRUFBYSxHQUFHcnJGLFFBQWtCLENBQ3JEb25GLEdBQVEsRUFFUixNQUFNcGpGLEVBQUtnbkYsRUFBY3Q4RSxHQUFHMjhFLEVBQWEsR0FDbkNDLEVBQVN0bkYsRUFBR25YLGFBQWEsUUFDekIwK0YsRUFBU3pzRyxNQUFNNEksS0FBS2tnRyxFQUFRMWdHLGlCQUFpQixTQUFTNE4sS0FDekRxeEYsR0FBU0EsRUFBS3Q1RixhQUFhLFlBQWN5K0YsRUFBT3R2RyxNQUFNLElBRXpEZ29CLEVBQUc5RCxXQUFXNDdFLFlBQVk5M0UsR0FDMUJ1bkYsRUFBT3JyRixXQUFXNDdFLFlBQVl5UCxHQUVoQzlELEVBQVM1L0YsYUFBYSxPQUFRLFNBQVd1L0YsRUFBS3h6RixZQUdoRCxNQUFNK3pGLEVBQVdULEVBQU9RLGdCQUN0Qix1Q0FDQSxTQUVGQyxFQUFTOS9GLGFBQWEsSUFBSyxLQUMzQjgvRixFQUFTOS9GLGFBQWEsU0FBVSxNQUFPLElBQUF4RSxXQUN2QytuRyxFQUFXNzVFLFlBQVlrMkUsR0FDdkJBLEVBQVNsMkUsWUFBWW8yRSxHQUVyQixNQUFNNkQsRUFBZ0Ixc0csTUFBTTRJLEtBQUt3Z0csRUFBTXo1RixVQUNqQ2lpRSxFQUFZODZCLEVBQWN4dkcsTUFDOUJ3dkcsRUFBYzEvRixRQUFRbS9GLEdBQWEsRUFDbkNPLEVBQWMxL0YsUUFBUW8vRixJQUd4QixJQUFLLE1BQU10bUYsS0FBUzhyRCxFQUNsQmkzQixFQUFTcDJFLFlBQVkzTSxHQUt2QixJQUFLc21GLEVBQVEsQ0FDWCxNQUNNTyxFQUFlOUUsRUFERDZFLEVBQWM5OEUsSUFBSSxHQUNnQixJQUN0RCxJQUFLLE1BQU05SixLQUFTNm1GLEVBQWMsQ0FDaEMsTUFBTXRGLEVBQU9tRCxFQUFNeDBGLEtBQ2hCNDJGLEdBQ0NBLEVBQUU3K0YsYUFBYSxXQUFhK1gsRUFBTS9YLGFBQWEsUUFBUTdRLE1BQU0sSUFFN0RtcUcsR0FBUW1ELEVBQU0zckcsT0FBUyxHQUN6QndvRyxFQUFLam1GLFdBQVc0N0UsWUFBWXFLLElBS2xDbUIsRUFBUTRCLGFBQWFpQyxFQUFPdmlHLEdBQzVCMCtGLEVBQVE0QixhQUFha0MsRUFBWXhpRyxHQUVuQ0EsRUFBTTdFLFVBS1YsTUFBTTRuRyxFQUFlN3NHLE1BQU00SSxLQUFLdytGLEVBQUlxRCxxQkFBcUIsYUFDekQsSUFBSXFDLEdBQWdCLEVBQ2hCQyxFQUNGLGlFQUNFQyxHQUFpQixFQUNqQkMsRUFBcUIsOENBQ3pCLElBQUssTUFBTXQ5RSxLQUFZeTNFLEVBQUloL0YsaUJBQWlCLFlBQWEsQ0FDdkQsSUFBSyxNQUFNMmpHLEtBQVFwOEUsRUFBU3ZuQixpQkFBaUIsUUFDM0N1bkIsRUFBU2c2RSxzQkFBc0IsY0FBZW9DLEdBRWhELElBQUssTUFBTXpDLEtBQVUzNUUsRUFBU3ZuQixpQkFBaUIsVUFDN0N1bkIsRUFBU2c2RSxzQkFBc0IsV0FBWUwsR0FLN0MsTUFBTTRELEVBQWN2RixFQUFhaDRFLEdBQzdCdTlFLElBQ0ZGLEdBQWlCLEVBQ2pCQyxHQUFzQkMsR0FLeEIsTUFBTUMsRUFBY04sRUFBYTcvRixRQUFRMmlCLEdBSXpDLEdBQUlBLEVBQVM3QyxhQUFhLFlBQWEsQ0FDckMsTUFBTXhOLEVBQU9rb0YsRUFBc0I3M0UsRUFBVXc5RSxFQUFhTixHQUN0RHZ0RixJQUNGd3RGLEdBQWdCLEVBQ2hCQyxHQUFxQnp0RixHQUl6QixHQUFJcVEsRUFBUzdDLGFBQWEsV0FBWSxDQUNwQyxNQUFNeE4sRUFBT29vRixFQUFxQi8zRSxFQUFVazlFLEdBQ3hDdnRGLElBQ0Z3dEYsR0FBZ0IsRUFDaEJDLEdBQXFCenRGLElBSXZCMHRGLEdBQ0Y3b0csRUFBYThCLGtCQUNYLDJDQUNBLFFBQ0FnbkcsR0FHQUgsR0FDRjNvRyxFQUFhOEIsa0JBQ1gsZ0RBQ0EsUUFDQThtRyxHQUlKLE1BQU03RSxFQUFhLElBQUlDLGNBQ3ZCLE9BQU8zTixFQUFXSyxJQUFJcU4sRUFBVzBCLGtCQUFrQnhCLEtBR3JELGtDQUF1Q2dGLEdBQ3JDLE1BRU1oRyxHQUZTLElBQUlhLFdBQ0dJLGdCQUFnQitFLEVBQVcsWUFDOUJuUSxnQkFHYnVOLEVBQVF4cUcsTUFBTTRJLEtBQUt3K0YsRUFBSWgvRixpQkFBaUIsU0FDeENpbEcsRUFBYWpHLEVBQUlwN0YsY0FBYyxXQUMvQnNoRyxFQUFTbHhHLE9BQU9peEcsRUFBV3QvRixhQUFhLFFBQzVDdy9GLEVBQVNueEcsT0FBT2l4RyxFQUFXdC9GLGFBQWEsUUFRMUMsSUFBSXVSLEVBQU8sK0NBRVlrckYsRUFBTTF6RCxLQUFNdXdELElBQ2pDLE1BQU1tRyxFQUFnQixDQUFDLE1BQU8sTUFBTyxNQUFPLE9BQU8xMkQsS0FBTTE5QixHQVQzRCxTQUEyQml1RixFQUFlanVGLEdBQ3hDLE1BQU1xMEYsRUFBUXJ4RyxPQUFPaXJHLEVBQUt0NUYsYUFBYXFMLElBRXZDLE9BQU9xMEYsRUFBUSxHQUFLQSxHQURDLE9BQVJyMEYsR0FBeUIsT0FBUkEsRUFBZ0JrMEYsRUFBU0MsR0FRckRHLENBQWtCckcsRUFBTWp1RixJQUUxQixHQUFJbzBGLEVBQWUsQ0FDakIsTUFBTXZsRyxFQUFVbS9GLEVBQUlwN0YsY0FDbEIsV0FBVyxJQUFNcTdGLEVBQUt0NUYsYUFBYSxlQUVyQ3VSLEdBQVEsU0FBU3JYLEVBQVFpWiw0QkFBNEJqWixFQUFROEYsYUFDM0QsY0FHSixPQUFPeS9GLEtBSVBycEcsRUFBYThCLGtCQUNYLHFEQUNBLFVBQ0FxWixJQXVJTiw2QkFBa0M4bkYsR0FDaEMsTUFFTXVHLEdBRlMsSUFBSTFGLFdBQ0dJLGdCQUFnQmpCLEVBQUssWUFDWG5LLGdCQUVoQyxJQUFLLE1BQU1uekYsS0FBUzlKLE1BQU00SSxLQUN4QitrRyxFQUFpQmxELHFCQUFxQixVQUVsQzNnRyxFQUFNZ2pCLGFBQWEsU0FDckJoakIsRUFBTXRCLGdCQUFnQixRQUkxQixNQUFNMC9GLEVBQWEsSUFBSUMsY0FDdkIsT0FBTzNOLEVBQVdLLElBQUlxTixFQUFXMEIsa0JBQWtCK0QsTSw0SEMzekJyRCxhQUVNQyxFQUFpQi84RCxNQUFNLG9DQUM3QixJQUFJZzlELEVBQWdCbm5GLEVBQWdCb25GLEVBQStCQyxFQUtuRSxTQUFTQyxFQUFnQi9zRyxHQUN2QixNQUFNb21CLEVBQVNwbUIsRUFBUWdrQixLQUN2QixHQUFlLE9BQVhvQyxFQUFpQixDQUNuQjBtRixFQUFZeDZGLFlBQWMsUUFDMUJ3NkYsRUFBWWxvRyxNQUFNeUQsTUFBUSxVQUMxQixJQUFLLE1BQU13YyxLQUFTaW9GLEVBQVlwK0YsU0FDOUJtVyxFQUFNN2dCLGFBRUgsQ0FDTCxJQUFJcXNCLEVBQU0sR0FDVmpLLEVBQU9oZixRQUFRNGxHLElBQ2IzOEUsR0FBTzI4RSxFQUFPLE9BRWhCRixFQUFZeDZGLFlBQWMsR0FDMUJ3NkYsRUFBWWxvRyxNQUFNeUQsTUFBUSxNQUUxQixNQUFNeXhCLEVBQVNoMkIsU0FBU1MsY0FBYyxPQUd0Q3UxQixFQUFPeG5CLFlBQWMsVUFDckJ3bkIsRUFBT2wxQixNQUFNdzRDLE9BQVMsVUFDdEIwdkQsRUFBWXQ3RSxZQUFZc0ksR0FFeEJBLEVBQU8xNkIsaUJBQWlCLFFBQVM2dEcsRUFBY3B6RyxLQUFLMEIsS0FBTTgwQixLQXFCOUQsU0FBUzQ4RSxFQUFjNThFLEdBQ3JCOTBCLEtBQUs0ZixNQUFNQyxtQkFBbUIsRUFBQWhLLGdCQUFnQnFELFVBQVc0YixHQUN6RDkwQixLQUFLNGYsTUFBTUUsa0JBT2IsT0FBTzFSLGVBQXFCRyxHQUUxQixHQUFzQixPQURBaEcsU0FBU0MsZUFBZSxlQUNsQixDQUMxQixNQUFNbXBHLEVBQWFwcEcsU0FBU0MsZUFBZSxlQUMzQ21wRyxFQUFXNTZGLFlBQWMsVUFDekJ1NkYsRUFBZUssRUFFZixNQUFNQyxFQUFZcnBHLFNBQVNDLGVBQWUscUJBQzFDb3BHLEVBQVU3NkYsWUFBYyxVQUN4Qnc2RixFQUFjSyxFQUNkUCxFQUFTLElBQUlRLE9BQU8sbUNBQ3BCUixFQUFPbFIsVUFBWXFSLEVBQWVsekcsS0FBS2lRLEtBUTNDLG9CQUFPSCxlQUFrQzBqRyxHQUN2QyxRQUFvQjV3RyxJQUFoQnF3RyxRQUE4Q3J3RyxJQUFqQm93RyxFQUMvQixPQUVGLFFBQWVwd0csSUFBWGdwQixFQUFzQixDQUN4QixNQUFNdFQsUUFBaUJ3NkYsRUFDdkJsbkYsUUFBZXRULEVBQVNTLE9BRTFCazZGLEVBQVl4NkYsWUFBYyxjQUMxQnc2RixFQUFZbG9HLE1BQU15RCxNQUFRLE9BQzFCdWtHLEVBQU9oUixZQUFZLENBQ2pCdUssSUFBS2tILEVBQ0w1bkYsT0FBUUEsSUFHVm9uRixFQUFhdjZGLFlBQWMsY0FDM0J1NkYsRUFBYWpvRyxNQUFNeUQsTUFBUSxPQTdEN0IsU0FBMEJ5dkMsR0FDeEIsR0FBS0EsRUFJTCxPQUFRQSxHQUNOLElBQUssVUFDSCswRCxFQUFhdjZGLFlBQWN3bEMsRUFDM0IrMEQsRUFBYWpvRyxNQUFNeUQsTUFBUSxPQUMzQixNQUVGLFFBQ0V3a0csRUFBYXY2RixZQUFjd2xDLEVBQzNCKzBELEVBQWFqb0csTUFBTXlELE1BQVEsV0FrRC9CaWxHLE9BcUJGM2pHLGVBQTZCMGpHLEdBQzNCLE1BQ01sRyxHQURTLElBQUlILFdBQ0dJLGdCQUFnQmlHLEVBQVMsWUFHekNILEVBRk0vRixFQUFPbkwsZ0JBRUlsdkYsYUFBYSxjQUNwQyxPQUFJb2dHLEdBR0ssVUEvQmdCSyxDQUFjRixLQU96Qyx1QkFDRSxRQUFvQjV3RyxJQUFoQnF3RyxRQUE4Q3J3RyxJQUFqQm93RyxFQUFqQyxDQUlBLElBQUssTUFBTWhvRixLQUFTaW9GLEVBQVlwK0YsU0FDOUJtVyxFQUFNN2dCLFNBRVI4b0csRUFBWXg2RixZQUFjLFNBQzFCdzZGLEVBQVlsb0csTUFBTXlELE1BQVEsYUFFMUJ3a0csRUFBYXY2RixZQUFjLFNBQzNCdTZGLEVBQWFqb0csTUFBTXlELE1BQVEsZ0IsNkhDbkg3QixJQUFJbWxHLEdBQVEsRUFxQlosMEJBQWdDMXpFLEdBQWtCLEdBQ2hEMHpFLEVBQVExekUsRUFoQlYsV0FDRSxNQUFNMnpFLEVBQVkzcEcsU0FBU2lILGNBQThCLGVBQ25ENkIsRUFBTzRnRyxFQUFPLDBDQUFpRCw0Q0FDckVDLEVBQVUzbEcsYUFBYSxNQUFPOEUsR0FFOUIsTUFBTThnRyxFQUFhRixFQUFPLHFCQUF1Qix3QkFDakRDLEVBQVUzbEcsYUFBYSxNQUFPNGxHLEdBVzlCQyxJQU9GLGtDQUNFeHBHLE9BQU95cEcsZUFBa0I3NkYsSUFDdkIsSUFBS3k2RixFQUVILE9BREF6NkYsRUFBRTZFLGlCQUNLLCtCLGNDcENieGYsRUFBT0QsUUFBVSxTQUFTQyxHQW9CekIsT0FuQktBLEVBQU95MUcsa0JBQ1h6MUcsRUFBTzAxRyxVQUFZLGFBQ25CMTFHLEVBQU91ckMsTUFBUSxHQUVWdnJDLEVBQU9zVyxXQUFVdFcsRUFBT3NXLFNBQVcsSUFDeEMzVixPQUFPQyxlQUFlWixFQUFRLFNBQVUsQ0FDdkNhLFlBQVksRUFDWkMsSUFBSyxXQUNKLE9BQU9kLEVBQU9FLEtBR2hCUyxPQUFPQyxlQUFlWixFQUFRLEtBQU0sQ0FDbkNhLFlBQVksRUFDWkMsSUFBSyxXQUNKLE9BQU9kLEVBQU9DLEtBR2hCRCxFQUFPeTFHLGdCQUFrQixHQUVuQnoxRyxJLGlCQ3BCUixZQU1BRCxFQUFRNDFHLFdBMklSLFNBQW9CbnpHLEdBUW5CLEdBUEFBLEVBQUssSUFBTVcsS0FBS3l5RyxVQUFZLEtBQU8sSUFDbEN6eUcsS0FBSzB5RyxXQUNKMXlHLEtBQUt5eUcsVUFBWSxNQUFRLEtBQzFCcHpHLEVBQUssSUFDSlcsS0FBS3l5RyxVQUFZLE1BQVEsS0FDMUIsSUFBTTUxRyxFQUFPRCxRQUFRKzFHLFNBQVMzeUcsS0FBSytwQyxPQUUvQi9wQyxLQUFLeXlHLFVBQ1QsT0FHRCxNQUFNdDFHLEVBQUksVUFBWTZDLEtBQUs4TSxNQUMzQnpOLEVBQUt3cEMsT0FBTyxFQUFHLEVBQUcxckMsRUFBRyxrQkFLckIsSUFBSWlJLEVBQVEsRUFDUnd0RyxFQUFRLEVBQ1p2ekcsRUFBSyxHQUFHMlgsUUFBUSxjQUFleEYsSUFDaEIsT0FBVkEsSUFHSnBNLElBQ2MsT0FBVm9NLElBR0hvaEcsRUFBUXh0RyxNQUlWL0YsRUFBS3dwQyxPQUFPK3BFLEVBQU8sRUFBR3oxRyxJQTFLdkJQLEVBQVFpMkcsS0E2TFIsU0FBY0MsR0FDYixJQUNLQSxFQUNIbDJHLEVBQVFtMkcsUUFBUXpuRyxRQUFRLFFBQVN3bkcsR0FFakNsMkcsRUFBUW0yRyxRQUFRQyxXQUFXLFNBRTNCLE1BQU96dUcsTUFuTVYzSCxFQUFRbU8sS0ErTVIsV0FDQyxJQUFJbk4sRUFDSixJQUNDQSxFQUFJaEIsRUFBUW0yRyxRQUFRM25HLFFBQVEsU0FDM0IsTUFBTzdHLEtBTUozRyxRQUF3QixJQUFaK3lELEdBQTJCLFFBQVNBLElBQ3BEL3lELEVBQUkreUQsRUFBUTJTLElBQUkydkMsT0FHakIsT0FBT3IxRyxHQTVOUmhCLEVBQVE2MUcsVUF5R1IsV0FJQyxHQUFzQixvQkFBWDdwRyxRQUEwQkEsT0FBTytuRCxVQUFvQyxhQUF4Qi9uRCxPQUFPK25ELFFBQVEvdUQsTUFBdUJnSCxPQUFPK25ELFFBQVF1aUQsUUFDNUcsT0FBTyxFQUlSLEdBQXlCLG9CQUFkeG1ELFdBQTZCQSxVQUFVQyxXQUFhRCxVQUFVQyxVQUFVNXlDLGNBQWN2SSxNQUFNLHlCQUN0RyxPQUFPLEVBS1IsTUFBNEIsb0JBQWJqSixVQUE0QkEsU0FBU2s0RixpQkFBbUJsNEYsU0FBU2s0RixnQkFBZ0JwM0YsT0FBU2QsU0FBU2s0RixnQkFBZ0JwM0YsTUFBTThwRyxrQkFFcEgsb0JBQVh2cUcsUUFBMEJBLE9BQU9qRyxVQUFZaUcsT0FBT2pHLFFBQVF5d0csU0FBWXhxRyxPQUFPakcsUUFBUTB3RyxXQUFhenFHLE9BQU9qRyxRQUFRMndHLFFBR3JHLG9CQUFkNW1ELFdBQTZCQSxVQUFVQyxXQUFhRCxVQUFVQyxVQUFVNXlDLGNBQWN2SSxNQUFNLG1CQUFxQjRLLFNBQVNpUSxPQUFPa1csR0FBSSxLQUFPLElBRTlILG9CQUFkbXFCLFdBQTZCQSxVQUFVQyxXQUFhRCxVQUFVQyxVQUFVNXlDLGNBQWN2SSxNQUFNLHVCQTlIdEc1VSxFQUFRbTJHLFFBeU9SLFdBQ0MsSUFHQyxPQUFPNW5HLGFBQ04sTUFBTzVHLEtBOU9RZ3ZHLEdBQ2xCMzJHLEVBQVFrckIsUUFBVSxNQUNqQixJQUFJeGxCLEdBQVMsRUFFYixNQUFPLEtBQ0RBLElBQ0pBLEdBQVMsRUFDVEssUUFBUUMsS0FBSyw0SUFORSxHQWVsQmhHLEVBQVE0MkcsT0FBUyxDQUNoQixVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxXQXNGRDUyRyxFQUFRazRCLElBQU1ueUIsUUFBUTZzRyxPQUFTN3NHLFFBQVFteUIsS0FBTyxTQWtFOUNqNEIsRUFBT0QsUUFBVSxFQUFRLEdBQVIsQ0FBb0JBLEdBRXJDLE1BQU0sV0FBQzYyRyxHQUFjNTJHLEVBQU9ELFFBTTVCNjJHLEVBQVd0akcsRUFBSSxTQUFVZ2IsR0FDeEIsSUFDQyxPQUFPbGdCLEtBQUtNLFVBQVU0ZixHQUNyQixNQUFPNW1CLEdBQ1IsTUFBTywrQkFBaUNBLEVBQU1FLFksd0tDeFFoRCxhQUNBLFFBQ0EsT0FFQSxPQTZJQSxTQUFTaXZHLEVBQVU1ckcsRUFBWTZyRyxHQUNUcHJHLFNBQVNDLGVBQWVWLEdBQ2hDbUIsVUFBVUMsSUFBSSxhQUN0QlgsU0FBU0MsZUFBZVYsR0FBSW1CLFVBQVU4QyxTQUFTLGNBQ2pENG5HLEVBQWNDLGFBQWE5ckcsSUFDM0IsSUFBQXdTLGFBQVksQ0FBRW5RLFdBQVlyQyxLQVE5QixTQUFTK3JHLEVBQVlqeUcsR0FDSjJHLFNBQVNxRCxpQkFBaUJoSyxHQUNsQ2lLLFFBQVFnQixJQUNiQSxFQUFHNUQsVUFBVVIsT0FBTyxhQUNwQm9FLEVBQUc1RCxVQUFVUixPQUFPLGVBeEp4QiwwQkFBZ0NrckcsR0FDOUIsTUFDTUcsRUFEd0J0d0csTUFBTTRJLEtBQUs3RCxTQUFTbUQsdUJBQXVCLGNBQ3JDK0YsSUFBSzJzRixHQUFpQkEsRUFBSXQyRixJQUU5RFMsU0FBU2tRLEtBQUs1VSxpQkFBaUIsVUFBWTJYLElBQ3pDLEdBQUlBLEVBQUltckMsS0FBS24xQyxNQUFNLGNBQWdCZ0ssRUFBSWlyRixTQUNyQyxJQUNFLE1BQU1yaEcsRUFBUXhGLE9BQU80YixFQUFJbXJDLEtBQUtuckMsRUFBSW1yQyxLQUFLdGtELE9BQVMsSUFBTSxFQUNoRDB4RyxFQUFnQnhyRyxTQUFTbUQsdUJBQXVCLFlBQy9CcW9HLEVBQWMzdUcsR0FDQTBZLFFBQ3JDLE1BQU90RyxHQUNQN1UsUUFBUTZzRyxNQUFNaDRGLE1BS3BCczhGLEVBQU9qb0csUUFBU3V5RixJQUNkNzFGLFNBQVNDLGVBQWU0MUYsR0FBS3Y2RixpQkFBaUIsUUFBUyxLQUNyRGd3RyxFQUFXLGNBQ1hILEVBQVN0VixFQUFLdVYsSUFDZCxJQUFBcjVGLGFBQVksQ0FBRWxRLFVBQVdnMEYsSUFDekI3MUYsU0FBU0MsZUFBZSxlQUFlVyxVQUFZNFksRUFBU2hPLGNBQWNxcUYsR0F5SWhGLFNBQXVCdVYsR0FDckIsTUFBTUssRUFBaUJ4d0csTUFBTTRJLEtBQUs3RCxTQUFTbUQsdUJBQXVCLGFBQy9Dc29HLEVBQWV2aUcsSUFBSTVFLEdBQU1BLEVBQUcvRSxJQUNwQytELFFBQVFnQixJQUNqQnRFLFNBQVNDLGVBQWVxRSxHQUFJaEosaUJBQWlCLFFBQVMsS0FDcERnd0csRUFBVyxhQUNYSCxFQUFTN21HLEVBQUk4bUcsT0E5SWJNLENBQWFOLEdBQ2JFLEVBQVcsYUFDWCxJQUNFLE1BQU0sV0FBRTFwRyxJQUFlLElBQUF5UixlQUN2QjgzRixFQUFTdnBHLEVBQVl3cEcsR0FDckIsTUFBT244RixHQUVQazhGLEVBRG9CbnJHLFNBQVNtRCx1QkFBdUIsWUFBWSxHQUMzQzVELEdBQUk2ckcsU0FTakMsb0NBRUUsTUFBTU8sRUFBYzNyRyxTQUFTQyxlQUFlLG1CQUN0QzJyRyxFQUFnQjVyRyxTQUFTQyxlQUFlLGNBQ3hDNHJHLEVBQXFCRCxFQUFjM2tHLGNBQWMsd0JBQ2pENmtHLEVBQWlCOXJHLFNBQVNDLGVBQWUsa0JBQ3pDOHJHLEVBQXFCSCxFQUFjM2tHLGNBQWMsYUFFakQra0csRUFBWWhzRyxTQUFTQyxlQUFlLGlCQUNwQ2dzRyxFQUFjanNHLFNBQVNDLGVBQWUsWUFDdENpc0csRUFBc0JELEVBQVlobEcsY0FBYyx3QkFDaERrbEcsRUFBZW5zRyxTQUFTQyxlQUFlLGdCQUN2Q21zRyxFQUFtQkgsRUFBWWhsRyxjQUFjLGFBS25EMGtHLEVBQVlyd0csaUJBQWlCLFFBQVMsS0FDcEM0d0csRUFBb0J4ckcsVUFBVVIsT0FBTyxXQUNyQzJyRyxFQUFtQm5yRyxVQUFVQyxJQUFJLFlBRWpDLElBQUFvUixhQUFZLENBQUVwUSxTQUFVLFdBRUgzQixTQUFTaUgsY0FBYyx1QkFBd0JzTyxRQUNwRXkyRixFQUFVL2tHLGNBQWMsb0NBQW9DdkcsVUFBVUMsSUFBSSxhQUMxRWdyRyxFQUFZMWtHLGNBQWMsc0NBQXNDdkcsVUFBVVIsT0FBTyxlQUtuRjhyRyxFQUFVMXdHLGlCQUFpQixRQUFTLEtBQ2xDdXdHLEVBQW1CbnJHLFVBQVVSLE9BQU8sV0FDcENnc0csRUFBb0J4ckcsVUFBVUMsSUFBSSxZQUVsQyxJQUFBb1IsYUFBWSxDQUFFcFEsU0FBVSxTQUV4QmdxRyxFQUFZMWtHLGNBQWMsc0NBQXNDdkcsVUFBVUMsSUFBSSxhQUM5RXFyRyxFQUFVL2tHLGNBQWMsb0NBQW9DdkcsVUFBVVIsT0FBTyxlQUkvRTByRyxFQUFjdHdHLGlCQUFpQixRQUFVMlQsSUFDdkNBLEVBQUVpRSxrQkFFRTQ0RixFQUFlcHJHLFVBQVU4QyxTQUFTLFdBRXBDc29HLEVBQWVwckcsVUFBVVIsT0FBTyxVQUNoQzRyRyxFQUFlaHJHLE1BQU02VSxRQUFVLGVBQy9CclgsV0FBVyxLQUNUd3RHLEVBQWVockcsTUFBTThVLFNBQVcsV0FDL0IsS0FDSG0yRixFQUFtQi9uRyxhQUFhLGFBQWMsc0RBSzlDOG5HLEVBQWVwckcsVUFBVUMsSUFBSSxVQUM3Qm1yRyxFQUFlaHJHLE1BQU04VSxTQUFXLFNBQ2hDdFgsV0FBVyxLQUNUd3RHLEVBQWVockcsTUFBTTZVLFFBQVUsT0FDOUIsS0FDSG8yRixFQUFtQi9uRyxhQUFhLGFBQWMsdURBSWxEaW9HLEVBQVkzd0csaUJBQWlCLFFBQVUyVCxJQUNyQ0EsRUFBRWlFLGtCQUVFaTVGLEVBQWF6ckcsVUFBVThDLFNBQVMsV0FFbEMyb0csRUFBYXpyRyxVQUFVUixPQUFPLFVBQzlCaXNHLEVBQWFyckcsTUFBTTZVLFFBQVUsZUFDN0JyWCxXQUFXLEtBQ1Q2dEcsRUFBYXJyRyxNQUFNOFUsU0FBVyxXQUM3QixLQUNIdzJGLEVBQWlCcG9HLGFBQWEsYUFBYyxzREFLNUNtb0csRUFBYXpyRyxVQUFVQyxJQUFJLFVBQzNCd3JHLEVBQWFyckcsTUFBTThVLFNBQVcsU0FDOUJ0WCxXQUFXLEtBQ1Q2dEcsRUFBYXJyRyxNQUFNNlUsUUFBVSxPQUM1QixLQUNIeTJGLEVBQWlCcG9HLGFBQWEsYUFBYyx3REFpRGxELGtDQUNFLE1BQU1xb0csRUFBZ0Jyc0csU0FBU0MsZUFBZSxpQkFDeEMwL0YsRUFBYTMvRixTQUFTQyxlQUFlLGNBQ3JDMi9GLEVBQVU1L0YsU0FBU0MsZUFBZSxXQUNsQ3kvRixFQUFhMS9GLFNBQVNDLGVBQWUsY0FDckM0L0YsRUFBb0I3L0YsU0FBU0MsZUFBZSxxQkFFbERvc0csRUFBYy93RyxpQkFBaUIsU0FlL0IsV0FDRSxJQUFLK3dHLEVBQWMzckcsVUFBVThDLFNBQVMsYUFBYyxFQUNsRCxJQUFBdU8sYUFBWSxDQUFFalEsY0FBZSxtQkFFN0IsSUFBQXNCLFlBQ0FwRCxTQUFTQyxlQUFlLFlBQVlXLFVBQVksR0FDaERaLFNBQVNDLGVBQWUsYUFBYVcsVUFBWSxHQUNqRFosU0FBU0MsZUFBZSxZQUFZa0UsY0FBY3pELFVBQVVDLElBQUksVUFDaEVYLFNBQVNDLGVBQWUsYUFBYWtFLGNBQWN6RCxVQUFVQyxJQUFJLFVBQ2pFMHJHLEVBQWMzckcsVUFBVUMsSUFBSSxhQUU1QmcvRixFQUFXai9GLFVBQVVSLE9BQU8sYUFDNUIwL0YsRUFBUWwvRixVQUFVUixPQUFPLGFBQ3pCdy9GLEVBQVdoL0YsVUFBVVIsT0FBTyxhQUM1QjIvRixFQUFrQm4vRixVQUFVUixPQUFPLGFBQ25DLElBQ0VGLFNBQVNDLGVBQWUsYUFBYVMsVUFBVVIsT0FBTyxhQUN0RCxNQUFPK08sSUFDVCxJQUMyRCx3QkFBckRqUCxTQUFTaUgsY0FBYyx1QkFBdUIxSCxLQUNoRCxJQUFBc1Qsc0JBQXFCLFlBRXZCLE1BQU81RCxTQXBDYjB3RixFQUFXcmtHLGlCQUFpQixTQXdDNUIsV0FDRSxJQUFLcWtHLEVBQVdqL0YsVUFBVThDLFNBQVMsYUFBYyxFQUMvQyxJQUFBdU8sYUFBWSxDQUFFalEsY0FBZSxnQkFFN0IsSUFBQXNCLFlBQ0FwRCxTQUFTQyxlQUFlLFlBQVlXLFVBQVksR0FDaERaLFNBQVNDLGVBQWUsYUFBYVcsVUFBWSxHQUNqRFosU0FBU0MsZUFBZSxZQUFZa0UsY0FBY3pELFVBQVVDLElBQUksVUFDaEVYLFNBQVNDLGVBQWUsYUFBYWtFLGNBQWN6RCxVQUFVQyxJQUFJLFVBQ2pFZy9GLEVBQVdqL0YsVUFBVUMsSUFBSSxhQUN6QmkvRixFQUFRbC9GLFVBQVVSLE9BQU8sYUFDekJtc0csRUFBYzNyRyxVQUFVUixPQUFPLGFBQy9Cdy9GLEVBQVdoL0YsVUFBVVIsT0FBTyxhQUM1QjIvRixFQUFrQm4vRixVQUFVUixPQUFPLGFBQ25DLElBQ0VGLFNBQVNDLGVBQWUsYUFBYVMsVUFBVVIsT0FBTyxhQUN0RCxNQUFPK08sSUFDVCxJQUMyRCx3QkFBckRqUCxTQUFTaUgsY0FBYyx1QkFBdUIxSCxLQUNoRCxJQUFBc1Qsc0JBQXFCLFNBRXZCLE1BQU81RCxTQTVEYjJ3RixFQUFRdGtHLGlCQUFpQixTQWdFekIsV0FDRSxJQUFLc2tHLEVBQVFsL0YsVUFBVThDLFNBQVMsYUFBYyxFQUM1QyxJQUFBdU8sYUFBWSxDQUFFalEsY0FBZSxhQUU3QixJQUFBc0IsWUFDQXBELFNBQVNDLGVBQWUsWUFBWVcsVUFBWSxHQUNoRFosU0FBU0MsZUFBZSxhQUFhVyxVQUFZLEdBQ2pEWixTQUFTQyxlQUFlLFlBQVlrRSxjQUFjekQsVUFBVUMsSUFBSSxVQUNoRVgsU0FBU0MsZUFBZSxhQUFha0UsY0FBY3pELFVBQVVDLElBQUksVUFDakVpL0YsRUFBUWwvRixVQUFVQyxJQUFJLGFBQ3RCZy9GLEVBQVdqL0YsVUFBVVIsT0FBTyxhQUM1Qm1zRyxFQUFjM3JHLFVBQVVSLE9BQU8sYUFDL0J3L0YsRUFBV2gvRixVQUFVUixPQUFPLGFBQzVCMi9GLEVBQWtCbi9GLFVBQVVSLE9BQU8sYUFDbkMsSUFDRUYsU0FBU0MsZUFBZSxhQUFhUyxVQUFVUixPQUFPLGFBQ3RELE1BQU8rTyxJQUNULElBQzJELHdCQUFyRGpQLFNBQVNpSCxjQUFjLHVCQUF1QjFILEtBQ2hELElBQUFzVCxzQkFBcUIsU0FFdkIsTUFBTzVELFNBcEZieXdGLEVBQVdwa0csaUJBQWlCLFNBd0Y1QixXQUNFLElBQUtva0csRUFBV2gvRixVQUFVOEMsU0FBUyxhQUFjLEVBQy9DLElBQUF1TyxhQUFZLENBQUVqUSxjQUFlLGdCQUU3QixJQUFBc0IsWUFDQXBELFNBQVNDLGVBQWUsWUFBWVcsVUFBWSxHQUNoRFosU0FBU0MsZUFBZSxhQUFhVyxVQUFZLEdBQ2pEWixTQUFTQyxlQUFlLFlBQVlrRSxjQUFjekQsVUFBVUMsSUFBSSxVQUNoRVgsU0FBU0MsZUFBZSxhQUFha0UsY0FBY3pELFVBQVVDLElBQUksVUFDakUrK0YsRUFBV2gvRixVQUFVQyxJQUFJLGFBQ3pCZy9GLEVBQVdqL0YsVUFBVVIsT0FBTyxhQUM1QjAvRixFQUFRbC9GLFVBQVVSLE9BQU8sYUFDekJtc0csRUFBYzNyRyxVQUFVUixPQUFPLGFBQy9CMi9GLEVBQWtCbi9GLFVBQVVSLE9BQU8sYUFDbkMsSUFDRUYsU0FBU0MsZUFBZSxhQUFhUyxVQUFVUixPQUFPLGFBQ3RELE1BQU8rTyxJQUNULElBQzJELHdCQUFyRGpQLFNBQVNpSCxjQUFjLHVCQUF1QjFILEtBQ2hELElBQUFzVCxzQkFBcUIsU0FFdkIsTUFBTzVELFNBNUdiNHdGLEVBQWtCdmtHLGlCQUFpQixTQWdIbkMsV0FDRSxJQUFLdWtHLEVBQWtCbi9GLFVBQVU4QyxTQUFTLGFBQWMsRUFDdEQsSUFBQXVPLGFBQVksQ0FBRWpRLGNBQWUsdUJBRTdCLElBQUFzQixZQUNBcEQsU0FBU0MsZUFBZSxZQUFZVyxVQUFZLEdBQ2hEWixTQUFTQyxlQUFlLGFBQWFXLFVBQVksR0FDakRaLFNBQVNDLGVBQWUsWUFBWWtFLGNBQWN6RCxVQUFVQyxJQUFJLFVBQ2hFWCxTQUFTQyxlQUFlLGFBQWFrRSxjQUFjekQsVUFBVUMsSUFBSSxVQUNqRWsvRixFQUFrQm4vRixVQUFVQyxJQUFJLGFBQ2hDZy9GLEVBQVdqL0YsVUFBVVIsT0FBTyxhQUM1QjAvRixFQUFRbC9GLFVBQVVSLE9BQU8sYUFDekJ3L0YsRUFBV2gvRixVQUFVUixPQUFPLGFBQzVCbXNHLEVBQWMzckcsVUFBVVIsT0FBTyxhQUMvQixJQUNFRixTQUFTQyxlQUFlLGFBQWFTLFVBQVVSLE9BQU8sYUFDdEQsTUFBTytPLElBQ1QsSUFDMkQsd0JBQXJEalAsU0FBU2lILGNBQWMsdUJBQXVCMUgsS0FDaEQsSUFBQXNULHNCQUFxQixnQkFFdkIsTUFBTzVELFNBbklialAsU0FBU2tRLEtBQUs1VSxpQkFBaUIsVUFBWTJYLElBQ3pCLE1BQVpBLEVBQUluZCxLQUFhdTJHLEVBQWM5MkYsUUFDbkIsTUFBWnRDLEVBQUluZCxLQUFhNnBHLEVBQVdwcUYsUUFDaEIsTUFBWnRDLEVBQUluZCxLQUFhOHBHLEVBQVFycUYsUUFDYixNQUFadEMsRUFBSW5kLEtBQWE0cEcsRUFBV25xRixRQUNoQixNQUFadEMsRUFBSW5kLEtBQWErcEcsRUFBa0J0cUYsWSwrRkN6TTNDLGFBQ0EsUUFDQSxPQUNBLE9BZ1QwQixFQUFBclcsUUEzUzFCLE1BWUUsWUFBYThHLEVBQW9CdTZGLEdBVmpDLEtBQUErTCxZQUFhLEVBNEhiLEtBQUFDLGVBQWlCLFdBQ2Y5MEcsS0FBSzRCLEtBQU8sR0FDWjVCLEtBQUsrMEcsNEJBQ0x4c0csU0FBU2tRLEtBQUt6VSxvQkFBb0IsVUFBV2hFLEtBQUt1WCxpQkFDbERoUCxTQUFTa1EsS0FBS3pVLG9CQUFvQixRQUFTaEUsS0FBS2cxRyxvQkFDaER6c0csU0FBU2tRLEtBQUt6VSxvQkFBb0IsUUFBU2hFLEtBQUtvL0Ysa0JBRWhEcC9GLEtBQUs2MEcsWUFBYSxFQUNsQixJQUNFdHNHLFNBQVNDLGVBQWUsb0JBQW9CQyxTQUM1QyxNQUFPK08sSUFJVCxNQUFNMDhGLEVBQWMzckcsU0FBU0MsZUFBZSxtQkFFdEM0ckcsRUFEZ0I3ckcsU0FBU0MsZUFBZSxjQUNMZ0gsY0FBYyx3QkFFakQra0csRUFBWWhzRyxTQUFTQyxlQUFlLGlCQUVwQ2lzRyxFQURjbHNHLFNBQVNDLGVBQWUsWUFDSmdILGNBQWMsd0JBRXRENGtHLEVBQW1CbnJHLFVBQVVSLE9BQU8sV0FDcENnc0csRUFBb0J4ckcsVUFBVUMsSUFBSSxXQUVsQ2dyRyxFQUFZMWtHLGNBQWMsc0NBQXNDdkcsVUFBVUMsSUFBSSxhQUM5RXFyRyxFQUFVL2tHLGNBQWMsb0NBQW9DdkcsVUFBVVIsT0FBTyxjQUU3RSxJQUFBNlIsYUFBWSxDQUFFcFEsU0FBVSxVQUV2QjVMLEtBQUswQixNQU1SLEtBQUFvL0YsaUJBQW1CLFNBQTRCNWpGLEdBQzdDLE1BQU1yYyxFQUFTcWMsRUFBSXJjLE9BQ29CLE9BQW5DQSxFQUFPK08sUUFBUSxpQkFDc0IsT0FBdkMvTyxFQUFPK08sUUFBUSxxQkFDa0IsT0FBakMvTyxFQUFPK08sUUFBUSxnQkFDZmxPLEtBQUs4MEcsaUJBQ0x2c0csU0FBU2tRLEtBQUt6VSxvQkFBb0IsVUFDaENoRSxLQUFLaTFHLGNBQ1Axc0csU0FBU2tRLEtBQUt6VSxvQkFBb0IsVUFDaENoRSxLQUFLYSxXQUVSdkMsS0FBSzBCLE1BS1IsS0FBQWcxRyxtQkFBcUIsU0FBOEJ4NUYsR0FDakMsVUFBWkEsRUFBSW5kLEtBQ05rSyxTQUFTaUgsY0FBY3hQLEtBQUswdkIsVUFDekI3ckIsaUJBQWlCLFFBQXVCLFVBQWQ3RCxLQUFLNEIsS0FDOUI1QixLQUFLaTFHLGFBQWVqMUcsS0FBS2EsVUFFOUJ2QyxLQUFLMEIsTUFNUixLQUFBdVgsZ0JBQWtCLFNBQTJCaUUsR0FDM0IsV0FBWkEsRUFBSW5kLEtBQ04yQixLQUFLODBHLGlCQUNMdnNHLFNBQVNrUSxLQUFLelUsb0JBQW9CLFVBQVdoRSxLQUFLaTFHLGNBQ2xEMXNHLFNBQVNrUSxLQUFLelUsb0JBQW9CLFVBQVdoRSxLQUFLYSxVQUM3QixVQUFaMmEsRUFBSW5kLEtBQ2IyQixLQUFLKzBHLDZCQUVOejJHLEtBQUswQixNQUtSLEtBQUFhLFFBQVUsU0FBbUIyYSxHQUMzQkEsRUFBSUMsa0JBR0osTUFBTW9tQyxHQUFTLElBQUFqK0IsaUJBQWdCcEksRUFBSXFJLFFBQVNySSxFQUFJc0ksU0FDaEQsSUFBSSxJQUFBd04sa0JBQWlCdXdCLEVBQU90dUMsRUFBR3N1QyxFQUFPbHVDLEdBQ3BDLE9BQU8sSUFBQWxLLG1CQUFrQiwyREFBNEQsU0FFdkYsTUFBTTRNLEVBQTZCLENBQ2pDQyxPQUFRLFNBQ1JDLE1BQU8sQ0FDTDIrRixZQUFhbDFHLEtBQUs0QixLQUNsQjJpQixRQUFTLE9BQ1R2VCxJQUFLNndDLEVBQU90dUMsRUFDWnRDLElBQUs0d0MsRUFBT2x1QyxJQUlRLE9BQXBCM1QsS0FBS3dPLGFBQ1A2SCxFQUFhRSxNQUFNL0gsV0FBYXhPLEtBQUt3TyxXQUNKLE1BQTdCeE8sS0FBS3dPLFdBQWtCLFFBQ3pCNkgsRUFBb0IsTUFBTyxLQUFLLEtBSXBDclcsS0FBS3VPLFNBQVNtSSxLQUFLTCxFQUFjclcsS0FBS3VPLFNBQVNHLEtBQUtDLHFCQUFxQmdJLEtBQUssSUFDckUzVyxLQUFLdU8sU0FBU3NJLHdCQUNwQkYsS0FBSyxLQUNOcE8sU0FBU2lILGNBQWN4UCxLQUFLMHZCLFVBQVU3ckIsaUJBQWlCLFFBQVM3RCxLQUFLYSxZQUV0RXZDLEtBQUswQixNQUtSLEtBQUFpMUcsYUFBZSxTQUF3Qno1RixHQUNyQyxNQUFNcW1DLEdBQVMsSUFBQWorQixpQkFBZ0JwSSxFQUFJcUksUUFBU3JJLEVBQUlzSSxTQUVoRCxJQUFJLElBQUF3TixrQkFBaUJ1d0IsRUFBT3R1QyxFQUFHc3VDLEVBQU9sdUMsR0FDcEMsT0FBTyxJQUFBbEssbUJBQWtCLHdDQUF5QyxTQUdwRSxNQUFNcVAsRUFBWXZRLFNBQVNpSCxjQUFjLG9DQUV6QyxHQUFJeFAsS0FBSzYwRyxXQUNQNzBHLEtBQUtpeEcsTUFBUXB2RCxFQUNibDFDLEVBQUdtQixPQUFPZ0wsR0FBVzFQLE9BQU8sVUFBVXdULEtBQUssS0FBTWlsQyxFQUFPdHVDLEdBQ3JEcUosS0FBSyxLQUFNaWxDLEVBQU9sdUMsR0FDbEJpSixLQUFLLElBQUssSUFDVkEsS0FBSyxLQUFNLGdCQUNYQSxLQUFLLE9BQVEsU0FDaEI1YyxLQUFLNjBHLFlBQWEsTUFDYixDQUNMLElBQUkxTixFQUFXQyxFQUNYdmxELEVBQU90dUMsRUFBSXZULEtBQUtpeEcsTUFBTTE5RixHQUFLc3VDLEVBQU9sdUMsRUFBSTNULEtBQUtpeEcsTUFBTXQ5RixHQUNuRHd6RixFQUFLdGxELEVBQ0x1bEQsRUFBS3BuRyxLQUFLaXhHLFFBRVY5SixFQUFLbm5HLEtBQUtpeEcsTUFDVjdKLEVBQUt2bEQsR0FFUHQ1QyxTQUFTQyxlQUFlLGdCQUFnQkMsU0FDeEMsTUFBTTZOLEVBQXVCLENBQzNCQSxPQUFRLFNBQ1JDLE1BQU8sQ0FDTDIrRixZQUFhLFFBQ2Izd0YsUUFBUyxPQUNUdlQsSUFBS20yRixFQUFHNXpGLEVBQ1J0QyxJQUFLazJGLEVBQUd4ekYsRUFDUnpDLElBQUtrMkYsRUFBRzd6RixFQUNScEMsSUFBS2kyRixFQUFHenpGLElBSVozVCxLQUFLdU8sU0FBU21JLEtBQUtKLEVBQVF0VyxLQUFLdU8sU0FBU0csS0FBS0MscUJBQXFCZ0ksS0FBSyxLQUN0RTNXLEtBQUt1TyxTQUFTc0ksdUJBQ2Q3VyxLQUFLNjBHLFlBQWEsTUFHckJ2MkcsS0FBSzBCLE1BS1IsS0FBQSswRywwQkFBNEIsV0FDMUIsSUFDRXhzRyxTQUFTaUgsY0FBY3hQLEtBQUswdkIsVUFBVTFyQixvQkFBb0IsUUFBU2hFLEtBQUtpMUcsY0FDeEUxc0csU0FBU2lILGNBQWN4UCxLQUFLMHZCLFVBQVUxckIsb0JBQW9CLFFBQVNoRSxLQUFLYSxTQUN4RSxNQUFPMlcsTUFDUmxaLEtBQUswQixNQXZSTkEsS0FBS3VPLFNBQVdBLEVBQ2hCdk8sS0FBSzB2QixTQUFXbzVFLEVBUWxCLGFBQWNxTSxHQUNaLE1BQU1DLEVBQXNCcDFHLEtBQUtxMUcsZUFDakMsT0FBUUYsR0FDTixJQUFLLFVBQ0huMUcsS0FBSzRCLEtBQU8sS0FDWjVCLEtBQUt3TyxXQUFhLEtBQ2xCLE1BQ0YsSUFBSyxVQUNIeE8sS0FBSzRCLEtBQU8sS0FDWjVCLEtBQUt3TyxXQUFhLENBQUU4bUcsS0FBTSxNQUMxQixNQUNGLElBQUssUUFDSHQxRyxLQUFLNEIsS0FBTyxLQUNaNUIsS0FBS3dPLFdBQWEsQ0FBRThtRyxLQUFNLEtBQzFCLE1BRUYsSUFBSyxjQUNIdDFHLEtBQUs0QixLQUFPLEtBQ1o1QixLQUFLd08sV0FBYSxDQUFFbVEsTUFBTyxLQUMzQixNQUNGLElBQUssY0FDSDNlLEtBQUs0QixLQUFPLEtBQ1o1QixLQUFLd08sV0FBYSxDQUFFbVEsTUFBTyxLQUMzQixNQUNGLElBQUssZ0JBQ0gzZSxLQUFLNEIsS0FBTyxLQUNaNUIsS0FBS3dPLFdBQWEsQ0FBRThtRyxLQUFNLEtBQzFCLE1BQ0YsSUFBSyxNQUNMLElBQUssU0FDTCxJQUFLLFlBQ0wsSUFBSyxXQUNMLElBQUssV0FDTCxJQUFLLFlBQ0wsSUFBSyxVQUNILE1BQU0zeUYsRUFBVTNpQixLQUFLdU8sU0FBU3VVLEtBQUtDLGtCQUNqQ295RixFQUFTbGlFLE9BQU8sR0FBRzkzQixjQUFnQmc2RixFQUFTejBHLE1BQU0sSUFFcERWLEtBQUs0QixLQUFPLFdBQ1o1QixLQUFLd08sV0FBYSxDQUFFbVUsUUFBU0EsR0FDN0IsTUFDRixJQUFLLFFBQ0wsSUFBSyxRQUNIM2lCLEtBQUs0QixLQUFPLE9BQ1o1QixLQUFLd08sV0FBYSxDQUFFNFUsTUFBTyt4RixFQUFTbGlFLE9BQU8sR0FBRzkzQixlQUM5QyxNQUNGLElBQUssU0FDSG5iLEtBQUs0QixLQUFPLFNBQ1o1QixLQUFLd08sV0FBYSxLQUNsQixNQUNGLElBQUssZ0JBQ0h4TyxLQUFLNEIsS0FBTyxVQUNaNUIsS0FBS3dPLFdBQWEsQ0FBRSttRyxLQUFNLFVBQzFCLE1BQ0YsSUFBSyxRQUNIdjFHLEtBQUs0QixLQUFPLFFBQ1o1QixLQUFLd08sV0FBYSxLQUNsQixNQUNGLElBQUssT0FDSHhPLEtBQUs0QixLQUFPLFFBQ1o1QixLQUFLd08sV0FBYSxDQUFFZ25HLE1BQU8sS0FDM0IsTUFDRixJQUFLLFVBQ0h4MUcsS0FBSzRCLEtBQU8sUUFDWjVCLEtBQUt3TyxXQUFhLENBQUVnbkcsTUFBTyxLQUMzQixNQUNGLFFBSUUsT0FIQXgxRyxLQUFLNEIsS0FBTyxHQUNaNUIsS0FBS3dPLFdBQWEsVUFDbEI3TCxRQUFRNEIsTUFBTSxpQ0FBbUM0d0csRUFBVyxLQUloRW4xRyxLQUFLKzBHLDRCQUNMLElBQ29CLFVBQWQvMEcsS0FBSzRCLEtBQ1AyRyxTQUFTaUgsY0FBY3hQLEtBQUswdkIsVUFDekI3ckIsaUJBQWlCLFFBQVM3RCxLQUFLaTFHLGNBRWxDMXNHLFNBQVNpSCxjQUFjeFAsS0FBSzB2QixVQUN6QjdyQixpQkFBaUIsUUFBUzdELEtBQUthLFNBRXBDLE1BQU8yVyxJQU9ULEdBSkFqUCxTQUFTa1EsS0FBSzVVLGlCQUFpQixVQUFXN0QsS0FBS3VYLGlCQUMvQ2hQLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFFBQVM3RCxLQUFLZzFHLHFCQUd4Q0ksRUFBcUIsQ0FDeEIsTUFBTUssRUFBaUJsdEcsU0FBU1MsY0FBYyxVQUM5Q3lzRyxFQUFlM3RHLEdBQUssbUJBQ3BCMnRHLEVBQWV4c0csVUFBVUMsSUFBSSxrQkFDN0J1c0csRUFBZXRzRyxVQUFZLHNCQUMzQlosU0FBU0MsZUFBZSxRQUFRb2MsV0FBV3FSLFlBQVl3L0UsR0FDdkRBLEVBQWU1eEcsaUJBQWlCLFFBQVM3RCxLQUFLODBHLGdCQUdoRHZzRyxTQUFTQyxlQUFlLGdCQUFnQjNFLGlCQUFpQixRQUFTN0QsS0FBS28vRixrQkE4S3pFLGVBQ0UsTUFBc0IsS0FBZHAvRixLQUFLNEIsUSw4S0M1U0osRUFBQTh6Ryx1QkFBeUNudEcsU0FBU1MsY0FBYyxPQUM3RSxFQUFBMHNHLHVCQUF1QnpzRyxVQUFVQyxJQUFJLGNBQWUsZUFBZ0IsZ0JBQ3BFLE1BQU15c0csRUFBa0JwdEcsU0FBU1MsY0FBYyxPQUMvQzJzRyxFQUFnQjFzRyxVQUFVQyxJQUFJLGNBQzlCeXNHLEVBQWdCeHNHLFVBQVksa0JBQzVCLE1BQU15c0csRUFBcUJydEcsU0FBU1MsY0FBYyxPQUNsRDRzRyxFQUFtQjNzRyxVQUFVQyxJQUFJLG1CQUNqQzBzRyxFQUFtQjl0RyxHQUFLLDBCQUVLLENBQzNCLENBQUMsT0FBUSxRQUNULENBQUMsU0FBVSwyQkFDWCxDQUFDLFNBQVUsaUJBR1ErRCxRQUFRdU0sSUFDM0IsTUFBTWtTLEVBQU8vaEIsU0FBU1MsY0FBYyxPQUNwQ3NoQixFQUFLeGlCLEdBQUtzUSxFQUFRLEdBQ2xCa1MsRUFBS3JoQixVQUFVQyxJQUFJLHdCQUNuQm9oQixFQUFLdlQsWUFBY3FCLEVBQVEsR0FDM0J3OUYsRUFBbUIzL0UsWUFBWTNMLEtBR2pDLEVBQUFvckYsdUJBQXVCei9FLFlBQVkwL0UsR0FDbkMsRUFBQUQsdUJBQXVCei9FLFlBQVkyL0UsR0FHdEIsRUFBQUMsNkJBQStDdHRHLFNBQVNTLGNBQWMsT0FDbkYsRUFBQTZzRyw2QkFBNkI1c0csVUFBVUMsSUFBSSxjQUFlLGVBQWdCLGdCQUMxRSxNQUFNNHNHLEVBQXdCdnRHLFNBQVNTLGNBQWMsT0FDckQ4c0csRUFBc0I3c0csVUFBVUMsSUFBSSxjQUNwQzRzRyxFQUFzQjNzRyxVQUFZLHlCQUNsQyxNQUFNNHNHLEVBQTJCeHRHLFNBQVNTLGNBQWMsT0FDeEQrc0csRUFBeUI5c0csVUFBVUMsSUFBSSxtQkFDdkM2c0csRUFBeUJqdUcsR0FBSywwQkFDSyxDQUNqQyxDQUFDLG9CQUFxQiwwQkFDdEIsQ0FBQyxzQkFBdUIsdUJBQ3hCLENBQUMsU0FBVSxXQUdjK0QsUUFBUXVNLElBQ2pDLE1BQU1rUyxFQUFPL2hCLFNBQVNTLGNBQWMsT0FDcENzaEIsRUFBS3hpQixHQUFLc1EsRUFBUSxHQUNsQmtTLEVBQUtyaEIsVUFBVUMsSUFBSSx3QkFDbkJvaEIsRUFBS3ZULFlBQWNxQixFQUFRLEdBQzNCMjlGLEVBQXlCOS9FLFlBQVkzTCxLQUd2QyxFQUFBdXJGLDZCQUE2QjUvRSxZQUFZNi9FLEdBQ3pDLEVBQUFELDZCQUE2QjUvRSxZQUFZOC9FLEdBSzVCLEVBQUFDLGVBQ1QsMERBS1MsRUFBQUMsY0FDWCxvSCxzSENuRUYsYUFFQSxRQWlrQkEsU0FBU0MsRUFBYXhqRixHQUNwQixNQUFNbmMsRUFBUSxJQUFJL1MsTUFFbEIsSUFBSyxNQUFNMnZCLEtBQVlULEVBQ2pCUyxJQUFhQSxFQUFTODZFLHFCQUFxQixPQUFPNXJHLFFBQ3BEa1UsRUFBTW5VLEtBQUssQ0FDVGtVLE9BQVEsVUFDUkMsTUFBTyxDQUNMQyxVQUFXMmMsRUFBUzVoQixhQUFhLFVBQ2pDOEYsS0FBTSxNQU1kLE9BQU9kLEVBMWtCVCxzQkFBMkJoSSxHQUV6QixNQUFNNG5HLEVBQWtCNXRHLFNBQVNxRCxpQkFDL0IsMENBRUZwSSxNQUFNNEksS0FBSytwRyxHQUFpQnRxRyxRQUFTdXFHLElBQ25DQSxFQUFTdnlHLGlCQUFpQixZQUFhLFVBTXpDMEUsU0FBU0MsZUFBZSxRQUFRM0UsaUJBQWlCLFFBQVMsS0FDeEQwSyxFQUFTc2tHLE9BQU9sOEYsS0FBSyxLQUNuQmhQLEVBQWE4QixrQkFBa0IsUUFBUyxlQUc1Q2xCLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFVBQVkyWCxJQUN6QixNQUFaQSxFQUFJbmQsS0FDTmtRLEVBQVNza0csT0FBT2w4RixLQUFLLEtBQ25CaFAsRUFBYThCLGtCQUFrQixRQUFTLGVBSzlDbEIsU0FBU0MsZUFBZSxVQUFVM0UsaUJBQWlCLFFBQVMsS0FDMUQwSyxFQUFTOG5HLFNBQVMxL0YsS0FBTTIvRixJQUN0QixNQUFNQyxFQUEwQmh1RyxTQUFTUyxjQUFjLEtBQ3ZEdXRHLEVBQUt2VixLQUFPc1YsRUFDWkMsRUFBS0MsU0FBV2pvRyxFQUFTbFIsS0FBTyxVQUNoQ2tMLFNBQVNrUSxLQUFLd2QsWUFBWXNnRixHQUMxQkEsRUFBS3o0RixRQUNMeTRGLEVBQUs5dEcsU0FDTGQsRUFBYThCLGtCQUFrQixRQUFTLGVBTTVDbEIsU0FBU0MsZUFBZSxVQUFVM0UsaUJBQWlCLFFBQVMsS0FDMUQsTUFBTWttQixFQUFNeGIsRUFBU0csS0FBS0Msb0JBQzFCSixFQUFTa29HLFdBQVcxc0YsR0FBS3BULEtBQU1pMEYsSUFDN0IsTUFBTW5pRixFQUNKLG1DQUFxQzdmLE9BQU82NkIsTUFBSyxJQUFBaXpFLGVBQWM5TCxJQUNqRXJpRyxTQUFTQyxlQUFlLFVBQVUrRCxhQUFhLE9BQVFrYyxHQUN2RGxnQixTQUNHQyxlQUFlLFVBQ2YrRCxhQUFhLFdBQVlnQyxFQUFTRyxLQUFLaW9HLGNBQWdCLFlBTTlEcHVHLFNBQ0dDLGVBQWUscUJBQ2YzRSxpQkFBaUIsU0FBUyxXQUN6QixNQUFNa21CLEVBQU14YixFQUFTRyxLQUFLQyxvQkFFMUJKLEVBQVNrb0csV0FBVzFzRixHQUFLcFQsS0FBTWk2RixJQUM3QixNQUVNaEcsR0FGUyxJQUFJYSxXQUNHSSxnQkFBZ0IrRSxFQUFXLFlBQzlCblEsZ0JBQ2IvdEUsRUFBWWx2QixNQUFNNEksS0FBS3crRixFQUFJcUQscUJBQXFCLGFBR3RELElBQUkySSxHQUFvQixFQUN4QixNQUFNQyxFQUF3QixHQUM5QixJQUFLLE1BQU0xakYsS0FBWVQsRUFFckIsR0FBc0QsSUFBbERTLEVBQVM4NkUscUJBQXFCLFNBQVM1ckcsT0FBYyxDQUN2RCxNQUFNMmMsRUFBeUIsQ0FDN0IxSSxPQUFRLFNBQ1JDLE1BQU8sQ0FDTEMsVUFBVzJjLEVBQVM1aEIsYUFBYSxZQUlyQ3NsRyxFQUFzQnowRyxLQUFLNGMsR0FDM0I0M0YsR0FBb0IsRUFLeEIsR0FBS0EsRUFFRSxDQUVMLE1BQU1FLEVBQWtDLENBQ3RDeGdHLE9BQVEsUUFDUkMsTUFBT3NnRyxHQUtUdG9HLEVBQVNtSSxLQUFLb2dHLEVBQW1CL3NGLEdBQUtwVCxLQUFNMkksSUFDdENBLEdBQ0YvUSxFQUFTc0ksdUJBQ1RsUCxFQUFhOEIsa0JBQ1gsMEJBQ0EsWUFHRjlCLEVBQWE4QixrQkFDWCxtQ0FDQSxnQkFwQk45QixFQUFhOEIsa0JBQWtCLDJCQUE0QixnQkE2Qm5FbEIsU0FDR0MsZUFBZSx1QkFDZjNFLGlCQUFpQixTQUFTLFdBQ3pCLE1BQU1rbUIsRUFBTXhiLEVBQVNHLEtBQUtDLG9CQUUxQkosRUFBU2tvRyxXQUFXMXNGLEdBQUtwVCxLQUFNaTZGLElBQzdCLE1BRU1oRyxHQUZTLElBQUlhLFdBQ0dJLGdCQUFnQitFLEVBQVcsWUFDOUJuUSxnQkFDYm1PLEVBQVNwckcsTUFBTTRJLEtBQUt3K0YsRUFBSXFELHFCQUFxQixVQUduRCxJQUFJOEksR0FBaUIsRUFDckIsTUFBTUMsRUFBcUIsR0FDM0IsSUFBSyxNQUFNeHFHLEtBQVNvaUcsRUFFbEIsR0FBZ0QsSUFBNUNwaUcsRUFBTXloRyxxQkFBcUIsTUFBTTVyRyxPQUFjLENBQ2pELE1BQU0yYyxFQUF5QixDQUM3QjFJLE9BQVEsU0FDUkMsTUFBTyxDQUNMQyxVQUFXaEssRUFBTStFLGFBQWEsWUFJbEN5bEcsRUFBbUI1MEcsS0FBSzRjLEdBQ3hCKzNGLEdBQWlCLEVBS3JCLEdBQUtBLEVBRUUsQ0FFTCxNQUFNRCxFQUFrQyxDQUN0Q3hnRyxPQUFRLFFBQ1JDLE1BQU95Z0csR0FLVHpvRyxFQUFTbUksS0FBS29nRyxFQUFtQi9zRixHQUFLcFQsS0FBTTJJLElBQ3RDQSxHQUNGL1EsRUFBU3NJLHVCQUNUbFAsRUFBYThCLGtCQUFrQix1QkFBd0IsWUFFdkQ5QixFQUFhOEIsa0JBQ1gsZ0NBQ0EsZ0JBakJOOUIsRUFBYThCLGtCQUFrQix3QkFBeUIsZ0JBeUJoRWxCLFNBQ0dDLGVBQWUsK0JBQ2YzRSxpQkFBaUIsU0FBUyxXQUN6QixNQUFNa21CLEVBQU14YixFQUFTRyxLQUFLQyxvQkFDMUJKLEVBQVNrb0csV0FBVzFzRixHQUFLcFQsS0FBTWk2RixJQUU3QixNQUVNaEcsR0FGUyxJQUFJYSxXQUNHSSxnQkFBZ0IrRSxFQUFXLFlBQzlCblEsZ0JBR2JvUSxFQUFhakcsRUFBSXA3RixjQUFjLFdBQy9Cc2hHLEVBQVNseEcsT0FBT2l4RyxFQUFXdC9GLGFBQWEsUUFDNUN3L0YsRUFBU254RyxPQUFPaXhHLEVBQVd0L0YsYUFBYSxRQVUxQyxNQUNNMGxHLEVBRFF6ekcsTUFBTTRJLEtBQUt3K0YsRUFBSWgvRixpQkFBaUIsU0FDaEIrRSxPQUFRazZGLEdBQ3BDLENBQUMsTUFBTyxNQUFPLE1BQU8sT0FBT3Z3RCxLQUFNMTlCLEdBVnJDLFNBQTJCaXVGLEVBQWVqdUYsR0FDeEMsTUFBTXEwRixFQUFRcnhHLE9BQU9pckcsRUFBS3Q1RixhQUFhcUwsSUFFdkMsT0FBT3EwRixFQUFRLEdBQUtBLEdBREMsT0FBUnIwRixHQUF5QixPQUFSQSxFQUFnQmswRixFQUFTQyxHQVNyREcsQ0FBa0JyRyxFQUFNanVGLEtBR3RCczZGLEVBQVUsSUFBSXY5RSxJQUNsQnM5RSxFQUFnQnhsRyxJQUFLbzVGLEdBQVMsQ0FBQ0EsRUFBS3Q1RixhQUFhLFVBQVdzNUYsS0FPeERzTSxFQUhTM3pHLE1BQU00SSxLQUNuQncrRixFQUFJaC9GLGlCQUFpQiw2QkFFUytFLE9BQVF5bUcsSUFDdEMsR0FBSUEsRUFBTTltRixhQUFhLFFBQVMsQ0FDOUIsTUFBTSttRixFQUFTRCxFQUFNN2xHLGFBQWEsUUFBUTdRLE1BQU0sR0FDaEQsT0FBT3cyRyxFQUFRNWtHLElBQUkra0csR0FHckIsT0FBTyxJQUtULEdBQWdDLElBQTVCRixFQUFpQjkwRyxPQUNuQixPQUFPc0YsRUFBYThCLGtCQUNsQiw4Q0FDQSxXQUtKLE1BU013VixFQUE0QixDQUNoQzNJLE9BQVEsUUFDUkMsTUFYb0M0Z0csRUFBaUIxbEcsSUFBSzJsRyxJQUNuRCxDQUNMOWdHLE9BQVEsU0FDUkMsTUFBTyxDQUNMQyxVQUFXNGdHLEVBQU03bEcsYUFBYSxlQVVwQ2hELEVBQVNtSSxLQUFLdUksRUFBYThLLEdBQUtwVCxLQUFNMkksSUFDaENBLEdBQ0YvUSxFQUFTc0ksdUJBQ1RsUCxFQUFhOEIsa0JBQ1gsZ0RBQ0EsWUFHRjlCLEVBQWE4QixrQkFDWCwyQ0FDQSxnQkFPWmxCLFNBQ0dDLGVBQWUsNEJBQ2YzRSxpQkFBaUIsU0FBUyxXQUN6QixNQUFNa21CLEVBQU14YixFQUFTRyxLQUFLQyxvQkFDMUJKLEVBQVNrb0csV0FBVzFzRixHQUFLcFQsS0FBTWk2RixJQUU3QixNQUVNaEcsR0FGUyxJQUFJYSxXQUNHSSxnQkFBZ0IrRSxFQUFXLFlBQzlCblEsZ0JBQ2J0c0UsRUFBTTN3QixNQUFNNEksS0FBS3crRixFQUFJcUQscUJBQXFCLE9BRWhELElBQUlxSixHQUFvQixFQUN4QixNQUFNcjRGLEVBQTRCLENBQ2hDM0ksT0FBUSxRQUNSQyxNQUFPLElBRUhBLEVBQVEsSUFBSS9TLE1BQ2xCLElBQUk0bkcsRUFBUSxFQUNaLEtBQU9BLEVBQVFqM0UsRUFBSTl4QixRQUNiOHhCLEVBQUlpM0UsR0FBTzc1RixhQUFhLGNBRXZCNjVGLEVBQVFqM0UsRUFBSTl4QixPQUFTLElBQ25COHhCLEVBQUlpM0UsRUFBUSxHQUFHNzVGLGFBQWEsWUFDL0I2NUYsR0FBU2ozRSxFQUFJOXhCLE9BQVMsS0FJdEJpMUcsR0FBb0IsRUFDcEIvZ0csRUFBTW5VLEtBQUssQ0FDVGtVLE9BQVEsTUFDUkMsTUFBTyxDQUNMQyxVQUFXMmQsRUFBSWkzRSxHQUFPNzVGLGFBQWEsVUFDbkM4TSxTQUFVLFVBQ1ZDLFVBQVcsT0FJakI4c0YsR0FBUyxHQUVYQSxHQUFTLEVBR05rTSxHQU1IcjRGLEVBQVkxSSxNQUFRQSxFQUNwQmhJLEVBQ0dtSSxLQUFLdUksRUFBYTFRLEVBQVNHLEtBQUtDLHFCQUNoQ2dJLEtBQU0ySSxJQUNEQSxFQUNGM1gsRUFBYThCLGtCQUNYLDZCQUNBLFdBR0Y5QixFQUFhOEIsa0JBQ1gsc0NBQ0EsU0FHSjhFLEVBQVNzSSwwQkFwQmJsUCxFQUFhOEIsa0JBQ1gsNEJBQ0EsZ0JBd0JWbEIsU0FDR0MsZUFBZSx5QkFDZjNFLGlCQUFpQixTQUFTLFdBQ3pCLE1BQU1rbUIsRUFBTXhiLEVBQVNHLEtBQUtDLG9CQUMxQkosRUFBU2tvRyxXQUFXMXNGLEdBQUtwVCxLQUFNaTZGLElBRTdCLE1BRU1oRyxHQUZTLElBQUlhLFdBQ0dJLGdCQUFnQitFLEVBQVcsWUFDOUJuUSxnQkFDYi90RSxFQUFZbHZCLE1BQU00SSxLQUFLdytGLEVBQUlxRCxxQkFBcUIsYUFFaERzSixFQTZQZCxTQUE2QjdrRixHQUMzQixNQUFNNmtGLEVBQThCLEdBQ3BDLElBQUssSUFBSXJrRixFQUFNLEVBQUdBLEVBQU1SLEVBQVVyd0IsT0FBUTZ3QixJQUFPLENBQy9DLE1BQU1DLEVBQVdULEVBQVVVLEdBQUdGLEdBQzlCLEdBQUlDLEVBQVM3QyxhQUFhLFlBQWEsQ0FFckMsTUFBTStDLEVBQWlCRixFQUFTNWhCLGFBQWEsWUFBWXlGLFFBQVEsSUFBSyxJQUd0RSxJQUFJc2MsRUFDSixNQUFNQyxFQUFlYixFQUFVbFosS0FBSyxDQUFDL04sRUFBU3luQixJQUN4Q3puQixFQUFROEYsYUFBYSxZQUFjOGhCLElBQ3JDQyxFQUFrQkosR0FDWCxJQU9OSyxHQUNIZ2tGLEVBQWlCbjFHLEtBQUsrd0IsR0FJbkJJLEVBQWFqRCxhQUFhLFlBQzdCaW5GLEVBQWlCbjFHLEtBQUsrd0IsR0FLdEJJLEVBQWFoaUIsYUFBYSxZQUMxQixJQUFNNGhCLEVBQVM1aEIsYUFBYSxXQUU1QmdtRyxFQUFpQm4xRyxLQUFLK3dCLEdBTXBCRyxJQUFvQkosRUFBTSxHQUM1QnFrRixFQUFpQm4xRyxLQUFLK3dCLEdBRzFCLEdBQUlBLEVBQVM3QyxhQUFhLFdBQVksQ0FDcEMsTUFBTWtELEVBQWlCTCxFQUFTNWhCLGFBQWEsV0FBV3lGLFFBQVEsSUFBSyxJQUMvRHljLEVBQWVmLEVBQVVsWixLQUM1QjJaLEdBQWFBLEVBQVM1aEIsYUFBYSxZQUFjaWlCLEdBSS9DQyxHQUNIOGpGLEVBQWlCbjFHLEtBQUsrd0IsR0FJbkJNLEVBQWFuRCxhQUFhLGFBQzdCaW5GLEVBQWlCbjFHLEtBQUsrd0IsR0FLdEJNLEVBQWFsaUIsYUFBYSxhQUMxQixJQUFNNGhCLEVBQVM1aEIsYUFBYSxXQUU1QmdtRyxFQUFpQm4xRyxLQUFLK3dCLElBSTVCLE9BQU9va0YsRUFsVXdCQyxDQUFvQjlrRixHQUU3QyxHQUFnQyxJQUE1QjZrRixFQUFpQmwxRyxPQUNuQnNGLEVBQWE4QixrQkFDWCw2QkFDQSxlQUVHLENBQ0wsTUFBTXdWLEVBQTRCLENBQ2hDM0ksT0FBUSxRQUNSQyxNQUFPLElBRUhBLEVBQVEsSUFBSS9TLE1BQ2xCLElBQUssTUFBTTJ2QixLQUFZb2tGLEVBQ3JCLEdBQ0Vwa0YsRUFBUzdDLGFBQWEsYUFDdEI2QyxFQUFTN0MsYUFBYSxXQUN0QixDQUNBLE1BQU1tbkYsRUFBbUIva0YsRUFBVWxaLEtBQ2hDL04sR0FDQ0EsRUFBUThGLGFBQWEsWUFDckI0aEIsRUFBUzVoQixhQUFhLFlBQVlzVSxVQUFVLElBRTFDNnhGLEVBQWtCaGxGLEVBQVVsWixLQUMvQi9OLEdBQ0NBLEVBQVE4RixhQUFhLFlBQ3JCNGhCLEVBQVM1aEIsYUFBYSxXQUFXc1UsVUFBVSxJQUcvQ3RQLEVBQU1uVSxLQUFLLENBQ1RrVSxPQUFRLE1BQ1JDLE1BQU8sQ0FDTEMsVUFBVzJjLEVBQVM1aEIsYUFBYSxVQUNqQzhNLFNBQVUsV0FDVkMsVUFBVyxNQUdmL0gsRUFBTW5VLEtBQUssQ0FDVGtVLE9BQVEsTUFDUkMsTUFBTyxDQUNMQyxVQUFXMmMsRUFBUzVoQixhQUFhLFVBQ2pDOE0sU0FBVSxVQUNWQyxVQUFXLE1BR2YvSCxFQUFNblUsS0FBSyxDQUNUa1UsT0FBUSxNQUNSQyxNQUFPLENBQ0xDLFVBQVdpaEcsRUFBaUJsbUcsYUFBYSxVQUN6QzhNLFNBQVUsVUFDVkMsVUFBVyxNQUdmL0gsRUFBTW5VLEtBQUssQ0FDVGtVLE9BQVEsTUFDUkMsTUFBTyxDQUNMQyxVQUFXa2hHLEVBQWdCbm1HLGFBQWEsVUFDeEM4TSxTQUFVLFdBQ1ZDLFVBQVcsTUFJZi9ILEVBQU1uVSxRQUNEOHpHLEVBQWEsQ0FBQy9pRixFQUFVc2tGLEVBQWtCQyxVQUUxQyxHQUFJdmtGLEVBQVM3QyxhQUFhLFlBQWEsQ0FDNUMsTUFBTW1uRixFQUFtQi9rRixFQUFVbFosS0FDaEMvTixHQUNDQSxFQUFROEYsYUFBYSxZQUNyQjRoQixFQUFTNWhCLGFBQWEsWUFBWXNVLFVBQVUsSUFHaER0UCxFQUFNblUsS0FBSyxDQUNUa1UsT0FBUSxNQUNSQyxNQUFPLENBQ0xDLFVBQVcyYyxFQUFTNWhCLGFBQWEsVUFDakM4TSxTQUFVLFdBQ1ZDLFVBQVcsTUFHZi9ILEVBQU1uVSxLQUFLLENBQ1RrVSxPQUFRLE1BQ1JDLE1BQU8sQ0FDTEMsVUFBV2loRyxFQUFpQmxtRyxhQUFhLFVBQ3pDOE0sU0FBVSxVQUNWQyxVQUFXLE1BR2YvSCxFQUFNblUsUUFBUTh6RyxFQUFhLENBQUMvaUYsRUFBVXNrRixVQUNqQyxHQUFJdGtGLEVBQVM3QyxhQUFhLFdBQVksQ0FDM0MsTUFBTW9uRixFQUFrQmhsRixFQUFVbFosS0FDL0IvTixHQUNDQSxFQUFROEYsYUFBYSxZQUNyQjRoQixFQUFTNWhCLGFBQWEsV0FBV3NVLFVBQVUsSUFHL0N0UCxFQUFNblUsS0FBSyxDQUNUa1UsT0FBUSxNQUNSQyxNQUFPLENBQ0xDLFVBQVcyYyxFQUFTNWhCLGFBQWEsVUFDakM4TSxTQUFVLFVBQ1ZDLFVBQVcsTUFHZi9ILEVBQU1uVSxLQUFLLENBQ1RrVSxPQUFRLE1BQ1JDLE1BQU8sQ0FDTEMsVUFBV2toRyxFQUFnQm5tRyxhQUFhLFVBQ3hDOE0sU0FBVSxXQUNWQyxVQUFXLE1BR2YvSCxFQUFNblUsUUFBUTh6RyxFQUFhLENBQUMvaUYsRUFBVXVrRixLQUkxQ3o0RixFQUFZMUksTUFBUUEsRUFDcEJoSSxFQUNHbUksS0FBS3VJLEVBQWExUSxFQUFTRyxLQUFLQyxxQkFDaENnSSxLQUFNMkksSUFDREEsRUFDRjNYLEVBQWE4QixrQkFDWCw4QkFDQSxXQUdGOUIsRUFBYThCLGtCQUNYLHVDQUNBLFNBR0o4RSxFQUFTc0ksK0JBT3JCdE8sU0FBU0MsZUFBZSxVQUFVM0UsaUJBQWlCLFNBQVMsV0FFeEQrRSxPQUFPcTJGLFFBQ0wsdUVBR0Yxd0YsRUFBU29wRyxXQUFXaGhHLEtBQUssS0FDdkIvTixPQUFPZ3ZHLFNBQVNDLGVBMkN4Qiw2QkFBa0N0cEcsR0FJaEMsU0FBU3VwRyxJQUNQdnBHLEVBQVN3cEcsT0FBT3BoRyxLQUFNMkksSUFDaEJBLEVBQ0YvUSxFQUFTc0ksd0JBRVRsUCxFQUFhOEIsa0JBQWtCLGtDQUMvQjlHLFFBQVFDLEtBQUssNEJBUW5CLFNBQVNvMUcsSUFDUHpwRyxFQUFTMHBHLE9BQU90aEcsS0FBTTJJLElBQ2hCQSxFQUNGL1EsRUFBU3NJLHdCQUVUbFAsRUFBYThCLGtCQUFrQixrQ0FDL0I5RyxRQUFRQyxLQUFLLDRCQUtuQjJGLFNBQVNDLGVBQWUsUUFBUTNFLGlCQUFpQixRQUFTaTBHLEdBQzFEdnZHLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFVBQVkyWCxJQUN6QixNQUFaQSxFQUFJbmQsTUFBZ0JtZCxFQUFJa3RGLFNBQVdsdEYsRUFBSW1DLFVBQ3pDbTZGLE1BSUp2dkcsU0FBU0MsZUFBZSxRQUFRM0UsaUJBQWlCLFFBQVNtMEcsR0FDMUR6dkcsU0FBU2tRLEtBQUs1VSxpQkFBaUIsVUFBWTJYLEtBRTFCLE1BQVpBLEVBQUluZCxLQUE0QixNQUFabWQsRUFBSW5kLEtBQWVtZCxFQUFJaXJGLFlBQzNDanJGLEVBQUlrdEYsU0FBV2x0RixFQUFJbUMsVUFFcEJxNkYsUSxnRkM5akJOLGNBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUdBLFFBRU0zNkcsRUFBTzY2RyxFQUFZLFlBQ25CbkYsRUFBVW1GLEVBQVksV0FFNUIsR0FBSTc2RyxFQUFNLENBQ1IsTUFBTTg2RyxFQUFtQix1QkFBdUI5NkcsV0FDaER1TCxPQUFPeXJDLE1BQU04akUsR0FBa0J4aEcsS0FBS0MsSUFDbEMsR0FBSUEsRUFBU3lsQixHQUNYLE9BQU96bEIsRUFBU1MsT0FFaEIsTUFBTSxJQUFJN1UsTUFBTW9VLEVBQVN3aEcsY0FFMUJ6aEcsS0FBS3ZJLE1BQU1pSixJQUNaLElBQUlpL0YsRUFDSixJQUNFQSxFQUFXcnJHLEtBQUtDLE1BQU1tTSxHQUN0QixNQUFPRyxHQUdQLE9BRkE3VSxRQUFRNEIsTUFBTWlULFFBQ2Q3VSxRQUFRNnNHLE1BQU1uNEYsR0FZaEIsSUFBSXhNLEVBRUZBLFNBVjhCLElBQUkxSyxRQUFRLENBQUNDLEVBQVNDLEtBQ3BEdUksT0FBT3lyQyxNQUFNaWlFLEVBQVMrQixPQUFPMWhHLEtBQUtDLElBQ2hDeFcsRUFBZ0J3VyxFQUFTdTNDLFFBQVF4d0QsSUFBSSxtQkFDcENtbEMsTUFBTXZpQyxJQUNQRixFQUFPRSxRQUtHaVIsTUFBTSxZQUNULENBQ1A4a0csU0FBVUEsRUFDVmdDLFFBQVMsVUFDVEMsS0FBTSxVQUNOQyxTQUFVLFVBQ1ZDLFNBQVUsVUFDVkMsS0FBTSxVQUNOQyxVQUFXLFdBR0osQ0FDUHJDLFNBQVVBLEVBQ1ZnQyxRQUFTLFVBQ1RDLEtBQU0sVUFDTkMsU0FBVSxVQUNWQyxTQUFVLFVBQ1ZDLEtBQU0sVUFDTkMsVUFBVyxXQUlGLElBQUksVUFBUzl0RyxHQUNyQjI2QixjQUVGLENBQ00sSUFBSSxVQUFRLHFCQUNwQnlNLGNBQWM4Z0UsRUFBUyxZQUFZcDhGLEtBQUs4dEIsR0FDbEMsSUFBSTc3QixPQUFPZ3dHLFNBQVNuMEUsR0FBTXNiLFFBQ2hDcHBDLEtBQUt2SSxNQUFNa29HLElBU1osSUFBSXpyRyxFQUVGQSxTQVY4QixJQUFJMUssUUFBUSxDQUFDQyxFQUFTQyxLQUNwRHVJLE9BQU95ckMsTUFBTWlpRSxFQUFTK0IsT0FBTzFoRyxLQUFLQyxJQUNoQ3hXLEVBQWdCd1csRUFBU3UzQyxRQUFReHdELElBQUksbUJBQ3BDbWxDLE1BQU12aUMsSUFDUEYsRUFBT0UsUUFLR2lSLE1BQU0sWUFDVCxDQUNQOGtHLFNBQVVBLEVBQ1ZnQyxRQUFTLFVBQ1RDLEtBQU0sVUFDTkMsU0FBVSxVQUNWQyxTQUFVLFVBQ1ZDLEtBQU0sVUFDTkMsVUFBVyxXQUdKLENBQ1ByQyxTQUFVQSxFQUNWZ0MsUUFBUyxVQUNUQyxLQUFNLFVBQ05DLFNBQVUsVUFDVkMsU0FBVSxVQUNWQyxLQUFNLFVBQ05DLFVBQVcsV0FJRixJQUFJLFVBQVM5dEcsR0FDckIyNkIsVUFJVCxTQUFTMHlFLEVBQVlwakQsR0FDbkIsSUFBSXgxQyxFQVdKLE9BVEExVyxPQUFPZ3ZHLFNBQVMzdkcsT0FDYjJSLE9BQU8sR0FDUCtULE1BQU0sS0FDTjloQixRQUFTeWUsSUFDUixNQUFNNUUsRUFBTTRFLEVBQUtxRCxNQUFNLEtBQ25CakksRUFBSSxLQUFPb3ZDLElBQ2J4MUMsRUFBU3NPLG1CQUFtQmxJLEVBQUksT0FHL0JwRyxJLCtGQ3pIVCxjQUNBLFFBQ0EsUUFDQSxRQUNBLE9BV0EsUUFDQSxRQUNBLE9BbU9xQixFQUFBN1gsUUE1TnJCLE1BNEJFLFlBQWFvRCxJQUNOLElBQUFndUcsZUFBY2h1RyxFQUFPeXJHLFdBQ3hCM3pHLFFBQVE0QixNQUFNLGdDQUdoQnZFLEtBQUs2SyxPQUFTQSxFQUNkN0ssS0FBS3MyRyxTQUFXenJHLEVBQU95ckcsU0FNekIsVUFBVXpyRyxHQVFSLFFBTndCM0osSUFBcEIySixFQUFPMnRHLFdBQ1R4NEcsS0FBSzg0RyxTQUFXLElBQUlqdUcsRUFBTzJ0RyxTQUFTeDRHLFdBQ1prQixJQUFwQjJKLEVBQU80dEcsV0FDVHo0RyxLQUFLeTRHLFNBQVcsSUFBSTV0RyxFQUFPNHRHLFNBQVN6NEcsYUFHZmtCLElBQXJCMkosRUFBTzh0RyxVQUF5QixDQUNsQzM0RyxLQUFLMjRHLFVBQVksSUFBSTl0RyxFQUFPOHRHLFVBQVUzNEcsTUFDdENBLEtBQUs4NEcsU0FBU0MsdUJBQ2QsTUFBTSxTQUFFN3VHLEVBQVEsV0FBRUMsRUFBVSxjQUFFRSxJQUFrQixJQUFBdVIsZUFHaEQsT0FGQXJULFNBQVNDLGVBQWUyQixHQUFZbEIsVUFBVUMsSUFBSSxhQUNsRFgsU0FBU0MsZUFBZTZCLEdBQWVwQixVQUFVQyxJQUFJLGFBQzdDZ0IsR0FDTixJQUFLLFNBQ0gzQixTQUFTQyxlQUFlMkIsR0FBWTJULFFBQ3BDLE1BQ0YsSUFBSyxPQUNMLFFBQ0V2VixTQUFTQyxlQUFlNkIsR0FBZXlULFVBUy9DLFNBU0UsYUFBUTlkLE1BQU0yVyxLQUFLLEtBRWpCM1csS0FBSzJKLGNBQWdCLElBQUksVUFBYzNKLEtBQUtzMkcsU0FBUyxRQUNyRHQyRyxLQUFLME8sS0FBTyxJQUFJMU8sS0FBSzZLLE9BQU82dEcsS0FBSzE0RyxLQUFNQSxLQUFLNkssT0FBT3l0RyxRQUFTdDRHLEtBQUtzMkcsU0FBUytCLE9BQzFFcjRHLEtBQUszQyxLQUFPMkMsS0FBS3MyRyxTQUFTdjlGLE1BQzFCL1ksS0FBS2c1RyxLQUFPLElBQUksVUFBU2g1RyxLQUFLczJHLFVBQzlCdDJHLEtBQUs4aUIsS0FBTyxJQUFJOWlCLEtBQUs2SyxPQUFPMHRHLEtBQUt2NEcsTUFDakNBLEtBQUs0ZixNQUFRLElBQUksRUFBQTJWLFlBQVl2MUIsTUFDN0JpNUcsRUFBV2w1RyxLQUFLQyxPQUNoQixJQUFBazVHLGlCQUNBLElBQUFDLHdCQUVBbjVHLEtBQUtvNUcsVUFBVXA1RyxLQUFLNkssUUFDYjdLLEtBQUtnNUcsS0FBS0ssV0FDaEIxaUcsS0FBSyxJQUVDM1csS0FBSzZXLHNCQUFxQixJQUNoQ0YsS0FBSyxLQUVOM1csS0FBSzBPLEtBQUs0cUcsY0FRZCxxQkFBc0J0cUIsR0FBUSxHQUM1QixNQUFNdXFCLEVBQVN2NUcsS0FBSzBPLEtBQUs4cUcsaUJBQ3pCLE9BQU94NUcsS0FBSzBPLEtBQUsrcUcsV0FBV0YsRUFBUXZxQixHQU10QyxPQUVFLE9BREEsSUFBQTBxQixpQkFBZSxHQUNSMTVHLEtBQUtnNUcsS0FBS2YsS0FBS2o0RyxLQUFLME8sS0FBS0MscUJBTWxDLE9BRUUsT0FEQSxJQUFBK3FHLGlCQUFlLEdBQ1IxNUcsS0FBS2c1RyxLQUFLakIsS0FBSy8zRyxLQUFLME8sS0FBS0MscUJBT2xDLGNBQ0UsTUFBTSxTQUFFekUsSUFBYSxJQUFBMFIsZUFDckIsT0FBTzFSLEVBUVQsS0FBTW9NLEVBQXNCcWpHLEdBQzFCLE9BQU8zNUcsS0FBS2c1RyxLQUFLdGlHLEtBQUtKLEVBQVFxakcsR0FRaEMsZUFBZ0JDLEVBQW1CRCxHQUNqQyxPQUFPMzVHLEtBQUtnNUcsS0FBS3ZxRyxlQUFlbXJHLEVBQVdELEdBTzdDLFNBQ0UsT0FBTyxJQUFLeDVHLFFBQVEsQ0FBQ0MsRUFBU0MsS0FDNUJMLEtBQUtnNUcsS0FBS2EsaUJBQWlCbGpHLEtBQUssS0FDOUIzVyxLQUFLczJHLFNBQTBCLGdCQUFJdDJHLEtBQUtnNUcsS0FBS2MsaUJBQzdDOTVHLEtBQUtzMkcsU0FBU3lELFdBQVksSUFBSzMvRSxNQUFRRSxjQUN2QyxNQUFNN1IsRUFBTyxJQUFJN2YsT0FBTzJ4QixLQUFLLENBQUN0dkIsS0FBS00sVUFBVXZMLEtBQUtzMkcsU0FBVSxLQUFNLElBQUssQ0FBRTEwRyxLQUFNLHdCQUN6RThpQyxFQUFTLElBQUlDLFdBQ25CRCxFQUFPN2dDLGlCQUFpQixPQUFRLEtBQzlCekQsRUFBUXNrQyxFQUFPcGxCLFVBRWpCb2xCLEVBQU9zMUUsY0FBY3Z4RixLQUNwQnFhLE1BQU12aUMsSUFBU0YsRUFBT0UsT0FPN0IsT0FFRSxPQURBLElBQUFtNUcsaUJBQWUsR0FDUjE1RyxLQUFLZzVHLEtBQUthLGlCQU1uQixXQUNFLE9BQU83NUcsS0FBS2c1RyxLQUFLckIsV0FRbkIsV0FBWTRCLEdBSVYsWUFIZXI0RyxJQUFYcTRHLElBQ0ZBLEVBQVN2NUcsS0FBSzBPLEtBQUtDLHFCQUVkLElBQUl4TyxRQUFTQyxJQUNsQkosS0FBS2c1RyxLQUFLaUIsT0FBT1YsR0FBUTVpRyxLQUFNaTBGLElBQzdCeHFHLEVBQVEsMENBQTRDK2xCLG1CQUFtQnlrRixRQVM3RSxXQUFZMk8sR0FDVixPQUFPdjVHLEtBQUtnNUcsS0FBS2lCLE9BQU9WLEdBTzFCLFdBQVlBLEdBQ1YsT0FBT3Y1RyxLQUFLZzVHLEtBQUtrQixPQUFPWCxNLCtGQ2hQNUIsY0FDQSxRQUNBLFFBRUEsUUFFQSxRQUNBLFFBK2pCcUIsRUFBQTl4RyxRQTlpQnJCLE1BdUJFLFlBQWE2dUcsR0FDWHQyRyxLQUFLbTZHLGVBQWlCLElBQUksVUFPMUJuNkcsS0FBS282RyxXQUFhLElBQUl6Z0YsSUFNdEIzNUIsS0FBS3E2RyxXQUFhLElBQUkxZ0YsSUFFdEIzNUIsS0FBS3M2RyxVQUFZLElBQUkzZ0YsSUFFckIzNUIsS0FBS2tpQyxPQUFTLElBQUl1cEUsVUFFbEJ6ckcsS0FBS3U4QixHQUFLLElBQUksVUFBUSxRQUV0QnY4QixLQUFLdTZHLFdBQWEsR0FHbEJ2NkcsS0FBS3MyRyxTQUFXQSxFQUNoQnQyRyxLQUFLdzZHLFlBQWNsRSxFQUFTbUUsZ0JBQzVCejZHLEtBQUswNkcsZUFBaUIsR0FoQ3hCLGlCQUFxQyxPQUFPMTZHLEtBQUt3NkcsWUF5Q2pELGFBQWMxckUsR0FBUSxHQXdGcEIsYUFwRnVCLElBQUkzdUMsUUFBaUIsQ0FBQ0MsRUFBU0MsS0FDcERMLEtBQUt1OEIsR0FBRzUrQixJQUFJcUMsS0FBS3MyRyxTQUFTLFFBQVF4ekUsTUFBTXZpQyxJQUN0QyxHQUFpQixjQUFiQSxFQUFJbEQsS0FBc0IsQ0FFNUIsTUFBTTRqQyxFQUFNLENBQ1ZpQyxJQUFLbGpDLEtBQUtzMkcsU0FBUyxPQUNuQnlELFVBQVcvNUcsS0FBS3MyRyxTQUFTeUQsVUFDekIxQixNQUFPcjRHLEtBQUtzMkcsU0FBUytCLE1BQ3JCdC9GLE1BQU8vWSxLQUFLczJHLFNBQVN2OUYsTUFDckJ5aEcsWUFBYSxJQUtmLE9BSEF4NkcsS0FBS3c2RyxZQUFZM3VHLFFBQVE4dUcsSUFDdkIxNUUsRUFBSXU1RSxZQUFZcDRHLEtBQUt1NEcsRUFBVzd5RyxNQUUzQm01QixFQUdQLE9BREF0K0IsUUFBUTRCLE1BQU1oRSxHQUNQRixFQUFPRSxLQUVmb1csS0FBS3ZJLE1BQU82eUIsSUFFYixNQU1NMjVFLEVBQWlCLDRCQUl2QixHQVZnQixJQUFLeGdGLEtBQUs2RyxFQUFJODRFLFdBQVljLFdBT3pCRCxFQUFlNXpHLEtBQUtoSCxLQUFLczJHLFNBQVN5RCxXQUNqRCxJQUFLMy9FLEtBQUtwNkIsS0FBS3MyRyxTQUFTeUQsVUFBVS9pRyxRQUFRNGpHLEVBQWdCLFVBQVdDLFVBQ25FLElBQUt6Z0YsS0FBS3A2QixLQUFLczJHLFNBQVN5RCxXQUFZYyxhQUVqQy9yRSxFQUFPLENBRVY5dUMsS0FBS3c2RyxZQUFjLEdBQ25CLE1BQU12cEUsRUFBV2hRLEVBQUl1NUUsWUFBWS9vRyxJQUFLM0osR0FDN0IsSUFBSTNILFFBQVNzckIsSUFDbEJ6ckIsS0FBS3U4QixHQUFHNStCLElBQUltSyxHQUFJNk8sS0FBTWdrRyxJQUNwQjM2RyxLQUFLdzZHLFlBQVlwNEcsS0FBSyxDQUNwQjBGLEdBQUk2eUcsRUFBV3ozRSxJQUNmdGhDLEtBQU0sYUFDTjZXLEtBQU1raUcsRUFBV2xpRyxLQUNqQnRaLE9BQVF3N0csRUFBV3g3RyxTQUVyQnNzQixFQUFJLE1BQ0hxWCxNQUFNdmlDLElBQ1BvQyxRQUFRNEIsTUFBTWhFLEdBQ2RrckIsRUFBSSxTQUtWLGFBRE10ckIsUUFBUWd4QyxJQUFJRixHQUNYN3dDLEdBQVEsR0FHbkIsSUFBSyxNQUFNdTZHLEtBQWMzNkcsS0FBS3c2RyxrQkFFdEJ4NkcsS0FBS3U4QixHQUFHNStCLElBQUlnOUcsRUFBVzd5RyxJQUFJZzdCLE1BQU12aUMsR0FDcEIsY0FBYkEsRUFBSWxELEtBQ0MsQ0FDTDZsQyxJQUFLeTNFLEVBQVc3eUcsS0FHbEJuRixRQUFRNEIsTUFBTWhFLEdBQ1BGLEVBQU9FLEtBRWZvVyxLQUFNbWtHLElBQ1BBLEVBQWNyaUcsS0FBT2tpRyxFQUFXbGlHLEtBQ2hDcWlHLEVBQWMzN0csT0FBU3c3RyxFQUFXeDdHLE9BQzNCYSxLQUFLdThCLEdBQUc0RyxJQUFJMjNFLEtBQ2xCaDRFLE1BQU12aUMsSUFDUEYsRUFBT0UsR0FDUG9DLFFBQVE0QixNQUFNaEUsS0FHbEIsT0FBT1AsS0FBS3U4QixHQUFHNEcsSUFBSWxDLEtBQ2xCdHFCLEtBQUssSUFDQ3ZXLEdBQVEsSUFDZDBpQyxNQUFNdmlDLElBQ1BGLEVBQU9FLEdBQ1BvQyxRQUFRNEIsTUFBTWhFLE9BWXBCLFNBQVVvNUcsR0FDUixPQUFPLElBQUl4NUcsUUFBUSxDQUFDQyxFQUFTQyxLQUUzQixHQUFJTCxLQUFLMDZHLGlCQUFtQmYsR0FBVzM1RyxLQUFLczZHLFVBQVVob0csSUFBSXFuRyxHQUN4RHY1RyxFQUFRSixLQUFLczZHLFVBQVUzOEcsSUFBSWc4RyxTQUN0QixHQUFJMzVHLEtBQUtzNkcsVUFBVWhvRyxJQUFJcW5HLEdBQzVCMzVHLEtBQUsrNkcsU0FBU3BCLEVBQVMzNUcsS0FBS3M2RyxVQUFVMzhHLElBQUlnOEcsR0FBUy9PLEtBQUtqMEYsS0FBSyxLQUMzRHZXLEVBQVFKLEtBQUtzNkcsVUFBVTM4RyxJQUFJZzhHLFdBR3hCLEdBQUkzNUcsS0FBS3U2RyxXQUFXcGlDLFNBQVN3aEMsR0FBVSxDQUM1Q1YsRUFBVytCLFlBQ1gsTUFBTXhqRyxFQUFJLElBQUloVixNQUFNLHdCQUEwQm0zRyxHQUM5Q25pRyxFQUFFbmEsS0FBTyxjQUNUZ0QsRUFBT21YLE9BQ0YsQ0FFTCxNQUFNbWpHLEVBQWEzNkcsS0FBS3c2RyxZQUFZaGhHLEtBQUt2TCxHQUNoQ0EsRUFBSzlPLFNBQVd3NkcsR0FFckJnQixFQUNGL3hHLE9BQU95ckMsTUFBTXNtRSxFQUFXbGlHLE1BQU05QixLQUFLQyxJQUNqQyxHQUFJQSxFQUFTeWxCLEdBQ1gsT0FBT3psQixFQUFTUyxPQUVoQixNQUFNLElBQUk3VSxNQUFNb1UsRUFBU3doRyxjQUUxQnpoRyxLQUFLOFIsSUFFRCxnREFBZ0R6aEIsS0FBS3loQixLQUN4REEsR0FBTyxJQUFBd3lGLGtCQUFpQnh5RixLQUcxQixJQUFBeXlGLHdCQUF1Qnp5RixHQUN2QnpvQixLQUFLKzZHLFNBQVNwQixFQUFTbHhGLEdBQU05UixLQUFLLEtBQ2hDdlcsRUFBUUosS0FBS3M2RyxVQUFVMzhHLElBQUlnOEcsUUFFNUI3MkUsTUFBTXZpQyxJQUNQRixFQUFPRSxNQUtUMDRHLEVBQVcrQixZQUNYaDdHLEtBQUt1NkcsV0FBV240RyxLQUFLdTNHLE9BWTdCLFNBQVVBLEVBQWlCbHhGLEVBQWMweUYsR0FBUSxHQVkvQyxPQVhBbEMsRUFBV21DLG1CQUFrQixJQUFBQyxtQkFBa0I1eUYsSUFDL0N6b0IsS0FBSzA2RyxlQUFpQmYsRUFVZixJQUFJeDVHLFFBQVNDLElBQ2xCLE1BQU1xRSxFQUEwQixDQUM5QnFELElBQUksSUFBQUMsVUFDSnVPLE9BQVEsYUFDUnMwRixJQUFLbmlGLEdBaUJQem9CLEtBQUttNkcsZUFBZXQyRyxpQkFBaUIsVUFmckMsU0FBUzg3RixFQUFRbmtGLEdBQ2YsR0FBSUEsRUFBSWlOLEtBQUszZ0IsS0FBT3JELEVBQVFxRCxHQUFJLENBQzlCLE1BQU13ekcsRUFBTXQ3RyxLQUFLa2lDLE9BQU8ycEUsZ0JBQ3RCcndGLEVBQUlpTixLQUFLNnlGLElBQ1QsaUJBQ0E3YSxnQkFDRnpnRyxLQUFLczZHLFVBQVVyMkcsSUFBSTAxRyxFQUFTLENBQzFCMkIsSUFBS0EsRUFDTDFRLElBQUtuaUYsRUFDTDB5RixNQUFPQSxJQUVUMy9GLEVBQUlyYyxPQUFPNkUsb0JBQW9CLFVBQVcyN0YsR0FDMUN2L0YsTUFHbUQ5QixLQUFLMEIsT0FDNURBLEtBQUttNkcsZUFBZTlaLFlBQVk1N0YsS0FRcEMsT0FBUWsxRyxHQUNOLE9BQU8sSUFBSXg1RyxRQUFRLENBQUNDLEVBQVNDLEtBQzNCTCxLQUFLdTdHLFNBQVM1QixHQUFTaGpHLEtBQU1zOUQsSUFDM0I3ekUsRUFBUTZ6RSxFQUFNcW5DLE9BQ2J4NEUsTUFBT3ZpQyxJQUFVRixFQUFPRSxPQVEvQixPQUFRbzVHLEdBQ04sT0FBTyxJQUFJeDVHLFFBQVEsQ0FBQ0MsRUFBU0MsS0FDM0JMLEtBQUt1N0csU0FBUzVCLEdBQVNoakcsS0FBTXM5RCxJQUMzQjd6RSxFQUFRNnpFLEVBQU0yMkIsT0FDYjluRSxNQUFPdmlDLElBQVVGLEVBQU9FLE9BUy9CLGVBQWdCaVcsRUFBbUJtakcsR0FDakMsT0FBTyxJQUFJeDVHLFFBQVNDLElBQ2xCSixLQUFLdTdHLFNBQVM1QixHQUFTaGpHLEtBQUssS0FDMUIsTUFBTWxTLEVBQTBCLENBQzlCcUQsSUFBSSxJQUFBQyxVQUNKdU8sT0FBUSxpQkFDUkUsVUFBV0EsR0FFYnhXLEtBQUttNkcsZUFBZXQyRyxpQkFBaUIsV0FBVyxTQUFTODdGLEVBQVFua0YsR0FDM0RBLEVBQUlpTixLQUFLM2dCLEtBQU9yRCxFQUFRcUQsS0FDMUIwVCxFQUFJcmMsT0FBTzZFLG9CQUFvQixVQUFXMjdGLEdBQzFDdi9GLEVBQVFvYixFQUFJaU4sS0FBS2phLGdCQUdyQnhPLEtBQUttNkcsZUFBZTlaLFlBQVk1N0YsT0FVdEMsS0FBTTRSLEVBQTRCc2pHLEdBQ2hDLElBQUkxK0UsRUFNSixPQUpFQSxFQURFajdCLEtBQUswNkcsaUJBQW1CZixFQUNoQng1RyxRQUFRQyxRQUFRSixLQUFLczZHLFVBQVUzOEcsSUFBSWc4RyxJQUVuQzM1RyxLQUFLdTdHLFNBQVM1QixHQUVuQixJQUFJeDVHLFFBQVNDLElBQ2xCNjZCLEVBQVF0a0IsS0FBS3M5RCxJQUdYQSxFQUFNcW5DLElBQU0sS0FFWixNQUFNRSxFQUFhdm5DLEVBQU0yMkIsSUFDbkJubUcsRUFBMEIsQ0FDOUJxRCxJQUFJLElBQUFDLFVBQ0p1TyxPQUFRLE9BQ1JELGFBQWNBLEdBMEJoQnJXLEtBQUttNkcsZUFBZXQyRyxpQkFBaUIsVUF4QnJDLFNBQVM4N0YsRUFBd0Jua0YsR0FDL0IsR0FBSUEsRUFBSWlOLEtBQUszZ0IsS0FBT3JELEVBQVFxRCxHQUFJLENBQzlCLEdBQUkwVCxFQUFJaU4sS0FBS25KLE9BQVEsQ0FDZHRmLEtBQUtvNkcsV0FBVzluRyxJQUFJcW5HLElBQ3ZCMzVHLEtBQUtvNkcsV0FBV24yRyxJQUFJMDFHLEVBQVMsSUFNL0IsTUFBTThCLEVBQVl6N0csS0FBS282RyxXQUFXejhHLElBQUlnOEcsR0FDMUI4QixFQUFVcjVHLEtBQUtvNUcsR0FFakIsSUFDUng3RyxLQUFLbzZHLFdBQVduMkcsSUFBSTAxRyxFQUFTOEIsRUFBVS82RyxNQUFNLElBRy9DVixLQUFLcTZHLFdBQVdwMkcsSUFBSTAxRyxFQUFTLElBRS9CbitGLEVBQUlyYyxPQUFPNkUsb0JBQW9CLFVBQVcyN0YsR0FDMUMzL0YsS0FBSzA3RyxZQUFZL0IsR0FBUyxHQUFNaGpHLEtBQUssS0FBUXZXLEVBQVFvYixFQUFJaU4sS0FBS25KLFdBQzlELElBQUFvNkYsaUJBQWUsS0FHb0NwN0csS0FBSzBCLE9BQzVEQSxLQUFLbTZHLGVBQWU5WixZQUFZNTdGLE9BVXRDLFlBQWFrMUcsRUFBaUJ3QixHQUM1QixPQUFPLElBQUloN0csUUFBU0MsSUFFbEIsSUFBSXdxRyxFQUFhK1EsRUFDakIsTUFBTUMsRUFBYSxJQUFJejdHLFFBQVNDLElBQzlCLE1BQU1xRSxFQUEwQixDQUM5QnFELElBQUksSUFBQUMsVUFDSnVPLE9BQVEsVUFFVnRXLEtBQUttNkcsZUFBZXQyRyxpQkFBaUIsV0FBVyxTQUFTODdGLEVBQVFua0YsR0FDM0RBLEVBQUlpTixLQUFLM2dCLEtBQU9yRCxFQUFRcUQsS0FDMUI4aUcsRUFBTXB2RixFQUFJaU4sS0FBS21pRixJQUNmcHZGLEVBQUlyYyxPQUFPNkUsb0JBQW9CLFVBQVcyN0YsR0FDMUNzWixFQUFXbUMsbUJBQWtCLElBQUFDLG1CQUFrQnpRLElBQy9DeHFHLEVBQVEsUUFHWkosS0FBS202RyxlQUFlOVosWUFBWTU3RixLQUU1Qm8zRyxFQUFhLElBQUkxN0csUUFBU0MsSUFDOUIsTUFBTXFFLEVBQTBCLENBQzlCcUQsSUFBSSxJQUFBQyxVQUNKdU8sT0FBUSxlQUVWdFcsS0FBS202RyxlQUFldDJHLGlCQUFpQixXQUFXLFNBQVM4N0YsRUFBUW5rRixHQUMzREEsRUFBSWlOLEtBQUszZ0IsS0FBT3JELEVBQVFxRCxLQUMxQjZ6RyxFQUFVbmdHLEVBQUlpTixLQUFLNnlGLElBQ25COS9GLEVBQUlyYyxPQUFPNkUsb0JBQW9CLFVBQVcyN0YsR0FDMUN2L0YsRUFBUSxRQUdaSixLQUFLbTZHLGVBQWU5WixZQUFZNTdGLEtBR2xDbTNHLEVBQVdqbEcsS0FBSyxJQUFla2xHLEdBQWVsbEcsS0FBSyxLQUNqRCxNQUFNMmtHLEVBQU10N0csS0FBS2tpQyxPQUFPMnBFLGdCQUN0QjhQLEVBQ0EsaUJBQ0FsYixnQkFDRnpnRyxLQUFLczZHLFVBQVVyMkcsSUFBSTAxRyxFQUFTLENBQzFCL08sSUFBS0EsRUFDTDBRLElBQUtBLEVBQ0xILE1BQU9BLElBRVQvNkcsUUFTTixLQUFNdTVHLEdBQ0osSUFBSTErRSxFQU1KLE9BSkVBLEVBREVqN0IsS0FBSzA2RyxpQkFBbUJmLEVBQ2hCeDVHLFFBQVFDLFVBRVJKLEtBQUt1N0csU0FBUzVCLEdBRW5CLElBQUl4NUcsUUFBU0MsSUFDbEI2NkIsRUFBUXRrQixLQUFLLEtBQ1gsTUFBTWxTLEVBQTBCLENBQzlCcUQsSUFBSSxJQUFBQyxVQUNKdU8sT0FBUSxZQUVWdFcsS0FBS202RyxlQUFldDJHLGlCQUFpQixXQUFXLFNBQVM4N0YsRUFBUW5rRixHQUMzREEsRUFBSWlOLEtBQUszZ0IsS0FBT3JELEVBQVFxRCxLQUMxQjBULEVBQUlyYyxPQUFPNkUsb0JBQW9CLFVBQVcyN0YsR0FDMUN2L0YsRUFBUW9iLEVBQUlpTixLQUFLM0YsVUFHckI5aUIsS0FBS202RyxlQUFlOVosWUFBWTU3RixPQVV0QyxLQUFNazFHLEdBQ0osT0FBTyxJQUFJeDVHLFFBQVFpTyxNQUFPaE8sSUFDeEIsSUFBS0osS0FBS282RyxXQUFXOW5HLElBQUlxbkcsR0FDdkIsT0FBT3Y1RyxHQUFRLEdBRWpCLE1BQU02QyxFQUFRakQsS0FBS282RyxXQUFXejhHLElBQUlnOEcsR0FBU3QwRyxNQUMzQyxJQUFLcEMsRUFBTyxPQUFPN0MsR0FBUSxHQUUzQixNQUFNd3FHLFFBQVk1cUcsS0FBS2k2RyxPQUFPTixHQUk5QixPQUhBMzVHLEtBQUtxNkcsV0FBVzE4RyxJQUFJZzhHLEdBQVN2M0csS0FBS3dvRyxTQUM1QjVxRyxLQUFLKzZHLFNBQVNwQixFQUFTMTJHLEdBQU8sR0FFN0I3QyxHQUFRLEtBU25CLEtBQU11NUcsR0FDSixPQUFPLElBQUl4NUcsUUFBUWlPLE1BQU9oTyxJQUN4QixJQUFLSixLQUFLcTZHLFdBQVcvbkcsSUFBSXFuRyxHQUN2QixPQUFPdjVHLEdBQVEsR0FFakIsTUFBTTZDLEVBQVFqRCxLQUFLcTZHLFdBQVcxOEcsSUFBSWc4RyxHQUFTdDBHLE1BQzNDLElBQUtwQyxFQUFPLE9BQU83QyxHQUFRLEdBRTNCLE1BQU13cUcsUUFBWTVxRyxLQUFLaTZHLE9BQU9OLEdBSTlCLE9BSEEzNUcsS0FBS282RyxXQUFXejhHLElBQUlnOEcsR0FBU3YzRyxLQUFLd29HLFNBQzVCNXFHLEtBQUsrNkcsU0FBU3BCLEVBQVMxMkcsR0FBTyxHQUU3QjdDLEdBQVEsS0FTbkIsdUJBRUUsSUFBSTA3RyxHQUFrQixFQUN0QixJQUFLLE1BQU1uekIsS0FBUTNvRixLQUFLczZHLFVBQVcsQ0FDakMsTUFBTWo4RyxFQUFNc3FGLEVBQUssR0FDWDVxRixFQUFRNHFGLEVBQUssR0FDbkIsR0FBSTVxRixFQUFNbzlHLE1BQU8sQ0FDZlcsR0FBa0IsRUFDbEIsTUFBTTEyRyxFQUFRcEYsS0FBS3c2RyxZQUFZaHZCLFVBQVV2OUUsR0FBaUJBLEVBQUs5TyxTQUFXZCxHQU8xRSxJQUFJMHJCLEVBQ0MvcEIsS0FBS3c2RyxZQUFZcDFHLEdBQU9xVCxLQUFLakgsTUFBTSxVQW1CdEN1WSxFQUFNLG1DQUFxQ25oQixPQUFPNjZCLEtBQUsxbEMsRUFBTTZzRyxXQWxCdkRoaUcsT0FBT3lyQyxNQUFNcjBDLEtBQUt3NkcsWUFBWXAxRyxHQUFPcVQsS0FDekMsQ0FDRXlsQixPQUFRLE1BQ1Jpd0IsUUFBUyxDQUFFLGVBQWdCLHVCQUMzQjExQyxLQUFNMWEsRUFBTTZzRyxNQUVkajBGLEtBQUtDLElBRUhtVCxFQURFblQsRUFBU3lsQixHQUNMcjhCLEtBQUt3NkcsWUFBWXAxRyxHQUFPcVQsS0FFeEIsbUNBQXFDN1AsT0FBTzY2QixLQUFLMWxDLEVBQU02c0csT0FFOUQ5bkUsTUFBTXZpQyxJQUNQb0MsUUFBUTRCLE1BQU1oRSxHQUNkb0MsUUFBUUMsS0FBSyw0QkFDYm1uQixFQUFNLG1DQUFxQ25oQixPQUFPNjZCLEtBQUsxbEMsRUFBTTZzRyxPQU1qRTVxRyxLQUFLdzZHLFlBQVlwMUcsR0FBT3FULEtBQU9zUixRQUN6Qi9wQixLQUFLdThCLEdBQUc1K0IsSUFBSXFDLEtBQUt3NkcsWUFBWXAxRyxHQUFPMEMsSUFBSTZPLEtBQU1zcUIsSUFDbERBLEVBQUl4b0IsS0FBT3NSLEVBQ0ovcEIsS0FBS3U4QixHQUFHNEcsSUFBSWxDLEtBQ2xCdHFCLEtBQUssS0FDTjVZLEVBQU1vOUcsT0FBUSxJQUNicjRFLE1BQU12aUMsSUFDUG9DLFFBQVE0QixNQUFNaEUsTUFLaEJ1N0csU0FDSTk3RyxLQUFLdThCLEdBQUc1K0IsSUFBSXFDLEtBQUtzMkcsU0FBUyxRQUFRMy9GLEtBQU1zcUIsSUFDNUNBLEVBQUk4NEUsV0FBWSxJQUFLMy9FLE1BQVFFLGNBQ3RCdDZCLEtBQUt1OEIsR0FBRzRHLElBQUlsQyxLQUNsQjZCLE1BQU12aUMsSUFDUG9DLFFBQVE0QixNQUFNaEUsS0FNcEIsaUJBRUUsTUFBTWk2RyxRQUFvQng2RyxLQUFLdThCLEdBQUc1K0IsSUFBSXFDLEtBQUtzMkcsU0FBUyxRQUNqRDMvRixLQUFNc3FCLEdBQXNCQSxFQUFJdTVFLGFBQ25DQSxFQUFZcDRHLEtBQUtwQyxLQUFLczJHLFNBQVMsUUFFL0IsTUFBTXJsRSxFQUFXdXBFLEVBQVkvb0csSUFBSzNKLEdBQ3pCLElBQUkzSCxRQUFjc3JCLElBQ3ZCenJCLEtBQUt1OEIsR0FBRzUrQixJQUFJbUssR0FDVDZPLEtBQUtzcUIsR0FBZ0JqaEMsS0FBS3U4QixHQUFHOXpCLE9BQU93NEIsSUFDcEN0cUIsS0FBSyxJQUFNOFUsUUFHbEIsT0FBT3RyQixRQUFRZ3hDLElBQUlGLE0sOEVDN2pCdkIsZ0JBRUUsY0FFSWp4QyxLQUFLKzdHLGNBQWdCLElBQUlsSyxPQUN2QiwwQ0FZTixpQkFDRWp3RyxFQUNBZixHQUVBLE9BQU9iLEtBQUsrN0csY0FBY2w0RyxpQkFBaUJqQyxFQUFNZixHQU1uRCxZQUFZNEQsR0FDVixPQUFPekUsS0FBSys3RyxjQUFjMWIsWUFBWTU3RixNLHFHQy9CMUMsTUFBTXUzRyxFQUFhLEVBQVEsSUFDckJDLEVBQWMsRUFBUSxJQUM1QixRQU9BLHlCQUErQkMsR0FDN0IsTUFBTWovRSxHQUFVLElBQUF1USxVQUFTMHVFLEVBQWdCRixHQUNuQy94RixFQUFXZ1QsRUFBUWhULFNBQ3pCLEdBQUlnVCxFQUFRcFMsT0FBT3hvQixPQUFTLEVBRTFCLE9BREFNLFFBQVE0QixNQUFNMDRCLEVBQVFwUyxTQUNmLEVBRVQsTUFBTW5tQixFQUFVdWxCLEVBQVMsWUFDekIsTUFBZ0Isa0VBQVp2bEIsSUFHQ0EsRUFBUSxLQUFPdTNHLEVBQVksSUFDM0J2M0csRUFBUSxHQUFXLFNBQU11M0csRUFBWSxHQUFXLFFBQ2hEdjNHLEVBQVEsR0FBVSxRQUFNdTNHLEVBQVksR0FBVSxPQUM5Q3YzRyxFQUFRLEdBQWMsWUFBTXUzRyxFQUFZLEdBQWMsV0FDdER2M0csRUFBUSxHQUFVLE1BQUUsU0FBV3UzRyxFQUFZLEdBQVUsTUFBRSxRQUN2RHYzRyxFQUFRLEdBQVUsTUFBRSxXQUFhdTNHLEVBQVksR0FBVSxNQUFFLFVBQ3pEdjNHLEVBQVEsR0FBb0IsZ0JBQUUsU0FBV3UzRyxFQUFZLEdBQW9CLGdCQUFFLFFBQzNFdjNHLEVBQVEsR0FBb0IsZ0JBQUUsV0FBYXUzRyxFQUFZLEdBQW9CLGdCQUFFLFVBQzdFdjNHLEVBQVEsR0FBb0IsZ0JBQUUsZ0JBQWtCdTNHLEVBQVksR0FBb0IsZ0JBQUUsZ0JBR3JGdDVHLFFBQVE0QixNQUFNLG9CQUNkNUIsUUFBUTRCLE1BQU1HLEdBQ2QvQixRQUFRNEIsTUFBTTAzRyxJQUNQLE0sb3hCQ2xDWCxJQUFJRSxFQUFZdC9HLEVBQU9ELFFBQVF1L0csVUFBWSxFQUFRLElBRW5EdC9HLEVBQU9ELFFBQVE4dEIsZ0JBQWtCLEVBQVEsSUFBYUEsZ0JBQ3REN3RCLEVBQU9ELFFBQVF3dUIscUJBQXVCLEVBQVEsSUFBYUEscUJBQzNEdnVCLEVBQU9ELFFBQVFvdEIsZ0JBQWtCLEVBQVEsSUFBYUEsZ0JBQ3REbnRCLEVBQU9ELFFBQVErdUIsWUFBYyxFQUFRLElBQWFBLFlBQ2xEOXVCLEVBQU9ELFFBQVFpb0csaUJBQW1CLEVBQVEsSUFBVUEsaUJBQ3BEaG9HLEVBQU9ELFFBQVFvb0csS0FBTyxFQUFRLElBQVVBLEtBRXhDbm9HLEVBQU9ELFFBQVE0d0MsU0FBVyxTQUFVdmpCLEVBQVVDLEVBQVFyTSxHQUVwRCxPQURRLElBQUlzK0YsR0FDSDN1RSxTQUFTdmpCLEVBQVVDLEVBQVFyTSxLLDZCQ1h0QyxJQUFJOG1GLEVBQVMsRUFBUSxJQUVqQnlYLEVBQVksRUFBUSxJQUNwQnhYLEVBQVUsRUFBUSxJQUNsQkssRUFBYSxFQUFRLElBQVVELEtBQy9CdDZFLEVBQWtCazZFLEVBQVFsNkUsZ0JBQzFCVSxFQUF1Qnc1RSxFQUFReDVFLHFCQUMvQk8sRUFBY2k1RSxFQUFRajVFLFlBQ3RCRSxFQUFnQis0RSxFQUFRLzRFLGNBU3hCc3dGLEVBQVksU0FBU0EsSUFHdkJuOEcsS0FBSzZzQixjQUFnQnJ2QixPQUFPWSxPQUFPKzlHLEVBQVV6OUcsVUFBVW11QixlQUN2RDdzQixLQUFLK3JCLFFBQVUsR0FDZi9yQixLQUFLcThHLGVBQWlCLEdBR3RCcjhHLEtBQUtzRyxNQUFROUksT0FBT1ksT0FBT2tJLEdBQzNCdEcsS0FBS3dPLFdBQWFoUixPQUFPWSxPQUFPZytHLEVBQVVFLGFBdUg1QyxTQUFTQyxFQUFjcnlGLEdBQ3JCLElBQUk2NkUsRUFBeUIsaUJBQVg3NkUsRUFBdUJBLEVBQVNBLEVBQU9pN0UsS0FDekQsTUFBZ0IsaUJBQUxKLEdBQXNCQSxFQXJIbkNvWCxFQUFVejlHLFVBQVVtdUIsY0FBZ0IsR0FHcENzdkYsRUFBVXo5RyxVQUFVcXRCLFFBQVUsS0FDOUJvd0YsRUFBVXo5RyxVQUFVNEgsTUFBUSxLQUM1QjYxRyxFQUFVejlHLFVBQVU4UCxXQUFhLEtBQ2pDMnRHLEVBQVV6OUcsVUFBVTI5RyxlQUFpQixLQVFyQ0YsRUFBVXo5RyxVQUFVODlHLFVBQVksU0FBb0J0eUYsRUFBUTRCLEdBQzFELElBQUlpUCxFQUFPLzZCLEtBQ1gsSUFBS2txQixFQUNILE9BQU8sS0FFVCxJQUFJODZFLEVBQU9DLEVBQVduNUUsR0F2Q0osSUF1Q3lCNUIsR0FDdkN1eUYsRUFBUzN3RixHQUFRNUIsRUFBT00sS0FBT04sRUFBT3BpQixHQUMxQyxJQUFJLElBQUlpaUIsS0FBT2k3RSxFQUFLbDlGLEdBQ2xCOUgsS0FBSytyQixRQUFRaEMsR0FBT2k3RSxFQUFLbDlGLEdBQUdpaUIsR0FFOUIsSUFBSSxJQUFJQSxLQUFPaTdFLEVBQUtELElBRWxCL2tHLEtBQUtxOEcsZUFBZWo2RyxLQUFLMm5CLEdBTTNCLE9BSEEvcEIsS0FBS3E4RyxlQUFpQnI4RyxLQUFLcThHLGVBQWUxckcsUUFBTyxTQUFTb1osR0FDeEQsWUFBa0MsSUFBcEJnUixFQUFLaFAsUUFBUWhDLE1BRXRCL3BCLEtBQUsrckIsUUFBUTB3RixJQUd0Qk4sRUFBVXo5RyxVQUFVZytHLGtCQUFvQixTQUEyQnhYLEVBQVNuNUUsR0FDMUUsR0FBSXZvQixNQUFNNG1CLFFBQVEyQixHQUNsQixJQUFJLElBQUlqdkIsRUFBRSxFQUFHQSxFQUFFaXZCLEVBQVExcEIsT0FBUXZGLElBQzdCa0QsS0FBSzI4RyxhQUFhelgsRUFBU241RSxFQUFRanZCLEtBSXZDcS9HLEVBQVV6OUcsVUFBVWsrRyxtQkFBcUIsU0FBMkIxWCxFQUFTbjVFLEdBQzNFLEdBQUlBLEdBQTJCLGlCQUFUQSxFQUN0QixJQUFJLElBQUludEIsS0FBS210QixFQUNYL3JCLEtBQUsyOEcsYUFBYXpYLEVBQVNuNUUsRUFBUW50QixLQVV2Q3U5RyxFQUFVejlHLFVBQVVtK0csV0FBYSxTQUFxQjl3RixHQUNwRC9yQixLQUFLK3JCLFFBQVVBLEdBT2pCb3dGLEVBQVV6OUcsVUFBVW8rRyxVQUFZLFNBQW9CQyxHQUNsRCxPQUFPLzhHLEtBQUsrckIsUUFBUWd4RixJQVd0QlosRUFBVXo5RyxVQUFVOHVDLFNBQVcsU0FBbUJ2akIsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUMzRSxHQUFzQixrQkFBWFQsR0FBMEMsaUJBQVhBLEdBQW1DLE9BQVhBLEVBQ2hFLE1BQU0sSUFBSXlCLEVBQVksZ0RBRW5COU4sSUFDSEEsRUFBVSxJQUlaLElBa0JJeUIsRUFsQkF4WCxFQUFLb2lCLEVBQU9NLEtBQU9OLEVBQU9waUIsR0FDMUJna0IsRUFBTzY0RSxFQUFPdmtHLFFBQVF5ZCxFQUFRaU8sTUF6R2hCLElBeUdxQ2hrQixHQUFJLElBQzNELElBQUk2aUIsRUFBSSxFQUNOQSxFQUFNLElBQUlrQixFQUFjM0IsRUFBUXJNLEVBQVMsR0FBSWlPLEVBQU10dUIsT0FBT1ksT0FBTzRCLEtBQUsrckIsV0FDN0RBLFFBQVFELEtBQ2ZuQixFQUFJb0IsUUFBUUQsR0FBUTVCLEdBRXRCLElBQUk0NkUsRUFBUUcsRUFBV241RSxFQUFNNUIsR0FDN0IsSUFBSSxJQUFJM3JCLEtBQUt1bUcsRUFBTWg5RixHQUFHLENBQ3BCLElBQUlrMUcsRUFBTWxZLEVBQU1oOUYsR0FBR3ZKLEdBQ25Cb3NCLEVBQUlvQixRQUFReHRCLEdBQUt5K0csR0FHckIsR0FBR24vRixFQUFRby9GLGVBQXVCLzdHLElBQVgrb0IsRUFHckIsT0FGSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLElBQ3JEVyxTQUFTLGlDQUNUaE0sRUFHVCxLQURJQSxFQUFTdGYsS0FBS2s5RyxlQUFlanpGLEVBQVVDLEVBQVFyTSxFQUFTOE0sSUFFMUQsTUFBTSxJQUFJbm9CLE1BQU0sb0JBQ1osR0FBR3FiLEVBQVFtTixVQUFZMUwsRUFBT3VMLE9BQU94b0IsT0FDekMsTUFBTSxJQUFJK29CLEVBQXFCOUwsR0FFakMsT0FBT0EsR0FzQlQ2OEYsRUFBVXo5RyxVQUFVdytHLGVBQWlCLFNBQXlCanpGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDdkYsSUFBSXJMLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBRzVELEdBQW1CLGtCQUFUVCxHQUNJLElBQVRBLEVBRURBLEVBQVMsSUFDTyxJQUFUQSxJQUVQQSxFQUFTLENBQUN0b0IsS0FBTSxVQUVkLElBQUlzb0IsRUFFUixNQUFNLElBQUkxbkIsTUFBTSx1QkFHbEIsR0FBSTBuQixFQUFnQixRQUNsQixHQUFJMW1CLE1BQU00bUIsUUFBUUYsRUFBZ0IsU0FBSSxDQUNwQyxJQUFJaXpGLEVBQVksQ0FBQ2p6RixPQUFRQSxFQUFRUyxJQUFLQSxHQUN0Q1QsRUFBZ0IsUUFBRXJlLFFBQVE3TCxLQUFLbzlHLGdCQUFnQjkrRyxLQUFLMEIsS0FBTW05RyxJQUMxRGp6RixFQUFTaXpGLEVBQVVqekYsT0FDbkJpekYsRUFBVWp6RixPQUFTLEtBQ25CaXpGLEVBQVV4eUYsSUFBTSxLQUNoQnd5RixFQUFZLFVBRVpqekYsRUFBUzA2RSxFQUFRNTNFLFVBQVU5QyxFQUFRbHFCLEtBQUtxOUcsYUFBYW56RixFQUFnQixRQUFHUyxJQUs1RSxJQUFJMnlGLEVBQWVmLEVBQWNyeUYsR0FDakMsR0FBSW96RixFQUFjLENBQ2hCLElBQUlDLEVBQVd2OUcsS0FBS0ksUUFBUThwQixFQUFRb3pGLEVBQWMzeUYsR0FDOUM2eUYsRUFBUyxJQUFJM3hGLEVBQWMweEYsRUFBU0UsVUFBVzUvRixFQUFTOE0sRUFBSXRaLEtBQU1rc0csRUFBU0QsYUFBYzN5RixFQUFJb0IsU0FDakcsT0FBTy9yQixLQUFLazlHLGVBQWVqekYsRUFBVXN6RixFQUFTRSxVQUFXNS9GLEVBQVMyL0YsR0FHcEUsSUFBSUUsRUFBaUI3L0YsR0FBV0EsRUFBUTYvRixnQkFBa0IsR0FFMUQsSUFBSyxJQUFJci9HLEtBQU82ckIsRUFDZCxJQUFLa3lGLEVBQVV1QixpQkFBaUJ0L0csSUFBUXEvRyxFQUFlbHRHLFFBQVFuUyxHQUFPLEVBQUcsQ0FDdkUsSUFBSXUvRyxFQUFlLEtBQ2ZoeEYsRUFBWTVzQixLQUFLd08sV0FBV25RLEdBQ2hDLEdBQUl1dUIsRUFDRmd4RixFQUFlaHhGLEVBQVUzdkIsS0FBSytDLEtBQU1pcUIsRUFBVUMsRUFBUXJNLEVBQVM4TSxRQUMxRCxJQUF1QyxJQUFuQzlNLEVBQVFnZ0csdUJBRWpCLE1BQU0sSUFBSWx5RixFQUFZLDBCQUE0QnR0QixFQUFLNnJCLEdBRXJEMHpGLEdBQ0Z0K0YsRUFBT2tNLGFBQWFveUYsR0FLMUIsR0FBOEIsbUJBQW5CLy9GLEVBQVFpZ0csUUFBdUIsQ0FDeEMsSUFBSS8vRyxFQUFROGYsRUFBUWlnRyxRQUFRN2dILEtBQUsrQyxLQUFNaXFCLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDbEVyTCxFQUFPMkssU0FBV2xzQixFQUVwQixPQUFPdWhCLEdBU1Q2OEYsRUFBVXo5RyxVQUFVMCtHLGdCQUFrQixTQUEwQkQsRUFBV3QrRyxHQUN6RXMrRyxFQUFVanpGLE9BQVMwNkUsRUFBUTUzRSxVQUFVbXdGLEVBQVVqekYsT0FBUWxxQixLQUFLcTlHLGFBQWF4K0csRUFBR3MrRyxFQUFVeHlGLE9BU3hGd3hGLEVBQVV6OUcsVUFBVTIrRyxhQUFlLFNBQXVCbnpGLEVBQVFTLEdBQ2hFLElBQUlvNkUsRUFBTXdYLEVBQWNyeUYsR0FDeEIsT0FBRzY2RSxFQUNNL2tHLEtBQUtJLFFBQVE4cEIsRUFBUTY2RSxFQUFLcDZFLEdBQUs4eUYsVUFFakN2ekYsR0FXVGl5RixFQUFVejlHLFVBQVUwQixRQUFVLFNBQWtCOHBCLEVBQVFvekYsRUFBYzN5RixHQUdwRSxHQUZBMnlGLEVBQWUzeUYsRUFBSXZxQixRQUFRazlHLEdBRXZCM3lGLEVBQUlvQixRQUFRdXhGLEdBQ2QsTUFBTyxDQUFDRyxVQUFXOXlGLEVBQUlvQixRQUFRdXhGLEdBQWVBLGFBQWNBLEdBRzlELElBQUlTLEVBQVNwWixFQUFPejVGLE1BQU1veUcsR0FDdEJVLEVBQVdELEdBQVVBLEVBQU9uMkYsS0FDNUJyZixFQUFXeTFHLEdBQVlBLEVBQVMzN0csUUFBVWk3RyxFQUFhMWpHLE9BQU8sRUFBRzBqRyxFQUFhajdHLE9BQVMyN0csRUFBUzM3RyxRQUNwRyxJQUFLa0csSUFBYW9pQixFQUFJb0IsUUFBUXhqQixHQUM1QixNQUFNLElBQUlvakIsRUFBWSxtQkFBcUIyeEYsRUFBZSxJQUFLcHpGLEdBRWpFLElBQUl1ekYsRUFBWTdZLEVBQVFuM0UsY0FBYzlDLEVBQUlvQixRQUFReGpCLEdBQVd5MUcsRUFBU3BrRyxPQUFPLElBQzdFLFFBQWUxWSxJQUFadThHLEVBQ0QsTUFBTSxJQUFJOXhGLEVBQVksa0JBQW9CcXlGLEVBQVcsZ0JBQWtCejFHLEVBQVcsSUFBSzJoQixHQUV6RixNQUFPLENBQUN1ekYsVUFBV0EsRUFBV0gsYUFBY0EsSUFhOUNuQixFQUFVejlHLFVBQVV1L0csU0FBVyxTQUF1QmgwRixFQUFVQyxFQUFRck0sRUFBUzhNLEVBQUsvb0IsR0FDcEYsUUFBVVYsSUFBUFUsRUFBSCxDQUVNLEdBQVUsT0FBUEEsRUFDUCxNQUFNLElBQUkrcEIsRUFBWSxxQ0FFeEIsR0FBK0IsbUJBQXBCM3JCLEtBQUtzRyxNQUFNMUUsR0FDcEIsT0FBTzVCLEtBQUtzRyxNQUFNMUUsR0FBTTNFLEtBQUsrQyxLQUFNaXFCLEdBRXJDLEdBQUlyb0IsR0FBdUIsaUJBQVJBLEVBQWtCLENBQ25DLElBQUk2cEIsRUFBTXpyQixLQUFLazlHLGVBQWVqekYsRUFBVXJvQixFQUFNaWMsRUFBUzhNLEdBQ3ZELFlBQWV6cEIsSUFBUnVxQixLQUF1QkEsR0FBT0EsRUFBSVosT0FBT3hvQixRQUdsRCxPQUFPLElBR1QsSUFBSWlFLEVBQVE2MUcsRUFBVXo5RyxVQUFVNEgsTUFBUSxHQUN4Q0EsRUFBTXMvQixPQUFTLFNBQXFCM2IsR0FDbEMsTUFBMEIsaUJBQVpBLEdBRWhCM2pCLEVBQU15bkIsT0FBUyxTQUFxQjlELEdBRWxDLE1BQTBCLGlCQUFaQSxHQUF3Qm9RLFNBQVNwUSxJQUVqRDNqQixFQUFNNDNHLFFBQVUsU0FBc0JqMEYsR0FDcEMsTUFBMkIsaUJBQVpBLEdBQXlCQSxFQUFXLEdBQU0sR0FFM0QzakIsRUFBTTYzRyxRQUFVLFNBQXNCbDBGLEdBQ3BDLE1BQTBCLGtCQUFaQSxHQUVoQjNqQixFQUFNYyxNQUFRLFNBQW9CNmlCLEdBQ2hDLE9BQU96bUIsTUFBTTRtQixRQUFRSCxJQUV2QjNqQixFQUFZLEtBQUksU0FBbUIyakIsR0FDakMsT0FBb0IsT0FBYkEsR0FFVDNqQixFQUFNODNHLEtBQU8sU0FBbUJuMEYsR0FDOUIsT0FBT0EsYUFBb0JtUSxNQUU3Qjl6QixFQUFNKzNHLElBQU0sU0FBa0JwMEYsR0FDNUIsT0FBTyxHQUVUM2pCLEVBQU05SCxPQUFTLFNBQXFCeXJCLEdBRWxDLE9BQU9BLEdBQWlDLGlCQUFiQSxJQUE0QnptQixNQUFNNG1CLFFBQVFILE1BQWdCQSxhQUFvQm1RLE9BRzNHdjlCLEVBQU9ELFFBQVV1L0csRyxpQkMvVWpCLHVFQUNFLFNBQVNuekUsR0FHc0Nwc0MsR0FDOUNBLEVBQVFxdEUsU0FDb0NwdEUsR0FDNUNBLEVBQU9vdEUsU0FIVCxJQUlJSCxFQUE4QixpQkFBVnplLEdBQXNCQSxFQUU3Q3llLEVBQVd6ZSxTQUFXeWUsR0FDdEJBLEVBQVdsaEUsU0FBV2toRSxHQUN0QkEsRUFBVy91QyxLQVVaLElBQUkybEUsRUFHSjRkLEVBQVMsV0FhVEMsRUFBZ0IsUUFDaEJDLEVBQWdCLGVBQ2hCQyxFQUFrQiw0QkFHbEI1ekYsRUFBUyxDQUNSLFNBQVksa0RBQ1osWUFBYSxpREFDYixnQkFBaUIsaUJBS2xCZ3pDLEVBQVExMUQsS0FBSzAxRCxNQUNiNmdELEVBQXFCajhHLE9BQU82akIsYUFhNUIsU0FBUy9oQixFQUFNM0MsR0FDZCxNQUFNLElBQUlzQyxXQUFXMm1CLEVBQU9qcEIsSUFXN0IsU0FBUzZQLEVBQUlySyxFQUFPNi9FLEdBR25CLElBRkEsSUFBSTVrRixFQUFTK0UsRUFBTS9FLE9BQ2ZpZCxFQUFTLEdBQ05qZCxLQUNOaWQsRUFBT2pkLEdBQVU0a0YsRUFBRzcvRSxFQUFNL0UsSUFFM0IsT0FBT2lkLEVBYVIsU0FBU3EvRixFQUFVLzRFLEVBQVFxaEQsR0FDMUIsSUFBSXY1RCxFQUFRa1ksRUFBT2pZLE1BQU0sS0FDckJyTyxFQUFTLEdBV2IsT0FWSW9PLEVBQU1yckIsT0FBUyxJQUdsQmlkLEVBQVNvTyxFQUFNLEdBQUssSUFDcEJrWSxFQUFTbFksRUFBTSxJQU1UcE8sRUFETzdOLEdBRmRtMEIsRUFBU0EsRUFBTzV1QixRQUFReW5HLEVBQWlCLE1BQ3JCOXdGLE1BQU0sS0FDQXM1RCxHQUFJem1FLEtBQUssS0FpQnBDLFNBQVNvK0YsRUFBV2g1RSxHQU1uQixJQUxBLElBR0k3bkMsRUFDQThnSCxFQUpBdHFELEVBQVMsR0FDVHVxRCxFQUFVLEVBQ1Z6OEcsRUFBU3VqQyxFQUFPdmpDLE9BR2J5OEcsRUFBVXo4RyxJQUNoQnRFLEVBQVE2bkMsRUFBT3RnQixXQUFXdzVGLE9BQ2IsT0FBVS9nSCxHQUFTLE9BQVUrZ0gsRUFBVXo4RyxFQUczQixRQUFYLE9BRGJ3OEcsRUFBUWo1RSxFQUFPdGdCLFdBQVd3NUYsT0FFekJ2cUQsRUFBT255RCxPQUFlLEtBQVJyRSxJQUFrQixLQUFlLEtBQVI4Z0gsR0FBaUIsUUFJeER0cUQsRUFBT255RCxLQUFLckUsR0FDWitnSCxLQUdEdnFELEVBQU9ueUQsS0FBS3JFLEdBR2QsT0FBT3cyRCxFQVdSLFNBQVN3cUQsRUFBVzMzRyxHQUNuQixPQUFPcUssRUFBSXJLLEdBQU8sU0FBU3JKLEdBQzFCLElBQUl3MkQsRUFBUyxHQU9iLE9BTkl4MkQsRUFBUSxRQUVYdzJELEdBQVVtcUQsR0FEVjNnSCxHQUFTLFNBQzhCLEdBQUssS0FBUSxPQUNwREEsRUFBUSxNQUFpQixLQUFSQSxHQUVsQncyRCxHQUFVbXFELEVBQW1CM2dILE1BRTNCeWlCLEtBQUssSUFvQ1QsU0FBU3crRixFQUFhQyxFQUFPQyxHQUc1QixPQUFPRCxFQUFRLEdBQUssSUFBTUEsRUFBUSxNQUFnQixHQUFSQyxJQUFjLEdBUXpELFNBQVNDLEVBQU12Z0UsRUFBT3dnRSxFQUFXQyxHQUNoQyxJQUFJcDZGLEVBQUksRUFHUixJQUZBMjVCLEVBQVF5Z0UsRUFBWXhoRCxFQUFNamYsRUExTHBCLEtBMExvQ0EsR0FBUyxFQUNuREEsR0FBU2lmLEVBQU1qZixFQUFRd2dFLEdBQ094Z0UsRUFBUTBnRSxJQUEyQnI2RixHQWhNM0QsR0FpTUwyNUIsRUFBUWlmLEVBQU1qZixFQTNLQTl5QixJQTZLZixPQUFPK3hDLEVBQU01NEMsRUFBSSxHQUFzQjI1QixHQUFTQSxFQWhNMUMsS0EwTVAsU0FBUzJnRSxFQUFPcHpGLEdBRWYsSUFFSXMyQyxFQUlBKzhDLEVBQ0FydkcsRUFDQS9LLEVBQ0FxNkcsRUFDQWw5RyxFQUNBMGlCLEVBQ0FnNkYsRUFDQWpoSCxFQUVBMGhILEVBckVpQkMsRUFzRGpCcHJELEVBQVMsR0FDVHFyRCxFQUFjenpGLEVBQU05cEIsT0FFcEJ2RixFQUFJLEVBQ0p5QixFQTdNTSxJQThNTnNoSCxFQS9NUyxHQW9PYixLQUxBTCxFQUFRcnpGLEVBQU1xMEIsWUE3TkgsTUE4TkMsSUFDWGcvRCxFQUFRLEdBR0pydkcsRUFBSSxFQUFHQSxFQUFJcXZHLElBQVNydkcsRUFFcEJnYyxFQUFNN0csV0FBV25WLElBQU0sS0FDMUI1TCxFQUFNLGFBRVBnd0QsRUFBT255RCxLQUFLK3BCLEVBQU03RyxXQUFXblYsSUFNOUIsSUFBSy9LLEVBQVFvNkcsRUFBUSxFQUFJQSxFQUFRLEVBQUksRUFBR3A2RyxFQUFRdzZHLEdBQXdDLENBT3ZGLElBQUtILEVBQU8zaUgsRUFBR3lGLEVBQUksRUFBRzBpQixFQTNQakIsR0E2UEE3ZixHQUFTdzZHLEdBQ1pyN0csRUFBTSxtQkFHUDA2RyxHQXhHbUJVLEVBd0dFeHpGLEVBQU03RyxXQUFXbGdCLE1Bdkd4QixHQUFLLEdBQ2J1NkcsRUFBWSxHQUVoQkEsRUFBWSxHQUFLLEdBQ2JBLEVBQVksR0FFaEJBLEVBQVksR0FBSyxHQUNiQSxFQUFZLEdBaktkLFNBbVFpQlYsRUFBUXBoRCxHQUFPeWdELEVBQVN4aEgsR0FBS3lGLEtBQ2pEZ0MsRUFBTSxZQUdQekgsR0FBS21pSCxFQUFRMThHLElBR1QwOEcsR0FGSmpoSCxFQUFJaW5CLEdBQUs0NkYsRUF2UUwsRUF1UW9CNTZGLEdBQUs0NkYsRUF0UXpCLE1Bc1E4QzU2RixFQUFJNDZGLElBYkg1NkYsR0EzUC9DLEdBK1FBMWlCLEVBQUlzN0QsRUFBTXlnRCxHQURkb0IsRUE5UUksR0E4UWdCMWhILEtBRW5CdUcsRUFBTSxZQUdQaEMsR0FBS205RyxFQUtORyxFQUFPVixFQUFNcmlILEVBQUkyaUgsRUFEakJoOUMsRUFBTWxPLEVBQU9seUQsT0FBUyxFQUNjLEdBQVJvOUcsR0FJeEI1aEQsRUFBTS9nRSxFQUFJMmxFLEdBQU82N0MsRUFBUy8vRyxHQUM3QmdHLEVBQU0sWUFHUGhHLEdBQUtzL0QsRUFBTS9nRSxFQUFJMmxFLEdBQ2YzbEUsR0FBSzJsRSxFQUdMbE8sRUFBTzFyQixPQUFPL3JDLElBQUssRUFBR3lCLEdBSXZCLE9BQU93Z0gsRUFBV3hxRCxHQVVuQixTQUFTdXJELEVBQU8zekYsR0FDZixJQUFJNXRCLEVBQ0FxZ0QsRUFDQW1oRSxFQUNBQyxFQUNBSCxFQUNBMXZHLEVBQ0FqVCxFQUNBK2lILEVBQ0FoN0YsRUFDQWpuQixFQUNBZ2pCLEVBR0E0K0YsRUFFQU0sRUFDQVIsRUFDQVMsRUFOQTVyRCxFQUFTLEdBb0JiLElBUkFxckQsR0FIQXp6RixFQUFReXlGLEVBQVd6eUYsSUFHQzlwQixPQUdwQjlELEVBdlVVLElBd1VWcWdELEVBQVEsRUFDUmloRSxFQTFVYSxHQTZVUjF2RyxFQUFJLEVBQUdBLEVBQUl5dkcsSUFBZXp2RyxHQUM5QjZRLEVBQWVtTCxFQUFNaGMsSUFDRixLQUNsQm9rRCxFQUFPbnlELEtBQUtzOEcsRUFBbUIxOUYsSUFlakMsSUFYQSsrRixFQUFpQkMsRUFBY3pyRCxFQUFPbHlELE9BTWxDMjlHLEdBQ0h6ckQsRUFBT255RCxLQXpWRyxLQTZWSjI5RyxFQUFpQkgsR0FBYSxDQUlwQyxJQUFLMWlILEVBQUlvaEgsRUFBUW51RyxFQUFJLEVBQUdBLEVBQUl5dkcsSUFBZXp2RyxHQUMxQzZRLEVBQWVtTCxFQUFNaGMsS0FDRDVSLEdBQUt5aUIsRUFBZTlqQixJQUN2Q0EsRUFBSThqQixHQWNOLElBUEk5akIsRUFBSXFCLEVBQUlzL0QsR0FBT3lnRCxFQUFTMS9ELElBRDVCc2hFLEVBQXdCSCxFQUFpQixLQUV4Q3g3RyxFQUFNLFlBR1BxNkMsSUFBVTFoRCxFQUFJcUIsR0FBSzJoSCxFQUNuQjNoSCxFQUFJckIsRUFFQ2lULEVBQUksRUFBR0EsRUFBSXl2RyxJQUFlenZHLEVBTzlCLElBTkE2USxFQUFlbUwsRUFBTWhjLElBRUY1UixLQUFPcWdELEVBQVEwL0QsR0FDakMvNUcsRUFBTSxZQUdIeWMsR0FBZ0J6aUIsRUFBRyxDQUV0QixJQUFLMGhILEVBQUlyaEUsRUFBTzM1QixFQWxZYixLQW9ZRWc3RixHQURKamlILEVBQUlpbkIsR0FBSzQ2RixFQWxZUCxFQWtZc0I1NkYsR0FBSzQ2RixFQWpZM0IsTUFpWWdENTZGLEVBQUk0NkYsSUFEVDU2RixHQWxZM0MsR0F1WUZrN0YsRUFBVUYsRUFBSWppSCxFQUNkMGhILEVBeFlFLEdBd1lrQjFoSCxFQUNwQnUyRCxFQUFPbnlELEtBQ05zOEcsRUFBbUJNLEVBQWFoaEgsRUFBSW1pSCxFQUFVVCxFQUFZLEtBRTNETyxFQUFJcGlELEVBQU1zaUQsRUFBVVQsR0FHckJuckQsRUFBT255RCxLQUFLczhHLEVBQW1CTSxFQUFhaUIsRUFBRyxLQUMvQ0osRUFBT1YsRUFBTXZnRSxFQUFPc2hFLEVBQXVCSCxHQUFrQkMsR0FDN0RwaEUsRUFBUSxJQUNObWhFLElBSUZuaEUsSUFDQXJnRCxFQUdILE9BQU9nMkQsRUFBTy96QyxLQUFLLElBNENwQmtnRixFQUFXLENBTVYsUUFBVyxRQVFYLEtBQVEsQ0FDUCxPQUFVa2UsRUFDVixPQUFVRyxHQUVYLE9BQVVRLEVBQ1YsT0FBVU8sRUFDVixRQS9CRCxTQUFpQjN6RixHQUNoQixPQUFPd3lGLEVBQVV4eUYsR0FBTyxTQUFTeVosR0FDaEMsT0FBTzQ0RSxFQUFjeDNHLEtBQUs0K0IsR0FDdkIsT0FBU2s2RSxFQUFPbDZFLEdBQ2hCQSxNQTRCSixVQW5ERCxTQUFtQnpaLEdBQ2xCLE9BQU93eUYsRUFBVXh5RixHQUFPLFNBQVN5WixHQUNoQyxPQUFPMjRFLEVBQWN2M0csS0FBSzQrQixHQUN2QjI1RSxFQUFPMzVFLEVBQU9sbEMsTUFBTSxHQUFHcVosZUFDdkI2ckIsWUE0REgsS0FGRCxhQUNDLE9BQU84NkQsR0FDUCw4QkFuZ0JGLEssd0RDQ0Q3akcsRUFBT0QsUUFBVSxDQUNmbXpGLFNBQVUsU0FBU2hzRixHQUNqQixNQUF1QixpQkFBVixHQUVmbXZFLFNBQVUsU0FBU252RSxHQUNqQixNQUF1QixpQkFBVixHQUE4QixPQUFSQSxHQUVyQ2kxRixPQUFRLFNBQVNqMUYsR0FDZixPQUFlLE9BQVJBLEdBRVR1Z0csa0JBQW1CLFNBQVN2Z0csR0FDMUIsT0FBYyxNQUFQQSxLLDZCQ1hYbkgsRUFBUTJpSCxPQUFTM2lILEVBQVFzTyxNQUFRLEVBQVEsSUFDekN0TyxFQUFRa2pILE9BQVNsakgsRUFBUTJPLFVBQVksRUFBUSxLLDZCQ3VCN0MsU0FBUzVNLEVBQWUydkIsRUFBS3NMLEdBQzNCLE9BQU9wOEIsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLcXhCLEVBQUtzTCxHQUduRC84QixFQUFPRCxRQUFVLFNBQVN3akgsRUFBSUMsRUFBSzdxQyxFQUFJMzNELEdBQ3JDd2lHLEVBQU1BLEdBQU8sSUFDYjdxQyxFQUFLQSxHQUFNLElBQ1gsSUFBSWxuRCxFQUFNLEdBRVYsR0FBa0IsaUJBQVA4eEYsR0FBaUMsSUFBZEEsRUFBRy85RyxPQUMvQixPQUFPaXNCLEVBR1QsSUFBSWhDLEVBQVMsTUFDYjh6RixFQUFLQSxFQUFHenlGLE1BQU0weUYsR0FFZCxJQUFJQyxFQUFVLElBQ1Z6aUcsR0FBc0MsaUJBQXBCQSxFQUFReWlHLFVBQzVCQSxFQUFVemlHLEVBQVF5aUcsU0FHcEIsSUFBSTM3RyxFQUFNeTdHLEVBQUcvOUcsT0FFVGkrRyxFQUFVLEdBQUszN0csRUFBTTI3RyxJQUN2QjM3RyxFQUFNMjdHLEdBR1IsSUFBSyxJQUFJeGpILEVBQUksRUFBR0EsRUFBSTZILElBQU83SCxFQUFHLENBQzVCLElBRUl5akgsRUFBTUMsRUFBTXY3RixFQUFHa0csRUFGZjVYLEVBQUk2c0csRUFBR3RqSCxHQUFHa2EsUUFBUXNWLEVBQVEsT0FDMUI0RyxFQUFNM2YsRUFBRS9DLFFBQVFnbEUsR0FHaEJ0aUQsR0FBTyxHQUNUcXRGLEVBQU9odEcsRUFBRXFHLE9BQU8sRUFBR3NaLEdBQ25Cc3RGLEVBQU9qdEcsRUFBRXFHLE9BQU9zWixFQUFNLEtBRXRCcXRGLEVBQU9odEcsRUFDUGl0RyxFQUFPLElBR1R2N0YsRUFBSTJJLG1CQUFtQjJ5RixHQUN2QnAxRixFQUFJeUMsbUJBQW1CNHlGLEdBRWxCN2hILEVBQWUydkIsRUFBS3JKLEdBRWRtRixFQUFRa0UsRUFBSXJKLElBQ3JCcUosRUFBSXJKLEdBQUc3aUIsS0FBSytvQixHQUVabUQsRUFBSXJKLEdBQUssQ0FBQ3FKLEVBQUlySixHQUFJa0csR0FKbEJtRCxFQUFJckosR0FBS2tHLEVBUWIsT0FBT21ELEdBR1QsSUFBSWxFLEVBQVU1bUIsTUFBTTRtQixTQUFXLFNBQVVxMkYsR0FDdkMsTUFBOEMsbUJBQXZDampILE9BQU9rQixVQUFVNFosU0FBU3JiLEtBQUt3akgsSyw2QkMzRHhDLElBQUlDLEVBQXFCLFNBQVN2MUYsR0FDaEMsY0FBZUEsR0FDYixJQUFLLFNBQ0gsT0FBT0EsRUFFVCxJQUFLLFVBQ0gsT0FBT0EsRUFBSSxPQUFTLFFBRXRCLElBQUssU0FDSCxPQUFPa1AsU0FBU2xQLEdBQUtBLEVBQUksR0FFM0IsUUFDRSxNQUFPLEtBSWJ0dUIsRUFBT0QsUUFBVSxTQUFTMHhCLEVBQUsreEYsRUFBSzdxQyxFQUFJbjRFLEdBT3RDLE9BTkFnakgsRUFBTUEsR0FBTyxJQUNiN3FDLEVBQUtBLEdBQU0sSUFDQyxPQUFSbG5ELElBQ0ZBLE9BQU1wdEIsR0FHVyxpQkFBUm90QixFQUNGN2MsRUFBSWt2RyxFQUFXcnlGLElBQU0sU0FBU3JKLEdBQ25DLElBQUkyN0YsRUFBS3o2RixtQkFBbUJ1NkYsRUFBbUJ6N0YsSUFBTXV3RCxFQUNyRCxPQUFJcHJELEVBQVFrRSxFQUFJckosSUFDUHhULEVBQUk2YyxFQUFJckosSUFBSSxTQUFTa0csR0FDMUIsT0FBT3kxRixFQUFLejZGLG1CQUFtQnU2RixFQUFtQnYxRixPQUNqRDNLLEtBQUs2L0YsR0FFRE8sRUFBS3o2RixtQkFBbUJ1NkYsRUFBbUJweUYsRUFBSXJKLFFBRXZEekUsS0FBSzYvRixHQUlMaGpILEVBQ0U4b0IsbUJBQW1CdTZGLEVBQW1CcmpILElBQVNtNEUsRUFDL0NydkQsbUJBQW1CdTZGLEVBQW1CcHlGLElBRjNCLElBS3BCLElBQUlsRSxFQUFVNW1CLE1BQU00bUIsU0FBVyxTQUFVcTJGLEdBQ3ZDLE1BQThDLG1CQUF2Q2pqSCxPQUFPa0IsVUFBVTRaLFNBQVNyYixLQUFLd2pILElBR3hDLFNBQVNodkcsRUFBS2d2RyxFQUFJSSxHQUNoQixHQUFJSixFQUFHaHZHLElBQUssT0FBT2d2RyxFQUFHaHZHLElBQUlvdkcsR0FFMUIsSUFEQSxJQUFJcDFGLEVBQU0sR0FDRDN1QixFQUFJLEVBQUdBLEVBQUkyakgsRUFBR3ArRyxPQUFRdkYsSUFDN0IydUIsRUFBSXJwQixLQUFLeStHLEVBQUVKLEVBQUczakgsR0FBSUEsSUFFcEIsT0FBTzJ1QixFQUdULElBQUlrMUYsRUFBYW5qSCxPQUFPaUksTUFBUSxTQUFVNm9CLEdBQ3hDLElBQUk3QyxFQUFNLEdBQ1YsSUFBSyxJQUFJcHRCLEtBQU9pd0IsRUFDVjl3QixPQUFPa0IsVUFBVUMsZUFBZTFCLEtBQUtxeEIsRUFBS2p3QixJQUFNb3RCLEVBQUlycEIsS0FBSy9ELEdBRS9ELE9BQU9vdEIsSSw2QkNqRlQsSUFBSW01RSxFQUFVLEVBQVEsSUFHbEJsNkUsRUFBa0JrNkUsRUFBUWw2RSxnQkFFMUJpQixFQUFjaTVFLEVBQVFqNUUsWUFFdEJ5d0YsRUFBWSxDQUVoQixpQkFBNkIsQ0FFM0IsSUFBTSxFQUNOLFNBQVcsRUFDWCxhQUFlLEVBQ2YsT0FBUyxFQUVULGlCQUFtQixFQUNuQixNQUFRLEVBQ1IsTUFBUSxFQUVSLFNBQVcsRUFDWCxNQUFRLEVBQ1IsU0FBVyxJQU1URSxFQUFhRixFQUFVRSxXQUFhLEdBZ0N4QyxTQUFTd0UsRUFBa0I3MkYsRUFBVXBNLEVBQVM4TSxFQUFLeVEsRUFBVWxSLEdBQzNELElBQUlZLEVBQWFqTixFQUFRaU4sV0FDckJFLEVBQVduTixFQUFRbU4sU0FDdkJuTixFQUFRaU4sWUFBYSxFQUNyQmpOLEVBQVFtTixVQUFXLEVBQ25CLElBQUlTLEVBQU16ckIsS0FBS2s5RyxlQUFlanpGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FPekQsT0FOQTlNLEVBQVFpTixXQUFhQSxFQUNyQmpOLEVBQVFtTixTQUFXQSxHQUVkUyxFQUFJc2hCLE9BQVMzUixhQUFvQjk3QixVQUNwQzg3QixFQUFTM1AsR0FFSkEsRUFBSXNoQixNQWdKYixTQUFTZzBFLEVBQXNCdmlILEVBQVFILEdBR3JDLEdBQUdiLE9BQU9tQixlQUFlMUIsS0FBS3VCLEVBQVFILEdBQU0sT0FBT0csRUFBT0gsR0FFMUQsR0FBS0EsS0FBT0csRUFDWixLQUFRQSxFQUFTaEIsT0FBTzJHLGVBQWUzRixJQUNyQyxHQUFHaEIsT0FBTzZ5RSxxQkFBcUJwekUsS0FBS3VCLEVBQVFILEdBQU0sT0FBT0csRUFBT0gsR0FpRXBFLFNBQVMyaUgsRUFBd0IvMkYsRUFBVUMsRUFBUXJNLEVBQVM4TSxFQUFLbHNCLEVBQVU2Z0IsR0FDekUsR0FBSXRmLEtBQUtzRyxNQUFNOUgsT0FBT3lyQixNQUNsQkMsRUFBT3laLGlCQUE4Q3ppQyxJQUFoQ2dwQixFQUFPeVosV0FBV2xsQyxJQUczQyxJQUFvQyxJQUFoQ3lyQixFQUFPeTdFLHFCQUNUcm1GLEVBQU9nTSxTQUFTLENBQ2RqdUIsS0FBTSx1QkFDTjhzQixTQUFVMXJCLEVBQ1ZnRyxRQUFTLGtEQUFvRHdHLEtBQUtNLFVBQVU5TSxTQUV6RSxDQUNMLElBQUlrbkcsRUFBdUJ6N0UsRUFBT3k3RSxzQkFBd0IsR0FFaEIsbUJBQS9COW5GLEVBQVFvakcscUJBQ2pCcGpHLEVBQVFvakcsb0JBQW9CaDNGLEVBQVV4ckIsRUFBVWtuRyxFQUFzQjluRixFQUFTOE0sR0FHakYsSUFBSWMsRUFBTXpyQixLQUFLazlHLGVBQWVqekYsRUFBU3hyQixHQUFXa25HLEVBQXNCOW5GLEVBQVM4TSxFQUFJcUIsVUFBVTI1RSxFQUFzQmxuRyxJQUNsSGd0QixFQUFJeEIsV0FBYTNLLEVBQU8ySyxTQUFTeHJCLEtBQVc2Z0IsRUFBTzJLLFNBQVN4ckIsR0FBWWd0QixFQUFJeEIsVUFDL0UzSyxFQUFPa00sYUFBYUMsSUE5UXhCNndGLEVBQVcxNkcsS0FBTyxTQUF1QnFvQixFQUFVQyxFQUFRck0sRUFBUzhNLEdBRWxFLFFBQWlCenBCLElBQWIrb0IsRUFDRixPQUFPLEtBRVQsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3hEcmtCLEVBQVE5QyxNQUFNNG1CLFFBQVFGLEVBQU90b0IsTUFBUXNvQixFQUFPdG9CLEtBQU8sQ0FBQ3NvQixFQUFPdG9CLE1BQy9ELElBQUswRSxFQUFNZzBDLEtBQUt0NkMsS0FBS2krRyxTQUFTMy9HLEtBQUswQixLQUFNaXFCLEVBQVVDLEVBQVFyTSxFQUFTOE0sSUFBTyxDQUN6RSxJQUFJM2xCLEVBQU9zQixFQUFNbUwsS0FBSSxTQUFVMFosR0FDN0IsR0FBSUEsRUFBSixDQUNBLElBQUlyakIsRUFBS3FqQixFQUFFWCxLQUFPVyxFQUFFcmpCLEdBQ3BCLE9BQU9BLEVBQU0sSUFBTUEsRUFBSyxJQUFRcWpCLEVBQUUsT0FFcEM3TCxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sT0FDTjhzQixTQUFVbmxCLEVBQ1ZQLFFBQVMsdUJBQXlCTyxJQUd0QyxPQUFPc2EsR0EwQlRnOUYsRUFBV3JXLE1BQVEsU0FBd0JoOEUsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUVwRSxRQUFpQnpwQixJQUFiK29CLEVBQ0YsT0FBTyxLQUVULElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUN4RHUyRixFQUFRLElBQUl4MkYsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDM0QsSUFBS25uQixNQUFNNG1CLFFBQVFGLEVBQU8rN0UsT0FDeEIsTUFBTSxJQUFJdDZFLEVBQVksMEJBRXhCLElBQUt6QixFQUFPKzdFLE1BQU0zckQsS0FDaEJ3bUUsRUFBa0J4aUgsS0FDaEIwQixLQUFNaXFCLEVBQVVwTSxFQUFTOE0sR0FBSyxTQUFTYyxHQUFLeTFGLEVBQU0xMUYsYUFBYUMsT0FDN0QsQ0FDSixJQUFJem1CLEVBQU9rbEIsRUFBTys3RSxNQUFNeDBGLEtBQUksU0FBVTBaLEVBQUdydUIsR0FDdkMsSUFBSWdMLEVBQUtxakIsRUFBRVgsS0FBT1csRUFBRXJqQixHQUNwQixPQUFHQSxFQUFXLElBQU1BLEVBQUssSUFDbEJxakIsRUFBRXBTLE9BQVM5TixLQUFLTSxVQUFVNGYsRUFBRXBTLFFBQVlvUyxFQUFRLE1BQU0sSUFBTUEsRUFBUSxLQUFJLEtBQVMsY0FBY3J1QixFQUFFLE9BRXRHK2dCLEVBQVFzakcsY0FDVjdoRyxFQUFPa00sYUFBYTAxRixHQUV0QjVoRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sUUFDTjhzQixTQUFVbmxCLEVBQ1ZQLFFBQVMsaUJBQW1CTyxFQUFLd2IsS0FBSyxPQUcxQyxPQUFPbEIsR0FXVGc5RixFQUFXdFcsTUFBUSxTQUF3Qi83RSxFQUFVQyxFQUFRck0sRUFBUzhNLEdBRXBFLFFBQWlCenBCLElBQWIrb0IsRUFDRixPQUFPLEtBRVQsSUFBS3ptQixNQUFNNG1CLFFBQVFGLEVBQU84N0UsT0FDeEIsTUFBTSxJQUFJcjZFLEVBQVksMEJBRXhCLElBQUlyTSxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUN4RG9RLEVBQU8vNkIsS0FjWCxPQWJBa3FCLEVBQU84N0UsTUFBTW42RixTQUFRLFNBQVNzZixFQUFHcnVCLEdBQy9CLElBQUlpd0MsRUFBUWhTLEVBQUttaUYsZUFBZWp6RixFQUFVa0IsRUFBR3ROLEVBQVM4TSxHQUN0RCxJQUFJb2lCLEVBQU1BLE1BQU0sQ0FDZCxJQUNJbmhCLEVBREtULEVBQUVYLEtBQU9XLEVBQUVyakIsSUFDSHFqQixFQUFFcFMsT0FBUzlOLEtBQUtNLFVBQVU0ZixFQUFFcFMsUUFBWW9TLEVBQVEsTUFBTSxJQUFNQSxFQUFRLEtBQUksS0FBUyxjQUFjcnVCLEVBQUUsSUFDbEh3aUIsRUFBT2dNLFNBQVMsQ0FDZGp1QixLQUFNLFFBQ044c0IsU0FBVSxDQUFFcmlCLEdBQUk4akIsRUFBS3ZwQixPQUFRMHFDLEVBQU1saUIsT0FBT3hvQixPQUFRMHFDLE1BQU9BLEdBQ3pEdG9DLFFBQVMsK0JBQWlDbW5CLEVBQU0sU0FBV21oQixFQUFNbGlCLE9BQU94b0IsT0FBUyxlQUVuRmlkLEVBQU9rTSxhQUFhdWhCLE9BR2pCenRCLEdBV1RnOUYsRUFBV3BXLE1BQVEsU0FBd0JqOEUsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUVwRSxRQUFpQnpwQixJQUFiK29CLEVBQ0YsT0FBTyxLQUVULElBQUt6bUIsTUFBTTRtQixRQUFRRixFQUFPZzhFLE9BQ3hCLE1BQU0sSUFBSXY2RSxFQUFZLDBCQUV4QixJQUFJck0sRUFBUyxJQUFJb0wsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDeER1MkYsRUFBUSxJQUFJeDJGLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3ZEam9CLEVBQVF3bkIsRUFBT2c4RSxNQUFNdjFGLE9BQ3ZCbXdHLEVBQWtCeGlILEtBQ2hCMEIsS0FBTWlxQixFQUFVcE0sRUFBUzhNLEdBQUssU0FBU2MsR0FBTXkxRixFQUFNMTFGLGFBQWFDLE9BQzlEcHBCLE9BQ0YyQyxFQUFPa2xCLEVBQU9nOEUsTUFBTXowRixLQUFJLFNBQVUwWixFQUFHcnVCLEdBRXZDLE9BRFNxdUIsRUFBRVgsS0FBT1csRUFBRXJqQixJQUNOcWpCLEVBQUVwUyxPQUFTOU4sS0FBS00sVUFBVTRmLEVBQUVwUyxRQUFZb1MsRUFBUSxNQUFNLElBQU1BLEVBQVEsS0FBSSxLQUFTLGNBQWNydUIsRUFBRSxPQVlqSCxPQVZZLElBQVI0RixJQUNFbWIsRUFBUXNqRyxjQUNWN2hHLEVBQU9rTSxhQUFhMDFGLEdBRXRCNWhHLEVBQU9nTSxTQUFTLENBQ2RqdUIsS0FBTSxRQUNOOHNCLFNBQVVubEIsRUFDVlAsUUFBUywyQkFBNkJPLEVBQUt3YixLQUFLLFFBRzdDbEIsR0FXVGc5RixFQUFXOEUsR0FBSyxTQUFxQm4zRixFQUFVQyxFQUFRck0sRUFBUzhNLEdBRTlELFFBQWlCenBCLElBQWIrb0IsRUFBd0IsT0FBTyxLQUNuQyxJQUFLMjZFLEVBQVExMkUsU0FBU2hFLEVBQU9rM0YsSUFBSyxNQUFNLElBQUk1K0csTUFBTSx3Q0FDbEQsSUFFSWlwQixFQUZBNDFGLEVBQVVQLEVBQWtCN2pILEtBQUsrQyxLQUFNaXFCLEVBQVVwTSxFQUFTOE0sRUFBSyxLQUFNVCxFQUFPazNGLElBQzVFOWhHLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBRTVELEdBQUcwMkYsRUFBUSxDQUNULFFBQW9CbmdILElBQWhCZ3BCLEVBQU92VCxLQUFvQixPQUMvQixJQUFLaXVGLEVBQVExMkUsU0FBU2hFLEVBQU92VCxNQUFPLE1BQU0sSUFBSW5VLE1BQU0sMENBQ3BEaXBCLEVBQU16ckIsS0FBS2s5RyxlQUFlanpGLEVBQVVDLEVBQU92VCxLQUFNa0gsRUFBUzhNLEVBQUlxQixVQUFVOUIsRUFBT3ZULE9BQy9FMkksRUFBT2tNLGFBQWFDLE9BQ2pCLENBQ0gsUUFBb0J2cUIsSUFBaEJncEIsRUFBT28zRixLQUFvQixPQUMvQixJQUFLMWMsRUFBUTEyRSxTQUFTaEUsRUFBT28zRixNQUFPLE1BQU0sSUFBSTkrRyxNQUFNLDBDQUNwRGlwQixFQUFNenJCLEtBQUtrOUcsZUFBZWp6RixFQUFVQyxFQUFPbzNGLEtBQU16akcsRUFBUzhNLEVBQUlxQixVQUFVOUIsRUFBT28zRixPQUMvRWhpRyxFQUFPa00sYUFBYUMsR0FFdEIsT0FBT25NLEdBc0JUZzlGLEVBQVdpRixjQUFnQixTQUFnQ3QzRixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3BGLEdBQUkzcUIsS0FBS3NHLE1BQU05SCxPQUFPeXJCLEdBQXRCLENBQ0EsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3hEOHlGLE9BQW1DdjhHLElBQXZCZ3BCLEVBQU9xM0YsY0FBNEJyM0YsRUFBT3EzRixjQUFnQixHQUMxRSxJQUFJM2MsRUFBUTEyRSxTQUFTdXZGLEdBQVksTUFBTSxJQUFJOXhGLEVBQVksK0RBRXZELElBQUssSUFBSWx0QixLQUFZd3JCLEVBQ25CLFFBQWlEL29CLElBQTlDNi9HLEVBQXNCOTJGLEVBQVV4ckIsR0FBd0IsQ0FDekQsSUFBSWd0QixFQUFNenJCLEtBQUtrOUcsZUFBZXorRyxFQUFVZy9HLEVBQVc1L0YsRUFBUzhNLEVBQUlxQixVQUFVeXhGLElBQzFFbitGLEVBQU9rTSxhQUFhQyxHQUl4QixPQUFPbk0sSUFXVGc5RixFQUFXMzRFLFdBQWEsU0FBNkIxWixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQzlFLEdBQUkzcUIsS0FBS3NHLE1BQU05SCxPQUFPeXJCLEdBQXRCLENBQ0EsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3hEZ1osRUFBYXpaLEVBQU95WixZQUFjLEdBQ3RDLElBQUssSUFBSWxsQyxLQUFZa2xDLEVBQVksQ0FDL0IsSUFBSTg1RSxFQUFZOTVFLEVBQVdsbEMsR0FDM0IsUUFBZXlDLElBQVp1OEcsRUFBSCxDQUVNLEdBQWUsT0FBWkEsRUFDUCxNQUFNLElBQUk5eEYsRUFBWSxvREFFa0IsbUJBQS9COU4sRUFBUW9qRyxxQkFDakJwakcsRUFBUW9qRyxvQkFBb0JoM0YsRUFBVXhyQixFQUFVZy9HLEVBQVc1L0YsRUFBUzhNLEdBRXRFLElBQUlpUCxFQUFPbW5GLEVBQXNCOTJGLEVBQVV4ckIsR0FDdkNndEIsRUFBTXpyQixLQUFLazlHLGVBQWV0akYsRUFBTTZqRixFQUFXNS9GLEVBQVM4TSxFQUFJcUIsVUFBVXl4RixFQUFXaC9HLElBQzlFZ3RCLEVBQUl4QixXQUFhM0ssRUFBTzJLLFNBQVN4ckIsS0FBVzZnQixFQUFPMkssU0FBU3hyQixHQUFZZ3RCLEVBQUl4QixVQUMvRTNLLEVBQU9rTSxhQUFhQyxJQUV0QixPQUFPbk0sSUEwQ1RnOUYsRUFBV3pXLGtCQUFvQixTQUFvQzU3RSxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQzVGLEdBQUkzcUIsS0FBS3NHLE1BQU05SCxPQUFPeXJCLEdBQXRCLENBQ0EsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3hEazdFLEVBQW9CMzdFLEVBQU8yN0UsbUJBQXFCLEdBRXBELElBQUssSUFBSXBuRyxLQUFZd3JCLEVBQVUsQ0FDN0IsSUFBSWpqQixHQUFPLEVBQ1gsSUFBSyxJQUFJd2xCLEtBQVdxNUUsRUFBbUIsQ0FDckMsSUFBSTRYLEVBQVk1WCxFQUFrQnI1RSxHQUNsQyxRQUFldHJCLElBQVp1OEcsRUFBSCxDQUVNLEdBQWUsT0FBWkEsRUFDUCxNQUFNLElBQUk5eEYsRUFBWSwyREFFeEIsSUFDRSxJQUFJVyxFQUFTLElBQUlELE9BQU9HLEVBQVMsS0FDakMsTUFBTWcxRixHQUdObDFGLEVBQVMsSUFBSUQsT0FBT0csR0FFdEIsR0FBS0YsRUFBT3RsQixLQUFLdkksR0FBakIsQ0FHQXVJLEdBQU8sRUFFbUMsbUJBQS9CNlcsRUFBUW9qRyxxQkFDakJwakcsRUFBUW9qRyxvQkFBb0JoM0YsRUFBVXhyQixFQUFVZy9HLEVBQVc1L0YsRUFBUzhNLEdBR3RFLElBQUljLEVBQU16ckIsS0FBS2s5RyxlQUFlanpGLEVBQVN4ckIsR0FBV2cvRyxFQUFXNS9GLEVBQVM4TSxFQUFJcUIsVUFBVXl4RixFQUFXaC9HLElBQzVGZ3RCLEVBQUl4QixXQUFhM0ssRUFBTzJLLFNBQVN4ckIsS0FBVzZnQixFQUFPMkssU0FBU3hyQixHQUFZZ3RCLEVBQUl4QixVQUMvRTNLLEVBQU9rTSxhQUFhQyxLQUVsQnprQixHQUNGZzZHLEVBQXVCL2pILEtBQUsrQyxLQUFNaXFCLEVBQVVDLEVBQVFyTSxFQUFTOE0sRUFBS2xzQixFQUFVNmdCLEdBSWhGLE9BQU9BLElBV1RnOUYsRUFBVzNXLHFCQUF1QixTQUF1QzE3RSxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ2xHLEdBQUkzcUIsS0FBS3NHLE1BQU05SCxPQUFPeXJCLEdBQXRCLENBRUEsR0FBSUMsRUFBTzI3RSxrQkFDVCxPQUFPLEtBRVQsSUFBSXZtRixFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUM1RCxJQUFLLElBQUlsc0IsS0FBWXdyQixFQUNuQisyRixFQUF1Qi9qSCxLQUFLK0MsS0FBTWlxQixFQUFVQyxFQUFRck0sRUFBUzhNLEVBQUtsc0IsRUFBVTZnQixHQUU5RSxPQUFPQSxJQVNUZzlGLEVBQVdtRixjQUFnQixTQUFnQ3gzRixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3BGLEdBQUszcUIsS0FBS3NHLE1BQU05SCxPQUFPeXJCLEdBQXZCLENBQ0EsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBUzVELE9BUldudEIsT0FBT2lJLEtBQUt3a0IsR0FDWjVuQixRQUFVNm5CLEVBQU91M0YsZUFDMUJuaUcsRUFBT2dNLFNBQVMsQ0FDZGp1QixLQUFNLGdCQUNOOHNCLFNBQVVELEVBQU91M0YsY0FDakJoOUcsUUFBUyw0Q0FBOEN5bEIsRUFBT3UzRixnQkFHM0RuaUcsSUFTVGc5RixFQUFXb0YsY0FBZ0IsU0FBZ0N6M0YsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUNwRixHQUFLM3FCLEtBQUtzRyxNQUFNOUgsT0FBT3lyQixHQUF2QixDQUNBLElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQVM1RCxPQVJXbnRCLE9BQU9pSSxLQUFLd2tCLEdBQ1o1bkIsUUFBVTZuQixFQUFPdzNGLGVBQzFCcGlHLEVBQU9nTSxTQUFTLENBQ2RqdUIsS0FBTSxnQkFDTjhzQixTQUFVRCxFQUFPdzNGLGNBQ2pCajlHLFFBQVMsNENBQThDeWxCLEVBQU93M0YsZ0JBRzNEcGlHLElBV1RnOUYsRUFBVy9XLE1BQVEsU0FBd0J0N0UsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUNwRSxJQUFJb1EsRUFBTy82QixLQUNYLEdBQUtBLEtBQUtzRyxNQUFNYyxNQUFNNmlCLFNBQ0gvb0IsSUFBZmdwQixFQUFPcTdFLE1BQVgsQ0FDQSxJQUFJam1GLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBc0I1RCxPQXJCQVYsRUFBU3FELE9BQU0sU0FBVXZ2QixFQUFPakIsR0FDOUIsR0FBRzBHLE1BQU00bUIsUUFBUUYsRUFBT3E3RSxPQUN0QixJQUFJQSxPQUEyQnJrRyxJQUFsQmdwQixFQUFPcTdFLE1BQU16b0csR0FBaUJvdEIsRUFBT3U3RSxnQkFBa0J2N0UsRUFBT3E3RSxNQUFNem9HLFFBRTdFeW9HLEVBQVFyN0UsRUFBT3E3RSxNQUVyQixRQUFjcmtHLElBQVZxa0csRUFDRixPQUFPLEVBRVQsSUFBYyxJQUFWQSxFQUtGLE9BSkFqbUYsRUFBT2dNLFNBQVMsQ0FDZGp1QixLQUFNLFFBQ05vSCxRQUFTLG1DQUVKLEVBRVQsSUFBSWduQixFQUFNc1AsRUFBS21pRixlQUFlbi9HLEVBQU93bkcsRUFBTzFuRixFQUFTOE0sRUFBSXFCLFVBQVV1NUUsRUFBT3pvRyxJQUcxRSxPQUZHMnVCLEVBQUl4QixXQUFhM0ssRUFBTzJLLFNBQVNudEIsS0FBSXdpQixFQUFPMkssU0FBU250QixHQUFLMnVCLEVBQUl4QixVQUNqRTNLLEVBQU9rTSxhQUFhQyxJQUNiLEtBRUZuTSxJQVdUZzlGLEVBQVd2d0csU0FBVyxTQUEyQmtlLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDMUUsSUFBSW9RLEVBQU8vNkIsS0FDWCxHQUFLQSxLQUFLc0csTUFBTWMsTUFBTTZpQixTQUNBL29CLElBQWxCZ3BCLEVBQU9uZSxTQUFYLENBQ0EsSUFBSzY0RixFQUFRMTJFLFNBQVNoRSxFQUFPbmUsVUFBVyxNQUFNLElBQUl2SixNQUFNLDhDQUN4RCxJQUFJOGMsRUFBUyxJQUFJb0wsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FZNUQsT0FQVyxJQUpDVixFQUFTcXdCLE1BQUssU0FBVXY4QyxFQUFPakIsR0FFekMsT0FBMkIsSUFEakJpK0IsRUFBS21pRixlQUFlbi9HLEVBQU9tc0IsRUFBT25lLFNBQVU4UixFQUFTOE0sRUFBSXFCLFVBQVU5QixFQUFPbmUsU0FBVWpQLElBQ25GK3RCLE9BQU94b0IsV0FHbEJpZCxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sV0FDTjhzQixTQUFVRCxFQUFPbmUsU0FDakJ0SCxRQUFTLCtDQUdONmEsSUFTVGc5RixFQUFXcUYsUUFBVSxTQUEwQjEzRixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3hFLEdBQUszcUIsS0FBS3NHLE1BQU15bkIsT0FBTzlELEdBQXZCLENBQ0EsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBa0I1RCxPQWpCSVQsRUFBTzAzRixtQkFBZ0QsSUFBNUIxM0YsRUFBTzAzRixpQkFDL0IzM0YsRUFBV0MsRUFBT3kzRixTQUNyQnJpRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sVUFDTjhzQixTQUFVRCxFQUFPeTNGLFFBQ2pCbDlHLFFBQVMsd0JBQTBCeWxCLEVBQU95M0YsVUFJekMxM0YsR0FBWUMsRUFBT3kzRixTQUN0QnJpRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sVUFDTjhzQixTQUFVRCxFQUFPeTNGLFFBQ2pCbDlHLFFBQVMsb0NBQXNDeWxCLEVBQU95M0YsVUFJckRyaUcsSUFTVGc5RixFQUFXdUYsUUFBVSxTQUEwQjUzRixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3hFLEdBQUszcUIsS0FBS3NHLE1BQU15bkIsT0FBTzlELEdBQXZCLENBQ0EsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBa0I1RCxPQWpCSVQsRUFBTzQzRixtQkFBZ0QsSUFBNUI1M0YsRUFBTzQzRixpQkFDL0I3M0YsRUFBV0MsRUFBTzIzRixTQUNyQnZpRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sVUFDTjhzQixTQUFVRCxFQUFPMjNGLFFBQ2pCcDlHLFFBQVMscUJBQXVCeWxCLEVBQU8yM0YsVUFJdEM1M0YsR0FBWUMsRUFBTzIzRixTQUN0QnZpRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sVUFDTjhzQixTQUFVRCxFQUFPMjNGLFFBQ2pCcDlHLFFBQVMsaUNBQW1DeWxCLEVBQU8yM0YsVUFJbER2aUcsSUFTVGc5RixFQUFXc0YsaUJBQW1CLFNBQW1DMzNGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FFMUYsR0FBc0Msa0JBQTVCVCxFQUFPMDNGLGtCQUNaNWhILEtBQUtzRyxNQUFNeW5CLE9BQU85RCxHQUF2QixDQUNBLElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQVM1RCxPQVJZVixFQUFXQyxFQUFPMDNGLGtCQUU1QnRpRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sbUJBQ044c0IsU0FBVUQsRUFBTzAzRixpQkFDakJuOUcsUUFBUyxpQ0FBbUN5bEIsRUFBTzAzRixtQkFHaER0aUcsSUFTVGc5RixFQUFXd0YsaUJBQW1CLFNBQW1DNzNGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FFMUYsR0FBc0Msa0JBQTVCVCxFQUFPNDNGLGtCQUNaOWhILEtBQUtzRyxNQUFNeW5CLE9BQU85RCxHQUF2QixDQUNBLElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQVM1RCxPQVJZVixFQUFXQyxFQUFPNDNGLGtCQUU1QnhpRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sbUJBQ044c0IsU0FBVUQsRUFBTzQzRixpQkFDakJyOUcsUUFBUyw4QkFBZ0N5bEIsRUFBTzQzRixtQkFHN0N4aUcsSUFXVCxJQUFJeWlHLEVBQWlDLFNBQXlDOTNGLEVBQVVDLEVBQVFyTSxFQUFTOE0sRUFBS3EzRixFQUFnQkMsR0FDNUgsR0FBS2ppSCxLQUFLc0csTUFBTXluQixPQUFPOUQsR0FBdkIsQ0FFQSxJQUFJaTRGLEVBQXFCaDRGLEVBQU84M0YsR0FDaEMsR0FBMEIsR0FBdEJFLEVBQ0YsTUFBTSxJQUFJdjJGLEVBQVlxMkYsRUFBaUIsbUJBR3pDLElBQUkxaUcsRUFBUyxJQUFJb0wsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FFeER3M0YsRUFBbUJ2ZCxFQUFROTJFLGlCQUFpQjdELEdBQzVDbTRGLEVBQWtCeGQsRUFBUTkyRSxpQkFBaUJvMEYsR0FFM0NHLEVBQWNsNkcsS0FBS0MsSUFBSSs1RyxFQUFtQkMsR0FDMUM5dUIsRUFBYW5yRixLQUFLbTZHLElBQUksR0FBSUQsR0FVOUIsT0FSSWw2RyxLQUFLa1YsTUFBTTRNLEVBQVdxcEUsR0FBY25yRixLQUFLa1YsTUFBTTZrRyxFQUFxQjV1QixJQUFnQixHQUN0RmgwRSxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0ya0gsRUFDTjczRixTQUFXKzNGLEVBQ1h6OUcsUUFBU3c5RyxFQUFlaDNHLEtBQUtNLFVBQVUyMkcsS0FJcEM1aUcsSUF5TVQsU0FBU2lqRyxFQUFZcDNGLEVBQUdydUIsRUFBR29vQixHQUN6QixJQUFJL1UsRUFBR3hMLEVBQU11Z0IsRUFBRTdpQixPQUNmLElBQUs4TixFQUFJclQsRUFBSSxFQUFRcVQsRUFBSXhMLEVBQUt3TCxJQUM1QixHQUFJeTBGLEVBQVF2M0Usa0JBQWtCbEMsRUFBR2pHLEVBQUUvVSxJQUNqQyxPQUFPLEVBR1gsT0FBTyxFQXZNVG1zRyxFQUFXa0csV0FBYSxTQUE2QnY0RixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQzlFLE9BQU9vM0YsRUFBK0I5a0gsS0FBSytDLEtBQU1pcUIsRUFBVUMsRUFBUXJNLEVBQVM4TSxFQUFLLGFBQWMseUNBU2pHMnhGLEVBQVdtRyxZQUFjLFNBQThCeDRGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDaEYsT0FBT28zRixFQUErQjlrSCxLQUFLK0MsS0FBTWlxQixFQUFVQyxFQUFRck0sRUFBUzhNLEVBQUssY0FBZSx1Q0FTbEcyeEYsRUFBV1csU0FBVyxTQUEyQmh6RixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQzFFLElBQUlyTCxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQWtCNUQsWUFqQmlCenBCLElBQWIrb0IsSUFBOEMsSUFBcEJDLEVBQU8reUYsU0FFbkMzOUYsRUFBT2dNLFNBQVMsQ0FDZGp1QixLQUFNLFdBQ05vSCxRQUFTLGdCQUVGekUsS0FBS3NHLE1BQU05SCxPQUFPeXJCLElBQWF6bUIsTUFBTTRtQixRQUFRRixFQUFPK3lGLFdBQzdEL3lGLEVBQU8reUYsU0FBU3B4RyxTQUFRLFNBQVN0TixRQUNTMkMsSUFBckM2L0csRUFBc0I5MkYsRUFBVTFyQixJQUNqQytnQixFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sV0FDTjhzQixTQUFVNXJCLEVBQ1ZrRyxRQUFTLHFCQUF1QndHLEtBQUtNLFVBQVVoTixRQUtoRCtnQixHQVNUZzlGLEVBQVc5dkYsUUFBVSxTQUEwQnZDLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDeEUsR0FBSzNxQixLQUFLc0csTUFBTXMvQixPQUFPM2IsR0FBdkIsQ0FDQSxJQUFJM0ssRUFBUyxJQUFJb0wsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDeEQ2QixFQUFVdEMsRUFBT3NDLFFBQ3JCLElBQ0UsSUFBSUYsRUFBUyxJQUFJRCxPQUFPRyxFQUFTLEtBQ2pDLE1BQU1nMUYsR0FHTmwxRixFQUFTLElBQUlELE9BQU9HLEdBU3RCLE9BUEt2QyxFQUFTelksTUFBTThhLElBQ2xCaE4sRUFBT2dNLFNBQVMsQ0FDZGp1QixLQUFNLFVBQ044c0IsU0FBVUQsRUFBT3NDLFFBQ2pCL25CLFFBQVMsMEJBQTRCd0csS0FBS00sVUFBVTJlLEVBQU9zQyxRQUFRbFUsY0FHaEVnSCxJQXdCVGc5RixFQUFXM3ZGLE9BQVMsU0FBeUIxQyxFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3RFLFFBQWV6cEIsSUFBWCtvQixFQUFKLENBQ0EsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBUTVELE9BUEtyTCxFQUFPMkwsZUFBa0IyNUUsRUFBUWw0RSxTQUFTekMsRUFBVUMsRUFBT3lDLE9BQVEzc0IsT0FDdEVzZixFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sU0FDTjhzQixTQUFVRCxFQUFPeUMsT0FDakJsb0IsUUFBUywyQkFBNkJ3RyxLQUFLTSxVQUFVMmUsRUFBT3lDLFFBQVUsWUFHbkVyTixJQVNUZzlGLEVBQVdvRyxVQUFZLFNBQTRCejRGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDNUUsR0FBSzNxQixLQUFLc0csTUFBTXMvQixPQUFPM2IsR0FBdkIsQ0FDQSxJQUFJM0ssRUFBUyxJQUFJb0wsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDeERnNEYsRUFBTTE0RixFQUFTelksTUFBTSxvQkFTekIsT0FSYXlZLEVBQVM1bkIsUUFBVXNnSCxFQUFNQSxFQUFJdGdILE9BQVMsSUFDbkM2bkIsRUFBT3c0RixXQUNyQnBqRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sWUFDTjhzQixTQUFVRCxFQUFPdzRGLFVBQ2pCaitHLFFBQVMsbUNBQXFDeWxCLEVBQU93NEYsWUFHbERwakcsSUFTVGc5RixFQUFXdGhDLFVBQVksU0FBNEIvd0QsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUM1RSxHQUFLM3FCLEtBQUtzRyxNQUFNcy9CLE9BQU8zYixHQUF2QixDQUNBLElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUV4RGc0RixFQUFNMTRGLEVBQVN6WSxNQUFNLG9CQVN6QixPQVJheVksRUFBUzVuQixRQUFVc2dILEVBQU1BLEVBQUl0Z0gsT0FBUyxJQUNuQzZuQixFQUFPOHdELFdBQ3JCMTdELEVBQU9nTSxTQUFTLENBQ2RqdUIsS0FBTSxZQUNOOHNCLFNBQVVELEVBQU84d0QsVUFDakJ2MkUsUUFBUyxtQ0FBcUN5bEIsRUFBTzh3RCxZQUdsRDE3RCxJQVNUZzlGLEVBQVdzRyxTQUFXLFNBQTJCMzRGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDMUUsR0FBSzNxQixLQUFLc0csTUFBTWMsTUFBTTZpQixHQUF0QixDQUNBLElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQVE1RCxPQVBNVixFQUFTNW5CLFFBQVU2bkIsRUFBTzA0RixVQUM5QnRqRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sV0FDTjhzQixTQUFVRCxFQUFPMDRGLFNBQ2pCbitHLFFBQVMsbUNBQXFDeWxCLEVBQU8wNEYsV0FHbER0akcsSUFTVGc5RixFQUFXdUcsU0FBVyxTQUEyQjU0RixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQzFFLEdBQUszcUIsS0FBS3NHLE1BQU1jLE1BQU02aUIsR0FBdEIsQ0FDQSxJQUFJM0ssRUFBUyxJQUFJb0wsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FRNUQsT0FQTVYsRUFBUzVuQixRQUFVNm5CLEVBQU8yNEYsVUFDOUJ2akcsRUFBT2dNLFNBQVMsQ0FDZGp1QixLQUFNLFdBQ044c0IsU0FBVUQsRUFBTzI0RixTQUNqQnArRyxRQUFTLG1DQUFxQ3lsQixFQUFPMjRGLFdBR2xEdmpHLElBMEJUZzlGLEVBQVd3RyxZQUFjLFNBQThCNzRGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDaEYsSUFBeUIsSUFBckJULEVBQU80NEYsYUFDTjlpSCxLQUFLc0csTUFBTWMsTUFBTTZpQixHQUF0QixDQUNBLElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQU81RCxPQU5LVixFQUFTcUQsTUFBTWkxRixJQUNsQmpqRyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sY0FDTm9ILFFBQVMsNEJBR042YSxJQVdUZzlGLEVBQVd4VyxhQUFlLFNBQStCNzdFLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDbEYsR0FBSzNxQixLQUFLc0csTUFBTTlILE9BQU95ckIsR0FBdkIsQ0FDQSxJQUFJM0ssRUFBUyxJQUFJb0wsRUFBZ0JULEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDNUQsSUFBSyxJQUFJbHNCLEtBQVl5ckIsRUFBTzQ3RSxhQUMxQixRQUEyQjVrRyxJQUF2QitvQixFQUFTeHJCLEdBQWIsQ0FHQSxJQUFJc2tILEVBQU03NEYsRUFBTzQ3RSxhQUFhcm5HLEdBQzFCdWtILEVBQWVyNEYsRUFBSXFCLFVBQVUrMkYsRUFBS3RrSCxHQUl0QyxHQUhrQixpQkFBUHNrSCxJQUNUQSxFQUFNLENBQUNBLElBRUx2L0csTUFBTTRtQixRQUFRMjRGLEdBQ2hCQSxFQUFJbDNHLFNBQVEsU0FBVSt0QixRQUNHMTRCLElBQW5CK29CLEVBQVMyUCxJQUNYdGEsRUFBT2dNLFNBQVMsQ0FHZGp1QixLQUFNLGVBQ044c0IsU0FBVTY0RixFQUFhcDRGLGFBQ3ZCbm1CLFFBQVMsWUFBY20xQixFQUFPLDJCQUE2Qm9wRixFQUFhcDRGLHNCQUl6RSxDQUNMLElBQUlhLEVBQU16ckIsS0FBS2s5RyxlQUFlanpGLEVBQVU4NEYsRUFBS2xsRyxFQUFTbWxHLEdBQ25EMWpHLEVBQU8ySyxXQUFhd0IsRUFBSXhCLFdBQVUzSyxFQUFPMkssU0FBV3dCLEVBQUl4QixVQUN2RHdCLEdBQU9BLEVBQUlaLE9BQU94b0IsU0FDcEJpZCxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sZUFDTjhzQixTQUFVNjRGLEVBQWFwNEYsYUFDdkJubUIsUUFBUyx3Q0FBMEN1K0csRUFBYXA0RixlQUVsRXRMLEVBQU9rTSxhQUFhQyxLQUkxQixPQUFPbk0sSUFVVGc5RixFQUFpQixLQUFJLFNBQXVCcnlGLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDckUsUUFBaUJ6cEIsSUFBYitvQixFQUNGLE9BQU8sS0FFVCxJQUFLem1CLE1BQU00bUIsUUFBUUYsRUFBYSxNQUM5QixNQUFNLElBQUl5QixFQUFZLHdCQUF5QnpCLEdBRWpELElBQUk1SyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQVE1RCxPQVBLVCxFQUFhLEtBQUVvd0IsS0FBS3NxRCxFQUFRdjNFLGtCQUFrQi91QixLQUFLLEtBQU0yckIsS0FDNUQzSyxFQUFPZ00sU0FBUyxDQUNkanVCLEtBQU0sT0FDTjhzQixTQUFVRCxFQUFhLEtBQ3ZCemxCLFFBQVMsOEJBQWdDeWxCLEVBQWEsS0FBRXpZLElBQUloUCxRQUFRK2QsS0FBSyxPQUd0RWxCLEdBVVRnOUYsRUFBa0IsTUFBSSxTQUF1QnJ5RixFQUFVQyxFQUFRck0sRUFBUzhNLEdBQ3RFLFFBQWlCenBCLElBQWIrb0IsRUFDRixPQUFPLEtBRVQsSUFBSTNLLEVBQVMsSUFBSW9MLEVBQWdCVCxFQUFVQyxFQUFRck0sRUFBUzhNLEdBUTVELE9BUEtpNkUsRUFBUXYzRSxrQkFBa0JuRCxFQUFjLE1BQUdELElBQzlDM0ssRUFBT2dNLFNBQVMsQ0FDZGp1QixLQUFNLFFBQ044c0IsU0FBVUQsRUFBYyxNQUN4QnpsQixRQUFTLDZDQUErQ3lsQixFQUFjLFFBR25FNUssR0FXVGc5RixFQUFXblcsSUFBTW1XLEVBQVd2VyxTQUFXLFNBQXNCOTdFLEVBQVVDLEVBQVFyTSxFQUFTOE0sR0FDdEYsSUFBSW9RLEVBQU8vNkIsS0FDWCxRQUFja0IsSUFBWCtvQixFQUFzQixPQUFPLEtBQ2hDLElBQUkzSyxFQUFTLElBQUlvTCxFQUFnQlQsRUFBVUMsRUFBUXJNLEVBQVM4TSxHQUN4RHM0RixFQUFXLzRGLEVBQU9pOEUsS0FBT2o4RSxFQUFPNjdFLFNBQ3BDLE9BQUlrZCxHQUNBei9HLE1BQU00bUIsUUFBUTY0RixLQUFXQSxFQUFTLENBQUNBLElBQ3ZDQSxFQUFTcDNHLFNBQVEsU0FBVWpLLEdBQ3pCLEdBQUltNUIsRUFBS2tqRixTQUFTaDBGLEVBQVVDLEVBQVFyTSxFQUFTOE0sRUFBSy9vQixHQUFPLENBQ3ZELElBQ0lzaEgsRUFES3RoSCxJQUFTQSxFQUFLNG9CLEtBQU81b0IsRUFBS2tHLEtBQ2RsRyxFQUNyQjBkLEVBQU9nTSxTQUFTLENBQ2RqdUIsS0FBTSxNQUNOOHNCLFNBQVUrNEYsRUFDVnorRyxRQUFTLHlCQUEyQnkrRyxRQUluQzVqRyxHQWJjLE1BZ0J2QnppQixFQUFPRCxRQUFVdy9HLEcsK0ZDaDlCakIsYUFnQ29CLEVBQUEzMEcsUUE5QnBCMkcsZUFBd0JHLEdBRXRCLE1BQU1xSSxRQUFpQnk5QixNQUFNLHNDQUM3QjlyQyxTQUFTa1EsS0FBS3RQLGdCQUFrQnlOLEVBQVNTLE9BQ3hDOU8sU0FBU0MsZUFBZSxhQUFtQ3c0RixLQUFPLHFDQUNuRXo0RixTQUFTQyxlQUFlLGdCQUFnQnVPLFlBQWMsYUFDbEN4TyxTQUFTQyxlQUFlLGtCQUFtQjBrQixJQUFNLDJDQUNyRTFwQixNQUFNNEksS0FBSzdELFNBQVNtRCx1QkFBdUIsdUJBQXVCRyxRQUFTZ0IsSUFDckRBLEVBQUlxZ0IsSUFBTSwrQ0FHaEMza0IsU0FBU0MsZUFBZSxZQUFZd1EsVUFBWXpLLEVBQVMrbkcsU0FBU3Y5RixNQUNsRXhRLFNBQVN3USxNQUFReEssRUFBUytuRyxTQUFTdjlGLE1BR25DeFEsU0FBU0MsZUFBZSx1QkFBdUIzRSxpQkFBaUIsU0FBUyxXQUN2RTBLLEVBQVNxUixNQUFNQyxtQkFBbUIsRUFBQWhLLGdCQUFnQjBDLFNBQ2xEaEssRUFBU3FSLE1BQU1FLHFCQUlRdlgsU0FBU2lILGNBQTJCLDRCQUM1Q2pELGFBQWEsTUFBTyxvREFHckMsTUFBTTJsRyxFQUFZM3BHLFNBQVNpSCxjQUE4QixlQUN6RDBpRyxFQUFVM2xHLGFBQWEsTUFBTywyQ0FDOUIybEcsRUFBVTNsRyxhQUFhLE1BQU8sd0IsNEhDOUJoQyxjQUNBLE9BbUJBLFNBQWdCNDJHLElBQ2QsTUFBTUMsRUFBb0I3NkcsU0FBU0MsZUFBZSx3QkFDbEQsSUFBQThSLGFBQVksQ0FBRWhRLFVBQVc4NEcsRUFBa0IzcEcsVUFFM0MsTUFBTTRwRyxFQUFpQjk2RyxTQUFTQyxlQUFlLGtCQUFrQm9jLFdBQzNEdVIsRUFBYTV0QixTQUFTaUgsY0FBYyxjQUN0QzR6RyxFQUFrQjNwRyxRQUNwQjRwRyxFQUFjaDZHLE1BQU1DLFFBQVUsSUFHOUIrNUcsRUFBY2g2RyxNQUFNQyxRQUFVLE9BQzlCNnNCLEVBQVdsdEIsVUFBVVIsT0FBTyxhQUc5QixJQUFBeXRCLDRCQS9CRiwwQkFDRSxNQUFNa3RGLEVBQW9CNzZHLFNBQVNpSCxjQUFnQyx5QkFFN0QsVUFBRWxGLElBQWMsSUFBQXNSLGVBRXRCd25HLEVBQWtCM3BHLFFBQVVuUCxHQUU1QixJQUFBZzVHLGdCQUVBSCxJQUVBQyxFQUFrQnYvRyxpQkFBaUIsUUFBUyxLQUMxQ3MvRyxPQUtKLDJCLCtGQ3BCQSxjQUdBLE9BOE55QixFQUFBMTdHLFFBOUV6QixNQWFFLFlBQWFpSCxFQUFxQms4RixFQUNoQ2x3RixFQUFvQm1CLEdBQ3BCN2IsS0FBSzBPLEtBQU9BLEVBQ1oxTyxLQUFLdWpILFNBQVczWSxFQUNoQjVxRyxLQUFLMGEsV0FBYUEsRUFDbEIxYSxLQUFLNmIsWUFBY0EsRUFFRXRULFNBQVNDLGVBQWUsb0JBQ2hDVyxVQTlKakIsU0FBK0JxNkcsR0FDN0IsSUFBSXBpRyxFQUFXLHljQWlJZixZQXRIbUJsZ0IsSUFBZnNpSCxJQUNGcGlHLEdBQVksbW5DQXdCZEEsR0FBWSxtZ0lBNkZMQSxFQTRCb0JxaUcsQ0FBcUJ6akgsS0FBSzZiLGFBRW5EN2IsS0FBSzBqSCxlQUVMMWpILEtBQUswTyxLQUFLaTFHLGtCQUFrQjNqSCxLQUFLNGpILG9CQUFvQnRsSCxLQUFLMEIsT0FNNUQsc0JBQ01BLEtBQUs2YixhQUVQZ29HLEVBQWdCQyxnQkFBZ0I5akgsS0FBSzZiLGFBRXZDZ29HLEVBQWdCRSxvQkFBb0IvakgsS0FBS3VqSCxTQUFVdmpILEtBQUswYSxZQVMxRCxlQUNFLE1BQU0sS0FBRTdRLEVBQUksYUFBRUMsRUFBWSxhQUFFQyxFQUFZLGNBQUVFLElBQWtCLElBQUEyUixlQUd4RHJULFNBQVNpSCxjQUFnQyxpQkFDM0NqSCxTQUFTaUgsY0FBZ0MsZUFBZXpSLE1BQVEwRSxPQUFPb0gsR0FDdkV0QixTQUFTaUgsY0FBZ0MsZUFBZXpSLE1BQVEwRSxPQUFPb0gsSUFJekV0QixTQUFTaUgsY0FBZ0Msb0JBQW9CelIsTUFBUTBFLE9BQU9zSCxHQUM1RXhCLFNBQVNpSCxjQUFnQyxvQkFBb0J6UixNQUFRMEUsT0FBT3NILEdBRzVFeEIsU0FBU2lILGNBQWdDLGtCQUFrQnpSLE1BQVEwRSxPQUFPcUgsR0FDMUV2QixTQUFTaUgsY0FBZ0Msa0JBQWtCelIsTUFBUTBFLE9BQU9xSCxHQUkxRSxNQUFNdU4sRUFBeUIsU0FBbEJwTixFQUEyQixNQUFRQSxFQUFjLEdBQUdrUixjQUFnQmxSLEVBQWN2SixNQUFNLEdBQ3JHNkgsU0FBU2lILGNBQWMsbUJBQW1CdUgsWUFBYyxNQUFTTSxFQU1uRSxzQkFDRXdzRyxFQUFnQjFwRywwQkFBMEJuYSxLQUFLdWpILFVBQy9DTSxFQUFnQnBwRyx1QkFBdUJ6YSxLQUFLMGEsWUFDNUNtcEcsRUFBZ0J6MkcscUIsK0ZDeE5wQixjQTZQcUIsRUFBQTNGLFFBdlByQixNQWlCRSxZQUFhOEcsRUFBb0IrcEcsRUFBK0JoQyxHQUM5RHQyRyxLQUFLdU8sU0FBV0EsRUFDaEJ2TyxLQUFLZ2tILGdCQUFrQixHQUN2QmhrSCxLQUFLaWtILFdBQVksRUFDakJqa0gsS0FBS2trSCxLQUFPLElBQUksVUFBSyxZQUFhLENBQ2hDQyxXQUFZN04sSUFFZC90RyxTQUFTQyxlQUFlLGFBQWFhLE1BQU0rNkcsVUFBWSxPQUN2RHBrSCxLQUFLcWtILFNBQVcsSUFBSTFxRixJQUNwQjM1QixLQUFLa2tILEtBQUtJLHdCQUNWdGtILEtBQUt1a0gsYUFBZSxJQUFJak0sRUFBUXQ0RyxLQUFNLGlCQUFrQixzQkFDeERBLEtBQUt3a0gsVUFBWSxJQUNqQnhrSCxLQUFLeWtILGlCQUNKbDhHLFNBQVNpSCxjQUFjLGVBQStCbkcsTUFBTXc0QyxPQUFTLE9BRXRFajVDLE9BQU84N0csU0FBVyxLQUNoQixNQUFNNS9GLEVBQVNsYyxPQUFPKzdHLFlBQ2hCOS9GLEVBQVFqYyxPQUFPZzhHLFdBRXJCaDhHLE9BQU8vQixXQUFXLEtBQ1hpZSxJQUFXbGMsT0FBTys3RyxhQUFpQjkvRixJQUFVamMsT0FBT2c4RyxZQUN2RDVrSCxLQUFLeTVHLFdBQVd6NUcsS0FBS3c1RyxrQkFBa0IsSUFFeEN4NUcsS0FBS3drSCxZQU9aLGlCQUNFLFVBQUtLLE9BQU9DLFVBQVUsa0JBQW1COWtILEtBQUs2NEcsY0FBY3Y2RyxLQUFLMEIsTUFBT0EsS0FBS2trSCxLQUFLdDVHLFNBQVNtNkcsSUFDM0YsVUFBS0YsT0FBT0MsVUFBVSxnQkFBaUI5a0gsS0FBS2dsSCxRQUFRMW1ILEtBQUswQixNQUFPQSxLQUFLa2tILEtBQUt0NUcsU0FBU202RyxJQUNuRixVQUFLRixPQUFPQyxVQUFVLHNCQUF1QjlrSCxLQUFLeTVHLFdBQVduN0csS0FBSzBCLE1BQU9BLEtBQUtra0gsS0FBS3Q1RyxTQUFTbTZHLElBQzVGLFVBQUtGLE9BQU9DLFVBQVUscUJBQXNCOWtILEtBQUtpbEgsV0FBVzNtSCxLQUFLMEIsTUFBT0EsS0FBS2trSCxLQUFLdDVHLFNBQVNtNkcsSUFRN0YsaUJBQWtCRyxFQUFtQmwyQixHQUFRLEdBQzNDLFNBQVNtMkIsRUFBY0MsR0FDckIsR0FBSUEsSUFBU3BsSCxLQUFLdzVHLGlCQUFrQixDQUNsQyxNQUFNRyxFQUFVMzVHLEtBQUtxa0gsU0FBUzFtSCxJQUFJeW5ILEdBQ2xDcGxILEtBQUt1TyxTQUFTODJHLFdBQVcxTCxHQUFTaGpHLEtBQU0ya0csSUFDdEN0N0csS0FBS3NsSCxVQUFVaEssRUFBSzhKLEdBQ3BCLE1BQU1HLEVBQWMsa0JBQW9CSCxFQUNsQ3RzRyxFQUFZdlEsU0FBU0MsZUFBZSs4RyxHQUN4QixPQUFkenNHLEdBQ0ZBLEVBQVU3UCxVQUFVQyxJQUFJLGVBRTFCbEosS0FBS2drSCxnQkFBZ0JuNEcsUUFBU3V2QixHQUF1QkEsT0FDcEQwSCxNQUFPdmlDLElBQ1MsY0FBYkEsRUFBSWxELE1BQXFDLGdCQUFia0QsRUFBSWxELE1BQ2xDc0YsUUFBUTRCLE1BQU1oRSxNQU10QixNQUFNaWxILEVBQWMsQ0FBQ04sR0FDckIxaEgsTUFBTTRJLEtBQUs3RCxTQUFTbUQsdUJBQXVCLGdCQUFnQkcsUUFBUW9DLElBQ2pFQSxFQUFLaEYsVUFBVVIsT0FBTyxpQkFFeEIsSUFBSyxNQUFNMjhHLEtBQVFJLEVBQ2J4MkIsRUFDRnBtRixPQUFPL0IsV0FBV3MrRyxFQUFhN21ILEtBQUswQixNQUFRQSxLQUFjLFVBQUdvbEgsR0FFN0RELEVBQWE3bUgsS0FBSzBCLEtBQWxCbWxILENBQXdCQyxHQVE5QixpQkFDRSxPQUFPcGxILEtBQUtra0gsS0FBS3VCLHFCQU1uQixvQkFDRSxPQUFPemxILEtBQUtxa0gsU0FBUzFtSCxJQUFJcUMsS0FBS3c1RyxrQkFNaEMsYUFDRSxJQUFLcjVHLFFBQVNDLElBQ1pvRCxNQUFNNEksS0FBSzdELFNBQVNtRCx1QkFBdUIsbUJBQ3hDRyxRQUFTb0MsSUFBd0JBLEVBQUs1RSxNQUFNQyxRQUFVLFNBQ3pEekMsV0FBV3pHLEVBQVNKLEtBQUtra0gsS0FBS3Q1RyxTQUFTODZHLGFBQWUsT0FDcEQvdUcsS0FBSyxLQUNQM1csS0FBS3k1RyxXQUFXejVHLEtBQUtra0gsS0FBS3VCLHNCQUFzQixHQUNoRGppSCxNQUFNNEksS0FBSzdELFNBQVNtRCx1QkFBdUIsbUJBQ3hDRyxRQUFTb0MsSUFDUixNQUFNcXRHLEVBQU1ydEcsRUFBSzAzRyxXQUNYcE0sRUFBU245RixTQUFTbk8sRUFBS25HLEdBQUcwSixNQUFNLE9BQU8sSUFDN0N4UixLQUFLc2xILFVBQVVoSyxFQUFLL0IsR0FDcEJ0ckcsRUFBSzVFLE1BQU1DLFFBQVUsT0FLN0IsWUFDRXRKLEtBQUs0bEgsdUJBUVAsVUFBV3RLLEVBQW9CL0IsR0FDN0IsTUFBTTJILEVBQVEzNEcsU0FBU0MsZUFBZSxnQkFDaENxb0csRUFBYTd3RyxLQUFLa2tILEtBQUsyQixvQ0FBb0N0TSxHQUMzRDEvRixFQUFTN1osS0FBS2trSCxLQUFLdDVHLFNBQVNrN0csWUFBWUMsWUFBWUMsY0FBY3pNLEVBQVEsQ0FDOUUwTSxnQkFBZ0IsRUFDaEJDLHFCQUFxQixJQUVqQkMsRUFBYXY5RyxPQUFPdzlHLGlCQUFpQmxGLEVBQU8sTUFDL0NtRixpQkFBaUIsZUFFZGQsRUFBYyxrQkFBb0JoTSxFQUFPamhHLFdBQy9DLElBQUlRLEVBQVl2USxTQUFTQyxlQUFlKzhHLEdBUXhDLElBUGtCLE9BQWR6c0csSUFDRkEsRUFBWXZRLFNBQVNTLGNBQWMsT0FDbkM4UCxFQUFVaFIsR0FBS3k5RyxFQUNmenNHLEVBQVU3UCxVQUFVQyxJQUFJLGtCQUN4Qmc0RyxFQUFNanJGLFlBQVluZCxJQUdiQSxFQUFVNnNHLFlBQ2Y3c0csRUFBVTBuRixZQUFZMW5GLEVBQVU2c0csWUFHbENySyxFQUFJL3VHLGFBQWEsUUFBU3NrRyxFQUFXaHNGLE1BQU12TSxZQUMzQ2dqRyxFQUFJL3VHLGFBQWEsU0FBVXNrRyxFQUFXL3JGLE9BQU94TSxZQUM3Q1EsRUFBVXpQLE1BQU1wRSxTQUFXLFdBQzNCNlQsRUFBVXpQLE1BQU1pOUcsSUFBU3pzRyxFQUFPeXNHLElBQVYsS0FDdEJ4dEcsRUFBVXpQLE1BQU11aUMsS0FBVS94QixFQUFPK3hCLEtBQU94dkIsU0FBUytwRyxHQUExQixLQUV2QnJ0RyxFQUFVbWQsWUFBWXFsRixHQU14QixVQUNFdDdHLEtBQUtpa0gsV0FBWSxFQUNqQmprSCxLQUFLdWtILGFBQWFnQyxzQkFDbEJoK0csU0FBU0MsZUFBZSxXQUFXYSxNQUFNQyxRQUFVLE9BT3JELGtCQUFtQm9mLEdBQ2pCMW9CLEtBQUtna0gsZ0JBQWdCNWhILEtBQUtzbUIsR0FPNUIscUJBQXNCQSxHQUNwQixNQUFNdGpCLEVBQVFwRixLQUFLZ2tILGdCQUFnQng0QixVQUFXdjlFLEdBQ3JDQSxJQUFTeWEsSUFFSCxJQUFYdGpCLEdBQ0ZwRixLQUFLZ2tILGdCQUFnQm43RSxPQUFPempDLEVBQU8sR0FPdkMsdUJBQ0VtRCxTQUFTa1EsS0FBSzVVLGlCQUFpQixVQUFZMlgsSUFDekMsT0FBUUEsRUFBSW5kLEtBQ1YsSUFBSyxJQUNILElBQUssTUFBTXlhLEtBQWF2USxTQUFTbUQsdUJBQXVCLGtCQUN0RG9OLEVBQVV6UCxNQUFNbTlHLFdBQWEsWUFPckNqK0csU0FBU2tRLEtBQUs1VSxpQkFBaUIsUUFBVTJYLElBQ3ZDLE9BQVFBLEVBQUluZCxLQUNWLElBQUssSUFDSCxJQUFLLE1BQU15YSxLQUFhdlEsU0FBU21ELHVCQUF1QixrQkFDdERvTixFQUFVelAsTUFBTW05RyxXQUFhLE1BWXZDLGNBQWVsUSxHQUNidDJHLEtBQUtxa0gsU0FBU3J3QyxRQUNkLElBQUssTUFBTXl5QyxLQUFZblEsRUFBU29RLFVBQzlCLElBQUssTUFBTXhkLEtBQVV1ZCxFQUFTRSxTQUM1QjNtSCxLQUFLcWtILFNBQVNwZ0gsSUFBSXdpSCxFQUFTRSxTQUFTbjJHLFFBQVEwNEYsR0FBU0EsRUFBTyxRQVFsRSxjQUdFLE9BRnVCbHBHLEtBQUtra0gsS0FBS3Q1RyxTQUFTMHJHLFNBQVNzUSxVQUUzQixNQURQNW1ILEtBQUtra0gsS0FBS3Q1RyxTQUFTMHJHLFNBQVN1USxNQUFNN21ILEtBQUt3NUcsa0JBQWtCejhHLEssY0NyTzlFLElBQ1ErcEgsRUFFQUMsRUFHQUMsRUFXQUMsRUFoQkFILEVBQU9sK0csT0FBT3MrRyxzQkFFZEgsRUFBVyxlQUFnQngrRyxTQUczQnkrRyxFQUFVLFdBQ1YsSUFBSyxJQUFJbHFILEVBQUUsRUFBR0EsRUFBRTZELFVBQVUwQixPQUFRdkYsSUFDOUIsSUFBSyxJQUFJdUIsS0FBT3NDLFVBQVU3RCxHQUNsQjZELFVBQVU3RCxHQUFHNkIsZUFBZU4sS0FDNUJzQyxVQUFVLEdBQUd0QyxHQUFPc0MsVUFBVTdELEdBQUd1QixJQUk3QyxPQUFPc0MsVUFBVSxLQUdqQnNtSCxFQUFpQixTQUFTeDdHLEVBQVNiLEdBUW5DLE9BUEE1SyxLQUFLNEssU0FBV284RyxFQUFRLEdBQUlDLEVBQWVFLFNBQVV2OEcsR0FDckQ1SyxLQUFLNk0sR0FBV3BCLEVBQ2hCekwsS0FBS29uSCxhQUFlLGlCQUVwQnBuSCxLQUFLcW5ILGdCQUVMcm5ILEtBQUs2TSxHQUFHeTZHLGdCQUFrQnRuSCxLQUNuQkEsT0FHSW1uSCxTQUFXLENBQ3RCdGxFLE9BQVEsT0FDUjBsRSxZQUFZLEVBQ1pDLGlCQUFpQixFQUNqQkMsVUFBVyxFQUNYOXpHLEdBQUcsRUFDSEosR0FBRyxFQUNIbTBHLFNBQVUsR0FDVkMsWUFBYSxHQUNiQyxZQUFhLEdBQ2I5MkIsUUFBUSxFQUNSKzJCLFlBQWEsQ0FDVHBqQixHQUFJLG9CQUNKcWpCLEtBQU0sc0JBQ05sOEUsS0FBTSxzQkFDTkMsTUFBTyx3QkFFWGs4RSxrQkFBbUIsQ0FDZnRqQixHQUFJLDBCQUNKcWpCLEtBQU0sNEJBQ05sOEUsS0FBTSw0QkFDTkMsTUFBTywrQkFLZm83RSxFQUFldm9ILFVBQVU4bUMsTUFBUSxTQUFTM25CLEdBQ3RDN2QsS0FBSzRLLFNBQVdvOEcsRUFBUWhuSCxLQUFLNEssU0FBVWlULEdBQ3ZDN2QsS0FBS2dvSCxTQUFXbnFHLEVBQVFtcUcsVUFBWWhvSCxLQUFLZ29ILFNBQ3pDaG9ILEtBQUtpb0gsVUFBWXBxRyxFQUFRb3FHLFdBQWFqb0gsS0FBS2lvSCxVQUMzQ2pvSCxLQUFLNEssU0FBUzI4RyxZQUFhLEVBQzNCdm5ILEtBQUtrb0gsU0FHVGpCLEVBQWV2b0gsVUFBVXdvQixJQUFNLFdBQzNCbG5CLEtBQUs0SyxTQUFTMjhHLFlBQWEsR0FHL0JOLEVBQWV2b0gsVUFBVXlwSCxLQUFPLFdBQzVCbm9ILEtBQUtnb0gsU0FBVyxFQUNoQmhvSCxLQUFLaW9ILFVBQVksRUFDakJqb0gsS0FBSzRLLFNBQVMyOEcsWUFBYSxFQUNVLG1CQUExQnZuSCxLQUFLNEssU0FBU3c5RyxTQUNyQnBvSCxLQUFLNEssU0FBU3c5RyxRQUFRbnJILEtBQUsrQyxPQUluQ2luSCxFQUFldm9ILFVBQVUycEgsT0FBUyxXQUM5QnJvSCxLQUFLc29ILG1CQUNMdG9ILEtBQUs2TSxHQUFHNUQsVUFBVVIsT0FBT3pJLEtBQUtvbkgsY0FDOUJwbkgsS0FBSzZNLEdBQUd4RCxNQUFNdzRDLE9BQVMsSUFHM0JvbEUsRUFBZXZvSCxVQUFVNnBILE9BQVMsV0FDMUJ2b0gsS0FBSzZNLEdBQUc1RCxVQUFVOEMsU0FBUy9MLEtBQUtvbkgsZ0JBR3BDcG5ILEtBQUt3b0gsbUJBQ0x4b0gsS0FBSzZNLEdBQUc1RCxVQUFVQyxJQUFJbEosS0FBS29uSCxjQUMzQnBuSCxLQUFLNk0sR0FBR3hELE1BQU13NEMsT0FBUzdoRCxLQUFLNEssU0FBU2kzQyxTQUt6Q29sRSxFQUFldm9ILFVBQVUyb0gsY0FBZ0IsV0FDckNybkgsS0FBSzZNLEdBQUc1RCxVQUFVQyxJQUFJbEosS0FBS29uSCxjQUUzQkosRUFBUWhuSCxLQUFNLENBQ1Z5b0gsS0FBTSxLQUNOQyxVQUFVLEVBQ1ZDLEtBQU0sS0FDTkMsVUFBVSxFQUNWQyxXQUFXLEVBQ1hDLGdCQUFpQixJQUFPOW9ILEtBQUs0SyxTQUFTZzlHLFlBQ3RDbUIsU0FBVSxLQUNWQyxlQUFnQixPQUdwQmhwSCxLQUFLZ29ILFNBQVcsRUFDaEJob0gsS0FBS2lvSCxVQUFZLEVBRWpCLElBQUl2bUgsRUFBTzFCLEtBQ1hBLEtBQUtpcEgscUJBQXVCLFdBQ3hCdm5ILEVBQUt3bkgsWUFBWWhxSCxNQUFNd0MsSUFJM0IsSUFBSXluSCxFQUFPNWdILFNBQVNrNEYsZ0JBUXBCLEdBUEEwb0IsRUFBS3RsSCxpQkFBaUIsVUFBVzdELEtBQUtpcEgsc0JBQXNCLEdBQzVERSxFQUFLdGxILGlCQUFpQixRQUFTN0QsS0FBS2lwSCxzQkFBc0IsR0FFMURqcEgsS0FBS29wSCxjQUVMcHBILEtBQUs2TSxHQUFHeEQsTUFBTXc0QyxPQUFTN2hELEtBQUs0SyxTQUFTaTNDLE9BRWpDN2hELEtBQUs0SyxTQUFTNDhHLGdCQU9kLElBTkEsSUFBSTZCLEVBQVcsQ0FBQyxHQUFJLE9BQVEsV0FBWSxTQUNwQ0MsRUFBUyxDQUNULFVBQWEscUJBQ2IsWUFBZSxPQUNmLHNCQUF1QixVQUVsQnhzSCxFQUFFLEVBQUdBLEVBQUV1c0gsRUFBU2huSCxPQUFRdkYsSUFBSyxDQUNsQyxJQUFJK3hCLEVBQVN3NkYsRUFBU3ZzSCxHQUN0QixJQUFLLElBQUl1QixLQUFPaXJILEVBQ1JBLEVBQU8zcUgsZUFBZU4sS0FDdEIyQixLQUFLNk0sR0FBR3hELE1BQU13bEIsRUFBT3h3QixHQUFPaXJILEVBQU9qckgsTUFPdkQ0b0gsRUFBZXZvSCxVQUFVMHFILFlBQWMsV0FDbkMsSUFBSXJ1RixFQUFPLzZCLEtBQ1hBLEtBQUs0SyxTQUFTOUksT0FBUyxDQUNuQnluSCxXQUFZLFNBQVMveEcsR0FDakIsSUFBSWd5RyxFQUNBenVGLEVBQUswdUYsV0FBV2p5RyxFQUFFclksT0FBUXFZLEtBQzFCZ3lHLEVBQVFoeUcsRUFBRWt5RyxjQUFjQyxRQUFRLEdBQ2hDNXVGLEVBQUswc0YsVUFBWTFzRixFQUFLNnVGLFdBQVdweUcsRUFBRXJZLE9BQVFxWSxHQUMzQ3VqQixFQUFLOHVGLE9BQU9MLEVBQU0zbEcsUUFBUzJsRyxFQUFNMWxHLFNBQ2pDdE0sRUFBRWlFLG9CQUdWcXVHLFVBQVcsU0FBU3R5RyxHQUNoQixJQUFJZ3lHLEVBQ0F6dUYsRUFBSzh0RixZQUNMVyxFQUFRaHlHLEVBQUVreUcsY0FBY0MsUUFBUSxHQUNoQzV1RixFQUFLZ3ZGLFdBQVdQLEVBQU0zbEcsUUFBUzJsRyxFQUFNMWxHLFNBQ2pDdE0sRUFBRTZFLGdCQUNGN0UsRUFBRTZFLG1CQUlkMnRHLFVBQVcsU0FBU3h5RyxHQUNadWpCLEVBQUswdUYsV0FBV2p5RyxFQUFFclksT0FBUXFZLEtBQzFCdWpCLEVBQUswc0YsVUFBWTFzRixFQUFLNnVGLFdBQVdweUcsRUFBRXJZLE9BQVFxWSxHQUMzQ3VqQixFQUFLOHVGLE9BQU9yeUcsRUFBRXFNLFFBQVNyTSxFQUFFc00sU0FDekJpWCxFQUFLaXVGLGVBQWlCeHhHLEVBQUVyWSxPQUNFLFFBQXRCcVksRUFBRXJZLE9BQU9pcUcsVUFDVDV4RixFQUFFNkUsaUJBRU43RSxFQUFFaUUsb0JBR1Z3dUcsU0FBVSxTQUFTenlHLEdBQ1h1akIsRUFBSzB1RixXQUFXanlHLEVBQUVyWSxPQUFRcVksS0FDMUJ1akIsRUFBS212RixPQUNMbnZGLEVBQUtpdUYsZUFBaUIsS0FDbEJ4eEcsRUFBRTZFLGdCQUNGN0UsRUFBRTZFLG1CQUlkOHRHLFVBQVcsU0FBUzN5RyxHQUNadWpCLEVBQUs4dEYsWUFDTDl0RixFQUFLZ3ZGLFdBQVd2eUcsRUFBRXFNLFFBQVNyTSxFQUFFc00sU0FDekJ0TSxFQUFFNkUsZ0JBQ0Y3RSxFQUFFNkUsbUJBSWQrdEcsT0FBUSxTQUFTNXlHLEdBQ3NCLG1CQUF4QnVqQixFQUFLbndCLFNBQVN5L0csT0FDckJ0dkYsRUFBS253QixTQUFTeS9HLE1BQU1wdEgsS0FBSzg5QixFQUFNQSxFQUFLbndCLFVBRXBDNE0sRUFBRTZFLGdCQUNGN0UsRUFBRTZFLGtCQUdWaXVHLFdBQVksU0FBUzl5RyxHQUNqQixHQUFJclAsS0FBS3VJLElBQUlxcUIsRUFBS2l0RixVQUFZLEdBQUs3L0csS0FBS3VJLElBQUlxcUIsRUFBS2t0RixXQUFhLEVBSzFELE9BSkF6d0csRUFBRTZFLGlCQUNFN0UsRUFBRWlFLGlCQUNGakUsRUFBRWlFLG1CQUVDLEdBR2Y4dUcsVUFBVyxTQUFTL3lHLEdBQ2hCLEdBQUl1akIsRUFBSzB1RixXQUFXanlHLEVBQUVyWSxPQUFRcVksSUFBTXVqQixFQUFLaXVGLGVBT3JDLE9BTkl4eEcsRUFBRTZFLGdCQUNGN0UsRUFBRTZFLGlCQUVGN0UsRUFBRWlFLGlCQUNGakUsRUFBRWlFLG1CQUVDLEdBR2YrdUcsWUFBYSxTQUFTaHpHLEdBQ2xCLE1BQXlDLG1CQUE5QnVqQixFQUFLbndCLFNBQVM0L0csWUFDZHp2RixFQUFLbndCLFNBQVM0L0csWUFBWXRySCxNQUFNNjdCLEVBQU1wNkIsV0FFeENvNkIsRUFBSzB1RixXQUFXanlHLEVBQUVyWSxPQUFRcVksSUFDM0JBLEVBQUU2RSxnQkFDRjdFLEVBQUU2RSxpQkFFRjdFLEVBQUVpRSxpQkFDRmpFLEVBQUVpRSxtQkFFQyxRQVBOLElBWWJ6YixLQUFLd29ILG9CQUdUdkIsRUFBZXZvSCxVQUFVcXJILFdBQWEsU0FBU2xtRyxFQUFTQyxHQUNwRCxLQUFLOWpCLEtBQUsrb0gsVUFBWSxJQUFJM3VGLEtBQVMsSUFBSUEsS0FBS3A2QixLQUFLK29ILFNBQVNsTyxVQUFZNzZHLEtBQUs4b0gsb0JBQ3ZFOW9ILEtBQUsrb0gsU0FBVyxJQUFJM3VGLEtBRWhCcDZCLEtBQUs2b0gsWUFBYzdvSCxLQUFLeW9ILE1BQVF6b0gsS0FBSzJvSCxPQUFPLENBQzVDLElBQUk4QixFQUFVNW1HLEVBQVU3akIsS0FBS3lvSCxLQUN6QmlDLEVBQVU1bUcsRUFBVTlqQixLQUFLMm9ILEtBSzdCLEdBSkkzb0gsS0FBSzRLLFNBQVNrbUYsU0FDZDI1QixJQUFXLEVBQ1hDLElBQVcsR0FFWDFxSCxLQUFLeW5ILFVBQVUsRUFBRyxDQUNsQixJQUFJNEMsRUFBUWxpSCxLQUFLd2lILEtBQUtGLEVBQU9BLEVBQVNDLEVBQU9BLEdBQzdDLEdBQUkxcUgsS0FBS3luSCxVQUFVNEMsRUFDZixPQUdBcnFILEtBQUt5bkgsVUFBWSxFQUdyQnpuSCxLQUFLZ3BILGlCQUNMaHBILEtBQUtncEgsZUFBZTRCLE9BQ3BCNXFILEtBQUtncEgsZUFBaUIsS0FDdEJocEgsS0FBSzZNLEdBQUdtTCxTQUdaaFksS0FBSzRLLFNBQVMyOEcsWUFBYSxFQUMzQnZuSCxLQUFLZ29ILFNBQVdob0gsS0FBS2lvSCxVQUFZLEVBRWpDLElBQUk0QyxFQUFhN3FILEtBQUs2cUgsYUFDbEJDLEVBQVk5cUgsS0FBSzhxSCxZQUVyQjlxSCxLQUFLNnFILFdBQVc3cUgsS0FBSzRLLFNBQVMySSxFQUFJczNHLEVBQWFKLEVBQVNJLEdBQ3hEN3FILEtBQUs4cUgsVUFBVTlxSCxLQUFLNEssU0FBUytJLEVBQUltM0csRUFBWUosRUFBU0ksR0FFdEQ5cUgsS0FBSzBvSCxTQUFXMW9ILEtBQUt5b0gsS0FDckJ6b0gsS0FBSzRvSCxTQUFXNW9ILEtBQUsyb0gsS0FDckIzb0gsS0FBS3lvSCxLQUFPNWtHLEVBQ1o3akIsS0FBSzJvSCxLQUFPN2tHLEVBRVo5akIsS0FBSytxSCx1QkFDTC9xSCxLQUFLZ3JILGdCQUFnQmhySCxLQUFLNEssU0FBU2k5RyxhQUVBLG1CQUF4QjduSCxLQUFLNEssU0FBU3kvRyxPQUNyQnJxSCxLQUFLNEssU0FBU3kvRyxNQUFNcHRILEtBQUsrQyxLQUFNQSxLQUFLNEssWUFNcERxOEcsRUFBZXZvSCxVQUFVcXNILHFCQUF1QixXQUM1Qy9xSCxLQUFLZ29ILFNBQVdob0gsS0FBS2lySCxhQUFhanJILEtBQUswb0gsU0FBVzFvSCxLQUFLeW9ILEtBQU16b0gsS0FBSzRLLFNBQVMrOEcsYUFDM0UzbkgsS0FBS2lvSCxVQUFZam9ILEtBQUtpckgsYUFBYWpySCxLQUFLNG9ILFNBQVc1b0gsS0FBSzJvSCxLQUFNM29ILEtBQUs0SyxTQUFTKzhHLGFBQ3hFM25ILEtBQUs0SyxTQUFTa21GLFNBQ2Q5d0YsS0FBS2dvSCxXQUFhLEVBQ2xCaG9ILEtBQUtpb0gsWUFBYyxJQUkzQmhCLEVBQWV2b0gsVUFBVXdySCxLQUFPLFdBQ3hCbHFILEtBQUt5b0gsTUFBUXpvSCxLQUFLMG9ILFdBQXlDLElBQTdCMW9ILEtBQUs0SyxTQUFTMjhHLGFBQzVDdm5ILEtBQUs0SyxTQUFTMjhHLFlBQWEsRUFDM0J2bkgsS0FBSytxSCx1QkFDTC9xSCxLQUFLeW9ILEtBQU96b0gsS0FBSzBvSCxTQUFXMW9ILEtBQUs2b0gsV0FBWSxFQUM3QzdvSCxLQUFLa29ILFVBSWJqQixFQUFldm9ILFVBQVUrcUgsV0FBYSxTQUFTdHFILEVBQVEyd0IsR0FDbkQsTUFBMEMsbUJBQS9COXZCLEtBQUs0SyxTQUFTc2dILGVBQzJDLElBQXpEbHJILEtBQUs0SyxTQUFTc2dILGFBQWFqdUgsS0FBSytDLEtBQU1iLEVBQVEyd0IsSUFNN0RtM0YsRUFBZXZvSCxVQUFVa3JILFdBQWEsU0FBU3pxSCxFQUFRMndCLEdBQ25ELE1BQXVDLG1CQUE1Qjl2QixLQUFLNEssU0FBUzY4RyxVQUNkem5ILEtBQUs0SyxTQUFTNjhHLFVBQVV4cUgsS0FBSytDLEtBQU1iLEVBQVEyd0IsR0FFL0M5dkIsS0FBSzRLLFNBQVM2OEcsV0FHekJSLEVBQWV2b0gsVUFBVW1ySCxPQUFTLFNBQVNobUcsRUFBU0MsR0FDaEQ5akIsS0FBSzZvSCxXQUFZLEVBQ2pCN29ILEtBQUtnb0gsU0FBV2hvSCxLQUFLMG9ILFNBQVcsRUFDaEMxb0gsS0FBS2lvSCxVQUFZam9ILEtBQUs0b0gsU0FBVyxFQUNqQzVvSCxLQUFLeW9ILEtBQU81a0csRUFDWjdqQixLQUFLMm9ILEtBQU83a0csR0FHaEJtakcsRUFBZXZvSCxVQUFVd3FILFlBQWMsV0FDbkNscEgsS0FBS3lvSCxNQUFPLEVBQ1p6b0gsS0FBSzJvSCxNQUFPLEVBQ1ozb0gsS0FBSzZvSCxXQUFZLEdBR3JCNUIsRUFBZXZvSCxVQUFVeXNILG9CQUFzQixTQUFTbkQsRUFBVU4sR0FDOUQsT0FBMEMsSUFBbkN2L0csS0FBSzAxRCxNQUFNMTFELEtBQUt1SSxJQUFJczNHLElBQW1CLEVBQ3hDQSxFQUFXTixHQUdyQlQsRUFBZXZvSCxVQUFVdXNILGFBQWUsU0FBU2pELEVBQVU1L0csR0FDdkQsSUFBSWdqSCxFQUFjcEQsRUFVbEIsT0FUSUEsRUFBVyxFQUNQQSxFQUFXNS9HLElBQ1hnakgsRUFBY2hqSCxHQUdkNC9HLEVBQVksRUFBSTUvRyxJQUNoQmdqSCxFQUFlLEVBQUloakgsR0FHcEJnakgsR0FHWG5FLEVBQWV2b0gsVUFBVXNzSCxnQkFBa0IsU0FBU0ssR0FJaEQsSUFBSXpnSCxFQUFXNUssS0FBSzRLLFNBQ2hCaUMsRUFBSzdNLEtBQUs2TSxHQUVkQSxFQUFHNUQsVUFBVVIsT0FBT21DLEVBQVNpOUcsWUFBWXBqQixJQUN6QzUzRixFQUFHNUQsVUFBVVIsT0FBT21DLEVBQVNpOUcsWUFBWUMsTUFDekNqN0csRUFBRzVELFVBQVVSLE9BQU9tQyxFQUFTaTlHLFlBQVlqOEUsTUFDekMvK0IsRUFBRzVELFVBQVVSLE9BQU9tQyxFQUFTaTlHLFlBQVloOEUsT0FDekNoL0IsRUFBRzVELFVBQVVSLE9BQU9tQyxFQUFTbTlHLGtCQUFrQnRqQixJQUMvQzUzRixFQUFHNUQsVUFBVVIsT0FBT21DLEVBQVNtOUcsa0JBQWtCRCxNQUMvQ2o3RyxFQUFHNUQsVUFBVVIsT0FBT21DLEVBQVNtOUcsa0JBQWtCbjhFLE1BQy9DLytCLEVBQUc1RCxVQUFVUixPQUFPbUMsRUFBU205RyxrQkFBa0JsOEUsT0FFM0M3ckMsS0FBS2dvSCxTQUFXLEdBQ2hCbjdHLEVBQUc1RCxVQUFVQyxJQUFJbWlILEVBQVF4L0UsT0FFekI3ckMsS0FBS2dvSCxTQUFXLEdBQ2hCbjdHLEVBQUc1RCxVQUFVQyxJQUFJbWlILEVBQVF6L0UsTUFFekI1ckMsS0FBS2lvSCxVQUFZLEdBQ2pCcDdHLEVBQUc1RCxVQUFVQyxJQUFJbWlILEVBQVF2RCxNQUV6QjluSCxLQUFLaW9ILFVBQVksR0FDakJwN0csRUFBRzVELFVBQVVDLElBQUltaUgsRUFBUTVtQixLQUlqQ3dpQixFQUFldm9ILFVBQVV3cEgsTUFBUSxXQUM3QixJQUFJb0QsRUFBV3RySCxLQUFLdXJILGVBQ2hCeHdGLEVBQU8vNkIsS0FDUDRLLEVBQVc1SyxLQUFLNEssU0FFaEJBLEVBQVMySSxHQUFLKzNHLEVBQVNFLFlBQWMsR0FDckN4ckgsS0FBSzZxSCxXQUFXN3FILEtBQUs2cUgsYUFBZTdxSCxLQUFLZ29ILFVBQ3JDNy9HLEtBQUt1SSxJQUFJMVEsS0FBS2dvSCxVQUFZLElBQzFCaG9ILEtBQUtnb0gsU0FBV3A5RyxFQUFTMjhHLFdBQ3JCeHNGLEVBQUtvd0Ysb0JBQW9CbnJILEtBQUtnb0gsU0FBVXA5RyxFQUFTODhHLFVBQVkxbkgsS0FBS2dvSCxXQUkxRWhvSCxLQUFLZ29ILFNBQVcsRUFHaEJwOUcsRUFBUytJLEdBQUsyM0csRUFBU0csYUFBZSxHQUN0Q3pySCxLQUFLOHFILFVBQVU5cUgsS0FBSzhxSCxZQUFjOXFILEtBQUtpb0gsV0FDbkM5L0csS0FBS3VJLElBQUkxUSxLQUFLaW9ILFdBQWEsSUFDM0Jqb0gsS0FBS2lvSCxVQUFZcjlHLEVBQVMyOEcsV0FDdEJ4c0YsRUFBS293RixvQkFBb0JuckgsS0FBS2lvSCxVQUFXcjlHLEVBQVM4OEcsVUFBWTFuSCxLQUFLaW9ILFlBSTNFam9ILEtBQUtpb0gsVUFBWSxFQUdyQmx0RixFQUFLaXdGLGdCQUFnQnBnSCxFQUFTbTlHLG1CQUVBLG1CQUFuQm45RyxFQUFTeS9HLE9BQ2hCei9HLEVBQVN5L0csTUFBTXB0SCxLQUFLK0MsS0FBTTRLLEdBRzFCekMsS0FBS3VJLElBQUkxUSxLQUFLZ29ILFVBQVksR0FBSzcvRyxLQUFLdUksSUFBSTFRLEtBQUtpb0gsV0FBYSxFQUNyRGpvSCxLQUFLMHJILFNBQ04xckgsS0FBSzBySCxRQUFTLEVBRWQ1RSxHQUFLLFdBQ0QvckYsRUFBSzJ3RixRQUFTLEVBQ2Qzd0YsRUFBS210RixZQUtibnRGLEVBQUtvdEYsUUFJYmxCLEVBQWV2b0gsVUFBVTZzSCxhQUFlLFdBR3BDLE9BQU92ckgsS0FBSzZNLElBR2hCbzZHLEVBQWV2b0gsVUFBVW1zSCxXQUFhLFNBQVNqL0UsR0FDM0MsSUFBSTAvRSxFQUFXdHJILEtBQUt1ckgsZUFDcEIsR0FBb0IsaUJBQVQzL0UsRUFLUCxPQUFPMC9FLEVBQVNULFdBSmhCUyxFQUFTVCxXQUFhai9FLEVBQ3RCNXJDLEtBQUs0SyxTQUFTaWdILFdBQWFqL0UsR0FPbkNxN0UsRUFBZXZvSCxVQUFVb3NILFVBQVksU0FBU3hFLEdBQzFDLElBQUlnRixFQUFXdHJILEtBQUt1ckgsZUFDcEIsR0FBbUIsaUJBQVJqRixFQUtQLE9BQU9nRixFQUFTUixVQUpoQlEsRUFBU1IsVUFBWXhFLEVBQ3JCdG1ILEtBQUs0SyxTQUFTa2dILFVBQVl4RSxHQU9sQ1csRUFBZXZvSCxVQUFVOHBILGlCQUFtQixXQUN4QyxJQUFJMzdHLEVBQUs3TSxLQUFLNk0sR0FDVmpDLEVBQVc1SyxLQUFLNEssU0FFaEJtOEcsSUFDQWw2RyxFQUFHaEosaUJBQWlCLGFBQWMrRyxFQUFTOUksT0FBT3luSCxZQUFZLEdBQzlEMThHLEVBQUdoSixpQkFBaUIsV0FBWStHLEVBQVM5SSxPQUFPbW9ILFVBQVUsR0FDMURwOUcsRUFBR2hKLGlCQUFpQixZQUFhK0csRUFBUzlJLE9BQU9nb0gsV0FBVyxJQUdoRWo5RyxFQUFHaEosaUJBQWlCLFlBQWErRyxFQUFTOUksT0FBT2tvSCxXQUFXLEdBQzVEbjlHLEVBQUdoSixpQkFBaUIsVUFBVytHLEVBQVM5SSxPQUFPbW9ILFVBQVUsR0FDekRwOUcsRUFBR2hKLGlCQUFpQixZQUFhK0csRUFBUzlJLE9BQU9xb0gsV0FBVyxHQUU1RHQ5RyxFQUFHaEosaUJBQWlCLFFBQVMrRyxFQUFTOUksT0FBT3dvSCxZQUFZLEdBQ3pEejlHLEVBQUdoSixpQkFBaUIsU0FBVStHLEVBQVM5SSxPQUFPc29ILFFBQVEsR0FDdER2OUcsRUFBR2hKLGlCQUFpQixjQUFlK0csRUFBUzlJLE9BQU8wb0gsYUFBYSxHQUNoRTM5RyxFQUFHaEosaUJBQWlCLFlBQWErRyxFQUFTOUksT0FBT3lvSCxXQUFXLElBR2hFdEQsRUFBZXZvSCxVQUFVNHBILGlCQUFtQixXQUN4QyxJQUFJejdHLEVBQUs3TSxLQUFLNk0sR0FDVmpDLEVBQVc1SyxLQUFLNEssU0FFaEJtOEcsSUFDQWw2RyxFQUFHN0ksb0JBQW9CLGFBQWM0RyxFQUFTOUksT0FBT3luSCxZQUFZLEdBQ2pFMThHLEVBQUc3SSxvQkFBb0IsV0FBWTRHLEVBQVM5SSxPQUFPbW9ILFVBQVUsR0FDN0RwOUcsRUFBRzdJLG9CQUFvQixZQUFhNEcsRUFBUzlJLE9BQU9nb0gsV0FBVyxJQUduRWo5RyxFQUFHN0ksb0JBQW9CLFlBQWE0RyxFQUFTOUksT0FBT2tvSCxXQUFXLEdBQy9EbjlHLEVBQUc3SSxvQkFBb0IsVUFBVzRHLEVBQVM5SSxPQUFPbW9ILFVBQVUsR0FDNURwOUcsRUFBRzdJLG9CQUFvQixZQUFhNEcsRUFBUzlJLE9BQU9xb0gsV0FBVyxHQUUvRHQ5RyxFQUFHN0ksb0JBQW9CLFFBQVM0RyxFQUFTOUksT0FBT3dvSCxZQUFZLEdBQzVEejlHLEVBQUc3SSxvQkFBb0IsU0FBVTRHLEVBQVM5SSxPQUFPc29ILFFBQVEsR0FDekR2OUcsRUFBRzdJLG9CQUFvQixjQUFlNEcsRUFBUzlJLE9BQU8wb0gsYUFBYSxHQUNuRTM5RyxFQUFHN0ksb0JBQW9CLFlBQWE0RyxFQUFTOUksT0FBT3lvSCxXQUFXLElBSW5FM2hILE9BQU9xK0csZUFBaUJBLEcsZ0JDN2dCNUI7Ozs7Ozs7R0FXUSxFQUFPLENBQUMsUUFBbUIsMEJBQVAsRUFVcEIsU0FBVXJxSCxHQUVkLElBUUkrdUgsRUFBWUMsRUFSWkMsRUFBVWpqSCxPQUNWa2pILEVBQVl2akgsU0FTWndqSCxFQUFVLEdBRVZ2bEcsRUFBUSxTQUFVMXBCLEVBQUcrUCxHQUVyQixJQUFLL1AsRUFBSSxFQUFHQSxFQUFJaXZILEVBQVExcEgsU0FHcEJ3SyxHQURBQSxFQUFLay9HLEVBQVFqdkgsTUFDTGdjLFdBQWFqTSxHQUNDLG9CQWRkLFlBYzJCQSxFQUFHbS9HLEdBQUksR0FDMUNILEVBQTJCLG9CQWhCckIsVUFnQmdDaC9HLEVBQUdvL0csR0FBSSxHQUM3Q0osRUFBMkIsb0JBbEJuQixZQWtCZ0NoL0csRUFBR3EvRyxHQUFJLEdBT25ELElBREFILEVBQVUsR0FBR3JySCxNQUFNekQsS0FBSzZ1SCxFQUFVcGdILHVCQUF1QixlQUNwRDVPLEVBQUksRUFBR0EsRUFBSWl2SCxFQUFRMXBILFNBRXBCLFNBQVd3SyxFQUFJcy9HLEVBQWFDLEVBQWFDLEVBQVFmLEVBQVVnQixJQUV0REEsRUFBT3ovRyxFQUFHaU0sV0FBYWpNLEdBQW9CLGlCQTNCeEMsWUE2QkF5L0csRUFBS04sR0FBSyxTQUFVeDBHLEdBRVgzSyxFQUFHeWpCLGFBQWEsZ0JBQWtCdzdGLEVBQVVTLGlCQUFpQi8wRyxFQUFFZzFHLE1BQU9oMUcsRUFBRWkxRyxTQUFXSCxJQUVwRkQsRUFBUyxFQUNURixFQUFjMzBHLEVBQUVxTSxRQUNoQnVvRyxFQUFjNTBHLEVBQUVzTSxRQUVoQnRNLEVBQUU2RSxtQkFFUCxHQUdQd3ZHLEVBQXdCLGlCQTNDdEIsVUEyQ2lDUyxFQUFLTCxHQUFLLFdBRXJDSSxFQUFTLEdBQ1YsR0FFUFIsRUFBd0IsaUJBakRwQixZQWlEaUNTLEVBQUtKLEdBQUssU0FBVTEwRyxHQUU3QzYwRyxLQUVDZixFQUFXeitHLEVBQUd5K0csVUFBWXorRyxHQUFJZytHLFlBQzNCYyxHQUFlUSxHQUFlQSxFQUFjMzBHLEVBQUVxTSxTQUNsRHluRyxFQUFTUixXQUNMYyxHQUFlUSxHQUFlQSxFQUFjNTBHLEVBQUVzTSxTQUM5Q2pYLElBQU9pL0csRUFBVXJ6RyxRQUVoQjZ5RyxFQUFXUSxFQUFVcnJCLGlCQUFpQm9xQixZQUFjYyxFQUNyREwsRUFBU1IsV0FBYWMsS0FHL0IsR0FwQ1gsQ0FxQ0dHLEVBQVFqdkgsT0FLVSxhQUF6Qmd2SCxFQUFVWSxXQUVWbG1HLElBSUFxbEcsRUFBd0IsaUJBQUUsT0FBUXJsRyxFQUFPLEdBRzdDNXBCLEVBQVE0cEIsTUFBUUEsRUFDaEI1ZCxPQUFPK2pILGdCQUFrQm5tRyxJQTdGTSxnQyxnQkNzUW5DM3BCLEVBQU9ELFFBM1FQLFNBQWUwbUUsR0FxRGQsU0FBU3NwRCxFQUFZbGEsR0FDcEIsSUFBSW1hLEVBRUFDLEVBQ0FDLEVBRkFDLEVBQWlCLEtBSXJCLFNBQVN4ZCxLQUFTbndHLEdBRWpCLElBQUttd0csRUFBTXlkLFFBQ1YsT0FHRCxNQUFNbHlGLEVBQU95MEUsRUFHUDc5RSxFQUFPL3hCLE9BQU8sSUFBSXc2QixNQUNsQjh5RixFQUFLdjdGLEdBQVFrN0YsR0FBWWw3RixHQUMvQm9KLEVBQUtnUCxLQUFPbWpGLEVBQ1pueUYsRUFBSytpQixLQUFPK3VFLEVBQ1o5eEYsRUFBS3BKLEtBQU9BLEVBQ1prN0YsRUFBV2w3RixFQUVYdHlCLEVBQUssR0FBS3V0SCxFQUFZTyxPQUFPOXRILEVBQUssSUFFWCxpQkFBWkEsRUFBSyxJQUVmQSxFQUFLOEMsUUFBUSxNQUlkLElBQUlpRCxFQUFRLEVBQ1ovRixFQUFLLEdBQUtBLEVBQUssR0FBRzJYLFFBQVEsZ0JBQWlCLENBQUN4RixFQUFPbWIsS0FFbEQsR0FBYyxPQUFWbmIsRUFDSCxNQUFPLElBRVJwTSxJQUNBLE1BQU1nb0gsRUFBWVIsRUFBWW5aLFdBQVc5bUYsR0FDekMsR0FBeUIsbUJBQWR5Z0csRUFBMEIsQ0FDcEMsTUFBTXptRyxFQUFNdG5CLEVBQUsrRixHQUNqQm9NLEVBQVE0N0csRUFBVW53SCxLQUFLODlCLEVBQU1wVSxHQUc3QnRuQixFQUFLd3BDLE9BQU96akMsRUFBTyxHQUNuQkEsSUFFRCxPQUFPb00sSUFJUm83RyxFQUFZcGEsV0FBV3YxRyxLQUFLODlCLEVBQU0xN0IsSUFFcEIwN0IsRUFBS2pHLEtBQU84M0YsRUFBWTkzRixLQUNoQzUxQixNQUFNNjdCLEVBQU0xN0IsR0FpQ25CLE9BOUJBbXdHLEVBQU1rRCxVQUFZQSxFQUNsQmxELEVBQU1pRCxVQUFZbWEsRUFBWW5hLFlBQzlCakQsRUFBTTFpRyxNQUFROC9HLEVBQVlTLFlBQVkzYSxHQUN0Q2xELEVBQU1uWSxPQUFTQSxFQUNmbVksRUFBTTFuRixRQUFVOGtHLEVBQVk5a0csUUFFNUJ0cUIsT0FBT0MsZUFBZSt4RyxFQUFPLFVBQVcsQ0FDdkM5eEcsWUFBWSxFQUNadUksY0FBYyxFQUNkdEksSUFBSyxJQUNtQixPQUFuQnF2SCxFQUNJQSxHQUVKRixJQUFvQkYsRUFBWTlaLGFBQ25DZ2EsRUFBa0JGLEVBQVk5WixXQUM5QmlhLEVBQWVILEVBQVlLLFFBQVF2YSxJQUc3QnFhLEdBRVI5b0gsSUFBS2tuQixJQUNKNmhHLEVBQWlCN2hHLEtBS2EsbUJBQXJCeWhHLEVBQVk3c0gsTUFDdEI2c0gsRUFBWTdzSCxLQUFLeXZHLEdBR1hBLEVBR1IsU0FBU25ZLEVBQU9xYixFQUFXNGEsR0FDMUIsTUFBTUMsRUFBV1gsRUFBWTVzSCxLQUFLMHlHLGdCQUFrQyxJQUFkNGEsRUFBNEIsSUFBTUEsR0FBYTVhLEdBRXJHLE9BREE2YSxFQUFTejRGLElBQU05MEIsS0FBSzgwQixJQUNieTRGLEVBeUZSLFNBQVNDLEVBQVlsaEcsR0FDcEIsT0FBT0EsRUFBT2hVLFdBQ1p1TixVQUFVLEVBQUd5RyxFQUFPaFUsV0FBV2pXLE9BQVMsR0FDeEMyVSxRQUFRLFVBQVcsS0EyQnRCLE9BdlFBNDFHLEVBQVlwZCxNQUFRb2QsRUFDcEJBLEVBQVlubEgsUUFBVW1sSCxFQUN0QkEsRUFBWU8sT0FvUFosU0FBZ0J4bUcsR0FDZixHQUFJQSxhQUFlbmtCLE1BQ2xCLE9BQU9ta0IsRUFBSThELE9BQVM5RCxFQUFJbGlCLFFBRXpCLE9BQU9raUIsR0F2UFJpbUcsRUFBWWEsUUF3TFosV0FDQyxNQUFNM2EsRUFBYSxJQUNmOFosRUFBWWxzRixNQUFNanZCLElBQUkrN0csTUFDdEJaLEVBQVljLE1BQU1qOEcsSUFBSSs3RyxHQUFhLzdHLElBQUlpaEcsR0FBYSxJQUFNQSxJQUM1RGx5RixLQUFLLEtBRVAsT0FEQW9zRyxFQUFZZSxPQUFPLElBQ1o3YSxHQTdMUjhaLEVBQVllLE9Bc0paLFNBQWdCN2EsR0FPZixJQUFJaDJHLEVBTko4dkgsRUFBWS9aLEtBQUtDLEdBQ2pCOFosRUFBWTlaLFdBQWFBLEVBRXpCOFosRUFBWWxzRixNQUFRLEdBQ3BCa3NGLEVBQVljLE1BQVEsR0FHcEIsTUFBTS8vRixHQUErQixpQkFBZm1sRixFQUEwQkEsRUFBYSxJQUFJbmxGLE1BQU0sVUFDakVocEIsRUFBTWdwQixFQUFNdHJCLE9BRWxCLElBQUt2RixFQUFJLEVBQUdBLEVBQUk2SCxFQUFLN0gsSUFDZjZ3QixFQUFNN3dCLEtBT1csT0FGdEJnMkcsRUFBYW5sRixFQUFNN3dCLEdBQUdrYSxRQUFRLE1BQU8sUUFFdEIsR0FDZDQxRyxFQUFZYyxNQUFNdHJILEtBQUssSUFBSWlxQixPQUFPLElBQU15bUYsRUFBV3B5RyxNQUFNLEdBQUssTUFFOURrc0gsRUFBWWxzRixNQUFNdCtCLEtBQUssSUFBSWlxQixPQUFPLElBQU15bUYsRUFBYSxRQTNLeEQ4WixFQUFZSyxRQXNNWixTQUFpQjV2SCxHQUNoQixHQUE4QixNQUExQkEsRUFBS0EsRUFBS2dGLE9BQVMsR0FDdEIsT0FBTyxFQUdSLElBQUl2RixFQUNBNkgsRUFFSixJQUFLN0gsRUFBSSxFQUFHNkgsRUFBTWlvSCxFQUFZYyxNQUFNcnJILE9BQVF2RixFQUFJNkgsRUFBSzdILElBQ3BELEdBQUk4dkgsRUFBWWMsTUFBTTV3SCxHQUFHa0ssS0FBSzNKLEdBQzdCLE9BQU8sRUFJVCxJQUFLUCxFQUFJLEVBQUc2SCxFQUFNaW9ILEVBQVlsc0YsTUFBTXIrQixPQUFRdkYsRUFBSTZILEVBQUs3SCxJQUNwRCxHQUFJOHZILEVBQVlsc0YsTUFBTTVqQyxHQUFHa0ssS0FBSzNKLEdBQzdCLE9BQU8sRUFJVCxPQUFPLEdBek5SdXZILEVBQVlqYSxTQUFXLEVBQVEsSUFDL0JpYSxFQUFZOWtHLFFBMFBaLFdBQ0NubEIsUUFBUUMsS0FBSywwSUF6UGRwRixPQUFPaUksS0FBSzY5RCxHQUFLejNELFFBQVF4TixJQUN4QnV1SCxFQUFZdnVILEdBQU9pbEUsRUFBSWpsRSxLQU94QnV1SCxFQUFZbHNGLE1BQVEsR0FDcEJrc0YsRUFBWWMsTUFBUSxHQU9wQmQsRUFBWW5aLFdBQWEsR0FrQnpCbVosRUFBWVMsWUFWWixTQUFxQjNhLEdBQ3BCLElBQUk5cUYsRUFBTyxFQUVYLElBQUssSUFBSTlxQixFQUFJLEVBQUdBLEVBQUk0MUcsRUFBVXJ3RyxPQUFRdkYsSUFDckM4cUIsR0FBU0EsR0FBUSxHQUFLQSxFQUFROHFGLEVBQVVwdEYsV0FBV3hvQixHQUNuRDhxQixHQUFRLEVBR1QsT0FBT2dsRyxFQUFZcFosT0FBT3JyRyxLQUFLdUksSUFBSWtYLEdBQVFnbEcsRUFBWXBaLE9BQU9ueEcsU0E0Ti9EdXFILEVBQVllLE9BQU9mLEVBQVk3aEgsUUFFeEI2aEgsSSxjQzFRUixJQUFJL3RILEVBQUksSUFDSjNCLEVBQUkyQixJQUNKeTFDLEVBQVEsR0FBSnAzQyxFQUNKRSxFQUFRLEdBQUprM0MsRUF1SlIsU0FBU3M1RSxFQUFPVixFQUFJVyxFQUFPdHZILEVBQUdsQixHQUM1QixJQUFJeXdILEVBQVdELEdBQWEsSUFBSnR2SCxFQUN4QixPQUFPNEosS0FBS2tWLE1BQU02dkcsRUFBSzN1SCxHQUFLLElBQU1sQixHQUFReXdILEVBQVcsSUFBTSxJQXZJN0RqeEgsRUFBT0QsUUFBVSxTQUFTK3BCLEVBQUs5SSxHQUM3QkEsRUFBVUEsR0FBVyxHQUNyQixJQUFJamMsU0FBYytrQixFQUNsQixHQUFhLFdBQVQva0IsR0FBcUIra0IsRUFBSXRrQixPQUFTLEVBQ3BDLE9Ba0JKLFNBQWU0akIsR0FFYixJQURBQSxFQUFNeGpCLE9BQU93akIsSUFDTDVqQixPQUFTLElBQ2YsT0FFRixJQUFJbVAsRUFBUSxtSUFBbUk0d0IsS0FDN0luYyxHQUVGLElBQUt6VSxFQUNILE9BRUYsSUFBSWpULEVBQUk2dEIsV0FBVzVhLEVBQU0sSUFFekIsUUFEWUEsRUFBTSxJQUFNLE1BQU11SSxlQUU1QixJQUFLLFFBQ0wsSUFBSyxPQUNMLElBQUssTUFDTCxJQUFLLEtBQ0wsSUFBSyxJQUNILE9BekRFM2MsU0F5REttQixFQUNULElBQUssUUFDTCxJQUFLLE9BQ0wsSUFBSyxJQUNILE9BOURFbkIsT0E4REttQixFQUNULElBQUssT0FDTCxJQUFLLE1BQ0wsSUFBSyxJQUNILE9BQU9BLEVBQUluQixFQUNiLElBQUssUUFDTCxJQUFLLE9BQ0wsSUFBSyxNQUNMLElBQUssS0FDTCxJQUFLLElBQ0gsT0FBT21CLEVBQUkrMUMsRUFDYixJQUFLLFVBQ0wsSUFBSyxTQUNMLElBQUssT0FDTCxJQUFLLE1BQ0wsSUFBSyxJQUNILE9BQU8vMUMsRUFBSXJCLEVBQ2IsSUFBSyxVQUNMLElBQUssU0FDTCxJQUFLLE9BQ0wsSUFBSyxNQUNMLElBQUssSUFDSCxPQUFPcUIsRUFBSU0sRUFDYixJQUFLLGVBQ0wsSUFBSyxjQUNMLElBQUssUUFDTCxJQUFLLE9BQ0wsSUFBSyxLQUNILE9BQU9OLEVBQ1QsUUFDRSxRQXZFSzJNLENBQU15YixHQUNSLEdBQWEsV0FBVC9rQixHQUFxQnk0QixTQUFTMVQsR0FDdkMsT0FBTzlJLEVBQVFrd0csS0EwR25CLFNBQWlCYixHQUNmLElBQUlXLEVBQVExbEgsS0FBS3VJLElBQUl3OEcsR0FDckIsR0FBSVcsR0FBU3p3SCxFQUNYLE9BQU93d0gsRUFBT1YsRUFBSVcsRUFBT3p3SCxFQUFHLE9BRTlCLEdBQUl5d0gsR0FBU3Y1RSxFQUNYLE9BQU9zNUUsRUFBT1YsRUFBSVcsRUFBT3Y1RSxFQUFHLFFBRTlCLEdBQUl1NUUsR0FBUzN3SCxFQUNYLE9BQU8wd0gsRUFBT1YsRUFBSVcsRUFBTzN3SCxFQUFHLFVBRTlCLEdBQUkyd0gsR0FBU2h2SCxFQUNYLE9BQU8rdUgsRUFBT1YsRUFBSVcsRUFBT2h2SCxFQUFHLFVBRTlCLE9BQU9xdUgsRUFBSyxNQXhIWWMsQ0FBUXJuRyxHQWlGbEMsU0FBa0J1bUcsR0FDaEIsSUFBSVcsRUFBUTFsSCxLQUFLdUksSUFBSXc4RyxHQUNyQixHQUFJVyxHQUFTendILEVBQ1gsT0FBTytLLEtBQUtrVixNQUFNNnZHLEVBQUs5dkgsR0FBSyxJQUU5QixHQUFJeXdILEdBQVN2NUUsRUFDWCxPQUFPbnNDLEtBQUtrVixNQUFNNnZHLEVBQUs1NEUsR0FBSyxJQUU5QixHQUFJdTVFLEdBQVMzd0gsRUFDWCxPQUFPaUwsS0FBS2tWLE1BQU02dkcsRUFBS2h3SCxHQUFLLElBRTlCLEdBQUkyd0gsR0FBU2h2SCxFQUNYLE9BQU9zSixLQUFLa1YsTUFBTTZ2RyxFQUFLcnVILEdBQUssSUFFOUIsT0FBT3F1SCxFQUFLLEtBL0YyQmUsQ0FBU3RuRyxHQUVoRCxNQUFNLElBQUlua0IsTUFDUix3REFDRXlJLEtBQUtNLFVBQVVvYixNLCtGQ25DckIsY0FHQSxRQUdBLE9BQ0EsT0FxT3VCLEVBQUFsZixRQWhPdkIsTUFjRSxZQUFhOEcsRUFBb0IyL0csRUFBNkI3VixHQUM1RHI0RyxLQUFLdU8sU0FBV0EsRUFDaEJ2TyxLQUFLOFksVUFBWXZRLFNBQVNDLGVBQWUsYUFDekN4SSxLQUFLZ2tILGdCQUFrQixJQUFJeGdILE1BQU0sR0FFakN4RCxLQUFLdVMsTUFBUWhLLFNBQVM2akcsZ0JBQWdCLDZCQUE4QixPQUNwRXBzRyxLQUFLdVMsTUFBTXpLLEdBQUssWUFDaEI5SCxLQUFLdVMsTUFBTWhHLGFBQWEsU0FBVTNELE9BQU8rN0csWUFBWXJzRyxZQUNyRHRZLEtBQUt1UyxNQUFNaEcsYUFBYSxRQUFTLFFBRWpDdk0sS0FBSzZhLEdBQUt0UyxTQUFTNmpHLGdCQUFnQiw2QkFBOEIsU0FDakVwc0csS0FBSzZhLEdBQUcvUyxHQUFLLFFBQ2I5SCxLQUFLNmEsR0FBRzVSLFVBQVVDLElBQUksY0FDdEJsSixLQUFLNmEsR0FBR3RPLGFBQWEsSUFBSyxLQUMxQnZNLEtBQUs2YSxHQUFHdE8sYUFBYSxJQUFLLEtBRTFCLE1BQU1tNEIsRUFBUyxJQUFJQyxXQUNuQjBQLE1BQU1na0UsR0FBTzFoRyxLQUFLMkksSUFDaEIsR0FBSUEsRUFBTytjLEdBdUJULE9BdEJBcUksRUFBTzdnQyxpQkFBaUIsT0FBUSxLQUM5QjdELEtBQUs2YSxHQUFHc3pHLGVBQWUsK0JBQWdDLE9BQVF6cEYsRUFBT3BsQixPQUFPaEgsWUFDN0UsTUFBTWpKLEVBQU9yUCxLQUFLNmEsR0FBRzhKLFVBQ3JCLElBQUsza0IsS0FBS3VTLE1BQU0rZCxhQUFhLFdBQVksQ0FZdkMsSUFBSSxRQUFFM2xCLElBQVksSUFBQWlSLGVBQ2JqUixJQUNIQSxFQUFVLE9BQVMwRSxFQUFLd1YsTUFBTXZNLFdBQWEsSUFBTWpKLEVBQUt5VixPQUFPeE0sWUFFL0R0WSxLQUFLdVMsTUFBTWhHLGFBQWEsVUFBVzVCLE1BR2hDMlUsRUFBT21sQixTQUVmOXRCLEtBQUs4dEIsSUFDTkMsRUFBT3MxRSxjQUFjdjFFLEtBSXZCemtDLEtBQUtzN0csSUFBTS95RyxTQUFTNmpHLGdCQUFnQix3QkFBeUIsT0FDN0Rwc0csS0FBS3M3RyxJQUFJeHpHLEdBQUssYUFDZDlILEtBQUtzN0csSUFBSXJ5RyxVQUFVQyxJQUFJLGlCQUFrQixlQUV6Q2xKLEtBQUt1UyxNQUFNMGpCLFlBQVlqMkIsS0FBSzZhLElBQzVCN2EsS0FBS3VTLE1BQU0wakIsWUFBWWoyQixLQUFLczdHLEtBQzVCdDdHLEtBQUs4WSxVQUFVbWQsWUFBWWoyQixLQUFLdVMsT0FFaEN2UyxLQUFLNmIsWUFBYyxJQUFJLFVBQ3ZCN2IsS0FBS3VrSCxhQUFlLElBQUkySixFQUFNbHVILEtBQU0saUJBQWtCLGFBQWNBLEtBQUs2YixhQUV6RTdiLEtBQUsyNUcsUUFBVXRCLEVBRWY5dkcsU0FBU0MsZUFBZSxXQUFXYSxNQUFNQyxRQUFVLE9BR3JELFlBQ0V0SixLQUFLNGxILHVCQUNMNWxILEtBQUt1a0gsYUFBYWdDLHNCQU9wQixVQUFXakwsR0FDVHQ3RyxLQUFLdVMsTUFBTTY3RyxhQUFhOVMsRUFBS3Q3RyxLQUFLczdHLEtBQ2xDdDdHLEtBQUtzN0csSUFBTUEsRUFDWHQ3RyxLQUFLczdHLElBQUl4ekcsR0FBSyxhQUNkOUgsS0FBS3M3RyxJQUFJcnlHLFVBQVVDLElBQUksaUJBQWtCLGVBQ3pDLE1BQU00YixFQUFTMUksU0FBU3BjLEtBQUtzN0csSUFBSS9wRyxhQUFhLFdBQ3hDc1QsRUFBUXpJLFNBQVNwYyxLQUFLczdHLElBQUkvcEcsYUFBYSxVQUU3Q3ZSLEtBQUs2YSxHQUFHdE8sYUFBYSxTQUFVdVksRUFBT3hNLFlBQ3RDdFksS0FBSzZhLEdBQUd0TyxhQUFhLFFBQVNzWSxFQUFNdk0sWUFFcEMsTUFBTSxRQUFFM04sSUFBWSxJQUFBaVIsZUFDZmpSLEVBR0gzSyxLQUFLdVMsTUFBTWhHLGFBQWEsVUFBVzVCLEdBRm5DM0ssS0FBS3VTLE1BQU1oRyxhQUFhLFVBQVcsT0FBU3NZLEVBQVEsSUFBTUMsSUFJNUQsSUFBQTFYLG1CQUNBcE4sS0FBS3F1SCx1QkFDTHJ1SCxLQUFLZ2tILGdCQUFnQm40RyxRQUFRdXZCLEdBQVlBLEtBTzNDLGlCQUFrQmt6RixFQUFlQyxHQUMvQixNQUFNalQsUUFBWXQ3RyxLQUFLdU8sU0FBUzgyRyxXQUFXcmxILEtBQUsyTyxxQkFDaEQzTyxLQUFLc2xILFVBQVVoSyxHQU9qQixrQkFBbUI1eUYsR0FDakIxb0IsS0FBS2drSCxnQkFBZ0I1aEgsS0FBS3NtQixHQU81QixxQkFBc0JBLEdBQ3BCLE1BQU10akIsRUFBUXBGLEtBQUtna0gsZ0JBQWdCeDRCLFVBQVd2OUUsR0FDckNBLElBQVN5YSxJQUVILElBQVh0akIsR0FDRnBGLEtBQUtna0gsZ0JBQWdCbjdFLE9BQU96akMsRUFBTyxHQU92Qyx1QkFDRXBGLEtBQUt1a0gsYUFBYTFvRyxZQUFZMnlHLHlCQUM5QixJQUFBcjBHLDhCQUNBLElBQUFNLDBCQU1GLGlCQUNFLE9BQU8sRUFNVCxvQkFDRSxPQUFPemEsS0FBSzI1RyxRQU1kLHVCQUNFcHhHLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFVBQVkyWCxJQUN6QyxPQUFRQSxFQUFJbmQsS0FDVixJQUFLLFFBQ0hzTyxFQUFHbUIsT0FBTyxjQUFjL00sR0FBRyxRQUFTLE1BQ3BDNEwsRUFBR21CLE9BQU8sY0FBYzdRLEtBQ3RCMFAsRUFBR2tqQixPQUFPOXVCLEdBQUcsUUFBU2YsS0FBS3VrSCxhQUFhMW9HLFlBQVl3dEYsVUFBVS9xRyxLQUFLMEIsS0FBS3VrSCxhQUFhMW9HLGNBQ2xGOWEsR0FBRyxPQUFRZixLQUFLdWtILGFBQWExb0csWUFBWXFVLFNBQVM1eEIsS0FBSzBCLEtBQUt1a0gsYUFBYTFvRyxlQUU5RSxNQUNGLElBQUssSUFDSHRULFNBQVNDLGVBQWUsY0FBYytELGFBQWEsYUFBYyxhQUt2RWhFLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFFBQVUyWCxJQUN2QyxPQUFRQSxFQUFJbmQsS0FDVixJQUFLLFFBQ0hzTyxFQUFHbUIsT0FBTyxjQUFjL00sR0FBRyxRQUFTLE1BQ0EsV0FBaENmLEtBQUt1TyxTQUFTaTVGLGVBQ2hCeG5HLEtBQUt1TyxTQUFTb3FHLFVBQVU4VixxQkFFMUIsTUFDRixJQUFLLElBQ0hsbUgsU0FBU0MsZUFBZSxjQUFjK0QsYUFBYSxhQUFjLGNBTXZFSSxFQUFHbUIsT0FBTyxjQUFjL00sR0FBRyxhQUFjLEtBQ1AsSUFBNUI0TCxFQUFHbWpCLE1BQU02NUYsUUFBUXRuSCxTQUNuQnJDLEtBQUt1a0gsYUFBYTFvRyxZQUFZd3RGLFlBQzlCMThGLEVBQUdtQixPQUFPLGNBQWMvTSxHQUFHLFlBQWFmLEtBQUt1a0gsYUFBYTFvRyxZQUFZcVUsU0FBUzV4QixLQUFLMEIsS0FBS3VrSCxhQUFhMW9HLGNBQ3RHbFAsRUFBR21CLE9BQU8sY0FBYy9NLEdBQUcsV0FBWSxLQUNyQzRMLEVBQUdtQixPQUFPLGNBQWMvTSxHQUFHLFlBQWEsV0FJOUM0TCxFQUFHbUIsT0FBTyxjQUFjL00sR0FBRyxRQUFTZixLQUFLdWtILGFBQWExb0csWUFBWTZ5RyxXQUFXcHdILEtBQUswQixLQUFLdWtILGFBQWExb0csY0FBYyxHQUVsSGpULE9BQU84N0csU0FBVyxLQUNoQixNQUFNaUssRUFBWS9sSCxPQUFPKzdHLFlBQ25CN3JHLEVBQVl2USxTQUFTQyxlQUFlLGFBQ3RDbW1ILEVBQVkvdUgsT0FBT2taLEVBQVV2SCxhQUFhLFlBQzVDdUgsRUFBVXZNLGFBQWEsU0FBVW9pSCxFQUFVcjJHLGFBUWpELGNBQ0UsT0FBT3RZLEtBQUt1TyxTQUFTbFIsUSx1SEN4T3pCLGFBQ0EsT0FFQSxNQUFhdXhILEVBZVgsWUFBYUMsRUFBb0JDLEdBQy9COXVILEtBQUsrdUgsS0FBTyxFQUNaL3VILEtBQUtndkgsS0FBTyxFQUNaaHZILEtBQUs2a0IsTUFBUWdxRyxFQUNiN3VILEtBQUs4a0IsT0FBU2dxRyxFQUVkOXVILEtBQUs2dUgsV0FBYUEsRUFDbEI3dUgsS0FBSzh1SCxZQUFjQSxFQVVyQixJQUFLQyxFQUFjQyxFQUFjbnFHLEVBQWVDLEdBQzlDOWtCLEtBQUsrdUgsS0FBT0EsRUFDWi91SCxLQUFLZ3ZILEtBQU9BLEVBQ1podkgsS0FBSzZrQixNQUFRQSxFQUNiN2tCLEtBQUs4a0IsT0FBU0EsRUFJaEIsTUFDRSxPQUFPOWtCLEtBQUsrdUgsS0FBS3oyRyxXQUFhLElBQU10WSxLQUFLZ3ZILEtBQUsxMkcsV0FBYSxJQUN6RHRZLEtBQUs2a0IsTUFBUSxJQUFNN2tCLEtBQUs4a0IsT0FJNUIsT0FBUUcsR0FDTixNQUFNZ3FHLEVBQWNqdkgsS0FBSzh1SCxZQUFjN3BHLEVBQ2pDaXFHLEVBQWFsdkgsS0FBSzZ1SCxXQUFhNXBHLEVBRXJDamxCLEtBQUs2a0IsTUFBUXFxRyxFQUNibHZILEtBQUs4a0IsT0FBU21xRyxFQUloQixVQUNFLE9BQU9qdkgsS0FBSzZ1SCxXQUFhN3VILEtBQUs2a0IsTUFRaEMsVUFBVzRMLEVBQWVDLEdBQ3hCMXdCLEtBQUsrdUgsTUFBUXQrRixFQUNiendCLEtBQUtndkgsTUFBUXQrRixHQWxFakIsWUFzRUEsTUFBYXkrRixFQVFYLGdCQUFpQkMsR0FBZ0IsR0FDL0IsTUFBTUMsRUFBUTltSCxTQUFTQyxlQUFlLFNBQ3RDeEksS0FBSzJLLFFBQVUsSUFBSWlrSCxFQUFReHlHLFNBQVNpekcsRUFBTTk5RyxhQUFhLFVBQVc2SyxTQUFTaXpHLEVBQU05OUcsYUFBYSxZQUUxRjY5RyxJQUNGcHZILEtBQUtzdkgsb0JBQ0wsSUFBQWgxRyxhQUFZLENBQUV6USxLQUFNLE9BT3hCLE9BQVFvYixHQUNOamxCLEtBQUt1dkgsYUFDTHZ2SCxLQUFLMkssUUFBUXFSLE9BQU9pSixHQUNwQmpsQixLQUFLc3ZILG9CQUVMLElBQUFoMUcsYUFBWSxDQUFFelEsS0FBTTFCLEtBQUswMUQsTUFBVSxJQUFKNTRDLEtBUWpDLFVBQVd3TCxFQUFlQyxHQUN4QjF3QixLQUFLdXZILGFBQ0x2dkgsS0FBSzJLLFFBQVE2a0gsVUFBVS8rRixFQUFPQyxHQUM5QjF3QixLQUFLc3ZILG1CQU1QLDZCQUN1QnB1SCxJQUFqQmxCLEtBQUsySyxRQUNQM0ssS0FBS2ljLGlCQUFnQixHQUVyQmpjLEtBQUtzdkgsbUJBT1QsYUFDRSxRQUFxQnB1SCxJQUFqQmxCLEtBQUsySyxRQUF1QixDQUM5QixNQUFNMGtILEVBQVE5bUgsU0FBU0MsZUFBZSxTQUN0Q3hJLEtBQUsySyxRQUFVLElBQUlpa0gsRUFBUXh5RyxTQUFTaXpHLEVBQU05OUcsYUFBYSxVQUFXNkssU0FBU2l6RyxFQUFNOTlHLGFBQWEsWUFFaEcsTUFBTWsrRyxFQUFhbG5ILFNBQVNDLGVBQWUsYUFDeEMrSSxhQUFhLFdBQ2JvYyxNQUFNLEtBQ1QzdEIsS0FBSzJLLFFBQVExRyxJQUNYbVksU0FBU3F6RyxFQUFXLElBQ3BCcnpHLFNBQVNxekcsRUFBVyxJQUNwQnJ6RyxTQUFTcXpHLEVBQVcsSUFDcEJyekcsU0FBU3F6RyxFQUFXLEtBT3hCLG1CQUNFLE1BQU1DLEVBQWdCMXZILEtBQUsySyxRQUFRaE4sTUFDbkM0SyxTQUFTQyxlQUFlLGFBQWErRCxhQUFhLFVBQVdtakgsSUFDN0QsSUFBQXAxRyxhQUFZLENBQUUzUCxRQUFTK2tILElBR3pCLFlBQ0UsTUFBTW45RyxFQUFRaEssU0FBU0MsZUFBZSxhQUN0Q3hJLEtBQUsydkgsZ0JBQWtCcDlHLEVBQU1xOUcsaUJBQ1AsZUFBbEJqakgsRUFBR21qQixNQUFNbHVCLE1BRVg1QixLQUFLMnZILGdCQUFnQnA4RyxFQUFJNUcsRUFBR21qQixNQUFNNjVGLFFBQVEsR0FBR25oQixRQUM3Q3hvRyxLQUFLMnZILGdCQUFnQmg4RyxFQUFJaEgsRUFBR21qQixNQUFNNjVGLFFBQVEsR0FBR2xoQixVQUc3Q3pvRyxLQUFLMnZILGdCQUFnQnA4RyxFQUFJNUcsRUFBR21qQixNQUFNdmMsRUFDbEN2VCxLQUFLMnZILGdCQUFnQmg4RyxFQUFJaEgsRUFBR21qQixNQUFNbmMsR0FHcEMzVCxLQUFLNnZILE9BQVN0OUcsRUFBTTRSLGVBQWVDLFVBR3JDLFdBQ0UsTUFBTTdSLEVBQVFoSyxTQUFTQyxlQUFlLGFBQ2hDc25ILEVBQWlCdjlHLEVBQU1xOUcsaUJBRVAsY0FBbEJqakgsRUFBR21qQixNQUFNbHVCLE1BQ1hrdUgsRUFBZXY4RyxFQUFJNUcsRUFBR21qQixNQUFNNjVGLFFBQVEsR0FBR25oQixRQUN2Q3NuQixFQUFlbjhHLEVBQUloSCxFQUFHbWpCLE1BQU02NUYsUUFBUSxHQUFHbGhCLFNBQ1osVUFBbEI5N0YsRUFBR21qQixNQUFNbHVCLE9BQTBDLElBQXRCK0ssRUFBR21qQixNQUFNMjJFLGVBQzNCdmxHLElBQWhCbEIsS0FBSzZ2SCxTQUNQN3ZILEtBQUs2dkgsT0FBU3Q5RyxFQUFNNFIsZUFBZUMsZ0JBRVJsakIsSUFBekJsQixLQUFLMnZILGtCQUNQM3ZILEtBQUsydkgsZ0JBQWtCcDlHLEVBQU1xOUcsa0JBRS9CNXZILEtBQUsydkgsZ0JBQWdCcDhHLEVBQUk1RyxFQUFHbWpCLE1BQU12YyxFQUNsQ3ZULEtBQUsydkgsZ0JBQWdCaDhHLEVBQUloSCxFQUFHbWpCLE1BQU1uYyxFQUNsQ204RyxFQUFldjhHLEVBQUl2VCxLQUFLMnZILGdCQUFnQnA4RyxFQUFJNUcsRUFBR21qQixNQUFNaWdHLE9BQ3JERCxFQUFlbjhHLEVBQUkzVCxLQUFLMnZILGdCQUFnQmg4RyxFQUFJaEgsRUFBR21qQixNQUFNa2dHLE9BQ3JEcmpILEVBQUdtakIsTUFBTXpULG1CQUVUeXpHLEVBQWV2OEcsRUFBSTVHLEVBQUdtakIsTUFBTXZjLEVBQzVCdThHLEVBQWVuOEcsRUFBSWhILEVBQUdtakIsTUFBTW5jLEdBRTlCLE1BQU1zOEcsRUFBZUgsRUFBZTVyRyxnQkFBZ0Jsa0IsS0FBSzZ2SCxRQUNuREssRUFBZ0Jsd0gsS0FBSzJ2SCxnQkFBZ0J6ckcsZ0JBQWdCbGtCLEtBQUs2dkgsUUFDaEU3dkgsS0FBS3d2SCxXQUFXUyxFQUFhMThHLEVBQUkyOEcsRUFBYzM4RyxHQUFJMDhHLEVBQWF0OEcsRUFBSXU4RyxFQUFjdjhHLEdBQ2xGM1QsS0FBSzJ2SCxnQkFBa0JHLEVBR3pCLGFBQ0UsR0FBc0IsVUFBbEJuakgsRUFBR21qQixNQUFNbHVCLEtBQWtCLE9BQy9CLElBQUsrSyxFQUFHbWpCLE1BQU0yMkUsU0FFWixZQURBem1HLEtBQUtrd0IsV0FHUCxNQUFNaWdHLEVBQVM1bkgsU0FBU0MsZUFBZSxjQUN2Q3hJLEtBQUt1dkgsYUFFTCxJQUFJYSxFQURNcHdILEtBQUsySyxRQUFRMGxILFVBQ1IxakgsRUFBR21qQixNQUFNaWdHLE9BQVMsSUFDN0JLLEVBQU9oMEcsU0FBUyt6RyxFQUFPNStHLGFBQWEsUUFBVSxNQUFLNitHLEVBQU8sS0FDMURBLEVBQU9oMEcsU0FBUyt6RyxFQUFPNStHLGFBQWEsUUFBVSxNQUFLNitHLEVBQU8sR0FDOURwd0gsS0FBS2djLE9BQU9vMEcsR0FHWkQsRUFBT3B5SCxPQUFnQixJQUFQcXlILEdBQVk5M0csV0FDM0IvUCxTQUFTQyxlQUFlLGNBQW9DekssTUFBUTBFLE9BQU8wRixLQUFLa1YsTUFBYSxJQUFQK3lHLEtBNUkzRixnQkFnSndCLEVBQUEzb0gsUUFBQSxHLCtGQ3pOeEIsY0FDQSxRQUNBLFFBRUEsUUFDQSxRQUNBLFFBRUEsT0FDQSxRQUNBLE9BK0NxQixFQUFBQSxRQTVDckIsTUFJRSxZQUFhOEcsR0FDWHZPLEtBQUt1TyxTQUFXQSxFQUNoQnZPLEtBQUtzd0gsZUFHUCxlQUNFL25ILFNBQVNDLGVBQWUsbUJBQW1CVyxXQUFhNFksRUFBUzVOLG9CQUNqRTVMLFNBQVNDLGVBQWUsaUJBQWlCVyxXQUFhNFksRUFBUzNOLGtCQUMvRDdMLFNBQVNDLGVBQWUscUJBQXFCVyxVQUFZLEVBQUE4c0csY0FFekRqMkcsS0FBS3VOLFlBQWMsSUFBSSxVQUFZdk4sS0FBS3VPLFNBQVUsc0JBQ2xEdk8sS0FBSzJ6RyxjQUFnQixJQUFJLFVBQWMzekcsS0FBS3VPLFNBQVUsdUJBQ3RELElBQUFnaUgsZ0JBQWV2d0gsS0FBSzJ6RyxlQUNwQixNQUFNLFVBQUV2cEcsSUFBYyxJQUFBd1IsZUFDdEJyVCxTQUFTQyxlQUFlNEIsR0FBVzBULFFBQ25DMHlHLEVBQU9DLHVCQUF1Qnp3SCxLQUFLdU8sU0FBVXZPLEtBQUt1TixhQUNsRHZOLEtBQUt5dUgscUJBQ0x6aEgsRUFBYzZVLGFBQWE3aEIsS0FBS3VPLFdBQ2hDLElBQUFtaUgsMEJBQ0FGLEVBQU9HLHFCQUFxQixJQUM1QixJQUFBQyx5QkFDQSxJQUFBQyxpQ0FDQTd3SCxLQUFLdU8sU0FBU0csS0FBS2kxRyxrQkFBa0IzakgsS0FBS3l1SCxtQkFBbUJud0gsS0FBSzBCLE9BT3BFLGNBQ0UsTUFBTSxTQUFFa0ssSUFBYSxJQUFBMFIsZUFDckIsT0FBTzFSLEVBR1QscUJBQ0VzbUgsRUFBT00sWUFBWSx5RkFDbkJOLEVBQU9PLFdBQVcsdUIsK0ZDckR0QixjQUNBLFFBQ0EsUUFDQSxRQUNBLFFBRUEsUUFDQSxRQUVBLE9BQ0EsUUFDQSxRQUNBLE9BNkQyQixFQUFBdHBILFFBdEQzQixNQVFFLFlBQWE4RyxHQUNYdk8sS0FBS3VPLFNBQVdBLEVBQ2hCdk8sS0FBS3N3SCxlQU1QLGdCQUVFLElBQUFVLFlBQVdoeEgsS0FBS3VPLFVBQ2hCaEcsU0FBU0MsZUFBZSxtQkFBbUJXLFdBQWE0WSxFQUFTNU4sb0JBQ2pFNUwsU0FBU0MsZUFBZSxpQkFBaUJXLFdBQWE0WSxFQUFTM04sa0JBQy9EN0wsU0FBU0MsZUFBZSxxQkFBcUJXLFVBQVksRUFBQThzRyxjQUV6RGoyRyxLQUFLdU4sWUFBYyxJQUFJLFVBQVl2TixLQUFLdU8sU0FBVSxjQUNsRHZPLEtBQUsyekcsY0FBZ0IsSUFBSSxVQUFjM3pHLEtBQUt1TyxTQUFVLGVBQ3RELElBQUFnaUgsZ0JBQWV2d0gsS0FBSzJ6RyxlQUNwQixNQUFNLFVBQUV2cEcsSUFBYyxJQUFBd1IsZUFDdEJyVCxTQUFTQyxlQUFlNEIsR0FBVzBULFFBQ25DMHlHLEVBQU9DLHVCQUF1Qnp3SCxLQUFLdU8sU0FBVXZPLEtBQUt1TixhQUNsRHZOLEtBQUt5dUgscUJBRUx6aEgsRUFBYzZVLGFBQWE3aEIsS0FBS3VPLFdBQ2hDLElBQUFtaUgsMkJBQ0EsSUFBQUUseUJBQ0EsSUFBQUssbUJBQWtCanhILEtBQUt1TyxXQUN2QixJQUFBOE0sb0JBQW1CLGFBQ25CcmIsS0FBS3VPLFNBQVNHLEtBQUtpMUcsa0JBQWtCM2pILEtBQUt5dUgsbUJBQW1CbndILEtBQUswQixPQU9wRSxjQUNFLE1BQU0sU0FBRWtLLElBQWEsSUFBQTBSLGVBQ3JCLE9BQU8xUixFQUdULHFCQUNFc21ILEVBQU9NLFlBQVksK0NBQ25CTixFQUFPTyxXQUFXLGlCLCtGQ2hFdEIsYUFDQSxRQUtNRyxFQUFjLElBQUl2M0YsSUFDdEIsQ0FBQyxDQUFDLEdBQUksV0FBWSxDQUFDLElBQUssT0FBUSxDQUFDLElBQUssVUFBVyxDQUFDLEtBQU0sYUFBYyxDQUFDLEtBQU0sWUFBYSxDQUFDLEtBQU0sYUFBYyxDQUFDLElBQUssYUFBYyxDQUFDLEtBQU0sYUFDeEksQ0FBQyxLQUFNLFdBQVksQ0FBQyxLQUFNLFlBQWEsQ0FBQyxNQUFPLHFCQUFzQixDQUFDLE1BQU8scUJBQXNCLENBQUMsTUFBTyxtQkFDM0csQ0FBQyxNQUFPLGlCQUFrQixDQUFDLE1BQU8sbUJBQW9CLENBQUMsT0FBUSx1QkFBd0IsQ0FBQyxPQUFRLHlCQWdCcEcsU0FBU3czRixJQUNQLE1BQU1DLEVBQWM3b0gsU0FBU0MsZUFBZSxnQkFDdENpQyxFQUFjbEMsU0FBU0MsZUFBZSxnQkFHNUMsSUFBQThSLGFBQVksQ0FBRTdQLFlBQWFBLEVBQVlnUCxVQUVuQ2hQLEVBQVlnUCxRQUNkMjNHLEVBQVk3a0gsYUFBYSxRQUFTLElBSWxDNmtILEVBQVk3a0gsYUFBYSxRQUFTLGtCQUVwQyxJQUFBOGtILHVCQWNGLFNBQVNDLElBeENhL29ILFNBQVNDLGVBQWUsZ0JBQ2hDVyxVQUNWLHlNQUlGWixTQUFTQyxlQUFlLGdCQUFnQitELGFBQWEsUUFBUyxpQkEwQmhFLFdBQ0UsTUFBTSxZQUFFOUIsSUFBZ0IsSUFBQW1SLGVBQ3hCclQsU0FBU2lILGNBQWdDLGdCQUFnQmlLLFFBQVVoUCxFQVFuRWk1RyxHQUNBeU4sSUFDQTVvSCxTQUFTQyxlQUFlLGVBQWUzRSxpQkFBaUIsUUFBU3N0SCxHQTBUNUMsRUFBQTFwSCxRQXBUdkIsTUFRRSxZQUFhOEcsR0FDWHZPLEtBQUt1TyxTQUFXQSxFQUVoQixNQUFNdW5CLEVBQXNCdnRCLFNBQVNDLGVBQWUsNEJBQzlDK29ILEVBQVFocEgsU0FBU1MsY0FBYyxTQUNyQ3VvSCxFQUFNdG9ILFVBQVVDLElBQUkscUJBQXNCLGtCQUMxQ3FvSCxFQUFNeDZHLFlBQWMsT0FDcEIsTUFBTW9WLEVBQVE1akIsU0FBU1MsY0FBYyxTQUNyQ21qQixFQUFNcmtCLEdBQUssY0FDWHFrQixFQUFNbGpCLFVBQVVDLElBQUksWUFDcEJpakIsRUFBTXZxQixLQUFPLFdBQ2J1cUIsRUFBTTFTLFNBQVUsRUFDaEI4M0csRUFBTXQ3RixZQUFZOUosR0FDbEIySixFQUFvQmowQixRQUFRMHZILEdBRTVCdnhILEtBQUt1TyxTQUFTRyxLQUFLaTFHLGtCQUFrQjNqSCxLQUFLd3hILG1CQUFtQmx6SCxLQUFLMEIsT0FDbEVzeEgsSUFDQXR4SCxLQUFLd3hILHFCQU9QLGdCQUNFLElBQ0VqcEgsU0FBU21ELHVCQUF1QixlQUFlLEdBQzVDRSxpQkFBaUIsK0NBQ2pCQyxRQUFRbTdCLElBQ1BBLEVBQUtuakMsaUJBQWlCLFlBQWNpc0IsSUFDN0JrWCxFQUFLLzlCLFVBQVU4QyxTQUFTLFdBQVUvTCxLQUFLeXhILGlCQUFrQixHQUM5RHp4SCxLQUFLMHhILFdBQVc1aEcsT0FJdEJ2bkIsU0FBU21ELHVCQUF1QixlQUFlLEdBQzVDRSxpQkFBaUIsd0NBQ2pCQyxRQUFRbTdCLElBQ1BBLEVBQUtuakMsaUJBQWlCLGFBQWMsS0FDbEM3RCxLQUFLeXhILGlCQUFrQixNQUc3QixNQUFPajZHLEtBTVgsZ0JBQ0VqUCxTQUFTcUQsaUJBQWlCLCtDQUErQ0MsUUFBUW03QixJQUMvRUEsRUFBS2hqQyxvQkFBb0IsWUFBYWhFLEtBQUsweEgsV0FBV3B6SCxLQUFLMEIsU0FFN0R1SSxTQUFTcUQsaUJBQWlCLDRDQUE0Q0MsUUFBUW03QixJQUM1RUEsRUFBS2hqQyxvQkFBb0IsYUFBYyxLQUNyQ2hFLEtBQUt5eEgsaUJBQWtCLE1BUTdCLHFCQUNFenhILEtBQUsyeEgsZ0JBQ0wzeEgsS0FBS3NtRyxnQkFPUCxpQkFBa0J4MkUsR0FHaEIsTUFBTWhvQixFQUFNZ29CLEVBQU0rN0IsY0FBOEIvakQsR0FDaEQsR0FBVyxLQUFQQSxFQUtGLE9BSkF0RSxNQUFNNEksS0FBSzdELFNBQVNDLGVBQWUsZ0JBQWdCMkssVUFBVXRILFFBQVF5ZCxJQUNuRUEsRUFBTTdnQixnQkFFUjlGLFFBQVFteUIsSUFBSSxVQUlkLE1BQU1ycEIsRUFBVWxELFNBQVNDLGVBQWVWLEdBRWxDOHBILEVBQWVubUgsRUFBUThGLGFBQWEsU0FBU0MsTUFEbkMseUNBQ2tELEdBQ2xFLElBQ0loRCxFQURBaUssRUFBTyxHQUlYLE9BQVFtNUcsR0FDTixJQUFLLFFBQVMsQ0FFWixNQUFNejlGLEVBQU0xb0IsRUFBUUcsaUJBQWlCLE9BQ3JDLEdBQW1CLElBQWZ1b0IsRUFBSTl4QixPQUFjLENBQ3BCLE1BQU11YSxRQUF5QjVjLEtBQUt1TyxTQUFTRSxlQUFlMGxCLEVBQUksR0FBR3JzQixHQUFJOUgsS0FBS3VPLFNBQVNHLEtBQUtDLHFCQUMxRixHQUFtQixNQUFmaU8sRUFBSytCLE9BQWdDLE1BQWYvQixFQUFLK0IsTUFBZSxDQUM1QyxJQUFJa3pHLFFBQWdCN3hILEtBQUs4eEgsV0FBVzM5RixHQUVwQzA5RixFQUFVQSxFQUFRNTZHLE9BQU9rRSxjQUN6QjFDLEVBQU8sbUNBQ2lCbzVHLEVBQ3hCLE9BSUosSUFBSWx2RyxRQUFnQjNpQixLQUFLbzBCLFdBQVdELEdBQ3BDLEdBQW1CLElBQWZBLEVBQUk5eEIsT0FBYyxDQUNwQixNQUFNdWEsUUFBeUI1YyxLQUFLdU8sU0FBU0UsZUFBZTBsQixFQUFJLEdBQUdyc0IsR0FBSTlILEtBQUt1TyxTQUFTRyxLQUFLQyxxQkFDMUYsR0FBaUIsTUFBZGlPLEVBQUswNEYsS0FBYyxDQUNwQixJQUFJdWMsUUFBZ0I3eEgsS0FBSzh4SCxXQUFXMzlGLEdBRXBDMDlGLEVBQVVBLEVBQVE1NkcsT0FBT2tFLGNBQ3pCMUMsRUFBTywrQkFDaUJvNUcsRUFDeEIsTUFFRyxHQUFpQixNQUFkajFHLEVBQUswNEYsS0FBYSxDQUN4QixJQUFJdWMsUUFBZ0I3eEgsS0FBSzh4SCxXQUFXMzlGLEdBRXBDMDlGLEVBQVVBLEVBQVE1NkcsT0FBT2tFLGNBQ3pCMUMsRUFBTyx3Q0FDaUJvNUcsRUFDeEIsT0FHSixHQUFnQixXQUFabHZHLEVBQXNCLFFBQ08zaUIsS0FBS3VPLFNBQVNFLGVBQWUwbEIsRUFBSSxHQUFHcnNCLEdBQUk5SCxLQUFLdU8sU0FBU0csS0FBS0Msc0JBQ2pGRSxVQUNQOFQsRUFBVSxZQUdkLElBQUlrdkcsUUFBZ0I3eEgsS0FBSzh4SCxXQUFXMzlGLEdBRXBDMDlGLEVBQVVBLEVBQVE1NkcsT0FBT2tFLGNBQ3pCMUMsRUFBTyxnQkFBeUJ2WCxJQUFaeWhCLEVBQXdCLFdBQWFBLEdBQWxELGtCQUNpQmt2RyxFQUN4QixNQUVGLElBQUssU0FDSHJqSCxRQUFtQnhPLEtBQUt1TyxTQUFTRSxlQUFlM0csRUFBSTlILEtBQUt1TyxTQUFTRyxLQUFLQyxxQkFDdkU4SixHQUFRLFVBQWFqSyxFQUFtQixNQUFFMk0sY0FBZ0IzTSxFQUFnQixJQUMxRSxNQUVGLElBQUssUUFBUyxDQUNaQSxRQUFtQnhPLEtBQUt1TyxTQUFTRSxlQUFlM0csRUFBSTlILEtBQUt1TyxTQUFTRyxLQUFLQyxxQkFDdkUsSUFBSS9NLEVBQU8sR0FDZ0MsS0FBdEM0TSxFQUFtQixNQUFFMk0sY0FDeEJ2WixFQUFPLE9BRXNDLEtBQXRDNE0sRUFBbUIsTUFBRTJNLGdCQUM1QnZaLEVBQU8sV0FFVDZXLEdBQVEsZUFBaUI3VyxFQUN6QixNQUVGLElBQUssT0FBUSxDQUNYLE1BQU1nYixRQUFhNWMsS0FBS3VPLFNBQVNFLGVBQWUzRyxFQUFJOUgsS0FBS3VPLFNBQVNHLEtBQUtDLHFCQUl2RSxHQUFJaU8sRUFBSyxtQkFBNkIxYixJQUFiMGIsRUFBS20xRyxJQUFtQixDQVUvQ3Q1RyxHQUFRLHdCQU5PLEVBQUN1NUcsRUFBa0JELEtBQ1AsVUFBYkMsRUFBdUIsSUFBTSxLQUMxQnZ2SCxPQUFPMEYsS0FBSzAxRCxNQUFNaitELE9BQU9teUgsR0FBTyxJQUlmcGxHLENBQU8vUCxFQUFLLGFBQWNBLEVBQUttMUcsS0FBTyxZQUd4RXQ1RyxHQUFRLGdDQUdWQSxHQUFRLFVBQVltRSxFQUFLd0csTUFBakIsYUFBNkN4RyxFQUFLNjBGLEtBRTFELE1BRUYsSUFBSyxVQUNIampHLFFBQW1CeE8sS0FBS3VPLFNBQVNFLGVBQWUzRyxFQUFJOUgsS0FBS3VPLFNBQVNHLEtBQUtDLHFCQUN2RThKLEdBQVEsaUJBQW1CakssRUFBaUIsS0FDNUMsTUFFRixJQUFLLFFBQ0gsR0FBSXhPLEtBQUt5eEgsZ0JBQWlCLE9BQzFCampILFFBQW1CeE8sS0FBS3VPLFNBQVNFLGVBQWUzRyxFQUFJOUgsS0FBS3VPLFNBQVNHLEtBQUtDLHFCQUNuRUgsRUFBaUIsT0FBR2lLLEdBQVEsV0FBYWpLLEVBQWlCLEtBQUV3SSxRQUFRLFVBQVcsS0FDbkYsTUFFRixRQUNFeUIsR0FBUSxVQUlaQSxFQUFPLGlCQUFpQm01RyxFQUFhMytFLE9BQU8sR0FBRzkzQixjQUFnQnkyRyxFQUFhbHhILE1BQU0sT0FBTytYLElBQ3pGelksS0FBS2l5SCxpQkFBaUJ4NUcsR0FReEIsaUJBQWtCMGIsR0FDaEIsSUFBSTA5RixFQUFVLEdBQ2QsSUFBSyxNQUFNdmpILEtBQU02bEIsRUFBSyxDQUNwQixNQUFNM2xCLFFBQStCeE8sS0FBS3VPLFNBQVNFLGVBQWVILEVBQUd4RyxHQUFJOUgsS0FBS3VPLFNBQVNHLEtBQUtDLHFCQUM1RmtqSCxHQUFXcmpILEVBQWtCLE1BQUlBLEVBQWdCLElBQUksSUFFdkQsT0FBT3FqSCxFQU9ULGlCQUFrQjE5RixHQUNoQixJQUFJeFIsRUFBVSxHQUNWZ0csRUFBdUIsS0FDM0IsSUFBSyxNQUFNcmEsS0FBTTZsQixFQUFLLENBQ3BCLE1BQU0zbEIsUUFBK0J4TyxLQUFLdU8sU0FBU0UsZUFBZUgsRUFBR3hHLEdBQUk5SCxLQUFLdU8sU0FBU0csS0FBS0MscUJBQzNFLE9BQWJnYSxJQUNFQSxFQUFjLElBQUluYSxFQUFnQixJQUNwQ21VLEdBQVcsSUFDRmdHLEVBQWMsSUFBSW5hLEVBQWdCLEtBR3ZDeE8sS0FBS2t5SCxlQUFldnBHLEVBQWdCLE9BQUszb0IsS0FBS2t5SCxlQUFlMWpILEVBQWtCLE9BRm5GbVUsR0FBVyxJQUlBM2lCLEtBQUtreUgsZUFBZXZwRyxFQUFnQixPQUFLM29CLEtBQUtreUgsZUFBZTFqSCxFQUFrQixPQUN4Rm1VLEdBQVcsSUFFWEEsR0FBVyxLQUlqQmdHLEVBQVduYSxFQUtiLFlBSGlDdE4sSUFBN0Jnd0gsRUFBWXZ6SCxJQUFJZ2xCLElBQ2xCaGdCLFFBQVFDLEtBQUssb0JBQXNCK2YsR0FFOUJ1dUcsRUFBWXZ6SCxJQUFJZ2xCLEdBT3pCLGlCQUFrQmxLLEdBQ0RsUSxTQUFTbUQsdUJBQXVCLG9CQUFvQixHQUFJc04sVUFBWVAsRUFFOUVsUSxTQUFTQyxlQUFlLGVBQW9DaVIsVUFDOURsUixTQUFTbUQsdUJBQXVCLHlCQUF5QixHQUFtQnJDLE1BQU1DLFFBQVUsSUFTakcsZUFBZ0I2b0gsR0FDZCxPQUFRQSxHQUNOLElBQUssSUFDSCxPQUFPLEVBQ1QsSUFBSyxJQUNILE9BQU8sRUFDVCxJQUFLLElBQ0gsT0FBTyxFQUNULElBQUssSUFDSCxPQUFPLEVBQ1QsSUFBSyxJQUNILE9BQU8sRUFDVCxJQUFLLElBQ0gsT0FBTyxFQUNULElBQUssSUFDSCxPQUFPLEVBQ1QsUUFDRXh2SCxRQUFRbXlCLElBQUksdUJBU2xCLGtCQUFtQi8yQixHQUVqQixJQUFLLE1BQU91dUgsRUFBTW5oRyxLQUFNK2xHLEVBQVkvNUcsVUFDbEMsR0FBSWdVLElBQU1wdEIsRUFDUixPQUFPdXVILEssK0ZDbFhmLGFBRUEsT0FDQSxRQUVBLE9BdU9xQixFQUFBN2tILFFBbE9yQixNQVFFLFlBQWE4RyxHQUNYdk8sS0FBS3VPLFNBQVdBLEVBQ2hCdk8sS0FBS295SCxrQkFBbUIsRUFHeEIsTUFBTXQ4RixFQUFzQnZ0QixTQUFTQyxlQUFlLDRCQUM5QzZwSCxFQUFZOXBILFNBQVNTLGNBQWMsU0FDbkNzcEgsRUFBWS9wSCxTQUFTUyxjQUFjLFNBQ25DdXBILEVBQWFocUgsU0FBU1MsY0FBYyxTQUNwQ3dwSCxFQUFhanFILFNBQVNTLGNBQWMsU0FDMUN1cEgsRUFBV3RwSCxVQUFVQyxJQUFJLFlBQ3pCc3BILEVBQVd2cEgsVUFBVUMsSUFBSSxZQUN6Qm1wSCxFQUFVcHBILFVBQVVDLElBQUkscUJBQXNCLGtCQUM5Q29wSCxFQUFVcnBILFVBQVVDLElBQUkscUJBQXNCLGtCQUM5Q21wSCxFQUFVdDdHLFlBQWMsT0FDeEJ1N0csRUFBVXY3RyxZQUFjLFNBQ3hCdzdHLEVBQVd6cUgsR0FBSyxjQUNoQnlxSCxFQUFXM3dILEtBQU8sV0FDbEI0d0gsRUFBVzFxSCxHQUFLLGNBQ2hCMHFILEVBQVc1d0gsS0FBTyxXQUNsQjJ3SCxFQUFXOTRHLFNBQVUsRUFDckIrNEcsRUFBVy80RyxTQUFVLEVBQ3JCNDRHLEVBQVVwOEYsWUFBWXM4RixHQUN0QkQsRUFBVXI4RixZQUFZdThGLEdBQ3RCMThGLEVBQW9CajBCLFFBQVF5d0gsR0FDNUJ4OEYsRUFBb0JqMEIsUUFBUXd3SCxHQUU1QnJ5SCxLQUFLMGpILGVBQ0wxakgsS0FBS3l5SCxzQkFDTHp5SCxLQUFLdU8sU0FBU0csS0FBS2kxRyxrQkFBa0IzakgsS0FBSzB5SCx5QkFBeUJwMEgsS0FBSzBCLE9BQ3hFQSxLQUFLdU8sU0FBU0csS0FBS2kxRyxrQkFBa0IzakgsS0FBSys0RyxxQkFBcUJ6NkcsS0FBSzBCLE9BTXRFLHNCQUNFQSxLQUFLMHlILDJCQUNMMXlILEtBQUsrNEcsdUJBRUx4d0csU0FBU0MsZUFBZSxlQUFlM0UsaUJBQWlCLFFBQVMsS0FDL0Q3RCxLQUFLMHlILDRCQUNMLElBQUFyQix5QkFHRjlvSCxTQUFTQyxlQUFlLGVBQWUzRSxpQkFBaUIsUUFBUyxLQUMvRDdELEtBQUsrNEcsd0JBQ0wsSUFBQXNZLHlCQUlKLGVBQ0UsTUFBTSxZQUFFN21ILEVBQVcsWUFBRUQsSUFBZ0IsSUFBQXFSLGVBQ3JDclQsU0FBU2lILGNBQWdDLGdCQUFnQmlLLFFBQVVqUCxFQUNuRWpDLFNBQVNpSCxjQUFnQyxnQkFBZ0JpSyxRQUFVbFAsRUFNckUsdUIsTUFFRSxNQUFNeVMsRUFBZ0J6VSxTQUFTQyxlQUFlLGVBSzlDLElBRkEsSUFBQThSLGFBQVksQ0FBRS9QLFlBQWF5UyxFQUFjdkQsVUFFckN1RCxFQUFjdkQsU0FRaEIsR0FQQWxSLFNBQVNxRCxpQkFBaUIsZ0JBQWdCQyxRQUFRNFksSUFDaERBLEVBQUt4YixVQUFVQyxJQUFJLHVCQUNuQnViLEVBQUt4YixVQUFVUixPQUFPLGlCQUV4QkYsU0FBU3FELGlCQUFpQixzQ0FDdkJDLFFBQVM0WSxJQUF3QkEsRUFBS3BiLE1BQU04QyxLQUFPLFFBRWxCLFdBQWhDbk0sS0FBS3VPLFNBQVNpNUYsb0JBQXlEdG1HLElBQTNCbEIsS0FBS3VPLFNBQVNrcUcsU0FBd0IsQ0FDcEZ6NEcsS0FBS3VPLFNBQVNrcUcsU0FBU2thLHlCQUN2QjN5SCxLQUFLdU8sU0FBU2txRyxTQUFTbWEsdUJBQ3ZCLE1BQU0sV0FBRTVvSCxJQUFlLElBQUE0UixlQUN2QnJULFNBQVNpSCxjQUFnQyxpQkFBaUJ6UixNQUFRMEUsT0FBT3VILEdBQ3pFekIsU0FBU2lILGNBQWdDLGlCQUFpQnpSLE1BQVEwRSxPQUFPdUgsUUFHeEUsRUFDcUMsUUFBcEMsRUFBQXpCLFNBQVNDLGVBQWUsb0JBQVksZUFBRVMsVUFBVThDLFNBQVMsaUJBQzNELElBQUFKLFlBQ0FwRCxTQUFTQyxlQUFlLGFBQWFTLFVBQVVSLE9BQU8sYUFDdERGLFNBQVNDLGVBQWUsaUJBQWlCUyxVQUFVQyxJQUFJLGNBQ3ZELElBQUFvUixhQUFZLENBQUVqUSxjQUFnQixtQkFHaEM5QixTQUFTcUQsaUJBQWlCLHdCQUF3QkMsUUFBUTRZLElBQ3hEQSxFQUFLeGIsVUFBVUMsSUFBSSxlQUNuQnViLEVBQUt4YixVQUFVUixPQUFPLHlCQUd4QkYsU0FBU3FELGlCQUFpQiw4QkFBOEJDLFFBQVM0WSxJQUMvREEsRUFBS3BiLE1BQU04QyxLQUFPLFNBR3BCLElBQ0U1RCxTQUFTQyxlQUFlLGFBQWFhLE1BQU1DLFFBQVUsT0FFdkQsTUFBT2tPLElBQ1AsSUFDRWpQLFNBQVNDLGVBQWUsc0JBQXNCYSxNQUFNQyxRQUFVLE9BRWhFLE1BQU9rTyxNQUdULElBQUFwSyxtQkFPRiwyQkFFRSxNQUFNNUMsRUFBY2pDLFNBQVNDLGVBQWUsZUFLNUMsSUFGQSxJQUFBOFIsYUFBWSxDQUFFOVAsWUFBYUEsRUFBWWlQLFVBRW5DalAsRUFBWWlQLFFBQVMsQ0FDdkIsTUFBTWhELEVBQVVsTyxTQUFTQyxlQUFlLFlBQ3hDaU8sRUFBUXBOLE1BQU1DLFFBQVUsR0FDeEJtTixFQUFRdE4sVUFDTix3SkFFa0NuSixLQUFLNnlILHFDQUUzQnA4RyxFQUFRN0ssaUJBQWlCLFFBQ2pDQyxRQUFRc0MsSUFDWixNQUFNZ2xCLEVBQVc1cUIsU0FBU0MsZUFBZTJGLEVBQUtsRixVQUFVLElBQ2xEcUcsRUFBTTZqQixFQUFTM2pCLGNBQWMsUUFDN0I2SCxFQUFPL0gsRUFBSUUsY0FBYyxRQUN6QmlWLEVBQU9uVixFQUFJRSxjQUFjLFFBQ0QsSUFBMUI2SCxFQUFLcE8sVUFBVTVHLFFBQ2pCZ1YsRUFBS3BPLFVBQVVDLElBQUksUUFHckJpRixFQUFLdEssaUJBQWlCLFlBQWEsS0FDN0JzdkIsRUFBU2xxQixVQUFVOEMsU0FBUywwQkFHaENvbkIsRUFBU2xxQixVQUFVQyxJQUFJLFlBQ3ZCaXFCLEVBQVN2bkIsaUJBQWlCLFVBQVVDLFFBQVFXLElBQzFDQSxFQUFNdkQsVUFBVUMsSUFBSSxjQUVULE9BQVR1YixJQUNGQSxFQUFLcGIsTUFBTThDLEtBQU8sV0FNdEJnQyxFQUFLdEssaUJBQWlCLGFBQWMsS0FDOUJzdkIsRUFBU2xxQixVQUFVOEMsU0FBUywwQkFHaENvbkIsRUFBU2xxQixVQUFVUixPQUFPLFlBQzFCMHFCLEVBQVN2bkIsaUJBQWlCLFVBQVVDLFFBQVFXLElBQzFDQSxFQUFNdkQsVUFBVVIsT0FBTyxjQUVaLE9BQVRnYyxJQUMwQixpQkFBeEIwTyxFQUFTOXBCLE1BQU04QyxLQUNqQnNZLEVBQUtwYixNQUFNOEMsS0FBT2duQixFQUFTNWhCLGFBQWEsUUFFeENrVCxFQUFLcGIsTUFBTThDLEtBQU8sYUFRVSxXQUFoQ25NLEtBQUt1TyxTQUFTaTVGLG9CQUF5RHRtRyxJQUEzQmxCLEtBQUt1TyxTQUFTa3FHLFVBQzVEejRHLEtBQUt1TyxTQUFTa3FHLFNBQVNxYSxvQkFPekJ2cUgsU0FBU0MsZUFBZSxZQUFZYSxNQUFNQyxRQUFVLE9BT3hELGFBQ0UsSUFBSXlwSCxFQUFTLEdBcUJiLE9BbkJrQnhxSCxTQUFTcUQsaUJBQWlCLDBCQUNsQ0MsUUFBUXNuQixJQUNoQixHQUF1QyxPQUFuQ0EsRUFBUzNqQixjQUFjLFFBQWtCLENBQzNDLE1BQU1GLEVBQU02akIsRUFBUzNqQixjQUFjLFFBQ25DdWpILEdBQVUsZ0JBQWdCNS9GLEVBQVNyckIsMkJBQ0osS0FBM0J3SCxFQUFJeUgsWUFBWUUsT0FDbEI4N0csR0FBVSxZQUVWdnZILE1BQU00SSxLQUFLa0QsRUFBSTZELFNBQVMsR0FBR0EsU0FBUyxHQUFHQSxVQUFVdEgsUUFBUXdMLElBQ3ZEMDdHLEdBQStCLEtBQXJCMTdHLEVBQUtOLFlBQXFCTSxFQUFLTixZQUFjLGNBRzNEZzhHLEdBQVUsY0FHVC95SCxLQUFLb3lILG1CQUNSenFILEVBQWE4QixrQkFBa0IseUNBQy9CekosS0FBS295SCxrQkFBbUIsR0FFbkJXLEVBQU8vN0csUUFwQkksVUFvQmUsUSw4RUN4T3JDLGFBQ0EsUUFFQSxRQUtBLFFBRUEsT0FDQSxPQUNBLFFBYUEsU0FBU2c4RyxJQUNQLElBQUt6cUgsU0FBU0MsZUFBZSxhQUFhUyxVQUFVOEMsU0FBUyxhQUFjLEVBQ3pFLElBQUFKLGFBQ0EsSUFBQTJPLGFBQVksQ0FBRWpRLGNBQWUsY0FDN0IsSUFDRTlCLFNBQVNDLGVBQWUsWUFBWVcsVUFBWSxHQUNoRFosU0FBU0MsZUFBZSxhQUFhVyxVQUFZLEdBQ2pEWixTQUFTQyxlQUFlLFlBQVlrRSxjQUFjekQsVUFBVUMsSUFBSSxVQUNoRVgsU0FDR0MsZUFBZSxhQUNma0UsY0FBY3pELFVBQVVDLElBQUksVUFDL0IsTUFBT3NPLElBQ1RqUCxTQUFTQyxlQUFlLGFBQWFTLFVBQVVDLElBQUksYUFDbkQsSUFDRVgsU0FBU0MsZUFBZSxXQUFXUyxVQUFVUixPQUFPLGFBQ3BERixTQUFTQyxlQUFlLGNBQWNTLFVBQVVSLE9BQU8sYUFDdkRGLFNBQVNDLGVBQWUsY0FBY1MsVUFBVVIsT0FBTyxhQUN2REYsU0FBU0MsZUFBZSxpQkFBaUJTLFVBQVVSLE9BQU8sYUFDMURGLFNBQ0dDLGVBQWUscUJBQ2ZTLFVBQVVSLE9BQU8sYUFDcEIsTUFBTytPLElBQ1QsSUFHSSx3QkFEQWpQLFNBQVNpSCxjQUFjLHVCQUF1QjFILEtBRzlDLElBQUFzVCxzQkFBcUIsWUFFdkIsTUFBTzVELEtBRVh4WCxLQUFLaXpILG1CQU1QLGdCQVFFLFlBQVkxa0gsR0FDVnZPLEtBQUt1TyxTQUFXQSxFQUNoQnZPLEtBQUs4eUgsZUFNUCxlQUNFLE1BQU1JLEVBQVEzcUgsU0FBU0MsZUFBZSxZQUFZb0QsaUJBQWlCLFFBQzdEZ1UsRUFBUTVmLEtBQUt1TyxTQUFTcVIsTUFDNUJzekcsRUFBTXJuSCxRQUFTc0MsSUFDYixTQUFTZ2xILElBQ1BobEgsRUFBS2xGLFVBQVVDLElBQUksb0JBQ25CMFcsRUFBTUMsbUJBQW1CLEVBQUFoSyxnQkFBZ0IrQixXQUN6Q2dJLEVBQU1FLGtCQUdSM1IsRUFBS25LLG9CQUFvQixRQUFTbXZILEdBQ2xDaGxILEVBQUt0SyxpQkFBaUIsUUFBU3N2SCxLQUdqQzVxSCxTQUFTMUUsaUJBQWlCLFVBQVlpc0IsSUFDcEMsR0FBSUEsRUFBTTIyRSxVQUEwQixNQUFkMzJFLEVBQU16eEIsSUFBYSxDQUN2QyxNQUFNdW9HLEVBQWtCcitGLFNBQVNpSCxjQUFjLGdCQUMzQ28zRixHQUNGQSxFQUFnQkMsZUFBZSxDQUFFQyxTQUFVLGNBWW5ELHlCQUNFLFFBQWdDNWxHLElBQTVCbEIsS0FBS3VPLFNBQVNvcUcsVUFBeUIsQ0FDekMsTUFBTTNSLEVBQVl6K0YsU0FBU0MsZUFBZSxhQUMxQyxHQUFJdytGLEVBRUYsWUFEQUEsRUFBVTM5RixNQUFNQyxRQUFVLElBSTVCLE1BQU04cEgsRUFBUTdxSCxTQUFTQyxlQUFlLGlDQUNoQzZxSCxFQUFTOXFILFNBQVNTLGNBQWMsVUFDdENxcUgsRUFBT3BxSCxVQUFVQyxJQUFJLGlCQUFrQixVQUN2Q21xSCxFQUFPdnJILEdBQUssWUFDWnVySCxFQUFPdDhHLFlBQWMsT0FDckJxOEcsRUFBTW45RixZQUFZbzlGLEdBQ2xCQSxFQUFPeHZILGlCQUFpQixRQUFTbXZILEVBQWtCMTBILEtBQUswQixPQUN4RHVJLFNBQVNrUSxLQUFLNVUsaUJBQWlCLFVBQVkyWCxJQUN6QixNQUFaQSxFQUFJbmQsS0FDcUQsS0FBdkRrSyxTQUFTQyxlQUFlLGFBQWFhLE1BQU1DLFNBQzdDMHBILEVBQWtCMTBILEtBQUswQixLQUF2Qmd6SCxLQUlOaHpILEtBQUt1TyxTQUFTRyxLQUFLaTFHLGtCQUFrQjNqSCxLQUFLaXpILGlCQUFpQjMwSCxLQUFLMEIsV0FDM0QsQ0FDTCxNQUFNb3pILEVBQVE3cUgsU0FBU0MsZUFBZSxRQUFRMEYsUUFBUSxZQUNoRHRQLEVBQUkySixTQUFTUyxjQUFjLEtBQ2pDcEssRUFBRXFLLFVBQVVDLElBQUksV0FDaEIsTUFBTW1xSCxFQUFTOXFILFNBQVNTLGNBQWMsVUFDdENxcUgsRUFBT3BxSCxVQUFVQyxJQUFJLGlCQUFrQixVQUN2Q21xSCxFQUFPdnJILEdBQUssWUFDWnVySCxFQUFPdDhHLFlBQWMsT0FDckJuWSxFQUFFcTNCLFlBQVlvOUYsR0FDZEQsRUFBTW45RixZQUFZcjNCLEdBQ2xCeTBILEVBQU9wcUgsVUFBVUMsSUFBSSxhQUNyQm1xSCxFQUFPaHFILE1BQU1DLFFBQVUsT0FDdkJ0SixLQUFLaXpILG1CQUNManpILEtBQUt1TyxTQUFTRyxLQUFLaTFHLGtCQUFrQjNqSCxLQUFLaXpILGlCQUFpQjMwSCxLQUFLMEIsUUFPcEUsbUJBQ011SSxTQUFTQyxlQUFlLGFBQWFTLFVBQVU4QyxTQUFTLGdCQUMxRCxJQUFBSixpQkFDZ0N6SyxJQUE1QmxCLEtBQUt1TyxTQUFTb3FHLFlBRWhCMzRHLEtBQUt1TixZQUFjLElBQUksVUFDckJ2TixLQUFLdU8sU0FDTCx5QkFFRixJQUFBa2lILHdCQUF1Qnp3SCxLQUFLdU8sU0FBVXZPLEtBQUt1TixhQUNDLGVBQXhDdk4sS0FBS3VPLFNBQVNHLEtBQUszSSxZQUFZMUksT0FDakMsSUFBQXl6SCxhQUFZLGtDQUNaLElBQUFDLFlBQVcsaUJBRVgsSUFBQUQsYUFDRSw0REFFRixJQUFBQyxZQUFXLHVCQVNuQix1QkFDRSxNQUFNeDBHLEVBQWVoVSxTQUFTQyxlQUFlLHNCQUM3QyxHQUFJK1QsRUFFRixZQURBQSxFQUFhbFQsTUFBTUMsUUFBVSxJQUkvQixNQUFNZ3FILEVBQWdCL3FILFNBQVNDLGVBQWUsMEJBQ3hDK3FILEVBQXdCaHJILFNBQVNTLGNBQWMsT0FDckR1cUgsRUFBc0J0cUgsVUFBVUMsSUFDOUIsc0NBQ0EsaUJBRUZxcUgsRUFBc0JscUgsTUFBTXc0QyxPQUFTLFVBQ3JDMHhFLEVBQXNCenJILEdBQUsscUJBQzNCeXJILEVBQXNCcHFILFVBQVksbXdCQWtCbENtcUgsRUFBY3I5RixZQUFZczlGLFFBRU1yeUgsSUFBNUJsQixLQUFLdU8sU0FBU29xRyxZQUNoQjRhLEVBQXNCbHFILE1BQU1DLFFBQVUsU0FHeEMsSUFBQWtxSCw0QiwyREM1TUcsU0FBU0MsRUFBSy84QyxHQUVqQixNQUFNN3BFLEVBQUt0RSxTQUFTUyxjQUFjMHRFLEdBQzVCcjNFLEVBQU9tRSxNQUFNOUUsVUFBVWdDLE1BQU16RCxLQUFLMEQsVUFBVyxHQUVuRCxLQUFPdEIsRUFBS2dELFFBQ1osQ0FFSXF4SCxFQUF3QjdtSCxFQURaeE4sRUFBSzhGLFNBSXJCLE9BQU8wSCxFQUdYLFNBQVM2bUgsRUFBeUI3bUgsRUFBSTlJLEdBRWxDLEdBQVcsTUFBUEEsRUFHSixHQUFtQixpQkFBUkEsR0FBbUMsbUJBQVJBLEVBR2xDOEksRUFBR29wQixZQUFZMXRCLFNBQVNzM0YsZUFBZTk3RixTQUV0QyxHQUFJQSxhQUFlNkUsT0FBTzRwQixLQUUzQjNsQixFQUFHb3BCLFlBQVlseUIsUUFFZCxHQUFJQSxhQUFlUCxNQUN4QixDQUNJLE1BQU1td0gsRUFBYTV2SCxFQUFJMUIsT0FDdkIsSUFBSyxJQUFJdkYsRUFBSSxFQUFHQSxFQUFJNjJILEVBQVk3MkgsSUFDNUI0MkgsRUFBd0I3bUgsRUFBSTlJLEVBQUlqSCxTQUlwQzgySCxFQUFpQi9tSCxFQUFJOUksR0FTN0IsU0FBUzZ2SCxFQUFrQi9tSCxFQUFJMkIsR0FFM0IsSUFBSyxNQUFNb3JCLEtBQVFwckIsRUFFVkEsRUFBVzdQLGVBQWVpN0IsS0FHbEIsVUFBVEEsRUFFQWk2RixFQUFTaG5ILEVBQUkyQixFQUFXbkYsT0FJeEJ3RCxFQUFHTixhQUFhcXRCLEVBQU1wckIsRUFBV29yQixLQUs3QyxTQUFTaTZGLEVBQVVobkgsRUFBSXhELEdBRW5CLEdBQUtBLEVBR0wsR0FBcUIsaUJBQVZBLEVBTVgsSUFBSyxNQUFNeXFILEtBQVd6cUgsRUFFYkEsRUFBTTFLLGVBQWVtMUgsS0FHMUJqbkgsRUFBR3hELE1BQU15cUgsR0FBV3pxSCxFQUFNeXFILFNBVDFCam5ILEVBQUd4RCxNQUFNMHFILFFBQVUxcUgsRUNsRnBCLFNBQVMycUgsRUFBb0N2dkgsR0FFaER6RSxLQUFLM0MsS0FBTyxxQ0FDWjJDLEtBQUt5RSxRQUFVQSxFQUNmekUsS0FBS3lxQixPQUFRLElBQUtqb0IsT0FBU2lvQixNQUt4QixTQUFTd3BHLEVBQTRCeHZILEdBRXhDekUsS0FBSzNDLEtBQU8sNkJBQ1oyQyxLQUFLeUUsUUFBVUEsRUFDZnpFLEtBQUt5cUIsT0FBUSxJQUFLam9CLE9BQVNpb0IsTUFLeEIsU0FBU3lwRyxFQUFnQ3p2SCxHQUU1Q3pFLEtBQUszQyxLQUFPLGlDQUNaMkMsS0FBS3lFLFFBQVVBLEVBQ2Z6RSxLQUFLeXFCLE9BQVEsSUFBS2pvQixPQUFTaW9CLE1BZi9CdXBHLEVBQW1DdDFILFVBQVksSUFBSThELE1BU25EeXhILEVBQTJCdjFILFVBQVksSUFBSThELE1BUzNDMHhILEVBQStCeDFILFVBQVksSUFBSThELE1DbkJoQyxNQUpGLENBQ1RxaUgsT0MwTGdCLElBbkxwQixNQUVJLGNBRUk3a0gsS0FBS20wSCxPQUFTLEdBZ0JsQixRQUFRQyxFQUFPLzBILEVBQU1zakMsR0FFakIsR0FBSTNpQyxLQUFLbTBILE9BQU9DLEdBQ2hCLENBQ0ksTUFBTUMsRUFBWXIwSCxLQUFLbTBILE9BQU9DLEdBRTlCLFFBQWdDLElBQXJCQyxFQUFVaHBFLE9BQ3JCLENBQ0ksTUFBTWlwRSxFQUFrQkQsRUFBVWhwRSxPQUM1QmtwRSxFQUFjRCxFQUFnQmp5SCxPQUVwQyxJQUFLLElBQUl2RixFQUFFLEVBQUdBLEVBQUl5M0gsRUFBYXozSCxJQUUzQnczSCxFQUFnQngzSCxHQUFHb0MsTUFBTXlqQyxHQUFTLEtBQU10akMsR0FBUSxJQUl4RCxHQUFJc2pDLFFBQXdDLElBQXhCQSxFQUFNNnhGLGNBQzFCLENBRUksTUFBTUMsRUFBYTl4RixFQUFNNnhGLGdCQUV6QixHQUFJeDBILEtBQUttMEgsT0FBT0MsR0FBT0ssR0FDdkIsQ0FDSSxNQUFNQyxFQUFvQjEwSCxLQUFLbTBILE9BQU9DLEdBQU9LLEdBQ3ZDRSxFQUFjRCxFQUFrQnJ5SCxPQUV0QyxJQUFLLElBQUk4TixFQUFFLEVBQUdBLEVBQUl3a0gsRUFBYXhrSCxJQUUzQnVrSCxFQUFrQnZrSCxHQUFHalIsTUFBTXlqQyxFQUFPdGpDLEdBQVEsT0FtQjlELFVBQVUrMEgsRUFBT2g1RixFQUFVcTVGLEdBMEJ2QixPQXhCS3owSCxLQUFLbTBILE9BQU9DLEtBRWJwMEgsS0FBS20wSCxPQUFPQyxHQUFTLElBR0MsaUJBQWZLLEdBRUZ6MEgsS0FBS20wSCxPQUFPQyxHQUFPSyxLQUVwQnowSCxLQUFLbTBILE9BQU9DLEdBQU9LLEdBQWMsSUFHckN6MEgsS0FBS20wSCxPQUFPQyxHQUFPSyxHQUFZcnlILEtBQUtnNUIsS0FJL0JwN0IsS0FBS20wSCxPQUFPQyxHQUFPL29FLFNBRXBCcnJELEtBQUttMEgsT0FBT0MsR0FBTy9vRSxPQUFTLElBR2hDcnJELEtBQUttMEgsT0FBT0MsR0FBTy9vRSxPQUFPanBELEtBQUtnNUIsSUFHNUJxNUYsRUFBYSxDQUFDTCxFQUFPaDVGLEVBQVVxNUYsR0FBYyxDQUFDTCxFQUFPaDVGLEdBY2hFLFlBQVl1a0UsRUFBUWkxQixHQUVoQixNQUFNNTJILEVBQUkyaEcsRUFBTyxHQUVqQixHQUFJMy9GLEtBQUttMEgsT0FBT24ySCxHQUNoQixDQUNJLElBQUk2MkgsRUFDSixNQUFNSixFQUErQixJQUFsQjkwQixFQUFPdDlGLE9BQWVzOUYsRUFBTyxHQUFLLFNBSXJELEdBRkFrMUIsRUFBYTcwSCxLQUFLbTBILE9BQU9uMkgsR0FBR3kySCxJQUV2QkksRUFFRCxPQUFPLEVBR1gsR0FBSUQsRUFHQSxjQURPNTBILEtBQUttMEgsT0FBT24ySCxHQUFHeTJILEdBQ2ZJLEVBQVd4eUgsT0FBUyxFQUcvQixJQUFJdkYsRUFBSSszSCxFQUFXeHlILE9BRW5CLEtBQU92RixLQUVILEdBQUkrM0gsRUFBVy8zSCxLQUFPNmlHLEVBQU8sR0FHekIsT0FEQTMvRixLQUFLbTBILE9BQU9uMkgsR0FBR3kySCxHQUFZNXJGLE9BQU8vckMsRUFBRyxJQUM5QixFQUtuQixPQUFPLEVBWVgsZUFBZTIzSCxHQUVYLEdBQUlBLEVBQ0osQ0FDSSxNQUFNSyxFQUFTdDNILE9BQU9pSSxLQUFLekYsS0FBS20wSCxRQUNoQyxJQUNJQyxFQURBdDNILEVBQUlnNEgsRUFBT3p5SCxPQUdmLEtBQU92RixLQUVIczNILEVBQVFVLEVBQU9oNEgsUUFFK0IsSUFBbkNrRCxLQUFLbTBILE9BQU9DLEdBQU9LLFdBRW5CejBILEtBQUttMEgsT0FBT0MsR0FBT0ssUUFNbEN6MEgsS0FBS20wSCxPQUFTLE1DeExYLE9BQ1hZLGNBU0osU0FBdUI5bUgsRUFBTW10QixHQUV6Qm50QixFQUFLcEssaUJBQWlCLFlBQVksU0FBVWlzQixHQUVuQ0EsRUFBTTQ0RSxTQUVQdHRFLEVBQVN0TCxFQUFPa2xHLEVBQWtCbGxHLEVBQU0rN0IsY0FBZS83QixPQU0vRCxNQUFNbWxHLEVBQVVDLEVBaEJTLEtBa0J6QmpuSCxFQUFLcEssaUJBQWlCLGVBQWUsU0FBVWlzQixHQUUzQ0EsRUFBTXpULGlCQUVGeVQsRUFBTTQ0RSxVQUVGdXNCLEVBQVFFLGVBRVJGLEVBQVF6dUcsUUFDUjRVLEVBQVN0TCxFQUFPa2xHLEVBQWtCbGxHLEVBQU0rN0IsY0FBZS83QixLQUl2RG1sRyxFQUFRRyxlQW5DcEJDLFFBeUNKLFNBQWlCcG5ILEVBQU1tdEIsR0FFbkIsSUFBSWs2RixFQUFnQixFQUVwQnJuSCxFQUFLcEssaUJBQWlCLGNBQWMsU0FBVWlzQixHQUcxQ0EsRUFBTXpULGlCQUVxQyxJQUF2Q3lULEVBQU00NUYsY0FBY0MsUUFBUXRuSCxTQUU1Qml6SCxFQUFnQkMsRUFDWnpsRyxFQUFNNDVGLGNBQWNDLFFBQVEsR0FBRzlsRyxRQUMvQmlNLEVBQU00NUYsY0FBY0MsUUFBUSxHQUFHN2xHLFFBQy9CZ00sRUFBTTQ1RixjQUFjQyxRQUFRLEdBQUc5bEcsUUFDL0JpTSxFQUFNNDVGLGNBQWNDLFFBQVEsR0FBRzdsRyxhQUszQzdWLEVBQUtwSyxpQkFBaUIsYUFBYSxTQUFTaXNCLEdBS3hDLEdBRkFBLEVBQU16VCxpQkFFcUMsSUFBdkN5VCxFQUFNNDVGLGNBQWNDLFFBQVF0bkgsT0FDaEMsQ0FDSSxNQUFNc25ILEVBQVU3NUYsRUFBTTQ1RixjQUFjQyxRQUU5QjZMLEVBQWVELEVBQ2pCNUwsRUFBUSxHQUFHOWxHLFFBQ1g4bEcsRUFBUSxHQUFHN2xHLFFBQ1g2bEcsRUFBUSxHQUFHOWxHLFFBQ1g4bEcsRUFBUSxHQUFHN2xHLFNBR1QyeEcsRUFBWUQsRUFBZUYsRUFFakMsR0FBSW50SCxLQUFLdUksSUFBSStrSCxHQUFhLEVBQzFCLENBQ0ksTUFBTUMsRUFBYyxDQUNoQmxKLE9BQVE3QyxFQUFRLEdBQUc5bEcsUUFBVThsRyxFQUFRLEdBQUc5bEcsU0FBVyxFQUNuRDRvRyxPQUFROUMsRUFBUSxHQUFHN2xHLFFBQVU2bEcsRUFBUSxHQUFHN2xHLFNBQVcsR0FHdkRzWCxFQUFTdEwsRUFBT2tsRyxFQUFrQmxsRyxFQUFNKzdCLGNBQWU2cEUsR0FBY0osRUFBZUUsU0FyRmhHRyxZQTJGSixTQUFxQjFuSCxFQUFNbXRCLEdBRXZCLE1BQU02NUYsRUFBVUMsRUF4Rk8sS0F5RnZCLElBQUlVLEVBQVcsS0FFZjNuSCxFQUFLcEssaUJBQWlCLFdBQWFpc0IsSUFLL0IsR0FGQUEsRUFBTXpULGlCQUVGNDRHLEVBQVFFLGNBQ1osQ0FDSUYsRUFBUXp1RyxRQUdSLE1BQU1xdkcsRUFBWSxDQUNkckosTUFBTzE4RixFQUFNNDVGLGNBQWNvTSxlQUFlLEdBQUdqeUcsUUFDN0M0b0csTUFBTzM4RixFQUFNNDVGLGNBQWNvTSxlQUFlLEdBQUdoeUcsU0FJN0J5eEcsRUFBU0ssRUFBU3BKLE1BQU9vSixFQUFTbkosTUFBT29KLEVBQVVySixNQUFPcUosRUFBVXBKLE9BNUc5RCxJQWdIdEJyeEYsRUFBU3RMLEVBQU9rbEcsRUFBa0JsbEcsRUFBTSs3QixjQUFlZ3FFLElBRTNERCxFQUFXLFVBSVhBLEVBQVcsQ0FDUHBKLE1BQU8xOEYsRUFBTTQ1RixjQUFjb00sZUFBZSxHQUFHanlHLFFBQzdDNG9HLE1BQU8zOEYsRUFBTTQ1RixjQUFjb00sZUFBZSxHQUFHaHlHLFNBR2pEbXhHLEVBQVFHLGNBT3BCLFNBQVNHLEVBQVNRLEVBQUlDLEVBQUlDLEVBQUlDLEdBRTFCLE9BQU8vdEgsS0FBS3dpSCxNQUFNc0wsRUFBS0YsSUFBT0UsRUFBS0YsSUFBT0csRUFBS0YsSUFBT0UsRUFBS0YsSUFLL0QsU0FBU2QsRUFBeUJpQixHQUU5QixJQUFJQyxHQUFZLEVBQ1pDLEVBQVksS0FFaEIsTUFBTyxDQUNILFVBRUlELEdBQVksRUFDWkUsSUFDQUQsRUFBWXh2SCxZQUFXLFdBRW5CdXZILEdBQVksRUFDWkMsRUFBWSxPQUNiRixJQUVQaEIsWUFBVyxJQUVBaUIsRUFFWCxRQUVJQSxHQUFZLEVBQ1pFLE1BSVIsU0FBU0EsSUFFYSxPQUFkRCxJQUVBdHZILGFBQWFzdkgsR0FDYkEsRUFBWSxPQUt4QixTQUFTckIsRUFBa0IvbUgsRUFBTXNvSCxHQUU3QixNQUFNQyxFQUFTdm9ILEVBQUt3b0gsd0JBRXBCLE1BQU8sQ0FDSDdxRixLQUFNMnFGLEVBQVcvSixNQUFRZ0ssRUFBTzVxRixLQUNoQzA2RSxJQUFLaVEsRUFBVzlKLE1BQVErSixFQUFPbFEsSyxZQ3RMeEIsTUFBTSxFQUVqQixZQUFhcEIsRUFBV3dSLEdBRXBCMTJILEtBQUtvbEgsS0FBT0YsRUFFWmxsSCxLQUFLK2xILFlBQWMyUSxFQUVuQjEySCxLQUFLMjJILGNBQWdCMzJILEtBQUsrbEgsWUFBWW5xRyxjQUFjZzdHLGFBQ3BENTJILEtBQUs2MkgsZUFBaUIsS0FDdEI3MkgsS0FBSzgySCxXQUFhLEVBR3RCLFFBRWdDLE9BQXhCOTJILEtBQUs2MkgsaUJBRUw3MkgsS0FBSysySCxTQUFXLzJILEtBQUtnM0gsNkJBRXJCaDNILEtBQUs2MkgsZUFBaUJwRCxFQUFJLE1BQU8sQ0FBRXdELE1BQU8sMkJBQ3RDeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLG1CQUFxQmozSCxLQUFLKzJILFdBR2xELzJILEtBQUtrM0gsZ0JBQWtCekQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLDRCQUN2Q3hELEVBQUksTUFBTyxDQUFFd0QsTUFBTyxvQkFBc0JqM0gsS0FBSytsSCxZQUFZbjdHLFNBQVMwckcsU0FBU3VRLE1BQU03bUgsS0FBS29sSCxNQUFNcm9ILEtBSXRHaUQsS0FBS20zSCxVQUNMbjNILEtBQUsyMkgsY0FBYzFnRyxZQUFZajJCLEtBQUs2MkgsZ0JBQ3BDNzJILEtBQUsyMkgsY0FBYzFnRyxZQUFZajJCLEtBQUtrM0gsaUJBR3hDLDZCQUdJLE1BQU10c0gsRUFBVzVLLEtBQUsrbEgsWUFBWW5xRyxjQUM1Qnc3RyxFQUFpQnAzSCxLQUFLK2xILFlBQVlzUixvQkFDbENuUyxFQUFZbGxILEtBQUtvbEgsS0FFdkIsT0FBT3BsSCxLQUFLK2xILFlBQVl1UixlQUFlN2xILElBQU1zakMsSUFJekMsTUFBTXMrRSxFQUFTdCtFLEVBQU93aUYsY0FBY0MsV0FBVSxHQWtCOUMsT0FiQW5FLEVBQU94dkgsaUJBQWlCLFFBQVVpc0IsSUFFOUJpbEIsRUFBTzBpRixZQUFZeDZILEtBQUs4M0MsRUFBUWpsQixFQUFPbGxCLEVBQVV3c0gsRUFBZ0JsUyxLQUNsRSxHQUVIbU8sRUFBT3h2SCxpQkFBaUIsV0FBYWlzQixJQUdqQ0EsRUFBTXpULGlCQUVOMDRCLEVBQU8waUYsWUFBWXg2SCxLQUFLODNDLEVBQVFqbEIsRUFBT2xsQixFQUFVd3NILEVBQWdCbFMsS0FDbEUsR0FFSW1PLElBS2YsVUFFSXJ6SCxLQUFLMjJILGNBQWNuMkIsWUFBWXhnRyxLQUFLNjJILGdCQUNwQzcySCxLQUFLMjJILGNBQWNuMkIsWUFBWXhnRyxLQUFLazNILGlCQUd4QyxVQUVJLE1BQU03dkYsRUFBTXJuQyxLQUFLK2xILFlBQVlDLGNBQWNobUgsS0FBS29sSCxLQUFNLENBQ2xEYSxnQkFBZ0IsRUFDaEJDLHFCQUFxQixJQUl6QixJQUFJQyxFQUFhdjlHLE9BQU93OUcsaUJBQWlCcG1ILEtBQUsyMkgsY0FBZSxNQUFNdFEsaUJBQWlCLGVBRXBGcm1ILEtBQUs2MkgsZUFBZXh0SCxNQUFNaTlHLElBQVNqL0UsRUFBSWkvRSxJQUFQLEtBQ2hDdG1ILEtBQUs2MkgsZUFBZXh0SCxNQUFNdWlDLEtBQVV2RSxFQUFJdUUsS0FBT3h2QixTQUFTK3BHLEdBQXZCLEtBRWpDbm1ILEtBQUtrM0gsZ0JBQWdCN3RILE1BQU1pOUcsSUFBU2ovRSxFQUFJaS9FLElBQVAsS0FDakN0bUgsS0FBS2szSCxnQkFBZ0I3dEgsTUFBTXVpQyxLQUFVdkUsRUFBSXdFLE1BQVF6dkIsU0FBUytwRyxHQUFjbm1ILEtBQUs4MkgsV0FBYSxFQUF4RCxNQ3hGM0IsTUFBTSxFQUVqQixZQUFhSixHQU1ULEdBSkExMkgsS0FBSytsSCxZQUFjMlEsRUFDbkIxMkgsS0FBSzAzSCxhQUFlaEIsRUFBV2lCLG1CQUMvQjMzSCxLQUFLNDNILFVBQVksR0FFYjUzSCxLQUFLK2xILFlBQVl1UixlQUFlajFILE9BQ3BDLENBQ0ksTUFBTXcxSCxFQUFXbkIsRUFBVzk2RyxjQUFjaThHLFNBRTFDLElBQUssSUFBSS82SCxFQUFJLEVBQUdBLEVBQUkrNkgsRUFBVS82SCxJQUM5QixDQUNJLE1BQU1nN0gsRUFBVSxJQUFJLEVBQWlCaDdILEVBQUc0NUgsR0FDeEMxMkgsS0FBSzQzSCxVQUFVeDFILEtBQUswMUgsR0FDcEI5M0gsS0FBSytsSCxZQUFZZ1MsZUFBZUQsR0FNaEMsSUFBSUUsRUFBYXp2SCxTQUFTUyxjQUFjLFFBQ3hDZ3ZILEVBQVc3dUgsVUFBWXV0SCxFQUFXOXJILFNBQVMwckcsU0FBU3VRLE1BQU0vcEgsR0FBR0MsRUFDN0RpN0gsRUFBVy91SCxVQUFVQyxJQUFJLG9CQUN6Qjh1SCxFQUFXenJILGFBQWEsUUFBUywwQkFDakNoRSxTQUFTa1EsS0FBS3dkLFlBQVkraEcsR0FDMUIsSUFBSWxCLEVBQWFrQixFQUFXQyxZQUM1QjF2SCxTQUFTa1EsS0FBSytuRixZQUFZdzNCLEdBRTFCRixFQUFRaEIsV0FBYUEsSUFNakMsY0FBZWhuRyxFQUFPb29HLEdBRWxCLE1BQU10dEgsRUFBVzVLLEtBQUsrbEgsWUFBWW5xRyxjQUM1QnU4RyxFQUFlcm9HLEVBQU00NEUsUUFBVTk5RixFQUFTd3RILFVBQVksRUFBSXh0SCxFQUFTd3RILFVBQVksRUFFN0VuekgsRUFBV2pGLEtBQUsrbEgsWUFBWXNTLGdDQUFnQ0gsR0FDbEVsNEgsS0FBSytsSCxZQUFZbDhHLEtBQUtzdUgsRUFBY2x6SCxHQUd4QyxRQUFTNnFCLEVBQU9vb0csRUFBUTVDLEVBQWVnRCxHQUduQyxNQUFNQyxFQUFjdjRILEtBQUsrbEgsWUFBWTRSLG1CQUMvQi9zSCxFQUFXNUssS0FBSytsSCxZQUFZbnFHLGNBRWxDLElBQUl1OEcsRUFBZWh3SCxLQUFLMnNCLElBQUkzc0IsS0FBS202RyxJQUFJLEVBQUcxM0csRUFBU3d0SCxXQUFhRSxHQUFlaEQsRUFBZ0JudEgsS0FBSzJzQixJQUFJLEtBQU8zc0IsS0FBSzJzQixJQUFJLEdBSXRILEdBSEFxakcsRUFBZWh3SCxLQUFLQyxJQUFJd0MsRUFBUzR0SCxhQUFjTCxHQUMvQ0EsRUFBZWh3SCxLQUFLd0osSUFBSS9HLEVBQVM2dEgsYUFBY04sR0FFM0NBLElBQWlCdnRILEVBQVN3dEgsVUFFMUIsT0FHSixNQUFNbnpILEVBQVdqRixLQUFLK2xILFlBQVlzUyxnQ0FBZ0NILEdBRzVEUSxFQURTMTRILEtBQUsrbEgsWUFBWTRTLG1CQUNKQyw4QkFBOEIzekgsRUFBUzR6SCxXQUFZTixFQUFZTyxVQUNyRkMsRUFBYSxFQUFJNXdILEtBQUttNkcsSUFBSSxFQUFHMTNHLEVBQVN3dEgsVUFBWUQsR0FFeERuNEgsS0FBSytsSCxZQUFZbE8sT0FBTyxDQUNwQnVnQixVQUFXRCxFQUNYYSxhQUFjL3pILEVBQVM0ekgsV0FDdkJJLGlCQUFtQlAsRUFBYW5sSCxFQUFJdE8sRUFBUzRVLE9BQU8reEIsS0FBUTNtQyxFQUFTNFUsT0FBTyt4QixLQUFPbXRGLEVBQ25GRyxlQUFpQlIsRUFBYS9rSCxFQUFJMU8sRUFBUzRVLE9BQU95c0csSUFBT3JoSCxFQUFTNFUsT0FBT3lzRyxJQUFNeVMsSUFLdkYsaUJBRUkvNEgsS0FBSytsSCxZQUFZb1QsUUFBUSxtQkFBb0JuNUgsS0FBSytsSCxZQUFZbnFHLGVBR2xFLGdCQUlJNWIsS0FBS281SCx5QkFFTCxNQUFNQyxFQUFtQnI1SCxLQUFLK2xILFlBQVlucUcsY0FBYzA5RyxnQkFDbERDLEVBQVd2NUgsS0FBSytsSCxZQUFZcFAsWUFBWTBpQixHQUM5Q3I1SCxLQUFLK2xILFlBQVlvVCxRQUFRLGtCQUFtQkUsRUFBa0JFLEdBR2xFLGdCQUFpQkMsRUFBZUMsR0FFNUIsTUFBTUMsRUFBOEIsT0FBZkQsRUFDakJBLEVBMERaLFNBQTRCRCxFQUFlRyxFQUFRYixHQUUvQyxNQUFNYyxFQUFVZCxFQUFTeFMsSUFBT3dTLEVBQVNoMEcsT0FBUyxFQUM1QyswRyxFQUFVZixFQUFTbHRGLEtBQVFrdEYsRUFBU2owRyxNQUFRLEVBSzVDaTFHLEVBQWEsZ0JBQU1OLEVBQWV0VSxJQUVwQyxNQUFNNlUsRUFBT0osRUFBT0ssa0JBQWtCOVUsR0FDaEMrVSxFQUFjTixFQUFPTyxjQUFjaFYsRUFBVyxDQUFDZSxnQkFBZ0IsSUFFL0RrVSxFQUFPRixFQUFZcnVGLEtBQVFtdUYsRUFBS2wxRyxNQUFRLEVBQ3hDdTFHLEVBQU9ILEVBQVkzVCxJQUFPeVQsRUFBS2oxRyxPQUFTLEVBRXhDaUwsRUFBSzVuQixLQUFLQyxJQUFJRCxLQUFLdUksSUFBSW1wSCxFQUFVTSxHQUFTSixFQUFLbDFHLE1BQVEsRUFBSSxHQUMzRG1MLEVBQUs3bkIsS0FBS0MsSUFBSUQsS0FBS3VJLElBQUlrcEgsRUFBVVEsR0FBU0wsRUFBS2oxRyxPQUFTLEVBQUksR0FFbEUsUUFBU2lMLEVBQUtBLEVBQUtDLEVBQUtBLEtBRzVCLE9BQXFCLE1BQWQ4cEcsRUFBcUJBLEVBQWEsS0EvRWpDTyxDQUFrQmIsRUFBZXg1SCxLQUFLK2xILFlBQVk0UyxtQkFBb0IzNEgsS0FBSytsSCxZQUFZdVUsZUFHM0YsSUFBSTloRyxFQUFPeDRCLEtBQUswM0gsYUFBYW9CLFNBQVN5QixzQkFFdEN2NkgsS0FBSzAzSCxhQUFhb0IsU0FBU3lCLHNCQUF3QixFQUNuRCxJQUFJQyxFQUFlaEIsRUFBYzdvSCxPQUFPdkwsR0FBU3BGLEtBQUswM0gsYUFBYStDLFNBQVNDLGNBQWN0MUgsSUFFMUZwRixLQUFLMDNILGFBQWFvQixTQUFTeUIsc0JBQXdCL2hHLEVBSS9CLE9BQWhCa2hHLEdBRUExNUgsS0FBSytsSCxZQUFZNFUsZ0JBQWdCakIsRUFBYWMsR0FHL0IsT0FBZmYsR0FFQXo1SCxLQUFLK2xILFlBQVlvVCxRQUFRLGdCQUFpQk0sR0FHOUN6NUgsS0FBS281SCx5QkFHVCx5QkFFSSxNQUFNYixFQUFjdjRILEtBQUswM0gsYUFDbkJVLEVBQVlHLEVBQVkxNkcsUUFBUXU2RyxVQUdsQ0csRUFBWXFDLGVBQWlCeEMsR0FBYUcsRUFBWXFDLGNBQWdCLElBRWxFckMsRUFBWXFDLGFBQWV4QyxFQUUzQnA0SCxLQUFLK2xILFlBQVlvVCxRQUFRLGtCQUFtQmYsR0FJNUNwNEgsS0FBSytsSCxZQUFZb1QsUUFBUSxtQkFBb0JmLEdBR2pEcDRILEtBQUsrbEgsWUFBWW9ULFFBQVEsZ0JBQWlCZixJQUc5Q0csRUFBWXFDLGFBQWV4QyxFQUcvQixVQUVJcDRILEtBQUs0M0gsVUFBVS9ySCxRQUFTaXNILElBRXBCOTNILEtBQUsrbEgsWUFBWThVLGtCQUFrQi9DLElBQ3BDOTNILE9DdEpJLE1BQU04NkgsRUFFakIsWUFBYXBFLEdBRVQxMkgsS0FBSytsSCxZQUFjMlEsRUFJdkIsY0FBZTVtRyxFQUFPb29HLEdBRWxCLE1BQU1qekgsRUFBV2pGLEtBQUsrbEgsWUFBWXNTLGdDQUFnQ0gsR0FFNUR5QixFQUFTMzVILEtBQUsrbEgsWUFBWTRTLG1CQUMxQkcsRUFBVzk0SCxLQUFLK2xILFlBQVl1VSxjQUM1QlMsRUFBNkJwQixFQUFPZiw4QkFBOEIzekgsRUFBUzR6SCxXQUFZQyxHQUU3Rjk0SCxLQUFLK2xILFlBQVlsTyxPQUFPLENBQ3BCbWpCLFFBQVEsRUFDUmhDLGFBQWMvekgsRUFBUzR6SCxXQUN2QkksaUJBQWtCOEIsRUFBMkJ4bkgsRUFBSXRPLEVBQVM0VSxPQUFPK3hCLEtBQ2pFc3RGLGVBQWdCNkIsRUFBMkJwbkgsRUFBSTFPLEVBQVM0VSxPQUFPeXNHLE1BSXZFLFVBRUl0bUgsS0FBSytsSCxZQUFZbE8sT0FBTyxDQUFDbWpCLFFBQVEsSUFJckMsa0JBTUEsaUJBTUEsZ0JBQWlCeEIsRUFBZUMsR0FHNUIsR0FBNkIsSUFBekJELEVBQWNuM0gsT0FBYyxPQUdoQyxJQUFJbTJCLEVBQU94NEIsS0FBSytsSCxZQUFZd1MsWUFBWU8sU0FBU3lCLHNCQUVqRHY2SCxLQUFLK2xILFlBQVl3UyxZQUFZTyxTQUFTeUIsc0JBQXdCLEVBQzlELElBQUlDLEVBQWVoQixFQUFjN29ILE9BQU92TCxHQUFTcEYsS0FBSytsSCxZQUFZd1MsWUFBWWtDLFNBQVNDLGNBQWN0MUgsSUFJckcsR0FGQXBGLEtBQUsrbEgsWUFBWXdTLFlBQVlPLFNBQVN5QixzQkFBd0IvaEcsRUFFM0MsT0FBZmloRyxFQUdBLFlBREF6NUgsS0FBSytsSCxZQUFZNFUsZ0JBQWdCbEIsRUFBWWUsR0FTakQsTUFBTWIsRUFBUzM1SCxLQUFLK2xILFlBQVk0UyxtQkFDMUJubUgsRUFBUyxHQUVmZ25ILEVBQWMzdEgsUUFBUXE1RyxJQUVsQixNQUFNM3lHLEVBQVFvbkgsRUFBT3NCLFlBQVkvVixHQUFXM3lHLE1BQ3RCLElBQWxCQyxFQUFPblEsUUFBZ0JrUSxJQUFVQyxFQUFPQSxFQUFPblEsT0FBUyxJQUV4RG1RLEVBQU9wUSxLQUFLbVEsS0FJcEIsTUFBTXVtSCxFQUFXOTRILEtBQUsrbEgsWUFBWXVVLGNBQ2xDLElBQUlZLEVBSUFBLEVBRmtCLElBQWxCMW9ILEVBQU9uUSxRQUFnQm1RLEVBQU8sR0FBRzJvSCxPQUFPN1UsS0FBT3dTLEVBQVN4UyxJQUUxQzl6RyxFQUFPLEdBRWhCQSxFQUFPLEdBQUcyb0gsT0FBT0MsUUFBVXRDLEVBQVNzQyxPQUUzQjVvSCxFQUFPLEdBdUJqQyxTQUE2QkEsRUFBUXNtSCxHQUVqQyxNQUFNdUMsRUFBaUJ2QyxFQUFTeFMsSUFBTXdTLEVBQVNoMEcsT0FBUyxFQUV4RCxPQUFPLGdCQUFNdFMsRUFBUUQsSUFFakIsTUFBTStvSCxFQUFjL29ILEVBQU00b0gsT0FBTzdVLElBQU0vekcsRUFBTXMrRixXQUFXL3JGLE9BQVMsRUFDakUsT0FBUTNjLEtBQUt1SSxJQUFJMnFILEVBQWlCQyxLQTFCaEJDLENBQW1CL29ILEVBQVFzbUgsR0FHN0MsTUFBTVksRUFBYzE1SCxLQUFLK2xILFlBQVlucUcsY0FBYzA5RyxnQkFFNUI0QixFQUFZclUsTUFBTXZzRSxLQUFLOHFFLEdBQVFBLEVBQUtoZ0gsUUFBVXMwSCxJQUlqRTE1SCxLQUFLK2xILFlBQVk0VSxnQkFBZ0JPLEVBQVlyVSxNQUFNLEdBQUd6aEgsTUFBT28xSCxHQUlyRSxZQzlGVyxNQUFNZ0IsRUFFakIsY0FFSXg3SCxLQUFLeTdILE9BQVMsR0FDZHo3SCxLQUFLMDdILGVBQWlCLEdBQ3RCMTdILEtBQUsyN0gsaUJBQW1CLEdBRzVCLFdBQVk3RCxJQUVlOTNILEtBQUt5N0gsT0FBTzNELEVBQVExUyxRQUFVcGxILEtBQUt5N0gsT0FBTzNELEVBQVExUyxNQUFRLEtBRWxFaGpILEtBQUswMUgsR0FFaEI5M0gsS0FBSzI3SCxpQkFBaUI3RCxFQUFRMVMsT0FDOUIwUyxFQUFROEQsUUFHaEIsY0FBZTlELEdBRVgsTUFBTTFTLEVBQU8wUyxFQUFRMVMsS0FDZnlXLEVBQWlCNzdILEtBQUt5N0gsT0FBT3JXLEdBRW5DLElBQUt5VyxFQUNELE9BRUosTUFBTUMsRUFBZUQsRUFBZXJySCxRQUFRc25ILElBRXRCLElBQWxCZ0UsSUFHQTk3SCxLQUFLMjdILGlCQUFpQnZXLElBQ3RCeVcsRUFBZUMsR0FBY0MsVUFFakNGLEVBQWVoekYsT0FBT2l6RixFQUFjLEdBRU4sSUFBMUJELEVBQWV4NUgsZUFDUnJDLEtBQUt5N0gsT0FBT3JXLElBRzNCLGVBQWdCb1UsR0FFWixNQUFNd0MsRUFBcUJoOEgsS0FBSzA3SCxlQUMxQk8sRUFBaUIsR0FFdkJ6QyxFQUFjL25ILElBQU15ekcsSUFFaEIrVyxFQUFlL1csSUFBYSxFQUV2QmxsSCxLQUFLMjdILGlCQUFpQnpXLEtBRXZCbGxILEtBQUsyN0gsaUJBQWlCelcsSUFBYSxFQUVuQ2xsSCxLQUFLazhILGtCQUFrQmhYLEVBQVc0UyxJQUU5QkEsRUFBUThELGFBS3BCSSxFQUFtQnZxSCxJQUFNeXpHLElBRWpCK1csRUFBZS9XLEdBRWZsbEgsS0FBS2s4SCxrQkFBa0JoWCxFQUFZNFMsSUFFL0JBLEVBQVFYLG9CQUtMbjNILEtBQUsyN0gsaUJBQWlCelcsR0FDN0JsbEgsS0FBS2s4SCxrQkFBa0JoWCxFQUFXNFMsSUFFOUJBLEVBQVFpRSxlQUtwQi83SCxLQUFLMDdILGVBQWlCbEMsRUFHMUIsa0JBQW1CdFUsRUFBV3BxRixHQUUxQixNQUFNcWhHLEVBQVduOEgsS0FBS3k3SCxPQUFPdlcsR0FDekJpWCxHQUNBQSxFQUFTMXFILElBQU1sVSxHQUFNdTlCLEVBQUt2OUIsS0NuR3ZCLE1BQU02K0gsRUFFakIsWUFBYTFpRixFQUFNMmlGLEdBRWZyOEgsS0FBS3M4SCxNQUFRNWlGLEVBQ2IxNUMsS0FBS3U4SCxNQUFRRixFQUNicjhILEtBQUt3OEgsS0FBTyxJQUFJaDVILE1BQU1rMkMsR0FBTXZ0QyxLQUFLLE1BQU1zRixJQUFJLElBQU0sSUFBSWpPLE1BQU02NEgsR0FBTWx3SCxNQUFLLElBRzFFLFNBQVUra0MsRUFBS3VyRixHQUtYLE9BQUl2ckYsR0FBT2x4QyxLQUFLczhILE9BQVNHLEdBQU96OEgsS0FBS3U4SCxPQUc5QnY4SCxLQUFLdzhILEtBQUt0ckYsR0FBS3VyRixHQUcxQixJQUFJdnJGLEVBQUt1ckYsRUFBSzErSCxHQUVWaUMsS0FBS3c4SCxLQUFLdHJGLEdBQUt1ckYsR0FBTzErSCxHQ1BmLE1BQU0sRUFFakIsWUFBWTIrSCxHQUVSMThILEtBQUsyOEgsUUFBVUQsRUFDZixNQUFNRSxFQUFjNThILEtBQUs2OEgsYUFBZSxHQUV4Q0gsRUFBTzd3SCxRQUFRaXhILElBRVhBLEVBQU1DLE1BQU1seEgsUUFBUW14SCxJQUVoQkosRUFBWUksRUFBSzVuRixLQUFPLENBQ3BCZ2pGLFVBQVcwRSxFQUFNMUUsVUFDakJsbkYsSUFBSzhyRixFQUFLOXJGLElBQ1Z1ckYsSUFBS08sRUFBS1AsU0FLdEJ6OEgsS0FBS2cwRSxRQUdULFFBRUksTUFBTWlwRCxFQUFnQmo5SCxLQUFLazlILGVBQWlCLEdBRTVDbDlILEtBQUsyOEgsUUFBUTl3SCxRQUFRaXhILElBQ2pCRyxFQUFjSCxFQUFNMUUsV0FBYSxJQUFJZ0UsRUFBZ0JVLEVBQU1wakYsS0FBTW9qRixFQUFNVCxRQUkvRSxTQUFVYyxHQUVOLE1BQU1DLEVBQWtCLEdBQ2xCQyxFQUFtQnI5SCxLQUFLMjhILFFBQVEsR0FBR3ZFLFVBQ25Da0YsRUFBVSxJQUFJbEIsRUFBZ0JwOEgsS0FBSzI4SCxRQUFRLEdBQUdqakYsS0FBTTE1QyxLQUFLMjhILFFBQVEsR0FBR04sTUFFMUUsSUFBSWtCLEVBR0osR0FBc0IsT0FBbEJKLEVBRUFJLEVBQWlCLE1BR3JCLENBQ0ksTUFBTUMsRUFBWXIxSCxLQUFLODlCLEtBQUtrM0YsR0FDNUJJLEVBcUdaLFNBQW9CbjJILEVBQU91a0UsR0FFdkIsTUFBTXRwRSxFQUFTK0UsRUFBTS9FLE9BQ3JCLElBQUssSUFBSXZGLEVBQUksRUFBR0EsRUFBSXVGLEVBQVF2RixJQUV4QixHQUFJNnVFLEVBQVV2a0UsRUFBTXRLLEdBQUlBLEdBQ3BCLE9BQU9BLEVBR2YsT0FBUSxFQTlHaUIwdUYsQ0FBVXhyRixLQUFLMjhILFFBQVNHLEdBQVNBLEVBQU0xRSxXQUFhb0YsR0FPOUN4OUgsS0FBSzI4SCxRQUFRajhILE1BQU0sRUFBRzY4SCxFQUFpQixHQUFHejFGLFVBQ2hFcG9DLE9BQU9NLEtBQUsyOEgsUUFBUWo4SCxNQUFNNjhILEVBQWlCLElBRTdCMXhILFFBQVVpeEgsSUFFekIsTUFBTVcsRUFBU3o5SCxLQUFLazlILGVBQWVKLEVBQU0xRSxXQUV6QyxJQUFJc0YsRUFBa0JaLEVBQU1DLE1BQU1wc0gsT0FBT3FzSCxHQUFRUyxFQUFPRSxTQUFTWCxFQUFLOXJGLElBQUs4ckYsRUFBS1AsTUFRaEYsTUFBTTFELEVBQWE1d0gsS0FBS202RyxJQUFJLEVBQUcrYSxFQUFtQlAsRUFBTTFFLFdBRXhEc0YsRUFBa0JBLEVBQWdCL3NILE9BQU9xc0gsSUFDckMsSUFBSVksR0FBVyxFQUVmLE1BQU1DLEVBQWFiLEVBQUs5ckYsSUFBTTZuRixFQUN4QitFLEVBQWFkLEVBQUtQLElBQU0xRCxFQUU5QixJQUFLLElBQUlqOEgsRUFBRSxFQUFHQSxFQUFJaThILEVBQVlqOEgsSUFFMUIsSUFBSyxJQUFJcVQsRUFBRSxFQUFHQSxFQUFJNG9ILEVBQVk1b0gsSUFFckJtdEgsRUFBUUssU0FBU0UsRUFBYS9nSSxFQUFHZ2hJLEVBQWEzdEgsS0FFL0N5dEgsR0FBVyxFQUNYTixFQUFRcjVILElBQUk0NUgsRUFBYS9nSSxFQUFHZ2hJLEVBQWEzdEgsR0FBRyxJQUt4RCxPQUFPeXRILElBR1hSLEVBQWdCaDdILEtBQUtzN0gsSUFDdEIxOUgsTUFHSG85SCxFQUFnQnQxRixVQUVoQixNQUFNaTFGLEVBQVEsR0FNZCxPQUpBSyxFQUFnQnZ4SCxRQUFRa3lILElBQ3BCaEIsRUFBTTM2SCxLQUFLbEQsTUFBTTY5SCxFQUFPZ0IsS0FHckJoQixFQVNYLGdCQUFpQm52RCxHQUViNXRFLEtBQUtnMEUsUUFFTGgwRSxLQUFLMjhILFFBQVE5d0gsUUFBVWl4SCxJQUVuQixNQUFNVyxFQUFTejlILEtBQUtrOUgsZUFBZUosRUFBTTFFLFdBRXpDMEUsRUFBTUMsTUFBTWx4SCxRQUFRbXhILElBQ1pwdkQsRUFBTXQ3RCxJQUFJMHFILEVBQUs1bkYsTUFDZnFvRixFQUFPeDVILElBQUkrNEgsRUFBSzlyRixJQUFLOHJGLEVBQUtQLEtBQUssTUFFeEN6OEgsTUFHUCxxQkFBc0JnK0gsR0FFbEJBLEVBQUtueUgsUUFBVXVwQyxJQUVYLE1BQU02K0IsRUFBUWowRSxLQUFLNjhILGFBQWF6bkYsR0FDaENwMUMsS0FBS2s5SCxlQUFlanBELEVBQU1ta0QsV0FBV24wSCxJQUFJZ3dFLEVBQU0vaUMsSUFBSytpQyxFQUFNd29ELEtBQUssSUFDaEV6OEgsT0NoSkksTUFBTWkrSCxFQUVqQixZQUFhQyxFQUFROUYsR0FFakIsTUFBTStGLEVBNkpkLFNBQTRCRCxFQUFROUYsR0FFaEMsTUFBTWdHLEVBQThCLE9BQWRoRyxFQUFxQjhGLEVBQU9HLFlBdUV0RCxTQUErQkgsRUFBUTlGLEdBRW5DLE1BQU1XLEVBQWE1d0gsS0FBS202RyxJQUFJLEVBQUc4VixFQUFZOEYsRUFBT3pGLGNBRWxELE9BQU95RixFQUFPRyxZQUFZNXNILElBQUljLElBQVMsQ0FDbkNzK0YsV0FBWXl0QixFQUFnQi9ySCxFQUFNcytGLFdBQVlrb0IsR0FFOUNsUyxNQUFPdDBHLEVBQU1zMEcsTUFBTXAxRyxJQUFJMnpHLElBQVEsQ0FDM0JoZ0gsTUFBT2dnSCxFQUFLaGdILE1BRVptNUgsWUFBYSxDQUNUalksSUFBS24rRyxLQUFLMDFELE1BQU11bkQsRUFBS21aLFlBQVlqWSxJQUFNeVMsR0FDdkNudEYsS0FBTXpqQyxLQUFLMDFELE1BQU11bkQsRUFBS21aLFlBQVkzeUYsS0FBT210RixJQUc3Q2xvQixXQUFZeXRCLEVBQWdCbFosRUFBS3ZVLFdBQVlrb0IsU0F0Rld5RixDQUFxQk4sRUFBUTlGLEdBRXZGcUcsRUFpR1YsU0FBc0NQLEVBQVFFLEdBRzFDLElBQUlNLEVBQWNDLEVBQ2xCLE1BQU1DLEVBQWFWLEVBQU9oZ0gsUUFBUTNWLFNBRTlCMjFILEVBQU9XLG9CQUVQSCxFQUFlLFFBQ2ZDLEVBQW1CQyxFQUFXaHpGLEtBQU9nekYsRUFBVy95RixRQUloRDZ5RixFQUFlLFNBQ2ZDLEVBQW1CQyxFQUFXdFksSUFBTXNZLEVBQVd4RCxRQUduRCxPQUFPdUQsRUFBbUJQLEVBQWN0MUcsT0FBTyxDQUFDZzJHLEVBQVFuRixJQUFXeHhILEtBQUtDLElBQUl1eEgsRUFBTzlvQixXQUFXNnRCLEdBQWVJLEdBQVMsR0FsSHRGQyxDQUE0QmIsRUFBUUUsR0FHcEUsSUFBSVksRUFBcUJkLEVBQU9XLG1CQUM1QlgsRUFBT2hnSCxRQUFRM1YsU0FBUys5RyxJQUN4QjRYLEVBQU9oZ0gsUUFBUTNWLFNBQVNxakMsS0FFNUIsTUFBTXF6RixFQUFhLEdBR2JDLEVBQWMsQ0FDaEI1WSxJQUFLNFgsRUFBT2hnSCxRQUFRa25HLEtBQUtrQixJQUN6QjE2RSxLQUFNc3lGLEVBQU9oZ0gsUUFBUWtuRyxLQUFLeDVFLE1BbUM5QixJQUFJOW1CLEVBQVFELEVBaENadTVHLEVBQWN2eUgsUUFBUSxDQUFDOHRILEVBQVF2MEgsS0FDM0IsSUFBSWtoSCxFQUFLMTZFLEVBRUxzeUYsRUFBT1csb0JBRVB2WSxFQUFNMFksRUFDTnB6RixHQUFRNnlGLEVBQTBCOUUsRUFBTzlvQixXQUFXaHNGLE9BQVMsSUFJN0R5aEcsR0FBT21ZLEVBQTBCOUUsRUFBTzlvQixXQUFXL3JGLFFBQVUsRUFDN0Q4bUIsRUFBT296RixHQUdYLE1BQU03RCxFQUFTLENBQ1g3VSxJQUFLQSxFQUNMOFUsT0FBUTlVLEVBQU00WSxFQUFZNVksSUFBTXFULEVBQU85b0IsV0FBVy9yRixPQUNsRDhtQixLQUFNQSxFQUNOQyxNQUFPRCxFQUFPc3pGLEVBQVl0ekYsS0FBTyt0RixFQUFPOW9CLFdBQVdoc0YsT0FHdkRvNkcsRUFBVzc4SCxLQUFLLENBQ1pnRCxNQUFPQSxFQUNQeXJHLFdBQVk4b0IsRUFBTzlvQixXQUNuQmdXLE1BQU84UyxFQUFPOVMsTUFDZHNVLE9BQVFBLEVBQ1JqOUcsUUFBU2doSCxJQUdiRixFQUFxQmQsRUFBT1csbUJBQXFCMUQsRUFBT0MsT0FBU0QsRUFBT3R2RixRQUt4RXF5RixFQUFPVyxvQkFFUC81RyxFQUFTazZHLEVBQXFCRSxFQUFZNVksSUFDMUN6aEcsRUFBUTQ1RyxJQUlSMzVHLEVBQVMyNUcsRUFDVDU1RyxFQUFRbTZHLEVBQXFCRSxFQUFZdHpGLE1BRzdDLE1BQU8sQ0FDSGlsRSxXQUFZLENBQ1IvckYsT0FBUUEsRUFDUkQsTUFBT0EsR0FFWG82RyxXQUFZQSxHQWxPV0UsQ0FBa0JqQixFQUFROUYsR0FFakRwNEgsS0FBSzZ3RyxXQUFhc3RCLEVBQWV0dEIsV0FDakM3d0csS0FBS2kvSCxXQUFhZCxFQUFlYyxXQUNqQ2ovSCxLQUFLby9ILFlBdUliLFNBQXdCSCxHQUVwQixNQUFNSSxFQUFhLEdBYW5CLE9BWEFKLEVBQVdwekgsUUFBUTBHLElBQ2ZBLEVBQU1zMEcsTUFBTWg3RyxRQUFRdTVHLElBQ2hCaWEsRUFBV2phLEVBQUtoZ0gsT0FBUyxDQUNyQkEsTUFBT2dnSCxFQUFLaGdILE1BQ1ptTixNQUFPQSxFQUNQcytGLFdBQVl1VSxFQUFLdlUsV0FDakIwdEIsWUFBYW5aLEVBQUttWixpQkFLdkJjLEVBdEpnQkMsQ0FBY25CLEVBQWVjLFlBZXBELFlBQWEvWixHQUVULE9BQU9sbEgsS0FBS28vSCxZQUFZbGEsSUFBYyxLQVMxQyxrQkFBbUJBLEdBRWYsSUFBS2xsSCxLQUFLby9ILGNBQWdCcC9ILEtBQUtvL0gsWUFBWWxhLEdBQ3ZDLE9BQU8sS0FFWCxNQUFNaVcsRUFBU29FLEVBQTBCdi9ILEtBQUtvL0gsWUFBWWxhLElBRTFELE1BQU8sQ0FDSHBnRyxPQUFRcTJHLEVBQU9DLE9BQVNELEVBQU83VSxJQUMvQnpoRyxNQUFPczJHLEVBQU90dkYsTUFBUXN2RixFQUFPdnZGLE1BYXJDLGNBQWVzNUUsRUFBV3JuRyxHQUV0QixNQUFNczlHLEVBQVNuN0gsS0FBS2dtSCxjQUFjZCxFQUFXcm5HLEdBRTdDLE9BQUtzOUcsRUFHRSxDQUNIN1UsSUFBSzZVLEVBQU83VSxJQUNaMTZFLEtBQU11dkYsRUFBT3Z2RixNQUpOLEtBUWYsY0FBZXM1RSxFQUFXcm5HLEdBRXRCLE1BQU0yaEgsRUFBV3gvSCxLQUFLby9ILFlBQVlsYSxHQUVsQyxJQUFLc2EsRUFDRCxPQUFPLEtBRVgsTUFBTXJFLEVBQVNvRSxFQUEwQkMsR0FDbkN0aEgsRUFBVXNoSCxFQUFTanRILE1BQU0yTCxRQUUvQixPQUFJTCxHQUFXQSxFQUFRb29HLGVBRVosQ0FDSEssSUFBSzZVLEVBQU83VSxJQUFNcG9HLEVBQVFvb0csSUFDMUIxNkUsS0FBTXV2RixFQUFPdnZGLEtBQU8xdEIsRUFBUTB0QixLQUM1Qnd2RixPQUFRRCxFQUFPQyxPQUNmdnZGLE1BQU9zdkYsRUFBT3R2RixPQUlmLENBQ0h5NkUsSUFBSzZVLEVBQU83VSxJQUNaMTZFLEtBQU11dkYsRUFBT3Z2RixLQUdid3ZGLE9BQVFELEVBQU9DLE9BQVNsOUcsRUFBUW9vRyxJQUNoQ3o2RSxNQUFPc3ZGLEVBQU90dkYsT0FZdEIsOEJBQStCcTVFLEVBQVc0VCxHQUV0QyxNQUFNak8sRUFBYWlPLEVBQVNsdEYsS0FDdEI2ekYsRUFBZTNHLEVBQVNqdEYsTUFBUWl0RixFQUFTbHRGLEtBRXpDL3hCLEVBQVM3WixLQUFLazZILGNBQWNoVixHQUU1QjN4RyxFQUFJczNHLEVBQWFoeEcsRUFBTyt4QixLQUFPeHZCLFNBQVNxakgsRUFBZSxFQUFHLElBRTFEM1UsRUFBWWdPLEVBQVN4UyxJQUNyQm9aLEVBQWdCNUcsRUFBU3NDLE9BQVN0QyxFQUFTeFMsSUFJakQsTUFBTyxDQUNIL3lHLEVBQUdBLEVBQ0hJLEVBSk1tM0csRUFBWWp4RyxFQUFPeXNHLElBQU1scUcsU0FBU3NqSCxFQUFnQixFQUFHLE1BU3ZFLFNBQVNILEVBQTJCbmEsR0FFaEMsTUFBTWtCLEVBQVNsQixFQUFLbVosWUFBWWpZLElBQU9sQixFQUFLN3lHLE1BQU00b0gsT0FBTzdVLElBQ25EOFUsRUFBUzlVLEVBQU1sQixFQUFLdlUsV0FBVy9yRixPQUMvQjhtQixFQUFTdzVFLEVBQUttWixZQUFZM3lGLEtBQU93NUUsRUFBSzd5RyxNQUFNNG9ILE9BQU92dkYsS0FHekQsTUFBTyxDQUNIMDZFLElBQUtBLEVBQ0w4VSxPQUFRQSxFQUNSeHZGLEtBQU1BLEVBQ05DLE1BTldELEVBQU93NUUsRUFBS3ZVLFdBQVdoc0YsT0F5SDFDLFNBQVN5NUcsRUFBaUJ6dEIsRUFBWWtvQixHQUVsQyxNQUFPLENBQ0hqMEcsT0FBUTNjLEtBQUswMUQsTUFBTWd6QyxFQUFXL3JGLE9BQVNpMEcsR0FDdkNsMEcsTUFBTzFjLEtBQUswMUQsTUFBTWd6QyxFQUFXaHNGLE1BQVFrMEcsSUN2UTdDLE1BQU12cEIsRUFBUSxFQUFRLEdBQVIsQ0FBaUIsbUJBT2hCLE1BQU1td0IsRUFFakIsWUFBYTloSCxHQUVUQSxFQUFVQSxHQUFXLENBQUV5aUcsUUFOTixLQU9qQnRnSCxLQUFLc2dILFFBQVV6aUcsRUFBUXlpRyxTQVBOLElBU2pCdGdILEtBQUs0L0gsTUFBUSxHQUNiNS9ILEtBQUs2L0gsTUFBUSxHQUNiNy9ILEtBQUs4L0gsS0FBTyxHQUdoQixJQUFLMXFGLEdBRUQsTUFBTTJxRixFQUFTLy9ILEtBQUs2L0gsTUFBTXpxRixHQUMxQixPQUFPMnFGLEVBQVNBLEVBQU9DLElBQU0sS0FHakMsSUFBSzVxRixHQUVELFFBQVNwMUMsS0FBSzYvSCxNQUFNenFGLEdBR3hCLElBQUtBLEVBQUs0cUYsR0FFTixJQUFJRCxFQUFTLy9ILEtBQUs2L0gsTUFBTXpxRixHQUNwQjJxRixHQUdBQSxFQUFPQyxJQUFNQSxFQUNiaGdJLEtBQUtpZ0ksU0FBU0YsS0FJZEEsRUFBUyxDQUNMQyxJQUFLQSxFQUNMNXFGLElBQUtBLEdBR1RwMUMsS0FBSzYvSCxNQUFNenFGLEdBQU8ycUYsRUFDbEIvL0gsS0FBS2tnSSxVQUFVLEdBQ2ZsZ0ksS0FBSzgvSCxLQUFLMzlILFFBQVE0OUgsSUFJMUIsU0FBVUEsR0FFTixNQUFNMzZILEVBQVFwRixLQUFLOC9ILEtBQUt0dkgsUUFBUXV2SCxHQUNoQy8vSCxLQUFLOC9ILEtBQUtqM0YsT0FBT3pqQyxFQUFPLEdBQ3hCcEYsS0FBSzgvSCxLQUFLMzlILFFBQVE0OUgsR0FHdEIsVUFBV0ksR0FFUCxNQUFNQyxFQUFvQnBnSSxLQUFLc2dILFFBQVU2ZixFQUV6QyxHQUFJbmdJLEtBQUs4L0gsS0FBS3o5SCxRQUFVKzlILEVBQ3BCLE9BRUosSUFBSUMsRUFBZ0JyZ0ksS0FBSzgvSCxLQUFLejlILE9BQVMsRUFFdkMsT0FDQSxDQUNJLE1BQU1sRCxFQUFTYSxLQUFLOC9ILEtBQUtPLEdBRXpCLElBQUtyZ0ksS0FBSzQvSCxNQUFNemdJLEVBQU9pMkMsT0FFbkJvNkQsRUFBTSxvQkFBcUJyd0csRUFBT2kyQyxLQUNsQ3AxQyxLQUFLOC9ILEtBQUtqM0YsT0FBT3czRixFQUFlLFVBQ3pCcmdJLEtBQUs2L0gsTUFBTTFnSSxFQUFPaTJDLEtBRXJCcDFDLEtBQUs4L0gsS0FBS3o5SCxRQUFVKzlILEdBQ3BCLE1BR1IsR0FBc0IsSUFBbEJDLEVBQ0osQ0FFSTd3QixFQUFNeWQsU0FBV3pkLEVBQU0sb0RBQ25CeHZHLEtBQUs4L0gsS0FBS3o5SCxPQUFTKzlILEdBRXZCLE1BR0pDLEtBSVIsUUFBU2pyRixHQUVMcDFDLEtBQUs0L0gsTUFBTXhxRixJQUFRcDFDLEtBQUs0L0gsTUFBTXhxRixJQUFRLEdBQUssRUFDM0NwMUMsS0FBS2lnSSxTQUFTamdJLEtBQUs2L0gsTUFBTXpxRixJQUc3QixRQUFTQSxHQUVTcDFDLEtBQUs0L0gsTUFBTXhxRixHQUViLEVBQ1JwMUMsS0FBSzQvSCxNQUFNeHFGLFlBRUpwMUMsS0FBSzQvSCxNQUFNeHFGLEdBRXRCcDFDLEtBQUtrZ0ksVUFBVSxJQ3ZHUixNQUFNSSxFQUVqQixZQUFhemlILEdBRVQ3ZCxLQUFLdWdJLEtBQU8xaUgsRUFBUXUzQixJQUNwQnAxQyxLQUFLd2dJLFVBQVkzaUgsRUFBUTlTLEtBQ3pCL0ssS0FBS3lnSSxlQUFpQjVpSCxFQUFRdFosTUFDOUJ2RSxLQUFLMGdJLFlBQWM3aUgsRUFBUTZpSCxhQUFlLEVBQzFDMWdJLEtBQUsyZ0ksU0FBVzNnSSxLQUFLNGdJLFdBQVksRUFDakM1Z0ksS0FBSzZnSSxhQUFlaGpILEVBQVFqVCxTQUFTazJILGlCQUdyQzlnSSxLQUFLNEcsUUFBVUMsV0FBVyxLQUV0QjdHLEtBQUsrZ0ksT0FBUyxJQUFJQyxNQUNsQmhoSSxLQUFLK2dJLE9BQU9FLFlBQWNqaEksS0FBSzZnSSxhQUMvQjdnSSxLQUFLK2dJLE9BQU9HLE9BQVNsaEksS0FBS21oSSxZQUFZN2lJLEtBQUswQixNQUMzQ0EsS0FBSytnSSxPQUFPMzhFLFFBQVVwa0QsS0FBS29oSSxhQUFhOWlJLEtBQUswQixNQUM3Q0EsS0FBSytnSSxPQUFPN3pHLElBQU1yUCxFQUFRdTNCLEtBRTNCcDFDLEtBQUswZ0ksYUFHWixRQUVJMzVILGFBQWEvRyxLQUFLNEcsU0FXZDVHLEtBQUsrZ0ksU0FFTC9nSSxLQUFLK2dJLE9BQU9HLE9BQVNsaEksS0FBSytnSSxPQUFPMzhFLFFBQVUsS0FFM0Nwa0QsS0FBSytnSSxPQUFPN3pHLElBQU0sSUFHdEJsdEIsS0FBSzJnSSxVQUFXLEVBR3BCLGNBRVEzZ0ksS0FBSzJnSSxTQUVMaCtILFFBQVE0QixNQUFNLHdEQUEwRHZFLEtBQUt1Z0ksTUFJN0V2Z0ksS0FBSzRnSSxVQUVMaitILFFBQVE0QixNQUFNLHdEQUEwRHZFLEtBQUt1Z0ksT0FJakZ2Z0ksS0FBSzRnSSxXQUFZLEVBRWpCNWdJLEtBQUt3Z0ksVUFBVXhnSSxLQUFLK2dJLFNBR3hCLGVBRUkvZ0ksS0FBS3lnSSxlQUFlemdJLEtBQUsrZ0ksU0N4RWxCLE9BQ1hNLFFBbUJKLFNBQWtCeGpILEdBRWQsTUFBTXlqSCxFQUFhempILEVBQVEwakgsU0FDckJDLEVBQWEzakgsRUFBUTJqSCxXQUNyQkMsRUFBVzVqSCxFQUFRNGpILFNBQ25CQyxFQUFRN2pILEVBQVE2akgsTUFJaEJsOEYsRUFBUXFwQixJQUNSM25DLEVBQU1zZSxFQUFRODdGLEVBRWRLLEVBQVcsR0FDWGx2SCxFQUFTLEdBQ1RtdkgsRUFBWXBrSSxPQUFPaUksS0FBSys3SCxHQUU5QkksRUFBVS8xSCxRQUFReE4sSUFDZCxNQUFNNi9ILEVBQVNzRCxFQUFXbmpJLEdBQzFCc2pJLEVBQVN0akksR0F1RGpCLFNBQXFCbW5DLEVBQU90ZSxFQUFLMjZHLEdBRTdCLE9BQVFDLEdBQXFCdDhGLEdBQVN0ZSxFQUFNc2UsR0FBU3E4RixFQUFPQyxHQXpEeEMxbUMsQ0FBWThpQyxFQUFPOXhILEtBQU04eEgsRUFBT3QzRyxHQUFJczNHLEVBQU8yRCxRQUFVRSxLQUl6RSxJQUFJQyxFQUFZOWEsdUJBZWhCLFNBQVNwd0IsSUFFTCxNQUFNbHVFLEVBQVVpbUMsS0FrQnBCLFNBQXNCaXpFLEdBRWxCRixFQUFVLzFILFFBQVF4TixJQUNkb1UsRUFBT3BVLEdBQU9zakksRUFBU3RqSSxHQUFLeWpJLE1BbEJoQ0csQ0FGZ0I5NUgsS0FBS3dKLEtBQUtpWCxFQUFVNGMsR0FBUzg3RixFQUFZLElBR3pERyxFQUFTaHZILEdBRUxtVyxFQUFVMUIsRUFFVjg2RyxFQUFZOWEsc0JBQXNCcHdCLEdBSWxDb3JDLEVBQTBCLENBQ3RCQyxhQUFhLE9BNUJ6QixNQUFPLENBQ0gsU0FFc0IsT0FBZEgsSUFFQUkscUJBQXFCSixHQUNyQkUsRUFBMEIsQ0FDdEJDLGFBQWEsT0FpQzdCLFNBQVNELEVBQTBCcC9HLEdBRS9Cay9HLEVBQVksS0FFUk4sR0FDQUEsRUFBTTUrRyxLQXZGZCsrRyxPQUFRLENBQ0pRLE9Bb0dSLFNBQXNCN3FILEdBRWxCLE9BQU9BLEdBckdIOHFILE1BQU9QLElBSWYsSUFBSWx6RSxFQTRHSixTQUFTa3pFLEVBQWtCL2pJLEdBRXZCLE9BQU9BLEVBQUksR0FBTSxFQUFJQSxFQUFJQSxFQUFJQSxHQUFNQSxFQUFJLElBQVEsRUFBSUEsRUFBSSxJQUFRLEVBQUlBLEVBQUksR0FBTSxFQTFHN0U2d0QsRUFGdUIsb0JBQWhCMHpFLGFBQStCQSxZQUFZMXpFLElBRTVDLElBQWUwekUsWUFBWTF6RSxNQUkzQixJQUFlejBCLEtBQUt5MEIsTUNUZixNQUFNLEVBRWpCLFlBQWFoeEMsRUFBUzJrSCxHQUVsQnhpSSxLQUFLeWlJLFVBQVk1a0gsRUFBUWk3RyxTQUN6Qjk0SCxLQUFLMGlJLGNBQWdCN2tILEVBQVE4a0gsYUFDN0IzaUksS0FBSzRpSSxpQkFBbUIva0gsRUFBUSs0RyxhQUNoQzUySCxLQUFLNmlJLFVBQVlobEgsRUFBUWpULFNBRXpCNUssS0FBSzhpSSxPQUFTTixHQUFTLEdBRXZCeGlJLEtBQUsraUksUUFBVXRQLEVBQUksU0FBVSxDQUFFd0QsTUFBTyx1QkFDdENqM0gsS0FBS2dqSSxLQUFPaGpJLEtBQUsraUksUUFBUUUsV0FBVyxNQUVwQ2pqSSxLQUFLMjVILE9BQVMsS0FFZDM1SCxLQUFLa2pJLGdCQUFrQixLQUN2QmxqSSxLQUFLMDdILGVBQWlCLEtBQ3RCMTdILEtBQUttakksUUFBVSxLQUNmbmpJLEtBQUtvakksV0FBYSxLQUNsQnBqSSxLQUFLcWpJLGlCQUFtQixLQUN4QnJqSSxLQUFLc2pJLGVBQWlCLEtBQ3RCdGpJLEtBQUt1akksV0FBYSxLQUlsQnZqSSxLQUFLbTBILE9BQVMsSUFBSXdMLEVBQ2xCMy9ILEtBQUt3akksaUJBQW1CLEdBRzVCLGdDQUVJLE1BQWlDLG9CQUF0QkMsa0JBRUEsS0FHSixDQUNILHNDQUF1Q2hRLEVBQUksTUFBTyxVQUNsRCwwQ0FJUixLQUFNeUssRUFBUXdGLEVBQWtCQyxHQWU1QixHQWJBM2pJLEtBQUs0akksa0JBRUQ1akksS0FBSzhpSSxPQUFPZSxnQkFFWjdqSSxLQUFLOGlJLE9BQU9lLGlCQUdoQjdqSSxLQUFLa2pJLGdCQUFrQlMsRUFDdkIzakksS0FBS21qSSxRQUFVakYsRUFDZmwrSCxLQUFLcWpJLGlCQUFtQixHQUN4QnJqSSxLQUFLOGpJLHNCQUFzQkosRUFBaUJ0TCxZQUd2Q3A0SCxLQUFLMjVILE9BQU9zQixZQUFZeUksRUFBaUI3SyxZQUUxQyxNQUFNLElBQUlyMkgsTUFBTSxpQkFBbUJraEksRUFBaUI3SyxZQUdwRDc0SCxLQUFLK2lJLFFBQVFsK0csUUFBVTdrQixLQUFLeWlJLFVBQVU1OUcsT0FBUzdrQixLQUFLK2lJLFFBQVFqK0csU0FBVzlrQixLQUFLeWlJLFVBQVUzOUcsU0FFdEY5a0IsS0FBSytpSSxRQUFRbCtHLE1BQVE3a0IsS0FBS3lpSSxVQUFVNTlHLE1BQ3BDN2tCLEtBQUsraUksUUFBUWorRyxPQUFTOWtCLEtBQUt5aUksVUFBVTM5RyxRQUl6QzlrQixLQUFLK2pJLEtBQUtMLEVBQWlCN0ssV0FBWTZLLEVBQWlCeEssZUFBZ0J3SyxFQUFpQnpLLGtCQUVyRmo1SCxLQUFLK2lJLFFBQVFuK0csYUFBZTVrQixLQUFLMGlJLGVBRWpDMWlJLEtBQUswaUksY0FBYzkwQixhQUFhNXRHLEtBQUsraUksUUFBUy9pSSxLQUFLMGlJLGNBQWMvYyxZQUdqRTNsSCxLQUFLOGlJLE9BQU9rQixlQUVaaGtJLEtBQUs4aUksT0FBT2tCLGdCQUlwQixxQkFBc0JOLEdBRWxCLEdBQUlBLEVBQWlCdEwsWUFBY3A0SCxLQUFLb2pJLFdBQ3hDLENBQ0ksR0FBd0IsT0FBcEJwakksS0FBS29qSSxXQUVMLE1BQU0sSUFBSTVoSSxVQUFVLG9DQUVuQixHQUFtQyxPQUEvQmtpSSxFQUFpQnRMLFVBRXRCLE1BQU0sSUFBSTUySCxVQUFVLDBDQUd4QnhCLEtBQUs4akksc0JBQXNCSixFQUFpQnRMLFdBR2hEcDRILEtBQUtpa0ksTUFBTVAsRUFBaUI3SyxXQUFZNkssRUFBaUJ4SyxlQUFnQndLLEVBQWlCekssa0JBRzlGLHNCQUF1QmIsR0FFbkJwNEgsS0FBSzI1SCxPQUFTLElBQUlzRSxFQUFlaitILEtBQUttakksUUFBUy9LLEdBQy9DcDRILEtBQUtvakksV0FBYWhMLEVBRWxCLEVBQWNwNEgsS0FBSzRpSSxpQkFBa0IsQ0FDakN2NUgsTUFBTyxDQUNIeWIsT0FBUTlrQixLQUFLMjVILE9BQU85b0IsV0FBVy9yRixPQUFTLEtBQ3hDRCxNQUFPN2tCLEtBQUsyNUgsT0FBTzlvQixXQUFXaHNGLE1BQVEsUUFJOUM3a0IsS0FBS3lpSSxVQUFVeUIsbUJBQW1CbGtJLEtBQUsyNUgsT0FBTzlvQixZQUdsRCxTQUVJN3dHLEtBQUs0akksa0JBRUw1akksS0FBS21rSSxVQUVEbmtJLEtBQUs4aUksT0FBT3NCLGlCQUVacGtJLEtBQUs4aUksT0FBT3NCLGdCQUFnQnBrSSxLQUFLMDdILGVBQWVoN0gsUUFBUyxNQUlqRSxVQUVJLE1BQU0yakksRUFBbUIsR0FDekJya0ksS0FBSzI1SCxPQUFPc0YsV0FBV3B6SCxRQUFTMEcsSUFFNUIsSUFBS3ZTLEtBQUt5aUksVUFBVTZCLGlCQUFpQi94SCxFQUFNNG9ILFFBRXZDLE9BR0osTUFBTVgsRUFBZWpvSCxFQUFNczBHLE1BQ3RCbDJHLFFBQU8sU0FBVXkwRyxHQUVkLE9BQU9wbEgsS0FBSzA2SCxjQUFjdFYsRUFBS2hnSCxTQUNoQ3BGLE1BQ0Z5UixJQUFJMnpHLEdBQVFBLEVBQUtoZ0gsT0FFdEJpL0gsRUFBaUJqaUksS0FBS2xELE1BQU1tbEksRUFBa0I3SixJQUMvQ3g2SCxNQUVIQSxLQUFLZ2pJLEtBQUt1QixVQUFVLEVBQUcsRUFBR3ZrSSxLQUFLK2lJLFFBQVFsK0csTUFBTzdrQixLQUFLK2lJLFFBQVFqK0csUUFDM0Q5a0IsS0FBS3drSSxjQUFjSCxHQUVuQkEsRUFBaUJ4NEgsUUFBU3E1RyxJQUV0QixJQUFLbGxILEtBQUtxakksaUJBQWlCbmUsR0FDM0IsQ0FDSSxNQUFNRSxFQUFPcGxILEtBQUsyNUgsT0FBT3NCLFlBQVkvVixHQUMvQnVmLEVBQWF6a0ksS0FBS2tqSSxnQkFBZ0J3Qix3QkFBd0J0ZixHQUMxRHVmLEVBQVksSUFBSSxFQUFlRixHQUNyQ0UsRUFBVUMsZ0JBQWdCNWtJLEtBQUttMEgsUUFDL0JuMEgsS0FBS3FqSSxpQkFBaUJuZSxHQUFheWYsSUFFeEMza0ksTUFFSEEsS0FBSzZrSSxzQkFBc0JSLEdBRTNCLE1BQU16bEcsRUFBVWttRyxFQUFZOWtJLEtBQUswN0gsZ0JBQWtCLEdBQUkySSxHQUV2RHpsRyxFQUFRMGpDLFFBQVF6MkQsUUFBU3E1RyxXQUVkbGxILEtBQUtxakksaUJBQWlCbmUsSUFDOUJsbEgsTUFFSEEsS0FBSzA3SCxlQUFpQjJJLEVBQ3RCcmtJLEtBQUsra0ksU0FFRC9rSSxLQUFLOGlJLE9BQU9rQyxnQkFFWnBtRyxFQUFRcW1HLE1BQU1wNUgsUUFBU3E1RyxJQUVuQmxsSCxLQUFLOGlJLE9BQU9rQyxlQUFlOWYsSUFDNUJsbEgsTUFJWCxTQUVJLE1BQU1rbEksRUFBZ0IsR0FFdEJsbEksS0FBSzA3SCxlQUFlN3ZILFFBQVVxNUcsSUFFMUJsbEgsS0FBS3FqSSxpQkFBaUJuZSxHQUFXaWdCLFNBQVNubEksS0FBS29qSSxZQUFZdjNILFFBQVM2MkIsSUFFaEUsTUFBTTBpRyxFQUFTQyxFQUFvQjNpRyxFQUFRMWlDLEtBQUtvakksWUFFNUNwakksS0FBS3NsSSxlQUFlcGdCLEVBQVdrZ0IsS0FFL0JGLEVBQWM5aUksS0FBS3NnQyxFQUFPMFMsS0FDMUJwMUMsS0FBS3VsSSxVQUFVcmdCLEVBQVdrZ0IsRUFBUXBsSSxLQUFLbTBILE9BQU94MkgsSUFBSStrQyxFQUFPMFMsV0FLckUsTUFBTXc0QixFQUFRNXRFLEtBQUttMEgsT0FFYnYxRixFQUFVa21HLEVBQVk5a0ksS0FBS3NqSSxnQkFBa0IsR0FBSTRCLEdBRXZEdG1HLEVBQVFxbUcsTUFBTXA1SCxRQUFRdXBDLElBRWxCdzRCLEVBQU00M0QsUUFBUXB3RixLQUdsQnhXLEVBQVEwakMsUUFBUXoyRCxRQUFRdXBDLElBRXBCdzRCLEVBQU02M0QsUUFBUXJ3RixLQUdkeFcsRUFBUTBqQyxTQUlSdGlFLEtBQUswN0gsZUFBZTd2SCxRQUFTcTVHLElBRXpCbGxILEtBQUtxakksaUJBQWlCbmUsR0FBVzBmLGdCQUFnQjVrSSxLQUFLbTBILFNBQ3ZEbjBILE1BR1BBLEtBQUtzakksZUFBaUI0QixFQUkxQixjQUFlcmUsR0FFWEEsRUFBTWg3RyxRQUFVcTVHLElBRVosSUFBSXNhLEVBQVd4L0gsS0FBSzI1SCxPQUFPc0IsWUFBWS9WLEdBQ25Dd2dCLEVBQWExbEksS0FBSzJsSSxnQkFBZ0J6Z0IsR0FHbEMwZ0IsRUFBbUJ6OUgsS0FBS0MsSUFBSSxHQUFJcEksS0FBS3lpSSxVQUFVNTlHLE1BQVE3a0IsS0FBSzI1SCxPQUFPOW9CLFdBQVdoc0YsT0FBUyxHQUN2RmdoSCxFQUFtQjE5SCxLQUFLQyxJQUFJLEdBQUlwSSxLQUFLeWlJLFVBQVUzOUcsT0FBUzlrQixLQUFLMjVILE9BQU85b0IsV0FBVy9yRixRQUFVLEdBRXpGZ2hILEVBQWtCSixFQUFXOTVGLEtBQU81ckMsS0FBS3lpSSxVQUFVNzJGLEtBQU9nNkYsRUFDMURHLEVBQWtCTCxFQUFXcGYsSUFBTXRtSCxLQUFLeWlJLFVBQVVuYyxJQUFNdWYsRUFFeERHLEVBQWNGLEVBQWtCLEdBQUtBLEVBQWtCLEVBQ3ZERyxFQUFjRixFQUFrQixHQUFLQSxFQUFrQixFQUV2REcsRUFBVS85SCxLQUFLQyxJQUFJLEVBQUcwOUgsR0FDdEJLLEVBQVVoK0gsS0FBS0MsSUFBSSxFQUFHMjlILEdBRXRCSyxFQUFZNUcsRUFBUzN1QixXQUFXaHNGLE1BQVFtaEgsRUFDeENLLEVBQWE3RyxFQUFTM3VCLFdBQVcvckYsT0FBU21oSCxFQUU5Q2ptSSxLQUFLZ2pJLEtBQUtzRCxZQUFjLE9BRXhCdG1JLEtBQUtnakksS0FBS3VELFdBQVdMLEVBQVUsR0FBS0MsRUFBVSxHQUFLQyxFQUFXQyxLQVV0RSxzQkFBdUJ4ZixHQUduQixNQUFNMmYsRUFBcUIsR0FHckJDLEVBQWtCLENBQUMvakcsRUFBUXdpRixLQUU3QixNQUFNeWYsRUFBWTNrSSxLQUFLcWpJLGlCQUFpQm5lLEdBRXhDc2hCLEVBQW1COWpHLEVBQU8wUyxLQUFPLElBQUlrckYsRUFBb0IsQ0FDckRsckYsSUFBSzFTLEVBQU8wUyxJQUNac3JGLFlBeFJrQixJQXlSbEI5MUgsU0FBVTVLLEtBQUs2aUksVUFDZjkzSCxLQUFNaTFILFdBRUtoZ0ksS0FBS3dqSSxpQkFBaUI5Z0csRUFBTzBTLEtBQ3BDcDFDLEtBQUttMEgsT0FBT2h4RixJQUFJVCxFQUFPMFMsSUFBSzRxRixHQUd4QjJFLElBQWMza0ksS0FBS3FqSSxpQkFBaUJuZSxJQUVwQ3lmLEVBQVUrQixxQkFBcUIsQ0FBQ2hrRyxFQUFPMFMsTUFFbkNwMUMsS0FBSzJtSSx3QkFBd0J6aEIsRUFBV3hpRixJQUV4QzFpQyxLQUFLK2tJLFVBS0wva0ksS0FBSzJtSSx3QkFBd0J6aEIsRUFBV3hpRixJQUN4QzFpQyxLQUFLK2tJLFVBR2pCeGdJLE1BQU8sWUFHSXZFLEtBQUt3akksaUJBQWlCOWdHLEVBQU8wUyxTQUtoRCxJQUFLLElBQUl0NEMsRUFBSSxFQUFHQSxFQUFJK3BILEVBQU14a0gsT0FBUXZGLElBQ2xDLENBQ0ksTUFBTW9vSCxFQUFZMkIsRUFBTS9wSCxHQUNsQmlnSSxFQUFRLzhILEtBQUtrakksZ0JBQWdCMEQsd0JBQXdCNW1JLEtBQUsyNUgsT0FBT3NCLFlBQVkvVixJQUFZNlgsTUFFL0YsSUFBSyxJQUFJNXNILEVBQUksRUFBR0EsRUFBSTRzSCxFQUFNMTZILE9BQVE4TixJQUNsQyxDQUNJLE1BQU11eUIsRUFBU3E2RixFQUFNNXNILElBQ2pCblEsS0FBS20wSCxPQUFPN2hILElBQUlvd0IsRUFBTzBTLE1BQVNwMUMsS0FBSzJtSSx3QkFBd0J6aEIsRUFBV3hpRixLQU14RTFpQyxLQUFLd2pJLGlCQUFpQjlnRyxFQUFPMFMsTUFFN0JveEYsRUFBbUI5akcsRUFBTzBTLEtBQU9wMUMsS0FBS3dqSSxpQkFBaUI5Z0csRUFBTzBTLFlBQ3ZEcDFDLEtBQUt3akksaUJBQWlCOWdHLEVBQU8wUyxNQU14Q3F4RixFQUFnQi9qRyxFQUFRd2lGLEtBSWhDLElBQUssTUFBTTl2RSxLQUFPcDFDLEtBQUt3akksaUJBRW5CeGpJLEtBQUt3akksaUJBQWlCcHVGLEdBQUtqQixRQUUvQm4wQyxLQUFLd2pJLGlCQUFtQmdELEVBRzVCLFVBQVd0aEIsRUFBVzJoQixFQUFZN0csR0FFOUIsSUFBSThHLEVBQWE5bUksS0FBSyttSSx5QkFBeUI3aEIsRUFBVzJoQixHQUd0RGpCLEVBQW1CejlILEtBQUtDLElBQUksR0FBSXBJLEtBQUt5aUksVUFBVTU5RyxNQUFRN2tCLEtBQUsyNUgsT0FBTzlvQixXQUFXaHNGLE9BQVMsR0FDdkZnaEgsRUFBbUIxOUgsS0FBS0MsSUFBSSxHQUFJcEksS0FBS3lpSSxVQUFVMzlHLE9BQVM5a0IsS0FBSzI1SCxPQUFPOW9CLFdBQVcvckYsUUFBVSxHQUV6RmdoSCxFQUFrQmdCLEVBQVdsN0YsS0FBTzVyQyxLQUFLeWlJLFVBQVU3MkYsS0FBT2c2RixFQUMxREcsRUFBa0JlLEVBQVd4Z0IsSUFBTXRtSCxLQUFLeWlJLFVBQVVuYyxJQUFNdWYsRUFFeERHLEVBQWNGLEVBQWtCLEdBQUtBLEVBQWtCLEVBQ3ZERyxFQUFjRixFQUFrQixHQUFLQSxFQUFrQixFQUV2REcsRUFBVS85SCxLQUFLQyxJQUFJLEVBQUcwOUgsR0FDdEJLLEVBQVVoK0gsS0FBS0MsSUFBSSxFQUFHMjlILEdBRXRCaUIsRUFBZ0JoQixFQUFjYSxFQUFXOU4sV0FDekNrTyxFQUFnQmhCLEVBQWNZLEVBQVc5TixXQUl6Q21PLEVBQWUvK0gsS0FBS3dKLElBQUlrMUgsRUFBV2gyQixXQUFXaHNGLE1BQU9tN0csRUFBSW43RyxNQUFRZ2lILEVBQVc5TixZQUFjaU4sRUFDMUZtQixFQUFnQmgvSCxLQUFLd0osSUFBSWsxSCxFQUFXaDJCLFdBQVcvckYsT0FBUWs3RyxFQUFJbDdHLE9BQVMraEgsRUFBVzlOLFlBQWNrTixFQUU3RkcsRUFBWWorSCxLQUFLQyxJQUFJLEVBQUdELEtBQUtrVixNQUFNNnBILElBQ25DYixFQUFhbCtILEtBQUtDLElBQUksRUFBR0QsS0FBS2tWLE1BQU04cEgsSUFFcENDLEVBQWNoQixFQUFZUyxFQUFXOU4sV0FDckNzTyxFQUFlaEIsRUFBYVEsRUFBVzlOLFdBRTNDLzRILEtBQUtnakksS0FBS3NFLFVBQ050SCxFQUNBZ0gsRUFBZUMsRUFDZkcsRUFBYUMsRUFDYm5CLEVBQVNDLEVBQ1RDLEVBQVdDLEdBR25CLHdCQUF5Qm5oQixFQUFXcWlCLEdBRWhDLE9BQU92bkksS0FBS3NsSSxlQUFlcGdCLEVBQVdtZ0IsRUFBb0JrQyxFQUFZdm5JLEtBQUtvakksYUFHL0UsZUFBZ0JsZSxFQUFXMmhCLEdBRXZCLE1BQU1DLEVBQWE5bUksS0FBSyttSSx5QkFBeUI3aEIsRUFBVzJoQixHQUc1RCxPQUFPN21JLEtBQUt5aUksVUFBVTZCLGlCQUFpQixDQUNuQ2hlLElBQUt3Z0IsRUFBV3hnQixJQUNoQjhVLE9BQVEwTCxFQUFXeGdCLElBQU11Z0IsRUFBV2gyQixXQUFXL3JGLE9BQy9DOG1CLEtBQU1rN0YsRUFBV2w3RixLQUNqQkMsTUFBT2k3RixFQUFXbDdGLEtBQU9pN0YsRUFBV2gyQixXQUFXaHNGLFFBSXZELHlCQUEwQnFnRyxFQUFXMmhCLEdBRWpDLE1BQU01TSxFQUFjajZILEtBQUsybEksZ0JBQWdCemdCLEdBRXpDLE1BQU8sQ0FDSG9CLElBQUsyVCxFQUFZM1QsSUFBTXVnQixFQUFXaHRILE9BQU95c0csSUFDekMxNkUsS0FBTXF1RixFQUFZcnVGLEtBQU9pN0YsRUFBV2h0SCxPQUFPK3hCLE1BSW5ELGdCQUFpQnM1RSxHQUViLE9BQU9sbEgsS0FBSzI1SCxPQUFPTyxjQUFjaFYsRUFBVyxDQUFDZSxnQkFBZ0IsSUFJakUsS0FBTWYsRUFBV2dVLEVBQWdCRCxHQUU3Qmo1SCxLQUFLNGpJLGtCQUNMNWpJLEtBQUtpa0ksTUFBTS9lLEVBQVdnVSxFQUFnQkQsR0FFbENqNUgsS0FBSzhpSSxPQUFPc0IsaUJBRVpwa0ksS0FBSzhpSSxPQUFPc0IsZ0JBQWdCcGtJLEtBQUswN0gsZUFBZWg3SCxRQUFTd2tILEdBSWpFLE1BQU9BLEVBQVdnVSxFQUFnQkQsR0FHOUIsTUFBTXlNLEVBQWExbEksS0FBSzI1SCxPQUFPTyxjQUFjaFYsR0FHdkNvQixFQUR3Qm9mLEVBQVdwZixJQUFNNFMsRUFDWC93SCxLQUFLa1YsTUFBTXJkLEtBQUt5aUksVUFBVTM5RyxPQUFTLEdBR2pFOG1CLEVBRDBCODVGLEVBQVc5NUYsS0FBT3F0RixFQUNYOXdILEtBQUtrVixNQUFNcmQsS0FBS3lpSSxVQUFVNTlHLE1BQVEsR0FFekU3a0IsS0FBS3lpSSxVQUFVbmMsSUFBTUEsRUFDckJ0bUgsS0FBS3lpSSxVQUFVNzJGLEtBQU9BLEVBRXRCNXJDLEtBQUtta0ksVUFHVCwyQkFBNEJ0bUgsR0FFeEI3ZCxLQUFLNGpJLGtCQUVMLE1BQU00RCxFQUFjM3BILEVBQVEycEgsWUFDdEJDLEVBQXNCem5JLEtBQUs4aUksT0FBTzJFLG9CQUV4Q3puSSxLQUFLdWpJLFdBQWEsRUFBcUJsQyxRQUFRLENBQzNDRSxTQUFVMWpILEVBQVEwakgsU0FDbEJDLFdBQVkzakgsRUFBUTJqSCxXQUNwQkMsU0FBV2h2SCxJQUVQelMsS0FBSzBuSSxxQkFBcUJGLEVBQVkvMEgsSUFDdEN6UyxLQUFLOGlJLE9BQU82RSxzQkFBc0JsMUgsRUFBTzJsSCxXQUVyQ3FQLEdBRUFBLEtBR1IvRixNQUFRNStHLElBRUFqRixFQUFRNmpILE9BRVI3akgsRUFBUTZqSCxNQUFNNStHLEdBR2Q5aUIsS0FBSzhpSSxPQUFPc0Isa0JBQW9CdGhILEVBQUtxL0csYUFFckNuaUksS0FBSzhpSSxPQUFPc0IsZ0JBQWdCcGtJLEtBQUswN0gsZUFBZWg3SCxRQUFTLFNBTXpFLGtCQUVRVixLQUFLdWpJLGFBRUx2akksS0FBS3VqSSxXQUFXcjRGLFNBQ2hCbHJDLEtBQUt1akksV0FBYSxNQUkxQixjQUFlcmUsR0FFWCxJQUFLbGxILEtBQUsyNUgsT0FFTixPQUFPLEVBS1gsUUFGYTM1SCxLQUFLMjVILE9BQU9zQixZQUFZL1YsSUFPOUJsbEgsS0FBS3lpSSxVQUFVNkIsaUJBQWlCdGtJLEtBQUsyNUgsT0FBTzNULGNBQWNkLElBR3JFLG1CQUVJLE9BQU9sbEgsS0FBSzA3SCxlQUFlaDdILFFBRy9CLFVBRUlWLEtBQUs0akksa0JBR0xwbUksT0FBT2lJLEtBQUt6RixLQUFLd2pJLGtCQUFrQjMzSCxRQUFTZzFCLElBRXhDLE1BQU1oZ0MsRUFBVWIsS0FBS3dqSSxpQkFBaUIzaUcsVUFDL0I3Z0MsS0FBS3dqSSxpQkFBaUIzaUcsR0FFN0JoZ0MsRUFBUXN6QyxTQUNUbjBDLE1BRUhBLEtBQUsraUksUUFBUW4rRyxXQUFXNDdFLFlBQVl4Z0csS0FBSytpSSxVQUlqRCxTQUFTc0MsRUFBcUIzaUcsRUFBUWtsRyxHQUVsQyxJQUFJN08sRUFXSixPQVBJQSxFQUZnQixPQUFoQjZPLEVBRWEsRUFJQXovSCxLQUFLbTZHLElBQUksRUFBR3NsQixFQUFjbGxHLEVBQU8wMUYsV0FHM0MsQ0FDSHlQLGdCQUFpQm5sRyxFQUFPMDFGLFVBQ3hCVyxXQUFZQSxFQUNaN25GLElBQUt4TyxFQUFPd08sSUFDWnVyRixJQUFLLzVGLEVBQU8rNUYsSUFDWjVyQixXQUFZLENBQ1Joc0YsTUFBTzZkLEVBQU9tdUUsV0FBV2hzRixNQUFRazBHLEVBQ2pDajBHLE9BQVE0ZCxFQUFPbXVFLFdBQVcvckYsT0FBU2kwRyxHQUV2Q2wvRyxPQUFRLENBQ0oreEIsS0FBTWxKLEVBQU83b0IsT0FBTyt4QixLQUFPbXRGLEVBQzNCelMsSUFBSzVqRixFQUFPN29CLE9BQU95c0csSUFBTXlTLEdBRTdCM2pGLElBQUsxUyxFQUFPMFMsS0FJcEIsU0FBUzB2RixFQUFheDZDLEVBQVV3OUMsR0FFNUIsR0FBSXg5QyxJQUFhdzlDLEVBRWIsTUFBTyxDQUNIN0MsTUFBTyxHQUNQM2lFLFFBQVMsSUFJakIsTUFBTUEsRUFBVWdvQixFQUFTMzVFLE9BQU9vM0gsSUFBNEMsSUFBaENELEVBQVN0M0gsUUFBUXUzSCxJQUk3RCxNQUFPLENBQ0g5QyxNQUhVNkMsRUFBU24zSCxPQUFPcTNILElBQTRDLElBQWhDMTlDLEVBQVM5NUUsUUFBUXczSCxJQUl2RDFsRSxRQUFTQSxHQ3RrQkYsU0FBUzAzRCxFQUFtQjlVLEVBQVc1TyxHQUVsRCxNQUFNeWpCLEVBQU96akIsRUFBUzJ4QixxQkFBcUIvaUIsR0FFM0MsTUFBTyxDQUNIcmdHLE1BQU8xYyxLQUFLMDFELE1BQU1rOEQsRUFBS2wxRyxPQUN2QkMsT0FBUTNjLEtBQUswMUQsTUFBTWs4RCxFQUFLajFHLFNDSmpCLFNBQVNvakgsRUFBcUJDLEdBSXpDLE9BR0osU0FBc0JBLEdBRWxCLE1BQU03eEIsRUFBVzZ4QixFQUFhN3hCLFNBRXhCOHhCLEVBQWUsR0FDckIsSUFBSUMsRUFBVyxLQUNYQyxFQUFnQixHQUVwQixNQUFNQyxFQUFvQixLQUV0QixJQUFLLElBQUl6ckksRUFBSSxFQUFHMHJJLEVBQU9GLEVBQWNqbUksT0FBUXZGLEVBQUkwckksRUFBTTFySSxJQUVuRHNySSxFQUFhaG1JLEtBQUssQ0FBRWttSSxFQUFjeHJJLEtBRXRDd3JJLEVBQWdCLElBR3BCaHlCLEVBQVN1USxNQUFNaDdHLFFBQVMsQ0FBQ3U1RyxFQUFNaGdILEtBRTNCLE1BQU1xakksRUFBYSxDQUNmcmpJLE1BQU9BLEVBQ1B5ckcsV0FBWW1wQixFQUFrQjUwSCxFQUFPa3hHLEdBQ3JDb3lCLE9BQVNweUIsRUFBU295QixPQUFTdGpCLEVBQUtzakIsUUFJL0JQLEVBQWFRLG1CQUFzQkYsRUFBV0MsU0FHOUNELEVBQVdDLE1BSUcsSUFBVnRqSSxHQUFlZ2dILEVBQUt3akIsYUFHekJSLEVBQWFobUksS0FBSyxDQUFDcW1JLElBQ25CRixLQUVrQixPQUFiRixFQUVMQSxFQUFXSSxHQUlYTCxFQUFhaG1JLEtBQUssQ0FBQ2ltSSxFQUFVSSxJQUM3QkosRUFBVyxLQUNYRSxLQWhCQUQsRUFBY2xtSSxLQUFLcW1JLE1BcUJWLE9BQWJKLElBRUFELEVBQWFobUksS0FBSyxDQUFDaW1JLElBQ25CRSxLQUdKLE9BQU9ILEVBL0RXUyxDQUFhVixHQUVkMTJILElBQUlVLEdBZ0V6QixTQUF5Q2cySCxFQUFjaDJILEdBRW5ELE1BQU0wc0gsRUFBcUJzSixFQUFhdEosbUJBRXhDLEdBQXdCLElBQXBCMXNILEVBQVM5UCxPQUNULE9Bb0NSLFNBQTRCZ21JLEVBQVVTLEVBQVdqSyxHQUU3QyxNQUFNa0ssRUFBV1YsRUFBU3gzQixXQUNwQm00QixFQUFZRixFQUFVajRCLFdBRXRCL3JGLEVBQVMzYyxLQUFLQyxJQUFJMmdJLEVBQVNqa0gsT0FBUWtrSCxFQUFVbGtILFFBRW5ELElBQUlELEVBQU9va0gsRUFBaUJDLEVBRTVCLEdBQUlySyxFQUNKLENBQ0ksTUFBTXNLLEVBQVdoaEksS0FBS0MsSUFBSTJnSSxFQUFTbGtILE1BQU9ta0gsRUFBVW5rSCxPQUVwREEsRUFBbUIsRUFBWHNrSCxFQUVSRixFQUFrQkUsRUFBV0osRUFBU2xrSCxNQUN0Q3FrSCxFQUFtQkMsT0FJbkJ0a0gsRUFBUWtrSCxFQUFTbGtILE1BQVFta0gsRUFBVW5rSCxNQUNuQ29rSCxFQUFrQixFQUNsQkMsRUFBbUJILEVBQVNsa0gsTUFHaEMsTUFBTyxDQUNIZ3NGLFdBQVksQ0FDUi9yRixPQUFRQSxFQUNSRCxNQUFPQSxHQUVYZ2lHLE1BQU8sQ0FDSCxDQUNJemhILE1BQU9pakksRUFBU2pqSSxNQUNoQnlyRyxXQUFZazRCLEVBQ1p4SyxZQUFhLENBQ1RqWSxJQUFLLEVBQ0wxNkUsS0FBTXE5RixJQUdkLENBQ0k3akksTUFBTzBqSSxFQUFVMWpJLE1BQ2pCeXJHLFdBQVltNEIsRUFDWnpLLFlBQWEsQ0FDVGpZLElBQUssRUFDTDE2RSxLQUFNczlGLE1BaEZYRSxDQUFtQmozSCxFQUFTLEdBQUlBLEVBQVMsR0FBSTBzSCxHQUV4RCxNQUFNelosRUFBT2p6RyxFQUFTLEdBQ2hCazNILEVBQVdqa0IsRUFBS3ZVLFdBTXRCLElBQUl5NEIsRUFFQUEsRUFEQWxrQixFQUFLc2pCLE1BQ3dCLElBQWZ0akIsRUFBS2hnSCxPQUFleTVILEVBQXNCd0ssRUFBU3hrSCxNQUFRLEVBRTVELEVBQXVCd2tILEVBQVN4a0gsTUFBUSxFQUFJLEVBRTdELE1BQU0wa0gsRUFDRjFLLElBQXVCc0osRUFBYTd4QixTQUFTdVEsTUFBTXpCLEVBQUtoZ0gsT0FBT3dqSSxZQUluRSxNQUFPLENBQ0gvM0IsV0FBWSxDQUNSL3JGLE9BQVF1a0gsRUFBU3ZrSCxPQUNqQkQsTUFBTzBrSCxFQUFnRCxFQUFqQkYsRUFBU3hrSCxNQUFZd2tILEVBQVN4a0gsT0FFeEVnaUcsTUFBTyxDQUFDLENBQ0p6aEgsTUFBT2dnSCxFQUFLaGdILE1BQ1ptNUgsWUFBYSxDQUNUalksSUFBSyxFQUNMMTZFLEtBQU0wOUYsR0FFVno0QixXQUFZdzRCLEtBcEdhRyxDQUFnQ3JCLEVBQWNoMkgsSUNMcEUsU0FBU3MzSCxFQUFxQnRCLEdBRXpDLE1BQU11QixFQUFnQnZCLEVBQWFyUCxTQUFTajBHLE1BQ3RDeXhGLEVBQVc2eEIsRUFBYTd4QixTQUN4QnF6QixFQUFjeEIsRUFBYXdCLFlBQzNCQyxFQUFrQnpCLEVBQWF5QixnQkFDL0JDLEVBQWUxQixFQUFhMEIsYUFDNUJsQixFQUFvQlIsRUFBYVEsa0JBR2pDbUIsR0FBYUosRUFET0csR0FBZ0JGLEVBQWMsSUFDQUEsRUFDbERJLEVBQWdCRCxFQUdoQkUsRUFBWSxFQUFvQkgsRUFBZXZ6QixFQUFTMnpCLFNBQVdILEVBQVlELEVBQWV2ekIsRUFBUzR6QixTQUFXSixFQUVsSHQzSCxFQUFTLEdBQ2YsSUFBSTIzSCxFQUFlLEdBRW5CLE1BMEJNQyxFQUFnQixDQUNsQnRsSCxPQUFRa2xILEVBQ1JubEgsTUFBTzZrSCxHQStDWCxPQTVDQXB6QixFQUFTdVEsTUFBTWg3RyxRQUFTLENBQUN1NUcsRUFBTUYsS0FFM0IsSUFBS3lqQixHQUFxQnJ5QixFQUFTb3lCLFFBQVV0akIsRUFBS3NqQixNQUM5QyxPQUdKLE1BQU0yQixFQXJDb0JDLEtBSTFCLE1BQU1DLEVBQWdCRCxFQUFTbHRJLEVBQUVrdEksRUFBU2x0SSxFQUFFaUYsT0FBUyxHQUMvQ21vSSxFQUFxQkQsRUFBY2oyRixFQUFJaTJGLEVBQWNob0ksRUFFM0QsSUFBSXVuSSxFQUFXVyxFQWFmLE9BWEliLEdBRUFFLEdBQWFFLEVBQVlILEdBQWdCVyxFQUN6Q0MsRUFBYVQsRUFBWUgsSUFJekJDLEVBQVlDLEVBQ1pVLEVBQWFYLEVBQVlVLEdBR3RCLENBQ0gzbEgsTUFBTzFjLEtBQUtrVixNQUFNeXNILEdBQ2xCaGxILE9BQVEzYyxLQUFLa1YsTUFBTW90SCxLQWVKQyxDQUFzQnRsQixHQUN6QyxJQUFJa2tCLEVBQWFuaEksS0FBSzAxRCxNQUFNc3NFLEVBQWE5bkksUUFBVXduSSxFQUFlRSxHQUFpQkYsR0FHL0VELElBRUFOLElBQWVTLEVBQWdCTSxFQUFXeGxILE9BQVMsR0FJdkRzbEgsRUFBYS9uSSxLQUFLLENBQ2RnRCxNQUFPOC9HLEVBQ1ByVSxXQUFZdzVCLEVBQ1o5TCxZQUFhLENBQ1RqWSxJQUFLLEVBQ0wxNkUsS0FBTTA5RixLQUlWYSxFQUFhOW5JLFNBQVdzbkksSUFFeEJuM0gsRUFBT3BRLEtBQUssQ0FDUnl1RyxXQUFZdTVCLEVBQ1p2akIsTUFBT3NqQixJQUdYQSxFQUFlLE1BSW5CQSxFQUFhOW5JLE9BQVMsR0FFdEJtUSxFQUFPcFEsS0FBSyxDQUNSeXVHLFdBQVl1NUIsRUFDWnZqQixNQUFPc2pCLElBSVIzM0gsRUMxRkksU0FBU200SCxFQUFnQi8vSCxHQUVwQyxHQUFJQSxFQUFTb3dILE9BRVQsT0FBT3lPLEVBQW9CbUIsRUFBTWhnSSxFQUFVLENBQ3ZDLFdBQ0EsV0FDQSxjQUNBLGtCQUNBLGVBQ0EsdUJBSVIsQ0FDSSxNQUFNc3pILEVBQVMwTSxFQUFNaGdJLEVBQVUsQ0FBQyxXQUFZLHFCQUFzQixzQkFFbEUsT0FBSUEsRUFBU2lnSSxhQUNGM0MsRUFBb0JoSyxHQ3JCeEIsU0FBaUNpSyxHQUU1QyxNQUFNN3hCLEVBQVc2eEIsRUFBYTd4QixTQUd4QnVRLEVBQVEsR0FrQmQsT0FqQkF2USxFQUFTdVEsTUFBTWg3RyxRQUFTLENBQUN1NUcsRUFBTWhnSCxLQUUzQixJQUFLK2lJLEVBQWFRLG1CQUFxQnJ5QixFQUFTb3lCLFFBQVV0akIsRUFBS3NqQixNQUMzRCxPQUVKLE1BQU1XLEVBQVdyUCxFQUFrQjUwSCxFQUFPa3hHLEdBRTFDdVEsRUFBTXprSCxLQUFLLENBQ1B5dUcsV0FBWXc0QixFQUNaeGlCLE1BQU8sQ0FBQyxDQUNKemhILE1BQU9BLEVBQ1BtNUgsWUFBYSxDQUFFalksSUFBSyxFQUFHMTZFLEtBQU0sR0FDN0JpbEUsV0FBWXc0QixRQUtqQnhpQixFREFRaWtCLENBQXVCNU0sSUFJMUMsU0FBUzBNLEVBQU90OEcsRUFBSzdvQixHQUVqQixNQUFNZzlELEVBQU0sR0FLWixPQUpBaDlELEVBQUtvRyxTQUFRLFNBQVV4TixHQUVuQm9rRSxFQUFJcGtFLEdBQU9pd0IsRUFBSWp3QixNQUVab2tFLEVFbkNJLFNBQVNzb0UsRUFBbUJybUQsR0FFdkMsTUFBTXAyRCxFQUFNLEdBT1osT0FMQW8yRCxFQUFRNzRFLFFBQVU2MkIsS0FRdEIsU0FBdUJwVSxFQUFLb2tFLEdBRXhCbDFGLE9BQU9pSSxLQUFLaXRGLEdBQU83bUYsUUFBVXhOLElBRXpCYixPQUFPQyxlQUFlNndCLEVBQUtqd0IsRUFBSyxDQUM1QlYsSUFBSyxJQUVNKzBGLEVBQU1yMEYsR0FFakI0RixJQUFLLEtBR0QsTUFBTSxJQUFJekMsVUFBVSx1QkFBeUJuRCxRQWxCckQyc0ksQ0FBYzE4RyxFQUFLb1UsS0FHaEJwVSxFQ1ZJLE1BQU0yOEcsRUFFakIsWUFBYXB0SCxHQUVUN2QsS0FBS2tySSxnQkFBa0JydEgsRUFBUXF0SCxpQkFBbUIsR0FDbERsckksS0FBSzJsRyxxQkFBdUI5bkYsRUFBUThuRixzQkFBd0IsR0FDNUQzbEcsS0FBS21ySSxZQUFjdHRILEVBQVFzdEgsWUFHL0IsUUFBUzlzSSxFQUFLTixFQUFPNk0sR0FHakIsSUFBSXdnSSxFQUFrQixLQWF0QixHQVhBcHJJLEtBQUttckksWUFBWTd3RixLQUFLLENBQUMrd0YsRUFBWWptSSxJQUUzQmltSSxFQUFXaHRJLE1BQVFBLElBS3ZCK3NJLEVBQWtCaG1JLEdBQ1gsSUFHYSxPQUFwQmdtSSxFQUVBLE9BQU8sRUFJWCxNQUFNRSxFQUFlLEdBQ3JCQSxFQUFhanRJLEdBQU9OLEVBQ3BCLE1BQU13dEksRUFBVUMsRUFBc0I1Z0ksRUFBVTBnSSxFQUFjdHJJLE1BRTlELE9BQVFBLEtBQUt5ckksZUFBZUwsRUFBaUJydEksRUFBT3d0SSxHQUd4RCxTQUFVM2dJLEdBRU41SyxLQUFLMHJJLGlCQUFpQixHQUFJOWdJLEdBRzlCLG9CQUFxQkEsRUFBVWlULEdBRTNCLE1BQU04dEgsRUFBU251SSxPQUFPNGhDLE9BQU8sR0FBSXZoQixHQUVqQyxPQURBN2QsS0FBSzBySSxpQkFBaUI5Z0ksRUFBVStnSSxHQUN6QkEsRUFHWCxpQkFBa0IvZ0ksRUFBVWlULEdBRXhCLE1BQU0rdEgsRUFBa0JKLEVBQXNCNWdJLEVBQVVpVCxFQUFTN2QsTUFDakVBLEtBQUs2ckksa0JBQWtCaHVILEVBQVMrdEgsR0FHcEMsa0JBQW1CL3RILEVBQVMwdEgsR0FFeEJ2ckksS0FBS21ySSxZQUFZdC9ILFFBQVEsQ0FBQ3cvSCxFQUFZam1JLEtBRWxDLElBQUt5WSxFQUFRbGYsZUFBZTBzSSxFQUFXaHRJLEtBRW5DLE9BR0osTUFBTTh0QixFQUFRdE8sRUFBUXd0SCxFQUFXaHRJLEtBQzNCeXRJLEVBQVk5ckksS0FBS3lySSxlQUFlcm1JLEVBQU8rbUIsRUFBT28vRyxHQUVoRE8sSUFFS0EsRUFBVUMsbUJBNkYvQixTQUFzQjF0SSxFQUFLMnRJLEVBQVVGLEdBRWpDbnBJLFFBQVFDLEtBQUsscUJBQXVCdkUsRUFBTSxLQUFPMnRJLEVBQVcsV0FBYUYsRUFBWSxhQTdGckVHLENBQVlaLEVBQVdodEksSUFBSzh0QixFQUFPMi9HLEVBQVUvdEksT0FHakQ4ZixFQUFRd3RILEVBQVdodEksS0FBT3l0SSxFQUFVL3RJLFFBRXpDaUMsTUFHUCxlQUFnQm9GLEVBQU8rbUIsRUFBT28vRyxHQUUxQixNQUFNRixFQUFhcnJJLEtBQUttckksWUFBWS9sSSxHQUVwQ21tSSxFQUFRbm1JLE1BQVFBLEVBRWhCLElBQUkybUksR0FBb0IsRUFDeEIsTUFBTTdOLEVBQVMsQ0FDWGdPLGdCQUFpQixLQUViSCxHQUFvQixJQUl0QkksRUFBY2QsRUFBVzc5RixTQUFTcmhCLEVBQU9vL0csRUFBUWEsTUFBT2xPLEdBRTlELFlBQW9CaDlILElBQWhCaXJJLEdBQTZCQSxJQUFnQmhnSCxFQUV0QyxLQUdKLENBQ0hwdUIsTUFBT291SSxFQUNQSixrQkFBbUJBLElBYy9CLFNBQVNQLEVBQXVCNWdJLEVBQVVpVCxFQUFTd3VILEdBRS9DLE1BQU1kLEVBQVUsQ0FDWmEsTUFBTyxHQUNQaG5JLE1BQU8sTUFHTGtuSSxFQUFTQyxFQUFZanVJLEtBQUssS0FBTXNNLEVBQVVpVCxHQUUxQzhsQixFQUFhLEdBa0NuQixPQWhDQTBvRyxFQUFPbkIsZ0JBQWdCci9ILFFBQVMyZ0ksSUFFNUI3b0csRUFBVzZvRyxHQUFlLENBQ3RCN3VJLElBQUsydUksRUFBT2h1SSxLQUFLLEtBQU1rdUksTUFJL0JILEVBQU8xbUMscUJBQXFCOTVGLFFBQVM0Z0ksSUFFakM5b0csRUFBVzhvRyxFQUFXcHVJLEtBQU8sQ0FDekJWLElBQUs4dUksRUFBVzl1SSxPQUl4QjB1SSxFQUFPbEIsWUFBWXQvSCxRQUFTLENBQUN3L0gsRUFBWUQsS0FFckN6bkcsRUFBVzBuRyxFQUFXaHRJLEtBQU8sQ0FDekJWLElBQUssS0FFRCxHQUFJeXRJLEVBQWtCRyxFQUFRbm1JLE1BRTFCLE9BQU9rbkksRUFBT2pCLEVBQVdodEksS0FHN0IsTUFBTXF1SSxFQUFhTCxFQUFPbEIsWUFBWUksRUFBUW5tSSxPQUFPL0csSUFDckQsTUFBTSxJQUFJbUQsVUFBVSx5QkFBMkI2cEksRUFBV2h0SSxJQUFNLHFCQUF1QnF1SSxPQUtuR2x2SSxPQUFPbXZJLGlCQUFpQnBCLEVBQVFhLE1BQU96b0csR0FFaEM0bkcsRUFRWCxTQUFTZ0IsRUFBYXpnSCxFQUFNOGdILEVBQVd2dUksR0FFbkMsT0FBSUEsS0FBT3V1SSxFQUVBQSxFQUFVdnVJLEdBR2R5dEIsRUFBS3p0QixHQy9LRCxNQUFNd3VJLEVBRWpCLFlBQWF2MEQsRUFBT3o2RCxHQUVoQkEsRUFBVUEsR0FBVyxHQUVyQjdkLEtBQUt1Nkgsc0JBQXdCMThHLEVBQVEwOEcsdUJBQXlCLEVBQzlEdjZILEtBQUtzNEUsTUFBUUEsRUFDYnQ0RSxLQUFLOHNJLEtBQU85c0ksS0FBSytzSSxNQUFRL3NJLEtBQUtndEksT0FBU2h0SSxLQUFLaXRJLFFBQVVqdEksS0FBS2t0SSxpQkFBbUIsS0FFOUVsdEksS0FBS210SSxhQUdULGlCQUFrQmhTLEdBRWQsT0FBT243SCxLQUFLb3RJLHFCQUFxQmpTLElBQVduN0gsS0FBS3F0SSxtQkFBbUJsUyxHQUd4RSxtQkFBb0JBLEdBRWhCLE1BQU03VSxFQUFNdG1ILEtBQUtzbUgsSUFBTXRtSCxLQUFLdTZILHNCQUN0QmEsRUFBU3A3SCxLQUFLbzdILE9BQVNwN0gsS0FBS3U2SCxzQkFFbEMsT0FDSStTLEVBQWFuUyxFQUFPN1UsSUFBS0EsRUFBSzhVLElBQzlCa1MsRUFBYW5TLEVBQU9DLE9BQVE5VSxFQUFLOFUsSUFDaENELEVBQU83VSxLQUFPQSxHQUFPNlUsRUFBT0MsUUFBVUEsRUFJL0MscUJBQXNCRCxHQUVsQixNQUFNdnZGLEVBQU81ckMsS0FBSzRyQyxLQUFPNXJDLEtBQUt1Nkgsc0JBQ3hCMXVGLEVBQVE3ckMsS0FBSzZyQyxNQUFRN3JDLEtBQUt1Nkgsc0JBRWhDLE9BQ0krUyxFQUFhblMsRUFBT3Z2RixLQUFNQSxFQUFNQyxJQUNoQ3loRyxFQUFhblMsRUFBT3R2RixNQUFPRCxFQUFNQyxJQUNoQ3N2RixFQUFPdnZGLE1BQVFBLEdBQVF1dkYsRUFBT3R2RixPQUFTQSxFQUloRCxhQUdJN3JDLEtBQUtndEksT0FBU2h0SSxLQUFLczRFLE1BQU0yL0MsWUFDekJqNEgsS0FBS2l0SSxRQUFVanRJLEtBQUtzNEUsTUFBTWkxRCxhQUUxQnZ0SSxLQUFLOHNJLEtBQU85c0ksS0FBS3M0RSxNQUFNd3lDLFVBQ3ZCOXFILEtBQUsrc0ksTUFBUS9zSSxLQUFLczRFLE1BQU11eUMsV0FHNUIsbUJBQW9CaGEsR0FFaEI3d0csS0FBS2t0SSxpQkFBbUJyOEIsRUFFcEJBLElBRUE3d0csS0FBSzhzSSxLQUFPcG1ILEVBQU0xbUIsS0FBSzhzSSxLQUFNLEVBQUdqOEIsRUFBVy9yRixPQUFTOWtCLEtBQUtpdEksU0FDekRqdEksS0FBSytzSSxNQUFRcm1ILEVBQU0xbUIsS0FBSytzSSxNQUFPLEVBQUdsOEIsRUFBV2hzRixNQUFRN2tCLEtBQUtndEksVUEwQnRFLFNBQVNRLEVBQXlCdjhCLEVBQU93OEIsR0FFckMsTUFBTUMsRUFBYyxJQUFNejhCLEVBQ3BCdnVFLEVBQVMsU0FBV3V1RSxFQUFNaCtELE9BQU8sR0FBRzkzQixjQUFnQjgxRixFQUFNdndHLE1BQU0sR0FFdEUsTUFBTyxDQUNIL0MsSUFBSyxXQUVELE9BQU9xQyxLQUFLMHRJLElBRWhCenBJLElBQUssU0FBVTA2RSxHQUVYLElBQUkzOEMsRUFFSixHQUFJaGlDLEtBQUtrdEksaUJBQ1QsQ0FFSWxyRyxFQUFhdGIsRUFBTWk0RCxFQUFVLEVBRFYzK0UsS0FBS2t0SSxpQkFBaUJPLEdBQXVCenRJLEtBQUt5dEksU0FLckV6ckcsRUFBYTJyRyxFQUFTaHZELEVBQVUsR0FHcEMzK0UsS0FBSzB0SSxHQUFlMXRJLEtBQUtzNEUsTUFBTTUxQyxHQUFVVixJQUtyRCxTQUFTNHJHLEVBQXdCQyxHQUU3QixNQUFPLENBQ0hsd0ksSUFBSyxXQUVELE9BQU9xQyxLQUFLLElBQU02dEksS0FLOUIsU0FBU1AsRUFBY3oxRyxFQUFPMk4sRUFBT3RlLEdBRWpDLE9BQU8yUSxHQUFTMk4sR0FBUzNOLEdBQVMzUSxFQUd0QyxTQUFTUixFQUFPM29CLEVBQU80VCxFQUFLdkosR0FFeEIsT0FBT3VsSSxFQVFYLFNBQW1CNXZJLEVBQU9xSyxHQUV0QixPQUFPRCxLQUFLd0osSUFBSTVULEVBQU9xSyxHQVZQMGxJLENBQVMvdkksRUFBT3FLLEdBQU11SixHQUcxQyxTQUFTZzhILEVBQVU1dkksRUFBTzRULEdBRXRCLE9BQU94SixLQUFLQyxJQUFJckssRUFBTzRULEdBeEUzQm5VLE9BQU9tdkksaUJBQWlCRSxFQUFTbnVJLFVBQVcsQ0FDeEM0bkgsSUFBS2tuQixFQUF3QixNQUFPLFVBQ3BDNWhHLEtBQU00aEcsRUFBd0IsT0FBUSxTQUV0QzNvSCxNQUFPK29ILEVBQXVCLFNBQzlCOW9ILE9BQVE4b0gsRUFBdUIsVUFFL0J4UyxPQUFRLENBQ0p6OUgsSUFBSyxXQUVELE9BQU9xQyxLQUFLOHNJLEtBQU85c0ksS0FBS2l0SSxVQUdoQ3BoRyxNQUFPLENBQ0hsdUMsSUFBSyxXQUVELE9BQU9xQyxLQUFLK3NJLE1BQVEvc0ksS0FBS2d0SSxXQ25FckMsTUFBTSxFQUFRLEVBQVEsR0FBUixDQUFpQixtQkFFL0IsU0FBU2UsSUFDTCxPQUFPQSxFQUFXanZCLFVBRXRCaXZCLEVBQVdqdkIsUUFBVSxFQUlyQixNQUFNa3ZCLEVBQXFCLENBQ3ZCLENBQ0kzdkksSUFBSyxlQUNMbXZDLFNBQVUsQ0FBQ3p2QyxFQUFPNk0sS0FFZCxHQUFJN00sRUFBUSxHQUFLQSxHQUFTNk0sRUFBUzByRyxTQUFTdVEsTUFBTXhrSCxPQUM5QyxPQUFPLElBR25CLENBQ0loRSxJQUFLLGlCQUNMbXZDLFNBQVd6dkMsR0FFQW9LLEtBQUtDLElBQUksRUFBR3JLLElBRzNCLENBQ0lNLElBQUssaUJBQ0xtdkMsU0FBVSxDQUFDenZDLEVBQU82TSxJQUVQekMsS0FBS0MsSUFBSXJLLEVBQU82TSxFQUFTcWpJLGlCQUd4QyxDQUNJNXZJLElBQUssY0FDTG12QyxTQUFVLENBQUN6dkMsRUFBTzZNLEtBR2QsR0FBSTdNLEVBQVE2TSxFQUFTcWpJLGdCQUFrQmx3SSxFQUFRNk0sRUFBU3NqSSxlQUNwRCxPQUFPdGpJLEVBQVNzakksaUJBRzVCLENBQ0k3dkksSUFBSyxlQUNMbXZDLFNBQVUsQ0FBQ3p2QyxFQUFPNk0sRUFBVXN6SCxLQU14QixHQUZBQSxFQUFPZ08sa0JBRUhudUksRUFBUSxHQUFLQSxFQUFRNk0sRUFBUzByRyxTQUFTNjNCLFFBQ3ZDLE9BQU92akksRUFBUzByRyxTQUFTNjNCLFVBR3JDLENBQ0k5dkksSUFBSyxlQUNMbXZDLFNBQVUsQ0FBQ3p2QyxFQUFPNk0sRUFBVXN6SCxJQUlwQm5nSSxFQUFRNk0sRUFBUzByRyxTQUFTNjNCLFNBRTFCalEsRUFBT2dPLGtCQUNBLEdBR1BudUksRUFBUSxHQUFLQSxFQUFRNk0sRUFBUzZ0SCxhQUN2QixPQURYLEdBSVIsQ0FDSXA2SCxJQUFLLFlBQ0xtdkMsU0FBVSxDQUFDenZDLEVBQU82TSxFQUFVc3pILElBRXBCbmdJLEVBQVE2TSxFQUFTMHJHLFNBQVM2M0IsU0FFMUJqUSxFQUFPZ08sa0JBQ0EsR0FHUG51SSxFQUFRNk0sRUFBUzR0SCxjQUFnQno2SCxFQUFRNk0sRUFBUzZ0SCxhQUMzQzd0SCxFQUFTNHRILGtCQURwQixJQU1HLE1BQU0sRUFFakIsWUFBYS9zSCxFQUFTb1MsRUFBU3U1RyxHQUUzQnAzSCxLQUFLb3VJLGFBQWUzaUksRUFDcEJ6TCxLQUFLbzNILGVBQWlCQSxFQUl0QnAzSCxLQUFLdTRILFlBQWMsQ0FDZjhWLG1CQUFvQixDQUFDLEdBQ3JCL1UsZ0JBQWlCLEVBQ2pCTCxpQkFBa0IsRUFDbEJxVixrQkFBbUIsRUFDbkJ2cEIsR0FBSSxLQUNKd3BCLGtCQUFrQixFQUNsQkMsb0JBQW9CLEVBQ3BCNVgsYUFBYyxLQUNkNlgsWUFBYSxHQUNiQyxjQUFjLEVBQ2RDLGNBQWMsRUFDZEMsV0FBVyxFQUNYblIsUUFBUSxFQUNSbm5CLFNBQVUsS0FDVnU0QixjQUFjLEVBQ2RoWCxTQUFVLEVBQ1YrQyxjQUFlLEVBQ2YvOEcsUUFBU0EsRUFDVDhrSCxhQUFjLEtBQ2RtTSxZQUFhLEdBQ2JDLGFBQWMsSUFBSXZULEVBQ2xCd1QsVUFBVyxHQUNYWixhQUFjcHVJLEtBQUtvdUksYUFDbkJhLHVCQUF3QixLQUN4QkMsZ0JBQWlCLEdBQ2pCelUsU0FBVSxLQUNWMFUsYUFBYyxFQUNkQyxlQUFnQixFQUNoQjEvRyxTQUFVLEdBQ1YyL0csbUJBQW9CLEVBQ3BCQyxRQUFTLEtBQ1RwVyxlQUFnQixFQUNoQnFXLGdCQUFpQixFQUNqQnpwQixZQUFhLEtBQ2JnVCxTQUFVLEtBQ1YzZ0csZ0JBQWlCLEtBQ2pCcTNHLGVBQWdCLEtBQ2hCOXBCLGFBQWMsS0FHbEIxbEgsS0FBSzRLLFNBQVdtZ0ksRUFBbUIsQ0FBQ2x0SCxFQUFTN2QsS0FBS3U0SCxjQUdsRCxNQUFNa1gsRUFBVzFCLElBQ2pCL3RJLEtBQUt1NEgsWUFBWXhULEdBQUssUUFBVTBxQixFQUFXLElBQzNDenZJLEtBQUt1NEgsWUFBWTdvRyxTQUFXMXZCLEtBQUs0SyxTQUFTbTZHLEdBRzFDdm5ILE9BQU9tdkksaUJBQWlCM3NJLEtBQUs0SyxTQUFVLENBRW5DOGtJLFlBQWEsQ0FDVC94SSxJQUFLLElBRU1xQyxLQUFLdTRILFlBQVlPLFNBQVNoMEcsUUFJekM2cUgsV0FBWSxDQUNSaHlJLElBQUssSUFFTXFDLEtBQUt1NEgsWUFBWU8sU0FBU2owRyxTQUs3QzdrQixLQUFLNHZJLGlCQUFtQixJQUFJM0UsRUFBaUIsQ0FDekN0bEMscUJBQXNCLENBQ2xCLENBQ0l0bkcsSUFBSyxXQUNMVixJQUFLLElBRU1xQyxLQUFLdTRILFlBQVlqaUIsV0FLcEM2MEIsWUFBYTZDLElBR2pCaHVJLEtBQUt1NEgsWUFBWTZXLGVDMUxWLFdBRVgsSUFBSWx1QixFQUFRMzRHLFNBQVNTLGNBQWMsS0FDbkNrNEcsRUFBTTczRyxNQUFNd2IsTUFBUSxPQUNwQnE4RixFQUFNNzNHLE1BQU15YixPQUFTLFFBRXJCLElBQUl3ekQsRUFBUS92RSxTQUFTUyxjQUFjLE9BQ25Dc3ZFLEVBQU1qdkUsTUFBTXBFLFNBQVcsV0FDdkJxekUsRUFBTWp2RSxNQUFNaTlHLElBQU0sTUFDbEJodUMsRUFBTWp2RSxNQUFNdWlDLEtBQU8sTUFDbkIwc0MsRUFBTWp2RSxNQUFNbTlHLFdBQWEsU0FDekJsdUMsRUFBTWp2RSxNQUFNd2IsTUFBUSxRQUNwQnl6RCxFQUFNanZFLE1BQU15YixPQUFTLFFBQ3JCd3pELEVBQU1qdkUsTUFBTThVLFNBQVcsU0FDdkJtNkQsRUFBTXJpRCxZQUFZaXJGLEdBRWxCMzRHLFNBQVNrUSxLQUFLd2QsWUFBWXFpRCxHQUUxQixJQUFJdTNELEVBQUszdUIsRUFBTTR1QixZQUNmeDNELEVBQU1qdkUsTUFBTThVLFNBQVcsU0FDdkIsSUFBSTR4SCxFQUFLN3VCLEVBQU00dUIsWUFNZixPQUxJRCxJQUFPRSxJQUNQQSxFQUFLejNELEVBQU0yL0MsYUFHZjF2SCxTQUFTa1EsS0FBSytuRixZQUFZbG9CLEdBQ25CdTNELEVBQUtFLEVEZ0swQkMsR0FHbENod0ksS0FBS3U0SCxZQUFZc1csa0JBQXNDM3RJLElBQXZCMEgsT0FBT3FuSSxZQUVQLE9BQTVCcHlILEVBQVFxeUgsa0JBSUpyeUgsRUFBUXF5SCxnQkFESyxJQUFiVCxFQUMwQixHQUVBQSxFQUFXLElBSTdDLE1BQU1VLEVBQVkxYyxFQUFJLE1BQU96ekgsS0FBS293SSxVQUFVLFFBQVMsQ0FBRW5aLE1BQU8sZ0JBQ3hEb1osRUFBZTVjLEVBQUksTUFBT3p6SCxLQUFLb3dJLFVBQVUsWUFBYUQsR0FDdERHLEVBQVk3YyxFQUFJLE1BQU96ekgsS0FBS293SSxVQUFVLFNBQ3hDQyxFQUNBNWMsRUFBSSxNQUFPenpILEtBQUtvd0ksVUFBVSxZQUN0QixDQUNJM2MsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGVBQ3BCeEQsRUFBSSxNQUFPLENBQUV3RCxNQUFPLGtCQUloQ2ozSCxLQUFLdTRILFlBQVkzQixhQUFldVosRUFDaENud0ksS0FBS3U0SCxZQUFZcGdHLGdCQUFrQms0RyxFQUNuQ3J3SSxLQUFLdTRILFlBQVlvSyxhQUFlMk4sRUFFaEN0d0ksS0FBS3U0SCxZQUFZa1csWUFBYzBCLEVBQy9CbndJLEtBQUt1NEgsWUFBWWlYLGVBQWlCYSxFQUNsQ3J3SSxLQUFLdTRILFlBQVl1VyxZQUFjd0IsRUFFL0J0d0ksS0FBSzRLLFNBQVN3akksYUFBYWhsSSxPQUFPa25JLEdBRWxDdHdJLEtBQUt1NEgsWUFBWU8sU0FBVyxJQUFJK1QsRUFBUzdzSSxLQUFLdTRILFlBQVlwZ0csZ0JBQWlCLENBQ3ZFb2lHLHNCQUF1QnY2SCxLQUFLNEssU0FBUzJsSSxpQkFHekN2d0ksS0FBS3d3SSxvQkFBc0J4d0ksS0FBS3l3SSxlQUFlbnlJLEtBQUswQixNQUNwREEsS0FBSzB3SSxvQkFBc0Ixd0ksS0FBSzJ3SSxlQUFlcnlJLEtBQUswQixNQUdwREEsS0FBSzR3SSxjQUNMNXdJLEtBQUs2d0ksZUFHTDd3SSxLQUFLOHdJLGVBR1QsY0FBZXp5SSxFQUFLTixHQUVoQixPQUFPaUMsS0FBSzR2SSxpQkFBaUJtQixRQUFRMXlJLEVBQUtOLEVBQU9pQyxLQUFLdTRILFlBQVkxNkcsU0FHdEUsVUFBV216SCxFQUFPbGxILEdBRWQsTUFBTW1sSCxFQUFRLENBQ1ZucEksR0FBSTlILEtBQUs0SyxTQUFTbTZHLEdBQUtpc0IsRUFDdkIvWixNQUFPLFFBQVUrWixHQUdyQixPQUFJbGxILEVBQ090dUIsT0FBTzRoQyxPQUFPNnhHLEVBQU9ubEgsR0FFckJtbEgsRUFHZixZQUFhL3JCLEVBQVc5SSxHQUVwQixPQUFPcDhHLEtBQUs0SyxTQUFTMHJHLFNBQVN1USxNQUFNM0IsR0FBVzluSCxFQUFFNEMsS0FBSzRLLFNBQVN3dEgsV0FBV2hjLEdBSTlFLGNBRUlwOEcsS0FBS3U0SCxZQUFZTyxTQUFTeFMsSUFBTSxFQUdoQ3YvRyxhQUFhL0csS0FBS3U0SCxZQUFZNFcsYUFHbEMsaUJBQWtCdHhILEVBQVN4ZixHQUV2QixPQUFPQSxLQUFPd2YsR0FBV0EsRUFBUXhmLEtBQVMyQixLQUFLNEssU0FBU3ZNLEdBSTVELGVBQWdCbVosR0FFTSxLQUFkQSxFQUFFMDVILFNBRUZseEksS0FBS28zSCxlQUFlK1osc0JBUTVCLGFBQWNDLEdBRVYsTUFBTUMsRUFBZSxHQW9FckIsR0FsRUFELEVBQWFweEksS0FBSzR2SSxpQkFBaUIwQixvQkFBb0J0eEksS0FBSzRLLFNBQVV3bUksR0FHbEVweEksS0FBS3V4SSxpQkFBaUJILEVBQVksZUFFbENweEksS0FBS3U0SCxZQUFZcUMsYUFBZTU2SCxLQUFLNEssU0FBU3d0SCxVQUM5Q3A0SCxLQUFLdTRILFlBQVkxNkcsUUFBUXU2RyxVQUFZZ1osRUFBV2haLFVBQ2hEaVosRUFBYWp2SSxLQUFLLENBQUMscUJBQXNCZ3ZJLEVBQVdoWixhQUlwRHA0SCxLQUFLdXhJLGlCQUFpQkgsRUFBWSxpQkFFbENweEksS0FBS3U0SCxZQUFZMTZHLFFBQVE4ckgsWUFBY3lILEVBQVd6SCxZQUNsRDBILEVBQWFqdkksS0FBSyxDQUFDLHlCQUEwQmd2SSxFQUFXekgsZUFJeEQzcEksS0FBS3V4SSxpQkFBaUJILEVBQVksd0JBQ2xDcHhJLEtBQUt1NEgsWUFBWTE2RyxRQUFRZ2hILG1CQUFxQnVTLEVBQVd2UyxvQkFHekQ3K0gsS0FBS3V4SSxpQkFBaUJILEVBQVksdUJBRWxDcHhJLEtBQUt1NEgsWUFBWTE2RyxRQUFROHFILGtCQUFvQnlJLEVBQVd6SSxtQkFJeEQsaUJBQWtCeUksR0FFbEJweEksS0FBS3U0SCxZQUFZMTZHLFFBQVFtN0csYUFBZW9ZLEVBQVdwWSxhQUUvQyxtQkFBb0JvWSxJQUNwQnB4SSxLQUFLdTRILFlBQVlXLGVBQWlCa1ksRUFBV2xZLGdCQUU3QyxxQkFBc0JrWSxJQUN0QnB4SSxLQUFLdTRILFlBQVlVLGlCQUFtQm1ZLEVBQVduWSxtQkFLbkRqNUgsS0FBS3U0SCxZQUFZMTZHLFFBQVFtN0csYUFBZWg1SCxLQUFLNEssU0FBUzB1SCxpQkFHdER0NUgsS0FBS3V4SSxpQkFBaUJILEVBQVksV0FBYXB4SSxLQUFLdXhJLGlCQUFpQkgsRUFBWSxtQkFFN0UsV0FBWUEsSUFDWnB4SSxLQUFLdTRILFlBQVkxNkcsUUFBUW05RyxPQUFTb1csRUFBV3BXLFFBRTdDLGlCQUFrQm9XLElBQ2xCcHhJLEtBQUt1NEgsWUFBWTE2RyxRQUFRZ3RILGFBQWV1RyxFQUFXdkcsY0FFdkR3RyxFQUFhanZJLEtBQUssQ0FBQyxnQkFBaUJwQyxLQUFLNEssU0FBU293SCxVQUlsRGg3SCxLQUFLdXhJLGlCQUFpQkgsRUFBWSxrQkFFbENweEksS0FBS3U0SCxZQUFZMTZHLFFBQVEyekgsYUFBZUosRUFBV0ksYUFDbkR4eEksS0FBS3l4SSxrQkFBa0JMLEdBQ3ZCQyxFQUFhanZJLEtBQUssQ0FBQyxnQkFBaUJwQyxLQUFLNEssU0FBUzRtSSxnQkFHdER4eEksS0FBSzB4SSxjQUNMMXhJLEtBQUsyeEksZ0NBRUQzeEksS0FBS3U0SCxZQUFZa0MsU0FDckIsQ0FHSSxNQUFNbVgsRUFBaUIsQ0FDbkJ2VCxZQUFhc00sRUFBZTNxSSxLQUFLNEssVUFDakNzVCxRQUFTbGUsS0FBSzZ4SSxhQUNkcFosYUFBY3o0SCxLQUFLNEssU0FBU293SCxPQUFTLEtBQU9oN0gsS0FBS3U0SCxZQUFZamlCLFNBQVM2M0IsUUFDdEV0UCxtQkFBb0I3K0gsS0FBSzRLLFNBQVNpMEgsb0JBQXNCNytILEtBQUs0SyxTQUFTb3dILFFBR3BFMEksRUFBbUIsQ0FDckJ0TCxVQUFXcDRILEtBQUs0SyxTQUFTb3dILE9BQVMsS0FBT2g3SCxLQUFLNEssU0FBU3d0SCxVQUN2RFMsV0FBWTc0SCxLQUFLNEssU0FBU291SCxhQUMxQkUsZUFBZ0JsNUgsS0FBS3U0SCxZQUFZVyxlQUNqQ0QsaUJBQWtCajVILEtBQUt1NEgsWUFBWVUsa0JBR2pDNlksRUFBaUI5eEksS0FBSyt4SSwyQkFFNUIsR0FBSSxFQUFNOWtCLFFBQ1YsQ0FDSSxNQUFNK2tCLEVBQWF4MEksT0FBT2lJLEtBQUttc0ksR0FDMUJqaEksUUFBTyxTQUFVdFMsR0FHZCxNQUFlLGdCQUFSQSxHQUFpQyxZQUFSQSxLQUVuQ29ULEtBQUksU0FBVXBULEdBRVgsTUFBTU4sRUFBUTZ6SSxFQUFldnpJLEdBQzdCLE9BQU9BLEVBQU0sS0FBTzRNLEtBQUtNLFVBQVV4TixNQUV0Q3lpQixLQUFLLE1BRVYsRUFBTSxpQkFBa0J3eEgsR0FHNUJoeUksS0FBS3U0SCxZQUFZa0MsU0FBUzF2SCxLQUFLNm1JLEVBQWdCbE8sRUFBa0JvTyxHQVFyRSxPQUxBVCxFQUFheGxJLFFBQVVoQixJQUVuQjdLLEtBQUttNUgsUUFBUWo2SCxNQUFNYyxLQUFNNkssTUFHdEIsRUFJWCxrQkFBbUJnVCxHQUdmLE1BQU1vMEgsRUFBY3AwSCxFQUFRMnpILGFBQWUsTUFBUSxTQUNuRHh4SSxLQUFLdTRILFlBQVl1VyxZQUFZN2xJLFVBQVVncEksR0FBYSxtQkFDcEQxcEksU0FBU2tRLEtBQUt4UCxVQUFVZ3BJLEdBQWEsdUJBQ3JDanlJLEtBQUs0SyxTQUFTd2pJLGFBQWFubEksVUFBVWdwSSxHQUFhLG1CQUdsRCxNQUFNQyxFQUFlbHlJLEtBQUs0SyxTQUFTOGtJLFlBQzdCeUMsRUFBY255SSxLQUFLNEssU0FBUytrSSxXQUlsQyxHQUhBM3ZJLEtBQUt1NEgsWUFBWU8sU0FBU3FVLGNBR3JCbnRJLEtBQUt1NEgsWUFBWWtGLFNBQVd6OUgsS0FBSzRLLFNBQVNvd0gsVUFBWSxtQkFBb0JuOUcsR0FDL0UsQ0FFSSxNQUFNOHdHLEVBQVkzdUgsS0FBSzRLLFNBQVM4a0ksWUFDMUIwQyxFQUFXcHlJLEtBQUs0SyxTQUFTK2tJLFdBRy9CM3ZJLEtBQUt1NEgsWUFBWVcsaUJBQW9CZ1osRUFBZXZqQixHQUFhLEVBQ2pFM3VILEtBQUt1NEgsWUFBWVUsbUJBQXNCa1osRUFBY0MsR0FBWSxFQUlqRXYwSCxFQUFRMnpILGFBQ1JqcEksU0FBUzFFLGlCQUFpQixRQUFTN0QsS0FBSzB3SSxxQkFFeENub0ksU0FBU3ZFLG9CQUFvQixRQUFTaEUsS0FBSzB3SSxxQkFJbkQsZ0NBRUksTUFBTTJCLEVBQVVyeUksS0FBSzRLLFNBQVNvd0gsT0FBU0YsRUFBYyxHQUVqRDk2SCxLQUFLdTRILFlBQVl6UyxhQUFpQjlsSCxLQUFLdTRILFlBQVl6Uyx1QkFBdUJ1c0IsSUFFMUVyeUksS0FBS3U0SCxZQUFZelMsWUFBWWgrRixVQUM3QjluQixLQUFLdTRILFlBQVl6UyxZQUFjLE1BRzlCOWxILEtBQUt1NEgsWUFBWXpTLGNBQ2xCOWxILEtBQUt1NEgsWUFBWXpTLFlBQWMsSUFBSXVzQixFQUFRcnlJLE9BRTFDQSxLQUFLdTRILFlBQVlrQyxVQUNsQno2SCxLQUFLc3lJLHFCQUliLHFCQUVJLE1BQU1DLEVBQWUsRUFBU0MseUJBRTlCLEdBQUlELEVBRUF2eUksS0FBS3l5SSxVQUFVRixPQUduQixDQUNJLE1BQU0xMEgsRUFBVSxDQUNaaTdHLFNBQVU5NEgsS0FBS3U0SCxZQUFZTyxTQUMzQjZKLGFBQWMzaUksS0FBS3U0SCxZQUFZb0ssYUFDL0IvTCxhQUFjNTJILEtBQUt1NEgsWUFBWTNCLGFBQy9CaHNILFNBQVU1SyxLQUFLNEssVUFHYjQzSCxFQUFRLENBQ1ZxQixlQUFnQixLQUVaN2pJLEtBQUt1NEgsWUFBWXpTLFlBQVkrZCxrQkFFakNHLGNBQWUsS0FFWGhrSSxLQUFLMHlJLHFCQUNMMXlJLEtBQUt1NEgsWUFBWXpTLFlBQVlrZSxpQkFFakNJLGdCQUFpQixDQUFDdmQsRUFBTzRTLEtBRXJCejVILEtBQUsweUkscUJBQ0wxeUksS0FBS3U0SCxZQUFZelMsWUFBWXNlLGdCQUFnQnZkLEVBQU80UyxJQUV4RGdPLG9CQUFxQixLQUVqQnpuSSxLQUFLMHlJLHNCQUVUMU4sZUFBaUI5ZixJQUVibGxILEtBQUttNUgsUUFBUSxlQUFnQmpVLElBRWpDeWlCLHNCQUF3QnZQLElBRXBCcDRILEtBQUttNUgsUUFBUSxzQkFBdUJmLEtBSTVDcDRILEtBQUt1NEgsWUFBWWtDLFNBQVcsSUFBSSxFQUFTNThHLEVBQVMya0gsSUFJMUQsMkJBRUksR0FBSXhpSSxLQUFLNEssU0FBU293SCxPQUNsQixDQUNJLE1BQU0yWCxFQUFxQixDQUN2QmpPLHdCQUEwQnRmLEdBRWYsQ0FBQ3V0QixFQUFtQi9MLHdCQUF3QnhoQixJQUV2RHdoQix3QkFBMEJ4aEIsSUFNZixDQUNIZ1QsVUFBVyxFQUNYMStFLEtBQU0sRUFDTjJpRixLQUFNLEVBQ05VLE1BQU8sQ0FBQyxDQUNKM25GLElBVElwMUMsS0FBSzRLLFNBQVMwckcsU0FBU3M4QixnQkFBZ0J4dEIsRUFBS2hnSCxNQUFPLENBQzNEeWYsTUFBT3VnRyxFQUFLdlUsV0FBV2hzRixRQVNuQnV6RyxVQUFXLEVBQ1hsbkYsSUFBSyxFQUNMdXJGLElBQUssRUFDTDVyQixXQUFZdVUsRUFBS3ZVLFdBQ2pCaDNGLE9BQVEsQ0FDSnlzRyxJQUFLLEVBQ0wxNkUsS0FBTSxRQU8xQixPQUFPK21HLEVBR1gsTUFBTUUsRUFBaUIsQ0FDbkJodUgsTUFBTzdrQixLQUFLNEssU0FBU2tvSSxVQUNyQmh1SCxPQUFROWtCLEtBQUs0SyxTQUFTbW9JLFlBRzFCLE1BQU8sQ0FDSG5NLHdCQUEwQnhoQixHQUVmcGxILEtBQUs0SyxTQUFTMHJHLFNBQVMwOEIsa0JBQWtCNXRCLEVBQUtoZ0gsTUFBTytDLEtBQUs4OUIsS0FBS2ptQyxLQUFLNEssU0FBU3d0SCxXQUFZeWEsR0FFcEduTyx3QkFBMEJ0ZixJQUV0QixNQUFNc1gsRUFBUyxHQUNUdVcsRUFBYWp6SSxLQUFLdTRILFlBQVlqaUIsU0FBUzYzQixRQUU3QyxJQUFLLElBQUlyUixFQUFNLEVBQUdBLEdBQVNtVyxFQUFZblcsSUFFbkNKLEVBQU90NkgsS0FBS3BDLEtBQUs0SyxTQUFTMHJHLFNBQVMwOEIsa0JBQWtCNXRCLEVBQUtoZ0gsTUFBTzAzSCxFQUFPK1YsSUFLNUUsT0FGQW5XLEVBQU81MEYsVUFFQTQwRixJQUtuQixhQUVJLElBQUl3VyxFQUFZQyxFQUNaQyxFQUFhQyxFQWdCakIsT0FkSXJ6SSxLQUFLNEssU0FBU293SCxRQUVkb1ksRUFBY3B6SSxLQUFLNEssU0FBU2kvSCxhQUM1QnFKLEVBQWFDLEVBQWNFLEVBQWMsSUFJekNILEVBQWFsekksS0FBSzRLLFNBQVNpMEgsbUJBQXFCNytILEtBQUt1NEgsWUFBWWdYLGdCQUFrQixFQUNuRjRELEVBQWNuekksS0FBSzRLLFNBQVNpMEgsbUJBQXFCLEVBQUk3K0gsS0FBS3U0SCxZQUFZK1Ysa0JBRXRFOEUsRUFBY3B6SSxLQUFLNEssU0FBU2kwSCxtQkFBcUIsRUFBSTcrSCxLQUFLdTRILFlBQVlnWCxnQkFDdEU4RCxFQUFjcnpJLEtBQUs0SyxTQUFTaTBILG1CQUFxQjcrSCxLQUFLdTRILFlBQVkrVixrQkFBb0IsR0FHbkYsQ0FDSC9sSSxTQUFVLENBQ04rOUcsSUFBSzhzQixFQUNMaFksT0FBUWdZLEVBQ1J4bkcsS0FBTXluRyxFQUNOeG5HLE1BQU93bkcsR0FFWGp1QixLQUFNLENBQ0ZrQixJQUFLNHNCLEVBQ0w5WCxPQUFRLEVBQ1J4dkYsS0FBTXVuRyxFQUNOdG5HLE1BQU8sSUFLbkIscUJBRUk3ckMsS0FBS3U0SCxZQUFZd1csYUFBYXVFLGVBQzFCdHpJLEtBQUt1NEgsWUFBWWtDLFNBQVM4WSxvQkFLbEMsV0FBWXBiLEVBQWNxYixHQUd0QixJQUFLeHpJLEtBQUt5ekksY0FBYyxZQUFhdGIsR0FDakMsT0FBTyxFQU1YLEdBSEFuNEgsS0FBS3U0SCxZQUFZaVgsZUFBZXhySSxvQkFBb0IsU0FBVWhFLEtBQUt3d0ksc0JBRzlEZ0QsRUFDTCxDQUNJLE1BQU0xYSxFQUFXOTRILEtBQUt1NEgsWUFBWU8sU0FDNUI0YSxFQUFnQjF6SSxLQUFLdTRILFlBQVlrQyxTQUFTZCxPQUFPM1QsY0FBY2htSCxLQUFLNEssU0FBUzB1SCxpQkFFbkZrYSxFQUFhLENBQ1QzYSxXQUFZNzRILEtBQUs0SyxTQUFTMHVILGdCQUMxQnovRyxPQUFRLENBQ0oreEIsS0FBT2t0RixFQUFTajBHLE1BQVEsR0FBTTZ1SCxFQUFjOW5HLEtBQU9rdEYsRUFBU2x0RixNQUM1RDA2RSxJQUFNd1MsRUFBU2gwRyxPQUFTLEdBQU00dUgsRUFBY3B0QixJQUFNd1MsRUFBU3hTLE9BS3ZFLE1BQU1xdEIsRUFBYTN6SSxLQUFLdTRILFlBQVlrQyxTQUFTZCxPQUFPM1QsY0FBY3d0QixFQUFXM2EsWUFHdkUrYSxFQUFrQkQsRUFBVy9uRyxLQUFPNG5HLEVBQVczNUgsT0FBTyt4QixNQUN2RDVyQyxLQUFLNEssU0FBU2t1SCxTQUFTbHRGLEtBQVE1ckMsS0FBSzRLLFNBQVNrdUgsU0FBU2owRyxNQUFRLEdBQzdEZ3ZILEVBQWtCRixFQUFXcnRCLElBQU1rdEIsRUFBVzM1SCxPQUFPeXNHLEtBQ3REdG1ILEtBQUs0SyxTQUFTa3VILFNBQVN4UyxJQUFPdG1ILEtBQUs0SyxTQUFTa3VILFNBQVNoMEcsT0FBUyxHQUU3RGd2SCxFQUEyQixDQUFDMWIsRUFBVzJiLEtBRXpDLE1BQU1DLEVBQVk3ckksS0FBS202RyxJQUFJLEVBQUc4VixFQUFZMmIsR0FJcEM5YSxFQUFvQnVhLEVBQVczNUgsT0FBTyt4QixLQUFPb29HLEVBQWFKLEVBQzFEMWEsRUFBa0JzYSxFQUFXMzVILE9BQU95c0csSUFBTTB0QixFQUFhSCxFQUU3RCxNQUFPLENBQ0h6YixVQUFXQSxFQUNYUyxXQUFZMmEsRUFBVzNhLFdBQ3ZCSyxlQUFnQkEsRUFDaEJELGlCQUFrQkEsSUFJMUJqNUgsS0FBS3U0SCxZQUFZMTZHLFFBQVF1NkcsVUFBWUQsRUFDckMsSUFBSThiLEVBQW1CajBJLEtBQUt1NEgsWUFBWXFDLGFBQ3hDNTZILEtBQUt1NEgsWUFBWXFDLGFBQWU1NkgsS0FBSzRLLFNBQVN3dEgsVUFDOUMsTUFBTThiLEVBQWNKLEVBQXdCM2IsRUFBYzhiLEdBQzFEajBJLEtBQUt1NEgsWUFBWTE2RyxRQUFRbTdHLGFBQWVrYixFQUFZcmIsV0FDcEQ3NEgsS0FBS3U0SCxZQUFZVyxlQUFpQmdiLEVBQVloYixlQUM5Q2w1SCxLQUFLdTRILFlBQVlVLGlCQUFtQmliLEVBQVlqYixpQkFFaERqNUgsS0FBS3U0SCxZQUFZa0MsU0FBUzBaLDJCQUEyQixDQUNqRDVTLFNBQVV2aEksS0FBSzRLLFNBQVM4NkcsYUFDeEI4YixXQUFZLENBQ1JwSixVQUFXLENBQ1Boc0gsS0FBTTZuSSxFQUNOcnRILEdBQUl1eEcsSUFHWnFQLFlBQWNoRyxHQUVIc1MsRUFBd0J0UyxFQUFXcEosVUFBVzZiLEdBRXpEdlMsTUFBUTUrRyxJQUVKOWlCLEtBQUt1NEgsWUFBWWlYLGVBQWUzckksaUJBQWlCLFNBQVU3RCxLQUFLd3dJLHFCQUU1RDF0SCxFQUFLcS9HLGNBQ0xuaUksS0FBS3U0SCxZQUFZcUMsYUFBZXpDLE1BSzVDLElBQUlpYyxFQUFlN3JJLFNBQVNDLGVBQWV4SSxLQUFLNEssU0FBUzhrQixTQUFXLGtCQUNoRTJrSCxFQUFnQjlySSxTQUFTQyxlQUFleEksS0FBSzRLLFNBQVM4a0IsU0FBVyxtQkFZckUsT0FYQTBrSCxFQUFhbDRILFVBQVcsRUFDeEJtNEgsRUFBY240SCxVQUFXLEVBQ3pCclYsV0FBVyxLQUVQdXRJLEVBQWFsNEgsVUFBVyxFQUN4Qm00SCxFQUFjbjRILFVBQVcsR0FDMUJsYyxLQUFLNEssU0FBUzg2RyxjQUdqQjFsSCxLQUFLbTVILFFBQVEscUJBQXNCaEIsSUFFNUIsRUFXWCxXQUFZalQsRUFBV292QixHQUVuQixJQUFJQyxPQUE4QixJQUFoQixFQUE4QnYwSSxLQUFLNEssU0FBUzB1SCxnQkFBa0JwVSxFQUVoRixNQUFlLFdBQVhvdkIsR0FBa0MsV0FBWEEsRUFFaEJsNEgsU0FBU3BjLEtBQUt3MEksWUFBWUQsRUFBTSxLQUFPLEVBQUcsSUFFakMsV0FBWEQsRUFFRWw0SCxTQUFTcGMsS0FBS3cwSSxZQUFZRCxFQUFNLEtBQU92MEksS0FBSzRLLFNBQVM4a0ksWUFBYyxFQUFHLElBSXRFdHpILFNBQVNwYyxLQUFLNEssU0FBUzhrSSxZQUFjLEVBQUcsSUFLdkQsV0FBWXhxQixFQUFXb3ZCLEdBRW5CLElBQUlDLE9BQThCLElBQWhCLEVBQThCdjBJLEtBQUs0SyxTQUFTMHVILGdCQUFrQnBVLEVBRWhGLE1BQWUsU0FBWG92QixFQUVPbDRILFNBQVNwYyxLQUFLNEssU0FBUytrSSxXQUFhLEVBQUcsSUFFOUIsVUFBWDJFLEVBRUVsNEgsU0FBU3BjLEtBQUt3MEksWUFBWUQsRUFBTSxLQUFPdjBJLEtBQUs0SyxTQUFTK2tJLFdBQWEsRUFBRyxJQUlyRXZ6SCxTQUFTcGMsS0FBS3cwSSxZQUFZRCxFQUFNLEtBQU8sRUFBRyxJQUt6RCxrQkFXSSxPQVRBdjBJLEtBQUt1NEgsWUFBWU8sU0FBU3FVLGFBR3RCbnRJLEtBQUt1NEgsWUFBWWtDLFdBRWpCejZILEtBQUt5MEksZ0JBQ0x6MEksS0FBS3U0SCxZQUFZa0MsU0FBU3NKLEtBQUsvakksS0FBSzRLLFNBQVMwdUgsZ0JBQWlCdDVILEtBQUt1NEgsWUFBWVcsZUFBZ0JsNUgsS0FBS3U0SCxZQUFZVSxvQkFHN0csRUFHWCxnQkFFSSxNQUFNeU0sRUFBYTFsSSxLQUFLdTRILFlBQVlrQyxTQUFTZCxPQUFPZiw4QkFBOEI1NEgsS0FBSzRLLFNBQVMwdUgsZ0JBQWlCdDVILEtBQUt1NEgsWUFBWU8sVUFFOUg0TSxJQUVBMWxJLEtBQUt1NEgsWUFBWVUsaUJBQW1CeU0sRUFBV255SCxFQUMvQ3ZULEtBQUt1NEgsWUFBWVcsZUFBaUJ3TSxFQUFXL3hILEdBS3JELGtCQUdJM1QsS0FBS3U0SCxZQUFZaVgsZUFBZXZtSSxVQUFVQyxJQUFJLGNBRTlDLEVBQWM2ckgsY0FBYy8wSCxLQUFLdTRILFlBQVlpWCxlQUFnQixDQUFDMS9HLEVBQU9vb0csS0FFakUsRUFBTSx5QkFBMEJBLEVBQU90c0YsS0FBTXNzRixFQUFPNVIsS0FDcER0bUgsS0FBS3U0SCxZQUFZelMsWUFBWWlQLGNBQWNqbEcsRUFBT29vRyxLQUkxRCxXQUVJbDRILEtBQUswMEksa0JBRUwzdEksYUFBYS9HLEtBQUt1NEgsWUFBWTRXLGFBRTlCbnZJLEtBQUt1NEgsWUFBWTRXLFlBQWN0b0ksV0FBWSxLQUV2QyxNQUFNNitILEVBQWExbEksS0FBS3U0SCxZQUFZa0MsU0FBU2QsT0FBT2YsOEJBQThCNTRILEtBQUs0SyxTQUFTMHVILGdCQUFpQnQ1SCxLQUFLdTRILFlBQVlPLFVBRTlINE0sRUFFQTFsSSxLQUFLMjBJLGFBQWEsQ0FDZDNiLGFBQWNoNUgsS0FBSzRLLFNBQVMwdUgsZ0JBQzVCSixlQUFnQndNLEVBQVcveEgsRUFDM0JzbEgsaUJBQWtCeU0sRUFBV255SCxJQUtqQ3ZULEtBQUsyMEksYUFBYSxDQUNkM2IsYUFBY2g1SCxLQUFLNEssU0FBUzB1SCxtQkFHckMsS0FJUCxrQkFHUXQ1SCxLQUFLNEssU0FBU2dxSSxpQkFFZHJzSSxTQUFTa1EsS0FBSzVVLGlCQUFpQixZQUFjaXNCLElBRS9CQSxFQUFNNDVGLGNBQ2RydEcsa0JBRUssSUFPZixFQUFjZzVHLFFBQVFyMUgsS0FBS3U0SCxZQUFZaVgsZ0JBQWdCLFNBQVUxL0csRUFBT29vRyxFQUFRMXlGLEVBQU90ZSxHQUVuRixFQUFNLHFCQUFzQkEsRUFBTXNlLEVBQU8weUYsRUFBT3RzRixLQUFNc3NGLEVBQU81UixLQUM3RHRtSCxLQUFLdTRILFlBQVl6UyxZQUFZdVAsUUFBUXZsRyxFQUFPb29HLEVBQVExeUYsRUFBT3RlLE1BRy9ELEVBQWN5dUcsWUFBWTMxSCxLQUFLdTRILFlBQVlpWCxnQkFBZ0IsU0FBVTEvRyxFQUFPb29HLEdBRXhFLEVBQU0sdUJBQXdCQSxFQUFPdHNGLEtBQU1zc0YsRUFBTzVSLEtBQ2xEdG1ILEtBQUt1NEgsWUFBWXpTLFlBQVlpUCxjQUFjamxHLEVBQU9vb0csTUFLMUQsaUJBRUksTUFBTTJjLEVBQW9CNzBJLEtBQUt1NEgsWUFBWU8sU0FBU3hTLElBQzlDd3VCLEVBQXFCOTBJLEtBQUt1NEgsWUFBWU8sU0FBU2x0RixLQUVyRCxJQUFJem9CLEVBRUpuakIsS0FBS3U0SCxZQUFZTyxTQUFTcVUsYUFFMUIsTUFBTTRILEVBQWUvMEksS0FBS3U0SCxZQUFZTyxTQUFTeFMsSUFDekMwdUIsRUFBZ0JoMUksS0FBS3U0SCxZQUFZTyxTQUFTbHRGLEtBRzVDem9CLEVBREFuakIsS0FBSzRLLFNBQVNpMEgsb0JBQXNCNytILEtBQUs0SyxTQUFTb3dILE9BQ3RDK1osRUFBZUYsRUFFZkcsRUFBZ0JGLEVBRWhDOTBJLEtBQUt1NEgsWUFBWWtDLFNBQVN3YSxTQUUxQixNQUFNQyxFQUFpQmwxSSxLQUFLNEssU0FBU2kwSCxvQkFBc0I3K0gsS0FBSzRLLFNBQVNvd0gsT0FBVStaLEVBQWVDLEVBRWxHaDFJLEtBQUttNUgsUUFBUSxrQkFBbUIrYixHQUU1Qi94SCxFQUFZLEVBRVpuakIsS0FBS201SCxRQUFRLHNCQUF1QitiLEdBRS9CL3hILEVBQVksR0FFakJuakIsS0FBS201SCxRQUFRLG9CQUFxQitiLEdBR3RDbDFJLEtBQUt5MEksZ0JBSVQsZUFHSXowSSxLQUFLdTRILFlBQVlrVyxZQUFZNXFJLGlCQUFpQixZQUFhLEtBRXZEN0QsS0FBS3U0SCxZQUFZa1csWUFBWXhsSSxVQUFVQyxJQUFJLG1CQUcvQ2xKLEtBQUt1NEgsWUFBWWtXLFlBQVk1cUksaUJBQWlCLFVBQVcsS0FFckQ3RCxLQUFLdTRILFlBQVlrVyxZQUFZeGxJLFVBQVVSLE9BQU8sbUJBR2xEekksS0FBS20xSSxrQkFDTG4xSSxLQUFLdTRILFlBQVlpWCxlQUFlM3JJLGlCQUFpQixTQUFVN0QsS0FBS3d3SSxxQkFLaEVqb0ksU0FBUzFFLGlCQUFpQixlQUFpQmlzQixJQUV2QyxJQUFLOXZCLEtBQUt1NEgsWUFBWW1XLGFBQ2xCLE9BQU8sRUFHWCxHQUFLMXVJLEtBQUs0SyxTQUFTd3FJLG9CQUFzQnRsSCxFQUFNMjJFLFVBVHlDLEtBUzdCMzJFLEVBQU1vaEgsU0FBMEJseEksS0FBSzRLLFNBQVN5cUksaUJBVGlCLEtBU0V2bEgsRUFBTW9oSCxRQUc5SCxPQURBbHhJLEtBQUt1NEgsWUFBWU8sU0FBU3hTLEtBQU90bUgsS0FBSzRLLFNBQVM4a0ksYUFDeEMsRUFPWCxHQUxVMXZJLEtBQUs0SyxTQUFTd3FJLG1CQWRnRSxLQWMzQ3RsSCxFQUFNb2hILFNBRS9DcGhILEVBQU16VCxpQkFHTnJjLEtBQUs0SyxTQUFTeXFJLGdCQUNsQixDQUVJLEdBQUl2bEgsRUFBTTIyRSxVQUFZMzJFLEVBQU00NEUsU0FBVzU0RSxFQUFNblMsUUFDekMsT0FBTyxFQUVYLE9BQVFtUyxFQUFNb2hILFNBRVYsS0EzQmdHLEdBOEI1RixPQURBbHhJLEtBQUt1NEgsWUFBWU8sU0FBU3hTLEtBQU90bUgsS0FBSzRLLFNBQVM4a0ksYUFDeEMsRUFFWCxLQWhDTyxHQW1DSCxPQURBMXZJLEtBQUt1NEgsWUFBWU8sU0FBU3hTLEtBQU90bUgsS0FBSzRLLFNBQVMwcUksbUJBQ3hDLEVBRVgsS0FyQzBCLEdBd0N0QixPQURBdDFJLEtBQUt1NEgsWUFBWU8sU0FBU3hTLEtBQU90bUgsS0FBSzRLLFNBQVMwcUksbUJBQ3hDLEVBRVgsS0ExQzZDLEdBNkN6QyxPQURBdDFJLEtBQUt1NEgsWUFBWU8sU0FBU2x0RixNQUFRNXJDLEtBQUs0SyxTQUFTMHFJLG1CQUN6QyxFQUVYLEtBL0NpRSxHQWtEN0QsT0FEQXQxSSxLQUFLdTRILFlBQVlPLFNBQVNsdEYsTUFBUTVyQyxLQUFLNEssU0FBUzBxSSxtQkFDekMsRUFFWCxLQXBEZ0ksR0F1RDVILE9BREF0MUksS0FBS3U0SCxZQUFZTyxTQUFTeFMsSUFBTSxHQUN6QixFQUVYLEtBekQ2SSxHQWlFekksT0FMSXRtSCxLQUFLNEssU0FBU2kwSCxtQkFDZDcrSCxLQUFLdTRILFlBQVlPLFNBQVN4UyxJQUFNcHVFLElBRWhDbDRDLEtBQUt1NEgsWUFBWU8sU0FBU2x0RixLQUFPc00sS0FFOUIsRUFFWCxRQUNJLE9BQU8sR0FHbkIsT0FBTyxJQUdYLEVBQUsyc0UsT0FBT0MsVUFBVSxzQkFBc0IsV0FFeEN2OEcsU0FBU3ZFLG9CQUFvQixrQkFDOUJoRSxLQUFLNEssU0FBU202RyxJQUtqQm44RyxPQUFPL0UsaUJBQWlCLFNBQVU3RCxLQUFLdTFJLFNBQVNqM0ksS0FBSzBCLE9BQU8sR0FFNUQsRUFBSzZrSCxPQUFPQyxVQUFVLHNCQUFzQixXQUV4Q2w4RyxPQUFPNUUsb0JBQW9CLFNBQVVoRSxLQUFLdTFJLFVBQVUsS0FDckR2MUksS0FBSzRLLFNBQVNtNkcsSUFHYix3QkFBeUJuOEcsU0FFekJBLE9BQU8vRSxpQkFBaUIsb0JBQXFCN0QsS0FBS3UxSSxVQUFVLEdBRTVELEVBQUsxd0IsT0FBT0MsVUFBVSxzQkFBc0IsV0FFeENsOEcsT0FBTzVFLG9CQUFvQixvQkFBcUJoRSxLQUFLdTFJLFVBQVUsS0FDaEV2MUksS0FBSzRLLFNBQVNtNkcsS0FHckIsRUFBS0YsT0FBT0MsVUFBVSxxQkFBc0I5a0gsS0FBSzAwSSxnQkFBaUIxMEksS0FBSzRLLFNBQVNtNkcsSUFHaEYsRUFBS0YsT0FBT0MsVUFBVSxxQkFBc0IsS0FFcEM5a0gsS0FBS3U0SCxZQUFZa0MsVUFDakJ6NkgsS0FBS3U0SCxZQUFZa0MsU0FBUzN5RyxVQUU5Qi9nQixhQUFhL0csS0FBS3U0SCxZQUFZNFcsY0FDL0JudkksS0FBSzRLLFNBQVNtNkcsSUFHckIsY0FFSSxJQUFLL2tILEtBQUs0SyxTQUFTak0sZUFBZSxXQUM5QixPQUFPLEtBRVhxQixLQUFLdTRILFlBQVkyVyxnQkFBa0JsdkksS0FBSzRLLFNBQVM0cUksUUFBUS9qSSxJQUFNc2pDLElBRTNELE1BQU1uMkMsRUFBSSxJQUFJbTJDLEVBQU8vMEMsTUFLckIsT0FISXBCLEVBQUU2MkksWUFDRnoxSSxLQUFLdTRILFlBQVl5VyxVQUFVNXNJLEtBQUt4RCxHQUU3QkEsSUFJZixlQUVJb0IsS0FBSzAxSSxlQUVMMTFJLEtBQUt1NEgsWUFBWThXLGtCQUFvQnhvSSxXQUFZLEtBRTdDLElBQUk4dUksRUFBTXB0SSxTQUFTQyxlQUFleEksS0FBSzRLLFNBQVM4a0IsU0FBVyxZQUN2RGltSCxJQUFLQSxFQUFJdHNJLE1BQU1DLFFBQVUsVUFDOUJ0SixLQUFLNEssU0FBU2dySSxpQkFHckIsZUFHSTd1SSxhQUFhL0csS0FBS3U0SCxZQUFZOFcsbUJBRTlCLElBQUlzRyxFQUFNcHRJLFNBQVNDLGVBQWV4SSxLQUFLNEssU0FBUzhrQixTQUFXLFlBRXZEaW1ILElBQUtBLEVBQUl0c0ksTUFBTUMsUUFBVSxRQUdqQyxVQUFXN0UsR0FFUCxNQUFNb3hJLEVBQWVwaUIsRUFBSSxNQUFPenpILEtBQUtvd0ksVUFBVSxTQUFVLENBQ3JEM2MsRUFBSSxTQUFVenpILEtBQUtvd0ksVUFBVSxjQUFlLENBQUMsYUFBYyxrQkFDM0QzYyxFQUFJLElBQ0FBLEVBQUksU0FBVSxVQUVsQkEsRUFBSSxNQUFPaHZILEtBR2Z6RSxLQUFLdTRILFlBQVl1VyxZQUFZNzRHLFlBQVk0L0csR0FHekN0dEksU0FBU0MsZUFBZXhJLEtBQUs0SyxTQUFTOGtCLFNBQVcsZUFBZTdyQixpQkFBaUIsUUFBUyxLQUV0Rmd5SSxFQUFhanhILFdBQVc0N0UsWUFBWXExQyxLQUk1QyxZQUFhdi9CLEVBQVV3L0IsR0FjbkIsR0FaQTkxSSxLQUFLdTRILFlBQVlqaUIsU0FBV0EsRUFFNUJ0MkcsS0FBSzAxSSxlQUdMMTFJLEtBQUt1NEgsWUFBWVYsU0FBVzczSCxLQUFLNEssU0FBUzByRyxTQUFTdVEsTUFBTXhrSCxPQUV6RHJDLEtBQUs0dkksaUJBQWlCcGlHLFNBQVN4dEMsS0FBS3U0SCxZQUFZMTZHLFNBRWhEN2QsS0FBS201SCxRQUFRLHlCQUEwQm41SCxLQUFLNEssU0FBU2l0SCxVQUdqRDczSCxLQUFLNEssU0FBU21ySSxnQkFBa0IsRUFDcEMsQ0FDSSxNQUFNM2xDLEVBQUlqb0csS0FBSzAxRCxPQUFPNzlELEtBQUs0SyxTQUFTNHRILGFBQWV4NEgsS0FBSzRLLFNBQVM2dEgsY0FBZ0IsR0FDakZ6NEgsS0FBS3U0SCxZQUFZK1Ysa0JBQW9CbHlILFNBQVNwYyxLQUFLNEssU0FBUzByRyxTQUFTMC9CLGdCQUFnQjVsQyxHQUFLcHdHLEtBQUs0SyxTQUFTbXJJLGdCQUFpQixJQUN6SC8xSSxLQUFLdTRILFlBQVlnWCxnQkFBa0JuekgsU0FBU3BjLEtBQUs0SyxTQUFTMHJHLFNBQVMyL0IsaUJBQWlCN2xDLEdBQUtwd0csS0FBSzRLLFNBQVNtckksZ0JBQWlCLFNBS3hILzFJLEtBQUt1NEgsWUFBWStWLGtCQUFvQnR1SSxLQUFLNEssU0FBU2kvSCxhQUNuRDdwSSxLQUFLdTRILFlBQVlnWCxnQkFBa0J2dkksS0FBSzRLLFNBQVNpL0gsYUFxQnJELElBQUlxTSxFQUFhQyxFQWpCYm4ySSxLQUFLdTRILFlBQVl5VyxVQUFVM3NJLFNBRTNCckMsS0FBS3U0SCxZQUFZZ1gsZ0JBQWtCcG5JLEtBQUtDLElBQUksR0FBSXBJLEtBQUt1NEgsWUFBWWdYLGtCQUlqRXZ2SSxLQUFLNEssU0FBUzByRyxTQUFTb3lCLFFBRXZCMW9JLEtBQUt1NEgsWUFBWTE2RyxRQUFRZ3RILGNBQWUsR0FJNUM3cUksS0FBS201SCxRQUFRLGdCQUFpQm41SCxLQUFLNEssVUFHbkM1SyxLQUFLMDBJLGtCQUlMLElBQUkwQixHQUFxQixFQUNyQkMsR0FBdUIsRUF5QzNCLEdBdENnQyxNQUE1QlAsRUFBWTljLGNBRVo4YyxFQUFZOWMsYUFBZWg1SCxLQUFLNEssU0FBU291SCxhQUN6Q2tkLEVBQWNDLEdBQWMsSUFJNUJELEVBQThDLE1BQWhDSixFQUFZN2Msa0JBQTRCcDVILE1BQU1pMkksRUFBWTdjLGtCQUN4RWtkLEVBQTRDLE1BQTlCTCxFQUFZNWMsZ0JBQTBCcjVILE1BQU1pMkksRUFBWTVjLGlCQUl0RWdkLElBR2lDLElBQTdCSixFQUFZOWMsY0FBc0JoNUgsS0FBSzRLLFNBQVNpZ0ksY0FBZ0I3cUksS0FBSzRLLFNBQVNpMEgsbUJBRzlFaVgsRUFBWTdjLGlCQUFtQmo1SCxLQUFLdTRILFlBQVkrVixtQkFJaEQrSCxHQUF1QixFQUN2QlAsRUFBWTdjLGlCQUFtQmo1SCxLQUFLczJJLFdBQVdSLEVBQVk5YyxhQUFjLFlBSTdFbWQsSUFFQUMsR0FBcUIsRUFDckJOLEVBQVk1YyxlQUFpQmw1SCxLQUFLdTJJLFdBQVdULEVBQVk5YyxhQUFjLFFBRzNFaDVILEtBQUsyMEksYUFBYW1CLEdBR2xCOTFJLEtBQUswMEksa0JBRUQxMEksS0FBSzRLLFNBQVM0ckksZ0JBQ2xCLENBQ0ksSUFBSXo5SCxFQUFReFEsU0FBU0MsZUFBZXhJLEtBQUs0SyxTQUFTOGtCLFNBQVcsU0FFekQzVyxFQUVBQSxFQUFNNVAsVUFBWW5KLEtBQUs0SyxTQUFTMHJHLFNBQVNzUSxVQUl6QzVtSCxLQUFLNEssU0FBU3dqSSxhQUFheGdDLGFBQ3ZCNmxCLEVBQUksTUFBT3p6SCxLQUFLb3dJLFVBQVUsU0FBVSxDQUFDcHdJLEtBQUs0SyxTQUFTMHJHLFNBQVNzUSxZQUM1RDVtSCxLQUFLNEssU0FBU3dqSSxhQUFhem9CLFlBTW5DM2xILEtBQUs0SyxTQUFTaTBILG1CQUNkNytILEtBQUt1NEgsWUFBWTNCLGFBQWF2dEgsTUFBTW90SSxTQUFXejJJLEtBQUs0SyxTQUFTK2tJLFdBQWEsS0FFMUUzdkksS0FBS3U0SCxZQUFZM0IsYUFBYXZ0SCxNQUFNKzZHLFVBQVlwa0gsS0FBSzRLLFNBQVM4a0ksWUFBYyxNQUk1RTBHLEdBQXNCQyxLQUVsQkQsSUFDQXAySSxLQUFLdTRILFlBQVlXLGVBQWlCbDVILEtBQUt1MkksV0FBV3YySSxLQUFLNEssU0FBUzB1SCxnQkFBaUIsUUFFakYrYyxJQUNBcjJJLEtBQUt1NEgsWUFBWVUsaUJBQW1CajVILEtBQUtzMkksV0FBV3QySSxLQUFLNEssU0FBUzB1SCxnQkFBaUIsV0FFdkZ0NUgsS0FBS3U0SCxZQUFZa0MsU0FBU3NKLEtBQUsvakksS0FBSzRLLFNBQVMwdUgsZ0JBQWlCdDVILEtBQUt1NEgsWUFBWVcsZUFBZ0JsNUgsS0FBS3U0SCxZQUFZVSxtQkFJcEhqNUgsS0FBS3U0SCxZQUFZa0YsUUFBUyxFQUUxQno5SCxLQUFLbTVILFFBQVEsZ0JBQWlCbjVILEtBQUs0SyxVQUd2QyxRQUFTa2xCLEdBRUwsTUFBTXp3QixFQUFPbUUsTUFBTTlFLFVBQVVnQyxNQUFNekQsS0FBSzBELFVBQVcsR0FDbkQsRUFBS2trSCxPQUFPc1UsUUFBUXJwRyxFQUFPendCLEVBQU1XLEtBQUtvM0gsZ0JBRzFDLGNBRUksT0FBT3AzSCxLQUFLNEssU0FNaEIsbUJBRUksT0FBTzVLLEtBQUt1NEgsWUFHaEIsb0JBRUksT0FBT3Y0SCxLQUFLbzNILGVBR2hCLGVBRUksT0FBT3AzSCxLQUFLdTRILFlBQVl5VyxVQUc1QixtQkFFSSxPQUFPaHZJLEtBQUt1NEgsWUFBWWtDLFNBQVd6NkgsS0FBS3U0SCxZQUFZa0MsU0FBU2QsT0FBUyxLQUkxRSxjQUVJLE1BQU1iLEVBQVc5NEgsS0FBS3U0SCxZQUFZTyxTQUVsQyxNQUFPLENBQ0h4UyxJQUFLd1MsRUFBU3hTLElBQ2QxNkUsS0FBTWt0RixFQUFTbHRGLEtBQ2Z3dkYsT0FBUXRDLEVBQVNzQyxPQUNqQnZ2RixNQUFPaXRGLEVBQVNqdEYsTUFFaEJobkIsTUFBT2kwRyxFQUFTajBHLE1BQ2hCQyxPQUFRZzBHLEVBQVNoMEcsUUFJekIsZUFBZ0JnekcsR0FFWjkzSCxLQUFLdTRILFlBQVl3VyxhQUFhMkgsV0FBVzVlLEdBRzdDLGtCQUFtQkEsR0FFZjkzSCxLQUFLdTRILFlBQVl3VyxhQUFhNEgsY0FBYzdlLEdBR2hELGNBQWU1UyxFQUFXcm5HLEdBRXRCLE1BQU04N0csRUFBUzM1SCxLQUFLdTRILFlBQVlrQyxTQUFTZCxPQUNuQ3dCLEVBQVN4QixFQUFPM1QsY0FBY2QsRUFBV3JuRyxHQUUvQyxHQUFJQSxHQUFXQSxFQUFRcW9HLG9CQUN2QixDQUNJLE1BQU13WSxFQUFlMStILEtBQUs0SyxTQUFTaTBILG1CQUFxQixRQUFVLFNBRWxFLEdBQUk3K0gsS0FBS3U0SCxZQUFZTyxTQUFTNEYsR0FBZ0IvRSxFQUFPOW9CLFdBQVc2dEIsR0FDaEUsQ0FDSSxNQUFNa1ksR0FBYTUySSxLQUFLdTRILFlBQVlPLFNBQVM0RixHQUFnQi9FLEVBQU85b0IsV0FBVzZ0QixJQUFpQixFQUVoRyxPQUFJMStILEtBQUs0SyxTQUFTaTBILG1CQUVQLENBQ0h2WSxJQUFLNlUsRUFBTzdVLElBQ1o4VSxPQUFRRCxFQUFPQyxPQUVmeHZGLEtBQU11dkYsRUFBT3Z2RixLQUFPZ3JHLEVBQ3BCL3FHLE1BQU9zdkYsRUFBT3R2RixNQUFRK3FHLEdBS25CLENBQ0h0d0IsSUFBSzZVLEVBQU83VSxJQUFNc3dCLEVBQ2xCeGIsT0FBUUQsRUFBT0MsT0FBU3diLEVBRXhCaHJHLEtBQU11dkYsRUFBT3Z2RixLQUNiQyxNQUFPc3ZGLEVBQU90dkYsUUFNOUIsT0FBT3N2RixFQUdYLGdDQUFpQ2pELEdBRTdCLE1BQU0yZSxFQUNJM2UsRUFBT3RzRixLQUFPNXJDLEtBQUt1NEgsWUFBWU8sU0FBU2x0RixLQUQ1Q2lyRyxFQUVHM2UsRUFBTzVSLElBQU10bUgsS0FBS3U0SCxZQUFZTyxTQUFTeFMsSUFHMUNrVCxFQUFnQng1SCxLQUFLdTRILFlBQVlrQyxTQUFTOFksbUJBQzFDdUQsRUFBWXRkLEVBQWNuM0gsT0FHaEMsSUFBSyxJQUFJdkYsRUFBRSxFQUFHQSxFQUFJZzZJLEVBQVdoNkksSUFDN0IsQ0FDSSxNQUFNb29ILEVBQVlzVSxFQUFjMThILEdBQzFCcStILEVBQVNuN0gsS0FBS3U0SCxZQUFZa0MsU0FBU2QsT0FBTzNULGNBQWNkLEdBRTlELEdBQUlpVyxFQUFPdnZGLE1BQVFpckcsR0FBa0IxYixFQUFPdHZGLE9BQVNnckcsR0FDakQxYixFQUFPN1UsS0FBT3V3QixHQUFpQjFiLEVBQU9DLFFBQVV5YixFQUVoRCxNQUFPLENBQ0hoZSxXQUFZM1QsRUFDWnJyRyxPQUFRLENBQ0oreEIsS0FBTWlyRyxFQUFpQjFiLEVBQU92dkYsS0FDOUIwNkUsSUFBS3V3QixFQUFnQjFiLEVBQU83VSxNQVE1QyxNQUFNb3RCLEVBQWdCMXpJLEtBQUt1NEgsWUFBWWtDLFNBQVNkLE9BQU8zVCxjQUFjaG1ILEtBQUs0SyxTQUFTMHVILGlCQUVuRixNQUFPLENBQ0hULFdBQVk3NEgsS0FBSzRLLFNBQVMwdUgsZ0JBQzFCei9HLE9BQVEsQ0FDSit4QixLQUFNaXJHLEVBQWlCbkQsRUFBYzluRyxLQUNyQzA2RSxJQUFLdXdCLEVBQWdCbkQsRUFBY3B0QixNQWUvQyxnQkFBaUJ5d0IsRUFBWXZjLElBc0J6QixTQUFzQnQxRyxFQUFHQyxHQUVyQixHQUFJRCxFQUFFN2lCLFNBQVc4aUIsRUFBRTlpQixPQUNmLE9BQU8sRUFFWCxJQUFLLElBQUl2RixFQUFJLEVBQUc2SCxFQUFNdWdCLEVBQUU3aUIsT0FBUXZGLEVBQUk2SCxFQUFLN0gsSUFFckMsR0FBSW9vQixFQUFFcG9CLEtBQU9xb0IsRUFBRXJvQixHQUNYLE9BQU8sRUFFZixPQUFPLEVBOUJOazZJLENBQVloM0ksS0FBS3U0SCxZQUFZOFYsbUJBQW9CN1QsSUFFbER4NkgsS0FBS3U0SCxZQUFZOFYsbUJBQXFCN1QsRUFDbEN4NkgsS0FBS3U0SCxZQUFZZSxrQkFBb0J5ZCxJQUVyQy8ySSxLQUFLdTRILFlBQVllLGdCQUFrQnlkLEVBQ25DLzJJLEtBQUttNUgsUUFBUSxzQkFBdUI0ZCxJQUV4Qy8ySSxLQUFLbTVILFFBQVEsdUJBQXdCcUIsR0FHakN4NkgsS0FBS3U0SCxZQUFZamlCLFNBQVN1USxNQUFNa3dCLEdBQVlFLFlBQVk1MEksT0FBUyxHQUNqRXJDLEtBQUttNUgsUUFBUSwrQkFBZ0M0ZCxJQUU1Qy8ySSxLQUFLdTRILFlBQVllLGtCQUFvQnlkLElBRTFDLzJJLEtBQUt1NEgsWUFBWWUsZ0JBQWtCeWQsRUFDbkMvMkksS0FBS201SCxRQUFRLHNCQUF1QjRkLElBaUI1QyxZQUFhN3hCLEdBRVQsT0FBT2xsSCxLQUFLdTRILFlBQVlqaUIsU0FBU3VRLE1BQU0zQixHQUFXckUsRUFHdEQsT0FBUXV3QixHQUVKcHhJLEtBQUsyMEksYUFBYXZELEdBR3RCLEtBQU1oWixFQUFXb2IsR0FFYixPQUFPeHpJLEtBQUt3akgsV0FBVzRVLEVBQVdvYixHQUd0QyxtQkFFU3h6SSxLQUFLdTRILFlBQVlvVyxlQUVsQjN1SSxLQUFLbTFJLGtCQUNMbjFJLEtBQUtrM0ksdUJBQ0xsM0ksS0FBS3U0SCxZQUFZMTZHLFFBQVF3M0gsZ0JBQWtCcjFJLEtBQUt1NEgsWUFBWWdXLGlCQUM1RHZ1SSxLQUFLdTRILFlBQVkxNkcsUUFBUXUzSCxrQkFBb0JwMUksS0FBS3U0SCxZQUFZaVcsbUJBQzlEeHVJLEtBQUt1NEgsWUFBWXBnRyxnQkFBZ0I5dUIsTUFBTThVLFNBQVcsT0FDbERuZSxLQUFLdTRILFlBQVlvVyxjQUFlLEdBSXhDLHVCQUVRM3VJLEtBQUt1NEgsWUFBWWlYLGVBQWVsL0csYUFBYSxnQkFDN0N0d0IsS0FBS3U0SCxZQUFZaVgsZUFBZXhqSSxnQkFBZ0IsZUFHeEQsb0JBRVFoTSxLQUFLdTRILFlBQVlvVyxlQUdqQjN1SSxLQUFLc2tILHdCQUdMdGtILEtBQUt1NEgsWUFBWXVXLFlBQVlxSSxTQUFXLEtBQ3hDbjNJLEtBQUt1NEgsWUFBWXVXLFlBQVlzSSxZQUFjLEtBRzNDcDNJLEtBQUt1NEgsWUFBWXBnRyxnQkFBZ0I5dUIsTUFBTThVLFNBQVcsU0FHbERuZSxLQUFLdTRILFlBQVlnVyxpQkFBbUJ2dUksS0FBSzRLLFNBQVN5cUksZ0JBQ2xEcjFJLEtBQUt1NEgsWUFBWWlXLG1CQUFxQnh1SSxLQUFLNEssU0FBU3dxSSxrQkFDcERwMUksS0FBS3U0SCxZQUFZMTZHLFFBQVF3M0gsaUJBQWtCLEVBQzNDcjFJLEtBQUt1NEgsWUFBWTE2RyxRQUFRdTNILG1CQUFvQixFQUU3Q3AxSSxLQUFLdTRILFlBQVlvVyxjQUFlLEdBSXhDLHdCQUVTM3VJLEtBQUt1NEgsWUFBWWlYLGVBQWVsL0csYUFBYSxnQkFDOUN0d0IsS0FBS3U0SCxZQUFZaVgsZUFBZWpqSSxhQUFhLGNBQWUsSUFvQnBFLFFBRUl2TSxLQUFLMHhJLGNBR1QsMEJBQTJCekMsR0FFdkJqdkksS0FBS3U0SCxZQUFZMFcsdUJBQXlCQSxFQUc5QyxVQUdJanZJLEtBQUttNUgsUUFBUSxzQkFBdUJuNUgsS0FBSzRLLFVBR3JDNUssS0FBSzRLLFNBQVNxa0ksd0JBQ2RqdkksS0FBSzRLLFNBQVNxa0ksdUJBQXVCOTZGLFFBR3pDNXJDLFNBQVNrUSxLQUFLNCtILFlBQVksdUJBRzFCcjNJLEtBQUs0SyxTQUFTd2pJLGFBQWExK0gsU0FBU2lOLFFBQVEyNkgsV0FBVyxRQUd2RHQzSSxLQUFLNEssU0FBU3dqSSxhQUFhMStILFNBQVM2bkksV0FBVyxTQUFTQSxXQUFXLFNBRW5FdjNJLEtBQUttNUgsUUFBUSxxQkFBc0JuNUgsS0FBSzRLLFVBR3hDLEVBQUtpNkcsT0FBTzJ5QixlQUFleDNJLEtBQUs0SyxTQUFTbTZHLEtFLzlDbEMsU0FBUzB5QixFQUFpQnA1SSxHQUVyQyxJQUlJTixFQUpBaEIsRUFBSXNCLEVBQUlrekgsTUFDUkEsRUFBc0IsaUJBQU54MEgsRUFBa0JBLEVBQUVTLE9BQU9pSSxLQUFLMUksR0FBRyxJQUFJLEdBQUtBLEVBRTVEb3VCLEVBQUk5c0IsRUFBSU4sTUFnQlosT0FaSUEsRUFGQXlGLE1BQU00bUIsUUFBUWUsR0FFTkEsRUFBRTFaLElBQUkrRixHQUFLQSxFQUFFaGEsT0FBT2lJLEtBQUsrUixHQUFHLEtBSWQsaUJBQU4yVCxFQUFrQkEsRUFBRTN0QixPQUFPaUksS0FBSzBsQixHQUFHLElBQU1BLEVBR3pEM25CLE1BQU00bUIsUUFBUXJzQixLQUVkQSxFQUFRQSxFQUFNeWlCLEtBQUssT0FHaEIsQ0FDSCt3RyxNQUFPQSxFQUNQeHpILE1BQU9BLEdDN0JmLE1BQU0yNUksR0FBa0IsQ0FBQzd5SCxFQUFPQyxLQUU1QixNQUFNNnlILEVBQW1CeHZJLEtBQUtDLElBQUl5YyxFQUFPQyxHQUN6QyxPQUFJNnlILEVBQW1CLElBQ1osRUFDSnh2SSxLQUFLODlCLEtBQUs5OUIsS0FBSzJzQixLQUFLNmlILEVBQW1CLEdBQUssS0FBYXh2SSxLQUFLMnNCLElBQUksS0FHdkU4aUgsR0FBa0IsQ0FBQ0MsRUFBZ0JDLElBQW1CRCxFQUFrQjF2SSxLQUFLbTZHLElBQUksRUFBR3cxQixHQUVwRkMsR0FBb0IsQ0FBQ2QsRUFBYWUsSUFFN0JmLEVBQVl4bEksSUFBTXdtSSxJQUVyQixNQUFNMTFJLEVBQUkwMUksRUFBSXB6SCxNQUNSeXZCLEVBQUkyakcsRUFBSW56SCxPQUNSaEMsRUFBT28xSCxHQUFlRCxHQUN0QjdpRyxFQUE2QixNQUF2QnR5QixFQUFLc3lCLElBQUkxMEMsT0FBTyxHQUFhb2lCLEVBQUtzeUIsSUFBTSxJQUFNdHlCLEVBQUtzeUIsSUFFekQya0YsRUFBTyxJQUFJdjJILE1BQU13MEksRUFBZ0IsR0FDdkMsSUFBSyxJQUFJN25JLEVBQUksRUFBR0EsRUFBSTZuSSxFQUFnQixFQUFHN25JLElBRW5DNHBILEVBQUs1cEgsR0FBSyxDQUNObWtDLEVBQUduc0MsS0FBSzAxRCxNQUFNKzVFLEdBQWdCdGpHLEVBQUcwakcsRUFBZ0I3bkksSUFDakQ1TixFQUFHNEYsS0FBSzAxRCxNQUFNKzVFLEdBQWdCcjFJLEVBQUd5MUksRUFBZ0I3bkksS0FJekQsTUFBTyxDQUNIMHdHLEVBQUcvOUYsRUFBS3N5QixJQUNSQSxJQUFLQSxFQUNMK2lHLEdBQUlGLEVBQUkxbUIsT0FBUyxHQUNqQm4wSCxFQUFHMjhILEtBd0JBLFNBQVNxZSxHQUFtQjloQyxHQUV2QyxJQUFJM3JGLEVBQU0yckYsRUFBUyxZQUVuQixJQUFLM3JGLEVBR0QsT0FEQWhvQixRQUFRNEIsTUFBTSw2Q0FDUCxLQUdYLE1BQU1nNEMsRUE3QnlCLENBQUM3M0MsR0FFaEIsbURBQVpBLEdBRUtsQixNQUFNNG1CLFFBQVExbEIsSUFBWUEsRUFBUXl6RSxTQUFTLGtEQUR6QyxFQUdGMzBFLE1BQU00bUIsUUFBUTFsQixJQUFZQSxFQUFReXpFLFNBQVMsa0RBQ3pDLEVBRUEsRUFvQktrZ0UsQ0FBMkIxdEgsR0FDckM4N0YsRUFBV25RLEVBQVNvUSxVQUFZcFEsRUFBU29RLFVBQVUsR0FBSyxLQUN4REMsRUFBV0YsRUFBV0EsRUFBU0UsU0FBV3JRLEVBQVMvUSxNQUNuRCt5QyxFQUFjM3hCLEVBQVN0a0gsT0FFdkJ3a0gsRUFBUSxJQUFJcmpILE1BQU1takgsRUFBU3RrSCxRQUVqQyxJQUFJazJJLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBRUFoMEksRUFDQTB3QyxFQUNBdHlCLEVBQ0E2MUgsRUFDQTl6SCxFQUNBQyxFQUNBcXBILEVBQ0FqbEMsRUFDQXFvQixFQUNBcW5CLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBYkE5QixFQUFjLEdBZWRlLEVBQWdCLElBQ2hCOU4sRUFBVyxFQUNYRCxFQUFXLElBSWYsSUFBSyxJQUFJNzVCLEVBQUksRUFBR0EsRUFBSWtvQyxFQUFhbG9DLElBQ2pDLENBQ0ksTUFBTWp6RyxFQUFJd3BILEVBQVN2VyxHQUNiN3RHLEVBQUlwRixFQUFFMG5CLE1BQ055dkIsRUFBSW4zQyxFQUFFMm5CLE9BQ05rMEgsRUFBS3RCLEdBQWdCbjFJLEVBQUcreEMsR0FDeEIya0csRUFBUTNrRyxFQUFJL3hDLEVBQ2xCMm5JLEVBQVcvaEksS0FBS0MsSUFBSTZ3SSxFQUFPL08sR0FDM0JELEVBQVc5aEksS0FBS3dKLElBQUlzbkksRUFBT2hQLEdBRTNCK04sRUFBZ0I3dkksS0FBS3dKLElBQUlxbUksRUFBZWdCLEdBTTVDLE1BQU1FLEVBQWMsSUFBSTExSSxNQUFNdzBJLEVBQWdCLEdBQUc3ckksS0FBSyxHQUNoRGd0SSxFQUFlLElBQUkzMUksTUFBTXcwSSxFQUFnQixHQUFHN3JJLEtBQUssR0FDakRpdEksRUFBWSxJQUFJNTFJLE1BQU13MEksRUFBZ0IsR0FBRzdySSxLQUFLLEdBQzlDa3RJLEVBQWEsSUFBSTcxSSxNQUFNdzBJLEVBQWdCLEdBQUc3ckksS0FBSyxHQUVyRCxJQUFLLElBQUlyUCxFQUFJLEVBQUdBLEVBQUl3N0ksRUFBYXg3SSxJQUNqQyxDQTBCSSxHQXpCQXk3SSxFQUFhNXhCLEVBQVM3cEgsR0FDdEJvc0csRUFBU3F2QyxFQUFXLFFBQVVBLEVBQVd6d0ksR0FDekN5cEgsRUFBUWduQixFQUFXaG5CLE1BQ25CaW5CLEVBQWVELEVBQVdlLE9BQVNmLEVBQVdlLE9BQU8sR0FBR0MsU0FBV2hCLEVBQVdoekMsTUFBTSxHQUFHQSxNQUFNLEdBQUc5c0YsS0FNaEd3K0gsRUFBYyxHQUNnQixjQUExQnVCLEVBQWEsVUFBa0QsV0FBdEJBLEVBQWE1MkksTUFFdEQ2MkksRUFBWUQsRUFBYS93SSxTQUFXK3dJLEVBQWFqekMsTUFBTSxHQUN2RG16QyxFQUFrQkYsRUFBYWx1SCxNQUFRa3VILEVBQWFqekMsTUFBTTdrRyxNQUFNLEdBQ2hFdTJJLEVBQWNjLEdBQWtCVyxFQUFpQlYsSUFJakRTLEVBQVlELEVBSWhCM3pILEVBQVEwekgsRUFBVzF6SCxPQUFTNHpILEVBQVU1ekgsTUFDdENDLEVBQVN5ekgsRUFBV3p6SCxRQUFVMnpILEVBQVUzekgsT0FFcENELEdBQVMsR0FBS0MsR0FBVSxFQUM1QixDQUNJbmlCLFFBQVFDLEtBQUssc0NBQXdDMnVILEVBQVEsY0FDN0QsU0FHSjRjLEVBQVV1SixHQUFnQjd5SCxFQUFPQyxHQUVqQzh6SCxFQUFhSCxFQUFVbG5CLE9BQVMsS0FFaEN6dUcsRUFBT28xSCxHQUFlTyxHQUN0QnJqRyxFQUE2QixNQUF2QnR5QixFQUFLc3lCLElBQUkxMEMsT0FBTyxHQUFhb2lCLEVBQUtzeUIsSUFBTSxJQUFNdHlCLEVBQUtzeUIsSUFFekQxd0MsRUFBVSt6SSxFQUFVZSxRQUFRLGFBQWVmLEVBQVVlLFFBQVE1M0ksS0FJekQrMkksRUFGWSw0Q0FBWmowSSxHQUFxRSxrQkFBWkEsRUFFdkMsRUFFRCxnRUFBWkEsRUFFYSxJQUlBLEVBR3RCbTBJLEVBQWlCLElBQUlyMUksTUFBTXcwSSxFQUFnQixHQUUzQyxJQUFLLElBQUkveUgsRUFBSSxFQUFHQSxFQUFJK3lILEVBQWdCLEVBQUcveUgsSUFFbkM2ekgsRUFBMEIzd0ksS0FBSzAxRCxNQUFNKzVFLEdBQWdCL3lILEVBQU9tekgsRUFBZ0IveUgsSUFDNUU4ekgsRUFBMkI1d0ksS0FBSzAxRCxNQUFNKzVFLEdBQWdCOXlILEVBQVFrekgsRUFBZ0IveUgsSUFDOUU0ekgsRUFBZTV6SCxHQUFLLENBQ2hCcXZCLEVBQUd5a0csRUFDSHgySSxFQUFHdTJJLEdBR1BJLEVBQVlqMEgsSUFBTTZ6SCxFQUNsQkssRUFBYWwwSCxJQUFNOHpILEVBQ25CSyxFQUFVbjBILEdBQUs5YyxLQUFLQyxJQUFJMHdJLEVBQXlCTSxFQUFVbjBILElBQzNEbzBILEVBQVdwMEgsR0FBSzljLEtBQUtDLElBQUkyd0ksRUFBMEJNLEVBQVdwMEgsSUFHbEUsSUFBSXcwSCxFQUFxQyxjQUEzQmxCLEVBQVdtQixlQUFnQ25CLEVBQVd6eEMsVUFBc0MsY0FBM0J5eEMsRUFBV3p4QyxTQUFTLEdBQy9GNnlDLEVBQXNDLGlCQUEzQnBCLEVBQVdtQixlQUFtQ25CLEVBQVd6eEMsVUFBc0MsaUJBQTNCeXhDLEVBQVd6eEMsU0FBUyxHQUV2RytmLEVBQU0vcEgsR0FBSyxDQUNQTSxFQUFHeTdJLEVBQ0gzN0ksRUFBR2l4SSxFQUNIcHhJLEVBQUd3MEgsRUFDSDRtQixHQUFJUyxFQUNKLzNCLEVBQUcvOUYsRUFBS3N5QixJQUNSQSxJQUFLQSxFQUNMbkcsSUFBSzBwRyxFQUNMalEsTUFBTytRLEVBQ1A3USxZQUFhK1EsRUFDYnp3QyxPQUFRQSxFQUNSK3RDLFlBQWFBLEVBQ2IyQyxRQUFTOTJILEVBQUt2UCxHQUFLLEtBQ25Cc21JLFFBQVMvMkgsRUFBS25QLEdBQUssTUFJM0IsTUFBTW1tSSxFQUFnQixJQUFJdDJJLE1BQU13MEksRUFBZ0IsR0FDMUMrQixFQUFpQixJQUFJdjJJLE1BQU13MEksRUFBZ0IsR0FFakQsSUFBSyxJQUFJOXlILEVBQUksRUFBR0EsRUFBSTh5SCxFQUFnQixFQUFHOXlILElBRW5DNDBILEVBQWM1MEgsR0FBS2cwSCxFQUFZaDBILEdBQUtvekgsRUFDcEN5QixFQUFlNzBILEdBQUtpMEgsRUFBYWowSCxHQUFLb3pILEVBRzFDLE1BQU12ZSxFQUFPLENBQ1RpZ0IsTUFBT0YsRUFDUEcsTUFBT0YsRUFDUEcsTUFBT2QsRUFDUGUsTUFBT2QsRUFDUGUsVUFBV2xRLEVBQ1htUSxVQUFXcFEsRUFDWHFRLE1BQU9uQixFQUNQb0IsTUFBT3JCLEdBSVgsTUFBTyxDQUNIMzhGLFFBQVNBLEVBQ1RpK0YsV0FBWS9DLEVBQWdCbmhDLEdBQVVpYixNQUN0QzNxRixTQUFVMHZFLEVBQVMxdkUsVUFBWSxLQUMvQm16RixLQUFNQSxFQUNOMGdCLFNBQVV6QyxFQUNWMEMsSUFBSzd6QixFQUNMNmhCLE1BQWdDLFVBQXpCcHlCLEVBQVNvakMsZUFBNEJwakMsRUFBU3FrQyxXQUFzQyxVQUExQnJrQyxFQUFTcWtDLFVBQVUsTUFBNEJsMEIsR0FBb0MsVUFBekJBLEVBQVNpekIsYUFZNUksU0FBU3hCLEdBQWdCcUIsR0FFckIsSUFBSW5rRyxFQUFNbWtHLEVBQVMsUUFBVUEsRUFBU3p4SSxHQUN0QyxNQUFNOHlJLEVBQWdCLHNDQUN0QixJQUFJQyxFQUFPLEdBQ1BDLEdBQVcsRUFFZixHQUFJLG9DQUFvQzl6SSxLQUFLb3VDLEdBQzdDLENBR0ksTUFBTTJsRyxFQUFXM2xHLEVBQUl6bkIsTUFBTSxLQUMzQmt0SCxFQUFPRSxFQUFTQSxFQUFTMTRJLE9BQVMsUUFFakMsR0FBSXU0SSxFQUFjNXpJLEtBQUtvdUMsR0FDNUIsQ0FHSXlsRyxFQURlRCxFQUFjeDRHLEtBQUtnVCxHQUNwQixRQUVUbWtHLEVBQVNDLFVBQVlELEVBQVNDLFFBQVEsUUFBVUQsRUFBU0MsUUFBUTF4SSxNQUd0RXN0QyxFQUFNbWtHLEVBQVNDLFFBQVEsUUFBVUQsRUFBU0MsUUFBUTF4SSxHQUNsRGd6SSxHQUFXLEdBR1hBLElBR0ExbEcsRUFBTUEsRUFBSXpuQixNQUFNLEtBQUtqdEIsTUFBTSxHQUFJLEdBQUc4ZixLQUFLLE1BRzNDLE1BQU13NkgsRUFBWSxDQUNkNWxHLElBQUtBLEdBR1QsR0FBSXlsRyxFQUFLeDRJLE9BQ1QsQ0FFSSxNQUFNd3VHLEVBQWFncUMsRUFBS2x0SCxNQUFNLEtBQzlCcXRILEVBQVV6bkksRUFBSTZJLFNBQVN5MEYsRUFBVyxHQUFJLElBQ3RDbXFDLEVBQVVybkksRUFBSXlJLFNBQVN5MEYsRUFBVyxHQUFJLElBQ3RDbXFDLEVBQVV6NEksRUFBSTZaLFNBQVN5MEYsRUFBVyxHQUFJLElBQ3RDbXFDLEVBQVUxbUcsRUFBSWw0QixTQUFTeTBGLEVBQVcsR0FBSSxJQUcxQyxPQUFPbXFDLEVDNVNJLE1BQU1DLEdBRWpCLGdCQUFpQjNrQyxFQUFVNE8sRUFBV3Z5RyxHQUVsQyxJQUFJdW9JLEVBSUFBLEdBRkN2b0ksR0FBdUIsTUFBZEEsRUFBS2tTLE9BQWdDLE1BQWZsUyxFQUFLbVMsT0FFNUIsUUFJZSxNQUFkblMsRUFBS2tTLE1BQWdCLEdBQUtsUyxFQUFLa1MsT0FBUyxLQUFzQixNQUFmbFMsRUFBS21TLE9BQWlCLEdBQUtuUyxFQUFLbVMsUUFHN0YsTUFBTXNnRyxFQUFPOU8sRUFBU3VRLE1BQU0zQixHQUN0QmkyQixFQUFXLzFCLEVBQUtuMkUsSUFBTSxJQUFPLFVBQVksU0FFL0MsT0FBTzkxQixVQUFVaXNHLEVBQUtod0UsSUFBTSxRQUFVOGxHLEVBQVMsTUFBUUMsRUFBVSxRQUdyRSxnQkFBaUI3a0MsRUFBVTRPLEVBQVdyNkcsR0FFbEMsTUFBTXU2RyxFQUFPOU8sRUFBU3VRLE1BQU0zQixHQUU1QixJQUFJcGdHLEVBQVFELEVBSVJDLEVBRkFqYSxFQUFPcW1DLE1BQVFybUMsRUFBT3V3SSxTQUFXLEVBRXhCaDJCLEVBQUtob0gsRUFBRXlOLEVBQU91dEgsV0FBVzlqRixHQUFLenBDLEVBQU91d0ksU0FBVyxHQUFLdndJLEVBQU9nb0ksZUFBZS90SCxPQUkzRWphLEVBQU9nb0ksZUFBZS90SCxPQUsvQkQsRUFGQWhhLEVBQU80eEgsTUFBUTV4SCxFQUFPd3dJLFNBQVcsRUFFekJqMkIsRUFBS2hvSCxFQUFFeU4sRUFBT3V0SCxXQUFXNzFILEdBQUtzSSxFQUFPd3dJLFNBQVcsR0FBS3h3SSxFQUFPZ29JLGVBQWVodUgsTUFJM0VoYSxFQUFPZ29JLGVBQWVodUgsTUFHbEMsTUFBTWl6SCxFQUFpQjN2SSxLQUFLbTZHLElBQUksRUFBR2hNLEVBQVM2M0IsUUFBVXRqSSxFQUFPdXRILFdBRTdELElBQUk3a0gsRUFBSTFJLEVBQU80eEgsSUFBTTV4SCxFQUFPZ29JLGVBQWVodUgsTUFBUWl6SCxFQUMvQ25rSSxFQUFJOUksRUFBT3FtQyxJQUFNcm1DLEVBQU9nb0ksZUFBZS90SCxPQUFTZ3pILEVBRWhEMXlCLEVBQUt6bUgsZUFBZSxhQUVwQjRVLEdBQUs2eEcsRUFBS3cwQixRQUNWam1JLEdBQUt5eEcsRUFBS3kwQixTQUdkLE1BQU0xZSxFQUFTLENBQUM1bkgsRUFBR0ksRUFBR2tSLEVBQVFpekgsRUFBZ0JoekgsRUFBU2d6SCxHQUFnQnQzSCxLQUFLLEtBRXRFMjZILEVBQVcvMUIsRUFBS24yRSxJQUFNLElBQU8sVUFBWSxTQUUvQyxPQUFPOTFCLFVBQVVpc0csRUFBS2h3RSxJQUFNK2xGLEVBQVMsSUFBTXQyRyxFQUFRLElBQU1DLEVBQVMsTUFBUXEySCxFQUFVLFNDeEQ3RSxNQUFNLEdBRWpCLFlBQWExeUgsRUFBTTZ5SCxHQUdmdDdJLEtBQUs2bUgsTUFBUXArRixFQUFLaXlILElBQ2xCMTZJLEtBQUttdUksUUFBVTFsSCxFQUFLZ3lILFNBQ3BCejZJLEtBQUtrcUksU0FBV3poSCxFQUFLc3hHLEtBQUtxZ0IsVUFDMUJwNkksS0FBS2lxSSxTQUFXeGhILEVBQUtzeEcsS0FBS3NnQixVQUMxQnI2SSxLQUFLNG1ILFVBQVluK0YsRUFBSyt4SCxXQUN0Qng2SSxLQUFLNG1DLFNBQVduZSxFQUFLbWUsU0FHckI1bUMsS0FBSzBvSSxRQUFVamdILEVBQUtpZ0gsTUFHcEIxb0ksS0FBS3U3SSxXQUFhOXlILEVBQUtzeEcsS0FBS21nQixNQUM1Qmw2SSxLQUFLdzdJLFlBQWMveUgsRUFBS3N4RyxLQUFLb2dCLE1BQzdCbjZJLEtBQUt5N0ksZUFBaUJoekgsRUFBS3N4RyxLQUFLaWdCLE1BQ2hDaDZJLEtBQUswN0ksZ0JBQWtCanpILEVBQUtzeEcsS0FBS2tnQixNQUNqQ2o2SSxLQUFLMjdJLGNBQWdCbHpILEVBQUtzeEcsS0FBS3VnQixNQUMvQnQ2SSxLQUFLNDdJLGFBQWVuekgsRUFBS3N4RyxLQUFLd2dCLE1BRTlCdjZJLEtBQUs2N0ksWUFBY1AsRUFHdkIsZ0JBQWlCUSxHQUViLE1BQU1yekgsRUFBTzJ2SCxHQUFrQjBELEdBQy9CLE9BQU8sSUFBSSxHQUFjcnpILEVBQU0sSUFBSXd5SCxJQUd2QyxZQUFhLzFCLEVBQVd5akIsR0FFcEIsU0FBS0EsR0FBcUIzb0ksS0FBSzBvSSxRQUFVMW9JLEtBQUs2bUgsTUFBTTNCLEdBQVd3akIsU0FLeER4akIsR0FBYSxHQUFLQSxFQUFZbGxILEtBQUs2bUgsTUFBTXhrSCxRQUdwRCxxQkFBc0I2aUgsR0FFbEIsTUFBTTYyQixFQUFVLzdJLEtBQUs2bUgsTUFBTTNCLEdBQVc5bkgsRUFBRTRDLEtBQUttdUksU0FFN0MsTUFBTyxDQUNIcnBILE9BQVFpM0gsRUFBUXpuRyxFQUNoQnp2QixNQUFPazNILEVBQVF4NUksR0FJdkIsNkJBQThCMmlILEVBQVdrVCxHQUVyQyxNQUFNMmpCLEVBQVUvN0ksS0FBSzZtSCxNQUFNM0IsR0FBVzluSCxFQUFFNEMsS0FBS211SSxTQUV2Q3BWLEdBNkZVOE8sRUE3RmlCN25JLEtBQUttdUksUUE2Rkw2TixFQTdGYzVqQixFQStGNUMsRUFBSWp3SCxLQUFLbTZHLElBQUksRUFBR3VsQixFQUFrQm1VLElBRjdDLElBQXdCblUsRUFBaUJtVSxFQTNGakMsTUFBTyxDQUNIbDNILE9BQVFpM0gsRUFBUXpuRyxFQUFJeWtGLEVBQ3BCbDBHLE1BQU9rM0gsRUFBUXg1SSxFQUFJdzJILEdBUzNCLGdCQUFpQjdULEVBQVd2eUcsR0FFeEIsT0FBTzNTLEtBQUs2N0ksWUFBWWpKLGdCQUFnQjV5SSxLQUFNa2xILEVBQVd2eUcsR0FNN0Qsa0JBQW1CdXlHLEVBQVdrVCxFQUFXeWEsR0FFckMsTUFBTXp0QixFQUFPcGxILEtBQUs2bUgsTUFBTTNCLEdBRXhCLElBQUs3cUYsU0FBUys5RixJQUFjQSxFQUFZLEdBQU0sRUFFMUMsTUFBTSxJQUFJNTJILFVBQVUsa0NBQW9DNDJILEdBRzVELE1BQU0xK0UsRUFBT3Z4QyxLQUFLODlCLEtBQUttL0UsRUFBS2hvSCxFQUFFZzdILEdBQVc5akYsRUFBSXUrRixFQUFlL3RILFFBQ3REdTNHLEVBQU9sMEgsS0FBSzg5QixLQUFLbS9FLEVBQUtob0gsRUFBRWc3SCxHQUFXNzFILEVBQUlzd0ksRUFBZWh1SCxPQUV0RGs0RyxFQUFRLEdBRWQsSUFBSTdyRixFQUFLdXJGLEVBQUtybkYsRUFFZCxJQUFLbEUsRUFBTSxFQUFHQSxFQUFNd0ksRUFBTXhJLElBRXRCLElBQUt1ckYsRUFBTSxFQUFHQSxFQUFNSixFQUFNSSxJQUV0QnJuRixFQUFNcDFDLEtBQUs2N0ksWUFBWUksZ0JBQWdCajhJLEtBQU1rbEgsRUFBVyxDQUNwRGgwRSxJQUFLQSxFQUNMdXJGLElBQUtBLEVBQ0wyZSxTQUFVMWhHLEVBQ1YyaEcsU0FBVWhmLEVBQ1ZqRSxVQUFXQSxFQUNYeWEsZUFBZ0JBLElBS3BCOVYsRUFBTTM2SCxLQUFLLENBQ1A4dUMsSUFBS0EsRUFDTHVyRixJQUFLQSxFQUNMckUsVUFBV0EsRUFDWHZuQixXQUFZLENBQ1IvckYsT0FBUSt0SCxFQUFlL3RILE9BQ3ZCRCxNQUFPZ3VILEVBQWVodUgsT0FFMUJoTCxPQUFRLENBQ0p5c0csSUFBS3AxRSxFQUFNMmhHLEVBQWUvdEgsT0FDMUI4bUIsS0FBTTZ3RixFQUFNb1csRUFBZWh1SCxPQUUvQnV3QixJQUFLQSxJQUtqQixNQUFPLENBQ0hnakYsVUFBV0EsRUFDWDErRSxLQUFNQSxFQUNOMmlGLEtBQU1BLEVBQ05VLE1BQU9BLElBWW5CLFNBQVNtZixHQUFzQkMsR0FFM0IsT0FBTyxTQUFVL2pCLEdBRWIsT0FBT3A0SCxLQUFLbThJLEdBQWEvakIsSUFYakMsR0FBYzE1SCxVQUFVMDlJLFlBQWNGLEdBQXFCLGNBQzNELEdBQWN4OUksVUFBVTI5SSxhQUFlSCxHQUFxQixlQUM1RCxHQUFjeDlJLFVBQVVzM0ksZ0JBQWtCa0csR0FBcUIsa0JBQy9ELEdBQWN4OUksVUFBVXUzSSxpQkFBbUJpRyxHQUFxQixtQkFDaEUsR0FBY3g5SSxVQUFVNDlJLGNBQWdCSixHQUFxQixnQkFDN0QsR0FBY3g5SSxVQUFVNjlJLGVBQWlCTCxHQUFxQixpQkM1SS9DLE1BQU0sR0FFakIsWUFBYU0sR0FFVHg4SSxLQUFLdzhJLE9BQVNBLEVBQ2R4OEksS0FBSzRLLFNBQVc0eEksRUFBTzV4SSxTQUczQixXQUFZb21JLEVBQU9sbEgsR0FFZixNQUFNbWxILEVBQVEsQ0FDVm5wSSxHQUFJOUgsS0FBSzRLLFNBQVNtNkcsR0FBS2lzQixFQUN2Qi9aLE1BQU8sUUFBVStaLEdBR3JCLE9BQUlsbEgsRUFDT3R1QixPQUFPNGhDLE9BQU82eEcsRUFBT25sSCxHQUVyQm1sSCxFQUtmLFdBQVluaEgsRUFBT3NMLEdBRWYsRUFBS3lwRixPQUFPQyxVQUFVaDFGLEVBQU9zTCxFQUFVcDdCLEtBQUs0SyxTQUFTbTZHLElBSXpELGFBQWMxbkgsRUFBTWswSCxFQUFPbjJGLEVBQVVxaEgsR0FFakMsTUFBTXBwQixFQUFTSSxFQUFJLFNBQVUsQ0FDekI3eEgsS0FBTSxTQUNOa0csR0FBSTlILEtBQUs0SyxTQUFTbTZHLEdBQUsxbkgsRUFDdkI0NUgsTUFBTyxRQUFVNTVILEVBQU8sZUFDeEIwYixNQUFPdzRHLEVBQ1AsYUFBY0EsSUFTbEIsT0FOSWtyQixHQUNBcHBCLEVBQU9wOUYsWUFBWXdtSCxHQUVuQnJoSCxHQUNBaTRGLEVBQU94dkgsaUJBQWlCLFFBQVN1M0IsR0FFOUJpNEYsRUFHWCxZQUFhaDJILEVBQU15SyxFQUFJeXBILEVBQU9tckIsRUFBV0MsR0FFckMsT0FBT2xwQixFQUFJLE1BQU8sQ0FBRTNySCxHQUFJOUgsS0FBSzRLLFNBQVNtNkcsR0FBS2o5RyxFQUFJbXZILE1BQU81NUgsRUFBTyxlQUNqRCxDQUFFazBILEVBQU9rQyxFQUFJLE9BQVEsQ0FBRTNySCxHQUFJOUgsS0FBSzRLLFNBQVNtNkcsR0FBSzIzQixHQUFhQyxLQUkzRSxvQkFFSSxJQUFJQyxFQUFjNThJLEtBQUs2OEkscUJBQ25CQyxFQUFhOThJLEtBQUsrOEksb0JBRWxCQyxFQUFjLENBQ2RoOUksS0FBS2k5SSxhQUFhLGtCQUFtQixXQUFZLEtBQzdDajlJLEtBQUt3OEksT0FBT1UsYUFBYWw5SSxLQUFLNEssU0FBU3d0SCxVQUFZLElBQ3BEd2tCLEdBQ0g1OEksS0FBS2k5SSxhQUFhLGlCQUFrQixVQUFXLEtBQzNDajlJLEtBQUt3OEksT0FBT1UsYUFBYWw5SSxLQUFLNEssU0FBU3d0SCxVQUFZLElBQ3BEMGtCLEdBQ0g5OEksS0FBS205SSxZQUFZLGtCQUFtQixhQUFjLGVBQWdCLGFBQWNuOUksS0FBSzRLLFNBQVN3dEgsVUFBWSxJQUcxR3Y4RyxFQUFjLFdBRUF0VCxTQUFTQyxlQUFleEksS0FBSzRLLFNBQVNtNkcsR0FBSyxjQUNqRGh1RyxZQUFjL1csS0FBSzRLLFNBQVN3dEgsVUFBWSxHQU1wRCxPQUhBcDRILEtBQUtvOUksV0FBVyxxQkFBc0J2aEksR0FDdEM3YixLQUFLbzlJLFdBQVcsZ0JBQWlCdmhJLEdBRTFCNDNHLEVBQUksTUFBTyxDQUFFM3JILEdBQUk5SCxLQUFLNEssU0FBU202RyxHQUFLLGdCQUFpQjE3RyxNQUFPLGlCQUFrQjJ6SSxHQUd6RixxQkFFSSxJQUFJSyxFQUFlcjlJLEtBQUtzOUksc0JBQ3BCQyxFQUFnQnY5SSxLQUFLdzlJLHVCQUVyQkMsRUFBYyxDQUNkejlJLEtBQUtpOUksYUFBYSxrQkFBbUIsUUFBUyxLQUMxQ2o5SSxLQUFLdzhJLE9BQU9rQixtQkFBbUIxOUksS0FBSzRLLFNBQVMrK0gsWUFBYyxJQUM1RDRULEdBQ0h2OUksS0FBS2k5SSxhQUFhLGlCQUFrQixPQUFRLEtBQ3hDajlJLEtBQUt3OEksT0FBT2tCLG1CQUFtQjE5SSxLQUFLNEssU0FBUysrSCxZQUFjLElBQzVEMFQsR0FDSHI5SSxLQUFLbTlJLFlBQVksa0JBQW1CLGFBQWMsa0JBQW1CLGdCQUFpQm45SSxLQUFLNEssU0FBUysrSCxjQVd4RyxPQUZBM3BJLEtBQUtvOUksV0FBVywwQkFOUSxXQUVONzBJLFNBQVNDLGVBQWV4SSxLQUFLNEssU0FBU202RyxHQUFLLGlCQUNqRGh1RyxZQUFjL1csS0FBSzRLLFNBQVMrK0gsZUFLakNsVyxFQUFJLE1BQU8sQ0FBQzNySCxHQUFJOUgsS0FBSzRLLFNBQVNtNkcsR0FBSyxnQkFBaUIxN0csTUFBTyxnQkFBa0JvMEksR0FHeEYsa0JBR0ksTUFBTS9qQixFQUFjakcsRUFBSSxPQUFRLENBQzVCM3JILEdBQUk5SCxLQUFLNEssU0FBU202RyxHQUFLLGlCQUdyQjQ0QixFQUFvQixLQUd0QixJQUFJQyxFQUFVNTlJLEtBQUt3OEksT0FBT3FCLHdCQUN0QkMsRUFBYUYsRUFBUSxHQUNyQkcsRUFBV0gsRUFBUUEsRUFBUXY3SSxPQUFTLEdBQ3BDMjdJLEVBQWFoK0ksS0FBSzRLLFNBQVMwckcsU0FBU3VRLE1BQU1pM0IsR0FBWS9nSixFQUN0RGtoSixFQUFXaitJLEtBQUs0SyxTQUFTMHJHLFNBQVN1USxNQUFNazNCLEdBQVVoaEosRUFFbEQrZ0osSUFBZUMsRUFFZC85SSxLQUFLNEssU0FBU3N6SSxtQkFDZHhrQixFQUFZM2lILFlBQWMrbUksRUFBYSxNQUFRQyxFQUVsRHJrQixFQUFZM2lILFlBQWNpbkksRUFBYSxNQUFRQyxFQUk1Q2orSSxLQUFLNEssU0FBU3N6SSxtQkFDakJ4a0IsRUFBWTNpSCxZQUFjK21JLEVBRTFCcGtCLEVBQVkzaUgsWUFBY2luSSxHQVFoQyxPQUpBaCtJLEtBQUtvOUksV0FBVyx1QkFBd0JPLEdBQ3hDMzlJLEtBQUtvOUksV0FBVyxnQkFBaUJPLEdBQ2pDMzlJLEtBQUtvOUksV0FBVyxnQkFBaUJPLEdBRTFCbHFCLEVBQUksT0FBUSxDQUNYd0QsTUFBTyw4QkFFWHlDLEdBSVIscUJBRUksTUFBTXlrQixFQUFnQjFxQixFQUFJLFFBQVMsQ0FDL0IzckgsR0FBSTlILEtBQUs0SyxTQUFTbTZHLEdBQUssa0JBQ3ZCa1MsTUFBTyxrQ0FDUG1uQixhQUFjLE1BQ2R4OEksS0FBTSxPQUNOLGFBQWMsZUFHWnk4SSxFQUFpQjVxQixFQUFJLFFBQVMsQ0FDaEMzckgsR0FBSTlILEtBQUs0SyxTQUFTbTZHLEdBQUssbUJBQ3ZCa1MsTUFBTywrQkFDUHIxSCxLQUFNLFNBQ043RCxNQUFPLE9BR0x1Z0osRUFBbUI3cUIsRUFBSSxNQUFPLENBQzVCM3JILEdBQUk5SCxLQUFLNEssU0FBU202RyxHQUFLLG9CQUN2QmtTLE1BQU8sMkJBSVRzbkIsRUFBVzlxQixFQUFJLE9BQVEsQ0FDckIzckgsR0FBSTlILEtBQUs0SyxTQUFTbTZHLEdBQUssWUFDdkJrUyxNQUFPLGtCQUVYa25CLEVBQ0FFLEVBQ0FDLEdBb0hKLElBQXdCOWlJLEVBQUtzdEYsRUFBS2pvRyxFQW1CbEMsT0FwSUEwOUksRUFBUzE2SSxpQkFBaUIsU0FBVzJULElBRWpDQSxFQUFFNkUsaUJBRUYsTUFBTW1pSSxFQUFtQkwsRUFBY3BnSixNQUV2QyxHQUFJaUMsS0FBSzRLLFNBQVM2ekksY0FBc0QsbUJBQS9CeitJLEtBQUs0SyxTQUFTNnpJLGFBQ3ZELENBQ0ksTUFBTXY1QixFQUFZbGxILEtBQUs0SyxTQUFTNnpJLGFBQWFELEdBQ3hDeCtJLEtBQUt3OEksT0FBT2tDLGdCQUFnQng1QixJQUM3QnQ4RyxPQUFPKzFJLE1BQU0sOERBS1ozK0ksS0FBS3c4SSxPQUFPb0MsZ0JBQWdCSixJQUM3QjUxSSxPQUFPKzFJLE1BQU0seURBT3JCLE9BSEFMLEVBQWlCajFJLE1BQU1DLFFBQVUsUUFHMUIsSUFHWCxDQUFDLFFBQVMsU0FBU3VDLFFBQVFpa0IsSUFFdkJxdUgsRUFBY3Q2SSxpQkFBaUJpc0IsRUFBTyxLQUNsQ3d1SCxFQUFpQm4xSSxVQUFZLEdBRTdCLE1BQU1wTCxFQUFRb2dKLEVBQWNwZ0osTUFDNUIsSUFBSThnSixFQUFpQixFQUNyQixHQUFJNytJLEtBQUs0SyxTQUFTazBJLHVCQUF5Qi9nSixFQUMzQyxDQUNJLE1BQU04b0gsRUFBUTdtSCxLQUFLNEssU0FBUzByRyxTQUFTdVEsTUFDckMsSUFBSyxJQUFJL3BILEVBQUksRUFBRzZILEVBQU1raUgsRUFBTXhrSCxPQUFRdkYsRUFBSTZILEdBQU9rNkksRUFBaUIsR0FBSS9oSixJQUVoRSxHQUFJK3BILEVBQU0vcEgsR0FBR0MsRUFBRWdkLGNBQWN2SixRQUFRelMsRUFBTWdjLGdCQUFrQixFQUM3RCxDQUNJLE1BQU1nbEksRUFBcUJ0ckIsRUFBSSxNQUFPLENBQzlCd0QsTUFBTyx5QkFFWHBRLEVBQU0vcEgsR0FBR0MsR0FHYnVoSixFQUFpQnJvSCxZQUFZOG9ILEdBRTdCRixJQUtKQSxFQUFpQixJQUNqQlAsRUFBaUJqMUksTUFBTUMsUUFBVSxjQUdyQ2cxSSxFQUFpQmoxSSxNQUFNQyxRQUFVLFdBSTdDNjBJLEVBQWN0NkksaUJBQWlCLFVBQVcyVCxJQUN0QyxJQUFJM0ssRUFDSixHQUFrQixLQUFkMkssRUFBRTA1SCxRQUNOLENBQ0ksTUFBTThOLEVBQVN6MkksU0FBU21ELHVCQUF1QixVQUFVLFFBQ25DLElBQVhzekksSUFDUGIsRUFBY3BnSixNQUFRaWhKLEVBQU9obUksV0FFckMsR0FBa0IsS0FBZHhCLEVBQUUwNUgsUUFDTixDQUNJcmtJLEVBQUt0RSxTQUFTbUQsdUJBQXVCLFVBQVUsR0FDL0MsTUFBTXV6SSxFQUFTcHlJLEVBQUtBLEVBQUcrQyxxQkFBa0IxTyxFQUN6QyxRQUFzQixJQUFYKzlJLEVBRVBweUksRUFBRzVELFVBQVVSLE9BQU8sVUFDTCxPQUFYdzJJLEdBQ0FBLEVBQU9oMkksVUFBVUMsSUFBSSxjQUc3QixDQUNJLElBQUlzdkQsRUFBT2p3RCxTQUFTbUQsdUJBQXVCLHlCQUF5QnJKLE9BQVMsRUFDN0VrRyxTQUFTbUQsdUJBQXVCLHlCQUF5QjhzRCxHQUFNdnZELFVBQVVDLElBQUksZ0JBR2hGLEdBQWtCLEtBQWRzTyxFQUFFMDVILFFBQ1gsQ0FDSXJrSSxFQUFLdEUsU0FBU21ELHVCQUF1QixVQUFVLEdBQy9DLE1BQU13ekksRUFBU3J5SSxFQUFLQSxFQUFHaUQsaUJBQWM1TyxPQUNmLElBQVhnK0ksR0FFUHJ5SSxFQUFHNUQsVUFBVVIsT0FBTyxVQUNMLE9BQVh5MkksR0FDQUEsRUFBT2oySSxVQUFVQyxJQUFJLFdBSXpCWCxTQUFTbUQsdUJBQXVCLHlCQUF5QixHQUFHekMsVUFBVUMsSUFBSSxhQWdCOURzUyxFQVhFLFlBV0dzdEYsRUFYVSx5QkFXTGpvRyxFQVgrQixXQUU3RHM5SSxFQUFjcGdKLE1BQVFpQyxLQUFLK1csWUFDM0J1bkksRUFBaUJqMUksTUFBTUMsUUFBVSxPQUNqQyxJQUFJNjFJLEVBQWMsSUFBSUMsTUFBTSxTQUFVLENBQ2xDQyxZQUFZLElBRWhCZCxFQUFTajJDLGNBQWM2MkMsSUFQbkJiLEVBYUN6NkksaUJBQWlCMlgsR0FBSyxTQUFVc1UsR0FHakMsSUFEQSxJQUFJOXhCLEVBQUk4eEIsRUFBTTN3QixPQUNQbkIsR0FBS0EsSUFBTWdDLE1BRVZoQyxFQUFFbTNGLFFBQVEyVCxJQUNWam9HLEVBQVE1RCxLQUFLZSxFQUFHOHhCLEdBQ3BCOXhCLEVBQUlBLEVBQUU0bUIsY0FLbEJ1NUgsRUFBY3Q2SSxpQkFBaUIsT0FBUSxLQUVuQ3k2SSxFQUFpQmoxSSxNQUFNQyxRQUFVLFNBRzlCaTFJLEVBR1gsaUJBRUksTUFBTWUsRUFBa0I3ckIsRUFBSSxNQUFPenpILEtBQUt1L0ksV0FBVyxpQkFDN0NDLEVBQWV4L0ksS0FBS3kvSSxzQkFDcEJDLEVBQWUxL0ksS0FBSzIvSSxzQkFDcEJDLEVBQWU1L0ksS0FBSzYvSSxzQkFPcEJDLEVBQW1COS9JLEtBQUtpOUksYUFBYSxZQUFhLGNBTDlCLEtBRXRCcUMsRUFBZ0JqMkksTUFBTUMsUUFBNEMsU0FBbENnMkksRUFBZ0JqMkksTUFBTUMsUUFBcUIsUUFBVSxTQUtuRnkySSxFQUFjcnhJLElBRWhCMU8sS0FBS3c4SSxPQUFPd0QsV0FBV3R4SSxHQUd2QjR3SSxFQUFnQmoySSxNQUFNQyxRQUFVLFFBRzlCMjJJLEVBQWlCLEtBTWZqZ0osS0FBSzRLLFNBQVNvd0gsUUFFZDhrQixFQUFpQjdwSCxZQUFZdXBILEdBQzdCTSxFQUFpQjFvSSxVQUFZLDZDQUV4QnBYLEtBQUs0SyxTQUFTaWdJLGNBRW5CaVYsRUFBaUI3cEgsWUFBWXlwSCxHQUM3QkksRUFBaUIxb0ksVUFBWSw4Q0FJN0Iwb0ksRUFBaUI3cEgsWUFBWTJwSCxHQUM3QkUsRUFBaUIxb0ksVUFBWSxpREFHakMsTUFBTThvSSxFQUFjMzNJLFNBQVM0M0kseUJBYTdCLEtBVkluZ0osS0FBSzRLLFNBQVNvd0gsUUFBVWg3SCxLQUFLNEssU0FBU2lnSSxlQUN0Q3FWLEVBQVlqcUgsWUFBWWoyQixLQUFLaTlJLGFBQWEsZ0JBQWlCLGdCQUFpQjhDLEVBQVd6aEosS0FBSyxLQUFNLFlBQWFzaEosS0FFL0c1L0ksS0FBSzRLLFNBQVNvd0gsUUFBV2g3SCxLQUFLNEssU0FBU2lnSSxjQUN2Q3FWLEVBQVlqcUgsWUFBWWoyQixLQUFLaTlJLGFBQWEsWUFBYSxZQUFhOEMsRUFBV3poSixLQUFLLEtBQU0sUUFBU29oSixJQUVsRzEvSSxLQUFLNEssU0FBU293SCxRQUNma2xCLEVBQVlqcUgsWUFBWWoyQixLQUFLaTlJLGFBQWEsWUFBYSxZQUFhOEMsRUFBV3poSixLQUFLLEtBQU0sUUFBU2toSixJQUdoR0YsRUFBZ0IzNUIsWUFFbkIyNUIsRUFBZ0I5K0MsWUFBWTgrQyxFQUFnQjM1QixZQUloRDI1QixFQUFnQnJwSCxZQUFZaXFILElBY2hDLE9BWEEzM0ksU0FBUzFFLGlCQUFpQixVQUFXaXNCLElBRTdCd3ZILElBQW9CeHZILEVBQU0zd0IsU0FFMUJtZ0osRUFBZ0JqMkksTUFBTUMsUUFBVSxVQUl4Q3RKLEtBQUtvOUksV0FBVyxnQkFBaUI2QyxHQUNqQ2pnSixLQUFLbzlJLFdBQVcsZ0JBQWlCNkMsR0FFMUJ4c0IsRUFBSSxNQUFPenpILEtBQUt1L0ksV0FBVyxhQUM5Qk8sRUFDQVIsR0FJUix5QkFFSSxJQUFJYyxFQUFpQnBnSixLQUFLcWdKLHdCQUUxQixPQUFPcmdKLEtBQUtpOUksYUFBYSxrQkFBbUIseUJBQTBCLEtBQ2xFajlJLEtBQUt3OEksT0FBTzhELHdCQUNiRixHQUdQLHlCQUVTcGdKLEtBQUs0SyxTQUFTb3dILFFBT2Z6eUgsU0FBU0MsZUFBZXhJLEtBQUs0SyxTQUFTbTZHLEdBQUssaUJBQWlCMTdHLE1BQU1DLFFBQVUsT0FDNUVmLFNBQVNDLGVBQWV4SSxLQUFLNEssU0FBU202RyxHQUFLLGlCQUFpQjE3RyxNQUFNQyxRQUFVLFVBTjVFZixTQUFTQyxlQUFleEksS0FBSzRLLFNBQVNtNkcsR0FBSyxpQkFBaUIxN0csTUFBTUMsUUFBVSxRQUM1RWYsU0FBU0MsZUFBZXhJLEtBQUs0SyxTQUFTbTZHLEdBQUssaUJBQWlCMTdHLE1BQU1DLFFBQVUsUUFVcEYsU0FFSXRKLEtBQUtvOUksV0FBVyxnQkFBaUJwOUksS0FBS3VnSix3QkFDdEN2Z0osS0FBS285SSxXQUFXLGdCQUFpQnA5SSxLQUFLdWdKLHdCQUV0QyxJQUFJQyxFQUFZLENBQ1p4Z0osS0FBS3lnSixvQkFDTHpnSixLQUFLMGdKLHNCQUVMQyxFQUFhLENBQ2IzZ0osS0FBSzRnSixrQkFDTDVnSixLQUFLNmdKLGtCQUVMN2dKLEtBQUs0SyxTQUFTazJJLGtCQUNkSCxFQUFXditJLEtBQUtwQyxLQUFLK2dKLDBCQUNyQi9nSixLQUFLNEssU0FBU28ySSxnQkFDZEwsRUFBVzkzRyxPQUFPLEVBQUcsRUFBRzdvQyxLQUFLaWhKLHNCQUdqQyxJQUFJekwsRUFBVXgxSSxLQUFLdzhJLE9BQU9qa0IsWUFBWTJXLGdCQUN0QyxJQUFLLElBQUlweUksRUFBSSxFQUFHNkgsRUFBTTZ3SSxFQUFRbnpJLE9BQVF2RixFQUFJNkgsRUFBSzdILElBQy9DLENBQ0ksSUFBSWk0QyxFQUFTeWdHLEVBQVExNEksR0FFaEJpNEMsRUFBT21zRyxjQUdabnNHLEVBQU9vc0csWUFBY3BzRyxFQUFPcXNHLGFBQ3ZCcnNHLEVBQU9vc0csY0FJZSxVQUF2QnBzRyxFQUFPbXNHLFlBQ1BQLEVBQVc5M0csT0FBTyxFQUFHLEVBQUdrTSxFQUFPb3NHLGFBQ0gsU0FBdkJwc0csRUFBT21zRyxhQUNaVixFQUFVMzNHLE9BQU8sRUFBRyxFQUFHa00sRUFBT29zRyxhQUVsQ3BzRyxFQUFPb3NHLFlBQVl0OUksaUJBQWlCLFFBQVN3OUksRUFBa0IvaUosS0FBSzBCLEtBQU0rMEMsTUFHOUUsU0FBU3NzRyxFQUFtQnRzRyxHQUV4QkEsRUFBTzBpRixZQUFZejNILEtBQUt3OEksUUFHNUIsTUFBTThFLEVBQVE3dEIsRUFBSSxNQUFPenpILEtBQUt1L0ksV0FBVyxTQUM3QjlyQixFQUFJLE1BQU96ekgsS0FBS3UvSSxXQUFXLGNBQWVpQixHQUMxQy9zQixFQUFJLE1BQU96ekgsS0FBS3UvSSxXQUFXLGVBQWdCb0IsSUFHdkQzZ0osS0FBSzRLLFNBQVMyMkksb0JBQW9CM3pDLGFBQzlCMHpDLEVBQ0F0aEosS0FBSzRLLFNBQVMyMkksb0JBQW9CNTdCLFlBSTFDLG1CQUFvQnY5RSxHQUVoQixJQUFJcTBHLEVBQU9sMEksU0FBUzZqRyxnQkFBZ0IsNkJBQThCLE9BQ2xFcXdDLEVBQUt0dUIsZUFBZSxLQUFNLFVBQVcsYUFDckNzdUIsRUFBS3R1QixlQUFlLEtBQU0sSUFBSyxPQUMvQnN1QixFQUFLdHVCLGVBQWUsS0FBTSxJQUFLLE9BQy9Cc3VCLEVBQUt0dUIsZUFBZSxLQUFNLFFBQVMsb0NBRW5DLElBQUkvVyxFQUFRN3VHLFNBQVM2akcsZ0JBQWdCLDZCQUE4QixLQVduRSxPQVZBZ0wsRUFBTStXLGVBQWUsS0FBTSxZQUFhLGdDQUV4Qy9sRixFQUFNdjhCLFFBQVV3RixJQUVaLElBQUltd0ksRUFBTWo1SSxTQUFTNmpHLGdCQUFnQiw2QkFBOEIsUUFDakVvMUMsRUFBSXJ6QixlQUFlLEtBQU0sSUFBSzk4RyxHQUM5QitsRyxFQUFNbmhGLFlBQVl1ckgsS0FHdEIvRSxFQUFLeG1ILFlBQVltaEYsR0FDVnFsQyxFQUdYLHFCQU9JLE9BQU96OEksS0FBS3loSixtQkFMQSxDQUNSLGlJQUNBLDZiQU1SLG9CQUtJLE9BQU96aEosS0FBS3loSixtQkFIQSxDQUNSLG1zQkFLUixzQkFLSSxPQUFPemhKLEtBQUt5aEosbUJBSEEsQ0FDUiwybkNBS1IsdUJBS0ksT0FBT3poSixLQUFLeWhKLG1CQUhBLENBQ1IsbWdCQUtSLHNCQUtJLE9BQU96aEosS0FBS3loSixtQkFIQSxDQUNSLDJuQ0FLUixzQkFLSSxPQUFPemhKLEtBQUt5aEosbUJBSEEsQ0FDUixvb0JBS1Isc0JBTUksT0FBT3poSixLQUFLeWhKLG1CQUpBLENBQ1IsaXNCQU1SLHdCQU9JLE9BQU96aEosS0FBS3loSixtQkFMQSxDQUNSLHlIQUNBLHlrQ0NwakJHLE9BTEUsQ0FDYjlqSixJQUFLK2pKLEdBQ0w1cUQsT0FtREosU0FBMEJ6NEYsRUFBS04sR0FHM0IsTUFBTTRqSixFQUFnQkQsR0FBYXJqSixHQUM3QnVwQixFQUFPaGYsT0FBT2d2RyxTQUFTaHdGLEtBRTdCLEdBQUkrNUgsSUFBa0I1akosRUFHbEIsR0FBNkIsaUJBQWxCNGpKLEVBQ1gsQ0FFSSxNQUFNN0QsRUFBY2wySCxFQUFLcFgsUUFBUSxJQUFNblMsRUFBTSxLQUFPLEVBQUt1cEIsRUFBS3BYLFFBQVEsSUFBTW5TLEVBQU0sS0FBT3VwQixFQUFLcFgsUUFBUSxJQUFNblMsRUFBTSxLQUM1RzAvSSxFQUFXRCxFQUFhei9JLEVBQUlnRSxPQUFTLEVBQUlzL0ksRUFBY3QvSSxPQUV2RHUvSSxFQUE2QixJQUFmOUQsRUFBb0IsSUFBTSxJQUM5Q2wxSSxPQUFPZ3ZHLFNBQVM1Z0csUUFBUTRRLEVBQUsvQixVQUFVLEVBQUdpNEgsR0FBYzhELEVBQWF2akosRUFBTSxJQUFNTixFQUFRNnBCLEVBQUsvQixVQUFVazRILFNBS3BGLElBQWhCbjJILEVBQUt2bEIsT0FFTHVHLE9BQU9ndkcsU0FBUzVnRyxRQUFRLElBQU0zWSxFQUFNLElBQU1OLEdBSzFDNkssT0FBT2d2RyxTQUFTNWdHLFFBQVE0USxFQUFPLElBQU12cEIsRUFBTSxJQUFNTixLQXRFakUsU0FBUzJqSixHQUFjcmpKLEdBRW5CLE1BQU11cEIsRUFBT2hmLE9BQU9ndkcsU0FBU2h3RixLQUU3QixHQUFhLEtBQVRBLEVBQ0osQ0FFSSxJQUFJazJILEVBQWNsMkgsRUFBS3BYLFFBQVEsSUFBTW5TLEVBQU0sS0FBTyxFQUFLdXBCLEVBQUtwWCxRQUFRLElBQU1uUyxFQUFNLEtBQU91cEIsRUFBS3BYLFFBQVEsSUFBTW5TLEVBQU0sS0FHaEgsR0FBSXkvSSxHQUFjLEVBQ2xCLENBRUlBLEdBQWN6L0ksRUFBSWdFLE9BQVMsRUFHM0IsTUFBTTA3SSxFQUFXbjJILEVBQUtwWCxRQUFRLElBQUtzdEksR0FDbkMsT0FBSUMsRUFBV0QsRUFFSmx3SCxtQkFBbUJoRyxFQUFLL0IsVUFBVWk0SCxFQUFZQyxJQUVoREEsRUFBVyxFQUdUbndILG1CQUFtQmhHLEVBQUsvQixVQUFVaTRILElBR3RDLEdBS1AsT0FBTyxFQU1YLE9BQU8sRUNqQmYsTUFBTSxHQUVGLFlBQWFyeUksRUFBU29TLEdBS2xCLEtBQU1wUyxhQUFtQm8ySSxlQUVyQjdoSixLQUFLeUwsUUFBVWxELFNBQVNDLGVBQWVpRCxHQUVsQixPQUFqQnpMLEtBQUt5TCxTQUVMLE1BQU0sSUFBSXVvSCxFQUlsQixJQUFLbjJHLEVBQVFzbUcsV0FFVCxNQUFNLElBQUkrUCxFQUErQiw2RUFHN0NsMEgsS0FBSzZkLFFBQVVyZ0IsT0FBTzRoQyxPQUFPLENBQ3pCMjJHLGdCQUFpQixJQUNqQlQsa0JBQW1CLEdBQ25CVixpQkFBaUIsRUFDakJ6d0IsV0FBWSxHQUNacXlCLGlCQUFpQixFQUNqQnNMLGdCQUFnQixFQUNoQmhCLGtCQUFrQixFQUNsQkUsZ0JBQWdCLEVBQ2hCbEMsdUJBQXVCLEVBQ3ZCaUQsZ0JBQWdCLEVBQ2hCQyxtQkFBb0IsVUFDcEJDLG1CQUFtQixFQUNuQi9ELG9CQUFvQixFQUNwQjdJLGlCQUFpQixFQUNqQjZNLGdCQUFnQixFQUNoQkMsOEJBQThCLEVBQzlCL00sbUJBQW1CLEVBQ25CZ04sZUFBZSxFQUNmQyxtQkFBb0IsVUFDcEJDLGtCQUFrQixFQUNsQnpZLGFBQWMsR0FDZEQsaUJBQWlCLEVBQ2pCNVEsYUFBYyxFQUNka1gsZ0JBQWlCLEtBQ2pCcFAsaUJBQWtCLFlBQ2xCMFEsY0FBYyxFQUNkM0csY0FBYyxFQUNkN1AsUUFBUSxFQUNSa1QsZUFBZ0IsRUFDaEJ6VixjQUFlLEVBQ2Z3VixlQUFnQixFQUNoQnpWLGFBQWMsRUFDZGltQixhQUFjLEtBQ2Q4RCxZQUFhLEdBQ2JDLGtCQUFtQixXQUFXLE9BQU8sR0FDckNDLGdCQUFpQixJQUNqQjlZLFlBQWEsRUFDYitZLGVBQWdCLENBQUMsT0FBVSxvQkFDM0IvWixtQkFBbUIsRUFDbkJpTixnQkFBaUIsSUFDakI3QyxXQUFZLElBQ1pELFVBQVcsSUFDWHlPLG9CQUFxQixLQUNyQjFpQixvQkFBb0IsRUFDcEIwUixlQUFnQixJQUNoQm5ZLFVBQVcsR0FDWnY2RyxHQUdILE1BQU04a0ksRUFBaUJsdkIsRUFBSSxNQUFPLENBQzlCd0QsTUFBTyxnQkFBZWozSCxLQUFLNmQsUUFBUXlrSSxpQkFBbUIsd0JBQTBCLE1BR3BGdGlKLEtBQUt5TCxRQUFRd3FCLFlBQVkwc0gsR0FFekIzaUosS0FBSzZkLFFBQVEwakksb0JBQXNCdmhKLEtBQUs2ZCxRQUFRMGpJLHFCQUF1Qm9CLEVBRXZFLE1BQU1qc0IsRUFBYSxJQUFJLEVBQVdpc0IsRUFBZ0IzaUosS0FBSzZkLFFBQVM3ZCxNQUVoRUEsS0FBS3U0SCxZQUFjN0IsRUFBV2lCLG1CQUM5QjMzSCxLQUFLNEssU0FBVzhySCxFQUFXOTZHLGNBQzNCNWIsS0FBS3N2SSxRQUFVdHZJLEtBQUs0SyxTQUFTdzNJLGNBQWdCLElBQUksR0FBUXBpSixNQUFRLEtBRWpFMmlKLEVBQWU3NkksR0FBSzlILEtBQUs0SyxTQUFTbTZHLEdBQUssVUFFdkMva0gsS0FBSzRpSixVQUFZLENBQ2Jsc0IsV0FBWUEsRUFDWjRZLFFBQVN0dkksS0FBS3N2SSxTQUlsQixJQUFJM3ZDLEVBQVMsRUFBS2tsQixPQUFPQyxVQUFVLGdCQUFpQixLQUUzQixPQUFqQjlrSCxLQUFLc3ZJLFNBRUx0dkksS0FBS3N2SSxRQUFRdVQsU0FHakIsRUFBS2grQixPQUFPaStCLFlBQVluakQsS0FHNUIzL0YsS0FBSytpSixVQUFZL2lKLEtBQUtnakoscUJBRXRCaGpKLEtBQUtpakoseUJBTVQseUJBRUksR0FBd0MsaUJBQTdCampKLEtBQUs0SyxTQUFTdTVHLFdBR3JCdDlHLFdBQVcsS0FFUDdHLEtBQUtrakosZ0JBQWdCbGpKLEtBQUs0SyxTQUFTdTVHLFdBQVlua0gsS0FBSytpSixZQUNyRCxPQUdQLENBQ0ksTUFBTTlULEVBQXlCNTZGLE1BQU1yMEMsS0FBSzRLLFNBQVN1NUcsV0FBWSxDQUMzRGgyRCxRQUFTbnVELEtBQUs0SyxTQUFTODNJLGlCQUN4Qi9ySSxLQUFPQyxJQUVOLElBQUtBLEVBQVN5bEIsR0FDZCxDQUVJLEVBQUt3b0YsT0FBT3NVLFFBQVEscUJBQXNCLENBQUN2aUgsR0FBVzVXLE1BRXREQSxLQUFLbWpKLFdBQVd2c0ksR0FFaEIsSUFBSXJTLEVBQVEsSUFBSS9CLE1BQU1vVSxFQUFTd2hHLFlBRS9CLE1BREE3ekcsRUFBTXFTLFNBQVdBLEVBQ1hyUyxFQUVWLE9BQU9xUyxFQUFTbXBDLFNBRWpCcHBDLEtBQU84UixJQUVOem9CLEtBQUtrakosZ0JBQWdCejZILEVBQU16b0IsS0FBSytpSixhQUlwQy9pSixLQUFLNGlKLFVBQVVsc0IsV0FBVzBzQiwwQkFBMEJuVSxJQU81RCxXQUFZeHFJLEdBRVJ6RSxLQUFLNGlKLFVBQVVsc0IsV0FBVytiLFVBQVVodUksR0FNeEMsV0FBWW1TLEdBR1IsTUFBTXFyRyxFQUFlLENBQUMsMkNBQTZDcnJHLEVBQVMybkIsT0FBUyxJQUFNM25CLEVBQVN3aEcsWUFLcEcsR0FGZ0YsSUFBcERwNEcsS0FBSzRLLFNBQVN1NUcsV0FBVzNqRSxZQUFZLE9BQVEsR0FHekUsQ0FDSSxNQUFNNmlHLEVBQVdyakosS0FBSzRLLFNBQVN1NUcsV0FBV250RyxRQUFRLGVBQWdCLElBQUkyVyxNQUFNLFNBQVMsR0FFakYva0IsT0FBT2d2RyxTQUFTOVcsV0FBYXVpRCxHQUU3QnBoQyxFQUFhNy9HLEtBQ1RxeEgsRUFBSSxJQUFLLHVEQUNUQSxFQUFJLElBQ0EsdUZBQ0FBLEVBQUksSUFBSyxDQUNMenlCLEtBQU0sc0ZBQ043aEcsT0FBUSxVQUNULHVDQU1uQmEsS0FBS3NqSixXQUFXcmhDLEdBTXBCLGdCQUFpQnNoQyxFQUFjUixHQUUzQixJQUFJenNDLEVBR0osSUFBS2l0QyxFQUFhNWtKLGVBQWUsZUFBOEQsSUFBOUM0a0osRUFBYSxZQUFZL3lJLFFBQVEsVUFBeUUsSUFBdkQreUksRUFBYSxZQUFZL3lJLFFBQVEsa0JBRWpJLE1BQU0sSUFBSXlqSCxFQUEyQiwrQ0FJekMsRUFBS3BQLE9BQU9zVSxRQUFRLGtCQUFtQixDQUFDb3FCLEdBQWV2akosTUFDdkRzMkcsRUFBVyxHQUFja3RDLFNBQVNELEdBQ2xDLE1BQU16TixFQUFjaU4sRUFBWS9pSixLQUFLeWpKLHdCQUF3QlYsRUFBV3pzQyxHQUFZLEdBRXBGdDJHLEtBQUs0aUosVUFBVWxzQixXQUFXZ3RCLFlBQVlwdEMsRUFBVXcvQixHQVFwRCxxQkFFSSxNQUFNN3lJLEVBQVEsR0EyQmQsTUF6QkEsQ0FBQyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLEtBQUs0SSxRQUFVMEssSUFFL0MsTUFBTXhZLEVBQVEsR0FBV0osSUFBSTRZLEVBQVF2VyxLQUFLNEssU0FBU3NsSSxrQkFHckMsSUFBVm55SSxJQUNBa0YsRUFBTXNULEdBQVN4WSxLQU9QLFNBQVprRixFQUFNNDlHLEVBQ041OUcsRUFBTTQ5RyxHQUFJLEVBQ08sVUFBWjU5RyxFQUFNNDlHLElBQ1g1OUcsRUFBTTQ5RyxHQUFJLEdBR2QsQ0FBQyxJQUFLLElBQUssSUFBSyxJQUFLLEtBQUtoMUcsUUFBVTBLLElBRTVCQSxLQUFTdFQsSUFDVEEsRUFBTXNULEdBQVM2RixTQUFTblosRUFBTXNULEdBQVEsT0FHdkN0VCxFQU1YLHdCQUF5QkEsRUFBT3F6RyxHQUU1QkEsRUFBV0EsR0FBWXQyRyxLQUFLNEssU0FBUzByRyxTQUVyQyxNQUFNejRGLEVBQVcsTUFBTzVhLEVBQVNqRCxLQUFLMmpKLGNBQWMxZ0osRUFBTWtvQixHQUFLLEdBRTNELE1BQU9sb0IsSUFDUDRhLEVBQVEyekgsYUFBZXZ1SSxFQUFNNDlHLEdBRTdCLE1BQU81OUcsSUFDUDRhLEVBQVF1NkcsVUFBWW4xSCxFQUFNbXRHLEdBRTFCLE1BQU9udEcsSUFDUDRhLEVBQVE4ckgsWUFBYzFtSSxFQUFNMUUsR0FHaEMsSUFBSTJtSCxFQUFZbGxILEtBQUs0akoseUJBQXlCdHRDLEVBQVVyekcsRUFBTW5HLEdBVzlELEdBVE1vb0gsR0FBYSxHQUFLQSxFQUFZNU8sRUFBU3VRLE1BQU14a0gsU0FFL0M2aUgsRUFBWWppSCxFQUFNckUsRUFBSSxFQUdoQnNtSCxHQUFhLEdBQUtBLEVBQVk1TyxFQUFTdVEsTUFBTXhrSCxTQUMvQzZpSCxFQUFZLE9BR0YsT0FBZEEsRUFDSixDQUNJLE1BQU0rVCxFQUFtQjc4RyxTQUFTblosRUFBTXNRLEVBQUcsSUFDckMybEgsRUFBaUI5OEcsU0FBU25aLEVBQU0wUSxFQUFHLElBRXpDa0ssRUFBUW03RyxhQUFlOVQsRUFDdkJybkcsRUFBUW83RyxpQkFBbUJBLEVBQzNCcDdHLEVBQVFxN0csZUFBaUJBLEVBRzdCLE9BQU9yN0csRUFNWCxjQUFlblAsR0FFWCxPQUFRQSxHQUVKLElBQUssSUFDRCxNQUFPLENBQ0hzc0gsUUFBUSxFQUNSNlAsY0FBYyxHQUd0QixJQUFLLElBQ0QsTUFBTyxDQUNIN1AsUUFBUSxFQUNSNlAsY0FBYyxHQUd0QixJQUFLLElBQ0QsTUFBTyxDQUNIN1AsUUFBUSxFQUNSNlAsY0FBYyxHQUd0QixRQUNJLE1BQU8sSUFPbkIseUJBQTBCdjBCLEVBQVVweEQsR0FFaEMsSUFBSXBvRCxFQUNKLE1BQU0rbUosRUFBS3Z0QyxFQUFTdVEsTUFBTXhrSCxPQUUxQixJQUFLdkYsRUFBSSxFQUFHQSxFQUFJK21KLEVBQUkvbUosSUFFaEIsR0FBSXc1RyxFQUFTdVEsTUFBTS9wSCxHQUFHK2pILElBQU0zN0QsRUFFeEIsT0FBT3BvRCxFQUlmLE9BQVEsRUFNWixZQUVJLElBQUk0UixFQUlBQSxFQUZBMU8sS0FBSzRLLFNBQVNvd0gsT0FFUCxJQUVGaDdILEtBQUs0SyxTQUFTaWdJLGFBRVosSUFJQSxJQUdYLE1BQ01uRixFQURTMWxJLEtBQUs0aUosVUFBVWxzQixXQUFXaUMsbUJBQ2ZDLDhCQUE4QjU0SCxLQUFLNEssU0FBUzB1SCxnQkFBaUJ0NUgsS0FBS3U0SCxZQUFZTyxVQUV4RyxNQUFPLENBQ0gsRUFBSzk0SCxLQUFLNEssU0FBUzRtSSxhQUNuQixFQUFLOWlJLEVBQ0wsRUFBSzFPLEtBQUs0SyxTQUFTd3RILFVBQ25CLEVBQUtwNEgsS0FBSzRLLFNBQVMrK0gsWUFDbkIsSUFBSzNwSSxLQUFLNEssU0FBU2szSSxnQkFBaUI5aEosS0FBSzRLLFNBQVMwckcsU0FBU3VRLE1BQU03bUgsS0FBSzRLLFNBQVMwdUgsaUJBQWlCelksRUFDaEcsR0FBSzdnSCxLQUFLNEssU0FBU2szSSxnQkFBeUI5aEosS0FBSzRLLFNBQVMwdUgsZ0JBQWtCLEVBQzVFLElBQUtvTSxHQUFhQSxFQUFXL3hILEVBQzdCLElBQUsreEgsR0FBYUEsRUFBV255SCxHQU9yQyxjQUVJLE1BQU11d0ksRUFBYTlqSixLQUFLK2pKLFlBQ2xCQyxFQUFvQixHQUMxQixJQUFJenRJLEVBRUosSUFBS0EsS0FBU3V0SSxHQUVnQixJQUF0QkEsRUFBV3Z0SSxJQUNYeXRJLEVBQWtCNWhKLEtBQUttVSxFQUFRdlcsS0FBSzRLLFNBQVNzbEksZ0JBQWtCLElBQU0vcEgsbUJBQW1CMjlILEVBQVd2dEksS0FHM0csT0FBT3l0SSxFQUFrQnhqSSxLQUFLLEtBUWxDLGNBQWUwa0MsR0FFWCxPQUFPbGxELEtBQUs0akoseUJBQXlCNWpKLEtBQUs0SyxTQUFTMHJHLFNBQVVweEQsR0FNakUsZUFFSSxRQUFLbGxELEtBQUt1NEgsWUFBWWtGLFNBRWxCOTZILFFBQVFDLEtBQUssOEtBQ04sR0FVZixvQkFPSSxJQUFJNUUsRUFMSmdDLEtBQUtpa0osY0FBYyxDQUNmelMsY0FBZXh4SSxLQUFLNEssU0FBUzRtSSxlQUtqQyxJQUFJMFMsR0FBUSxFQUNSNUMsRUFBUS80SSxTQUFTQyxlQUFleEksS0FBSzRLLFNBQVM4a0IsU0FBVyxTQXFCN0QsU0FBU3kwSCxJQUVMN0MsRUFBTWo0SSxNQUFNbVIsUUFBVSxFQUN0QnpULGFBQWEvSSxJQUNSa21KLEdBQVNsa0osS0FBSzRLLFNBQVM0bUksZUFDeEJ4ekksRUFBSTZJLFlBQVcsV0FFWHk2SSxFQUFNajRJLE1BQU1tUixRQUFVLElBM0JsQixNQUVaeGEsS0FBSzRLLFNBQVM0bUksY0FFZDhQLEVBQU1yNEksVUFBVUMsSUFBSSx5QkFFcEJYLFNBQVMxRSxpQkFBaUIsWUFBYXNnSixFQUFjN2xKLEtBQUswQixPQUMxRHVJLFNBQVNtRCx1QkFBdUIsaUJBQWlCLEdBQUc3SCxpQkFBaUIsU0FBVXNnSixFQUFjN2xKLEtBQUswQixPQUNsR3NoSixFQUFNejlJLGlCQUFpQixjQUFjLFdBQ2pDcWdKLEdBQVEsS0FFWjVDLEVBQU16OUksaUJBQWlCLGNBQWMsV0FDakNxZ0osR0FBUSxNQUtaNUMsRUFBTXI0SSxVQUFVUixPQUFPLHlCQXFCL0IsK0JBRUksTUFBTW8ySCxHQUFzQjcrSCxLQUFLNEssU0FBU2kwSCxtQkFXMUMsT0FSQTcrSCxLQUFLaWtKLGNBQWMsQ0FDZmpwQixRQUFRLEVBQ1I2RCxtQkFBb0JBLEVBQ3BCN0YsYUFBY2g1SCxLQUFLNEssU0FBUzB1SCxnQkFDNUJKLGVBQWdCbDVILEtBQUs0aUosVUFBVWxzQixXQUFXNmYsYUFDMUN0ZCxpQkFBa0JqNUgsS0FBSzRpSixVQUFVbHNCLFdBQVc0ZixlQUd6Q3pYLEVBUVgsWUFBYXVsQixHQUVULE9BQVFBLEdBRUosSUFBSyxXQUNELE9BQU9wa0osS0FBS2lrSixjQUFjLENBQ3RCanBCLFFBQVEsRUFDUjZQLGNBQWMsSUFHdEIsSUFBSyxPQUNELE9BQU83cUksS0FBS2lrSixjQUFjLENBQ3RCanBCLFFBQVEsRUFDUjZQLGNBQWMsSUFHdEIsSUFBSyxPQUNELE9BQU83cUksS0FBS2lrSixjQUFjLENBQ3RCanBCLFFBQVEsSUFHaEIsUUFDSSxPQUFPLEdBWW5CLGlCQUFrQjlWLEVBQVdtL0IsRUFBU0MsR0FFbEMsSUFBSS9QLEVBQU9uNEgsU0FBUzhvRyxFQUFXLElBRS9CLEdBQUlsbEgsS0FBS3VrSixrQkFBa0JoUSxHQUMzQixDQUNJLE1BQU1pUSxFQUFVeGtKLEtBQUs0aUosVUFBVWxzQixXQUFXNGYsV0FBVy9CLEVBQU04UCxHQUNyREksRUFBVXprSixLQUFLNGlKLFVBQVVsc0IsV0FBVzZmLFdBQVdoQyxFQUFNK1AsR0FHM0QsT0FEQXRrSixLQUFLdTRILFlBQVlrQyxTQUFTc0osS0FBS3dRLEVBQU1rUSxFQUFTRCxJQUN2QyxFQUdYLE9BQU8sRUFVWCxrQkFBbUJ0L0IsR0FFZixPQUFPbGxILEtBQUs0SyxTQUFTMHJHLFNBQVNvdUMsWUFBWXgvQixFQUFXbGxILEtBQUs0SyxTQUFTKzlILG1CQVN2RSw2QkFBOEJuYyxFQUFPQyxHQUdqQyxNQUFNazRCLEVBQWMza0osS0FBS3U0SCxZQUFZb0ssYUFBYWxNLHdCQUM1Q211QixFQUFXRCxFQUFZcitCLElBQ3ZCdStCLEVBQVlGLEVBQVkvNEcsS0FDeEJrNUcsRUFBY0gsRUFBWXZwQixPQUMxQjJwQixFQUFhSixFQUFZOTRHLE1BRy9CLEdBQUkyZ0YsRUFBUXE0QixHQUFhcjRCLEVBQVF1NEIsRUFDN0IsT0FBUSxFQUVaLEdBQUl0NEIsRUFBUW00QixHQUFZbjRCLEVBQVFxNEIsRUFDNUIsT0FBUSxFQUdaLE1BQU1qK0IsRUFBUXQrRyxTQUFTbUQsdUJBQXVCLGFBQzlDLElBQUlzNUksRUFBYW4rQixFQUFNeGtILE9BQ3ZCLEtBQU8yaUosS0FDUCxDQUVJLE1BQU1DLEVBQVVwK0IsRUFBTW0rQixHQUNoQkUsRUFBWUQsRUFBUXh1Qix3QkFHMUIsS0FBSWpLLEVBQVEwNEIsRUFBVXQ1RyxNQUFRNGdGLEVBQVEwNEIsRUFBVXI1RyxVQUk1QzRnRixFQUFReTRCLEVBQVU1K0IsS0FBT21HLEVBQVF5NEIsRUFBVTlwQixRQUkvQyxPQUFPNnBCLEVBQVExekksYUFBYSxjQUloQyxPQUFRLEVBTVosY0FBZTYvSCxHQUVYLE9BQU9weEksS0FBSzRpSixVQUFVbHNCLFdBQVc3ZSxPQUFPdTVCLEdBTTVDLGlCQUVJLE9BQU94NUIsU0FBU3pxRCxTQUFXLEtBQU95cUQsU0FBU2hxRCxLQUFPZ3FELFNBQVM3VyxTQUFXNlcsU0FBUzN2RyxPQUFTLElBQU1qSSxLQUFLbWxKLGNBY3ZHLFdBRUlubEosS0FBS3U0SCxZQUFZbVcsY0FBZSxFQVNwQyxhQUFjdnFCLEdBRVZua0gsS0FBS3U0SCxZQUFZa0YsUUFBUyxFQUMxQno5SCxLQUFLNGlKLFVBQVVsc0IsV0FBVzFpRCxRQUV0QmgwRSxLQUFLdTRILFlBQVlrQyxVQUNqQno2SCxLQUFLdTRILFlBQVlrQyxTQUFTM3lHLFVBRTlCOW5CLEtBQUt1NEgsWUFBWTE2RyxRQUFRc21HLFdBQWFBLEVBRXRDbmtILEtBQUtpakoseUJBU1QsV0FBWW1CLEdBRVJwa0osS0FBS29sSixZQUFZaEIsR0FRckIsYUFFSXBrSixLQUFLdTRILFlBQVltVyxjQUFlLEVBUXBDLFVBRUkxdUksS0FBSzRpSixVQUFVbHNCLFdBQVc1dUcsVUFROUIsb0JBRUk5bkIsS0FBSzRpSixVQUFVbHNCLFdBQVcydUIsb0JBUTlCLG1CQUVJcmxKLEtBQUs0aUosVUFBVWxzQixXQUFXNHVCLG1CQVE5Qix3QkFFSXRsSixLQUFLNGlKLFVBQVVsc0IsV0FBV3BTLHdCQVE5Qix1QkFFSXRrSCxLQUFLNGlKLFVBQVVsc0IsV0FBV3dnQix1QkFZOUIsc0JBRUksT0FBS2wzSSxLQUFLNEssU0FBUzRtSSxlQUVmeHhJLEtBQUt1bEoscUJBQ0UsR0FhZixnQkFFSSxPQUFLdmxKLEtBQUs0SyxTQUFTb3dILFNBRWZoN0gsS0FBS29sSixZQUFZLFNBQ1YsR0FZZixpQkFFSSxPQUFPcGxKLEtBQUs0SyxTQUFTMHJHLFNBQVN1USxNQUFNcDFHLElBQU0rekksR0FFL0JBLEVBQUcza0MsR0FVbEIsbUJBRUksT0FBTzdnSCxLQUFLNEssU0FBUzByRyxTQUFTdVEsTUFBTTdtSCxLQUFLNEssU0FBUzB1SCxpQkFBaUJwd0IsT0FVdkUsNkNBRUksT0FBT2xwRyxLQUFLNmxILG9DQUFvQzdsSCxLQUFLNEssU0FBUzB1SCxpQkFVbEUseUJBR0ksT0FEQTMySCxRQUFRQyxLQUFLLHFHQUNONUMsS0FBSzRLLFNBQVMwckcsU0FBU3VRLE1BQU03bUgsS0FBSzRLLFNBQVMwdUgsaUJBQWlCelksRUFTdkUsd0JBRUksT0FBTzdnSCxLQUFLNEssU0FBU3lqSSxtQkFTeEIscUJBRUcsT0FBT3J1SSxLQUFLNEssU0FBUzB1SCxnQkFTekIsdUJBRUksT0FBT3Q1SCxLQUFLazZILGNBQWNsNkgsS0FBSzRLLFNBQVMwdUgsaUJBUzVDLG9CQUVJLE9BQU90NUgsS0FBSzRLLFNBQVMwckcsU0FBU3VRLE1BQU03bUgsS0FBSzRLLFNBQVMwdUgsaUJBQWlCelksRUFVdkUsZ0JBRUksT0FBTzdnSCxLQUFLeWxKLGlCQVVoQixlQUlJLE9BRkE5aUosUUFBUUMsS0FBSyxpRkFFTjVDLEtBQUs0SyxTQUFTMHJHLFNBQVN1USxNQUFNcDFHLElBQU0rekksR0FFL0JBLEVBQUcza0MsR0FVbEIscUJBR0ksT0FBTzdnSCxLQUFLNEssU0FBUysrSCxZQVV6QixnQkFFSSxPQUFPM3BJLEtBQUs0SyxTQUFTbTZHLEdBVXpCLHNCQUVJLE9BQU8va0gsS0FBSzRpSixVQUFVbHNCLFdBQVdobkcsU0FTckMsZUFFSSxPQUFPMXZCLEtBQUs0SyxTQUFTMHJHLFNBQVNzUSxVQVNsQyxrQkFFSSxPQUFPNW1ILEtBQUs0SyxTQUFTNnRILGFBVXpCLHVCQUF3Qml0QixHQUVwQixRQUFLMWxKLEtBQUsybEosZ0JBR0gzbEosS0FBSzRLLFNBQVMwckcsU0FBU3VRLE1BQU02K0IsR0FBU3hvSixFQVNqRCxrQkFFSSxPQUFPOEMsS0FBSzRLLFNBQVM0dEgsYUFTekIsbUJBRUksUUFBS3g0SCxLQUFLMmxKLGdCQUdIM2xKLEtBQUs0SyxTQUFTaXRILFNBVXpCLGVBQWdCM1MsR0FFWixPQUFPbGxILEtBQUs0SyxTQUFTMHJHLFNBQVN1USxNQUFNM0IsR0FBVyt4QixZQVVuRCxrQkFBbUIveEIsR0FFZixPQUFLbGxILEtBQUsybEosZUFHSDNsSixLQUFLNGlKLFVBQVVsc0IsV0FBV2lDLG1CQUFtQnFCLGtCQUFrQjlVLEdBRjNELEtBYWYsb0NBQXFDQSxHQUVqQyxJQUFJcXZCLEVBQU9uNEgsU0FBUzhvRyxFQUFXLElBRS9CLElBQUtsbEgsS0FBS3VrSixrQkFBa0JoUSxHQUN4QixNQUFNLElBQUkveEksTUFBTSxzQkFFcEIsT0FBT3hDLEtBQUs0aUosVUFBVWxzQixXQUFXaUMsbUJBQW1CcUIsa0JBQWtCdWEsR0FXMUUsNkJBQThCbVIsRUFBU3R0QixHQUVuQyxJQUFLcDRILEtBQUsybEosZUFDTixPQUFPLEVBRVB2dEIsRUFBWXA0SCxLQUFLNEssU0FBUzZ0SCxlQUMxQkwsRUFBWXA0SCxLQUFLNEssU0FBUzZ0SCxjQUU5QixNQUNNbXRCLEVBREs1bEosS0FBSzRLLFNBQVMwckcsU0FBU3VRLE1BQU16cUcsU0FBU3NwSSxFQUFTLEtBQ3RDdG9KLEVBQUVnZixTQUFTZzhHLEVBQVcsS0FFMUMsTUFBTyxDQUNIdnpHLE1BQU8rZ0ksRUFBU3JqSixFQUNoQnVpQixPQUFROGdJLEVBQVN0eEcsR0FjekIsZ0JBQWlCNHdFLEVBQVd2eUcsR0FFeEIsT0FBTzNTLEtBQUs0SyxTQUFTMHJHLFNBQVNzOEIsZ0JBQWdCMXRCLEVBQVd2eUcsR0FZN0QsNEJBQTZCNjVHLEVBQU9DLEdBRWhDLE9BQU96c0gsS0FBSzZsSiw2QkFBNkJyNUIsRUFBT0MsR0FZcEQsY0FBZXZILEVBQVdybkcsR0FFdEIsTUFBTXM5RyxFQUFTbjdILEtBQUs0aUosVUFBVWxzQixXQUFXMVEsY0FBY2QsRUFBV3JuRyxHQUVsRSxNQUFPLENBQ0h5b0csSUFBSzZVLEVBQU83VSxJQUNaMTZFLEtBQU11dkYsRUFBT3Z2RixNQVVyQixjQUVJLE9BQU81ckMsS0FBSzRLLFNBU2hCLFdBRUksT0FBTzVLLEtBQUsrakosWUFTaEIsZUFFSSxPQUFPL2pKLEtBQUs0SyxTQUFTd3RILFVBYXpCLGdCQUFpQmxULEVBQVdtL0IsRUFBU0MsR0FFakMsT0FBT3RrSixLQUFLOGxKLGlCQUFpQjVnQyxFQUFXbS9CLEVBQVNDLEdBYXJELGdCQUFpQi95QixFQUFPOHlCLEVBQVNDLEdBRTdCLE1BQU16OUIsRUFBUTdtSCxLQUFLNEssU0FBUzByRyxTQUFTdVEsTUFDckMsSUFBSWsvQixFQUFNeDBCLEVBQU14M0csY0FFaEIsSUFBSyxJQUFJamQsRUFBSSxFQUFHNkgsRUFBTWtpSCxFQUFNeGtILE9BQVF2RixFQUFJNkgsRUFBSzdILElBRXpDLEdBQUkrcEgsRUFBTS9wSCxHQUFHQyxFQUFFZ2QsY0FBY3ZKLFFBQVF1MUksSUFBUSxFQUN6QyxPQUFPL2xKLEtBQUs4bEosaUJBQWlCaHBKLEVBQUd1bkosRUFBU0MsR0FHakQsTUFBTXAvQixFQUFZOW9HLFNBQVNtMUcsRUFBTyxJQUFNLEVBQ3hDLE9BQU92eEgsS0FBSzhsSixpQkFBaUI1Z0MsRUFBV20vQixFQUFTQyxHQVlyRCxlQUFnQnAvRixFQUFVbS9GLEVBQVNDLEdBRS9CM2hKLFFBQVFDLEtBQUssMEZBQ2IsTUFBTXNpSCxFQUFZbGxILEtBQUtnbUosY0FBYzlnRyxHQUNyQyxPQUFPbGxELEtBQUs4bEosaUJBQWlCNWdDLEVBQVdtL0IsRUFBU0MsR0FZckQsY0FBZXY2SCxFQUFLczZILEVBQVNDLEdBRXpCLE1BQU1wL0IsRUFBWWxsSCxLQUFLZ21KLGNBQWNqOEgsR0FDckMsT0FBTy9wQixLQUFLOGxKLGlCQUFpQjVnQyxFQUFXbS9CLEVBQVNDLEdBVXJELGVBQWdCcC9CLEdBRVosT0FBK0QsSUFBeERsbEgsS0FBSzRLLFNBQVMwckcsU0FBU3VRLE1BQU0zQixHQUFXK3hCLFlBUW5ELG9CQUVJajNJLEtBQUtpa0osY0FBYyxDQUFFdGIsbUJBQW1CLElBUzVDLGlCQUVJLE9BQU8zb0ksS0FBSzRLLFNBQVM0bUksYUFTekIsaUJBQWtCdHNCLEdBRWQsT0FBT2xsSCxLQUFLdWtKLGtCQUFrQnIvQixHQVVsQyxpQkFBa0JBLEdBRWQsT0FBT2xsSCxLQUFLdTRILFlBQVlrQyxTQUFTQyxjQUFjeFYsR0FTbkQsVUFFSSxPQUFPbGxILEtBQUt1NEgsWUFBWWtGLE9BYzVCLG1CQUFvQnZZLEVBQVdva0IsRUFBWTJjLEVBQVdwaEksRUFBT0MsR0FFekQsTUFBTTYwRyxFQUFTMzVILEtBQUs0aUosVUFBVWxzQixXQUFXaUMsbUJBRXpDLElBQUtnQixFQUNELE9BQU8sRUFFWCxNQUFNOS9HLEVBQVM4L0csRUFBT08sY0FBY2hWLEdBRTlCb0IsRUFBTXpzRyxFQUFPeXNHLElBQU0yL0IsRUFDbkJyNkcsRUFBTy94QixFQUFPK3hCLEtBQU8wOUYsRUFFM0IsT0FBT3RwSSxLQUFLdTRILFlBQVlPLFNBQVN3TCxpQkFBaUIsQ0FDOUNoZSxJQUFLQSxFQUNMOFUsT0FBUTlVLEVBQU14aEcsRUFDZDhtQixLQUFNQSxFQUNOQyxNQUFPRCxFQUFPL21CLElBVXRCLHVCQUVJLE9BQU83a0IsS0FBSzRLLFNBQVNpMEgsbUJBU3pCLHNCQUVJLFFBQUk3K0gsS0FBSzRLLFNBQVM0bUksZUFFZHh4SSxLQUFLdWxKLHFCQUNFLEdBWWYsZ0JBRUksUUFBSXZsSixLQUFLNEssU0FBU293SCxTQUVkaDdILEtBQUtpa0osY0FBYyxDQUFFanBCLFFBQVEsS0FDdEIsR0FhZixtQkFBb0IyTyxHQUdoQixRQUFLM3BJLEtBQUs0aUosVUFBVWxzQixXQUFXK2MsY0FBYyxjQUFlOUosSUFHckQzcEksS0FBS2lrSixjQUFjLENBQ3RCanBCLFFBQVEsRUFDUjJPLFlBQWFBLElBV3JCLFNBQVUxbUksR0FFTmpELEtBQUtpa0osY0FBY2prSixLQUFLeWpKLHdCQUF3QnhnSixJQVNwRCxhQUFjbTFILEdBU1YsT0FQSXA0SCxLQUFLNEssU0FBU293SCxRQUVkaDdILEtBQUtpa0osY0FBYyxDQUNmanBCLFFBQVEsSUFJVGg3SCxLQUFLNGlKLFVBQVVsc0IsV0FBVzdzSCxLQUFLdXVILEdBUzFDLG9CQUVJcDRILEtBQUtpa0osY0FBYyxDQUFFdGIsbUJBQW1CLElBUzVDLHVCQUVJM29JLEtBQUt1bEosb0JBU1QsZ0NBRUl2bEosS0FBS2lrSixjQUFjLENBQ2Z0YixtQkFBb0Izb0ksS0FBSzRLLFNBQVMrOUgsb0JBSzFDLG9CQUVJLE9BQU8zb0ksS0FBS2ttSiwrQkFrQmhCLDBCQUEyQmpoSixHQUV2QixNQUFNNnlJLEVBQWlCOTNJLEtBQUs0SyxTQUFTNnRILGFBQWV6NEgsS0FBSzRLLFNBQVN3dEgsVUFDbEUsT0FBT256SCxFQUFXa0QsS0FBS202RyxJQUFJLEVBQUd3MUIsR0FlbEMsd0JBQXlCN3lJLEdBRXJCLE1BQU02eUksRUFBaUI5M0ksS0FBSzRLLFNBQVM2dEgsYUFBZXo0SCxLQUFLNEssU0FBU3d0SCxVQUlsRSxPQUF1QixJQUFuQjBmLEVBQ083eUksRUFFSkEsRUFBV2tELEtBQUttNkcsSUFBSSxFQUFHdzFCLEdBU2xDLFNBRUksT0FBTzkzSSxLQUFLazlJLGFBQWFsOUksS0FBSzRLLFNBQVN3dEgsVUFBWSxHQU92RCxVQUVJLE9BQU9wNEgsS0FBS2s5SSxhQUFhbDlJLEtBQUs0SyxTQUFTd3RILFVBQVksSUFJM0QsR0FBS3ZULE9BQVMsRUFBS0EsT0FFSixJQU1BeDVELEdBTkEsYUFLTyxvQkFBWHppRCxVQUNJeWlELEdBR1J6aUQsUUFEUXU5SSxLQUFPOTZGLEdBQU84NkYsTUFBUSIsImZpbGUiOiJlZGl0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNTgpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0eXBlcyA9IFtcbiAgcmVxdWlyZSgnLi9uZXh0VGljaycpLFxuICByZXF1aXJlKCcuL3F1ZXVlTWljcm90YXNrJyksXG4gIHJlcXVpcmUoJy4vbXV0YXRpb24uanMnKSxcbiAgcmVxdWlyZSgnLi9tZXNzYWdlQ2hhbm5lbCcpLFxuICByZXF1aXJlKCcuL3N0YXRlQ2hhbmdlJyksXG4gIHJlcXVpcmUoJy4vdGltZW91dCcpXG5dO1xudmFyIGRyYWluaW5nO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG52YXIgcXVldWUgPSBbXTtcbnZhciBzY2hlZHVsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRyYWluaW5nID0gZmFsc2U7XG4gIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gIH1cbiAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgIG5leHRUaWNrKCk7XG4gIH1cbn1cblxuLy9uYW1lZCBuZXh0VGljayBmb3IgbGVzcyBjb25mdXNpbmcgc3RhY2sgdHJhY2VzXG5mdW5jdGlvbiBuZXh0VGljaygpIHtcbiAgaWYgKGRyYWluaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNjaGVkdWxlZCA9IGZhbHNlO1xuICBkcmFpbmluZyA9IHRydWU7XG4gIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICB3aGlsZSAobGVuKSB7XG4gICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgcXVldWUgPSBbXTtcbiAgICB3aGlsZSAoY3VycmVudFF1ZXVlICYmICsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgIH1cbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICB9XG4gIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gIHF1ZXVlSW5kZXggPSAtMTtcbiAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxudmFyIHNjaGVkdWxlRHJhaW47XG52YXIgaSA9IC0xO1xudmFyIGxlbiA9IHR5cGVzLmxlbmd0aDtcbndoaWxlICgrK2kgPCBsZW4pIHtcbiAgaWYgKHR5cGVzW2ldICYmIHR5cGVzW2ldLnRlc3QgJiYgdHlwZXNbaV0udGVzdCgpKSB7XG4gICAgc2NoZWR1bGVEcmFpbiA9IHR5cGVzW2ldLmluc3RhbGwobmV4dFRpY2spO1xuICAgIGJyZWFrO1xuICB9XG59XG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgdGhpcy5mdW4gPSBmdW47XG4gIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZ1biA9IHRoaXMuZnVuO1xuICB2YXIgYXJyYXkgPSB0aGlzLmFycmF5O1xuICBzd2l0Y2ggKGFycmF5Lmxlbmd0aCkge1xuICBjYXNlIDA6XG4gICAgcmV0dXJuIGZ1bigpO1xuICBjYXNlIDE6XG4gICAgcmV0dXJuIGZ1bihhcnJheVswXSk7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdLCBhcnJheVsxXSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gZnVuKGFycmF5WzBdLCBhcnJheVsxXSwgYXJyYXlbMl0pO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiBmdW4uYXBwbHkobnVsbCwgYXJyYXkpO1xuICB9XG5cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGltbWVkaWF0ZTtcbmZ1bmN0aW9uIGltbWVkaWF0ZSh0YXNrKSB7XG4gIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgfVxuICBxdWV1ZS5wdXNoKG5ldyBJdGVtKHRhc2ssIGFyZ3MpKTtcbiAgaWYgKCFzY2hlZHVsZWQgJiYgIWRyYWluaW5nKSB7XG4gICAgc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBzY2hlZHVsZURyYWluKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlY29yZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vRXJyb3JMb2cnO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSAnLi9yYW5kb20nO1xuXG50eXBlIE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ3N1Y2Nlc3MnO1xuXG5jb25zdCBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25bXSA9IG5ldyBBcnJheSgwKTtcbmxldCBjdXJyZW50TW9kZU1lc3NhZ2U6IE5vdGlmaWNhdGlvbiA9IG51bGw7XG5cbi8qKlxuICogTnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgdG8gZGlzcGxheSBhdCBhIHRpbWUuXG4gKi9cbmNvbnN0IE5VTUJFUl9UT19ESVNQTEFZID0gMztcblxuLyoqXG4gKiBOdW1iZXIgb2Ygbm90aWZpY2F0aW9ucyB0byBkaXNwbGF5IGF0IGEgdGltZS5cbiAqL1xuY29uc3QgVElNRU9VVCA9IDUwMDA7XG5cbmNvbnN0IG5vdGlmaWNhdGlvbkljb246IFJlY29yZDxOb3RpZmljYXRpb25UeXBlLCBzdHJpbmc+ID0ge1xuICBkZWZhdWx0OiAnJyxcbiAgd2FybmluZzogJ+KaoO+4jyAnLFxuICBlcnJvcjogJ/CflLQgJyxcbiAgc3VjY2VzczogJ+KchSAnLFxufTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIG1hbmFnZSBOZW9uIG5vdGlmaWNhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRpc3BsYXllZDogYm9vbGVhbjtcbiAgaWQ6IHN0cmluZztcbiAgaXNNb2RlTWVzc2FnZTogYm9vbGVhbjtcbiAgbG9nSW5mbzogc3RyaW5nO1xuICB0aW1lb3V0SUQ6IG51bWJlcjtcbiAgdHlwZTogTm90aWZpY2F0aW9uVHlwZTtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBub3RpZmljYXRpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gTm90aWZpY2F0aW9uIGNvbnRlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBOb3RpZmljYXRpb25UeXBlLCBsb2dJbmZvOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbm90aWZpY2F0aW9uSWNvblt0eXBlXSArIG1lc3NhZ2U7XG4gICAgdGhpcy5kaXNwbGF5ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5pc01vZGVNZXNzYWdlID0gbWVzc2FnZS5zZWFyY2goJ01vZGUnKSAhPT0gLTE7XG4gICAgdGhpcy5sb2dJbmZvID0gbG9nSW5mbztcbiAgICB0aGlzLnRpbWVvdXRJRCA9IC0xO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBJRCBmcm9tIHNldFRpbWVvdXQuICovXG4gIHNldFRpbWVvdXRJZCAoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudGltZW91dElEID0gTWF0aC5tYXgoaWQsIC0xKTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IHRoZSBOb3RpZmljYXRpb24uICovXG4gIGRpc3BsYXkgKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgVVVJRCBmb3IgdGhpcyBub3RpZmljYXRpb24uXG4gICAqL1xuICBnZXRJZCAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIHRoZSBub3RpZmljYXRpb25cbiAqIEBwYXJhbSBjdXJyZW50SWQgLSBUaGUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBjbGVhcmVkLlxuICovXG5mdW5jdGlvbiBjbGVhck5vdGlmaWNhdGlvbiAoY3VycmVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGN1cnJlbnRJZCkpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjdXJyZW50SWQpLnJlbW92ZSgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBhIG5vdGlmaWNhdGlvbi5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gdG8gZGlzcGxheS5cbiAqL1xuZnVuY3Rpb24gZGlzcGxheU5vdGlmaWNhdGlvbiAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgLy8gTm90IHN1cmUgd2hhdCBpdCBkb2VzLCBtYXliZSByZWxhdGVkIHRvIHJvZGFuL25lb25cbiAgaWYgKG5vdGlmaWNhdGlvbi5pc01vZGVNZXNzYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRNb2RlTWVzc2FnZSA9PT0gbnVsbCkge1xuICAgICAgY3VycmVudE1vZGVNZXNzYWdlID0gbm90aWZpY2F0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGN1cnJlbnRNb2RlTWVzc2FnZS50aW1lb3V0SUQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgdG9wIG5vdGlmaWNhdGlvbiBpZiBleGNlZWRzIG1heG1pbXVtXG4gIG5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICBpZiAobm90aWZpY2F0aW9ucy5sZW5ndGggPiBOVU1CRVJfVE9fRElTUExBWSkge1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gbm90aWZpY2F0aW9ucy5zaGlmdCgpO1xuICAgIGNsZWFyTm90aWZpY2F0aW9uKHRvUmVtb3ZlLmdldElkKCkpO1xuICB9XG4gIGNvbnN0IG5vdGlmaWNhdGlvbkNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWNvbnRlbnQnKTtcbiAgY29uc3QgbmV3Tm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG5ld05vdGlmaWNhdGlvbi5jbGFzc0xpc3QuYWRkKCduZW9uLW5vdGlmaWNhdGlvbicpO1xuICBuZXdOb3RpZmljYXRpb24uY2xhc3NMaXN0LmFkZChgbmVvbi1ub3RpZmljYXRpb24tJHtub3RpZmljYXRpb24udHlwZX1gKTtcbiAgbmV3Tm90aWZpY2F0aW9uLmlkID0gbm90aWZpY2F0aW9uLmdldElkKCk7XG4gIG5ld05vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSBub3RpZmljYXRpb24ubWVzc2FnZTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5hcHBlbmQobmV3Tm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uQ29udGVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIG5vdGlmaWNhdGlvbi5kaXNwbGF5KCk7XG59XG5cbi8qKlxuICogU3RhcnQgZGlzcGxheWluZyBub3RpZmljYXRpb25zLiBDYWxsZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gc3RhcnROb3RpZmljYXRpb24gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gIGRpc3BsYXlOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgbm90aWZpY2F0aW9uLnNldFRpbWVvdXRJZChcbiAgICB3aW5kb3cuc2V0VGltZW91dChjbGVhck5vdGlmaWNhdGlvbiwgVElNRU9VVCwgbm90aWZpY2F0aW9uLmdldElkKCkpXG4gICk7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKG5vdGlmaWNhdGlvbi5nZXRJZCgpKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQobm90aWZpY2F0aW9uLnRpbWVvdXRJRCk7XG4gICAgICBjbGVhck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZ2V0SWQoKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQWRkIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBxdWV1ZS5cbiAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBOb3RpZmljYXRpb24gY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlTm90aWZpY2F0aW9uIChub3RpZmljYXRpb25Db250ZW50OiBzdHJpbmcsIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUgPSAnZGVmYXVsdCcsIGxvZ0luZm86IHN0cmluZyA9IG51bGwpOiB2b2lkIHtcbiAgY29uc3Qgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Db250ZW50LCB0eXBlLCBsb2dJbmZvKTtcblxuICBpZiAobm90aWZpY2F0aW9uLnR5cGUgPT0gJ2Vycm9yJyB8fCBub3RpZmljYXRpb24udHlwZSA9PSAnd2FybmluZycpIHtcbiAgICByZWNvcmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgfVxuXG4gIHN0YXJ0Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgcXVldWVOb3RpZmljYXRpb24gfTtcbiIsImltcG9ydCB7IEdyb3VwaW5nVHlwZSwgU2VsZWN0aW9uVHlwZSwgVXNlclR5cGUsIEluc2VydFR5cGUsIEluc2VydFRhYlR5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogVGhlIG9uZSBpbnN0YW5jZSBvZiBMb2NhbFNldHRpbmdzIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGFuZFxuICogdXNlZCBieSB0aGUgZWRpdG9yLlxuICogXG4gKiBVc2UgdGhlIGZ1bmN0aW9ucyBgZ2V0U2V0dGluZ3MoKWAgYW5kIGBzZXRTZXR0aW5ncygpYFxuICogdG8gYWNjZXNzIHRoaXMgaW5zdGFuY2UuXG4gKi9cbmxldCBsb2NhbFNldHRpbmdzOiBMb2NhbFNldHRpbmdzID0gbnVsbDtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBzZXR0aW5ncyBmb3IgZWFjaCBmb2xpb1xuICogc3RvcmVkIGluIGxvY2FsU3RvcmFnZS5cbiAqXG4gKiBFdmVyeSBrZXkgaXMgb3B0aW9uYWwgc28gdGhhdCB0aGlzIHNhbWUgdHlwaW5nXG4gKiBjYW4gYmUgdXNlZCBmb3IgYHNldFNldHRpbmdzKClgIC8gYExvY2FsU2V0dGluZ3Muc2V0KClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcbiAgem9vbTogbnVtYmVyO1xuICBnbHlwaE9wYWNpdHk6IG51bWJlcjtcbiAgaW1hZ2VPcGFjaXR5OiBudW1iZXI7XG4gIGNpcmNsZVNpemU6IG51bWJlcjtcbiAgaGlnaGxpZ2h0TW9kZTogR3JvdXBpbmdUeXBlO1xuICB1c2VyTW9kZTogVXNlclR5cGU7XG4gIGluc2VydE1vZGU6IEluc2VydFR5cGU7XG4gIGluc2VydFRhYjogSW5zZXJ0VGFiVHlwZTtcbiAgc2VsZWN0aW9uTW9kZTogU2VsZWN0aW9uVHlwZTtcbiAgZGVidWdNb2RlOiBib29sZWFuO1xuICBkaXNwbGF5QkJveDogYm9vbGVhbjtcbiAgZGlzcGxheVRleHQ6IGJvb2xlYW47XG4gIGRpc3BsYXlJbmZvOiBib29sZWFuO1xuICBkaXNwbGF5RXJyTG9nOiBib29sZWFuO1xuICB2aWV3Qm94OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBzZXR0aW5ncywgd2hpY2ggc2hvdWxkIGJlIHNldCBmb3IgYSBmb2xpbyB3aXRoIG5vXG4gKiBsb2NhbFN0b3JhZ2UgdmFsdWUuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgdXBkYXRlZCBhbG9uZ3NpZGUgdGhlIGludGVyZmFjZSBgU2V0dGluZ3NgXG4gKiBhbnkgdGltZSB3ZSB3YW50IHRvIGFkZCBhIG5ldyBzZXR0aW5nIHRvIHN0b3JlIGluIGxvY2FsU3RvcmFnZS5cbiAqL1xuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XG4gIHpvb206IDEwMCxcbiAgZ2x5cGhPcGFjaXR5OiAxMDAsXG4gIGltYWdlT3BhY2l0eTogMTAwLFxuICBjaXJjbGVTaXplOiAyNSxcbiAgaGlnaGxpZ2h0TW9kZTogJ25vbmUnLFxuICB1c2VyTW9kZTogJ2VkaXQnLFxuICBpbnNlcnRNb2RlOiAncHVuY3R1bScsXG4gIGluc2VydFRhYjogJ3ByaW1pdGl2ZVRhYicsXG4gIHNlbGVjdGlvbk1vZGU6ICdzZWxCeVN5bGxhYmxlJyxcbiAgZGVidWdNb2RlOiBmYWxzZSxcbiAgZGlzcGxheUJCb3g6IGZhbHNlLFxuICBkaXNwbGF5VGV4dDogZmFsc2UsXG4gIGRpc3BsYXlJbmZvOiBmYWxzZSxcbiAgZGlzcGxheUVyckxvZzogZmFsc2UsXG4gIHZpZXdCb3g6IG51bGxcbn07XG5cbmNsYXNzIExvY2FsU2V0dGluZ3Mge1xuICBpZDogc3RyaW5nO1xuICBzZXR0aW5nczogU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IgKGZvbGlvSWQ6IHN0cmluZykge1xuICAgIGxvY2FsU2V0dGluZ3MgPSB0aGlzO1xuICAgIHRoaXMuaWQgPSBmb2xpb0lkO1xuICAgIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2UsIGFuZCBzeW5jIGxvYWRlZCBzZXR0aW5ncyB3aXRoXG4gICAqIG5ldyBmaWVsZHMgdGhhdCBtYXkgbm90IGJlIGluIGxvY2FsU3RvcmFnZS5cbiAgICovXG4gIGxvYWQgKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQ6IFBhcnRpYWw8U2V0dGluZ3M+ID0gSlNPTi5wYXJzZSh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5pZCkpO1xuICAgICAgdGhpcy5zeW5jKHN0b3JlZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSB2YWx1ZSBpcyBub3QgYSBKU09OIG9iamVjdCAoZm9yIGluc3RhbmNlLCBhbiBlbXB0eSBzdHJpbmcpLFxuICAgICAgLy8gYSBTeW50YXhFcnJvciB3aWxsIGJlIHRocm93bi4gV2UgbXVzdCBoYW5kbGUgaXQgYnkgY2FsbGluZyBzeW5jKClcbiAgICAgIC8vIHdpdGggYW4gZW1wdHkgSlNPTiBvYmplY3QuXG4gICAgICB0aGlzLnN5bmMoe30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbmV3IGZpZWxkcyBpbiBsb2NhbFN0b3JhZ2UsIGFzIGEgXCJ1bmlvblwiIG9mIG9sZCBhbmQgbmV3IHNldHRpbmdzLlxuICAgKi9cbiAgc2V0IChwYXJhbXM6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4udGhpcy5zZXR0aW5ncywgLi4ucGFyYW1zIH07XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2V0dGluZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHNldHRpbmdzIHRoYXQgbWF5IG5vdCBiZSBpbmNsdWRlZCBpbiB1c2VyJ3MgbG9jYWxTdG9yYWdlLFxuICAgKiBzdWNoIGFzIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBsb2NhbFN0b3JhZ2UgaW4gYSBuZXdcbiAgICogdXBkYXRlIG9mIE5lb24uXG4gICAqL1xuICBzeW5jIChzdG9yZWQ6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4uREVGQVVMVF9TRVRUSU5HUywgLi4uc3RvcmVkIH07XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2V0dGluZ3MpKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBsb2NhbFN0b3JhZ2Ugc2V0dGluZ3MgZm9yIHRoZSBmb2xpby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzICgpOiBTZXR0aW5ncyB7XG4gIHJldHVybiBsb2NhbFNldHRpbmdzLnNldHRpbmdzO1xufVxuXG4vKipcbiAqIFNldCBzcGVjaWZpYyBsb2NhbFN0b3JhZ2Ugc2V0dGluZ3MgZm9yIHRoZSBmb2xpby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNldHRpbmdzIChwYXJhbXM6IFBhcnRpYWw8U2V0dGluZ3M+KTogdm9pZCB7XG4gIGxvY2FsU2V0dGluZ3Muc2V0KHBhcmFtcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvY2FsU2V0dGluZ3M7XG4iLCJpbXBvcnQgKiBhcyBDb2xvciBmcm9tICcuL0NvbG9yJztcbmltcG9ydCB7IHVwZGF0ZUhpZ2hsaWdodCB9IGZyb20gJy4uL0Rpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMnO1xuaW1wb3J0ICogYXMgR3JvdXBpbmcgZnJvbSAnLi4vU3F1YXJlRWRpdC9Hcm91cGluZyc7XG5pbXBvcnQgeyByZXNpemUgfSBmcm9tICcuL1Jlc2l6ZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBzZWxlY3Rpb24gbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25UeXBlKCk6IFNlbGVjdGlvblR5cGUge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsLWJ5IGlzLWFjdGl2ZScpO1xuICBpZiAoZWxlbWVudC5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gZWxlbWVudFswXS5pZCBhcyBTZWxlY3Rpb25UeXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVW5zZWxlY3QgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGFuZCBydW4gdW5kbyBhbnkgZXh0cmFcbiAqIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNlbGVjdCgpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvckFsbCgnLm5vLW1vdmluZycpXG4gICAgLmZvckVhY2goKHNlbGVjdGVkOiBTVkdHRWxlbWVudCkgPT4gc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnbm8tbW92aW5nJykpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKS5mb3JFYWNoKChzZWxlY3RlZDogU1ZHR0VsZW1lbnQpID0+IHtcbiAgICBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIGlmIChzZWxlY3RlZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgIHNlbGVjdGVkLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIENvbG9yLnVuaGlnaGxpZ2h0KHNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgc2VsZWN0ZWQuc3R5bGUuZmlsbCA9ICcnO1xuICAgIH1cblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgIChkaXZMaW5lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBkaXZMaW5lLnN0eWxlLnN0cm9rZSA9ICcnO1xuICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykpLmZvckVhY2goXG4gICAgICAobmV1bWU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKSkuZm9yRWFjaChcbiAgICAgIChzeWxSZWN0OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBzeWxSZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJykpIHtcbiAgICAgIHNlbGVjdGVkLnBhcmVudEVsZW1lbnQuc3R5bGUuZmlsbCA9ICcnO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzeWxsYWJsZScpO1xuICAgICAgc2VsZWN0ZWQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzeWxsYWJsZS1oaWdobGlnaHRlZCcpO1xuXG4gICAgICBBcnJheS5mcm9tKHNlbGVjdGVkLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKSkuZm9yRWFjaChcbiAgICAgICAgKGRpdkxpbmU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgZGl2TGluZS5zdHlsZS5zdHJva2UgPSAnJztcbiAgICAgICAgICBkaXZMaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIEFycmF5LmZyb20oc2VsZWN0ZWQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKSkuZm9yRWFjaChcbiAgICAgICAgKG5ldW1lOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIG5ldW1lLnN0eWxlLmZpbGwgPSAnJztcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZDMuc2VsZWN0QWxsKCcjcmVzaXplUmVjdCcpLnJlbW92ZSgpO1xuICAgIGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcucm90YXRlUG9pbnQnKS5yZW1vdmUoKTtcbiAgfSk7XG5cbiAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGV4dC1zZWxlY3QnKSkuZm9yRWFjaChcbiAgICAoZWw6IFNWR0VsZW1lbnQpID0+IHtcbiAgICAgIGVsLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gJyc7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCd0ZXh0LXNlbGVjdCcpO1xuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICBHcm91cGluZy5lbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICB9XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIHVwZGF0ZUhpZ2hsaWdodCgpO1xufVxuXG4vKipcbiAqIFNlbGVjdCBhIHN0YWZmIGVsZW1lbnQuXG4gKiBAcGFyYW0gc3RhZmYgLSBUaGUgc3RhZmYgZWxlbWVudCBpbiB0aGUgRE9NLlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gVGhlIGRyYWcgaGFuZGxlciBpbiB1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTdGFmZihcbiAgc3RhZmY6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGFmZi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzdGFmZi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIENvbG9yLnVuaGlnaGxpZ2h0KHN0YWZmKTtcbiAgICBDb2xvci5oaWdobGlnaHQoc3RhZmYsICcjZDAwJyk7XG4gICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk7XG4gICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCBhIGxheWVyIGVsZW1lbnQuXG4gKiBAcGFyYW0gbGF5ZXJFbGVtZW50IC0gVGhlIGxheWVyIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIFRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0TGF5ZXJFbGVtZW50KFxuICBsYXllckVsZW1lbnQ6IFNWR0dFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCFsYXllckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgbGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgQ29sb3IudW5oaWdobGlnaHQobGF5ZXJFbGVtZW50KTtcbiAgICBDb2xvci5oaWdobGlnaHQobGF5ZXJFbGVtZW50LCAnI2QwMCcpO1xuICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmljIHNlbGVjdCBmdW5jdGlvbi5cbiAqIEBwYXJhbSBlbCAtIEVsZW1lbnQgdG8gc2VsZWN0LlxuICogQHBhcmFtIGRyYWdIYW5kbGVyIC0gT25seSB1c2VkIGZvciBzdGF2ZXMuXG4gKiBAcGFyYW0gbmVlZHNIaWdobGlnaHRVcGRhdGUgLSBXaGV0aGVyIGFsbCB0aGUgZ3JvdXAncyBoaWdobGlnaHRzIHNob3VsZCBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoXG4gIGVsOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIGRyYWdIYW5kbGVyPzogRHJhZ0hhbmRsZXIsXG4gIG5lZWRzSGlnaGxpZ2h0VXBkYXRlID0gdHJ1ZSxcbik6IHZvaWQge1xuICAvLyBJZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBleGl0XG4gIGlmICghZWwpIHJldHVybjtcblxuICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSB7XG4gICAgcmV0dXJuIHNlbGVjdFN0YWZmKGVsLCBkcmFnSGFuZGxlcik7XG4gIH1cbiAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbGF5ZXInKSkge1xuICAgIHJldHVybiBzZWxlY3RMYXllckVsZW1lbnQoZWwsIGRyYWdIYW5kbGVyKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpICYmXG4gICAgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsVGV4dFJlY3QnKSAmJlxuICAgICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bFRleHRSZWN0LWRpc3BsYXknKVxuICApIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIC8vIHNldCBmaWxsIHRvIHJlZFxuICAgIC8vIHNldCBzdHJva2UgdG8gcmVkIG9ubHkgaWYgc2VsZWN0ZWQgZWxlbSBpcyBhIGRpdkxpbmVcbiAgICBlbC5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgIGVsLnN0eWxlLnN0cm9rZSA9IGVsLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpID8gJyNkMDAnIDogJ2JsYWNrJztcblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKFxuICAgICAgICAoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtLnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGl2TGluZScpLmxlbmd0aCkge1xuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtLnN0eWxlLnN0cm9rZSA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZScpLmZvckVhY2goKGVsZW06IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW0uc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNldCBjb2xvciBvZiB0aGUgY29ycmVzcG9uZGluZyB0ZXh0IGluIHRoZSB0ZXh0IHBhbmVsIHRvIHJlZFxuICAgIGxldCBzeWxJZDtcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSB7XG4gICAgICBzeWxJZCA9IGVsLmlkO1xuICAgIH0gZWxzZSBpZiAoZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykgIT09IG51bGwpIHtcbiAgICAgIHN5bElkID0gZWwuY2xvc2VzdCgnLnN5bGxhYmxlJykuaWQ7XG4gICAgfVxuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uJyArIHN5bElkKTtcbiAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnI2QwMCc7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LXNlbGVjdCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChuZWVkc0hpZ2hsaWdodFVwZGF0ZSkge1xuICAgIHVwZGF0ZUhpZ2hsaWdodCgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGFuIG5jLlxuICogQHBhcmFtIGVsIC0gVGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE5jcyhcbiAgZWw6IFNWR0dyYXBoaWNzRWxlbWVudCxcbiAgbmVvblZpZXc6IE5lb25WaWV3LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFlbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgdW5zZWxlY3QoKTtcbiAgICBzZWxlY3QocGFyZW50KTtcbiAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShwYXJlbnQsIG5lb25WaWV3KSkge1xuICAgICAgY29uc3QgcHJldk5jID0gcGFyZW50LnByZXZpb3VzU2libGluZyBhcyB1bmtub3duIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgIGlmIChhd2FpdCBpc0xpZ2F0dXJlKHByZXZOYywgbmVvblZpZXcpKSB7XG4gICAgICAgIHNlbGVjdChwcmV2TmMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dE5jID0gcGFyZW50Lm5leHRTaWJsaW5nIGFzIHVua25vd24gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBpZiAoYXdhaXQgaXNMaWdhdHVyZShuZXh0TmMsIG5lb25WaWV3KSkge1xuICAgICAgICAgIHNlbGVjdChuZXh0TmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3I6IE5laXRoZXIgcHJldiBvciBuZXh0IG5jIGFyZSBsaWdhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCdsaWdhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnbmMnKSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmNBY3Rpb25zKHBhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gYWN0aW9uIHRyaWdnZXJlZCEnKTtcbiAgICB9XG4gICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBuYyAtIFRoZSBuZXVtZSBjb21wb25lbnQuXG4gKiBAcGFyYW0gbmVvblZpZXcgLSBUaGUgW1tOZW9uVmlld11dIGZvciB0aGlzIGluc3RhbmNlLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbmV1bWUgY29tcG9uZW50IGlzIHBhcnQgb2YgYSBsaWdhdHVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTGlnYXR1cmUoXG4gIG5jOiBTVkdHcmFwaGljc0VsZW1lbnQsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzID0gYXdhaXQgbmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoXG4gICAgbmMuaWQsXG4gICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICApO1xuICByZXR1cm4gQm9vbGVhbihhdHRyaWJ1dGVzLmxpZ2F0ZWQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGxpc3Qgb2YgZWxlbWVudHMgb2YgYSBjZXJ0YWluIHR5cGUgYXJlIGxvZ2ljYWxseSBhZGphY2VudCB0byBlYWNoIG90aGVyLlxuICogSW5jbHVkZXMgZWxlbWVudHMgdGhhdCBhcmUgb24gc2VwYXJhdGUgc3RhdmVzIGJ1dCB3b3VsZCBvdGhlcndpc2UgYmUgbmV4dCB0byBlYWNoIG90aGVyLlxuICogQ2FuIG5vdCBhcHBseSB0byBlbGVtZW50cyBvZiB0eXBlIG5ldW1lIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB1c2VyIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIG9mIGludGVyZXN0XG4gKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnRzIGFyZSBhZGphY2VudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBZGphY2VudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgLy8gMiBlbGVtZW50cyBjYW5ub3QgYmUgYWRqYWNlbnQgaWYgdGhlcmUgaXMgb25seSAxIGVsZW1lbnRcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcblxuICAvLyBnZXQgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgc2VsZWN0aW9uVHlwZVxuICBsZXQgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGU6IEhUTUxFbGVtZW50W107XG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUnKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgLy8gV2UgYXV0b21hdGljYWxseSByZXR1cm4gJ3RydWUnIGZvciBuZXVtZXMgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyIHRvIGJlXG4gICAgICAvLyBhbGxvd2VkIHRvIGdyb3VwIHR3byBuZXVtZXMgaW4gc2VwYXJhdGUgc3lsbGFiZXMgd2l0aG91dCBoYXZpbmcgdG8gcGFyZm9ybSBvdGhlclxuICAgICAgLy8gc3RlcHMgZmlyc3QuIFllcywgdGhlcmUgaXMgYSB0cmFkZS1vZmYgLSB0aGlzIGFsbG93cyB1c2VycyB0byB0cnkgYW5kIGdyb3VwIGFueVxuICAgICAgLy8gdHdvIG5vbi1hZGphY2VudCBuZXVtZXMsIGJ1dCBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBiZW5lZml0cyAoc3BlZWQgYW5kIGVmZmljaWVuY3kpXG4gICAgICAvLyBvdXR3ZWlnaCB0aGUgY29zdHMgKHVzZXIgdHJ5aW5nIGFuIGlsbGVnYWwgZWRpdCkuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYycpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gU29ydCBTRUxFQ1RFRCBlbGVtZW50cyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGJ5XG4gIC8vIG1hdGNoaW5nIHRvIG9yZGVyIG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBjb25zdCBzb3J0ZWRFbGVtZW50cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFsbEVsZW1zT2ZTZWxlY3Rpb25UeXBlW2ldLmlzU2FtZU5vZGUoZWxlbWVudHNbal0pKSB7XG4gICAgICAgIHNvcnRlZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyBjaGVjayBpZiBTRUxFQ1RFRCBlbGVtZW50cyBhcmUgYWxsIGFkamFjZW50IChpbiBhIHJvdykgYnlcbiAgLy8gZmluZGluZyBhbmQgY29tcGFyaW5nIHRoZWlyIGluZGVjZXMgaW4gdGhlIGFycmF5IG9mIEFMTCBlbGVtZW50cyBvZiBzZWxlY3Rpb24gdHlwZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGZpcnN0RWxlbSA9IHNvcnRlZEVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IHNlY29uZEVsZW0gPSBzb3J0ZWRFbGVtZW50c1tpICsgMV07XG5cbiAgICBjb25zdCBpbmRleDEgPSBhbGxFbGVtc09mU2VsZWN0aW9uVHlwZS5pbmRleE9mKGZpcnN0RWxlbSk7XG4gICAgY29uc3QgaW5kZXgyID0gYWxsRWxlbXNPZlNlbGVjdGlvblR5cGUuaW5kZXhPZihzZWNvbmRFbGVtKTtcblxuICAgIGlmIChNYXRoLmFicyhpbmRleDEgLSBpbmRleDIpICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgdGhlIGFycmF5IG9mIGVsZW1lbnRzIGFsbCBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudC5cbiAqIEZvciBleGFtcGxlOiBJZiBhbGwgbmV1bWVzIGFyZSBpbiB0aGUgc2FtZSBzeWxsYWJsZS5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgY3VycmVudGx5IG5vIGxvZ2ljIGZvciB0cmVhdGluZyBsYXllciBlbGVtZW50cyBhbmQgYmJveGVzIVxuICogTm90ZSEhIEZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlIGZvciBzdGF2ZSBlbGVtZW50cy4gKFNob3VsZCBpdD8/PylcbiAqXG4gKiBAcGFyYW0gc2VsZWN0aW9uVHlwZSB0aGUgY3VycmVudCBOZW9uIHNlbGVjdGlvbiBtb2RlXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIGluIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBlbGVtZW50cyBzaGFyZSB0aGUgc2FtZSBsb2dpY2FsIHBhcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkTG9naWNhbFBhcmVudChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW0pID0+XG4gICAgICAhKFxuICAgICAgICBlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICAgIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGVmJylcbiAgICAgICksXG4gICk7XG5cbiAgaWYgKCFlbGVtZW50c0hhdmVDb3JyZWN0VHlwZShzZWxlY3Rpb25UeXBlLCBlbGVtZW50cykpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeVN5bGxhYmxlJzpcbiAgICAgIGNvbnN0IHJlZmVyZW5jZVBhcmVudFN0YWZmID0gZWxlbWVudHNbMF0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmlzU2FtZU5vZGUocmVmZXJlbmNlUGFyZW50U3RhZmYpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBjb25zdCByZWZlcmVuY2VQYXJlbnRTeWxsYWJsZSA9IGVsZW1lbnRzWzBdLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbGVtID0gZWxlbWVudHNbaV07XG4gICAgICAgIGlmICghZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKS5pc1NhbWVOb2RlKHJlZmVyZW5jZVBhcmVudFN5bGxhYmxlKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYWxsIHNlbGVjdGVkIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjdXJyZW50IHNlbGVjdGlvbiBtb2RlLlxuICogRm9yIGV4YW1wbGUsIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgb2YgdHlwZSBuZXVtZSwgb3Igc3lsbGFibGUsIGV0Yy5cbiAqXG4gKiBOb3RlISEgVGhlcmUgaXMgbm8gbG9naWMgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBsYXllciBlbGVtZW50cyBvciBiYm94ZXMuXG4gKlxuICogQHBhcmFtIHNlbGVjdGlvblR5cGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1vZGVcbiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcgY2hlY2tlZFxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZWxlbWVudHMgbWF0Y2ggc2VsZWN0aW9uIG1vZGUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRzSGF2ZUNvcnJlY3RUeXBlKFxuICBzZWxlY3Rpb25UeXBlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiBTVkdHcmFwaGljc0VsZW1lbnRbXSxcbik6IGJvb2xlYW4ge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBpZiAoIWVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGlmICghZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeVN0YWZmJzpcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZWxlbWVudHMgLSBUaGUgZWxlbWVudHMgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgcGFyZW50IHVwIHR3byBsZXZlbHMsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFNlY29uZExldmVsUGFyZW50KFxuICBlbGVtZW50czogU1ZHR3JhcGhpY3NFbGVtZW50W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgdGVtcEVsZW1lbnRzID0gQXJyYXkuZnJvbShlbGVtZW50cyk7XG4gIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBFbGVtZW50cy5wb3AoKTtcbiAgY29uc3Qgc2Vjb25kUGFyZW50ID0gZmlyc3RFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRlbXBFbGVtZW50cykge1xuICAgIGNvbnN0IHNlY1BhciA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChzZWNQYXIuaWQgIT09IHNlY29uZFBhcmVudC5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB1c2VyIHNlbGVjdGVkIGVsZW1lbnRzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIHVzZXItc2VsZWN0ZWQgZWxlbWVudHNcbiAqIEByZXR1cm5zIHRydWUgaWYgc2VsZWN0aW9uIGlzIGFjY3Jvc3MgbXVsdGlwbGUgc3RhdmVzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlTdGF2ZVNlbGVjdGlvbihlbGVtZW50czogU1ZHRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IGVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZiA9IGVsZW1lbnRzQXJyYXlbaV0uY2xvc2VzdCgnLnN0YWZmJyk7XG5cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVsZW1lbnRzQXJyYXkubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGFub3RoZXJTdGFmZiA9IGVsZW1lbnRzQXJyYXlbal0uY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgICAvLyBjb21wYXJlIHdpdGggb3RoZXIgc3RhdmVzXG4gICAgICBpZiAoIXN0YWZmLmlzU2FtZU5vZGUoYW5vdGhlclN0YWZmKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJvdW5kaW5nIGJveCBvYmplY3QgaW50ZXJmYWNlIGZvciBnZXRTdGFmZkJCb3goKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWZmQkJveCB7XG4gIGlkOiBzdHJpbmc7XG4gIHVseDogbnVtYmVyO1xuICB1bHk6IG51bWJlcjtcbiAgbHJ4OiBudW1iZXI7XG4gIGxyeTogbnVtYmVyO1xuICByb3RhdGU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJvdW5kaW5nIGJveCBvZiBhIHN0YWZmIGJhc2VkIG9uIGl0cyBzdGFmZiBsaW5lcy5cbiAqIFJvdGF0ZSBpcyBpbmNsdWRlZCBpbiByYWRpYW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhZmZCQm94KHN0YWZmOiBTVkdHRWxlbWVudCk6IFN0YWZmQkJveCB7XG4gIGxldCB1bHgsIHVseSwgbHJ4LCBscnksIHJvdGF0ZTtcbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgncGF0aCcpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb29yZGluYXRlczogbnVtYmVyW10gPSBwYXRoXG4gICAgICAuZ2V0QXR0cmlidXRlKCdkJylcbiAgICAgIC5tYXRjaCgvXFxkKy9nKVxuICAgICAgLm1hcCgoZWxlbWVudCkgPT4gTnVtYmVyKGVsZW1lbnQpKTtcbiAgICBpZiAocm90YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvdGF0ZSA9IE1hdGguYXRhbihcbiAgICAgICAgKGNvb3JkaW5hdGVzWzNdIC0gY29vcmRpbmF0ZXNbMV0pIC8gKGNvb3JkaW5hdGVzWzJdIC0gY29vcmRpbmF0ZXNbMF0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodWx5ID09PSB1bmRlZmluZWQgfHwgTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKSA8IHVseSkge1xuICAgICAgdWx5ID0gTWF0aC5taW4oY29vcmRpbmF0ZXNbMV0sIGNvb3JkaW5hdGVzWzNdKTtcbiAgICB9XG4gICAgaWYgKHVseCA9PT0gdW5kZWZpbmVkIHx8IGNvb3JkaW5hdGVzWzBdIDwgdWx4KSB7XG4gICAgICB1bHggPSBjb29yZGluYXRlc1swXTtcbiAgICB9XG4gICAgaWYgKGxyeSA9PT0gdW5kZWZpbmVkIHx8IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSkgPiBscnkpIHtcbiAgICAgIGxyeSA9IE1hdGgubWF4KGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1szXSk7XG4gICAgfVxuICAgIGlmIChscnggPT09IHVuZGVmaW5lZCB8fCBjb29yZGluYXRlc1syXSA+IGxyeCkge1xuICAgICAgbHJ4ID0gY29vcmRpbmF0ZXNbMl07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBpZDogc3RhZmYuaWQsIHVseCwgdWx5LCBscngsIGxyeSwgcm90YXRlIH07XG59XG5cbi8qKlxuICogc2VsZWN0IGEgYm91bmRpbmdib3ggZWxlbWVudFxuICogQHBhcmFtIGVsIC0gdGhlIGJib3ggKHN5bFRleHRSZWN0KSBlbGVtZW50IGluIHRoZSBET01cbiAqIEBwYXJhbSBkcmFnSGFuZGxlciAtIHRoZSBkcmFnIGhhbmRsZXIgaW4gdXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCQm94KFxuICBlbDogU1ZHR3JhcGhpY3NFbGVtZW50LFxuICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbik6IHZvaWQge1xuICBjb25zdCBiYm94ID0gZWw7XG4gIGNvbnN0IHN5bCA9IGJib3guY2xvc2VzdCgnLnN5bCcpO1xuICBpZiAoIXN5bC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICBzeWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBiYm94LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgY29uc3QgY2xvc2VzdCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNsb3Nlc3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICBjbG9zZXN0LmNsYXNzTGlzdC5hZGQoJ3N5bGxhYmxlLWhpZ2hsaWdodGVkJyk7XG4gICAgaWYgKGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLmRpdkxpbmUnKS5sZW5ndGgpIHtcbiAgICAgIGNsb3Nlc3QucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5maWxsID0gJyNkMDAnO1xuICAgICAgfSk7XG4gICAgICBjbG9zZXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbS5zdHlsZS5zdHJva2UgPSAnI2QwMCc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmVvblZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzaXplKHN5bCBhcyBTVkdHcmFwaGljc0VsZW1lbnQsIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChkcmFnSGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgIH1cbiAgICBjb25zdCBzeWxJZCA9IGVsLmNsb3Nlc3QoJy5zeWxsYWJsZScpLmlkO1xuICAgIGlmIChzeWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzcGFuOiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzcGFuLicgKyBzeWxJZCk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNkMDAnO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgndGV4dC1zZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyQkJveEFjdGlvbnMoKTtcbn1cblxuLyoqXG4gKiBTZWxlY3Qgbm90IG5ldW1lIGVsZW1lbnRzLlxuICogQHBhcmFtIG5vdE5ldW1lcyAtIEFuIGFycmF5IG9mIG5vdCBuZXVtZXMgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RObihub3ROZXVtZXM6IFNWR0dyYXBoaWNzRWxlbWVudFtdKTogYm9vbGVhbiB7XG4gIGlmIChub3ROZXVtZXMubGVuZ3RoID4gMCkge1xuICAgIG5vdE5ldW1lcy5mb3JFYWNoKChubikgPT4ge1xuICAgICAgc2VsZWN0KG5uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgc2VsZWN0aW5nIGFuIGFycmF5IG9mIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gdHlwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdEFsbChcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4gIG5lb25WaWV3OiBOZW9uVmlldyxcbiAgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNlbGVjdGlvblR5cGUgPSBnZXRTZWxlY3Rpb25UeXBlKCk7XG4gIHVuc2VsZWN0KCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHNlbGVjdGlvbkNsYXNzO1xuICBsZXQgY29udGFpbnNMYXllckVsZW1lbnRzID0gZmFsc2U7XG4gIGxldCBjb250YWluc05jID0gZmFsc2U7XG5cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3lsbGFibGUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOZXVtZSc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmV1bWUnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcubmMnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlTdGFmZic6XG4gICAgICBzZWxlY3Rpb25DbGFzcyA9ICcuc3RhZmYnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsQnlCQm94JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5zeWxUZXh0UmVjdC1kaXNwbGF5JztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIHNlbGVjdGlvbkNsYXNzID0gJy5jbGVmLCAuY3VzdG9zLCAuYWNjaWQsIC5kaXZMaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNlbGVjdGlvbiB0eXBlICcgKyBzZWxlY3Rpb25UeXBlKTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZ3JvdXBpbmdzIHNwZWNpZmllZCBieSBzZWxlY3Rpb25DbGFzc1xuICAvLyB0aGF0IGNvbnRhaW4gdGhlIHByb3ZpZGVkIGVsZW1lbnRzIHRvIHNlbGVjdC5cbiAgY29uc3QgZ3JvdXBzVG9TZWxlY3QgPSBuZXcgU2V0PFNWR0dFbGVtZW50PigpO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBsZXQgZ3JvdXBpbmcgPSBlbGVtZW50LmNsb3Nlc3Q8U1ZHR0VsZW1lbnQ+KHNlbGVjdGlvbkNsYXNzKTtcbiAgICBpZiAoZ3JvdXBpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGNsaWNrLXNlbGVjdGVkIGEgY2xlZiBvciBhIGN1c3RvcyBvciBhbiBhY2NpZCBvciBhIGRpdkxpbmVcbiAgICAgIGdyb3VwaW5nID0gZWxlbWVudC5jbG9zZXN0KCcuY2xlZiwgLmN1c3RvcywgLmFjY2lkLCAuZGl2TGluZScpO1xuICAgICAgaWYgKGdyb3VwaW5nID09PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnRWxlbWVudCAnICtcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgK1xuICAgICAgICAgICAgJyBpcyBub3QgcGFydCBvZiBzcGVjaWZpZWQgZ3JvdXAgYW5kIGlzIG5vdCBhIGNsZWYgb3IgY3VzdG9zIG9yIGFjY2lkIG9yIGRpdkxpbmUuJyxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb250YWluc0xheWVyRWxlbWVudHMgPSBjb250YWluc0xheWVyRWxlbWVudHMgfHwgdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbnNOYyA9IGNvbnRhaW5zTmMgfHwgdHJ1ZTtcbiAgICB9XG4gICAgZ3JvdXBzVG9TZWxlY3QuYWRkKGdyb3VwaW5nKTtcblxuICAgIC8vIENoZWNrIGZvciBwcmVjZWRlcy9mb2xsb3dzXG4gICAgbGV0IHNlbGVjdGVkID0gZ3JvdXBpbmc7XG4gICAgbGV0IGZvbGxvd3MgPSBzZWxlY3RlZC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyk7XG4gICAgbGV0IHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICB3aGlsZSAoZm9sbG93cyB8fCBwcmVjZWRlcykge1xuICAgICAgaWYgKGZvbGxvd3MpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGZvbGxvd3Muc2xpY2UoMSkpO1xuICAgICAgICBpZiAoZ3JvdXBzVG9TZWxlY3QuaGFzKHNlbGVjdGVkKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkLmNsYXNzTGlzdC5hZGQoJ25vLW1vdmluZycpO1xuICAgICAgICBncm91cHNUb1NlbGVjdC5hZGQoc2VsZWN0ZWQpO1xuICAgICAgICBmb2xsb3dzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6Zm9sbG93cycpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZGVzKSB7XG4gICAgICAgIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBwcmVjZWRlcy5zbGljZSgxKSk7XG4gICAgICAgIGlmIChncm91cHNUb1NlbGVjdC5oYXMoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LmFkZCgnbm8tbW92aW5nJyk7XG4gICAgICAgIGdyb3Vwc1RvU2VsZWN0LmFkZChzZWxlY3RlZCk7XG4gICAgICAgIHByZWNlZGVzID0gc2VsZWN0ZWQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU2VsZWN0IHRoZSBlbGVtZW50c1xuICBncm91cHNUb1NlbGVjdC5mb3JFYWNoKChncm91cDogU1ZHR3JhcGhpY3NFbGVtZW50KSA9PlxuICAgIHNlbGVjdChncm91cCwgZHJhZ0hhbmRsZXIsIGZhbHNlKSxcbiAgKTtcblxuICAvKiBEZXRlcm1pbmUgdGhlIGNvbnRleHQgbWVudSB0byBkaXNwbGF5IChpZiBhbnkpICovXG5cbiAgY29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbShncm91cHNUb1NlbGVjdC52YWx1ZXMoKSkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG5cbiAgLy8gSGFuZGxlIG9jY3VyYW5jZSBvZiBjbGVmIG9yIGN1c3RvcyBvciBhY2NpZCBvciBkaXZMaW5lXG4gIGlmIChjb250YWluc0xheWVyRWxlbWVudHMgJiYgIWNvbnRhaW5zTmMpIHtcbiAgICAvLyBBIGNvbnRleHQgbWVudSB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGEgc2luZ2xlIGNsZWZcbiAgICBpZiAoZ3JvdXBzVG9TZWxlY3Quc2l6ZSA9PT0gMSkge1xuICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhncm91cHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2VsZWN0aW9uVHlwZSA9PSAnc2VsQnlTeWxsYWJsZScpIHtcbiAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTaW5nbGVTdGFmZkFjdGlvbnMoKTtcbiAgICAgICAgICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbiAgICAgICAgICByZXNpemUoZ3JvdXBzWzBdLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck11bHRpU3RhZmZBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5TGF5ZXJFbGVtZW50JzpcbiAgICAgIGlmIChncm91cHNUb1NlbGVjdC5zaXplID09PSAxKSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckxheWVyRWxlbWVudEFjdGlvbnMoZ3JvdXBzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckRlZmF1bHRBY3Rpb25zKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbEJ5U3lsbGFibGUnOlxuICAgICAgc3dpdGNoIChncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvLyBUT0RPIGNoYW5nZSBjb250ZXh0IGlmIGl0IGlzIG9ubHkgYSBuZXVtZS9uYy5cbiAgICAgICAgICAvLyAgQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHN5bGxhYmxlIGNvbnRhaW5zIGEgPHN5bD4gZWxlbWVudFxuICAgICAgICAgIGlmIChncm91cHNbMF0ucXVlcnlTZWxlY3RvcignLnN5bCA+IHJlY3QnKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAnVGhlIHNlbGVjdGVkIHN5bGxhYmxlIGRvZXMgbm90IGNvbnRhaW4gYSAmbHQ7c3lsJmd0OyBlbGVtZW50LCBwbGVhc2UgaW5zZXJ0IG9uZSB1c2luZyBidXR0b24gXCJBZGQgU3lsbGFibGUgVGV4dFwiLicsXG4gICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ25vU3lsJyk7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLmFkZEFkZFN5bExpc3RlbmVyKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlclN5bGxhYmxlQWN0aW9ucygnc2luZ2xlU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbGlua2VkIHN5bGxhYmxlIHNwbGl0IGJ5IGEgc3RhZmYgYnJlYWtcbiAgICAgICAgICAvLyBpZiB0aGV5IGFyZSBsaW5rYWJsZSwgdXNlciBjYW4gdG9nZ2xlIGxpbmtlZC1zeWxsc1xuICAgICAgICAgIGlmIChHcm91cGluZy5pc0xpbmthYmxlKCdzZWxCeVN5bGxhYmxlJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdsaW5rYWJsZVNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBzeWxsYWJsZXMgYXJlIGFsbCBsb2NhdGVkIG9uIG9uZSBzdGF2ZSwgdGhleSBzaG91bGQgYmUgZ3JvdXBhYmxlXG4gICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcuaXNHcm91cGFibGUoJ3NlbEJ5U3lsbGFibGUnLCBncm91cHMpKSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoJ211bHRpU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHN5bGxzIGFyZSBhY2Nyb3NzIG11bHRpcGxlIHN0YXZlc1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyU3lsbGFibGVBY3Rpb25zKCdkZWZhdWx0Jyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIHN3aXRjaCAoZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gVE9ETyBjaGFuZ2UgY29udGV4dCBpZiBpdCBpcyBvbmx5IGEgbmMuXG4gICAgICAgICAgU2VsZWN0T3B0aW9ucy50cmlnZ2VyTmV1bWVBY3Rpb25zKCk7XG4gICAgICAgICAgR3JvdXBpbmcuaW5pdEdyb3VwaW5nTGlzdGVuZXJzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKEdyb3VwaW5nLmlzR3JvdXBhYmxlKCdzZWxCeU5ldW1lJywgZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduZXVtZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsQnlOYyc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlck5jQWN0aW9ucyhncm91cHNbMF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKHNoYXJlZFNlY29uZExldmVsUGFyZW50KGdyb3VwcykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgc2VsZWN0aW9uIGlzIGEgbGlnYXR1cmUgb3IgY2FuIGJlIGEgbGlnYXR1cmVcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXNlIG5ldW1lIGNvbXBvbmVudHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgbmV1bWVcbiAgICAgICAgICAgIGlmIChncm91cHNbMF0ucGFyZW50RWxlbWVudCA9PT0gZ3JvdXBzWzFdLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGdyb3Vwc1swXS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcblxuICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IG5ldW1lIGNvbXBvbmVudHMgYXJlIGFkamFjZW50XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzBdKSAtIGNoaWxkcmVuLmluZGV4T2YoZ3JvdXBzWzFdKSxcbiAgICAgICAgICAgICAgICApID09PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2Vjb25kIG5ldW1lIGNvbXBvbmVudCBpcyBsb3dlciB0aGFuIGZpcnN0LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgb3JkZXIgaW4gdGhlIGxpc3QgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGVcbiAgICAgICAgICAgICAgICAvLyBvcmRlciBieSB4LXBvc2l0aW9uLlxuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DID0gZ3JvdXBzWzBdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZE5DID0gZ3JvdXBzWzFdLmNoaWxkcmVuWzBdIGFzIFNWR1VzZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROQ1ggPSBmaXJzdE5DLnguYmFzZVZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2Vjb25kTkNYID0gc2Vjb25kTkMueC5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdE5DWSA9IGZpcnN0TkMueS5iYXNlVmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBzZWNvbmROQ1kgPSBzZWNvbmROQy55LmJhc2VWYWwudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAvLyBvcmRlciBuYydzIGJ5IHggY29vcmQgKGxlZnQgdG8gcmlnaHQpXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ggPiBzZWNvbmROQ1ggfHxcbiAgICAgICAgICAgICAgICAgIChmaXJzdE5DWCA9PT0gc2Vjb25kTkNYICYmIGZpcnN0TkNZIDwgc2Vjb25kTkNZKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgW2ZpcnN0TkMsIHNlY29uZE5DXSA9IFtzZWNvbmROQywgZmlyc3ROQ107XG4gICAgICAgICAgICAgICAgICBbZmlyc3ROQ1gsIGZpcnN0TkNZLCBzZWNvbmROQ1gsIHNlY29uZE5DWV0gPSBbXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZE5DWCxcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kTkNZLFxuICAgICAgICAgICAgICAgICAgICBmaXJzdE5DWCxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROQ1ksXG4gICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIHN0YWNrZWQgbmMncy9saWdhdHVyZSAoaWRlbnRpY2FsIHgpLCBvciBkZXNjZW5kaW5nIG5jJ3MgKHkgZGVzY2VuZHMpXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0TkNYID09PSBzZWNvbmROQ1ggfHwgZmlyc3ROQ1kgPCBzZWNvbmROQ1kpIHtcbiAgICAgICAgICAgICAgICAgIEdyb3VwaW5nLnRyaWdnZXJHcm91cGluZygnbGlnYXR1cmUnKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoc2hhcmVkU2Vjb25kTGV2ZWxQYXJlbnQoZ3JvdXBzKSkge1xuICAgICAgICAgICAgR3JvdXBpbmcudHJpZ2dlckdyb3VwaW5nKCduYycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJEZWZhdWx0QWN0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbEJ5QkJveCc6XG4gICAgICBzd2l0Y2ggKGdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHNlbGVjdEJCb3goZ3JvdXBzWzBdLCBkcmFnSGFuZGxlciwgbmVvblZpZXcpO1xuICAgICAgICAgIFNlbGVjdE9wdGlvbnMudHJpZ2dlckJCb3hBY3Rpb25zKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGcpID0+IHNlbGVjdEJCb3goZywgZHJhZ0hhbmRsZXIsIHVuZGVmaW5lZCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gc2VsZWN0aW9uIHR5cGUuIFRoaXMgc2hvdWxkIG5vdCBoYXZlIG9jY3VycmVkLicpO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gY2hhbmdlU3RhZmZMaXN0ZW5lcigpOiB2b2lkIHtcbiAgLy8gdHJ5IHtcbiAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYW5nZVN0YWZmJylcbiAgLy8gLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgU2VsZWN0T3B0aW9ucy5jaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICAvLyB9IGNhdGNoIChlKSB7Y29uc29sZS5kZWJ1ZyhlKTt9XG4gIC8vIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBhcmdzQXJyYXk7XG5cbmZ1bmN0aW9uIGFyZ3NBcnJheShmdW4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgdmFyIGkgPSAtMTtcbiAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW4uY2FsbCh0aGlzLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bi5jYWxsKHRoaXMsIFtdKTtcbiAgICB9XG4gIH07XG59IiwibW9kdWxlLmV4cG9ydHMgPSBkMzsiLCIvKipcbiAqIEhUTUwgZm9yIGVhY2ggaW5zZXJ0IHRhYiAobmV1bWUsIGdyb3VwaW5nLCBjbGVmLCBzeXN0ZW0sIGFuZCBkaXZpc2lvbikuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRUYWJIdG1sOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBwcmltaXRpdmVUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInB1bmN0dW1cIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwicHVuY3R1bVwiIHRpdGxlPVwicHVuY3R1bVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcHVuY3R1bS5wbmdcIiBjbGFzcz1cImltYWdlXCIvPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidmlyZ2FcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidmlyZ2FcIiB0aXRsZT1cInZpcmdhXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy92aXJnYS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ2aXJnYVJldmVyc2VkXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIlJldmVyc2VkIFZpcmdhXCIgdGl0bGU9XCJSZXZlcnNlZCBWaXJnYVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdmlyZ2FfcmV2ZXJzZWQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlhbW9uZFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJpbmNsaW5hdHVtXCIgdGl0bGU9XCJpbmNsaW5hdHVtXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9kaWFtb25kLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImN1c3Rvc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjdXN0b3NcIiB0aXRsZT1cImN1c3Rvc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY3VzdG9zLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNDbGVmXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkMgQ2xlZlwiIHRpdGxlPVwiIEMgQ2xlZlwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY0NsZWYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZkNsZWZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwiRiBDbGVmXCIgdGl0bGU9XCJGIENsZWZcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ZDbGVmLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImxpcXVlc2NlbnRBXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cIkxpcXVlc2NlbnQgQVwiIHRpdGxlPVwiTGlxdWVzY2VudCBBXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9saXF1ZXNjZW50QS5wbmdcIiBjbGFzcz1cImltYWdlXCI+PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJpbnNlcnQtZWxlbWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJsaXF1ZXNjZW50Q1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJMaXF1ZXNjZW50IENcIiB0aXRsZT1cIkxpcXVlc2NlbnQgQ1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvbGlxdWVzY2VudEMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZmxhdFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJGbGF0XCIgdGl0bGU9XCJGbGF0XCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZEZsYXQucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibmF0dXJhbFwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJOYXR1cmFsXCIgdGl0bGU9XCJOYXR1cmFsXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9hY2NpZE5hdHVyYWwucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGl2TGluZU1heGltYVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJEaXZMaW5lIE1heGltYVwiIHRpdGxlPVwiRGl2TGluZSBNYXhpbWFcIj48aW1nIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2RpdmlzaW8ucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+YCxcbiAgZ3JvdXBpbmdUYWI6IGA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInBlc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwZXNcIiB0aXRsZT1cInBlc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvcGVzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaXZpc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJjbGl2aXNcIiB0aXRsZT1cImNsaXZpc1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpdmlzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNjYW5kaWN1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJzY2FuZGljdXNcIiB0aXRsZT1cInNjYW5kaWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc2NhbmRpY3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImluc2VydC1lbGVtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNsaW1hY3VzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cImNsaW1hY3VzXCIgdGl0bGU9XCJjbGltYWN1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvY2xpbWFjdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG9yY3VsdXNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIHNtYWxsZWxcIiBhcmlhLWxhYmVsPVwidG9jdWx1c1wiIHRpdGxlPVwidG9jdWx1c1wiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdG9yY3VsdXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicG9ycmVjdHVzXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCBzbWFsbGVsXCIgYXJpYS1sYWJlbD1cInBvcnJlY3R1c1wiIHRpdGxlPVwicG9ycmVjdHVzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wb3JyZWN0dXMucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicHJlc3N1c1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgc21hbGxlbFwiIGFyaWEtbGFiZWw9XCJwcmVzc3VzXCIgdGl0bGU9XCJwcmVzc3VzXCI+PGltZyBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9wcmVzc3VzLnBuZ1wiIGNsYXNzPVwiaW1hZ2VcIj48L2J1dHRvbj5cbiAgICAgICAgPC9wPmAsXG4gIHN5c3RlbVRhYjogYDxwIGNsYXNzPVwiaW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3RhZmZcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGluc2VydGVsIGxvbmdlbFwiIGFyaWEtbGFiZWw9XCJzeXN0ZW1cIiB0aXRsZT1cInN5c3RlbVwiPjxpbWcgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc3RhZmYucG5nXCIgY2xhc3M9XCJpbWFnZVwiPjwvYnV0dG9uPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPkNsaWNrIHVwcGVyIGxlZnQgYW5kIGxvd2VyIHJpZ2h0IGNvcm5lcnMgb2YgbmV3IHN0YWZmLjwvcD5gLFxuICAvLyBkaXZpc2lvblRhYjogXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nc21hbGxEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9zbWFsbGRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyAgICAgXCI8YnV0dG9uIGlkPSdtaW5vckRpdicgY2xhc3M9J3NpZGUtcGFuZWwtYnRuIGluc2VydGVsIHRhbGxlbCc+PGltZyBzcmM9J1wiICsgX19BU1NFVF9QUkVGSVhfXyArICdhc3NldHMvaW1nL21pbm9yZGl2LnBuZ1wiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCIgK1xuICAvLyAgICAgXCI8cCBjbGFzcz0naW5zZXJ0LWVsZW1lbnQtY29udGFpbmVyJz5cIiArXG4gIC8vIFwiPGJ1dHRvbiBpZD0nbWFqb3JEaXYnIGNsYXNzPSdzaWRlLXBhbmVsLWJ0biBpbnNlcnRlbCB0YWxsZWwnPjxpbWcgc3JjPSdcIiArIF9fQVNTRVRfUFJFRklYX18gKyAnYXNzZXRzL2ltZy9tYWpvcmRpdi5wbmcgXCInIGNsYXNzPSdpbWFnZScvPjwvYnV0dG9uPjwvcD5cIiArXG4gIC8vIFwiPHAgY2xhc3M9J2luc2VydC1lbGVtZW50LWNvbnRhaW5lcic+XCIgK1xuICAvLyBcIjxidXR0b24gaWQ9J2ZpbmFsRGl2JyBjbGFzcz0nc2lkZS1wYW5lbC1idG4gaW5zZXJ0ZWwgdGFsbGVsJz48aW1nIHNyYz0nXCIgKyBfX0FTU0VUX1BSRUZJWF9fICsgJ2Fzc2V0cy9pbWcvZmluYWxkaXYucG5nIFwiJyBjbGFzcz0naW1hZ2UnLz48L2J1dHRvbj48L3A+XCJcbn07XG5cbi8qKlxuICogU3RydWN0dXJlIG9mIGluc2VydCBwYW5lbCB3aXRoIGJhc2ljIGdyb3VwaW5nIHRhYnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRDb250cm9sc1BhbmVsID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJpbnNlcnRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlXCI+SU5TRVJUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUluc2VydFwiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblx0PGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwicHJpbWl0aXZlVGFiXCIgY2xhc3M9XCJpbnNlcnRUYWJcIj5QcmltaXRpdmUgRWxlbWVudHM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJncm91cGluZ1RhYlwiIGNsYXNzPVwiaW5zZXJ0VGFiXCI+R3JvdXBpbmc8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJzeXN0ZW1UYWJcIiBjbGFzcz1cImluc2VydFRhYlwiPlN5c3RlbTwvYT5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJpbnNlcnRfZGF0YVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGVkaXQgcGFuZWwgd2l0aCBidXR0b25zLlxuICovXG5leHBvcnQgY29uc3QgZWRpdENvbnRyb2xzUGFuZWwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiBpZD1cImVkaXRNZW51XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nLXRpdGxlIGZvY3VzZWRcIj5FRElUPC9kaXY+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICAgICAgPHVzZSBpZD1cInRvZ2dsZUVkaXRcIiB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImVkaXRDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBmaXJzdC1zdWJzZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VsZWN0aW9uLW1vZGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXN1Yi10aXRsZVwiPlNlbGVjdGlvbiBNb2RlOjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWxlY3Rpb24tbW9kZS1idG5zLWNvbnRhaW5lclwiICBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5U3lsbGFibGVcIj5TeWxsYWJsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNlbC1ieVwiIGlkPVwic2VsQnlOZXVtZVwiPk5ldW1lPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeU5jXCI+TmV1bWUgQ29tcG9uZW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2VsLWJ5XCIgaWQ9XCJzZWxCeVN0YWZmXCI+U3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzZWwtYnlcIiBpZD1cInNlbEJ5TGF5ZXJFbGVtZW50XCI+TGF5ZXIgRWxlbWVudDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cIm1vcmVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvbiBoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImV4dHJhRWRpdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgICAgICogVGhlIGV4dHJhRWRpdCBwYW5lbCBpcyBhZGRlZCBmb3IgZWRpdCBvcHRpb25zIHRoYXQgaGF2ZSBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAqIExpa2UgdGhlIE5ldW1lIGFuZCBDbGVmIG1lbnVzXG4gICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIG1vcmVFZGl0IG1lbnUgbmVlZHMgdG8gaGF2ZSBvdmVyZmxvdyBmb3IgY2FzZXMgd2hlcmUgaXQgaGFzIGxvdHMgb2YgYnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICAqIEJ1dCBvdmVyZmxvdyBydWlucyBkcm9wZG93biBtZW51c1xuICAgICAgICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtY29udGVudC1zdWJzZWN0aW9uIGhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibmV1bWVFZGl0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnQtc3Vic2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidW5kb1JlZG9fY29udHJvbHNcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuYyBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5jQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBIZWFkIFNoYXBlOjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bfc2VsZWN0IGRyb3Bkb3duXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkhlYWQgU2hhcGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlB1bmN0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5QdW5jdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVmlyZ2FcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5WaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlZpcmdhUmV2ZXJzZWRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5SZXZlcnNlZCBWaXJnYTwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkluY2xpbmF0dW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5JbmNsaW5hdHVtPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiTGlxdWVzY2VudEFudGljbG9ja3dpc2VcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5MaXF1ZXNjZW50IEE8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJMaXF1ZXNjZW50Q2xvY2t3aXNlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TGlxdWVzY2VudCBDPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYmFzaWMgbmV1bWUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TmV1bWVBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInNwbGl0LW5ldW1lXCI+U3BsaXQgTmV1bWVzPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBuZXVtZSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5ldW1lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkdyb3VwaW5nIE9wdGlvbnM6PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+R3JvdXBpbmdzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50IHNjcm9sbGFibGUtZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaW1hY3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+Q2xpbWFjdXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDbGltYWN1c1Jlc3VwaW51c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaW1hY3VzIFJlc3VwaW51czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIkNsaXZpc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPkNsaXZpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBlczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBlc1N1YnB1bmN0aXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5QZXMgU3VicHVuY3RpczwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlBvcnJlY3R1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlBvcnJlY3R1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQb3JyZWN0dXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UG9ycmVjdHVzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJQcmVzc3VzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+UHJlc3N1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1czwvYT5cbiAgICAgICAgICAgICAgICA8YSBpZD1cIlNjYW5kaWN1c0ZsZXh1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlNjYW5kaWN1cyBGbGV4dXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJTY2FuZGljdXNTdWJwdW5jdGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGdyb3VwaW5nXCI+U2NhbmRpY3VzIFN1YnB1bmN0aXM8L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJUb3JjdWx1c1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbSBncm91cGluZ1wiPlRvcmN1bHVzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiVG9yY3VsdXNSZXN1cGludXNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZ3JvdXBpbmdcIj5Ub3JjdWx1cyBSZXN1cGludXM8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ1bmdyb3VwTmNzXCI+VW5ncm91cDwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRBY3Rpb25Db250ZW50cyA9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZGVmYXVsdCBhY3Rpb24gbWVudSB3aGVuIHNlbGVjdGluZyBieSBzeWxsYWJsZVxuICogU2FtZSBhcyBhYm92ZSBleGNlcHQgaW5jbHVkZXMgcmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmZcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyA9IGA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgY3VzdG9zIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9zQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBsYXllciBlbGVtZW50IChvdXRzaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudE91dEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiaW5zZXJ0VG9TeWxsYWJsZVwiPkluc2VydCB0byBuZWFyZXN0IHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgbGF5ZXIgZWxlbWVudCAoaW5zaWRlIHN5bGxhYmxlKSBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyRWxlbWVudEluQWN0aW9uQ29udGVudHMgPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtb3ZlT3V0c2lkZVN5bGxhYmxlXCI+TW92ZSBvdXRzaWRlIHN5bGxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYWNjaWQgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBhY2NpZEFjdGlvbkNvbnRlbnRzID0gYDxsYWJlbD5DaGFuZ2UgQWNjaWRlbnRhbDo8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlNoYXBlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJDaGFuZ2VUb0ZsYXRcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GbGF0PC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9OYXR1cmFsXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+TmF0dXJhbDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIHN0YWZmIHNwbGl0IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3Qgc3RhZmZTcGxpdEFjdGlvbkNvbnRlbnRzID0gYDxkaXY+U3BsaXQgU3lzdGVtOjwvZGl2PlxuICAgIDxkaXYgaWQ9XCJzcGxpdC1zeXN0ZW0tYnRucy1jb250YWluZXJcIiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNwbGl0LXN5c3RlbVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIj5TcGxpdDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVzZXQtcm90YXRlXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPlJlc2V0IFJvdGF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogQ29udGVudHMgb2YgZXh0cmEgc3RhZmYgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFmZk1lcmdlQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPk1lcmdlIFN5c3RlbXM6PC9sYWJlbD5cbiAgICA8ZGl2IGlkPVwibWVyZ2Utc3lzdGVtLWJ0bnMtY29udGFpbmVyXCIgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJtZXJnZS1zeXN0ZW1zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiPk1lcmdlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBhY2NpZCBhY3Rpb24gbWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbHVtbkFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jb250YWluZXJcIj5cbiAgICAgICAgRWRpdCBDb2x1bW4gSW5mb3JtYXRpb246XG4gICAgICAgIDxkaXYgaWQ9XCJjb2wtc3RlcHBlci1idG5zLWNvbnRhaW5lclwiIGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1kZWNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPuKAkzwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjb2wtaW5wdXRcIiBjbGFzcz1cInNpZGUtcGFuZWwtc3RlcHBlci1pbnB1dFwiIHZhbHVlPVwiMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbC1pbmNyZW1lbnRcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIGNvbC1zdGVwcGVyLWJ0blwiPis8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjb2wtY29uZmlybVwiIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2lkZS1wYW5lbC1jb25maXJtLWJ0blwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+Q29uZmlybTwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBpZD1cImNvbC13YXJuaW5nXCIgY2xhc3M9XCJzaWRlLXBhbmVsLXdhcm5pbmdcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBleHRyYSBjbGVmIGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgY2xlZkFjdGlvbkNvbnRlbnRzID0gYFxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wX3NlbGVjdCBkcm9wZG93blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIiBvdmVyZmxvdz1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic2VsZWN0LW9wdGlvbnNcIiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EaXNwbGFjZSBPY3RhdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiaW5jcmVtZW50LW9jdGF2ZVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPisxIE9jdGF2ZTwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9XCJkZWNyZW1lbnQtb2N0YXZlXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+LTEgT2N0YXZlPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCIgb3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNlbGVjdC1vcHRpb25zXCIgY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2hhbmdlIENsZWYgU2hhcGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uXCI+PHVzZSB4bGluazpocmVmPVwiJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiQ0NsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5DIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiRkNsZWZcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5GIENsZWY8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgYDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBkaXZMaW5lIHR5cGUgYWN0aW9uIG1lbnUuXG4gKi9cbmV4cG9ydCBjb25zdCBkaXZMaW5lQWN0aW9uQ29udGVudHMgPSBgPGxhYmVsPkNoYW5nZSBEaXZMaW5lOjwvbGFiZWw+XG48ZGl2IGNsYXNzPVwiZHJvcF9zZWxlY3QgZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwib3ZlcmZsb3c9XCJhdXRvXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWxlY3Qtb3B0aW9uc1wiIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8c3Bhbj5TaGFwZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPjx1c2UgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgaWQ9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9DYWVzdXJhXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+Q2Flc3VyYTwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9GaW5hbGlzXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+RmluYWxpczwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NaW5pbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NaW5pbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvTWFpb3JcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYWlvcjwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwiQ2hhbmdlVG9NYXhpbWFcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5NYXhpbWE8L2E+XG4gICAgICAgICAgICA8YSBpZD1cIkNoYW5nZVRvVmlyZ3VsYVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlZpcmd1bGE8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+YDtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBiYm94IGFjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgYmJveEFjdGlvbkNvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwibWF0Y2hIZWlnaHRcIj5NYXRjaCBIZWlnaHQgZm9yIEVudGlyZSBSb3c8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIEhUTUwgZm9yIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgY29uc3QgZ3JvdXBpbmdNZW51ID0ge1xuICBuYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gbW9yZS1lZGl0LWJ0blwiIGlkPVwiZ3JvdXBOY3NcIj5Hcm91cCBOZXVtZSBDb21wb25lbnRzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBuZXVtZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImdyb3VwTmV1bWVzXCI+R3JvdXAgTmV1bWVzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gLFxuICBzeWw6IGA8ZGl2IGNsYXNzPVwibW9yZS1lZGl0LWJ0biBwYW5lbC1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtZXJnZVN5bHNcIj5NZXJnZSBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cdFx0PC9kaXY+YCxcbiAgbGlnYXR1cmVOYzogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJncm91cE5jc1wiPkdyb3VwIE5ldW1lIENvbXBvbmVudHM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gLFxuICBsaWdhdHVyZTogYDxkaXYgY2xhc3M9XCJtb3JlLWVkaXQtYnRuIHBhbmVsLWJ0blwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidG9nZ2xlLWxpZ2F0dXJlXCI+VG9nZ2xlIExpZ2F0dXJlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gLFxuICBzcGxpdFN5bGxhYmxlOiBgPGRpdiBjbGFzcz1cIm1vcmUtZWRpdC1idG4gcGFuZWwtYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInRvZ2dsZS1saW5rXCI+VG9nZ2xlIExpbmtlZCBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmAsXG59O1xuXG4vKiBCR0lOTklORyBPRiBNT0RBTCBXSU5ET1cgQ09OVEVOVCBTRUNUSU9OICovXG5cbi8qKlxuICogSFRNTCBmb3IgQWRkIFN5bGxhYmxlIFRleHQgbW9kYWwgd2luZG93XG4gKi9cbmV4cG9ydCBjb25zdCBhZGRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWFkZFwiPkFkZDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4vKipcbiAqIEhUTUwgZm9yIEVkaXQgU3lsbGFibGUgVGV4dCBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUZXh0TW9kYWwgPSBgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJuZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXRcIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1sYWJlbFwiPkVudGVyIFN5bGxhYmxlIFRleHQ6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgPGRpdiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1idG5zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZW9uLW1vZGFsLXdpbmRvdy1idG5cIiBpZD1cIm5lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWxcIj5DYW5jZWw8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmVcIj5TYXZlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG5cbi8qKlxuICogSFRNTCBmb3IgSG90a2V5cyBtb2RhbCB3aW5kb3dcbiAqL1xuZXhwb3J0IGNvbnN0IGhvdGtleXNNb2RhbCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudFwiIGlkPVwibmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1ob3RrZXlzXCI+XG4gICAgICAgIDwhLS0gXCJEaXNwbGF5XCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5EaXNwbGF5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPis8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBJbjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+Wm9vbSBPdXQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+MDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5ab29tIFJlc2V0PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPmg8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+SGlkZSBHbHlwaDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPlQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+U2Nyb2xsIFRvIFN5bGxhYmxlIFRleHQ8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFwiRWRpdFwiIGhvdGtleXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LXN1YmNhdGVnb3J5LXRpdGxlXCI+RWRpdDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+Q3RybDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ejwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5VbmRvPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPkN0cmw8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5TaGlmdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pis8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeVwiPno8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5vcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+4oyYPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+KzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj56PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJlZG88L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+cS93L2Uvci90L3k8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBieSBTdGFmZi9TeWxsYWJsZS9OZXVtZS9MYXllckVsZW1lbnQvU2VsZWN0aW9uL09mZlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj4xLzIvMy80LzUvNjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGJ5IFN5bGxhYmxlL05ldW1lL05ldW1lIENvbXBvbmVudC9TdGFmZi9MYXllciBFbGVtZW50L0JCb3hcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+U2hpZnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj4rPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnlcIj5OdW1iZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIEJlZ2luIEluc2VydCBmb3IgdGhlIDxpPm50aDwvaT4gT3B0aW9uIGluIHRoZSBTZWxlY3RlZCBUYWJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+ZzwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgR3JvdXAvVW5ncm91cCBTZWxlY3RlZCBFbGVtZW50KHMpXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBcIk90aGVyXCIgaG90a2V5cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1zdWJjYXRlZ29yeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktc3ViY2F0ZWdvcnktdGl0bGVcIj5PdGhlcjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+czwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3RrZXktZW50cnktZGVzY3JpcHRpb25cIj5TYXZlIEZpbGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG90a2V5LWVudHJ5XCI+RXNjPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdGtleS1lbnRyeS1kZXNjcmlwdGlvblwiPlJldHVybiB0byBFZGl0IE1vZGU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG5leHBvcnQgY29uc3Qgc3lsbGFibGVBY3Rpb25zQ29udGVudCA9IGBcbiAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cIm1lcmdlU3lsc1wiPk1lcmdlIFN5bGxhYmxlczwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiY2hhbmdlU3RhZmZcIj5SZS1hc3NvY2lhdGUgdG8gbmVhcmVzdCBzdGFmZjwvYnV0dG9uPlxuICA8L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBlcnJvckxvZ3NQYW5lbENvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJlcnJvckxvZ0hlYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmctdGl0bGVcIj5FcnJvciBMb2c8L2Rpdj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVFcnJvckxvZ1wiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199L2Fzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLWRvd25cIj48L3VzZT5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRlbnRzXCIgaWQ9XCJlcnJvckxvZ0NvbnRlbnRzXCIgc3R5bGU9XCJvdmVyZmxvdzogc2Nyb2xsOyBwYWRkaW5nOiAwLjVlbSAwLjc1ZW07IG1heC1oZWlnaHQ6IDMwMHB4O1wiPjxkaXY+YDtcbiIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBBZGRTeWxBY3Rpb24sIFNldFRleHRBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvd0ludGVyZmFjZSB9IGZyb20gJy4uL0ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgaG90a2V5c01vZGFsLFxuICBlZGl0VGV4dE1vZGFsLFxuICBhZGRUZXh0TW9kYWwsXG59IGZyb20gJy4uL1NxdWFyZUVkaXQvQ29udGVudHMnO1xuaW1wb3J0IHtcbiAgbmV3Rm9sZGVySFRNTCxcbiAgcmVuYW1lSFRNTCxcbiAgdXBsb2FkQXJlYUhUTUwsXG59IGZyb20gJy4uL0Rhc2hib2FyZC9EYXNoYm9hcmRDb250ZW50JztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuL0RyYWdIYW5kbGVyJztcbmltcG9ydCB7IHNlbGVjdEJCb3gsIHVuc2VsZWN0IH0gZnJvbSAnLi9TZWxlY3RUb29scyc7XG5cbi8qKlxuICogRGVmaW5lcyBtb2RhbCB0eXBlcy5cbiAqIFRvIGNyZWF0ZSBuZXcgbW9kYWwgd2luZG93IHR5cGVzLCBhZGQgZW51bSBvcHRpb24gYW5kIGltcGxlbWVudCBsb2dpYyBpbnNpZGUgTW9kYWwgY2xhc3MuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGFsV2luZG93VmlldyB7XG4gIEFERF9URVhULFxuICBFRElUX1RFWFQsXG4gIEhPVEtFWVMsXG4gIEVSUk9SX0xPRywgLy8gZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFnYWluc3QgTUVJIHNjaGVtYSBhbmQgaW52YWxpZCBlbGVtZW50IGVycm9yc1xuICBET0NVTUVOVF9VUExPQUQsXG4gIE1PVkVfVE8sXG4gIE5FV19GT0xERVIsXG4gIFJFTkFNRSxcbn1cblxuZW51bSBNb2RhbFdpbmRvd1N0YXRlIHtcbiAgT1BFTixcbiAgQ0xPU0VELFxufVxuXG4vKipcbiAqIE1vZGFsIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGFuZCBjb250cm9sIHN0YXRlL2NvbnRlbnRcbiAqIG9mIG1vZGFsIHdpbmRvd3MgaW4gTmVvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGFsV2luZG93IGltcGxlbWVudHMgTW9kYWxXaW5kb3dJbnRlcmZhY2Uge1xuICBwcml2YXRlIG1vZGFsV2luZG93VmlldzogTW9kYWxXaW5kb3dWaWV3OyAvLyBjdXJyZW50IG1vZGFsIHR5cGVcbiAgcHJpdmF0ZSBtb2RhbFdpbmRvd1N0YXRlOiBNb2RhbFdpbmRvd1N0YXRlOyAvLyBvcGVuIG9yIGNsb3NlZD9cbiAgcHJpdmF0ZSBuZW9uVmlldzogTmVvblZpZXc7IC8vIG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHRcblxuICAvKipcbiAgICogU2V0IG5lb25WaWV3IGluc3RhbmNlIGNvbnRleHQgZm9yIHRoaXMgbW9kYWwgd2luZG93IGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbmVvblZpZXcgbmVvblZpZXcgY29udGV4dCBmb3IgTW9kYWwgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5lb25WaWV3PzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5DTE9TRUQ7XG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGFwcGx5IHRvIGFsbCBtb2RhbCB3aW5kb3dzXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctaGVhZGVyLWNsb3NlJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93JylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZm9jdXNNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItY2xvc2UnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3cnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lci5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250YWluZXInKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mb2N1c01vZGFsV2luZG93LmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbW9kYWwgdmlldyBvZiB0aGlzIE1vZGFsIGluc3RhbmNlLlxuICAgKiBVcGRhdGUgdGhlIGNvbnRlbnQgYmFzZWQgb24gcGFzc2VkIHZpZXcuXG4gICAqIEBwYXJhbSB2aWV3IFR5cGUgb2YgbW9kYWwgdG8gb3BlbiAoTW9kYWxWaWV3IGVudW0pXG4gICAqL1xuICBzZXRNb2RhbFdpbmRvd1ZpZXcodmlldzogTW9kYWxXaW5kb3dWaWV3LCBjb250ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1ZpZXcgPSB2aWV3O1xuICAgIHRoaXMuc2V0TW9kYWxXaW5kb3dDb250ZW50KGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBtb2RhbCB2aWV3IGFzIGEgc3RyaW5nXG4gICAqL1xuICBnZXRNb2RhbFdpbmRvd1ZpZXcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbFdpbmRvd1ZpZXcudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbW9kZWwgd2luZG93IHdpdGggY29udGVudCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgTW9kYWxWaWV3LlxuICAgKi9cbiAgb3Blbk1vZGFsV2luZG93KCk6IHZvaWQge1xuICAgIC8vIG1ha2Ugc3VyZSBubyBvdGhlciBtb2RhbCBjb250ZW50IGlzIGJlaW5nIGRpc3BsYXllZFxuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50JyksXG4gICAgKS5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICB9KTtcbiAgICBzd2l0Y2ggKHRoaXMubW9kYWxXaW5kb3dWaWV3KSB7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5BRERfVEVYVDpcbiAgICAgICAgdGhpcy5vcGVuQWRkU3lsVGV4dE1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIHRoaXMub3BlbkVkaXRTeWxUZXh0TW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkhPVEtFWVM6XG4gICAgICAgIC8vIHNldCB1cCBhbmQgZGlwbGF5IGhvdGtleSBtb2RhbCBjb250ZW50XG4gICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKVxuICAgICAgICAgIC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkRPQ1VNRU5UX1VQTE9BRDpcbiAgICAgIC8vIGFkZCBmdW5jdGlvbiB0byBwYWlyaW5nIGJ1dHRvblxuICAgICAgLy8gYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk1PVkVfVE86XG5cbiAgICAgIC8vIGJyZWFrO1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAgICAgJ2ZsZXgnO1xuICAgICAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIG1ha2Ugc3VyZSB1c2VyIGNhbid0IHNjcm9sbCB3aGVuIG1vZGFsIGlzIG9wZW5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgdGhpcy5tb2RhbFdpbmRvd1N0YXRlID0gTW9kYWxXaW5kb3dTdGF0ZS5PUEVOO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIE5lb24gbW9kYWwgd2luZG93XG4gICAqL1xuICBoaWRlTW9kYWxXaW5kb3coKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICBjb25zdCBzcGFuID0gPEhUTUxTcGFuRWxlbWVudD4oXG4gICAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAgIC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKVxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4uc2VsZWN0ZWQtdG8tZWRpdCcpWzBdXG4gICAgICAgICk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQtdG8tZWRpdCcpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3Lk5FV19GT0xERVI6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5SRU5BTUU6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWNvbnRhaW5lcicsXG4gICAgICAgICkuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPVxuICAgICAgJ25vbmUnO1xuICAgIC8vIHJlc2V0IHNjcm9sbCBiZWhhdmlvciBvZiBib2R5XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1ggPSAnaGlkZGVuJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdzY3JvbGwnO1xuICAgIHRoaXMubW9kYWxXaW5kb3dTdGF0ZSA9IE1vZGFsV2luZG93U3RhdGUuQ0xPU0VEO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29udGVudCBvZiBtb2RhbCB3aW5kb3dcbiAgICovXG4gIHByaXZhdGUgc2V0TW9kYWxXaW5kb3dDb250ZW50KGNvbnRlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgICduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWNvbnRhaW5lcicsXG4gICAgKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1oZWFkZXItdGl0bGUnKTtcblxuICAgIHN3aXRjaCAodGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkFERF9URVhUOlxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYWRkVGV4dE1vZGFsO1xuICAgICAgICAvLyBzZXQgbW9kYWwgd2luZG93IHRpdGxlXG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFTlRFUiBTWUxMQUJMRSBURVhUJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkVESVRfVEVYVDpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGVkaXRUZXh0TW9kYWw7XG4gICAgICAgIC8vIHNldCBtb2RhbCB3aW5kb3cgdGl0bGVcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0VESVQgU1lMTEFCTEUgVEVYVCc7XG5cbiAgICAgICAgLy8gc3BhbiBhbmQgY3VycmVudCB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGUgYW5kIGZpbHRlciBvdXQgdW53YW50ZWQgY2hhcnNcbiAgICAgICAgY29uc3Qgc3BhbiA9IDxIVE1MU3BhbkVsZW1lbnQ+KFxuICAgICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0JylcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuLnNlbGVjdGVkLXRvLWVkaXQnKVswXVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZW1vdmVTeW1ib2wgPSAvXFx1ezI1Q0F9L3U7XG4gICAgICAgIGNvbnN0IG9yaWcgPSBzcGFuLnRleHRDb250ZW50LnJlcGxhY2UocmVtb3ZlU3ltYm9sLCAnJykudHJpbSgpO1xuXG4gICAgICAgIC8vIHNldCB2YWx1ZSBvZiBpbnB1dCBmaWVsZCB0byBjdXJyZW50IHN5bGxhYmxlIHRleHRcbiAgICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PihcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICAgICAgKSkudmFsdWUgPSBvcmlnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuSE9US0VZUzpcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGhvdGtleXNNb2RhbDtcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ0hPVEtFWVMnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRVJST1JfTE9HOlxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAzMHB4O3doaXRlLXNwYWNlOiBwcmUtbGluZTtcIj4ke2NvbnRlbnR9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5lb24tbW9kYWwtd2luZG93LWJ0blwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCR7ZW5jb2RlVVJJKFxuICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgKX1cIiBkb3dubG9hZD1cImVycm9yLmxvZ1wiPlxuICAgICAgICAgICAgICBFeHBvcnRcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHRpdGxlLmlubmVyVGV4dCA9ICdFUlJPUiBMT0cnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRE9DVU1FTlRfVVBMT0FEOlxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSAnRE9DVU1FTlQgVVBMT0FEJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHVwbG9hZEFyZWFIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTU9WRV9UTzpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ01PVkUgVE8nO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuTkVXX0ZPTERFUjpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ05FVyBGT0xERVInO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbmV3Rm9sZGVySFRNTDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LlJFTkFNRTpcbiAgICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gJ1JFTkFNRSc7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSByZW5hbWVIVE1MO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBzZWxlY3Rpb24gdHlwZS4gVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgYWRkaW5nIHN5bGxhYmxlIHRleHRcbiAgICovXG4gIHByaXZhdGUgb3BlbkFkZFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpLFxuICAgICkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgQWRkIFN5bGxhYmxlIFRleHQgbW9kYWwgd2luZG93XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudC1lZGl0LXRleHQnKVxuICAgICAgLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcblxuICAgIC8vIFJlc2V0IFwiQ2FuY2VsXCIgYnV0dG9uIGV2ZW50IGxpc3RlbmVyXG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbCcpXG4gICAgICAucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdyk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWNhbmNlbCcpXG4gICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVNb2RhbFdpbmRvdy5iaW5kKHRoaXMpKTtcblxuICAgIC8vIFJlc2V0IFwiU2F2ZVwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1hZGQnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRTeWxUZXh0LmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1hZGQnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRTeWxUZXh0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gZGlzcGxheSBtb2RhbCB3aW5kb3dcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAnZmxleCc7XG4gICAgdGhpcy5mb2N1c01vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggY29udGVudCBmb3IgdXBkYXRpbmcgc3lsbGFibGUgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRWRpdFN5bFRleHRNb2RhbFdpbmRvdyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmVvbi1tb2RhbC13aW5kb3ctY29udGVudCcpLFxuICAgICkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgRWRpdCBTeWxsYWJsZSBUZXh0IG1vZGFsIHdpbmRvd1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQtZWRpdC10ZXh0JylcbiAgICAgIC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICAvLyBSZXNldCBcIkNhbmNlbFwiIGJ1dHRvbiBldmVudCBsaXN0ZW5lclxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKVxuICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cpO1xuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudEJ5SWQoJ25lb24tbW9kYWwtd2luZG93LWVkaXQtdGV4dC1jYW5jZWwnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWxXaW5kb3cuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBSZXNldCBcIlNhdmVcIiBidXR0b24gZXZlbnQgbGlzdGVuZXJcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtc2F2ZScpXG4gICAgICAucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZVN5bFRleHQuYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LXNhdmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy51cGRhdGVTeWxUZXh0LmJpbmQodGhpcykpO1xuXG4gICAgLy8gZGlzcGxheSBtb2RhbCB3aW5kb3dcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9XG4gICAgICAnZmxleCc7XG4gICAgdGhpcy5mb2N1c01vZGFsV2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0ZXh0IG9mIHNlbGVjdGVkLXRvLWVkaXQgc3lsbGFibGVzIHdpdGggdXNlci1wcm92aWRlZCB0ZXh0XG4gICAqL1xuICBwcml2YXRlIGFkZFN5bFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gR2V0IHRoZSBlbGVtZW50IElEIG9mIHRoZSBzZWxlY3RlZCBzeWxsYWJsZVxuICAgIGNvbnN0IGVsZW1lbnRJZCA9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzeWxsYWJsZSBzZWxlY3RlZCcpWzBdLmlkO1xuXG4gICAgY29uc3Qgc3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICApKS52YWx1ZTtcblxuICAgIGNvbnN0IGVkaXRvckFjdGlvbjogQWRkU3lsQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnYWRkU3lsJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudElkLFxuICAgICAgICBzeWxUZXh0OiBzeWxUZXh0LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gc2VuZCBhY3Rpb24gdG8gdmVyb3ZpbyBmb3IgcHJvY2Vzc2luZ1xuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBBbiB1cGRhdGUgdG8gdGhlIHBhZ2Ugd2lsbCByZWxvYWQgdGhlIGVudGlyZSBzdmc7XG4gICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgIC8vIGlmIGJib3hlcyBhcmUgZW5hYmxlZFxuICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVTZWxlY3RlZEJCb3goc3BhbiwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5uZW9uVmlldyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gY2xvc2UgbW9kYWwgd2luZG93XG4gICAgdGhpcy5oaWRlTW9kYWxXaW5kb3coKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRleHQgb2Ygc2VsZWN0ZWQtdG8tZWRpdCBzeWxsYWJsZXMgd2l0aCB1c2VyLXByb3ZpZGVkIHRleHRcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU3lsVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBzcGFuIGFuZCBjdXJyZW50IHRleHQgb2Ygc2VsZWN0ZWQtdG8tZWRpdCBzeWxsYWJsZSBhbmQgZmlsdGVyIG91dCB1bndhbnRlZCBjaGFyc1xuICAgIGNvbnN0IHNwYW4gPSA8SFRNTFNwYW5FbGVtZW50PihcbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5nZXRFbGVtZW50QnlJZCgnc3lsX3RleHQnKVxuICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgnc3Bhbi5zZWxlY3RlZC10by1lZGl0JylbMF1cbiAgICApO1xuICAgIGNvbnN0IHJlbW92ZVN5bWJvbCA9IC9cXHV7MjVDQX0vdTtcbiAgICBjb25zdCBvcmlnID0gc3Bhbi50ZXh0Q29udGVudC5yZXBsYWNlKHJlbW92ZVN5bWJvbCwgJycpLnRyaW0oKTtcbiAgICBjb25zdCB1cGRhdGVkU3lsVGV4dCA9ICg8SFRNTElucHV0RWxlbWVudD4oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctZWRpdC10ZXh0LWlucHV0JylcbiAgICApKS52YWx1ZTtcblxuICAgIGlmICh1cGRhdGVkU3lsVGV4dCAhPT0gbnVsbCAmJiB1cGRhdGVkU3lsVGV4dCAhPT0gb3JpZykge1xuICAgICAgLy8gY3JlYXRlIFwic2V0IHRleHRcIiBhY3Rpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IFsuLi5zcGFuLmNsYXNzTGlzdC5lbnRyaWVzKCldLmZpbHRlcihcbiAgICAgICAgKGNsYXNzTmFtZSkgPT5cbiAgICAgICAgICBjbGFzc05hbWVbMV0gIT09ICd0ZXh0LXNlbGVjdCcgJiYgY2xhc3NOYW1lWzFdICE9PSAnc2VsZWN0ZWQtdG8tZWRpdCcsXG4gICAgICApWzBdWzFdO1xuICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBTZXRUZXh0QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnRJZCxcbiAgICAgICAgICB0ZXh0OiB1cGRhdGVkU3lsVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBzZW5kIGFjdGlvbiB0byB2ZXJvdmlvIGZvciBwcm9jZXNzaW5nXG4gICAgICB0aGlzLm5lb25WaWV3XG4gICAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAgIC50aGVuKChyZXNwb25zZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBTVkdcbiAgICAgICAgICAgIHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gQW4gdXBkYXRlIHRvIHRoZSBwYWdlIHdpbGwgcmVsb2FkIHRoZSBlbnRpcmUgc3ZnO1xuICAgICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIHRoZW4gcmVzZWxlY3QgdGhlIHNhbWUgc2VsZWN0ZWQgc3lsbGFibGVcbiAgICAgICAgICAgICAgLy8gaWYgYmJveGVzIGFyZSBlbmFibGVkXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCQm94KHNwYW4sIHRoaXMuZHJhZ0hhbmRsZXIsIHRoaXMubmVvblZpZXcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZWxlY3QgaWYgbm8gY2hhbmdlIGlzIG1hZGVcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCQm94KHNwYW4sIHRoaXMuZHJhZ0hhbmRsZXIsIHRoaXMubmVvblZpZXcpO1xuICAgIH1cbiAgICAvLyBjbG9zZSBtb2RhbCB3aW5kb3dcbiAgICB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGJvdW5kaW5nIGJveCBzZWxlY3RlZCB3aGVuIHRoZSBlZGl0IHRleHQgbW9kYWwgaGFzIGJlZW4gY2xpY2tlZFxuICAgKi9cbiAgdXBkYXRlU2VsZWN0ZWRCQm94KFxuICAgIHNwYW46IEhUTUxTcGFuRWxlbWVudCxcbiAgICBkcmFnSGFuZGxlcjogRHJhZ0hhbmRsZXIsXG4gICAgbmVvblZpZXc6IE5lb25WaWV3LFxuICApOiB2b2lkIHtcbiAgICB1bnNlbGVjdCgpO1xuXG4gICAgY29uc3QgYmJveElkID0gQXJyYXkuZnJvbShzcGFuLmNsYXNzTGlzdCkuZmluZChcbiAgICAgIChlKSA9PiBlICE9PSAndGV4dC1zZWxlY3QnICYmIGUgIT09ICdzZWxlY3RlZC10by1lZGl0JyxcbiAgICApO1xuXG4gICAgaWYgKChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJCb3gnKSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmJveElkKSkge1xuICAgICAgICBjb25zdCBkaXNwbGF5UmVjdCA9IGRvY3VtZW50XG4gICAgICAgICAgLmdldEVsZW1lbnRCeUlkKGJib3hJZClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LWRpc3BsYXknKSBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIHNlbGVjdEJCb3goZGlzcGxheVJlY3QsIGRyYWdIYW5kbGVyLCBuZW9uVmlldyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbGwgbW9kYWwgd2luZG93IHdpdGggaG90a2V5IGluZm8gY29udGVudFxuICAgKi9cbiAgLypcbiAgcHJpdmF0ZSBvcGVuSG90a2V5TW9kYWxXaW5kb3cgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBtYWtlIHN1cmUgbm8gb3RoZXIgbW9kYWwgY29udGVudCBpcyBiZWluZyBkaXNwbGF5ZWRcbiAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tbW9kYWwtd2luZG93LWNvbnRlbnQnKSkuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgdXAgYW5kIGRpcGxheSBob3RrZXkgbW9kYWwgY29udGVudFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1jb250ZW50LWhvdGtleXMnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi1tb2RhbC13aW5kb3ctY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICB0aGlzLmZvY3VzTW9kYWxXaW5kb3coKTtcbiAgfTtcbiAgKi9cblxuICAvKipcbiAgICogRGVmaW5lIGV2ZW50IGxpc3RlbmVycyBmb3IgbW9kYWwgd2luZG93IGJhc2VkIG9uIG1vZGFsVmlldyB0eXBlXG4gICAqL1xuICBwcml2YXRlIGtleWRvd25MaXN0ZW5lciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgLy8gcHJldmVudCBOZW9uIGhvdGtleSBldmVudHMgZnJvbSBmaXJpbmcgd2hlbiB1c2VyIGlzIHR5cGluZ1xuXG4gICAgc3dpdGNoICh0aGlzLm1vZGFsV2luZG93Vmlldykge1xuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuQUREX1RFWFQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgdGhpcy5hZGRTeWxUZXh0KCk7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQ6XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgdGhpcy51cGRhdGVTeWxUZXh0KCk7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuaGlkZU1vZGFsV2luZG93KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB0aGlzLmhpZGVNb2RhbFdpbmRvdygpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRXZlbnQgbGlzdGVuZXIgdGhhdCBmb2N1c2VzIHRoZSBtb2RhbCB3aW5kb3cgaWYgdXNlciBjbGlja3MgYW55d2hlcmUgb3V0c2lkZSBvZiBpdFxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c01vZGFsV2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgIHN3aXRjaCAodGhpcy5tb2RhbFdpbmRvd1ZpZXcpIHtcbiAgICAgIGNhc2UgTW9kYWxXaW5kb3dWaWV3LkFERF9URVhUOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuRURJVF9URVhUOlxuICAgICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+KFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdy1lZGl0LXRleHQtaW5wdXQnKVxuICAgICAgICApKS5zZWxlY3QoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ET0NVTUVOVF9VUExPQUQ6XG4gICAgICBjYXNlIE1vZGFsV2luZG93Vmlldy5ORVdfRk9MREVSOlxuICAgICAgY2FzZSBNb2RhbFdpbmRvd1ZpZXcuUkVOQU1FOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1vZGFsLXdpbmRvdycpLmZvY3VzKCk7XG4gICAgfVxuICB9O1xufVxuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbnZhciBieXRlVG9IZXggPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFycikge1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgdmFyIHV1aWQgPSAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwiZXhwb3J0IGRlZmF1bHQgL14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pOyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsIi8qKiBAbW9kdWxlIERpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMgKi9cblxuaW1wb3J0ICogYXMgQ29sb3IgZnJvbSAnLi4vdXRpbHMvQ29sb3InO1xuaW1wb3J0IFpvb21IYW5kbGVyIGZyb20gJy4uL1NpbmdsZVZpZXcvWm9vbSc7XG5pbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncywgc2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcblxubGV0IGxhc3RHbHlwaE9wYWNpdHk6IG51bWJlciwgbGFzdEltYWdlT3BhY2l0eTogbnVtYmVyLCBsYXN0Q2lyY2xlU2l6ZTogbnVtYmVyO1xuXG4vKipcbiAqIFNldCB6b29tIGNvbnRyb2wgbGlzdGVuZXIgZm9yIGJ1dHRvbiBhbmQgc2xpZGVyXG4gKiBAcGFyYW0gem9vbUhhbmRsZXIgLSBBIFtbWm9vbUhhbmRsZXJdXSBpcyBvbmx5IG5lY2Vzc2FyeSBpbiBTaW5nbGUgUGFnZSBtb2RlIGFzIGRpdmEuanMgaGFuZGxlcyB6b29taW5nIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFpvb21Db250cm9scyAoem9vbUhhbmRsZXI/OiBab29tSGFuZGxlcik6IHZvaWQge1xuICBpZiAoem9vbUhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB6b29tU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21TbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCB6b29tT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pvb21PdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IHpvb20gfSA9IGdldFNldHRpbmdzKCk7XG4gIHpvb21TbGlkZXIudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gIHpvb21IYW5kbGVyLnpvb21Ubyh6b29tIC8gMTAwLjApO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtem9vbScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHpvb21PdXRwdXQudmFsdWUgPSAnMTAwJztcbiAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgem9vbUhhbmRsZXIucmVzZXRab29tQW5kUGFuKCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXQtem9vbS1lYXN5LWVkaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gJzE4MCc7XG4gICAgem9vbVNsaWRlci52YWx1ZSA9ICcxODAnO1xuICAgIHpvb21IYW5kbGVyLnpvb21UbygxODAvMTAwKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gaW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICB6b29tT3V0cHV0LnZhbHVlID0gem9vbVNsaWRlci52YWx1ZTtcbiAgICB6b29tSGFuZGxlci56b29tVG8oTnVtYmVyKHpvb21PdXRwdXQudmFsdWUpIC8gMTAwLjApO1xuICB9XG5cbiAgLy8gem9vbVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGlucHV0Q2hhbmdlSGFuZGxlcik7XG4gIHpvb21TbGlkZXIuZGlzYWJsZWQgPSBmYWxzZTtcblxuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZ0KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFpvb20gPSBwYXJzZUludCh6b29tT3V0cHV0LnZhbHVlKTtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2dC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IFxuICAgIGV2dC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldnQua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldnQua2V5ID09PSAnKycpIHsgLy8gaW5jcmVhc2Ugem9vbSBieSAyMFxuICAgICAgY29uc3QgbmV3Wm9vbSA9IE1hdGgubWluKGN1cnJlbnRab29tICsgMjAsIHBhcnNlSW50KHpvb21TbGlkZXIuZ2V0QXR0cmlidXRlKCdtYXgnKSkpO1xuICAgICAgem9vbUhhbmRsZXIuem9vbVRvKG5ld1pvb20gLyAxMDAuMCk7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgICAgem9vbVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdab29tKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICdfJykgeyAvLyBkZWNyZWFzZSB6b29tIGJ5IDIwXG4gICAgICBjb25zdCBuZXdab29tID0gTWF0aC5tYXgoY3VycmVudFpvb20gLSAyMCwgcGFyc2VJbnQoem9vbVNsaWRlci5nZXRBdHRyaWJ1dGUoJ21pbicpKSk7XG4gICAgICB6b29tSGFuZGxlci56b29tVG8obmV3Wm9vbSAvIDEwMC4wKTtcbiAgICAgIHpvb21PdXRwdXQudmFsdWUgPSBTdHJpbmcobmV3Wm9vbSk7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gU3RyaW5nKG5ld1pvb20pO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJzAnKSB7XG4gICAgICB6b29tT3V0cHV0LnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tU2xpZGVyLnZhbHVlID0gJzEwMCc7XG4gICAgICB6b29tSGFuZGxlci5yZXNldFpvb21BbmRQYW4oKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBNRUkgb3BhY2l0eSB0byB2YWx1ZSBmcm9tIHRoZSBzbGlkZXIuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlciAobWVpQ2xhc3NOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG9wYWNpdHlPdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BhY2l0eU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuICBjb25zdCBvcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wYWNpdHlTbGlkZXInKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBvcGFjaXR5T3V0cHV0LnZhbHVlO1xuICAvLyB0aGlzIGlzIHdoZXJlIHdlIGxvYWQgZ2x5cGggb3BhY2l0eSBmcm9tIGxvY2FsU3RvcmFnZSBvbiBwYWdlLWxvYWRcbiAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdG9nZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlR2x5cGhJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWdseXBoLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSA9PT0gMCkge1xuICAgIGhpZGVHbHlwaEltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zaG93LWljb24uc3ZnYCk7XG4gICAgaGlkZUdseXBoSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdTaG93IGdseXBoJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgaGlkZUdseXBoSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2hpZGUtaWNvbi5zdmdgKTtcbiAgICBoaWRlR2x5cGhJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0hpZGUgZ2x5cGgnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgKChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIG1laUNsYXNzTmFtZSkpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KS5mb3JFYWNoKGcgPT4ge1xuICAgICAgZy5zdHlsZS5vcGFjaXR5ID0gKE51bWJlcihvcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMC4wKS50b1N0cmluZygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gcHJvcGVybHkgc2V0IG9wYWNpdHkgdG8gcGFnZXMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCByZW5kZXJlZCBNRUkgb3BhY2l0eSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0gbWVpQ2xhc3NOYW1lIC0gQ2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVuZGVyZWQgTUVJLlxuICovXG5mdW5jdGlvbiBzZXRHbHlwaE9wYWNpdHlDb250cm9scyAobWVpQ2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3BhY2l0eVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5U2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgb3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGFjaXR5T3V0cHV0JykgYXMgSFRNTE91dHB1dEVsZW1lbnQ7XG5cbiAgY29uc3QgeyBnbHlwaE9wYWNpdHkgfSA9IGdldFNldHRpbmdzKCk7XG4gIGxhc3RHbHlwaE9wYWNpdHkgPSBnbHlwaE9wYWNpdHk7XG4gIG9wYWNpdHlTbGlkZXIudmFsdWUgPSBTdHJpbmcoZ2x5cGhPcGFjaXR5KTtcbiAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhnbHlwaE9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGlucHV0Q2hhbmdlT3BhY2l0eSAoKTogdm9pZCB7XG4gICAgb3BhY2l0eU91dHB1dC52YWx1ZSA9IG9wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEdseXBoT3BhY2l0eSA9IE51bWJlcihvcGFjaXR5U2xpZGVyLnZhbHVlKTtcbiAgICBzZXRHbHlwaE9wYWNpdHlGcm9tU2xpZGVyKG1laUNsYXNzTmFtZSk7XG4gIH1cblxuICBjb25zdCB0b2dnbGVPcGFjaXR5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZ2dsZS1nbHlwaC1vcGFjaXR5Jyk7XG5cbiAgaWYgKGdseXBoT3BhY2l0eSA9PSAxMDApIHtcbiAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlT3BhY2l0eUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cbiAgICBsZXQgbmV3T3BhY2l0eTtcbiAgICBpZiAodG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtaWNvbicpKSB7XG4gICAgICB0b2dnbGVPcGFjaXR5QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUtaWNvbicpO1xuICAgICAgbmV3T3BhY2l0eSA9IDA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdG9nZ2xlT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cblxuICAgIC8vIERlZmluaXRpb24gc2NhbGUgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB3aGF0IGlzIGdlbmVyYXRlZCBieSB2ZXJvdmlvXG4gICAgXG4gICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgbWVpQ2xhc3NOYW1lKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PikuZm9yRWFjaChnID0+IHtcbiAgICAgIGcuc3R5bGUub3BhY2l0eSA9IG5ld09wYWNpdHkudG9TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGxhc3RHbHlwaE9wYWNpdHkgPSBOdW1iZXIob3BhY2l0eVNsaWRlci52YWx1ZSk7XG4gICAgb3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBvcGFjaXR5T3V0cHV0LnZhbHVlID0gU3RyaW5nKE1hdGgucm91bmQobmV3T3BhY2l0eSAqIDEwMCkpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyBnbHlwaE9wYWNpdHk6IG5ld09wYWNpdHkgKiAxMDAgfSk7XG5cbiAgICBpbnB1dENoYW5nZU9wYWNpdHkoKTtcbiAgfSk7XG5cbiAgb3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGlucHV0Q2hhbmdlT3BhY2l0eSk7XG4gIG9wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaW5wdXRDaGFuZ2VPcGFjaXR5KTtcblxuICBvcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBTZXQgYmFja2dyb3VuZCBpbWFnZSBvcGFjaXR5IGJ1dHRvbiBhbmQgc2xpZGVyIGxpc3RlbmVycy5cbiAqIEBwYXJhbSBiYWNrZ3JvdW5kIC0gVGhlIGJhY2tncm91bmQgaW1hZ2Ugc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHNldEJnT3BhY2l0eUNvbnRyb2xzIChiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5U2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnT3BhY2l0eVNsaWRlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGJnT3BhY2l0eU91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZ09wYWNpdHlPdXRwdXQnKSBhcyBIVE1MT3V0cHV0RWxlbWVudDtcblxuICBjb25zdCB7IGltYWdlT3BhY2l0eSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdEltYWdlT3BhY2l0eSA9IGltYWdlT3BhY2l0eTtcbiAgYmdPcGFjaXR5U2xpZGVyLnZhbHVlID0gU3RyaW5nKGltYWdlT3BhY2l0eSk7XG4gIGJnT3BhY2l0eU91dHB1dC52YWx1ZSA9IFN0cmluZyhpbWFnZU9wYWNpdHkpO1xuXG4gIGZ1bmN0aW9uIGJnSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBiZ09wYWNpdHlTbGlkZXIudmFsdWU7XG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIHNldEJnT3BhY2l0eUZyb21TbGlkZXIoYmFja2dyb3VuZCk7XG4gIH1cblxuXG4gIGNvbnN0IHRvZ2dsZUJnT3BhY2l0eUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtYmctb3BhY2l0eScpO1xuXG4gIGlmIChpbWFnZU9wYWNpdHkgPT0gMTAwKSB7XG4gICAgdG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5hZGQoJ2hpZGUtaWNvbicpO1xuICB9XG5cbiAgdG9nZ2xlQmdPcGFjaXR5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgbGV0IG5ld09wYWNpdHk7XG5cbiAgICBpZiAodG9nZ2xlQmdPcGFjaXR5QnRuLmNsYXNzTGlzdC5jb250YWlucygnaGlkZS1pY29uJykpIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRvZ2dsZUJnT3BhY2l0eUJ0bi5jbGFzc0xpc3QuYWRkKCdoaWRlLWljb24nKTtcbiAgICAgIG5ld09wYWNpdHkgPSAxO1xuICAgIH1cbiAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShiYWNrZ3JvdW5kKVswXSBhcyBIVE1MRWxlbWVudClcbiAgICAgIC5zdHlsZS5vcGFjaXR5ID0gbmV3T3BhY2l0eS50b1N0cmluZygpO1xuXG4gICAgbGFzdEltYWdlT3BhY2l0eSA9IE51bWJlcihiZ09wYWNpdHlTbGlkZXIudmFsdWUpO1xuICAgIGJnT3BhY2l0eVNsaWRlci52YWx1ZSA9IFN0cmluZyhuZXdPcGFjaXR5ICogMTAwKTtcbiAgICBiZ09wYWNpdHlPdXRwdXQudmFsdWUgPSBTdHJpbmcoTWF0aC5yb3VuZChuZXdPcGFjaXR5ICogMTAwKSk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IGltYWdlT3BhY2l0eTogbmV3T3BhY2l0eSAqIDEwMCB9KTtcbiAgICBiZ0lucHV0Q2hhbmdlSGFuZGxlcigpO1xuICB9KTtcblxuICBiZ09wYWNpdHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG4gIGJnT3BhY2l0eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBiZ0lucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgYmdPcGFjaXR5U2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEJnT3BhY2l0eUZyb21TbGlkZXIgKGJhY2tncm91bmQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmdPcGFjaXR5T3V0cHV0OiBIVE1MT3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiZ09wYWNpdHlPdXRwdXQnKTtcbiAgXG4gIHNldFNldHRpbmdzKHsgaW1hZ2VPcGFjaXR5OiBOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSB9KTtcblxuICAvLyBkaXNwYXkgY29ycmVjdCBzbGlkZXIgdGlnZ2xlIGRpc3BsYXkgaWNvblxuICBjb25zdCBoaWRlQmdJbWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9nZ2xlLWJnLW9wYWNpdHkgPiBpbWcnKTtcbiAgaWYgKE51bWJlcihiZ09wYWNpdHlPdXRwdXQudmFsdWUpID09PSAwKSB7XG4gICAgaGlkZUJnSW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL3Nob3ctaWNvbi5zdmdgKTtcbiAgICBoaWRlQmdJbWcucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ1Nob3cgYmFja2dyb3VuZCBpbWFnZScpO1xuICB9XG4gIGVsc2Uge1xuICAgIGhpZGVCZ0ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9oaWRlLWljb24uc3ZnYCk7XG4gICAgaGlkZUJnSW1nLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsICdIaWRlIGJhY2tncm91bmQgaW1hZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IGJnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2JhY2tncm91bmR9YCk7XG4gIGlmIChiZykgYmcuc3R5bGUub3BhY2l0eSA9IFN0cmluZyhOdW1iZXIoYmdPcGFjaXR5T3V0cHV0LnZhbHVlKSAvIDEwMCk7XG59XG5cbi8qKlxuICogU2V0IGJib3ggYWRqdXN0bWVudCBjaXJjbGUgc2l6ZSBidXR0b24gYW5kIHNsaWRlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDaXJjbGVTaXplQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBjaXJjbGVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2lyY2xlU2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgY2lyY2xlT3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NpcmNsZU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50O1xuXG4gIGNvbnN0IHsgY2lyY2xlU2l6ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgbGFzdENpcmNsZVNpemUgPSBjaXJjbGVTaXplO1xuICBjaXJjbGVTbGlkZXIudmFsdWUgPSBTdHJpbmcoY2lyY2xlU2l6ZSk7XG4gIGNpcmNsZU91dHB1dC52YWx1ZSA9IFN0cmluZyhjaXJjbGVTaXplKTtcblxuICBmdW5jdGlvbiBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyICgpOiB2b2lkIHtcbiAgICBjaXJjbGVPdXRwdXQudmFsdWUgPSBjaXJjbGVTbGlkZXIudmFsdWU7XG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoY2lyY2xlU2xpZGVyLnZhbHVlKTtcbiAgICBzZXRTZXR0aW5ncyh7IGNpcmNsZVNpemU6IE51bWJlcihsYXN0Q2lyY2xlU2l6ZSkgfSk7XG4gICAgY29uc3QgcmVzaXplUG9pbnRzID0gZDMuc2VsZWN0QWxsKCcucmVzaXplUG9pbnQnKTtcbiAgICBpZiAoIXJlc2l6ZVBvaW50cy5lbXB0eSgpKSB7XG4gICAgICByZXNpemVQb2ludHMuYXR0cigncicsIGxhc3RDaXJjbGVTaXplKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1jaXJjbGUtc2l6ZScpO1xuICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0U2l6ZSA9IDI1OyBcbiAgICAvLyBpZiBoYXMgcmVzaXplUG9pbnRzIGRpc3BsYXllZFxuICAgIGNvbnN0IHJlc2l6ZVBvaW50cyA9IGQzLnNlbGVjdEFsbCgnLnJlc2l6ZVBvaW50Jyk7XG4gICAgaWYgKCFyZXNpemVQb2ludHMuZW1wdHkoKSkge1xuICAgICAgcmVzaXplUG9pbnRzLmF0dHIoJ3InLCBkZWZhdWx0U2l6ZSk7XG4gICAgfVxuXG4gICAgbGFzdENpcmNsZVNpemUgPSBOdW1iZXIoZGVmYXVsdFNpemUpO1xuICAgIGNpcmNsZVNsaWRlci52YWx1ZSA9IFN0cmluZyhkZWZhdWx0U2l6ZSk7XG4gICAgY2lyY2xlT3V0cHV0LnZhbHVlID0gU3RyaW5nKGRlZmF1bHRTaXplKTtcblxuICAgIHNldFNldHRpbmdzKHsgY2lyY2xlU2l6ZTogTnVtYmVyKGRlZmF1bHRTaXplKSB9KTtcbiAgICBjaXJjbGVTaXplSW5wdXRDaGFuZ2VIYW5kbGVyKCk7XG4gIH0pO1xuXG4gIGNpcmNsZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNpcmNsZVNpemVJbnB1dENoYW5nZUhhbmRsZXIpO1xuICBjaXJjbGVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2lyY2xlU2l6ZUlucHV0Q2hhbmdlSGFuZGxlcik7XG5cbiAgY2lyY2xlU2xpZGVyLmRpc2FibGVkID0gZmFsc2U7XG59XG5cbi8qKlxuICogVXBkYXRlIGhpZ2hsaWdodCBkcm9wZG93biBvcHRpb24gKyBkaXNwbGF5XG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRPcHRpb24gKGdyb3VwOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGhpZ2hsaWdodC0ke2dyb3VwfWApO1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcbiAgY29uc3QgaGlnaGxpZ2h0VHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtdHlwZScpO1xuXG4gIC8vIHNhdmUgaGlnaGxpZ2h0IG9wdGlvbiB0byBsb2NhbFN0b3JhZ2VcbiAgc2V0U2V0dGluZ3MoeyBoaWdobGlnaHRNb2RlOiBncm91cCB9KTtcblxuICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmZvckVhY2goZWxlbSA9PiB7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgfSk7XG5cbiAgaWYgKGdyb3VwID09PSAnbm9uZScpIHtcbiAgICBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50ID0gJ1xceEEwLSBPZmYnO1xuICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIG9wdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcblxuICAvLyBUZXh0IGNvbnRlbnQgaXMgdGhlIGdyb3VwaW5nIHR5cGUgY2FwaXRhbGl6ZWRcbiAgaGlnaGxpZ2h0VHlwZS50ZXh0Q29udGVudCA9IGBcXHhBMC0gJHtncm91cFswXS50b1VwcGVyQ2FzZSgpICsgZ3JvdXAuc2xpY2UoMSl9YDtcbiAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXApO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHQgbW9kZSBjaG9zZW4gYnkgdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWdobGlnaHRUeXBlICgpOiBHcm91cGluZ1R5cGUge1xuICBjb25zdCBoaWdobGlnaHRUeXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJyk7XG4gIHJldHVybiBoaWdobGlnaHRUeXBlLnRleHRDb250ZW50LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCkgYXMgR3JvdXBpbmdUeXBlO1xufVxuXG4vKipcbiAqIFNldCBjbGljayBsaXN0ZW5lciBmb3IgZWFjaCBoaWdobGlnaHQgZHJvcGRvd24gb3B0aW9uXG4gKiBAcGFyYW0gZ3JvdXAgLSBHcm91cGluZ1R5cGUgLyBUaGUgRE9NIGVsZW1lbnQncyBpZCBhcyBgaGlnaGxpZ2h0LSR7aWR9YFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0T3B0aW9uIChncm91cDogR3JvdXBpbmdUeXBlKTogdm9pZCB7XG4gIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBoaWdobGlnaHQtJHtncm91cH1gKTtcbiAgb3B0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbihncm91cCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENsaWNrYXdheSBsaXN0ZW5lciBmb3IgdGhlIGhpZ2hsaWdodCBkcm9wZG93bi5cbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q2xpY2thd2F5ICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbn1cblxuLyoqXG4gKiBTZXQgbGlzdGVuZXIgb24gc3RhZmYgaGlnaGxpZ2h0aW5nIGNoZWNrYm94LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0Q29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaWdobGlnaHQtZHJvcGRvd24nKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LWJ1dHRvbicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcm9wZG93bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBpZiAoZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZ2hsaWdodENsaWNrYXdheSk7XG5cbiAgICAgIHNldEhpZ2hsaWdodE9wdGlvbignY29sdW1uJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N0YWZmJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3N5bGxhYmxlJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICBzZXRIaWdobGlnaHRPcHRpb24oJ2xheWVyRWxlbWVudCcpO1xuICAgICAgc2V0SGlnaGxpZ2h0T3B0aW9uKCdub25lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWdobGlnaHRDbGlja2F3YXkpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICAqIFNldCBsaXN0ZW5lciBvbiBrZXkgc2hvcnRjdXRzIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiBoaWdobGlnaHRzXG4gICogXG4gICogVGhlIGN1cnJlbnQgcGxhbiBpcyB0byB1c2UgdGhlIGtleXMgcSwgdywgZSwgciwgdCwgYW5kIHlcbiAgKi9cbmZ1bmN0aW9uIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzICgpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2dCkgPT4ge1xuICAgIC8vIFByZXZlbnQgY21kL2N0cmwrciBmcm9tIGNoYW5naW5nIGhpZ2hsaWdodCBvcHRpb25cbiAgICBpZiAoZXZ0Lm1ldGFLZXkpIHJldHVybjtcblxuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAncSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc3RhZmYnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3JzpcbiAgICAgICAgdXBkYXRlSGlnaGxpZ2h0T3B0aW9uKCdzeWxsYWJsZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2UnOlxuICAgICAgICB1cGRhdGVIaWdobGlnaHRPcHRpb24oJ25ldW1lJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncic6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbGF5ZXJFbGVtZW50Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndCc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignc2VsZWN0aW9uJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneSc6XG4gICAgICAgIHVwZGF0ZUhpZ2hsaWdodE9wdGlvbignbm9uZScpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlnaGxpZ2h0U2VsZWN0aW9uQ29udHJvbHMgKCk6IHZvaWQge1xuICBjb25zdCBoaWdobGlnaHRTZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlnaGxpZ2h0LXNlbGVjdGlvbicpO1xuICBoaWdobGlnaHRTZWxlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC1kcm9wZG93bicpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQtc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgICBoaWdobGlnaHRTZWxlY3Rpb24uY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0LXNlbGVjdGVkJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpZ2hsaWdodC10eXBlJykudGV4dENvbnRlbnQgPSAnIC0gU2VsZWN0aW9uJztcbiAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnc2VsZWN0aW9uJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBoaWdobGlnaHQgZm9yIGRpZmZlcmVudCB0eXBlcyBiYXNlZCBvbiB0aGUgJ2hpZ2hsaWdodC1zZWxlY3RlZCcgY2xhc3MgaW4gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUhpZ2hsaWdodCAoKTogdm9pZCB7XG4gIGxldCBoaWdobGlnaHRJZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGhpZ2hsaWdodElkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmlkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGlnaGxpZ2h0SWQgPSAnJztcbiAgfVxuICBzd2l0Y2ggKGhpZ2hsaWdodElkKSB7XG4gICAgY2FzZSAnaGlnaGxpZ2h0LWNvbHVtbic6XG4gICAgICBDb2xvci5zZXRHcm91cGluZ0hpZ2hsaWdodCgnY29sdW1uJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3RhZmYnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N0YWZmJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtc3lsbGFibGUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N5bGxhYmxlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbmV1bWUnOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ25ldW1lJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaWdobGlnaHQtbGF5ZXJFbGVtZW50JzpcbiAgICAgIENvbG9yLnNldEdyb3VwaW5nSGlnaGxpZ2h0KCdsYXllckVsZW1lbnQnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hpZ2hsaWdodC1zZWxlY3Rpb24nOlxuICAgICAgQ29sb3Iuc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3NlbGVjdGlvbicpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIENvbG9yLnVuc2V0R3JvdXBpbmdIaWdobGlnaHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBsaXN0ZW5lciBvbiBidXJnZXIgbWVudSBmb3Igc21hbGxlciBzY3JlZW5zLlxuICovXG5mdW5jdGlvbiBzZXRCdXJnZXJDb250cm9scyAoKTogdm9pZCB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidXJnZXJNZW51JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1cmdlck1lbnUnKS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1hY3RpdmUnKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2TWVudScpLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuICB9KTtcbn1cblxuLyoqIFxuICogU2V0IGxpc3RlbmVyIGZvciBcIkRpc3BsYXkgQWxsXCIgYnV0dG9uIGluIERpc3BsYXkgcGFuZWwuXG4qL1xuZnVuY3Rpb24gc2V0RGlzcGxheUFsbExpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBzZWxlY3RBbGxCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzcGxheS1hbGwtYnRuJyk7XG4gIHNlbGVjdEFsbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAvLyBhdCB0aGUgbW9tZW50LCBjbGFzc25hbWUgJ3NlbGVjdGVkJyBpcyBvbmx5IHVzZWQgZm9yIHRyYWNraW5nIHB1cnBvc2VzXG4gICAgaWYgKHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdEaXNwbGF5IEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcblxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGVja2VkKSBvcHRpb24uY2xpY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNlbGVjdEFsbEJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgc2VsZWN0QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgICBjb25zdCBvcHRpb25zID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGVja2JveC1jb250YWluZXI6bm90KFtzdHlsZSo9XCJkaXNwbGF5OiBub25lO1wiXSkgPiAuY2hlY2tib3gnKTtcbiAgICAgIFxuICAgICAgQXJyYXkuZnJvbShvcHRpb25zKS5mb3JFYWNoKChvcHRpb246IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb24uY2hlY2tlZCkgb3B0aW9uLmNsaWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKiogXG4gKiBVcGRhdGUgYERpc3BsYXkgQWxsYCBidXR0b24gc3RhdHVzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlBbGxCdG4oKTogdm9pZCB7XG4gIGNvbnN0IGRpc3BsYXlBbGxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1hbGwtYnRuJyk7XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlJbmZvJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUJCb3hlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5QkJveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlUZXh0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3QgZGlzcGxheUVyckxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5LWVycm9ycycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgLy8gaWYgYWxsIG9wdGlvbnMgYXJlIHNlbGVjdGVkLFxuICAvLyBzZXQgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIHRvIFwiSGlkZSBBbGxcIi5cbiAgaWYgKGRpc3BsYXlJbmZvPy5jaGVja2VkICYmIGRpc3BsYXlCQm94ZXM/LmNoZWNrZWQgJiYgXG4gICAgZGlzcGxheVRleHQ/LmNoZWNrZWQgJiYgZGlzcGxheUVyckxvZz8uY2hlY2tlZCkge1xuICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgXCJEaXNwbGF5L0hpZGUgQWxsXCIgYnV0dG9uIGlzIGluIFwiSGlkZSBBbGxcIiBtb2RlLCBzZXQgaXQgdG8gXCJEaXNwbGF5IEFsbFwiIG1vZGVcbiAgICBpZiAoZGlzcGxheUFsbEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0Rpc3BsYXkgQWxsJztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGhpZ2hsaWdodCBzZXR0aW5ncyBmcm9tIGxvY2FsU3RvcmFnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEhpZ2hsaWdodFNldHRpbmdzICgpOiB2b2lkIHtcbiAgY29uc3QgeyBoaWdobGlnaHRNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICB1cGRhdGVIaWdobGlnaHRPcHRpb24oaGlnaGxpZ2h0TW9kZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBsaXN0ZW5lcnMgYW5kIGNvbnRyb2xzIGZvciBkaXNwbGF5IHBhbmVsLlxuICogQHBhcmFtIHtzdHJpbmd9IG1laUNsYXNzTmFtZSAtIFRoZSBjbGFzcyB1c2VkIHRvIHNpZ25pZml5IHRoZSBNRUkgZWxlbWVudChzKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYWNrZ3JvdW5kIC0gVGhlIGNsYXNzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYmFja2dyb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREaXNwbGF5Q29udHJvbHMgKG1laUNsYXNzTmFtZTogc3RyaW5nLCBiYWNrZ3JvdW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0R2x5cGhPcGFjaXR5Q29udHJvbHMobWVpQ2xhc3NOYW1lKTtcbiAgc2V0QmdPcGFjaXR5Q29udHJvbHMoYmFja2dyb3VuZCk7XG4gIHNldEhpZ2hsaWdodENvbnRyb2xzKCk7XG4gIHNldEJ1cmdlckNvbnRyb2xzKCk7XG4gIHNldEhpZ2hsaWdodEtleUNvbnRyb2xzKCk7XG4gIHNldERpc3BsYXlBbGxMaXN0ZW5lcigpO1xuICBsb2FkSGlnaGxpZ2h0U2V0dGluZ3MoKTtcblxuICBjb25zdCBkaXNwbGF5Q29udGVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUNvbnRlbnRzJyk7XG4gIGNvbnN0IHRvZ2dsZURpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlRGlzcGxheScpO1xuICBjb25zdCBkaXNwbGF5SGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlIZWFkZXInKTtcblxuICBkaXNwbGF5SGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGlmIGRpc3BsYXkgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgaWYgKGRpc3BsYXlDb250ZW50cy5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb3NlZCcpKSB7XG4gICAgICBkaXNwbGF5Q29udGVudHMuY2xhc3NMaXN0LnJlbW92ZSgnY2xvc2VkJyk7XG4gICAgICBkaXNwbGF5Q29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwLjVlbSAwLjc1ZW0nO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpc3BsYXlDb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93bmApO1xuICAgIH0gXG4gICAgLy8gaWYgZGlzcGxheSBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdFxuICAgIGVsc2Uge1xuICAgICAgZGlzcGxheUNvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ2Nsb3NlZCcpO1xuICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZGlzcGxheUNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0b2dnbGVEaXNwbGF5LnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tc2lkZWApO1xuICAgIH1cbiAgfSk7XG59XG5cbiIsImltcG9ydCAqIGFzIENvbnRlbnRzIGZyb20gJy4vQ29udGVudHMnO1xuaW1wb3J0ICogYXMgR3JvdXBpbmcgZnJvbSAnLi9Hcm91cGluZyc7XG5pbXBvcnQgTm90aWZpY2F0aW9uIGZyb20gJy4uL3V0aWxzL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgU3BsaXRTdGFmZkhhbmRsZXIgfSBmcm9tICcuL1N0YWZmVG9vbHMnO1xuaW1wb3J0IHsgU3BsaXROZXVtZUhhbmRsZXIgfSBmcm9tICcuL05ldW1lVG9vbHMnO1xuaW1wb3J0IHtcbiAgQ2hhaW5BY3Rpb24sXG4gIENoYW5nZVN0YWZmQWN0aW9uLFxuICBEaXNwbGFjZUNsZWZPY3RhdmVBY3Rpb24sXG4gIEVkaXRvckFjdGlvbixcbiAgTWF0Y2hIZWlnaHRBY3Rpb24sXG4gIFJlbW92ZUFjdGlvbixcbiAgU2V0QWN0aW9uLFxuICBTZXRDbGVmQWN0aW9uLFxuICBTZXRMaXF1ZXNjZW50QWN0aW9uLFxufSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuLi91dGlscy9TZWxlY3RUb29scyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuXG4vKipcbiAqIFRoZSBOZW9uVmlldyBwYXJlbnQgdG8gY2FsbCBlZGl0b3IgYWN0aW9ucy5cbiAqL1xubGV0IG5lb25WaWV3OiBOZW9uVmlldztcblxuLyoqXG4gKiBJbml0aWFsaXplIE5lb25WaWV3LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdE5lb25WaWV3KHZpZXc6IE5lb25WaWV3KTogdm9pZCB7XG4gIG5lb25WaWV3ID0gdmlldztcbiAgR3JvdXBpbmcuaW5pdE5lb25WaWV3KHZpZXcpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBpbmNsaW5hdHVtIHBhcmFtZXRlciBvZiBhIG5ldW1lIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc2V0SW5jbGluYXR1bUFjdGlvbihpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYUFjdGlvbihpZDogc3RyaW5nKTogU2V0QWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246ICdzZXQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgYXR0clR5cGU6ICd0aWx0JyxcbiAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIG5ldW1lIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIEFuIGFjdGlvbiB0aGF0IHVuc2V0cyB0aGUgcmV2ZXJzZWQgdmlyZ2EgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKGlkOiBzdHJpbmcpOiBTZXRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldCcsXG4gICAgcGFyYW06IHtcbiAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2Nsb2Nrd2lzZSBwYXJhbWV0ZXIgb2YgYSBuZXVtZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24oaWQ6IHN0cmluZyk6IFNldEFjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgYWN0aW9uOiAnc2V0JyxcbiAgICBwYXJhbToge1xuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGF0dHJUeXBlOiAnY3VydmUnLFxuICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgbmV1bWUgY29tcG9uZW50LlxuICogQHJldHVybnMgQW4gYWN0aW9uIHRoYXQgdW5zZXRzIHRoZSBsaXF1ZXNjZW50X2FudGljbG9ja3dpc2UgcGFyYW1ldGVyIG9mIGEgbmV1bWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZUFjdGlvbihcbiAgaWQ6IHN0cmluZyxcbik6IFNldExpcXVlc2NlbnRBY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NldExpcXVlc2NlbnQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgY3VydmU6ICcnLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBFdmVudCBoYW5kbGVyIGZvciBkZWxldGUgYnV0dG9uIHByZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUJ1dHRvbkhhbmRsZXIoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIGlmIChldnQua2V5ID09PSAnZCcgfHwgZXZ0LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcbiAgICByZW1vdmVIYW5kbGVyKCk7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmQgdGhlIGV4dHJhIG9wdGlvbnMgbWVudS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgaWYgKG1vcmVFZGl0KSB7XG4gICAgbW9yZUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgfVxuICBpZiAoZXh0cmFFZGl0KSB7XG4gICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgIGV4dHJhRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSByZW1vdmluZyBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcigpOiB2b2lkIHtcbiAgY29uc3QgdG9SZW1vdmU6IFJlbW92ZUFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2FjY2lkJykpIHtcbiAgICAgIGVsZW0gPSBlbGVtLmNsb3Nlc3QoJy5hY2NpZCcpO1xuICAgIH1cbiAgICBpZiAoZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSkge1xuICAgICAgZWxlbSA9IGVsZW0uY2xvc2VzdCgnLmRpdkxpbmUnKTtcbiAgICB9XG4gICAgdG9SZW1vdmUucHVzaCh7XG4gICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvUmVtb3ZlLFxuICB9O1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIG5lb25WaWV3LmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIHJlLWFzc29jaWF0aW5nIGVsZW1lbnRzIHRvIHRoZSBuZWFyZXN0IHN0YWZmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VTdGFmZkhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvQ2hhbmdlOiBDaGFuZ2VTdGFmZkFjdGlvbltdID0gW107XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIHRvQ2hhbmdlLnB1c2goe1xuICAgICAgYWN0aW9uOiAnY2hhbmdlU3RhZmYnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b0NoYW5nZSxcbiAgfTtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBuZW9uVmlldy5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKCkgPT4ge1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnNlcnRpbmcgZGl2aXNpbyBvciBhY2NpZGVudGFsIGludG8gbmVhcmVzdCBzeWxsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHRvSW5zZXJ0OiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICB0b0luc2VydC5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ2luc2VydFRvU3lsbGFibGUnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGNoYWluQWN0aW9uOiBDaGFpbkFjdGlvbiA9IHtcbiAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgcGFyYW06IHRvSW5zZXJ0LFxuICB9O1xuICBuZW9uVmlld1xuICAgIC5lZGl0KGNoYWluQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0luc2VydCBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignSW5zZXJ0IEZhaWxlZCBYb1gnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gaGFuZGxlIG1vdmluZyBkaXZpc2lvIG9yIGFjY2lkZW50YWwgb3V0IG9mIHN5bGxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlT3V0c2lkZVN5bGxhYmxlSGFuZGxlcigpOiB2b2lkIHtcbiAgY29uc3QgdG9Nb3ZlOiBFZGl0b3JBY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSk7XG4gIHNlbGVjdGVkLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICB0b01vdmUucHVzaCh7XG4gICAgICBhY3Rpb246ICdtb3ZlT3V0c2lkZVN5bGxhYmxlJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbS5pZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgIHBhcmFtOiB0b01vdmUsXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTW92ZSBGYWlsZWQgWG9YJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIG1hdGNoIGJib3ggaGVpZ2h0IHRvIHRoZSBzZWxlY3RlZCBiYm94XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEhlaWdodEhhbmRsZXIoKTogdm9pZCB7XG4gIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDEpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnQ2Fubm90IG1hdGNoIGhlaWdodCB0byBtdWx0aXBsZSBiYm94JyxcbiAgICAgICdlcnJvcicsXG4gICAgKTtcbiAgfVxuICBjb25zdCB0b0NoYW5nZTogTWF0Y2hIZWlnaHRBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWF0Y2hIZWlnaHQnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWQ6IHNlbGVjdGVkWzBdLmlkLFxuICAgIH0sXG4gIH07XG5cbiAgbmVvblZpZXcuZWRpdCh0b0NoYW5nZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0hlaWdodCBNYXRjaCBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdIZWlnaHQgTWF0Y2ggRmFpbGVkIFhvWCcsICdlcnJvcicpO1xuICAgIH1cbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgQWRkIFN5bCBUZXh0IG1vZGFsIHdpbmRvdyB3aXRoIFVJIGZvciBlbnRlcmluZyBzeWxsYWJsZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBvcGVuQWRkU3lsV2luZG93KCk6IHZvaWQge1xuICAvLyBnZW5lcmF0ZSBtb2RhbCB3aW5kb3dcbiAgY29uc3QgbW9kYWxXaW5kb3cgPSBuZW9uVmlldy5tb2RhbDtcbiAgbW9kYWxXaW5kb3cuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5BRERfVEVYVCk7XG4gIG1vZGFsV2luZG93Lm9wZW5Nb2RhbFdpbmRvdygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWRkU3lsTGlzdGVuZXIoKTogdm9pZCB7XG4gIGNvbnN0IGFkZFN5bCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRTeWwnKTtcbiAgYWRkU3lsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5BZGRTeWxXaW5kb3cpO1xuICBhZGRTeWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkFkZFN5bFdpbmRvdyk7XG59XG5cbmZ1bmN0aW9uIGFkZERlbGV0ZUxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBkZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlJyk7XG5cbiAgaWYgKGRlbCkge1xuICAgIGRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICAgIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuXG4gICAgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgb3V0c2lkZSB0aGUgaWYgY29uZGl0aW9uP1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRlbGV0ZUJ1dHRvbkhhbmRsZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk6IHZvaWQge1xuICBjb25zdCBjaGFuZ2VTdGFmZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFuZ2VTdGFmZicpO1xuICBjaGFuZ2VTdGFmZj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xuICBjaGFuZ2VTdGFmZj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFuZ2VTdGFmZkhhbmRsZXIpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgaW5wdXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29sdW1uSW5mbygpOiB2b2lkIHtcbiAgY29uc3QgY29sSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgY29uc3Qgc3RhdmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmLnNlbGVjdGVkJyk7XG4gIGxldCBjb2xJbmZvOiBudW1iZXI7XG4gIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgY29uc3QgaGFzQ29sdW1uID0gQXJyYXkuZnJvbShzdGFmZi5jbGFzc0xpc3QpXG4gICAgICAuam9pbignICcpXG4gICAgICAubWF0Y2goL1xcYmNvbHVtbihcXGQrKVxcYi8pO1xuICAgIGlmIChoYXNDb2x1bW4pIHtcbiAgICAgIGNvbnN0IHN0YWZmQ29sID0gcGFyc2VJbnQoaGFzQ29sdW1uWzFdLCAxMCk7XG4gICAgICBpZiAoY29sSW5mbyAmJiBjb2xJbmZvICE9IHN0YWZmQ29sKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLXdhcm5pbmcnKTtcbiAgICAgICAgd2FybmluZy5pbm5lclRleHQgPSAnVGhlIHNlbGVjdGVkIHN0YXZlcyBhcmUgbm90IG9mIHRoZSBzYW1lIGNvbHVtbiEnO1xuICAgICAgICBjb2xJbmZvID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xJbmZvID0gc3RhZmZDb2w7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb2xJbmZvKSBjb2xJbnB1dC52YWx1ZSA9IGNvbEluZm8udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBBZGQgY29sdW1uIGluZm8gZWRpdCBoYW5kbGVyIGZvciBjb2x1bW4gaW5mbyBlZGl0b3JcbiAqL1xuZnVuY3Rpb24gYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk6IHZvaWQge1xuICBjb25zdCBkZWNyZW1lbnRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAnY29sLWRlY3JlbWVudCcsXG4gICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGluY3JlbWVudEJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICdjb2wtaW5jcmVtZW50JyxcbiAgKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICdjb2wtY29uZmlybScsXG4gICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIGNvbnN0IGNvbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbC1pbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgZGVjcmVtZW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZU51bWJlcigtMSk7XG4gIH0pO1xuXG4gIGluY3JlbWVudEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVOdW1iZXIoMSk7XG4gIH0pO1xuXG4gIC8vIEFkZCBjb2x1bW4gaW5mbyBlZGl0IGhhbmRsZXJcbiAgY29uZmlybUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b1NldENvbHVtbjogRWRpdG9yQWN0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzdGF2ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhZmYuc2VsZWN0ZWQnKTtcbiAgICBzdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICAgIHRvU2V0Q29sdW1uLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3RhZmYuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICd0eXBlJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICdjb2x1bW4nICsgY29sSW5wdXQudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBjaGFpbkFjdGlvbjogQ2hhaW5BY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgICBwYXJhbTogdG9TZXRDb2x1bW4sXG4gICAgfTtcbiAgICBuZW9uVmlld1xuICAgICAgLmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdDb2x1bW4gVmFsdWUgVXBkYXRlIFN1Y2Nlc3MnLFxuICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ0NvbHVtbiBWYWx1ZSBVcGRhdGUgRmFpbGVkIFhvWCcsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZU51bWJlcihjaGFuZ2U6IG51bWJlcikge1xuICAgIGNvbnN0IG1pbk51bSA9IDE7XG4gICAgY29uc3QgbWF4TnVtID0gNTtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gcGFyc2VJbnQoY29sSW5wdXQudmFsdWUsIDEwKSB8fCAwO1xuICAgIGN1cnJlbnRWYWx1ZSArPSBjaGFuZ2U7XG5cbiAgICBjdXJyZW50VmFsdWUgPSBNYXRoLm1pbihNYXRoLm1heChjdXJyZW50VmFsdWUsIG1pbk51bSksIG1heE51bSk7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS50b1N0cmluZygpICE9IGNvbElucHV0LnZhbHVlKVxuICAgICAgY29uZmlybUJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgY29sSW5wdXQudmFsdWUgPSBjdXJyZW50VmFsdWUudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHNldCB0aGUgSFRNTCBjb250ZW50IG9mIGVkaXQgY29udHJvbHM6IGVpdGhlciAjbW9yZUVkaXQgb3IgI2V4dHJhRWRpdFxuICpcbiAqIEBwYXJhbSB7J21vcmVFZGl0JyB8ICdleHRyYUVkaXQnfSBlZGl0VHlwZSAtIFRoZSB0eXBlIG9mIGVkaXQgY29udHJvbHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50cyAtIFRoZSBpbm5lckhUTUwgY29udGVudHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVwbGFjZSAtIElzIHRoZSBpbm5lckhUTUwgYmVpbmcgcmVwbGFjZWQsIG9yIGJlaW5nIGFkZGVkIHRvP1xuICovXG5mdW5jdGlvbiBzZXRFZGl0Q29udHJvbHMoXG4gIGVkaXRUeXBlOiAnbW9yZUVkaXQnIHwgJ2V4dHJhRWRpdCcsXG4gIGNvbnRlbnRzOiBzdHJpbmcsXG4gIHJlcGxhY2UgPSB0cnVlLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0VHlwZSk7XG5cbiAgaWYgKGVkaXQpIHtcbiAgICBlZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgaWYgKHJlcGxhY2UpIGVkaXQuaW5uZXJIVE1MID0gY29udGVudHM7XG4gICAgZWxzZSBlZGl0LmlubmVySFRNTCArPSBjb250ZW50cztcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgdGhlIGV4dHJhIG5jIGFjdGlvbiBtZW51IGZvciBhIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOY0FjdGlvbnMobmM6IFNWR0dyYXBoaWNzRWxlbWVudCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG5cbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLmRlZmF1bHRBY3Rpb25Db250ZW50cyk7XG4gIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMubmNBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1B1bmN0dW0uZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRJbmNsaW5hdHVtID0gdW5zZXRJbmNsaW5hdHVtQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2EgPSB1bnNldFZpcmdhQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNJbmNsaW5hdHVtLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2EgPSB1bnNldFZpcmdhQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0VmlyZ2FSZXZlcnNlZCA9IHVuc2V0VmlyZ2FSZXZlcnNlZEFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNldEluY2xpbmF0dW06IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAndGlsdCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnc2UnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2EsXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2FSZXZlcnNlZCxcbiAgICAgICAgICAgICAgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgICBzZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjVmlyZ2EuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0SW5jbGluYXR1bSA9IHVuc2V0SW5jbGluYXR1bUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2VBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2VBY3Rpb24oXG4gICAgICAgIG5jLmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNldFZpcmdhOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3MnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0VmlyZ2FSZXZlcnNlZCxcbiAgICAgICAgICAgICAgdW5zZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldFZpcmdhLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjVmlyZ2FSZXZlcnNlZC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlID0gdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKFxuICAgICAgICBuYy5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXRWaXJnYVJldmVyc2VkOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3RpbHQnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ24nLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRMaXF1ZXNjZW50Q2xvY2t3aXNlLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgICBzZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjTGlxdWVzY2VudENsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UgPSB1bnNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlQWN0aW9uKFxuICAgICAgICBuYy5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50Q2xvY2t3aXNlOiBTZXRMaXF1ZXNjZW50QWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXRMaXF1ZXNjZW50JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IG5jLmlkLFxuICAgICAgICAgIGN1cnZlOiAnYycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgbmVvblZpZXdcbiAgICAgICAgLmVkaXQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgICAgICAgICAgcGFyYW06IFtcbiAgICAgICAgICAgICAgdW5zZXRJbmNsaW5hdHVtLFxuICAgICAgICAgICAgICB1bnNldFZpcmdhLFxuICAgICAgICAgICAgICB1bnNldFZpcmdhUmV2ZXJzZWQsXG4gICAgICAgICAgICAgIHVuc2V0TGlxdWVzY2VudEFudGljbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZS5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnNldEluY2xpbmF0dW0gPSB1bnNldEluY2xpbmF0dW1BY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYSA9IHVuc2V0VmlyZ2FBY3Rpb24obmMuaWQpO1xuICAgICAgY29uc3QgdW5zZXRWaXJnYVJldmVyc2VkID0gdW5zZXRWaXJnYVJldmVyc2VkQWN0aW9uKG5jLmlkKTtcbiAgICAgIGNvbnN0IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZSA9IHVuc2V0TGlxdWVzY2VudENsb2Nrd2lzZUFjdGlvbihuYy5pZCk7XG4gICAgICBjb25zdCBzZXRMaXF1ZXNjZW50QW50aWNsb2Nrd2lzZTogU2V0TGlxdWVzY2VudEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0TGlxdWVzY2VudCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBuYy5pZCxcbiAgICAgICAgICBjdXJ2ZTogJ2EnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3XG4gICAgICAgIC5lZGl0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICAgIHBhcmFtOiBbXG4gICAgICAgICAgICAgIHVuc2V0SW5jbGluYXR1bSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYSxcbiAgICAgICAgICAgICAgdW5zZXRWaXJnYVJldmVyc2VkLFxuICAgICAgICAgICAgICB1bnNldExpcXVlc2NlbnRDbG9ja3dpc2UsXG4gICAgICAgICAgICAgIHNldExpcXVlc2NlbnRBbnRpY2xvY2t3aXNlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2VkJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdTaGFwZSBDaGFuZ2UgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgbmV1bWUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJOZXVtZUFjdGlvbnMoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdE5ldW1lQWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLm5ldW1lQWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGNvbnN0IG5ldW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJyk7XG4gIGlmIChuZXVtZS5sZW5ndGggIT09IDEpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnTW9yZSB0aGFuIG9uZSBuZXVtZSBzZWxlY3RlZCEgQ2Fubm90IHRyaWdnZXIgTmV1bWUgQ2xpY2tTZWxlY3QgYWN0aW9ucy4nLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVE9ETyBhZGQgdHJpZ2dlciBmb3Igc3BsaXQgYWN0aW9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdC1uZXVtZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IG5ldW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ldW1lLnNlbGVjdGVkJykgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgaWYgKG5ldW1lICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IG5ldyBTcGxpdE5ldW1lSGFuZGxlcihuZW9uVmlldywgbmV1bWUpO1xuICAgICAgc3BsaXQuc3RhcnRTcGxpdCgpO1xuICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBzdGFmZiB3YXMgc2VsZWN0ZWQhJyk7XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjUGVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNQZXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDbGl2aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1NjYW5kaWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjU2NhbmRpY3VzRmxleHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNTY2FuZGljdXNTdWJwdW5jdGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDbGltYWN1cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2xpbWFjdXNSZXN1cGludXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1RvcmN1bHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNUb3JjdWx1c1Jlc3VwaW51cy5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91ckJ5VmFsdWUoXG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQsXG4gICAgICApO1xuICAgICAgdHJpZ2dlckNoYW5nZUdyb3VwKGNvbnRvdXIpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjUG9ycmVjdHVzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCBjb250b3VyID0gbmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZCxcbiAgICAgICk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNQb3JyZWN0dXNGbGV4dXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1BvcnJlY3R1c1N1YnB1bmN0aXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI1ByZXNzdXMuZHJvcGRvd24taXRlbScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRvdXIgPSBuZW9uVmlldy5pbmZvLmdldENvbnRvdXJCeVZhbHVlKFxuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmlkLFxuICAgICAgKTtcbiAgICAgIHRyaWdnZXJDaGFuZ2VHcm91cChjb250b3VyKTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlR3JvdXAoY29udG91cjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlR3JvdXBpbmdBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYW5nZUdyb3VwJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogbmV1bWVbMF0uaWQsXG4gICAgICAgIGNvbnRvdXI6IGNvbnRvdXIsXG4gICAgICB9LFxuICAgIH07XG4gICAgbmVvblZpZXdcbiAgICAgIC5lZGl0KGNoYW5nZUdyb3VwaW5nQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3lsbGFibGUgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJTeWxsYWJsZUFjdGlvbnMoc2VsZWN0aW9uVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3lsbGFibGVBY3Rpb25zQ29udGVudCk7XG4gIC8vIGluaXRpYWxpemUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgaHRtbCB0byBiZSBhZGRlZCB0byBEaXNwbGF5IHBhbmVsXG4gIGxldCBleHRyYUFjdGlvbnNIVE1MID0gJyc7XG5cbiAgLy8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiB0aGF0IHdhcyBtYWRlIGJ5IHRoZSB1c2VyXG4gIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgIC8vIG9ubHkgb25lIHN5bGxhYmxlIGFuZCBzeWxsYWJsZSBoYXMgbm8gPHN5bD5cbiAgICBjYXNlICdub1N5bCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwiYWRkU3lsXCI+QWRkIFN5bGxhYmxlIFRleHQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyBvbmx5IG9uZSBzeWxsYWJsZVxuICAgIGNhc2UgJ3NpbmdsZVNlbGVjdCc6XG4gICAgICBleHRyYUFjdGlvbnNIVE1MICs9IGA8ZGl2IGNsYXNzPVwicmlnaHQtc2lkZS1wYW5lbC1idG5zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0blwiIGlkPVwidW5ncm91cE5ldW1lc1wiPlVuZ3JvdXA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyB0d28gc3lsbGFibGVzIG9uIHNlcGFyYXRlIHN0YXZlc1xuICAgIGNhc2UgJ2xpbmthYmxlU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ0b2dnbGUtbGlua1wiPlRvZ2dsZSBMaW5rZWQgU3lsbGFibGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJjaGFuZ2VTdGFmZlwiPlJlLWFzc29jaWF0ZSB0byBuZWFyZXN0IHN0YWZmPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkZWxldGVcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gdG93IG9yIG1vcmUgc3lsbGFibGVzIG9uIG9uZSBzdGFmZlxuICAgIGNhc2UgJ211bHRpU2VsZWN0JzpcbiAgICAgIGV4dHJhQWN0aW9uc0hUTUwgKz0gYDxkaXYgY2xhc3M9XCJyaWdodC1zaWRlLXBhbmVsLWJ0bnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJtZXJnZVN5bHNcIj5NZXJnZSBTeWxsYWJsZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG5cbiAgICAvL2RlZmF1bHQgb3B0aW9uc1xuICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgZXh0cmFBY3Rpb25zSFRNTCArPSBgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUtcGFuZWwtYnRucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImNoYW5nZVN0YWZmXCI+UmUtYXNzb2NpYXRlIHRvIG5lYXJlc3Qgc3RhZmY8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cImRlbGV0ZVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBzZXQgY29udGVudCBvZiBhZGRpdGlvbmFsIGFjdGlvbnMgaW4gRGlzcGxheSBwYW5lbFxuICAvLyBhbmQgaW5pdGlhbGl6ZSBuZWNlc3NhcnkgbGlzdGVuZXJzXG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBleHRyYUFjdGlvbnNIVE1MLCB0cnVlKTtcbiAgYWRkQ2hhbmdlU3RhZmZMaXN0ZW5lcigpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBHcm91cGluZy5pbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGV4dHJhIGxheWVyIGVsZW1lbnQgKGFjY2lkLCBkaXZMaW5lLCBjdXN0b3MsIGNsZWYpIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyTGF5ZXJFbGVtZW50QWN0aW9ucyhlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnY3VzdG9zJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuY3VzdG9zQWN0aW9uQ29udGVudHMpO1xuICAgIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFyZW50SXNTeWxsYWJsZSA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJyk7XG4gIGNvbnN0IGxheWVyRWxlbWVudEFjdGlvbnMgPSBwYXJlbnRJc1N5bGxhYmxlXG4gICAgPyBDb250ZW50cy5sYXllckVsZW1lbnRJbkFjdGlvbkNvbnRlbnRzXG4gICAgOiBDb250ZW50cy5sYXllckVsZW1lbnRPdXRBY3Rpb25Db250ZW50cztcblxuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgbGF5ZXJFbGVtZW50QWN0aW9ucywgZmFsc2UpO1xuXG4gIC8vIGV4dHJhIGFjdGlvbnMgZm9yIGFjY2lkIGFuZCBkaXZMaW5lXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYWNjaWQnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuYWNjaWRBY3Rpb25Db250ZW50cyk7XG4gICAgYWNjaWRPcHRpb25zTGlzdGVuZXIoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKSkge1xuICAgIHNldEVkaXRDb250cm9scygnZXh0cmFFZGl0JywgQ29udGVudHMuY2xlZkFjdGlvbkNvbnRlbnRzKTtcbiAgICBjbGVmT3B0aW9uc0xpc3RlbmVyKGVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXZMaW5lJykpIHtcbiAgICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmRpdkxpbmVBY3Rpb25Db250ZW50cyk7XG4gICAgZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50KTtcbiAgfVxuICBhZGRDaGFuZ2VTdGFmZkxpc3RlbmVyKCk7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdpbnNlcnRUb1N5bGxhYmxlJylcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaW5zZXJ0VG9TeWxsYWJsZUhhbmRsZXIpO1xuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZCgnbW92ZU91dHNpZGVTeWxsYWJsZScpXG4gICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdmVPdXRzaWRlU3lsbGFibGVIYW5kbGVyKTtcblxuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuXG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydFRvU3lsbGFibGUnKVxuICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnNlcnRUb1N5bGxhYmxlSGFuZGxlcik7XG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdtb3ZlT3V0c2lkZVN5bGxhYmxlJylcbiAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbW92ZU91dHNpZGVTeWxsYWJsZUhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBhY2NpZE9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvRmxhdC5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VUb0ZsYXQ6IFNldEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgYXR0clR5cGU6ICdhY2NpZCcsXG4gICAgICAgICAgYXR0clZhbHVlOiAnZicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihjaGFuZ2VUb0ZsYXQpO1xuICAgIH0pO1xuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9OYXR1cmFsLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZVRvTmF0dXJhbDogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2FjY2lkJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICduJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKGNoYW5nZVRvTmF0dXJhbCk7XG4gICAgfSk7XG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuZnVuY3Rpb24gY2xlZk9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2luY3JlbWVudC1vY3RhdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBpbmNyZW1lbnRPY3RhdmU6IERpc3BsYWNlQ2xlZk9jdGF2ZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2Rpc3BsYWNlQ2xlZk9jdGF2ZScsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGRpcmVjdGlvbjogJ2Fib3ZlJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIG5lb25WaWV3XG4gICAgICAuZWRpdChpbmNyZW1lbnRPY3RhdmUsIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignQ2xlZiBvY3RhdmUgaW5jcmVtZW50ZWQuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnTWF4aW11bSBvY3RhdmUgZGlzcGxhY2VtZW50IHJlYWNoZWQuIENsZWYgY2FuIG9ubHkgYmUgZGlzcGxhY2VkIHVwIHRvIDMgb2N0YXZlcy4nLFxuICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVjcmVtZW50LW9jdGF2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IGluY3JlbWVudE9jdGF2ZTogRGlzcGxhY2VDbGVmT2N0YXZlQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnZGlzcGxhY2VDbGVmT2N0YXZlJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZGlyZWN0aW9uOiAnYmVsb3cnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgbmVvblZpZXdcbiAgICAgIC5lZGl0KGluY3JlbWVudE9jdGF2ZSwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdDbGVmIG9jdGF2ZSBkZWNyZW1lbnRlZC4nLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdNYXhpbXVtIG9jdGF2ZSBkaXNwbGFjZW1lbnQgcmVhY2hlZC4gQ2xlZiBjYW4gb25seSBiZSBkaXNwbGFjZWQgdXAgdG8gMyBvY3RhdmVzLicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNDQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRDQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnQycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRDQ2xlZik7XG4gICAgfSk7XG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoJyNGQ2xlZi5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRGQ2xlZjogU2V0Q2xlZkFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAnc2V0Q2xlZicsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIHNoYXBlOiAnRicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcGFyc2VTaGFwZUNoYW5nZUFjdGlvbihzZXRGQ2xlZik7XG4gICAgfSk7XG5cbiAgaW5pdE9wdGlvbnNMaXN0ZW5lcnMoKTtcbn1cblxuZnVuY3Rpb24gZGl2TGluZU9wdGlvbnNMaXN0ZW5lcihlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQpOiB2b2lkIHtcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWluaW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWluaW1hOiBTZXRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWluaW1hJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvTWluaW1hKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9NYWlvci5kcm9wZG93bi1pdGVtJylcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBDaGFuZ2VUb01haW9yOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWFpb3InLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9NYWlvcik7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcignI0NoYW5nZVRvTWF4aW1hLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvTWF4aW1hOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICAgIGF0dHJUeXBlOiAnZm9ybScsXG4gICAgICAgICAgYXR0clZhbHVlOiAnbWF4aW1hJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKENoYW5nZVRvTWF4aW1hKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9GaW5hbGlzLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvRmluYWxpczogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ2ZpbmFsaXMnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9GaW5hbGlzKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9DYWVzdXJhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvQ2Flc3VyYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ2NhZXN1cmEnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9DYWVzdXJhKTtcbiAgICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKCcjQ2hhbmdlVG9WaXJndWxhLmRyb3Bkb3duLWl0ZW0nKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IENoYW5nZVRvVmlyZ3VsYTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2Zvcm0nLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJ3Zpcmd1bGEnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHBhcnNlU2hhcGVDaGFuZ2VBY3Rpb24oQ2hhbmdlVG9WaXJndWxhKTtcbiAgICB9KTtcblxuICBpbml0T3B0aW9uc0xpc3RlbmVycygpO1xufVxuXG4vKipcbiAqIFBhcnNlIGFjdGlvbnMgcmVnYXJkaW5nIHNoYXBlIGNoYW5nZXMgdG8gZWRpdG9yIGFjdGlvblxuICovXG5mdW5jdGlvbiBwYXJzZVNoYXBlQ2hhbmdlQWN0aW9uKGFjdGlvbjogU2V0QWN0aW9uIHwgU2V0Q2xlZkFjdGlvbikge1xuICBuZW9uVmlldy5lZGl0KGFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZWQnLCAnc3VjY2VzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NoYXBlIENoYW5nZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICB9XG4gICAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZXh0cmEgc3RhZmYgYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJNdWx0aVN0YWZmQWN0aW9ucygpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuc3RhZmZNZXJnZUFjdGlvbkNvbnRlbnRzKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdleHRyYUVkaXQnLCBDb250ZW50cy5jb2x1bW5BY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG5cbiAgLy8gQ29sdW1uIGluZm8gZWRpdG9yXG4gIHVwZGF0ZUNvbHVtbkluZm8oKTtcbiAgYWRkQ29sdW1uSW5mb1N0ZXBIYW5kbGVyKCk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lcmdlLXN5c3RlbXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBHcm91cGluZy5tZXJnZVN0YXZlcygpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFbnRlciBzdGFmZiBzcGxpdHRpbmcgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlclN0YWZmU3BsaXRNb2RlKCk6IHZvaWQge1xuICBjb25zdCBzdGFmZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdGFmZi5zZWxlY3RlZCcpIGFzIFNWR0dFbGVtZW50O1xuICBpZiAoc3RhZmYgIT09IG51bGwpIHtcbiAgICBjb25zdCBzcGxpdCA9IG5ldyBTcGxpdFN0YWZmSGFuZGxlcihuZW9uVmlldywgc3RhZmYpO1xuICAgIHNwbGl0LnN0YXJ0U3BsaXQoKTtcbiAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkIScpO1xuICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyaWdnZXIgc3BsaXQgc3RhZmYgb3B0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyU2luZ2xlU3RhZmZBY3Rpb25zKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5zdGFmZlNwbGl0QWN0aW9uQ29udGVudHMpO1xuICBzZXRFZGl0Q29udHJvbHMoJ2V4dHJhRWRpdCcsIENvbnRlbnRzLmNvbHVtbkFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcblxuICAvLyBDb2x1bW4gaW5mbyBlZGl0b3JcbiAgdXBkYXRlQ29sdW1uSW5mbygpO1xuICBhZGRDb2x1bW5JbmZvU3RlcEhhbmRsZXIoKTtcblxuICAvLyBBZGQgdHJpZ2dlciBmb3Igc3BsaXQgYWN0aW9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdC1zeXN0ZW0nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB0cmlnZ2VyU3RhZmZTcGxpdE1vZGUoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXJvdGF0ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWZmID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN0YWZmLnNlbGVjdGVkJykgYXMgU1ZHRWxlbWVudDtcbiAgICAvLyBVbnVzZWQgdmFyaWFibGVzOlxuICAgIC8vIGNvbnN0IHJlY3QgPSBzdGFmZi5xdWVyeVNlbGVjdG9yKCcjcmVzaXplUmVjdCcpO1xuICAgIC8vIGNvbnN0IGNvID0gcmVjdC5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpLnNwbGl0KCcgJyk7XG4gICAgLy8gY29uc3QgZHkgPSBwYXJzZUludChjb1swXS5zcGxpdCgnLCcpWzFdKSAtIHBhcnNlSW50KGNvWzFdLnNwbGl0KCcsJylbMV0pO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldFN0YWZmQkJveChzdGFmZiBhcyBTVkdHRWxlbWVudCk7XG4gICAgY29uc3QgeV9jaGFuZ2UgPSBNYXRoLnRhbihwb2ludHMucm90YXRlKSAqIChwb2ludHMubHJ4IC0gcG9pbnRzLnVseCk7XG4gICAgaWYgKHN0YWZmICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplUm90YXRlJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IHN0YWZmLmlkLFxuICAgICAgICAgIHVseDogcG9pbnRzLnVseCxcbiAgICAgICAgICB1bHk6XG4gICAgICAgICAgICBwb2ludHMucm90YXRlID4gMFxuICAgICAgICAgICAgICA/IHBvaW50cy51bHkgKyB5X2NoYW5nZSAvIDJcbiAgICAgICAgICAgICAgOiBwb2ludHMudWx5IC0geV9jaGFuZ2UgLyAyLFxuICAgICAgICAgIGxyeDogcG9pbnRzLmxyeCxcbiAgICAgICAgICBscnk6XG4gICAgICAgICAgICBwb2ludHMucm90YXRlID4gMFxuICAgICAgICAgICAgICA/IHBvaW50cy5scnkgLSB5X2NoYW5nZSAvIDJcbiAgICAgICAgICAgICAgOiBwb2ludHMubHJ5ICsgeV9jaGFuZ2UgLyAyLFxuICAgICAgICAgIHJvdGF0ZTogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBuZW9uVmlld1xuICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignTm8gc3RhZmYgd2FzIHNlbGVjdGVkJyk7XG4gICAgICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGJib3ggb3B0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckJCb3hBY3Rpb25zKCk6IHZvaWQge1xuICBlbmRPcHRpb25zU2VsZWN0aW9uKCk7XG4gIHNldEVkaXRDb250cm9scygnbW9yZUVkaXQnLCBDb250ZW50cy5iYm94QWN0aW9uQ29udGVudHMpO1xuICBhZGREZWxldGVMaXN0ZW5lcigpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWF0Y2hIZWlnaHQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtYXRjaEhlaWdodEhhbmRsZXIoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBkZWZhdWx0IGFjdGlvbnMgd2hlbiBzZWxlY3RpbmcgYnkgc3lsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdFN5bEFjdGlvbnMoKTogdm9pZCB7XG4gIGVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgc2V0RWRpdENvbnRyb2xzKCdtb3JlRWRpdCcsIENvbnRlbnRzLmRlZmF1bHRTeWxBY3Rpb25Db250ZW50cyk7XG4gIGFkZERlbGV0ZUxpc3RlbmVyKCk7XG4gIGFkZENoYW5nZVN0YWZmTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGRlZmF1bHQgc2VsZWN0aW9uIG9wdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJEZWZhdWx0QWN0aW9ucygpOiB2b2lkIHtcbiAgZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICBzZXRFZGl0Q29udHJvbHMoJ21vcmVFZGl0JywgQ29udGVudHMuZGVmYXVsdEFjdGlvbkNvbnRlbnRzKTtcbiAgYWRkRGVsZXRlTGlzdGVuZXIoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGV4dHJhIGRyb3Bkb3duIG9wdGlvbnM6XG4gKiBMaXN0ZW4gdG8gY2xpY2tzIG9uIGRyb3Bkb3duc1xuICovXG5mdW5jdGlvbiBpbml0T3B0aW9uc0xpc3RlbmVycygpOiB2b2lkIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bfc2VsZWN0JykuZm9yRWFjaCgoZHJvcCkgPT4ge1xuICAgIC8vIFdoZW4gYW55dGhpbmcgdGhhdCBpcyBub3QgdGhlIGRyb3Bkb3duIGlzIGNsaWNrZWQgYXdheSwgdGhlIGRyb3Bkb3duXG4gICAgLy8gc2hvdWxkIGxvc2UgaXRzIHZpc2liaWxpdHlcbiAgICBjb25zdCBvcHRpb25zQ2xpY2thd2F5ID0gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9wdGlvbnNDbGlja2F3YXkpO1xuICAgICAgZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICB9O1xuXG4gICAgZHJvcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldnQpID0+IHtcbiAgICAgIC8vIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGRyb3Bkb3duXG4gICAgICBkcm9wLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAvLyBSZW1vdmUgdmlzaWJpbGl0eSBvZiBvdGhlciBkcm9wZG93bnMgd2hlbiB0aGlzIG9uZSBpcyBjbGlja2VkXG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wX3NlbGVjdCcpKVxuICAgICAgICAuZmlsdGVyKChvdGhlcikgPT4gb3RoZXIgIT09IGRyb3ApXG4gICAgICAgIC5mb3JFYWNoKChvdGhlcikgPT4gb3RoZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJykpO1xuXG4gICAgICAvLyBEb24ndCBhbGxvdyBvdGhlciBldmVudCBsaXN0ZW5lcnMgb24gdGhlIGJvZHkgdG8gaW50ZXJmZXJlIHdpdGggdGhpcyBsaXN0ZW5lclxuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoZHJvcC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uc0NsaWNrYXdheSk7XG4gICAgICBlbHNlIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25zQ2xpY2thd2F5KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBnZXRTdGFmZkJCb3ggfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuZXhwb3J0IGludGVyZmFjZSBQb2ludCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJCb3gge1xuICB1bHg6IG51bWJlcjtcbiAgdWx5OiBudW1iZXI7XG4gIGxyeDogbnVtYmVyO1xuICBscnk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgU1ZHIHJlbGF0aXZlIGNvb3JkaW5hdGVzIGdpdmVuIGNsaWVudFggYW5kIGNsaWVudFlcbiAqIFNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjkyNjEzMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNWR1JlbENvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBQb2ludCB7XG4gIGNvbnN0IHB0ID0gbmV3IERPTVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPFNWR1NWR0VsZW1lbnQ+KCcuYWN0aXZlLXBhZ2UgPiAuZGVmaW5pdGlvbi1zY2FsZScpO1xuICBjb25zdCBwYWdlTWFyZ2luID0gc3ZnLnF1ZXJ5U2VsZWN0b3I8U1ZHR0VsZW1lbnQ+KCcucGFnZS1tYXJnaW4nKTtcblxuICBjb25zdCB7IHgsIHkgfSA9IHB0Lm1hdHJpeFRyYW5zZm9ybShwYWdlTWFyZ2luLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gIHJldHVybiB7IHgsIHkgfTtcblxuICAvLyBJZiB0aGVyZSBpcyBzb21lIGlzc3VlIHdpdGggY29vcmRpbmF0ZXMsIHRoaXMgbWF5IGZpeCB0aGUgaXNzdWU6XG4gIC8vIGNvbnN0IHN2ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHU1ZHRWxlbWVudD4oJyNzdmdfZ3JvdXAnKTtcbiAgLy8gY29uc3QgeyB4LCB5IH0gPSBwdC5tYXRyaXhUcmFuc2Zvcm0oc3ZnLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG59XG5cbi8qKlxuICogR2V0IElEIG9mIHN0YWZmIGJ5IGNsaWVudCdzIHgteSBjb29yZGluYXRlcy5cbiAqIFRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHRoZSAqdmlzdWFsKiBib3VuZGluZyBib3ggb2YgdGhlIHN0YWZmXG4gKiBiYXNlZCBvbiBpdHMgc3RhZmYgbGluZXMsIGluc3RlYWQgb2YgdGhlIFNWRyBlbGVtZW50IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmSWRCeUNvb3JkcyAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzdGF2ZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8U1ZHR0VsZW1lbnQ+KCcuc3RhZmYnKSk7XG4gIGNvbnN0IHN0YWZmQkJveGVzID0gc3RhdmVzLm1hcChzdGFmZiA9PiBnZXRTdGFmZkJCb3goc3RhZmYpKTtcblxuICAvLyBmaW5kIHRoZSBzdGFmZiB0aGF0IHRoZSBjdXJzb3IgaXMgaW5zaWRlXG4gIGNvbnN0IHsgeCwgeSB9ID0gZ2V0U1ZHUmVsQ29vcmRzKGNsaWVudFgsIGNsaWVudFkpO1xuICBjb25zdCBzdGFmZiA9IHN0YWZmQkJveGVzLmZpbmQoXG4gICAgKGJib3gpID0+IHggPD0gYmJveC5scnggJiYgeCA+PSBiYm94LnVseCAmJiB5IDw9IGJib3gubHJ5ICYmIHkgPj0gYmJveC51bHlcbiAgKTsgXG5cbiAgLy8gSWYgdGhlcmUgaXMgaXNzdWVzIHdpdGggZmluZGluZyB0aGUgc3RhZmYsIHRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGU6XG4gIC8vIHJldHVybiAocHQueCA+IHVseCAmJiBwdC54IDwgbHJ4KSAmJlxuICAvLyAgIChwdC55ID4gKHVseSArIChwdC54IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkpKSAmJlxuICAvLyAgIChwdC55IDwgKGxyeSAtIChscnggLSBwdC54KSAqIE1hdGgudGFuKHJvdGF0ZSkpKTtcblxuICAvLyBpZiB0aGUgY3Vyc29yIGlzIG5vdCBpbnNpZGUgYW55IHN0YWZmLCB0aGVuIGV4cGxpY2l0bHkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHN0YWZmID8gc3RhZmYuaWQgOiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBzdGFmZiBieSBjbGllbnQncyB4LXkgY29vcmRpbmF0ZXM7IHdyYXBwZXIgZm9yIGdldFN0YWZmSWRCeUNvb3JkcywgYnV0XG4gKiAgIHJldHVybnMgdGhlIGVsZW1lbnQsIG5vdCB0aGUgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YWZmQnlDb29yZHMgKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogU1ZHR0VsZW1lbnQgfCBudWxsIHtcbiAgY29uc3Qgc3RhZmZJZCA9IGdldFN0YWZmSWRCeUNvb3JkcyhjbGllbnRYLCBjbGllbnRZKTtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3N0YWZmSWR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc091dE9mU1ZHQm91bmRzICh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiZ0ltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8U1ZHSW1hZ2VFbGVtZW50PignI2JnaW1nJyk7XG4gIFxuICByZXR1cm4gKFxuICAgIHggPD0gMCB8fCB4ID49IE51bWJlcihiZ0ltZy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHx8XG4gICAgeSA8PSAwIHx8IHkgPj0gTnVtYmVyKGJnSW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IGJvdW5kaW5nIGJveCAobHJ4LCBscnksIHVseCwgdWx5KSBvZiBhIGdseXBoLCB3aGljaFxuICogaXMgYSA8dXNlPiBlbGVtZW50IGluIHRoZSBTVkdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdseXBoQkJveCAoZzogU1ZHUmVjdEVsZW1lbnQgfCBTVkdVc2VFbGVtZW50KTogQkJveCB7XG4gIGNvbnN0IHJlY3QgPSAoZy50YWdOYW1lID09ICdyZWN0JykgPyBnLmdldEJCb3goKSA6IChnLnBhcmVudE5vZGUgYXMgU1ZHR0VsZW1lbnQpLmdldEJCb3goKTtcblxuICByZXR1cm4ge1xuICAgIHVseDogcmVjdC54LFxuICAgIHVseTogcmVjdC55LFxuICAgIGxyeDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBscnk6IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cbiIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gTm9kZS9Db21tb25KU1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTURcbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAod2l0aCBzdXBwb3J0IGZvciB3ZWIgd29ya2VycylcbiAgICAgICAgdmFyIGdsb2I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdsb2IgPSB3aW5kb3c7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdsb2IgPSBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2xvYi5TcGFya01ENSA9IGZhY3RvcnkoKTtcbiAgICB9XG59KGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblxuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8qXG4gICAgICogRmFzdGVzdCBtZDUgaW1wbGVtZW50YXRpb24gYXJvdW5kIChKS00gbWQ1KS5cbiAgICAgKiBDcmVkaXRzOiBKb3NlcGggTXllcnNcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sXG4gICAgICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9tZDUtc2hvb3RvdXQvN1xuICAgICAqL1xuXG4gICAgLyogdGhpcyBmdW5jdGlvbiBpcyBtdWNoIGZhc3RlcixcbiAgICAgIHNvIGlmIHBvc3NpYmxlIHdlIHVzZSBpdC4gU29tZSBJRXNcbiAgICAgIGFyZSB0aGUgb25seSBvbmVzIEkga25vdyBvZiB0aGF0XG4gICAgICBuZWVkIHRoZSBpZGlvdGljIHNlY29uZCBmdW5jdGlvbixcbiAgICAgIGdlbmVyYXRlZCBieSBhbiBpZiBjbGF1c2UuICAqL1xuICAgIHZhciBhZGQzMiA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYSArIGIpICYgMHhGRkZGRkZGRjtcbiAgICB9LFxuICAgICAgICBoZXhfY2hyID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ107XG5cblxuICAgIGZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgICAgIGEgPSBhZGQzMihhZGQzMihhLCBxKSwgYWRkMzIoeCwgdCkpO1xuICAgICAgICByZXR1cm4gYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVjeWNsZSh4LCBrKSB7XG4gICAgICAgIHZhciBhID0geFswXSxcbiAgICAgICAgICAgIGIgPSB4WzFdLFxuICAgICAgICAgICAgYyA9IHhbMl0sXG4gICAgICAgICAgICBkID0geFszXTtcblxuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzBdIC0gNjgwODc2OTM2IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbMV0gLSAzODk1NjQ1ODYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbMl0gKyA2MDYxMDU4MTkgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbM10gLSAxMDQ0NTI1MzMwIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzRdIC0gMTc2NDE4ODk3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbNV0gKyAxMjAwMDgwNDI2IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzZdIC0gMTQ3MzIzMTM0MSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1s3XSAtIDQ1NzA1OTgzIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzhdICsgMTc3MDAzNTQxNiB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzldIC0gMTk1ODQxNDQxNyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxMF0gLSA0MjA2MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1sxMV0gLSAxOTkwNDA0MTYyIHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzEyXSArIDE4MDQ2MDM2ODIgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1sxM10gLSA0MDM0MTEwMSB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxNF0gLSAxNTAyMDAyMjkwIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzE1XSArIDEyMzY1MzUzMjkgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7XG5cbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxXSAtIDE2NTc5NjUxMCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzZdIC0gMTA2OTUwMTYzMiB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzExXSArIDY0MzcxNzcxMyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1swXSAtIDM3Mzg5NzMwMiB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1s1XSAtIDcwMTU1ODY5MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzEwXSArIDM4MDE2MDgzIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTVdIC0gNjYwNDc4MzM1IHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzRdIC0gNDA1NTM3ODQ4IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzldICsgNTY4NDQ2NDM4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTRdIC0gMTAxOTgwMzY5MCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzNdIC0gMTg3MzYzOTYxIHwgMDtcbiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwO1xuICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzhdICsgMTE2MzUzMTUwMSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxM10gLSAxNDQ0NjgxNDY3IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMl0gLSA1MTQwMzc4NCB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzddICsgMTczNTMyODQ3MyB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1sxMl0gLSAxOTI2NjA3NzM0IHwgMDtcbiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwO1xuXG4gICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzVdIC0gMzc4NTU4IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzhdIC0gMjAyMjU3NDQ2MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTFdICsgMTgzOTAzMDU2MiB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTRdIC0gMzUzMDk1NTYgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMV0gLSAxNTMwOTkyMDYwIHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzRdICsgMTI3Mjg5MzM1MyB8IDA7XG4gICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDtcbiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbN10gLSAxNTU0OTc2MzIgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGMgXiBkIF4gYSkgKyBrWzEwXSAtIDEwOTQ3MzA2NDAgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMTNdICsgNjgxMjc5MTc0IHwgMDtcbiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7XG4gICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzBdIC0gMzU4NTM3MjIyIHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwO1xuICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1szXSAtIDcyMjUyMTk3OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbNl0gKyA3NjAyOTE4OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwO1xuICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1s5XSAtIDY0MDM2NDQ4NyB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwO1xuICAgICAgICBkICs9IChhIF4gYiBeIGMpICsga1sxMl0gLSA0MjE4MTU4MzUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzE1XSArIDUzMDc0MjUyMCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMl0gLSA5OTUzMzg2NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDtcblxuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1swXSAtIDE5ODYzMDg0NCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1s3XSArIDExMjY4OTE0MTUgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzE0XSAtIDE0MTYzNTQ5MDUgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzVdIC0gNTc0MzQwNTUgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDtcbiAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGtbMTJdICsgMTcwMDQ4NTU3MSB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1szXSAtIDE4OTQ5ODY2MDYgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzEwXSAtIDEwNTE1MjMgfCAwO1xuICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7XG4gICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzFdIC0gMjA1NDkyMjc5OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s4XSArIDE4NzMzMTMzNTkgfCAwO1xuICAgICAgICBhICA9IChhIDw8IDYgfCBhID4+PiAyNikgKyBiIHwgMDtcbiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbMTVdIC0gMzA2MTE3NDQgfCAwO1xuICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7XG4gICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzZdIC0gMTU2MDE5ODM4MCB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMTNdICsgMTMwOTE1MTY0OSB8IDA7XG4gICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwO1xuICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s0XSAtIDE0NTUyMzA3MCB8IDA7XG4gICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwO1xuICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1sxMV0gLSAxMTIwMjEwMzc5IHwgMDtcbiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwO1xuICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1syXSArIDcxODc4NzI1OSB8IDA7XG4gICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDtcbiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbOV0gLSAzNDM0ODU1NTEgfCAwO1xuICAgICAgICBiICA9IChiIDw8IDIxIHwgYiA+Pj4gMTEpICsgYyB8IDA7XG5cbiAgICAgICAgeFswXSA9IGEgKyB4WzBdIHwgMDtcbiAgICAgICAgeFsxXSA9IGIgKyB4WzFdIHwgMDtcbiAgICAgICAgeFsyXSA9IGMgKyB4WzJdIHwgMDtcbiAgICAgICAgeFszXSA9IGQgKyB4WzNdIHwgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZDVibGsocykge1xuICAgICAgICB2YXIgbWQ1YmxrcyA9IFtdLFxuICAgICAgICAgICAgaTsgLyogQW5keSBLaW5nIHNhaWQgZG8gaXQgdGhpcyB3YXkuICovXG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIG1kNWJsa3NbaSA+PiAyXSA9IHMuY2hhckNvZGVBdChpKSArIChzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDgpICsgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpICsgKHMuY2hhckNvZGVBdChpICsgMykgPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNWJsa19hcnJheShhKSB7XG4gICAgICAgIHZhciBtZDVibGtzID0gW10sXG4gICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gYVtpXSArIChhW2kgKyAxXSA8PCA4KSArIChhW2kgKyAyXSA8PCAxNikgKyAoYVtpICsgM10gPDwgMjQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZDVibGtzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1kNTEocykge1xuICAgICAgICB2YXIgbiA9IHMubGVuZ3RoLFxuICAgICAgICAgICAgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgdGFpbCxcbiAgICAgICAgICAgIHRtcCxcbiAgICAgICAgICAgIGxvLFxuICAgICAgICAgICAgaGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbjsgaSArPSA2NCkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIG1kNWJsayhzLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGkgLSA2NCk7XG4gICAgICAgIGxlbmd0aCA9IHMubGVuZ3RoO1xuICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBzLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cbiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIGlmIChpID4gNTUpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1pZ2h0IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdFxuICAgICAgICB0bXAgPSBuICogODtcbiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtcbiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwO1xuXG4gICAgICAgIHRhaWxbMTRdID0gbG87XG4gICAgICAgIHRhaWxbMTVdID0gaGk7XG5cbiAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWQ1MV9hcnJheShhKSB7XG4gICAgICAgIHZhciBuID0gYS5sZW5ndGgsXG4gICAgICAgICAgICBzdGF0ZSA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGgsXG4gICAgICAgICAgICB0YWlsLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBuOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrX2FycmF5KGEuc3ViYXJyYXkoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IHN1cmUgaWYgaXQgaXMgYSBidWcsIGhvd2V2ZXIgSUUxMCB3aWxsIGFsd2F5cyBwcm9kdWNlIGEgc3ViIGFycmF5IG9mIGxlbmd0aCAxXG4gICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50IGFycmF5IGlmIHRoZSBzdWIgYXJyYXkgc3BlY2lmaWVkIHN0YXJ0c1xuICAgICAgICAvLyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgcGFyZW50IGFycmF5IC0gd2VpcmQuXG4gICAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNzcxNDUyL3R5cGVkLWFycmF5LXN1YmFycmF5LWlzc3VlXG4gICAgICAgIGEgPSAoaSAtIDY0KSA8IG4gPyBhLnN1YmFycmF5KGkgLSA2NCkgOiBuZXcgVWludDhBcnJheSgwKTtcblxuICAgICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gYVtpXSA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICBpZiAoaSA+IDU1KSB7XG4gICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtaWdodCBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXRcbiAgICAgICAgdG1wID0gbiAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuXG4gICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmhleChuKSB7XG4gICAgICAgIHZhciBzID0gJycsXG4gICAgICAgICAgICBqO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzICs9IGhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl0gKyBoZXhfY2hyWyhuID4+IChqICogOCkpICYgMHgwRl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGV4KHgpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB4W2ldID0gcmhleCh4W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBmYXN0IGFkZDMyIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkLi5cbiAgICBpZiAoaGV4KG1kNTEoJ2hlbGxvJykpICE9PSAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKSB7XG4gICAgICAgIGFkZDMyID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICAgIHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRiksXG4gICAgICAgICAgICAgICAgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gICAgICAgICAgICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIEFycmF5QnVmZmVyIHNsaWNlIHBvbHlmaWxsLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHRhdWJlcnQvbm9kZS1hcnJheWJ1ZmZlci1zbGljZVxuICAgICAqL1xuXG4gICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIUFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gY2xhbXAodmFsLCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAodmFsIHwgMCkgfHwgMDtcblxuICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh2YWwgKyBsZW5ndGgsIDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWwsIGxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luID0gY2xhbXAoZnJvbSwgbGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUFycmF5O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gY2xhbXAodG8sIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJlZ2luID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbnVtID0gZW5kIC0gYmVnaW47XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEFycmF5QnVmZmVyKG51bSk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBuZXcgVWludDhBcnJheSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLCBiZWdpbiwgbnVtKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXJzLlxuICAgICAqL1xuXG4gICAgZnVuY3Rpb24gdG9VdGY4KHN0cikge1xuICAgICAgICBpZiAoL1tcXHUwMDgwLVxcdUZGRkZdLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRmOFN0cjJBcnJheUJ1ZmZlcihzdHIsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgICAgICAgIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSxcbiAgICAgICAgICAgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksXG4gICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gYXJyIDogYnVmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcnJheUJ1ZmZlcjJVdGY4U3RyKGJ1ZmYpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGZpcnN0LCBzZWNvbmQsIHJldHVyblVJbnQ4QXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGZpcnN0LmJ5dGVMZW5ndGggKyBzZWNvbmQuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShmaXJzdCkpO1xuICAgICAgICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KHNlY29uZCksIGZpcnN0LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gcmVzdWx0IDogcmVzdWx0LmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoZXhUb0JpbmFyeVN0cmluZyhoZXgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW10sXG4gICAgICAgICAgICBsZW5ndGggPSBoZXgubGVuZ3RoLFxuICAgICAgICAgICAgeDtcblxuICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGVuZ3RoIC0gMTsgeCArPSAyKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKHBhcnNlSW50KGhleC5zdWJzdHIoeCwgMiksIDE2KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIFNwYXJrTUQ1IE9PUCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbWQ1LCBvdGhlcndpc2UgdXNlIHRoZVxuICAgICAqIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuXG4gICAgICovXG5cbiAgICBmdW5jdGlvbiBTcGFya01ENSgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHN0cmluZy5cbiAgICAgKiBBIGNvbnZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGFuIHV0Zjggc3RyaW5nIGlzIGRldGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBhcHBlbmQgYXMgYmluYXJ5XG4gICAgICAgIHRoaXMuYXBwZW5kQmluYXJ5KHRvVXRmOChzdHIpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgVGhlIGJpbmFyeSBzdHJpbmcgdG8gYmUgYXBwZW5kZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZEJpbmFyeSA9IGZ1bmN0aW9uIChjb250ZW50cykge1xuICAgICAgICB0aGlzLl9idWZmICs9IGNvbnRlbnRzO1xuICAgICAgICB0aGlzLl9sZW5ndGggKz0gY29udGVudHMubGVuZ3RoO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9idWZmLmxlbmd0aCxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbGVuZ3RoOyBpICs9IDY0KSB7XG4gICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCBtZDVibGsodGhpcy5fYnVmZi5zdWJzdHJpbmcoaSAtIDY0LCBpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYnVmZiA9IHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGkgLSA2NCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0ID0gaGV4KHRoaXMuX2hhc2gpO1xuXG4gICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgIHJldCA9IGhleFRvQmluYXJ5U3RyaW5nKHJldCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYnVmZiA9ICcnO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9oYXNoID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1ZmY6IHRoaXMuX2J1ZmYsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMuX2xlbmd0aCxcbiAgICAgICAgICAgIGhhc2g6IHRoaXMuX2hhc2guc2xpY2UoKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZlxuICAgICAqL1xuICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLl9idWZmID0gc3RhdGUuYnVmZjtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB0aGlzLl9oYXNoID0gc3RhdGUuaGFzaDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgdGhlIGluY3JlbWVudGFsIGJ1ZmZlciBhbmQgb3RoZXIgYWRkaXRpb25hbFxuICAgICAqIHJlc291cmNlcy4gSWYgeW91IHBsYW4gdG8gdXNlIHRoZSBpbnN0YW5jZSBhZ2FpbiwgdXNlIHJlc2V0IGluc3RlYWQuXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9oYXNoO1xuICAgICAgICBkZWxldGUgdGhpcy5fYnVmZjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgdGFpbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9ICB0YWlsICAgVGhlIHRhaWwgKHdpbGwgYmUgbW9kaWZpZWQpXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgYnVmZmVyXG4gICAgICovXG4gICAgU3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAodGFpbCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBpID0gbGVuZ3RoLFxuICAgICAgICAgICAgdG1wLFxuICAgICAgICAgICAgbG8sXG4gICAgICAgICAgICBoaTtcblxuICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTtcbiAgICAgICAgaWYgKGkgPiA1NSkge1xuICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgdGFpbCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gdGhlIGZpbmFsIGNvbXB1dGF0aW9uIGJhc2VkIG9uIHRoZSB0YWlsIGFuZCBsZW5ndGhcbiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtYXkgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0XG4gICAgICAgIHRtcCA9IHRoaXMuX2xlbmd0aCAqIDg7XG4gICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7XG4gICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7XG4gICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDtcblxuICAgICAgICB0YWlsWzE0XSA9IGxvO1xuICAgICAgICB0YWlsWzE1XSA9IGhpO1xuICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCB0YWlsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGEgc3RyaW5nLlxuICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIHN0ciBUaGUgc3RyaW5nXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbcmF3XSBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoID0gZnVuY3Rpb24gKHN0ciwgcmF3KSB7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgLy8gVGhlbiBjb21wdXRlIGl0IHVzaW5nIHRoZSBiaW5hcnkgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuIFNwYXJrTUQ1Lmhhc2hCaW5hcnkodG9VdGY4KHN0ciksIHJhdyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhIGJpbmFyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIGNvbnRlbnQgVGhlIGJpbmFyeSBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddICAgICBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHRcbiAgICAgKi9cbiAgICBTcGFya01ENS5oYXNoQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnQsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTEoY29udGVudCksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogU3BhcmtNRDUgT09QIGltcGxlbWVudGF0aW9uIGZvciBhcnJheSBidWZmZXJzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUgT05MWSBmb3IgYXJyYXkgYnVmZmVycy5cbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyIFRoZSBhcnJheSB0byBiZSBhcHBlbmRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGFycikge1xuICAgICAgICB2YXIgYnVmZiA9IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKHRoaXMuX2J1ZmYuYnVmZmVyLCBhcnIsIHRydWUpLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICBpO1xuXG4gICAgICAgIHRoaXMuX2xlbmd0aCArPSBhcnIuYnl0ZUxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHtcbiAgICAgICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIG1kNWJsa19hcnJheShidWZmLnN1YmFycmF5KGkgLSA2NCwgaSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2J1ZmYgPSAoaSAtIDY0KSA8IGxlbmd0aCA/IG5ldyBVaW50OEFycmF5KGJ1ZmYuYnVmZmVyLnNsaWNlKGkgLSA2NCkpIDogbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZFxuICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLFxuICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsXG4gICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHJldDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmW2ldIDw8ICgoaSAlIDQpIDw8IDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKHRhaWwsIGxlbmd0aCk7XG4gICAgICAgIHJldCA9IGhleCh0aGlzLl9oYXNoKTtcblxuICAgICAgICBpZiAocmF3KSB7XG4gICAgICAgICAgICByZXQgPSBoZXhUb0JpbmFyeVN0cmluZyhyZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmYgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5faGFzaCA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGVcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgYnVmZmVyIHRvIGEgc3RyaW5nXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSBhcnJheUJ1ZmZlcjJVdGY4U3RyKHN0YXRlLmJ1ZmYpO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGZcbiAgICAgKi9cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYnVmZmVyXG4gICAgICAgIHN0YXRlLmJ1ZmYgPSB1dGY4U3RyMkFycmF5QnVmZmVyKHN0YXRlLmJ1ZmYsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBTcGFya01ENS5wcm90b3R5cGUuc2V0U3RhdGUuY2FsbCh0aGlzLCBzdGF0ZSk7XG4gICAgfTtcblxuICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3k7XG5cbiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuX2ZpbmlzaCA9IFNwYXJrTUQ1LnByb3RvdHlwZS5fZmluaXNoO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGFuIGFycmF5IGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFyciBUaGUgYXJyYXkgYnVmZmVyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSAgICAgW3Jhd10gVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IG9uZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0XG4gICAgICovXG4gICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIuaGFzaCA9IGZ1bmN0aW9uIChhcnIsIHJhdykge1xuICAgICAgICB2YXIgaGFzaCA9IG1kNTFfYXJyYXkobmV3IFVpbnQ4QXJyYXkoYXJyKSksXG4gICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7XG5cbiAgICAgICAgcmV0dXJuIHJhdyA/IGhleFRvQmluYXJ5U3RyaW5nKHJldCkgOiByZXQ7XG4gICAgfTtcblxuICAgIHJldHVybiBTcGFya01ENTtcbn0pKTtcbiIsIi8qKlxuICogRm9ybWF0cyByYXcgVVVJRCBkYXRhIGludG8gdGhlIHByb3BlciBzdHJpbmcgZm9ybWF0LlxuICogQHBhcmFtIGRhdGEgLSBSYXcgVVVJRCBkYXRhLlxuICogQHJldHVybnMgRm9ybWF0dGVkIFVVSUQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiB1aW50OFRvVXVpZCAoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gMTYpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBjYiAocHJldmlvdXM6IHN0cmluZywgY3VycmVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJldmlvdXMgKyBjdXJyZW50LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc2xpY2UoMCwgNCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNCwgNikucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoNiwgOCkucmVkdWNlKGNiLCAnJykgK1xuICAgICctJyArIGRhdGEuc2xpY2UoOCwgMTApLnJlZHVjZShjYiwgJycpICtcbiAgICAnLScgKyBkYXRhLnNsaWNlKDEwKS5yZWR1Y2UoY2IsICcnKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBBIFt2ZXJzaW9uIDQgVVVJRF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXIjVmVyc2lvbl80XyhyYW5kb20pKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCAoKTogc3RyaW5nIHtcbiAgLy8gQ2hlY2sgZm9yIGNyeXB0byBBUElcbiAgaWYgKHdpbmRvdy5jcnlwdG8gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1aW50OFRvVXVpZChuZXcgVWludDhBcnJheSgxNikpO1xuICB9XG5cbiAgLy8gR2V0IDE2IG9jdGV0cyBmb3IgVVVJRFxuICBjb25zdCBvY3RldHMgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGNvbnN0IG1vZGlmaWVycyA9IFVpbnQ4QXJyYXkuZnJvbShbXG4gICAgcGFyc2VJbnQoJzAxMDAwMDAwJywgMiksICAvLyBWZXJzaW9uIGJpdHMgKDQgPT4gMDEwMClcbiAgICBwYXJzZUludCgnMTAwMDAwMDAnLCAyKSwgIC8vIFZhcmlhbnQgYml0cyAoMTB4KVxuICAgIHBhcnNlSW50KCcwMDAwMTExMScsIDIpLCAgLy8gTWFzayB0byB6ZXJvIGhpZ2hlciBiaXRzLCB2ZXJzaW9uXG4gICAgcGFyc2VJbnQoJzAwMTExMTExJywgMikgICAvLyBNYXNrIHRvIHplcm8gaGlnaGVyIGJpdHMsIHZhcmlhbnRcbiAgXSk7XG4gIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG9jdGV0cyk7XG4gIC8vIFNldCB2ZXJzaW9uIGJpdHMgYW5kIHZhcmlhbnQgYml0c1xuICBvY3RldHNbNl0gPSAob2N0ZXRzWzZdICYgbW9kaWZpZXJzWzJdKSB8IG1vZGlmaWVyc1swXTtcbiAgb2N0ZXRzWzhdID0gKG9jdGV0c1s4XSAmIG1vZGlmaWVyc1szXSkgfCBtb2RpZmllcnNbMV07XG5cbiAgcmV0dXJuIHVpbnQ4VG9VdWlkKG9jdGV0cyk7XG59XG4iLCJpbXBvcnQgeyBHcm91cGluZ1R5cGUgfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIGNvbG9yIHBhbGV0dGUgZnJvbSBGaWd1cmUgMiAoQ29sb3JzIG9wdGltaXplZCBmb3IgY29sb3ItYmxpbmRcbiAqIGluZGl2aWR1YWxzKSBmcm9tXG4gKiBbXCJQb2ludHMgb2YgdmlldzogQ29sb3IgYmxpbmRuZXNzXCIgYnkgQmFuZyBXb25nIHB1Ymxpc2hlZCBpbiBOYXR1cmUgTWV0aG9kcyB2b2x1bWUgOCBvbiAyNyBNYXkgMjAxMV0oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9ubWV0aC4xNjE4P1dULmVjX2lkPU5NRVRILTIwMTEwNilcbiAqL1xuY29uc3QgQ29sb3JQYWxldHRlOiBzdHJpbmdbXSA9IFtcbiAgJ3JnYigyMzAsIDE1OSwgMCknLFxuICAncmdiKDg2LCAxODAsIDIzMyknLFxuICAncmdiKDAsIDE1OCwgMTE1KScsXG4gICdyZ2IoMjQwLCAyMjgsIDY2KScsXG4gICdyZ2IoMCwgMTE0LCAxNzgpJyxcbiAgJ3JnYigyMTMsIDk0LCAwKScsXG4gICdyZ2IoMjA0LCAxMjEsIDE2NyknXG5dO1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgaGlnaGxpZ2h0IGZyb20gYSBzdGFmZi5cbiAqIEBwYXJhbSBzdGFmZiBJZiB1bmRlZmluZWQsIHRoZSBhbGwgc3RhdmVzIGFyZSB1bmhpZ2hsaWdodGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5oaWdobGlnaHQoc3RhZmY/OiBTVkdHRWxlbWVudCk6IHZvaWQge1xuICBsZXQgY2hpbGRyZW46IE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gIGlmIChzdGFmZikge1xuICAgIGNoaWxkcmVuID0gc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHRlZCcpO1xuICB9XG4gIGNoaWxkcmVuLmZvckVhY2goZWxlbSA9PiB7XG4gICAgaWYgKGVsZW0udGFnTmFtZSA9PT0gJ3BhdGgnICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfSBlbHNlIGlmIChlbGVtLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpICYmICFlbGVtLmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwMDAwJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbGwnKTtcbiAgICAgIGxldCByZWN0cyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBlbGVtLmNsb3Nlc3QoJy5zeWxsYWJsZScpLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWN0cyA9IFtdIGFzIHVua25vd24gYXMgTm9kZUxpc3RPZjxFbGVtZW50PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zeWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApe1xuICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBoaWdobGlnaHQgZnJvbSBlYWNoIHN0YWZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRTdGFmZkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5oaWdobGlnaHQoKTtcbn1cblxuLyoqXG4gKiBVbnNldCBoaWdobGlnaHQgZm9yIGFsbCBncm91cGluZyB0eXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpOiB2b2lkIHtcbiAgdW5zZXRTdGFmZkhpZ2hsaWdodCgpO1xuICBjb25zdCBoaWdobGlnaHRlZCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQnKSlcbiAgICAuZmlsdGVyKChlbGVtOiBIVE1MRWxlbWVudCkgPT4gIWVsZW0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpO1xuICBoaWdobGlnaHRlZC5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGVsZW0uc2V0QXR0cmlidXRlKCcjZDAwJywgbnVsbCk7XG4gICAgbGV0IHJlY3RzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICBpZiAoZWxlbS5jbG9zZXN0KCcuc3lsbGFibGUnKSAhPT0gbnVsbCkge1xuICAgICAgICByZWN0cyA9IGVsZW0uY2xvc2VzdCgnLnN5bGxhYmxlJykucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgfVxuICAgIH1cbiAgICByZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWN0OiBIVE1MRWxlbWVudCkge1xuICAgICAgaWYgKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8IFxuICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpXG4gICAgICApe1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnI2QwMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnYmx1ZSc7XG4gICAgICB9XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO1xuICAgIGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2gocmVjdCA9PiB7XG4gICAgICByZWN0LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpLmZvckVhY2goKGVsKSA9PiB7IGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcnKTsgfSk7XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGEgc3RhZmYgYSBjZXJ0YWluIGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlnaGxpZ2h0KHN0YWZmOiBTVkdHRWxlbWVudCwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oc3RhZmYuY2hpbGRyZW4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ3BhdGgnKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnZGl2TGluZScpKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzMwcHgnKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykubGVuZ3RoICYmIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnc3lsbGFibGUnKSkge1xuICAgICAgQXJyYXkuZnJvbShjaGlsZC5jaGlsZHJlbikuZmlsdGVyKGVsID0+IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpIHx8IGNoaWxkLmlkID09PSAncmVzaXplUmVjdCcgfHwgY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdyb3RhdGVQb2ludCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2xheWVyJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hpZ2hsaWdodC1zZWxlY3RlZCcpLmxlbmd0aCAmJlxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGlnaGxpZ2h0LXNlbGVjdGVkJylbMF0uaWQgPT09ICdoaWdobGlnaHQtbmV1bWUnXG4gICAgICAmJiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bGxhYmxlJykpIHtcbiAgICAgIEFycmF5LmZyb20oY2hpbGQuY2hpbGRyZW4pLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25ldW1lJykpLmZvckVhY2goY2NoaWxkID0+IHsgY2hpbGRyZW4ucHVzaChjY2hpbGQpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgbGV0IHJlY3RzID0gY2hpbGQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICAgIGlmICghcmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVjdHMgPSBjaGlsZC5jbG9zZXN0KCcuc3lsbGFibGUnKS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVjdHMgPSBbXSBhcyB1bmtub3duIGFzIE5vZGVMaXN0T2Y8RWxlbWVudD47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlY3RzLmZvckVhY2goZnVuY3Rpb24gKHJlY3Q6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICghKHJlY3QuY2xvc2VzdCgnLnN5bGxhYmxlJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3RhZmYnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJylcbiAgICAgICAgICAvLyByZWN0LmNsb3Nlc3QoJy5sYXllcicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApKSB7XG4gICAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gY29sb3I7XG4gICAgICAgICAgcmVjdC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHRlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hpbGQuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0ZWQnKTtcbiAgfVxuICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgLyp0cnkge1xuICAgIHdpZHRoID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnd2lkdGgnKS5zcGxpdCgncHgnKVswXSk7XG4gICAgaGVpZ2h0ID0gTnVtYmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtcGFnZScpLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jykuc3BsaXQoJ3B4JylbMF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgfSovXG4gIGxldCBzdHJva2U6IHN0cmluZztcbiAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgJiYgaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBpZGsgbG9va3MgZ29vZCA6JylcbiAgICAvLyBUT0RPIGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHRoaXMgYXMgdGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgYXMgd2VsbCBhcyAzMHB4XG4gICAgc3Ryb2tlID0gKHdpZHRoICogaGVpZ2h0IC8gMTAwMDAwMCkudG9TdHJpbmcoKTtcbiAgfVxuICBlbHNlIHtcbiAgICBzdHJva2UgPSAnMzBweCc7XG4gIH1cbiAgc3RhZmYucXVlcnlTZWxlY3RvckFsbCgnLm5jLCAuY3VzdG9zLCAuY2xlZiwgLmFjY2lkJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0cm9rZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhpZ2hsaWdodCBlYWNoIHN0YWZmIGEgZGlmZmVyZW50IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RhZmZIaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3RhZmYnKSkgYXMgU1ZHR0VsZW1lbnRbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFmZkNvbG9yID0gQ29sb3JQYWxldHRlW2kgJSBDb2xvclBhbGV0dGUubGVuZ3RoXTtcbiAgICBoaWdobGlnaHQoc3RhdmVzW2ldLCBzdGFmZkNvbG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDb2x1bW5IaWdobGlnaHQoKTogdm9pZCB7XG4gIGNvbnN0ICBncm91cHM6IHsgW2tleTogbnVtYmVyXTogU1ZHR0VsZW1lbnRbXSB9ID0ge307XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBjb25zdCBoYXNDb2x1bW4gPSBBcnJheS5mcm9tKHN0YWZmLmNsYXNzTGlzdCkuam9pbignICcpLm1hdGNoKC9cXGJjb2x1bW4oXFxkKylcXGIvKTtcbiAgICBsZXQgY29sdW1uTnVtID0gMDtcbiAgICBpZiAoaGFzQ29sdW1uKSB7XG4gICAgICBjb2x1bW5OdW0gPSBwYXJzZUludChoYXNDb2x1bW5bMV0sIDEwKSAtIDE7XG4gICAgfVxuXG4gICAgaWYgKCFncm91cHNbY29sdW1uTnVtXSkge1xuICAgICAgZ3JvdXBzW2NvbHVtbk51bV0gPSBbXTtcbiAgICB9XG5cbiAgICBncm91cHNbY29sdW1uTnVtXS5wdXNoKHN0YWZmIGFzIFNWR0dFbGVtZW50KTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29sdW1uLCBzdGF2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICBjb25zdCBjb2xvciA9IENvbG9yUGFsZXR0ZVtOdW1iZXIoY29sdW1uKSAlIENvbG9yUGFsZXR0ZS5sZW5ndGhdO1xuICAgIGZvciAoY29uc3Qgc3RhZmYgb2Ygc3RhdmVzKSB7XG4gICAgICBoaWdobGlnaHQoc3RhZmYsIGNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSBoaWdobGlnaHQgYnkgYSBkaWZmZXJlbnQgZ3JvdXBpbmcuXG4gKiBAcGFyYW0gZ3JvdXBpbmcgLSBFaXRoZXIgXCJzdGFmZlwiLCBcInN5bGxhYmxlXCIsIFwibmV1bWVcIiwgXCJzZWxlY3Rpb25cIiwgb3IgXCJsYXllckVsZW1lbnRcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdyb3VwaW5nSGlnaGxpZ2h0KGdyb3VwaW5nOiBHcm91cGluZ1R5cGUpOiB2b2lkIHtcbiAgdW5zZXRHcm91cGluZ0hpZ2hsaWdodCgpO1xuICBpZiAoZ3JvdXBpbmcgPT09ICdzdGFmZicpIHtcbiAgICBzZXRTdGFmZkhpZ2hsaWdodCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBlbHNlIGlmIChncm91cGluZyA9PT0gJ2NvbHVtbicpIHtcbiAgICBzZXRDb2x1bW5IaWdobGlnaHQoKTtcbiAgICByZXR1cm47XG4gIH0gXG4gIGVsc2UgaWYgKGdyb3VwaW5nID09PSAnc2VsZWN0aW9uJykge1xuICAgIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VsLWJ5LmlzLWFjdGl2ZScpLmlkO1xuICAgIHN3aXRjaCAodGVtcCkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBjYXNlICdzZWxCeUJCb3gnOlxuICAgICAgICBncm91cGluZyA9ICdzeWxsYWJsZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlDb2x1bW4nOlxuICAgICAgICBncm91cGluZyA9ICdjb2x1bW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBncm91cGluZyA9ICdzdGFmZic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsQnlMYXllckVsZW1lbnQnOlxuICAgICAgICBncm91cGluZyA9ICdsYXllckVsZW1lbnQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZ3JvdXBpbmcgPSAnbmV1bWUnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoZ3JvdXBpbmcpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZ3JvdXBzO1xuXG4gIGlmIChncm91cGluZyA9PSAnbGF5ZXJFbGVtZW50Jykge1xuICAgIGdyb3VwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hY2NpZCwgLmNsZWYsIC5jdXN0b3MsIC5kaXZMaW5lJyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ3JvdXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShncm91cGluZykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD47XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmMsIC5jdXN0b3MsIC5jbGVmLCAuYWNjaWQsIC5kaXZMaW5lJykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnYmxhY2snKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gIH0pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZ3JvdXBDb2xvciA9IENvbG9yUGFsZXR0ZVtpICUgQ29sb3JQYWxldHRlLmxlbmd0aF07XG4gICAgaWYgKChncm91cHNbaV0uY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpICYmICFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICBncm91cHNbaV0uc2V0QXR0cmlidXRlKCdmaWxsJywgZ3JvdXBDb2xvcik7XG4gICAgICBjb25zdCByZWN0cyA9IGdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+O1xuICAgICAgcmVjdHMuZm9yRWFjaChmdW5jdGlvbiAocmVjdCkge1xuICAgICAgICBpZiAocmVjdC5jbG9zZXN0KCcuc3lsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpIHx8XG4gICAgICAgICAgcmVjdC5jbG9zZXN0KCcuc3lsbGFibGUnKS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHxcbiAgICAgICAgICByZWN0LmNsb3Nlc3QoJy5zdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVjdC5zdHlsZS5maWxsID0gZ3JvdXBDb2xvcjtcbiAgICAgIH0pO1xuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICBncm91cHNbaV0ucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0LWRpc3BsYXknKS5mb3JFYWNoKHJlY3QgPT4ge1xuICAgICAgICByZWN0LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cHNbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyb3Vwc1tpXS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2QwMCcpO1xuICAgICAgfVxuICAgICAgZ3JvdXBzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGl2TGluZUNoaWxkcmVuID0gZ3JvdXBzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXZMaW5lJyk7XG4gICAgaWYgKGRpdkxpbmVDaGlsZHJlbikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaXZMaW5lQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGl2TGluZUNoaWxkcmVuW2pdLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgZ3JvdXBDb2xvcik7XG4gICAgICAgIGRpdkxpbmVDaGlsZHJlbltqXS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczMHB4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXJpID0gcmVxdWlyZSgndXJsJyk7XG5cbnZhciBWYWxpZGF0aW9uRXJyb3IgPSBleHBvcnRzLlZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uIFZhbGlkYXRpb25FcnJvciAobWVzc2FnZSwgaW5zdGFuY2UsIHNjaGVtYSwgcGF0aCwgbmFtZSwgYXJndW1lbnQpIHtcbiAgaWYoQXJyYXkuaXNBcnJheShwYXRoKSl7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLnByb3BlcnR5ID0gcGF0aC5yZWR1Y2UoZnVuY3Rpb24oc3VtLCBpdGVtKXtcbiAgICAgIHJldHVybiBzdW0gKyBtYWtlU3VmZml4KGl0ZW0pO1xuICAgIH0sICdpbnN0YW5jZScpO1xuICB9ZWxzZSBpZihwYXRoICE9PSB1bmRlZmluZWQpe1xuICAgIHRoaXMucHJvcGVydHkgPSBwYXRoO1xuICB9XG4gIGlmIChtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgfVxuICBpZiAoc2NoZW1hKSB7XG4gICAgdmFyIGlkID0gc2NoZW1hLiRpZCB8fCBzY2hlbWEuaWQ7XG4gICAgdGhpcy5zY2hlbWEgPSBpZCB8fCBzY2hlbWE7XG4gIH1cbiAgaWYgKGluc3RhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gIH1cbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuICB0aGlzLnN0YWNrID0gdGhpcy50b1N0cmluZygpO1xufTtcblxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdGhpcy5wcm9wZXJ0eSArICcgJyArIHRoaXMubWVzc2FnZTtcbn07XG5cbnZhciBWYWxpZGF0b3JSZXN1bHQgPSBleHBvcnRzLlZhbGlkYXRvclJlc3VsdCA9IGZ1bmN0aW9uIFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgdGhpcy5wYXRoID0gY3R4LnBhdGg7XG4gIHRoaXMucHJvcGVydHlQYXRoID0gY3R4LnByb3BlcnR5UGF0aDtcbiAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgdGhpcy50aHJvd0Vycm9yID0gb3B0aW9ucyAmJiBvcHRpb25zLnRocm93RXJyb3I7XG4gIHRoaXMudGhyb3dGaXJzdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aHJvd0ZpcnN0O1xuICB0aGlzLnRocm93QWxsID0gb3B0aW9ucyAmJiBvcHRpb25zLnRocm93QWxsO1xuICB0aGlzLmRpc2FibGVGb3JtYXQgPSBvcHRpb25zICYmIG9wdGlvbnMuZGlzYWJsZUZvcm1hdCA9PT0gdHJ1ZTtcbn07XG5cblZhbGlkYXRvclJlc3VsdC5wcm90b3R5cGUuYWRkRXJyb3IgPSBmdW5jdGlvbiBhZGRFcnJvcihkZXRhaWwpIHtcbiAgdmFyIGVycjtcbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT0gJ3N0cmluZycpIHtcbiAgICBlcnIgPSBuZXcgVmFsaWRhdGlvbkVycm9yKGRldGFpbCwgdGhpcy5pbnN0YW5jZSwgdGhpcy5zY2hlbWEsIHRoaXMucGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFkZXRhaWwpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBlcnJvciBkZXRhaWwnKTtcbiAgICBpZiAoIWRldGFpbC5tZXNzYWdlKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZXJyb3IgbWVzc2FnZScpO1xuICAgIGlmICghZGV0YWlsLm5hbWUpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB2YWxpZGF0b3IgdHlwZScpO1xuICAgIGVyciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoZGV0YWlsLm1lc3NhZ2UsIHRoaXMuaW5zdGFuY2UsIHRoaXMuc2NoZW1hLCB0aGlzLnBhdGgsIGRldGFpbC5uYW1lLCBkZXRhaWwuYXJndW1lbnQpO1xuICB9XG5cbiAgdGhpcy5lcnJvcnMucHVzaChlcnIpO1xuICBpZiAodGhpcy50aHJvd0ZpcnN0KSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRvclJlc3VsdEVycm9yKHRoaXMpO1xuICB9ZWxzZSBpZih0aGlzLnRocm93RXJyb3Ipe1xuICAgIHRocm93IGVycjtcbiAgfVxuICByZXR1cm4gZXJyO1xufTtcblxuVmFsaWRhdG9yUmVzdWx0LnByb3RvdHlwZS5pbXBvcnRFcnJvcnMgPSBmdW5jdGlvbiBpbXBvcnRFcnJvcnMocmVzKSB7XG4gIGlmICh0eXBlb2YgcmVzID09ICdzdHJpbmcnIHx8IChyZXMgJiYgcmVzLnZhbGlkYXRvclR5cGUpKSB7XG4gICAgdGhpcy5hZGRFcnJvcihyZXMpO1xuICB9IGVsc2UgaWYgKHJlcyAmJiByZXMuZXJyb3JzKSB7XG4gICAgdGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5jb25jYXQocmVzLmVycm9ycyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHN0cmluZ2l6ZXIgKHYsaSl7XG4gIHJldHVybiBpKyc6ICcrdi50b1N0cmluZygpKydcXG4nO1xufVxuVmFsaWRhdG9yUmVzdWx0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJlcykge1xuICByZXR1cm4gdGhpcy5lcnJvcnMubWFwKHN0cmluZ2l6ZXIpLmpvaW4oJycpO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZhbGlkYXRvclJlc3VsdC5wcm90b3R5cGUsIFwidmFsaWRcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMuZXJyb3JzLmxlbmd0aDtcbn0gfSk7XG5cbm1vZHVsZS5leHBvcnRzLlZhbGlkYXRvclJlc3VsdEVycm9yID0gVmFsaWRhdG9yUmVzdWx0RXJyb3I7XG5mdW5jdGlvbiBWYWxpZGF0b3JSZXN1bHRFcnJvcihyZXN1bHQpIHtcbiAgaWYoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Upe1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFZhbGlkYXRvclJlc3VsdEVycm9yKTtcbiAgfVxuICB0aGlzLmluc3RhbmNlID0gcmVzdWx0Lmluc3RhbmNlO1xuICB0aGlzLnNjaGVtYSA9IHJlc3VsdC5zY2hlbWE7XG4gIHRoaXMub3B0aW9ucyA9IHJlc3VsdC5vcHRpb25zO1xuICB0aGlzLmVycm9ycyA9IHJlc3VsdC5lcnJvcnM7XG59XG5WYWxpZGF0b3JSZXN1bHRFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcblZhbGlkYXRvclJlc3VsdEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZhbGlkYXRvclJlc3VsdEVycm9yO1xuVmFsaWRhdG9yUmVzdWx0RXJyb3IucHJvdG90eXBlLm5hbWUgPSBcIlZhbGlkYXRpb24gRXJyb3JcIjtcblxuLyoqXG4gKiBEZXNjcmliZXMgYSBwcm9ibGVtIHdpdGggYSBTY2hlbWEgd2hpY2ggcHJldmVudHMgdmFsaWRhdGlvbiBvZiBhbiBpbnN0YW5jZVxuICogQG5hbWUgU2NoZW1hRXJyb3JcbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgU2NoZW1hRXJyb3IgPSBleHBvcnRzLlNjaGVtYUVycm9yID0gZnVuY3Rpb24gU2NoZW1hRXJyb3IgKG1zZywgc2NoZW1hKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1zZztcbiAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gIEVycm9yLmNhbGwodGhpcywgbXNnKTtcbiAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgU2NoZW1hRXJyb3IpO1xufTtcblNjaGVtYUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLFxuICB7XG4gICAgY29uc3RydWN0b3I6IHt2YWx1ZTogU2NoZW1hRXJyb3IsIGVudW1lcmFibGU6IGZhbHNlfSxcbiAgICBuYW1lOiB7dmFsdWU6ICdTY2hlbWFFcnJvcicsIGVudW1lcmFibGU6IGZhbHNlfSxcbiAgfSk7XG5cbnZhciBTY2hlbWFDb250ZXh0ID0gZXhwb3J0cy5TY2hlbWFDb250ZXh0ID0gZnVuY3Rpb24gU2NoZW1hQ29udGV4dCAoc2NoZW1hLCBvcHRpb25zLCBwYXRoLCBiYXNlLCBzY2hlbWFzKSB7XG4gIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICBpZihBcnJheS5pc0FycmF5KHBhdGgpKXtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMucHJvcGVydHlQYXRoID0gcGF0aC5yZWR1Y2UoZnVuY3Rpb24oc3VtLCBpdGVtKXtcbiAgICAgIHJldHVybiBzdW0gKyBtYWtlU3VmZml4KGl0ZW0pO1xuICAgIH0sICdpbnN0YW5jZScpO1xuICB9ZWxzZXtcbiAgICB0aGlzLnByb3BlcnR5UGF0aCA9IHBhdGg7XG4gIH1cbiAgdGhpcy5iYXNlID0gYmFzZTtcbiAgdGhpcy5zY2hlbWFzID0gc2NoZW1hcztcbn07XG5cblNjaGVtYUNvbnRleHQucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlICh0YXJnZXQpIHtcbiAgcmV0dXJuIHVyaS5yZXNvbHZlKHRoaXMuYmFzZSwgdGFyZ2V0KTtcbn07XG5cblNjaGVtYUNvbnRleHQucHJvdG90eXBlLm1ha2VDaGlsZCA9IGZ1bmN0aW9uIG1ha2VDaGlsZChzY2hlbWEsIHByb3BlcnR5TmFtZSl7XG4gIHZhciBwYXRoID0gKHByb3BlcnR5TmFtZT09PXVuZGVmaW5lZCkgPyB0aGlzLnBhdGggOiB0aGlzLnBhdGguY29uY2F0KFtwcm9wZXJ0eU5hbWVdKTtcbiAgdmFyIGlkID0gc2NoZW1hLiRpZCB8fCBzY2hlbWEuaWQ7XG4gIHZhciBiYXNlID0gdXJpLnJlc29sdmUodGhpcy5iYXNlLCBpZHx8JycpO1xuICB2YXIgY3R4ID0gbmV3IFNjaGVtYUNvbnRleHQoc2NoZW1hLCB0aGlzLm9wdGlvbnMsIHBhdGgsIGJhc2UsIE9iamVjdC5jcmVhdGUodGhpcy5zY2hlbWFzKSk7XG4gIGlmKGlkICYmICFjdHguc2NoZW1hc1tiYXNlXSl7XG4gICAgY3R4LnNjaGVtYXNbYmFzZV0gPSBzY2hlbWE7XG4gIH1cbiAgcmV0dXJuIGN0eDtcbn07XG5cbnZhciBGT1JNQVRfUkVHRVhQUyA9IGV4cG9ydHMuRk9STUFUX1JFR0VYUFMgPSB7XG4gIC8vIDcuMy4xLiBEYXRlcywgVGltZXMsIGFuZCBEdXJhdGlvblxuICAnZGF0ZS10aW1lJzogL15cXGR7NH0tKD86MFswLTldezF9fDFbMC0yXXsxfSktKDNbMDFdfDBbMS05XXxbMTJdWzAtOV0pW3RUIF0oMlswLTRdfFswMV1bMC05XSk6KFswLTVdWzAtOV0pOig2MHxbMC01XVswLTldKShcXC5cXGQrKT8oW3paXXxbKy1dKFswLTVdWzAtOV0pOig2MHxbMC01XVswLTldKSkkLyxcbiAgJ2RhdGUnOiAvXlxcZHs0fS0oPzowWzAtOV17MX18MVswLTJdezF9KS0oM1swMV18MFsxLTldfFsxMl1bMC05XSkkLyxcbiAgJ3RpbWUnOiAvXigyWzAtNF18WzAxXVswLTldKTooWzAtNV1bMC05XSk6KDYwfFswLTVdWzAtOV0pJC8sXG4gICdkdXJhdGlvbic6IC9QKFRcXGQrKEgoXFxkK00oXFxkK1MpPyk/fE0oXFxkK1MpP3xTKXxcXGQrKER8TShcXGQrRCk/fFkoXFxkK00oXFxkK0QpPyk/KShUXFxkKyhIKFxcZCtNKFxcZCtTKT8pP3xNKFxcZCtTKT98UykpP3xcXGQrVykvaSxcblxuICAvLyA3LjMuMi4gRW1haWwgQWRkcmVzc2VzXG4gIC8vIFRPRE86IGZpeCB0aGUgZW1haWwgcHJvZHVjdGlvblxuICAnZW1haWwnOiAvXig/OltcXHdcXCFcXCNcXCRcXCVcXCZcXCdcXCpcXCtcXC1cXC9cXD1cXD9cXF5cXGBcXHtcXHxcXH1cXH5dK1xcLikqW1xcd1xcIVxcI1xcJFxcJVxcJlxcJ1xcKlxcK1xcLVxcL1xcPVxcP1xcXlxcYFxce1xcfFxcfVxcfl0rQCg/Oig/Oig/OlthLXpBLVowLTldKD86W2EtekEtWjAtOVxcLV0oPyFcXC4pKXswLDYxfVthLXpBLVowLTldP1xcLikrW2EtekEtWjAtOV0oPzpbYS16QS1aMC05XFwtXSg/ISQpKXswLDYxfVthLXpBLVowLTldPyl8KD86XFxbKD86KD86WzAxXT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSlcXC4pezN9KD86WzAxXT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSlcXF0pKSQvLFxuICAnaWRuLWVtYWlsJzogL14oXCIoPzpbISMtXFxbXFxdLVxcdXsxMEZGRkZ9XXxcXFxcW1xcdCAtXFx1ezEwRkZGRn1dKSpcInxbISMtJyorXFwtLy05PT9BLVpcXF4tXFx1ezEwRkZGRn1dKD86XFwuP1shIy0nKitcXC0vLTk9P0EtWlxcXi1cXHV7MTBGRkZGfV0pKilAKFshIy0nKitcXC0vLTk9P0EtWlxcXi1cXHV7MTBGRkZGfV0oPzpcXC4/WyEjLScqK1xcLS8tOT0/QS1aXFxeLVxcdXsxMEZGRkZ9XSkqfFxcW1shLVpcXF4tXFx1ezEwRkZGRn1dKlxcXSkkL3UsXG5cbiAgLy8gNy4zLjMuIEhvc3RuYW1lc1xuXG4gIC8vIDcuMy40LiBJUCBBZGRyZXNzZXNcbiAgJ2lwLWFkZHJlc3MnOiAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KSQvLFxuICAvLyBGSVhNRSB3aGl0ZXNwYWNlIGlzIGludmFsaWRcbiAgJ2lwdjYnOiAvXlxccyooKChbMC05QS1GYS1mXXsxLDR9Oil7N30oWzAtOUEtRmEtZl17MSw0fXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Nn0oOlswLTlBLUZhLWZdezEsNH18KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs1fSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDJ9KXw6KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs0fSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDN9KXwoKDpbMC05QS1GYS1mXXsxLDR9KT86KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7M30oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw0fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwyfTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsyfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDV9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDN9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezF9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNn0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNH06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KDooKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw3fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCw1fTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoJS4rKT9cXHMqJC8sXG5cbiAgLy8gNy4zLjUuIFJlc291cmNlIElkZW50aWZpZXJzXG4gIC8vIFRPRE86IEEgbW9yZSBhY2N1cmF0ZSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIFwidXJpXCIgZ29lczpcbiAgLy8gW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKjooKC8oLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten5dKSt8KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPykoOlxcZCopPyk/KT8jKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten5dKSp8KC8oLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten5dKSt8KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPykoOlxcZCopP1svP118WyEkJi0uMC07PT8tWl9hLXp+XSl8Lz8lWzAtOUEtRmEtZl17Mn18WyEkJi0uMC07PT8tWl9hLXp+XSkoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKigjKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten5dKSopP3wvKC8oKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUEtWl9hLXp+XSkrKDpcXGQqKT98KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPzpcXGQqfFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPyk/KT9cbiAgJ3VyaSc6IC9eW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6W15cXHNdKiQvLFxuICAndXJpLXJlZmVyZW5jZSc6IC9eKCgoKFtBLVphLXpdWytcXC0uMC05QS1aYS16XSooOiVbMC05QS1GYS1mXXsyfXw6WyEkJi0uMC07PT8tWl9hLXp+XXxbLz9dKXxcXD8pKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten5dKSp8KFtBLVphLXpdWytcXC0uMC05QS1aYS16XSo6Pyk/KXwoW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKjopP1xcLygoJVswLTlBLUZhLWZdezJ9fFxcLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten5dKSt8KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPykoOlxcZCopP1svP118WyEkJi0uMC07PT8tWl9hLXp+XSkoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKnwoXFwvKCglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1BLVpfYS16fl0pK3woXFxbKChbVnZdWzAtOUEtRmEtZl0rXFwuWyEkJi0uMC07PUEtWl9hLXp+XSspP3xbLjAtOkEtRmEtZl0rKVxcXSk/KSg6XFxkKik/KT8pKSMoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKnwoKFtBLVphLXpdWytcXC0uMC05QS1aYS16XSopPyVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUBffl18W0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKlshJCYtKiw7PUBffl0pKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUAtWl9hLXp+XSkqKCgoWy8/XSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+XSkqKT8jfFsvP10pKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten5dKSopP3woW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKig6JVswLTlBLUZhLWZdezJ9fDpbISQmLS4wLTs9Py1aX2Eten5dfFsvP10pfFxcPykoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKnwoW0EtWmEtel1bK1xcLS4wLTlBLVphLXpdKjopP1xcLygoJVswLTlBLUZhLWZdezJ9fFxcLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten5dKSt8KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPykoOlxcZCopP1svP118WyEkJi0uMC07PT8tWl9hLXp+XSkoJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fl0pKnxcXC8oKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUEtWl9hLXp+XSkrKDpcXGQqKT98KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPzpcXGQqfFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fl0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPyk/fFtBLVphLXpdWytcXC0uMC05QS1aYS16XSo6Pyk/JC8sXG4gICdpcmknOiAvXlthLXpBLVpdW2EtekEtWjAtOSsuLV0qOlteXFxzXSokLyxcbiAgJ2lyaS1yZWZlcmVuY2UnOiAvXigoKChbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qKDolWzAtOUEtRmEtZl17Mn18OlshJCYtLjAtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV18Wy8/XSl8XFw/KSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+LVxcdXsxMEZGRkZ9XSkqfChbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qOj8pPyl8KFtBLVphLXpdWytcXC0uMC05QS1aYS16XSo6KT9cXC8oKCVbMC05QS1GYS1mXXsyfXxcXC8oKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUEtWl9hLXp+LVxcdXsxMEZGRkZ9XSkrfChcXFsoKFtWdl1bMC05QS1GYS1mXStcXC5bISQmLS4wLTs9QS1aX2Eten4tXFx1ezEwRkZGRn1dKyk/fFsuMC06QS1GYS1mXSspXFxdKT8pKDpcXGQqKT9bLz9dfFshJCYtLjAtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV0pKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten4tXFx1ezEwRkZGRn1dKSp8KFxcLygoJVswLTlBLUZhLWZdezJ9fFshJCYtLjAtOTs9QS1aX2Eten4tXFx1ezEwRkZGRn1dKSt8KFxcWygoW1Z2XVswLTlBLUZhLWZdK1xcLlshJCYtLjAtOz1BLVpfYS16fi1cXHV7MTBGRkZGfV0rKT98Wy4wLTpBLUZhLWZdKylcXF0pPykoOlxcZCopPyk/KSkjKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten4tXFx1ezEwRkZGRn1dKSp8KChbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qKT8lWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1AX34tXFx1ezEwRkZGRn1dfFtBLVphLXpdWytcXC0uMC05QS1aYS16XSpbISQmLSosOz1AX34tXFx1ezEwRkZGRn1dKSglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1ALVpfYS16fi1cXHV7MTBGRkZGfV0pKigoKFsvP10oJVswLTlBLUZhLWZdezJ9fFshJCYtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV0pKik/I3xbLz9dKSglWzAtOUEtRmEtZl17Mn18WyEkJi07PT8tWl9hLXp+LVxcdXsxMEZGRkZ9XSkqKT98KFtBLVphLXpdWytcXC0uMC05QS1aYS16XSooOiVbMC05QS1GYS1mXXsyfXw6WyEkJi0uMC07PT8tWl9hLXp+LVxcdXsxMEZGRkZ9XXxbLz9dKXxcXD8pKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten4tXFx1ezEwRkZGRn1dKSp8KFtBLVphLXpdWytcXC0uMC05QS1aYS16XSo6KT9cXC8oKCVbMC05QS1GYS1mXXsyfXxcXC8oKCVbMC05QS1GYS1mXXsyfXxbISQmLS4wLTk7PUEtWl9hLXp+LVxcdXsxMEZGRkZ9XSkrfChcXFsoKFtWdl1bMC05QS1GYS1mXStcXC5bISQmLS4wLTs9QS1aX2Eten4tXFx1ezEwRkZGRn1dKyk/fFsuMC06QS1GYS1mXSspXFxdKT8pKDpcXGQqKT9bLz9dfFshJCYtLjAtOz0/LVpfYS16fi1cXHV7MTBGRkZGfV0pKCVbMC05QS1GYS1mXXsyfXxbISQmLTs9Py1aX2Eten4tXFx1ezEwRkZGRn1dKSp8XFwvKCglWzAtOUEtRmEtZl17Mn18WyEkJi0uMC05Oz1BLVpfYS16fi1cXHV7MTBGRkZGfV0pKyg6XFxkKik/fChcXFsoKFtWdl1bMC05QS1GYS1mXStcXC5bISQmLS4wLTs9QS1aX2Eten4tXFx1ezEwRkZGRn1dKyk/fFsuMC06QS1GYS1mXSspXFxdKT86XFxkKnxcXFsoKFtWdl1bMC05QS1GYS1mXStcXC5bISQmLS4wLTs9QS1aX2Eten4tXFx1ezEwRkZGRn1dKyk/fFsuMC06QS1GYS1mXSspXFxdKT8pP3xbQS1aYS16XVsrXFwtLjAtOUEtWmEtel0qOj8pPyQvdSxcbiAgJ3V1aWQnOiAvXlswLTlBLUZdezh9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezEyfSQvaSxcblxuICAvLyA3LjMuNi4gdXJpLXRlbXBsYXRlXG4gICd1cmktdGVtcGxhdGUnOiAvKCVbMC05YS1mXXsyfXxbISMkJigtOz0/QFxcW1xcXV9hLXp+XXxcXHtbISMmKywuLzs9P0B8XT8oJVswLTlhLWZdezJ9fFswLTlfYS16XSkoXFwuPyglWzAtOWEtZl17Mn18WzAtOV9hLXpdKSkqKDpbMS05XVxcZHswLDN9fFxcKik/KCwoJVswLTlhLWZdezJ9fFswLTlfYS16XSkoXFwuPyglWzAtOWEtZl17Mn18WzAtOV9hLXpdKSkqKDpbMS05XVxcZHswLDN9fFxcKik/KSpcXH0pKi9pdSxcblxuICAvLyA3LjMuNy4gSlNPTiBQb2ludGVyc1xuICAnanNvbi1wb2ludGVyJzogL14oXFwvKFtcXHgwMC1cXHgyZTAtQFxcWy19XFx4N2ZdfH5bMDFdKSopKiQvaXUsXG4gICdyZWxhdGl2ZS1qc29uLXBvaW50ZXInOiAvXlxcZCsoI3woXFwvKFtcXHgwMC1cXHgyZTAtQFxcWy19XFx4N2ZdfH5bMDFdKSopKikkL2l1LFxuXG4gIC8vIGhvc3RuYW1lIHJlZ2V4IGZyb206IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0MjAyMjUvNTYyOFxuICAnaG9zdG5hbWUnOiAvXig/PS57MSwyNTV9JClbMC05QS1aYS16XSg/Oig/OlswLTlBLVphLXpdfC0pezAsNjF9WzAtOUEtWmEtel0pPyg/OlxcLlswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KSpcXC4/JC8sXG4gICdob3N0LW5hbWUnOiAvXig/PS57MSwyNTV9JClbMC05QS1aYS16XSg/Oig/OlswLTlBLVphLXpdfC0pezAsNjF9WzAtOUEtWmEtel0pPyg/OlxcLlswLTlBLVphLXpdKD86KD86WzAtOUEtWmEtel18LSl7MCw2MX1bMC05QS1aYS16XSk/KSpcXC4/JC8sXG5cbiAgJ3V0Yy1taWxsaXNlYyc6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHJldHVybiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgJiYgcGFyc2VGbG9hdChpbnB1dCkgPT09IHBhcnNlSW50KGlucHV0LCAxMCkgJiYgIWlzTmFOKGlucHV0KTtcbiAgfSxcblxuICAvLyA3LjMuOC4gcmVnZXhcbiAgJ3JlZ2V4JzogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBSZWdFeHAoaW5wdXQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuXG4gIC8vIE90aGVyIGRlZmluaXRpb25zXG4gIC8vIFwic3R5bGVcIiB3YXMgcmVtb3ZlZCBmcm9tIEpTT04gU2NoZW1hIGluIGRyYWZ0LTQgYW5kIGlzIGRlcHJlY2F0ZWRcbiAgJ3N0eWxlJzogL1tcXHJcXG5cXHQgXSpbXlxcclxcblxcdCBdW146XSo6W1xcclxcblxcdCBdKlteXFxyXFxuXFx0IDtdKltcXHJcXG5cXHQgXSo7Py8sXG4gIC8vIFwiY29sb3JcIiB3YXMgcmVtb3ZlZCBmcm9tIEpTT04gU2NoZW1hIGluIGRyYWZ0LTQgYW5kIGlzIGRlcHJlY2F0ZWRcbiAgJ2NvbG9yJzogL14oIz8oWzAtOUEtRmEtZl17M30pezEsMn1cXGJ8YXF1YXxibGFja3xibHVlfGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfG1hcm9vbnxuYXZ5fG9saXZlfG9yYW5nZXxwdXJwbGV8cmVkfHNpbHZlcnx0ZWFsfHdoaXRlfHllbGxvd3wocmdiXFwoXFxzKlxcYihbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXFxiXFxzKixcXHMqXFxiKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcXGJcXHMqLFxccypcXGIoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKVxcYlxccypcXCkpfChyZ2JcXChcXHMqKFxcZD9cXGQlfDEwMCUpK1xccyosXFxzKihcXGQ/XFxkJXwxMDAlKStcXHMqLFxccyooXFxkP1xcZCV8MTAwJSkrXFxzKlxcKSkpJC8sXG4gICdwaG9uZSc6IC9eXFwrKD86WzAtOV0gPyl7NiwxNH1bMC05XSQvLFxuICAnYWxwaGEnOiAvXlthLXpBLVpdKyQvLFxuICAnYWxwaGFudW1lcmljJzogL15bYS16QS1aMC05XSskLyxcbn07XG5cbkZPUk1BVF9SRUdFWFBTLnJlZ2V4cCA9IEZPUk1BVF9SRUdFWFBTLnJlZ2V4O1xuRk9STUFUX1JFR0VYUFMucGF0dGVybiA9IEZPUk1BVF9SRUdFWFBTLnJlZ2V4O1xuRk9STUFUX1JFR0VYUFMuaXB2NCA9IEZPUk1BVF9SRUdFWFBTWydpcC1hZGRyZXNzJ107XG5cbmV4cG9ydHMuaXNGb3JtYXQgPSBmdW5jdGlvbiBpc0Zvcm1hdCAoaW5wdXQsIGZvcm1hdCwgdmFsaWRhdG9yKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIEZPUk1BVF9SRUdFWFBTW2Zvcm1hdF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChGT1JNQVRfUkVHRVhQU1tmb3JtYXRdIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gRk9STUFUX1JFR0VYUFNbZm9ybWF0XS50ZXN0KGlucHV0KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBGT1JNQVRfUkVHRVhQU1tmb3JtYXRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gRk9STUFUX1JFR0VYUFNbZm9ybWF0XShpbnB1dCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbGlkYXRvciAmJiB2YWxpZGF0b3IuY3VzdG9tRm9ybWF0cyAmJlxuICAgICAgdHlwZW9mIHZhbGlkYXRvci5jdXN0b21Gb3JtYXRzW2Zvcm1hdF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsaWRhdG9yLmN1c3RvbUZvcm1hdHNbZm9ybWF0XShpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgbWFrZVN1ZmZpeCA9IGV4cG9ydHMubWFrZVN1ZmZpeCA9IGZ1bmN0aW9uIG1ha2VTdWZmaXggKGtleSkge1xuICBrZXkgPSBrZXkudG9TdHJpbmcoKTtcbiAgLy8gVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBjYXBhYmxlIG9mIG91dHB1dHRpbmcgdmFsaWQgYSBFQ01BU2NyaXB0IHN0cmluZywgYnV0IHRoZVxuICAvLyByZXN1bHRpbmcgY29kZSBmb3IgdGVzdGluZyB3aGljaCBmb3JtIHRvIHVzZSB3b3VsZCBiZSB0ZW5zIG9mIHRob3VzYW5kcyBvZiBjaGFyYWN0ZXJzIGxvbmdcbiAgLy8gVGhhdCBtZWFucyB0aGlzIHdpbGwgdXNlIHRoZSBuYW1lIGZvcm0gZm9yIHNvbWUgaWxsZWdhbCBmb3Jtc1xuICBpZiAoIWtleS5tYXRjaCgvWy5cXHNcXFtcXF1dLykgJiYgIWtleS5tYXRjaCgvXltcXGRdLykpIHtcbiAgICByZXR1cm4gJy4nICsga2V5O1xuICB9XG4gIGlmIChrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgcmV0dXJuICdbJyArIGtleSArICddJztcbiAgfVxuICByZXR1cm4gJ1snICsgSlNPTi5zdHJpbmdpZnkoa2V5KSArICddJztcbn07XG5cbmV4cG9ydHMuZGVlcENvbXBhcmVTdHJpY3QgPSBmdW5jdGlvbiBkZWVwQ29tcGFyZVN0cmljdCAoYSwgYikge1xuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGEuZXZlcnkoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgIHJldHVybiBkZWVwQ29tcGFyZVN0cmljdChhW2ldLCBiW2ldKTtcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKCFhIHx8ICFiKSB7XG4gICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICB9XG4gICAgdmFyIGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgdmFyIGJLZXlzID0gT2JqZWN0LmtleXMoYik7XG4gICAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhS2V5cy5ldmVyeShmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIGRlZXBDb21wYXJlU3RyaWN0KGFbdl0sIGJbdl0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBhID09PSBiO1xufTtcblxuZnVuY3Rpb24gZGVlcE1lcmdlciAodGFyZ2V0LCBkc3QsIGUsIGkpIHtcbiAgaWYgKHR5cGVvZiBlID09PSAnb2JqZWN0Jykge1xuICAgIGRzdFtpXSA9IGRlZXBNZXJnZSh0YXJnZXRbaV0sIGUpO1xuICB9IGVsc2Uge1xuICAgIGlmICh0YXJnZXQuaW5kZXhPZihlKSA9PT0gLTEpIHtcbiAgICAgIGRzdC5wdXNoKGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5aXN0IChzcmMsIGRzdCwga2V5KSB7XG4gIGRzdFtrZXldID0gc3JjW2tleV07XG59XG5cbmZ1bmN0aW9uIGNvcHlpc3RXaXRoRGVlcE1lcmdlICh0YXJnZXQsIHNyYywgZHN0LCBrZXkpIHtcbiAgaWYgKHR5cGVvZiBzcmNba2V5XSAhPT0gJ29iamVjdCcgfHwgIXNyY1trZXldKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoIXRhcmdldFtrZXldKSB7XG4gICAgICBkc3Rba2V5XSA9IHNyY1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBkc3Rba2V5XSA9IGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc3JjW2tleV0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2UgKHRhcmdldCwgc3JjKSB7XG4gIHZhciBhcnJheSA9IEFycmF5LmlzQXJyYXkoc3JjKTtcbiAgdmFyIGRzdCA9IGFycmF5ICYmIFtdIHx8IHt9O1xuXG4gIGlmIChhcnJheSkge1xuICAgIHRhcmdldCA9IHRhcmdldCB8fCBbXTtcbiAgICBkc3QgPSBkc3QuY29uY2F0KHRhcmdldCk7XG4gICAgc3JjLmZvckVhY2goZGVlcE1lcmdlci5iaW5kKG51bGwsIHRhcmdldCwgZHN0KSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgT2JqZWN0LmtleXModGFyZ2V0KS5mb3JFYWNoKGNvcHlpc3QuYmluZChudWxsLCB0YXJnZXQsIGRzdCkpO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhzcmMpLmZvckVhY2goY29weWlzdFdpdGhEZWVwTWVyZ2UuYmluZChudWxsLCB0YXJnZXQsIHNyYywgZHN0KSk7XG4gIH1cblxuICByZXR1cm4gZHN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cy5kZWVwTWVyZ2UgPSBkZWVwTWVyZ2U7XG5cbi8qKlxuICogVmFsaWRhdGVzIGluc3RhbmNlIGFnYWluc3QgdGhlIHByb3ZpZGVkIHNjaGVtYVxuICogSW1wbGVtZW50cyBVUkkrSlNPTiBQb2ludGVyIGVuY29kaW5nLCBlLmcuIFwiJTdlXCI9XCJ+MFwiPT5cIn5cIiwgXCJ+MVwiPVwiJTJmXCI9PlwiL1wiXG4gKiBAcGFyYW0gb1xuICogQHBhcmFtIHMgVGhlIHBhdGggdG8gd2FsayBvIGFsb25nXG4gKiBAcmV0dXJuIGFueVxuICovXG5leHBvcnRzLm9iamVjdEdldFBhdGggPSBmdW5jdGlvbiBvYmplY3RHZXRQYXRoKG8sIHMpIHtcbiAgdmFyIHBhcnRzID0gcy5zcGxpdCgnLycpLnNsaWNlKDEpO1xuICB2YXIgaztcbiAgd2hpbGUgKHR5cGVvZiAoaz1wYXJ0cy5zaGlmdCgpKSA9PSAnc3RyaW5nJykge1xuICAgIHZhciBuID0gZGVjb2RlVVJJQ29tcG9uZW50KGsucmVwbGFjZSgvfjAvLCd+JykucmVwbGFjZSgvfjEvZywnLycpKTtcbiAgICBpZiAoIShuIGluIG8pKSByZXR1cm47XG4gICAgbyA9IG9bbl07XG4gIH1cbiAgcmV0dXJuIG87XG59O1xuXG5mdW5jdGlvbiBwYXRoRW5jb2RlciAodikge1xuICByZXR1cm4gJy8nK2VuY29kZVVSSUNvbXBvbmVudCh2KS5yZXBsYWNlKC9+L2csJyU3RScpO1xufVxuLyoqXG4gKiBBY2NlcHQgYW4gQXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHJldHVybiBhIEpTT04gUG9pbnRlciBVUkkgZnJhZ21lbnRcbiAqIEBwYXJhbSBBcnJheSBhXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydHMuZW5jb2RlUGF0aCA9IGZ1bmN0aW9uIGVuY29kZVBvaW50ZXIoYSl7XG4gIC8vIH4gbXVzdCBiZSBlbmNvZGVkIGV4cGxpY2l0bHkgYmVjYXVzZSBoYWNrc1xuICAvLyB0aGUgc2xhc2ggaXMgZW5jb2RlZCBieSBlbmNvZGVVUklDb21wb25lbnRcbiAgcmV0dXJuIGEubWFwKHBhdGhFbmNvZGVyKS5qb2luKCcnKTtcbn07XG5cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyBhIG51bWJlciB1c2VzXG4gKiBXZSBuZWVkIHRoaXMgdG8gZ2V0IGNvcnJlY3QgcmVzdWx0cyBvdXQgb2YgbXVsdGlwbGVPZiBhbmQgZGl2aXNpYmxlQnlcbiAqIHdoZW4gZWl0aGVyIGZpZ3VyZSBpcyBoYXMgZGVjaW1hbCBwbGFjZXMsIGR1ZSB0byBJRUVFLTc1NCBmbG9hdCBpc3N1ZXMuXG4gKiBAcGFyYW0gbnVtYmVyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnRzLmdldERlY2ltYWxQbGFjZXMgPSBmdW5jdGlvbiBnZXREZWNpbWFsUGxhY2VzKG51bWJlcikge1xuXG4gIHZhciBkZWNpbWFsUGxhY2VzID0gMDtcbiAgaWYgKGlzTmFOKG51bWJlcikpIHJldHVybiBkZWNpbWFsUGxhY2VzO1xuXG4gIGlmICh0eXBlb2YgbnVtYmVyICE9PSAnbnVtYmVyJykge1xuICAgIG51bWJlciA9IE51bWJlcihudW1iZXIpO1xuICB9XG5cbiAgdmFyIHBhcnRzID0gbnVtYmVyLnRvU3RyaW5nKCkuc3BsaXQoJ2UnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgIGlmIChwYXJ0c1sxXVswXSAhPT0gJy0nKSB7XG4gICAgICByZXR1cm4gZGVjaW1hbFBsYWNlcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjaW1hbFBsYWNlcyA9IE51bWJlcihwYXJ0c1sxXS5zbGljZSgxKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGRlY2ltYWxQYXJ0cyA9IHBhcnRzWzBdLnNwbGl0KCcuJyk7XG4gIGlmIChkZWNpbWFsUGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgZGVjaW1hbFBsYWNlcyArPSBkZWNpbWFsUGFydHNbMV0ubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIGRlY2ltYWxQbGFjZXM7XG59O1xuXG5leHBvcnRzLmlzU2NoZW1hID0gZnVuY3Rpb24gaXNTY2hlbWEodmFsKXtcbiAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwpIHx8ICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpO1xufTtcblxuIiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdHJpbmdpZnkvcGFyc2UgZnVuY3Rpb25zIHRoYXQgZG9uJ3Qgb3BlcmF0ZVxuICogcmVjdXJzaXZlbHksIHNvIHRoZXkgYXZvaWQgY2FsbCBzdGFjayBleGNlZWRlZFxuICogZXJyb3JzLlxuICovXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpbnB1dCkge1xuICB2YXIgcXVldWUgPSBbXTtcbiAgcXVldWUucHVzaCh7b2JqOiBpbnB1dH0pO1xuXG4gIHZhciByZXMgPSAnJztcbiAgdmFyIG5leHQsIG9iaiwgcHJlZml4LCB2YWwsIGksIGFycmF5UHJlZml4LCBrZXlzLCBrLCBrZXksIHZhbHVlLCBvYmpQcmVmaXg7XG4gIHdoaWxlICgobmV4dCA9IHF1ZXVlLnBvcCgpKSkge1xuICAgIG9iaiA9IG5leHQub2JqO1xuICAgIHByZWZpeCA9IG5leHQucHJlZml4IHx8ICcnO1xuICAgIHZhbCA9IG5leHQudmFsIHx8ICcnO1xuICAgIHJlcyArPSBwcmVmaXg7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmVzICs9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICByZXMgKz0gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgcmVzICs9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcXVldWUucHVzaCh7dmFsOiAnXSd9KTtcbiAgICAgIGZvciAoaSA9IG9iai5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhcnJheVByZWZpeCA9IGkgPT09IDAgPyAnJyA6ICcsJztcbiAgICAgICAgcXVldWUucHVzaCh7b2JqOiBvYmpbaV0sIHByZWZpeDogYXJyYXlQcmVmaXh9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ1snfSk7XG4gICAgfSBlbHNlIHsgLy8gb2JqZWN0XG4gICAgICBrZXlzID0gW107XG4gICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICBrZXlzLnB1c2goayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goe3ZhbDogJ30nfSk7XG4gICAgICBmb3IgKGkgPSBrZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIG9ialByZWZpeCA9IChpID4gMCA/ICcsJyA6ICcnKTtcbiAgICAgICAgb2JqUHJlZml4ICs9IEpTT04uc3RyaW5naWZ5KGtleSkgKyAnOic7XG4gICAgICAgIHF1ZXVlLnB1c2goe29iajogdmFsdWUsIHByZWZpeDogb2JqUHJlZml4fSk7XG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKHt2YWw6ICd7J30pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoZSBwYXJzZSBmdW5jdGlvbi5cbi8vIFRoaXMgcG9wIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbVxuLy8gcG91Y2hDb2xsYXRlLnBhcnNlSW5kZXhhYmxlU3RyaW5nXG5mdW5jdGlvbiBwb3Aob2JqLCBzdGFjaywgbWV0YVN0YWNrKSB7XG4gIHZhciBsYXN0TWV0YUVsZW1lbnQgPSBtZXRhU3RhY2tbbWV0YVN0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAob2JqID09PSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudCkge1xuICAgIC8vIHBvcHBpbmcgYSBtZXRhLWVsZW1lbnQsIGUuZy4gYW4gb2JqZWN0IHdob3NlIHZhbHVlIGlzIGFub3RoZXIgb2JqZWN0XG4gICAgbWV0YVN0YWNrLnBvcCgpO1xuICAgIGxhc3RNZXRhRWxlbWVudCA9IG1ldGFTdGFja1ttZXRhU3RhY2subGVuZ3RoIC0gMV07XG4gIH1cbiAgdmFyIGVsZW1lbnQgPSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudDtcbiAgdmFyIGxhc3RFbGVtZW50SW5kZXggPSBsYXN0TWV0YUVsZW1lbnQuaW5kZXg7XG4gIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudC5wdXNoKG9iaik7XG4gIH0gZWxzZSBpZiAobGFzdEVsZW1lbnRJbmRleCA9PT0gc3RhY2subGVuZ3RoIC0gMikgeyAvLyBvYmogd2l0aCBrZXkrdmFsdWVcbiAgICB2YXIga2V5ID0gc3RhY2sucG9wKCk7XG4gICAgZWxlbWVudFtrZXldID0gb2JqO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gob2JqKTsgLy8gb2JqIHdpdGgga2V5IG9ubHlcbiAgfVxufVxuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG1ldGFTdGFjayA9IFtdOyAvLyBzdGFjayBmb3IgYXJyYXlzIGFuZCBvYmplY3RzXG4gIHZhciBpID0gMDtcbiAgdmFyIGNvbGxhdGlvbkluZGV4LHBhcnNlZE51bSxudW1DaGFyO1xuICB2YXIgcGFyc2VkU3RyaW5nLGxhc3RDaCxudW1Db25zZWN1dGl2ZVNsYXNoZXMsY2g7XG4gIHZhciBhcnJheUVsZW1lbnQsIG9iakVsZW1lbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29sbGF0aW9uSW5kZXggPSBzdHJbaSsrXTtcbiAgICBpZiAoY29sbGF0aW9uSW5kZXggPT09ICd9JyB8fFxuICAgICAgICBjb2xsYXRpb25JbmRleCA9PT0gJ10nIHx8XG4gICAgICAgIHR5cGVvZiBjb2xsYXRpb25JbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9wKHN0YWNrLnBvcCgpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoY29sbGF0aW9uSW5kZXgpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnXFx0JzpcbiAgICAgIGNhc2UgJ1xcbic6XG4gICAgICBjYXNlICc6JzpcbiAgICAgIGNhc2UgJywnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ24nOlxuICAgICAgICBpICs9IDM7IC8vICd1bGwnXG4gICAgICAgIHBvcChudWxsLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgaSArPSAzOyAvLyAncnVlJ1xuICAgICAgICBwb3AodHJ1ZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZic6XG4gICAgICAgIGkgKz0gNDsgLy8gJ2Fsc2UnXG4gICAgICAgIHBvcChmYWxzZSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMCc6XG4gICAgICBjYXNlICcxJzpcbiAgICAgIGNhc2UgJzInOlxuICAgICAgY2FzZSAnMyc6XG4gICAgICBjYXNlICc0JzpcbiAgICAgIGNhc2UgJzUnOlxuICAgICAgY2FzZSAnNic6XG4gICAgICBjYXNlICc3JzpcbiAgICAgIGNhc2UgJzgnOlxuICAgICAgY2FzZSAnOSc6XG4gICAgICBjYXNlICctJzpcbiAgICAgICAgcGFyc2VkTnVtID0gJyc7XG4gICAgICAgIGktLTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBudW1DaGFyID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKC9bXFxkXFwuXFwtZVxcK10vLnRlc3QobnVtQ2hhcikpIHtcbiAgICAgICAgICAgIHBhcnNlZE51bSArPSBudW1DaGFyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKHBhcnNlRmxvYXQocGFyc2VkTnVtKSwgc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnXCInOlxuICAgICAgICBwYXJzZWRTdHJpbmcgPSAnJztcbiAgICAgICAgbGFzdENoID0gdm9pZCAwO1xuICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNoID0gc3RyW2krK107XG4gICAgICAgICAgaWYgKGNoICE9PSAnXCInIHx8IChsYXN0Q2ggPT09ICdcXFxcJyAmJlxuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgJSAyID09PSAxKSkge1xuICAgICAgICAgICAgcGFyc2VkU3RyaW5nICs9IGNoO1xuICAgICAgICAgICAgbGFzdENoID0gY2g7XG4gICAgICAgICAgICBpZiAobGFzdENoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgbnVtQ29uc2VjdXRpdmVTbGFzaGVzKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBudW1Db25zZWN1dGl2ZVNsYXNoZXMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcG9wKEpTT04ucGFyc2UoJ1wiJyArIHBhcnNlZFN0cmluZyArICdcIicpLCBzdGFjaywgbWV0YVN0YWNrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdbJzpcbiAgICAgICAgYXJyYXlFbGVtZW50ID0geyBlbGVtZW50OiBbXSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKGFycmF5RWxlbWVudC5lbGVtZW50KTtcbiAgICAgICAgbWV0YVN0YWNrLnB1c2goYXJyYXlFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd7JzpcbiAgICAgICAgb2JqRWxlbWVudCA9IHsgZWxlbWVudDoge30sIGluZGV4OiBzdGFjay5sZW5ndGggfTtcbiAgICAgICAgc3RhY2sucHVzaChvYmpFbGVtZW50LmVsZW1lbnQpO1xuICAgICAgICBtZXRhU3RhY2sucHVzaChvYmpFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3VuZXhwZWN0ZWRseSByZWFjaGVkIGVuZCBvZiBpbnB1dDogJyArIGNvbGxhdGlvbkluZGV4KTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCJpbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgRHJhZ0FjdGlvbiwgRWRpdG9yQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQkJveCwgaXNPdXRPZlNWR0JvdW5kcywgZ2V0R2x5cGhCQm94IH0gZnJvbSAnLi9Db29yZGluYXRlcyc7XG5pbXBvcnQgeyBxdWV1ZU5vdGlmaWNhdGlvbiB9IGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IHNlbGVjdEFsbCwgc2VsZWN0QkJveCwgc2VsZWN0U3RhZmYgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcblxuY2xhc3MgRHJhZ0hhbmRsZXIge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHByaXZhdGUgc2VsZWN0b3I6IHN0cmluZztcbiAgcHJpdmF0ZSBzZWxlY3Rpb246IFNWR0dyYXBoaWNzRWxlbWVudFtdO1xuICBwcml2YXRlIG5vTW92ZVByZWNlZGVzOiBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBwcml2YXRlIGRyYWdTdGFydENvb3JkczogW251bWJlciwgbnVtYmVyXSA9IFstMSwgLTFdO1xuICBwcml2YXRlIHJlc2V0VG9BY3Rpb246IChzZWxlY3Rpb246IGQzLlNlbGVjdGlvbjxkMy5CYXNlVHlwZSwgdW5rbm93biwgSFRNTEVsZW1lbnQsIHVua25vd24+LCBhcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBkeDogbnVtYmVyO1xuICBwcml2YXRlIGR5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIENTUyBzZWxlY3RvciBvZiBlbGVtZW50IHRvIGFwcGx5IGRyYWcgaGFuZGxlciB0by5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGRyYWdnaW5nIGFjdGlvbiBhbmQgaGFuZGxlciBmb3Igc2VsZWN0ZWQgZWxlbWVudHMuXG4gICAqL1xuICBkcmFnSW5pdCAoKTogdm9pZCB7XG4gICAgLy8gRHJhZyBlZmZlY3RzXG4gICAgZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQgKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnU3RhcnRDb29yZHMgPSBbZDMuZXZlbnQueCwgZDMuZXZlbnQueV07XG4gICAgICB0aGlzLmR4ID0gMDtcbiAgICAgIHRoaXMuZHkgPSAwO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZDMuZXZlbnQuc291cmNlRXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHtcbiAgICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwoZHJhZ0JlaGF2aW91cik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkaW5nIGxpc3RlbmVyc1xuICAgIGNvbnN0IGRyYWdCZWhhdmlvdXIgPSBkMy5kcmFnKClcbiAgICAgIC5vbignc3RhcnQnLCBkcmFnU3RhcnRlZC5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdkcmFnJywgdGhpcy5kcmFnZ2luZy5iaW5kKHRoaXMpKVxuICAgICAgLm9uKCdlbmQnLCB0aGlzLmRyYWdFbmRlZC5iaW5kKHRoaXMpKTtcblxuICAgIGNvbnN0IGFjdGl2ZU5jID0gZDMuc2VsZWN0QWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBhY3RpdmVOYy5jYWxsKGRyYWdCZWhhdmlvdXIpO1xuXG4gICAgbGV0IHNlbGVjdGlvbiA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcuc2VsZWN0ZWQnKSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBkcmFncyB0aGUgZm9sbG93cyBzeWxsYWJsZSBpbiBhIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUsIFxuICAgIC8vIGNhbmNlbCB0aGUgY29tcGVuc2F0aW9uIGZvciBzeWwgbW92ZW1lbnQgaW4gZHJhZ2dpbmcuXG4gICAgdGhpcy5ub01vdmVQcmVjZWRlcyA9IHNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpICYmIGVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykpO1xuICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5maWx0ZXIoZWwgPT4gIWVsLmNsYXNzTGlzdC5jb250YWlucygnbm8tbW92aW5nJykpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24uY29uY2F0KEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxTVkdHcmFwaGljc0VsZW1lbnQ+KCcucmVzaXplUG9pbnQnKSkpO1xuICB9XG5cbiAgZHJhZ2dpbmcgKCk6IHZvaWQge1xuICAgIHRoaXMuZHggPSBkMy5ldmVudC54IC0gdGhpcy5kcmFnU3RhcnRDb29yZHNbMF07XG4gICAgdGhpcy5keSA9IGQzLmV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydENvb3Jkc1sxXTtcblxuICAgIHRoaXMubW92ZUVsZW1lbnRzKHRoaXMuc2VsZWN0aW9uLCB0aGlzLmR4LCB0aGlzLmR5KTtcblxuICAgIC8qXG4gICAgICogaWYgd2UncmUgZHJhZ2dpbmcgYSBzeWxsYWJsZSAob3IgbmV1bWUgZXRjKSB0aGVuIHRoZXJlIHdvbid0IGJlIGEgc3lsIHNlbGVjdGVkXG4gICAgICogdGhlbiB3ZSBkb24ndCB3YW50IHRoZSBib3VuZGluZyBib3ggKGlmIGl0IGlzIGRpc3BsYXllZCkgdG8gbW92ZSB3aGVuIGRyYWdnaW5nIHRoZSBuZXVtZXNcbiAgICAgKiBpdCB3aWxsIGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQgaW4gc2VsZWN0aW9uLCBzbyBpdCB3aWxsIGdldCBtb3ZlZCBpbiB0aGUgYWJvdmUgbG9vcFxuICAgICAqIHNvIHdlIGNhbmNlbCB0aGF0IG1vdmVtZW50IG91dCBoZXJlXG4gICAgICovXG4gICAgY29uc3Qgc3lscyA9IHRoaXMuc2VsZWN0aW9uLmZpbHRlcigoZWwpID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnc3lsJykpO1xuICAgIGlmIChzeWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLm5vTW92ZVByZWNlZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMubW92ZUVsZW1lbnRzKGJib3hlcywgLXRoaXMuZHgsIC10aGlzLmR5KTtcbiAgICB9XG4gIH1cblxuXG4gIGRyYWdFbmRlZCAoKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBoYXMgbm90IGJlZW4gbW92ZWQgbW9yZSB0aGFuIDUgcGl4ZWxzIGluIGFueSBkaXJlY3Rpb24sXG4gICAgLy8gZG8gbm90IGRvIGFueSBhY3Rpb25cbiAgICBjb25zdCB4RGlmZiA9IE1hdGguYWJzKHRoaXMuZHgpLCB5RGlmZiA9IE1hdGguYWJzKHRoaXMuZHkpO1xuICAgIGlmICh4RGlmZiA8PSA1ICYmIHlEaWZmIDw9IDUpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuZHJhZ0luaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgc2VsZWN0aW9uIGZvciBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKGVsKSA9PiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemVQb2ludCcpKTtcblxuICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIG91dCBvZiBib3VuZHMsXG4gICAgLy8gZHJhZyBhY3Rpb25zIHNob3VsZCBub3QgaGFwcGVuLiBSZXR1cm4gYW4gZXJyb3Igbm90aWZpY2F0aW9uIGFuZCByZXNldFxuICAgIC8vIHRoZSBkcmFnIGhhbmRsZXJcbiAgICBpZiAodGhpcy5pc0N1cnNvck91dE9mQm91bmRzKCkgfHwgdGhpcy5pc0RyYWdPdXRPZkJvdW5kcyhzZWxlY3Rpb24pKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIHNlbGVjdGlvbiBiYWNrIHRvIG5vcm1hbCBzdGF0ZVxuICAgICAgdGhpcy5yZXR1cm5FbGVtZW50cyh0aGlzLnNlbGVjdGlvbik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgYm91bmRpbmcgYm94ZXMgYXMgd2VsbFxuICAgICAgY29uc3QgYmJveGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsbGFibGUuc2VsZWN0ZWQnKSlcbiAgICAgICAgLm1hcChlbCA9PiBlbC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcbiAgICAgIHRoaXMucmV0dXJuRWxlbWVudHMoYmJveGVzKTtcblxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIERyYWcgYWN0aW9uIGZhaWxlZC4nLCAnZXJyb3InKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNoYWluIGVkaXRvciBhY3Rpb24gZm9yIHNlbGVjdGlvblxuICAgIGNvbnN0IHBhcmFtQXJyYXk6IEVkaXRvckFjdGlvbltdID0gW107XG4gICAgc2VsZWN0aW9uLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGVsLnRhZ05hbWUgPT09ICdyZWN0JyA/IGVsLmNsb3Nlc3QoJy5zeWwnKS5pZCA6IGVsLmlkO1xuXG4gICAgICBjb25zdCBkcmFnQWN0aW9uOiBEcmFnQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdkcmFnJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHg6IHRoaXMuZHgsXG4gICAgICAgICAgeTogLXRoaXMuZHksXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHBhcmFtQXJyYXkucHVzaChkcmFnQWN0aW9uKTtcbiAgICB9KTtcbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgIHBhcmFtOiBwYXJhbUFycmF5XG4gICAgfTtcblxuICAgIC8vIFNlbmQgZWRpdG9yIGFjdGlvblxuICAgIHRoaXMubmVvblZpZXdcbiAgICAgIC5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE5lb24gcmUtcmVuZGVycyB0aGUgZW50aXJlIFNWRywgYW5kIGhlbmNlLCBiZWZvcmUgd2UgZG8gc28sXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgYWxsIHRoZSBlbGVtZW50cyAoSURzKSB3ZSBuZWVkIHRvIHNlbGVjdCBhZ2FpblxuICAgICAgICAvLyBUaGVuLCB3ZSBuZWVkIHRvIHJlc2VsZWN0IHRoZW0gYnkgY2FsbGluZyBgdGhpcy5yZXNlbGVjdCgpYFxuICAgICAgICBjb25zdCB0b1Jlc2VsZWN0ID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKSlcbiAgICAgICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ25vLW1vdmluZycpKVxuICAgICAgICAgIC5tYXAoZWwgPT4gZWwuaWQpO1xuXG4gICAgICAgIC8vIENBVVRJT046IGB1cGRhdGVGb3JDdXJyZW50UGFnZSgpYCBpcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24hXG4gICAgICAgIC8vIEl0IHJlcXVpcmVzIGFuIGBhd2FpdGAga2V5d29yZC5cbiAgICAgICAgYXdhaXQgdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLmVuZE9wdGlvbnNTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIC8vIFJlc2VsZWN0IHRoZSBlbGVtZW50cyBhbmQgcmVpbml0aWFsaXplIGRyYWdcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNlbGVjdCh0b1Jlc2VsZWN0KTtcbiAgICAgICAgdGhpcy5kcmFnSW5pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyByZXNlbGVjdCAodG9SZXNlbGVjdDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNlbGVjdGVkID0gdG9SZXNlbGVjdC5tYXAoaWQgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxTVkdHcmFwaGljc0VsZW1lbnQ+KGAjJHtpZH1gKSk7XG5cbiAgICAvLyBBbGwgZ2x5cGhzIGV4Y2VwdCBib3VkaW5nIGJveGVzICgnc3lsJ3MpIG11c3QgYmUgc2VsZWN0ZWQgd2l0aFxuICAgIC8vIGBzZWxlY3RBbGwoKWBcbiAgICByZXNlbGVjdGVkXG4gICAgICAuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKVxuICAgICAgLmZvckVhY2goYXN5bmMgKCkgPT4gYXdhaXQgc2VsZWN0QWxsKHJlc2VsZWN0ZWQsIHRoaXMubmVvblZpZXcsIHRoaXMpKTtcblxuICAgIC8vIEJvdW5kaW5nIGJveGVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0QkJveCgpYFxuICAgIHJlc2VsZWN0ZWRcbiAgICAgIC5maWx0ZXIoZWwgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSlcbiAgICAgIC5mb3JFYWNoKFxuICAgICAgICBlbCA9PiBzZWxlY3RCQm94KGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIHRoaXMsIHRoaXMubmVvblZpZXcpXG4gICAgICApO1xuXG4gICAgLy8gU3RhdmVzIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZCB1c2luZyBgc2VsZWN0U3RhZmYoKWBcbiAgICAvLyBBTkQgbXVzdCBiZSBzZWxlY3RlZCB3aXRoIGBzZWxlY3RBbGwoKWAgZm9yIGNvcnJlY3QgYmVoYXZpb3IgKGZvciBzb21lIHJlYXNvbikuXG4gICAgcmVzZWxlY3RlZFxuICAgICAgLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpXG4gICAgICAuZm9yRWFjaChlbCA9PiBzZWxlY3RTdGFmZihlbCwgdGhpcykpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgZDMgYWN0aW9uIHRvIHVzZSBmb3IgW1tyZXNldF1dLiAqL1xuICByZXNldFRvIChyZXNldDogKHNlbGVjdGlvbjogZDMuU2VsZWN0aW9uPGQzLkJhc2VUeXBlLCB1bmtub3duLCBIVE1MRWxlbWVudCwgdW5rbm93bj4sIGFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRUb0FjdGlvbiA9IHJlc2V0O1xuICB9XG5cbiAgLyoqIFJlc2V0IHRvIGEgcHJldmlvdXMgZDMgYWN0aW9uIGZvciBbW3RoaXMuc2VsZWN0b3JdXS4gKi9cbiAgcmVzZXQgKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2V0VG9BY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZDMuc2VsZWN0KHRoaXMuc2VsZWN0b3IpLmNhbGwodGhpcy5yZXNldFRvQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBlbmRPcHRpb25zU2VsZWN0aW9uICgpOiB2b2lkIHtcbiAgICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICAgIGNvbnN0IGV4dHJhRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKTtcbiAgICBpZiAobW9yZUVkaXQpIHtcbiAgICAgIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhRWRpdCkge1xuICAgICAgZXh0cmFFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgZXh0cmFFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc3VhbGx5IG1vdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGJ5IGBkeGAgYW5kIGBkeWA7IChub3QgdXNpbmcgZDMpXG4gICAqL1xuICBtb3ZlRWxlbWVudHMgKHNlbGVjdGlvbjogRWxlbWVudFtdLCBkeDogbnVtYmVyLCBkeTogbnVtYmVyKTogdm9pZCB7XG4gICAgc2VsZWN0aW9uLmZpbHRlcihlbCA9PiBlbCAhPT0gbnVsbCkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2R4fSwke2R5fSlgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXN1YWxseSByZXR1cm4gc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgcG9zaXRpb25zXG4gICAqIGJ5IHJlbW92aW5nIHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlXG4gICAqL1xuICByZXR1cm5FbGVtZW50cyAoc2VsZWN0aW9uOiBFbGVtZW50W10pOiB2b2lkIHtcbiAgICBzZWxlY3Rpb24uZmlsdGVyKGVsID0+IGVsICE9PSBudWxsKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ3Vyc29yT3V0T2ZCb3VuZHMgKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVuZFggPSB0aGlzLmRyYWdTdGFydENvb3Jkc1swXSArIHRoaXMuZHg7XG4gICAgY29uc3QgZW5kWSA9IHRoaXMuZHJhZ1N0YXJ0Q29vcmRzWzFdICsgdGhpcy5keTtcblxuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKGVuZFgsIGVuZFkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGFycmF5IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBTVkdcbiAgICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnRbXX0gc2VsZWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJcyBzZWxlY3Rpb24gb3V0IG9mIGJvdW5kc1xuICAgKi9cbiAgaXNEcmFnT3V0T2ZCb3VuZHMgKHNlbGVjdGlvbjogU1ZHR3JhcGhpY3NFbGVtZW50W10pOiBib29sZWFuIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIGJveGVzIG9mIGFsbCBnbHlwaHMgKDx1c2U+IGVsZW1lbnRzKSB3aXRoaW4gdGhlIHNlbGVjdGlvbiBhcnJheVxuICAgIGNvbnN0IGlzQkJveERpc3BsYXllZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNkaXNwbGF5QkJveCcpLmNoZWNrZWQ7XG4gICAgbGV0IGdseXBoU2VsZWN0b3IgPSBpc0JCb3hEaXNwbGF5ZWQgPyAndXNlLCByZWN0JyA6ICd1c2UnO1xuXG4gICAgaWYgKHNlbGVjdGlvblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIGdseXBoU2VsZWN0b3IgPSAncGF0aCc7XG5cbiAgICBjb25zdCBnbHlwaHM6IFNWR1VzZUVsZW1lbnRbXSA9IHNlbGVjdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjLCBlbCkgPT4gYWNjLmNvbmNhdCguLi5lbC5xdWVyeVNlbGVjdG9yQWxsKGdseXBoU2VsZWN0b3IpKSwgW11cbiAgICApO1xuICAgIGNvbnN0IGdseXBoQkJveGVzOiBCQm94W10gPSBnbHlwaHMubWFwKGdldEdseXBoQkJveCk7XG5cbiAgICAvLyBHZXQgdGhlIHN1cnJvdW5kaW5nIGJvdW5kaW5nIGJveCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICBjb25zdCBzZWxlY3Rpb25CQm94OiBCQm94ID0gZ2x5cGhCQm94ZXMucmVkdWNlKFxuICAgICAgKGJib3gsIGN1cnIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bHg6IE1hdGgubWluKGJib3gudWx4LCBjdXJyLnVseCksXG4gICAgICAgICAgdWx5OiBNYXRoLm1pbihiYm94LnVseSwgY3Vyci51bHkpLFxuICAgICAgICAgIGxyeDogTWF0aC5tYXgoYmJveC5scngsIGN1cnIubHJ4KSxcbiAgICAgICAgICBscnk6IE1hdGgubWF4KGJib3gubHJ5LCBjdXJyLmxyeSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB1bHg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIHVseTogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbHJ4OiBOdW1iZXIuTUlOX1ZBTFVFLFxuICAgICAgICBscnk6IE51bWJlci5NSU5fVkFMVUUsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgdWx4LCB1bHksIGxyeCwgbHJ5IH0gPSBzZWxlY3Rpb25CQm94O1xuICAgIHJldHVybiBpc091dE9mU1ZHQm91bmRzKHVseCArIHRoaXMuZHgsIHVseSArIHRoaXMuZHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4ICsgdGhpcy5keCwgbHJ5ICsgdGhpcy5keSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRHJhZ0hhbmRsZXIgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgKiBhcyBXYXJuaW5ncyBmcm9tICcuLi9XYXJuaW5ncyc7XG5pbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCAqIGFzIFNlbGVjdFRvb2xzIGZyb20gJy4uL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi4vU3F1YXJlRWRpdC9TZWxlY3RPcHRpb25zJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIFRvZ2dsZUxpZ2F0dXJlQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgcmVtb3ZlSGFuZGxlciwgZGVsZXRlQnV0dG9uSGFuZGxlciB9IGZyb20gJy4vU2VsZWN0T3B0aW9ucyc7XG5cbi8qKlxuICogVGhlIE5lb25WaWV3IHBhcmVudCB0byBhY2Nlc3MgZWRpdG9yIGFjdGlvbnMuXG4gKi9cbmxldCBuZW9uVmlldzogTmVvblZpZXc7XG5cbi8qKlxuICogU2V0IHRoZSBuZW9uVmlldyBtZW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TmVvblZpZXcodmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgbmVvblZpZXcgPSB2aWV3O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGNhbiBiZSBncm91cGVkIG9yIG5vdFxuICogQHJldHVybnMgdHJ1ZSBpZiBjYW4gYmUgZ3JvdXBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyb3VwYWJsZShcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGVsZW1lbnRzLnZhbHVlcygpKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcblxuICBpZiAoZ3JvdXBzLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBjYW5ub3QgZ3JvdXAgaWYgb25seSAxIGVsZW1lbnQgaXMgc2VsZWN0ZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHNlbGVjdGlvblR5cGUpIHtcbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIC8vIGlmIG5ldW1lcyBhcmUgaW4gc2FtZSBzeWxsYWJsZSwgZG9uJ3QgZGlzcGxheSBncm91cGluZyBvcHRpb25cbiAgICAgIGlmIChTZWxlY3RUb29scy5zaGFyZWRMb2dpY2FsUGFyZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGNoZWNrIGlmIGFsbCBzZWxlY3RlZCBlbGVtZW50cyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlclxuICAgICAgaWYgKFNlbGVjdFRvb2xzLmFyZUFkamFjZW50KHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0xpbmtlZChcbiAgc2VsZWN0aW9uVHlwZTogc3RyaW5nLFxuICBlbGVtZW50cz86IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pIHtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gIH1cbiAgc3dpdGNoIChzZWxlY3Rpb25UeXBlKSB7XG4gICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5ldW1lJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSB8fFxuICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgICkge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdUaGUgYWN0aW9uIGludm9sdmVzIGxpbmtlZCBzeWxsYWJsZXMsIHBsZWFzZSB1bnRvZ2dsZSB0aGVtIGZpcnN0JyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlICdzZWxCeU5jJzpcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpIHx8XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnVGhlIGFjdGlvbiBpbnZvbHZlcyBsaW5rZWQgc3lsbGFibGVzLCBwbGVhc2UgdW50b2dnbGUgdGhlbSBmaXJzdCcsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0ludmFsaWRMaW5rZWRTeWxsYWJsZShcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElOR1xuICAgICkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBlbGVtZW50cy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgY29uc3Qgc3lsbGFibGUgPSBlbGVtZW50cy5hdChpZHgpO1xuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAvLyBHZXQgeG1sOmlkIG9mIHRoZSBuZXh0IHN5bGxhYmxlICh3aXRob3V0IHRoZSAjLCBpZiBpdCBleGlzdHMpXG4gICAgICBjb25zdCBuZXh0U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpXG4gICAgICAgIC5yZXBsYWNlKCcjJywgJycpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBuZXh0IHN5bGxhYmxlIGFuZCBpdHMgaW5kZXggaW4gdGhlIGFycmF5XG4gICAgICBsZXQgbmV4dFN5bGxhYmxlSWR4OiBudW1iZXI7XG4gICAgICBjb25zdCBuZXh0U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT09IG5leHRTeWxsYWJsZUlkKSB7XG4gICAgICAgICAgbmV4dFN5bGxhYmxlSWR4ID0gaWR4O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgbmV4dCAoZm9sbG93aW5nKSBzeWxsYWJsZSBjYW5ub3QgYmUgZm91bmRcbiAgICAgIGlmICghbmV4dFN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIG5leHQgc3lsbGFibGUgaGFzIGJlZW4gZm91bmQsIGJ1dCB0aGUgQGZvbGxvd3MgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIW5leHRTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgbmV4dCBzeWxsYWJsZSdzIEBmb2xsb3dzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKG5leHRTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJykgIT0gJyMnICsgc3lsbGFibGUuaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiA0OlxuICAgICAgLy8gU2luY2UgdGhlIEBmb2xsb3dzIHZhbHVlIGlzIGNvcnJlY3QsIGEgcGFpciBvZiBzeWxsYWJsZXMgZXhpc3QgZm9yIHRoZSB0b2dnbGUtbGlua2VkIHN5bGxhYmxlLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIEBmb2xsb3dzIHN5bGxhYmxlIGlzIHRoZSBuZXh0IHN5bGxhYmxlIChpbmRleC13aXNlKSBpbiB0aGUgYXJyYXk6XG4gICAgICBpZiAobmV4dFN5bGxhYmxlSWR4ICE9PSBpZHggKyAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpKSB7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGVJZCA9IHN5bGxhYmxlXG4gICAgICAgIC5nZXRBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJylcbiAgICAgICAgLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGUgPSBlbGVtZW50cy5maW5kKFxuICAgICAgICAoc3lsbGFibGUpID0+IHN5bGxhYmxlLmlkID09PSBwcmV2U3lsbGFibGVJZCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMjogVGhlIHByZXZpb3VzIHN5bGxhYmxlIGV4aXN0cywgYnV0IHRoZSBAcHJlY2VkZXMgYXR0cmlidXRlIGRvZXMgTk9UIEVYSVNUXG4gICAgICBpZiAoIXByZXZTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMzogVGhlIHByZXZpb3VzIHN5bGxhYmxlJ3MgQHByZWNlZGVzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKHByZXZTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICE9ICcjJyArIHN5bGxhYmxlLmlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaXMgYSBzZWxlY3Rpb24gb2YgZWxlbWVudHMgaXMgYWxyZWFkeSBsaW5rZWRcbiAqIEBwYXJhbSBlbGVtZW50cyBlbGVtZW50cyB0byBiZSBjb25zaWRlcmVkXG4gKiBAcmV0dXJucyB0cnVlIGlzIGxpbmtlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtlZChlbGVtZW50czogQXJyYXk8U1ZHR3JhcGhpY3NFbGVtZW50Pik6IGJvb2xlYW4ge1xuICAvLyBldmVyeSBlbGVtZW50IHNob3VsZCBiZSBsaW5rZWRcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKFxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSAmJlxuICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEFzc3VtaW5nIGFsbCBlbGVtZW50cyBhcmUgdmFsaWQsXG4gKiBjaGVjayBpZiB0aGUgZWxlbWVudHMgY2FuIGJlIGxpbmtlZDpcbiAqIDEuIHNvcnQgZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgb3JkZXIgaW4gdGhlIERPTVxuICogMi4gZW5zdXJlIGVsZW1lbnRzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gKiAzLiBlbnN1cmUgZWxlbWVudHMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICogNC4gY2hlY2sgaWYgY2FuIGJlIGxpbmtlZDpcbiAqICAgIDQuMSBpZiBleGFjdGx5IHR3byBlbGVtZW50cywgYm90aCBuZWVkcyB0byBiZSB1bmxpbmtlZFxuICogICAgNC4yIGlmIG1vcmUgdGhhbiB0d28gZWxlbWVudHMsIG9ubHkgb25lIGVsZW1lbnQgY2FuIGJlIHVubGlua2VkLFxuICogICAgICAgIGF0IGVpdGhlciBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBzZXF1ZW5jZVxuICogQHBhcmFtIGVsZW1lbnRzIGVsZW1lbnRzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEByZXR1cm5zIHRydWUgY2FuIGJlIGxpbmtlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuQmVMaW5rZWQoZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4pOiBib29sZWFuIHtcbiAgLy8gMS4gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGNvbnN0IHN0YXZlcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YWZmJykpO1xuICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZScpKTtcblxuICAvLyAyLiBFbnN1cmUgc3lsbGFibGVzIGFyZSBhZGphY2VudCBpbiB0aGUgRE9NXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IG5leHQgPSBlbGVtZW50c1tpICsgMV07XG4gICAgY29uc3QgY3VycmVudFN5bGxhYmxlSW5kZXggPSBzeWxsYWJsZXMuaW5kZXhPZihjdXJyZW50KTtcbiAgICBjb25zdCBuZXh0U3lsbGFibGVJbmRleCA9IHN5bGxhYmxlcy5pbmRleE9mKG5leHQpO1xuICAgIGlmIChuZXh0U3lsbGFibGVJbmRleCAtIGN1cnJlbnRTeWxsYWJsZUluZGV4ICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIFN0YXZlcyBtdXN0IGJlIGFkamFjZW50XG4gICAgfVxuICAgIC8vIDMuIEVuc3VyZSBzeWxsYWJsZXMgYmVsb25nIHRvIGFkamFjZW50IHN0YXZlc1xuICAgIGNvbnN0IGN1cnJlbnRTdGFmZiA9IGN1cnJlbnQuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgY29uc3QgbmV4dFN0YWZmID0gbmV4dC5jbG9zZXN0KCcuc3RhZmYnKTtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGFmZkluZGV4ID0gc3RhdmVzLmluZGV4T2YoY3VycmVudFN0YWZmIGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCBuZXh0U3RhZmZJbmRleCA9IHN0YXZlcy5pbmRleE9mKG5leHRTdGFmZiBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKG5leHRTdGFmZkluZGV4IC0gY3VycmVudFN0YWZmSW5kZXggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gU3RhdmVzIG11c3QgYmUgYWRqYWNlbnRcbiAgICB9XG4gIH1cblxuICAvLyA0LjEgSGFuZGxlIGNhc2UgZm9yIGV4YWN0bHkgdHdvIHN5bGxhYmxlc1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmV2ZXJ5KFxuICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiZcbiAgICAgICAgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdtZWk6Zm9sbG93cycpLFxuICAgICk7XG4gIH1cblxuICAvLyA0LjIgSGFuZGxlIGNhc2UgZm9yIG1vcmUgdGhhbiB0d28gc3lsbGFibGVzXG4gIGNvbnN0IHVubGlua2VkRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgKGVsZW1lbnQpID0+XG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpwcmVjZWRlcycpICYmXG4gICAgICAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21laTpmb2xsb3dzJyksXG4gICk7XG5cbiAgaWYgKHVubGlua2VkRWxlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBPbmx5IG9uZSB1bmxpbmtlZCBzeWxsYWJsZSBpcyBhbGxvd2VkXG4gIH1cblxuICAvLyBUaGUgdW5saW5rZWQgc3lsbGFibGUgc2hvdWxkIGJlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kXG4gIGNvbnN0IGZpcnN0VW5saW5rZWQgPSB1bmxpbmtlZEVsZW1lbnRzWzBdO1xuXG4gIHJldHVybiAoXG4gICAgZWxlbWVudHMuaW5kZXhPZihmaXJzdFVubGlua2VkKSA9PT0gMCB8fFxuICAgIGVsZW1lbnRzLmluZGV4T2YoZmlyc3RVbmxpbmtlZCkgPT09IGVsZW1lbnRzLmxlbmd0aCAtIDFcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgY2FuIGJlIGxpbmtlZCBvciB1bmxpa25lZC5cbiAqIEBwYXJhbSBzZWxlY3Rpb25UeXBlIEN1cnJlbnQgc2VsZWN0aW9uIG1vZGUuIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gYmUgbGlua2VkXG4gKiBAcGFyYW0gZWxlbWVudHMgVGhlIGVsZW1lbnRzIHVuZGVyIHF1ZXN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gbGluayBvciB1bi1saW5rIGVsZW1lbnRzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2FibGUoXG4gIHNlbGVjdGlvblR5cGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBib29sZWFuIHtcbiAgLy8gY2Fubm90IHRvZ2dsZSBsaW5rIGZvciBzeWxsYWJsZSBzZWxlY3Rpb24gaWYgbnVtYmVyIG9mIHNlbGVjdGVkXG4gIC8vIHN5bGxhYmxlcyBpcyBzbWFsbGVyIHRoYW4gMlxuICBpZiAoZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9ubHkgU3lsbGFibGVzIGNhbiBiZSBsaW5rZWQgb3IgdW5saW5rZWQgKD8pXG4gIGlmIChzZWxlY3Rpb25UeXBlICE9PSAnc2VsQnlTeWxsYWJsZScpIHJldHVybiBmYWxzZTtcblxuICAvLyBDaGVjayBpZiBoYXMgaW52YWxpZCBsaW5rZWQgc3lsbGFibGVzXG4gIGlmIChoYXNJbnZhbGlkTGlua2VkU3lsbGFibGUoZWxlbWVudHMpKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoZSBzZWxlY3RlZCBzeWxsYWJsZXMgaW5jbHVkZSBpbnZhbGlkIGxpbmtlZCBzeWxsYWJsZShzKSEnLFxuICAgICAgJ3dhcm5pbmcnLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaWYgQUxSRUFEWSBsaW5rZWRcbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGlmIENBTiBiZSBsaW5rZWRcbiAgZWxzZSBpZiAoY2FuQmVMaW5rZWQoZWxlbWVudHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTWVyZ2Ugc2VsZWN0ZWQgc3RhdmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVN0YXZlcygpOiB2b2lkIHtcbiAgY29uc3Qgc3lzdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGFmZi5zZWxlY3RlZCcpO1xuICBjb25zdCBlbGVtZW50SWRzID0gW107XG4gIHN5c3RlbXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcbiAgICBlbGVtZW50SWRzLnB1c2goc3RhZmYuaWQpO1xuICB9KTtcbiAgY29uc3QgZWRpdG9yQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgYWN0aW9uOiAnbWVyZ2UnLFxuICAgIHBhcmFtOiB7XG4gICAgICBlbGVtZW50SWRzOiBlbGVtZW50SWRzLFxuICAgIH0sXG4gIH07XG4gIG5lb25WaWV3XG4gICAgLmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1N0YWZmIE1lcmdlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgIFNlbGVjdE9wdGlvbnMuZW5kT3B0aW9uc1NlbGVjdGlvbigpO1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdNZXJnZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIHRoZSBncm91cGluZyBzZWxlY3Rpb24gbWVudS5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIGdyb3VwaW5nIHR5cGU6IG5jLCBuZXVtZSwgc3lsLCBsaWdhdHVyZU5jLCBvciBsaWdhdHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckdyb3VwaW5nKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICBtb3JlRWRpdC5pbm5lckhUTUwgKz0gQ29udGVudHMuZ3JvdXBpbmdNZW51W3R5cGVdO1xuICBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGdyb3VwaW5nIHNlbGVjdGlvbiBtZW51LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kR3JvdXBpbmdTZWxlY3Rpb24oKTogdm9pZCB7XG4gIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICBtb3JlRWRpdC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBUaGUgZ3JvdXBpbmcgZHJvcGRvd24gbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0R3JvdXBpbmdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gIGNvbnN0IGRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUnKTtcbiAgZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlSGFuZGxlcik7XG4gIGRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZUhhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkZWxldGVCdXR0b25IYW5kbGVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkxpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXJnZVN5bHMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGlmIChjb250YWluc0xpbmtlZChTZWxlY3RUb29scy5nZXRTZWxlY3Rpb25UeXBlKCkpKSByZXR1cm47XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5ldW1lcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGNvbnRhaW5zTGlua2VkKFNlbGVjdFRvb2xzLmdldFNlbGVjdGlvblR5cGUoKSkpIHJldHVybjtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRJZHMoKS5maWx0ZXIoKGUpID0+XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLmNsYXNzTGlzdC5jb250YWlucygnbmV1bWUnKSxcbiAgICAgICk7XG4gICAgICBncm91cGluZ0FjdGlvbignZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cE5jcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpLmZpbHRlcigoZSkgPT5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduYycpLFxuICAgICAgKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZ3JvdXBOZXVtZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgZ3JvdXBpbmdBY3Rpb24oJ3VuZ3JvdXAnLCAnbmV1bWUnLCBlbGVtZW50SWRzKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB0cnkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmdyb3VwTmNzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0Q2hpbGRyZW5JZHMoKTtcbiAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKCd0b2dnbGUtbGlnYXR1cmUnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gZ2V0SWRzKCk7XG5cbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uOiBUb2dnbGVMaWdhdHVyZUFjdGlvbiA9IHtcbiAgICAgICAgICBhY3Rpb246ICd0b2dnbGVMaWdhdHVyZScsXG4gICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgbmVvblZpZXdcbiAgICAgICAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTGlnYXR1cmUgVG9nZ2xlZCcsICdzdWNjZXNzJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0xpZ2F0dXJlIFRvZ2dsZSBGYWlsZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9nZ2xlLWxpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG4vKipcbiAqIEdyb3VwaW5nL1VuZ3JvdXBpbmcga2V5YmluZGluZyBldmVudCBsaXN0ZW5lclxuICovXG5jb25zdCBrZXlkb3duTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICBpZiAoZS5rZXkgPT09ICdnJykge1xuICAgIC8vIGdldCBzZWxlY3RlZCBlbGVtZW50cyB0byBjaGVjayBpZiB0aGV5IGNhbiBiZSBncm91cGVkc1xuICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpLFxuICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50W107XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gU2VsZWN0VG9vbHMuZ2V0U2VsZWN0aW9uVHlwZSgpO1xuXG4gICAgaWYgKGNvbnRhaW5zTGlua2VkKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgLy8gR3JvdXAvbWVyZ2Ugb3IgdW5ncm91cC9zcGxpdCBiYXNlZCBvbiBzZWxlY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSAnc2VsQnlTeWxsYWJsZSc6XG4gICAgICAgIC8vIGlmIHN5bGxhYmxlcyBhcmUgbGlubmthYmxlLCB0b2dnbGUgbGlua2VkIHN5bGxhYmxlXG4gICAgICAgIC8vIGxpbmtlZCBzeWxsYWJsZXMgY2Fubm90IGJlIGdyb3VwZWQvdW5ncm91cGVkXG4gICAgICAgIGlmIChpc0xpbmthYmxlKHNlbGVjdGlvblR5cGUsIGVsZW1lbnRzKSkge1xuICAgICAgICAgIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIGdyb3VwYWJsZSBiZWZvcmUgZ3JvdXBpbmdcbiAgICAgICAgZWxzZSBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldENoaWxkcmVuSWRzKCkuZmlsdGVyKChlKSA9PlxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCduZXVtZScpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZ3JvdXBpbmdBY3Rpb24oJ2dyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2FuIG9ubHkgdW5ncm91cCBpZiBsZW5ndGggaXMgMSAob25lIHN5bGxhYmxlIHNlbGVjdGVkKVxuICAgICAgICAvLyBjYW5ub3QgdW5ncm91cCBpZiBtdWx0aXBsZSBzeWxsYWJsZXMgYXJlIHNlbGVjdGVkXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25ldW1lJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmV1bWUnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduZXVtZScsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5TmMnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCdncm91cCcsICduYycsIGVsZW1lbnRJZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBnZXRDaGlsZHJlbklkcygpO1xuICAgICAgICAgIGdyb3VwaW5nQWN0aW9uKCd1bmdyb3VwJywgJ25jJywgZWxlbWVudElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbEJ5U3RhZmYnOlxuICAgICAgICBpZiAoaXNHcm91cGFibGUoc2VsZWN0aW9uVHlwZSwgZWxlbWVudHMpKSB7XG4gICAgICAgICAgbWVyZ2VTdGF2ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBTZWxlY3RPcHRpb25zLnRyaWdnZXJTdGFmZlNwbGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBDYW4ndCBwZXJmb3JtIGdyb3VwaW5nL3VuZ3JvdXBpbmcgYWN0aW9uIG9uIHNlbGVjdGlvbiB0eXBlICR7c2VsZWN0aW9uVHlwZX0uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGb3JtIGFuZCBleGVjdXRlIGEgZ3JvdXAvdW5ncm91cCBhY3Rpb24uXG4gKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBleGVjdXRlLiBFaXRoZXIgXCJncm91cFwiIG9yIFwidW5ncm91cFwiLlxuICogQHBhcmFtIGdyb3VwVHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGdyb3VwLiBFaXRoZXIgXCJuZXVtZVwiIG9yIFwibmNcIi5cbiAqIEBwYXJhbSBlbGVtZW50SWRzIC0gVGhlIElEcyBvZiB0aGUgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdyb3VwaW5nQWN0aW9uKFxuICBhY3Rpb246ICdncm91cCcgfCAndW5ncm91cCcsXG4gIGdyb3VwVHlwZTogJ25ldW1lJyB8ICduYycsXG4gIGVsZW1lbnRJZHM6IHN0cmluZ1tdLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIHBhcmFtOiB7XG4gICAgICBncm91cFR5cGU6IGdyb3VwVHlwZSxcbiAgICAgIGVsZW1lbnRJZHM6IGVsZW1lbnRJZHMsXG4gICAgfSxcbiAgfTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdncm91cCcpIHtcbiAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0dyb3VwaW5nIFN1Y2Nlc3MnLCAnc3VjY2VzcycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignVW5ncm91cGluZyBTdWNjZXNzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2dyb3VwJykge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignR3JvdXBpbmcgRmFpbGVkJywgJ2Vycm9yJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdVbmdyb3VwaW5nIEZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuXG4gICAgICAvLyBQcm9tcHQgdXNlciB0byBjb25maXJtIGlmIE5lb24gZG9lcyBub3QgcmUgY29nbml6ZSBjb250b3VyXG4gICAgICBpZiAoZ3JvdXBUeXBlID09PSAnbmMnKSB7XG4gICAgICAgIGNvbnN0IG5ldW1lUGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgZWxlbWVudElkc1swXSxcbiAgICAgICAgKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBuY3MgPSBBcnJheS5mcm9tKG5ldW1lUGFyZW50LmNoaWxkcmVuKSBhcyBTVkdHcmFwaGljc0VsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29udG91ciA9IG5lb25WaWV3LmluZm8uZ2V0Q29udG91cihuY3MpO1xuICAgICAgICBpZiAoY29udG91ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgV2FybmluZ3MuZ3JvdXBpbmdOb3RSZWNvZ25pemVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVuZEdyb3VwaW5nU2VsZWN0aW9uKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVubGluayhlbGVtZW50SWRzOiBzdHJpbmdbXSk6IEFycmF5PEVkaXRvckFjdGlvbj4ge1xuICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG4gIGZvciAoY29uc3QgaWQgb2YgZWxlbWVudElkcykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtZWk6cHJlY2VkZXMnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSkge1xuICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhbiBlbGVtZW50IGJ5IElEIGFuZCBlbnN1cmUgaXQncyBhbiBTVkdHcmFwaGljc0VsZW1lbnRcbmZ1bmN0aW9uIGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQoaWQ6IHN0cmluZyk6IFNWR0dyYXBoaWNzRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0dyYXBoaWNzRWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb2dnbGVTeWxsYWJsZUlkcyhcbiAgZWxlbWVudHM6IEFycmF5PFNWR0dyYXBoaWNzRWxlbWVudD4sXG4pOiBbU1ZHR3JhcGhpY3NFbGVtZW50LCBTVkdHcmFwaGljc0VsZW1lbnRdIHtcbiAgLy8gU29ydCBlbGVtZW50cyBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG4gIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdGFmZkEgPSBhLmNsb3Nlc3QoJy5zdGFmZicpO1xuICAgIGNvbnN0IHN0YWZmQiA9IGIuY2xvc2VzdCgnLnN0YWZmJyk7XG4gICAgcmV0dXJuIHN0YWZmQS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFmZkIpICZcbiAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICA/IC0xXG4gICAgICA6IDE7XG4gIH0pO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gW2VsZW1lbnRzWzBdLCBlbGVtZW50c1sxXV07XG4gIH1cblxuICBjb25zdCB1bmxpbmtlZEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKFxuICAgIChlbCkgPT4gIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOnByZWNlZGVzJykgJiYgIWVsLmhhc0F0dHJpYnV0ZSgnbWVpOmZvbGxvd3MnKSxcbiAgKTtcblxuICBpZiAodW5saW5rZWRFbGVtZW50KSB7XG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKHVubGlua2VkRWxlbWVudCk7XG5cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBbZWxlbWVudHNbaW5kZXhdLCBlbGVtZW50c1tpbmRleCArIDFdXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBlbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gW2VsZW1lbnRzW2luZGV4IC0gMV0sIGVsZW1lbnRzW2luZGV4XV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoYXQgYWN0aW9uIChsaW5rL3VubGluaykgdG8gcGVyZm9ybSB3aGVuIHVzZXIgY2xpY2tzIG9uIFwiVG9nZ2xlIExpbmtlZCBTeWxsYWJsZVwiXG4gKiBBbHNvIGNhbGxlZCB3aGVuIGNvcnJlc3BpbmRpbmcgaG90a2V5IGlzIHByZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUxpbmtlZFN5bGxhYmxlcygpIHtcbiAgY29uc3QgZWxlbWVudElkcyA9IGdldElkcygpO1xuICBjb25zdCBjaGFpbkFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICBwYXJhbTogW10sXG4gIH07XG4gIGNvbnN0IHBhcmFtID0gbmV3IEFycmF5PEVkaXRvckFjdGlvbj4oKTtcblxuICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnRJZHNcbiAgICAubWFwKGdldFNWR0dyYXBoaWNzRWxlbWVudEJ5SWQpIC8vIE1hcCBJRHMgdG8gU1ZHR3JhcGhpY3NFbGVtZW50IG9yIG51bGxcbiAgICAuZmlsdGVyKChlbCk6IGVsIGlzIFNWR0dyYXBoaWNzRWxlbWVudCA9PiBlbCAhPT0gbnVsbCk7XG5cbiAgaWYgKGlzTGlua2VkKGVsZW1lbnRzKSkge1xuICAgIHBhcmFtLnB1c2goLi4udW5saW5rKGVsZW1lbnRJZHMpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbZmlyc3RTeWxsYWJsZSwgc2Vjb25kU3lsbGFibGVdID0gZ2V0VG9nZ2xlU3lsbGFibGVJZHMoZWxlbWVudHMpO1xuICAgIGNvbnNvbGUubG9nKGZpcnN0U3lsbGFibGUuaWQsIHNlY29uZFN5bGxhYmxlLmlkKTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwYXJhbS5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50SWQ6IHNlY29uZFN5bGxhYmxlLmlkLFxuICAgICAgICBhdHRyVHlwZTogJ2ZvbGxvd3MnLFxuICAgICAgICBhdHRyVmFsdWU6ICcjJyArIGZpcnN0U3lsbGFibGUuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIERlbGV0ZSBzeWwgb24gc2Vjb25kIHN5bGxhYmxlXG4gICAgY29uc3Qgc3lsID0gc2Vjb25kU3lsbGFibGUucXVlcnlTZWxlY3RvcignLnN5bCcpO1xuICAgIGlmIChzeWwgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogc3lsLmlkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hhaW5BY3Rpb24ucGFyYW0gPSBwYXJhbTtcbiAgbmVvblZpZXdcbiAgICAuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdUb2dnbGVkIFN5bGxhYmxlIExpbmsnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICdGYWlsZWQgdG8gVG9nZ2xlIFN5bGxhYmxlIExpbmsnLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbmRHcm91cGluZ1NlbGVjdGlvbigpO1xuICAgICAgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgSURzIG9mIHNlbGVjdGVkIGVsZW1lbnRzLlxuICovXG5mdW5jdGlvbiBnZXRJZHMoKTogc3RyaW5nW10ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlkcy5wdXNoKGVsLmlkKTtcbiAgfSk7XG4gIHJldHVybiBpZHM7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIElEcyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMnIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZHJlbklkcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNoaWxkcmVuSWRzID0gW107XG4gIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpKTtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBpZiAoXG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2RpdkxpbmUnKSB8fFxuICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY2NpZCcpIHx8XG4gICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NsZWYnKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoKSA9PiB7XG4gICAgICBjaGlsZHJlbklkcy5wdXNoKGNoLmlkKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBjaGlsZHJlbklkcztcbn1cbiIsImltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IGVycm9yTG9nc1BhbmVsQ29udGVudHMgfSBmcm9tICcuLi9TcXVhcmVFZGl0L0NvbnRlbnRzJztcbmltcG9ydCB7IHNldFNldHRpbmdzLCBnZXRTZXR0aW5ncyB9IGZyb20gJy4vTG9jYWxTZXR0aW5ncyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdywgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi9Nb2RhbFdpbmRvdyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ01lc3NhZ2UgKG5vdGlmOiBOb3RpZmljYXRpb24pOiBFbGVtZW50IHtcbiAgY29uc3Qgbm90aWZEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbm90aWZEaXYuY2xhc3NMaXN0LmFkZCgnbm90aWZpY2F0aW9uLWNvbnRhaW5lcicpO1xuICBub3RpZkRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1tYWluXCI+JHtub3RpZi5tZXNzYWdlfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWV4dHJhXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1idG4tY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibm90aWYtbG9nLWluZm8taWNvbi13cmFwcGVyXCI+XG4gICAgICAgICAgPGltZyBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgY2xhc3M9XCJub3RpZi1sb2ctaW5mby1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL25vdGlmaWNhdGlvbi1pbmZvLWljb24tbGlnaHQuc3ZnXCIgdGl0bGU9XCJMb2cgTWVzc2FnZVwiPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibm90aWYtcmVtb3ZlLWljb24td3JhcHBlclwiPlxuICAgICAgICAgIDxpbWcgY2xhc3M9XCJsb2ctcmVtb3ZlIG5vdGlmLXJlbW92ZS1pY29uXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL2dhcmJhZ2UtY2xvc2VkLnN2Z1wiIHRpdGxlPVwiUmVtb3ZlXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gIGA7XG5cbiAgY29uc3QgcmVtb3ZlQnRuID0gbm90aWZEaXYucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJy5sb2ctcmVtb3ZlJyk7XG4gIHJlbW92ZUJ0bi5vbmNsaWNrID0gKCkgPT4gbm90aWZEaXYucmVtb3ZlKCk7XG4gIHJlbW92ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgcmVtb3ZlQnRuLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9nYXJiYWdlLW9wZW4uc3ZnYCk7XG4gIH0pO1xuICByZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgcmVtb3ZlQnRuLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9nYXJiYWdlLWNsb3NlZC5zdmdgKTtcbiAgfSk7XG5cbiAgaWYgKG5vdGlmLmxvZ0luZm8pIHtcbiAgICBjb25zdCBpbmZvQnRuID0gbm90aWZEaXYucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5ub3RpZi1sb2ctaW5mby1pY29uJyk7XG4gICAgaW5mb0J0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICByZW1vdmVCdG4uc3R5bGUuaGVpZ2h0ID0gJzIwcHgnO1xuXG4gICAgaW5mb0J0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICBpbmZvQnRuLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9ub3RpZmljYXRpb24taW5mby1pY29uLWRhcmsuc3ZnYCk7XG4gICAgfSk7XG4gICAgaW5mb0J0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgIGluZm9CdG4uc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL25vdGlmaWNhdGlvbi1pbmZvLWljb24tbGlnaHQuc3ZnYCk7XG4gICAgfSk7XG4gICAgaW5mb0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG9wZW5FcnJvckxvZ1dpbmRvdyhub3RpZi5sb2dJbmZvKSk7XG4gIH1cblxuICByZXR1cm4gbm90aWZEaXY7XG59XG5cblxuLyoqXG4gKiBBZGQgbm90aWZpY2F0aW9uIHRvIHRoZSBwZXJzaXN0ZW50IGVycm9yIGxvZyBvbiB0aGUgc2lkZWJhclxuICogQHBhcmFtIG5vdGlmIHtOb3RpZmljYXRpb259IE5vdGlmaWNhdGlvbiB0byBhZGQgdG8gdGhlIGVycm9yIGxvZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkTm90aWZpY2F0aW9uIChub3RpZjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gIGNvbnN0IGxvZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvckxvZ0NvbnRlbnRzJyk7XG4gIGxvZy5wcmVwZW5kKGNyZWF0ZUxvZ01lc3NhZ2Uobm90aWYpKTtcbn1cblxuXG4vKipcbiAqIEluaXRpYWxpemUgZXJyb3IgbG9nLlxuICogQWRkcyBuZWNlc3NhcnkgSFRNTCB0byBET00uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXJyb3JMb2coKTogdm9pZCB7XG4gIC8vIEVycm9yIGxvZyBwYW5lbFxuICBjb25zdCBsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JfbG9nJyk7XG4gIGxvZy5pbm5lckhUTUwgPSBlcnJvckxvZ3NQYW5lbENvbnRlbnRzO1xuXG4gIGluaXRFcnJvckxvZ0NvbnRyb2xzKCk7XG59XG5cblxuLyoqXG4gKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBlcnJvciBMb2cgcGFuZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRFcnJvckxvZ0NvbnRyb2xzKCk6IHZvaWQge1xuICBjb25zdCBlcnJvclBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yX2xvZycpO1xuICBjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Vycm9yTG9nSGVhZGluZycpO1xuICBjb25zdCBkcm9wZG93bkljb24gPSBoZWFkaW5nLnF1ZXJ5U2VsZWN0b3IoJ3N2ZyA+IHVzZScpO1xuICBjb25zdCBjb250ZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvckxvZ0NvbnRlbnRzJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgY29uc3QgeyBkaXNwbGF5RXJyTG9nIH0gPSBnZXRTZXR0aW5ncygpO1xuICBpZiAoZGlzcGxheUVyckxvZykgZXJyb3JQYW5lbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG5cbiAgaGVhZGluZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyBpZiBlcnJvciBwYW5lbCBpcyBjbG9zZWQsIG9wZW4gaXRcbiAgICBpZiAoY29udGVudHMuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKSkge1xuICAgICAgLy8gc2V0IGNsYXNzZXMgYW5kIHN0eWxlcyBmb3IgYW4gb3BlbiBwYW5lbFxuICAgICAgY29udGVudHMuY2xhc3NMaXN0LnJlbW92ZSgnY2xvc2VkJyk7XG4gICAgICBjb250ZW50cy5zdHlsZS5wYWRkaW5nID0gJzAuNWVtIDAuNzVlbSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29udGVudHMuc3R5bGUub3ZlcmZsb3cgPSAndmlzaWJsZSc7XG4gICAgICB9LCAyMDApO1xuICAgICAgZHJvcGRvd25JY29uLnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93bmApO1xuICAgIH0gXG4gICAgLy8gaWYgZXJyb3IgcGFuZWwgaXMgb3BlbiwgY2xvc2UgaXRcbiAgICBlbHNlIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGEgY2xvc2VkIHBhbmVsXG4gICAgICBjb250ZW50cy5jbGFzc0xpc3QuYWRkKCdjbG9zZWQnKTtcbiAgICAgIGNvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwcHgnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGRyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLXNpZGVgKTtcbiAgICB9XG4gIH0pO1xuXG4gIGluaXREaXNwbGF5TGlzdGVuZXIoKTtcbn1cblxuXG4vKipcbiAqIEluaXRpYWxpemVzIGNsaWNrIGxpc3RlbmVyIG9uIFwiU2hvdyBlcnJvciBsb2dzXCIgYnV0dG9uIGluIFwiVmlld1wiIGRyb3Bkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdERpc3BsYXlMaXN0ZW5lcigpOiB2b2lkIHtcbiAgY29uc3QgY2hlY2tib3hlc0NvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkaXNwbGF5LXNpbmdsZS1jb250YWluZXInKTtcbiAgY29uc3QgZXJyb3JzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICBjb25zdCBlcm9ycnNCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuXG4gIGVyb3Jyc0J0bi5jbGFzc0xpc3QuYWRkKCdjaGVja2JveCcpO1xuICBlcnJvcnNMYWJlbC5jbGFzc0xpc3QuYWRkKCdjaGVja2JveC1jb250YWluZXInLCAnc2lkZS1wYW5lbC1idG4nKTtcbiAgZXJyb3JzTGFiZWwudGV4dENvbnRlbnQgPSAnRXJyb3JzJztcbiAgZXJvcnJzQnRuLmlkID0gJ2Rpc3BsYXktZXJyb3JzJztcbiAgZXJvcnJzQnRuLnR5cGUgPSAnY2hlY2tib3gnO1xuICBlcm9ycnNCdG4uY2hlY2tlZCA9IGZhbHNlO1xuICBlcnJvcnNMYWJlbC5hcHBlbmRDaGlsZChlcm9ycnNCdG4pO1xuICBjaGVja2JveGVzQ29udGFpbmVyLmFwcGVuZChlcnJvcnNMYWJlbCk7XG5cbiAgY29uc3QgeyBkaXNwbGF5RXJyTG9nIH0gPSBnZXRTZXR0aW5ncygpO1xuICBlcm9ycnNCdG4uY2hlY2tlZCA9IGRpc3BsYXlFcnJMb2c7XG5cbiAgZXJvcnJzQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHNldFNldHRpbmdzKHsgZGlzcGxheUVyckxvZzogZXJvcnJzQnRuLmNoZWNrZWQgfSk7XG4gICAgdXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5KCk7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG9wZW5FcnJvckxvZ1dpbmRvdyhsb2c6IHN0cmluZykge1xuICBjb25zdCBtb2RhbFdpbmRvdyA9IG5ldyBNb2RhbFdpbmRvdygpO1xuICBtb2RhbFdpbmRvdy5zZXRNb2RhbFdpbmRvd1ZpZXcoTW9kYWxXaW5kb3dWaWV3LkVSUk9SX0xPRywgbG9nKTtcbiAgbW9kYWxXaW5kb3cub3Blbk1vZGFsV2luZG93KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVFcnJvckxvZ1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gIGNvbnN0IG5vdGlmUGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXJyb3JfbG9nJyk7XG4gIGNvbnN0IHsgZGVidWdNb2RlLCBkaXNwbGF5RXJyTG9nLCBkaXNwbGF5SW5mbywgZGlzcGxheUJCb3gsIGRpc3BsYXlUZXh0IH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gIGNvbnN0IGRpc3BsYXlBbGxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1hbGwtYnRuJyk7XG5cbiAgaWYgKGRlYnVnTW9kZSkge1xuICAgIGlmIChkaXNwbGF5RXJyTG9nKSB7XG4gICAgICBub3RpZlBhbmVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgIGlmIChkaXNwbGF5SW5mbyAmJiBkaXNwbGF5QkJveCAmJiBcbiAgICAgICAgZGlzcGxheVRleHQgJiYgZGlzcGxheUVyckxvZykge1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0hpZGUgQWxsJztcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBub3RpZlBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICAgIGlmIChkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0Rpc3BsYXkgQWxsJztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm90aWZQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgaWYgKGRpc3BsYXlJbmZvICYmIGRpc3BsYXlCQm94ICYmIGRpc3BsYXlUZXh0KSB7XG4gICAgICBkaXNwbGF5QWxsQnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICBkaXNwbGF5QWxsQnRuLmlubmVySFRNTCA9ICdIaWRlIEFsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BsYXlBbGxCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgIGRpc3BsYXlBbGxCdG4uaW5uZXJIVE1MID0gJ0Rpc3BsYXkgQWxsJztcbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgeyBnZXRTdGFmZkJCb3gsIHNlbGVjdEJCb3gsIHNlbGVjdFN0YWZmLCBzZWxlY3RBbGwgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgRHJhZ0hhbmRsZXIgZnJvbSAnLi9EcmFnSGFuZGxlcic7XG5cbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IEVkaXRvckFjdGlvbiwgUmVzaXplQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuaW1wb3J0IHsgaXNPdXRPZlNWR0JvdW5kcyB9IGZyb20gJy4vQ29vcmRpbmF0ZXMnO1xuaW1wb3J0IHsgcXVldWVOb3RpZmljYXRpb24gfSBmcm9tICcuL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vTG9jYWxTZXR0aW5ncyc7XG5cbi8qKlxuICogUmVzaXplIGEgc3RhZmYgb3IgYSBzeWxsYWJsZSB0ZXh0IGJvdW5kaW5nIGJveC5cbiAqIEZvciBzdGF2ZXMsIHRoaXMgYWxzbyBzdXBwb3J0cyBhZGp1c3RpbmcgdGhlIHJvdGF0ZS5cbiAqL1xudHlwZSBQb2ludCA9IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IG5hbWU6IG51bWJlciB9O1xuXG4vKipcbiAqIFRoZSBwb2ludHMgeW91IGNhbiBjbGljayBhbmQgZHJhZyB0byByZXNpemVcbiAqL1xuY29uc3QgUG9pbnROYW1lcyA9IHtcbiAgVG9wTGVmdDogMCxcbiAgVG9wOiAxLFxuICBUb3BSaWdodDogMixcbiAgUmlnaHQ6IDMsXG4gIEJvdHRvbVJpZ2h0OiA0LFxuICBCb3R0b206IDUsXG4gIEJvdHRvbUxlZnQ6IDYsXG4gIExlZnQ6IDdcbn07XG5cbmZ1bmN0aW9uIGdldFBvaW50cyh1bHg6IG51bWJlciwgdWx5OiBudW1iZXIsIGxyeDogbnVtYmVyLCBscnk6IG51bWJlciwgcm90YXRlOiBudW1iZXIpOiBQb2ludFtdIHtcbiAgLy8gTm90ZSB0aGF0IGFyYyBmdW5jdGlvbnMgcmV0dXJuIGFuIGFuZ2xlIHggaW4gWy1waS8yLCBwaS8yXS5cbiAgbGV0IHBvaW50czogQXJyYXk8UG9pbnQ+O1xuICAvLyB1bCBpcyB1bHgsIHVseSwgbHIgaXMgbHJ4LCBscnlcbiAgaWYgKHJvdGF0ZSA+PSAwKSB7XG4gICAgcG9pbnRzID0gW1xuICAgICAgeyB4OiB1bHgsIHk6IHVseSwgbmFtZTogUG9pbnROYW1lcy5Ub3BMZWZ0IH0sXG4gICAgICB7IHg6ICh1bHggKyBscngpIC8gMiwgeTogdWx5ICsgKGxyeCAtIHVseCkgLyAyICogTWF0aC5zaW4ocm90YXRlKSwgbmFtZTogUG9pbnROYW1lcy5Ub3AgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiB1bHkgKyAobHJ4IC0gdWx4KSAqIE1hdGguc2luKHJvdGF0ZSksIG5hbWU6IFBvaW50TmFtZXMuVG9wUmlnaHQgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiAodWx5ICsgbHJ5ICsgKGxyeCAtIHVseCkgKiBNYXRoLnNpbihyb3RhdGUpKSAvIDIsIG5hbWU6IFBvaW50TmFtZXMuUmlnaHQgfSxcbiAgICAgIHsgeDogbHJ4LCB5OiBscnksIG5hbWU6IFBvaW50TmFtZXMuQm90dG9tUmlnaHQgfSxcbiAgICAgIHsgeDogKHVseCArIGxyeCkgLyAyLCB5OiBscnkgLSAobHJ4IC0gdWx4KSAvIDIgKiBNYXRoLnNpbihyb3RhdGUpLCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbSB9LFxuICAgICAgeyB4OiB1bHgsIHk6IGxyeSAtIChscnggLSB1bHgpICogTWF0aC5zaW4ocm90YXRlKSwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b21MZWZ0IH0sXG4gICAgICB7IHg6IHVseCwgeTogKHVseSArIGxyeSAtIChscnggLSB1bHgpICogTWF0aC5zaW4ocm90YXRlKSkgLyAyLCBuYW1lOiBQb2ludE5hbWVzLkxlZnQgfVxuICAgIF07XG4gIH1cbiAgLy8gTm90IHRoYXRcbiAgZWxzZSB7XG4gICAgY29uc3QgYSA9IChscnggLSB1bHgpICogTWF0aC50YW4oTWF0aC5hYnMocm90YXRlKSk7XG4gICAgY29uc3QgYiA9IGxyeSAtIHVseSAtIGE7XG4gICAgcG9pbnRzID0gW1xuICAgICAgeyB4OiB1bHgsIHk6IHVseSArIGEsIG5hbWU6IFBvaW50TmFtZXMuVG9wTGVmdCB9LFxuICAgICAgeyB4OiAodWx4ICsgbHJ4KSAvIDIsIHk6IHVseSArIGEgLyAyLCBuYW1lOiBQb2ludE5hbWVzLlRvcCB9LFxuICAgICAgeyB4OiBscngsIHk6IHVseSwgbmFtZTogUG9pbnROYW1lcy5Ub3BSaWdodCB9LFxuICAgICAgeyB4OiBscngsIHk6IHVseSArIGIgLyAyLCBuYW1lOiBQb2ludE5hbWVzLlJpZ2h0IH0sXG4gICAgICB7IHg6IGxyeCwgeTogdWx5ICsgYiwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b21SaWdodCB9LFxuICAgICAgeyB4OiAodWx4ICsgbHJ4KSAvIDIsIHk6IGxyeSAtIGEgLyAyLCBuYW1lOiBQb2ludE5hbWVzLkJvdHRvbSB9LFxuICAgICAgeyB4OiB1bHgsIHk6IGxyeSwgbmFtZTogUG9pbnROYW1lcy5Cb3R0b21MZWZ0IH0sXG4gICAgICB7IHg6IHVseCwgeTogbHJ5IC0gYiAvIDIsIG5hbWU6IFBvaW50TmFtZXMuTGVmdCB9XG4gICAgXTtcbiAgfVxuICByZXR1cm4gcG9pbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplIChlbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQsIG5lb25WaWV3OiBOZW9uVmlldywgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyKTogdm9pZCB7XG4gIGxldCB1bHg6IG51bWJlcjtcbiAgbGV0IHVseTogbnVtYmVyO1xuICBsZXQgbHJ4OiBudW1iZXI7XG4gIGxldCBscnk6IG51bWJlcjtcbiAgbGV0IHJvdGF0ZTogbnVtYmVyO1xuXG4gIGxldCBpbml0aWFsVWx4OiBudW1iZXIsIGluaXRpYWxMcng6IG51bWJlcjtcbiAgbGV0IGluaXRpYWxQb2ludDogbnVtYmVyW10sIGluaXRpYWxVbHk6IG51bWJlciwgaW5pdGlhbExyeTogbnVtYmVyLFxuICAgIGluaXRpYWxZOiBudW1iZXIsIGluaXRpYWxSZWN0WTogbnVtYmVyLCBwb2x5TGVuOiBudW1iZXIsIGR5OiBudW1iZXIsIGluaXRpYWxSb3RhdGU6IG51bWJlcjtcblxuICBkcmF3SW5pdGlhbFJlY3QoKTtcblxuICAvKipcbiAgICogUmVkcmF3IHRoZSByZWN0YW5nbGUgd2l0aCB0aGUgbmV3IGJvdW5kc1xuICAgKi9cbiAgZnVuY3Rpb24gcmVkcmF3ICgpOiB2b2lkIHtcbiAgICBjb25zdCBwb2ludHM6IFBvaW50W10gPSBnZXRQb2ludHModWx4LCB1bHksIGxyeCwgbHJ5LCByb3RhdGUpO1xuXG4gICAgY29uc3QgcG9pbnRTdHJpbmc6IHN0cmluZyA9IHBvaW50cy5maWx0ZXIoKF9lbGVtLCBpbmRleCkgPT4geyByZXR1cm4gaW5kZXggJSAyID09PSAwOyB9KVxuICAgICAgLm1hcChlbGVtID0+IGVsZW0ueCArICcsJyArIGVsZW0ueSlcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVzaXplUmVjdCcpLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgcG9pbnRTdHJpbmcpO1xuXG4gICAgY29uc3QgdGV4dFJlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsLnNlbGVjdGVkID4gLnN5bFRleHRSZWN0LWRpc3BsYXknKTtcbiAgICBpZiAodGV4dFJlY3QpIHtcbiAgICAgIHRleHRSZWN0LnNldEF0dHJpYnV0ZSgneCcsIFN0cmluZyhNYXRoLm1pbih1bHgsIGxyeCkpKTtcbiAgICAgIHRleHRSZWN0LnNldEF0dHJpYnV0ZSgneScsIFN0cmluZyhNYXRoLm1pbih1bHksIGxyeSkpKTtcbiAgICAgIHRleHRSZWN0LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBTdHJpbmcoTWF0aC5hYnMobHJ4IC0gdWx4KSkpO1xuICAgICAgdGV4dFJlY3Quc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBTdHJpbmcoTWF0aC5hYnMobHJ5IC0gdWx5KSkpO1xuICAgIH1cblxuXG4gICAgZm9yIChjb25zdCBwb2ludE5hbWUgaW4gUG9pbnROYW1lcykge1xuICAgICAgY29uc3QgcG9pbnQ6IFBvaW50ID0gcG9pbnRzW1BvaW50TmFtZXNbcG9pbnROYW1lXV07XG4gICAgICBkMy5zZWxlY3QoJyNwLScgKyBwb2ludE5hbWUpLmZpbHRlcignLnJlc2l6ZVBvaW50JylcbiAgICAgICAgLmF0dHIoJ2N4JywgcG9pbnQueClcbiAgICAgICAgLmF0dHIoJ2N5JywgcG9pbnQueSk7XG4gICAgfVxuXG4gICAgbGV0IHggPSBwb2ludHNbM10ueDtcbiAgICBsZXQgeSA9IHBvaW50c1szXS55O1xuICAgIGNvbnN0IHBvaW50U3RyaW5nUmlnaHQgPSAoeCArIDEwMCkgKyAnLCcgKyAoeSArIDg1KSArICcgJyArXG4gICAgICAoeCArIDcwKSArICcsJyArICh5ICsgNTApICsgJyAnICsgKHggKyAxMDApICsgJywnICsgKHkgKyAxNSkgKyAnICcgKyAoeCArIDEzMCkgKyAnLCcgKyAoeSArIDUwKTtcbiAgICB4ID0gcG9pbnRzWzddLng7XG4gICAgeSA9IHBvaW50c1s3XS55O1xuICAgIGNvbnN0IHBvaW50U3RyaW5nTGVmdCA9ICh4IC0gMTAwKSArICcsJyArICh5IC0gMTUpICsgJyAnICtcbiAgICAgICh4IC0gMTMwKSArICcsJyArICh5IC0gNTApICsgJyAnICsgKHggLSAxMDApICsgJywnICsgKHkgLSA4NSkgKyAnICcgKyAoeCAtIDcwKSArICcsJyArICh5IC0gNTApO1xuXG4gICAgZDMuc2VsZWN0KCcjcm90YXRlTGVmdCcpLmF0dHIoJ3BvaW50cycsIHBvaW50U3RyaW5nTGVmdCk7XG4gICAgZDMuc2VsZWN0KCcjcm90YXRlUmlnaHQnKS5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZ1JpZ2h0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBpbml0aWFsIHJlY3RhbmdsZSBhcm91bmQgdGhlIGVsZW1lbnRcbiAgICogYW5kIGFkZCB0aGUgbGlzdGVuZXJzIHRvIHN1cHBvcnQgZHJhZ2dpbmcgdG8gcmVzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gZHJhd0luaXRpYWxSZWN0ICgpOiB2b2lkIHtcbiAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgZDMuc2VsZWN0QWxsKCcucmVzaXplUG9pbnQnKS5yZW1vdmUoKTtcbiAgICBkMy5zZWxlY3RBbGwoJyNyZXNpemVSZWN0JykucmVtb3ZlKCk7XG4gICAgZDMuc2VsZWN0QWxsKCcucm90YXRlUG9pbnQnKS5yZW1vdmUoKTtcblxuICAgIC8vIGlmIGl0J3MgYSBib3VuZGluZ2JveCBqdXN0IGdldCB0aGUgY29vcmRpbmF0ZXNcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKSB7XG4gICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgICAgaWYgKHJlY3QgPT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUcmllZCB0byBkcmF3IHJlc2l6ZSByZWN0IGZvciBhIHN5bFRleHRSZWN0IHRoYXQgZG9lc25cXCd0IGV4aXN0IChvciBpc25cXCd0IGRpc3BsYXlpbmcpJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVseCA9IE51bWJlcihyZWN0LmdldEF0dHJpYnV0ZSgneCcpKTtcbiAgICAgIHVseSA9IE51bWJlcihyZWN0LmdldEF0dHJpYnV0ZSgneScpKTtcbiAgICAgIGxyeCA9ICt1bHggKyArcmVjdC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgICBscnkgPSArdWx5ICsgK3JlY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKTtcblxuICAgICAgcm90YXRlID0gMDtcbiAgICB9XG5cbiAgICAvLyBpZiBpdCdzIGEgc3RhZmYgdXNlIHRoZSBwYXRocyB0byBnZXQgaXQncyBib3VuZGluZ2JveFxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc3RhZmYnKSkge1xuICAgICAgY29uc3QgYmJveCA9IGdldFN0YWZmQkJveChlbGVtZW50KTtcbiAgICAgIHVseCA9IGJib3gudWx4O1xuICAgICAgdWx5ID0gYmJveC51bHk7XG4gICAgICBscnggPSBiYm94LmxyeDtcbiAgICAgIGxyeSA9IGJib3gubHJ5O1xuXG4gICAgICBjb25zdCBjb29yZGluYXRlczogbnVtYmVyW10gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3BhdGgnKVxuICAgICAgICAuZ2V0QXR0cmlidXRlKCdkJylcbiAgICAgICAgLm1hdGNoKC9cXGQrL2cpXG4gICAgICAgIC5tYXAoZWxlbWVudCA9PiBOdW1iZXIoZWxlbWVudCkpO1xuICAgICAgcm90YXRlID0gTWF0aC5hdGFuKChjb29yZGluYXRlc1szXSAtIGNvb3JkaW5hdGVzWzFdKSAvXG4gICAgICAgIChjb29yZGluYXRlc1syXSAtIGNvb3JkaW5hdGVzWzBdKSk7XG4gICAgfVxuXG4gICAgaW5pdGlhbFVseCA9IHVseCwgaW5pdGlhbFVseSA9IHVseSwgaW5pdGlhbExyeCA9IGxyeCwgaW5pdGlhbExyeSA9IGxyeTtcblxuICAgIGxldCB3aGljaFBvaW50OiBzdHJpbmc7XG5cbiAgICBjb25zdCBwb2ludHMgPSBnZXRQb2ludHModWx4LCB1bHksIGxyeCwgbHJ5LCByb3RhdGUpO1xuXG4gICAgcG9seUxlbiA9IHBvaW50c1syXS54IC0gcG9pbnRzWzBdLng7XG5cbiAgICBjb25zdCBwb2ludFN0cmluZyA9IHBvaW50cy5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAlIDIgPT09IDApXG4gICAgICAubWFwKGVsZW0gPT4gZWxlbS54ICsgJywnICsgZWxlbS55KVxuICAgICAgLmpvaW4oJyAnKTtcblxuICAgIGQzLnNlbGVjdCgnIycgKyBlbGVtZW50LmlkKS5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgLmF0dHIoJ3BvaW50cycsIHBvaW50U3RyaW5nKVxuICAgICAgLmF0dHIoJ2lkJywgJ3Jlc2l6ZVJlY3QnKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMTApXG4gICAgICAuYXR0cignZmlsbCcsICdub25lJylcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ21vdmUnKVxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzIwIDEwJyk7XG5cbiAgICBjb25zdCB7IGNpcmNsZVNpemUgfSA9IGdldFNldHRpbmdzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHBvaW50TmFtZSBpbiBQb2ludE5hbWVzKSB7XG4gICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBwb2ludHNbUG9pbnROYW1lc1twb2ludE5hbWVdXTtcbiAgICAgIGQzLnNlbGVjdChlbGVtZW50LnZpZXdwb3J0RWxlbWVudCkuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAuYXR0cignY3gnLCBwb2ludC54KVxuICAgICAgICAuYXR0cignY3knLCBwb2ludC55KVxuICAgICAgICAuYXR0cigncicsIGNpcmNsZVNpemUpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgNClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnIzAwOTlmZicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdyZXNpemVQb2ludCcpXG4gICAgICAgIC5hdHRyKCdpZCcsICdwLScgKyBwb2ludE5hbWUpO1xuICAgIH1cblxuICAgIC8vIGRvIGl0IGFzIGEgbG9vcCBpbnN0ZWFkIG9mIHNlbGVjdEFsbCBzbyB0aGF0IHlvdSBjYW4gZWFzaWx5IGtub3cgd2hpY2ggcG9pbnQgd2FzXG4gICAgZm9yIChjb25zdCBuYW1lIGluIFBvaW50TmFtZXMpIHtcbiAgICAgIGQzLnNlbGVjdCgnI3AtJyArIG5hbWUpLmZpbHRlcignLnJlc2l6ZVBvaW50JykuY2FsbChcbiAgICAgICAgZDMuZHJhZygpXG4gICAgICAgICAgLm9uKCdzdGFydCcsICgpID0+IHsgcmVzaXplU3RhcnQobmFtZSk7IH0pXG4gICAgICAgICAgLm9uKCdkcmFnJywgcmVzaXplRHJhZylcbiAgICAgICAgICAub24oJ2VuZCcsIHJlc2l6ZUVuZC5iaW5kKHRoaXMpKSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFmZicpKSB7XG4gICAgICBsZXQgeCA9IHBvaW50c1szXS54O1xuICAgICAgbGV0IHkgPSBwb2ludHNbM10ueTtcbiAgICAgIGNvbnN0IHBvaW50U3RyaW5nUmlnaHQgPSAoeCArIDEwMCkgKyAnLCcgKyAoeSArIDg1KSArICcgJyArXG4gICAgICAgICh4ICsgNzApICsgJywnICsgKHkgKyA1MCkgKyAnICcgKyAoeCArIDEwMCkgKyAnLCcgKyAoeSArIDE1KSArICcgJyArICh4ICsgMTMwKSArICcsJyArICh5ICsgNTApO1xuICAgICAgeCA9IHBvaW50c1s3XS54O1xuICAgICAgeSA9IHBvaW50c1s3XS55O1xuICAgICAgY29uc3QgcG9pbnRTdHJpbmdMZWZ0ID0gKHggLSAxMDApICsgJywnICsgKHkgLSAxNSkgKyAnICcgK1xuICAgICAgICAoeCAtIDEzMCkgKyAnLCcgKyAoeSAtIDUwKSArICcgJyArICh4IC0gMTAwKSArICcsJyArICh5IC0gODUpICsgJyAnICsgKHggLSA3MCkgKyAnLCcgKyAoeSAtIDUwKTtcblxuICAgICAgZDMuc2VsZWN0KCcjJyArIGVsZW1lbnQuaWQpLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgIC5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZ1JpZ2h0KVxuICAgICAgICAuYXR0cignaWQnLCAncm90YXRlUmlnaHQnKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDcpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJyMwMDk5ZmYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAncm90YXRlUG9pbnQnKTtcblxuICAgICAgZDMuc2VsZWN0KCcjJyArIGVsZW1lbnQuaWQpLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgIC5hdHRyKCdwb2ludHMnLCBwb2ludFN0cmluZ0xlZnQpXG4gICAgICAgIC5hdHRyKCdpZCcsICdyb3RhdGVMZWZ0JylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCA3KVxuICAgICAgICAuYXR0cignZmlsbCcsICcjMDA5OWZmJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3JvdGF0ZVBvaW50Jyk7XG5cbiAgICAgIGQzLnNlbGVjdCgnI3JvdGF0ZUxlZnQnKS5jYWxsKFxuICAgICAgICBkMy5kcmFnKClcbiAgICAgICAgICAub24oJ3N0YXJ0Jywgcm90YXRlU3RhcnQpXG4gICAgICAgICAgLm9uKCdkcmFnJywgcm90YXRlRHJhZ0xlZnQpXG4gICAgICAgICAgLm9uKCdlbmQnLCByb3RhdGVFbmQpKTtcblxuICAgICAgZDMuc2VsZWN0KCcjcm90YXRlUmlnaHQnKS5jYWxsKFxuICAgICAgICBkMy5kcmFnKClcbiAgICAgICAgICAub24oJ3N0YXJ0Jywgcm90YXRlU3RhcnQpXG4gICAgICAgICAgLm9uKCdkcmFnJywgcm90YXRlRHJhZ1JpZ2h0KVxuICAgICAgICAgIC5vbignZW5kJywgcm90YXRlRW5kKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzaXplU3RhcnQgKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgd2hpY2hQb2ludCA9IG5hbWU7XG4gICAgICBjb25zdCBwb2ludCA9IHBvaW50cy5maW5kKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXNbbmFtZV0pO1xuICAgICAgaW5pdGlhbFBvaW50ID0gW3BvaW50LngsIHBvaW50LnldO1xuICAgICAgaW5pdGlhbFVseSA9IHVseTtcbiAgICAgIGluaXRpYWxMcnkgPSBscnk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzaXplRHJhZyAoKTogdm9pZCB7XG4gICAgICBjb25zdCBjdXJyZW50UG9pbnQgPSBkMy5tb3VzZSh0aGlzKTtcbiAgICAgIHN3aXRjaCAoUG9pbnROYW1lc1t3aGljaFBvaW50XSkge1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuVG9wTGVmdDpcbiAgICAgICAgICB1bHggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgdWx5ID0gY3VycmVudFBvaW50WzFdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuVG9wOlxuICAgICAgICAgIHVseSA9IGN1cnJlbnRQb2ludFsxXSAtIChscnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKSAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5Ub3BSaWdodDpcbiAgICAgICAgICBscnggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgdWx5ID0gY3VycmVudFBvaW50WzFdIC0gKGxyeCAtIHVseCkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuUmlnaHQ6XG4gICAgICAgICAgbHJ4ID0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgIGxyeSA9IGluaXRpYWxMcnkgKyAoY3VycmVudFBvaW50WzBdIC0gaW5pdGlhbFBvaW50WzBdKSAqIE1hdGgudGFuKHJvdGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5Cb3R0b21SaWdodDpcbiAgICAgICAgICBscnggPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgbHJ5ID0gY3VycmVudFBvaW50WzFdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvaW50TmFtZXMuQm90dG9tOlxuICAgICAgICAgIGxyeSA9IGN1cnJlbnRQb2ludFsxXSArIChscnggLSB1bHgpICogTWF0aC50YW4ocm90YXRlKSAvIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5Cb3R0b21MZWZ0OlxuICAgICAgICAgIHVseCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICBscnkgPSBjdXJyZW50UG9pbnRbMV0gKyAobHJ4IC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9pbnROYW1lcy5MZWZ0OlxuICAgICAgICAgIHVseCA9IGN1cnJlbnRQb2ludFswXTtcbiAgICAgICAgICB1bHkgPSBpbml0aWFsVWx5ICsgKGN1cnJlbnRQb2ludFswXSAtIGluaXRpYWxQb2ludFswXSkgKiBNYXRoLnRhbihyb3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvbWV0aGluZyB0aGF0IHdhc25cXCd0IGEgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIHdhcyBkcmFnZ2VkLiBUaGlzIHNob3VsZG5cXCd0IGhhcHBlbi4nKTtcbiAgICAgIH1cbiAgICAgIHJlZHJhdygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZUVuZCAoKTogdm9pZCB7XG4gICAgICBpZiAoaXNPdXRPZlNWR0JvdW5kcyh1bHgsIHVseSkgfHwgaXNPdXRPZlNWR0JvdW5kcyhscngsIGxyeSkpIHtcbiAgICAgICAgdWx4ID0gaW5pdGlhbFVseCwgdWx5ID0gaW5pdGlhbFVseSwgbHJ4ID0gaW5pdGlhbExyeCwgbHJ5ID0gaW5pdGlhbExyeTtcbiAgICAgICAgcmVkcmF3KCk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlTm90aWZpY2F0aW9uKCdbRkFJTF0gR2x5cGhzIHdlcmUgcGxhY2VkIG91dCBvZiBib3VuZHMhIFJlc2l6ZSBhY3Rpb24gZmFpbGVkLicsICdlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZGl0b3JBY3Rpb246IFJlc2l6ZUFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiAncmVzaXplJyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgdWx4OiB1bHgsXG4gICAgICAgICAgdWx5OiB1bHksXG4gICAgICAgICAgbHJ4OiBscngsXG4gICAgICAgICAgbHJ5OiBscnlcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbmVvblZpZXcuZWRpdChlZGl0b3JBY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBhd2FpdCBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtlbGVtZW50LmlkfWApO1xuICAgICAgICB1bHggPSB1bmRlZmluZWQsIHVseSA9IHVuZGVmaW5lZCwgbHJ4ID0gdW5kZWZpbmVkLCBscnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRyYXdJbml0aWFsUmVjdCgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgICAgIHNlbGVjdEJCb3goZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLCBkcmFnSGFuZGxlciwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0QWxsKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtlbGVtZW50LmlkfWApXSwgbmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICAgICAgICBjb25zdCBtb3JlRWRpdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21vcmVFZGl0Jyk7XG5cbiAgICAgICAgICBpZiAobW9yZUVkaXQpIHtcbiAgICAgICAgICAgIG1vcmVFZGl0LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgbW9yZUVkaXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJPVEFURVxuICAgIGZ1bmN0aW9uIHJvdGF0ZVN0YXJ0ICgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHdoaWNoID0gZDMuZXZlbnQuc291cmNlRXZlbnQudGFyZ2V0LmlkO1xuICAgICAgaW5pdGlhbFkgPSBkMy5tb3VzZSh0aGlzKVsxXTtcbiAgICAgIGluaXRpYWxMcnkgPSBscnk7XG4gICAgICBpbml0aWFsVWx5ID0gdWx5O1xuICAgICAgaW5pdGlhbFJlY3RZID0gKHdoaWNoID09PSAncm90YXRlUmlnaHQnID8gbHJ5IDogdWx5KTtcbiAgICAgIGluaXRpYWxSb3RhdGUgPSByb3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm90YXRlRHJhZ0xlZnQgKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFkgPSBkMy5tb3VzZSh0aGlzKVsxXTtcbiAgICAgIGNvbnN0IHRlbXAgPSBjdXJyZW50WSAtIGluaXRpYWxZO1xuICAgICAgY29uc3QgdGVtcFJvdGF0ZSA9IGluaXRpYWxSb3RhdGUgLSBNYXRoLmF0YW4odGVtcCAvIHBvbHlMZW4pO1xuICAgICAgaWYgKHRlbXBSb3RhdGUgPiAtMC4yICYmIHRlbXBSb3RhdGUgPCAwLjIpIHtcbiAgICAgICAgZHkgPSB0ZW1wO1xuICAgICAgICB1bHkgPSBpbml0aWFsUmVjdFkgKyBkeTtcbiAgICAgICAgcm90YXRlID0gdGVtcFJvdGF0ZTtcbiAgICAgICAgaWYgKHJvdGF0ZSA+PSAwKSB7XG4gICAgICAgICAgdWx5ID0gZHkgKyBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuVG9wTGVmdClbMF0ueTtcbiAgICAgICAgICBscnkgPSBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuQm90dG9tUmlnaHQpWzBdLnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdWx5ID0gcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLlRvcFJpZ2h0KVswXS55O1xuICAgICAgICAgIGxyeSA9IGR5ICsgcG9pbnRzLmZpbHRlcihwb2ludCA9PiBwb2ludC5uYW1lID09PSBQb2ludE5hbWVzLkJvdHRvbUxlZnQpWzBdLnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZHJhdygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvdGF0ZURyYWdSaWdodCAoKTogdm9pZCB7XG4gICAgICBjb25zdCBjdXJyZW50WSA9IGQzLm1vdXNlKHRoaXMpWzFdO1xuICAgICAgY29uc3QgdGVtcCA9IGN1cnJlbnRZIC0gaW5pdGlhbFk7XG4gICAgICBjb25zdCB0ZW1wUm90YXRlID0gaW5pdGlhbFJvdGF0ZSArIE1hdGguYXRhbih0ZW1wIC8gcG9seUxlbik7XG4gICAgICBpZiAodGVtcFJvdGF0ZSA+IC0wLjIgJiYgdGVtcFJvdGF0ZSA8IDAuMikge1xuICAgICAgICBkeSA9IHRlbXA7XG4gICAgICAgIHJvdGF0ZSA9IHRlbXBSb3RhdGU7XG4gICAgICAgIGlmIChyb3RhdGUgPj0gMCApIHtcbiAgICAgICAgICBscnkgPSBkeSArIHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Cb3R0b21SaWdodClbMF0ueTtcbiAgICAgICAgICB1bHkgPSBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuVG9wTGVmdClbMF0ueTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bHkgPSBkeSArIHBvaW50cy5maWx0ZXIocG9pbnQgPT4gcG9pbnQubmFtZSA9PT0gUG9pbnROYW1lcy5Ub3BSaWdodClbMF0ueTtcbiAgICAgICAgICBscnkgPSBwb2ludHMuZmlsdGVyKHBvaW50ID0+IHBvaW50Lm5hbWUgPT09IFBvaW50TmFtZXMuQm90dG9tTGVmdClbMF0ueTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVkcmF3KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm90YXRlRW5kICgpOiB2b2lkIHtcbiAgICAgIGlmIChkeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGR5ID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT3V0T2ZTVkdCb3VuZHModWx4LCB1bHkpIHx8IGlzT3V0T2ZTVkdCb3VuZHMobHJ4LCBscnkpKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXNpemVQb2ludCcpLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVzaXplUmVjdCcpLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucm90YXRlUG9pbnQnKS5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKTtcblxuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5pZCkgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIHVseCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdWx5ID0gdW5kZWZpbmVkO1xuICAgICAgICBscnggPSB1bmRlZmluZWQ7XG4gICAgICAgIGxyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRyYXdJbml0aWFsUmVjdCgpO1xuICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N5bCcpKSB7XG4gICAgICAgICAgc2VsZWN0QkJveChlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyksIGRyYWdIYW5kbGVyLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RTdGFmZihlbGVtZW50LCBkcmFnSGFuZGxlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVldWVOb3RpZmljYXRpb24oJ1tGQUlMXSBHbHlwaHMgd2VyZSBwbGFjZWQgb3V0IG9mIGJvdW5kcyEgUm90YXRlIGFjdGlvbiBmYWlsZWQuJywgJ2Vycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICBhY3Rpb246ICdyZXNpemVSb3RhdGUnLFxuICAgICAgICBwYXJhbToge1xuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgICB1bHg6IHVseCxcbiAgICAgICAgICB1bHk6IHVseSxcbiAgICAgICAgICBscng6IGxyeCxcbiAgICAgICAgICBscnk6IGxyeSxcbiAgICAgICAgICByb3RhdGU6IHJvdGF0ZSAqIDE4MCAvIE1hdGguUElcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG5lb25WaWV3LmVkaXQoZWRpdG9yQWN0aW9uLCBuZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgYXdhaXQgbmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5pZCkgYXMgdW5rbm93biBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIHVseCA9IHVuZGVmaW5lZCwgdWx5ID0gdW5kZWZpbmVkLCBscnggPSB1bmRlZmluZWQsIGxyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRyYXdJbml0aWFsUmVjdCgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWwnKSkge1xuICAgICAgICAgIHNlbGVjdEJCb3goZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLCBkcmFnSGFuZGxlciwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0U3RhZmYoZWxlbWVudCwgZHJhZ0hhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBpbW1lZGlhdGUgZnJvbSAnaW1tZWRpYXRlJztcbmltcG9ydCB7IHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgTWQ1IGZyb20gJ3NwYXJrLW1kNSc7XG5pbXBvcnQgdnV2dXplbGEgZnJvbSAndnV2dXplbGEnO1xuaW1wb3J0IGdldEFyZ3VtZW50cyBmcm9tICdhcmdzYXJyYXknO1xuaW1wb3J0IGluaGVyaXRzIGZyb20gJ2luaGVyaXRzJztcbmltcG9ydCBFRSBmcm9tICdldmVudHMnO1xuXG5mdW5jdGlvbiBtYW5nbGUoa2V5KSB7XG4gIHJldHVybiAnJCcgKyBrZXk7XG59XG5mdW5jdGlvbiB1bm1hbmdsZShrZXkpIHtcbiAgcmV0dXJuIGtleS5zdWJzdHJpbmcoMSk7XG59XG5mdW5jdGlvbiBNYXAkMSgpIHtcbiAgdGhpcy5fc3RvcmUgPSB7fTtcbn1cbk1hcCQxLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHJldHVybiB0aGlzLl9zdG9yZVttYW5nbGVkXTtcbn07XG5NYXAkMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIG1hbmdsZWQgPSBtYW5nbGUoa2V5KTtcbiAgdGhpcy5fc3RvcmVbbWFuZ2xlZF0gPSB2YWx1ZTtcbiAgcmV0dXJuIHRydWU7XG59O1xuTWFwJDEucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgdmFyIG1hbmdsZWQgPSBtYW5nbGUoa2V5KTtcbiAgcmV0dXJuIG1hbmdsZWQgaW4gdGhpcy5fc3RvcmU7XG59O1xuTWFwJDEucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9zdG9yZSkubWFwKGsgPT4gdW5tYW5nbGUoaykpO1xufTtcbk1hcCQxLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBtYW5nbGVkID0gbWFuZ2xlKGtleSk7XG4gIHZhciByZXMgPSBtYW5nbGVkIGluIHRoaXMuX3N0b3JlO1xuICBkZWxldGUgdGhpcy5fc3RvcmVbbWFuZ2xlZF07XG4gIHJldHVybiByZXM7XG59O1xuTWFwJDEucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2IpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9zdG9yZSk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgdmFyIHZhbHVlID0gdGhpcy5fc3RvcmVba2V5XTtcbiAgICBrZXkgPSB1bm1hbmdsZShrZXkpO1xuICAgIGNiKHZhbHVlLCBrZXkpO1xuICB9XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcCQxLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9zdG9yZSkubGVuZ3RoO1xuICB9XG59KTtcblxuZnVuY3Rpb24gU2V0JDEoYXJyYXkpIHtcbiAgdGhpcy5fc3RvcmUgPSBuZXcgTWFwJDEoKTtcblxuICAvLyBpbml0IHdpdGggYW4gYXJyYXlcbiAgaWYgKGFycmF5ICYmIEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0aGlzLmFkZChhcnJheVtpXSk7XG4gICAgfVxuICB9XG59XG5TZXQkMS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gdGhpcy5fc3RvcmUuc2V0KGtleSwgdHJ1ZSk7XG59O1xuU2V0JDEucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3N0b3JlLmhhcyhrZXkpO1xufTtcblNldCQxLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNiKSB7XG4gIHRoaXMuX3N0b3JlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBjYihrZXkpO1xuICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU2V0JDEucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLnNpemU7XG4gIH1cbn0pO1xuXG4vLyBCYXNlZCBvbiBodHRwczovL2thbmdheC5naXRodWIuaW8vY29tcGF0LXRhYmxlL2VzNi8gd2UgY2FuIHNuaWZmIG91dFxuLy8gaW5jb21wbGV0ZSBNYXAvU2V0IGltcGxlbWVudGF0aW9ucyB3aGljaCB3b3VsZCBvdGhlcndpc2UgY2F1c2Ugb3VyIHRlc3RzIHRvIGZhaWwuXG4vLyBOb3RhYmx5IHRoZXkgZmFpbCBpbiBJRTExIGFuZCBpT1MgOC40LCB3aGljaCB0aGlzIHByZXZlbnRzLlxuZnVuY3Rpb24gc3VwcG9ydHNNYXBBbmRTZXQoKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLCBTeW1ib2wuc3BlY2llcyk7XG4gIHJldHVybiBwcm9wICYmICdnZXQnIGluIHByb3AgJiYgTWFwW1N5bWJvbC5zcGVjaWVzXSA9PT0gTWFwO1xufVxuXG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbW9udGFnZWpzL2NvbGxlY3Rpb25zXG5cbnZhciBFeHBvcnRlZFNldDtcbnZhciBFeHBvcnRlZE1hcDtcblxue1xuICBpZiAoc3VwcG9ydHNNYXBBbmRTZXQoKSkgeyAvLyBwcmVmZXIgYnVpbHQtaW4gTWFwL1NldFxuICAgIEV4cG9ydGVkU2V0ID0gU2V0O1xuICAgIEV4cG9ydGVkTWFwID0gTWFwO1xuICB9IGVsc2UgeyAvLyBmYWxsIGJhY2sgdG8gb3VyIHBvbHlmaWxsXG4gICAgRXhwb3J0ZWRTZXQgPSBTZXQkMTtcbiAgICBFeHBvcnRlZE1hcCA9IE1hcCQxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQmluYXJ5T2JqZWN0KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqZWN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8XG4gICAgKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBvYmplY3QgaW5zdGFuY2VvZiBCbG9iKTtcbn1cblxuZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihidWZmKSB7XG4gIGlmICh0eXBlb2YgYnVmZi5zbGljZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBidWZmLnNsaWNlKDApO1xuICB9XG4gIC8vIElFMTAtMTEgc2xpY2UoKSBwb2x5ZmlsbFxuICB2YXIgdGFyZ2V0ID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmYuYnl0ZUxlbmd0aCk7XG4gIHZhciB0YXJnZXRBcnJheSA9IG5ldyBVaW50OEFycmF5KHRhcmdldCk7XG4gIHZhciBzb3VyY2VBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmYpO1xuICB0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXkpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBjbG9uZUJpbmFyeU9iamVjdChvYmplY3QpIHtcbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtcbiAgfVxuICB2YXIgc2l6ZSA9IG9iamVjdC5zaXplO1xuICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuICAvLyBCbG9iXG4gIGlmICh0eXBlb2Ygb2JqZWN0LnNsaWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9iamVjdC5zbGljZSgwLCBzaXplLCB0eXBlKTtcbiAgfVxuICAvLyBQaGFudG9tSlMgc2xpY2UoKSByZXBsYWNlbWVudFxuICByZXR1cm4gb2JqZWN0LndlYmtpdFNsaWNlKDAsIHNpemUsIHR5cGUpO1xufVxuXG4vLyBtb3N0IG9mIHRoaXMgaXMgYm9ycm93ZWQgZnJvbSBsb2Rhc2guaXNQbGFpbk9iamVjdDpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9maXMtY29tcG9uZW50cy9sb2Rhc2guaXNwbGFpbm9iamVjdC9cbi8vIGJsb2IvMjljMzU4MTQwYTc0ZjI1MmFlYjA4YzllYjI4YmVmODZmMjIxN2Q0YS9pbmRleC5qc1xuXG52YXIgZnVuY1RvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAocHJvdG8gPT09IG51bGwpIHsgLy8gbm90IHN1cmUgd2hlbiB0aGlzIGhhcHBlbnMsIGJ1dCBJIGd1ZXNzIGl0IGNhblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmcpO1xufVxuXG5mdW5jdGlvbiBjbG9uZShvYmplY3QpIHtcbiAgdmFyIG5ld09iamVjdDtcbiAgdmFyIGk7XG4gIHZhciBsZW47XG5cbiAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgIG5ld09iamVjdCA9IFtdO1xuICAgIGZvciAoaSA9IDAsIGxlbiA9IG9iamVjdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbmV3T2JqZWN0W2ldID0gY2xvbmUob2JqZWN0W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld09iamVjdDtcbiAgfVxuXG4gIC8vIHNwZWNpYWwgY2FzZTogdG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gSW5kZXhlZERCXG4gIC8vIGFuZCBvdGhlciBiYWNrZW5kcywgd2UgYXV0b21hdGljYWxseSBzdHJpbmdpZnkgRGF0ZXNcbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUgJiYgaXNGaW5pdGUob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3QudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIGlmIChpc0JpbmFyeU9iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIGNsb25lQmluYXJ5T2JqZWN0KG9iamVjdCk7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7IC8vIGRvbid0IGNsb25lIG9iamVjdHMgbGlrZSBXb3JrZXJzXG4gIH1cblxuICBuZXdPYmplY3QgPSB7fTtcbiAgZm9yIChpIGluIG9iamVjdCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGkpKSB7XG4gICAgICB2YXIgdmFsdWUgPSBjbG9uZShvYmplY3RbaV0pO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbmV3T2JqZWN0W2ldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZnVuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIC8vIHRoaXMgaXMgYSBzbW9rZSB0ZXN0IGFuZCBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgaGFwcGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uY2UgY2FsbGVkIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICBmdW4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9Qcm9taXNlKGZ1bmMpIHtcbiAgLy9jcmVhdGUgdGhlIGZ1bmN0aW9uIHdlIHdpbGwgYmUgcmV0dXJuaW5nXG4gIHJldHVybiBnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAvLyBDbG9uZSBhcmd1bWVudHNcbiAgICBhcmdzID0gY2xvbmUoYXJncyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIGlmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdHMgYSBjYWxsYmFja1xuICAgIHZhciB1c2VkQ0IgPSAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgPyBhcmdzLnBvcCgpIDogZmFsc2U7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZnVsZmlsbCwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVzcDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IG9uY2UoZnVuY3Rpb24gKGVyciwgbWVzZykge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmdWxmaWxsKG1lc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNyZWF0ZSBhIGNhbGxiYWNrIGZvciB0aGlzIGludm9jYXRpb25cbiAgICAgICAgLy8gYXBwbHkgdGhlIGZ1bmN0aW9uIGluIHRoZSBvcmlnIGNvbnRleHRcbiAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmVzcCA9IGZ1bmMuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgIGlmIChyZXNwICYmIHR5cGVvZiByZXNwLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmdWxmaWxsKHJlc3ApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrLCBjYWxsIGl0IGJhY2tcbiAgICBpZiAodXNlZENCKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICB1c2VkQ0IobnVsbCwgcmVzdWx0KTtcbiAgICAgIH0sIHVzZWRDQik7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbG9nQXBpQ2FsbChzZWxmLCBuYW1lLCBhcmdzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoc2VsZi5jb25zdHJ1Y3Rvci5saXN0ZW5lcnMoJ2RlYnVnJykubGVuZ3RoKSB7XG4gICAgdmFyIGxvZ0FyZ3MgPSBbJ2FwaScsIHNlbGYubmFtZSwgbmFtZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgbG9nQXJncy5wdXNoKGFyZ3NbaV0pO1xuICAgIH1cbiAgICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ2RlYnVnJywgbG9nQXJncyk7XG5cbiAgICAvLyBvdmVycmlkZSB0aGUgY2FsbGJhY2sgaXRzZWxmIHRvIGxvZyB0aGUgcmVzcG9uc2VcbiAgICB2YXIgb3JpZ0NhbGxiYWNrID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgdmFyIHJlc3BvbnNlQXJncyA9IFsnYXBpJywgc2VsZi5uYW1lLCBuYW1lXTtcbiAgICAgIHJlc3BvbnNlQXJncyA9IHJlc3BvbnNlQXJncy5jb25jYXQoXG4gICAgICAgIGVyciA/IFsnZXJyb3InLCBlcnJdIDogWydzdWNjZXNzJywgcmVzXVxuICAgICAgKTtcbiAgICAgIHNlbGYuY29uc3RydWN0b3IuZW1pdCgnZGVidWcnLCByZXNwb25zZUFyZ3MpO1xuICAgICAgb3JpZ0NhbGxiYWNrKGVyciwgcmVzKTtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkYXB0ZXJGdW4obmFtZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRvUHJvbWlzZShnZXRBcmd1bWVudHMoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdkYXRhYmFzZSBpcyBjbG9zZWQnKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2RhdGFiYXNlIGlzIGRlc3Ryb3llZCcpKTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGxvZ0FwaUNhbGwoc2VsZiwgbmFtZSwgYXJncyk7XG4gICAgaWYgKCF0aGlzLnRhc2txdWV1ZS5pc1JlYWR5KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnRhc2txdWV1ZS5hZGRUYXNrKGZ1bmN0aW9uIChmYWlsZWQpIHtcbiAgICAgICAgICBpZiAoZmFpbGVkKSB7XG4gICAgICAgICAgICByZWplY3QoZmFpbGVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVsZmlsbChzZWxmW25hbWVdLmFwcGx5KHNlbGYsIGFyZ3MpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfSkpO1xufVxuXG4vLyBsaWtlIHVuZGVyc2NvcmUvbG9kYXNoIF8ucGljaygpXG5mdW5jdGlvbiBwaWNrKG9iaiwgYXJyKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBwcm9wID0gYXJyW2ldO1xuICAgIGlmIChwcm9wIGluIG9iaikge1xuICAgICAgcmVzW3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vLyBNb3N0IGJyb3dzZXJzIHRocm90dGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgYXQgNiwgc28gaXQncyBzaWxseVxuLy8gdG8gc2hpbSBfYnVsa19nZXQgYnkgdHJ5aW5nIHRvIGxhdW5jaCBwb3RlbnRpYWxseSBodW5kcmVkcyBvZiByZXF1ZXN0c1xuLy8gYW5kIHRoZW4gbGV0dGluZyB0aGUgbWFqb3JpdHkgdGltZSBvdXQuIFdlIGNhbiBoYW5kbGUgdGhpcyBvdXJzZWx2ZXMuXG52YXIgTUFYX05VTV9DT05DVVJSRU5UX1JFUVVFU1RTID0gNjtcblxuZnVuY3Rpb24gaWRlbnRpdHlGdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXN1bHRGb3JPcGVuUmV2c0dldChyZXN1bHQpIHtcbiAgcmV0dXJuIFt7XG4gICAgb2s6IHJlc3VsdFxuICB9XTtcbn1cblxuLy8gc2hpbSBmb3IgUC9Db3VjaERCIGFkYXB0ZXJzIHRoYXQgZG9uJ3QgZGlyZWN0bHkgaW1wbGVtZW50IF9idWxrX2dldFxuZnVuY3Rpb24gYnVsa0dldChkYiwgb3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIHJlcXVlc3RzID0gb3B0cy5kb2NzO1xuXG4gIC8vIGNvbnNvbGlkYXRlIGludG8gb25lIHJlcXVlc3QgcGVyIGRvYyBpZiBwb3NzaWJsZVxuICB2YXIgcmVxdWVzdHNCeUlkID0gbmV3IEV4cG9ydGVkTWFwKCk7XG4gIHJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICBpZiAocmVxdWVzdHNCeUlkLmhhcyhyZXF1ZXN0LmlkKSkge1xuICAgICAgcmVxdWVzdHNCeUlkLmdldChyZXF1ZXN0LmlkKS5wdXNoKHJlcXVlc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0c0J5SWQuc2V0KHJlcXVlc3QuaWQsIFtyZXF1ZXN0XSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgbnVtRG9jcyA9IHJlcXVlc3RzQnlJZC5zaXplO1xuICB2YXIgbnVtRG9uZSA9IDA7XG4gIHZhciBwZXJEb2NSZXN1bHRzID0gbmV3IEFycmF5KG51bURvY3MpO1xuXG4gIGZ1bmN0aW9uIGNvbGxhcHNlUmVzdWx0c0FuZEZpbmlzaCgpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHBlckRvY1Jlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXMuZG9jcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgaWQ6IHJlcy5pZCxcbiAgICAgICAgICBkb2NzOiBbaW5mb11cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjYWxsYmFjayhudWxsLCB7cmVzdWx0czogcmVzdWx0c30pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgIGlmICgrK251bURvbmUgPT09IG51bURvY3MpIHtcbiAgICAgIGNvbGxhcHNlUmVzdWx0c0FuZEZpbmlzaCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdvdFJlc3VsdChkb2NJbmRleCwgaWQsIGRvY3MpIHtcbiAgICBwZXJEb2NSZXN1bHRzW2RvY0luZGV4XSA9IHtpZDogaWQsIGRvY3M6IGRvY3N9O1xuICAgIGNoZWNrRG9uZSgpO1xuICB9XG5cbiAgdmFyIGFsbFJlcXVlc3RzID0gW107XG4gIHJlcXVlc3RzQnlJZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgYWxsUmVxdWVzdHMucHVzaChrZXkpO1xuICB9KTtcblxuICB2YXIgaSA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dEJhdGNoKCkge1xuXG4gICAgaWYgKGkgPj0gYWxsUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHVwVG8gPSBNYXRoLm1pbihpICsgTUFYX05VTV9DT05DVVJSRU5UX1JFUVVFU1RTLCBhbGxSZXF1ZXN0cy5sZW5ndGgpO1xuICAgIHZhciBiYXRjaCA9IGFsbFJlcXVlc3RzLnNsaWNlKGksIHVwVG8pO1xuICAgIHByb2Nlc3NCYXRjaChiYXRjaCwgaSk7XG4gICAgaSArPSBiYXRjaC5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzQmF0Y2goYmF0Y2gsIG9mZnNldCkge1xuICAgIGJhdGNoLmZvckVhY2goZnVuY3Rpb24gKGRvY0lkLCBqKSB7XG4gICAgICB2YXIgZG9jSWR4ID0gb2Zmc2V0ICsgajtcbiAgICAgIHZhciBkb2NSZXF1ZXN0cyA9IHJlcXVlc3RzQnlJZC5nZXQoZG9jSWQpO1xuXG4gICAgICAvLyBqdXN0IHVzZSB0aGUgZmlyc3QgcmVxdWVzdCBhcyB0aGUgXCJ0ZW1wbGF0ZVwiXG4gICAgICAvLyBUT0RPOiBUaGUgX2J1bGtfZ2V0IEFQSSBhbGxvd3MgZm9yIG1vcmUgc3VidGxlIHVzZSBjYXNlcyB0aGFuIHRoaXMsXG4gICAgICAvLyBidXQgZm9yIG5vdyBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZXJlIHdpbGwgYmUgYSBtaXggb2YgZGlmZmVyZW50XG4gICAgICAvLyBcImF0dHNfc2luY2VcIiBvciBcImF0dGFjaG1lbnRzXCIgaW4gdGhlIHNhbWUgcmVxdWVzdCwgc2luY2UgaXQncyBqdXN0XG4gICAgICAvLyByZXBsaWNhdGUuanMgdGhhdCBpcyB1c2luZyB0aGlzIGZvciB0aGUgbW9tZW50LlxuICAgICAgLy8gQWxzbywgYXR0c19zaW5jZSBpcyBhc3BpcmF0aW9uYWwsIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgaXQgeWV0LlxuICAgICAgdmFyIGRvY09wdHMgPSBwaWNrKGRvY1JlcXVlc3RzWzBdLCBbJ2F0dHNfc2luY2UnLCAnYXR0YWNobWVudHMnXSk7XG4gICAgICBkb2NPcHRzLm9wZW5fcmV2cyA9IGRvY1JlcXVlc3RzLm1hcChmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAvLyByZXYgaXMgb3B0aW9uYWwsIG9wZW5fcmV2cyBkaXNhbGxvd2VkXG4gICAgICAgIHJldHVybiByZXF1ZXN0LnJldjtcbiAgICAgIH0pO1xuXG4gICAgICAvLyByZW1vdmUgZmFsc2V5IC8gdW5kZWZpbmVkIHJldmlzaW9uc1xuICAgICAgZG9jT3B0cy5vcGVuX3JldnMgPSBkb2NPcHRzLm9wZW5fcmV2cy5maWx0ZXIoaWRlbnRpdHlGdW5jdGlvbik7XG5cbiAgICAgIHZhciBmb3JtYXRSZXN1bHQgPSBpZGVudGl0eUZ1bmN0aW9uO1xuXG4gICAgICBpZiAoZG9jT3B0cy5vcGVuX3JldnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBkb2NPcHRzLm9wZW5fcmV2cztcblxuICAgICAgICAvLyB3aGVuIGZldGNoaW5nIG9ubHkgdGhlIFwid2lubmluZ1wiIGxlYWYsXG4gICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgcmVzdWx0IHNvIGl0IGxvb2tzIGxpa2UgYW4gb3Blbl9yZXZzXG4gICAgICAgIC8vIHJlcXVlc3RcbiAgICAgICAgZm9ybWF0UmVzdWx0ID0gZm9ybWF0UmVzdWx0Rm9yT3BlblJldnNHZXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGdsb2JhbGx5LXN1cHBsaWVkIG9wdGlvbnNcbiAgICAgIFsncmV2cycsICdhdHRhY2htZW50cycsICdiaW5hcnknLCAnYWpheCcsICdsYXRlc3QnXS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gaW4gb3B0cykge1xuICAgICAgICAgIGRvY09wdHNbcGFyYW1dID0gb3B0c1twYXJhbV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZGIuZ2V0KGRvY0lkLCBkb2NPcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXN1bHQgPSBbe2Vycm9yOiBlcnJ9XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBmb3JtYXRSZXN1bHQocmVzKTtcbiAgICAgICAgfVxuICAgICAgICBnb3RSZXN1bHQoZG9jSWR4LCBkb2NJZCwgcmVzdWx0KTtcbiAgICAgICAgbmV4dEJhdGNoKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5leHRCYXRjaCgpO1xuXG59XG5cbnZhciBoYXNMb2NhbDtcblxudHJ5IHtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ19wb3VjaF9jaGVja19sb2NhbHN0b3JhZ2UnLCAxKTtcbiAgaGFzTG9jYWwgPSAhIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdfcG91Y2hfY2hlY2tfbG9jYWxzdG9yYWdlJyk7XG59IGNhdGNoIChlKSB7XG4gIGhhc0xvY2FsID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsU3RvcmFnZSgpIHtcbiAgcmV0dXJuIGhhc0xvY2FsO1xufVxuXG4vLyBDdXN0b20gbmV4dFRpY2soKSBzaGltIGZvciBicm93c2Vycy4gSW4gbm9kZSwgdGhpcyB3aWxsIGp1c3QgYmUgcHJvY2Vzcy5uZXh0VGljaygpLiBXZVxuXG5pbmhlcml0cyhDaGFuZ2VzLCBFRSk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBhdHRhY2hCcm93c2VyRXZlbnRzKHNlbGYpIHtcbiAgaWYgKGhhc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihcInN0b3JhZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHNlbGYuZW1pdChlLmtleSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gQ2hhbmdlcygpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbiAgdGhpcy5fbGlzdGVuZXJzID0ge307XG5cbiAgYXR0YWNoQnJvd3NlckV2ZW50cyh0aGlzKTtcbn1cbkNoYW5nZXMucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gKGRiTmFtZSwgaWQsIGRiLCBvcHRzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodGhpcy5fbGlzdGVuZXJzW2lkXSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBpbnByb2dyZXNzID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGV2ZW50RnVuY3Rpb24oKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFzZWxmLl9saXN0ZW5lcnNbaWRdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbnByb2dyZXNzKSB7XG4gICAgICBpbnByb2dyZXNzID0gJ3dhaXRpbmcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnByb2dyZXNzID0gdHJ1ZTtcbiAgICB2YXIgY2hhbmdlc09wdHMgPSBwaWNrKG9wdHMsIFtcbiAgICAgICdzdHlsZScsICdpbmNsdWRlX2RvY3MnLCAnYXR0YWNobWVudHMnLCAnY29uZmxpY3RzJywgJ2ZpbHRlcicsXG4gICAgICAnZG9jX2lkcycsICd2aWV3JywgJ3NpbmNlJywgJ3F1ZXJ5X3BhcmFtcycsICdiaW5hcnknLCAncmV0dXJuX2RvY3MnXG4gICAgXSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIG9uRXJyb3IoKSB7XG4gICAgICBpbnByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZGIuY2hhbmdlcyhjaGFuZ2VzT3B0cykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChjKSB7XG4gICAgICBpZiAoYy5zZXEgPiBvcHRzLnNpbmNlICYmICFvcHRzLmNhbmNlbGxlZCkge1xuICAgICAgICBvcHRzLnNpbmNlID0gYy5zZXE7XG4gICAgICAgIG9wdHMub25DaGFuZ2UoYyk7XG4gICAgICB9XG4gICAgfSkub24oJ2NvbXBsZXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGlucHJvZ3Jlc3MgPT09ICd3YWl0aW5nJykge1xuICAgICAgICBpbW1lZGlhdGUoZXZlbnRGdW5jdGlvbik7XG4gICAgICB9XG4gICAgICBpbnByb2dyZXNzID0gZmFsc2U7XG4gICAgfSkub24oJ2Vycm9yJywgb25FcnJvcik7XG4gIH1cbiAgdGhpcy5fbGlzdGVuZXJzW2lkXSA9IGV2ZW50RnVuY3Rpb247XG4gIHRoaXMub24oZGJOYW1lLCBldmVudEZ1bmN0aW9uKTtcbn07XG5cbkNoYW5nZXMucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGRiTmFtZSwgaWQpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghKGlkIGluIHRoaXMuX2xpc3RlbmVycykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgRUUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLmNhbGwodGhpcywgZGJOYW1lLFxuICAgIHRoaXMuX2xpc3RlbmVyc1tpZF0pO1xuICBkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2lkXTtcbn07XG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbkNoYW5nZXMucHJvdG90eXBlLm5vdGlmeUxvY2FsV2luZG93cyA9IGZ1bmN0aW9uIChkYk5hbWUpIHtcbiAgLy9kbyBhIHVzZWxlc3MgY2hhbmdlIG9uIGEgc3RvcmFnZSB0aGluZ1xuICAvL2luIG9yZGVyIHRvIGdldCBvdGhlciB3aW5kb3dzJ3MgbGlzdGVuZXJzIHRvIGFjdGl2YXRlXG4gIGlmIChoYXNMb2NhbFN0b3JhZ2UoKSkge1xuICAgIGxvY2FsU3RvcmFnZVtkYk5hbWVdID0gKGxvY2FsU3RvcmFnZVtkYk5hbWVdID09PSBcImFcIikgPyBcImJcIiA6IFwiYVwiO1xuICB9XG59O1xuXG5DaGFuZ2VzLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiAoZGJOYW1lKSB7XG4gIHRoaXMuZW1pdChkYk5hbWUpO1xuICB0aGlzLm5vdGlmeUxvY2FsV2luZG93cyhkYk5hbWUpO1xufTtcblxuZnVuY3Rpb24gZ3VhcmRlZENvbnNvbGUobWV0aG9kKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGVbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBjb25zb2xlW21ldGhvZF0uYXBwbHkoY29uc29sZSwgYXJncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmFuZG9tTnVtYmVyKG1pbiwgbWF4KSB7XG4gIHZhciBtYXhUaW1lb3V0ID0gNjAwMDAwOyAvLyBIYXJkLWNvZGVkIGRlZmF1bHQgb2YgMTAgbWludXRlc1xuICBtaW4gPSBwYXJzZUludChtaW4sIDEwKSB8fCAwO1xuICBtYXggPSBwYXJzZUludChtYXgsIDEwKTtcbiAgaWYgKG1heCAhPT0gbWF4IHx8IG1heCA8PSBtaW4pIHtcbiAgICBtYXggPSAobWluIHx8IDEpIDw8IDE7IC8vZG91YmxpbmdcbiAgfSBlbHNlIHtcbiAgICBtYXggPSBtYXggKyAxO1xuICB9XG4gIC8vIEluIG9yZGVyIHRvIG5vdCBleGNlZWQgbWF4VGltZW91dCwgcGljayBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIGhhbGYgb2YgbWF4VGltZW91dCBhbmQgbWF4VGltZW91dFxuICBpZiAobWF4ID4gbWF4VGltZW91dCkge1xuICAgIG1pbiA9IG1heFRpbWVvdXQgPj4gMTsgLy8gZGl2aWRlIGJ5IHR3b1xuICAgIG1heCA9IG1heFRpbWVvdXQ7XG4gIH1cbiAgdmFyIHJhdGlvID0gTWF0aC5yYW5kb20oKTtcbiAgdmFyIHJhbmdlID0gbWF4IC0gbWluO1xuXG4gIHJldHVybiB+fihyYW5nZSAqIHJhdGlvICsgbWluKTsgLy8gfn4gY29lcmNlcyB0byBhbiBpbnQsIGJ1dCBmYXN0LlxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QmFja09mZihtaW4pIHtcbiAgdmFyIG1heCA9IDA7XG4gIGlmICghbWluKSB7XG4gICAgbWF4ID0gMjAwMDtcbiAgfVxuICByZXR1cm4gcmFuZG9tTnVtYmVyKG1pbiwgbWF4KTtcbn1cblxuLy8gZGVzaWduZWQgdG8gZ2l2ZSBpbmZvIHRvIGJyb3dzZXIgdXNlcnMsIHdobyBhcmUgZGlzdHVyYmVkXG4vLyB3aGVuIHRoZXkgc2VlIGh0dHAgZXJyb3JzIGluIHRoZSBjb25zb2xlXG5mdW5jdGlvbiBleHBsYWluRXJyb3Ioc3RhdHVzLCBzdHIpIHtcbiAgZ3VhcmRlZENvbnNvbGUoJ2luZm8nLCAnVGhlIGFib3ZlICcgKyBzdGF0dXMgKyAnIGlzIHRvdGFsbHkgbm9ybWFsLiAnICsgc3RyKTtcbn1cblxudmFyIGFzc2lnbjtcbntcbiAgaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBsaXRlIE9iamVjdC5hc3NpZ24gcG9seWZpbGwgYmFzZWQgb25cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG4gICAgYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgdmFyIHRvID0gT2JqZWN0KHRhcmdldCk7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcblxuICAgICAgICBpZiAobmV4dFNvdXJjZSAhPSBudWxsKSB7IC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gbmV4dFNvdXJjZSkge1xuICAgICAgICAgICAgLy8gQXZvaWQgYnVncyB3aGVuIGhhc093blByb3BlcnR5IGlzIHNoYWRvd2VkXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5leHRTb3VyY2UsIG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0bztcbiAgICB9O1xuICB9XG59XG5cbnZhciAkaW5qZWN0X09iamVjdF9hc3NpZ24gPSBhc3NpZ247XG5cbmluaGVyaXRzKFBvdWNoRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gUG91Y2hFcnJvcihzdGF0dXMsIGVycm9yLCByZWFzb24pIHtcbiAgRXJyb3IuY2FsbCh0aGlzLCByZWFzb24pO1xuICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgdGhpcy5uYW1lID0gZXJyb3I7XG4gIHRoaXMubWVzc2FnZSA9IHJlYXNvbjtcbiAgdGhpcy5lcnJvciA9IHRydWU7XG59XG5cblBvdWNoRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgbmFtZTogdGhpcy5uYW1lLFxuICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICByZWFzb246IHRoaXMucmVhc29uXG4gIH0pO1xufTtcblxudmFyIFVOQVVUSE9SSVpFRCA9IG5ldyBQb3VjaEVycm9yKDQwMSwgJ3VuYXV0aG9yaXplZCcsIFwiTmFtZSBvciBwYXNzd29yZCBpcyBpbmNvcnJlY3QuXCIpO1xudmFyIE1JU1NJTkdfQlVMS19ET0NTID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCBcIk1pc3NpbmcgSlNPTiBsaXN0IG9mICdkb2NzJ1wiKTtcbnZhciBNSVNTSU5HX0RPQyA9IG5ldyBQb3VjaEVycm9yKDQwNCwgJ25vdF9mb3VuZCcsICdtaXNzaW5nJyk7XG52YXIgUkVWX0NPTkZMSUNUID0gbmV3IFBvdWNoRXJyb3IoNDA5LCAnY29uZmxpY3QnLCAnRG9jdW1lbnQgdXBkYXRlIGNvbmZsaWN0Jyk7XG52YXIgSU5WQUxJRF9JRCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ19pZCBmaWVsZCBtdXN0IGNvbnRhaW4gYSBzdHJpbmcnKTtcbnZhciBNSVNTSU5HX0lEID0gbmV3IFBvdWNoRXJyb3IoNDEyLCAnbWlzc2luZ19pZCcsICdfaWQgaXMgcmVxdWlyZWQgZm9yIHB1dHMnKTtcbnZhciBSRVNFUlZFRF9JRCA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ2JhZF9yZXF1ZXN0JywgJ09ubHkgcmVzZXJ2ZWQgZG9jdW1lbnQgaWRzIG1heSBzdGFydCB3aXRoIHVuZGVyc2NvcmUuJyk7XG52YXIgTk9UX09QRU4gPSBuZXcgUG91Y2hFcnJvcig0MTIsICdwcmVjb25kaXRpb25fZmFpbGVkJywgJ0RhdGFiYXNlIG5vdCBvcGVuJyk7XG52YXIgVU5LTk9XTl9FUlJPUiA9IG5ldyBQb3VjaEVycm9yKDUwMCwgJ3Vua25vd25fZXJyb3InLCAnRGF0YWJhc2UgZW5jb3VudGVyZWQgYW4gdW5rbm93biBlcnJvcicpO1xudmFyIEJBRF9BUkcgPSBuZXcgUG91Y2hFcnJvcig1MDAsICdiYWRhcmcnLCAnU29tZSBxdWVyeSBhcmd1bWVudCBpcyBpbnZhbGlkJyk7XG52YXIgSU5WQUxJRF9SRVFVRVNUID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnaW52YWxpZF9yZXF1ZXN0JywgJ1JlcXVlc3Qgd2FzIGludmFsaWQnKTtcbnZhciBRVUVSWV9QQVJTRV9FUlJPUiA9IG5ldyBQb3VjaEVycm9yKDQwMCwgJ3F1ZXJ5X3BhcnNlX2Vycm9yJywgJ1NvbWUgcXVlcnkgcGFyYW1ldGVyIGlzIGludmFsaWQnKTtcbnZhciBET0NfVkFMSURBVElPTiA9IG5ldyBQb3VjaEVycm9yKDUwMCwgJ2RvY192YWxpZGF0aW9uJywgJ0JhZCBzcGVjaWFsIGRvY3VtZW50IG1lbWJlcicpO1xudmFyIEJBRF9SRVFVRVNUID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnU29tZXRoaW5nIHdyb25nIHdpdGggdGhlIHJlcXVlc3QnKTtcbnZhciBOT1RfQU5fT0JKRUNUID0gbmV3IFBvdWNoRXJyb3IoNDAwLCAnYmFkX3JlcXVlc3QnLCAnRG9jdW1lbnQgbXVzdCBiZSBhIEpTT04gb2JqZWN0Jyk7XG52YXIgREJfTUlTU0lORyA9IG5ldyBQb3VjaEVycm9yKDQwNCwgJ25vdF9mb3VuZCcsICdEYXRhYmFzZSBub3QgZm91bmQnKTtcbnZhciBJREJfRVJST1IgPSBuZXcgUG91Y2hFcnJvcig1MDAsICdpbmRleGVkX2RiX3dlbnRfYmFkJywgJ3Vua25vd24nKTtcbnZhciBXU1FfRVJST1IgPSBuZXcgUG91Y2hFcnJvcig1MDAsICd3ZWJfc3FsX3dlbnRfYmFkJywgJ3Vua25vd24nKTtcbnZhciBMREJfRVJST1IgPSBuZXcgUG91Y2hFcnJvcig1MDAsICdsZXZlbERCX3dlbnRfd2VudF9iYWQnLCAndW5rbm93bicpO1xudmFyIEZPUkJJRERFTiA9IG5ldyBQb3VjaEVycm9yKDQwMywgJ2ZvcmJpZGRlbicsICdGb3JiaWRkZW4gYnkgZGVzaWduIGRvYyB2YWxpZGF0ZV9kb2NfdXBkYXRlIGZ1bmN0aW9uJyk7XG52YXIgSU5WQUxJRF9SRVYgPSBuZXcgUG91Y2hFcnJvcig0MDAsICdiYWRfcmVxdWVzdCcsICdJbnZhbGlkIHJldiBmb3JtYXQnKTtcbnZhciBGSUxFX0VYSVNUUyA9IG5ldyBQb3VjaEVycm9yKDQxMiwgJ2ZpbGVfZXhpc3RzJywgJ1RoZSBkYXRhYmFzZSBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuJyk7XG52YXIgTUlTU0lOR19TVFVCID0gbmV3IFBvdWNoRXJyb3IoNDEyLCAnbWlzc2luZ19zdHViJywgJ0EgcHJlLWV4aXN0aW5nIGF0dGFjaG1lbnQgc3R1YiB3YXNuXFwndCBmb3VuZCcpO1xudmFyIElOVkFMSURfVVJMID0gbmV3IFBvdWNoRXJyb3IoNDEzLCAnaW52YWxpZF91cmwnLCAnUHJvdmlkZWQgVVJMIGlzIGludmFsaWQnKTtcblxuZnVuY3Rpb24gY3JlYXRlRXJyb3IoZXJyb3IsIHJlYXNvbikge1xuICBmdW5jdGlvbiBDdXN0b21Qb3VjaEVycm9yKHJlYXNvbikge1xuICAgIC8vIGluaGVyaXQgZXJyb3IgcHJvcGVydGllcyBmcm9tIG91ciBwYXJlbnQgZXJyb3IgbWFudWFsbHlcbiAgICAvLyBzbyBhcyB0byBhbGxvdyBwcm9wZXIgSlNPTiBwYXJzaW5nLlxuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICB2YXIgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvcik7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIGVycm9yW25hbWVzW2ldXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzW25hbWVzW2ldXSA9IGVycm9yW25hbWVzW2ldXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgICB9XG5cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIGlmIChyZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgfVxuICB9XG4gIEN1c3RvbVBvdWNoRXJyb3IucHJvdG90eXBlID0gUG91Y2hFcnJvci5wcm90b3R5cGU7XG4gIHJldHVybiBuZXcgQ3VzdG9tUG91Y2hFcnJvcihyZWFzb24pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKGVycikge1xuXG4gIGlmICh0eXBlb2YgZXJyICE9PSAnb2JqZWN0Jykge1xuICAgIHZhciBkYXRhID0gZXJyO1xuICAgIGVyciA9IFVOS05PV05fRVJST1I7XG4gICAgZXJyLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgaWYgKCdlcnJvcicgaW4gZXJyICYmIGVyci5lcnJvciA9PT0gJ2NvbmZsaWN0Jykge1xuICAgIGVyci5uYW1lID0gJ2NvbmZsaWN0JztcbiAgICBlcnIuc3RhdHVzID0gNDA5O1xuICB9XG5cbiAgaWYgKCEoJ25hbWUnIGluIGVycikpIHtcbiAgICBlcnIubmFtZSA9IGVyci5lcnJvciB8fCAndW5rbm93bic7XG4gIH1cblxuICBpZiAoISgnc3RhdHVzJyBpbiBlcnIpKSB7XG4gICAgZXJyLnN0YXR1cyA9IDUwMDtcbiAgfVxuXG4gIGlmICghKCdtZXNzYWdlJyBpbiBlcnIpKSB7XG4gICAgZXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZSB8fCBlcnIucmVhc29uO1xuICB9XG5cbiAgaWYgKCEoJ3N0YWNrJyBpbiBlcnIpKSB7XG4gICAgZXJyLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuXG4gIHJldHVybiBlcnI7XG59XG5cbmZ1bmN0aW9uIHRyeUZpbHRlcihmaWx0ZXIsIGRvYywgcmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICFmaWx0ZXIoZG9jLCByZXEpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB2YXIgbXNnID0gJ0ZpbHRlciBmdW5jdGlvbiB0aHJldzogJyArIGVyci50b1N0cmluZygpO1xuICAgIHJldHVybiBjcmVhdGVFcnJvcihCQURfUkVRVUVTVCwgbXNnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXJDaGFuZ2Uob3B0cykge1xuICB2YXIgcmVxID0ge307XG4gIHZhciBoYXNGaWx0ZXIgPSBvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbic7XG4gIHJlcS5xdWVyeSA9IG9wdHMucXVlcnlfcGFyYW1zO1xuXG4gIHJldHVybiBmdW5jdGlvbiBmaWx0ZXIoY2hhbmdlKSB7XG4gICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAvLyBDU0cgc2VuZHMgZXZlbnRzIG9uIHRoZSBjaGFuZ2VzIGZlZWQgdGhhdCBkb24ndCBoYXZlIGRvY3VtZW50cyxcbiAgICAgIC8vIHRoaXMgaGFjayBtYWtlcyBhIHdob2xlIGxvdCBvZiBleGlzdGluZyBjb2RlIHJvYnVzdC5cbiAgICAgIGNoYW5nZS5kb2MgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZmlsdGVyUmV0dXJuID0gaGFzRmlsdGVyICYmIHRyeUZpbHRlcihvcHRzLmZpbHRlciwgY2hhbmdlLmRvYywgcmVxKTtcblxuICAgIGlmICh0eXBlb2YgZmlsdGVyUmV0dXJuID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGZpbHRlclJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyUmV0dXJuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgZGVsZXRlIGNoYW5nZS5kb2M7XG4gICAgfSBlbHNlIGlmICghb3B0cy5hdHRhY2htZW50cykge1xuICAgICAgZm9yICh2YXIgYXR0IGluIGNoYW5nZS5kb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2hhbmdlLmRvYy5fYXR0YWNobWVudHMsIGF0dCkpIHtcbiAgICAgICAgICBjaGFuZ2UuZG9jLl9hdHRhY2htZW50c1thdHRdLnN0dWIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuKGFycnMpIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHJlcyA9IHJlcy5jb25jYXQoYXJyc1tpXSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gc2hpbSBmb3IgRnVuY3Rpb24ucHJvdG90eXBlLm5hbWUsXG5cbi8vIERldGVybWluZSBpZCBhbiBJRCBpcyB2YWxpZFxuLy8gICAtIGludmFsaWQgSURzIGJlZ2luIHdpdGggYW4gdW5kZXJlc2NvcmUgdGhhdCBkb2VzIG5vdCBiZWdpbiAnX2Rlc2lnbicgb3Jcbi8vICAgICAnX2xvY2FsJ1xuLy8gICAtIGFueSBvdGhlciBzdHJpbmcgdmFsdWUgaXMgYSB2YWxpZCBpZFxuLy8gUmV0dXJucyB0aGUgc3BlY2lmaWMgZXJyb3Igb2JqZWN0IGZvciBlYWNoIGNhc2VcbmZ1bmN0aW9uIGludmFsaWRJZEVycm9yKGlkKSB7XG4gIHZhciBlcnI7XG4gIGlmICghaWQpIHtcbiAgICBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX0lEKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyID0gY3JlYXRlRXJyb3IoSU5WQUxJRF9JRCk7XG4gIH0gZWxzZSBpZiAoL15fLy50ZXN0KGlkKSAmJiAhKC9eXyhkZXNpZ258bG9jYWwpLykudGVzdChpZCkpIHtcbiAgICBlcnIgPSBjcmVhdGVFcnJvcihSRVNFUlZFRF9JRCk7XG4gIH1cbiAgaWYgKGVycikge1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vLyBDaGVja3MgaWYgYSBQb3VjaERCIG9iamVjdCBpcyBcInJlbW90ZVwiIG9yIG5vdC4gVGhpcyBpc1xuXG5mdW5jdGlvbiBpc1JlbW90ZShkYikge1xuICBpZiAodHlwZW9mIGRiLl9yZW1vdGUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkYi5fcmVtb3RlO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICh0eXBlb2YgZGIudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGd1YXJkZWRDb25zb2xlKCd3YXJuJyxcbiAgICAgICdkYi50eXBlKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgK1xuICAgICAgJ2EgZnV0dXJlIHZlcnNpb24gb2YgUG91Y2hEQicpO1xuICAgIHJldHVybiBkYi50eXBlKCkgPT09ICdodHRwJztcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQoZWUsIHR5cGUpIHtcbiAgcmV0dXJuICdsaXN0ZW5lckNvdW50JyBpbiBlZSA/IGVlLmxpc3RlbmVyQ291bnQodHlwZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUUubGlzdGVuZXJDb3VudChlZSwgdHlwZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lKHMpIHtcbiAgaWYgKCFzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHBhcnRzID0gcy5zcGxpdCgnLycpO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIHBhcnRzO1xuICB9XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gW3MsIHNdO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVEZXNpZ25Eb2NGdW5jdGlvbk5hbWUocykge1xuICB2YXIgbm9ybWFsaXplZCA9IHBhcnNlRGVzaWduRG9jRnVuY3Rpb25OYW1lKHMpO1xuICByZXR1cm4gbm9ybWFsaXplZCA/IG5vcm1hbGl6ZWQuam9pbignLycpIDogbnVsbDtcbn1cblxuLy8gb3JpZ2luYWxseSBwYXJzZVVyaSAxLjIuMiwgbm93IHBhdGNoZWQgYnkgdXNcbi8vIChjKSBTdGV2ZW4gTGV2aXRoYW4gPHN0ZXZlbmxldml0aGFuLmNvbT5cbi8vIE1JVCBMaWNlbnNlXG52YXIga2V5cyA9IFtcInNvdXJjZVwiLCBcInByb3RvY29sXCIsIFwiYXV0aG9yaXR5XCIsIFwidXNlckluZm9cIiwgXCJ1c2VyXCIsIFwicGFzc3dvcmRcIixcbiAgICBcImhvc3RcIiwgXCJwb3J0XCIsIFwicmVsYXRpdmVcIiwgXCJwYXRoXCIsIFwiZGlyZWN0b3J5XCIsIFwiZmlsZVwiLCBcInF1ZXJ5XCIsIFwiYW5jaG9yXCJdO1xudmFyIHFOYW1lID1cInF1ZXJ5S2V5XCI7XG52YXIgcVBhcnNlciA9IC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZztcblxuLy8gdXNlIHRoZSBcImxvb3NlXCIgcGFyc2VyXG4vKiBlc2xpbnQgbm8tdXNlbGVzcy1lc2NhcGU6IDAgKi9cbnZhciBwYXJzZXIgPSAvXig/Oig/IVteOkBdKzpbXjpAXFwvXSpAKShbXjpcXC8/Iy5dKyk6KT8oPzpcXC9cXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlxcLz8jXSopKD86OihcXGQqKSk/KSgoKFxcLyg/OltePyNdKD8hW14/I1xcL10qXFwuW14/I1xcLy5dKyg/Ols/I118JCkpKSpcXC8/KT8oW14/I1xcL10qKSkoPzpcXD8oW14jXSopKT8oPzojKC4qKSk/KS87XG5cbmZ1bmN0aW9uIHBhcnNlVXJpKHN0cikge1xuICB2YXIgbSA9IHBhcnNlci5leGVjKHN0cik7XG4gIHZhciB1cmkgPSB7fTtcbiAgdmFyIGkgPSAxNDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgdmFyIHZhbHVlID0gbVtpXSB8fCBcIlwiO1xuICAgIHZhciBlbmNvZGVkID0gWyd1c2VyJywgJ3Bhc3N3b3JkJ10uaW5kZXhPZihrZXkpICE9PSAtMTtcbiAgICB1cmlba2V5XSA9IGVuY29kZWQgPyBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpIDogdmFsdWU7XG4gIH1cblxuICB1cmlbcU5hbWVdID0ge307XG4gIHVyaVtrZXlzWzEyXV0ucmVwbGFjZShxUGFyc2VyLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgIGlmICgkMSkge1xuICAgICAgdXJpW3FOYW1lXVskMV0gPSAkMjtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB1cmk7XG59XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGV4ZGF2aWQvc2NvcGUtZXZhbCB2MC4wLjNcbi8vIChzb3VyY2U6IGh0dHBzOi8vdW5wa2cuY29tL3Njb3BlLWV2YWxAMC4wLjMvc2NvcGVfZXZhbC5qcylcbi8vIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBuZXcgRnVuY3Rpb24oKVxuXG5mdW5jdGlvbiBzY29wZUV2YWwoc291cmNlLCBzY29wZSkge1xuICB2YXIga2V5cyA9IFtdO1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBzY29wZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NvcGUsIGtleSkpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgdmFsdWVzLnB1c2goc2NvcGVba2V5XSk7XG4gICAgfVxuICB9XG4gIGtleXMucHVzaChzb3VyY2UpO1xuICByZXR1cm4gRnVuY3Rpb24uYXBwbHkobnVsbCwga2V5cykuYXBwbHkobnVsbCwgdmFsdWVzKTtcbn1cblxuLy8gdGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgXCJ1cGRhdGUgc3VnYXJcIiBmdW5jdGlvbiBmcm9tIGRhbGVoYXJ2ZXkvcG91Y2hkYiMxMzg4XG4vLyB0aGUgZGlmZkZ1biB0ZWxscyB1cyB3aGF0IGRlbHRhIHRvIGFwcGx5IHRvIHRoZSBkb2MuICBpdCBlaXRoZXIgcmV0dXJuc1xuLy8gdGhlIGRvYywgb3IgZmFsc2UgaWYgaXQgZG9lc24ndCBuZWVkIHRvIGRvIGFuIHVwZGF0ZSBhZnRlciBhbGxcbmZ1bmN0aW9uIHVwc2VydChkYiwgZG9jSWQsIGRpZmZGdW4pIHtcbiAgcmV0dXJuIGRiLmdldChkb2NJZClcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgICAgLy8gdGhlIHVzZXIgbWlnaHQgY2hhbmdlIHRoZSBfcmV2LCBzbyBzYXZlIGl0IGZvciBwb3N0ZXJpdHlcbiAgICAgIHZhciBkb2NSZXYgPSBkb2MuX3JldjtcbiAgICAgIHZhciBuZXdEb2MgPSBkaWZmRnVuKGRvYyk7XG5cbiAgICAgIGlmICghbmV3RG9jKSB7XG4gICAgICAgIC8vIGlmIHRoZSBkaWZmRnVuIHJldHVybnMgZmFsc3ksIHdlIHNob3J0LWNpcmN1aXQgYXNcbiAgICAgICAgLy8gYW4gb3B0aW1pemF0aW9uXG4gICAgICAgIHJldHVybiB7dXBkYXRlZDogZmFsc2UsIHJldjogZG9jUmV2fTtcbiAgICAgIH1cblxuICAgICAgLy8gdXNlcnMgYXJlbid0IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZXNlIHZhbHVlcyxcbiAgICAgIC8vIHNvIHJlc2V0IHRoZW0gaGVyZVxuICAgICAgbmV3RG9jLl9pZCA9IGRvY0lkO1xuICAgICAgbmV3RG9jLl9yZXYgPSBkb2NSZXY7XG4gICAgICByZXR1cm4gdHJ5QW5kUHV0KGRiLCBuZXdEb2MsIGRpZmZGdW4pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB0cnlBbmRQdXQoZGIsIGRvYywgZGlmZkZ1bikge1xuICByZXR1cm4gZGIucHV0KGRvYykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZWQ6IHRydWUsXG4gICAgICByZXY6IHJlcy5yZXZcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA5KSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiB1cHNlcnQoZGIsIGRvYy5faWQsIGRpZmZGdW4pO1xuICB9KTtcbn1cblxudmFyIHRoaXNBdG9iID0gZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gYXRvYihzdHIpO1xufTtcblxudmFyIHRoaXNCdG9hID0gZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gYnRvYShzdHIpO1xufTtcblxuLy8gQWJzdHJhY3RzIGNvbnN0cnVjdGluZyBhIEJsb2Igb2JqZWN0LCBzbyBpdCBhbHNvIHdvcmtzIGluIG9sZGVyXG4vLyBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIG5hdGl2ZSBCbG9iIGNvbnN0cnVjdG9yIChlLmcuXG4vLyBvbGQgUXRXZWJLaXQgdmVyc2lvbnMsIEFuZHJvaWQgPCA0LjQpLlxuZnVuY3Rpb24gY3JlYXRlQmxvYihwYXJ0cywgcHJvcGVydGllcykge1xuICAvKiBnbG9iYWwgQmxvYkJ1aWxkZXIsTVNCbG9iQnVpbGRlcixNb3pCbG9iQnVpbGRlcixXZWJLaXRCbG9iQnVpbGRlciAqL1xuICBwYXJ0cyA9IHBhcnRzIHx8IFtdO1xuICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCB7fTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEJsb2IocGFydHMsIHByb3BlcnRpZXMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUubmFtZSAhPT0gXCJUeXBlRXJyb3JcIikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgdmFyIEJ1aWxkZXIgPSB0eXBlb2YgQmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnID8gQmxvYkJ1aWxkZXIgOlxuICAgICAgICAgICAgICAgICAgdHlwZW9mIE1TQmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnID8gTVNCbG9iQnVpbGRlciA6XG4gICAgICAgICAgICAgICAgICB0eXBlb2YgTW96QmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnID8gTW96QmxvYkJ1aWxkZXIgOlxuICAgICAgICAgICAgICAgICAgV2ViS2l0QmxvYkJ1aWxkZXI7XG4gICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnRzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QmxvYihwcm9wZXJ0aWVzLnR5cGUpO1xuICB9XG59XG5cbi8vIEZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDk2NzY0Ny8gKGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUpXG4vLyBlbmNvZGUtZGVjb2RlLWltYWdlLXdpdGgtYmFzZTY0LWJyZWFrcy1pbWFnZSAoMjAxMy0wNC0yMSlcbmZ1bmN0aW9uIGJpbmFyeVN0cmluZ1RvQXJyYXlCdWZmZXIoYmluKSB7XG4gIHZhciBsZW5ndGggPSBiaW4ubGVuZ3RoO1xuICB2YXIgYnVmID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCk7XG4gIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShidWYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgYXJyW2ldID0gYmluLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZnVuY3Rpb24gYmluU3RyaW5nVG9CbHVmZmVyKGJpblN0cmluZywgdHlwZSkge1xuICByZXR1cm4gY3JlYXRlQmxvYihbYmluYXJ5U3RyaW5nVG9BcnJheUJ1ZmZlcihiaW5TdHJpbmcpXSwge3R5cGU6IHR5cGV9KTtcbn1cblxuZnVuY3Rpb24gYjY0VG9CbHVmZmVyKGI2NCwgdHlwZSkge1xuICByZXR1cm4gYmluU3RyaW5nVG9CbHVmZmVyKHRoaXNBdG9iKGI2NCksIHR5cGUpO1xufVxuXG4vL0Nhbid0IGZpbmQgb3JpZ2luYWwgcG9zdCwgYnV0IHRoaXMgaXMgY2xvc2Vcbi8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82OTY1MTA3LyAoY29udGludWVzIG9uIG5leHQgbGluZSlcbi8vY29udmVydGluZy1iZXR3ZWVuLXN0cmluZ3MtYW5kLWFycmF5YnVmZmVyc1xuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhidWZmZXIpIHtcbiAgdmFyIGJpbmFyeSA9ICcnO1xuICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICB2YXIgbGVuZ3RoID0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgfVxuICByZXR1cm4gYmluYXJ5O1xufVxuXG4vLyBzaGltIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgaXRcbmZ1bmN0aW9uIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iLCBjYWxsYmFjaykge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgdmFyIGhhc0JpbmFyeVN0cmluZyA9IHR5cGVvZiByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nID09PSAnZnVuY3Rpb24nO1xuICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZS50YXJnZXQucmVzdWx0IHx8ICcnO1xuICAgIGlmIChoYXNCaW5hcnlTdHJpbmcpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhyZXN1bHQpO1xuICAgIH1cbiAgICBjYWxsYmFjayhhcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKHJlc3VsdCkpO1xuICB9O1xuICBpZiAoaGFzQmluYXJ5U3RyaW5nKSB7XG4gICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcbiAgfSBlbHNlIHtcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmxvYlRvQmluYXJ5U3RyaW5nKGJsb2JPckJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgcmVhZEFzQmluYXJ5U3RyaW5nKGJsb2JPckJ1ZmZlciwgZnVuY3Rpb24gKGJpbikge1xuICAgIGNhbGxiYWNrKGJpbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBibG9iVG9CYXNlNjQoYmxvYk9yQnVmZmVyLCBjYWxsYmFjaykge1xuICBibG9iVG9CaW5hcnlTdHJpbmcoYmxvYk9yQnVmZmVyLCBmdW5jdGlvbiAoYmFzZTY0KSB7XG4gICAgY2FsbGJhY2sodGhpc0J0b2EoYmFzZTY0KSk7XG4gIH0pO1xufVxuXG4vLyBzaW1wbGlmaWVkIEFQSS4gdW5pdmVyc2FsIGJyb3dzZXIgc3VwcG9ydCBpcyBhc3N1bWVkXG5mdW5jdGlvbiByZWFkQXNBcnJheUJ1ZmZlcihibG9iLCBjYWxsYmFjaykge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGUudGFyZ2V0LnJlc3VsdCB8fCBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgY2FsbGJhY2socmVzdWx0KTtcbiAgfTtcbiAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xufVxuXG4vLyB0aGlzIGlzIG5vdCB1c2VkIGluIHRoZSBicm93c2VyXG5cbnZhciBzZXRJbW1lZGlhdGVTaGltID0gc2VsZi5zZXRJbW1lZGlhdGUgfHwgc2VsZi5zZXRUaW1lb3V0O1xudmFyIE1ENV9DSFVOS19TSVpFID0gMzI3Njg7XG5cbmZ1bmN0aW9uIHJhd1RvQmFzZTY0KHJhdykge1xuICByZXR1cm4gdGhpc0J0b2EocmF3KTtcbn1cblxuZnVuY3Rpb24gc2xpY2VCbG9iKGJsb2IsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKGJsb2Iud2Via2l0U2xpY2UpIHtcbiAgICByZXR1cm4gYmxvYi53ZWJraXRTbGljZShzdGFydCwgZW5kKTtcbiAgfVxuICByZXR1cm4gYmxvYi5zbGljZShzdGFydCwgZW5kKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kQmxvYihidWZmZXIsIGJsb2IsIHN0YXJ0LCBlbmQsIGNhbGxiYWNrKSB7XG4gIGlmIChzdGFydCA+IDAgfHwgZW5kIDwgYmxvYi5zaXplKSB7XG4gICAgLy8gb25seSBzbGljZSBibG9iIGlmIHdlIHJlYWxseSBuZWVkIHRvXG4gICAgYmxvYiA9IHNsaWNlQmxvYihibG9iLCBzdGFydCwgZW5kKTtcbiAgfVxuICByZWFkQXNBcnJheUJ1ZmZlcihibG9iLCBmdW5jdGlvbiAoYXJyYXlCdWZmZXIpIHtcbiAgICBidWZmZXIuYXBwZW5kKGFycmF5QnVmZmVyKTtcbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kU3RyaW5nKGJ1ZmZlciwgc3RyaW5nLCBzdGFydCwgZW5kLCBjYWxsYmFjaykge1xuICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAvLyBvbmx5IGNyZWF0ZSBhIHN1YnN0cmluZyBpZiB3ZSByZWFsbHkgbmVlZCB0b1xuICAgIHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gIH1cbiAgYnVmZmVyLmFwcGVuZEJpbmFyeShzdHJpbmcpO1xuICBjYWxsYmFjaygpO1xufVxuXG5mdW5jdGlvbiBiaW5hcnlNZDUoZGF0YSwgY2FsbGJhY2spIHtcbiAgdmFyIGlucHV0SXNTdHJpbmcgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZyc7XG4gIHZhciBsZW4gPSBpbnB1dElzU3RyaW5nID8gZGF0YS5sZW5ndGggOiBkYXRhLnNpemU7XG4gIHZhciBjaHVua1NpemUgPSBNYXRoLm1pbihNRDVfQ0hVTktfU0laRSwgbGVuKTtcbiAgdmFyIGNodW5rcyA9IE1hdGguY2VpbChsZW4gLyBjaHVua1NpemUpO1xuICB2YXIgY3VycmVudENodW5rID0gMDtcbiAgdmFyIGJ1ZmZlciA9IGlucHV0SXNTdHJpbmcgPyBuZXcgTWQ1KCkgOiBuZXcgTWQ1LkFycmF5QnVmZmVyKCk7XG5cbiAgdmFyIGFwcGVuZCA9IGlucHV0SXNTdHJpbmcgPyBhcHBlbmRTdHJpbmcgOiBhcHBlbmRCbG9iO1xuXG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgc2V0SW1tZWRpYXRlU2hpbShsb2FkTmV4dENodW5rKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgdmFyIHJhdyA9IGJ1ZmZlci5lbmQodHJ1ZSk7XG4gICAgdmFyIGJhc2U2NCA9IHJhd1RvQmFzZTY0KHJhdyk7XG4gICAgY2FsbGJhY2soYmFzZTY0KTtcbiAgICBidWZmZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZE5leHRDaHVuaygpIHtcbiAgICB2YXIgc3RhcnQgPSBjdXJyZW50Q2h1bmsgKiBjaHVua1NpemU7XG4gICAgdmFyIGVuZCA9IHN0YXJ0ICsgY2h1bmtTaXplO1xuICAgIGN1cnJlbnRDaHVuaysrO1xuICAgIGlmIChjdXJyZW50Q2h1bmsgPCBjaHVua3MpIHtcbiAgICAgIGFwcGVuZChidWZmZXIsIGRhdGEsIHN0YXJ0LCBlbmQsIG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmQoYnVmZmVyLCBkYXRhLCBzdGFydCwgZW5kLCBkb25lKTtcbiAgICB9XG4gIH1cbiAgbG9hZE5leHRDaHVuaygpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdNZDUoc3RyaW5nKSB7XG4gIHJldHVybiBNZDUuaGFzaChzdHJpbmcpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcmV2aXNpb24gc3RyaW5nIHRoYXQgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcmV2aXNpb24gaGVpZ2h0XG4gKiBGb3IgZXhhbXBsZSAnNTY2NDlmMWIwNTA2YzZjYTlmZGEwNzQ2ZWIwY2FjZGYnXG4gKi9cbmZ1bmN0aW9uIHJldiQkMShkb2MsIGRldGVybWluaXN0aWNfcmV2cykge1xuICBpZiAoIWRldGVybWluaXN0aWNfcmV2cykge1xuICAgIHJldHVybiB2NCgpLnJlcGxhY2UoLy0vZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICB2YXIgbXV0YXRlYWJsZURvYyA9ICRpbmplY3RfT2JqZWN0X2Fzc2lnbih7fSwgZG9jKTtcbiAgZGVsZXRlIG11dGF0ZWFibGVEb2MuX3Jldl90cmVlO1xuICByZXR1cm4gc3RyaW5nTWQ1KEpTT04uc3RyaW5naWZ5KG11dGF0ZWFibGVEb2MpKTtcbn1cblxudmFyIHV1aWQgPSB2NDsgLy8gbWltaWMgb2xkIGltcG9ydCwgb25seSB2NCBpcyBldmVyIHVzZWQgZWxzZXdoZXJlXG5cbi8vIFdlIGZldGNoIGFsbCBsZWFmcyBvZiB0aGUgcmV2aXNpb24gdHJlZSwgYW5kIHNvcnQgdGhlbSBiYXNlZCBvbiB0cmVlIGxlbmd0aFxuLy8gYW5kIHdoZXRoZXIgdGhleSB3ZXJlIGRlbGV0ZWQsIHVuZGVsZXRlZCBkb2N1bWVudHMgd2l0aCB0aGUgbG9uZ2VzdCByZXZpc2lvblxuLy8gdHJlZSAobW9zdCBlZGl0cykgd2luXG4vLyBUaGUgZmluYWwgc29ydCBhbGdvcml0aG0gaXMgc2xpZ2h0bHkgZG9jdW1lbnRlZCBpbiBhIHNpZGViYXIgaGVyZTpcbi8vIGh0dHA6Ly9ndWlkZS5jb3VjaGRiLm9yZy9kcmFmdC9jb25mbGljdHMuaHRtbFxuZnVuY3Rpb24gd2lubmluZ1JldihtZXRhZGF0YSkge1xuICB2YXIgd2lubmluZ0lkO1xuICB2YXIgd2lubmluZ1BvcztcbiAgdmFyIHdpbm5pbmdEZWxldGVkO1xuICB2YXIgdG9WaXNpdCA9IG1ldGFkYXRhLnJldl90cmVlLnNsaWNlKCk7XG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIHZhciB0cmVlID0gbm9kZS5pZHM7XG4gICAgdmFyIGJyYW5jaGVzID0gdHJlZVsyXTtcbiAgICB2YXIgcG9zID0gbm9kZS5wb3M7XG4gICAgaWYgKGJyYW5jaGVzLmxlbmd0aCkgeyAvLyBub24tbGVhZlxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJyYW5jaGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBwb3MgKyAxLCBpZHM6IGJyYW5jaGVzW2ldfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGRlbGV0ZWQgPSAhIXRyZWVbMV0uZGVsZXRlZDtcbiAgICB2YXIgaWQgPSB0cmVlWzBdO1xuICAgIC8vIHNvcnQgYnkgZGVsZXRlZCwgdGhlbiBwb3MsIHRoZW4gaWRcbiAgICBpZiAoIXdpbm5pbmdJZCB8fCAod2lubmluZ0RlbGV0ZWQgIT09IGRlbGV0ZWQgPyB3aW5uaW5nRGVsZXRlZCA6XG4gICAgICAgIHdpbm5pbmdQb3MgIT09IHBvcyA/IHdpbm5pbmdQb3MgPCBwb3MgOiB3aW5uaW5nSWQgPCBpZCkpIHtcbiAgICAgIHdpbm5pbmdJZCA9IGlkO1xuICAgICAgd2lubmluZ1BvcyA9IHBvcztcbiAgICAgIHdpbm5pbmdEZWxldGVkID0gZGVsZXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2lubmluZ1BvcyArICctJyArIHdpbm5pbmdJZDtcbn1cblxuLy8gUHJldHR5IG11Y2ggYWxsIGJlbG93IGNhbiBiZSBjb21iaW5lZCBpbnRvIGEgaGlnaGVyIG9yZGVyIGZ1bmN0aW9uIHRvXG4vLyB0cmF2ZXJzZSByZXZpc2lvbnNcbi8vIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgYXMgY29udGV4dCB0byBhbGxcbi8vIGNoaWxkcmVuIG9mIHRoYXQgbm9kZVxuZnVuY3Rpb24gdHJhdmVyc2VSZXZUcmVlKHJldnMsIGNhbGxiYWNrKSB7XG4gIHZhciB0b1Zpc2l0ID0gcmV2cy5zbGljZSgpO1xuXG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIHZhciBwb3MgPSBub2RlLnBvcztcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIG5ld0N0eCA9XG4gICAgICBjYWxsYmFjayhicmFuY2hlcy5sZW5ndGggPT09IDAsIHBvcywgdHJlZVswXSwgbm9kZS5jdHgsIHRyZWVbMV0pO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBicmFuY2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IHBvcyArIDEsIGlkczogYnJhbmNoZXNbaV0sIGN0eDogbmV3Q3R4fSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNvcnRCeVBvcyhhLCBiKSB7XG4gIHJldHVybiBhLnBvcyAtIGIucG9zO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0TGVhdmVzKHJldnMpIHtcbiAgdmFyIGxlYXZlcyA9IFtdO1xuICB0cmF2ZXJzZVJldlRyZWUocmV2cywgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCBpZCwgYWNjLCBvcHRzKSB7XG4gICAgaWYgKGlzTGVhZikge1xuICAgICAgbGVhdmVzLnB1c2goe3JldjogcG9zICsgXCItXCIgKyBpZCwgcG9zOiBwb3MsIG9wdHM6IG9wdHN9KTtcbiAgICB9XG4gIH0pO1xuICBsZWF2ZXMuc29ydChzb3J0QnlQb3MpLnJldmVyc2UoKTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxlYXZlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGRlbGV0ZSBsZWF2ZXNbaV0ucG9zO1xuICB9XG4gIHJldHVybiBsZWF2ZXM7XG59XG5cbi8vIHJldHVybnMgcmV2cyBvZiBhbGwgY29uZmxpY3RzIHRoYXQgaXMgbGVhdmVzIHN1Y2ggdGhhdFxuLy8gMS4gYXJlIG5vdCBkZWxldGVkIGFuZFxuLy8gMi4gYXJlIGRpZmZlcmVudCB0aGFuIHdpbm5pbmcgcmV2aXNpb25cbmZ1bmN0aW9uIGNvbGxlY3RDb25mbGljdHMobWV0YWRhdGEpIHtcbiAgdmFyIHdpbiA9IHdpbm5pbmdSZXYobWV0YWRhdGEpO1xuICB2YXIgbGVhdmVzID0gY29sbGVjdExlYXZlcyhtZXRhZGF0YS5yZXZfdHJlZSk7XG4gIHZhciBjb25mbGljdHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxlYXZlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBsZWFmID0gbGVhdmVzW2ldO1xuICAgIGlmIChsZWFmLnJldiAhPT0gd2luICYmICFsZWFmLm9wdHMuZGVsZXRlZCkge1xuICAgICAgY29uZmxpY3RzLnB1c2gobGVhZi5yZXYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmxpY3RzO1xufVxuXG4vLyBjb21wYWN0IGEgdHJlZSBieSBtYXJraW5nIGl0cyBub24tbGVhZnMgYXMgbWlzc2luZyxcbi8vIGFuZCByZXR1cm4gYSBsaXN0IG9mIHJldnMgdG8gZGVsZXRlXG5mdW5jdGlvbiBjb21wYWN0VHJlZShtZXRhZGF0YSkge1xuICB2YXIgcmV2cyA9IFtdO1xuICB0cmF2ZXJzZVJldlRyZWUobWV0YWRhdGEucmV2X3RyZWUsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2SGFzaCwgY3R4LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMuc3RhdHVzID09PSAnYXZhaWxhYmxlJyAmJiAhaXNMZWFmKSB7XG4gICAgICByZXZzLnB1c2gocG9zICsgJy0nICsgcmV2SGFzaCk7XG4gICAgICBvcHRzLnN0YXR1cyA9ICdtaXNzaW5nJztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmV2cztcbn1cblxuLy8gYnVpbGQgdXAgYSBsaXN0IG9mIGFsbCB0aGUgcGF0aHMgdG8gdGhlIGxlYWZzIGluIHRoaXMgcmV2aXNpb24gdHJlZVxuZnVuY3Rpb24gcm9vdFRvTGVhZihyZXZzKSB7XG4gIHZhciBwYXRocyA9IFtdO1xuICB2YXIgdG9WaXNpdCA9IHJldnMuc2xpY2UoKTtcbiAgdmFyIG5vZGU7XG4gIHdoaWxlICgobm9kZSA9IHRvVmlzaXQucG9wKCkpKSB7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zO1xuICAgIHZhciB0cmVlID0gbm9kZS5pZHM7XG4gICAgdmFyIGlkID0gdHJlZVswXTtcbiAgICB2YXIgb3B0cyA9IHRyZWVbMV07XG4gICAgdmFyIGJyYW5jaGVzID0gdHJlZVsyXTtcbiAgICB2YXIgaXNMZWFmID0gYnJhbmNoZXMubGVuZ3RoID09PSAwO1xuXG4gICAgdmFyIGhpc3RvcnkgPSBub2RlLmhpc3RvcnkgPyBub2RlLmhpc3Rvcnkuc2xpY2UoKSA6IFtdO1xuICAgIGhpc3RvcnkucHVzaCh7aWQ6IGlkLCBvcHRzOiBvcHRzfSk7XG4gICAgaWYgKGlzTGVhZikge1xuICAgICAgcGF0aHMucHVzaCh7cG9zOiAocG9zICsgMSAtIGhpc3RvcnkubGVuZ3RoKSwgaWRzOiBoaXN0b3J5fSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBicmFuY2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdG9WaXNpdC5wdXNoKHtwb3M6IHBvcyArIDEsIGlkczogYnJhbmNoZXNbaV0sIGhpc3Rvcnk6IGhpc3Rvcnl9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhdGhzLnJldmVyc2UoKTtcbn1cblxuLy8gZm9yIGEgYmV0dGVyIG92ZXJ2aWV3IG9mIHdoYXQgdGhpcyBpcyBkb2luZywgcmVhZDpcblxuZnVuY3Rpb24gc29ydEJ5UG9zJDEoYSwgYikge1xuICByZXR1cm4gYS5wb3MgLSBiLnBvcztcbn1cblxuLy8gY2xhc3NpYyBiaW5hcnkgc2VhcmNoXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goYXJyLCBpdGVtLCBjb21wYXJhdG9yKSB7XG4gIHZhciBsb3cgPSAwO1xuICB2YXIgaGlnaCA9IGFyci5sZW5ndGg7XG4gIHZhciBtaWQ7XG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxO1xuICAgIGlmIChjb21wYXJhdG9yKGFyclttaWRdLCBpdGVtKSA8IDApIHtcbiAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBsb3c7XG59XG5cbi8vIGFzc3VtaW5nIHRoZSBhcnIgaXMgc29ydGVkLCBpbnNlcnQgdGhlIGl0ZW0gaW4gdGhlIHByb3BlciBwbGFjZVxuZnVuY3Rpb24gaW5zZXJ0U29ydGVkKGFyciwgaXRlbSwgY29tcGFyYXRvcikge1xuICB2YXIgaWR4ID0gYmluYXJ5U2VhcmNoKGFyciwgaXRlbSwgY29tcGFyYXRvcik7XG4gIGFyci5zcGxpY2UoaWR4LCAwLCBpdGVtKTtcbn1cblxuLy8gVHVybiBhIHBhdGggYXMgYSBmbGF0IGFycmF5IGludG8gYSB0cmVlIHdpdGggYSBzaW5nbGUgYnJhbmNoLlxuLy8gSWYgYW55IHNob3VsZCBiZSBzdGVtbWVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXksIHRoYXQncyBwYXNzZWRcbi8vIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnRcbmZ1bmN0aW9uIHBhdGhUb1RyZWUocGF0aCwgbnVtU3RlbW1lZCkge1xuICB2YXIgcm9vdDtcbiAgdmFyIGxlYWY7XG4gIGZvciAodmFyIGkgPSBudW1TdGVtbWVkLCBsZW4gPSBwYXRoLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBwYXRoW2ldO1xuICAgIHZhciBjdXJyZW50TGVhZiA9IFtub2RlLmlkLCBub2RlLm9wdHMsIFtdXTtcbiAgICBpZiAobGVhZikge1xuICAgICAgbGVhZlsyXS5wdXNoKGN1cnJlbnRMZWFmKTtcbiAgICAgIGxlYWYgPSBjdXJyZW50TGVhZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdCA9IGxlYWYgPSBjdXJyZW50TGVhZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIGNvbXBhcmUgdGhlIElEcyBvZiB0d28gdHJlZXNcbmZ1bmN0aW9uIGNvbXBhcmVUcmVlKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPCBiWzBdID8gLTEgOiAxO1xufVxuXG4vLyBNZXJnZSB0d28gdHJlZXMgdG9nZXRoZXJcbi8vIFRoZSByb290cyBvZiB0cmVlMSBhbmQgdHJlZTIgbXVzdCBiZSB0aGUgc2FtZSByZXZpc2lvblxuZnVuY3Rpb24gbWVyZ2VUcmVlKGluX3RyZWUxLCBpbl90cmVlMikge1xuICB2YXIgcXVldWUgPSBbe3RyZWUxOiBpbl90cmVlMSwgdHJlZTI6IGluX3RyZWUyfV07XG4gIHZhciBjb25mbGljdHMgPSBmYWxzZTtcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgIHZhciB0cmVlMSA9IGl0ZW0udHJlZTE7XG4gICAgdmFyIHRyZWUyID0gaXRlbS50cmVlMjtcblxuICAgIGlmICh0cmVlMVsxXS5zdGF0dXMgfHwgdHJlZTJbMV0uc3RhdHVzKSB7XG4gICAgICB0cmVlMVsxXS5zdGF0dXMgPVxuICAgICAgICAodHJlZTFbMV0uc3RhdHVzID09PSAgJ2F2YWlsYWJsZScgfHxcbiAgICAgICAgdHJlZTJbMV0uc3RhdHVzID09PSAnYXZhaWxhYmxlJykgPyAnYXZhaWxhYmxlJyA6ICdtaXNzaW5nJztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUyWzJdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRyZWUxWzJdWzBdKSB7XG4gICAgICAgIGNvbmZsaWN0cyA9ICduZXdfbGVhZic7XG4gICAgICAgIHRyZWUxWzJdWzBdID0gdHJlZTJbMl1baV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWVyZ2VkID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRyZWUxWzJdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0cmVlMVsyXVtqXVswXSA9PT0gdHJlZTJbMl1baV1bMF0pIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKHt0cmVlMTogdHJlZTFbMl1bal0sIHRyZWUyOiB0cmVlMlsyXVtpXX0pO1xuICAgICAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghbWVyZ2VkKSB7XG4gICAgICAgIGNvbmZsaWN0cyA9ICduZXdfYnJhbmNoJztcbiAgICAgICAgaW5zZXJ0U29ydGVkKHRyZWUxWzJdLCB0cmVlMlsyXVtpXSwgY29tcGFyZVRyZWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge2NvbmZsaWN0czogY29uZmxpY3RzLCB0cmVlOiBpbl90cmVlMX07XG59XG5cbmZ1bmN0aW9uIGRvTWVyZ2UodHJlZSwgcGF0aCwgZG9udEV4cGFuZCkge1xuICB2YXIgcmVzdHJlZSA9IFtdO1xuICB2YXIgY29uZmxpY3RzID0gZmFsc2U7XG4gIHZhciBtZXJnZWQgPSBmYWxzZTtcbiAgdmFyIHJlcztcblxuICBpZiAoIXRyZWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHt0cmVlOiBbcGF0aF0sIGNvbmZsaWN0czogJ25ld19sZWFmJ307XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdHJlZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBicmFuY2ggPSB0cmVlW2ldO1xuICAgIGlmIChicmFuY2gucG9zID09PSBwYXRoLnBvcyAmJiBicmFuY2guaWRzWzBdID09PSBwYXRoLmlkc1swXSkge1xuICAgICAgLy8gUGF0aHMgc3RhcnQgYXQgdGhlIHNhbWUgcG9zaXRpb24gYW5kIGhhdmUgdGhlIHNhbWUgcm9vdCwgc28gdGhleSBuZWVkXG4gICAgICAvLyBtZXJnZWRcbiAgICAgIHJlcyA9IG1lcmdlVHJlZShicmFuY2guaWRzLCBwYXRoLmlkcyk7XG4gICAgICByZXN0cmVlLnB1c2goe3BvczogYnJhbmNoLnBvcywgaWRzOiByZXMudHJlZX0pO1xuICAgICAgY29uZmxpY3RzID0gY29uZmxpY3RzIHx8IHJlcy5jb25mbGljdHM7XG4gICAgICBtZXJnZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZG9udEV4cGFuZCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gVGhlIHBhdGhzIHN0YXJ0IGF0IGEgZGlmZmVyZW50IHBvc2l0aW9uLCB0YWtlIHRoZSBlYXJsaWVzdCBwYXRoIGFuZFxuICAgICAgLy8gdHJhdmVyc2UgdXAgdW50aWwgaXQgYXMgYXQgdGhlIHNhbWUgcG9pbnQgZnJvbSByb290IGFzIHRoZSBwYXRoIHdlXG4gICAgICAvLyB3YW50IHRvIG1lcmdlLiAgSWYgdGhlIGtleXMgbWF0Y2ggd2UgcmV0dXJuIHRoZSBsb25nZXIgcGF0aCB3aXRoIHRoZVxuICAgICAgLy8gb3RoZXIgbWVyZ2VkIEFmdGVyIHN0ZW1taW5nIHdlIGRvbnQgd2FudCB0byBleHBhbmQgdGhlIHRyZWVzXG5cbiAgICAgIHZhciB0MSA9IGJyYW5jaC5wb3MgPCBwYXRoLnBvcyA/IGJyYW5jaCA6IHBhdGg7XG4gICAgICB2YXIgdDIgPSBicmFuY2gucG9zIDwgcGF0aC5wb3MgPyBwYXRoIDogYnJhbmNoO1xuICAgICAgdmFyIGRpZmYgPSB0Mi5wb3MgLSB0MS5wb3M7XG5cbiAgICAgIHZhciBjYW5kaWRhdGVQYXJlbnRzID0gW107XG5cbiAgICAgIHZhciB0cmVlcyA9IFtdO1xuICAgICAgdHJlZXMucHVzaCh7aWRzOiB0MS5pZHMsIGRpZmY6IGRpZmYsIHBhcmVudDogbnVsbCwgcGFyZW50SWR4OiBudWxsfSk7XG4gICAgICB3aGlsZSAodHJlZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgaXRlbSA9IHRyZWVzLnBvcCgpO1xuICAgICAgICBpZiAoaXRlbS5kaWZmID09PSAwKSB7XG4gICAgICAgICAgaWYgKGl0ZW0uaWRzWzBdID09PSB0Mi5pZHNbMF0pIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZVBhcmVudHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVsZW1lbnRzID0gaXRlbS5pZHNbMl07XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBlbGVtZW50c0xlbiA9IGVsZW1lbnRzLmxlbmd0aDsgaiA8IGVsZW1lbnRzTGVuOyBqKyspIHtcbiAgICAgICAgICB0cmVlcy5wdXNoKHtcbiAgICAgICAgICAgIGlkczogZWxlbWVudHNbal0sXG4gICAgICAgICAgICBkaWZmOiBpdGVtLmRpZmYgLSAxLFxuICAgICAgICAgICAgcGFyZW50OiBpdGVtLmlkcyxcbiAgICAgICAgICAgIHBhcmVudElkeDogalxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBlbCA9IGNhbmRpZGF0ZVBhcmVudHNbMF07XG5cbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmVzdHJlZS5wdXNoKGJyYW5jaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXMgPSBtZXJnZVRyZWUoZWwuaWRzLCB0Mi5pZHMpO1xuICAgICAgICBlbC5wYXJlbnRbMl1bZWwucGFyZW50SWR4XSA9IHJlcy50cmVlO1xuICAgICAgICByZXN0cmVlLnB1c2goe3BvczogdDEucG9zLCBpZHM6IHQxLmlkc30pO1xuICAgICAgICBjb25mbGljdHMgPSBjb25mbGljdHMgfHwgcmVzLmNvbmZsaWN0cztcbiAgICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdHJlZS5wdXNoKGJyYW5jaCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgZGlkbnQgZmluZFxuICBpZiAoIW1lcmdlZCkge1xuICAgIHJlc3RyZWUucHVzaChwYXRoKTtcbiAgfVxuXG4gIHJlc3RyZWUuc29ydChzb3J0QnlQb3MkMSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmVlOiByZXN0cmVlLFxuICAgIGNvbmZsaWN0czogY29uZmxpY3RzIHx8ICdpbnRlcm5hbF9ub2RlJ1xuICB9O1xufVxuXG4vLyBUbyBlbnN1cmUgd2UgZG9udCBncm93IHRoZSByZXZpc2lvbiB0cmVlIGluZmluaXRlbHksIHdlIHN0ZW0gb2xkIHJldmlzaW9uc1xuZnVuY3Rpb24gc3RlbSh0cmVlLCBkZXB0aCkge1xuICAvLyBGaXJzdCB3ZSBicmVhayBvdXQgdGhlIHRyZWUgaW50byBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm9vdCB0byBsZWFmIHBhdGhzXG4gIHZhciBwYXRocyA9IHJvb3RUb0xlYWYodHJlZSk7XG4gIHZhciBzdGVtbWVkUmV2cztcblxuICB2YXIgcmVzdWx0O1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGF0aHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBUaGVuIGZvciBlYWNoIHBhdGgsIHdlIGN1dCBvZmYgdGhlIHN0YXJ0IG9mIHRoZSBwYXRoIGJhc2VkIG9uIHRoZVxuICAgIC8vIGBkZXB0aGAgdG8gc3RlbSB0bywgYW5kIGdlbmVyYXRlIGEgbmV3IHNldCBvZiBmbGF0IHRyZWVzXG4gICAgdmFyIHBhdGggPSBwYXRoc1tpXTtcbiAgICB2YXIgc3RlbW1lZCA9IHBhdGguaWRzO1xuICAgIHZhciBub2RlO1xuICAgIGlmIChzdGVtbWVkLmxlbmd0aCA+IGRlcHRoKSB7XG4gICAgICAvLyBvbmx5IGRvIHRoZSBzdGVtbWluZyB3b3JrIGlmIHdlIGFjdHVhbGx5IG5lZWQgdG8gc3RlbVxuICAgICAgaWYgKCFzdGVtbWVkUmV2cykge1xuICAgICAgICBzdGVtbWVkUmV2cyA9IHt9OyAvLyBhdm9pZCBhbGxvY2F0aW5nIHRoaXMgb2JqZWN0IHVubmVjZXNzYXJpbHlcbiAgICAgIH1cbiAgICAgIHZhciBudW1TdGVtbWVkID0gc3RlbW1lZC5sZW5ndGggLSBkZXB0aDtcbiAgICAgIG5vZGUgPSB7XG4gICAgICAgIHBvczogcGF0aC5wb3MgKyBudW1TdGVtbWVkLFxuICAgICAgICBpZHM6IHBhdGhUb1RyZWUoc3RlbW1lZCwgbnVtU3RlbW1lZClcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgbnVtU3RlbW1lZDsgcysrKSB7XG4gICAgICAgIHZhciByZXYgPSAocGF0aC5wb3MgKyBzKSArICctJyArIHN0ZW1tZWRbc10uaWQ7XG4gICAgICAgIHN0ZW1tZWRSZXZzW3Jldl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIG5vIG5lZWQgdG8gYWN0dWFsbHkgc3RlbVxuICAgICAgbm9kZSA9IHtcbiAgICAgICAgcG9zOiBwYXRoLnBvcyxcbiAgICAgICAgaWRzOiBwYXRoVG9UcmVlKHN0ZW1tZWQsIDApXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFRoZW4gd2UgcmVtZXJnZSBhbGwgdGhvc2UgZmxhdCB0cmVlcyB0b2dldGhlciwgZW5zdXJpbmcgdGhhdCB3ZSBkb250XG4gICAgLy8gY29ubmVjdCB0cmVlcyB0aGF0IHdvdWxkIGdvIGJleW9uZCB0aGUgZGVwdGggbGltaXRcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSBkb01lcmdlKHJlc3VsdCwgbm9kZSwgdHJ1ZSkudHJlZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gW25vZGVdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMgaXMgbWVtb3J5LWhlYXZ5IHBlciBDaHJvbWUgcHJvZmlsZXIsIGF2b2lkIHVubGVzcyB3ZSBhY3R1YWxseSBzdGVtbWVkXG4gIGlmIChzdGVtbWVkUmV2cykge1xuICAgIHRyYXZlcnNlUmV2VHJlZShyZXN1bHQsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcywgcmV2SGFzaCkge1xuICAgICAgLy8gc29tZSByZXZpc2lvbnMgbWF5IGhhdmUgYmVlbiByZW1vdmVkIGluIGEgYnJhbmNoIGJ1dCBub3QgaW4gYW5vdGhlclxuICAgICAgZGVsZXRlIHN0ZW1tZWRSZXZzW3BvcyArICctJyArIHJldkhhc2hdO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0cmVlOiByZXN1bHQsXG4gICAgcmV2czogc3RlbW1lZFJldnMgPyBPYmplY3Qua2V5cyhzdGVtbWVkUmV2cykgOiBbXVxuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZSh0cmVlLCBwYXRoLCBkZXB0aCkge1xuICB2YXIgbmV3VHJlZSA9IGRvTWVyZ2UodHJlZSwgcGF0aCk7XG4gIHZhciBzdGVtbWVkID0gc3RlbShuZXdUcmVlLnRyZWUsIGRlcHRoKTtcbiAgcmV0dXJuIHtcbiAgICB0cmVlOiBzdGVtbWVkLnRyZWUsXG4gICAgc3RlbW1lZFJldnM6IHN0ZW1tZWQucmV2cyxcbiAgICBjb25mbGljdHM6IG5ld1RyZWUuY29uZmxpY3RzXG4gIH07XG59XG5cbi8vIHJldHVybiB0cnVlIGlmIGEgcmV2IGV4aXN0cyBpbiB0aGUgcmV2IHRyZWUsIGZhbHNlIG90aGVyd2lzZVxuZnVuY3Rpb24gcmV2RXhpc3RzKHJldnMsIHJldikge1xuICB2YXIgdG9WaXNpdCA9IHJldnMuc2xpY2UoKTtcbiAgdmFyIHNwbGl0UmV2ID0gcmV2LnNwbGl0KCctJyk7XG4gIHZhciB0YXJnZXRQb3MgPSBwYXJzZUludChzcGxpdFJldlswXSwgMTApO1xuICB2YXIgdGFyZ2V0SWQgPSBzcGxpdFJldlsxXTtcblxuICB2YXIgbm9kZTtcbiAgd2hpbGUgKChub2RlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICBpZiAobm9kZS5wb3MgPT09IHRhcmdldFBvcyAmJiBub2RlLmlkc1swXSA9PT0gdGFyZ2V0SWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgYnJhbmNoZXMgPSBub2RlLmlkc1syXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnJhbmNoZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRvVmlzaXQucHVzaCh7cG9zOiBub2RlLnBvcyArIDEsIGlkczogYnJhbmNoZXNbaV19KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRUcmVlcyhub2RlKSB7XG4gIHJldHVybiBub2RlLmlkcztcbn1cblxuLy8gY2hlY2sgaWYgYSBzcGVjaWZpYyByZXZpc2lvbiBvZiBhIGRvYyBoYXMgYmVlbiBkZWxldGVkXG4vLyAgLSBtZXRhZGF0YTogdGhlIG1ldGFkYXRhIG9iamVjdCBmcm9tIHRoZSBkb2Mgc3RvcmVcbi8vICAtIHJldjogKG9wdGlvbmFsKSB0aGUgcmV2aXNpb24gdG8gY2hlY2suIGRlZmF1bHRzIHRvIHdpbm5pbmcgcmV2aXNpb25cbmZ1bmN0aW9uIGlzRGVsZXRlZChtZXRhZGF0YSwgcmV2KSB7XG4gIGlmICghcmV2KSB7XG4gICAgcmV2ID0gd2lubmluZ1JldihtZXRhZGF0YSk7XG4gIH1cbiAgdmFyIGlkID0gcmV2LnN1YnN0cmluZyhyZXYuaW5kZXhPZignLScpICsgMSk7XG4gIHZhciB0b1Zpc2l0ID0gbWV0YWRhdGEucmV2X3RyZWUubWFwKGdldFRyZWVzKTtcblxuICB2YXIgdHJlZTtcbiAgd2hpbGUgKCh0cmVlID0gdG9WaXNpdC5wb3AoKSkpIHtcbiAgICBpZiAodHJlZVswXSA9PT0gaWQpIHtcbiAgICAgIHJldHVybiAhIXRyZWVbMV0uZGVsZXRlZDtcbiAgICB9XG4gICAgdG9WaXNpdCA9IHRvVmlzaXQuY29uY2F0KHRyZWVbMl0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxJZChpZCkge1xuICByZXR1cm4gKC9eX2xvY2FsLykudGVzdChpZCk7XG59XG5cbi8vIHJldHVybnMgdGhlIGN1cnJlbnQgbGVhZiBub2RlIGZvciBhIGdpdmVuIHJldmlzaW9uXG5mdW5jdGlvbiBsYXRlc3QocmV2LCBtZXRhZGF0YSkge1xuICB2YXIgdG9WaXNpdCA9IG1ldGFkYXRhLnJldl90cmVlLnNsaWNlKCk7XG4gIHZhciBub2RlO1xuICB3aGlsZSAoKG5vZGUgPSB0b1Zpc2l0LnBvcCgpKSkge1xuICAgIHZhciBwb3MgPSBub2RlLnBvcztcbiAgICB2YXIgdHJlZSA9IG5vZGUuaWRzO1xuICAgIHZhciBpZCA9IHRyZWVbMF07XG4gICAgdmFyIG9wdHMgPSB0cmVlWzFdO1xuICAgIHZhciBicmFuY2hlcyA9IHRyZWVbMl07XG4gICAgdmFyIGlzTGVhZiA9IGJyYW5jaGVzLmxlbmd0aCA9PT0gMDtcblxuICAgIHZhciBoaXN0b3J5ID0gbm9kZS5oaXN0b3J5ID8gbm9kZS5oaXN0b3J5LnNsaWNlKCkgOiBbXTtcbiAgICBoaXN0b3J5LnB1c2goe2lkOiBpZCwgcG9zOiBwb3MsIG9wdHM6IG9wdHN9KTtcblxuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBoaXN0b3J5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBoaXN0b3J5Tm9kZSA9IGhpc3RvcnlbaV07XG4gICAgICAgIHZhciBoaXN0b3J5UmV2ID0gaGlzdG9yeU5vZGUucG9zICsgJy0nICsgaGlzdG9yeU5vZGUuaWQ7XG5cbiAgICAgICAgaWYgKGhpc3RvcnlSZXYgPT09IHJldikge1xuICAgICAgICAgIC8vIHJldHVybiB0aGUgcmV2IG9mIHRoaXMgbGVhZlxuICAgICAgICAgIHJldHVybiBwb3MgKyAnLScgKyBpZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwLCBsID0gYnJhbmNoZXMubGVuZ3RoOyBqIDwgbDsgaisrKSB7XG4gICAgICB0b1Zpc2l0LnB1c2goe3BvczogcG9zICsgMSwgaWRzOiBicmFuY2hlc1tqXSwgaGlzdG9yeTogaGlzdG9yeX0pO1xuICAgIH1cbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlc29sdmUgbGF0ZXN0IHJldmlzaW9uIGZvciBpZCAnICsgbWV0YWRhdGEuaWQgKyAnLCByZXYgJyArIHJldik7XG59XG5cbmluaGVyaXRzKENoYW5nZXMkMSwgRUUpO1xuXG5mdW5jdGlvbiB0cnlDYXRjaEluQ2hhbmdlTGlzdGVuZXIoc2VsZiwgY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKSB7XG4gIC8vIGlzb2xhdGUgdHJ5L2NhdGNoZXMgdG8gYXZvaWQgVjggZGVvcHRpbWl6YXRpb25zXG4gIHRyeSB7XG4gICAgc2VsZi5lbWl0KCdjaGFuZ2UnLCBjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZ3VhcmRlZENvbnNvbGUoJ2Vycm9yJywgJ0Vycm9yIGluIC5vbihcImNoYW5nZVwiLCBmdW5jdGlvbik6JywgZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gQ2hhbmdlcyQxKGRiLCBvcHRzLCBjYWxsYmFjaykge1xuICBFRS5jYWxsKHRoaXMpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuZGIgPSBkYjtcbiAgb3B0cyA9IG9wdHMgPyBjbG9uZShvcHRzKSA6IHt9O1xuICB2YXIgY29tcGxldGUgPSBvcHRzLmNvbXBsZXRlID0gb25jZShmdW5jdGlvbiAoZXJyLCByZXNwKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgaWYgKGxpc3RlbmVyQ291bnQoc2VsZiwgJ2Vycm9yJykgPiAwKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgcmVzcCk7XG4gICAgfVxuICAgIHNlbGYucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgZGIucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gIH0pO1xuICBpZiAoY2FsbGJhY2spIHtcbiAgICBzZWxmLm9uKCdjb21wbGV0ZScsIGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXNwKTtcbiAgICB9KTtcbiAgICBzZWxmLm9uKCdlcnJvcicsIGNhbGxiYWNrKTtcbiAgfVxuICBmdW5jdGlvbiBvbkRlc3Ryb3koKSB7XG4gICAgc2VsZi5jYW5jZWwoKTtcbiAgfVxuICBkYi5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuXG4gIG9wdHMub25DaGFuZ2UgPSBmdW5jdGlvbiAoY2hhbmdlLCBwZW5kaW5nLCBsYXN0U2VxKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYuaXNDYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5Q2F0Y2hJbkNoYW5nZUxpc3RlbmVyKHNlbGYsIGNoYW5nZSwgcGVuZGluZywgbGFzdFNlcSk7XG4gIH07XG5cbiAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZnVsZmlsbCwgcmVqZWN0KSB7XG4gICAgb3B0cy5jb21wbGV0ZSA9IGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZ1bGZpbGwocmVzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgc2VsZi5vbmNlKCdjYW5jZWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGIucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gICAgb3B0cy5jb21wbGV0ZShudWxsLCB7c3RhdHVzOiAnY2FuY2VsbGVkJ30pO1xuICB9KTtcbiAgdGhpcy50aGVuID0gcHJvbWlzZS50aGVuLmJpbmQocHJvbWlzZSk7XG4gIHRoaXNbJ2NhdGNoJ10gPSBwcm9taXNlWydjYXRjaCddLmJpbmQocHJvbWlzZSk7XG4gIHRoaXMudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgY29tcGxldGUobnVsbCwgcmVzdWx0KTtcbiAgfSwgY29tcGxldGUpO1xuXG5cblxuICBpZiAoIWRiLnRhc2txdWV1ZS5pc1JlYWR5KSB7XG4gICAgZGIudGFza3F1ZXVlLmFkZFRhc2soZnVuY3Rpb24gKGZhaWxlZCkge1xuICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICBvcHRzLmNvbXBsZXRlKGZhaWxlZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdjYW5jZWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYudmFsaWRhdGVDaGFuZ2VzKG9wdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNlbGYudmFsaWRhdGVDaGFuZ2VzKG9wdHMpO1xuICB9XG59XG5DaGFuZ2VzJDEucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG4gIGlmICh0aGlzLmRiLnRhc2txdWV1ZS5pc1JlYWR5KSB7XG4gICAgdGhpcy5lbWl0KCdjYW5jZWwnKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHByb2Nlc3NDaGFuZ2UoZG9jLCBtZXRhZGF0YSwgb3B0cykge1xuICB2YXIgY2hhbmdlTGlzdCA9IFt7cmV2OiBkb2MuX3Jldn1dO1xuICBpZiAob3B0cy5zdHlsZSA9PT0gJ2FsbF9kb2NzJykge1xuICAgIGNoYW5nZUxpc3QgPSBjb2xsZWN0TGVhdmVzKG1ldGFkYXRhLnJldl90cmVlKVxuICAgIC5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHtyZXY6IHgucmV2fTsgfSk7XG4gIH1cbiAgdmFyIGNoYW5nZSA9IHtcbiAgICBpZDogbWV0YWRhdGEuaWQsXG4gICAgY2hhbmdlczogY2hhbmdlTGlzdCxcbiAgICBkb2M6IGRvY1xuICB9O1xuXG4gIGlmIChpc0RlbGV0ZWQobWV0YWRhdGEsIGRvYy5fcmV2KSkge1xuICAgIGNoYW5nZS5kZWxldGVkID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICBjaGFuZ2UuZG9jLl9jb25mbGljdHMgPSBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKTtcbiAgICBpZiAoIWNoYW5nZS5kb2MuX2NvbmZsaWN0cy5sZW5ndGgpIHtcbiAgICAgIGRlbGV0ZSBjaGFuZ2UuZG9jLl9jb25mbGljdHM7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2U7XG59XG5cbkNoYW5nZXMkMS5wcm90b3R5cGUudmFsaWRhdGVDaGFuZ2VzID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgdmFyIGNhbGxiYWNrID0gb3B0cy5jb21wbGV0ZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luKSB7XG4gICAgUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbi52YWxpZGF0ZShvcHRzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuICAgICAgc2VsZi5kb0NoYW5nZXMob3B0cyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5kb0NoYW5nZXMob3B0cyk7XG4gIH1cbn07XG5cbkNoYW5nZXMkMS5wcm90b3R5cGUuZG9DaGFuZ2VzID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2FsbGJhY2sgPSBvcHRzLmNvbXBsZXRlO1xuXG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcbiAgaWYgKCdsaXZlJyBpbiBvcHRzICYmICEoJ2NvbnRpbnVvdXMnIGluIG9wdHMpKSB7XG4gICAgb3B0cy5jb250aW51b3VzID0gb3B0cy5saXZlO1xuICB9XG4gIG9wdHMucHJvY2Vzc0NoYW5nZSA9IHByb2Nlc3NDaGFuZ2U7XG5cbiAgaWYgKG9wdHMuc2luY2UgPT09ICdsYXRlc3QnKSB7XG4gICAgb3B0cy5zaW5jZSA9ICdub3cnO1xuICB9XG4gIGlmICghb3B0cy5zaW5jZSkge1xuICAgIG9wdHMuc2luY2UgPSAwO1xuICB9XG4gIGlmIChvcHRzLnNpbmNlID09PSAnbm93Jykge1xuICAgIHRoaXMuZGIuaW5mbygpLnRoZW4oZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHNlbGYuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwge3N0YXR1czogJ2NhbmNlbGxlZCd9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3B0cy5zaW5jZSA9IGluZm8udXBkYXRlX3NlcTtcbiAgICAgIHNlbGYuZG9DaGFuZ2VzKG9wdHMpO1xuICAgIH0sIGNhbGxiYWNrKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoUG91Y2hEQi5fY2hhbmdlc0ZpbHRlclBsdWdpbikge1xuICAgIFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4ubm9ybWFsaXplKG9wdHMpO1xuICAgIGlmIChQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luLnNob3VsZEZpbHRlcih0aGlzLCBvcHRzKSkge1xuICAgICAgcmV0dXJuIFBvdWNoREIuX2NoYW5nZXNGaWx0ZXJQbHVnaW4uZmlsdGVyKHRoaXMsIG9wdHMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBbJ2RvY19pZHMnLCAnZmlsdGVyJywgJ3NlbGVjdG9yJywgJ3ZpZXcnXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChrZXkgaW4gb3B0cykge1xuICAgICAgICBndWFyZGVkQ29uc29sZSgnd2FybicsXG4gICAgICAgICAgJ1RoZSBcIicgKyBrZXkgKyAnXCIgb3B0aW9uIHdhcyBwYXNzZWQgaW4gdG8gY2hhbmdlcy9yZXBsaWNhdGUsICcgK1xuICAgICAgICAgICdidXQgcG91Y2hkYi1jaGFuZ2VzLWZpbHRlciBwbHVnaW4gaXMgbm90IGluc3RhbGxlZCwgc28gaXQgJyArXG4gICAgICAgICAgJ3dhcyBpZ25vcmVkLiBQbGVhc2UgaW5zdGFsbCB0aGUgcGx1Z2luIHRvIGVuYWJsZSBmaWx0ZXJpbmcuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCEoJ2Rlc2NlbmRpbmcnIGluIG9wdHMpKSB7XG4gICAgb3B0cy5kZXNjZW5kaW5nID0gZmFsc2U7XG4gIH1cblxuICAvLyAwIGFuZCAxIHNob3VsZCByZXR1cm4gMSBkb2N1bWVudFxuICBvcHRzLmxpbWl0ID0gb3B0cy5saW1pdCA9PT0gMCA/IDEgOiBvcHRzLmxpbWl0O1xuICBvcHRzLmNvbXBsZXRlID0gY2FsbGJhY2s7XG4gIHZhciBuZXdQcm9taXNlID0gdGhpcy5kYi5fY2hhbmdlcyhvcHRzKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKG5ld1Byb21pc2UgJiYgdHlwZW9mIG5ld1Byb21pc2UuY2FuY2VsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGNhbmNlbCA9IHNlbGYuY2FuY2VsO1xuICAgIHNlbGYuY2FuY2VsID0gZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICBuZXdQcm9taXNlLmNhbmNlbCgpO1xuICAgICAgY2FuY2VsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKlxuICogQSBnZW5lcmljIHBvdWNoIGFkYXB0ZXJcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXJlKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xufVxuXG4vLyBXcmFwcGVyIGZvciBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoZSBidWxrZG9jcyBhcGkgd2l0aCBhIHNpbmdsZSBkb2MsXG4vLyBpZiB0aGUgZmlyc3QgcmVzdWx0IGlzIGFuIGVycm9yLCByZXR1cm4gYW4gZXJyb3JcbmZ1bmN0aW9uIHlhbmtFcnJvcihjYWxsYmFjaywgZG9jSWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlcnIsIHJlc3VsdHMpIHtcbiAgICBpZiAoZXJyIHx8IChyZXN1bHRzWzBdICYmIHJlc3VsdHNbMF0uZXJyb3IpKSB7XG4gICAgICBlcnIgPSBlcnIgfHwgcmVzdWx0c1swXTtcbiAgICAgIGVyci5kb2NJZCA9IGRvY0lkO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cy5sZW5ndGggPyByZXN1bHRzWzBdICA6IHJlc3VsdHMpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gY2xlYW4gZG9jcyBnaXZlbiB0byB1cyBieSB0aGUgdXNlclxuZnVuY3Rpb24gY2xlYW5Eb2NzKGRvY3MpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRvYyA9IGRvY3NbaV07XG4gICAgaWYgKGRvYy5fZGVsZXRlZCkge1xuICAgICAgZGVsZXRlIGRvYy5fYXR0YWNobWVudHM7IC8vIGlnbm9yZSBhdHRzIGZvciBkZWxldGVkIGRvY3NcbiAgICB9IGVsc2UgaWYgKGRvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgIC8vIGZpbHRlciBvdXQgZXh0cmFuZW91cyBrZXlzIGZyb20gX2F0dGFjaG1lbnRzXG4gICAgICB2YXIgYXR0cyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhdHRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBhdHQgPSBhdHRzW2pdO1xuICAgICAgICBkb2MuX2F0dGFjaG1lbnRzW2F0dF0gPSBwaWNrKGRvYy5fYXR0YWNobWVudHNbYXR0XSxcbiAgICAgICAgICBbJ2RhdGEnLCAnZGlnZXN0JywgJ2NvbnRlbnRfdHlwZScsICdsZW5ndGgnLCAncmV2cG9zJywgJ3N0dWInXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIGNvbXBhcmUgdHdvIGRvY3MsIGZpcnN0IGJ5IF9pZCB0aGVuIGJ5IF9yZXZcbmZ1bmN0aW9uIGNvbXBhcmVCeUlkVGhlblJldihhLCBiKSB7XG4gIHZhciBpZENvbXBhcmUgPSBjb21wYXJlKGEuX2lkLCBiLl9pZCk7XG4gIGlmIChpZENvbXBhcmUgIT09IDApIHtcbiAgICByZXR1cm4gaWRDb21wYXJlO1xuICB9XG4gIHZhciBhU3RhcnQgPSBhLl9yZXZpc2lvbnMgPyBhLl9yZXZpc2lvbnMuc3RhcnQgOiAwO1xuICB2YXIgYlN0YXJ0ID0gYi5fcmV2aXNpb25zID8gYi5fcmV2aXNpb25zLnN0YXJ0IDogMDtcbiAgcmV0dXJuIGNvbXBhcmUoYVN0YXJ0LCBiU3RhcnQpO1xufVxuXG4vLyBmb3IgZXZlcnkgbm9kZSBpbiBhIHJldmlzaW9uIHRyZWUgY29tcHV0ZXMgaXRzIGRpc3RhbmNlIGZyb20gdGhlIGNsb3Nlc3Rcbi8vIGxlYWZcbmZ1bmN0aW9uIGNvbXB1dGVIZWlnaHQocmV2cykge1xuICB2YXIgaGVpZ2h0ID0ge307XG4gIHZhciBlZGdlcyA9IFtdO1xuICB0cmF2ZXJzZVJldlRyZWUocmV2cywgZnVuY3Rpb24gKGlzTGVhZiwgcG9zLCBpZCwgcHJudCkge1xuICAgIHZhciByZXYgPSBwb3MgKyBcIi1cIiArIGlkO1xuICAgIGlmIChpc0xlYWYpIHtcbiAgICAgIGhlaWdodFtyZXZdID0gMDtcbiAgICB9XG4gICAgaWYgKHBybnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZWRnZXMucHVzaCh7ZnJvbTogcHJudCwgdG86IHJldn0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV2O1xuICB9KTtcblxuICBlZGdlcy5yZXZlcnNlKCk7XG4gIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICBpZiAoaGVpZ2h0W2VkZ2UuZnJvbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVpZ2h0W2VkZ2UuZnJvbV0gPSAxICsgaGVpZ2h0W2VkZ2UudG9dO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWlnaHRbZWRnZS5mcm9tXSA9IE1hdGgubWluKGhlaWdodFtlZGdlLmZyb21dLCAxICsgaGVpZ2h0W2VkZ2UudG9dKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBhbGxEb2NzS2V5c1BhcnNlKG9wdHMpIHtcbiAgdmFyIGtleXMgPSAgKCdsaW1pdCcgaW4gb3B0cykgP1xuICAgIG9wdHMua2V5cy5zbGljZShvcHRzLnNraXAsIG9wdHMubGltaXQgKyBvcHRzLnNraXApIDpcbiAgICAob3B0cy5za2lwID4gMCkgPyBvcHRzLmtleXMuc2xpY2Uob3B0cy5za2lwKSA6IG9wdHMua2V5cztcbiAgb3B0cy5rZXlzID0ga2V5cztcbiAgb3B0cy5za2lwID0gMDtcbiAgZGVsZXRlIG9wdHMubGltaXQ7XG4gIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICBrZXlzLnJldmVyc2UoKTtcbiAgICBvcHRzLmRlc2NlbmRpbmcgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBhbGwgY29tcGFjdGlvbiBpcyBkb25lIGluIGEgcXVldWUsIHRvIGF2b2lkIGF0dGFjaGluZ1xuLy8gdG9vIG1hbnkgbGlzdGVuZXJzIGF0IG9uY2VcbmZ1bmN0aW9uIGRvTmV4dENvbXBhY3Rpb24oc2VsZikge1xuICB2YXIgdGFzayA9IHNlbGYuX2NvbXBhY3Rpb25RdWV1ZVswXTtcbiAgdmFyIG9wdHMgPSB0YXNrLm9wdHM7XG4gIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gIHNlbGYuZ2V0KCdfbG9jYWwvY29tcGFjdGlvbicpLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChkb2MgJiYgZG9jLmxhc3Rfc2VxKSB7XG4gICAgICBvcHRzLmxhc3Rfc2VxID0gZG9jLmxhc3Rfc2VxO1xuICAgIH1cbiAgICBzZWxmLl9jb21wYWN0KG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhudWxsLCByZXMpO1xuICAgICAgfVxuICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5fY29tcGFjdGlvblF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChzZWxmLl9jb21wYWN0aW9uUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgZG9OZXh0Q29tcGFjdGlvbihzZWxmKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhdHRhY2htZW50TmFtZUVycm9yKG5hbWUpIHtcbiAgaWYgKG5hbWUuY2hhckF0KDApID09PSAnXycpIHtcbiAgICByZXR1cm4gbmFtZSArICcgaXMgbm90IGEgdmFsaWQgYXR0YWNobWVudCBuYW1lLCBhdHRhY2htZW50ICcgK1xuICAgICAgJ25hbWVzIGNhbm5vdCBzdGFydCB3aXRoIFxcJ19cXCcnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuaW5oZXJpdHMoQWJzdHJhY3RQb3VjaERCLCBFRSk7XG5cbmZ1bmN0aW9uIEFic3RyYWN0UG91Y2hEQigpIHtcbiAgRUUuY2FsbCh0aGlzKTtcblxuICAvLyByZS1iaW5kIHByb3RvdHlwZWQgbWV0aG9kc1xuICBmb3IgKHZhciBwIGluIEFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUpIHtcbiAgICBpZiAodHlwZW9mIHRoaXNbcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbcF0gPSB0aGlzW3BdLmJpbmQodGhpcyk7XG4gICAgfVxuICB9XG59XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucG9zdCA9XG4gIGFkYXB0ZXJGdW4oJ3Bvc3QnLCBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2YgZG9jICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRvYykpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTk9UX0FOX09CSkVDVCkpO1xuICB9XG4gIHRoaXMuYnVsa0RvY3Moe2RvY3M6IFtkb2NdfSwgb3B0cywgeWFua0Vycm9yKGNhbGxiYWNrLCBkb2MuX2lkKSk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5wdXQgPSBhZGFwdGVyRnVuKCdwdXQnLCBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYikge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2YgZG9jICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRvYykpIHtcbiAgICByZXR1cm4gY2IoY3JlYXRlRXJyb3IoTk9UX0FOX09CSkVDVCkpO1xuICB9XG4gIGludmFsaWRJZEVycm9yKGRvYy5faWQpO1xuICBpZiAoaXNMb2NhbElkKGRvYy5faWQpICYmIHR5cGVvZiB0aGlzLl9wdXRMb2NhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChkb2MuX2RlbGV0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW1vdmVMb2NhbChkb2MsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3B1dExvY2FsKGRvYywgY2IpO1xuICAgIH1cbiAgfVxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChvcHRzLmZvcmNlICYmIGRvYy5fcmV2KSB7XG4gICAgdHJhbnNmb3JtRm9yY2VPcHRpb25Ub05ld0VkaXRzT3B0aW9uKCk7XG4gICAgcHV0RG9jKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBlcnIgPyBudWxsIDoge29rOiB0cnVlLCBpZDogZG9jLl9pZCwgcmV2OiBkb2MuX3Jldn07XG4gICAgICBjYihlcnIsIHJlc3VsdCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcHV0RG9jKGNiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUZvcmNlT3B0aW9uVG9OZXdFZGl0c09wdGlvbigpIHtcbiAgICB2YXIgcGFydHMgPSBkb2MuX3Jldi5zcGxpdCgnLScpO1xuICAgIHZhciBvbGRSZXZJZCA9IHBhcnRzWzFdO1xuICAgIHZhciBvbGRSZXZOdW0gPSBwYXJzZUludChwYXJ0c1swXSwgMTApO1xuXG4gICAgdmFyIG5ld1Jldk51bSA9IG9sZFJldk51bSArIDE7XG4gICAgdmFyIG5ld1JldklkID0gcmV2JCQxKCk7XG5cbiAgICBkb2MuX3JldmlzaW9ucyA9IHtcbiAgICAgIHN0YXJ0OiBuZXdSZXZOdW0sXG4gICAgICBpZHM6IFtuZXdSZXZJZCwgb2xkUmV2SWRdXG4gICAgfTtcbiAgICBkb2MuX3JldiA9IG5ld1Jldk51bSArICctJyArIG5ld1JldklkO1xuICAgIG9wdHMubmV3X2VkaXRzID0gZmFsc2U7XG4gIH1cbiAgZnVuY3Rpb24gcHV0RG9jKG5leHQpIHtcbiAgICBpZiAodHlwZW9mIHNlbGYuX3B1dCA9PT0gJ2Z1bmN0aW9uJyAmJiBvcHRzLm5ld19lZGl0cyAhPT0gZmFsc2UpIHtcbiAgICAgIHNlbGYuX3B1dChkb2MsIG9wdHMsIG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmJ1bGtEb2NzKHtkb2NzOiBbZG9jXX0sIG9wdHMsIHlhbmtFcnJvcihuZXh0LCBkb2MuX2lkKSk7XG4gICAgfVxuICB9XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5wdXRBdHRhY2htZW50ID1cbiAgYWRhcHRlckZ1bigncHV0QXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLCByZXYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYiwgdHlwZSkge1xuICB2YXIgYXBpID0gdGhpcztcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHlwZSA9IGJsb2I7XG4gICAgYmxvYiA9IHJldjtcbiAgICByZXYgPSBudWxsO1xuICB9XG4gIC8vIExldHMgZml4IGluIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3VjaGRiL3BvdWNoZGIvaXNzdWVzLzMyNjdcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0eXBlID0gYmxvYjtcbiAgICBibG9iID0gcmV2O1xuICAgIHJldiA9IG51bGw7XG4gIH1cbiAgaWYgKCF0eXBlKSB7XG4gICAgZ3VhcmRlZENvbnNvbGUoJ3dhcm4nLCAnQXR0YWNobWVudCcsIGF0dGFjaG1lbnRJZCwgJ29uIGRvY3VtZW50JywgZG9jSWQsICdpcyBtaXNzaW5nIGNvbnRlbnRfdHlwZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXR0YWNobWVudChkb2MpIHtcbiAgICB2YXIgcHJldnJldnBvcyA9ICdfcmV2JyBpbiBkb2MgPyBwYXJzZUludChkb2MuX3JldiwgMTApIDogMDtcbiAgICBkb2MuX2F0dGFjaG1lbnRzID0gZG9jLl9hdHRhY2htZW50cyB8fCB7fTtcbiAgICBkb2MuX2F0dGFjaG1lbnRzW2F0dGFjaG1lbnRJZF0gPSB7XG4gICAgICBjb250ZW50X3R5cGU6IHR5cGUsXG4gICAgICBkYXRhOiBibG9iLFxuICAgICAgcmV2cG9zOiArK3ByZXZyZXZwb3NcbiAgICB9O1xuICAgIHJldHVybiBhcGkucHV0KGRvYyk7XG4gIH1cblxuICByZXR1cm4gYXBpLmdldChkb2NJZCkudGhlbihmdW5jdGlvbiAoZG9jKSB7XG4gICAgaWYgKGRvYy5fcmV2ICE9PSByZXYpIHtcbiAgICAgIHRocm93IGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUF0dGFjaG1lbnQoZG9jKTtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAvLyBjcmVhdGUgbmV3IGRvY1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVyci5yZWFzb24gPT09IE1JU1NJTkdfRE9DLm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBjcmVhdGVBdHRhY2htZW50KHtfaWQ6IGRvY0lkfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmVtb3ZlQXR0YWNobWVudCA9XG4gIGFkYXB0ZXJGdW4oJ3JlbW92ZUF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCwgcmV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5nZXQoZG9jSWQsIGZ1bmN0aW9uIChlcnIsIG9iaikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvYmouX3JldiAhPT0gcmV2KSB7XG4gICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihSRVZfQ09ORkxJQ1QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFvYmouX2F0dGFjaG1lbnRzKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgZGVsZXRlIG9iai5fYXR0YWNobWVudHNbYXR0YWNobWVudElkXTtcbiAgICBpZiAoT2JqZWN0LmtleXMob2JqLl9hdHRhY2htZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgb2JqLl9hdHRhY2htZW50cztcbiAgICB9XG4gICAgc2VsZi5wdXQob2JqLCBjYWxsYmFjayk7XG4gIH0pO1xufSk7XG5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUucmVtb3ZlID1cbiAgYWRhcHRlckZ1bigncmVtb3ZlJywgZnVuY3Rpb24gKGRvY09ySWQsIG9wdHNPclJldiwgb3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIGRvYztcbiAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gaWQsIHJldiwgb3B0cywgY2FsbGJhY2sgc3R5bGVcbiAgICBkb2MgPSB7XG4gICAgICBfaWQ6IGRvY09ySWQsXG4gICAgICBfcmV2OiBvcHRzT3JSZXZcbiAgICB9O1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBkb2MsIG9wdHMsIGNhbGxiYWNrIHN0eWxlXG4gICAgZG9jID0gZG9jT3JJZDtcbiAgICBpZiAodHlwZW9mIG9wdHNPclJldiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzT3JSZXY7XG4gICAgICBvcHRzID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSBvcHRzT3JSZXY7XG4gICAgfVxuICB9XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICBvcHRzLndhc19kZWxldGUgPSB0cnVlO1xuICB2YXIgbmV3RG9jID0ge19pZDogZG9jLl9pZCwgX3JldjogKGRvYy5fcmV2IHx8IG9wdHMucmV2KX07XG4gIG5ld0RvYy5fZGVsZXRlZCA9IHRydWU7XG4gIGlmIChpc0xvY2FsSWQobmV3RG9jLl9pZCkgJiYgdHlwZW9mIHRoaXMuX3JlbW92ZUxvY2FsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZUxvY2FsKGRvYywgY2FsbGJhY2spO1xuICB9XG4gIHRoaXMuYnVsa0RvY3Moe2RvY3M6IFtuZXdEb2NdfSwgb3B0cywgeWFua0Vycm9yKGNhbGxiYWNrLCBuZXdEb2MuX2lkKSk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5yZXZzRGlmZiA9XG4gIGFkYXB0ZXJGdW4oJ3JldnNEaWZmJywgZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICB2YXIgaWRzID0gT2JqZWN0LmtleXMocmVxKTtcblxuICBpZiAoIWlkcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge30pO1xuICB9XG5cbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIG1pc3NpbmcgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuICBmdW5jdGlvbiBhZGRUb01pc3NpbmcoaWQsIHJldklkKSB7XG4gICAgaWYgKCFtaXNzaW5nLmhhcyhpZCkpIHtcbiAgICAgIG1pc3Npbmcuc2V0KGlkLCB7bWlzc2luZzogW119KTtcbiAgICB9XG4gICAgbWlzc2luZy5nZXQoaWQpLm1pc3NpbmcucHVzaChyZXZJZCk7XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzRG9jKGlkLCByZXZfdHJlZSkge1xuICAgIC8vIElzIHRoaXMgZmFzdCBlbm91Z2g/IE1heWJlIHdlIHNob3VsZCBzd2l0Y2ggdG8gYSBzZXQgc2ltdWxhdGVkIGJ5IGEgbWFwXG4gICAgdmFyIG1pc3NpbmdGb3JJZCA9IHJlcVtpZF0uc2xpY2UoMCk7XG4gICAgdHJhdmVyc2VSZXZUcmVlKHJldl90cmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIHJldkhhc2gsIGN0eCxcbiAgICAgIG9wdHMpIHtcbiAgICAgICAgdmFyIHJldiA9IHBvcyArICctJyArIHJldkhhc2g7XG4gICAgICAgIHZhciBpZHggPSBtaXNzaW5nRm9ySWQuaW5kZXhPZihyZXYpO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1pc3NpbmdGb3JJZC5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChvcHRzLnN0YXR1cyAhPT0gJ2F2YWlsYWJsZScpIHtcbiAgICAgICAgICBhZGRUb01pc3NpbmcoaWQsIHJldik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gVHJhdmVyc2luZyB0aGUgdHJlZSBpcyBzeW5jaHJvbm91cywgc28gbm93IGBtaXNzaW5nRm9ySWRgIGNvbnRhaW5zXG4gICAgLy8gcmV2aXNpb25zIHRoYXQgd2VyZSBub3QgZm91bmQgaW4gdGhlIHRyZWVcbiAgICBtaXNzaW5nRm9ySWQuZm9yRWFjaChmdW5jdGlvbiAocmV2KSB7XG4gICAgICBhZGRUb01pc3NpbmcoaWQsIHJldik7XG4gICAgfSk7XG4gIH1cblxuICBpZHMubWFwKGZ1bmN0aW9uIChpZCkge1xuICAgIHRoaXMuX2dldFJldmlzaW9uVHJlZShpZCwgZnVuY3Rpb24gKGVyciwgcmV2X3RyZWUpIHtcbiAgICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1cyA9PT0gNDA0ICYmIGVyci5tZXNzYWdlID09PSAnbWlzc2luZycpIHtcbiAgICAgICAgbWlzc2luZy5zZXQoaWQsIHttaXNzaW5nOiByZXFbaWRdfSk7XG4gICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3NEb2MoaWQsIHJldl90cmVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCsrY291bnQgPT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gY29udmVydCBMYXp5TWFwIHRvIG9iamVjdFxuICAgICAgICB2YXIgbWlzc2luZ09iaiA9IHt9O1xuICAgICAgICBtaXNzaW5nLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBtaXNzaW5nT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBtaXNzaW5nT2JqKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgdGhpcyk7XG59KTtcblxuLy8gX2J1bGtfZ2V0IEFQSSBmb3IgZmFzdGVyIHJlcGxpY2F0aW9uLCBhcyBkZXNjcmliZWQgaW5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY291Y2hkYi1jaHR0cGQvcHVsbC8zM1xuLy8gQXQgdGhlIFwiYWJzdHJhY3RcIiBsZXZlbCwgaXQgd2lsbCBqdXN0IHJ1biBtdWx0aXBsZSBnZXQoKXMgaW5cbi8vIHBhcmFsbGVsLCBiZWNhdXNlIHRoaXMgaXNuJ3QgbXVjaCBvZiBhIHBlcmZvcm1hbmNlIGNvc3Rcbi8vIGZvciBsb2NhbCBkYXRhYmFzZXMgKGV4Y2VwdCB0aGUgY29zdCBvZiBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsIHdoaWNoIGlzXG4vLyBzbWFsbCkuIFRoZSBodHRwIGFkYXB0ZXIgb3ZlcnJpZGVzIHRoaXMgaW4gb3JkZXJcbi8vIHRvIGRvIGEgbW9yZSBlZmZpY2llbnQgc2luZ2xlIEhUVFAgcmVxdWVzdC5cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuYnVsa0dldCA9XG4gIGFkYXB0ZXJGdW4oJ2J1bGtHZXQnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgYnVsa0dldCh0aGlzLCBvcHRzLCBjYWxsYmFjayk7XG59KTtcblxuLy8gY29tcGFjdCBvbmUgZG9jdW1lbnQgYW5kIGZpcmUgY2FsbGJhY2tcbi8vIGJ5IGNvbXBhY3Rpbmcgd2UgbWVhbiByZW1vdmluZyBhbGwgcmV2aXNpb25zIHdoaWNoXG4vLyBhcmUgZnVydGhlciBmcm9tIHRoZSBsZWFmIGluIHJldmlzaW9uIHRyZWUgdGhhbiBtYXhfaGVpZ2h0XG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmNvbXBhY3REb2N1bWVudCA9XG4gIGFkYXB0ZXJGdW4oJ2NvbXBhY3REb2N1bWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgbWF4SGVpZ2h0LCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX2dldFJldmlzaW9uVHJlZShkb2NJZCwgZnVuY3Rpb24gKGVyciwgcmV2VHJlZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICB2YXIgaGVpZ2h0ID0gY29tcHV0ZUhlaWdodChyZXZUcmVlKTtcbiAgICB2YXIgY2FuZGlkYXRlcyA9IFtdO1xuICAgIHZhciByZXZzID0gW107XG4gICAgT2JqZWN0LmtleXMoaGVpZ2h0KS5mb3JFYWNoKGZ1bmN0aW9uIChyZXYpIHtcbiAgICAgIGlmIChoZWlnaHRbcmV2XSA+IG1heEhlaWdodCkge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2gocmV2KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyYXZlcnNlUmV2VHJlZShyZXZUcmVlLCBmdW5jdGlvbiAoaXNMZWFmLCBwb3MsIHJldkhhc2gsIGN0eCwgb3B0cykge1xuICAgICAgdmFyIHJldiA9IHBvcyArICctJyArIHJldkhhc2g7XG4gICAgICBpZiAob3B0cy5zdGF0dXMgPT09ICdhdmFpbGFibGUnICYmIGNhbmRpZGF0ZXMuaW5kZXhPZihyZXYpICE9PSAtMSkge1xuICAgICAgICByZXZzLnB1c2gocmV2KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLl9kb0NvbXBhY3Rpb24oZG9jSWQsIHJldnMsIGNhbGxiYWNrKTtcbiAgfSk7XG59KTtcblxuLy8gY29tcGFjdCB0aGUgd2hvbGUgZGF0YWJhc2UgdXNpbmcgc2luZ2xlIGRvY3VtZW50XG4vLyBjb21wYWN0aW9uXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmNvbXBhY3QgPVxuICBhZGFwdGVyRnVuKCdjb21wYWN0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIHNlbGYuX2NvbXBhY3Rpb25RdWV1ZSA9IHNlbGYuX2NvbXBhY3Rpb25RdWV1ZSB8fCBbXTtcbiAgc2VsZi5fY29tcGFjdGlvblF1ZXVlLnB1c2goe29wdHM6IG9wdHMsIGNhbGxiYWNrOiBjYWxsYmFja30pO1xuICBpZiAoc2VsZi5fY29tcGFjdGlvblF1ZXVlLmxlbmd0aCA9PT0gMSkge1xuICAgIGRvTmV4dENvbXBhY3Rpb24oc2VsZik7XG4gIH1cbn0pO1xuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5fY29tcGFjdCA9IGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBjaGFuZ2VzT3B0cyA9IHtcbiAgICByZXR1cm5fZG9jczogZmFsc2UsXG4gICAgbGFzdF9zZXE6IG9wdHMubGFzdF9zZXEgfHwgMFxuICB9O1xuICB2YXIgcHJvbWlzZXMgPSBbXTtcblxuICBmdW5jdGlvbiBvbkNoYW5nZShyb3cpIHtcbiAgICBwcm9taXNlcy5wdXNoKHNlbGYuY29tcGFjdERvY3VtZW50KHJvdy5pZCwgMCkpO1xuICB9XG4gIGZ1bmN0aW9uIG9uQ29tcGxldGUocmVzcCkge1xuICAgIHZhciBsYXN0U2VxID0gcmVzcC5sYXN0X3NlcTtcbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdXBzZXJ0KHNlbGYsICdfbG9jYWwvY29tcGFjdGlvbicsIGZ1bmN0aW9uIGRlbHRhRnVuYyhkb2MpIHtcbiAgICAgICAgaWYgKCFkb2MubGFzdF9zZXEgfHwgZG9jLmxhc3Rfc2VxIDwgbGFzdFNlcSkge1xuICAgICAgICAgIGRvYy5sYXN0X3NlcSA9IGxhc3RTZXE7XG4gICAgICAgICAgcmV0dXJuIGRvYztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNvbWVib2R5IGVsc2UgZ290IGhlcmUgZmlyc3QsIGRvbid0IHVwZGF0ZVxuICAgICAgfSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCB7b2s6IHRydWV9KTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gIH1cbiAgc2VsZi5jaGFuZ2VzKGNoYW5nZXNPcHRzKVxuICAgIC5vbignY2hhbmdlJywgb25DaGFuZ2UpXG4gICAgLm9uKCdjb21wbGV0ZScsIG9uQ29tcGxldGUpXG4gICAgLm9uKCdlcnJvcicsIGNhbGxiYWNrKTtcbn07XG5cbi8qIEJlZ2luIGFwaSB3cmFwcGVycy4gU3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0byBzdG9yYWdlIGJlbG9uZ3MgaW4gdGhlXG4gICBfW21ldGhvZF0gKi9cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuZ2V0ID0gYWRhcHRlckZ1bignZ2V0JywgZnVuY3Rpb24gKGlkLCBvcHRzLCBjYikge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKElOVkFMSURfSUQpKTtcbiAgfVxuICBpZiAoaXNMb2NhbElkKGlkKSAmJiB0eXBlb2YgdGhpcy5fZ2V0TG9jYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0TG9jYWwoaWQsIGNiKTtcbiAgfVxuICB2YXIgbGVhdmVzID0gW10sIHNlbGYgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIGZpbmlzaE9wZW5SZXZzKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgY291bnQgPSBsZWF2ZXMubGVuZ3RoO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghY291bnQpIHtcbiAgICAgIHJldHVybiBjYihudWxsLCByZXN1bHQpO1xuICAgIH1cblxuICAgIC8vIG9yZGVyIHdpdGggb3Blbl9yZXZzIGlzIHVuc3BlY2lmaWVkXG4gICAgbGVhdmVzLmZvckVhY2goZnVuY3Rpb24gKGxlYWYpIHtcbiAgICAgIHNlbGYuZ2V0KGlkLCB7XG4gICAgICAgIHJldjogbGVhZixcbiAgICAgICAgcmV2czogb3B0cy5yZXZzLFxuICAgICAgICBsYXRlc3Q6IG9wdHMubGF0ZXN0LFxuICAgICAgICBhdHRhY2htZW50czogb3B0cy5hdHRhY2htZW50cyxcbiAgICAgICAgYmluYXJ5OiBvcHRzLmJpbmFyeVxuICAgICAgfSwgZnVuY3Rpb24gKGVyciwgZG9jKSB7XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgLy8gdXNpbmcgbGF0ZXN0PXRydWUgY2FuIHByb2R1Y2UgZHVwbGljYXRlc1xuICAgICAgICAgIHZhciBleGlzdGluZztcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJlc3VsdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRbaV0ub2sgJiYgcmVzdWx0W2ldLm9rLl9yZXYgPT09IGRvYy5fcmV2KSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtvazogZG9jfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHttaXNzaW5nOiBsZWFmfSk7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQtLTtcbiAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgIGNiKG51bGwsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKG9wdHMub3Blbl9yZXZzKSB7XG4gICAgaWYgKG9wdHMub3Blbl9yZXZzID09PSBcImFsbFwiKSB7XG4gICAgICB0aGlzLl9nZXRSZXZpc2lvblRyZWUoaWQsIGZ1bmN0aW9uIChlcnIsIHJldl90cmVlKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgbGVhdmVzID0gY29sbGVjdExlYXZlcyhyZXZfdHJlZSkubWFwKGZ1bmN0aW9uIChsZWFmKSB7XG4gICAgICAgICAgcmV0dXJuIGxlYWYucmV2O1xuICAgICAgICB9KTtcbiAgICAgICAgZmluaXNoT3BlblJldnMoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzLm9wZW5fcmV2cykpIHtcbiAgICAgICAgbGVhdmVzID0gb3B0cy5vcGVuX3JldnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVhdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGwgPSBsZWF2ZXNbaV07XG4gICAgICAgICAgLy8gbG9va3MgbGlrZSBpdCdzIHRoZSBvbmx5IHRoaW5nIGNvdWNoZGIgY2hlY2tzXG4gICAgICAgICAgaWYgKCEodHlwZW9mIChsKSA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCstLy50ZXN0KGwpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGNyZWF0ZUVycm9yKElOVkFMSURfUkVWKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmlzaE9wZW5SZXZzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2IoY3JlYXRlRXJyb3IoVU5LTk9XTl9FUlJPUiwgJ2Z1bmN0aW9uX2NsYXVzZScpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuOyAvLyBvcGVuX3JldnMgZG9lcyBub3QgbGlrZSBvdGhlciBvcHRpb25zXG4gIH1cblxuICByZXR1cm4gdGhpcy5fZ2V0KGlkLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnIuZG9jSWQgPSBpZDtcbiAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH1cblxuICAgIHZhciBkb2MgPSByZXN1bHQuZG9jO1xuICAgIHZhciBtZXRhZGF0YSA9IHJlc3VsdC5tZXRhZGF0YTtcbiAgICB2YXIgY3R4ID0gcmVzdWx0LmN0eDtcblxuICAgIGlmIChvcHRzLmNvbmZsaWN0cykge1xuICAgICAgdmFyIGNvbmZsaWN0cyA9IGNvbGxlY3RDb25mbGljdHMobWV0YWRhdGEpO1xuICAgICAgaWYgKGNvbmZsaWN0cy5sZW5ndGgpIHtcbiAgICAgICAgZG9jLl9jb25mbGljdHMgPSBjb25mbGljdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRGVsZXRlZChtZXRhZGF0YSwgZG9jLl9yZXYpKSB7XG4gICAgICBkb2MuX2RlbGV0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnJldnMgfHwgb3B0cy5yZXZzX2luZm8pIHtcbiAgICAgIHZhciBzcGxpdHRlZFJldiA9IGRvYy5fcmV2LnNwbGl0KCctJyk7XG4gICAgICB2YXIgcmV2Tm8gICAgICAgPSBwYXJzZUludChzcGxpdHRlZFJldlswXSwgMTApO1xuICAgICAgdmFyIHJldkhhc2ggICAgID0gc3BsaXR0ZWRSZXZbMV07XG5cbiAgICAgIHZhciBwYXRocyA9IHJvb3RUb0xlYWYobWV0YWRhdGEucmV2X3RyZWUpO1xuICAgICAgdmFyIHBhdGggPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJyZW50UGF0aCA9IHBhdGhzW2ldO1xuICAgICAgICB2YXIgaGFzaEluZGV4ID0gY3VycmVudFBhdGguaWRzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pZDsgfSlcbiAgICAgICAgICAuaW5kZXhPZihyZXZIYXNoKTtcbiAgICAgICAgdmFyIGhhc2hGb3VuZEF0UmV2UG9zID0gaGFzaEluZGV4ID09PSAocmV2Tm8gLSAxKTtcblxuICAgICAgICBpZiAoaGFzaEZvdW5kQXRSZXZQb3MgfHwgKCFwYXRoICYmIGhhc2hJbmRleCAhPT0gLTEpKSB7XG4gICAgICAgICAgcGF0aCA9IGN1cnJlbnRQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIGVyciA9IG5ldyBFcnJvcignaW52YWxpZCByZXYgdHJlZScpO1xuICAgICAgICBlcnIuZG9jSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleE9mUmV2ID0gcGF0aC5pZHMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LmlkOyB9KVxuICAgICAgICAuaW5kZXhPZihkb2MuX3Jldi5zcGxpdCgnLScpWzFdKSArIDE7XG4gICAgICB2YXIgaG93TWFueSA9IHBhdGguaWRzLmxlbmd0aCAtIGluZGV4T2ZSZXY7XG4gICAgICBwYXRoLmlkcy5zcGxpY2UoaW5kZXhPZlJldiwgaG93TWFueSk7XG4gICAgICBwYXRoLmlkcy5yZXZlcnNlKCk7XG5cbiAgICAgIGlmIChvcHRzLnJldnMpIHtcbiAgICAgICAgZG9jLl9yZXZpc2lvbnMgPSB7XG4gICAgICAgICAgc3RhcnQ6IChwYXRoLnBvcyArIHBhdGguaWRzLmxlbmd0aCkgLSAxLFxuICAgICAgICAgIGlkczogcGF0aC5pZHMubWFwKGZ1bmN0aW9uIChyZXYpIHtcbiAgICAgICAgICAgIHJldHVybiByZXYuaWQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLnJldnNfaW5mbykge1xuICAgICAgICB2YXIgcG9zID0gIHBhdGgucG9zICsgcGF0aC5pZHMubGVuZ3RoO1xuICAgICAgICBkb2MuX3JldnNfaW5mbyA9IHBhdGguaWRzLm1hcChmdW5jdGlvbiAocmV2KSB7XG4gICAgICAgICAgcG9zLS07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJldjogcG9zICsgJy0nICsgcmV2LmlkLFxuICAgICAgICAgICAgc3RhdHVzOiByZXYub3B0cy5zdGF0dXNcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5hdHRhY2htZW50cyAmJiBkb2MuX2F0dGFjaG1lbnRzKSB7XG4gICAgICB2YXIgYXR0YWNobWVudHMgPSBkb2MuX2F0dGFjaG1lbnRzO1xuICAgICAgdmFyIGNvdW50ID0gT2JqZWN0LmtleXMoYXR0YWNobWVudHMpLmxlbmd0aDtcbiAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY2IobnVsbCwgZG9jKTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdGhpcy5fZ2V0QXR0YWNobWVudChkb2MuX2lkLCBrZXksIGF0dGFjaG1lbnRzW2tleV0sIHtcbiAgICAgICAgICAvLyBQcmV2aW91c2x5IHRoZSByZXZpc2lvbiBoYW5kbGluZyB3YXMgZG9uZSBpbiBhZGFwdGVyLmpzXG4gICAgICAgICAgLy8gZ2V0QXR0YWNobWVudCwgaG93ZXZlciBzaW5jZSBpZGItbmV4dCBkb2VzbnQgd2UgbmVlZCB0b1xuICAgICAgICAgIC8vIHBhc3MgdGhlIHJldiB0aHJvdWdoXG4gICAgICAgICAgcmV2OiBkb2MuX3JldixcbiAgICAgICAgICBiaW5hcnk6IG9wdHMuYmluYXJ5LFxuICAgICAgICAgIGN0eDogY3R4XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgICB2YXIgYXR0ID0gZG9jLl9hdHRhY2htZW50c1trZXldO1xuICAgICAgICAgIGF0dC5kYXRhID0gZGF0YTtcbiAgICAgICAgICBkZWxldGUgYXR0LnN0dWI7XG4gICAgICAgICAgZGVsZXRlIGF0dC5sZW5ndGg7XG4gICAgICAgICAgaWYgKCEtLWNvdW50KSB7XG4gICAgICAgICAgICBjYihudWxsLCBkb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCBzZWxmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGRvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9jLl9hdHRhY2htZW50cywga2V5KSkge1xuICAgICAgICAgICAgZG9jLl9hdHRhY2htZW50c1trZXldLnN0dWIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2IobnVsbCwgZG9jKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbi8vIFRPRE86IEkgZG9udCBsaWtlIHRoaXMsIGl0IGZvcmNlcyBhbiBleHRyYSByZWFkIGZvciBldmVyeVxuLy8gYXR0YWNobWVudCByZWFkIGFuZCBlbmZvcmNlcyBhIGNvbmZ1c2luZyBhcGkgYmV0d2VlblxuLy8gYWRhcHRlci5qcyBhbmQgdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUuZ2V0QXR0YWNobWVudCA9XG4gIGFkYXB0ZXJGdW4oJ2dldEF0dGFjaG1lbnQnLCBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaG1lbnRJZCwgb3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAob3B0cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICB0aGlzLl9nZXQoZG9jSWQsIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICBpZiAocmVzLmRvYy5fYXR0YWNobWVudHMgJiYgcmVzLmRvYy5fYXR0YWNobWVudHNbYXR0YWNobWVudElkXSkge1xuICAgICAgb3B0cy5jdHggPSByZXMuY3R4O1xuICAgICAgb3B0cy5iaW5hcnkgPSB0cnVlO1xuICAgICAgc2VsZi5fZ2V0QXR0YWNobWVudChkb2NJZCwgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZG9jLl9hdHRhY2htZW50c1thdHRhY2htZW50SWRdLCBvcHRzLCBjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0RPQykpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5hbGxEb2NzID1cbiAgYWRhcHRlckZ1bignYWxsRG9jcycsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIG9wdHMuc2tpcCA9IHR5cGVvZiBvcHRzLnNraXAgIT09ICd1bmRlZmluZWQnID8gb3B0cy5za2lwIDogMDtcbiAgaWYgKG9wdHMuc3RhcnRfa2V5KSB7XG4gICAgb3B0cy5zdGFydGtleSA9IG9wdHMuc3RhcnRfa2V5O1xuICB9XG4gIGlmIChvcHRzLmVuZF9rZXkpIHtcbiAgICBvcHRzLmVuZGtleSA9IG9wdHMuZW5kX2tleTtcbiAgfVxuICBpZiAoJ2tleXMnIGluIG9wdHMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob3B0cy5rZXlzKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMua2V5cyBtdXN0IGJlIGFuIGFycmF5JykpO1xuICAgIH1cbiAgICB2YXIgaW5jb21wYXRpYmxlT3B0ID1cbiAgICAgIFsnc3RhcnRrZXknLCAnZW5ka2V5JywgJ2tleSddLmZpbHRlcihmdW5jdGlvbiAoaW5jb21wYXRpYmxlT3B0KSB7XG4gICAgICByZXR1cm4gaW5jb21wYXRpYmxlT3B0IGluIG9wdHM7XG4gICAgfSlbMF07XG4gICAgaWYgKGluY29tcGF0aWJsZU9wdCkge1xuICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoUVVFUllfUEFSU0VfRVJST1IsXG4gICAgICAgICdRdWVyeSBwYXJhbWV0ZXIgYCcgKyBpbmNvbXBhdGlibGVPcHQgK1xuICAgICAgICAnYCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG11bHRpLWdldCdcbiAgICAgICkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzUmVtb3RlKHRoaXMpKSB7XG4gICAgICBhbGxEb2NzS2V5c1BhcnNlKG9wdHMpO1xuICAgICAgaWYgKG9wdHMua2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbERvY3Moe2xpbWl0OiAwfSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzLl9hbGxEb2NzKG9wdHMsIGNhbGxiYWNrKTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmNoYW5nZXMgPSBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIC8vIEJ5IGRlZmF1bHQgc2V0IHJldHVybl9kb2NzIHRvIGZhbHNlIGlmIHRoZSBjYWxsZXIgaGFzIG9wdHMubGl2ZSA9IHRydWUsXG4gIC8vIHRoaXMgd2lsbCBwcmV2ZW50IHVzIGZyb20gY29sbGVjdGluZyB0aGUgc2V0IG9mIGNoYW5nZXMgaW5kZWZpbml0ZWx5XG4gIC8vIHJlc3VsdGluZyBpbiBncm93aW5nIG1lbW9yeVxuICBvcHRzLnJldHVybl9kb2NzID0gKCdyZXR1cm5fZG9jcycgaW4gb3B0cykgPyBvcHRzLnJldHVybl9kb2NzIDogIW9wdHMubGl2ZTtcblxuICByZXR1cm4gbmV3IENoYW5nZXMkMSh0aGlzLCBvcHRzLCBjYWxsYmFjayk7XG59O1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmNsb3NlID0gYWRhcHRlckZ1bignY2xvc2UnLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgdGhpcy5lbWl0KCdjbG9zZWQnKTtcbiAgcmV0dXJuIHRoaXMuX2Nsb3NlKGNhbGxiYWNrKTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmluZm8gPSBhZGFwdGVyRnVuKCdpbmZvJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5faW5mbyhmdW5jdGlvbiAoZXJyLCBpbmZvKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIC8vIGFzc3VtZSB3ZSBrbm93IGJldHRlciB0aGFuIHRoZSBhZGFwdGVyLCB1bmxlc3MgaXQgaW5mb3JtcyB1c1xuICAgIGluZm8uZGJfbmFtZSA9IGluZm8uZGJfbmFtZSB8fCBzZWxmLm5hbWU7XG4gICAgaW5mby5hdXRvX2NvbXBhY3Rpb24gPSAhIShzZWxmLmF1dG9fY29tcGFjdGlvbiAmJiAhaXNSZW1vdGUoc2VsZikpO1xuICAgIGluZm8uYWRhcHRlciA9IHNlbGYuYWRhcHRlcjtcbiAgICBjYWxsYmFjayhudWxsLCBpbmZvKTtcbiAgfSk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5pZCA9IGFkYXB0ZXJGdW4oJ2lkJywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pZChjYWxsYmFjayk7XG59KTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbkFic3RyYWN0UG91Y2hEQi5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0eXBlb2YgdGhpcy5fdHlwZSA9PT0gJ2Z1bmN0aW9uJykgPyB0aGlzLl90eXBlKCkgOiB0aGlzLmFkYXB0ZXI7XG59O1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmJ1bGtEb2NzID1cbiAgYWRhcHRlckZ1bignYnVsa0RvY3MnLCBmdW5jdGlvbiAocmVxLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocmVxKSkge1xuICAgIHJlcSA9IHtcbiAgICAgIGRvY3M6IHJlcVxuICAgIH07XG4gIH1cblxuICBpZiAoIXJlcSB8fCAhcmVxLmRvY3MgfHwgIUFycmF5LmlzQXJyYXkocmVxLmRvY3MpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUVycm9yKE1JU1NJTkdfQlVMS19ET0NTKSk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcS5kb2NzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHR5cGVvZiByZXEuZG9jc1tpXSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyZXEuZG9jc1tpXSkpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihOT1RfQU5fT0JKRUNUKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGF0dGFjaG1lbnRFcnJvcjtcbiAgcmVxLmRvY3MuZm9yRWFjaChmdW5jdGlvbiAoZG9jKSB7XG4gICAgaWYgKGRvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXR0YWNobWVudEVycm9yID0gYXR0YWNobWVudEVycm9yIHx8IGF0dGFjaG1lbnROYW1lRXJyb3IobmFtZSk7XG4gICAgICAgIGlmICghZG9jLl9hdHRhY2htZW50c1tuYW1lXS5jb250ZW50X3R5cGUpIHtcbiAgICAgICAgICBndWFyZGVkQ29uc29sZSgnd2FybicsICdBdHRhY2htZW50JywgbmFtZSwgJ29uIGRvY3VtZW50JywgZG9jLl9pZCwgJ2lzIG1pc3NpbmcgY29udGVudF90eXBlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGF0dGFjaG1lbnRFcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihCQURfUkVRVUVTVCwgYXR0YWNobWVudEVycm9yKSk7XG4gIH1cblxuICBpZiAoISgnbmV3X2VkaXRzJyBpbiBvcHRzKSkge1xuICAgIGlmICgnbmV3X2VkaXRzJyBpbiByZXEpIHtcbiAgICAgIG9wdHMubmV3X2VkaXRzID0gcmVxLm5ld19lZGl0cztcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0cy5uZXdfZWRpdHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhZGFwdGVyID0gdGhpcztcbiAgaWYgKCFvcHRzLm5ld19lZGl0cyAmJiAhaXNSZW1vdGUoYWRhcHRlcikpIHtcbiAgICAvLyBlbnN1cmUgcmV2aXNpb25zIG9mIHRoZSBzYW1lIGRvYyBhcmUgc29ydGVkLCBzbyB0aGF0XG4gICAgLy8gdGhlIGxvY2FsIGFkYXB0ZXIgcHJvY2Vzc2VzIHRoZW0gY29ycmVjdGx5ICgjMjkzNSlcbiAgICByZXEuZG9jcy5zb3J0KGNvbXBhcmVCeUlkVGhlblJldik7XG4gIH1cblxuICBjbGVhbkRvY3MocmVxLmRvY3MpO1xuXG4gIC8vIGluIHRoZSBjYXNlIG9mIGNvbmZsaWN0cywgd2Ugd2FudCB0byByZXR1cm4gdGhlIF9pZHMgdG8gdGhlIHVzZXJcbiAgLy8gaG93ZXZlciwgdGhlIHVuZGVybHlpbmcgYWRhcHRlciBtYXkgZGVzdHJveSB0aGUgZG9jcyBhcnJheSwgc29cbiAgLy8gY3JlYXRlIGEgY29weSBoZXJlXG4gIHZhciBpZHMgPSByZXEuZG9jcy5tYXAoZnVuY3Rpb24gKGRvYykge1xuICAgIHJldHVybiBkb2MuX2lkO1xuICB9KTtcblxuICByZXR1cm4gdGhpcy5fYnVsa0RvY3MocmVxLCBvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgaWYgKCFvcHRzLm5ld19lZGl0cykge1xuICAgICAgLy8gdGhpcyBpcyB3aGF0IGNvdWNoIGRvZXMgd2hlbiBuZXdfZWRpdHMgaXMgZmFsc2VcbiAgICAgIHJlcyA9IHJlcy5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHguZXJyb3I7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gYWRkIGlkcyBmb3IgZXJyb3IvY29uZmxpY3QgcmVzcG9uc2VzIChub3QgcmVxdWlyZWQgZm9yIENvdWNoREIpXG4gICAgaWYgKCFpc1JlbW90ZShhZGFwdGVyKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSByZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXS5pZCA9IHJlc1tpXS5pZCB8fCBpZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgfSk7XG59KTtcblxuQWJzdHJhY3RQb3VjaERCLnByb3RvdHlwZS5yZWdpc3RlckRlcGVuZGVudERhdGFiYXNlID1cbiAgYWRhcHRlckZ1bigncmVnaXN0ZXJEZXBlbmRlbnREYXRhYmFzZScsIGZ1bmN0aW9uIChkZXBlbmRlbnREYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykge1xuICB2YXIgZGJPcHRpb25zID0gY2xvbmUodGhpcy5fX29wdHMpO1xuICBpZiAodGhpcy5fX29wdHMudmlld19hZGFwdGVyKSB7XG4gICAgZGJPcHRpb25zLmFkYXB0ZXIgPSB0aGlzLl9fb3B0cy52aWV3X2FkYXB0ZXI7XG4gIH1cblxuICB2YXIgZGVwREIgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihkZXBlbmRlbnREYiwgZGJPcHRpb25zKTtcblxuICBmdW5jdGlvbiBkaWZmRnVuKGRvYykge1xuICAgIGRvYy5kZXBlbmRlbnREYnMgPSBkb2MuZGVwZW5kZW50RGJzIHx8IHt9O1xuICAgIGlmIChkb2MuZGVwZW5kZW50RGJzW2RlcGVuZGVudERiXSkge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyB1cGRhdGUgcmVxdWlyZWRcbiAgICB9XG4gICAgZG9jLmRlcGVuZGVudERic1tkZXBlbmRlbnREYl0gPSB0cnVlO1xuICAgIHJldHVybiBkb2M7XG4gIH1cbiAgdXBzZXJ0KHRoaXMsICdfbG9jYWwvX3BvdWNoX2RlcGVuZGVudERicycsIGRpZmZGdW4pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge2RiOiBkZXBEQn0pO1xuICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbn0pO1xuXG5BYnN0cmFjdFBvdWNoREIucHJvdG90eXBlLmRlc3Ryb3kgPVxuICBhZGFwdGVyRnVuKCdkZXN0cm95JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG5cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHVzZVByZWZpeCA9ICd1c2VfcHJlZml4JyBpbiBzZWxmID8gc2VsZi51c2VfcHJlZml4IDogdHJ1ZTtcblxuICBmdW5jdGlvbiBkZXN0cm95RGIoKSB7XG4gICAgLy8gY2FsbCBkZXN0cm95IG1ldGhvZCBvZiB0aGUgcGFydGljdWxhciBhZGFwdG9yXG4gICAgc2VsZi5fZGVzdHJveShvcHRzLCBmdW5jdGlvbiAoZXJyLCByZXNwKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuICAgICAgc2VsZi5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIHNlbGYuZW1pdCgnZGVzdHJveWVkJyk7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXNwIHx8IHsgJ29rJzogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpc1JlbW90ZShzZWxmKSkge1xuICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGRlcGVuZGVudCBEQnMgaWYgaXQncyBhIHJlbW90ZSBEQlxuICAgIHJldHVybiBkZXN0cm95RGIoKTtcbiAgfVxuXG4gIHNlbGYuZ2V0KCdfbG9jYWwvX3BvdWNoX2RlcGVuZGVudERicycsIGZ1bmN0aW9uIChlcnIsIGxvY2FsRG9jKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgfSBlbHNlIHsgLy8gbm8gZGVwZW5kZW5jaWVzXG4gICAgICAgIHJldHVybiBkZXN0cm95RGIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGRlcGVuZGVudERicyA9IGxvY2FsRG9jLmRlcGVuZGVudERicztcbiAgICB2YXIgUG91Y2hEQiA9IHNlbGYuY29uc3RydWN0b3I7XG4gICAgdmFyIGRlbGV0ZWRNYXAgPSBPYmplY3Qua2V5cyhkZXBlbmRlbnREYnMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgLy8gdXNlX3ByZWZpeCBpcyBvbmx5IGZhbHNlIGluIHRoZSBicm93c2VyXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdmFyIHRydWVOYW1lID0gdXNlUHJlZml4ID9cbiAgICAgICAgbmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJ14nICsgUG91Y2hEQi5wcmVmaXgpLCAnJykgOiBuYW1lO1xuICAgICAgcmV0dXJuIG5ldyBQb3VjaERCKHRydWVOYW1lLCBzZWxmLl9fb3B0cykuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIFByb21pc2UuYWxsKGRlbGV0ZWRNYXApLnRoZW4oZGVzdHJveURiLCBjYWxsYmFjayk7XG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIFRhc2tRdWV1ZSgpIHtcbiAgdGhpcy5pc1JlYWR5ID0gZmFsc2U7XG4gIHRoaXMuZmFpbGVkID0gZmFsc2U7XG4gIHRoaXMucXVldWUgPSBbXTtcbn1cblxuVGFza1F1ZXVlLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZnVuO1xuICBpZiAodGhpcy5mYWlsZWQpIHtcbiAgICB3aGlsZSAoKGZ1biA9IHRoaXMucXVldWUuc2hpZnQoKSkpIHtcbiAgICAgIGZ1bih0aGlzLmZhaWxlZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlICgoZnVuID0gdGhpcy5xdWV1ZS5zaGlmdCgpKSkge1xuICAgICAgZnVuKCk7XG4gICAgfVxuICB9XG59O1xuXG5UYXNrUXVldWUucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbiAoZXJyKSB7XG4gIHRoaXMuZmFpbGVkID0gZXJyO1xuICB0aGlzLmV4ZWN1dGUoKTtcbn07XG5cblRhc2tRdWV1ZS5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiAoZGIpIHtcbiAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcbiAgdGhpcy5kYiA9IGRiO1xuICB0aGlzLmV4ZWN1dGUoKTtcbn07XG5cblRhc2tRdWV1ZS5wcm90b3R5cGUuYWRkVGFzayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgdGhpcy5xdWV1ZS5wdXNoKGZ1bik7XG4gIGlmICh0aGlzLmZhaWxlZCkge1xuICAgIHRoaXMuZXhlY3V0ZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBwYXJzZUFkYXB0ZXIobmFtZSwgb3B0cykge1xuICB2YXIgbWF0Y2ggPSBuYW1lLm1hdGNoKC8oW2Etei1dKik6XFwvXFwvKC4qKS8pO1xuICBpZiAobWF0Y2gpIHtcbiAgICAvLyB0aGUgaHR0cCBhZGFwdGVyIGV4cGVjdHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IC9odHRwcz8vLnRlc3QobWF0Y2hbMV0pID8gbWF0Y2hbMV0gKyAnOi8vJyArIG1hdGNoWzJdIDogbWF0Y2hbMl0sXG4gICAgICBhZGFwdGVyOiBtYXRjaFsxXVxuICAgIH07XG4gIH1cblxuICB2YXIgYWRhcHRlcnMgPSBQb3VjaERCLmFkYXB0ZXJzO1xuICB2YXIgcHJlZmVycmVkQWRhcHRlcnMgPSBQb3VjaERCLnByZWZlcnJlZEFkYXB0ZXJzO1xuICB2YXIgcHJlZml4ID0gUG91Y2hEQi5wcmVmaXg7XG4gIHZhciBhZGFwdGVyTmFtZSA9IG9wdHMuYWRhcHRlcjtcblxuICBpZiAoIWFkYXB0ZXJOYW1lKSB7IC8vIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGFkYXB0ZXJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZlcnJlZEFkYXB0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICBhZGFwdGVyTmFtZSA9IHByZWZlcnJlZEFkYXB0ZXJzW2ldO1xuICAgICAgLy8gY2hlY2sgZm9yIGJyb3dzZXJzIHRoYXQgaGF2ZSBiZWVuIHVwZ3JhZGVkIGZyb20gd2Vic3FsLW9ubHkgdG8gd2Vic3FsK2lkYlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoYWRhcHRlck5hbWUgPT09ICdpZGInICYmICd3ZWJzcWwnIGluIGFkYXB0ZXJzICYmXG4gICAgICAgICAgaGFzTG9jYWxTdG9yYWdlKCkgJiYgbG9jYWxTdG9yYWdlWydfcG91Y2hfX3dlYnNxbGRiXycgKyBwcmVmaXggKyBuYW1lXSkge1xuICAgICAgICAvLyBsb2cgaXQsIGJlY2F1c2UgdGhpcyBjYW4gYmUgY29uZnVzaW5nIGR1cmluZyBkZXZlbG9wbWVudFxuICAgICAgICBndWFyZGVkQ29uc29sZSgnbG9nJywgJ1BvdWNoREIgaXMgZG93bmdyYWRpbmcgXCInICsgbmFtZSArICdcIiB0byBXZWJTUUwgdG8nICtcbiAgICAgICAgICAnIGF2b2lkIGRhdGEgbG9zcywgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBvcGVuZWQgd2l0aCBXZWJTUUwuJyk7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBrZWVwIHVzaW5nIHdlYnNxbCB0byBhdm9pZCB1c2VyIGRhdGEgbG9zc1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFkYXB0ZXIgPSBhZGFwdGVyc1thZGFwdGVyTmFtZV07XG5cbiAgLy8gaWYgYWRhcHRlciBpcyBpbnZhbGlkLCB0aGVuIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGxhdGVyXG4gIHZhciB1c2VQcmVmaXggPSAoYWRhcHRlciAmJiAndXNlX3ByZWZpeCcgaW4gYWRhcHRlcikgP1xuICAgIGFkYXB0ZXIudXNlX3ByZWZpeCA6IHRydWU7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiB1c2VQcmVmaXggPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lLFxuICAgIGFkYXB0ZXI6IGFkYXB0ZXJOYW1lXG4gIH07XG59XG5cbi8vIE9LLCBzbyBoZXJlJ3MgdGhlIGRlYWwuIENvbnNpZGVyIHRoaXMgY29kZTpcbi8vICAgICB2YXIgZGIxID0gbmV3IFBvdWNoREIoJ2ZvbycpO1xuLy8gICAgIHZhciBkYjIgPSBuZXcgUG91Y2hEQignZm9vJyk7XG4vLyAgICAgZGIxLmRlc3Ryb3koKTtcbi8vIF4gdGhlc2UgdHdvIGJvdGggbmVlZCB0byBlbWl0ICdkZXN0cm95ZWQnIGV2ZW50cyxcbi8vIGFzIHdlbGwgYXMgdGhlIFBvdWNoREIgY29uc3RydWN0b3IgaXRzZWxmLlxuLy8gU28gd2UgaGF2ZSBvbmUgZGIgb2JqZWN0ICh3aGljaGV2ZXIgb25lIGdvdCBkZXN0cm95KCkgY2FsbGVkIG9uIGl0KVxuLy8gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIHRoZSBpbml0aWFsIGV2ZW50LCB3aGljaCB0aGVuIGdldHMgZW1pdHRlZFxuLy8gYnkgdGhlIGNvbnN0cnVjdG9yLCB3aGljaCB0aGVuIGJyb2FkY2FzdHMgaXQgdG8gYW55IG90aGVyIGRic1xuLy8gdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lLlxuZnVuY3Rpb24gcHJlcGFyZUZvckRlc3RydWN0aW9uKHNlbGYpIHtcblxuICBmdW5jdGlvbiBvbkRlc3Ryb3llZChmcm9tX2NvbnN0cnVjdG9yKSB7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcignY2xvc2VkJywgb25DbG9zZWQpO1xuICAgIGlmICghZnJvbV9jb25zdHJ1Y3Rvcikge1xuICAgICAgc2VsZi5jb25zdHJ1Y3Rvci5lbWl0KCdkZXN0cm95ZWQnLCBzZWxmLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2xvc2VkKCkge1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveWVkKTtcbiAgICBzZWxmLmNvbnN0cnVjdG9yLmVtaXQoJ3VucmVmJywgc2VsZik7XG4gIH1cblxuICBzZWxmLm9uY2UoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveWVkKTtcbiAgc2VsZi5vbmNlKCdjbG9zZWQnLCBvbkNsb3NlZCk7XG4gIHNlbGYuY29uc3RydWN0b3IuZW1pdCgncmVmJywgc2VsZik7XG59XG5cbmluaGVyaXRzKFBvdWNoREIsIEFic3RyYWN0UG91Y2hEQik7XG5mdW5jdGlvbiBQb3VjaERCKG5hbWUsIG9wdHMpIHtcbiAgLy8gSW4gTm9kZSBvdXIgdGVzdCBzdWl0ZSBvbmx5IHRlc3RzIHRoaXMgZm9yIFBvdWNoQWx0IHVuZm9ydHVuYXRlbHlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb3VjaERCKSkge1xuICAgIHJldHVybiBuZXcgUG91Y2hEQihuYW1lLCBvcHRzKTtcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0cyA9IG5hbWU7XG4gICAgbmFtZSA9IG9wdHMubmFtZTtcbiAgICBkZWxldGUgb3B0cy5uYW1lO1xuICB9XG5cbiAgaWYgKG9wdHMuZGV0ZXJtaW5pc3RpY19yZXZzID09PSB1bmRlZmluZWQpIHtcbiAgICBvcHRzLmRldGVybWluaXN0aWNfcmV2cyA9IHRydWU7XG4gIH1cblxuICB0aGlzLl9fb3B0cyA9IG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICBzZWxmLmF1dG9fY29tcGFjdGlvbiA9IG9wdHMuYXV0b19jb21wYWN0aW9uO1xuICBzZWxmLnByZWZpeCA9IFBvdWNoREIucHJlZml4O1xuXG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcvaW52YWxpZCBEQiBuYW1lJyk7XG4gIH1cblxuICB2YXIgcHJlZml4ZWROYW1lID0gKG9wdHMucHJlZml4IHx8ICcnKSArIG5hbWU7XG4gIHZhciBiYWNrZW5kID0gcGFyc2VBZGFwdGVyKHByZWZpeGVkTmFtZSwgb3B0cyk7XG5cbiAgb3B0cy5uYW1lID0gYmFja2VuZC5uYW1lO1xuICBvcHRzLmFkYXB0ZXIgPSBvcHRzLmFkYXB0ZXIgfHwgYmFja2VuZC5hZGFwdGVyO1xuXG4gIHNlbGYubmFtZSA9IG5hbWU7XG4gIHNlbGYuX2FkYXB0ZXIgPSBvcHRzLmFkYXB0ZXI7XG4gIFBvdWNoREIuZW1pdCgnZGVidWcnLCBbJ2FkYXB0ZXInLCAnUGlja2VkIGFkYXB0ZXI6ICcsIG9wdHMuYWRhcHRlcl0pO1xuXG4gIGlmICghUG91Y2hEQi5hZGFwdGVyc1tvcHRzLmFkYXB0ZXJdIHx8XG4gICAgICAhUG91Y2hEQi5hZGFwdGVyc1tvcHRzLmFkYXB0ZXJdLnZhbGlkKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQWRhcHRlcjogJyArIG9wdHMuYWRhcHRlcik7XG4gIH1cblxuICBpZiAob3B0cy52aWV3X2FkYXB0ZXIpIHtcbiAgICBpZiAoIVBvdWNoREIuYWRhcHRlcnNbb3B0cy52aWV3X2FkYXB0ZXJdIHx8XG4gICAgICAgICFQb3VjaERCLmFkYXB0ZXJzW29wdHMudmlld19hZGFwdGVyXS52YWxpZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVmlldyBBZGFwdGVyOiAnICsgb3B0cy52aWV3X2FkYXB0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIEFic3RyYWN0UG91Y2hEQi5jYWxsKHNlbGYpO1xuICBzZWxmLnRhc2txdWV1ZSA9IG5ldyBUYXNrUXVldWUoKTtcblxuICBzZWxmLmFkYXB0ZXIgPSBvcHRzLmFkYXB0ZXI7XG5cbiAgUG91Y2hEQi5hZGFwdGVyc1tvcHRzLmFkYXB0ZXJdLmNhbGwoc2VsZiwgb3B0cywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBzZWxmLnRhc2txdWV1ZS5mYWlsKGVycik7XG4gICAgfVxuICAgIHByZXBhcmVGb3JEZXN0cnVjdGlvbihzZWxmKTtcblxuICAgIHNlbGYuZW1pdCgnY3JlYXRlZCcsIHNlbGYpO1xuICAgIFBvdWNoREIuZW1pdCgnY3JlYXRlZCcsIHNlbGYubmFtZSk7XG4gICAgc2VsZi50YXNrcXVldWUucmVhZHkoc2VsZik7XG4gIH0pO1xuXG59XG5cbi8vIEFib3J0Q29udHJvbGxlciB3YXMgaW50cm9kdWNlZCBxdWl0ZSBhIHdoaWxlIGFmdGVyIGZldGNoIGFuZFxuLy8gaXNudCByZXF1aXJlZCBmb3IgUG91Y2hEQiB0byBmdW5jdGlvbiBzbyBwb2x5ZmlsbCBpZiBuZWVkZWRcbnZhciBhID0gKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09ICd1bmRlZmluZWQnKVxuICAgID8gQWJvcnRDb250cm9sbGVyXG4gICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiB7YWJvcnQ6IGZ1bmN0aW9uICgpIHt9fTsgfTtcblxudmFyIGYkMSA9IGZldGNoO1xudmFyIGggPSBIZWFkZXJzO1xuXG5Qb3VjaERCLmFkYXB0ZXJzID0ge307XG5Qb3VjaERCLnByZWZlcnJlZEFkYXB0ZXJzID0gW107XG5cblBvdWNoREIucHJlZml4ID0gJ19wb3VjaF8nO1xuXG52YXIgZXZlbnRFbWl0dGVyID0gbmV3IEVFKCk7XG5cbmZ1bmN0aW9uIHNldFVwRXZlbnRFbWl0dGVyKFBvdWNoKSB7XG4gIE9iamVjdC5rZXlzKEVFLnByb3RvdHlwZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKHR5cGVvZiBFRS5wcm90b3R5cGVba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgUG91Y2hba2V5XSA9IGV2ZW50RW1pdHRlcltrZXldLmJpbmQoZXZlbnRFbWl0dGVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHRoZXNlIGFyZSBjcmVhdGVkIGluIGNvbnN0cnVjdG9yLmpzLCBhbmQgYWxsb3cgdXMgdG8gbm90aWZ5IGVhY2ggREIgd2l0aFxuICAvLyB0aGUgc2FtZSBuYW1lIHRoYXQgaXQgd2FzIGRlc3Ryb3llZCwgdmlhIHRoZSBjb25zdHJ1Y3RvciBvYmplY3RcbiAgdmFyIGRlc3RydWN0TGlzdGVuZXJzID0gUG91Y2guX2Rlc3RydWN0aW9uTGlzdGVuZXJzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG5cbiAgUG91Y2gub24oJ3JlZicsIGZ1bmN0aW9uIG9uQ29uc3RydWN0b3JSZWYoZGIpIHtcbiAgICBpZiAoIWRlc3RydWN0TGlzdGVuZXJzLmhhcyhkYi5uYW1lKSkge1xuICAgICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuc2V0KGRiLm5hbWUsIFtdKTtcbiAgICB9XG4gICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuZ2V0KGRiLm5hbWUpLnB1c2goZGIpO1xuICB9KTtcblxuICBQb3VjaC5vbigndW5yZWYnLCBmdW5jdGlvbiBvbkNvbnN0cnVjdG9yVW5yZWYoZGIpIHtcbiAgICBpZiAoIWRlc3RydWN0TGlzdGVuZXJzLmhhcyhkYi5uYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZGJMaXN0ID0gZGVzdHJ1Y3RMaXN0ZW5lcnMuZ2V0KGRiLm5hbWUpO1xuICAgIHZhciBwb3MgPSBkYkxpc3QuaW5kZXhPZihkYik7XG4gICAgaWYgKHBvcyA8IDApIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRiTGlzdC5zcGxpY2UocG9zLCAxKTtcbiAgICBpZiAoZGJMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBkZXN0cnVjdExpc3RlbmVycy5zZXQoZGIubmFtZSwgZGJMaXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuZGVsZXRlKGRiLm5hbWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgUG91Y2gub24oJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uIG9uQ29uc3RydWN0b3JEZXN0cm95ZWQobmFtZSkge1xuICAgIGlmICghZGVzdHJ1Y3RMaXN0ZW5lcnMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBkYkxpc3QgPSBkZXN0cnVjdExpc3RlbmVycy5nZXQobmFtZSk7XG4gICAgZGVzdHJ1Y3RMaXN0ZW5lcnMuZGVsZXRlKG5hbWUpO1xuICAgIGRiTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChkYikge1xuICAgICAgZGIuZW1pdCgnZGVzdHJveWVkJyx0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbnNldFVwRXZlbnRFbWl0dGVyKFBvdWNoREIpO1xuXG5Qb3VjaERCLmFkYXB0ZXIgPSBmdW5jdGlvbiAoaWQsIG9iaiwgYWRkVG9QcmVmZXJyZWRBZGFwdGVycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAob2JqLnZhbGlkKCkpIHtcbiAgICBQb3VjaERCLmFkYXB0ZXJzW2lkXSA9IG9iajtcbiAgICBpZiAoYWRkVG9QcmVmZXJyZWRBZGFwdGVycykge1xuICAgICAgUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycy5wdXNoKGlkKTtcbiAgICB9XG4gIH1cbn07XG5cblBvdWNoREIucGx1Z2luID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBmdW5jdGlvbiBzdHlsZSBmb3IgcGx1Z2luc1xuICAgIG9iaihQb3VjaERCKTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwbHVnaW46IGdvdCBcIicgKyBvYmogKyAnXCIsIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uJyk7XG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgeyAvLyBvYmplY3Qgc3R5bGUgZm9yIHBsdWdpbnNcbiAgICAgIFBvdWNoREIucHJvdG90eXBlW2lkXSA9IG9ialtpZF07XG4gICAgfSk7XG4gIH1cbiAgaWYgKHRoaXMuX19kZWZhdWx0cykge1xuICAgIFBvdWNoREIuX19kZWZhdWx0cyA9ICRpbmplY3RfT2JqZWN0X2Fzc2lnbih7fSwgdGhpcy5fX2RlZmF1bHRzKTtcbiAgfVxuICByZXR1cm4gUG91Y2hEQjtcbn07XG5cblBvdWNoREIuZGVmYXVsdHMgPSBmdW5jdGlvbiAoZGVmYXVsdE9wdHMpIHtcbiAgZnVuY3Rpb24gUG91Y2hBbHQobmFtZSwgb3B0cykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb3VjaEFsdCkpIHtcbiAgICAgIHJldHVybiBuZXcgUG91Y2hBbHQobmFtZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICBpZiAobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9wdHMgPSBuYW1lO1xuICAgICAgbmFtZSA9IG9wdHMubmFtZTtcbiAgICAgIGRlbGV0ZSBvcHRzLm5hbWU7XG4gICAgfVxuXG4gICAgb3B0cyA9ICRpbmplY3RfT2JqZWN0X2Fzc2lnbih7fSwgUG91Y2hBbHQuX19kZWZhdWx0cywgb3B0cyk7XG4gICAgUG91Y2hEQi5jYWxsKHRoaXMsIG5hbWUsIG9wdHMpO1xuICB9XG5cbiAgaW5oZXJpdHMoUG91Y2hBbHQsIFBvdWNoREIpO1xuXG4gIFBvdWNoQWx0LnByZWZlcnJlZEFkYXB0ZXJzID0gUG91Y2hEQi5wcmVmZXJyZWRBZGFwdGVycy5zbGljZSgpO1xuICBPYmplY3Qua2V5cyhQb3VjaERCKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIShrZXkgaW4gUG91Y2hBbHQpKSB7XG4gICAgICBQb3VjaEFsdFtrZXldID0gUG91Y2hEQltrZXldO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgdHJhbnNpdGl2ZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vcG91Y2hkYi9wb3VjaGRiL2lzc3Vlcy81OTIyXG4gIFBvdWNoQWx0Ll9fZGVmYXVsdHMgPSAkaW5qZWN0X09iamVjdF9hc3NpZ24oe30sIHRoaXMuX19kZWZhdWx0cywgZGVmYXVsdE9wdHMpO1xuXG4gIHJldHVybiBQb3VjaEFsdDtcbn07XG5cblBvdWNoREIuZmV0Y2ggPSBmdW5jdGlvbiAodXJsLCBvcHRzKSB7XG4gIHJldHVybiBmJDEodXJsLCBvcHRzKTtcbn07XG5cbi8vIG1hbmFnZWQgYXV0b21hdGljYWxseSBieSBzZXQtdmVyc2lvbi5qc1xudmFyIHZlcnNpb24gPSBcIjcuMy4wXCI7XG5cbi8vIHRoaXMgd291bGQganVzdCBiZSBcInJldHVybiBkb2NbZmllbGRdXCIsIGJ1dCBmaWVsZHNcbi8vIGNhbiBiZSBcImRlZXBcIiBkdWUgdG8gZG90IG5vdGF0aW9uXG5mdW5jdGlvbiBnZXRGaWVsZEZyb21Eb2MoZG9jLCBwYXJzZWRGaWVsZCkge1xuICB2YXIgdmFsdWUgPSBkb2M7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJzZWRGaWVsZC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBrZXkgPSBwYXJzZWRGaWVsZFtpXTtcbiAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZSQxKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xufVxuXG4vLyBDb252ZXJ0cyBhIHN0cmluZyBpbiBkb3Qgbm90YXRpb24gdG8gYW4gYXJyYXkgb2YgaXRzIGNvbXBvbmVudHMsIHdpdGggYmFja3NsYXNoIGVzY2FwaW5nXG5mdW5jdGlvbiBwYXJzZUZpZWxkKGZpZWxkTmFtZSkge1xuICAvLyBmaWVsZHMgbWF5IGJlIGRlZXAgKGUuZy4gXCJmb28uYmFyLmJhelwiKSwgc28gcGFyc2VcbiAgdmFyIGZpZWxkcyA9IFtdO1xuICB2YXIgY3VycmVudCA9ICcnO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZmllbGROYW1lLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGNoID0gZmllbGROYW1lW2ldO1xuICAgIGlmIChpID4gMCAmJiBmaWVsZE5hbWVbaSAtIDFdID09PSAnXFxcXCcgJiYgKGNoID09PSAnJCcgfHwgY2ggPT09ICcuJykpIHtcbiAgICAgIC8vIGVzY2FwZWQgZGVsaW1pdGVyXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5zdWJzdHJpbmcoMCwgY3VycmVudC5sZW5ndGggLSAxKSArIGNoO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09ICcuJykge1xuICAgICAgLy8gV2hlbiBgLmAgaXMgbm90IGVzY2FwZWQgKGFib3ZlKSwgaXQgaXMgYSBmaWVsZCBkZWxpbWl0ZXJcbiAgICAgIGZpZWxkcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgY3VycmVudCA9ICcnO1xuICAgIH0gZWxzZSB7IC8vIG5vcm1hbCBjaGFyYWN0ZXJcbiAgICAgIGN1cnJlbnQgKz0gY2g7XG4gICAgfVxuICB9XG4gIGZpZWxkcy5wdXNoKGN1cnJlbnQpO1xuICByZXR1cm4gZmllbGRzO1xufVxuXG52YXIgY29tYmluYXRpb25GaWVsZHMgPSBbJyRvcicsICckbm9yJywgJyRub3QnXTtcbmZ1bmN0aW9uIGlzQ29tYmluYXRpb25hbEZpZWxkKGZpZWxkKSB7XG4gIHJldHVybiBjb21iaW5hdGlvbkZpZWxkcy5pbmRleE9mKGZpZWxkKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBnZXRLZXkob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopWzBdO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmopIHtcbiAgcmV0dXJuIG9ialtnZXRLZXkob2JqKV07XG59XG5cblxuLy8gZmxhdHRlbiBhbiBhcnJheSBvZiBzZWxlY3RvcnMgam9pbmVkIGJ5IGFuICRhbmQgb3BlcmF0b3JcbmZ1bmN0aW9uIG1lcmdlQW5kZWRTZWxlY3RvcnMoc2VsZWN0b3JzKSB7XG5cbiAgLy8gc29ydCB0byBlbnN1cmUgdGhhdCBlLmcuIGlmIHRoZSB1c2VyIHNwZWNpZmllZFxuICAvLyAkYW5kOiBbeyRndDogJ2EnfSwgeyRndDogJ2InfV0sIHRoZW4gaXQncyBjb2xsYXBzZWQgaW50b1xuICAvLyBqdXN0IHskZ3Q6ICdiJ31cbiAgdmFyIHJlcyA9IHt9O1xuICB2YXIgZmlyc3QgPSB7JG9yOiB0cnVlLCAkbm9yOiB0cnVlfTtcblxuICBzZWxlY3RvcnMuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICBPYmplY3Qua2V5cyhzZWxlY3RvcikuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBtYXRjaGVyID0gc2VsZWN0b3JbZmllbGRdO1xuICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBtYXRjaGVyID0geyRlcTogbWF0Y2hlcn07XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NvbWJpbmF0aW9uYWxGaWVsZChmaWVsZCkpIHtcbiAgICAgICAgLy8gb3IsIG5vclxuICAgICAgICBpZiAobWF0Y2hlciBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgaWYgKGZpcnN0W2ZpZWxkXSkge1xuICAgICAgICAgICAgZmlyc3RbZmllbGRdID0gZmFsc2U7XG4gICAgICAgICAgICByZXNbZmllbGRdID0gbWF0Y2hlcjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICAgIHJlc1tmaWVsZF0uZm9yRWFjaChmdW5jdGlvbiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1hdGNoZXIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICB2YXIgbSA9IG1hdGNoZXJba2V5XTtcbiAgICAgICAgICAgICAgdmFyIGxvbmdlc3QgPSBNYXRoLm1heChPYmplY3Qua2V5cyhleGlzdGluZykubGVuZ3RoLCBPYmplY3Qua2V5cyhtKS5sZW5ndGgpO1xuICAgICAgICAgICAgICB2YXIgbWVyZ2VkID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhbZXhpc3RpbmcsIG1dKTtcbiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1lcmdlZCkubGVuZ3RoIDw9IGxvbmdlc3QpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgc2l0dWF0aW9uIGxpa2U6IChhIDp7JGVxIDoxfSB8fCAuLi4pICYmIChhIHskZXE6IDJ9IHx8IC4uLilcbiAgICAgICAgICAgICAgICAvLyBtZXJnaW5nIHdvdWxkIHByb2R1Y2UgYSAkZXEgMiB3aGVuIGFjdHVhbGx5IHdlIHNob3VsZG4ndCBldmVyIG1hdGNoIGFnYWluc3QgdGhlc2UgbWVyZ2VkIGNvbmRpdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBtZXJnZWQgc2hvdWxkIGFsd2F5cyBjb250YWluIG1vcmUgdmFsdWVzIHRvIGJlIHZhbGlkXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaChtZXJnZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzW2ZpZWxkXSA9IGVudHJpZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm90XG4gICAgICAgICAgcmVzW2ZpZWxkXSA9IG1lcmdlQW5kZWRTZWxlY3RvcnMoW21hdGNoZXJdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGZpZWxkTWF0Y2hlcnMgPSByZXNbZmllbGRdID0gcmVzW2ZpZWxkXSB8fCB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMobWF0Y2hlcikuZm9yRWFjaChmdW5jdGlvbiAob3BlcmF0b3IpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBtYXRjaGVyW29wZXJhdG9yXTtcblxuICAgICAgICAgIGlmIChvcGVyYXRvciA9PT0gJyRndCcgfHwgb3BlcmF0b3IgPT09ICckZ3RlJykge1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlR3RHdGUob3BlcmF0b3IsIHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSAnJGx0JyB8fCBvcGVyYXRvciA9PT0gJyRsdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VMdEx0ZShvcGVyYXRvciwgdmFsdWUsIGZpZWxkTWF0Y2hlcnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09ICckbmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VOZSh2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gJyRlcScpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUVxKHZhbHVlLCBmaWVsZE1hdGNoZXJzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBcIiRyZWdleFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VSZWdleCh2YWx1ZSwgZmllbGRNYXRjaGVycyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkTWF0Y2hlcnNbb3BlcmF0b3JdID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufVxuXG5cblxuLy8gY29sbGFwc2UgbG9naWNhbGx5IGVxdWl2YWxlbnQgZ3QvZ3RlIHZhbHVlc1xuZnVuY3Rpb24gbWVyZ2VHdEd0ZShvcGVyYXRvciwgdmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRlcSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47IC8vIGRvIG5vdGhpbmdcbiAgfVxuICBpZiAodHlwZW9mIGZpZWxkTWF0Y2hlcnMuJGd0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckZ3RlJykge1xuICAgICAgaWYgKHZhbHVlID4gZmllbGRNYXRjaGVycy4kZ3RlKSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZmllbGRNYXRjaGVycy4kZ3RlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gb3BlcmF0b3IgPT09ICckZ3QnXG4gICAgICBpZiAodmFsdWUgPj0gZmllbGRNYXRjaGVycy4kZ3RlKSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGd0ZTtcbiAgICAgICAgZmllbGRNYXRjaGVycy4kZ3QgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkTWF0Y2hlcnMuJGd0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvcGVyYXRvciA9PT0gJyRndGUnKSB7XG4gICAgICBpZiAodmFsdWUgPiBmaWVsZE1hdGNoZXJzLiRndCkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRndDtcbiAgICAgICAgZmllbGRNYXRjaGVycy4kZ3RlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gb3BlcmF0b3IgPT09ICckZ3QnXG4gICAgICBpZiAodmFsdWUgPiBmaWVsZE1hdGNoZXJzLiRndCkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGd0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpZWxkTWF0Y2hlcnNbb3BlcmF0b3JdID0gdmFsdWU7XG4gIH1cbn1cblxuLy8gY29sbGFwc2UgbG9naWNhbGx5IGVxdWl2YWxlbnQgbHQvbHRlIHZhbHVlc1xuZnVuY3Rpb24gbWVyZ2VMdEx0ZShvcGVyYXRvciwgdmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgaWYgKHR5cGVvZiBmaWVsZE1hdGNoZXJzLiRlcSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47IC8vIGRvIG5vdGhpbmdcbiAgfVxuICBpZiAodHlwZW9mIGZpZWxkTWF0Y2hlcnMuJGx0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob3BlcmF0b3IgPT09ICckbHRlJykge1xuICAgICAgaWYgKHZhbHVlIDwgZmllbGRNYXRjaGVycy4kbHRlKSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZmllbGRNYXRjaGVycy4kbHRlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gb3BlcmF0b3IgPT09ICckZ3QnXG4gICAgICBpZiAodmFsdWUgPD0gZmllbGRNYXRjaGVycy4kbHRlKSB7IC8vIG1vcmUgc3BlY2lmaWNpdHlcbiAgICAgICAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGx0ZTtcbiAgICAgICAgZmllbGRNYXRjaGVycy4kbHQgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkTWF0Y2hlcnMuJGx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvcGVyYXRvciA9PT0gJyRsdGUnKSB7XG4gICAgICBpZiAodmFsdWUgPCBmaWVsZE1hdGNoZXJzLiRsdCkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdDtcbiAgICAgICAgZmllbGRNYXRjaGVycy4kbHRlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gb3BlcmF0b3IgPT09ICckZ3QnXG4gICAgICBpZiAodmFsdWUgPCBmaWVsZE1hdGNoZXJzLiRsdCkgeyAvLyBtb3JlIHNwZWNpZmljaXR5XG4gICAgICAgIGZpZWxkTWF0Y2hlcnMuJGx0ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpZWxkTWF0Y2hlcnNbb3BlcmF0b3JdID0gdmFsdWU7XG4gIH1cbn1cblxuLy8gY29tYmluZSAkbmUgdmFsdWVzIGludG8gb25lIGFycmF5XG5mdW5jdGlvbiBtZXJnZU5lKHZhbHVlLCBmaWVsZE1hdGNoZXJzKSB7XG4gIGlmICgnJG5lJyBpbiBmaWVsZE1hdGNoZXJzKSB7XG4gICAgLy8gdGhlcmUgYXJlIG1hbnkgdGhpbmdzIHRoaXMgY291bGQgXCJub3RcIiBiZVxuICAgIGZpZWxkTWF0Y2hlcnMuJG5lLnB1c2godmFsdWUpO1xuICB9IGVsc2UgeyAvLyBkb2Vzbid0IGV4aXN0IHlldFxuICAgIGZpZWxkTWF0Y2hlcnMuJG5lID0gW3ZhbHVlXTtcbiAgfVxufVxuXG4vLyBhZGQgJGVxIGludG8gdGhlIG1peFxuZnVuY3Rpb24gbWVyZ2VFcSh2YWx1ZSwgZmllbGRNYXRjaGVycykge1xuICAvLyB0aGVzZSBhbGwgaGF2ZSBsZXNzIHNwZWNpZmljaXR5IHRoYW4gdGhlICRlcVxuICAvLyBUT0RPOiBjaGVjayBmb3IgdXNlciBlcnJvcnMgaGVyZVxuICBkZWxldGUgZmllbGRNYXRjaGVycy4kZ3Q7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRndGU7XG4gIGRlbGV0ZSBmaWVsZE1hdGNoZXJzLiRsdDtcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJGx0ZTtcbiAgZGVsZXRlIGZpZWxkTWF0Y2hlcnMuJG5lO1xuICBmaWVsZE1hdGNoZXJzLiRlcSA9IHZhbHVlO1xufVxuXG4vLyBjb21iaW5lICRyZWdleCB2YWx1ZXMgaW50byBvbmUgYXJyYXlcbmZ1bmN0aW9uIG1lcmdlUmVnZXgodmFsdWUsIGZpZWxkTWF0Y2hlcnMpIHtcbiAgaWYgKCckcmVnZXgnIGluIGZpZWxkTWF0Y2hlcnMpIHtcbiAgICAvLyBhIHZhbHVlIGNvdWxkIG1hdGNoIG11bHRpcGxlIHJlZ2V4ZXNcbiAgICBmaWVsZE1hdGNoZXJzLiRyZWdleC5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIHsgLy8gZG9lc24ndCBleGlzdCB5ZXRcbiAgICBmaWVsZE1hdGNoZXJzLiRyZWdleCA9IFt2YWx1ZV07XG4gIH1cbn1cblxuLy8jNzQ1ODogZXhlY3V0ZSBmdW5jdGlvbiBtZXJnZUFuZGVkU2VsZWN0b3JzIG9uIG5lc3RlZCAkYW5kXG5mdW5jdGlvbiBtZXJnZUFuZGVkU2VsZWN0b3JzTmVzdGVkKG9iaikge1xuICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9ialtpXVsnJGFuZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtpXSA9IG1lcmdlQW5kZWRTZWxlY3RvcnMob2JqW2ldWyckYW5kJ10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWUgPSBvYmpbcHJvcF07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBtZXJnZUFuZGVkU2VsZWN0b3JzTmVzdGVkKHZhbHVlKTsgLy8gPC0gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuXG4vLyM3NDU4OiBkZXRlcm1pbmUgaWQgJGFuZCBpcyBwcmVzZW50IGluIHNlbGVjdG9yIChhdCBhbnkgbGV2ZWwpXG5mdW5jdGlvbiBpc0FuZEluU2VsZWN0b3Iob2JqLCBpc0FuZCkge1xuICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgICAgIGlmIChwcm9wID09PSAnJGFuZCcpIHtcbiAgICAgICAgICAgIGlzQW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWUgPSBvYmpbcHJvcF07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpc0FuZCA9IGlzQW5kSW5TZWxlY3Rvcih2YWx1ZSwgaXNBbmQpOyAvLyA8LSByZWN1cnNpdmUgY2FsbFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc0FuZDtcbn1cblxuLy9cbi8vIG5vcm1hbGl6ZSB0aGUgc2VsZWN0b3Jcbi8vXG5mdW5jdGlvbiBtYXNzYWdlU2VsZWN0b3IoaW5wdXQpIHtcbiAgdmFyIHJlc3VsdCA9IGNsb25lKGlucHV0KTtcbiAgdmFyIHdhc0FuZGVkID0gZmFsc2U7XG4gICAgLy8jNzQ1ODogaWYgJGFuZCBpcyBwcmVzZW50IGluIHNlbGVjdG9yIChhdCBhbnkgbGV2ZWwpIG1lcmdlIG5lc3RlZCAkYW5kXG4gICAgaWYgKGlzQW5kSW5TZWxlY3RvcihyZXN1bHQsIGZhbHNlKSkge1xuICAgICAgICByZXN1bHQgPSBtZXJnZUFuZGVkU2VsZWN0b3JzTmVzdGVkKHJlc3VsdCk7XG4gICAgICAgIGlmICgnJGFuZCcgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBtZXJnZUFuZGVkU2VsZWN0b3JzKHJlc3VsdFsnJGFuZCddKTtcbiAgICAgICAgfVxuICAgICAgICB3YXNBbmRlZCA9IHRydWU7XG4gICAgfVxuXG4gIFsnJG9yJywgJyRub3InXS5mb3JFYWNoKGZ1bmN0aW9uIChvck9yTm9yKSB7XG4gICAgaWYgKG9yT3JOb3IgaW4gcmVzdWx0KSB7XG4gICAgICAvLyBtZXNzYWdlIGVhY2ggaW5kaXZpZHVhbCBzZWxlY3RvclxuICAgICAgLy8gZS5nLiB7Zm9vOiAnYmFyJ30gYmVjb21lcyB7Zm9vOiB7JGVxOiAnYmFyJ319XG4gICAgICByZXN1bHRbb3JPck5vcl0uZm9yRWFjaChmdW5jdGlvbiAoc3ViU2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGZpZWxkcyA9IE9iamVjdC5rZXlzKHN1YlNlbGVjdG9yKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgICAgdmFyIG1hdGNoZXIgPSBzdWJTZWxlY3RvcltmaWVsZF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyICE9PSAnb2JqZWN0JyB8fCBtYXRjaGVyID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdWJTZWxlY3RvcltmaWVsZF0gPSB7JGVxOiBtYXRjaGVyfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKCckbm90JyBpbiByZXN1bHQpIHtcbiAgICAvL1RoaXMgZmVlbHMgYSBsaXR0bGUgbGlrZSBmb3JjaW5nLCBidXQgaXQgd2lsbCB3b3JrIGZvciBub3csXG4gICAgLy9JIHdvdWxkIGxpa2UgdG8gY29tZSBiYWNrIHRvIHRoaXMgYW5kIG1ha2UgdGhlIG1lcmdpbmcgb2Ygc2VsZWN0b3JzIGEgbGl0dGxlIG1vcmUgZ2VuZXJpY1xuICAgIHJlc3VsdFsnJG5vdCddID0gbWVyZ2VBbmRlZFNlbGVjdG9ycyhbcmVzdWx0Wyckbm90J11dKTtcbiAgfVxuXG4gIHZhciBmaWVsZHMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgIHZhciBtYXRjaGVyID0gcmVzdWx0W2ZpZWxkXTtcblxuICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ29iamVjdCcgfHwgbWF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgbWF0Y2hlciA9IHskZXE6IG1hdGNoZXJ9O1xuICAgIH0gZWxzZSBpZiAoIXdhc0FuZGVkKSB7XG4gICAgICAvLyBUaGVzZSB2YWx1ZXMgbXVzdCBiZSBwbGFjZWQgaW4gYW4gYXJyYXkgYmVjYXVzZSB0aGVzZSBvcGVyYXRvcnMgY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgZmllbGRcbiAgICAgIC8vIHdoZW4gJGFuZCBpcyB1c2VkLCBtZXJnZUFuZGVkU2VsZWN0b3JzIHRha2VzIGNhcmUgb2YgcHV0dGluZyB0aGVtIGludG8gYXJyYXlzLCBvdGhlcndpc2UgaXQncyBkb25lIGhlcmU6XG4gICAgICBpZiAoJyRuZScgaW4gbWF0Y2hlcikge1xuICAgICAgICBtYXRjaGVyLiRuZSA9IFttYXRjaGVyLiRuZV07XG4gICAgICB9XG4gICAgICBpZiAoJyRyZWdleCcgaW4gbWF0Y2hlcikge1xuICAgICAgICBtYXRjaGVyLiRyZWdleCA9IFttYXRjaGVyLiRyZWdleF07XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdFtmaWVsZF0gPSBtYXRjaGVyO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcGFkKHN0ciwgcGFkV2l0aCwgdXBUb0xlbmd0aCkge1xuICB2YXIgcGFkZGluZyA9ICcnO1xuICB2YXIgdGFyZ2V0TGVuZ3RoID0gdXBUb0xlbmd0aCAtIHN0ci5sZW5ndGg7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHdoaWxlIChwYWRkaW5nLmxlbmd0aCA8IHRhcmdldExlbmd0aCkge1xuICAgIHBhZGRpbmcgKz0gcGFkV2l0aDtcbiAgfVxuICByZXR1cm4gcGFkZGluZztcbn1cblxuZnVuY3Rpb24gcGFkTGVmdChzdHIsIHBhZFdpdGgsIHVwVG9MZW5ndGgpIHtcbiAgdmFyIHBhZGRpbmcgPSBwYWQoc3RyLCBwYWRXaXRoLCB1cFRvTGVuZ3RoKTtcbiAgcmV0dXJuIHBhZGRpbmcgKyBzdHI7XG59XG5cbnZhciBNSU5fTUFHTklUVURFID0gLTMyNDsgLy8gdmVyaWZpZWQgYnkgLU51bWJlci5NSU5fVkFMVUVcbnZhciBNQUdOSVRVREVfRElHSVRTID0gMzsgLy8gZGl0dG9cbnZhciBTRVAgPSAnJzsgLy8gc2V0IHRvICdfJyBmb3IgZWFzaWVyIGRlYnVnZ2luZ1xuXG5mdW5jdGlvbiBjb2xsYXRlKGEsIGIpIHtcblxuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgYSA9IG5vcm1hbGl6ZUtleShhKTtcbiAgYiA9IG5vcm1hbGl6ZUtleShiKTtcblxuICB2YXIgYWkgPSBjb2xsYXRpb25JbmRleChhKTtcbiAgdmFyIGJpID0gY29sbGF0aW9uSW5kZXgoYik7XG4gIGlmICgoYWkgLSBiaSkgIT09IDApIHtcbiAgICByZXR1cm4gYWkgLSBiaTtcbiAgfVxuICBzd2l0Y2ggKHR5cGVvZiBhKSB7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogMTtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHN0cmluZ0NvbGxhdGUoYSwgYik7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYSkgPyBhcnJheUNvbGxhdGUoYSwgYikgOiBvYmplY3RDb2xsYXRlKGEsIGIpO1xufVxuXG4vLyBjb3VjaCBjb25zaWRlcnMgbnVsbC9OYU4vSW5maW5pdHkvLUluZmluaXR5ID09PSB1bmRlZmluZWQsXG4vLyBmb3IgdGhlIHB1cnBvc2VzIG9mIG1hcHJlZHVjZSBpbmRleGVzLiBhbHNvLCBkYXRlcyBnZXQgc3RyaW5naWZpZWQuXG5mdW5jdGlvbiBub3JtYWxpemVLZXkoa2V5KSB7XG4gIHN3aXRjaCAodHlwZW9mIGtleSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgaWYgKGtleSA9PT0gSW5maW5pdHkgfHwga2V5ID09PSAtSW5maW5pdHkgfHwgaXNOYU4oa2V5KSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXk7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHZhciBvcmlnS2V5ID0ga2V5O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICB2YXIgbGVuID0ga2V5Lmxlbmd0aDtcbiAgICAgICAga2V5ID0gbmV3IEFycmF5KGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBrZXlbaV0gPSBub3JtYWxpemVLZXkob3JpZ0tleVtpXSk7XG4gICAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB9IGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuIGtleS50b0pTT04oKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBudWxsKSB7IC8vIGdlbmVyaWMgb2JqZWN0XG4gICAgICAgIGtleSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrIGluIG9yaWdLZXkpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9yaWdLZXksIGspKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gb3JpZ0tleVtrXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBrZXlba10gPSBub3JtYWxpemVLZXkodmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICByZXR1cm4ga2V5O1xufVxuXG5mdW5jdGlvbiBpbmRleGlmeShrZXkpIHtcbiAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgIHN3aXRjaCAodHlwZW9mIGtleSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiBrZXkgPyAxIDogMDtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiBudW1Ub0luZGV4YWJsZVN0cmluZyhrZXkpO1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgLy8gV2UndmUgdG8gYmUgc3VyZSB0aGF0IGtleSBkb2VzIG5vdCBjb250YWluIFxcdTAwMDBcbiAgICAgICAgLy8gRG8gb3JkZXItcHJlc2VydmluZyByZXBsYWNlbWVudHM6XG4gICAgICAgIC8vIDAgLT4gMSwgMVxuICAgICAgICAvLyAxIC0+IDEsIDJcbiAgICAgICAgLy8gMiAtPiAyLCAyXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cbiAgICAgICAgcmV0dXJuIGtleVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAyL2csICdcXHUwMDAyXFx1MDAwMicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDEvZywgJ1xcdTAwMDFcXHUwMDAyJylcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMC9nLCAnXFx1MDAwMVxcdTAwMDEnKTtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoa2V5KTtcbiAgICAgICAgdmFyIGFyciA9IGlzQXJyYXkgPyBrZXkgOiBPYmplY3Qua2V5cyhrZXkpO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0luZGV4YWJsZVN0cmluZyhhcnJbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICB2YXIgb2JqS2V5ID0gYXJyW2ldO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvSW5kZXhhYmxlU3RyaW5nKG9iaktleSkgK1xuICAgICAgICAgICAgICAgIHRvSW5kZXhhYmxlU3RyaW5nKGtleVtvYmpLZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vLyBjb252ZXJ0IHRoZSBnaXZlbiBrZXkgdG8gYSBzdHJpbmcgdGhhdCB3b3VsZCBiZSBhcHByb3ByaWF0ZVxuLy8gZm9yIGxleGljYWwgc29ydGluZywgZS5nLiB3aXRoaW4gYSBkYXRhYmFzZSwgd2hlcmUgdGhlXG4vLyBzb3J0aW5nIGlzIHRoZSBzYW1lIGdpdmVuIGJ5IHRoZSBjb2xsYXRlKCkgZnVuY3Rpb24uXG5mdW5jdGlvbiB0b0luZGV4YWJsZVN0cmluZyhrZXkpIHtcbiAgdmFyIHplcm8gPSAnXFx1MDAwMCc7XG4gIGtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuICByZXR1cm4gY29sbGF0aW9uSW5kZXgoa2V5KSArIFNFUCArIGluZGV4aWZ5KGtleSkgKyB6ZXJvO1xufVxuXG5mdW5jdGlvbiBwYXJzZU51bWJlcihzdHIsIGkpIHtcbiAgdmFyIG9yaWdpbmFsSWR4ID0gaTtcbiAgdmFyIG51bTtcbiAgdmFyIHplcm8gPSBzdHJbaV0gPT09ICcxJztcbiAgaWYgKHplcm8pIHtcbiAgICBudW0gPSAwO1xuICAgIGkrKztcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmVnID0gc3RyW2ldID09PSAnMCc7XG4gICAgaSsrO1xuICAgIHZhciBudW1Bc1N0cmluZyA9ICcnO1xuICAgIHZhciBtYWdBc1N0cmluZyA9IHN0ci5zdWJzdHJpbmcoaSwgaSArIE1BR05JVFVERV9ESUdJVFMpO1xuICAgIHZhciBtYWduaXR1ZGUgPSBwYXJzZUludChtYWdBc1N0cmluZywgMTApICsgTUlOX01BR05JVFVERTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChuZWcpIHtcbiAgICAgIG1hZ25pdHVkZSA9IC1tYWduaXR1ZGU7XG4gICAgfVxuICAgIGkgKz0gTUFHTklUVURFX0RJR0lUUztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIGNoID0gc3RyW2ldO1xuICAgICAgaWYgKGNoID09PSAnXFx1MDAwMCcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1Bc1N0cmluZyArPSBjaDtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgbnVtQXNTdHJpbmcgPSBudW1Bc1N0cmluZy5zcGxpdCgnLicpO1xuICAgIGlmIChudW1Bc1N0cmluZy5sZW5ndGggPT09IDEpIHtcbiAgICAgIG51bSA9IHBhcnNlSW50KG51bUFzU3RyaW5nLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBudW0gPSBwYXJzZUZsb2F0KG51bUFzU3RyaW5nWzBdICsgJy4nICsgbnVtQXNTdHJpbmdbMV0pO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChuZWcpIHtcbiAgICAgIG51bSA9IG51bSAtIDEwO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChtYWduaXR1ZGUgIT09IDApIHtcbiAgICAgIC8vIHBhcnNlRmxvYXQgaXMgbW9yZSByZWxpYWJsZSB0aGFuIHBvdyBkdWUgdG8gcm91bmRpbmcgZXJyb3JzXG4gICAgICAvLyBlLmcuIE51bWJlci5NQVhfVkFMVUUgd291bGQgcmV0dXJuIEluZmluaXR5IGlmIHdlIGRpZFxuICAgICAgLy8gbnVtICogTWF0aC5wb3coMTAsIG1hZ25pdHVkZSk7XG4gICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSArICdlJyArIG1hZ25pdHVkZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7bnVtOiBudW0sIGxlbmd0aCA6IGkgLSBvcmlnaW5hbElkeH07XG59XG5cbi8vIG1vdmUgdXAgdGhlIHN0YWNrIHdoaWxlIHBhcnNpbmdcbi8vIHRoaXMgZnVuY3Rpb24gbW92ZWQgb3V0c2lkZSBvZiBwYXJzZUluZGV4YWJsZVN0cmluZyBmb3IgcGVyZm9ybWFuY2VcbmZ1bmN0aW9uIHBvcChzdGFjaywgbWV0YVN0YWNrKSB7XG4gIHZhciBvYmogPSBzdGFjay5wb3AoKTtcblxuICBpZiAobWV0YVN0YWNrLmxlbmd0aCkge1xuICAgIHZhciBsYXN0TWV0YUVsZW1lbnQgPSBtZXRhU3RhY2tbbWV0YVN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGlmIChvYmogPT09IGxhc3RNZXRhRWxlbWVudC5lbGVtZW50KSB7XG4gICAgICAvLyBwb3BwaW5nIGEgbWV0YS1lbGVtZW50LCBlLmcuIGFuIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyBhbm90aGVyIG9iamVjdFxuICAgICAgbWV0YVN0YWNrLnBvcCgpO1xuICAgICAgbGFzdE1ldGFFbGVtZW50ID0gbWV0YVN0YWNrW21ldGFTdGFjay5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnQgPSBsYXN0TWV0YUVsZW1lbnQuZWxlbWVudDtcbiAgICB2YXIgbGFzdEVsZW1lbnRJbmRleCA9IGxhc3RNZXRhRWxlbWVudC5pbmRleDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5wdXNoKG9iaik7XG4gICAgfSBlbHNlIGlmIChsYXN0RWxlbWVudEluZGV4ID09PSBzdGFjay5sZW5ndGggLSAyKSB7IC8vIG9iaiB3aXRoIGtleSt2YWx1ZVxuICAgICAgdmFyIGtleSA9IHN0YWNrLnBvcCgpO1xuICAgICAgZWxlbWVudFtrZXldID0gb2JqO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFjay5wdXNoKG9iaik7IC8vIG9iaiB3aXRoIGtleSBvbmx5XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5kZXhhYmxlU3RyaW5nKHN0cikge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG1ldGFTdGFjayA9IFtdOyAvLyBzdGFjayBmb3IgYXJyYXlzIGFuZCBvYmplY3RzXG4gIHZhciBpID0gMDtcblxuICAvKmVzbGludCBuby1jb25zdGFudC1jb25kaXRpb246IFtcImVycm9yXCIsIHsgXCJjaGVja0xvb3BzXCI6IGZhbHNlIH1dKi9cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgY29sbGF0aW9uSW5kZXggPSBzdHJbaSsrXTtcbiAgICBpZiAoY29sbGF0aW9uSW5kZXggPT09ICdcXHUwMDAwJykge1xuICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gc3RhY2sucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3Aoc3RhY2ssIG1ldGFTdGFjayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKGNvbGxhdGlvbkluZGV4KSB7XG4gICAgICBjYXNlICcxJzpcbiAgICAgICAgc3RhY2sucHVzaChudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcyJzpcbiAgICAgICAgc3RhY2sucHVzaChzdHJbaV0gPT09ICcxJyk7XG4gICAgICAgIGkrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICczJzpcbiAgICAgICAgdmFyIHBhcnNlZE51bSA9IHBhcnNlTnVtYmVyKHN0ciwgaSk7XG4gICAgICAgIHN0YWNrLnB1c2gocGFyc2VkTnVtLm51bSk7XG4gICAgICAgIGkgKz0gcGFyc2VkTnVtLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc0JzpcbiAgICAgICAgdmFyIHBhcnNlZFN0ciA9ICcnO1xuICAgICAgICAvKmVzbGludCBuby1jb25zdGFudC1jb25kaXRpb246IFtcImVycm9yXCIsIHsgXCJjaGVja0xvb3BzXCI6IGZhbHNlIH1dKi9cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICB2YXIgY2ggPSBzdHJbaV07XG4gICAgICAgICAgaWYgKGNoID09PSAnXFx1MDAwMCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJzZWRTdHIgKz0gY2g7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vIHBlcmZvcm0gdGhlIHJldmVyc2Ugb2YgdGhlIG9yZGVyLXByZXNlcnZpbmcgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gYWxnb3JpdGhtIChzZWUgYWJvdmUpXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cbiAgICAgICAgcGFyc2VkU3RyID0gcGFyc2VkU3RyLnJlcGxhY2UoL1xcdTAwMDFcXHUwMDAxL2csICdcXHUwMDAwJylcbiAgICAgICAgICAucmVwbGFjZSgvXFx1MDAwMVxcdTAwMDIvZywgJ1xcdTAwMDEnKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHUwMDAyXFx1MDAwMi9nLCAnXFx1MDAwMicpO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cbiAgICAgICAgc3RhY2sucHVzaChwYXJzZWRTdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzUnOlxuICAgICAgICB2YXIgYXJyYXlFbGVtZW50ID0geyBlbGVtZW50OiBbXSwgaW5kZXg6IHN0YWNrLmxlbmd0aCB9O1xuICAgICAgICBzdGFjay5wdXNoKGFycmF5RWxlbWVudC5lbGVtZW50KTtcbiAgICAgICAgbWV0YVN0YWNrLnB1c2goYXJyYXlFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc2JzpcbiAgICAgICAgdmFyIG9iakVsZW1lbnQgPSB7IGVsZW1lbnQ6IHt9LCBpbmRleDogc3RhY2subGVuZ3RoIH07XG4gICAgICAgIHN0YWNrLnB1c2gob2JqRWxlbWVudC5lbGVtZW50KTtcbiAgICAgICAgbWV0YVN0YWNrLnB1c2gob2JqRWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYmFkIGNvbGxhdGlvbkluZGV4IG9yIHVuZXhwZWN0ZWRseSByZWFjaGVkIGVuZCBvZiBpbnB1dDogJyArXG4gICAgICAgICAgICBjb2xsYXRpb25JbmRleCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFycmF5Q29sbGF0ZShhLCBiKSB7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIHNvcnQgPSBjb2xsYXRlKGFbaV0sIGJbaV0pO1xuICAgIGlmIChzb3J0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gc29ydDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpID8gMCA6XG4gICAgKGEubGVuZ3RoID4gYi5sZW5ndGgpID8gMSA6IC0xO1xufVxuZnVuY3Rpb24gc3RyaW5nQ29sbGF0ZShhLCBiKSB7XG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhbGVoYXJ2ZXkvcG91Y2hkYi9pc3N1ZXMvNDBcbiAgLy8gVGhpcyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ291Y2hEQiBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0cyB0aGVcbiAgLy8gYmVzdCB3ZSBjYW4gZG8gZm9yIG5vd1xuICByZXR1cm4gKGEgPT09IGIpID8gMCA6ICgoYSA+IGIpID8gMSA6IC0xKTtcbn1cbmZ1bmN0aW9uIG9iamVjdENvbGxhdGUoYSwgYikge1xuICB2YXIgYWsgPSBPYmplY3Qua2V5cyhhKSwgYmsgPSBPYmplY3Qua2V5cyhiKTtcbiAgdmFyIGxlbiA9IE1hdGgubWluKGFrLmxlbmd0aCwgYmsubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIC8vIEZpcnN0IHNvcnQgdGhlIGtleXNcbiAgICB2YXIgc29ydCA9IGNvbGxhdGUoYWtbaV0sIGJrW2ldKTtcbiAgICBpZiAoc29ydCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHNvcnQ7XG4gICAgfVxuICAgIC8vIGlmIHRoZSBrZXlzIGFyZSBlcXVhbCBzb3J0IHRoZSB2YWx1ZXNcbiAgICBzb3J0ID0gY29sbGF0ZShhW2FrW2ldXSwgYltia1tpXV0pO1xuICAgIGlmIChzb3J0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gc29ydDtcbiAgICB9XG5cbiAgfVxuICByZXR1cm4gKGFrLmxlbmd0aCA9PT0gYmsubGVuZ3RoKSA/IDAgOlxuICAgIChhay5sZW5ndGggPiBiay5sZW5ndGgpID8gMSA6IC0xO1xufVxuLy8gVGhlIGNvbGxhdGlvbiBpcyBkZWZpbmVkIGJ5IGVybGFuZ3Mgb3JkZXJlZCB0ZXJtc1xuLy8gdGhlIGF0b21zIG51bGwsIHRydWUsIGZhbHNlIGNvbWUgZmlyc3QsIHRoZW4gbnVtYmVycywgc3RyaW5ncyxcbi8vIGFycmF5cywgdGhlbiBvYmplY3RzXG4vLyBudWxsL3VuZGVmaW5lZC9OYU4vSW5maW5pdHkvLUluZmluaXR5IGFyZSBhbGwgY29uc2lkZXJlZCBudWxsXG5mdW5jdGlvbiBjb2xsYXRpb25JbmRleCh4KSB7XG4gIHZhciBpZCA9IFsnYm9vbGVhbicsICdudW1iZXInLCAnc3RyaW5nJywgJ29iamVjdCddO1xuICB2YXIgaWR4ID0gaWQuaW5kZXhPZih0eXBlb2YgeCk7XG4gIC8vZmFsc2UgaWYgLTEgb3RoZXJ3aXNlIHRydWUsIGJ1dCBmYXN0ISEhITFcbiAgaWYgKH5pZHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICByZXR1cm4gNTtcbiAgICB9XG4gICAgcmV0dXJuIGlkeCA8IDMgPyAoaWR4ICsgMikgOiAoaWR4ICsgMyk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gNTtcbiAgfVxufVxuXG4vLyBjb252ZXJzaW9uOlxuLy8geCB5eXkgenouLi56elxuLy8geCA9IDAgZm9yIG5lZ2F0aXZlLCAxIGZvciAwLCAyIGZvciBwb3NpdGl2ZVxuLy8geSA9IGV4cG9uZW50IChmb3IgbmVnYXRpdmUgbnVtYmVycyBuZWdhdGVkKSBtb3ZlZCBzbyB0aGF0IGl0J3MgPj0gMFxuLy8geiA9IG1hbnRpc3NlXG5mdW5jdGlvbiBudW1Ub0luZGV4YWJsZVN0cmluZyhudW0pIHtcblxuICBpZiAobnVtID09PSAwKSB7XG4gICAgcmV0dXJuICcxJztcbiAgfVxuXG4gIC8vIGNvbnZlcnQgbnVtYmVyIHRvIGV4cG9uZW50aWFsIGZvcm1hdCBmb3IgZWFzaWVyIGFuZFxuICAvLyBtb3JlIHN1Y2NpbmN0IHN0cmluZyBzb3J0aW5nXG4gIHZhciBleHBGb3JtYXQgPSBudW0udG9FeHBvbmVudGlhbCgpLnNwbGl0KC9lXFwrPy8pO1xuICB2YXIgbWFnbml0dWRlID0gcGFyc2VJbnQoZXhwRm9ybWF0WzFdLCAxMCk7XG5cbiAgdmFyIG5lZyA9IG51bSA8IDA7XG5cbiAgdmFyIHJlc3VsdCA9IG5lZyA/ICcwJyA6ICcyJztcblxuICAvLyBmaXJzdCBzb3J0IGJ5IG1hZ25pdHVkZVxuICAvLyBpdCdzIGVhc2llciBpZiBhbGwgbWFnbml0dWRlcyBhcmUgcG9zaXRpdmVcbiAgdmFyIG1hZ0ZvckNvbXBhcmlzb24gPSAoKG5lZyA/IC1tYWduaXR1ZGUgOiBtYWduaXR1ZGUpIC0gTUlOX01BR05JVFVERSk7XG4gIHZhciBtYWdTdHJpbmcgPSBwYWRMZWZ0KChtYWdGb3JDb21wYXJpc29uKS50b1N0cmluZygpLCAnMCcsIE1BR05JVFVERV9ESUdJVFMpO1xuXG4gIHJlc3VsdCArPSBTRVAgKyBtYWdTdHJpbmc7XG5cbiAgLy8gdGhlbiBzb3J0IGJ5IHRoZSBmYWN0b3JcbiAgdmFyIGZhY3RvciA9IE1hdGguYWJzKHBhcnNlRmxvYXQoZXhwRm9ybWF0WzBdKSk7IC8vIFsxLi4xMClcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKG5lZykgeyAvLyBmb3IgbmVnYXRpdmUgcmV2ZXJzZSBvcmRlcmluZ1xuICAgIGZhY3RvciA9IDEwIC0gZmFjdG9yO1xuICB9XG5cbiAgdmFyIGZhY3RvclN0ciA9IGZhY3Rvci50b0ZpeGVkKDIwKTtcblxuICAvLyBzdHJpcCB6ZXJvcyBmcm9tIHRoZSBlbmRcbiAgZmFjdG9yU3RyID0gZmFjdG9yU3RyLnJlcGxhY2UoL1xcLj8wKyQvLCAnJyk7XG5cbiAgcmVzdWx0ICs9IFNFUCArIGZhY3RvclN0cjtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBjcmVhdGUgYSBjb21wYXJhdG9yIGJhc2VkIG9uIHRoZSBzb3J0IG9iamVjdFxuZnVuY3Rpb24gY3JlYXRlRmllbGRTb3J0ZXIoc29ydCkge1xuXG4gIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWVzQXNBcnJheShkb2MpIHtcbiAgICByZXR1cm4gc29ydC5tYXAoZnVuY3Rpb24gKHNvcnRpbmcpIHtcbiAgICAgIHZhciBmaWVsZE5hbWUgPSBnZXRLZXkoc29ydGluZyk7XG4gICAgICB2YXIgcGFyc2VkRmllbGQgPSBwYXJzZUZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICB2YXIgZG9jRmllbGRWYWx1ZSA9IGdldEZpZWxkRnJvbURvYyhkb2MsIHBhcnNlZEZpZWxkKTtcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhUm93LCBiUm93KSB7XG4gICAgdmFyIGFGaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzQXNBcnJheShhUm93LmRvYyk7XG4gICAgdmFyIGJGaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzQXNBcnJheShiUm93LmRvYyk7XG4gICAgdmFyIGNvbGxhdGlvbiA9IGNvbGxhdGUoYUZpZWxkVmFsdWVzLCBiRmllbGRWYWx1ZXMpO1xuICAgIGlmIChjb2xsYXRpb24gIT09IDApIHtcbiAgICAgIHJldHVybiBjb2xsYXRpb247XG4gICAgfVxuICAgIC8vIHRoaXMgaXMgd2hhdCBtYW5nbyBzZWVtcyB0byBkb1xuICAgIHJldHVybiBjb21wYXJlJDEoYVJvdy5kb2MuX2lkLCBiUm93LmRvYy5faWQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJJbk1lbW9yeUZpZWxkcyhyb3dzLCByZXF1ZXN0RGVmLCBpbk1lbW9yeUZpZWxkcykge1xuICByb3dzID0gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgIHJldHVybiByb3dGaWx0ZXIocm93LmRvYywgcmVxdWVzdERlZi5zZWxlY3RvciwgaW5NZW1vcnlGaWVsZHMpO1xuICB9KTtcblxuICBpZiAocmVxdWVzdERlZi5zb3J0KSB7XG4gICAgLy8gaW4tbWVtb3J5IHNvcnRcbiAgICB2YXIgZmllbGRTb3J0ZXIgPSBjcmVhdGVGaWVsZFNvcnRlcihyZXF1ZXN0RGVmLnNvcnQpO1xuICAgIHJvd3MgPSByb3dzLnNvcnQoZmllbGRTb3J0ZXIpO1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdERlZi5zb3J0WzBdICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICBnZXRWYWx1ZShyZXF1ZXN0RGVmLnNvcnRbMF0pID09PSAnZGVzYycpIHtcbiAgICAgIHJvd3MgPSByb3dzLnJldmVyc2UoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoJ2xpbWl0JyBpbiByZXF1ZXN0RGVmIHx8ICdza2lwJyBpbiByZXF1ZXN0RGVmKSB7XG4gICAgLy8gaGF2ZSB0byBkbyB0aGUgbGltaXQgaW4tbWVtb3J5XG4gICAgdmFyIHNraXAgPSByZXF1ZXN0RGVmLnNraXAgfHwgMDtcbiAgICB2YXIgbGltaXQgPSAoJ2xpbWl0JyBpbiByZXF1ZXN0RGVmID8gcmVxdWVzdERlZi5saW1pdCA6IHJvd3MubGVuZ3RoKSArIHNraXA7XG4gICAgcm93cyA9IHJvd3Muc2xpY2Uoc2tpcCwgbGltaXQpO1xuICB9XG4gIHJldHVybiByb3dzO1xufVxuXG5mdW5jdGlvbiByb3dGaWx0ZXIoZG9jLCBzZWxlY3RvciwgaW5NZW1vcnlGaWVsZHMpIHtcbiAgcmV0dXJuIGluTWVtb3J5RmllbGRzLmV2ZXJ5KGZ1bmN0aW9uIChmaWVsZCkge1xuICAgIHZhciBtYXRjaGVyID0gc2VsZWN0b3JbZmllbGRdO1xuICAgIHZhciBwYXJzZWRGaWVsZCA9IHBhcnNlRmllbGQoZmllbGQpO1xuICAgIHZhciBkb2NGaWVsZFZhbHVlID0gZ2V0RmllbGRGcm9tRG9jKGRvYywgcGFyc2VkRmllbGQpO1xuICAgIGlmIChpc0NvbWJpbmF0aW9uYWxGaWVsZChmaWVsZCkpIHtcbiAgICAgIHJldHVybiBtYXRjaENvbWluYXRpb25hbFNlbGVjdG9yKGZpZWxkLCBtYXRjaGVyLCBkb2MpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaFNlbGVjdG9yKG1hdGNoZXIsIGRvYywgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hTZWxlY3RvcihtYXRjaGVyLCBkb2MsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gIGlmICghbWF0Y2hlcikge1xuICAgIC8vIG5vIGZpbHRlcmluZyBuZWNlc3Nhcnk7IHRoaXMgZmllbGQgaXMganVzdCBuZWVkZWQgZm9yIHNvcnRpbmdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlzIG1hdGNoZXIgYW4gb2JqZWN0LCBpZiBzbyBjb250aW51ZSByZWN1cnNpb25cbiAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXRjaGVyKS5ldmVyeShmdW5jdGlvbiAobWF5YmVVc2VyT3BlcmF0b3IpIHtcbiAgICAgIHZhciB1c2VyVmFsdWUgPSBtYXRjaGVyWyBtYXliZVVzZXJPcGVyYXRvciBdO1xuICAgICAgLy8gZXhwbGljaXQgb3BlcmF0b3JcbiAgICAgIGlmIChtYXliZVVzZXJPcGVyYXRvci5pbmRleE9mKFwiJFwiKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbWF0Y2gobWF5YmVVc2VyT3BlcmF0b3IsIGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc3ViUGFyc2VkRmllbGQgPSBwYXJzZUZpZWxkKG1heWJlVXNlck9wZXJhdG9yKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZG9jRmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdHlwZW9mIHVzZXJWYWx1ZSAhPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIHN1YlBhcnNlZEZpZWxkLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gb3IgZ2V0RmllbGRGcm9tRG9jIHdpbGwgdGhyb3dcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3ViRG9jRmllbGRWYWx1ZSA9IGdldEZpZWxkRnJvbURvYyhkb2NGaWVsZFZhbHVlLCBzdWJQYXJzZWRGaWVsZCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VyVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAvLyBmaWVsZCB2YWx1ZSBpcyBhbiBvYmplY3QgdGhhdCBtaWdodCBjb250YWluIG1vcmUgb3BlcmF0b3JzXG4gICAgICAgICAgcmV0dXJuIG1hdGNoU2VsZWN0b3IodXNlclZhbHVlLCBkb2MsIHBhcnNlZEZpZWxkLCBzdWJEb2NGaWVsZFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGltcGxpY2l0IG9wZXJhdG9yXG4gICAgICAgIHJldHVybiBtYXRjaChcIiRlcVwiLCBkb2MsIHVzZXJWYWx1ZSwgc3ViUGFyc2VkRmllbGQsIHN1YkRvY0ZpZWxkVmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gbm8gbW9yZSBkZXB0aCwgTm8gbmVlZCB0byByZWN1cnNlIGZ1cnRoZXJcbiAgcmV0dXJuIG1hdGNoZXIgPT09IGRvY0ZpZWxkVmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1hdGNoQ29taW5hdGlvbmFsU2VsZWN0b3IoZmllbGQsIG1hdGNoZXIsIGRvYykge1xuXG4gIGlmIChmaWVsZCA9PT0gJyRvcicpIHtcbiAgICByZXR1cm4gbWF0Y2hlci5zb21lKGZ1bmN0aW9uIChvck1hdGNoZXJzKSB7XG4gICAgICByZXR1cm4gcm93RmlsdGVyKGRvYywgb3JNYXRjaGVycywgT2JqZWN0LmtleXMob3JNYXRjaGVycykpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGZpZWxkID09PSAnJG5vdCcpIHtcbiAgICByZXR1cm4gIXJvd0ZpbHRlcihkb2MsIG1hdGNoZXIsIE9iamVjdC5rZXlzKG1hdGNoZXIpKTtcbiAgfVxuXG4gIC8vYCRub3JgXG4gIHJldHVybiAhbWF0Y2hlci5maW5kKGZ1bmN0aW9uIChvck1hdGNoZXJzKSB7XG4gICAgcmV0dXJuIHJvd0ZpbHRlcihkb2MsIG9yTWF0Y2hlcnMsIE9iamVjdC5rZXlzKG9yTWF0Y2hlcnMpKTtcbiAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWF0Y2godXNlck9wZXJhdG9yLCBkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgaWYgKCFtYXRjaGVyc1t1c2VyT3BlcmF0b3JdKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gb3BlcmF0b3IgXCInICsgdXNlck9wZXJhdG9yICtcbiAgICAgICdcIiAtIHNob3VsZCBiZSBvbmUgb2YgJGVxLCAkbHRlLCAkbHQsICRndCwgJGd0ZSwgJGV4aXN0cywgJG5lLCAkaW4sICcgK1xuICAgICAgJyRuaW4sICRzaXplLCAkbW9kLCAkcmVnZXgsICRlbGVtTWF0Y2gsICR0eXBlLCAkYWxsTWF0Y2ggb3IgJGFsbCcpO1xuICB9XG4gIHJldHVybiBtYXRjaGVyc1t1c2VyT3BlcmF0b3JdKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGZpZWxkRXhpc3RzKGRvY0ZpZWxkVmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBkb2NGaWVsZFZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiBkb2NGaWVsZFZhbHVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBkb2NGaWVsZFZhbHVlICE9PSAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gbW9kRmllbGQoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIGlmICh0eXBlb2YgZG9jRmllbGRWYWx1ZSAhPT0gXCJudW1iZXJcIiB8fFxuICAgIHBhcnNlSW50KGRvY0ZpZWxkVmFsdWUsIDEwKSAhPT0gZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBkaXZpc29yID0gdXNlclZhbHVlWzBdO1xuICB2YXIgbW9kID0gdXNlclZhbHVlWzFdO1xuXG4gIHJldHVybiBkb2NGaWVsZFZhbHVlICUgZGl2aXNvciA9PT0gbW9kO1xufVxuXG5mdW5jdGlvbiBhcnJheUNvbnRhaW5zVmFsdWUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG4gIHJldHVybiB1c2VyVmFsdWUuc29tZShmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKGRvY0ZpZWxkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuc29tZShmdW5jdGlvbiAoZG9jRmllbGRWYWx1ZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGNvbGxhdGUodmFsLCBkb2NGaWVsZFZhbHVlSXRlbSkgPT09IDA7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sbGF0ZSh2YWwsIGRvY0ZpZWxkVmFsdWUpID09PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXJyYXlDb250YWluc0FsbFZhbHVlcyhkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgcmV0dXJuIHVzZXJWYWx1ZS5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuc29tZShmdW5jdGlvbiAoZG9jRmllbGRWYWx1ZUl0ZW0pIHtcbiAgICAgIHJldHVybiBjb2xsYXRlKHZhbCwgZG9jRmllbGRWYWx1ZUl0ZW0pID09PSAwO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXJyYXlTaXplKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkge1xuICByZXR1cm4gZG9jRmllbGRWYWx1ZS5sZW5ndGggPT09IHVzZXJWYWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVnZXhNYXRjaChkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpIHtcbiAgdmFyIHJlID0gbmV3IFJlZ0V4cCh1c2VyVmFsdWUpO1xuXG4gIHJldHVybiByZS50ZXN0KGRvY0ZpZWxkVmFsdWUpO1xufVxuXG5mdW5jdGlvbiB0eXBlTWF0Y2goZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSB7XG5cbiAgc3dpdGNoICh1c2VyVmFsdWUpIHtcbiAgICBjYXNlICdudWxsJzpcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlID09PSBudWxsO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHR5cGVvZiAoZG9jRmllbGRWYWx1ZSkgPT09ICdib29sZWFuJztcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIHR5cGVvZiAoZG9jRmllbGRWYWx1ZSkgPT09ICdudW1iZXInO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdHlwZW9mIChkb2NGaWVsZFZhbHVlKSA9PT0gJ3N0cmluZyc7XG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUgaW5zdGFuY2VvZiBBcnJheTtcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuICh7fSkudG9TdHJpbmcuY2FsbChkb2NGaWVsZFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gIH1cbn1cblxudmFyIG1hdGNoZXJzID0ge1xuXG4gICckZWxlbU1hdGNoJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkb2NGaWVsZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChkb2NGaWVsZFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZG9jRmllbGRWYWx1ZVswXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gcm93RmlsdGVyKHZhbCwgdXNlclZhbHVlLCBPYmplY3Qua2V5cyh1c2VyVmFsdWUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb2NGaWVsZFZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIG1hdGNoU2VsZWN0b3IodXNlclZhbHVlLCBkb2MsIHBhcnNlZEZpZWxkLCB2YWwpO1xuICAgIH0pO1xuICB9LFxuXG4gICckYWxsTWF0Y2gnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRvY0ZpZWxkVmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoZG9jRmllbGRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRvY0ZpZWxkVmFsdWVbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZG9jRmllbGRWYWx1ZS5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiByb3dGaWx0ZXIodmFsLCB1c2VyVmFsdWUsIE9iamVjdC5rZXlzKHVzZXJWYWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY0ZpZWxkVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIG1hdGNoU2VsZWN0b3IodXNlclZhbHVlLCBkb2MsIHBhcnNlZEZpZWxkLCB2YWwpO1xuICAgIH0pO1xuICB9LFxuXG4gICckZXEnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpID09PSAwO1xuICB9LFxuXG4gICckZ3RlJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA+PSAwO1xuICB9LFxuXG4gICckZ3QnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSkgJiYgY29sbGF0ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpID4gMDtcbiAgfSxcblxuICAnJGx0ZSc6IGZ1bmN0aW9uIChkb2MsIHVzZXJWYWx1ZSwgcGFyc2VkRmllbGQsIGRvY0ZpZWxkVmFsdWUpIHtcbiAgICByZXR1cm4gZmllbGRJc05vdFVuZGVmaW5lZChkb2NGaWVsZFZhbHVlKSAmJiBjb2xsYXRlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSkgPD0gMDtcbiAgfSxcblxuICAnJGx0JzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpICYmIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgdXNlclZhbHVlKSA8IDA7XG4gIH0sXG5cbiAgJyRleGlzdHMnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgLy9hIGZpZWxkIHRoYXQgaXMgbnVsbCBpcyBzdGlsbCBjb25zaWRlcmVkIHRvIGV4aXN0XG4gICAgaWYgKHVzZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZpZWxkSXNOb3RVbmRlZmluZWQoZG9jRmllbGRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICFmaWVsZElzTm90VW5kZWZpbmVkKGRvY0ZpZWxkVmFsdWUpO1xuICB9LFxuXG4gICckbW9kJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJiBtb2RGaWVsZChkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckbmUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIHVzZXJWYWx1ZS5ldmVyeShmdW5jdGlvbiAobmVWYWx1ZSkge1xuICAgICAgcmV0dXJuIGNvbGxhdGUoZG9jRmllbGRWYWx1ZSwgbmVWYWx1ZSkgIT09IDA7XG4gICAgfSk7XG4gIH0sXG4gICckaW4nOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkRXhpc3RzKGRvY0ZpZWxkVmFsdWUpICYmIGFycmF5Q29udGFpbnNWYWx1ZShkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckbmluJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJiAhYXJyYXlDb250YWluc1ZhbHVlKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSk7XG4gIH0sXG5cbiAgJyRzaXplJzogZnVuY3Rpb24gKGRvYywgdXNlclZhbHVlLCBwYXJzZWRGaWVsZCwgZG9jRmllbGRWYWx1ZSkge1xuICAgIHJldHVybiBmaWVsZEV4aXN0cyhkb2NGaWVsZFZhbHVlKSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShkb2NGaWVsZFZhbHVlKSAmJlxuICAgICAgYXJyYXlTaXplKGRvY0ZpZWxkVmFsdWUsIHVzZXJWYWx1ZSk7XG4gIH0sXG5cbiAgJyRhbGwnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZG9jRmllbGRWYWx1ZSkgJiYgYXJyYXlDb250YWluc0FsbFZhbHVlcyhkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9LFxuXG4gICckcmVnZXgnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIGZpZWxkRXhpc3RzKGRvY0ZpZWxkVmFsdWUpICYmXG4gICAgICB0eXBlb2YgZG9jRmllbGRWYWx1ZSA9PSBcInN0cmluZ1wiICYmXG4gICAgICB1c2VyVmFsdWUuZXZlcnkoZnVuY3Rpb24gKHJlZ2V4VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2goZG9jRmllbGRWYWx1ZSwgcmVnZXhWYWx1ZSk7XG4gICAgICB9KTtcbiAgfSxcblxuICAnJHR5cGUnOiBmdW5jdGlvbiAoZG9jLCB1c2VyVmFsdWUsIHBhcnNlZEZpZWxkLCBkb2NGaWVsZFZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVNYXRjaChkb2NGaWVsZFZhbHVlLCB1c2VyVmFsdWUpO1xuICB9XG59O1xuXG4vLyByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZG9jIG1hdGNoZXMgdGhlIHN1cHBsaWVkIHNlbGVjdG9yXG5mdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoZG9jLCBzZWxlY3Rvcikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBzZWxlY3RvciAhPT0gJ29iamVjdCcpIHtcbiAgICAvLyBtYXRjaCB0aGUgQ291Y2hEQiBlcnJvciBtZXNzYWdlXG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWxlY3RvciBlcnJvcjogZXhwZWN0ZWQgYSBKU09OIG9iamVjdCcpO1xuICB9XG5cbiAgc2VsZWN0b3IgPSBtYXNzYWdlU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB2YXIgcm93ID0ge1xuICAgICdkb2MnOiBkb2NcbiAgfTtcblxuICB2YXIgcm93c01hdGNoZWQgPSBmaWx0ZXJJbk1lbW9yeUZpZWxkcyhbcm93XSwgeyAnc2VsZWN0b3InOiBzZWxlY3RvciB9LCBPYmplY3Qua2V5cyhzZWxlY3RvcikpO1xuICByZXR1cm4gcm93c01hdGNoZWQgJiYgcm93c01hdGNoZWQubGVuZ3RoID09PSAxO1xufVxuXG5mdW5jdGlvbiBldmFsRmlsdGVyKGlucHV0KSB7XG4gIHJldHVybiBzY29wZUV2YWwoJ1widXNlIHN0cmljdFwiO1xcbnJldHVybiAnICsgaW5wdXQgKyAnOycsIHt9KTtcbn1cblxuZnVuY3Rpb24gZXZhbFZpZXcoaW5wdXQpIHtcbiAgdmFyIGNvZGUgPSBbXG4gICAgJ3JldHVybiBmdW5jdGlvbihkb2MpIHsnLFxuICAgICcgIFwidXNlIHN0cmljdFwiOycsXG4gICAgJyAgdmFyIGVtaXR0ZWQgPSBmYWxzZTsnLFxuICAgICcgIHZhciBlbWl0ID0gZnVuY3Rpb24gKGEsIGIpIHsnLFxuICAgICcgICAgZW1pdHRlZCA9IHRydWU7JyxcbiAgICAnICB9OycsXG4gICAgJyAgdmFyIHZpZXcgPSAnICsgaW5wdXQgKyAnOycsXG4gICAgJyAgdmlldyhkb2MpOycsXG4gICAgJyAgaWYgKGVtaXR0ZWQpIHsnLFxuICAgICcgICAgcmV0dXJuIHRydWU7JyxcbiAgICAnICB9JyxcbiAgICAnfTsnXG4gIF0uam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIHNjb3BlRXZhbChjb2RlLCB7fSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmIChvcHRzLnNlbGVjdG9yKSB7XG4gICAgaWYgKG9wdHMuZmlsdGVyICYmIG9wdHMuZmlsdGVyICE9PSAnX3NlbGVjdG9yJykge1xuICAgICAgdmFyIGZpbHRlck5hbWUgPSB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdzdHJpbmcnID9cbiAgICAgICAgb3B0cy5maWx0ZXIgOiAnZnVuY3Rpb24nO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignc2VsZWN0b3IgaW52YWxpZCBmb3IgZmlsdGVyIFwiJyArIGZpbHRlck5hbWUgKyAnXCInKSk7XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShvcHRzKSB7XG4gIGlmIChvcHRzLnZpZXcgJiYgIW9wdHMuZmlsdGVyKSB7XG4gICAgb3B0cy5maWx0ZXIgPSAnX3ZpZXcnO1xuICB9XG5cbiAgaWYgKG9wdHMuc2VsZWN0b3IgJiYgIW9wdHMuZmlsdGVyKSB7XG4gICAgb3B0cy5maWx0ZXIgPSAnX3NlbGVjdG9yJztcbiAgfVxuXG4gIGlmIChvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKG9wdHMuZmlsdGVyID09PSAnX3ZpZXcnKSB7XG4gICAgICBvcHRzLnZpZXcgPSBub3JtYWxpemVEZXNpZ25Eb2NGdW5jdGlvbk5hbWUob3B0cy52aWV3KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0cy5maWx0ZXIgPSBub3JtYWxpemVEZXNpZ25Eb2NGdW5jdGlvbk5hbWUob3B0cy5maWx0ZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRGaWx0ZXIoY2hhbmdlc0hhbmRsZXIsIG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMuZmlsdGVyICYmIHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ3N0cmluZycgJiZcbiAgICAhb3B0cy5kb2NfaWRzICYmICFpc1JlbW90ZShjaGFuZ2VzSGFuZGxlci5kYik7XG59XG5cbmZ1bmN0aW9uIGZpbHRlcihjaGFuZ2VzSGFuZGxlciwgb3B0cykge1xuICB2YXIgY2FsbGJhY2sgPSBvcHRzLmNvbXBsZXRlO1xuICBpZiAob3B0cy5maWx0ZXIgPT09ICdfdmlldycpIHtcbiAgICBpZiAoIW9wdHMudmlldyB8fCB0eXBlb2Ygb3B0cy52aWV3ICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKEJBRF9SRVFVRVNULFxuICAgICAgICAnYHZpZXdgIGZpbHRlciBwYXJhbWV0ZXIgbm90IGZvdW5kIG9yIGludmFsaWQuJyk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgLy8gZmV0Y2ggYSB2aWV3IGZyb20gYSBkZXNpZ24gZG9jLCBtYWtlIGl0IGJlaGF2ZSBsaWtlIGEgZmlsdGVyXG4gICAgdmFyIHZpZXdOYW1lID0gcGFyc2VEZXNpZ25Eb2NGdW5jdGlvbk5hbWUob3B0cy52aWV3KTtcbiAgICBjaGFuZ2VzSGFuZGxlci5kYi5nZXQoJ19kZXNpZ24vJyArIHZpZXdOYW1lWzBdLCBmdW5jdGlvbiAoZXJyLCBkZG9jKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChjaGFuZ2VzSGFuZGxlci5pc0NhbmNlbGxlZCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge3N0YXR1czogJ2NhbmNlbGxlZCd9KTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKGVycikpO1xuICAgICAgfVxuICAgICAgdmFyIG1hcEZ1biA9IGRkb2MgJiYgZGRvYy52aWV3cyAmJiBkZG9jLnZpZXdzW3ZpZXdOYW1lWzFdXSAmJlxuICAgICAgICBkZG9jLnZpZXdzW3ZpZXdOYW1lWzFdXS5tYXA7XG4gICAgICBpZiAoIW1hcEZ1bikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsXG4gICAgICAgICAgKGRkb2Mudmlld3MgPyAnbWlzc2luZyBqc29uIGtleTogJyArIHZpZXdOYW1lWzFdIDpcbiAgICAgICAgICAgICdtaXNzaW5nIGpzb24ga2V5OiB2aWV3cycpKSk7XG4gICAgICB9XG4gICAgICBvcHRzLmZpbHRlciA9IGV2YWxWaWV3KG1hcEZ1bik7XG4gICAgICBjaGFuZ2VzSGFuZGxlci5kb0NoYW5nZXMob3B0cyk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAob3B0cy5zZWxlY3Rvcikge1xuICAgIG9wdHMuZmlsdGVyID0gZnVuY3Rpb24gKGRvYykge1xuICAgICAgcmV0dXJuIG1hdGNoZXNTZWxlY3Rvcihkb2MsIG9wdHMuc2VsZWN0b3IpO1xuICAgIH07XG4gICAgY2hhbmdlc0hhbmRsZXIuZG9DaGFuZ2VzKG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIGZldGNoIGEgZmlsdGVyIGZyb20gYSBkZXNpZ24gZG9jXG4gICAgdmFyIGZpbHRlck5hbWUgPSBwYXJzZURlc2lnbkRvY0Z1bmN0aW9uTmFtZShvcHRzLmZpbHRlcik7XG4gICAgY2hhbmdlc0hhbmRsZXIuZGIuZ2V0KCdfZGVzaWduLycgKyBmaWx0ZXJOYW1lWzBdLCBmdW5jdGlvbiAoZXJyLCBkZG9jKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChjaGFuZ2VzSGFuZGxlci5pc0NhbmNlbGxlZCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge3N0YXR1czogJ2NhbmNlbGxlZCd9KTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKGVycikpO1xuICAgICAgfVxuICAgICAgdmFyIGZpbHRlckZ1biA9IGRkb2MgJiYgZGRvYy5maWx0ZXJzICYmIGRkb2MuZmlsdGVyc1tmaWx0ZXJOYW1lWzFdXTtcbiAgICAgIGlmICghZmlsdGVyRnVuKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0RPQyxcbiAgICAgICAgICAoKGRkb2MgJiYgZGRvYy5maWx0ZXJzKSA/ICdtaXNzaW5nIGpzb24ga2V5OiAnICsgZmlsdGVyTmFtZVsxXVxuICAgICAgICAgICAgOiAnbWlzc2luZyBqc29uIGtleTogZmlsdGVycycpKSk7XG4gICAgICB9XG4gICAgICBvcHRzLmZpbHRlciA9IGV2YWxGaWx0ZXIoZmlsdGVyRnVuKTtcbiAgICAgIGNoYW5nZXNIYW5kbGVyLmRvQ2hhbmdlcyhvcHRzKTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseUNoYW5nZXNGaWx0ZXJQbHVnaW4oUG91Y2hEQikge1xuICBQb3VjaERCLl9jaGFuZ2VzRmlsdGVyUGx1Z2luID0ge1xuICAgIHZhbGlkYXRlOiB2YWxpZGF0ZSxcbiAgICBub3JtYWxpemU6IG5vcm1hbGl6ZSxcbiAgICBzaG91bGRGaWx0ZXI6IHNob3VsZEZpbHRlcixcbiAgICBmaWx0ZXI6IGZpbHRlclxuICB9O1xufVxuXG4vLyBUT0RPOiByZW1vdmUgZnJvbSBwb3VjaGRiLWNvcmUgKGJyZWFraW5nKVxuUG91Y2hEQi5wbHVnaW4oYXBwbHlDaGFuZ2VzRmlsdGVyUGx1Z2luKTtcblxuUG91Y2hEQi52ZXJzaW9uID0gdmVyc2lvbjtcblxuZnVuY3Rpb24gdG9PYmplY3QoYXJyYXkpIHtcbiAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbiAob2JqLCBpdGVtKSB7XG4gICAgb2JqW2l0ZW1dID0gdHJ1ZTtcbiAgICByZXR1cm4gb2JqO1xuICB9LCB7fSk7XG59XG4vLyBMaXN0IG9mIHRvcCBsZXZlbCByZXNlcnZlZCB3b3JkcyBmb3IgZG9jXG52YXIgcmVzZXJ2ZWRXb3JkcyA9IHRvT2JqZWN0KFtcbiAgJ19pZCcsXG4gICdfcmV2JyxcbiAgJ19hY2Nlc3MnLFxuICAnX2F0dGFjaG1lbnRzJyxcbiAgJ19kZWxldGVkJyxcbiAgJ19yZXZpc2lvbnMnLFxuICAnX3JldnNfaW5mbycsXG4gICdfY29uZmxpY3RzJyxcbiAgJ19kZWxldGVkX2NvbmZsaWN0cycsXG4gICdfbG9jYWxfc2VxJyxcbiAgJ19yZXZfdHJlZScsXG4gIC8vIHJlcGxpY2F0aW9uIGRvY3VtZW50c1xuICAnX3JlcGxpY2F0aW9uX2lkJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfdGltZScsXG4gICdfcmVwbGljYXRpb25fc3RhdGVfcmVhc29uJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0cycsXG4gIC8vIFNwZWNpZmljIHRvIENvdWNoYmFzZSBTeW5jIEdhdGV3YXlcbiAgJ19yZW1vdmVkJ1xuXSk7XG5cbi8vIExpc3Qgb2YgcmVzZXJ2ZWQgd29yZHMgdGhhdCBzaG91bGQgZW5kIHVwIGluIHRoZSBkb2N1bWVudFxudmFyIGRhdGFXb3JkcyA9IHRvT2JqZWN0KFtcbiAgJ19hY2Nlc3MnLFxuICAnX2F0dGFjaG1lbnRzJyxcbiAgLy8gcmVwbGljYXRpb24gZG9jdW1lbnRzXG4gICdfcmVwbGljYXRpb25faWQnLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRlJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZV90aW1lJyxcbiAgJ19yZXBsaWNhdGlvbl9zdGF0ZV9yZWFzb24nLFxuICAnX3JlcGxpY2F0aW9uX3N0YXRzJ1xuXSk7XG5cbmZ1bmN0aW9uIHBhcnNlUmV2aXNpb25JbmZvKHJldikge1xuICBpZiAoIS9eXFxkKy0vLnRlc3QocmV2KSkge1xuICAgIHJldHVybiBjcmVhdGVFcnJvcihJTlZBTElEX1JFVik7XG4gIH1cbiAgdmFyIGlkeCA9IHJldi5pbmRleE9mKCctJyk7XG4gIHZhciBsZWZ0ID0gcmV2LnN1YnN0cmluZygwLCBpZHgpO1xuICB2YXIgcmlnaHQgPSByZXYuc3Vic3RyaW5nKGlkeCArIDEpO1xuICByZXR1cm4ge1xuICAgIHByZWZpeDogcGFyc2VJbnQobGVmdCwgMTApLFxuICAgIGlkOiByaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBtYWtlUmV2VHJlZUZyb21SZXZpc2lvbnMocmV2aXNpb25zLCBvcHRzKSB7XG4gIHZhciBwb3MgPSByZXZpc2lvbnMuc3RhcnQgLSByZXZpc2lvbnMuaWRzLmxlbmd0aCArIDE7XG5cbiAgdmFyIHJldmlzaW9uSWRzID0gcmV2aXNpb25zLmlkcztcbiAgdmFyIGlkcyA9IFtyZXZpc2lvbklkc1swXSwgb3B0cywgW11dO1xuXG4gIGZvciAodmFyIGkgPSAxLCBsZW4gPSByZXZpc2lvbklkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlkcyA9IFtyZXZpc2lvbklkc1tpXSwge3N0YXR1czogJ21pc3NpbmcnfSwgW2lkc11dO1xuICB9XG5cbiAgcmV0dXJuIFt7XG4gICAgcG9zOiBwb3MsXG4gICAgaWRzOiBpZHNcbiAgfV07XG59XG5cbi8vIFByZXByb2Nlc3MgZG9jdW1lbnRzLCBwYXJzZSB0aGVpciByZXZpc2lvbnMsIGFzc2lnbiBhbiBpZCBhbmQgYVxuLy8gcmV2aXNpb24gZm9yIG5ldyB3cml0ZXMgdGhhdCBhcmUgbWlzc2luZyB0aGVtLCBldGNcbmZ1bmN0aW9uIHBhcnNlRG9jKGRvYywgbmV3RWRpdHMsIGRiT3B0cykge1xuICBpZiAoIWRiT3B0cykge1xuICAgIGRiT3B0cyA9IHtcbiAgICAgIGRldGVybWluaXN0aWNfcmV2czogdHJ1ZVxuICAgIH07XG4gIH1cblxuICB2YXIgblJldk51bTtcbiAgdmFyIG5ld1JldklkO1xuICB2YXIgcmV2SW5mbztcbiAgdmFyIG9wdHMgPSB7c3RhdHVzOiAnYXZhaWxhYmxlJ307XG4gIGlmIChkb2MuX2RlbGV0ZWQpIHtcbiAgICBvcHRzLmRlbGV0ZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG5ld0VkaXRzKSB7XG4gICAgaWYgKCFkb2MuX2lkKSB7XG4gICAgICBkb2MuX2lkID0gdXVpZCgpO1xuICAgIH1cbiAgICBuZXdSZXZJZCA9IHJldiQkMShkb2MsIGRiT3B0cy5kZXRlcm1pbmlzdGljX3JldnMpO1xuICAgIGlmIChkb2MuX3Jldikge1xuICAgICAgcmV2SW5mbyA9IHBhcnNlUmV2aXNpb25JbmZvKGRvYy5fcmV2KTtcbiAgICAgIGlmIChyZXZJbmZvLmVycm9yKSB7XG4gICAgICAgIHJldHVybiByZXZJbmZvO1xuICAgICAgfVxuICAgICAgZG9jLl9yZXZfdHJlZSA9IFt7XG4gICAgICAgIHBvczogcmV2SW5mby5wcmVmaXgsXG4gICAgICAgIGlkczogW3JldkluZm8uaWQsIHtzdGF0dXM6ICdtaXNzaW5nJ30sIFtbbmV3UmV2SWQsIG9wdHMsIFtdXV1dXG4gICAgICB9XTtcbiAgICAgIG5SZXZOdW0gPSByZXZJbmZvLnByZWZpeCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBbe1xuICAgICAgICBwb3M6IDEsXG4gICAgICAgIGlkcyA6IFtuZXdSZXZJZCwgb3B0cywgW11dXG4gICAgICB9XTtcbiAgICAgIG5SZXZOdW0gPSAxO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZG9jLl9yZXZpc2lvbnMpIHtcbiAgICAgIGRvYy5fcmV2X3RyZWUgPSBtYWtlUmV2VHJlZUZyb21SZXZpc2lvbnMoZG9jLl9yZXZpc2lvbnMsIG9wdHMpO1xuICAgICAgblJldk51bSA9IGRvYy5fcmV2aXNpb25zLnN0YXJ0O1xuICAgICAgbmV3UmV2SWQgPSBkb2MuX3JldmlzaW9ucy5pZHNbMF07XG4gICAgfVxuICAgIGlmICghZG9jLl9yZXZfdHJlZSkge1xuICAgICAgcmV2SW5mbyA9IHBhcnNlUmV2aXNpb25JbmZvKGRvYy5fcmV2KTtcbiAgICAgIGlmIChyZXZJbmZvLmVycm9yKSB7XG4gICAgICAgIHJldHVybiByZXZJbmZvO1xuICAgICAgfVxuICAgICAgblJldk51bSA9IHJldkluZm8ucHJlZml4O1xuICAgICAgbmV3UmV2SWQgPSByZXZJbmZvLmlkO1xuICAgICAgZG9jLl9yZXZfdHJlZSA9IFt7XG4gICAgICAgIHBvczogblJldk51bSxcbiAgICAgICAgaWRzOiBbbmV3UmV2SWQsIG9wdHMsIFtdXVxuICAgICAgfV07XG4gICAgfVxuICB9XG5cbiAgaW52YWxpZElkRXJyb3IoZG9jLl9pZCk7XG5cbiAgZG9jLl9yZXYgPSBuUmV2TnVtICsgJy0nICsgbmV3UmV2SWQ7XG5cbiAgdmFyIHJlc3VsdCA9IHttZXRhZGF0YSA6IHt9LCBkYXRhIDoge319O1xuICBmb3IgKHZhciBrZXkgaW4gZG9jKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvYywga2V5KSkge1xuICAgICAgdmFyIHNwZWNpYWxLZXkgPSBrZXlbMF0gPT09ICdfJztcbiAgICAgIGlmIChzcGVjaWFsS2V5ICYmICFyZXNlcnZlZFdvcmRzW2tleV0pIHtcbiAgICAgICAgdmFyIGVycm9yID0gY3JlYXRlRXJyb3IoRE9DX1ZBTElEQVRJT04sIGtleSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSBET0NfVkFMSURBVElPTi5tZXNzYWdlICsgJzogJyArIGtleTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGVsc2UgaWYgKHNwZWNpYWxLZXkgJiYgIWRhdGFXb3Jkc1trZXldKSB7XG4gICAgICAgIHJlc3VsdC5tZXRhZGF0YVtrZXkuc2xpY2UoMSldID0gZG9jW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQuZGF0YVtrZXldID0gZG9jW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQmFzZTY0KGRhdGEpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpc0F0b2IoZGF0YSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXJyID0gY3JlYXRlRXJyb3IoQkFEX0FSRyxcbiAgICAgICdBdHRhY2htZW50IGlzIG5vdCBhIHZhbGlkIGJhc2U2NCBzdHJpbmcnKTtcbiAgICByZXR1cm4ge2Vycm9yOiBlcnJ9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NTdHJpbmcoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spIHtcbiAgdmFyIGFzQmluYXJ5ID0gcGFyc2VCYXNlNjQoYXR0LmRhdGEpO1xuICBpZiAoYXNCaW5hcnkuZXJyb3IpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soYXNCaW5hcnkuZXJyb3IpO1xuICB9XG5cbiAgYXR0Lmxlbmd0aCA9IGFzQmluYXJ5Lmxlbmd0aDtcbiAgaWYgKGJsb2JUeXBlID09PSAnYmxvYicpIHtcbiAgICBhdHQuZGF0YSA9IGJpblN0cmluZ1RvQmx1ZmZlcihhc0JpbmFyeSwgYXR0LmNvbnRlbnRfdHlwZSk7XG4gIH0gZWxzZSBpZiAoYmxvYlR5cGUgPT09ICdiYXNlNjQnKSB7XG4gICAgYXR0LmRhdGEgPSB0aGlzQnRvYShhc0JpbmFyeSk7XG4gIH0gZWxzZSB7IC8vIGJpbmFyeVxuICAgIGF0dC5kYXRhID0gYXNCaW5hcnk7XG4gIH1cbiAgYmluYXJ5TWQ1KGFzQmluYXJ5LCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgYXR0LmRpZ2VzdCA9ICdtZDUtJyArIHJlc3VsdDtcbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0Jsb2IoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spIHtcbiAgYmluYXJ5TWQ1KGF0dC5kYXRhLCBmdW5jdGlvbiAobWQ1KSB7XG4gICAgYXR0LmRpZ2VzdCA9ICdtZDUtJyArIG1kNTtcbiAgICAvLyBzaXplIGlzIGZvciBibG9icyAoYnJvd3NlciksIGxlbmd0aCBpcyBmb3IgYnVmZmVycyAobm9kZSlcbiAgICBhdHQubGVuZ3RoID0gYXR0LmRhdGEuc2l6ZSB8fCBhdHQuZGF0YS5sZW5ndGggfHwgMDtcbiAgICBpZiAoYmxvYlR5cGUgPT09ICdiaW5hcnknKSB7XG4gICAgICBibG9iVG9CaW5hcnlTdHJpbmcoYXR0LmRhdGEsIGZ1bmN0aW9uIChiaW5TdHJpbmcpIHtcbiAgICAgICAgYXR0LmRhdGEgPSBiaW5TdHJpbmc7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGJsb2JUeXBlID09PSAnYmFzZTY0Jykge1xuICAgICAgYmxvYlRvQmFzZTY0KGF0dC5kYXRhLCBmdW5jdGlvbiAoYjY0KSB7XG4gICAgICAgIGF0dC5kYXRhID0gYjY0O1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc0F0dGFjaG1lbnQoYXR0LCBibG9iVHlwZSwgY2FsbGJhY2spIHtcbiAgaWYgKGF0dC5zdHViKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhdHQuZGF0YSA9PT0gJ3N0cmluZycpIHsgLy8gaW5wdXQgaXMgYSBiYXNlNjQgc3RyaW5nXG4gICAgcHJlcHJvY2Vzc1N0cmluZyhhdHQsIGJsb2JUeXBlLCBjYWxsYmFjayk7XG4gIH0gZWxzZSB7IC8vIGlucHV0IGlzIGEgYmxvYlxuICAgIHByZXByb2Nlc3NCbG9iKGF0dCwgYmxvYlR5cGUsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzQXR0YWNobWVudHMoZG9jSW5mb3MsIGJsb2JUeXBlLCBjYWxsYmFjaykge1xuXG4gIGlmICghZG9jSW5mb3MubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICB2YXIgZG9jdiA9IDA7XG4gIHZhciBvdmVyYWxsRXJyO1xuXG4gIGRvY0luZm9zLmZvckVhY2goZnVuY3Rpb24gKGRvY0luZm8pIHtcbiAgICB2YXIgYXR0YWNobWVudHMgPSBkb2NJbmZvLmRhdGEgJiYgZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cyA/XG4gICAgICBPYmplY3Qua2V5cyhkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKSA6IFtdO1xuICAgIHZhciByZWN2ID0gMDtcblxuICAgIGlmICghYXR0YWNobWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NlZEF0dGFjaG1lbnQoZXJyKSB7XG4gICAgICBvdmVyYWxsRXJyID0gZXJyO1xuICAgICAgcmVjdisrO1xuICAgICAgaWYgKHJlY3YgPT09IGF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIga2V5IGluIGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9jSW5mby5kYXRhLl9hdHRhY2htZW50cywga2V5KSkge1xuICAgICAgICBwcmVwcm9jZXNzQXR0YWNobWVudChkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzW2tleV0sXG4gICAgICAgICAgYmxvYlR5cGUsIHByb2Nlc3NlZEF0dGFjaG1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICBkb2N2Kys7XG4gICAgaWYgKGRvY0luZm9zLmxlbmd0aCA9PT0gZG9jdikge1xuICAgICAgaWYgKG92ZXJhbGxFcnIpIHtcbiAgICAgICAgY2FsbGJhY2sob3ZlcmFsbEVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEb2MocmV2TGltaXQsIHByZXYsIGRvY0luZm8sIHJlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgaSwgY2IsIHdyaXRlRG9jLCBuZXdFZGl0cykge1xuXG4gIGlmIChyZXZFeGlzdHMocHJldi5yZXZfdHJlZSwgZG9jSW5mby5tZXRhZGF0YS5yZXYpICYmICFuZXdFZGl0cykge1xuICAgIHJlc3VsdHNbaV0gPSBkb2NJbmZvO1xuICAgIHJldHVybiBjYigpO1xuICB9XG5cbiAgLy8gc29tZXRpbWVzIHRoaXMgaXMgcHJlLWNhbGN1bGF0ZWQuIGhpc3RvcmljYWxseSBub3QgYWx3YXlzXG4gIHZhciBwcmV2aW91c1dpbm5pbmdSZXYgPSBwcmV2Lndpbm5pbmdSZXYgfHwgd2lubmluZ1JldihwcmV2KTtcbiAgdmFyIHByZXZpb3VzbHlEZWxldGVkID0gJ2RlbGV0ZWQnIGluIHByZXYgPyBwcmV2LmRlbGV0ZWQgOlxuICAgIGlzRGVsZXRlZChwcmV2LCBwcmV2aW91c1dpbm5pbmdSZXYpO1xuICB2YXIgZGVsZXRlZCA9ICdkZWxldGVkJyBpbiBkb2NJbmZvLm1ldGFkYXRhID8gZG9jSW5mby5tZXRhZGF0YS5kZWxldGVkIDpcbiAgICBpc0RlbGV0ZWQoZG9jSW5mby5tZXRhZGF0YSk7XG4gIHZhciBpc1Jvb3QgPSAvXjEtLy50ZXN0KGRvY0luZm8ubWV0YWRhdGEucmV2KTtcblxuICBpZiAocHJldmlvdXNseURlbGV0ZWQgJiYgIWRlbGV0ZWQgJiYgbmV3RWRpdHMgJiYgaXNSb290KSB7XG4gICAgdmFyIG5ld0RvYyA9IGRvY0luZm8uZGF0YTtcbiAgICBuZXdEb2MuX3JldiA9IHByZXZpb3VzV2lubmluZ1JldjtcbiAgICBuZXdEb2MuX2lkID0gZG9jSW5mby5tZXRhZGF0YS5pZDtcbiAgICBkb2NJbmZvID0gcGFyc2VEb2MobmV3RG9jLCBuZXdFZGl0cyk7XG4gIH1cblxuICB2YXIgbWVyZ2VkID0gbWVyZ2UocHJldi5yZXZfdHJlZSwgZG9jSW5mby5tZXRhZGF0YS5yZXZfdHJlZVswXSwgcmV2TGltaXQpO1xuXG4gIHZhciBpbkNvbmZsaWN0ID0gbmV3RWRpdHMgJiYgKChcbiAgICAocHJldmlvdXNseURlbGV0ZWQgJiYgZGVsZXRlZCAmJiBtZXJnZWQuY29uZmxpY3RzICE9PSAnbmV3X2xlYWYnKSB8fFxuICAgICghcHJldmlvdXNseURlbGV0ZWQgJiYgbWVyZ2VkLmNvbmZsaWN0cyAhPT0gJ25ld19sZWFmJykgfHxcbiAgICAocHJldmlvdXNseURlbGV0ZWQgJiYgIWRlbGV0ZWQgJiYgbWVyZ2VkLmNvbmZsaWN0cyA9PT0gJ25ld19icmFuY2gnKSkpO1xuXG4gIGlmIChpbkNvbmZsaWN0KSB7XG4gICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCk7XG4gICAgcmVzdWx0c1tpXSA9IGVycjtcbiAgICByZXR1cm4gY2IoKTtcbiAgfVxuXG4gIHZhciBuZXdSZXYgPSBkb2NJbmZvLm1ldGFkYXRhLnJldjtcbiAgZG9jSW5mby5tZXRhZGF0YS5yZXZfdHJlZSA9IG1lcmdlZC50cmVlO1xuICBkb2NJbmZvLnN0ZW1tZWRSZXZzID0gbWVyZ2VkLnN0ZW1tZWRSZXZzIHx8IFtdO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAocHJldi5yZXZfbWFwKSB7XG4gICAgZG9jSW5mby5tZXRhZGF0YS5yZXZfbWFwID0gcHJldi5yZXZfbWFwOyAvLyB1c2VkIG9ubHkgYnkgbGV2ZWxkYlxuICB9XG5cbiAgLy8gcmVjYWxjdWxhdGVcbiAgdmFyIHdpbm5pbmdSZXYkJDEgPSB3aW5uaW5nUmV2KGRvY0luZm8ubWV0YWRhdGEpO1xuICB2YXIgd2lubmluZ1JldklzRGVsZXRlZCA9IGlzRGVsZXRlZChkb2NJbmZvLm1ldGFkYXRhLCB3aW5uaW5nUmV2JCQxKTtcblxuICAvLyBjYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBkb2N1bWVudHMgdGhhdCB3ZXJlIGFkZGVkL3JlbW92ZWQsXG4gIC8vIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRvdGFsX3Jvd3MvZG9jX2NvdW50XG4gIHZhciBkZWx0YSA9IChwcmV2aW91c2x5RGVsZXRlZCA9PT0gd2lubmluZ1JldklzRGVsZXRlZCkgPyAwIDpcbiAgICBwcmV2aW91c2x5RGVsZXRlZCA8IHdpbm5pbmdSZXZJc0RlbGV0ZWQgPyAtMSA6IDE7XG5cbiAgdmFyIG5ld1JldklzRGVsZXRlZDtcbiAgaWYgKG5ld1JldiA9PT0gd2lubmluZ1JldiQkMSkge1xuICAgIC8vIGlmIHRoZSBuZXcgcmV2IGlzIHRoZSBzYW1lIGFzIHRoZSB3aW5uaW5nIHJldiwgd2UgY2FuIHJldXNlIHRoYXQgdmFsdWVcbiAgICBuZXdSZXZJc0RlbGV0ZWQgPSB3aW5uaW5nUmV2SXNEZWxldGVkO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIHRoZXkncmUgbm90IHRoZSBzYW1lLCB0aGVuIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICBuZXdSZXZJc0RlbGV0ZWQgPSBpc0RlbGV0ZWQoZG9jSW5mby5tZXRhZGF0YSwgbmV3UmV2KTtcbiAgfVxuXG4gIHdyaXRlRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsIG5ld1JldklzRGVsZXRlZCxcbiAgICB0cnVlLCBkZWx0YSwgaSwgY2IpO1xufVxuXG5mdW5jdGlvbiByb290SXNNaXNzaW5nKGRvY0luZm8pIHtcbiAgcmV0dXJuIGRvY0luZm8ubWV0YWRhdGEucmV2X3RyZWVbMF0uaWRzWzFdLnN0YXR1cyA9PT0gJ21pc3NpbmcnO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzRG9jcyhyZXZMaW1pdCwgZG9jSW5mb3MsIGFwaSwgZmV0Y2hlZERvY3MsIHR4LCByZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgd3JpdGVEb2MsIG9wdHMsIG92ZXJhbGxDYWxsYmFjaykge1xuXG4gIC8vIERlZmF1bHQgdG8gMTAwMCBsb2NhbGx5XG4gIHJldkxpbWl0ID0gcmV2TGltaXQgfHwgMTAwMDtcblxuICBmdW5jdGlvbiBpbnNlcnREb2MoZG9jSW5mbywgcmVzdWx0c0lkeCwgY2FsbGJhY2spIHtcbiAgICAvLyBDYW50IGluc2VydCBuZXcgZGVsZXRlZCBkb2N1bWVudHNcbiAgICB2YXIgd2lubmluZ1JldiQkMSA9IHdpbm5pbmdSZXYoZG9jSW5mby5tZXRhZGF0YSk7XG4gICAgdmFyIGRlbGV0ZWQgPSBpc0RlbGV0ZWQoZG9jSW5mby5tZXRhZGF0YSwgd2lubmluZ1JldiQkMSk7XG4gICAgaWYgKCd3YXNfZGVsZXRlJyBpbiBvcHRzICYmIGRlbGV0ZWQpIHtcbiAgICAgIHJlc3VsdHNbcmVzdWx0c0lkeF0gPSBjcmVhdGVFcnJvcihNSVNTSU5HX0RPQywgJ2RlbGV0ZWQnKTtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIC8vIDQ3MTIgLSBkZXRlY3Qgd2hldGhlciBhIG5ldyBkb2N1bWVudCB3YXMgaW5zZXJ0ZWQgd2l0aCBhIF9yZXZcbiAgICB2YXIgaW5Db25mbGljdCA9IG5ld0VkaXRzICYmIHJvb3RJc01pc3NpbmcoZG9jSW5mbyk7XG5cbiAgICBpZiAoaW5Db25mbGljdCkge1xuICAgICAgdmFyIGVyciA9IGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCk7XG4gICAgICByZXN1bHRzW3Jlc3VsdHNJZHhdID0gZXJyO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgdmFyIGRlbHRhID0gZGVsZXRlZCA/IDAgOiAxO1xuXG4gICAgd3JpdGVEb2MoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgZGVsZXRlZCwgZGVsZXRlZCwgZmFsc2UsXG4gICAgICBkZWx0YSwgcmVzdWx0c0lkeCwgY2FsbGJhY2spO1xuICB9XG5cbiAgdmFyIG5ld0VkaXRzID0gb3B0cy5uZXdfZWRpdHM7XG4gIHZhciBpZHNUb0RvY3MgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuICB2YXIgZG9jc0RvbmUgPSAwO1xuICB2YXIgZG9jc1RvRG8gPSBkb2NJbmZvcy5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gY2hlY2tBbGxEb2NzRG9uZSgpIHtcbiAgICBpZiAoKytkb2NzRG9uZSA9PT0gZG9jc1RvRG8gJiYgb3ZlcmFsbENhbGxiYWNrKSB7XG4gICAgICBvdmVyYWxsQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBkb2NJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50RG9jLCByZXN1bHRzSWR4KSB7XG5cbiAgICBpZiAoY3VycmVudERvYy5faWQgJiYgaXNMb2NhbElkKGN1cnJlbnREb2MuX2lkKSkge1xuICAgICAgdmFyIGZ1biA9IGN1cnJlbnREb2MuX2RlbGV0ZWQgPyAnX3JlbW92ZUxvY2FsJyA6ICdfcHV0TG9jYWwnO1xuICAgICAgYXBpW2Z1bl0oY3VycmVudERvYywge2N0eDogdHh9LCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgcmVzdWx0c1tyZXN1bHRzSWR4XSA9IGVyciB8fCByZXM7XG4gICAgICAgIGNoZWNrQWxsRG9jc0RvbmUoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpZCA9IGN1cnJlbnREb2MubWV0YWRhdGEuaWQ7XG4gICAgaWYgKGlkc1RvRG9jcy5oYXMoaWQpKSB7XG4gICAgICBkb2NzVG9Eby0tOyAvLyBkdXBsaWNhdGVcbiAgICAgIGlkc1RvRG9jcy5nZXQoaWQpLnB1c2goW2N1cnJlbnREb2MsIHJlc3VsdHNJZHhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzVG9Eb2NzLnNldChpZCwgW1tjdXJyZW50RG9jLCByZXN1bHRzSWR4XV0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gaW4gdGhlIGNhc2Ugb2YgbmV3X2VkaXRzLCB0aGUgdXNlciBjYW4gcHJvdmlkZSBtdWx0aXBsZSBkb2NzXG4gIC8vIHdpdGggdGhlIHNhbWUgaWQuIHRoZXNlIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIHNlcXVlbnRpYWxseVxuICBpZHNUb0RvY3MuZm9yRWFjaChmdW5jdGlvbiAoZG9jcywgaWQpIHtcbiAgICB2YXIgbnVtRG9uZSA9IDA7XG5cbiAgICBmdW5jdGlvbiBkb2NXcml0dGVuKCkge1xuICAgICAgaWYgKCsrbnVtRG9uZSA8IGRvY3MubGVuZ3RoKSB7XG4gICAgICAgIG5leHREb2MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrQWxsRG9jc0RvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbmV4dERvYygpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGRvY3NbbnVtRG9uZV07XG4gICAgICB2YXIgY3VycmVudERvYyA9IHZhbHVlWzBdO1xuICAgICAgdmFyIHJlc3VsdHNJZHggPSB2YWx1ZVsxXTtcblxuICAgICAgaWYgKGZldGNoZWREb2NzLmhhcyhpZCkpIHtcbiAgICAgICAgdXBkYXRlRG9jKHJldkxpbWl0LCBmZXRjaGVkRG9jcy5nZXQoaWQpLCBjdXJyZW50RG9jLCByZXN1bHRzLFxuICAgICAgICAgIHJlc3VsdHNJZHgsIGRvY1dyaXR0ZW4sIHdyaXRlRG9jLCBuZXdFZGl0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFbnN1cmUgc3RlbW1pbmcgYXBwbGllcyB0byBuZXcgd3JpdGVzIGFzIHdlbGxcbiAgICAgICAgdmFyIG1lcmdlZCA9IG1lcmdlKFtdLCBjdXJyZW50RG9jLm1ldGFkYXRhLnJldl90cmVlWzBdLCByZXZMaW1pdCk7XG4gICAgICAgIGN1cnJlbnREb2MubWV0YWRhdGEucmV2X3RyZWUgPSBtZXJnZWQudHJlZTtcbiAgICAgICAgY3VycmVudERvYy5zdGVtbWVkUmV2cyA9IG1lcmdlZC5zdGVtbWVkUmV2cyB8fCBbXTtcbiAgICAgICAgaW5zZXJ0RG9jKGN1cnJlbnREb2MsIHJlc3VsdHNJZHgsIGRvY1dyaXR0ZW4pO1xuICAgICAgfVxuICAgIH1cbiAgICBuZXh0RG9jKCk7XG4gIH0pO1xufVxuXG4vLyBJbmRleGVkREIgcmVxdWlyZXMgYSB2ZXJzaW9uZWQgZGF0YWJhc2Ugc3RydWN0dXJlLCBzbyB3ZSB1c2UgdGhlXG4vLyB2ZXJzaW9uIGhlcmUgdG8gbWFuYWdlIG1pZ3JhdGlvbnMuXG52YXIgQURBUFRFUl9WRVJTSU9OID0gNTtcblxuLy8gVGhlIG9iamVjdCBzdG9yZXMgY3JlYXRlZCBmb3IgZWFjaCBkYXRhYmFzZVxuLy8gRE9DX1NUT1JFIHN0b3JlcyB0aGUgZG9jdW1lbnQgbWV0YSBkYXRhLCBpdHMgcmV2aXNpb24gaGlzdG9yeSBhbmQgc3RhdGVcbi8vIEtleWVkIGJ5IGRvY3VtZW50IGlkXG52YXIgRE9DX1NUT1JFID0gJ2RvY3VtZW50LXN0b3JlJztcbi8vIEJZX1NFUV9TVE9SRSBzdG9yZXMgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgYSBkb2N1bWVudCwga2V5ZWQgYnkgaXRzXG4vLyBzZXF1ZW5jZSBpZFxudmFyIEJZX1NFUV9TVE9SRSA9ICdieS1zZXF1ZW5jZSc7XG4vLyBXaGVyZSB3ZSBzdG9yZSBhdHRhY2htZW50c1xudmFyIEFUVEFDSF9TVE9SRSA9ICdhdHRhY2gtc3RvcmUnO1xuLy8gV2hlcmUgd2Ugc3RvcmUgbWFueS10by1tYW55IHJlbGF0aW9uc1xuLy8gYmV0d2VlbiBhdHRhY2htZW50IGRpZ2VzdHMgYW5kIHNlcXNcbnZhciBBVFRBQ0hfQU5EX1NFUV9TVE9SRSA9ICdhdHRhY2gtc2VxLXN0b3JlJztcblxuLy8gV2hlcmUgd2Ugc3RvcmUgZGF0YWJhc2Utd2lkZSBtZXRhIGRhdGEgaW4gYSBzaW5nbGUgcmVjb3JkXG4vLyBrZXllZCBieSBpZDogTUVUQV9TVE9SRVxudmFyIE1FVEFfU1RPUkUgPSAnbWV0YS1zdG9yZSc7XG4vLyBXaGVyZSB3ZSBzdG9yZSBsb2NhbCBkb2N1bWVudHNcbnZhciBMT0NBTF9TVE9SRSA9ICdsb2NhbC1zdG9yZSc7XG4vLyBXaGVyZSB3ZSBkZXRlY3QgYmxvYiBzdXBwb3J0XG52YXIgREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSA9ICdkZXRlY3QtYmxvYi1zdXBwb3J0JztcblxuZnVuY3Rpb24gc2FmZUpzb25QYXJzZShzdHIpIHtcbiAgLy8gVGhpcyB0cnkvY2F0Y2ggZ3VhcmRzIGFnYWluc3Qgc3RhY2sgb3ZlcmZsb3cgZXJyb3JzLlxuICAvLyBKU09OLnBhcnNlKCkgaXMgZmFzdGVyIHRoYW4gdnV2dXplbGEucGFyc2UoKSBidXQgdnV2dXplbGFcbiAgLy8gY2Fubm90IG92ZXJmbG93LlxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB2dXZ1emVsYS5wYXJzZShzdHIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVKc29uU3RyaW5naWZ5KGpzb24pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB2dXZ1emVsYS5zdHJpbmdpZnkoanNvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gaWRiRXJyb3IoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChldnQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICd1bmtub3duX2Vycm9yJztcbiAgICBpZiAoZXZ0LnRhcmdldCAmJiBldnQudGFyZ2V0LmVycm9yKSB7XG4gICAgICBtZXNzYWdlID0gZXZ0LnRhcmdldC5lcnJvci5uYW1lIHx8IGV2dC50YXJnZXQuZXJyb3IubWVzc2FnZTtcbiAgICB9XG4gICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoSURCX0VSUk9SLCBtZXNzYWdlLCBldnQudHlwZSkpO1xuICB9O1xufVxuXG4vLyBVbmZvcnR1bmF0ZWx5LCB0aGUgbWV0YWRhdGEgaGFzIHRvIGJlIHN0cmluZ2lmaWVkXG4vLyB3aGVuIGl0IGlzIHB1dCBpbnRvIHRoZSBkYXRhYmFzZSwgYmVjYXVzZSBvdGhlcndpc2Vcbi8vIEluZGV4ZWREQiBjYW4gdGhyb3cgZXJyb3JzIGZvciBkZWVwbHktbmVzdGVkIG9iamVjdHMuXG4vLyBPcmlnaW5hbGx5IHdlIGp1c3QgdXNlZCBKU09OLnBhcnNlL0pTT04uc3RyaW5naWZ5OyBub3dcbi8vIHdlIHVzZSB0aGlzIGN1c3RvbSB2dXZ1emVsYSBsaWJyYXJ5IHRoYXQgYXZvaWRzIHJlY3Vyc2lvbi5cbi8vIElmIHdlIGNvdWxkIGRvIGl0IGFsbCBvdmVyIGFnYWluLCB3ZSdkIHByb2JhYmx5IHVzZSBhXG4vLyBmb3JtYXQgZm9yIHRoZSByZXZpc2lvbiB0cmVlcyBvdGhlciB0aGFuIEpTT04uXG5mdW5jdGlvbiBlbmNvZGVNZXRhZGF0YShtZXRhZGF0YSwgd2lubmluZ1JldiwgZGVsZXRlZCkge1xuICByZXR1cm4ge1xuICAgIGRhdGE6IHNhZmVKc29uU3RyaW5naWZ5KG1ldGFkYXRhKSxcbiAgICB3aW5uaW5nUmV2OiB3aW5uaW5nUmV2LFxuICAgIGRlbGV0ZWRPckxvY2FsOiBkZWxldGVkID8gJzEnIDogJzAnLFxuICAgIHNlcTogbWV0YWRhdGEuc2VxLCAvLyBoaWdoZXN0IHNlcSBmb3IgdGhpcyBkb2NcbiAgICBpZDogbWV0YWRhdGEuaWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlTWV0YWRhdGEoc3RvcmVkT2JqZWN0KSB7XG4gIGlmICghc3RvcmVkT2JqZWN0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIG1ldGFkYXRhID0gc2FmZUpzb25QYXJzZShzdG9yZWRPYmplY3QuZGF0YSk7XG4gIG1ldGFkYXRhLndpbm5pbmdSZXYgPSBzdG9yZWRPYmplY3Qud2lubmluZ1JldjtcbiAgbWV0YWRhdGEuZGVsZXRlZCA9IHN0b3JlZE9iamVjdC5kZWxldGVkT3JMb2NhbCA9PT0gJzEnO1xuICBtZXRhZGF0YS5zZXEgPSBzdG9yZWRPYmplY3Quc2VxO1xuICByZXR1cm4gbWV0YWRhdGE7XG59XG5cbi8vIHJlYWQgdGhlIGRvYyBiYWNrIG91dCBmcm9tIHRoZSBkYXRhYmFzZS4gd2UgZG9uJ3Qgc3RvcmUgdGhlXG4vLyBfaWQgb3IgX3JldiBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSBfZG9jX2lkX3Jldi5cbmZ1bmN0aW9uIGRlY29kZURvYyhkb2MpIHtcbiAgaWYgKCFkb2MpIHtcbiAgICByZXR1cm4gZG9jO1xuICB9XG4gIHZhciBpZHggPSBkb2MuX2RvY19pZF9yZXYubGFzdEluZGV4T2YoJzonKTtcbiAgZG9jLl9pZCA9IGRvYy5fZG9jX2lkX3Jldi5zdWJzdHJpbmcoMCwgaWR4IC0gMSk7XG4gIGRvYy5fcmV2ID0gZG9jLl9kb2NfaWRfcmV2LnN1YnN0cmluZyhpZHggKyAxKTtcbiAgZGVsZXRlIGRvYy5fZG9jX2lkX3JldjtcbiAgcmV0dXJuIGRvYztcbn1cblxuLy8gUmVhZCBhIGJsb2IgZnJvbSB0aGUgZGF0YWJhc2UsIGVuY29kaW5nIGFzIG5lY2Vzc2FyeVxuLy8gYW5kIHRyYW5zbGF0aW5nIGZyb20gYmFzZTY0IGlmIHRoZSBJREIgZG9lc24ndCBzdXBwb3J0XG4vLyBuYXRpdmUgQmxvYnNcbmZ1bmN0aW9uIHJlYWRCbG9iRGF0YShib2R5LCB0eXBlLCBhc0Jsb2IsIGNhbGxiYWNrKSB7XG4gIGlmIChhc0Jsb2IpIHtcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIGNhbGxiYWNrKGNyZWF0ZUJsb2IoWycnXSwge3R5cGU6IHR5cGV9KSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHsgLy8gd2UgaGF2ZSBibG9iIHN1cHBvcnRcbiAgICAgIGNhbGxiYWNrKGJvZHkpO1xuICAgIH0gZWxzZSB7IC8vIG5vIGJsb2Igc3VwcG9ydFxuICAgICAgY2FsbGJhY2soYjY0VG9CbHVmZmVyKGJvZHksIHR5cGUpKTtcbiAgICB9XG4gIH0gZWxzZSB7IC8vIGFzIGJhc2U2NCBzdHJpbmdcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIGNhbGxiYWNrKCcnKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJykgeyAvLyB3ZSBoYXZlIGJsb2Igc3VwcG9ydFxuICAgICAgcmVhZEFzQmluYXJ5U3RyaW5nKGJvZHksIGZ1bmN0aW9uIChiaW5hcnkpIHtcbiAgICAgICAgY2FsbGJhY2sodGhpc0J0b2EoYmluYXJ5KSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgeyAvLyBubyBibG9iIHN1cHBvcnRcbiAgICAgIGNhbGxiYWNrKGJvZHkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmZXRjaEF0dGFjaG1lbnRzSWZOZWNlc3NhcnkoZG9jLCBvcHRzLCB0eG4sIGNiKSB7XG4gIHZhciBhdHRhY2htZW50cyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMgfHwge30pO1xuICBpZiAoIWF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBjYiAmJiBjYigpO1xuICB9XG4gIHZhciBudW1Eb25lID0gMDtcblxuICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgaWYgKCsrbnVtRG9uZSA9PT0gYXR0YWNobWVudHMubGVuZ3RoICYmIGNiKSB7XG4gICAgICBjYigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoQXR0YWNobWVudChkb2MsIGF0dCkge1xuICAgIHZhciBhdHRPYmogPSBkb2MuX2F0dGFjaG1lbnRzW2F0dF07XG4gICAgdmFyIGRpZ2VzdCA9IGF0dE9iai5kaWdlc3Q7XG4gICAgdmFyIHJlcSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpLmdldChkaWdlc3QpO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgYXR0T2JqLmJvZHkgPSBlLnRhcmdldC5yZXN1bHQuYm9keTtcbiAgICAgIGNoZWNrRG9uZSgpO1xuICAgIH07XG4gIH1cblxuICBhdHRhY2htZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChhdHQpIHtcbiAgICBpZiAob3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgZmV0Y2hBdHRhY2htZW50KGRvYywgYXR0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jLl9hdHRhY2htZW50c1thdHRdLnN0dWIgPSB0cnVlO1xuICAgICAgY2hlY2tEb25lKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gSURCLXNwZWNpZmljIHBvc3Rwcm9jZXNzaW5nIG5lY2Vzc2FyeSBiZWNhdXNlXG4vLyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgd2Ugc3RvcmVkIGEgdHJ1ZSBCbG9iIG9yXG4vLyBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZywgYW5kIGlmIGl0J3MgYSBCbG9iIGl0XG4vLyBuZWVkcyB0byBiZSByZWFkIG91dHNpZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbmZ1bmN0aW9uIHBvc3RQcm9jZXNzQXR0YWNobWVudHMocmVzdWx0cywgYXNCbG9iKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzLm1hcChmdW5jdGlvbiAocm93KSB7XG4gICAgaWYgKHJvdy5kb2MgJiYgcm93LmRvYy5fYXR0YWNobWVudHMpIHtcbiAgICAgIHZhciBhdHROYW1lcyA9IE9iamVjdC5rZXlzKHJvdy5kb2MuX2F0dGFjaG1lbnRzKTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChhdHROYW1lcy5tYXAoZnVuY3Rpb24gKGF0dCkge1xuICAgICAgICB2YXIgYXR0T2JqID0gcm93LmRvYy5fYXR0YWNobWVudHNbYXR0XTtcbiAgICAgICAgaWYgKCEoJ2JvZHknIGluIGF0dE9iaikpIHsgLy8gYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJvZHkgPSBhdHRPYmouYm9keTtcbiAgICAgICAgdmFyIHR5cGUgPSBhdHRPYmouY29udGVudF90eXBlO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZWFkQmxvYkRhdGEoYm9keSwgdHlwZSwgYXNCbG9iLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgcm93LmRvYy5fYXR0YWNobWVudHNbYXR0XSA9ICRpbmplY3RfT2JqZWN0X2Fzc2lnbihcbiAgICAgICAgICAgICAgcGljayhhdHRPYmosIFsnZGlnZXN0JywgJ2NvbnRlbnRfdHlwZSddKSxcbiAgICAgICAgICAgICAge2RhdGE6IGRhdGF9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gY29tcGFjdFJldnMocmV2cywgZG9jSWQsIHR4bikge1xuXG4gIHZhciBwb3NzaWJseU9ycGhhbmVkRGlnZXN0cyA9IFtdO1xuICB2YXIgc2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgdmFyIGF0dFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEFUVEFDSF9TVE9SRSk7XG4gIHZhciBhdHRBbmRTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSk7XG4gIHZhciBjb3VudCA9IHJldnMubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICBjb3VudC0tO1xuICAgIGlmICghY291bnQpIHsgLy8gZG9uZSBwcm9jZXNzaW5nIGFsbCByZXZzXG4gICAgICBkZWxldGVPcnBoYW5lZEF0dGFjaG1lbnRzKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlT3JwaGFuZWRBdHRhY2htZW50cygpIHtcbiAgICBpZiAoIXBvc3NpYmx5T3JwaGFuZWREaWdlc3RzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwb3NzaWJseU9ycGhhbmVkRGlnZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChkaWdlc3QpIHtcbiAgICAgIHZhciBjb3VudFJlcSA9IGF0dEFuZFNlcVN0b3JlLmluZGV4KCdkaWdlc3RTZXEnKS5jb3VudChcbiAgICAgICAgSURCS2V5UmFuZ2UuYm91bmQoXG4gICAgICAgICAgZGlnZXN0ICsgJzo6JywgZGlnZXN0ICsgJzo6XFx1ZmZmZicsIGZhbHNlLCBmYWxzZSkpO1xuICAgICAgY291bnRSZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGNvdW50ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoIWNvdW50KSB7XG4gICAgICAgICAgLy8gb3JwaGFuZWRcbiAgICAgICAgICBhdHRTdG9yZS5kZWxldGUoZGlnZXN0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldnMuZm9yRWFjaChmdW5jdGlvbiAocmV2KSB7XG4gICAgdmFyIGluZGV4ID0gc2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG4gICAgdmFyIGtleSA9IGRvY0lkICsgXCI6OlwiICsgcmV2O1xuICAgIGluZGV4LmdldEtleShrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc2VxID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBzZXEgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBjaGVja0RvbmUoKTtcbiAgICAgIH1cbiAgICAgIHNlcVN0b3JlLmRlbGV0ZShzZXEpO1xuXG4gICAgICB2YXIgY3Vyc29yID0gYXR0QW5kU2VxU3RvcmUuaW5kZXgoJ3NlcScpXG4gICAgICAgIC5vcGVuQ3Vyc29yKElEQktleVJhbmdlLm9ubHkoc2VxKSk7XG5cbiAgICAgIGN1cnNvci5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICB2YXIgZGlnZXN0ID0gY3Vyc29yLnZhbHVlLmRpZ2VzdFNlcS5zcGxpdCgnOjonKVswXTtcbiAgICAgICAgICBwb3NzaWJseU9ycGhhbmVkRGlnZXN0cy5wdXNoKGRpZ2VzdCk7XG4gICAgICAgICAgYXR0QW5kU2VxU3RvcmUuZGVsZXRlKGN1cnNvci5wcmltYXJ5S2V5KTtcbiAgICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gZG9uZVxuICAgICAgICAgIGNoZWNrRG9uZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBzdG9yZXMsIG1vZGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHhuOiBpZGIudHJhbnNhY3Rpb24oc3RvcmVzLCBtb2RlKVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZXJyXG4gICAgfTtcbiAgfVxufVxuXG52YXIgY2hhbmdlc0hhbmRsZXIgPSBuZXcgQ2hhbmdlcygpO1xuXG5mdW5jdGlvbiBpZGJCdWxrRG9jcyhkYk9wdHMsIHJlcSwgb3B0cywgYXBpLCBpZGIsIGNhbGxiYWNrKSB7XG4gIHZhciBkb2NJbmZvcyA9IHJlcS5kb2NzO1xuICB2YXIgdHhuO1xuICB2YXIgZG9jU3RvcmU7XG4gIHZhciBieVNlcVN0b3JlO1xuICB2YXIgYXR0YWNoU3RvcmU7XG4gIHZhciBhdHRhY2hBbmRTZXFTdG9yZTtcbiAgdmFyIG1ldGFTdG9yZTtcbiAgdmFyIGRvY0luZm9FcnJvcjtcbiAgdmFyIG1ldGFEb2M7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRvY0luZm9zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGRvYyA9IGRvY0luZm9zW2ldO1xuICAgIGlmIChkb2MuX2lkICYmIGlzTG9jYWxJZChkb2MuX2lkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGRvYyA9IGRvY0luZm9zW2ldID0gcGFyc2VEb2MoZG9jLCBvcHRzLm5ld19lZGl0cywgZGJPcHRzKTtcbiAgICBpZiAoZG9jLmVycm9yICYmICFkb2NJbmZvRXJyb3IpIHtcbiAgICAgIGRvY0luZm9FcnJvciA9IGRvYztcbiAgICB9XG4gIH1cblxuICBpZiAoZG9jSW5mb0Vycm9yKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGRvY0luZm9FcnJvcik7XG4gIH1cblxuICB2YXIgYWxsRG9jc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICB2YXIgZG9jQ291bnREZWx0YSA9IDA7XG4gIHZhciByZXN1bHRzID0gbmV3IEFycmF5KGRvY0luZm9zLmxlbmd0aCk7XG4gIHZhciBmZXRjaGVkRG9jcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICB2YXIgcHJlY29uZGl0aW9uRXJyb3JlZCA9IGZhbHNlO1xuICB2YXIgYmxvYlR5cGUgPSBhcGkuX21ldGEuYmxvYlN1cHBvcnQgPyAnYmxvYicgOiAnYmFzZTY0JztcblxuICBwcmVwcm9jZXNzQXR0YWNobWVudHMoZG9jSW5mb3MsIGJsb2JUeXBlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIHN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gc3RhcnRUcmFuc2FjdGlvbigpIHtcblxuICAgIHZhciBzdG9yZXMgPSBbXG4gICAgICBET0NfU1RPUkUsIEJZX1NFUV9TVE9SRSxcbiAgICAgIEFUVEFDSF9TVE9SRSxcbiAgICAgIExPQ0FMX1NUT1JFLCBBVFRBQ0hfQU5EX1NFUV9TVE9SRSxcbiAgICAgIE1FVEFfU1RPUkVcbiAgICBdO1xuICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBzdG9yZXMsICdyZWFkd3JpdGUnKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICB0eG4ub250aW1lb3V0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHR4bi5vbmNvbXBsZXRlID0gY29tcGxldGU7XG4gICAgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgICBieVNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gICAgYXR0YWNoU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKTtcbiAgICBhdHRhY2hBbmRTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSk7XG4gICAgbWV0YVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpO1xuXG4gICAgbWV0YVN0b3JlLmdldChNRVRBX1NUT1JFKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgbWV0YURvYyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIHVwZGF0ZURvY0NvdW50SWZSZWFkeSgpO1xuICAgIH07XG5cbiAgICB2ZXJpZnlBdHRhY2htZW50cyhmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHByZWNvbmRpdGlvbkVycm9yZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIGZldGNoRXhpc3RpbmdEb2NzKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkFsbERvY3NQcm9jZXNzZWQoKSB7XG4gICAgYWxsRG9jc1Byb2Nlc3NlZCA9IHRydWU7XG4gICAgdXBkYXRlRG9jQ291bnRJZlJlYWR5KCk7XG4gIH1cblxuICBmdW5jdGlvbiBpZGJQcm9jZXNzRG9jcygpIHtcbiAgICBwcm9jZXNzRG9jcyhkYk9wdHMucmV2c19saW1pdCwgZG9jSW5mb3MsIGFwaSwgZmV0Y2hlZERvY3MsXG4gICAgICAgICAgICAgICAgdHhuLCByZXN1bHRzLCB3cml0ZURvYywgb3B0cywgb25BbGxEb2NzUHJvY2Vzc2VkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZURvY0NvdW50SWZSZWFkeSgpIHtcbiAgICBpZiAoIW1ldGFEb2MgfHwgIWFsbERvY3NQcm9jZXNzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gY2FjaGluZyB0aGUgZG9jQ291bnQgc2F2ZXMgYSBsb3Qgb2YgdGltZSBpbiBhbGxEb2NzKCkgYW5kXG4gICAgLy8gaW5mbygpLCB3aGljaCBpcyB3aHkgd2UgZ28gdG8gYWxsIHRoZSB0cm91YmxlIG9mIGRvaW5nIHRoaXNcbiAgICBtZXRhRG9jLmRvY0NvdW50ICs9IGRvY0NvdW50RGVsdGE7XG4gICAgbWV0YVN0b3JlLnB1dChtZXRhRG9jKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoRXhpc3RpbmdEb2NzKCkge1xuXG4gICAgaWYgKCFkb2NJbmZvcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbnVtRmV0Y2hlZCA9IDA7XG5cbiAgICBmdW5jdGlvbiBjaGVja0RvbmUoKSB7XG4gICAgICBpZiAoKytudW1GZXRjaGVkID09PSBkb2NJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgaWRiUHJvY2Vzc0RvY3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkTWV0YWRhdGEoZXZlbnQpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuXG4gICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgZmV0Y2hlZERvY3Muc2V0KG1ldGFkYXRhLmlkLCBtZXRhZGF0YSk7XG4gICAgICB9XG4gICAgICBjaGVja0RvbmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZG9jSW5mb3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBkb2NJbmZvID0gZG9jSW5mb3NbaV07XG4gICAgICBpZiAoZG9jSW5mby5faWQgJiYgaXNMb2NhbElkKGRvY0luZm8uX2lkKSkge1xuICAgICAgICBjaGVja0RvbmUoKTsgLy8gc2tpcCBsb2NhbCBkb2NzXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHJlcSA9IGRvY1N0b3JlLmdldChkb2NJbmZvLm1ldGFkYXRhLmlkKTtcbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSByZWFkTWV0YWRhdGE7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgaWYgKHByZWNvbmRpdGlvbkVycm9yZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjaGFuZ2VzSGFuZGxlci5ub3RpZnkoYXBpLl9tZXRhLm5hbWUpO1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gdmVyaWZ5QXR0YWNobWVudChkaWdlc3QsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgcmVxID0gYXR0YWNoU3RvcmUuZ2V0KGRpZ2VzdCk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUudGFyZ2V0LnJlc3VsdCkge1xuICAgICAgICB2YXIgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19TVFVCLFxuICAgICAgICAgICd1bmtub3duIHN0dWIgYXR0YWNobWVudCB3aXRoIGRpZ2VzdCAnICtcbiAgICAgICAgICBkaWdlc3QpO1xuICAgICAgICBlcnIuc3RhdHVzID0gNDEyO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdmVyaWZ5QXR0YWNobWVudHMoZmluaXNoKSB7XG5cblxuICAgIHZhciBkaWdlc3RzID0gW107XG4gICAgZG9jSW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoZG9jSW5mbykge1xuICAgICAgaWYgKGRvY0luZm8uZGF0YSAmJiBkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHMpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgICAgdmFyIGF0dCA9IGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHNbZmlsZW5hbWVdO1xuICAgICAgICAgIGlmIChhdHQuc3R1Yikge1xuICAgICAgICAgICAgZGlnZXN0cy5wdXNoKGF0dC5kaWdlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFkaWdlc3RzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZpbmlzaCgpO1xuICAgIH1cbiAgICB2YXIgbnVtRG9uZSA9IDA7XG4gICAgdmFyIGVycjtcblxuICAgIGZ1bmN0aW9uIGNoZWNrRG9uZSgpIHtcbiAgICAgIGlmICgrK251bURvbmUgPT09IGRpZ2VzdHMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmlzaChlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgICBkaWdlc3RzLmZvckVhY2goZnVuY3Rpb24gKGRpZ2VzdCkge1xuICAgICAgdmVyaWZ5QXR0YWNobWVudChkaWdlc3QsIGZ1bmN0aW9uIChhdHRFcnIpIHtcbiAgICAgICAgaWYgKGF0dEVyciAmJiAhZXJyKSB7XG4gICAgICAgICAgZXJyID0gYXR0RXJyO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrRG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZURvYyhkb2NJbmZvLCB3aW5uaW5nUmV2JCQxLCB3aW5uaW5nUmV2SXNEZWxldGVkLCBuZXdSZXZJc0RlbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgIGlzVXBkYXRlLCBkZWx0YSwgcmVzdWx0c0lkeCwgY2FsbGJhY2spIHtcblxuICAgIGRvY0luZm8ubWV0YWRhdGEud2lubmluZ1JldiA9IHdpbm5pbmdSZXYkJDE7XG4gICAgZG9jSW5mby5tZXRhZGF0YS5kZWxldGVkID0gd2lubmluZ1JldklzRGVsZXRlZDtcblxuICAgIHZhciBkb2MgPSBkb2NJbmZvLmRhdGE7XG4gICAgZG9jLl9pZCA9IGRvY0luZm8ubWV0YWRhdGEuaWQ7XG4gICAgZG9jLl9yZXYgPSBkb2NJbmZvLm1ldGFkYXRhLnJldjtcblxuICAgIGlmIChuZXdSZXZJc0RlbGV0ZWQpIHtcbiAgICAgIGRvYy5fZGVsZXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGhhc0F0dGFjaG1lbnRzID0gZG9jLl9hdHRhY2htZW50cyAmJlxuICAgICAgT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cykubGVuZ3RoO1xuICAgIGlmIChoYXNBdHRhY2htZW50cykge1xuICAgICAgcmV0dXJuIHdyaXRlQXR0YWNobWVudHMoZG9jSW5mbywgd2lubmluZ1JldiQkMSwgd2lubmluZ1JldklzRGVsZXRlZCxcbiAgICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBkb2NDb3VudERlbHRhICs9IGRlbHRhO1xuICAgIHVwZGF0ZURvY0NvdW50SWZSZWFkeSgpO1xuXG4gICAgZmluaXNoRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICBpc1VwZGF0ZSwgcmVzdWx0c0lkeCwgY2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluaXNoRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICBpc1VwZGF0ZSwgcmVzdWx0c0lkeCwgY2FsbGJhY2spIHtcblxuICAgIHZhciBkb2MgPSBkb2NJbmZvLmRhdGE7XG4gICAgdmFyIG1ldGFkYXRhID0gZG9jSW5mby5tZXRhZGF0YTtcblxuICAgIGRvYy5fZG9jX2lkX3JldiA9IG1ldGFkYXRhLmlkICsgJzo6JyArIG1ldGFkYXRhLnJldjtcbiAgICBkZWxldGUgZG9jLl9pZDtcbiAgICBkZWxldGUgZG9jLl9yZXY7XG5cbiAgICBmdW5jdGlvbiBhZnRlclB1dERvYyhlKSB7XG4gICAgICB2YXIgcmV2c1RvRGVsZXRlID0gZG9jSW5mby5zdGVtbWVkUmV2cyB8fCBbXTtcblxuICAgICAgaWYgKGlzVXBkYXRlICYmIGFwaS5hdXRvX2NvbXBhY3Rpb24pIHtcbiAgICAgICAgcmV2c1RvRGVsZXRlID0gcmV2c1RvRGVsZXRlLmNvbmNhdChjb21wYWN0VHJlZShkb2NJbmZvLm1ldGFkYXRhKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXZzVG9EZWxldGUgJiYgcmV2c1RvRGVsZXRlLmxlbmd0aCkge1xuICAgICAgICBjb21wYWN0UmV2cyhyZXZzVG9EZWxldGUsIGRvY0luZm8ubWV0YWRhdGEuaWQsIHR4bik7XG4gICAgICB9XG5cbiAgICAgIG1ldGFkYXRhLnNlcSA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIC8vIEN1cnJlbnQgX3JldiBpcyBjYWxjdWxhdGVkIGZyb20gX3Jldl90cmVlIG9uIHJlYWRcbiAgICAgIC8vIGRlbGV0ZSBtZXRhZGF0YS5yZXY7XG4gICAgICB2YXIgbWV0YWRhdGFUb1N0b3JlID0gZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsIHdpbm5pbmdSZXYkJDEsXG4gICAgICAgIHdpbm5pbmdSZXZJc0RlbGV0ZWQpO1xuICAgICAgdmFyIG1ldGFEYXRhUmVxID0gZG9jU3RvcmUucHV0KG1ldGFkYXRhVG9TdG9yZSk7XG4gICAgICBtZXRhRGF0YVJlcS5vbnN1Y2Nlc3MgPSBhZnRlclB1dE1ldGFkYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFmdGVyUHV0RG9jRXJyb3IoZSkge1xuICAgICAgLy8gQ29uc3RyYWludEVycm9yLCBuZWVkIHRvIHVwZGF0ZSwgbm90IHB1dCAoc2VlICMxNjM4IGZvciBkZXRhaWxzKVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBhdm9pZCB0cmFuc2FjdGlvbiBhYm9ydFxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gb25lcnJvclxuICAgICAgdmFyIGluZGV4ID0gYnlTZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKTtcbiAgICAgIHZhciBnZXRLZXlSZXEgPSBpbmRleC5nZXRLZXkoZG9jLl9kb2NfaWRfcmV2KTtcbiAgICAgIGdldEtleVJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgcHV0UmVxID0gYnlTZXFTdG9yZS5wdXQoZG9jLCBlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICBwdXRSZXEub25zdWNjZXNzID0gYWZ0ZXJQdXREb2M7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFmdGVyUHV0TWV0YWRhdGEoKSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHNJZHhdID0ge1xuICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgaWQ6IG1ldGFkYXRhLmlkLFxuICAgICAgICByZXY6IG1ldGFkYXRhLnJldlxuICAgICAgfTtcbiAgICAgIGZldGNoZWREb2NzLnNldChkb2NJbmZvLm1ldGFkYXRhLmlkLCBkb2NJbmZvLm1ldGFkYXRhKTtcbiAgICAgIGluc2VydEF0dGFjaG1lbnRNYXBwaW5ncyhkb2NJbmZvLCBtZXRhZGF0YS5zZXEsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICB2YXIgcHV0UmVxID0gYnlTZXFTdG9yZS5wdXQoZG9jKTtcblxuICAgIHB1dFJlcS5vbnN1Y2Nlc3MgPSBhZnRlclB1dERvYztcbiAgICBwdXRSZXEub25lcnJvciA9IGFmdGVyUHV0RG9jRXJyb3I7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZUF0dGFjaG1lbnRzKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKSB7XG5cblxuICAgIHZhciBkb2MgPSBkb2NJbmZvLmRhdGE7XG5cbiAgICB2YXIgbnVtRG9uZSA9IDA7XG4gICAgdmFyIGF0dGFjaG1lbnRzID0gT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cyk7XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0UmVzdWx0cygpIHtcbiAgICAgIGlmIChudW1Eb25lID09PSBhdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZmluaXNoRG9jKGRvY0luZm8sIHdpbm5pbmdSZXYkJDEsIHdpbm5pbmdSZXZJc0RlbGV0ZWQsXG4gICAgICAgICAgaXNVcGRhdGUsIHJlc3VsdHNJZHgsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhdHRhY2htZW50U2F2ZWQoKSB7XG4gICAgICBudW1Eb25lKys7XG4gICAgICBjb2xsZWN0UmVzdWx0cygpO1xuICAgIH1cblxuICAgIGF0dGFjaG1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGF0dCA9IGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHNba2V5XTtcbiAgICAgIGlmICghYXR0LnN0dWIpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhdHQuZGF0YTtcbiAgICAgICAgZGVsZXRlIGF0dC5kYXRhO1xuICAgICAgICBhdHQucmV2cG9zID0gcGFyc2VJbnQod2lubmluZ1JldiQkMSwgMTApO1xuICAgICAgICB2YXIgZGlnZXN0ID0gYXR0LmRpZ2VzdDtcbiAgICAgICAgc2F2ZUF0dGFjaG1lbnQoZGlnZXN0LCBkYXRhLCBhdHRhY2htZW50U2F2ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtRG9uZSsrO1xuICAgICAgICBjb2xsZWN0UmVzdWx0cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gbWFwIHNlcXMgdG8gYXR0YWNobWVudCBkaWdlc3RzLCB3aGljaFxuICAvLyB3ZSB3aWxsIG5lZWQgbGF0ZXIgZHVyaW5nIGNvbXBhY3Rpb25cbiAgZnVuY3Rpb24gaW5zZXJ0QXR0YWNobWVudE1hcHBpbmdzKGRvY0luZm8sIHNlcSwgY2FsbGJhY2spIHtcblxuICAgIHZhciBhdHRzQWRkZWQgPSAwO1xuICAgIHZhciBhdHRzVG9BZGQgPSBPYmplY3Qua2V5cyhkb2NJbmZvLmRhdGEuX2F0dGFjaG1lbnRzIHx8IHt9KTtcblxuICAgIGlmICghYXR0c1RvQWRkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tEb25lKCkge1xuICAgICAgaWYgKCsrYXR0c0FkZGVkID09PSBhdHRzVG9BZGQubGVuZ3RoKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkKGF0dCkge1xuICAgICAgdmFyIGRpZ2VzdCA9IGRvY0luZm8uZGF0YS5fYXR0YWNobWVudHNbYXR0XS5kaWdlc3Q7XG4gICAgICB2YXIgcmVxID0gYXR0YWNoQW5kU2VxU3RvcmUucHV0KHtcbiAgICAgICAgc2VxOiBzZXEsXG4gICAgICAgIGRpZ2VzdFNlcTogZGlnZXN0ICsgJzo6JyArIHNlcVxuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBjaGVja0RvbmU7XG4gICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIHRoaXMgY2FsbGJhY2sgaXMgZm9yIGEgY29uc3RhaW50IGVycm9yLCB3aGljaCB3ZSBpZ25vcmVcbiAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGRvY2lkL3JldiBoYXMgYWxyZWFkeSBiZWVuIGFzc29jaWF0ZWQgd2l0aFxuICAgICAgICAvLyB0aGUgZGlnZXN0IChlLmcuIHdoZW4gbmV3X2VkaXRzID09IGZhbHNlKVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIGFib3J0XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIHRyYW5zYWN0aW9uIG9uZXJyb3JcbiAgICAgICAgY2hlY2tEb25lKCk7XG4gICAgICB9O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHNUb0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgYWRkKGF0dHNUb0FkZFtpXSk7IC8vIGRvIGluIHBhcmFsbGVsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUF0dGFjaG1lbnQoZGlnZXN0LCBkYXRhLCBjYWxsYmFjaykge1xuXG5cbiAgICB2YXIgZ2V0S2V5UmVxID0gYXR0YWNoU3RvcmUuY291bnQoZGlnZXN0KTtcbiAgICBnZXRLZXlSZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjb3VudCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmIChjb3VudCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsgLy8gYWxyZWFkeSBleGlzdHNcbiAgICAgIH1cbiAgICAgIHZhciBuZXdBdHQgPSB7XG4gICAgICAgIGRpZ2VzdDogZGlnZXN0LFxuICAgICAgICBib2R5OiBkYXRhXG4gICAgICB9O1xuICAgICAgdmFyIHB1dFJlcSA9IGF0dGFjaFN0b3JlLnB1dChuZXdBdHQpO1xuICAgICAgcHV0UmVxLm9uc3VjY2VzcyA9IGNhbGxiYWNrO1xuICAgIH07XG4gIH1cbn1cblxuLy8gQWJzdHJhY3Rpb24gb3ZlciBJREJDdXJzb3IgYW5kIGdldEFsbCgpL2dldEFsbEtleXMoKSB0aGF0IGFsbG93cyB1cyB0byBiYXRjaCBvdXIgb3BlcmF0aW9uc1xuLy8gd2hpbGUgZmFsbGluZyBiYWNrIHRvIGEgbm9ybWFsIElEQkN1cnNvciBvcGVyYXRpb24gb24gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGdldEFsbCgpIG9yXG4vLyBnZXRBbGxLZXlzKCkuIFRoaXMgYWxsb3dzIGZvciBhIG11Y2ggZmFzdGVyIGltcGxlbWVudGF0aW9uIHRoYW4ganVzdCBzdHJhaWdodC11cCBjdXJzb3JzLCBiZWNhdXNlXG4vLyB3ZSdyZSBub3QgcHJvY2Vzc2luZyBlYWNoIGRvY3VtZW50IG9uZS1hdC1hLXRpbWUuXG5mdW5jdGlvbiBydW5CYXRjaGVkQ3Vyc29yKG9iamVjdFN0b3JlLCBrZXlSYW5nZSwgZGVzY2VuZGluZywgYmF0Y2hTaXplLCBvbkJhdGNoKSB7XG5cbiAgaWYgKGJhdGNoU2l6ZSA9PT0gLTEpIHtcbiAgICBiYXRjaFNpemUgPSAxMDAwO1xuICB9XG5cbiAgLy8gQmFpbCBvdXQgb2YgZ2V0QWxsKCkvZ2V0QWxsS2V5cygpIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gIC8vIDEpIGVpdGhlciBtZXRob2QgaXMgdW5zdXBwb3J0ZWQgLSB3ZSBuZWVkIGJvdGhcbiAgLy8gMikgYmF0Y2hTaXplIGlzIDEgKG1pZ2h0IGFzIHdlbGwgdXNlIElEQkN1cnNvcilcbiAgLy8gMykgZGVzY2VuZGluZyDigJMgbm8gcmVhbCB3YXkgdG8gZG8gdGhpcyB2aWEgZ2V0QWxsKCkvZ2V0QWxsS2V5cygpXG5cbiAgdmFyIHVzZUdldEFsbCA9IHR5cGVvZiBvYmplY3RTdG9yZS5nZXRBbGwgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0U3RvcmUuZ2V0QWxsS2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIGJhdGNoU2l6ZSA+IDEgJiYgIWRlc2NlbmRpbmc7XG5cbiAgdmFyIGtleXNCYXRjaDtcbiAgdmFyIHZhbHVlc0JhdGNoO1xuICB2YXIgcHNldWRvQ3Vyc29yO1xuXG4gIGZ1bmN0aW9uIG9uR2V0QWxsKGUpIHtcbiAgICB2YWx1ZXNCYXRjaCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAoa2V5c0JhdGNoKSB7XG4gICAgICBvbkJhdGNoKGtleXNCYXRjaCwgdmFsdWVzQmF0Y2gsIHBzZXVkb0N1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25HZXRBbGxLZXlzKGUpIHtcbiAgICBrZXlzQmF0Y2ggPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKHZhbHVlc0JhdGNoKSB7XG4gICAgICBvbkJhdGNoKGtleXNCYXRjaCwgdmFsdWVzQmF0Y2gsIHBzZXVkb0N1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGludWVQc2V1ZG9DdXJzb3IoKSB7XG4gICAgaWYgKCFrZXlzQmF0Y2gubGVuZ3RoKSB7IC8vIG5vIG1vcmUgcmVzdWx0c1xuICAgICAgcmV0dXJuIG9uQmF0Y2goKTtcbiAgICB9XG4gICAgLy8gZmV0Y2ggbmV4dCBiYXRjaCwgZXhjbHVzaXZlIHN0YXJ0XG4gICAgdmFyIGxhc3RLZXkgPSBrZXlzQmF0Y2hba2V5c0JhdGNoLmxlbmd0aCAtIDFdO1xuICAgIHZhciBuZXdLZXlSYW5nZTtcbiAgICBpZiAoa2V5UmFuZ2UgJiYga2V5UmFuZ2UudXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0tleVJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQobGFzdEtleSwga2V5UmFuZ2UudXBwZXIsXG4gICAgICAgICAgdHJ1ZSwga2V5UmFuZ2UudXBwZXJPcGVuKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gXCJEYXRhRXJyb3JcIiAmJiBlLmNvZGUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gb25CYXRjaCgpOyAvLyB3ZSdyZSBkb25lLCBzdGFydGtleSBhbmQgZW5ka2V5IGFyZSBlcXVhbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0tleVJhbmdlID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChsYXN0S2V5LCB0cnVlKTtcbiAgICB9XG4gICAga2V5UmFuZ2UgPSBuZXdLZXlSYW5nZTtcbiAgICBrZXlzQmF0Y2ggPSBudWxsO1xuICAgIHZhbHVlc0JhdGNoID0gbnVsbDtcbiAgICBvYmplY3RTdG9yZS5nZXRBbGwoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGw7XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsS2V5cyhrZXlSYW5nZSwgYmF0Y2hTaXplKS5vbnN1Y2Nlc3MgPSBvbkdldEFsbEtleXM7XG4gIH1cblxuICBmdW5jdGlvbiBvbkN1cnNvcihlKSB7XG4gICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAoIWN1cnNvcikgeyAvLyBkb25lXG4gICAgICByZXR1cm4gb25CYXRjaCgpO1xuICAgIH1cbiAgICAvLyByZWd1bGFyIElEQkN1cnNvciBhY3RzIGxpa2UgYSBiYXRjaCB3aGVyZSBiYXRjaCBzaXplIGlzIGFsd2F5cyAxXG4gICAgb25CYXRjaChbY3Vyc29yLmtleV0sIFtjdXJzb3IudmFsdWVdLCBjdXJzb3IpO1xuICB9XG5cbiAgaWYgKHVzZUdldEFsbCkge1xuICAgIHBzZXVkb0N1cnNvciA9IHtcImNvbnRpbnVlXCI6IGNvbnRpbnVlUHNldWRvQ3Vyc29yfTtcbiAgICBvYmplY3RTdG9yZS5nZXRBbGwoa2V5UmFuZ2UsIGJhdGNoU2l6ZSkub25zdWNjZXNzID0gb25HZXRBbGw7XG4gICAgb2JqZWN0U3RvcmUuZ2V0QWxsS2V5cyhrZXlSYW5nZSwgYmF0Y2hTaXplKS5vbnN1Y2Nlc3MgPSBvbkdldEFsbEtleXM7XG4gIH0gZWxzZSBpZiAoZGVzY2VuZGluZykge1xuICAgIG9iamVjdFN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2UsICdwcmV2Jykub25zdWNjZXNzID0gb25DdXJzb3I7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSkub25zdWNjZXNzID0gb25DdXJzb3I7XG4gIH1cbn1cblxuLy8gc2ltcGxlIHNoaW0gZm9yIG9iamVjdFN0b3JlLmdldEFsbCgpLCBmYWxsaW5nIGJhY2sgdG8gSURCQ3Vyc29yXG5mdW5jdGlvbiBnZXRBbGwob2JqZWN0U3RvcmUsIGtleVJhbmdlLCBvblN1Y2Nlc3MpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3RTdG9yZS5nZXRBbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyB1c2UgbmF0aXZlIGdldEFsbFxuICAgIG9iamVjdFN0b3JlLmdldEFsbChrZXlSYW5nZSkub25zdWNjZXNzID0gb25TdWNjZXNzO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBmYWxsIGJhY2sgdG8gY3Vyc29yc1xuICB2YXIgdmFsdWVzID0gW107XG5cbiAgZnVuY3Rpb24gb25DdXJzb3IoZSkge1xuICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaWYgKGN1cnNvcikge1xuICAgICAgdmFsdWVzLnB1c2goY3Vyc29yLnZhbHVlKTtcbiAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvblN1Y2Nlc3Moe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICByZXN1bHQ6IHZhbHVlc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKS5vbnN1Y2Nlc3MgPSBvbkN1cnNvcjtcbn1cblxuZnVuY3Rpb24gYWxsRG9jc0tleXMoa2V5cywgZG9jU3RvcmUsIG9uQmF0Y2gpIHtcbiAgLy8gSXQncyBub3QgZ3VhcmFudGVkIHRvIGJlIHJldHVybmVkIGluIHJpZ2h0IG9yZGVyICBcbiAgdmFyIHZhbHVlc0JhdGNoID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgdmFyIGNvdW50ID0gMDtcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIGluZGV4KSB7XG4gICAgZG9jU3RvcmUuZ2V0KGtleSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LnJlc3VsdCkge1xuICAgICAgICB2YWx1ZXNCYXRjaFtpbmRleF0gPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzQmF0Y2hbaW5kZXhdID0ge2tleToga2V5LCBlcnJvcjogJ25vdF9mb3VuZCd9O1xuICAgICAgfVxuICAgICAgY291bnQrKztcbiAgICAgIGlmIChjb3VudCA9PT0ga2V5cy5sZW5ndGgpIHtcbiAgICAgICAgb25CYXRjaChrZXlzLCB2YWx1ZXNCYXRjaCwge30pO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXlSYW5nZShzdGFydCwgZW5kLCBpbmNsdXNpdmVFbmQsIGtleSwgZGVzY2VuZGluZykge1xuICB0cnkge1xuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgIGlmIChkZXNjZW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5ib3VuZChlbmQsIHN0YXJ0LCAhaW5jbHVzaXZlRW5kLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoc3RhcnQsIGVuZCwgZmFsc2UsICFpbmNsdXNpdmVFbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RhcnQpIHtcbiAgICAgIGlmIChkZXNjZW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS51cHBlckJvdW5kKHN0YXJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHN0YXJ0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuZCkge1xuICAgICAgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmxvd2VyQm91bmQoZW5kLCAhaW5jbHVzaXZlRW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBJREJLZXlSYW5nZS51cHBlckJvdW5kKGVuZCwgIWluY2x1c2l2ZUVuZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChrZXkpIHtcbiAgICAgIHJldHVybiBJREJLZXlSYW5nZS5vbmx5KGtleSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHtlcnJvcjogZX07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlkYkFsbERvY3Mob3B0cywgaWRiLCBjYWxsYmFjaykge1xuICB2YXIgc3RhcnQgPSAnc3RhcnRrZXknIGluIG9wdHMgPyBvcHRzLnN0YXJ0a2V5IDogZmFsc2U7XG4gIHZhciBlbmQgPSAnZW5ka2V5JyBpbiBvcHRzID8gb3B0cy5lbmRrZXkgOiBmYWxzZTtcbiAgdmFyIGtleSA9ICdrZXknIGluIG9wdHMgPyBvcHRzLmtleSA6IGZhbHNlO1xuICB2YXIga2V5cyA9ICdrZXlzJyBpbiBvcHRzID8gb3B0cy5rZXlzIDogZmFsc2U7IFxuICB2YXIgc2tpcCA9IG9wdHMuc2tpcCB8fCAwO1xuICB2YXIgbGltaXQgPSB0eXBlb2Ygb3B0cy5saW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmxpbWl0IDogLTE7XG4gIHZhciBpbmNsdXNpdmVFbmQgPSBvcHRzLmluY2x1c2l2ZV9lbmQgIT09IGZhbHNlO1xuXG4gIHZhciBrZXlSYW5nZSA7IFxuICB2YXIga2V5UmFuZ2VFcnJvcjtcbiAgaWYgKCFrZXlzKSB7XG4gICAga2V5UmFuZ2UgPSBjcmVhdGVLZXlSYW5nZShzdGFydCwgZW5kLCBpbmNsdXNpdmVFbmQsIGtleSwgb3B0cy5kZXNjZW5kaW5nKTtcbiAgICBrZXlSYW5nZUVycm9yID0ga2V5UmFuZ2UgJiYga2V5UmFuZ2UuZXJyb3I7XG4gICAgaWYgKGtleVJhbmdlRXJyb3IgJiYgXG4gICAgICAhKGtleVJhbmdlRXJyb3IubmFtZSA9PT0gXCJEYXRhRXJyb3JcIiAmJiBrZXlSYW5nZUVycm9yLmNvZGUgPT09IDApKSB7XG4gICAgICAvLyBEYXRhRXJyb3Igd2l0aCBlcnJvciBjb2RlIDAgaW5kaWNhdGVzIHN0YXJ0IGlzIGxlc3MgdGhhbiBlbmQsIHNvXG4gICAgICAvLyBjYW4ganVzdCBkbyBhbiBlbXB0eSBxdWVyeS4gRWxzZSBuZWVkIHRvIHRocm93XG4gICAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlRXJyb3IoSURCX0VSUk9SLFxuICAgICAgICBrZXlSYW5nZUVycm9yLm5hbWUsIGtleVJhbmdlRXJyb3IubWVzc2FnZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdG9yZXMgPSBbRE9DX1NUT1JFLCBCWV9TRVFfU1RPUkUsIE1FVEFfU1RPUkVdO1xuXG4gIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgc3RvcmVzLnB1c2goQVRUQUNIX1NUT1JFKTtcbiAgfVxuICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCAncmVhZG9ubHknKTtcbiAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICB9XG4gIHZhciB0eG4gPSB0eG5SZXN1bHQudHhuO1xuICB0eG4ub25jb21wbGV0ZSA9IG9uVHhuQ29tcGxldGU7XG4gIHR4bi5vbmFib3J0ID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICB2YXIgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgdmFyIHNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gIHZhciBtZXRhU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSk7XG4gIHZhciBkb2NJZFJldkluZGV4ID0gc2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBkb2NDb3VudDtcbiAgdmFyIHVwZGF0ZVNlcTtcblxuICBtZXRhU3RvcmUuZ2V0KE1FVEFfU1RPUkUpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZG9jQ291bnQgPSBlLnRhcmdldC5yZXN1bHQuZG9jQ291bnQ7XG4gIH07XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICBnZXRNYXhVcGRhdGVTZXEoc2VxU3RvcmUsIGZ1bmN0aW9uIChlKSB7IFxuICAgICAgaWYgKGUudGFyZ2V0LnJlc3VsdCAmJiBlLnRhcmdldC5yZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICB1cGRhdGVTZXEgPSBlLnRhcmdldC5yZXN1bHRbMF07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNYXhVcGRhdGVTZXEob2JqZWN0U3RvcmUsIG9uU3VjY2Vzcykge1xuICAgIGZ1bmN0aW9uIG9uQ3Vyc29yKGUpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICB2YXIgbWF4S2V5ID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGN1cnNvciAmJiBjdXJzb3Iua2V5KSB7XG4gICAgICAgIG1heEtleSA9IGN1cnNvci5rZXk7XG4gICAgICB9IFxuICAgICAgcmV0dXJuIG9uU3VjY2Vzcyh7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHJlc3VsdDogW21heEtleV1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIG9iamVjdFN0b3JlLm9wZW5DdXJzb3IobnVsbCwgJ3ByZXYnKS5vbnN1Y2Nlc3MgPSBvbkN1cnNvcjtcbiAgfVxuXG4gIC8vIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBpbmNsdWRlX2RvY3M9dHJ1ZSwgdGhlbiB3ZSBkb24ndFxuICAvLyB3YW50IHRvIGJsb2NrIHRoZSBtYWluIGN1cnNvciB3aGlsZSB3ZSdyZSBmZXRjaGluZyB0aGUgZG9jXG4gIGZ1bmN0aW9uIGZldGNoRG9jQXN5bmNocm9ub3VzbHkobWV0YWRhdGEsIHJvdywgd2lubmluZ1JldiQkMSkge1xuICAgIHZhciBrZXkgPSBtZXRhZGF0YS5pZCArIFwiOjpcIiArIHdpbm5pbmdSZXYkJDE7XG4gICAgZG9jSWRSZXZJbmRleC5nZXQoa2V5KS5vbnN1Y2Nlc3MgPSAgZnVuY3Rpb24gb25HZXREb2MoZSkge1xuICAgICAgcm93LmRvYyA9IGRlY29kZURvYyhlLnRhcmdldC5yZXN1bHQpIHx8IHt9O1xuICAgICAgaWYgKG9wdHMuY29uZmxpY3RzKSB7XG4gICAgICAgIHZhciBjb25mbGljdHMgPSBjb2xsZWN0Q29uZmxpY3RzKG1ldGFkYXRhKTtcbiAgICAgICAgaWYgKGNvbmZsaWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICByb3cuZG9jLl9jb25mbGljdHMgPSBjb25mbGljdHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZldGNoQXR0YWNobWVudHNJZk5lY2Vzc2FyeShyb3cuZG9jLCBvcHRzLCB0eG4pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhbGxEb2NzSW5uZXIod2lubmluZ1JldiQkMSwgbWV0YWRhdGEpIHtcbiAgICB2YXIgcm93ID0ge1xuICAgICAgaWQ6IG1ldGFkYXRhLmlkLFxuICAgICAga2V5OiBtZXRhZGF0YS5pZCxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHJldjogd2lubmluZ1JldiQkMVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGRlbGV0ZWQgPSBtZXRhZGF0YS5kZWxldGVkO1xuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICBpZiAoa2V5cykge1xuICAgICAgICByZXN1bHRzLnB1c2gocm93KTtcbiAgICAgICAgLy8gZGVsZXRlZCBkb2NzIGFyZSBva2F5IHdpdGggXCJrZXlzXCIgcmVxdWVzdHNcbiAgICAgICAgcm93LnZhbHVlLmRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICByb3cuZG9jID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNraXAtLSA8PSAwKSB7XG4gICAgICByZXN1bHRzLnB1c2gocm93KTtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcykge1xuICAgICAgICBmZXRjaERvY0FzeW5jaHJvbm91c2x5KG1ldGFkYXRhLCByb3csIHdpbm5pbmdSZXYkJDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NCYXRjaChiYXRjaFZhbHVlcykge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBiYXRjaFZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSBsaW1pdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHZhciBiYXRjaFZhbHVlID0gYmF0Y2hWYWx1ZXNbaV07XG4gICAgICBpZiAoYmF0Y2hWYWx1ZS5lcnJvciAmJiBrZXlzKSB7XG4gICAgICAgIC8vIGtleSB3YXMgbm90IGZvdW5kIHdpdGggXCJrZXlzXCIgcmVxdWVzdHNcbiAgICAgICAgcmVzdWx0cy5wdXNoKGJhdGNoVmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBtZXRhZGF0YSA9IGRlY29kZU1ldGFkYXRhKGJhdGNoVmFsdWUpO1xuICAgICAgdmFyIHdpbm5pbmdSZXYkJDEgPSBtZXRhZGF0YS53aW5uaW5nUmV2O1xuICAgICAgYWxsRG9jc0lubmVyKHdpbm5pbmdSZXYkJDEsIG1ldGFkYXRhKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkJhdGNoKGJhdGNoS2V5cywgYmF0Y2hWYWx1ZXMsIGN1cnNvcikge1xuICAgIGlmICghY3Vyc29yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3NCYXRjaChiYXRjaFZhbHVlcyk7XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoIDwgbGltaXQpIHtcbiAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2V0QWxsKGUpIHtcbiAgICB2YXIgdmFsdWVzID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgIHZhbHVlcyA9IHZhbHVlcy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIHByb2Nlc3NCYXRjaCh2YWx1ZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25SZXN1bHRzUmVhZHkoKSB7XG4gICAgdmFyIHJldHVyblZhbCA9IHtcbiAgICAgIHRvdGFsX3Jvd3M6IGRvY0NvdW50LFxuICAgICAgb2Zmc2V0OiBvcHRzLnNraXAsXG4gICAgICByb3dzOiByZXN1bHRzXG4gICAgfTtcbiAgICBcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAob3B0cy51cGRhdGVfc2VxICYmIHVwZGF0ZVNlcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5WYWwudXBkYXRlX3NlcSA9IHVwZGF0ZVNlcTtcbiAgICB9XG4gICAgY2FsbGJhY2sobnVsbCwgcmV0dXJuVmFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHhuQ29tcGxldGUoKSB7XG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIHBvc3RQcm9jZXNzQXR0YWNobWVudHMocmVzdWx0cywgb3B0cy5iaW5hcnkpLnRoZW4ob25SZXN1bHRzUmVhZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvblJlc3VsdHNSZWFkeSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRvbid0IGJvdGhlciBkb2luZyBhbnkgcmVxdWVzdHMgaWYgc3RhcnQgPiBlbmQgb3IgbGltaXQgPT09IDBcbiAgaWYgKGtleVJhbmdlRXJyb3IgfHwgbGltaXQgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGtleXMpIHtcbiAgICByZXR1cm4gYWxsRG9jc0tleXMob3B0cy5rZXlzLCBkb2NTdG9yZSwgb25CYXRjaCk7XG4gIH1cbiAgaWYgKGxpbWl0ID09PSAtMSkgeyAvLyBqdXN0IGZldGNoIGV2ZXJ5dGhpbmdcbiAgICByZXR1cm4gZ2V0QWxsKGRvY1N0b3JlLCBrZXlSYW5nZSwgb25HZXRBbGwpO1xuICB9XG4gIC8vIGVsc2UgZG8gYSBjdXJzb3JcbiAgLy8gY2hvb3NlIGEgYmF0Y2ggc2l6ZSBiYXNlZCBvbiB0aGUgc2tpcCwgc2luY2Ugd2UnbGwgbmVlZCB0byBza2lwIHRoYXQgbWFueVxuICBydW5CYXRjaGVkQ3Vyc29yKGRvY1N0b3JlLCBrZXlSYW5nZSwgb3B0cy5kZXNjZW5kaW5nLCBsaW1pdCArIHNraXAsIG9uQmF0Y2gpO1xufVxuXG4vL1xuLy8gQmxvYnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYWxsIHZlcnNpb25zIG9mIEluZGV4ZWREQiwgbm90YWJseVxuLy8gQ2hyb21lIDwzNyBhbmQgQW5kcm9pZCA8NS4gSW4gdGhvc2UgdmVyc2lvbnMsIHN0b3JpbmcgYSBibG9iIHdpbGwgdGhyb3cuXG4vL1xuLy8gVmFyaW91cyBvdGhlciBibG9iIGJ1Z3MgZXhpc3QgaW4gQ2hyb21lIHYzNy00MiAoaW5jbHVzaXZlKS5cbi8vIERldGVjdGluZyB0aGVtIGlzIGV4cGVuc2l2ZSBhbmQgY29uZnVzaW5nIHRvIHVzZXJzLCBhbmQgQ2hyb21lIDM3LTQyXG4vLyBpcyBhdCB2ZXJ5IGxvdyB1c2FnZSB3b3JsZHdpZGUsIHNvIHdlIGRvIGEgaGFja3kgdXNlckFnZW50IGNoZWNrIGluc3RlYWQuXG4vL1xuLy8gY29udGVudC10eXBlIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQwODEyMFxuLy8gNDA0IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0NzkxNlxuLy8gRmlsZVJlYWRlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc4MzZcbi8vXG5mdW5jdGlvbiBjaGVja0Jsb2JTdXBwb3J0KHR4bikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICB2YXIgYmxvYiQkMSA9IGNyZWF0ZUJsb2IoWycnXSk7XG4gICAgdmFyIHJlcSA9IHR4bi5vYmplY3RTdG9yZShERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFKS5wdXQoYmxvYiQkMSwgJ2tleScpO1xuXG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBtYXRjaGVkQ2hyb21lID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgICB2YXIgbWF0Y2hlZEVkZ2UgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvLyk7XG4gICAgICAvLyBNUyBFZGdlIHByZXRlbmRzIHRvIGJlIENocm9tZSA0MjpcbiAgICAgIC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaGg4NjkzMDElMjh2PXZzLjg1JTI5LmFzcHhcbiAgICAgIHJlc29sdmUobWF0Y2hlZEVkZ2UgfHwgIW1hdGNoZWRDaHJvbWUgfHxcbiAgICAgICAgcGFyc2VJbnQobWF0Y2hlZENocm9tZVsxXSwgMTApID49IDQzKTtcbiAgICB9O1xuXG4gICAgcmVxLm9uZXJyb3IgPSB0eG4ub25hYm9ydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBJZiB0aGUgdHJhbnNhY3Rpb24gYWJvcnRzIG5vdyBpdHMgZHVlIHRvIG5vdCBiZWluZyBhYmxlIHRvXG4gICAgICAvLyB3cml0ZSB0byB0aGUgZGF0YWJhc2UsIGxpa2VseSBkdWUgdG8gdGhlIGRpc2sgYmVpbmcgZnVsbFxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH07XG4gIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIGVycm9yLCBzbyBhc3N1bWUgdW5zdXBwb3J0ZWRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvdW50RG9jcyh0eG4sIGNiKSB7XG4gIHZhciBpbmRleCA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLmluZGV4KCdkZWxldGVkT3JMb2NhbCcpO1xuICBpbmRleC5jb3VudChJREJLZXlSYW5nZS5vbmx5KCcwJykpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgY2IoZS50YXJnZXQucmVzdWx0KTtcbiAgfTtcbn1cblxuLy8gVGhpcyB0YXNrIHF1ZXVlIGVuc3VyZXMgdGhhdCBJREIgb3BlbiBjYWxscyBhcmUgZG9uZSBpbiB0aGVpciBvd24gdGlja1xuXG52YXIgcnVubmluZyA9IGZhbHNlO1xudmFyIHF1ZXVlID0gW107XG5cbmZ1bmN0aW9uIHRyeUNvZGUoZnVuLCBlcnIsIHJlcywgUG91Y2hEQikge1xuICB0cnkge1xuICAgIGZ1bihlcnIsIHJlcyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpbiBzb21lIG9kZCBjYXNlc1xuICAgIC8vIEluZGV4ZWREQiBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgdGhyb3cgYSBzeW5jXG4gICAgLy8gZXJyb3IsIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIGF0IGxlYXN0IGxvZyBpdC5cbiAgICBQb3VjaERCLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseU5leHQoKSB7XG4gIGlmIChydW5uaW5nIHx8ICFxdWV1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcnVubmluZyA9IHRydWU7XG4gIHF1ZXVlLnNoaWZ0KCkoKTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVRhc2soYWN0aW9uLCBjYWxsYmFjaywgUG91Y2hEQikge1xuICBxdWV1ZS5wdXNoKGZ1bmN0aW9uIHJ1bkFjdGlvbigpIHtcbiAgICBhY3Rpb24oZnVuY3Rpb24gcnVuQ2FsbGJhY2soZXJyLCByZXMpIHtcbiAgICAgIHRyeUNvZGUoY2FsbGJhY2ssIGVyciwgcmVzLCBQb3VjaERCKTtcbiAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiBydW5OZXh0KCkge1xuICAgICAgICBhcHBseU5leHQoUG91Y2hEQik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG4gIGFwcGx5TmV4dCgpO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VzKG9wdHMsIGFwaSwgZGJOYW1lLCBpZGIpIHtcbiAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gIGlmIChvcHRzLmNvbnRpbnVvdXMpIHtcbiAgICB2YXIgaWQgPSBkYk5hbWUgKyAnOicgKyB1dWlkKCk7XG4gICAgY2hhbmdlc0hhbmRsZXIuYWRkTGlzdGVuZXIoZGJOYW1lLCBpZCwgYXBpLCBvcHRzKTtcbiAgICBjaGFuZ2VzSGFuZGxlci5ub3RpZnkoZGJOYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoYW5nZXNIYW5kbGVyLnJlbW92ZUxpc3RlbmVyKGRiTmFtZSwgaWQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB2YXIgZG9jSWRzID0gb3B0cy5kb2NfaWRzICYmIG5ldyBFeHBvcnRlZFNldChvcHRzLmRvY19pZHMpO1xuXG4gIG9wdHMuc2luY2UgPSBvcHRzLnNpbmNlIHx8IDA7XG4gIHZhciBsYXN0U2VxID0gb3B0cy5zaW5jZTtcblxuICB2YXIgbGltaXQgPSAnbGltaXQnIGluIG9wdHMgPyBvcHRzLmxpbWl0IDogLTE7XG4gIGlmIChsaW1pdCA9PT0gMCkge1xuICAgIGxpbWl0ID0gMTsgLy8gcGVyIENvdWNoREIgX2NoYW5nZXMgc3BlY1xuICB9XG5cbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIG51bVJlc3VsdHMgPSAwO1xuICB2YXIgZmlsdGVyID0gZmlsdGVyQ2hhbmdlKG9wdHMpO1xuICB2YXIgZG9jSWRzVG9NZXRhZGF0YSA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuXG4gIHZhciB0eG47XG4gIHZhciBieVNlcVN0b3JlO1xuICB2YXIgZG9jU3RvcmU7XG4gIHZhciBkb2NJZFJldkluZGV4O1xuXG4gIGZ1bmN0aW9uIG9uQmF0Y2goYmF0Y2hLZXlzLCBiYXRjaFZhbHVlcywgY3Vyc29yKSB7XG4gICAgaWYgKCFjdXJzb3IgfHwgIWJhdGNoS2V5cy5sZW5ndGgpIHsgLy8gZG9uZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3aW5uaW5nRG9jcyA9IG5ldyBBcnJheShiYXRjaEtleXMubGVuZ3RoKTtcbiAgICB2YXIgbWV0YWRhdGFzID0gbmV3IEFycmF5KGJhdGNoS2V5cy5sZW5ndGgpO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc01ldGFkYXRhQW5kV2lubmluZ0RvYyhtZXRhZGF0YSwgd2lubmluZ0RvYykge1xuICAgICAgdmFyIGNoYW5nZSA9IG9wdHMucHJvY2Vzc0NoYW5nZSh3aW5uaW5nRG9jLCBtZXRhZGF0YSwgb3B0cyk7XG4gICAgICBsYXN0U2VxID0gY2hhbmdlLnNlcSA9IG1ldGFkYXRhLnNlcTtcblxuICAgICAgdmFyIGZpbHRlcmVkID0gZmlsdGVyKGNoYW5nZSk7XG4gICAgICBpZiAodHlwZW9mIGZpbHRlcmVkID09PSAnb2JqZWN0JykgeyAvLyBhbnl0aGluZyBidXQgdHJ1ZS9mYWxzZSBpbmRpY2F0ZXMgZXJyb3JcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGZpbHRlcmVkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmaWx0ZXJlZCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICBudW1SZXN1bHRzKys7XG4gICAgICBpZiAob3B0cy5yZXR1cm5fZG9jcykge1xuICAgICAgICByZXN1bHRzLnB1c2goY2hhbmdlKTtcbiAgICAgIH1cbiAgICAgIC8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnQgaW1tZWRpYXRlbHlcbiAgICAgIC8vIGZvciB0aGUgYmVuZWZpdCBvZiBsaXZlIGxpc3RlbmVyc1xuICAgICAgaWYgKG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgZmV0Y2hBdHRhY2htZW50c0lmTmVjZXNzYXJ5KHdpbm5pbmdEb2MsIG9wdHMsIHR4biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcG9zdFByb2Nlc3NBdHRhY2htZW50cyhbY2hhbmdlXSwgb3B0cy5iaW5hcnkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXNvbHZlKGNoYW5nZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNoYW5nZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25CYXRjaERvbmUoKSB7XG4gICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB3aW5uaW5nRG9jcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAobnVtUmVzdWx0cyA9PT0gbGltaXQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2lubmluZ0RvYyA9IHdpbm5pbmdEb2NzW2ldO1xuICAgICAgICBpZiAoIXdpbm5pbmdEb2MpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0YWRhdGEgPSBtZXRhZGF0YXNbaV07XG4gICAgICAgIHByb21pc2VzLnB1c2gocHJvY2Vzc01ldGFkYXRhQW5kV2lubmluZ0RvYyhtZXRhZGF0YSwgd2lubmluZ0RvYykpO1xuICAgICAgfVxuXG4gICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoY2hhbmdlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2hhbmdlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGlmIChjaGFuZ2VzW2ldKSB7XG4gICAgICAgICAgICBvcHRzLm9uQ2hhbmdlKGNoYW5nZXNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2gob3B0cy5jb21wbGV0ZSk7XG5cbiAgICAgIGlmIChudW1SZXN1bHRzICE9PSBsaW1pdCkge1xuICAgICAgICBjdXJzb3IuY29udGludWUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGZXRjaCBhbGwgbWV0YWRhdGFzL3dpbm5pbmdkb2NzIGZyb20gdGhpcyBiYXRjaCBpbiBwYXJhbGxlbCwgdGhlbiBwcm9jZXNzXG4gICAgLy8gdGhlbSBhbGwgb25seSBvbmNlIGFsbCBkYXRhIGhhcyBiZWVuIGNvbGxlY3RlZC4gVGhpcyBpcyBkb25lIGluIHBhcmFsbGVsXG4gICAgLy8gYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIGRvaW5nIGl0IG9uZS1hdC1hLXRpbWUuXG4gICAgdmFyIG51bURvbmUgPSAwO1xuICAgIGJhdGNoVmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICB2YXIgZG9jID0gZGVjb2RlRG9jKHZhbHVlKTtcbiAgICAgIHZhciBzZXEgPSBiYXRjaEtleXNbaV07XG4gICAgICBmZXRjaFdpbm5pbmdEb2NBbmRNZXRhZGF0YShkb2MsIHNlcSwgZnVuY3Rpb24gKG1ldGFkYXRhLCB3aW5uaW5nRG9jKSB7XG4gICAgICAgIG1ldGFkYXRhc1tpXSA9IG1ldGFkYXRhO1xuICAgICAgICB3aW5uaW5nRG9jc1tpXSA9IHdpbm5pbmdEb2M7XG4gICAgICAgIGlmICgrK251bURvbmUgPT09IGJhdGNoS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICBvbkJhdGNoRG9uZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uR2V0TWV0YWRhdGEoZG9jLCBzZXEsIG1ldGFkYXRhLCBjYikge1xuICAgIGlmIChtZXRhZGF0YS5zZXEgIT09IHNlcSkge1xuICAgICAgLy8gc29tZSBvdGhlciBzZXEgaXMgbGF0ZXJcbiAgICAgIHJldHVybiBjYigpO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS53aW5uaW5nUmV2ID09PSBkb2MuX3Jldikge1xuICAgICAgLy8gdGhpcyBpcyB0aGUgd2lubmluZyBkb2NcbiAgICAgIHJldHVybiBjYihtZXRhZGF0YSwgZG9jKTtcbiAgICB9XG5cbiAgICAvLyBmZXRjaCB3aW5uaW5nIGRvYyBpbiBzZXBhcmF0ZSByZXF1ZXN0XG4gICAgdmFyIGRvY0lkUmV2ID0gZG9jLl9pZCArICc6OicgKyBtZXRhZGF0YS53aW5uaW5nUmV2O1xuICAgIHZhciByZXEgPSBkb2NJZFJldkluZGV4LmdldChkb2NJZFJldik7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBjYihtZXRhZGF0YSwgZGVjb2RlRG9jKGUudGFyZ2V0LnJlc3VsdCkpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaFdpbm5pbmdEb2NBbmRNZXRhZGF0YShkb2MsIHNlcSwgY2IpIHtcbiAgICBpZiAoZG9jSWRzICYmICFkb2NJZHMuaGFzKGRvYy5faWQpKSB7XG4gICAgICByZXR1cm4gY2IoKTtcbiAgICB9XG5cbiAgICB2YXIgbWV0YWRhdGEgPSBkb2NJZHNUb01ldGFkYXRhLmdldChkb2MuX2lkKTtcbiAgICBpZiAobWV0YWRhdGEpIHsgLy8gY2FjaGVkXG4gICAgICByZXR1cm4gb25HZXRNZXRhZGF0YShkb2MsIHNlcSwgbWV0YWRhdGEsIGNiKTtcbiAgICB9XG4gICAgLy8gbWV0YWRhdGEgbm90IGNhY2hlZCwgaGF2ZSB0byBnbyBmZXRjaCBpdFxuICAgIGRvY1N0b3JlLmdldChkb2MuX2lkKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgbWV0YWRhdGEgPSBkZWNvZGVNZXRhZGF0YShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgZG9jSWRzVG9NZXRhZGF0YS5zZXQoZG9jLl9pZCwgbWV0YWRhdGEpO1xuICAgICAgb25HZXRNZXRhZGF0YShkb2MsIHNlcSwgbWV0YWRhdGEsIGNiKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgIG9wdHMuY29tcGxldGUobnVsbCwge1xuICAgICAgcmVzdWx0czogcmVzdWx0cyxcbiAgICAgIGxhc3Rfc2VxOiBsYXN0U2VxXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvblR4bkNvbXBsZXRlKCkge1xuICAgIGlmICghb3B0cy5jb250aW51b3VzICYmIG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIC8vIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBwb3N0UHJvY2Vzc2luZyB3YXMgYWxyZWFkeSBkb25lLFxuICAgICAgLy8gc28gZG8gaXQgYWdhaW5cbiAgICAgIHBvc3RQcm9jZXNzQXR0YWNobWVudHMocmVzdWx0cykudGhlbihmaW5pc2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5pc2goKTtcbiAgICB9XG4gIH1cblxuICB2YXIgb2JqZWN0U3RvcmVzID0gW0RPQ19TVE9SRSwgQllfU0VRX1NUT1JFXTtcbiAgaWYgKG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICBvYmplY3RTdG9yZXMucHVzaChBVFRBQ0hfU1RPUkUpO1xuICB9XG4gIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBvYmplY3RTdG9yZXMsICdyZWFkb25seScpO1xuICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgcmV0dXJuIG9wdHMuY29tcGxldGUodHhuUmVzdWx0LmVycm9yKTtcbiAgfVxuICB0eG4gPSB0eG5SZXN1bHQudHhuO1xuICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKG9wdHMuY29tcGxldGUpO1xuICB0eG4ub25jb21wbGV0ZSA9IG9uVHhuQ29tcGxldGU7XG5cbiAgYnlTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICBkb2NTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpO1xuICBkb2NJZFJldkluZGV4ID0gYnlTZXFTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKTtcblxuICB2YXIga2V5UmFuZ2UgPSAob3B0cy5zaW5jZSAmJiAhb3B0cy5kZXNjZW5kaW5nKSA/XG4gICAgSURCS2V5UmFuZ2UubG93ZXJCb3VuZChvcHRzLnNpbmNlLCB0cnVlKSA6IG51bGw7XG5cbiAgcnVuQmF0Y2hlZEN1cnNvcihieVNlcVN0b3JlLCBrZXlSYW5nZSwgb3B0cy5kZXNjZW5kaW5nLCBsaW1pdCwgb25CYXRjaCk7XG59XG5cbnZhciBjYWNoZWREQnMgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcbnZhciBibG9iU3VwcG9ydFByb21pc2U7XG52YXIgb3BlblJlcUxpc3QgPSBuZXcgRXhwb3J0ZWRNYXAoKTtcblxuZnVuY3Rpb24gSWRiUG91Y2gob3B0cywgY2FsbGJhY2spIHtcbiAgdmFyIGFwaSA9IHRoaXM7XG5cbiAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKHRoaXNDYWxsYmFjaykge1xuICAgIGluaXQoYXBpLCBvcHRzLCB0aGlzQ2FsbGJhY2spO1xuICB9LCBjYWxsYmFjaywgYXBpLmNvbnN0cnVjdG9yKTtcbn1cblxuZnVuY3Rpb24gaW5pdChhcGksIG9wdHMsIGNhbGxiYWNrKSB7XG5cbiAgdmFyIGRiTmFtZSA9IG9wdHMubmFtZTtcblxuICB2YXIgaWRiID0gbnVsbDtcbiAgdmFyIGlkYkdsb2JhbEZhaWx1cmVFcnJvciA9IG51bGw7XG4gIGFwaS5fbWV0YSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZW5yaWNoQ2FsbGJhY2tFcnJvcihjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdCkge1xuICAgICAgaWYgKGVycm9yICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIWVycm9yLnJlYXNvbikge1xuICAgICAgICBpZiAoaWRiR2xvYmFsRmFpbHVyZUVycm9yKSB7XG4gICAgICAgICAgZXJyb3IucmVhc29uID0gaWRiR2xvYmFsRmFpbHVyZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKGVycm9yLCByZXN1bHQpO1xuICAgIH07XG4gIH1cblxuICAvLyBjYWxsZWQgd2hlbiBjcmVhdGluZyBhIGZyZXNoIG5ldyBkYXRhYmFzZVxuICBmdW5jdGlvbiBjcmVhdGVTY2hlbWEoZGIpIHtcbiAgICB2YXIgZG9jU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShET0NfU1RPUkUsIHtrZXlQYXRoIDogJ2lkJ30pO1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSwge2F1dG9JbmNyZW1lbnQ6IHRydWV9KVxuICAgICAgLmNyZWF0ZUluZGV4KCdfZG9jX2lkX3JldicsICdfZG9jX2lkX3JldicsIHt1bmlxdWU6IHRydWV9KTtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUsIHtrZXlQYXRoOiAnZGlnZXN0J30pO1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKE1FVEFfU1RPUkUsIHtrZXlQYXRoOiAnaWQnLCBhdXRvSW5jcmVtZW50OiBmYWxzZX0pO1xuICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUpO1xuXG4gICAgLy8gYWRkZWQgaW4gdjJcbiAgICBkb2NTdG9yZS5jcmVhdGVJbmRleCgnZGVsZXRlZE9yTG9jYWwnLCAnZGVsZXRlZE9yTG9jYWwnLCB7dW5pcXVlIDogZmFsc2V9KTtcblxuICAgIC8vIGFkZGVkIGluIHYzXG4gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUsIHtrZXlQYXRoOiAnX2lkJ30pO1xuXG4gICAgLy8gYWRkZWQgaW4gdjRcbiAgICB2YXIgYXR0QW5kU2VxU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSxcbiAgICAgIHthdXRvSW5jcmVtZW50OiB0cnVlfSk7XG4gICAgYXR0QW5kU2VxU3RvcmUuY3JlYXRlSW5kZXgoJ3NlcScsICdzZXEnKTtcbiAgICBhdHRBbmRTZXFTdG9yZS5jcmVhdGVJbmRleCgnZGlnZXN0U2VxJywgJ2RpZ2VzdFNlcScsIHt1bmlxdWU6IHRydWV9KTtcbiAgfVxuXG4gIC8vIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDJcbiAgLy8gdW5mb3J0dW5hdGVseSBcImRlbGV0ZWRPckxvY2FsXCIgaXMgYSBtaXNub21lciBub3cgdGhhdCB3ZSBubyBsb25nZXJcbiAgLy8gc3RvcmUgbG9jYWwgZG9jcyBpbiB0aGUgbWFpbiBkb2Mtc3RvcmUsIGJ1dCB3aGFkZHlhZ29ubmFkb1xuICBmdW5jdGlvbiBhZGREZWxldGVkT3JMb2NhbEluZGV4KHR4biwgY2FsbGJhY2spIHtcbiAgICB2YXIgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgICBkb2NTdG9yZS5jcmVhdGVJbmRleCgnZGVsZXRlZE9yTG9jYWwnLCAnZGVsZXRlZE9yTG9jYWwnLCB7dW5pcXVlIDogZmFsc2V9KTtcblxuICAgIGRvY1N0b3JlLm9wZW5DdXJzb3IoKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgIHZhciBkZWxldGVkID0gaXNEZWxldGVkKG1ldGFkYXRhKTtcbiAgICAgICAgbWV0YWRhdGEuZGVsZXRlZE9yTG9jYWwgPSBkZWxldGVkID8gXCIxXCIgOiBcIjBcIjtcbiAgICAgICAgZG9jU3RvcmUucHV0KG1ldGFkYXRhKTtcbiAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiAzIChwYXJ0IDEpXG4gIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsU3RvcmVTY2hlbWEoZGIpIHtcbiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShMT0NBTF9TVE9SRSwge2tleVBhdGg6ICdfaWQnfSlcbiAgICAgIC5jcmVhdGVJbmRleCgnX2RvY19pZF9yZXYnLCAnX2RvY19pZF9yZXYnLCB7dW5pcXVlOiB0cnVlfSk7XG4gIH1cblxuICAvLyBtaWdyYXRpb24gdG8gdmVyc2lvbiAzIChwYXJ0IDIpXG4gIGZ1bmN0aW9uIG1pZ3JhdGVMb2NhbFN0b3JlKHR4biwgY2IpIHtcbiAgICB2YXIgbG9jYWxTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShMT0NBTF9TVE9SRSk7XG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG4gICAgdmFyIHNlcVN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG5cbiAgICB2YXIgY3Vyc29yID0gZG9jU3RvcmUub3BlbkN1cnNvcigpO1xuICAgIGN1cnNvci5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBjdXJzb3IgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgIHZhciBkb2NJZCA9IG1ldGFkYXRhLmlkO1xuICAgICAgICB2YXIgbG9jYWwgPSBpc0xvY2FsSWQoZG9jSWQpO1xuICAgICAgICB2YXIgcmV2ID0gd2lubmluZ1JldihtZXRhZGF0YSk7XG4gICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgIHZhciBkb2NJZFJldiA9IGRvY0lkICsgXCI6OlwiICsgcmV2O1xuICAgICAgICAgIC8vIHJlbW92ZSBhbGwgc2VxIGVudHJpZXNcbiAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2NJZFxuICAgICAgICAgIHZhciBzdGFydCA9IGRvY0lkICsgXCI6OlwiO1xuICAgICAgICAgIHZhciBlbmQgPSBkb2NJZCArIFwiOjp+XCI7XG4gICAgICAgICAgdmFyIGluZGV4ID0gc2VxU3RvcmUuaW5kZXgoJ19kb2NfaWRfcmV2Jyk7XG4gICAgICAgICAgdmFyIHJhbmdlID0gSURCS2V5UmFuZ2UuYm91bmQoc3RhcnQsIGVuZCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICB2YXIgc2VxQ3Vyc29yID0gaW5kZXgub3BlbkN1cnNvcihyYW5nZSk7XG4gICAgICAgICAgc2VxQ3Vyc29yLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZXFDdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICBpZiAoIXNlcUN1cnNvcikge1xuICAgICAgICAgICAgICAvLyBkb25lXG4gICAgICAgICAgICAgIGRvY1N0b3JlLmRlbGV0ZShjdXJzb3IucHJpbWFyeUtleSk7XG4gICAgICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGRhdGEgPSBzZXFDdXJzb3IudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChkYXRhLl9kb2NfaWRfcmV2ID09PSBkb2NJZFJldikge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmUucHV0KGRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNlcVN0b3JlLmRlbGV0ZShzZXFDdXJzb3IucHJpbWFyeUtleSk7XG4gICAgICAgICAgICAgIHNlcUN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgICAgY2IoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gNCAocGFydCAxKVxuICBmdW5jdGlvbiBhZGRBdHRhY2hBbmRTZXFTdG9yZShkYikge1xuICAgIHZhciBhdHRBbmRTZXFTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKEFUVEFDSF9BTkRfU0VRX1NUT1JFLFxuICAgICAge2F1dG9JbmNyZW1lbnQ6IHRydWV9KTtcbiAgICBhdHRBbmRTZXFTdG9yZS5jcmVhdGVJbmRleCgnc2VxJywgJ3NlcScpO1xuICAgIGF0dEFuZFNlcVN0b3JlLmNyZWF0ZUluZGV4KCdkaWdlc3RTZXEnLCAnZGlnZXN0U2VxJywge3VuaXF1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gNCAocGFydCAyKVxuICBmdW5jdGlvbiBtaWdyYXRlQXR0c0FuZFNlcXModHhuLCBjYWxsYmFjaykge1xuICAgIHZhciBzZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShCWV9TRVFfU1RPUkUpO1xuICAgIHZhciBhdHRTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfU1RPUkUpO1xuICAgIHZhciBhdHRBbmRTZXFTdG9yZSA9IHR4bi5vYmplY3RTdG9yZShBVFRBQ0hfQU5EX1NFUV9TVE9SRSk7XG5cbiAgICAvLyBuZWVkIHRvIGFjdHVhbGx5IHBvcHVsYXRlIHRoZSB0YWJsZS4gdGhpcyBpcyB0aGUgZXhwZW5zaXZlIHBhcnQsXG4gICAgLy8gc28gYXMgYW4gb3B0aW1pemF0aW9uLCBjaGVjayBmaXJzdCB0aGF0IHRoaXMgZGF0YWJhc2UgZXZlblxuICAgIC8vIGNvbnRhaW5zIGF0dGFjaG1lbnRzXG4gICAgdmFyIHJlcSA9IGF0dFN0b3JlLmNvdW50KCk7XG4gICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY291bnQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIWNvdW50KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpOyAvLyBkb25lXG4gICAgICB9XG5cbiAgICAgIHNlcVN0b3JlLm9wZW5DdXJzb3IoKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOyAvLyBkb25lXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRvYyA9IGN1cnNvci52YWx1ZTtcbiAgICAgICAgdmFyIHNlcSA9IGN1cnNvci5wcmltYXJ5S2V5O1xuICAgICAgICB2YXIgYXR0cyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMgfHwge30pO1xuICAgICAgICB2YXIgZGlnZXN0TWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXR0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBhdHQgPSBkb2MuX2F0dGFjaG1lbnRzW2F0dHNbal1dO1xuICAgICAgICAgIGRpZ2VzdE1hcFthdHQuZGlnZXN0XSA9IHRydWU7IC8vIHVuaXEgZGlnZXN0cywganVzdCBpbiBjYXNlXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpZ2VzdHMgPSBPYmplY3Qua2V5cyhkaWdlc3RNYXApO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGlnZXN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBkaWdlc3QgPSBkaWdlc3RzW2pdO1xuICAgICAgICAgIGF0dEFuZFNlcVN0b3JlLnB1dCh7XG4gICAgICAgICAgICBzZXE6IHNlcSxcbiAgICAgICAgICAgIGRpZ2VzdFNlcTogZGlnZXN0ICsgJzo6JyArIHNlcVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgLy8gbWlncmF0aW9uIHRvIHZlcnNpb24gNVxuICAvLyBJbnN0ZWFkIG9mIHJlbHlpbmcgb24gb24tdGhlLWZseSBtaWdyYXRpb24gb2YgbWV0YWRhdGEsXG4gIC8vIHRoaXMgYnJpbmdzIHRoZSBkb2Mtc3RvcmUgdG8gaXRzIG1vZGVybiBmb3JtOlxuICAvLyAtIG1ldGFkYXRhLndpbm5pbmdyZXZcbiAgLy8gLSBtZXRhZGF0YS5zZXFcbiAgLy8gLSBzdHJpbmdpZnkgdGhlIG1ldGFkYXRhIHdoZW4gc3RvcmluZyBpdFxuICBmdW5jdGlvbiBtaWdyYXRlTWV0YWRhdGEodHhuKSB7XG5cbiAgICBmdW5jdGlvbiBkZWNvZGVNZXRhZGF0YUNvbXBhdChzdG9yZWRPYmplY3QpIHtcbiAgICAgIGlmICghc3RvcmVkT2JqZWN0LmRhdGEpIHtcbiAgICAgICAgLy8gb2xkIGZvcm1hdCwgd2hlbiB3ZSBkaWRuJ3Qgc3RvcmUgaXQgc3RyaW5naWZpZWRcbiAgICAgICAgc3RvcmVkT2JqZWN0LmRlbGV0ZWQgPSBzdG9yZWRPYmplY3QuZGVsZXRlZE9yTG9jYWwgPT09ICcxJztcbiAgICAgICAgcmV0dXJuIHN0b3JlZE9iamVjdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWNvZGVNZXRhZGF0YShzdG9yZWRPYmplY3QpO1xuICAgIH1cblxuICAgIC8vIGVuc3VyZSB0aGF0IGV2ZXJ5IG1ldGFkYXRhIGhhcyBhIHdpbm5pbmdSZXYgYW5kIHNlcSxcbiAgICAvLyB3aGljaCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIG9uLXRoZS1mbHkgYnV0IGJldHRlciB0byBtaWdyYXRlXG4gICAgdmFyIGJ5U2VxU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoQllfU0VRX1NUT1JFKTtcbiAgICB2YXIgZG9jU3RvcmUgPSB0eG4ub2JqZWN0U3RvcmUoRE9DX1NUT1JFKTtcbiAgICB2YXIgY3Vyc29yID0gZG9jU3RvcmUub3BlbkN1cnNvcigpO1xuICAgIGN1cnNvci5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGN1cnNvciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgIHJldHVybjsgLy8gZG9uZVxuICAgICAgfVxuICAgICAgdmFyIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGFDb21wYXQoY3Vyc29yLnZhbHVlKTtcblxuICAgICAgbWV0YWRhdGEud2lubmluZ1JldiA9IG1ldGFkYXRhLndpbm5pbmdSZXYgfHxcbiAgICAgICAgd2lubmluZ1JldihtZXRhZGF0YSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZldGNoTWV0YWRhdGFTZXEoKSB7XG4gICAgICAgIC8vIG1ldGFkYXRhLnNlcSB3YXMgYWRkZWQgcG9zdC0zLjIuMCwgc28gaWYgaXQncyBtaXNzaW5nLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGZldGNoIGl0IG1hbnVhbGx5XG4gICAgICAgIHZhciBzdGFydCA9IG1ldGFkYXRhLmlkICsgJzo6JztcbiAgICAgICAgdmFyIGVuZCA9IG1ldGFkYXRhLmlkICsgJzo6XFx1ZmZmZic7XG4gICAgICAgIHZhciByZXEgPSBieVNlcVN0b3JlLmluZGV4KCdfZG9jX2lkX3JldicpLm9wZW5DdXJzb3IoXG4gICAgICAgICAgSURCS2V5UmFuZ2UuYm91bmQoc3RhcnQsIGVuZCkpO1xuXG4gICAgICAgIHZhciBtZXRhZGF0YVNlcSA9IDA7XG4gICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciBjdXJzb3IgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgaWYgKCFjdXJzb3IpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLnNlcSA9IG1ldGFkYXRhU2VxO1xuICAgICAgICAgICAgcmV0dXJuIG9uR2V0TWV0YWRhdGFTZXEoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHNlcSA9IGN1cnNvci5wcmltYXJ5S2V5O1xuICAgICAgICAgIGlmIChzZXEgPiBtZXRhZGF0YVNlcSkge1xuICAgICAgICAgICAgbWV0YWRhdGFTZXEgPSBzZXE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvbkdldE1ldGFkYXRhU2VxKCkge1xuICAgICAgICB2YXIgbWV0YWRhdGFUb1N0b3JlID0gZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEsXG4gICAgICAgICAgbWV0YWRhdGEud2lubmluZ1JldiwgbWV0YWRhdGEuZGVsZXRlZCk7XG5cbiAgICAgICAgdmFyIHJlcSA9IGRvY1N0b3JlLnB1dChtZXRhZGF0YVRvU3RvcmUpO1xuICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0YWRhdGEuc2VxKSB7XG4gICAgICAgIHJldHVybiBvbkdldE1ldGFkYXRhU2VxKCk7XG4gICAgICB9XG5cbiAgICAgIGZldGNoTWV0YWRhdGFTZXEoKTtcbiAgICB9O1xuXG4gIH1cblxuICBhcGkuX3JlbW90ZSA9IGZhbHNlO1xuICBhcGkudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ2lkYic7XG4gIH07XG5cbiAgYXBpLl9pZCA9IHRvUHJvbWlzZShmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayhudWxsLCBhcGkuX21ldGEuaW5zdGFuY2VJZCk7XG4gIH0pO1xuXG4gIGFwaS5fYnVsa0RvY3MgPSBmdW5jdGlvbiBpZGJfYnVsa0RvY3MocmVxLCByZXFPcHRzLCBjYWxsYmFjaykge1xuICAgIGlkYkJ1bGtEb2NzKG9wdHMsIHJlcSwgcmVxT3B0cywgYXBpLCBpZGIsIGVucmljaENhbGxiYWNrRXJyb3IoY2FsbGJhY2spKTtcbiAgfTtcblxuICAvLyBGaXJzdCB3ZSBsb29rIHVwIHRoZSBtZXRhZGF0YSBpbiB0aGUgaWRzIGRhdGFiYXNlLCB0aGVuIHdlIGZldGNoIHRoZVxuICAvLyBjdXJyZW50IHJldmlzaW9uKHMpIGZyb20gdGhlIGJ5IHNlcXVlbmNlIHN0b3JlXG4gIGFwaS5fZ2V0ID0gZnVuY3Rpb24gaWRiX2dldChpZCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICB2YXIgZG9jO1xuICAgIHZhciBtZXRhZGF0YTtcbiAgICB2YXIgZXJyO1xuICAgIHZhciB0eG4gPSBvcHRzLmN0eDtcbiAgICBpZiAoIXR4bikge1xuICAgICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsXG4gICAgICAgIFtET0NfU1RPUkUsIEJZX1NFUV9TVE9SRSwgQVRUQUNIX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICBjYWxsYmFjayhlcnIsIHtkb2M6IGRvYywgbWV0YWRhdGE6IG1ldGFkYXRhLCBjdHg6IHR4bn0pO1xuICAgIH1cblxuICAgIHR4bi5vYmplY3RTdG9yZShET0NfU1RPUkUpLmdldChpZCkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgIC8vIHdlIGNhbiBkZXRlcm1pbmUgdGhlIHJlc3VsdCBoZXJlIGlmOlxuICAgICAgLy8gMS4gdGhlcmUgaXMgbm8gc3VjaCBkb2N1bWVudFxuICAgICAgLy8gMi4gdGhlIGRvY3VtZW50IGlzIGRlbGV0ZWQgYW5kIHdlIGRvbid0IGFzayBhYm91dCBzcGVjaWZpYyByZXZcbiAgICAgIC8vIFdoZW4gd2UgYXNrIHdpdGggb3B0cy5yZXYgd2UgZXhwZWN0IHRoZSBhbnN3ZXIgdG8gYmUgZWl0aGVyXG4gICAgICAvLyBkb2MgKHBvc3NpYmx5IHdpdGggX2RlbGV0ZWQ9dHJ1ZSkgb3IgbWlzc2luZyBlcnJvclxuICAgICAgaWYgKCFtZXRhZGF0YSkge1xuICAgICAgICBlcnIgPSBjcmVhdGVFcnJvcihNSVNTSU5HX0RPQywgJ21pc3NpbmcnKTtcbiAgICAgICAgcmV0dXJuIGZpbmlzaCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmV2O1xuICAgICAgaWYgKCFvcHRzLnJldikge1xuICAgICAgICByZXYgPSBtZXRhZGF0YS53aW5uaW5nUmV2O1xuICAgICAgICB2YXIgZGVsZXRlZCA9IGlzRGVsZXRlZChtZXRhZGF0YSk7XG4gICAgICAgIGlmIChkZWxldGVkKSB7XG4gICAgICAgICAgZXJyID0gY3JlYXRlRXJyb3IoTUlTU0lOR19ET0MsIFwiZGVsZXRlZFwiKTtcbiAgICAgICAgICByZXR1cm4gZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldiA9IG9wdHMubGF0ZXN0ID8gbGF0ZXN0KG9wdHMucmV2LCBtZXRhZGF0YSkgOiBvcHRzLnJldjtcbiAgICAgIH1cblxuICAgICAgdmFyIG9iamVjdFN0b3JlID0gdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSk7XG4gICAgICB2YXIga2V5ID0gbWV0YWRhdGEuaWQgKyAnOjonICsgcmV2O1xuXG4gICAgICBvYmplY3RTdG9yZS5pbmRleCgnX2RvY19pZF9yZXYnKS5nZXQoa2V5KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBkb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICBkb2MgPSBkZWNvZGVEb2MoZG9jKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgIGVyciA9IGNyZWF0ZUVycm9yKE1JU1NJTkdfRE9DLCAnbWlzc2luZycpO1xuICAgICAgICAgIHJldHVybiBmaW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5pc2goKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcblxuICBhcGkuX2dldEF0dGFjaG1lbnQgPSBmdW5jdGlvbiAoZG9jSWQsIGF0dGFjaElkLCBhdHRhY2htZW50LCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHZhciB0eG47XG4gICAgaWYgKG9wdHMuY3R4KSB7XG4gICAgICB0eG4gPSBvcHRzLmN0eDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHR4blJlc3VsdCA9IG9wZW5UcmFuc2FjdGlvblNhZmVseShpZGIsXG4gICAgICAgIFtET0NfU1RPUkUsIEJZX1NFUV9TVE9SRSwgQVRUQUNIX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB9XG4gICAgdmFyIGRpZ2VzdCA9IGF0dGFjaG1lbnQuZGlnZXN0O1xuICAgIHZhciB0eXBlID0gYXR0YWNobWVudC5jb250ZW50X3R5cGU7XG5cbiAgICB0eG4ub2JqZWN0U3RvcmUoQVRUQUNIX1NUT1JFKS5nZXQoZGlnZXN0KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGJvZHkgPSBlLnRhcmdldC5yZXN1bHQuYm9keTtcbiAgICAgIHJlYWRCbG9iRGF0YShib2R5LCB0eXBlLCBvcHRzLmJpbmFyeSwgZnVuY3Rpb24gKGJsb2JEYXRhKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGJsb2JEYXRhKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG5cbiAgYXBpLl9pbmZvID0gZnVuY3Rpb24gaWRiX2luZm8oY2FsbGJhY2spIHtcbiAgICB2YXIgdXBkYXRlU2VxO1xuICAgIHZhciBkb2NDb3VudDtcblxuICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBbTUVUQV9TVE9SRSwgQllfU0VRX1NUT1JFXSwgJ3JlYWRvbmx5Jyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHZhciB0eG4gPSB0eG5SZXN1bHQudHhuO1xuICAgIHR4bi5vYmplY3RTdG9yZShNRVRBX1NUT1JFKS5nZXQoTUVUQV9TVE9SRSkub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGRvY0NvdW50ID0gZS50YXJnZXQucmVzdWx0LmRvY0NvdW50O1xuICAgIH07XG4gICAgdHhuLm9iamVjdFN0b3JlKEJZX1NFUV9TVE9SRSkub3BlbkN1cnNvcihudWxsLCAncHJldicpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY3Vyc29yID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgdXBkYXRlU2VxID0gY3Vyc29yID8gY3Vyc29yLmtleSA6IDA7XG4gICAgfTtcblxuICAgIHR4bi5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBkb2NfY291bnQ6IGRvY0NvdW50LFxuICAgICAgICB1cGRhdGVfc2VxOiB1cGRhdGVTZXEsXG4gICAgICAgIC8vIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgaWRiX2F0dGFjaG1lbnRfZm9ybWF0OiAoYXBpLl9tZXRhLmJsb2JTdXBwb3J0ID8gJ2JpbmFyeScgOiAnYmFzZTY0JylcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG5cbiAgYXBpLl9hbGxEb2NzID0gZnVuY3Rpb24gaWRiX2FsbERvY3Mob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZGJBbGxEb2NzKG9wdHMsIGlkYiwgZW5yaWNoQ2FsbGJhY2tFcnJvcihjYWxsYmFjaykpO1xuICB9O1xuXG4gIGFwaS5fY2hhbmdlcyA9IGZ1bmN0aW9uIGlkYkNoYW5nZXMob3B0cykge1xuICAgIHJldHVybiBjaGFuZ2VzKG9wdHMsIGFwaSwgZGJOYW1lLCBpZGIpO1xuICB9O1xuXG4gIGFwaS5fY2xvc2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0luZGV4ZWREQi9JREJEYXRhYmFzZSNjbG9zZVxuICAgIC8vIFwiUmV0dXJucyBpbW1lZGlhdGVseSBhbmQgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGluIGEgc2VwYXJhdGUgdGhyZWFkLi4uXCJcbiAgICBpZGIuY2xvc2UoKTtcbiAgICBjYWNoZWREQnMuZGVsZXRlKGRiTmFtZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcblxuICBhcGkuX2dldFJldmlzaW9uVHJlZSA9IGZ1bmN0aW9uIChkb2NJZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0RPQ19TVE9SRV0sICdyZWFkb25seScpO1xuICAgIGlmICh0eG5SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgIH1cbiAgICB2YXIgdHhuID0gdHhuUmVzdWx0LnR4bjtcbiAgICB2YXIgcmVxID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSkuZ2V0KGRvY0lkKTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgZG9jID0gZGVjb2RlTWV0YWRhdGEoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG4gICAgICBpZiAoIWRvYykge1xuICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0RPQykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZG9jLnJldl90cmVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyByZXZpc2lvbnMgb2YgZG9jdW1lbnQgZG9jSWRcbiAgLy8gd2hpY2ggYXJlIGxpc3RlZCBpbiByZXZzIGFuZCBzZXRzIHRoaXMgZG9jdW1lbnRcbiAgLy8gcmV2aXNpb24gdG8gdG8gcmV2X3RyZWVcbiAgYXBpLl9kb0NvbXBhY3Rpb24gPSBmdW5jdGlvbiAoZG9jSWQsIHJldnMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHN0b3JlcyA9IFtcbiAgICAgIERPQ19TVE9SRSxcbiAgICAgIEJZX1NFUV9TVE9SRSxcbiAgICAgIEFUVEFDSF9TVE9SRSxcbiAgICAgIEFUVEFDSF9BTkRfU0VRX1NUT1JFXG4gICAgXTtcbiAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgc3RvcmVzLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4blJlc3VsdC5lcnJvcik7XG4gICAgfVxuICAgIHZhciB0eG4gPSB0eG5SZXN1bHQudHhuO1xuXG4gICAgdmFyIGRvY1N0b3JlID0gdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSk7XG5cbiAgICBkb2NTdG9yZS5nZXQoZG9jSWQpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIG1ldGFkYXRhID0gZGVjb2RlTWV0YWRhdGEoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG4gICAgICB0cmF2ZXJzZVJldlRyZWUobWV0YWRhdGEucmV2X3RyZWUsIGZ1bmN0aW9uIChpc0xlYWYsIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkhhc2gsIGN0eCwgb3B0cykge1xuICAgICAgICB2YXIgcmV2ID0gcG9zICsgJy0nICsgcmV2SGFzaDtcbiAgICAgICAgaWYgKHJldnMuaW5kZXhPZihyZXYpICE9PSAtMSkge1xuICAgICAgICAgIG9wdHMuc3RhdHVzID0gJ21pc3NpbmcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbXBhY3RSZXZzKHJldnMsIGRvY0lkLCB0eG4pO1xuICAgICAgdmFyIHdpbm5pbmdSZXYkJDEgPSBtZXRhZGF0YS53aW5uaW5nUmV2O1xuICAgICAgdmFyIGRlbGV0ZWQgPSBtZXRhZGF0YS5kZWxldGVkO1xuICAgICAgdHhuLm9iamVjdFN0b3JlKERPQ19TVE9SRSkucHV0KFxuICAgICAgICBlbmNvZGVNZXRhZGF0YShtZXRhZGF0YSwgd2lubmluZ1JldiQkMSwgZGVsZXRlZCkpO1xuICAgIH07XG4gICAgdHhuLm9uYWJvcnQgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgdHhuLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH07XG4gIH07XG5cblxuICBhcGkuX2dldExvY2FsID0gZnVuY3Rpb24gKGlkLCBjYWxsYmFjaykge1xuICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBbTE9DQUxfU1RPUkVdLCAncmVhZG9ubHknKTtcbiAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICB9XG4gICAgdmFyIHR4ID0gdHhuUmVzdWx0LnR4bjtcbiAgICB2YXIgcmVxID0gdHgub2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUpLmdldChpZCk7XG5cbiAgICByZXEub25lcnJvciA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBkb2MgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAoIWRvYykge1xuICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0RPQykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGRvY1snX2RvY19pZF9yZXYnXTsgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZG9jKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIGFwaS5fcHV0TG9jYWwgPSBmdW5jdGlvbiAoZG9jLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBkZWxldGUgZG9jLl9yZXZpc2lvbnM7IC8vIGlnbm9yZSB0aGlzLCB0cnVzdCB0aGUgcmV2XG4gICAgdmFyIG9sZFJldiA9IGRvYy5fcmV2O1xuICAgIHZhciBpZCA9IGRvYy5faWQ7XG4gICAgaWYgKCFvbGRSZXYpIHtcbiAgICAgIGRvYy5fcmV2ID0gJzAtMSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYy5fcmV2ID0gJzAtJyArIChwYXJzZUludChvbGRSZXYuc3BsaXQoJy0nKVsxXSwgMTApICsgMSk7XG4gICAgfVxuXG4gICAgdmFyIHR4ID0gb3B0cy5jdHg7XG4gICAgdmFyIHJldDtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB2YXIgdHhuUmVzdWx0ID0gb3BlblRyYW5zYWN0aW9uU2FmZWx5KGlkYiwgW0xPQ0FMX1NUT1JFXSwgJ3JlYWR3cml0ZScpO1xuICAgICAgaWYgKHR4blJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodHhuUmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHR4ID0gdHhuUmVzdWx0LnR4bjtcbiAgICAgIHR4Lm9uZXJyb3IgPSBpZGJFcnJvcihjYWxsYmFjayk7XG4gICAgICB0eC5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgb1N0b3JlID0gdHgub2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUpO1xuICAgIHZhciByZXE7XG4gICAgaWYgKG9sZFJldikge1xuICAgICAgcmVxID0gb1N0b3JlLmdldChpZCk7XG4gICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG9sZERvYyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgaWYgKCFvbGREb2MgfHwgb2xkRG9jLl9yZXYgIT09IG9sZFJldikge1xuICAgICAgICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKFJFVl9DT05GTElDVCkpO1xuICAgICAgICB9IGVsc2UgeyAvLyB1cGRhdGVcbiAgICAgICAgICB2YXIgcmVxID0gb1N0b3JlLnB1dChkb2MpO1xuICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXQgPSB7b2s6IHRydWUsIGlkOiBkb2MuX2lkLCByZXY6IGRvYy5fcmV2fTtcbiAgICAgICAgICAgIGlmIChvcHRzLmN0eCkgeyAvLyByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7IC8vIG5ldyBkb2NcbiAgICAgIHJlcSA9IG9TdG9yZS5hZGQoZG9jKTtcbiAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gY29uc3RyYWludCBlcnJvciwgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY2FsbGJhY2soY3JlYXRlRXJyb3IoUkVWX0NPTkZMSUNUKSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gYWJvcnRcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy8gYXZvaWQgdHJhbnNhY3Rpb24gb25lcnJvclxuICAgICAgfTtcbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldCA9IHtvazogdHJ1ZSwgaWQ6IGRvYy5faWQsIHJldjogZG9jLl9yZXZ9O1xuICAgICAgICBpZiAob3B0cy5jdHgpIHsgLy8gcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgYXBpLl9yZW1vdmVMb2NhbCA9IGZ1bmN0aW9uIChkb2MsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIHZhciB0eCA9IG9wdHMuY3R4O1xuICAgIGlmICghdHgpIHtcbiAgICAgIHZhciB0eG5SZXN1bHQgPSBvcGVuVHJhbnNhY3Rpb25TYWZlbHkoaWRiLCBbTE9DQUxfU1RPUkVdLCAncmVhZHdyaXRlJyk7XG4gICAgICBpZiAodHhuUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0eG5SZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdHggPSB0eG5SZXN1bHQudHhuO1xuICAgICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciByZXQ7XG4gICAgdmFyIGlkID0gZG9jLl9pZDtcbiAgICB2YXIgb1N0b3JlID0gdHgub2JqZWN0U3RvcmUoTE9DQUxfU1RPUkUpO1xuICAgIHZhciByZXEgPSBvU3RvcmUuZ2V0KGlkKTtcblxuICAgIHJlcS5vbmVycm9yID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9sZERvYyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICghb2xkRG9jIHx8IG9sZERvYy5fcmV2ICE9PSBkb2MuX3Jldikge1xuICAgICAgICBjYWxsYmFjayhjcmVhdGVFcnJvcihNSVNTSU5HX0RPQykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb1N0b3JlLmRlbGV0ZShpZCk7XG4gICAgICAgIHJldCA9IHtvazogdHJ1ZSwgaWQ6IGlkLCByZXY6ICcwLTAnfTtcbiAgICAgICAgaWYgKG9wdHMuY3R4KSB7IC8vIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIGFwaS5fZGVzdHJveSA9IGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGNoYW5nZXNIYW5kbGVyLnJlbW92ZUFsbExpc3RlbmVycyhkYk5hbWUpO1xuXG4gICAgLy9DbG9zZSBvcGVuIHJlcXVlc3QgZm9yIFwiZGJOYW1lXCIgZGF0YWJhc2UgdG8gZml4IGllIGRlbGF5LlxuICAgIHZhciBvcGVuUmVxID0gb3BlblJlcUxpc3QuZ2V0KGRiTmFtZSk7XG4gICAgaWYgKG9wZW5SZXEgJiYgb3BlblJlcS5yZXN1bHQpIHtcbiAgICAgIG9wZW5SZXEucmVzdWx0LmNsb3NlKCk7XG4gICAgICBjYWNoZWREQnMuZGVsZXRlKGRiTmFtZSk7XG4gICAgfVxuICAgIHZhciByZXEgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoZGJOYW1lKTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvL1JlbW92ZSBvcGVuIHJlcXVlc3QgZnJvbSB0aGUgbGlzdC5cbiAgICAgIG9wZW5SZXFMaXN0LmRlbGV0ZShkYk5hbWUpO1xuICAgICAgaWYgKGhhc0xvY2FsU3RvcmFnZSgpICYmIChkYk5hbWUgaW4gbG9jYWxTdG9yYWdlKSkge1xuICAgICAgICBkZWxldGUgbG9jYWxTdG9yYWdlW2RiTmFtZV07XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCB7ICdvayc6IHRydWUgfSk7XG4gICAgfTtcblxuICAgIHJlcS5vbmVycm9yID0gaWRiRXJyb3IoY2FsbGJhY2spO1xuICB9O1xuXG4gIHZhciBjYWNoZWQgPSBjYWNoZWREQnMuZ2V0KGRiTmFtZSk7XG5cbiAgaWYgKGNhY2hlZCkge1xuICAgIGlkYiA9IGNhY2hlZC5pZGI7XG4gICAgYXBpLl9tZXRhID0gY2FjaGVkLmdsb2JhbDtcbiAgICByZXR1cm4gaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGFwaSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgcmVxID0gaW5kZXhlZERCLm9wZW4oZGJOYW1lLCBBREFQVEVSX1ZFUlNJT04pO1xuICBvcGVuUmVxTGlzdC5zZXQoZGJOYW1lLCByZXEpO1xuXG4gIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBkYiA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpZiAoZS5vbGRWZXJzaW9uIDwgMSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVNjaGVtYShkYik7IC8vIG5ldyBkYiwgaW5pdGlhbCBzY2hlbWFcbiAgICB9XG4gICAgLy8gZG8gbWlncmF0aW9uc1xuXG4gICAgdmFyIHR4biA9IGUuY3VycmVudFRhcmdldC50cmFuc2FjdGlvbjtcbiAgICAvLyB0aGVzZSBtaWdyYXRpb25zIGhhdmUgdG8gYmUgZG9uZSBpbiB0aGlzIGZ1bmN0aW9uLCBiZWZvcmVcbiAgICAvLyBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSBldmVudCBsb29wLCBiZWNhdXNlIEluZGV4ZWREQlxuXG4gICAgaWYgKGUub2xkVmVyc2lvbiA8IDMpIHtcbiAgICAgIGNyZWF0ZUxvY2FsU3RvcmVTY2hlbWEoZGIpOyAvLyB2MiAtPiB2M1xuICAgIH1cbiAgICBpZiAoZS5vbGRWZXJzaW9uIDwgNCkge1xuICAgICAgYWRkQXR0YWNoQW5kU2VxU3RvcmUoZGIpOyAvLyB2MyAtPiB2NFxuICAgIH1cblxuICAgIHZhciBtaWdyYXRpb25zID0gW1xuICAgICAgYWRkRGVsZXRlZE9yTG9jYWxJbmRleCwgLy8gdjEgLT4gdjJcbiAgICAgIG1pZ3JhdGVMb2NhbFN0b3JlLCAgICAgIC8vIHYyIC0+IHYzXG4gICAgICBtaWdyYXRlQXR0c0FuZFNlcXMsICAgICAvLyB2MyAtPiB2NFxuICAgICAgbWlncmF0ZU1ldGFkYXRhICAgICAgICAgLy8gdjQgLT4gdjVcbiAgICBdO1xuXG4gICAgdmFyIGkgPSBlLm9sZFZlcnNpb247XG5cbiAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgdmFyIG1pZ3JhdGlvbiA9IG1pZ3JhdGlvbnNbaSAtIDFdO1xuICAgICAgaSsrO1xuICAgICAgaWYgKG1pZ3JhdGlvbikge1xuICAgICAgICBtaWdyYXRpb24odHhuLCBuZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0KCk7XG4gIH07XG5cbiAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG5cbiAgICBpZGIgPSBlLnRhcmdldC5yZXN1bHQ7XG5cbiAgICBpZGIub252ZXJzaW9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWRiLmNsb3NlKCk7XG4gICAgICBjYWNoZWREQnMuZGVsZXRlKGRiTmFtZSk7XG4gICAgfTtcblxuICAgIGlkYi5vbmFib3J0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsICdEYXRhYmFzZSBoYXMgYSBnbG9iYWwgZmFpbHVyZScsIGUudGFyZ2V0LmVycm9yKTtcbiAgICAgIGlkYkdsb2JhbEZhaWx1cmVFcnJvciA9IGUudGFyZ2V0LmVycm9yO1xuICAgICAgaWRiLmNsb3NlKCk7XG4gICAgICBjYWNoZWREQnMuZGVsZXRlKGRiTmFtZSk7XG4gICAgfTtcblxuICAgIC8vIERvIGEgZmV3IHNldHVwIG9wZXJhdGlvbnMgKGluIHBhcmFsbGVsIGFzIG11Y2ggYXMgcG9zc2libGUpOlxuICAgIC8vIDEuIEZldGNoIG1ldGEgZG9jXG4gICAgLy8gMi4gQ2hlY2sgYmxvYiBzdXBwb3J0XG4gICAgLy8gMy4gQ2FsY3VsYXRlIGRvY0NvdW50XG4gICAgLy8gNC4gR2VuZXJhdGUgYW4gaW5zdGFuY2VJZCBpZiBuZWNlc3NhcnlcbiAgICAvLyA1LiBTdG9yZSBkb2NDb3VudCBhbmQgaW5zdGFuY2VJZCBvbiBtZXRhIGRvY1xuXG4gICAgdmFyIHR4biA9IGlkYi50cmFuc2FjdGlvbihbXG4gICAgICBNRVRBX1NUT1JFLFxuICAgICAgREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSxcbiAgICAgIERPQ19TVE9SRVxuICAgIF0sICdyZWFkd3JpdGUnKTtcblxuICAgIHZhciBzdG9yZWRNZXRhRG9jID0gZmFsc2U7XG4gICAgdmFyIG1ldGFEb2M7XG4gICAgdmFyIGRvY0NvdW50O1xuICAgIHZhciBibG9iU3VwcG9ydDtcbiAgICB2YXIgaW5zdGFuY2VJZDtcblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlU2V0dXAoKSB7XG4gICAgICBpZiAodHlwZW9mIGJsb2JTdXBwb3J0ID09PSAndW5kZWZpbmVkJyB8fCAhc3RvcmVkTWV0YURvYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkuX21ldGEgPSB7XG4gICAgICAgIG5hbWU6IGRiTmFtZSxcbiAgICAgICAgaW5zdGFuY2VJZDogaW5zdGFuY2VJZCxcbiAgICAgICAgYmxvYlN1cHBvcnQ6IGJsb2JTdXBwb3J0XG4gICAgICB9O1xuXG4gICAgICBjYWNoZWREQnMuc2V0KGRiTmFtZSwge1xuICAgICAgICBpZGI6IGlkYixcbiAgICAgICAgZ2xvYmFsOiBhcGkuX21ldGFcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2sobnVsbCwgYXBpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdG9yZU1ldGFEb2NJZlJlYWR5KCkge1xuICAgICAgaWYgKHR5cGVvZiBkb2NDb3VudCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIG1ldGFEb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBpbnN0YW5jZUtleSA9IGRiTmFtZSArICdfaWQnO1xuICAgICAgaWYgKGluc3RhbmNlS2V5IGluIG1ldGFEb2MpIHtcbiAgICAgICAgaW5zdGFuY2VJZCA9IG1ldGFEb2NbaW5zdGFuY2VLZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YURvY1tpbnN0YW5jZUtleV0gPSBpbnN0YW5jZUlkID0gdXVpZCgpO1xuICAgICAgfVxuICAgICAgbWV0YURvYy5kb2NDb3VudCA9IGRvY0NvdW50O1xuICAgICAgdHhuLm9iamVjdFN0b3JlKE1FVEFfU1RPUkUpLnB1dChtZXRhRG9jKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIGZldGNoIG9yIGdlbmVyYXRlIHRoZSBpbnN0YW5jZUlkXG4gICAgLy9cbiAgICB0eG4ub2JqZWN0U3RvcmUoTUVUQV9TVE9SRSkuZ2V0KE1FVEFfU1RPUkUpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBtZXRhRG9jID0gZS50YXJnZXQucmVzdWx0IHx8IHsgaWQ6IE1FVEFfU1RPUkUgfTtcbiAgICAgIHN0b3JlTWV0YURvY0lmUmVhZHkoKTtcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBjb3VudERvY3NcbiAgICAvL1xuICAgIGNvdW50RG9jcyh0eG4sIGZ1bmN0aW9uIChjb3VudCkge1xuICAgICAgZG9jQ291bnQgPSBjb3VudDtcbiAgICAgIHN0b3JlTWV0YURvY0lmUmVhZHkoKTtcbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy8gY2hlY2sgYmxvYiBzdXBwb3J0XG4gICAgLy9cbiAgICBpZiAoIWJsb2JTdXBwb3J0UHJvbWlzZSkge1xuICAgICAgLy8gbWFrZSBzdXJlIGJsb2Igc3VwcG9ydCBpcyBvbmx5IGNoZWNrZWQgb25jZVxuICAgICAgYmxvYlN1cHBvcnRQcm9taXNlID0gY2hlY2tCbG9iU3VwcG9ydCh0eG4pO1xuICAgIH1cblxuICAgIGJsb2JTdXBwb3J0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGJsb2JTdXBwb3J0ID0gdmFsO1xuICAgICAgY29tcGxldGVTZXR1cCgpO1xuICAgIH0pO1xuXG4gICAgLy8gb25seSB3aGVuIHRoZSBtZXRhZGF0YSBwdXQgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCxcbiAgICAvLyBjb25zaWRlciB0aGUgc2V0dXAgZG9uZVxuICAgIHR4bi5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgc3RvcmVkTWV0YURvYyA9IHRydWU7XG4gICAgICBjb21wbGV0ZVNldHVwKCk7XG4gICAgfTtcbiAgICB0eG4ub25hYm9ydCA9IGlkYkVycm9yKGNhbGxiYWNrKTtcbiAgfTtcblxuICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1zZyA9IGUudGFyZ2V0LmVycm9yICYmIGUudGFyZ2V0LmVycm9yLm1lc3NhZ2U7XG5cbiAgICBpZiAoIW1zZykge1xuICAgICAgbXNnID0gJ0ZhaWxlZCB0byBvcGVuIGluZGV4ZWREQiwgYXJlIHlvdSBpbiBwcml2YXRlIGJyb3dzaW5nIG1vZGU/JztcbiAgICB9IGVsc2UgaWYgKG1zZy5pbmRleE9mKFwic3RvcmVkIGRhdGFiYXNlIGlzIGEgaGlnaGVyIHZlcnNpb25cIikgIT09IC0xKSB7XG4gICAgICBtc2cgPSBuZXcgRXJyb3IoJ1RoaXMgREIgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgbmV3ZXIgXCJpbmRleGVkZGJcIiBhZGFwdGVyLCBidXQgeW91IGFyZSB0cnlpbmcgdG8gb3BlbiBpdCB3aXRoIHRoZSBvbGRlciBcImlkYlwiIGFkYXB0ZXInKTtcbiAgICB9XG5cbiAgICBndWFyZGVkQ29uc29sZSgnZXJyb3InLCBtc2cpO1xuICAgIGNhbGxiYWNrKGNyZWF0ZUVycm9yKElEQl9FUlJPUiwgbXNnKSk7XG4gIH07XG59XG5cbklkYlBvdWNoLnZhbGlkID0gZnVuY3Rpb24gKCkge1xuICAvLyBGb2xsb3dpbmcgIzcwODUgYnVnZ3kgaWRiIHZlcnNpb25zICh0eXBpY2FsbHkgU2FmYXJpIDwgMTAuMSkgYXJlXG4gIC8vIGNvbnNpZGVyZWQgdmFsaWQuXG5cbiAgLy8gT24gRmlyZWZveCBTZWN1cml0eUVycm9yIGlzIHRocm93biB3aGlsZSByZWZlcmVuY2luZyBpbmRleGVkREIgaWYgY29va2llc1xuICAvLyBhcmUgbm90IGFsbG93ZWQuIGB0eXBlb2YgaW5kZXhlZERCYCBhbHNvIHRyaWdnZXJzIHRoZSBlcnJvci5cbiAgdHJ5IHtcbiAgICAvLyBzb21lIG91dGRhdGVkIGltcGxlbWVudGF0aW9ucyBvZiBJREIgdGhhdCBhcHBlYXIgb24gU2Ftc3VuZ1xuICAgIC8vIGFuZCBIVEMgQW5kcm9pZCBkZXZpY2VzIDw0LjQgYXJlIG1pc3NpbmcgSURCS2V5UmFuZ2VcbiAgICByZXR1cm4gdHlwZW9mIGluZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIElEQktleVJhbmdlICE9PSAndW5kZWZpbmVkJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gSURCUG91Y2ggKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5hZGFwdGVyKCdpZGInLCBJZGJQb3VjaCwgdHJ1ZSk7XG59XG5cbi8vIGRlYWQgc2ltcGxlIHByb21pc2UgcG9vbCwgaW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL3RpbWRwL2VzNi1wcm9taXNlLXBvb2xcbi8vIGJ1dCBtdWNoIHNtYWxsZXIgaW4gY29kZSBzaXplLiBsaW1pdHMgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHByb21pc2VzIHRoYXQgYXJlIGV4ZWN1dGVkXG5cblxuZnVuY3Rpb24gcG9vbChwcm9taXNlRmFjdG9yaWVzLCBsaW1pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBydW5uaW5nID0gMDtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIGRvbmUgPSAwO1xuICAgIHZhciBsZW4gPSBwcm9taXNlRmFjdG9yaWVzLmxlbmd0aDtcbiAgICB2YXIgZXJyO1xuXG4gICAgZnVuY3Rpb24gcnVuTmV4dCgpIHtcbiAgICAgIHJ1bm5pbmcrKztcbiAgICAgIHByb21pc2VGYWN0b3JpZXNbY3VycmVudCsrXSgpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb05leHQoKSB7XG4gICAgICBpZiAoKytkb25lID09PSBsZW4pIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bk5leHRCYXRjaCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uU3VjY2VzcygpIHtcbiAgICAgIHJ1bm5pbmctLTtcbiAgICAgIGRvTmV4dCgpO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZnVuY3Rpb24gb25FcnJvcih0aGlzRXJyKSB7XG4gICAgICBydW5uaW5nLS07XG4gICAgICBlcnIgPSBlcnIgfHwgdGhpc0VycjtcbiAgICAgIGRvTmV4dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bk5leHRCYXRjaCgpIHtcbiAgICAgIHdoaWxlIChydW5uaW5nIDwgbGltaXQgJiYgY3VycmVudCA8IGxlbikge1xuICAgICAgICBydW5OZXh0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcnVuTmV4dEJhdGNoKCk7XG4gIH0pO1xufVxuXG52YXIgQ0hBTkdFU19CQVRDSF9TSVpFID0gMjU7XG52YXIgTUFYX1NJTVVMVEFORU9VU19SRVZTID0gNTA7XG52YXIgQ0hBTkdFU19USU1FT1VUX0JVRkZFUiA9IDUwMDA7XG52YXIgREVGQVVMVF9IRUFSVEJFQVQgPSAxMDAwMDtcblxudmFyIHN1cHBvcnRzQnVsa0dldE1hcCA9IHt9O1xuXG5mdW5jdGlvbiByZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcihyb3cpIHtcbiAgdmFyIGRvYyA9IHJvdy5kb2MgfHwgcm93Lm9rO1xuICB2YXIgYXR0cyA9IGRvYyAmJiBkb2MuX2F0dGFjaG1lbnRzO1xuICBpZiAoIWF0dHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgT2JqZWN0LmtleXMoYXR0cykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICB2YXIgYXR0ID0gYXR0c1tmaWxlbmFtZV07XG4gICAgYXR0LmRhdGEgPSBiNjRUb0JsdWZmZXIoYXR0LmRhdGEsIGF0dC5jb250ZW50X3R5cGUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlRG9jSWQoaWQpIHtcbiAgaWYgKC9eX2Rlc2lnbi8udGVzdChpZCkpIHtcbiAgICByZXR1cm4gJ19kZXNpZ24vJyArIGVuY29kZVVSSUNvbXBvbmVudChpZC5zbGljZSg4KSk7XG4gIH1cbiAgaWYgKC9eX2xvY2FsLy50ZXN0KGlkKSkge1xuICAgIHJldHVybiAnX2xvY2FsLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQuc2xpY2UoNykpO1xuICB9XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoaWQpO1xufVxuXG5mdW5jdGlvbiBwcmVwcm9jZXNzQXR0YWNobWVudHMkMShkb2MpIHtcbiAgaWYgKCFkb2MuX2F0dGFjaG1lbnRzIHx8ICFPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBhdHRhY2htZW50ID0gZG9jLl9hdHRhY2htZW50c1trZXldO1xuICAgIGlmIChhdHRhY2htZW50LmRhdGEgJiYgdHlwZW9mIGF0dGFjaG1lbnQuZGF0YSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBibG9iVG9CYXNlNjQoYXR0YWNobWVudC5kYXRhLCByZXNvbHZlKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGI2NCkge1xuICAgICAgICBhdHRhY2htZW50LmRhdGEgPSBiNjQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gaGFzVXJsUHJlZml4KG9wdHMpIHtcbiAgaWYgKCFvcHRzLnByZWZpeCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG9jb2wgPSBwYXJzZVVyaShvcHRzLnByZWZpeCkucHJvdG9jb2w7XG4gIHJldHVybiBwcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHByb3RvY29sID09PSAnaHR0cHMnO1xufVxuXG4vLyBHZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiB5b3UgcG9zc2libHkgY2FuIGFib3V0IHRoZSBVUkkgZ2l2ZW4gYnkgbmFtZSBhbmRcbi8vIHJldHVybiBpdCBhcyBhIHN1aXRhYmxlIG9iamVjdC5cbmZ1bmN0aW9uIGdldEhvc3QobmFtZSwgb3B0cykge1xuICAvLyBlbmNvZGUgZGIgbmFtZSBpZiBvcHRzLnByZWZpeCBpcyBhIHVybCAoIzU1NzQpXG4gIGlmIChoYXNVcmxQcmVmaXgob3B0cykpIHtcbiAgICB2YXIgZGJOYW1lID0gb3B0cy5uYW1lLnN1YnN0cihvcHRzLnByZWZpeC5sZW5ndGgpO1xuICAgIC8vIEVuc3VyZSBwcmVmaXggaGFzIGEgdHJhaWxpbmcgc2xhc2hcbiAgICB2YXIgcHJlZml4ID0gb3B0cy5wcmVmaXgucmVwbGFjZSgvXFwvPyQvLCAnLycpO1xuICAgIG5hbWUgPSBwcmVmaXggKyBlbmNvZGVVUklDb21wb25lbnQoZGJOYW1lKTtcbiAgfVxuXG4gIHZhciB1cmkgPSBwYXJzZVVyaShuYW1lKTtcbiAgaWYgKHVyaS51c2VyIHx8IHVyaS5wYXNzd29yZCkge1xuICAgIHVyaS5hdXRoID0ge3VzZXJuYW1lOiB1cmkudXNlciwgcGFzc3dvcmQ6IHVyaS5wYXNzd29yZH07XG4gIH1cblxuICAvLyBTcGxpdCB0aGUgcGF0aCBwYXJ0IG9mIHRoZSBVUkkgaW50byBwYXJ0cyB1c2luZyAnLycgYXMgdGhlIGRlbGltaXRlclxuICAvLyBhZnRlciByZW1vdmluZyBhbnkgbGVhZGluZyAnLycgYW5kIGFueSB0cmFpbGluZyAnLydcbiAgdmFyIHBhcnRzID0gdXJpLnBhdGgucmVwbGFjZSgvKF5cXC98XFwvJCkvZywgJycpLnNwbGl0KCcvJyk7XG5cbiAgdXJpLmRiID0gcGFydHMucG9wKCk7XG4gIC8vIFByZXZlbnQgZG91YmxlIGVuY29kaW5nIG9mIFVSSSBjb21wb25lbnRcbiAgaWYgKHVyaS5kYi5pbmRleE9mKCclJykgPT09IC0xKSB7XG4gICAgdXJpLmRiID0gZW5jb2RlVVJJQ29tcG9uZW50KHVyaS5kYik7XG4gIH1cblxuICB1cmkucGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblxuICByZXR1cm4gdXJpO1xufVxuXG4vLyBHZW5lcmF0ZSBhIFVSTCB3aXRoIHRoZSBob3N0IGRhdGEgZ2l2ZW4gYnkgb3B0cyBhbmQgdGhlIGdpdmVuIHBhdGhcbmZ1bmN0aW9uIGdlbkRCVXJsKG9wdHMsIHBhdGgpIHtcbiAgcmV0dXJuIGdlblVybChvcHRzLCBvcHRzLmRiICsgJy8nICsgcGF0aCk7XG59XG5cbi8vIEdlbmVyYXRlIGEgVVJMIHdpdGggdGhlIGhvc3QgZGF0YSBnaXZlbiBieSBvcHRzIGFuZCB0aGUgZ2l2ZW4gcGF0aFxuZnVuY3Rpb24gZ2VuVXJsKG9wdHMsIHBhdGgpIHtcbiAgLy8gSWYgdGhlIGhvc3QgYWxyZWFkeSBoYXMgYSBwYXRoLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHBhdGggZGVsaW1pdGVyXG4gIC8vIE90aGVyd2lzZSwgdGhlIHBhdGggZGVsaW1pdGVyIGlzIHRoZSBlbXB0eSBzdHJpbmdcbiAgdmFyIHBhdGhEZWwgPSAhb3B0cy5wYXRoID8gJycgOiAnLyc7XG5cbiAgLy8gSWYgdGhlIGhvc3QgYWxyZWFkeSBoYXMgYSBwYXRoLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHBhdGggZGVsaW1pdGVyXG4gIC8vIE90aGVyd2lzZSwgdGhlIHBhdGggZGVsaW1pdGVyIGlzIHRoZSBlbXB0eSBzdHJpbmdcbiAgcmV0dXJuIG9wdHMucHJvdG9jb2wgKyAnOi8vJyArIG9wdHMuaG9zdCArXG4gICAgICAgICAob3B0cy5wb3J0ID8gKCc6JyArIG9wdHMucG9ydCkgOiAnJykgK1xuICAgICAgICAgJy8nICsgb3B0cy5wYXRoICsgcGF0aERlbCArIHBhdGg7XG59XG5cbmZ1bmN0aW9uIHBhcmFtc1RvU3RyKHBhcmFtcykge1xuICByZXR1cm4gJz8nICsgT2JqZWN0LmtleXMocGFyYW1zKS5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICByZXR1cm4gayArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXNba10pO1xuICB9KS5qb2luKCcmJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhY2hlQnVzdChvcHRzKSB7XG4gIHZhciB1YSA9ICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50KSA/XG4gICAgICBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkgOiAnJztcbiAgdmFyIGlzSUUgPSB1YS5pbmRleE9mKCdtc2llJykgIT09IC0xO1xuICB2YXIgaXNUcmlkZW50ID0gdWEuaW5kZXhPZigndHJpZGVudCcpICE9PSAtMTtcbiAgdmFyIGlzRWRnZSA9IHVhLmluZGV4T2YoJ2VkZ2UnKSAhPT0gLTE7XG4gIHZhciBpc0dFVCA9ICEoJ21ldGhvZCcgaW4gb3B0cykgfHwgb3B0cy5tZXRob2QgPT09ICdHRVQnO1xuICByZXR1cm4gKGlzSUUgfHwgaXNUcmlkZW50IHx8IGlzRWRnZSkgJiYgaXNHRVQ7XG59XG5cbi8vIEltcGxlbWVudHMgdGhlIFBvdWNoREIgQVBJIGZvciBkZWFsaW5nIHdpdGggQ291Y2hEQiBpbnN0YW5jZXMgb3ZlciBIVFRQXG5mdW5jdGlvbiBIdHRwUG91Y2gob3B0cywgY2FsbGJhY2spIHtcblxuICAvLyBUaGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBwdWJsaWNseSBhdmFpbGFibGUgZm9yIEh0dHBQb3VjaFxuICB2YXIgYXBpID0gdGhpcztcblxuICB2YXIgaG9zdCA9IGdldEhvc3Qob3B0cy5uYW1lLCBvcHRzKTtcbiAgdmFyIGRiVXJsID0gZ2VuREJVcmwoaG9zdCwgJycpO1xuXG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICB2YXIgb3VyRmV0Y2ggPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwgbmV3IGgoKTtcblxuICAgIG9wdGlvbnMuY3JlZGVudGlhbHMgPSAnaW5jbHVkZSc7XG5cbiAgICBpZiAob3B0cy5hdXRoIHx8IGhvc3QuYXV0aCkge1xuICAgICAgdmFyIG5BdXRoID0gb3B0cy5hdXRoIHx8IGhvc3QuYXV0aDtcbiAgICAgIHZhciBzdHIgPSBuQXV0aC51c2VybmFtZSArICc6JyArIG5BdXRoLnBhc3N3b3JkO1xuICAgICAgdmFyIHRva2VuID0gdGhpc0J0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpKTtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIHRva2VuKTtcbiAgICB9XG5cbiAgICB2YXIgaGVhZGVycyA9IG9wdHMuaGVhZGVycyB8fCB7fTtcbiAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5hcHBlbmQoa2V5LCBoZWFkZXJzW2tleV0pO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNob3VsZENhY2hlQnVzdChvcHRpb25zKSkge1xuICAgICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyAnX25vbmNlPScgKyBEYXRlLm5vdygpO1xuICAgIH1cblxuICAgIHZhciBmZXRjaEZ1biA9IG9wdHMuZmV0Y2ggfHwgZiQxO1xuICAgIHJldHVybiBmZXRjaEZ1bih1cmwsIG9wdGlvbnMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGFkYXB0ZXJGdW4kJDEobmFtZSwgZnVuKSB7XG4gICAgcmV0dXJuIGFkYXB0ZXJGdW4obmFtZSwgZ2V0QXJndW1lbnRzKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICBzZXR1cCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2FsbGJhY2soZSk7XG4gICAgICB9KTtcbiAgICB9KSkuYmluZChhcGkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hKU09OKHVybCwgb3B0aW9ucywgY2FsbGJhY2spIHtcblxuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCBuZXcgaCgpO1xuXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSkge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMuZ2V0KCdBY2NlcHQnKSkge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3VyRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmVzdWx0Lm9rID0gcmVzcG9uc2Uub2s7XG4gICAgICByZXN1bHQuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChqc29uKSB7XG4gICAgICByZXN1bHQuZGF0YSA9IGpzb247XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICByZXN1bHQuZGF0YS5zdGF0dXMgPSByZXN1bHQuc3RhdHVzO1xuICAgICAgICB2YXIgZXJyID0gZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShyZXN1bHQuZGF0YSk7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQuZGF0YSkpIHtcbiAgICAgICAgcmVzdWx0LmRhdGEgPSByZXN1bHQuZGF0YS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICBpZiAodi5lcnJvciB8fCB2Lm1pc3NpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUVycm9yRnJvbVJlc3BvbnNlKHYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0LmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBzZXR1cFByb21pc2U7XG5cbiAgZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAgaWYgKG9wdHMuc2tpcF9zZXR1cCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIGEgc2V0dXAgaW4gcHJvY2VzcyBvciBwcmV2aW91cyBzdWNjZXNzZnVsIHNldHVwXG4gICAgLy8gZG9uZSB0aGVuIHdlIHdpbGwgdXNlIHRoYXRcbiAgICAvLyBJZiBwcmV2aW91cyBzZXR1cHMgaGF2ZSBiZWVuIHJlamVjdGVkIHdlIHdpbGwgdHJ5IGFnYWluXG4gICAgaWYgKHNldHVwUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHNldHVwUHJvbWlzZTtcbiAgICB9XG5cbiAgICBzZXR1cFByb21pc2UgPSBmZXRjaEpTT04oZGJVcmwpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1cyAmJiBlcnIuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgLy8gRG9lc250IGV4aXN0LCBjcmVhdGUgaXRcbiAgICAgICAgZXhwbGFpbkVycm9yKDQwNCwgJ1BvdWNoREIgaXMganVzdCBkZXRlY3RpbmcgaWYgdGhlIHJlbW90ZSBleGlzdHMuJyk7XG4gICAgICAgIHJldHVybiBmZXRjaEpTT04oZGJVcmwsIHttZXRob2Q6ICdQVVQnfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAvLyBJZiB3ZSB0cnkgdG8gY3JlYXRlIGEgZGF0YWJhc2UgdGhhdCBhbHJlYWR5IGV4aXN0cywgc2tpcHBlZCBpblxuICAgICAgLy8gaXN0YW5idWwgc2luY2UgaXRzIGNhdGNoaW5nIGEgcmFjZSBjb25kaXRpb24uXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1cyAmJiBlcnIuc3RhdHVzID09PSA0MTIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxuICAgIHNldHVwUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXR1cFByb21pc2UgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNldHVwUHJvbWlzZTtcbiAgfVxuXG4gIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgYXBpKTtcbiAgfSk7XG5cbiAgYXBpLl9yZW1vdGUgPSB0cnVlO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGFwaS50eXBlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnaHR0cCc7XG4gIH07XG5cbiAgYXBpLmlkID0gYWRhcHRlckZ1biQkMSgnaWQnLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBvdXJGZXRjaChnZW5VcmwoaG9zdCwgJycpKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAvLyBCYWQgcmVzcG9uc2Ugb3IgbWlzc2luZyBgdXVpZGAgc2hvdWxkIG5vdCBwcmV2ZW50IElEIGdlbmVyYXRpb24uXG4gICAgICB2YXIgdXVpZCQkMSA9IChyZXN1bHQgJiYgcmVzdWx0LnV1aWQpID9cbiAgICAgICAgICAocmVzdWx0LnV1aWQgKyBob3N0LmRiKSA6IGdlbkRCVXJsKGhvc3QsICcnKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHV1aWQkJDEpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byB0aGUgaG9zdCBjYWxsaW5nIHRoZSBjb3VjaGRiIF9jb21wYWN0IGZ1bmN0aW9uXG4gIC8vICAgIHZlcnNpb246IFRoZSB2ZXJzaW9uIG9mIENvdWNoREIgaXQgaXMgcnVubmluZ1xuICBhcGkuY29tcGFjdCA9IGFkYXB0ZXJGdW4kJDEoJ2NvbXBhY3QnLCBmdW5jdGlvbiAob3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgb3B0cyA9IGNsb25lKG9wdHMpO1xuXG4gICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfY29tcGFjdCcpLCB7bWV0aG9kOiAnUE9TVCd9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIHBpbmcoKSB7XG4gICAgICAgIGFwaS5pbmZvKGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICAgIC8vIENvdWNoREIgbWF5IHNlbmQgYSBcImNvbXBhY3RfcnVubmluZzp0cnVlXCIgaWYgaXQnc1xuICAgICAgICAgIC8vIGFscmVhZHkgY29tcGFjdGluZy4gUG91Y2hEQiBTZXJ2ZXIgZG9lc24ndC5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChyZXMgJiYgIXJlcy5jb21wYWN0X3J1bm5pbmcpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtvazogdHJ1ZX0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHBpbmcsIG9wdHMuaW50ZXJ2YWwgfHwgMjAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gUGluZyB0aGUgaHR0cCBpZiBpdCdzIGZpbmlzaGVkIGNvbXBhY3Rpb25cbiAgICAgIHBpbmcoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgYXBpLmJ1bGtHZXQgPSBhZGFwdGVyRnVuKCdidWxrR2V0JywgZnVuY3Rpb24gKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gZG9CdWxrR2V0KGNiKSB7XG4gICAgICB2YXIgcGFyYW1zID0ge307XG4gICAgICBpZiAob3B0cy5yZXZzKSB7XG4gICAgICAgIHBhcmFtcy5yZXZzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHBhcmFtcy5hdHRhY2htZW50cyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5sYXRlc3QpIHtcbiAgICAgICAgcGFyYW1zLmxhdGVzdCA9IHRydWU7XG4gICAgICB9XG4gICAgICBmZXRjaEpTT04oZ2VuREJVcmwoaG9zdCwgJ19idWxrX2dldCcgKyBwYXJhbXNUb1N0cihwYXJhbXMpKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkb2NzOiBvcHRzLmRvY3N9KVxuICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzICYmIG9wdHMuYmluYXJ5KSB7XG4gICAgICAgICAgcmVzdWx0LmRhdGEucmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHJlcy5kb2NzLmZvckVhY2gocmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNiKG51bGwsIHJlc3VsdC5kYXRhKTtcbiAgICAgIH0pLmNhdGNoKGNiKTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uIGRvQnVsa0dldFNoaW0oKSB7XG4gICAgICAvLyBhdm9pZCBcInVybCB0b28gbG9uZyBlcnJvclwiIGJ5IHNwbGl0dGluZyB1cCBpbnRvIG11bHRpcGxlIHJlcXVlc3RzXG4gICAgICB2YXIgYmF0Y2hTaXplID0gTUFYX1NJTVVMVEFORU9VU19SRVZTO1xuICAgICAgdmFyIG51bUJhdGNoZXMgPSBNYXRoLmNlaWwob3B0cy5kb2NzLmxlbmd0aCAvIGJhdGNoU2l6ZSk7XG4gICAgICB2YXIgbnVtRG9uZSA9IDA7XG4gICAgICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShudW1CYXRjaGVzKTtcblxuICAgICAgZnVuY3Rpb24gb25SZXN1bHQoYmF0Y2hOdW0pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICAgIC8vIGVyciBpcyBpbXBvc3NpYmxlIGJlY2F1c2Ugc2hpbSByZXR1cm5zIGEgbGlzdCBvZiBlcnJzIGluIHRoYXQgY2FzZVxuICAgICAgICAgIHJlc3VsdHNbYmF0Y2hOdW1dID0gcmVzLnJlc3VsdHM7XG4gICAgICAgICAgaWYgKCsrbnVtRG9uZSA9PT0gbnVtQmF0Y2hlcykge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge3Jlc3VsdHM6IGZsYXR0ZW4ocmVzdWx0cyl9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQmF0Y2hlczsgaSsrKSB7XG4gICAgICAgIHZhciBzdWJPcHRzID0gcGljayhvcHRzLCBbJ3JldnMnLCAnYXR0YWNobWVudHMnLCAnYmluYXJ5JywgJ2xhdGVzdCddKTtcbiAgICAgICAgc3ViT3B0cy5kb2NzID0gb3B0cy5kb2NzLnNsaWNlKGkgKiBiYXRjaFNpemUsXG4gICAgICAgICAgTWF0aC5taW4ob3B0cy5kb2NzLmxlbmd0aCwgKGkgKyAxKSAqIGJhdGNoU2l6ZSkpO1xuICAgICAgICBidWxrR2V0KHNlbGYsIHN1Yk9wdHMsIG9uUmVzdWx0KGkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBtYXJrIHRoZSB3aG9sZSBkYXRhYmFzZSBhcyBlaXRoZXIgc3VwcG9ydGluZyBvciBub3Qgc3VwcG9ydGluZyBfYnVsa19nZXRcbiAgICB2YXIgZGJVcmwgPSBnZW5VcmwoaG9zdCwgJycpO1xuICAgIHZhciBzdXBwb3J0c0J1bGtHZXQgPSBzdXBwb3J0c0J1bGtHZXRNYXBbZGJVcmxdO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAodHlwZW9mIHN1cHBvcnRzQnVsa0dldCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGlzIGRhdGFiYXNlIHN1cHBvcnRzIF9idWxrX2dldFxuICAgICAgZG9CdWxrR2V0KGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgc3VwcG9ydHNCdWxrR2V0TWFwW2RiVXJsXSA9IGZhbHNlO1xuICAgICAgICAgIGV4cGxhaW5FcnJvcihcbiAgICAgICAgICAgIGVyci5zdGF0dXMsXG4gICAgICAgICAgICAnUG91Y2hEQiBpcyBqdXN0IGRldGVjdGluZyBpZiB0aGUgcmVtb3RlICcgK1xuICAgICAgICAgICAgJ3N1cHBvcnRzIHRoZSBfYnVsa19nZXQgQVBJLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGRvQnVsa0dldFNoaW0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdXBwb3J0c0J1bGtHZXRNYXBbZGJVcmxdID0gdHJ1ZTtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRzQnVsa0dldCkge1xuICAgICAgZG9CdWxrR2V0KGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9CdWxrR2V0U2hpbSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2FsbHMgR0VUIG9uIHRoZSBob3N0LCB3aGljaCBnZXRzIGJhY2sgYSBKU09OIHN0cmluZyBjb250YWluaW5nXG4gIC8vICAgIGNvdWNoZGI6IEEgd2VsY29tZSBzdHJpbmdcbiAgLy8gICAgdmVyc2lvbjogVGhlIHZlcnNpb24gb2YgQ291Y2hEQiBpdCBpcyBydW5uaW5nXG4gIGFwaS5faW5mbyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb3VyRmV0Y2goZ2VuREJVcmwoaG9zdCwgJycpKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICBpbmZvLmhvc3QgPSBnZW5EQlVybChob3N0LCAnJyk7XG4gICAgICBjYWxsYmFjayhudWxsLCBpbmZvKTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gIH07XG5cbiAgYXBpLmZldGNoID0gZnVuY3Rpb24gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB1cmwgPSBwYXRoLnN1YnN0cmluZygwLCAxKSA9PT0gJy8nID9cbiAgICAgICAgZ2VuVXJsKGhvc3QsIHBhdGguc3Vic3RyaW5nKDEpKSA6XG4gICAgICAgIGdlbkRCVXJsKGhvc3QsIHBhdGgpO1xuICAgICAgcmV0dXJuIG91ckZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gR2V0IHRoZSBkb2N1bWVudCB3aXRoIHRoZSBnaXZlbiBpZCBmcm9tIHRoZSBkYXRhYmFzZSBnaXZlbiBieSBob3N0LlxuICAvLyBUaGUgaWQgY291bGQgYmUgc29sZWx5IHRoZSBfaWQgaW4gdGhlIGRhdGFiYXNlLCBvciBpdCBtYXkgYmUgYVxuICAvLyBfZGVzaWduL0lEIG9yIF9sb2NhbC9JRCBwYXRoXG4gIGFwaS5nZXQgPSBhZGFwdGVyRnVuJCQxKCdnZXQnLCBmdW5jdGlvbiAoaWQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgLy8gSWYgbm8gb3B0aW9ucyB3ZXJlIGdpdmVuLCBzZXQgdGhlIGNhbGxiYWNrIHRvIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuICAgIG9wdHMgPSBjbG9uZShvcHRzKTtcblxuICAgIC8vIExpc3Qgb2YgcGFyYW1ldGVycyB0byBhZGQgdG8gdGhlIEdFVCByZXF1ZXN0XG4gICAgdmFyIHBhcmFtcyA9IHt9O1xuXG4gICAgaWYgKG9wdHMucmV2cykge1xuICAgICAgcGFyYW1zLnJldnMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnJldnNfaW5mbykge1xuICAgICAgcGFyYW1zLnJldnNfaW5mbyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubGF0ZXN0KSB7XG4gICAgICBwYXJhbXMubGF0ZXN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5vcGVuX3JldnMpIHtcbiAgICAgIGlmIChvcHRzLm9wZW5fcmV2cyAhPT0gXCJhbGxcIikge1xuICAgICAgICBvcHRzLm9wZW5fcmV2cyA9IEpTT04uc3RyaW5naWZ5KG9wdHMub3Blbl9yZXZzKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5vcGVuX3JldnMgPSBvcHRzLm9wZW5fcmV2cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5yZXYpIHtcbiAgICAgIHBhcmFtcy5yZXYgPSBvcHRzLnJldjtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgIHBhcmFtcy5jb25mbGljdHMgPSBvcHRzLmNvbmZsaWN0cztcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICBwYXJhbXMudXBkYXRlX3NlcSA9IG9wdHMudXBkYXRlX3NlcTtcbiAgICB9XG5cbiAgICBpZCA9IGVuY29kZURvY0lkKGlkKTtcblxuICAgIGZ1bmN0aW9uIGZldGNoQXR0YWNobWVudHMoZG9jKSB7XG4gICAgICB2YXIgYXR0cyA9IGRvYy5fYXR0YWNobWVudHM7XG4gICAgICB2YXIgZmlsZW5hbWVzID0gYXR0cyAmJiBPYmplY3Qua2V5cyhhdHRzKTtcbiAgICAgIGlmICghYXR0cyB8fCAhZmlsZW5hbWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB3ZSBmZXRjaCB0aGVzZSBtYW51YWxseSBpbiBzZXBhcmF0ZSBYSFJzLCBiZWNhdXNlXG4gICAgICAvLyBTeW5jIEdhdGV3YXkgd291bGQgbm9ybWFsbHkgc2VuZCBpdCBiYWNrIGFzIG11bHRpcGFydC9taXhlZCxcbiAgICAgIC8vIHdoaWNoIHdlIGNhbm5vdCBwYXJzZS4gQWxzbywgdGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuXG4gICAgICAvLyByZWNlaXZpbmcgYXR0YWNobWVudHMgYXMgYmFzZTY0LWVuY29kZWQgc3RyaW5ncy5cbiAgICAgIGZ1bmN0aW9uIGZldGNoRGF0YShmaWxlbmFtZSkge1xuICAgICAgICB2YXIgYXR0ID0gYXR0c1tmaWxlbmFtZV07XG4gICAgICAgIHZhciBwYXRoID0gZW5jb2RlRG9jSWQoZG9jLl9pZCkgKyAnLycgKyBlbmNvZGVBdHRhY2htZW50SWQoZmlsZW5hbWUpICtcbiAgICAgICAgICAgICc/cmV2PScgKyBkb2MuX3JldjtcbiAgICAgICAgcmV0dXJuIG91ckZldGNoKGdlbkRCVXJsKGhvc3QsIHBhdGgpKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIGlmICgnYnVmZmVyJyBpbiByZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJ1ZmZlcigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgICBpZiAob3B0cy5iaW5hcnkpIHtcbiAgICAgICAgICAgIHZhciB0eXBlRmllbGREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihibG9iLl9fcHJvdG9fXywgJ3R5cGUnKTtcbiAgICAgICAgICAgIGlmICghdHlwZUZpZWxkRGVzY3JpcHRvciB8fCB0eXBlRmllbGREZXNjcmlwdG9yLnNldCkge1xuICAgICAgICAgICAgICBibG9iLnR5cGUgPSBhdHQuY29udGVudF90eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJsb2I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgYmxvYlRvQmFzZTY0KGJsb2IsIHJlc29sdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgZGVsZXRlIGF0dC5zdHViO1xuICAgICAgICAgIGRlbGV0ZSBhdHQubGVuZ3RoO1xuICAgICAgICAgIGF0dC5kYXRhID0gZGF0YTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlRmFjdG9yaWVzID0gZmlsZW5hbWVzLm1hcChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hEYXRhKGZpbGVuYW1lKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGlzIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHBhcmFsbGVsIHhociByZXF1ZXN0cyB0byA1IGFueSB0aW1lXG4gICAgICAvLyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBtYXhpbXVtIGJyb3dzZXIgcmVxdWVzdCBsaW1pdHNcbiAgICAgIHJldHVybiBwb29sKHByb21pc2VGYWN0b3JpZXMsIDUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZldGNoQWxsQXR0YWNobWVudHMoZG9jT3JEb2NzKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkb2NPckRvY3MpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChkb2NPckRvY3MubWFwKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hBdHRhY2htZW50cyhkb2Mub2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZldGNoQXR0YWNobWVudHMoZG9jT3JEb2NzKTtcbiAgICB9XG5cbiAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgaWQgKyBwYXJhbXNUb1N0cihwYXJhbXMpKTtcbiAgICBmZXRjaEpTT04odXJsKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hBbGxBdHRhY2htZW50cyhyZXMuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCByZXMuZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgZS5kb2NJZCA9IGlkO1xuICAgICAgY2FsbGJhY2soZSk7XG4gICAgfSk7XG4gIH0pO1xuXG5cbiAgLy8gRGVsZXRlIHRoZSBkb2N1bWVudCBnaXZlbiBieSBkb2MgZnJvbSB0aGUgZGF0YWJhc2UgZ2l2ZW4gYnkgaG9zdC5cbiAgYXBpLnJlbW92ZSA9IGFkYXB0ZXJGdW4kJDEoJ3JlbW92ZScsIGZ1bmN0aW9uIChkb2NPcklkLCBvcHRzT3JSZXYsIG9wdHMsIGNiKSB7XG4gICAgdmFyIGRvYztcbiAgICBpZiAodHlwZW9mIG9wdHNPclJldiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIGlkLCByZXYsIG9wdHMsIGNhbGxiYWNrIHN0eWxlXG4gICAgICBkb2MgPSB7XG4gICAgICAgIF9pZDogZG9jT3JJZCxcbiAgICAgICAgX3Jldjogb3B0c09yUmV2XG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0cztcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkb2MsIG9wdHMsIGNhbGxiYWNrIHN0eWxlXG4gICAgICBkb2MgPSBkb2NPcklkO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzT3JSZXYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBvcHRzT3JSZXY7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNiID0gb3B0cztcbiAgICAgICAgb3B0cyA9IG9wdHNPclJldjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmV2ID0gKGRvYy5fcmV2IHx8IG9wdHMucmV2KTtcbiAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgZW5jb2RlRG9jSWQoZG9jLl9pZCkpICsgJz9yZXY9JyArIHJldjtcblxuICAgIGZldGNoSlNPTih1cmwsIHttZXRob2Q6ICdERUxFVEUnfSwgY2IpLmNhdGNoKGNiKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gZW5jb2RlQXR0YWNobWVudElkKGF0dGFjaG1lbnRJZCkge1xuICAgIHJldHVybiBhdHRhY2htZW50SWQuc3BsaXQoXCIvXCIpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oXCIvXCIpO1xuICB9XG5cbiAgLy8gR2V0IHRoZSBhdHRhY2htZW50XG4gIGFwaS5nZXRBdHRhY2htZW50ID0gYWRhcHRlckZ1biQkMSgnZ2V0QXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCwgYXR0YWNobWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgdmFyIHBhcmFtcyA9IG9wdHMucmV2ID8gKCc/cmV2PScgKyBvcHRzLnJldikgOiAnJztcbiAgICB2YXIgdXJsID0gZ2VuREJVcmwoaG9zdCwgZW5jb2RlRG9jSWQoZG9jSWQpKSArICcvJyArXG4gICAgICAgIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpICsgcGFyYW1zO1xuICAgIHZhciBjb250ZW50VHlwZTtcbiAgICBvdXJGZXRjaCh1cmwsIHttZXRob2Q6ICdHRVQnfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyByZXNwb25zZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgIXByb2Nlc3MuYnJvd3NlciAmJiB0eXBlb2YgcmVzcG9uc2UuYnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJ1ZmZlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgIC8vIFRPRE86IGFsc28gcmVtb3ZlXG4gICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICFwcm9jZXNzLmJyb3dzZXIpIHtcbiAgICAgICAgYmxvYi50eXBlID0gY29udGVudFR5cGU7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCBibG9iKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZW1vdmUgdGhlIGF0dGFjaG1lbnQgZ2l2ZW4gYnkgdGhlIGlkIGFuZCByZXZcbiAgYXBpLnJlbW92ZUF0dGFjaG1lbnQgPSAgYWRhcHRlckZ1biQkMSgncmVtb3ZlQXR0YWNobWVudCcsIGZ1bmN0aW9uIChkb2NJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKSB7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGVuY29kZURvY0lkKGRvY0lkKSArICcvJyArXG4gICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUF0dGFjaG1lbnRJZChhdHRhY2htZW50SWQpKSArICc/cmV2PScgKyByZXY7XG4gICAgZmV0Y2hKU09OKHVybCwge21ldGhvZDogJ0RFTEVURSd9LCBjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICAvLyBBZGQgdGhlIGF0dGFjaG1lbnQgZ2l2ZW4gYnkgYmxvYiBhbmQgaXRzIGNvbnRlbnRUeXBlIHByb3BlcnR5XG4gIC8vIHRvIHRoZSBkb2N1bWVudCB3aXRoIHRoZSBnaXZlbiBpZCwgdGhlIHJldmlzaW9uIGdpdmVuIGJ5IHJldiwgYW5kXG4gIC8vIGFkZCBpdCB0byB0aGUgZGF0YWJhc2UgZ2l2ZW4gYnkgaG9zdC5cbiAgYXBpLnB1dEF0dGFjaG1lbnQgPSBhZGFwdGVyRnVuJCQxKCdwdXRBdHRhY2htZW50JywgZnVuY3Rpb24gKGRvY0lkLCBhdHRhY2htZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXYsIGJsb2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSB0eXBlO1xuICAgICAgdHlwZSA9IGJsb2I7XG4gICAgICBibG9iID0gcmV2O1xuICAgICAgcmV2ID0gbnVsbDtcbiAgICB9XG4gICAgdmFyIGlkID0gZW5jb2RlRG9jSWQoZG9jSWQpICsgJy8nICsgZW5jb2RlQXR0YWNobWVudElkKGF0dGFjaG1lbnRJZCk7XG4gICAgdmFyIHVybCA9IGdlbkRCVXJsKGhvc3QsIGlkKTtcbiAgICBpZiAocmV2KSB7XG4gICAgICB1cmwgKz0gJz9yZXY9JyArIHJldjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpbnB1dCBpcyBhc3N1bWVkIHRvIGJlIGEgYmFzZTY0IHN0cmluZ1xuICAgICAgdmFyIGJpbmFyeTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJpbmFyeSA9IHRoaXNBdG9iKGJsb2IpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhjcmVhdGVFcnJvcihCQURfQVJHLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0F0dGFjaG1lbnQgaXMgbm90IGEgdmFsaWQgYmFzZTY0IHN0cmluZycpKTtcbiAgICAgIH1cbiAgICAgIGJsb2IgPSBiaW5hcnkgPyBiaW5TdHJpbmdUb0JsdWZmZXIoYmluYXJ5LCB0eXBlKSA6ICcnO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgYXR0YWNobWVudFxuICAgIGZldGNoSlNPTih1cmwsIHtcbiAgICAgIGhlYWRlcnM6IG5ldyBoKHsnQ29udGVudC1UeXBlJzogdHlwZX0pLFxuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGJvZHk6IGJsb2JcbiAgICB9LCBjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xuICB9KTtcblxuICAvLyBVcGRhdGUvY3JlYXRlIG11bHRpcGxlIGRvY3VtZW50cyBnaXZlbiBieSByZXEgaW4gdGhlIGRhdGFiYXNlXG4gIC8vIGdpdmVuIGJ5IGhvc3QuXG4gIGFwaS5fYnVsa0RvY3MgPSBmdW5jdGlvbiAocmVxLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIC8vIElmIG5ld19lZGl0cz1mYWxzZSB0aGVuIGl0IHByZXZlbnRzIHRoZSBkYXRhYmFzZSBmcm9tIGNyZWF0aW5nXG4gICAgLy8gbmV3IHJldmlzaW9uIG51bWJlcnMgZm9yIHRoZSBkb2N1bWVudHMuIEluc3RlYWQgaXQganVzdCB1c2VzXG4gICAgLy8gdGhlIG9sZCBvbmVzLiBUaGlzIGlzIHVzZWQgaW4gZGF0YWJhc2UgcmVwbGljYXRpb24uXG4gICAgcmVxLm5ld19lZGl0cyA9IG9wdHMubmV3X2VkaXRzO1xuXG4gICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXEuZG9jcy5tYXAocHJlcHJvY2Vzc0F0dGFjaG1lbnRzJDEpKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVwZGF0ZS9jcmVhdGUgdGhlIGRvY3VtZW50c1xuICAgICAgcmV0dXJuIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnX2J1bGtfZG9jcycpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXEpXG4gICAgICB9LCBjYWxsYmFjayk7XG4gICAgfSkuY2F0Y2goY2FsbGJhY2spO1xuICB9O1xuXG5cbiAgLy8gVXBkYXRlL2NyZWF0ZSBkb2N1bWVudFxuICBhcGkuX3B1dCA9IGZ1bmN0aW9uIChkb2MsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgc2V0dXAoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwcmVwcm9jZXNzQXR0YWNobWVudHMkMShkb2MpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZldGNoSlNPTihnZW5EQlVybChob3N0LCBlbmNvZGVEb2NJZChkb2MuX2lkKSksIHtcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZG9jKVxuICAgICAgfSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQuZGF0YSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgZXJyLmRvY0lkID0gZG9jICYmIGRvYy5faWQ7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuICB9O1xuXG5cbiAgLy8gR2V0IGEgbGlzdGluZyBvZiB0aGUgZG9jdW1lbnRzIGluIHRoZSBkYXRhYmFzZSBnaXZlblxuICAvLyBieSBob3N0IGFuZCBvcmRlcmVkIGJ5IGluY3JlYXNpbmcgaWQuXG4gIGFwaS5hbGxEb2NzID0gYWRhcHRlckZ1biQkMSgnYWxsRG9jcycsIGZ1bmN0aW9uIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgICAvLyBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gYWRkIHRvIHRoZSBHRVQgcmVxdWVzdFxuICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICB2YXIgYm9keTtcbiAgICB2YXIgbWV0aG9kID0gJ0dFVCc7XG5cbiAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgIHBhcmFtcy5jb25mbGljdHMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgIHBhcmFtcy51cGRhdGVfc2VxID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICBwYXJhbXMuZGVzY2VuZGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBhZGRlZCBpbiBDb3VjaERCIDEuNi4wXG4gICAgaWYgKG9wdHMuYXR0YWNobWVudHMpIHtcbiAgICAgIHBhcmFtcy5hdHRhY2htZW50cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMua2V5KSB7XG4gICAgICBwYXJhbXMua2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5rZXkpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnN0YXJ0X2tleSkge1xuICAgICAgb3B0cy5zdGFydGtleSA9IG9wdHMuc3RhcnRfa2V5O1xuICAgIH1cblxuICAgIGlmIChvcHRzLnN0YXJ0a2V5KSB7XG4gICAgICBwYXJhbXMuc3RhcnRrZXkgPSBKU09OLnN0cmluZ2lmeShvcHRzLnN0YXJ0a2V5KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmRfa2V5KSB7XG4gICAgICBvcHRzLmVuZGtleSA9IG9wdHMuZW5kX2tleTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmRrZXkpIHtcbiAgICAgIHBhcmFtcy5lbmRrZXkgPSBKU09OLnN0cmluZ2lmeShvcHRzLmVuZGtleSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmluY2x1c2l2ZV9lbmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuaW5jbHVzaXZlX2VuZCA9ICEhb3B0cy5pbmNsdXNpdmVfZW5kO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5saW1pdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5saW1pdCA9IG9wdHMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnNraXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuc2tpcCA9IG9wdHMuc2tpcDtcbiAgICB9XG5cbiAgICB2YXIgcGFyYW1TdHIgPSBwYXJhbXNUb1N0cihwYXJhbXMpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmtleXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICBib2R5ID0ge2tleXM6IG9wdHMua2V5c307XG4gICAgfVxuXG4gICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfYWxsX2RvY3MnICsgcGFyYW1TdHIpLCB7XG4gICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzICYmIG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5iaW5hcnkpIHtcbiAgICAgICAgcmVzdWx0LmRhdGEucm93cy5mb3JFYWNoKHJlYWRBdHRhY2htZW50c0FzQmxvYk9yQnVmZmVyKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5kYXRhKTtcbiAgICB9KS5jYXRjaChjYWxsYmFjayk7XG4gIH0pO1xuXG4gIC8vIEdldCBhIGxpc3Qgb2YgY2hhbmdlcyBtYWRlIHRvIGRvY3VtZW50cyBpbiB0aGUgZGF0YWJhc2UgZ2l2ZW4gYnkgaG9zdC5cbiAgLy8gVE9ETyBBY2NvcmRpbmcgdG8gdGhlIFJFQURNRSwgdGhlcmUgc2hvdWxkIGJlIHR3byBvdGhlciBtZXRob2RzIGhlcmUsXG4gIC8vIGFwaS5jaGFuZ2VzLmFkZExpc3RlbmVyIGFuZCBhcGkuY2hhbmdlcy5yZW1vdmVMaXN0ZW5lci5cbiAgYXBpLl9jaGFuZ2VzID0gZnVuY3Rpb24gKG9wdHMpIHtcblxuICAgIC8vIFdlIGludGVybmFsbHkgcGFnZSB0aGUgcmVzdWx0cyBvZiBhIGNoYW5nZXMgcmVxdWVzdCwgdGhpcyBtZWFuc1xuICAgIC8vIGlmIHRoZXJlIGlzIGEgbGFyZ2Ugc2V0IG9mIGNoYW5nZXMgdG8gYmUgcmV0dXJuZWQgd2UgY2FuIHN0YXJ0XG4gICAgLy8gcHJvY2Vzc2luZyB0aGVtIHF1aWNrZXIgaW5zdGVhZCBvZiB3YWl0aW5nIG9uIHRoZSBlbnRpcmVcbiAgICAvLyBzZXQgb2YgY2hhbmdlcyB0byByZXR1cm4gYW5kIGF0dGVtcHRpbmcgdG8gcHJvY2VzcyB0aGVtIGF0IG9uY2VcbiAgICB2YXIgYmF0Y2hTaXplID0gJ2JhdGNoX3NpemUnIGluIG9wdHMgPyBvcHRzLmJhdGNoX3NpemUgOiBDSEFOR0VTX0JBVENIX1NJWkU7XG5cbiAgICBvcHRzID0gY2xvbmUob3B0cyk7XG5cbiAgICBpZiAob3B0cy5jb250aW51b3VzICYmICEoJ2hlYXJ0YmVhdCcgaW4gb3B0cykpIHtcbiAgICAgIG9wdHMuaGVhcnRiZWF0ID0gREVGQVVMVF9IRUFSVEJFQVQ7XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3RUaW1lb3V0ID0gKCd0aW1lb3V0JyBpbiBvcHRzKSA/IG9wdHMudGltZW91dCA6IDMwICogMTAwMDtcblxuICAgIC8vIGVuc3VyZSBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSIGFwcGxpZXNcbiAgICBpZiAoJ3RpbWVvdXQnIGluIG9wdHMgJiYgb3B0cy50aW1lb3V0ICYmXG4gICAgICAocmVxdWVzdFRpbWVvdXQgLSBvcHRzLnRpbWVvdXQpIDwgQ0hBTkdFU19USU1FT1VUX0JVRkZFUikge1xuICAgICAgICByZXF1ZXN0VGltZW91dCA9IG9wdHMudGltZW91dCArIENIQU5HRVNfVElNRU9VVF9CVUZGRVI7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCdoZWFydGJlYXQnIGluIG9wdHMgJiYgb3B0cy5oZWFydGJlYXQgJiZcbiAgICAgICAocmVxdWVzdFRpbWVvdXQgLSBvcHRzLmhlYXJ0YmVhdCkgPCBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSKSB7XG4gICAgICAgIHJlcXVlc3RUaW1lb3V0ID0gb3B0cy5oZWFydGJlYXQgKyBDSEFOR0VTX1RJTUVPVVRfQlVGRkVSO1xuICAgIH1cblxuICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICBpZiAoJ3RpbWVvdXQnIGluIG9wdHMgJiYgb3B0cy50aW1lb3V0KSB7XG4gICAgICBwYXJhbXMudGltZW91dCA9IG9wdHMudGltZW91dDtcbiAgICB9XG5cbiAgICB2YXIgbGltaXQgPSAodHlwZW9mIG9wdHMubGltaXQgIT09ICd1bmRlZmluZWQnKSA/IG9wdHMubGltaXQgOiBmYWxzZTtcbiAgICB2YXIgbGVmdFRvRmV0Y2ggPSBsaW1pdDtcblxuICAgIGlmIChvcHRzLnN0eWxlKSB7XG4gICAgICBwYXJhbXMuc3R5bGUgPSBvcHRzLnN0eWxlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmluY2x1ZGVfZG9jcyB8fCBvcHRzLmZpbHRlciAmJiB0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBhcmFtcy5pbmNsdWRlX2RvY3MgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBwYXJhbXMuYXR0YWNobWVudHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmNvbnRpbnVvdXMpIHtcbiAgICAgIHBhcmFtcy5mZWVkID0gJ2xvbmdwb2xsJztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zZXFfaW50ZXJ2YWwpIHtcbiAgICAgIHBhcmFtcy5zZXFfaW50ZXJ2YWwgPSBvcHRzLnNlcV9pbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jb25mbGljdHMpIHtcbiAgICAgIHBhcmFtcy5jb25mbGljdHMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgIHBhcmFtcy5kZXNjZW5kaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAob3B0cy51cGRhdGVfc2VxKSB7XG4gICAgICBwYXJhbXMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCdoZWFydGJlYXQnIGluIG9wdHMpIHtcbiAgICAgIC8vIElmIHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgZmFsc2UsIGl0IGRpc2FibGVzIHRoZSBkZWZhdWx0IGhlYXJ0YmVhdFxuICAgICAgaWYgKG9wdHMuaGVhcnRiZWF0KSB7XG4gICAgICAgIHBhcmFtcy5oZWFydGJlYXQgPSBvcHRzLmhlYXJ0YmVhdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5maWx0ZXIgJiYgdHlwZW9mIG9wdHMuZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgICAgcGFyYW1zLmZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnZpZXcgJiYgdHlwZW9mIG9wdHMudmlldyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhcmFtcy5maWx0ZXIgPSAnX3ZpZXcnO1xuICAgICAgcGFyYW1zLnZpZXcgPSBvcHRzLnZpZXc7XG4gICAgfVxuXG4gICAgLy8gSWYgb3B0cy5xdWVyeV9wYXJhbXMgZXhpc3RzLCBwYXNzIGl0IHRocm91Z2ggdG8gdGhlIGNoYW5nZXMgcmVxdWVzdC5cbiAgICAvLyBUaGVzZSBwYXJhbWV0ZXJzIG1heSBiZSB1c2VkIGJ5IHRoZSBmaWx0ZXIgb24gdGhlIHNvdXJjZSBkYXRhYmFzZS5cbiAgICBpZiAob3B0cy5xdWVyeV9wYXJhbXMgJiYgdHlwZW9mIG9wdHMucXVlcnlfcGFyYW1zID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yICh2YXIgcGFyYW1fbmFtZSBpbiBvcHRzLnF1ZXJ5X3BhcmFtcykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdHMucXVlcnlfcGFyYW1zLCBwYXJhbV9uYW1lKSkge1xuICAgICAgICAgIHBhcmFtc1twYXJhbV9uYW1lXSA9IG9wdHMucXVlcnlfcGFyYW1zW3BhcmFtX25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1ldGhvZCA9ICdHRVQnO1xuICAgIHZhciBib2R5O1xuXG4gICAgaWYgKG9wdHMuZG9jX2lkcykge1xuICAgICAgLy8gc2V0IHRoaXMgYXV0b21hZ2ljYWxseSBmb3IgdGhlIHVzZXI7IGl0J3MgYW5ub3lpbmcgdGhhdCBjb3VjaGRiXG4gICAgICAvLyByZXF1aXJlcyBib3RoIGEgXCJmaWx0ZXJcIiBhbmQgYSBcImRvY19pZHNcIiBwYXJhbS5cbiAgICAgIHBhcmFtcy5maWx0ZXIgPSAnX2RvY19pZHMnO1xuICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgYm9keSA9IHtkb2NfaWRzOiBvcHRzLmRvY19pZHMgfTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBlbHNlIGlmIChvcHRzLnNlbGVjdG9yKSB7XG4gICAgICAvLyBzZXQgdGhpcyBhdXRvbWFnaWNhbGx5IGZvciB0aGUgdXNlciwgc2ltaWxhciB0byBhYm92ZVxuICAgICAgcGFyYW1zLmZpbHRlciA9ICdfc2VsZWN0b3InO1xuICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgYm9keSA9IHtzZWxlY3Rvcjogb3B0cy5zZWxlY3RvciB9O1xuICAgIH1cblxuICAgIHZhciBjb250cm9sbGVyID0gbmV3IGEoKTtcbiAgICB2YXIgbGFzdEZldGNoZWRTZXE7XG5cbiAgICAvLyBHZXQgYWxsIHRoZSBjaGFuZ2VzIHN0YXJ0aW5nIHd0aWggdGhlIG9uZSBpbW1lZGlhdGVseSBhZnRlciB0aGVcbiAgICAvLyBzZXF1ZW5jZSBudW1iZXIgZ2l2ZW4gYnkgc2luY2UuXG4gICAgdmFyIGZldGNoRGF0YSA9IGZ1bmN0aW9uIChzaW5jZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChvcHRzLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnNpbmNlID0gc2luY2U7XG4gICAgICAvLyBcInNpbmNlXCIgY2FuIGJlIGFueSBraW5kIG9mIGpzb24gb2JqZWN0IGluIENsb3VkYW50L0NvdWNoREIgMi54XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKHR5cGVvZiBwYXJhbXMuc2luY2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcGFyYW1zLnNpbmNlID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zLnNpbmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMuZGVzY2VuZGluZykge1xuICAgICAgICBpZiAobGltaXQpIHtcbiAgICAgICAgICBwYXJhbXMubGltaXQgPSBsZWZ0VG9GZXRjaDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLmxpbWl0ID0gKCFsaW1pdCB8fCBsZWZ0VG9GZXRjaCA+IGJhdGNoU2l6ZSkgP1xuICAgICAgICAgIGJhdGNoU2l6ZSA6IGxlZnRUb0ZldGNoO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIG9wdGlvbnMgZm9yIHRoZSBhamF4IGNhbGxcbiAgICAgIHZhciB1cmwgPSBnZW5EQlVybChob3N0LCAnX2NoYW5nZXMnICsgcGFyYW1zVG9TdHIocGFyYW1zKSk7XG4gICAgICB2YXIgZmV0Y2hPcHRzID0ge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICAgIH07XG4gICAgICBsYXN0RmV0Y2hlZFNlcSA9IHNpbmNlO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChvcHRzLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIGNoYW5nZXNcbiAgICAgIHNldHVwKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmZXRjaEpTT04odXJsLCBmZXRjaE9wdHMsIGNhbGxiYWNrKTtcbiAgICAgIH0pLmNhdGNoKGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgLy8gSWYgb3B0cy5zaW5jZSBleGlzdHMsIGdldCBhbGwgdGhlIGNoYW5nZXMgZnJvbSB0aGUgc2VxdWVuY2VcbiAgICAvLyBudW1iZXIgZ2l2ZW4gYnkgb3B0cy5zaW5jZS4gT3RoZXJ3aXNlLCBnZXQgYWxsIHRoZSBjaGFuZ2VzXG4gICAgLy8gZnJvbSB0aGUgc2VxdWVuY2UgbnVtYmVyIDAuXG4gICAgdmFyIHJlc3VsdHMgPSB7cmVzdWx0czogW119O1xuXG4gICAgdmFyIGZldGNoZWQgPSBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgIGlmIChvcHRzLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHJhd19yZXN1bHRzX2xlbmd0aCA9IDA7XG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IG9mIHRoZSBhamF4IGNhbGwgKHJlcykgY29udGFpbnMgY2hhbmdlcyAocmVzLnJlc3VsdHMpXG4gICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHRzKSB7XG4gICAgICAgIHJhd19yZXN1bHRzX2xlbmd0aCA9IHJlcy5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgcmVzdWx0cy5sYXN0X3NlcSA9IHJlcy5sYXN0X3NlcTtcbiAgICAgICAgdmFyIHBlbmRpbmcgPSBudWxsO1xuICAgICAgICB2YXIgbGFzdFNlcSA9IG51bGw7XG4gICAgICAgIC8vIEF0dGFjaCAncGVuZGluZycgcHJvcGVydHkgaWYgc2VydmVyIHN1cHBvcnRzIGl0IChDb3VjaERCIDIuMCspXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAodHlwZW9mIHJlcy5wZW5kaW5nID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHBlbmRpbmcgPSByZXMucGVuZGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdHMubGFzdF9zZXEgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiByZXN1bHRzLmxhc3Rfc2VxID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGxhc3RTZXEgPSByZXN1bHRzLmxhc3Rfc2VxO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciBlYWNoIGNoYW5nZVxuICAgICAgICB2YXIgcmVxID0ge307XG4gICAgICAgIHJlcS5xdWVyeSA9IG9wdHMucXVlcnlfcGFyYW1zO1xuICAgICAgICByZXMucmVzdWx0cyA9IHJlcy5yZXN1bHRzLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgICAgIGxlZnRUb0ZldGNoLS07XG4gICAgICAgICAgdmFyIHJldCA9IGZpbHRlckNoYW5nZShvcHRzKShjKTtcbiAgICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgICBpZiAob3B0cy5pbmNsdWRlX2RvY3MgJiYgb3B0cy5hdHRhY2htZW50cyAmJiBvcHRzLmJpbmFyeSkge1xuICAgICAgICAgICAgICByZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcihjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRzLnJldHVybl9kb2NzKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucmVzdWx0cy5wdXNoKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0cy5vbkNoYW5nZShjLCBwZW5kaW5nLCBsYXN0U2VxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGFuIGVycm9yLCBzdG9wIGxpc3RlbmluZyBmb3IgY2hhbmdlcyBhbmQgY2FsbFxuICAgICAgICAvLyBvcHRzLmNvbXBsZXRlXG4gICAgICAgIG9wdHMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIG9wdHMuY29tcGxldGUoZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY2hhbmdlcyBmZWVkIG1heSBoYXZlIHRpbWVkIG91dCB3aXRoIG5vIHJlc3VsdHNcbiAgICAgIC8vIGlmIHNvIHJldXNlIGxhc3QgdXBkYXRlIHNlcXVlbmNlXG4gICAgICBpZiAocmVzICYmIHJlcy5sYXN0X3NlcSkge1xuICAgICAgICBsYXN0RmV0Y2hlZFNlcSA9IHJlcy5sYXN0X3NlcTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbmlzaGVkID0gKGxpbWl0ICYmIGxlZnRUb0ZldGNoIDw9IDApIHx8XG4gICAgICAgIChyZXMgJiYgcmF3X3Jlc3VsdHNfbGVuZ3RoIDwgYmF0Y2hTaXplKSB8fFxuICAgICAgICAob3B0cy5kZXNjZW5kaW5nKTtcblxuICAgICAgaWYgKChvcHRzLmNvbnRpbnVvdXMgJiYgIShsaW1pdCAmJiBsZWZ0VG9GZXRjaCA8PSAwKSkgfHwgIWZpbmlzaGVkKSB7XG4gICAgICAgIC8vIFF1ZXVlIGEgY2FsbCB0byBmZXRjaCBhZ2FpbiB3aXRoIHRoZSBuZXdlc3Qgc2VxdWVuY2UgbnVtYmVyXG4gICAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7IGZldGNoRGF0YShsYXN0RmV0Y2hlZFNlcSwgZmV0Y2hlZCk7IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UncmUgZG9uZSwgY2FsbCB0aGUgY2FsbGJhY2tcbiAgICAgICAgb3B0cy5jb21wbGV0ZShudWxsLCByZXN1bHRzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZmV0Y2hEYXRhKG9wdHMuc2luY2UgfHwgMCwgZmV0Y2hlZCk7XG5cbiAgICAvLyBSZXR1cm4gYSBtZXRob2QgdG8gY2FuY2VsIHRoaXMgbWV0aG9kIGZyb20gcHJvY2Vzc2luZyBhbnkgbW9yZVxuICAgIHJldHVybiB7XG4gICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb3B0cy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gR2l2ZW4gYSBzZXQgb2YgZG9jdW1lbnQvcmV2aXNpb24gSURzIChnaXZlbiBieSByZXEpLCB0ZXRzIHRoZSBzdWJzZXQgb2ZcbiAgLy8gdGhvc2UgdGhhdCBkbyBOT1QgY29ycmVzcG9uZCB0byByZXZpc2lvbnMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS5cbiAgLy8gU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY291Y2hkYi9IdHRwUG9zdFJldnNEaWZmXG4gIGFwaS5yZXZzRGlmZiA9IGFkYXB0ZXJGdW4kJDEoJ3JldnNEaWZmJywgZnVuY3Rpb24gKHJlcSwgb3B0cywgY2FsbGJhY2spIHtcbiAgICAvLyBJZiBubyBvcHRpb25zIHdlcmUgZ2l2ZW4sIHNldCB0aGUgY2FsbGJhY2sgdG8gYmUgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIG1pc3NpbmcgZG9jdW1lbnQvcmV2aXNpb24gSURzXG4gICAgZmV0Y2hKU09OKGdlbkRCVXJsKGhvc3QsICdfcmV2c19kaWZmJyksIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxKVxuICAgIH0sIGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG4gIH0pO1xuXG4gIGFwaS5fY2xvc2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9O1xuXG4gIGFwaS5fZGVzdHJveSA9IGZ1bmN0aW9uIChvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGZldGNoSlNPTihnZW5EQlVybChob3N0LCAnJyksIHttZXRob2Q6ICdERUxFVEUnfSkudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgY2FsbGJhY2sobnVsbCwganNvbik7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHtvazogdHJ1ZX0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gSHR0cFBvdWNoIGlzIGEgdmFsaWQgYWRhcHRlci5cbkh0dHBQb3VjaC52YWxpZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBIdHRwUG91Y2gkMSAoUG91Y2hEQikge1xuICBQb3VjaERCLmFkYXB0ZXIoJ2h0dHAnLCBIdHRwUG91Y2gsIGZhbHNlKTtcbiAgUG91Y2hEQi5hZGFwdGVyKCdodHRwcycsIEh0dHBQb3VjaCwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBRdWVyeVBhcnNlRXJyb3IobWVzc2FnZSkge1xuICB0aGlzLnN0YXR1cyA9IDQwMDtcbiAgdGhpcy5uYW1lID0gJ3F1ZXJ5X3BhcnNlX2Vycm9yJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5lcnJvciA9IHRydWU7XG4gIHRyeSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUXVlcnlQYXJzZUVycm9yKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuaW5oZXJpdHMoUXVlcnlQYXJzZUVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIE5vdEZvdW5kRXJyb3IobWVzc2FnZSkge1xuICB0aGlzLnN0YXR1cyA9IDQwNDtcbiAgdGhpcy5uYW1lID0gJ25vdF9mb3VuZCc7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xuICB0cnkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdEZvdW5kRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5pbmhlcml0cyhOb3RGb3VuZEVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIEJ1aWx0SW5FcnJvcihtZXNzYWdlKSB7XG4gIHRoaXMuc3RhdHVzID0gNTAwO1xuICB0aGlzLm5hbWUgPSAnaW52YWxpZF92YWx1ZSc7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMuZXJyb3IgPSB0cnVlO1xuICB0cnkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEJ1aWx0SW5FcnJvcik7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbmluaGVyaXRzKEJ1aWx0SW5FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBwcm9taXNlZENhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICBpbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCByZXMpO1xuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2socmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBjYWxsYmFja2lmeShmdW4pIHtcbiAgcmV0dXJuIGdldEFyZ3VtZW50cyhmdW5jdGlvbiAoYXJncykge1xuICAgIHZhciBjYiA9IGFyZ3MucG9wKCk7XG4gICAgdmFyIHByb21pc2UgPSBmdW4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvbWlzZWRDYWxsYmFjayhwcm9taXNlLCBjYik7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xuICB9KTtcbn1cblxuLy8gUHJvbWlzZSBmaW5hbGx5IHV0aWwgc2ltaWxhciB0byBRLmZpbmFsbHlcbmZ1bmN0aW9uIGZpbihwcm9taXNlLCBmaW5hbFByb21pc2VGYWN0b3J5KSB7XG4gIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHJldHVybiBmaW5hbFByb21pc2VGYWN0b3J5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgcmV0dXJuIGZpbmFsUHJvbWlzZUZhY3RvcnkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNlcXVlbnRpYWxpemUocXVldWUsIHByb21pc2VGYWN0b3J5KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiBxdWV1ZS5hZGQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHByb21pc2VGYWN0b3J5LmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgIH0pO1xuICB9O1xufVxuXG4vLyB1bmlxIGFuIGFycmF5IG9mIHN0cmluZ3MsIG9yZGVyIG5vdCBndWFyYW50ZWVkXG4vLyBzaW1pbGFyIHRvIHVuZGVyc2NvcmUvbG9kYXNoIF8udW5pcVxuZnVuY3Rpb24gdW5pcShhcnIpIHtcbiAgdmFyIHRoZVNldCA9IG5ldyBFeHBvcnRlZFNldChhcnIpO1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KHRoZVNldC5zaXplKTtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIHRoZVNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbWFwVG9LZXlzQXJyYXkobWFwKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgQXJyYXkobWFwLnNpemUpO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBrZXk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWlsdEluRXJyb3IobmFtZSkge1xuICB2YXIgbWVzc2FnZSA9ICdidWlsdGluICcgKyBuYW1lICtcbiAgICAnIGZ1bmN0aW9uIHJlcXVpcmVzIG1hcCB2YWx1ZXMgdG8gYmUgbnVtYmVycycgK1xuICAgICcgb3IgbnVtYmVyIGFycmF5cyc7XG4gIHJldHVybiBuZXcgQnVpbHRJbkVycm9yKG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBzdW0odmFsdWVzKSB7XG4gIHZhciByZXN1bHQgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIG51bSA9IHZhbHVlc1tpXTtcbiAgICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG51bSkpIHtcbiAgICAgICAgLy8gbGlzdHMgb2YgbnVtYmVycyBhcmUgYWxzbyBhbGxvd2VkLCBzdW0gdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHJlc3VsdCA9IHR5cGVvZiByZXN1bHQgPT09ICdudW1iZXInID8gW3Jlc3VsdF0gOiByZXN1bHQ7XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBqTGVuID0gbnVtLmxlbmd0aDsgaiA8IGpMZW47IGorKykge1xuICAgICAgICAgIHZhciBqTnVtID0gbnVtW2pdO1xuICAgICAgICAgIGlmICh0eXBlb2Ygak51bSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJ1aWx0SW5FcnJvcignX3N1bScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFtqXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGpOdW0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRbal0gKz0gak51bTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7IC8vIG5vdCBhcnJheS9udW1iZXJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnVpbHRJbkVycm9yKCdfc3VtJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmVzdWx0ICs9IG51bTtcbiAgICB9IGVsc2UgeyAvLyBhZGQgbnVtYmVyIHRvIGFycmF5XG4gICAgICByZXN1bHRbMF0gKz0gbnVtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgbG9nID0gZ3VhcmRlZENvbnNvbGUuYmluZChudWxsLCAnbG9nJyk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgdG9KU09OID0gSlNPTi5wYXJzZTtcblxuZnVuY3Rpb24gZXZhbEZ1bmN0aW9uV2l0aEV2YWwoZnVuYywgZW1pdCkge1xuICByZXR1cm4gc2NvcGVFdmFsKFxuICAgIFwicmV0dXJuIChcIiArIGZ1bmMucmVwbGFjZSgvO1xccyokLywgXCJcIikgKyBcIik7XCIsXG4gICAge1xuICAgICAgZW1pdDogZW1pdCxcbiAgICAgIHN1bTogc3VtLFxuICAgICAgbG9nOiBsb2csXG4gICAgICBpc0FycmF5OiBpc0FycmF5LFxuICAgICAgdG9KU09OOiB0b0pTT05cbiAgICB9XG4gICk7XG59XG5cbi8qXG4gKiBTaW1wbGUgdGFzayBxdWV1ZSB0byBzZXF1ZW50aWFsaXplIGFjdGlvbnMuIEFzc3VtZXNcbiAqIGNhbGxiYWNrcyB3aWxsIGV2ZW50dWFsbHkgZmlyZSAob25jZSkuXG4gKi9cblxuXG5mdW5jdGlvbiBUYXNrUXVldWUkMSgpIHtcbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGZ1bGZpbGwpIHtmdWxmaWxsKCk7IH0pO1xufVxuVGFza1F1ZXVlJDEucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChwcm9taXNlRmFjdG9yeSkge1xuICB0aGlzLnByb21pc2UgPSB0aGlzLnByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgIC8vIGp1c3QgcmVjb3ZlclxuICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHJvbWlzZUZhY3RvcnkoKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzLnByb21pc2U7XG59O1xuVGFza1F1ZXVlJDEucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbn07XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShpbnB1dCkge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnOyAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBlbXB0eSByZWR1Y2VcbiAgfVxuICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdCB3aXRoIG1hcHJlZHVjZSwgZnVuY3Rpb25zL3N0cmluZ3MgYXJlIHN0cmluZ2lmaWVkXG4gIC8vIGFzLWlzLiBldmVyeXRoaW5nIGVsc2UgaXMgSlNPTi1zdHJpbmdpZmllZC5cbiAgc3dpdGNoICh0eXBlb2YgaW5wdXQpIHtcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAvLyBlLmcuIGEgbWFwcmVkdWNlIG1hcFxuICAgICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIC8vIGUuZy4gYSBtYXByZWR1Y2UgYnVpbHQtaW4gX3JlZHVjZSBmdW5jdGlvblxuICAgICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGUuZy4gYSBKU09OIG9iamVjdCBpbiB0aGUgY2FzZSBvZiBtYW5nbyBxdWVyaWVzXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaW5wdXQpO1xuICB9XG59XG5cbi8qIGNyZWF0ZSBhIHN0cmluZyBzaWduYXR1cmUgZm9yIGEgdmlldyBzbyB3ZSBjYW4gY2FjaGUgaXQgYW5kIHVuaXEgaXQgKi9cbmZ1bmN0aW9uIGNyZWF0ZVZpZXdTaWduYXR1cmUobWFwRnVuLCByZWR1Y2VGdW4pIHtcbiAgLy8gdGhlIFwidW5kZWZpbmVkXCIgcGFydCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgcmV0dXJuIHN0cmluZ2lmeShtYXBGdW4pICsgc3RyaW5naWZ5KHJlZHVjZUZ1bikgKyAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlldyhzb3VyY2VEQiwgdmlld05hbWUsIG1hcEZ1biwgcmVkdWNlRnVuLCB0ZW1wb3JhcnksIGxvY2FsRG9jTmFtZSkge1xuICB2YXIgdmlld1NpZ25hdHVyZSA9IGNyZWF0ZVZpZXdTaWduYXR1cmUobWFwRnVuLCByZWR1Y2VGdW4pO1xuXG4gIHZhciBjYWNoZWRWaWV3cztcbiAgaWYgKCF0ZW1wb3JhcnkpIHtcbiAgICAvLyBjYWNoZSB0aGlzIHRvIGVuc3VyZSB3ZSBkb24ndCB0cnkgdG8gdXBkYXRlIHRoZSBzYW1lIHZpZXcgdHdpY2VcbiAgICBjYWNoZWRWaWV3cyA9IHNvdXJjZURCLl9jYWNoZWRWaWV3cyA9IHNvdXJjZURCLl9jYWNoZWRWaWV3cyB8fCB7fTtcbiAgICBpZiAoY2FjaGVkVmlld3Nbdmlld1NpZ25hdHVyZV0pIHtcbiAgICAgIHJldHVybiBjYWNoZWRWaWV3c1t2aWV3U2lnbmF0dXJlXTtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvbWlzZUZvclZpZXcgPSBzb3VyY2VEQi5pbmZvKCkudGhlbihmdW5jdGlvbiAoaW5mbykge1xuXG4gICAgdmFyIGRlcERiTmFtZSA9IGluZm8uZGJfbmFtZSArICctbXJ2aWV3LScgK1xuICAgICAgKHRlbXBvcmFyeSA/ICd0ZW1wJyA6IHN0cmluZ01kNSh2aWV3U2lnbmF0dXJlKSk7XG5cbiAgICAvLyBzYXZlIHRoZSB2aWV3IG5hbWUgaW4gdGhlIHNvdXJjZSBkYiBzbyBpdCBjYW4gYmUgY2xlYW5lZCB1cCBpZiBuZWNlc3NhcnlcbiAgICAvLyAoZS5nLiB3aGVuIHRoZSBfZGVzaWduIGRvYyBpcyBkZWxldGVkLCByZW1vdmUgYWxsIGFzc29jaWF0ZWQgdmlldyBkYXRhKVxuICAgIGZ1bmN0aW9uIGRpZmZGdW5jdGlvbihkb2MpIHtcbiAgICAgIGRvYy52aWV3cyA9IGRvYy52aWV3cyB8fCB7fTtcbiAgICAgIHZhciBmdWxsVmlld05hbWUgPSB2aWV3TmFtZTtcbiAgICAgIGlmIChmdWxsVmlld05hbWUuaW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICBmdWxsVmlld05hbWUgPSB2aWV3TmFtZSArICcvJyArIHZpZXdOYW1lO1xuICAgICAgfVxuICAgICAgdmFyIGRlcERicyA9IGRvYy52aWV3c1tmdWxsVmlld05hbWVdID0gZG9jLnZpZXdzW2Z1bGxWaWV3TmFtZV0gfHwge307XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChkZXBEYnNbZGVwRGJOYW1lXSkge1xuICAgICAgICByZXR1cm47IC8vIG5vIHVwZGF0ZSBuZWNlc3NhcnlcbiAgICAgIH1cbiAgICAgIGRlcERic1tkZXBEYk5hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBkb2M7XG4gICAgfVxuICAgIHJldHVybiB1cHNlcnQoc291cmNlREIsICdfbG9jYWwvJyArIGxvY2FsRG9jTmFtZSwgZGlmZkZ1bmN0aW9uKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzb3VyY2VEQi5yZWdpc3RlckRlcGVuZGVudERhdGFiYXNlKGRlcERiTmFtZSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHZhciBkYiA9IHJlcy5kYjtcbiAgICAgICAgZGIuYXV0b19jb21wYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgdmFyIHZpZXcgPSB7XG4gICAgICAgICAgbmFtZTogZGVwRGJOYW1lLFxuICAgICAgICAgIGRiOiBkYixcbiAgICAgICAgICBzb3VyY2VEQjogc291cmNlREIsXG4gICAgICAgICAgYWRhcHRlcjogc291cmNlREIuYWRhcHRlcixcbiAgICAgICAgICBtYXBGdW46IG1hcEZ1bixcbiAgICAgICAgICByZWR1Y2VGdW46IHJlZHVjZUZ1blxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmlldy5kYi5nZXQoJ19sb2NhbC9sYXN0U2VxJykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGxhc3RTZXFEb2MpIHtcbiAgICAgICAgICB2aWV3LnNlcSA9IGxhc3RTZXFEb2MgPyBsYXN0U2VxRG9jLnNlcSA6IDA7XG4gICAgICAgICAgaWYgKGNhY2hlZFZpZXdzKSB7XG4gICAgICAgICAgICB2aWV3LmRiLm9uY2UoJ2Rlc3Ryb3llZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlZFZpZXdzW3ZpZXdTaWduYXR1cmVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAoY2FjaGVkVmlld3MpIHtcbiAgICBjYWNoZWRWaWV3c1t2aWV3U2lnbmF0dXJlXSA9IHByb21pc2VGb3JWaWV3O1xuICB9XG4gIHJldHVybiBwcm9taXNlRm9yVmlldztcbn1cblxudmFyIHBlcnNpc3RlbnRRdWV1ZXMgPSB7fTtcbnZhciB0ZW1wVmlld1F1ZXVlID0gbmV3IFRhc2tRdWV1ZSQxKCk7XG52YXIgQ0hBTkdFU19CQVRDSF9TSVpFJDEgPSA1MDtcblxuZnVuY3Rpb24gcGFyc2VWaWV3TmFtZShuYW1lKSB7XG4gIC8vIGNhbiBiZSBlaXRoZXIgJ2Rkb2NuYW1lL3ZpZXduYW1lJyBvciBqdXN0ICd2aWV3bmFtZSdcbiAgLy8gKHdoZXJlIHRoZSBkZG9jIG5hbWUgaXMgdGhlIHNhbWUpXG4gIHJldHVybiBuYW1lLmluZGV4T2YoJy8nKSA9PT0gLTEgPyBbbmFtZSwgbmFtZV0gOiBuYW1lLnNwbGl0KCcvJyk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuT25lKGNoYW5nZXMpIHtcbiAgLy8gb25seSByZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBjaGFuZ2UgaXMgMS1cbiAgLy8gYW5kIHRoZXJlIGFyZSBubyBvdGhlciBsZWFmc1xuICByZXR1cm4gY2hhbmdlcy5sZW5ndGggPT09IDEgJiYgL14xLS8udGVzdChjaGFuZ2VzWzBdLnJldik7XG59XG5cbmZ1bmN0aW9uIGVtaXRFcnJvcihkYiwgZSkge1xuICB0cnkge1xuICAgIGRiLmVtaXQoJ2Vycm9yJywgZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsXG4gICAgICAnVGhlIHVzZXJcXCdzIG1hcC9yZWR1Y2UgZnVuY3Rpb24gdGhyZXcgYW4gdW5jYXVnaHQgZXJyb3IuXFxuJyArXG4gICAgICAnWW91IGNhbiBkZWJ1ZyB0aGlzIGVycm9yIGJ5IGRvaW5nOlxcbicgK1xuICAgICAgJ215RGF0YWJhc2Uub24oXFwnZXJyb3JcXCcsIGZ1bmN0aW9uIChlcnIpIHsgZGVidWdnZXI7IH0pO1xcbicgK1xuICAgICAgJ1BsZWFzZSBkb3VibGUtY2hlY2sgeW91ciBtYXAvcmVkdWNlIGZ1bmN0aW9uLicpO1xuICAgIGd1YXJkZWRDb25zb2xlKCdlcnJvcicsIGUpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBcImFic3RyYWN0XCIgbWFwcmVkdWNlIG9iamVjdCBvZiB0aGUgZm9ybTpcbiAqXG4gKiAgIHtcbiAqICAgICBxdWVyeTogcXVlcnlGdW4sXG4gKiAgICAgdmlld0NsZWFudXA6IHZpZXdDbGVhbnVwRnVuXG4gKiAgIH1cbiAqXG4gKiBBcmd1bWVudHMgYXJlOlxuICpcbiAqIGxvY2FsRG9jOiBzdHJpbmdcbiAqICAgVGhpcyBpcyBmb3IgdGhlIGxvY2FsIGRvYyB0aGF0IGdldHMgc2F2ZWQgaW4gb3JkZXIgdG8gdHJhY2sgdGhlXG4gKiAgIFwiZGVwZW5kZW50XCIgREJzIGFuZCBjbGVhbiB0aGVtIHVwIGZvciB2aWV3Q2xlYW51cC4gSXQgc2hvdWxkIGJlXG4gKiAgIHVuaXF1ZSwgc28gdGhhdCBpbmRleGVyIHBsdWdpbnMgZG9uJ3QgY29sbGlkZSB3aXRoIGVhY2ggb3RoZXIuXG4gKiBtYXBwZXI6IGZ1bmN0aW9uIChtYXBGdW5EZWYsIGVtaXQpXG4gKiAgIFJldHVybnMgYSBtYXAgZnVuY3Rpb24gYmFzZWQgb24gdGhlIG1hcEZ1bkRlZiwgd2hpY2ggaW4gdGhlIGNhc2Ugb2ZcbiAqICAgbm9ybWFsIG1hcC9yZWR1Y2UgaXMganVzdCB0aGUgZGUtc3RyaW5naWZpZWQgZnVuY3Rpb24sIGJ1dCBtYXkgYmVcbiAqICAgc29tZXRoaW5nIGVsc2UsIHN1Y2ggYXMgYW4gb2JqZWN0IGluIHRoZSBjYXNlIG9mIHBvdWNoZGItZmluZC5cbiAqIHJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VGdW5EZWYpXG4gKiAgIERpdHRvLCBidXQgZm9yIHJlZHVjaW5nLiBNb2R1bGVzIGRvbid0IGhhdmUgdG8gc3VwcG9ydCByZWR1Y2luZ1xuICogICAoZS5nLiBwb3VjaGRiLWZpbmQpLlxuICogZGRvY1ZhbGlkYXRvcjogZnVuY3Rpb24gKGRkb2MsIHZpZXdOYW1lKVxuICogICBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGRkb2Mgb3Igdmlld05hbWUgaXMgbm90IHZhbGlkLlxuICogICBUaGlzIGNvdWxkIGJlIGEgd2F5IHRvIGNvbW11bmljYXRlIHRvIHRoZSB1c2VyIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZVxuICogICBpbmRleGVyIGlzIGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFic3RyYWN0TWFwUmVkdWNlKGxvY2FsRG9jTmFtZSwgbWFwcGVyLCByZWR1Y2VyLCBkZG9jVmFsaWRhdG9yKSB7XG5cbiAgZnVuY3Rpb24gdHJ5TWFwKGRiLCBmdW4sIGRvYykge1xuICAgIC8vIGVtaXQgYW4gZXZlbnQgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHRocm93biBieSBhIG1hcCBmdW5jdGlvbi5cbiAgICAvLyBwdXR0aW5nIHRyeS9jYXRjaGVzIGluIGEgc2luZ2xlIGZ1bmN0aW9uIGFsc28gYXZvaWRzIGRlb3B0aW1pemF0aW9ucy5cbiAgICB0cnkge1xuICAgICAgZnVuKGRvYyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZW1pdEVycm9yKGRiLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cnlSZWR1Y2UoZGIsIGZ1biwga2V5cywgdmFsdWVzLCByZXJlZHVjZSkge1xuICAgIC8vIHNhbWUgYXMgYWJvdmUsIGJ1dCByZXR1cm5pbmcgdGhlIHJlc3VsdCBvciBhbiBlcnJvci4gdGhlcmUgYXJlIHR3byBzZXBhcmF0ZVxuICAgIC8vIGZ1bmN0aW9ucyB0byBhdm9pZCBleHRyYSBtZW1vcnkgYWxsb2NhdGlvbnMgc2luY2UgdGhlIHRyeUNvZGUoKSBjYXNlIGlzIHVzZWRcbiAgICAvLyBmb3IgY3VzdG9tIG1hcCBmdW5jdGlvbnMgKGNvbW1vbikgdnMgdGhpcyBmdW5jdGlvbiwgd2hpY2ggaXMgb25seSB1c2VkIGZvclxuICAgIC8vIGN1c3RvbSByZWR1Y2UgZnVuY3Rpb25zIChyYXJlKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge291dHB1dCA6IGZ1bihrZXlzLCB2YWx1ZXMsIHJlcmVkdWNlKX07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZW1pdEVycm9yKGRiLCBlKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNvcnRCeUtleVRoZW5WYWx1ZSh4LCB5KSB7XG4gICAgdmFyIGtleUNvbXBhcmUgPSBjb2xsYXRlKHgua2V5LCB5LmtleSk7XG4gICAgcmV0dXJuIGtleUNvbXBhcmUgIT09IDAgPyBrZXlDb21wYXJlIDogY29sbGF0ZSh4LnZhbHVlLCB5LnZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsaWNlUmVzdWx0cyhyZXN1bHRzLCBsaW1pdCwgc2tpcCkge1xuICAgIHNraXAgPSBza2lwIHx8IDA7XG4gICAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNsaWNlKHNraXAsIGxpbWl0ICsgc2tpcCk7XG4gICAgfSBlbHNlIGlmIChza2lwID4gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuc2xpY2Uoc2tpcCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcm93VG9Eb2NJZChyb3cpIHtcbiAgICB2YXIgdmFsID0gcm93LnZhbHVlO1xuICAgIC8vIFVzZXJzIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgYSBqb2luZWQgZG9jIF9pZCwgb3IgaXRcbiAgICAvLyBkZWZhdWx0cyB0byB0aGUgZG9jIF9pZCB0aGF0IGVtaXR0ZWQgdGhlIGtleS92YWx1ZS5cbiAgICB2YXIgZG9jSWQgPSAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbC5faWQpIHx8IHJvdy5pZDtcbiAgICByZXR1cm4gZG9jSWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkQXR0YWNobWVudHNBc0Jsb2JPckJ1ZmZlcihyZXMpIHtcbiAgICByZXMucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHZhciBhdHRzID0gcm93LmRvYyAmJiByb3cuZG9jLl9hdHRhY2htZW50cztcbiAgICAgIGlmICghYXR0cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhhdHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICB2YXIgYXR0ID0gYXR0c1tmaWxlbmFtZV07XG4gICAgICAgIGF0dHNbZmlsZW5hbWVdLmRhdGEgPSBiNjRUb0JsdWZmZXIoYXR0LmRhdGEsIGF0dC5jb250ZW50X3R5cGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBwb3N0cHJvY2Vzc0F0dGFjaG1lbnRzKG9wdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlcykge1xuICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzICYmIG9wdHMuYXR0YWNobWVudHMgJiYgb3B0cy5iaW5hcnkpIHtcbiAgICAgICAgcmVhZEF0dGFjaG1lbnRzQXNCbG9iT3JCdWZmZXIocmVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZEh0dHBQYXJhbShwYXJhbU5hbWUsIG9wdHMsIHBhcmFtcywgYXNKc29uKSB7XG4gICAgLy8gYWRkIGFuIGh0dHAgcGFyYW0gZnJvbSBvcHRzIHRvIHBhcmFtcywgb3B0aW9uYWxseSBqc29uLWVuY29kZWRcbiAgICB2YXIgdmFsID0gb3B0c1twYXJhbU5hbWVdO1xuICAgIGlmICh0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGFzSnNvbikge1xuICAgICAgICB2YWwgPSBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodmFsKSk7XG4gICAgICB9XG4gICAgICBwYXJhbXMucHVzaChwYXJhbU5hbWUgKyAnPScgKyB2YWwpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvZXJjZUludGVnZXIoaW50ZWdlckNhbmRpZGF0ZSkge1xuICAgIGlmICh0eXBlb2YgaW50ZWdlckNhbmRpZGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBhc051bWJlciA9IE51bWJlcihpbnRlZ2VyQ2FuZGlkYXRlKTtcbiAgICAgIC8vIHByZXZlbnRzIGUuZy4gJzFmb28nIG9yICcxLjEnIGJlaW5nIGNvZXJjZWQgdG8gMVxuICAgICAgaWYgKCFpc05hTihhc051bWJlcikgJiYgYXNOdW1iZXIgPT09IHBhcnNlSW50KGludGVnZXJDYW5kaWRhdGUsIDEwKSkge1xuICAgICAgICByZXR1cm4gYXNOdW1iZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW50ZWdlckNhbmRpZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb2VyY2VPcHRpb25zKG9wdHMpIHtcbiAgICBvcHRzLmdyb3VwX2xldmVsID0gY29lcmNlSW50ZWdlcihvcHRzLmdyb3VwX2xldmVsKTtcbiAgICBvcHRzLmxpbWl0ID0gY29lcmNlSW50ZWdlcihvcHRzLmxpbWl0KTtcbiAgICBvcHRzLnNraXAgPSBjb2VyY2VJbnRlZ2VyKG9wdHMuc2tpcCk7XG4gICAgcmV0dXJuIG9wdHM7XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja1Bvc2l0aXZlSW50ZWdlcihudW1iZXIpIHtcbiAgICBpZiAobnVtYmVyKSB7XG4gICAgICBpZiAodHlwZW9mIG51bWJlciAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuICBuZXcgUXVlcnlQYXJzZUVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBpbnRlZ2VyOiBcIicgK1xuICAgICAgICAgIG51bWJlciArICdcIicpO1xuICAgICAgfVxuICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeVBhcnNlRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHBvc2l0aXZlIGludGVnZXI6ICcgK1xuICAgICAgICAgICdcIicgKyBudW1iZXIgKyAnXCInKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja1F1ZXJ5UGFyc2VFcnJvcihvcHRpb25zLCBmdW4pIHtcbiAgICB2YXIgc3RhcnRrZXlOYW1lID0gb3B0aW9ucy5kZXNjZW5kaW5nID8gJ2VuZGtleScgOiAnc3RhcnRrZXknO1xuICAgIHZhciBlbmRrZXlOYW1lID0gb3B0aW9ucy5kZXNjZW5kaW5nID8gJ3N0YXJ0a2V5JyA6ICdlbmRrZXknO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zW3N0YXJ0a2V5TmFtZV0gIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2Ygb3B0aW9uc1tlbmRrZXlOYW1lXSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIGNvbGxhdGUob3B0aW9uc1tzdGFydGtleU5hbWVdLCBvcHRpb25zW2VuZGtleU5hbWVdKSA+IDApIHtcbiAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXJyb3IoJ05vIHJvd3MgY2FuIG1hdGNoIHlvdXIga2V5IHJhbmdlLCAnICtcbiAgICAgICAgJ3JldmVyc2UgeW91ciBzdGFydF9rZXkgYW5kIGVuZF9rZXkgb3Igc2V0IHtkZXNjZW5kaW5nIDogdHJ1ZX0nKTtcbiAgICB9IGVsc2UgaWYgKGZ1bi5yZWR1Y2UgJiYgb3B0aW9ucy5yZWR1Y2UgIT09IGZhbHNlKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmNsdWRlX2RvY3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5UGFyc2VFcnJvcigne2luY2x1ZGVfZG9jczp0cnVlfSBpcyBpbnZhbGlkIGZvciByZWR1Y2UnKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5rZXlzICYmIG9wdGlvbnMua2V5cy5sZW5ndGggPiAxICYmXG4gICAgICAgICFvcHRpb25zLmdyb3VwICYmICFvcHRpb25zLmdyb3VwX2xldmVsKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXJyb3IoJ011bHRpLWtleSBmZXRjaGVzIGZvciByZWR1Y2Ugdmlld3MgbXVzdCB1c2UgJyArXG4gICAgICAgICAgJ3tncm91cDogdHJ1ZX0nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgWydncm91cF9sZXZlbCcsICdsaW1pdCcsICdza2lwJ10uZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uTmFtZSkge1xuICAgICAgdmFyIGVycm9yID0gY2hlY2tQb3NpdGl2ZUludGVnZXIob3B0aW9uc1tvcHRpb25OYW1lXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBodHRwUXVlcnkoZGIsIGZ1biwgb3B0cykge1xuICAgIC8vIExpc3Qgb2YgcGFyYW1ldGVycyB0byBhZGQgdG8gdGhlIFBVVCByZXF1ZXN0XG4gICAgdmFyIHBhcmFtcyA9IFtdO1xuICAgIHZhciBib2R5O1xuICAgIHZhciBtZXRob2QgPSAnR0VUJztcbiAgICB2YXIgb2ssIHN0YXR1cztcblxuICAgIC8vIElmIG9wdHMucmVkdWNlIGV4aXN0cyBhbmQgaXMgZGVmaW5lZCwgdGhlbiBhZGQgaXQgdG8gdGhlIGxpc3RcbiAgICAvLyBvZiBwYXJhbWV0ZXJzLlxuICAgIC8vIElmIHJlZHVjZT1mYWxzZSB0aGVuIHRoZSByZXN1bHRzIGFyZSB0aGF0IG9mIG9ubHkgdGhlIG1hcCBmdW5jdGlvblxuICAgIC8vIG5vdCB0aGUgZmluYWwgcmVzdWx0IG9mIG1hcCBhbmQgcmVkdWNlLlxuICAgIGFkZEh0dHBQYXJhbSgncmVkdWNlJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2luY2x1ZGVfZG9jcycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdhdHRhY2htZW50cycsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdsaW1pdCcsIG9wdHMsIHBhcmFtcyk7XG4gICAgYWRkSHR0cFBhcmFtKCdkZXNjZW5kaW5nJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2dyb3VwJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2dyb3VwX2xldmVsJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3NraXAnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnc3RhbGUnLCBvcHRzLCBwYXJhbXMpO1xuICAgIGFkZEh0dHBQYXJhbSgnY29uZmxpY3RzJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3N0YXJ0a2V5Jywgb3B0cywgcGFyYW1zLCB0cnVlKTtcbiAgICBhZGRIdHRwUGFyYW0oJ3N0YXJ0X2tleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCdlbmRrZXknLCBvcHRzLCBwYXJhbXMsIHRydWUpO1xuICAgIGFkZEh0dHBQYXJhbSgnZW5kX2tleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCdpbmNsdXNpdmVfZW5kJywgb3B0cywgcGFyYW1zKTtcbiAgICBhZGRIdHRwUGFyYW0oJ2tleScsIG9wdHMsIHBhcmFtcywgdHJ1ZSk7XG4gICAgYWRkSHR0cFBhcmFtKCd1cGRhdGVfc2VxJywgb3B0cywgcGFyYW1zKTtcblxuICAgIC8vIEZvcm1hdCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGludG8gYSB2YWxpZCBVUkkgcXVlcnkgc3RyaW5nXG4gICAgcGFyYW1zID0gcGFyYW1zLmpvaW4oJyYnKTtcbiAgICBwYXJhbXMgPSBwYXJhbXMgPT09ICcnID8gJycgOiAnPycgKyBwYXJhbXM7XG5cbiAgICAvLyBJZiBrZXlzIGFyZSBzdXBwbGllZCwgaXNzdWUgYSBQT1NUIHRvIGNpcmN1bXZlbnQgR0VUIHF1ZXJ5IHN0cmluZyBsaW1pdHNcbiAgICAvLyBzZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9jb3VjaGRiL0hUVFBfdmlld19BUEkjUXVlcnlpbmdfT3B0aW9uc1xuICAgIGlmICh0eXBlb2Ygb3B0cy5rZXlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIE1BWF9VUkxfTEVOR1RIID0gMjAwMDtcbiAgICAgIC8vIGFjY29yZGluZyB0byBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MTcxODQvNjgwNzQyLFxuICAgICAgLy8gdGhlIGRlIGZhY3RvIFVSTCBsZW5ndGggbGltaXQgaXMgMjAwMCBjaGFyYWN0ZXJzXG5cbiAgICAgIHZhciBrZXlzQXNTdHJpbmcgPVxuICAgICAgICAna2V5cz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG9wdHMua2V5cykpO1xuICAgICAgaWYgKGtleXNBc1N0cmluZy5sZW5ndGggKyBwYXJhbXMubGVuZ3RoICsgMSA8PSBNQVhfVVJMX0xFTkdUSCkge1xuICAgICAgICAvLyBJZiB0aGUga2V5cyBhcmUgc2hvcnQgZW5vdWdoLCBkbyBhIEdFVC4gd2UgZG8gdGhpcyB0byB3b3JrIGFyb3VuZFxuICAgICAgICAvLyBTYWZhcmkgbm90IHVuZGVyc3RhbmRpbmcgMzA0cyBvbiBQT1NUcyAoc2VlIHBvdWNoZGIvcG91Y2hkYiMxMjM5KVxuICAgICAgICBwYXJhbXMgKz0gKHBhcmFtc1swXSA9PT0gJz8nID8gJyYnIDogJz8nKSArIGtleXNBc1N0cmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgICAgaWYgKHR5cGVvZiBmdW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgYm9keSA9IHtrZXlzOiBvcHRzLmtleXN9O1xuICAgICAgICB9IGVsc2UgeyAvLyBmdW4gaXMge21hcCA6IG1hcGZ1bn0sIHNvIGFwcGVuZCB0byB0aGlzXG4gICAgICAgICAgZnVuLmtleXMgPSBvcHRzLmtleXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBhcmUgcmVmZXJlbmNpbmcgYSBxdWVyeSBkZWZpbmVkIGluIHRoZSBkZXNpZ24gZG9jXG4gICAgaWYgKHR5cGVvZiBmdW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcGFydHMgPSBwYXJzZVZpZXdOYW1lKGZ1bik7XG4gICAgICByZXR1cm4gZGIuZmV0Y2goJ19kZXNpZ24vJyArIHBhcnRzWzBdICsgJy9fdmlldy8nICsgcGFydHNbMV0gKyBwYXJhbXMsIHtcbiAgICAgICAgaGVhZGVyczogbmV3IGgoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBvayA9IHJlc3BvbnNlLm9rO1xuICAgICAgICBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgdGhyb3cgZ2VuZXJhdGVFcnJvckZyb21SZXNwb25zZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZhaWwgdGhlIGVudGlyZSByZXF1ZXN0IGlmIHRoZSByZXN1bHQgY29udGFpbnMgYW4gZXJyb3JcbiAgICAgICAgcmVzdWx0LnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKHJvdy52YWx1ZSAmJiByb3cudmFsdWUuZXJyb3IgJiYgcm93LnZhbHVlLmVycm9yID09PSBcImJ1aWx0aW5fcmVkdWNlX2Vycm9yXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyb3cucmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkudGhlbihwb3N0cHJvY2Vzc0F0dGFjaG1lbnRzKG9wdHMpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBhcmUgdXNpbmcgYSB0ZW1wb3JhcnkgdmlldywgdGVycmlibGUgZm9yIHBlcmZvcm1hbmNlLCBnb29kIGZvciB0ZXN0aW5nXG4gICAgYm9keSA9IGJvZHkgfHwge307XG4gICAgT2JqZWN0LmtleXMoZnVuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZ1bltrZXldKSkge1xuICAgICAgICBib2R5W2tleV0gPSBmdW5ba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHlba2V5XSA9IGZ1bltrZXldLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGIuZmV0Y2goJ190ZW1wX3ZpZXcnICsgcGFyYW1zLCB7XG4gICAgICBoZWFkZXJzOiBuZXcgaCh7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30pLFxuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIG9rID0gcmVzcG9uc2Uub2s7XG4gICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRocm93IGdlbmVyYXRlRXJyb3JGcm9tUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkudGhlbihwb3N0cHJvY2Vzc0F0dGFjaG1lbnRzKG9wdHMpKTtcbiAgfVxuXG4gIC8vIGN1c3RvbSBhZGFwdGVycyBjYW4gZGVmaW5lIHRoZWlyIG93biBhcGkuX3F1ZXJ5XG4gIC8vIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmdW5jdGlvbiBjdXN0b21RdWVyeShkYiwgZnVuLCBvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGRiLl9xdWVyeShmdW4sIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY3VzdG9tIGFkYXB0ZXJzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGFwaS5fdmlld0NsZWFudXBcbiAgLy8gYW5kIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGZ1bmN0aW9uIGN1c3RvbVZpZXdDbGVhbnVwKGRiKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGRiLl92aWV3Q2xlYW51cChmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRzVG8odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChyZWFzb24uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBsaXN0IG9mIGRvY3MgdG8gdXBkYXRlLCBiYXNlZCBvbiB0aGUgaW5wdXQgZG9jSWQuXG4gIC8vIHRoZSBvcmRlciBkb2Vzbid0IG1hdHRlciwgYmVjYXVzZSBwb3N0LTMuMi4wLCBidWxrRG9jc1xuICAvLyBpcyBhbiBhdG9taWMgb3BlcmF0aW9uIGluIGFsbCB0aHJlZSBhZGFwdGVycy5cbiAgZnVuY3Rpb24gZ2V0RG9jc1RvUGVyc2lzdChkb2NJZCwgdmlldywgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMpIHtcbiAgICB2YXIgbWV0YURvY0lkID0gJ19sb2NhbC9kb2NfJyArIGRvY0lkO1xuICAgIHZhciBkZWZhdWx0TWV0YURvYyA9IHtfaWQ6IG1ldGFEb2NJZCwga2V5czogW119O1xuICAgIHZhciBkb2NEYXRhID0gZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMuZ2V0KGRvY0lkKTtcbiAgICB2YXIgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzID0gZG9jRGF0YVswXTtcbiAgICB2YXIgY2hhbmdlcyA9IGRvY0RhdGFbMV07XG5cbiAgICBmdW5jdGlvbiBnZXRNZXRhRG9jKCkge1xuICAgICAgaWYgKGlzR2VuT25lKGNoYW5nZXMpKSB7XG4gICAgICAgIC8vIGdlbmVyYXRpb24gMSwgc28gd2UgY2FuIHNhZmVseSBhc3N1bWUgaW5pdGlhbCBzdGF0ZVxuICAgICAgICAvLyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAoYXZvaWRzIHVubmVjZXNzYXJ5IEdFVHMpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGVmYXVsdE1ldGFEb2MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZpZXcuZGIuZ2V0KG1ldGFEb2NJZCkuY2F0Y2goZGVmYXVsdHNUbyhkZWZhdWx0TWV0YURvYykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEtleVZhbHVlRG9jcyhtZXRhRG9jKSB7XG4gICAgICBpZiAoIW1ldGFEb2Mua2V5cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gbm8ga2V5cywgbm8gbmVlZCBmb3IgYSBsb29rdXBcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7cm93czogW119KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2aWV3LmRiLmFsbERvY3Moe1xuICAgICAgICBrZXlzOiBtZXRhRG9jLmtleXMsXG4gICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0tleVZhbHVlRG9jcyhtZXRhRG9jLCBrdkRvY3NSZXMpIHtcbiAgICAgIHZhciBrdkRvY3MgPSBbXTtcbiAgICAgIHZhciBvbGRLZXlzID0gbmV3IEV4cG9ydGVkU2V0KCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBrdkRvY3NSZXMucm93cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgcm93ID0ga3ZEb2NzUmVzLnJvd3NbaV07XG4gICAgICAgIHZhciBkb2MgPSByb3cuZG9jO1xuICAgICAgICBpZiAoIWRvYykgeyAvLyBkZWxldGVkXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAga3ZEb2NzLnB1c2goZG9jKTtcbiAgICAgICAgb2xkS2V5cy5hZGQoZG9jLl9pZCk7XG4gICAgICAgIGRvYy5fZGVsZXRlZCA9ICFpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMuaGFzKGRvYy5faWQpO1xuICAgICAgICBpZiAoIWRvYy5fZGVsZXRlZCkge1xuICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGluZGV4YWJsZUtleXNUb0tleVZhbHVlcy5nZXQoZG9jLl9pZCk7XG4gICAgICAgICAgaWYgKCd2YWx1ZScgaW4ga2V5VmFsdWUpIHtcbiAgICAgICAgICAgIGRvYy52YWx1ZSA9IGtleVZhbHVlLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIG5ld0tleXMgPSBtYXBUb0tleXNBcnJheShpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMpO1xuICAgICAgbmV3S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCFvbGRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgLy8gbmV3IGRvY1xuICAgICAgICAgIHZhciBrdkRvYyA9IHtcbiAgICAgICAgICAgIF9pZDoga2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIga2V5VmFsdWUgPSBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMuZ2V0KGtleSk7XG4gICAgICAgICAgaWYgKCd2YWx1ZScgaW4ga2V5VmFsdWUpIHtcbiAgICAgICAgICAgIGt2RG9jLnZhbHVlID0ga2V5VmFsdWUudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGt2RG9jcy5wdXNoKGt2RG9jKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBtZXRhRG9jLmtleXMgPSB1bmlxKG5ld0tleXMuY29uY2F0KG1ldGFEb2Mua2V5cykpO1xuICAgICAga3ZEb2NzLnB1c2gobWV0YURvYyk7XG5cbiAgICAgIHJldHVybiBrdkRvY3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldE1ldGFEb2MoKS50aGVuKGZ1bmN0aW9uIChtZXRhRG9jKSB7XG4gICAgICByZXR1cm4gZ2V0S2V5VmFsdWVEb2NzKG1ldGFEb2MpLnRoZW4oZnVuY3Rpb24gKGt2RG9jc1Jlcykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc0tleVZhbHVlRG9jcyhtZXRhRG9jLCBrdkRvY3NSZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyB1cGRhdGVzIGFsbCBlbWl0dGVkIGtleS92YWx1ZSBkb2NzIGFuZCBtZXRhRG9jcyBpbiB0aGUgbXJ2aWV3IGRhdGFiYXNlXG4gIC8vIGZvciB0aGUgZ2l2ZW4gYmF0Y2ggb2YgZG9jdW1lbnRzIGZyb20gdGhlIHNvdXJjZSBkYXRhYmFzZVxuICBmdW5jdGlvbiBzYXZlS2V5VmFsdWVzKHZpZXcsIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzLCBzZXEpIHtcbiAgICB2YXIgc2VxRG9jSWQgPSAnX2xvY2FsL2xhc3RTZXEnO1xuICAgIHJldHVybiB2aWV3LmRiLmdldChzZXFEb2NJZClcbiAgICAgIC5jYXRjaChkZWZhdWx0c1RvKHtfaWQ6IHNlcURvY0lkLCBzZXE6IDB9KSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChsYXN0U2VxRG9jKSB7XG4gICAgICAgIHZhciBkb2NJZHMgPSBtYXBUb0tleXNBcnJheShkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChkb2NJZHMubWFwKGZ1bmN0aW9uIChkb2NJZCkge1xuICAgICAgICAgIHJldHVybiBnZXREb2NzVG9QZXJzaXN0KGRvY0lkLCB2aWV3LCBkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cyk7XG4gICAgICAgIH0pKS50aGVuKGZ1bmN0aW9uIChsaXN0T2ZEb2NzVG9QZXJzaXN0KSB7XG4gICAgICAgICAgdmFyIGRvY3NUb1BlcnNpc3QgPSBmbGF0dGVuKGxpc3RPZkRvY3NUb1BlcnNpc3QpO1xuICAgICAgICAgIGxhc3RTZXFEb2Muc2VxID0gc2VxO1xuICAgICAgICAgIGRvY3NUb1BlcnNpc3QucHVzaChsYXN0U2VxRG9jKTtcbiAgICAgICAgICAvLyB3cml0ZSBhbGwgZG9jcyBpbiBhIHNpbmdsZSBvcGVyYXRpb24sIHVwZGF0ZSB0aGUgc2VxIG9uY2VcbiAgICAgICAgICByZXR1cm4gdmlldy5kYi5idWxrRG9jcyh7ZG9jcyA6IGRvY3NUb1BlcnNpc3R9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFF1ZXVlKHZpZXcpIHtcbiAgICB2YXIgdmlld05hbWUgPSB0eXBlb2YgdmlldyA9PT0gJ3N0cmluZycgPyB2aWV3IDogdmlldy5uYW1lO1xuICAgIHZhciBxdWV1ZSA9IHBlcnNpc3RlbnRRdWV1ZXNbdmlld05hbWVdO1xuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHF1ZXVlID0gcGVyc2lzdGVudFF1ZXVlc1t2aWV3TmFtZV0gPSBuZXcgVGFza1F1ZXVlJDEoKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXVlO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVmlldyh2aWV3LCBvcHRzKSB7XG4gICAgcmV0dXJuIHNlcXVlbnRpYWxpemUoZ2V0UXVldWUodmlldyksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB1cGRhdGVWaWV3SW5RdWV1ZSh2aWV3LCBvcHRzKTtcbiAgICB9KSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVmlld0luUXVldWUodmlldywgb3B0cykge1xuICAgIC8vIGJpbmQgdGhlIGVtaXQgZnVuY3Rpb24gb25jZVxuICAgIHZhciBtYXBSZXN1bHRzO1xuICAgIHZhciBkb2M7XG5cbiAgICBmdW5jdGlvbiBlbWl0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBvdXRwdXQgPSB7aWQ6IGRvYy5faWQsIGtleTogbm9ybWFsaXplS2V5KGtleSl9O1xuICAgICAgLy8gRG9uJ3QgZXhwbGljaXRseSBzdG9yZSB0aGUgdmFsdWUgdW5sZXNzIGl0J3MgZGVmaW5lZCBhbmQgbm9uLW51bGwuXG4gICAgICAvLyBUaGlzIHNhdmVzIG9uIHN0b3JhZ2Ugc3BhY2UsIGJlY2F1c2Ugb2Z0ZW4gcGVvcGxlIGRvbid0IHVzZSBpdC5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIG91dHB1dC52YWx1ZSA9IG5vcm1hbGl6ZUtleSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBtYXBSZXN1bHRzLnB1c2gob3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgbWFwRnVuID0gbWFwcGVyKHZpZXcubWFwRnVuLCBlbWl0KTtcblxuICAgIHZhciBjdXJyZW50U2VxID0gdmlldy5zZXEgfHwgMDtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NDaGFuZ2UoZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMsIHNlcSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNhdmVLZXlWYWx1ZXModmlldywgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMsIHNlcSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBpbmRleGVkX2RvY3MgPSAwO1xuICAgIGxldCBwcm9ncmVzcyA9IHtcbiAgICAgIHZpZXc6IHZpZXcubmFtZSxcbiAgICAgIGluZGV4ZWRfZG9jczogaW5kZXhlZF9kb2NzXG4gICAgfTtcbiAgICB2aWV3LnNvdXJjZURCLmVtaXQoJ2luZGV4aW5nJywgcHJvZ3Jlc3MpO1xuXG4gICAgdmFyIHF1ZXVlID0gbmV3IFRhc2tRdWV1ZSQxKCk7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzTmV4dEJhdGNoKCkge1xuICAgICAgcmV0dXJuIHZpZXcuc291cmNlREIuY2hhbmdlcyh7XG4gICAgICAgIHJldHVybl9kb2NzOiB0cnVlLFxuICAgICAgICBjb25mbGljdHM6IHRydWUsXG4gICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZSxcbiAgICAgICAgc3R5bGU6ICdhbGxfZG9jcycsXG4gICAgICAgIHNpbmNlOiBjdXJyZW50U2VxLFxuICAgICAgICBsaW1pdDogb3B0cy5jaGFuZ2VzX2JhdGNoX3NpemVcbiAgICAgIH0pLnRoZW4ocHJvY2Vzc0JhdGNoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQmF0Y2gocmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cztcbiAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzID0gY3JlYXRlRG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMocmVzdWx0cyk7XG4gICAgICBxdWV1ZS5hZGQocHJvY2Vzc0NoYW5nZShkb2NJZHNUb0NoYW5nZXNBbmRFbWl0cywgY3VycmVudFNlcSkpO1xuXG4gICAgICBpbmRleGVkX2RvY3MgPSBpbmRleGVkX2RvY3MgKyByZXN1bHRzLmxlbmd0aDtcbiAgICAgIGxldCBwcm9ncmVzcyA9IHtcbiAgICAgICAgdmlldzogdmlldy5uYW1lLFxuICAgICAgICBsYXN0X3NlcTogcmVzcG9uc2UubGFzdF9zZXEsXG4gICAgICAgIHJlc3VsdHNfY291bnQ6IHJlc3VsdHMubGVuZ3RoLFxuICAgICAgICBpbmRleGVkX2RvY3M6IGluZGV4ZWRfZG9jc1xuICAgICAgfTtcbiAgICAgIHZpZXcuc291cmNlREIuZW1pdCgnaW5kZXhpbmcnLCBwcm9ncmVzcyk7XG4gICAgICBcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8IG9wdHMuY2hhbmdlc19iYXRjaF9zaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9jZXNzTmV4dEJhdGNoKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMocmVzdWx0cykge1xuICAgICAgdmFyIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgY2hhbmdlID0gcmVzdWx0c1tpXTtcbiAgICAgICAgaWYgKGNoYW5nZS5kb2MuX2lkWzBdICE9PSAnXycpIHtcbiAgICAgICAgICBtYXBSZXN1bHRzID0gW107XG4gICAgICAgICAgZG9jID0gY2hhbmdlLmRvYztcblxuICAgICAgICAgIGlmICghZG9jLl9kZWxldGVkKSB7XG4gICAgICAgICAgICB0cnlNYXAodmlldy5zb3VyY2VEQiwgbWFwRnVuLCBkb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBSZXN1bHRzLnNvcnQoc29ydEJ5S2V5VGhlblZhbHVlKTtcblxuICAgICAgICAgIHZhciBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMgPSBjcmVhdGVJbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMobWFwUmVzdWx0cyk7XG4gICAgICAgICAgZG9jSWRzVG9DaGFuZ2VzQW5kRW1pdHMuc2V0KGNoYW5nZS5kb2MuX2lkLCBbXG4gICAgICAgICAgICBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMsXG4gICAgICAgICAgICBjaGFuZ2UuY2hhbmdlc1xuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRTZXEgPSBjaGFuZ2Uuc2VxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY0lkc1RvQ2hhbmdlc0FuZEVtaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluZGV4YWJsZUtleXNUb0tleVZhbHVlcyhtYXBSZXN1bHRzKSB7XG4gICAgICB2YXIgaW5kZXhhYmxlS2V5c1RvS2V5VmFsdWVzID0gbmV3IEV4cG9ydGVkTWFwKCk7XG4gICAgICB2YXIgbGFzdEtleTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBSZXN1bHRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBlbWl0dGVkS2V5VmFsdWUgPSBtYXBSZXN1bHRzW2ldO1xuICAgICAgICB2YXIgY29tcGxleEtleSA9IFtlbWl0dGVkS2V5VmFsdWUua2V5LCBlbWl0dGVkS2V5VmFsdWUuaWRdO1xuICAgICAgICBpZiAoaSA+IDAgJiYgY29sbGF0ZShlbWl0dGVkS2V5VmFsdWUua2V5LCBsYXN0S2V5KSA9PT0gMCkge1xuICAgICAgICAgIGNvbXBsZXhLZXkucHVzaChpKTsgLy8gZHVwIGtleStpZCwgc28gbWFrZSBpdCB1bmlxdWVcbiAgICAgICAgfVxuICAgICAgICBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXMuc2V0KHRvSW5kZXhhYmxlU3RyaW5nKGNvbXBsZXhLZXkpLCBlbWl0dGVkS2V5VmFsdWUpO1xuICAgICAgICBsYXN0S2V5ID0gZW1pdHRlZEtleVZhbHVlLmtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleGFibGVLZXlzVG9LZXlWYWx1ZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NOZXh0QmF0Y2goKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5maW5pc2goKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZpZXcuc2VxID0gY3VycmVudFNlcTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZHVjZVZpZXcodmlldywgcmVzdWx0cywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmdyb3VwX2xldmVsID09PSAwKSB7XG4gICAgICBkZWxldGUgb3B0aW9ucy5ncm91cF9sZXZlbDtcbiAgICB9XG5cbiAgICB2YXIgc2hvdWxkR3JvdXAgPSBvcHRpb25zLmdyb3VwIHx8IG9wdGlvbnMuZ3JvdXBfbGV2ZWw7XG5cbiAgICB2YXIgcmVkdWNlRnVuID0gcmVkdWNlcih2aWV3LnJlZHVjZUZ1bik7XG5cbiAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgdmFyIGx2bCA9IGlzTmFOKG9wdGlvbnMuZ3JvdXBfbGV2ZWwpID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDpcbiAgICAgIG9wdGlvbnMuZ3JvdXBfbGV2ZWw7XG4gICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgbGFzdCA9IGdyb3Vwc1tncm91cHMubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgZ3JvdXBLZXkgPSBzaG91bGRHcm91cCA/IGUua2V5IDogbnVsbDtcblxuICAgICAgLy8gb25seSBzZXQgZ3JvdXBfbGV2ZWwgZm9yIGFycmF5IGtleXNcbiAgICAgIGlmIChzaG91bGRHcm91cCAmJiBBcnJheS5pc0FycmF5KGdyb3VwS2V5KSkge1xuICAgICAgICBncm91cEtleSA9IGdyb3VwS2V5LnNsaWNlKDAsIGx2bCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0ICYmIGNvbGxhdGUobGFzdC5ncm91cEtleSwgZ3JvdXBLZXkpID09PSAwKSB7XG4gICAgICAgIGxhc3Qua2V5cy5wdXNoKFtlLmtleSwgZS5pZF0pO1xuICAgICAgICBsYXN0LnZhbHVlcy5wdXNoKGUudmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBncm91cHMucHVzaCh7XG4gICAgICAgIGtleXM6IFtbZS5rZXksIGUuaWRdXSxcbiAgICAgICAgdmFsdWVzOiBbZS52YWx1ZV0sXG4gICAgICAgIGdyb3VwS2V5OiBncm91cEtleVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmVzdWx0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBncm91cHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBlID0gZ3JvdXBzW2ldO1xuICAgICAgdmFyIHJlZHVjZVRyeSA9IHRyeVJlZHVjZSh2aWV3LnNvdXJjZURCLCByZWR1Y2VGdW4sIGUua2V5cywgZS52YWx1ZXMsIGZhbHNlKTtcbiAgICAgIGlmIChyZWR1Y2VUcnkuZXJyb3IgJiYgcmVkdWNlVHJ5LmVycm9yIGluc3RhbmNlb2YgQnVpbHRJbkVycm9yKSB7XG4gICAgICAgIC8vIENvdWNoREIgcmV0dXJucyBhbiBlcnJvciBpZiBhIGJ1aWx0LWluIGVycm9ycyBvdXRcbiAgICAgICAgdGhyb3cgcmVkdWNlVHJ5LmVycm9yO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgLy8gQ291Y2hEQiBqdXN0IHNldHMgdGhlIHZhbHVlIHRvIG51bGwgaWYgYSBub24tYnVpbHQtaW4gZXJyb3JzIG91dFxuICAgICAgICB2YWx1ZTogcmVkdWNlVHJ5LmVycm9yID8gbnVsbCA6IHJlZHVjZVRyeS5vdXRwdXQsXG4gICAgICAgIGtleTogZS5ncm91cEtleVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG5vIHRvdGFsX3Jvd3Mvb2Zmc2V0IHdoZW4gcmVkdWNpbmdcbiAgICByZXR1cm4ge3Jvd3M6IHNsaWNlUmVzdWx0cyhyZXN1bHRzLCBvcHRpb25zLmxpbWl0LCBvcHRpb25zLnNraXApfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1ZXJ5Vmlldyh2aWV3LCBvcHRzKSB7XG4gICAgcmV0dXJuIHNlcXVlbnRpYWxpemUoZ2V0UXVldWUodmlldyksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBxdWVyeVZpZXdJblF1ZXVlKHZpZXcsIG9wdHMpO1xuICAgIH0pKCk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWVyeVZpZXdJblF1ZXVlKHZpZXcsIG9wdHMpIHtcbiAgICB2YXIgdG90YWxSb3dzO1xuICAgIHZhciBzaG91bGRSZWR1Y2UgPSB2aWV3LnJlZHVjZUZ1biAmJiBvcHRzLnJlZHVjZSAhPT0gZmFsc2U7XG4gICAgdmFyIHNraXAgPSBvcHRzLnNraXAgfHwgMDtcbiAgICBpZiAodHlwZW9mIG9wdHMua2V5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdHMua2V5cy5sZW5ndGgpIHtcbiAgICAgIC8vIGVxdWl2YWxlbnQgcXVlcnlcbiAgICAgIG9wdHMubGltaXQgPSAwO1xuICAgICAgZGVsZXRlIG9wdHMua2V5cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmZXRjaEZyb21WaWV3KHZpZXdPcHRzKSB7XG4gICAgICB2aWV3T3B0cy5pbmNsdWRlX2RvY3MgPSB0cnVlO1xuICAgICAgcmV0dXJuIHZpZXcuZGIuYWxsRG9jcyh2aWV3T3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHRvdGFsUm93cyA9IHJlcy50b3RhbF9yb3dzO1xuICAgICAgICByZXR1cm4gcmVzLnJvd3MubWFwKGZ1bmN0aW9uIChyZXN1bHQpIHtcblxuICAgICAgICAgIC8vIGltcGxpY2l0IG1pZ3JhdGlvbiAtIGluIG9sZGVyIHZlcnNpb25zIG9mIFBvdWNoREIsXG4gICAgICAgICAgLy8gd2UgZXhwbGljaXRseSBzdG9yZWQgdGhlIGRvYyBhcyB7aWQ6IC4uLiwga2V5OiAuLi4sIHZhbHVlOiAuLi59XG4gICAgICAgICAgLy8gdGhpcyBpcyB0ZXN0ZWQgaW4gYSBtaWdyYXRpb24gdGVzdFxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgaWYgKCd2YWx1ZScgaW4gcmVzdWx0LmRvYyAmJiB0eXBlb2YgcmVzdWx0LmRvYy52YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHJlc3VsdC5kb2MudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVzdWx0LmRvYy52YWx1ZSkuc29ydCgpO1xuICAgICAgICAgICAgLy8gdGhpcyBkZXRlY3Rpb24gbWV0aG9kIGlzIG5vdCBwZXJmZWN0LCBidXQgaXQncyB1bmxpa2VseSB0aGUgdXNlclxuICAgICAgICAgICAgLy8gZW1pdHRlZCBhIHZhbHVlIHdoaWNoIHdhcyBhbiBvYmplY3Qgd2l0aCB0aGVzZSAzIGV4YWN0IGtleXNcbiAgICAgICAgICAgIHZhciBleHBlY3RlZEtleXMgPSBbJ2lkJywgJ2tleScsICd2YWx1ZSddO1xuICAgICAgICAgICAgaWYgKCEoa2V5cyA8IGV4cGVjdGVkS2V5cyB8fCBrZXlzID4gZXhwZWN0ZWRLZXlzKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvYy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcGFyc2VkS2V5QW5kRG9jSWQgPSBwYXJzZUluZGV4YWJsZVN0cmluZyhyZXN1bHQuZG9jLl9pZCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogcGFyc2VkS2V5QW5kRG9jSWRbMF0sXG4gICAgICAgICAgICBpZDogcGFyc2VkS2V5QW5kRG9jSWRbMV0sXG4gICAgICAgICAgICB2YWx1ZTogKCd2YWx1ZScgaW4gcmVzdWx0LmRvYyA/IHJlc3VsdC5kb2MudmFsdWUgOiBudWxsKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25NYXBSZXN1bHRzUmVhZHkocm93cykge1xuICAgICAgdmFyIGZpbmFsUmVzdWx0cztcbiAgICAgIGlmIChzaG91bGRSZWR1Y2UpIHtcbiAgICAgICAgZmluYWxSZXN1bHRzID0gcmVkdWNlVmlldyh2aWV3LCByb3dzLCBvcHRzKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMua2V5cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZmluYWxSZXN1bHRzID0ge1xuICAgICAgICAgIHRvdGFsX3Jvd3M6IHRvdGFsUm93cyxcbiAgICAgICAgICBvZmZzZXQ6IHNraXAsXG4gICAgICAgICAgcm93czogcm93c1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3VwcG9ydCBsaW1pdCwgc2tpcCBmb3Iga2V5cyBxdWVyeVxuICAgICAgICBmaW5hbFJlc3VsdHMgPSB7XG4gICAgICAgICAgdG90YWxfcm93czogdG90YWxSb3dzLFxuICAgICAgICAgIG9mZnNldDogc2tpcCxcbiAgICAgICAgICByb3dzOiBzbGljZVJlc3VsdHMocm93cyxvcHRzLmxpbWl0LG9wdHMuc2tpcClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKG9wdHMudXBkYXRlX3NlcSkge1xuICAgICAgICBmaW5hbFJlc3VsdHMudXBkYXRlX3NlcSA9IHZpZXcuc2VxO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMuaW5jbHVkZV9kb2NzKSB7XG4gICAgICAgIHZhciBkb2NJZHMgPSB1bmlxKHJvd3MubWFwKHJvd1RvRG9jSWQpKTtcblxuICAgICAgICByZXR1cm4gdmlldy5zb3VyY2VEQi5hbGxEb2NzKHtcbiAgICAgICAgICBrZXlzOiBkb2NJZHMsXG4gICAgICAgICAgaW5jbHVkZV9kb2NzOiB0cnVlLFxuICAgICAgICAgIGNvbmZsaWN0czogb3B0cy5jb25mbGljdHMsXG4gICAgICAgICAgYXR0YWNobWVudHM6IG9wdHMuYXR0YWNobWVudHMsXG4gICAgICAgICAgYmluYXJ5OiBvcHRzLmJpbmFyeVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChhbGxEb2NzUmVzKSB7XG4gICAgICAgICAgdmFyIGRvY0lkc1RvRG9jcyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgICAgIGFsbERvY3NSZXMucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIGRvY0lkc1RvRG9jcy5zZXQocm93LmlkLCByb3cuZG9jKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgdmFyIGRvY0lkID0gcm93VG9Eb2NJZChyb3cpO1xuICAgICAgICAgICAgdmFyIGRvYyA9IGRvY0lkc1RvRG9jcy5nZXQoZG9jSWQpO1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICByb3cuZG9jID0gZG9jO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdHM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMua2V5cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBrZXlzID0gb3B0cy5rZXlzO1xuICAgICAgdmFyIGZldGNoUHJvbWlzZXMgPSBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2aWV3T3B0cyA9IHtcbiAgICAgICAgICBzdGFydGtleSA6IHRvSW5kZXhhYmxlU3RyaW5nKFtrZXldKSxcbiAgICAgICAgICBlbmRrZXkgICA6IHRvSW5kZXhhYmxlU3RyaW5nKFtrZXksIHt9XSlcbiAgICAgICAgfTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgICAgICB2aWV3T3B0cy51cGRhdGVfc2VxID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmV0Y2hGcm9tVmlldyh2aWV3T3B0cyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChmZXRjaFByb21pc2VzKS50aGVuKGZsYXR0ZW4pLnRoZW4ob25NYXBSZXN1bHRzUmVhZHkpO1xuICAgIH0gZWxzZSB7IC8vIG5vcm1hbCBxdWVyeSwgbm8gJ2tleXMnXG4gICAgICB2YXIgdmlld09wdHMgPSB7XG4gICAgICAgIGRlc2NlbmRpbmcgOiBvcHRzLmRlc2NlbmRpbmdcbiAgICAgIH07XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChvcHRzLnVwZGF0ZV9zZXEpIHtcbiAgICAgICAgdmlld09wdHMudXBkYXRlX3NlcSA9IHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRrZXk7XG4gICAgICB2YXIgZW5ka2V5O1xuICAgICAgaWYgKCdzdGFydF9rZXknIGluIG9wdHMpIHtcbiAgICAgICAgc3RhcnRrZXkgPSBvcHRzLnN0YXJ0X2tleTtcbiAgICAgIH1cbiAgICAgIGlmICgnc3RhcnRrZXknIGluIG9wdHMpIHtcbiAgICAgICAgc3RhcnRrZXkgPSBvcHRzLnN0YXJ0a2V5O1xuICAgICAgfVxuICAgICAgaWYgKCdlbmRfa2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIGVuZGtleSA9IG9wdHMuZW5kX2tleTtcbiAgICAgIH1cbiAgICAgIGlmICgnZW5ka2V5JyBpbiBvcHRzKSB7XG4gICAgICAgIGVuZGtleSA9IG9wdHMuZW5ka2V5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzdGFydGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmlld09wdHMuc3RhcnRrZXkgPSBvcHRzLmRlc2NlbmRpbmcgP1xuICAgICAgICAgIHRvSW5kZXhhYmxlU3RyaW5nKFtzdGFydGtleSwge31dKSA6XG4gICAgICAgICAgdG9JbmRleGFibGVTdHJpbmcoW3N0YXJ0a2V5XSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGVuZGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGluY2x1c2l2ZUVuZCA9IG9wdHMuaW5jbHVzaXZlX2VuZCAhPT0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRzLmRlc2NlbmRpbmcpIHtcbiAgICAgICAgICBpbmNsdXNpdmVFbmQgPSAhaW5jbHVzaXZlRW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld09wdHMuZW5ka2V5ID0gdG9JbmRleGFibGVTdHJpbmcoXG4gICAgICAgICAgaW5jbHVzaXZlRW5kID8gW2VuZGtleSwge31dIDogW2VuZGtleV0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGtleVN0YXJ0ID0gdG9JbmRleGFibGVTdHJpbmcoW29wdHMua2V5XSk7XG4gICAgICAgIHZhciBrZXlFbmQgPSB0b0luZGV4YWJsZVN0cmluZyhbb3B0cy5rZXksIHt9XSk7XG4gICAgICAgIGlmICh2aWV3T3B0cy5kZXNjZW5kaW5nKSB7XG4gICAgICAgICAgdmlld09wdHMuZW5ka2V5ID0ga2V5U3RhcnQ7XG4gICAgICAgICAgdmlld09wdHMuc3RhcnRrZXkgPSBrZXlFbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlld09wdHMuc3RhcnRrZXkgPSBrZXlTdGFydDtcbiAgICAgICAgICB2aWV3T3B0cy5lbmRrZXkgPSBrZXlFbmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc2hvdWxkUmVkdWNlKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5saW1pdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB2aWV3T3B0cy5saW1pdCA9IG9wdHMubGltaXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmlld09wdHMuc2tpcCA9IHNraXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmV0Y2hGcm9tVmlldyh2aWV3T3B0cykudGhlbihvbk1hcFJlc3VsdHNSZWFkeSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaHR0cFZpZXdDbGVhbnVwKGRiKSB7XG4gICAgcmV0dXJuIGRiLmZldGNoKCdfdmlld19jbGVhbnVwJywge1xuICAgICAgaGVhZGVyczogbmV3IGgoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2NhbFZpZXdDbGVhbnVwKGRiKSB7XG4gICAgcmV0dXJuIGRiLmdldCgnX2xvY2FsLycgKyBsb2NhbERvY05hbWUpLnRoZW4oZnVuY3Rpb24gKG1ldGFEb2MpIHtcbiAgICAgIHZhciBkb2NzVG9WaWV3cyA9IG5ldyBFeHBvcnRlZE1hcCgpO1xuICAgICAgT2JqZWN0LmtleXMobWV0YURvYy52aWV3cykuZm9yRWFjaChmdW5jdGlvbiAoZnVsbFZpZXdOYW1lKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IHBhcnNlVmlld05hbWUoZnVsbFZpZXdOYW1lKTtcbiAgICAgICAgdmFyIGRlc2lnbkRvY05hbWUgPSAnX2Rlc2lnbi8nICsgcGFydHNbMF07XG4gICAgICAgIHZhciB2aWV3TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgICB2YXIgdmlld3MgPSBkb2NzVG9WaWV3cy5nZXQoZGVzaWduRG9jTmFtZSk7XG4gICAgICAgIGlmICghdmlld3MpIHtcbiAgICAgICAgICB2aWV3cyA9IG5ldyBFeHBvcnRlZFNldCgpO1xuICAgICAgICAgIGRvY3NUb1ZpZXdzLnNldChkZXNpZ25Eb2NOYW1lLCB2aWV3cyk7XG4gICAgICAgIH1cbiAgICAgICAgdmlld3MuYWRkKHZpZXdOYW1lKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgIGtleXMgOiBtYXBUb0tleXNBcnJheShkb2NzVG9WaWV3cyksXG4gICAgICAgIGluY2x1ZGVfZG9jcyA6IHRydWVcbiAgICAgIH07XG4gICAgICByZXR1cm4gZGIuYWxsRG9jcyhvcHRzKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgdmFyIHZpZXdzVG9TdGF0dXMgPSB7fTtcbiAgICAgICAgcmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgdmFyIGRkb2NOYW1lID0gcm93LmtleS5zdWJzdHJpbmcoOCk7IC8vIGN1dHMgb2ZmICdfZGVzaWduLydcbiAgICAgICAgICBkb2NzVG9WaWV3cy5nZXQocm93LmtleSkuZm9yRWFjaChmdW5jdGlvbiAodmlld05hbWUpIHtcbiAgICAgICAgICAgIHZhciBmdWxsVmlld05hbWUgPSBkZG9jTmFtZSArICcvJyArIHZpZXdOYW1lO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAoIW1ldGFEb2Mudmlld3NbZnVsbFZpZXdOYW1lXSkge1xuICAgICAgICAgICAgICAvLyBuZXcgZm9ybWF0LCB3aXRob3V0IHNsYXNoZXMsIHRvIHN1cHBvcnQgUG91Y2hEQiAyLjIuMFxuICAgICAgICAgICAgICAvLyBtaWdyYXRpb24gdGVzdCBpbiBwb3VjaGRiJ3MgYnJvd3Nlci5taWdyYXRpb24uanMgdmVyaWZpZXMgdGhpc1xuICAgICAgICAgICAgICBmdWxsVmlld05hbWUgPSB2aWV3TmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2aWV3REJOYW1lcyA9IE9iamVjdC5rZXlzKG1ldGFEb2Mudmlld3NbZnVsbFZpZXdOYW1lXSk7XG4gICAgICAgICAgICAvLyBkZXNpZ24gZG9jIGRlbGV0ZWQsIG9yIHZpZXcgZnVuY3Rpb24gbm9uZXhpc3RlbnRcbiAgICAgICAgICAgIHZhciBzdGF0dXNJc0dvb2QgPSByb3cuZG9jICYmIHJvdy5kb2Mudmlld3MgJiZcbiAgICAgICAgICAgICAgcm93LmRvYy52aWV3c1t2aWV3TmFtZV07XG4gICAgICAgICAgICB2aWV3REJOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uICh2aWV3REJOYW1lKSB7XG4gICAgICAgICAgICAgIHZpZXdzVG9TdGF0dXNbdmlld0RCTmFtZV0gPVxuICAgICAgICAgICAgICAgIHZpZXdzVG9TdGF0dXNbdmlld0RCTmFtZV0gfHwgc3RhdHVzSXNHb29kO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZGJzVG9EZWxldGUgPSBPYmplY3Qua2V5cyh2aWV3c1RvU3RhdHVzKS5maWx0ZXIoXG4gICAgICAgICAgZnVuY3Rpb24gKHZpZXdEQk5hbWUpIHsgcmV0dXJuICF2aWV3c1RvU3RhdHVzW3ZpZXdEQk5hbWVdOyB9KTtcbiAgICAgICAgdmFyIGRlc3Ryb3lQcm9taXNlcyA9IGRic1RvRGVsZXRlLm1hcChmdW5jdGlvbiAodmlld0RCTmFtZSkge1xuICAgICAgICAgIHJldHVybiBzZXF1ZW50aWFsaXplKGdldFF1ZXVlKHZpZXdEQk5hbWUpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGRiLmNvbnN0cnVjdG9yKHZpZXdEQk5hbWUsIGRiLl9fb3B0cykuZGVzdHJveSgpO1xuICAgICAgICAgIH0pKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGVzdHJveVByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4ge29rOiB0cnVlfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCBkZWZhdWx0c1RvKHtvazogdHJ1ZX0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1ZXJ5UHJvbWlzZWQoZGIsIGZ1biwgb3B0cykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBkYi5fcXVlcnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBjdXN0b21RdWVyeShkYiwgZnVuLCBvcHRzKTtcbiAgICB9XG4gICAgaWYgKGlzUmVtb3RlKGRiKSkge1xuICAgICAgcmV0dXJuIGh0dHBRdWVyeShkYiwgZnVuLCBvcHRzKTtcbiAgICB9XG5cbiAgICB2YXIgdXBkYXRlVmlld09wdHMgPSB7XG4gICAgICBjaGFuZ2VzX2JhdGNoX3NpemU6IGRiLl9fb3B0cy52aWV3X3VwZGF0ZV9jaGFuZ2VzX2JhdGNoX3NpemUgfHwgQ0hBTkdFU19CQVRDSF9TSVpFJDFcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBmdW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyB0ZW1wX3ZpZXdcbiAgICAgIGNoZWNrUXVlcnlQYXJzZUVycm9yKG9wdHMsIGZ1bik7XG5cbiAgICAgIHRlbXBWaWV3UXVldWUuYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0ZVZpZXdQcm9taXNlID0gY3JlYXRlVmlldyhcbiAgICAgICAgICAvKiBzb3VyY2VEQiAqLyBkYixcbiAgICAgICAgICAvKiB2aWV3TmFtZSAqLyAndGVtcF92aWV3L3RlbXBfdmlldycsXG4gICAgICAgICAgLyogbWFwRnVuICovIGZ1bi5tYXAsXG4gICAgICAgICAgLyogcmVkdWNlRnVuICovIGZ1bi5yZWR1Y2UsXG4gICAgICAgICAgLyogdGVtcG9yYXJ5ICovIHRydWUsXG4gICAgICAgICAgLyogbG9jYWxEb2NOYW1lICovIGxvY2FsRG9jTmFtZSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVWaWV3UHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgcmV0dXJuIGZpbih1cGRhdGVWaWV3KHZpZXcsIHVwZGF0ZVZpZXdPcHRzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeVZpZXcodmlldywgb3B0cyk7XG4gICAgICAgICAgfSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmRiLmRlc3Ryb3koKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0ZW1wVmlld1F1ZXVlLmZpbmlzaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwZXJzaXN0ZW50IHZpZXdcbiAgICAgIHZhciBmdWxsVmlld05hbWUgPSBmdW47XG4gICAgICB2YXIgcGFydHMgPSBwYXJzZVZpZXdOYW1lKGZ1bGxWaWV3TmFtZSk7XG4gICAgICB2YXIgZGVzaWduRG9jTmFtZSA9IHBhcnRzWzBdO1xuICAgICAgdmFyIHZpZXdOYW1lID0gcGFydHNbMV07XG4gICAgICByZXR1cm4gZGIuZ2V0KCdfZGVzaWduLycgKyBkZXNpZ25Eb2NOYW1lKS50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgdmFyIGZ1biA9IGRvYy52aWV3cyAmJiBkb2Mudmlld3Nbdmlld05hbWVdO1xuXG4gICAgICAgIGlmICghZnVuKSB7XG4gICAgICAgICAgLy8gYmFzaWMgdmFsaWRhdG9yOyBpdCdzIGFzc3VtZWQgdGhhdCBldmVyeSBzdWJjbGFzcyB3b3VsZCB3YW50IHRoaXNcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignZGRvYyAnICsgZG9jLl9pZCArICcgaGFzIG5vIHZpZXcgbmFtZWQgJyArXG4gICAgICAgICAgICB2aWV3TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZG9jVmFsaWRhdG9yKGRvYywgdmlld05hbWUpO1xuICAgICAgICBjaGVja1F1ZXJ5UGFyc2VFcnJvcihvcHRzLCBmdW4pO1xuXG4gICAgICAgIHZhciBjcmVhdGVWaWV3UHJvbWlzZSA9IGNyZWF0ZVZpZXcoXG4gICAgICAgICAgLyogc291cmNlREIgKi8gZGIsXG4gICAgICAgICAgLyogdmlld05hbWUgKi8gZnVsbFZpZXdOYW1lLFxuICAgICAgICAgIC8qIG1hcEZ1biAqLyBmdW4ubWFwLFxuICAgICAgICAgIC8qIHJlZHVjZUZ1biAqLyBmdW4ucmVkdWNlLFxuICAgICAgICAgIC8qIHRlbXBvcmFyeSAqLyBmYWxzZSxcbiAgICAgICAgICAvKiBsb2NhbERvY05hbWUgKi8gbG9jYWxEb2NOYW1lKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZpZXdQcm9taXNlLnRoZW4oZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgICBpZiAob3B0cy5zdGFsZSA9PT0gJ29rJyB8fCBvcHRzLnN0YWxlID09PSAndXBkYXRlX2FmdGVyJykge1xuICAgICAgICAgICAgaWYgKG9wdHMuc3RhbGUgPT09ICd1cGRhdGVfYWZ0ZXInKSB7XG4gICAgICAgICAgICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlVmlldyh2aWV3LCB1cGRhdGVWaWV3T3B0cyk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Vmlldyh2aWV3LCBvcHRzKTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBzdGFsZSBub3Qgb2tcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVWaWV3KHZpZXcsIHVwZGF0ZVZpZXdPcHRzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5Vmlldyh2aWV3LCBvcHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhYnN0cmFjdFF1ZXJ5KGZ1biwgb3B0cywgY2FsbGJhY2spIHtcbiAgICB2YXIgZGIgPSB0aGlzO1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyA/IGNvZXJjZU9wdGlvbnMob3B0cykgOiB7fTtcblxuICAgIGlmICh0eXBlb2YgZnVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmdW4gPSB7bWFwIDogZnVufTtcbiAgICB9XG5cbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5UHJvbWlzZWQoZGIsIGZ1biwgb3B0cyk7XG4gICAgfSk7XG4gICAgcHJvbWlzZWRDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICB2YXIgYWJzdHJhY3RWaWV3Q2xlYW51cCA9IGNhbGxiYWNraWZ5KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGIgPSB0aGlzO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBkYi5fdmlld0NsZWFudXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Q2xlYW51cChkYik7XG4gICAgfVxuICAgIGlmIChpc1JlbW90ZShkYikpIHtcbiAgICAgIHJldHVybiBodHRwVmlld0NsZWFudXAoZGIpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxWaWV3Q2xlYW51cChkYik7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcXVlcnk6IGFic3RyYWN0UXVlcnksXG4gICAgdmlld0NsZWFudXA6IGFic3RyYWN0Vmlld0NsZWFudXBcbiAgfTtcbn1cblxudmFyIGJ1aWx0SW5SZWR1Y2UgPSB7XG4gIF9zdW06IGZ1bmN0aW9uIChrZXlzLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gc3VtKHZhbHVlcyk7XG4gIH0sXG5cbiAgX2NvdW50OiBmdW5jdGlvbiAoa2V5cywgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGg7XG4gIH0sXG5cbiAgX3N0YXRzOiBmdW5jdGlvbiAoa2V5cywgdmFsdWVzKSB7XG4gICAgLy8gbm8gbmVlZCB0byBpbXBsZW1lbnQgcmVyZWR1Y2U9dHJ1ZSwgYmVjYXVzZSBQb3VjaFxuICAgIC8vIHdpbGwgbmV2ZXIgY2FsbCBpdFxuICAgIGZ1bmN0aW9uIHN1bXNxcih2YWx1ZXMpIHtcbiAgICAgIHZhciBfc3Vtc3FyID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIG51bSA9IHZhbHVlc1tpXTtcbiAgICAgICAgX3N1bXNxciArPSAobnVtICogbnVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfc3Vtc3FyO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3VtICAgICA6IHN1bSh2YWx1ZXMpLFxuICAgICAgbWluICAgICA6IE1hdGgubWluLmFwcGx5KG51bGwsIHZhbHVlcyksXG4gICAgICBtYXggICAgIDogTWF0aC5tYXguYXBwbHkobnVsbCwgdmFsdWVzKSxcbiAgICAgIGNvdW50ICAgOiB2YWx1ZXMubGVuZ3RoLFxuICAgICAgc3Vtc3FyIDogc3Vtc3FyKHZhbHVlcylcbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluKHJlZHVjZUZ1blN0cmluZykge1xuICBpZiAoL15fc3VtLy50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICByZXR1cm4gYnVpbHRJblJlZHVjZS5fc3VtO1xuICB9IGVsc2UgaWYgKC9eX2NvdW50Ly50ZXN0KHJlZHVjZUZ1blN0cmluZykpIHtcbiAgICByZXR1cm4gYnVpbHRJblJlZHVjZS5fY291bnQ7XG4gIH0gZWxzZSBpZiAoL15fc3RhdHMvLnRlc3QocmVkdWNlRnVuU3RyaW5nKSkge1xuICAgIHJldHVybiBidWlsdEluUmVkdWNlLl9zdGF0cztcbiAgfSBlbHNlIGlmICgvXl8vLnRlc3QocmVkdWNlRnVuU3RyaW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihyZWR1Y2VGdW5TdHJpbmcgKyAnIGlzIG5vdCBhIHN1cHBvcnRlZCByZWR1Y2UgZnVuY3Rpb24uJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwcGVyKG1hcEZ1biwgZW1pdCkge1xuICAvLyBmb3IgdGVtcF92aWV3cyBvbmUgY2FuIHVzZSBlbWl0KGRvYywgZW1pdCksIHNlZSAjMzhcbiAgaWYgKHR5cGVvZiBtYXBGdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBtYXBGdW4ubGVuZ3RoID09PSAyKSB7XG4gICAgdmFyIG9yaWdNYXAgPSBtYXBGdW47XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgIHJldHVybiBvcmlnTWFwKGRvYywgZW1pdCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXZhbEZ1bmN0aW9uV2l0aEV2YWwobWFwRnVuLnRvU3RyaW5nKCksIGVtaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZXIocmVkdWNlRnVuKSB7XG4gIHZhciByZWR1Y2VGdW5TdHJpbmcgPSByZWR1Y2VGdW4udG9TdHJpbmcoKTtcbiAgdmFyIGJ1aWx0SW4gPSBnZXRCdWlsdEluKHJlZHVjZUZ1blN0cmluZyk7XG4gIGlmIChidWlsdEluKSB7XG4gICAgcmV0dXJuIGJ1aWx0SW47XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV2YWxGdW5jdGlvbldpdGhFdmFsKHJlZHVjZUZ1blN0cmluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGRvY1ZhbGlkYXRvcihkZG9jLCB2aWV3TmFtZSkge1xuICB2YXIgZnVuID0gZGRvYy52aWV3cyAmJiBkZG9jLnZpZXdzW3ZpZXdOYW1lXTtcbiAgaWYgKHR5cGVvZiBmdW4ubWFwICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdkZG9jICcgKyBkZG9jLl9pZCArICcgaGFzIG5vIHN0cmluZyB2aWV3IG5hbWVkICcgK1xuICAgICAgdmlld05hbWUgKyAnLCBpbnN0ZWFkIGZvdW5kIG9iamVjdCBvZiB0eXBlOiAnICsgdHlwZW9mIGZ1bi5tYXApO1xuICB9XG59XG5cbnZhciBsb2NhbERvY05hbWUgPSAnbXJ2aWV3cyc7XG52YXIgYWJzdHJhY3QgPSBjcmVhdGVBYnN0cmFjdE1hcFJlZHVjZShsb2NhbERvY05hbWUsIG1hcHBlciwgcmVkdWNlciwgZGRvY1ZhbGlkYXRvcik7XG5cbmZ1bmN0aW9uIHF1ZXJ5KGZ1biwgb3B0cywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFic3RyYWN0LnF1ZXJ5LmNhbGwodGhpcywgZnVuLCBvcHRzLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHZpZXdDbGVhbnVwKGNhbGxiYWNrKSB7XG4gIHJldHVybiBhYnN0cmFjdC52aWV3Q2xlYW51cC5jYWxsKHRoaXMsIGNhbGxiYWNrKTtcbn1cblxudmFyIG1hcHJlZHVjZSA9IHtcbiAgcXVlcnk6IHF1ZXJ5LFxuICB2aWV3Q2xlYW51cDogdmlld0NsZWFudXBcbn07XG5cbmZ1bmN0aW9uIGlzR2VuT25lJDEocmV2KSB7XG4gIHJldHVybiAvXjEtLy50ZXN0KHJldik7XG59XG5cbmZ1bmN0aW9uIGZpbGVIYXNDaGFuZ2VkKGxvY2FsRG9jLCByZW1vdGVEb2MsIGZpbGVuYW1lKSB7XG4gIHJldHVybiAhbG9jYWxEb2MuX2F0dGFjaG1lbnRzIHx8XG4gICAgICAgICAhbG9jYWxEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXSB8fFxuICAgICAgICAgbG9jYWxEb2MuX2F0dGFjaG1lbnRzW2ZpbGVuYW1lXS5kaWdlc3QgIT09IHJlbW90ZURvYy5fYXR0YWNobWVudHNbZmlsZW5hbWVdLmRpZ2VzdDtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jQXR0YWNobWVudHMoZGIsIGRvYykge1xuICB2YXIgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMoZG9jLl9hdHRhY2htZW50cyk7XG4gIHJldHVybiBQcm9taXNlLmFsbChmaWxlbmFtZXMubWFwKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgIHJldHVybiBkYi5nZXRBdHRhY2htZW50KGRvYy5faWQsIGZpbGVuYW1lLCB7cmV2OiBkb2MuX3Jldn0pO1xuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGdldERvY0F0dGFjaG1lbnRzRnJvbVRhcmdldE9yU291cmNlKHRhcmdldCwgc3JjLCBkb2MpIHtcbiAgdmFyIGRvQ2hlY2tGb3JMb2NhbEF0dGFjaG1lbnRzID0gaXNSZW1vdGUoc3JjKSAmJiAhaXNSZW1vdGUodGFyZ2V0KTtcbiAgdmFyIGZpbGVuYW1lcyA9IE9iamVjdC5rZXlzKGRvYy5fYXR0YWNobWVudHMpO1xuXG4gIGlmICghZG9DaGVja0ZvckxvY2FsQXR0YWNobWVudHMpIHtcbiAgICByZXR1cm4gZ2V0RG9jQXR0YWNobWVudHMoc3JjLCBkb2MpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldC5nZXQoZG9jLl9pZCkudGhlbihmdW5jdGlvbiAobG9jYWxEb2MpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZW5hbWVzLm1hcChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgIGlmIChmaWxlSGFzQ2hhbmdlZChsb2NhbERvYywgZG9jLCBmaWxlbmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHNyYy5nZXRBdHRhY2htZW50KGRvYy5faWQsIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldC5nZXRBdHRhY2htZW50KGxvY2FsRG9jLl9pZCwgZmlsZW5hbWUpO1xuICAgIH0pKTtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGVycm9yLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RG9jQXR0YWNobWVudHMoc3JjLCBkb2MpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVsa0dldE9wdHMoZGlmZnMpIHtcbiAgdmFyIHJlcXVlc3RzID0gW107XG4gIE9iamVjdC5rZXlzKGRpZmZzKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBtaXNzaW5nUmV2cyA9IGRpZmZzW2lkXS5taXNzaW5nO1xuICAgIG1pc3NpbmdSZXZzLmZvckVhY2goZnVuY3Rpb24gKG1pc3NpbmdSZXYpIHtcbiAgICAgIHJlcXVlc3RzLnB1c2goe1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIHJldjogbWlzc2luZ1JldlxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZG9jczogcmVxdWVzdHMsXG4gICAgcmV2czogdHJ1ZSxcbiAgICBsYXRlc3Q6IHRydWVcbiAgfTtcbn1cblxuLy9cbi8vIEZldGNoIGFsbCB0aGUgZG9jdW1lbnRzIGZyb20gdGhlIHNyYyBhcyBkZXNjcmliZWQgaW4gdGhlIFwiZGlmZnNcIixcbi8vIHdoaWNoIGlzIGEgbWFwcGluZyBvZiBkb2NzIElEcyB0byByZXZpc2lvbnMuIElmIHRoZSBzdGF0ZSBldmVyXG4vLyBjaGFuZ2VzIHRvIFwiY2FuY2VsbGVkXCIsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbi8vIEVsc2UgaXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIGEgbGlzdCBvZiBmZXRjaGVkIGRvY3VtZW50cy5cbi8vXG5mdW5jdGlvbiBnZXREb2NzKHNyYywgdGFyZ2V0LCBkaWZmcywgc3RhdGUpIHtcbiAgZGlmZnMgPSBjbG9uZShkaWZmcyk7IC8vIHdlIGRvIG5vdCBuZWVkIHRvIG1vZGlmeSB0aGlzXG5cbiAgdmFyIHJlc3VsdERvY3MgPSBbXSxcbiAgICAgIG9rID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBnZXRBbGxEb2NzKCkge1xuXG4gICAgdmFyIGJ1bGtHZXRPcHRzID0gY3JlYXRlQnVsa0dldE9wdHMoZGlmZnMpO1xuXG4gICAgaWYgKCFidWxrR2V0T3B0cy5kb2NzLmxlbmd0aCkgeyAvLyBvcHRpbWl6YXRpb246IHNraXAgZW1wdHkgcmVxdWVzdHNcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3JjLmJ1bGtHZXQoYnVsa0dldE9wdHMpLnRoZW4oZnVuY3Rpb24gKGJ1bGtHZXRSZXNwb25zZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoc3RhdGUuY2FuY2VsbGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYnVsa0dldFJlc3BvbnNlLnJlc3VsdHMubWFwKGZ1bmN0aW9uIChidWxrR2V0SW5mbykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYnVsa0dldEluZm8uZG9jcy5tYXAoZnVuY3Rpb24gKGRvYykge1xuICAgICAgICAgIHZhciByZW1vdGVEb2MgPSBkb2Mub2s7XG5cbiAgICAgICAgICBpZiAoZG9jLmVycm9yKSB7XG4gICAgICAgICAgICAvLyB3aGVuIEFVVE9fQ09NUEFDVElPTiBpcyBzZXQsIGRvY3MgY2FuIGJlIHJldHVybmVkIHdoaWNoIGxvb2tcbiAgICAgICAgICAgIC8vIGxpa2UgdGhpczoge1wibWlzc2luZ1wiOlwiMS03YzNhYzI1NmI2OTNjNDYyYWY4NDQyZjk5MmI4MzY5NlwifVxuICAgICAgICAgICAgb2sgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXJlbW90ZURvYyB8fCAhcmVtb3RlRG9jLl9hdHRhY2htZW50cykge1xuICAgICAgICAgICAgcmV0dXJuIHJlbW90ZURvYztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZ2V0RG9jQXR0YWNobWVudHNGcm9tVGFyZ2V0T3JTb3VyY2UodGFyZ2V0LCBzcmMsIHJlbW90ZURvYylcbiAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlbmFtZXMgPSBPYmplY3Qua2V5cyhyZW1vdGVEb2MuX2F0dGFjaG1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChhdHRhY2htZW50LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dCA9IHJlbW90ZURvYy5fYXR0YWNobWVudHNbZmlsZW5hbWVzW2ldXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXR0LnN0dWI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0LmRhdGEgPSBhdHRhY2htZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3RlRG9jO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH0pKVxuXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICByZXN1bHREb2NzID0gcmVzdWx0RG9jcy5jb25jYXQoZmxhdHRlbihyZXN1bHRzKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNBdHRhY2htZW50cyhkb2MpIHtcbiAgICByZXR1cm4gZG9jLl9hdHRhY2htZW50cyAmJiBPYmplY3Qua2V5cyhkb2MuX2F0dGFjaG1lbnRzKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzQ29uZmxpY3RzKGRvYykge1xuICAgIHJldHVybiBkb2MuX2NvbmZsaWN0cyAmJiBkb2MuX2NvbmZsaWN0cy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hSZXZpc2lvbk9uZURvY3MoaWRzKSB7XG4gICAgLy8gT3B0aW1pemF0aW9uOiBmZXRjaCBnZW4tMSBkb2NzIGFuZCBhdHRhY2htZW50cyBpblxuICAgIC8vIGEgc2luZ2xlIHJlcXVlc3QgdXNpbmcgX2FsbF9kb2NzXG4gICAgcmV0dXJuIHNyYy5hbGxEb2NzKHtcbiAgICAgIGtleXM6IGlkcyxcbiAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZSxcbiAgICAgIGNvbmZsaWN0czogdHJ1ZVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgaWYgKHN0YXRlLmNhbmNlbGxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuICAgICAgcmVzLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgIGlmIChyb3cuZGVsZXRlZCB8fCAhcm93LmRvYyB8fCAhaXNHZW5PbmUkMShyb3cudmFsdWUucmV2KSB8fFxuICAgICAgICAgICAgaGFzQXR0YWNobWVudHMocm93LmRvYykgfHwgaGFzQ29uZmxpY3RzKHJvdy5kb2MpKSB7XG4gICAgICAgICAgLy8gaWYgYW55IG9mIHRoZXNlIGNvbmRpdGlvbnMgYXBwbHksIHdlIG5lZWQgdG8gZmV0Y2ggdXNpbmcgZ2V0KClcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdHJpcCBfY29uZmxpY3RzIGFycmF5IHRvIGFwcGVhc2UgQ1NHICgjNTc5MylcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChyb3cuZG9jLl9jb25mbGljdHMpIHtcbiAgICAgICAgICBkZWxldGUgcm93LmRvYy5fY29uZmxpY3RzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIGRvYyB3ZSBnb3QgYmFjayBmcm9tIGFsbERvY3MoKSBpcyBzdWZmaWNpZW50XG4gICAgICAgIHJlc3VsdERvY3MucHVzaChyb3cuZG9jKTtcbiAgICAgICAgZGVsZXRlIGRpZmZzW3Jvdy5pZF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJldmlzaW9uT25lRG9jcygpIHtcbiAgICAvLyBmaWx0ZXIgb3V0IHRoZSBnZW5lcmF0aW9uIDEgZG9jcyBhbmQgZ2V0IHRoZW1cbiAgICAvLyBsZWF2aW5nIHRoZSBub24tZ2VuZXJhdGlvbiBvbmUgZG9jcyB0byBiZSBnb3Qgb3RoZXJ3aXNlXG4gICAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKGRpZmZzKS5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7XG4gICAgICB2YXIgbWlzc2luZyA9IGRpZmZzW2lkXS5taXNzaW5nO1xuICAgICAgcmV0dXJuIG1pc3NpbmcubGVuZ3RoID09PSAxICYmIGlzR2VuT25lJDEobWlzc2luZ1swXSk7XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmV0Y2hSZXZpc2lvbk9uZURvY3MoaWRzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXR1cm5SZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgb2s6b2ssIGRvY3M6cmVzdWx0RG9jcyB9O1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oZ2V0UmV2aXNpb25PbmVEb2NzKVxuICAgIC50aGVuKGdldEFsbERvY3MpXG4gICAgLnRoZW4ocmV0dXJuUmVzdWx0KTtcbn1cblxudmFyIENIRUNLUE9JTlRfVkVSU0lPTiA9IDE7XG52YXIgUkVQTElDQVRPUiA9IFwicG91Y2hkYlwiO1xuLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyIHRvIGxpbWl0IHRoZVxuLy8gYW1vdW50IG9mIHJlcGxpY2F0aW9uIGhpc3Rvcnkgd2Ugc2F2ZSBpbiB0aGUgY2hlY2twb2ludC5cbi8vIElmIHdlIHNhdmUgdG9vIG11Y2gsIHRoZSBjaGVja3BvaW5nIGRvY3Mgd2lsbCBiZWNvbWUgdmVyeSBiaWcsXG4vLyBpZiB3ZSBzYXZlIGZld2VyLCB3ZSdsbCBydW4gYSBncmVhdGVyIHJpc2sgb2YgaGF2aW5nIHRvXG4vLyByZWFkIGFsbCB0aGUgY2hhbmdlcyBmcm9tIDAgd2hlbiBjaGVja3BvaW50IFBVVHMgZmFpbFxuLy8gQ291Y2hEQiAyLjAgaGFzIGEgbW9yZSBpbnZvbHZlZCBoaXN0b3J5IHBydW5pbmcsXG4vLyBidXQgbGV0J3MgZ28gZm9yIHRoZSBzaW1wbGUgdmVyc2lvbiBmb3Igbm93LlxudmFyIENIRUNLUE9JTlRfSElTVE9SWV9TSVpFID0gNTtcbnZhciBMT1dFU1RfU0VRID0gMDtcblxuZnVuY3Rpb24gdXBkYXRlQ2hlY2twb2ludChkYiwgaWQsIGNoZWNrcG9pbnQsIHNlc3Npb24sIHJldHVyblZhbHVlKSB7XG4gIHJldHVybiBkYi5nZXQoaWQpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBpZiAoZGIuYWRhcHRlciA9PT0gJ2h0dHAnIHx8IGRiLmFkYXB0ZXIgPT09ICdodHRwcycpIHtcbiAgICAgICAgZXhwbGFpbkVycm9yKFxuICAgICAgICAgIDQwNCwgJ1BvdWNoREIgaXMganVzdCBjaGVja2luZyBpZiBhIHJlbW90ZSBjaGVja3BvaW50IGV4aXN0cy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uLFxuICAgICAgICBfaWQ6IGlkLFxuICAgICAgICBoaXN0b3J5OiBbXSxcbiAgICAgICAgcmVwbGljYXRvcjogUkVQTElDQVRPUixcbiAgICAgICAgdmVyc2lvbjogQ0hFQ0tQT0lOVF9WRVJTSU9OXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgY2hlY2twb2ludCBoYXMgbm90IGNoYW5nZWQsIGRvIG5vdCB1cGRhdGVcbiAgICBpZiAoZG9jLmxhc3Rfc2VxID09PSBjaGVja3BvaW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBjdXJyZW50IGVudHJ5IGZvciB0aGlzIHJlcGxpY2F0aW9uXG4gICAgZG9jLmhpc3RvcnkgPSAoZG9jLmhpc3RvcnkgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uc2Vzc2lvbl9pZCAhPT0gc2Vzc2lvbjtcbiAgICB9KTtcblxuICAgIC8vIEFkZCB0aGUgbGF0ZXN0IGNoZWNrcG9pbnQgdG8gaGlzdG9yeVxuICAgIGRvYy5oaXN0b3J5LnVuc2hpZnQoe1xuICAgICAgbGFzdF9zZXE6IGNoZWNrcG9pbnQsXG4gICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uXG4gICAgfSk7XG5cbiAgICAvLyBKdXN0IHRha2UgdGhlIGxhc3QgcGllY2VzIGluIGhpc3RvcnksIHRvXG4gICAgLy8gYXZvaWQgcmVhbGx5IGJpZyBjaGVja3BvaW50IGRvY3MuXG4gICAgLy8gc2VlIGNvbW1lbnQgb24gaGlzdG9yeSBzaXplIGFib3ZlXG4gICAgZG9jLmhpc3RvcnkgPSBkb2MuaGlzdG9yeS5zbGljZSgwLCBDSEVDS1BPSU5UX0hJU1RPUllfU0laRSk7XG5cbiAgICBkb2MudmVyc2lvbiA9IENIRUNLUE9JTlRfVkVSU0lPTjtcbiAgICBkb2MucmVwbGljYXRvciA9IFJFUExJQ0FUT1I7XG5cbiAgICBkb2Muc2Vzc2lvbl9pZCA9IHNlc3Npb247XG4gICAgZG9jLmxhc3Rfc2VxID0gY2hlY2twb2ludDtcblxuICAgIHJldHVybiBkYi5wdXQoZG9jKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgIC8vIHJldHJ5OyBzb21lb25lIGlzIHRyeWluZyB0byB3cml0ZSBhIGNoZWNrcG9pbnQgc2ltdWx0YW5lb3VzbHlcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNoZWNrcG9pbnQoZGIsIGlkLCBjaGVja3BvaW50LCBzZXNzaW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBDaGVja3BvaW50ZXIoc3JjLCB0YXJnZXQsIGlkLCByZXR1cm5WYWx1ZSwgb3B0cykge1xuICB0aGlzLnNyYyA9IHNyYztcbiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gIHRoaXMuaWQgPSBpZDtcbiAgdGhpcy5yZXR1cm5WYWx1ZSA9IHJldHVyblZhbHVlO1xuICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9O1xufVxuXG5DaGVja3BvaW50ZXIucHJvdG90eXBlLndyaXRlQ2hlY2twb2ludCA9IGZ1bmN0aW9uIChjaGVja3BvaW50LCBzZXNzaW9uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMudXBkYXRlVGFyZ2V0KGNoZWNrcG9pbnQsIHNlc3Npb24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzZWxmLnVwZGF0ZVNvdXJjZShjaGVja3BvaW50LCBzZXNzaW9uKTtcbiAgfSk7XG59O1xuXG5DaGVja3BvaW50ZXIucHJvdG90eXBlLnVwZGF0ZVRhcmdldCA9IGZ1bmN0aW9uIChjaGVja3BvaW50LCBzZXNzaW9uKSB7XG4gIGlmICh0aGlzLm9wdHMud3JpdGVUYXJnZXRDaGVja3BvaW50KSB7XG4gICAgcmV0dXJuIHVwZGF0ZUNoZWNrcG9pbnQodGhpcy50YXJnZXQsIHRoaXMuaWQsIGNoZWNrcG9pbnQsXG4gICAgICBzZXNzaW9uLCB0aGlzLnJldHVyblZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG59O1xuXG5DaGVja3BvaW50ZXIucHJvdG90eXBlLnVwZGF0ZVNvdXJjZSA9IGZ1bmN0aW9uIChjaGVja3BvaW50LCBzZXNzaW9uKSB7XG4gIGlmICh0aGlzLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiB1cGRhdGVDaGVja3BvaW50KHRoaXMuc3JjLCB0aGlzLmlkLCBjaGVja3BvaW50LFxuICAgICAgc2Vzc2lvbiwgdGhpcy5yZXR1cm5WYWx1ZSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChpc0ZvcmJpZGRlbkVycm9yKGVycikpIHtcbiAgICAgICAgICBzZWxmLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxufTtcblxudmFyIGNvbXBhcmlzb25zID0ge1xuICBcInVuZGVmaW5lZFwiOiBmdW5jdGlvbiAodGFyZ2V0RG9jLCBzb3VyY2VEb2MpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBwcmV2aW91cyBjb21wYXJpc29uIGZ1bmN0aW9uXG4gICAgaWYgKGNvbGxhdGUodGFyZ2V0RG9jLmxhc3Rfc2VxLCBzb3VyY2VEb2MubGFzdF9zZXEpID09PSAwKSB7XG4gICAgICByZXR1cm4gc291cmNlRG9jLmxhc3Rfc2VxO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiAwO1xuICB9LFxuICBcIjFcIjogZnVuY3Rpb24gKHRhcmdldERvYywgc291cmNlRG9jKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBwb3J0ZWQgZnJvbSBDb3VjaERCXG4gICAgcmV0dXJuIGNvbXBhcmVSZXBsaWNhdGlvbkxvZ3Moc291cmNlRG9jLCB0YXJnZXREb2MpLmxhc3Rfc2VxO1xuICB9XG59O1xuXG5DaGVja3BvaW50ZXIucHJvdG90eXBlLmdldENoZWNrcG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBpZiAoc2VsZi5vcHRzICYmIHNlbGYub3B0cy53cml0ZVNvdXJjZUNoZWNrcG9pbnQgJiYgIXNlbGYub3B0cy53cml0ZVRhcmdldENoZWNrcG9pbnQpIHtcbiAgICByZXR1cm4gc2VsZi5zcmMuZ2V0KHNlbGYuaWQpLnRoZW4oZnVuY3Rpb24gKHNvdXJjZURvYykge1xuICAgICAgcmV0dXJuIHNvdXJjZURvYy5sYXN0X3NlcSB8fCBMT1dFU1RfU0VRO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWxmLnRhcmdldC5nZXQoc2VsZi5pZCkudGhlbihmdW5jdGlvbiAodGFyZ2V0RG9jKSB7XG4gICAgaWYgKHNlbGYub3B0cyAmJiBzZWxmLm9wdHMud3JpdGVUYXJnZXRDaGVja3BvaW50ICYmICFzZWxmLm9wdHMud3JpdGVTb3VyY2VDaGVja3BvaW50KSB7XG4gICAgICByZXR1cm4gdGFyZ2V0RG9jLmxhc3Rfc2VxIHx8IExPV0VTVF9TRVE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGYuc3JjLmdldChzZWxmLmlkKS50aGVuKGZ1bmN0aW9uIChzb3VyY2VEb2MpIHtcbiAgICAgIC8vIFNpbmNlIHdlIGNhbid0IG1pZ3JhdGUgYW4gb2xkIHZlcnNpb24gZG9jIHRvIGEgbmV3IG9uZVxuICAgICAgLy8gKG5vIHNlc3Npb24gaWQpLCB3ZSBqdXN0IGdvIHdpdGggdGhlIGxvd2VzdCBzZXEgaW4gdGhpcyBjYXNlXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICh0YXJnZXREb2MudmVyc2lvbiAhPT0gc291cmNlRG9jLnZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgICB9XG5cbiAgICAgIHZhciB2ZXJzaW9uO1xuICAgICAgaWYgKHRhcmdldERvYy52ZXJzaW9uKSB7XG4gICAgICAgIHZlcnNpb24gPSB0YXJnZXREb2MudmVyc2lvbi50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmVyc2lvbiA9IFwidW5kZWZpbmVkXCI7XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJzaW9uIGluIGNvbXBhcmlzb25zKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJpc29uc1t2ZXJzaW9uXSh0YXJnZXREb2MsIHNvdXJjZURvYyk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuIExPV0VTVF9TRVE7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwNCAmJiB0YXJnZXREb2MubGFzdF9zZXEpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuc3JjLnB1dCh7XG4gICAgICAgICAgX2lkOiBzZWxmLmlkLFxuICAgICAgICAgIGxhc3Rfc2VxOiBMT1dFU1RfU0VRXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGlzRm9yYmlkZGVuRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgc2VsZi5vcHRzLndyaXRlU291cmNlQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldERvYy5sYXN0X3NlcTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICByZXR1cm4gTE9XRVNUX1NFUTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBMT1dFU1RfU0VRO1xuICB9KTtcbn07XG4vLyBUaGlzIGNoZWNrcG9pbnQgY29tcGFyaXNvbiBpcyBwb3J0ZWQgZnJvbSBDb3VjaERCcyBzb3VyY2Vcbi8vIHRoZXkgY29tZSBmcm9tIGhlcmU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvdWNoZGItY291Y2gtcmVwbGljYXRvci9ibG9iL21hc3Rlci9zcmMvY291Y2hfcmVwbGljYXRvci5lcmwjTDg2My1MOTA2XG5cbmZ1bmN0aW9uIGNvbXBhcmVSZXBsaWNhdGlvbkxvZ3Moc3JjRG9jLCB0Z3REb2MpIHtcbiAgaWYgKHNyY0RvYy5zZXNzaW9uX2lkID09PSB0Z3REb2Muc2Vzc2lvbl9pZCkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X3NlcTogc3JjRG9jLmxhc3Rfc2VxLFxuICAgICAgaGlzdG9yeTogc3JjRG9jLmhpc3RvcnlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGNvbXBhcmVSZXBsaWNhdGlvbkhpc3Rvcnkoc3JjRG9jLmhpc3RvcnksIHRndERvYy5oaXN0b3J5KTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVJlcGxpY2F0aW9uSGlzdG9yeShzb3VyY2VIaXN0b3J5LCB0YXJnZXRIaXN0b3J5KSB7XG4gIC8vIHRoZSBlcmxhbmcgbG9vcCB2aWEgZnVuY3Rpb24gYXJndW1lbnRzIGlzIG5vdCBzbyBlYXN5IHRvIHJlcGVhdCBpbiBKU1xuICAvLyB0aGVyZWZvcmUsIGRvaW5nIHRoaXMgYXMgcmVjdXJzaW9uXG4gIHZhciBTID0gc291cmNlSGlzdG9yeVswXTtcbiAgdmFyIHNvdXJjZVJlc3QgPSBzb3VyY2VIaXN0b3J5LnNsaWNlKDEpO1xuICB2YXIgVCA9IHRhcmdldEhpc3RvcnlbMF07XG4gIHZhciB0YXJnZXRSZXN0ID0gdGFyZ2V0SGlzdG9yeS5zbGljZSgxKTtcblxuICBpZiAoIVMgfHwgdGFyZ2V0SGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9zZXE6IExPV0VTVF9TRVEsXG4gICAgICBoaXN0b3J5OiBbXVxuICAgIH07XG4gIH1cblxuICB2YXIgc291cmNlSWQgPSBTLnNlc3Npb25faWQ7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoaGFzU2Vzc2lvbklkKHNvdXJjZUlkLCB0YXJnZXRIaXN0b3J5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X3NlcTogUy5sYXN0X3NlcSxcbiAgICAgIGhpc3Rvcnk6IHNvdXJjZUhpc3RvcnlcbiAgICB9O1xuICB9XG5cbiAgdmFyIHRhcmdldElkID0gVC5zZXNzaW9uX2lkO1xuICBpZiAoaGFzU2Vzc2lvbklkKHRhcmdldElkLCBzb3VyY2VSZXN0KSkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X3NlcTogVC5sYXN0X3NlcSxcbiAgICAgIGhpc3Rvcnk6IHRhcmdldFJlc3RcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGNvbXBhcmVSZXBsaWNhdGlvbkhpc3Rvcnkoc291cmNlUmVzdCwgdGFyZ2V0UmVzdCk7XG59XG5cbmZ1bmN0aW9uIGhhc1Nlc3Npb25JZChzZXNzaW9uSWQsIGhpc3RvcnkpIHtcbiAgdmFyIHByb3BzID0gaGlzdG9yeVswXTtcbiAgdmFyIHJlc3QgPSBoaXN0b3J5LnNsaWNlKDEpO1xuXG4gIGlmICghc2Vzc2lvbklkIHx8IGhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHNlc3Npb25JZCA9PT0gcHJvcHMuc2Vzc2lvbl9pZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGhhc1Nlc3Npb25JZChzZXNzaW9uSWQsIHJlc3QpO1xufVxuXG5mdW5jdGlvbiBpc0ZvcmJpZGRlbkVycm9yKGVycikge1xuICByZXR1cm4gdHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInICYmIE1hdGguZmxvb3IoZXJyLnN0YXR1cyAvIDEwMCkgPT09IDQ7XG59XG5cbnZhciBTVEFSVElOR19CQUNLX09GRiA9IDA7XG5cbmZ1bmN0aW9uIGJhY2tPZmYob3B0cywgcmV0dXJuVmFsdWUsIGVycm9yLCBjYWxsYmFjaykge1xuICBpZiAob3B0cy5yZXRyeSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm5WYWx1ZS5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICByZXR1cm5WYWx1ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2Ygb3B0cy5iYWNrX29mZl9mdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdHMuYmFja19vZmZfZnVuY3Rpb24gPSBkZWZhdWx0QmFja09mZjtcbiAgfVxuICByZXR1cm5WYWx1ZS5lbWl0KCdyZXF1ZXN0RXJyb3InLCBlcnJvcik7XG4gIGlmIChyZXR1cm5WYWx1ZS5zdGF0ZSA9PT0gJ2FjdGl2ZScgfHwgcmV0dXJuVmFsdWUuc3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgIHJldHVyblZhbHVlLmVtaXQoJ3BhdXNlZCcsIGVycm9yKTtcbiAgICByZXR1cm5WYWx1ZS5zdGF0ZSA9ICdzdG9wcGVkJztcbiAgICB2YXIgYmFja09mZlNldCA9IGZ1bmN0aW9uIGJhY2tvZmZUaW1lU2V0KCkge1xuICAgICAgb3B0cy5jdXJyZW50X2JhY2tfb2ZmID0gU1RBUlRJTkdfQkFDS19PRkY7XG4gICAgfTtcbiAgICB2YXIgcmVtb3ZlQmFja09mZlNldHRlciA9IGZ1bmN0aW9uIHJlbW92ZUJhY2tPZmZUaW1lU2V0KCkge1xuICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlTGlzdGVuZXIoJ2FjdGl2ZScsIGJhY2tPZmZTZXQpO1xuICAgIH07XG4gICAgcmV0dXJuVmFsdWUub25jZSgncGF1c2VkJywgcmVtb3ZlQmFja09mZlNldHRlcik7XG4gICAgcmV0dXJuVmFsdWUub25jZSgnYWN0aXZlJywgYmFja09mZlNldCk7XG4gIH1cblxuICBvcHRzLmN1cnJlbnRfYmFja19vZmYgPSBvcHRzLmN1cnJlbnRfYmFja19vZmYgfHwgU1RBUlRJTkdfQkFDS19PRkY7XG4gIG9wdHMuY3VycmVudF9iYWNrX29mZiA9IG9wdHMuYmFja19vZmZfZnVuY3Rpb24ob3B0cy5jdXJyZW50X2JhY2tfb2ZmKTtcbiAgc2V0VGltZW91dChjYWxsYmFjaywgb3B0cy5jdXJyZW50X2JhY2tfb2ZmKTtcbn1cblxuZnVuY3Rpb24gc29ydE9iamVjdFByb3BlcnRpZXNCeUtleShxdWVyeVBhcmFtcykge1xuICByZXR1cm4gT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLnNvcnQoY29sbGF0ZSkucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuICAgIHJlc3VsdFtrZXldID0gcXVlcnlQYXJhbXNba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbi8vIEdlbmVyYXRlIGEgdW5pcXVlIGlkIHBhcnRpY3VsYXIgdG8gdGhpcyByZXBsaWNhdGlvbi5cbi8vIE5vdCBndWFyYW50ZWVkIHRvIGFsaWduIHBlcmZlY3RseSB3aXRoIENvdWNoREIncyByZXAgaWRzLlxuZnVuY3Rpb24gZ2VuZXJhdGVSZXBsaWNhdGlvbklkKHNyYywgdGFyZ2V0LCBvcHRzKSB7XG4gIHZhciBkb2NJZHMgPSBvcHRzLmRvY19pZHMgPyBvcHRzLmRvY19pZHMuc29ydChjb2xsYXRlKSA6ICcnO1xuICB2YXIgZmlsdGVyRnVuID0gb3B0cy5maWx0ZXIgPyBvcHRzLmZpbHRlci50b1N0cmluZygpIDogJyc7XG4gIHZhciBxdWVyeVBhcmFtcyA9ICcnO1xuICB2YXIgZmlsdGVyVmlld05hbWUgPSAgJyc7XG4gIHZhciBzZWxlY3RvciA9ICcnO1xuXG4gIC8vIHBvc3NpYmlsaXR5IGZvciBjaGVja3BvaW50cyB0byBiZSBsb3N0IGhlcmUgYXMgYmVoYXZpb3VyIG9mXG4gIC8vIEpTT04uc3RyaW5naWZ5IGlzIG5vdCBzdGFibGUgKHNlZSAjNjIyNilcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChvcHRzLnNlbGVjdG9yKSB7XG4gICAgc2VsZWN0b3IgPSBKU09OLnN0cmluZ2lmeShvcHRzLnNlbGVjdG9yKTtcbiAgfVxuXG4gIGlmIChvcHRzLmZpbHRlciAmJiBvcHRzLnF1ZXJ5X3BhcmFtcykge1xuICAgIHF1ZXJ5UGFyYW1zID0gSlNPTi5zdHJpbmdpZnkoc29ydE9iamVjdFByb3BlcnRpZXNCeUtleShvcHRzLnF1ZXJ5X3BhcmFtcykpO1xuICB9XG5cbiAgaWYgKG9wdHMuZmlsdGVyICYmIG9wdHMuZmlsdGVyID09PSAnX3ZpZXcnKSB7XG4gICAgZmlsdGVyVmlld05hbWUgPSBvcHRzLnZpZXcudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChbc3JjLmlkKCksIHRhcmdldC5pZCgpXSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgdmFyIHF1ZXJ5RGF0YSA9IHJlc1swXSArIHJlc1sxXSArIGZpbHRlckZ1biArIGZpbHRlclZpZXdOYW1lICtcbiAgICAgIHF1ZXJ5UGFyYW1zICsgZG9jSWRzICsgc2VsZWN0b3I7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBiaW5hcnlNZDUocXVlcnlEYXRhLCByZXNvbHZlKTtcbiAgICB9KTtcbiAgfSkudGhlbihmdW5jdGlvbiAobWQ1c3VtKSB7XG4gICAgLy8gY2FuJ3QgdXNlIHN0cmFpZ2h0LXVwIG1kNSBhbHBoYWJldCwgYmVjYXVzZVxuICAgIC8vIHRoZSBjaGFyICcvJyBpcyBpbnRlcnByZXRlZCBhcyBiZWluZyBmb3IgYXR0YWNobWVudHMsXG4gICAgLy8gYW5kICsgaXMgYWxzbyBub3QgdXJsLXNhZmVcbiAgICBtZDVzdW0gPSBtZDVzdW0ucmVwbGFjZSgvXFwvL2csICcuJykucmVwbGFjZSgvXFwrL2csICdfJyk7XG4gICAgcmV0dXJuICdfbG9jYWwvJyArIG1kNXN1bTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcGxpY2F0ZShzcmMsIHRhcmdldCwgb3B0cywgcmV0dXJuVmFsdWUsIHJlc3VsdCkge1xuICB2YXIgYmF0Y2hlcyA9IFtdOyAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYmF0Y2hlcyB0byBiZSBwcm9jZXNzZWRcbiAgdmFyIGN1cnJlbnRCYXRjaDsgICAgICAgICAgICAgICAvLyB0aGUgYmF0Y2ggY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZFxuICB2YXIgcGVuZGluZ0JhdGNoID0ge1xuICAgIHNlcTogMCxcbiAgICBjaGFuZ2VzOiBbXSxcbiAgICBkb2NzOiBbXVxuICB9OyAvLyBuZXh0IGJhdGNoLCBub3QgeWV0IHJlYWR5IHRvIGJlIHByb2Nlc3NlZFxuICB2YXIgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTsgIC8vIHRydWUgd2hpbGUgY2hlY2twb2ludCBpcyBiZWluZyB3cml0dGVuXG4gIHZhciBjaGFuZ2VzQ29tcGxldGVkID0gZmFsc2U7ICAgLy8gdHJ1ZSB3aGVuIGFsbCBjaGFuZ2VzIHJlY2VpdmVkXG4gIHZhciByZXBsaWNhdGlvbkNvbXBsZXRlZCA9IGZhbHNlOyAvLyB0cnVlIHdoZW4gcmVwbGljYXRpb24gaGFzIGNvbXBsZXRlZFxuICB2YXIgbGFzdF9zZXEgPSAwO1xuICB2YXIgY29udGludW91cyA9IG9wdHMuY29udGludW91cyB8fCBvcHRzLmxpdmUgfHwgZmFsc2U7XG4gIHZhciBiYXRjaF9zaXplID0gb3B0cy5iYXRjaF9zaXplIHx8IDEwMDtcbiAgdmFyIGJhdGNoZXNfbGltaXQgPSBvcHRzLmJhdGNoZXNfbGltaXQgfHwgMTA7XG4gIHZhciBzdHlsZSA9IG9wdHMuc3R5bGUgfHwgJ2FsbF9kb2NzJztcbiAgdmFyIGNoYW5nZXNQZW5kaW5nID0gZmFsc2U7ICAgICAvLyB0cnVlIHdoaWxlIHNyYy5jaGFuZ2VzIGlzIHJ1bm5pbmdcbiAgdmFyIGRvY19pZHMgPSBvcHRzLmRvY19pZHM7XG4gIHZhciBzZWxlY3RvciA9IG9wdHMuc2VsZWN0b3I7XG4gIHZhciByZXBJZDtcbiAgdmFyIGNoZWNrcG9pbnRlcjtcbiAgdmFyIGNoYW5nZWREb2NzID0gW107XG4gIC8vIExpa2UgY291Y2hkYiwgZXZlcnkgcmVwbGljYXRpb24gZ2V0cyBhIHVuaXF1ZSBzZXNzaW9uIGlkXG4gIHZhciBzZXNzaW9uID0gdXVpZCgpO1xuXG4gIHJlc3VsdCA9IHJlc3VsdCB8fCB7XG4gICAgb2s6IHRydWUsXG4gICAgc3RhcnRfdGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGRvY3NfcmVhZDogMCxcbiAgICBkb2NzX3dyaXR0ZW46IDAsXG4gICAgZG9jX3dyaXRlX2ZhaWx1cmVzOiAwLFxuICAgIGVycm9yczogW11cbiAgfTtcblxuICB2YXIgY2hhbmdlc09wdHMgPSB7fTtcbiAgcmV0dXJuVmFsdWUucmVhZHkoc3JjLCB0YXJnZXQpO1xuXG4gIGZ1bmN0aW9uIGluaXRDaGVja3BvaW50ZXIoKSB7XG4gICAgaWYgKGNoZWNrcG9pbnRlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZ2VuZXJhdGVSZXBsaWNhdGlvbklkKHNyYywgdGFyZ2V0LCBvcHRzKS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHJlcElkID0gcmVzO1xuXG4gICAgICB2YXIgY2hlY2twb2ludE9wdHMgPSB7fTtcbiAgICAgIGlmIChvcHRzLmNoZWNrcG9pbnQgPT09IGZhbHNlKSB7XG4gICAgICAgIGNoZWNrcG9pbnRPcHRzID0geyB3cml0ZVNvdXJjZUNoZWNrcG9pbnQ6IGZhbHNlLCB3cml0ZVRhcmdldENoZWNrcG9pbnQ6IGZhbHNlIH07XG4gICAgICB9IGVsc2UgaWYgKG9wdHMuY2hlY2twb2ludCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgY2hlY2twb2ludE9wdHMgPSB7IHdyaXRlU291cmNlQ2hlY2twb2ludDogdHJ1ZSwgd3JpdGVUYXJnZXRDaGVja3BvaW50OiBmYWxzZSB9O1xuICAgICAgfSBlbHNlIGlmIChvcHRzLmNoZWNrcG9pbnQgPT09ICd0YXJnZXQnKSB7XG4gICAgICAgIGNoZWNrcG9pbnRPcHRzID0geyB3cml0ZVNvdXJjZUNoZWNrcG9pbnQ6IGZhbHNlLCB3cml0ZVRhcmdldENoZWNrcG9pbnQ6IHRydWUgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrcG9pbnRPcHRzID0geyB3cml0ZVNvdXJjZUNoZWNrcG9pbnQ6IHRydWUsIHdyaXRlVGFyZ2V0Q2hlY2twb2ludDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICBjaGVja3BvaW50ZXIgPSBuZXcgQ2hlY2twb2ludGVyKHNyYywgdGFyZ2V0LCByZXBJZCwgcmV0dXJuVmFsdWUsIGNoZWNrcG9pbnRPcHRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlRG9jcygpIHtcbiAgICBjaGFuZ2VkRG9jcyA9IFtdO1xuXG4gICAgaWYgKGN1cnJlbnRCYXRjaC5kb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZG9jcyA9IGN1cnJlbnRCYXRjaC5kb2NzO1xuICAgIHZhciBidWxrT3B0cyA9IHt0aW1lb3V0OiBvcHRzLnRpbWVvdXR9O1xuICAgIHJldHVybiB0YXJnZXQuYnVsa0RvY3Moe2RvY3M6IGRvY3MsIG5ld19lZGl0czogZmFsc2V9LCBidWxrT3B0cykudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBgcmVzYCBkb2Vzbid0IGluY2x1ZGUgZnVsbCBkb2N1bWVudHMgKHdoaWNoIGxpdmUgaW4gYGRvY3NgKSwgc28gd2UgY3JlYXRlIGEgbWFwIG9mXG4gICAgICAvLyAoaWQgLT4gZXJyb3IpLCBhbmQgY2hlY2sgZm9yIGVycm9ycyB3aGlsZSBpdGVyYXRpbmcgb3ZlciBgZG9jc2BcbiAgICAgIHZhciBlcnJvcnNCeUlkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgaWYgKHJlcy5lcnJvcikge1xuICAgICAgICAgIGVycm9yc0J5SWRbcmVzLmlkXSA9IHJlcztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBlcnJvcnNObyA9IE9iamVjdC5rZXlzKGVycm9yc0J5SWQpLmxlbmd0aDtcbiAgICAgIHJlc3VsdC5kb2Nfd3JpdGVfZmFpbHVyZXMgKz0gZXJyb3JzTm87XG4gICAgICByZXN1bHQuZG9jc193cml0dGVuICs9IGRvY3MubGVuZ3RoIC0gZXJyb3JzTm87XG5cbiAgICAgIGRvY3MuZm9yRWFjaChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIHZhciBlcnJvciA9IGVycm9yc0J5SWRbZG9jLl9pZF07XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgLy8gTm9ybWFsaXplIGVycm9yIG5hbWUuIGkuZS4gJ1VuYXV0aG9yaXplZCcgLT4gJ3VuYXV0aG9yaXplZCcgKGVnIFN5bmMgR2F0ZXdheSlcbiAgICAgICAgICB2YXIgZXJyb3JOYW1lID0gKGVycm9yLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGVycm9yTmFtZSA9PT0gJ3VuYXV0aG9yaXplZCcgfHwgZXJyb3JOYW1lID09PSAnZm9yYmlkZGVuJykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnZGVuaWVkJywgY2xvbmUoZXJyb3IpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYW5nZWREb2NzLnB1c2goZG9jKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXN1bHQuZG9jX3dyaXRlX2ZhaWx1cmVzICs9IGRvY3MubGVuZ3RoO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluaXNoQmF0Y2goKSB7XG4gICAgaWYgKGN1cnJlbnRCYXRjaC5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSB3YXMgYSBwcm9ibGVtIGdldHRpbmcgZG9jcy4nKTtcbiAgICB9XG4gICAgcmVzdWx0Lmxhc3Rfc2VxID0gbGFzdF9zZXEgPSBjdXJyZW50QmF0Y2guc2VxO1xuICAgIHZhciBvdXRSZXN1bHQgPSBjbG9uZShyZXN1bHQpO1xuICAgIGlmIChjaGFuZ2VkRG9jcy5sZW5ndGgpIHtcbiAgICAgIG91dFJlc3VsdC5kb2NzID0gY2hhbmdlZERvY3M7XG4gICAgICAvLyBBdHRhY2ggJ3BlbmRpbmcnIHByb3BlcnR5IGlmIHNlcnZlciBzdXBwb3J0cyBpdCAoQ291Y2hEQiAyLjArKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnRCYXRjaC5wZW5kaW5nID09PSAnbnVtYmVyJykge1xuICAgICAgICBvdXRSZXN1bHQucGVuZGluZyA9IGN1cnJlbnRCYXRjaC5wZW5kaW5nO1xuICAgICAgICBkZWxldGUgY3VycmVudEJhdGNoLnBlbmRpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGFuZ2UnLCBvdXRSZXN1bHQpO1xuICAgIH1cbiAgICB3cml0aW5nQ2hlY2twb2ludCA9IHRydWU7XG4gICAgcmV0dXJuIGNoZWNrcG9pbnRlci53cml0ZUNoZWNrcG9pbnQoY3VycmVudEJhdGNoLnNlcSxcbiAgICAgICAgc2Vzc2lvbikudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm5WYWx1ZS5lbWl0KCdjaGVja3BvaW50JywgeyAnY2hlY2twb2ludCc6IGN1cnJlbnRCYXRjaC5zZXEgfSk7XG4gICAgICB3cml0aW5nQ2hlY2twb2ludCA9IGZhbHNlO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgIGdldENoYW5nZXMoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBvbkNoZWNrcG9pbnRFcnJvcihlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlmZnMoKSB7XG4gICAgdmFyIGRpZmYgPSB7fTtcbiAgICBjdXJyZW50QmF0Y2guY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2NoZWNrcG9pbnQnLCB7ICdyZXZzX2RpZmYnOiBjaGFuZ2UgfSk7XG4gICAgICAvLyBDb3VjaGJhc2UgU3luYyBHYXRld2F5IGVtaXRzIHRoZXNlLCBidXQgd2UgY2FuIGlnbm9yZSB0aGVtXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChjaGFuZ2UuaWQgPT09IFwiX3VzZXIvXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGlmZltjaGFuZ2UuaWRdID0gY2hhbmdlLmNoYW5nZXMubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4LnJldjtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQucmV2c0RpZmYoZGlmZikudGhlbihmdW5jdGlvbiAoZGlmZnMpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG4gICAgICB9XG4gICAgICAvLyBjdXJyZW50QmF0Y2guZGlmZnMgZWxlbWVudHMgYXJlIGRlbGV0ZWQgYXMgdGhlIGRvY3VtZW50cyBhcmUgd3JpdHRlblxuICAgICAgY3VycmVudEJhdGNoLmRpZmZzID0gZGlmZnM7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCYXRjaERvY3MoKSB7XG4gICAgcmV0dXJuIGdldERvY3Moc3JjLCB0YXJnZXQsIGN1cnJlbnRCYXRjaC5kaWZmcywgcmV0dXJuVmFsdWUpLnRoZW4oZnVuY3Rpb24gKGdvdCkge1xuICAgICAgY3VycmVudEJhdGNoLmVycm9yID0gIWdvdC5vaztcbiAgICAgIGdvdC5kb2NzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgICAgICBkZWxldGUgY3VycmVudEJhdGNoLmRpZmZzW2RvYy5faWRdO1xuICAgICAgICByZXN1bHQuZG9jc19yZWFkKys7XG4gICAgICAgIGN1cnJlbnRCYXRjaC5kb2NzLnB1c2goZG9jKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnROZXh0QmF0Y2goKSB7XG4gICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCB8fCBjdXJyZW50QmF0Y2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGJhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBwcm9jZXNzUGVuZGluZ0JhdGNoKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdXJyZW50QmF0Y2ggPSBiYXRjaGVzLnNoaWZ0KCk7XG4gICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hlY2twb2ludCcsIHsgJ3N0YXJ0X25leHRfYmF0Y2gnOiBjdXJyZW50QmF0Y2guc2VxIH0pO1xuICAgIGdldERpZmZzKClcbiAgICAgIC50aGVuKGdldEJhdGNoRG9jcylcbiAgICAgIC50aGVuKHdyaXRlRG9jcylcbiAgICAgIC50aGVuKGZpbmlzaEJhdGNoKVxuICAgICAgLnRoZW4oc3RhcnROZXh0QmF0Y2gpXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBhYm9ydFJlcGxpY2F0aW9uKCdiYXRjaCBwcm9jZXNzaW5nIHRlcm1pbmF0ZWQgd2l0aCBlcnJvcicsIGVycik7XG4gICAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc1BlbmRpbmdCYXRjaChpbW1lZGlhdGUkJDEpIHtcbiAgICBpZiAocGVuZGluZ0JhdGNoLmNoYW5nZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYmF0Y2hlcy5sZW5ndGggPT09IDAgJiYgIWN1cnJlbnRCYXRjaCkge1xuICAgICAgICBpZiAoKGNvbnRpbnVvdXMgJiYgY2hhbmdlc09wdHMubGl2ZSkgfHwgY2hhbmdlc0NvbXBsZXRlZCkge1xuICAgICAgICAgIHJldHVyblZhbHVlLnN0YXRlID0gJ3BlbmRpbmcnO1xuICAgICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ3BhdXNlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzQ29tcGxldGVkKSB7XG4gICAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGltbWVkaWF0ZSQkMSB8fFxuICAgICAgY2hhbmdlc0NvbXBsZXRlZCB8fFxuICAgICAgcGVuZGluZ0JhdGNoLmNoYW5nZXMubGVuZ3RoID49IGJhdGNoX3NpemVcbiAgICApIHtcbiAgICAgIGJhdGNoZXMucHVzaChwZW5kaW5nQmF0Y2gpO1xuICAgICAgcGVuZGluZ0JhdGNoID0ge1xuICAgICAgICBzZXE6IDAsXG4gICAgICAgIGNoYW5nZXM6IFtdLFxuICAgICAgICBkb2NzOiBbXVxuICAgICAgfTtcbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5zdGF0ZSA9PT0gJ3BlbmRpbmcnIHx8IHJldHVyblZhbHVlLnN0YXRlID09PSAnc3RvcHBlZCcpIHtcbiAgICAgICAgcmV0dXJuVmFsdWUuc3RhdGUgPSAnYWN0aXZlJztcbiAgICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnYWN0aXZlJyk7XG4gICAgICB9XG4gICAgICBzdGFydE5leHRCYXRjaCgpO1xuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gYWJvcnRSZXBsaWNhdGlvbihyZWFzb24sIGVycikge1xuICAgIGlmIChyZXBsaWNhdGlvbkNvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWVyci5tZXNzYWdlKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IHJlYXNvbjtcbiAgICB9XG4gICAgcmVzdWx0Lm9rID0gZmFsc2U7XG4gICAgcmVzdWx0LnN0YXR1cyA9ICdhYm9ydGluZyc7XG4gICAgYmF0Y2hlcyA9IFtdO1xuICAgIHBlbmRpbmdCYXRjaCA9IHtcbiAgICAgIHNlcTogMCxcbiAgICAgIGNoYW5nZXM6IFtdLFxuICAgICAgZG9jczogW11cbiAgICB9O1xuICAgIGNvbXBsZXRlUmVwbGljYXRpb24oZXJyKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gY29tcGxldGVSZXBsaWNhdGlvbihmYXRhbEVycm9yKSB7XG4gICAgaWYgKHJlcGxpY2F0aW9uQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgIHJlc3VsdC5zdGF0dXMgPSAnY2FuY2VsbGVkJztcbiAgICAgIGlmICh3cml0aW5nQ2hlY2twb2ludCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5zdGF0dXMgPSByZXN1bHQuc3RhdHVzIHx8ICdjb21wbGV0ZSc7XG4gICAgcmVzdWx0LmVuZF90aW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIHJlc3VsdC5sYXN0X3NlcSA9IGxhc3Rfc2VxO1xuICAgIHJlcGxpY2F0aW9uQ29tcGxldGVkID0gdHJ1ZTtcblxuICAgIGlmIChmYXRhbEVycm9yKSB7XG4gICAgICAvLyBuZWVkIHRvIGV4dGVuZCB0aGUgZXJyb3IgYmVjYXVzZSBGaXJlZm94IGNvbnNpZGVycyBcIi5yZXN1bHRcIiByZWFkLW9ubHlcbiAgICAgIGZhdGFsRXJyb3IgPSBjcmVhdGVFcnJvcihmYXRhbEVycm9yKTtcbiAgICAgIGZhdGFsRXJyb3IucmVzdWx0ID0gcmVzdWx0O1xuXG4gICAgICAvLyBOb3JtYWxpemUgZXJyb3IgbmFtZS4gaS5lLiAnVW5hdXRob3JpemVkJyAtPiAndW5hdXRob3JpemVkJyAoZWcgU3luYyBHYXRld2F5KVxuICAgICAgdmFyIGVycm9yTmFtZSA9IChmYXRhbEVycm9yLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoZXJyb3JOYW1lID09PSAndW5hdXRob3JpemVkJyB8fCBlcnJvck5hbWUgPT09ICdmb3JiaWRkZW4nKSB7XG4gICAgICAgIHJldHVyblZhbHVlLmVtaXQoJ2Vycm9yJywgZmF0YWxFcnJvcik7XG4gICAgICAgIHJldHVyblZhbHVlLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFja09mZihvcHRzLCByZXR1cm5WYWx1ZSwgZmF0YWxFcnJvciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlcGxpY2F0ZShzcmMsIHRhcmdldCwgb3B0cywgcmV0dXJuVmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuVmFsdWUuZW1pdCgnY29tcGxldGUnLCByZXN1bHQpO1xuICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBvbkNoYW5nZShjaGFuZ2UsIHBlbmRpbmcsIGxhc3RTZXEpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm4gY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgIH1cbiAgICAvLyBBdHRhY2ggJ3BlbmRpbmcnIHByb3BlcnR5IGlmIHNlcnZlciBzdXBwb3J0cyBpdCAoQ291Y2hEQiAyLjArKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0eXBlb2YgcGVuZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHBlbmRpbmdCYXRjaC5wZW5kaW5nID0gcGVuZGluZztcbiAgICB9XG5cbiAgICB2YXIgZmlsdGVyID0gZmlsdGVyQ2hhbmdlKG9wdHMpKGNoYW5nZSk7XG4gICAgaWYgKCFmaWx0ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGVuZGluZ0JhdGNoLnNlcSA9IGNoYW5nZS5zZXEgfHwgbGFzdFNlcTtcbiAgICBwZW5kaW5nQmF0Y2guY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgcmV0dXJuVmFsdWUuZW1pdCgnY2hlY2twb2ludCcsIHsgJ3BlbmRpbmdfYmF0Y2gnOiBwZW5kaW5nQmF0Y2guc2VxIH0pO1xuICAgIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzUGVuZGluZ0JhdGNoKGJhdGNoZXMubGVuZ3RoID09PSAwICYmIGNoYW5nZXNPcHRzLmxpdmUpO1xuICAgIH0pO1xuICB9XG5cblxuICBmdW5jdGlvbiBvbkNoYW5nZXNDb21wbGV0ZShjaGFuZ2VzKSB7XG4gICAgY2hhbmdlc1BlbmRpbmcgPSBmYWxzZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm4gY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIGlmIG5vIHJlc3VsdHMgd2VyZSByZXR1cm5lZCB0aGVuIHdlJ3JlIGRvbmUsXG4gICAgLy8gZWxzZSBmZXRjaCBtb3JlXG4gICAgaWYgKGNoYW5nZXMucmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzT3B0cy5zaW5jZSA9IGNoYW5nZXMucmVzdWx0c1tjaGFuZ2VzLnJlc3VsdHMubGVuZ3RoIC0gMV0uc2VxO1xuICAgICAgZ2V0Q2hhbmdlcygpO1xuICAgICAgcHJvY2Vzc1BlbmRpbmdCYXRjaCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjb250aW51b3VzKSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMubGl2ZSA9IHRydWU7XG4gICAgICAgICAgZ2V0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYW5nZXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQZW5kaW5nQmF0Y2godHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIGNoZWNrcG9pbnQgc28gd2Ugc3RhcnQgZnJvbSB0aGUgcmlnaHQgc2VxIG5leHQgdGltZVxuICAgICAgaWYgKCFjdXJyZW50QmF0Y2ggJiYgY2hhbmdlcy5yZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB3cml0aW5nQ2hlY2twb2ludCA9IHRydWU7XG4gICAgICAgIGNoZWNrcG9pbnRlci53cml0ZUNoZWNrcG9pbnQoY2hhbmdlcy5sYXN0X3NlcSxcbiAgICAgICAgICAgIHNlc3Npb24pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0Lmxhc3Rfc2VxID0gbGFzdF9zZXEgPSBjaGFuZ2VzLmxhc3Rfc2VxO1xuICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChvbkNoZWNrcG9pbnRFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25DaGFuZ2VzRXJyb3IoZXJyKSB7XG4gICAgY2hhbmdlc1BlbmRpbmcgPSBmYWxzZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm4gY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgIH1cbiAgICBhYm9ydFJlcGxpY2F0aW9uKCdjaGFuZ2VzIHJlamVjdGVkJywgZXJyKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gZ2V0Q2hhbmdlcygpIHtcbiAgICBpZiAoIShcbiAgICAgICFjaGFuZ2VzUGVuZGluZyAmJlxuICAgICAgIWNoYW5nZXNDb21wbGV0ZWQgJiZcbiAgICAgIGJhdGNoZXMubGVuZ3RoIDwgYmF0Y2hlc19saW1pdFxuICAgICAgKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjaGFuZ2VzUGVuZGluZyA9IHRydWU7XG4gICAgZnVuY3Rpb24gYWJvcnRDaGFuZ2VzKCkge1xuICAgICAgY2hhbmdlcy5jYW5jZWwoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoKSB7XG4gICAgICByZXR1cm5WYWx1ZS5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgYWJvcnRDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuVmFsdWUuX2NoYW5nZXMpIHsgLy8gcmVtb3ZlIG9sZCBjaGFuZ2VzKCkgYW5kIGxpc3RlbmVyc1xuICAgICAgcmV0dXJuVmFsdWUucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIHJldHVyblZhbHVlLl9hYm9ydENoYW5nZXMpO1xuICAgICAgcmV0dXJuVmFsdWUuX2NoYW5nZXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIHJldHVyblZhbHVlLm9uY2UoJ2NhbmNlbCcsIGFib3J0Q2hhbmdlcyk7XG5cbiAgICB2YXIgY2hhbmdlcyA9IHNyYy5jaGFuZ2VzKGNoYW5nZXNPcHRzKVxuICAgICAgLm9uKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gICAgY2hhbmdlcy50aGVuKHJlbW92ZUxpc3RlbmVyLCByZW1vdmVMaXN0ZW5lcik7XG4gICAgY2hhbmdlcy50aGVuKG9uQ2hhbmdlc0NvbXBsZXRlKVxuICAgICAgLmNhdGNoKG9uQ2hhbmdlc0Vycm9yKTtcblxuICAgIGlmIChvcHRzLnJldHJ5KSB7XG4gICAgICAvLyBzYXZlIGZvciBsYXRlciBzbyB3ZSBjYW4gY2FuY2VsIGlmIG5lY2Vzc2FyeVxuICAgICAgcmV0dXJuVmFsdWUuX2NoYW5nZXMgPSBjaGFuZ2VzO1xuICAgICAgcmV0dXJuVmFsdWUuX2Fib3J0Q2hhbmdlcyA9IGFib3J0Q2hhbmdlcztcbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHN0YXJ0Q2hhbmdlcygpIHtcbiAgICBpbml0Q2hlY2twb2ludGVyKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChyZXR1cm5WYWx1ZS5jYW5jZWxsZWQpIHtcbiAgICAgICAgY29tcGxldGVSZXBsaWNhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2twb2ludGVyLmdldENoZWNrcG9pbnQoKS50aGVuKGZ1bmN0aW9uIChjaGVja3BvaW50KSB7XG4gICAgICAgIGxhc3Rfc2VxID0gY2hlY2twb2ludDtcbiAgICAgICAgY2hhbmdlc09wdHMgPSB7XG4gICAgICAgICAgc2luY2U6IGxhc3Rfc2VxLFxuICAgICAgICAgIGxpbWl0OiBiYXRjaF9zaXplLFxuICAgICAgICAgIGJhdGNoX3NpemU6IGJhdGNoX3NpemUsXG4gICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgIGRvY19pZHM6IGRvY19pZHMsXG4gICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgIHJldHVybl9kb2NzOiB0cnVlIC8vIHJlcXVpcmVkIHNvIHdlIGtub3cgd2hlbiB3ZSdyZSBkb25lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRzLmZpbHRlcikge1xuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyByZXF1aXJlZCBmb3IgdGhlIGNsaWVudC1zaWRlIGZpbHRlciBpbiBvbkNoYW5nZVxuICAgICAgICAgICAgY2hhbmdlc09wdHMuaW5jbHVkZV9kb2NzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBkZG9jIGZpbHRlclxuICAgICAgICAgICAgY2hhbmdlc09wdHMuZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgnaGVhcnRiZWF0JyBpbiBvcHRzKSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMuaGVhcnRiZWF0ID0gb3B0cy5oZWFydGJlYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCd0aW1lb3V0JyBpbiBvcHRzKSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMudGltZW91dCA9IG9wdHMudGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5xdWVyeV9wYXJhbXMpIHtcbiAgICAgICAgICBjaGFuZ2VzT3B0cy5xdWVyeV9wYXJhbXMgPSBvcHRzLnF1ZXJ5X3BhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy52aWV3KSB7XG4gICAgICAgICAgY2hhbmdlc09wdHMudmlldyA9IG9wdHMudmlldztcbiAgICAgICAgfVxuICAgICAgICBnZXRDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBhYm9ydFJlcGxpY2F0aW9uKCdnZXRDaGVja3BvaW50IHJlamVjdGVkIHdpdGggJywgZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGZ1bmN0aW9uIG9uQ2hlY2twb2ludEVycm9yKGVycikge1xuICAgIHdyaXRpbmdDaGVja3BvaW50ID0gZmFsc2U7XG4gICAgYWJvcnRSZXBsaWNhdGlvbignd3JpdGVDaGVja3BvaW50IGNvbXBsZXRlZCB3aXRoIGVycm9yJywgZXJyKTtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAocmV0dXJuVmFsdWUuY2FuY2VsbGVkKSB7IC8vIGNhbmNlbGxlZCBpbW1lZGlhdGVseVxuICAgIGNvbXBsZXRlUmVwbGljYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXJldHVyblZhbHVlLl9hZGRlZExpc3RlbmVycykge1xuICAgIHJldHVyblZhbHVlLm9uY2UoJ2NhbmNlbCcsIGNvbXBsZXRlUmVwbGljYXRpb24pO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmNvbXBsZXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm5WYWx1ZS5vbmNlKCdlcnJvcicsIG9wdHMuY29tcGxldGUpO1xuICAgICAgcmV0dXJuVmFsdWUub25jZSgnY29tcGxldGUnLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIG9wdHMuY29tcGxldGUobnVsbCwgcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5WYWx1ZS5fYWRkZWRMaXN0ZW5lcnMgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRzLnNpbmNlID09PSAndW5kZWZpbmVkJykge1xuICAgIHN0YXJ0Q2hhbmdlcygpO1xuICB9IGVsc2Uge1xuICAgIGluaXRDaGVja3BvaW50ZXIoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdyaXRpbmdDaGVja3BvaW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybiBjaGVja3BvaW50ZXIud3JpdGVDaGVja3BvaW50KG9wdHMuc2luY2UsIHNlc3Npb24pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgd3JpdGluZ0NoZWNrcG9pbnQgPSBmYWxzZTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKHJldHVyblZhbHVlLmNhbmNlbGxlZCkge1xuICAgICAgICBjb21wbGV0ZVJlcGxpY2F0aW9uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxhc3Rfc2VxID0gb3B0cy5zaW5jZTtcbiAgICAgIHN0YXJ0Q2hhbmdlcygpO1xuICAgIH0pLmNhdGNoKG9uQ2hlY2twb2ludEVycm9yKTtcbiAgfVxufVxuXG4vLyBXZSBjcmVhdGUgYSBiYXNpYyBwcm9taXNlIHNvIHRoZSBjYWxsZXIgY2FuIGNhbmNlbCB0aGUgcmVwbGljYXRpb24gcG9zc2libHlcbi8vIGJlZm9yZSB3ZSBoYXZlIGFjdHVhbGx5IHN0YXJ0ZWQgbGlzdGVuaW5nIHRvIGNoYW5nZXMgZXRjXG5pbmhlcml0cyhSZXBsaWNhdGlvbiwgRUUpO1xuZnVuY3Rpb24gUmVwbGljYXRpb24oKSB7XG4gIEVFLmNhbGwodGhpcyk7XG4gIHRoaXMuY2FuY2VsbGVkID0gZmFsc2U7XG4gIHRoaXMuc3RhdGUgPSAncGVuZGluZyc7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZnVsZmlsbCwgcmVqZWN0KSB7XG4gICAgc2VsZi5vbmNlKCdjb21wbGV0ZScsIGZ1bGZpbGwpO1xuICAgIHNlbGYub25jZSgnZXJyb3InLCByZWplY3QpO1xuICB9KTtcbiAgc2VsZi50aGVuID0gZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJldHVybiBwcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgfTtcbiAgc2VsZi5jYXRjaCA9IGZ1bmN0aW9uIChyZWplY3QpIHtcbiAgICByZXR1cm4gcHJvbWlzZS5jYXRjaChyZWplY3QpO1xuICB9O1xuICAvLyBBcyB3ZSBhbGxvdyBlcnJvciBoYW5kbGluZyB2aWEgXCJlcnJvclwiIGV2ZW50IGFzIHdlbGwsXG4gIC8vIHB1dCBhIHN0dWIgaW4gaGVyZSBzbyB0aGF0IHJlamVjdGluZyBuZXZlciB0aHJvd3MgVW5oYW5kbGVkRXJyb3IuXG4gIHNlbGYuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xufVxuXG5SZXBsaWNhdGlvbi5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gIHRoaXMuc3RhdGUgPSAnY2FuY2VsbGVkJztcbiAgdGhpcy5lbWl0KCdjYW5jZWwnKTtcbn07XG5cblJlcGxpY2F0aW9uLnByb3RvdHlwZS5yZWFkeSA9IGZ1bmN0aW9uIChzcmMsIHRhcmdldCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChzZWxmLl9yZWFkeUNhbGxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBzZWxmLl9yZWFkeUNhbGxlZCA9IHRydWU7XG5cbiAgZnVuY3Rpb24gb25EZXN0cm95KCkge1xuICAgIHNlbGYuY2FuY2VsKCk7XG4gIH1cbiAgc3JjLm9uY2UoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gIHRhcmdldC5vbmNlKCdkZXN0cm95ZWQnLCBvbkRlc3Ryb3kpO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGVzdHJveWVkJywgb25EZXN0cm95KTtcbiAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIoJ2Rlc3Ryb3llZCcsIG9uRGVzdHJveSk7XG4gIH1cbiAgc2VsZi5vbmNlKCdjb21wbGV0ZScsIGNsZWFudXApO1xuICBzZWxmLm9uY2UoJ2Vycm9yJywgY2xlYW51cCk7XG59O1xuXG5mdW5jdGlvbiB0b1BvdWNoKGRiLCBvcHRzKSB7XG4gIHZhciBQb3VjaENvbnN0cnVjdG9yID0gb3B0cy5Qb3VjaENvbnN0cnVjdG9yO1xuICBpZiAodHlwZW9mIGRiID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBuZXcgUG91Y2hDb25zdHJ1Y3RvcihkYiwgb3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRiO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxpY2F0ZVdyYXBwZXIoc3JjLCB0YXJnZXQsIG9wdHMsIGNhbGxiYWNrKSB7XG5cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgaWYgKG9wdHMuZG9jX2lkcyAmJiAhQXJyYXkuaXNBcnJheShvcHRzLmRvY19pZHMpKSB7XG4gICAgdGhyb3cgY3JlYXRlRXJyb3IoQkFEX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgICAgICAgIFwiYGRvY19pZHNgIGZpbHRlciBwYXJhbWV0ZXIgaXMgbm90IGEgbGlzdC5cIik7XG4gIH1cblxuICBvcHRzLmNvbXBsZXRlID0gY2FsbGJhY2s7XG4gIG9wdHMgPSBjbG9uZShvcHRzKTtcbiAgb3B0cy5jb250aW51b3VzID0gb3B0cy5jb250aW51b3VzIHx8IG9wdHMubGl2ZTtcbiAgb3B0cy5yZXRyeSA9ICgncmV0cnknIGluIG9wdHMpID8gb3B0cy5yZXRyeSA6IGZhbHNlO1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICBvcHRzLlBvdWNoQ29uc3RydWN0b3IgPSBvcHRzLlBvdWNoQ29uc3RydWN0b3IgfHwgdGhpcztcbiAgdmFyIHJlcGxpY2F0ZVJldCA9IG5ldyBSZXBsaWNhdGlvbihvcHRzKTtcbiAgdmFyIHNyY1BvdWNoID0gdG9Qb3VjaChzcmMsIG9wdHMpO1xuICB2YXIgdGFyZ2V0UG91Y2ggPSB0b1BvdWNoKHRhcmdldCwgb3B0cyk7XG4gIHJlcGxpY2F0ZShzcmNQb3VjaCwgdGFyZ2V0UG91Y2gsIG9wdHMsIHJlcGxpY2F0ZVJldCk7XG4gIHJldHVybiByZXBsaWNhdGVSZXQ7XG59XG5cbmluaGVyaXRzKFN5bmMsIEVFKTtcbmZ1bmN0aW9uIHN5bmMoc3JjLCB0YXJnZXQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBvcHRzID0gY2xvbmUob3B0cyk7XG4gIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gIG9wdHMuUG91Y2hDb25zdHJ1Y3RvciA9IG9wdHMuUG91Y2hDb25zdHJ1Y3RvciB8fCB0aGlzO1xuICBzcmMgPSB0b1BvdWNoKHNyYywgb3B0cyk7XG4gIHRhcmdldCA9IHRvUG91Y2godGFyZ2V0LCBvcHRzKTtcbiAgcmV0dXJuIG5ldyBTeW5jKHNyYywgdGFyZ2V0LCBvcHRzLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIFN5bmMoc3JjLCB0YXJnZXQsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5jYW5jZWxlZCA9IGZhbHNlO1xuXG4gIHZhciBvcHRzUHVzaCA9IG9wdHMucHVzaCA/ICRpbmplY3RfT2JqZWN0X2Fzc2lnbih7fSwgb3B0cywgb3B0cy5wdXNoKSA6IG9wdHM7XG4gIHZhciBvcHRzUHVsbCA9IG9wdHMucHVsbCA/ICRpbmplY3RfT2JqZWN0X2Fzc2lnbih7fSwgb3B0cywgb3B0cy5wdWxsKSA6IG9wdHM7XG5cbiAgdGhpcy5wdXNoID0gcmVwbGljYXRlV3JhcHBlcihzcmMsIHRhcmdldCwgb3B0c1B1c2gpO1xuICB0aGlzLnB1bGwgPSByZXBsaWNhdGVXcmFwcGVyKHRhcmdldCwgc3JjLCBvcHRzUHVsbCk7XG5cbiAgdGhpcy5wdXNoUGF1c2VkID0gdHJ1ZTtcbiAgdGhpcy5wdWxsUGF1c2VkID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBwdWxsQ2hhbmdlKGNoYW5nZSkge1xuICAgIHNlbGYuZW1pdCgnY2hhbmdlJywge1xuICAgICAgZGlyZWN0aW9uOiAncHVsbCcsXG4gICAgICBjaGFuZ2U6IGNoYW5nZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hDaGFuZ2UoY2hhbmdlKSB7XG4gICAgc2VsZi5lbWl0KCdjaGFuZ2UnLCB7XG4gICAgICBkaXJlY3Rpb246ICdwdXNoJyxcbiAgICAgIGNoYW5nZTogY2hhbmdlXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcHVzaERlbmllZChkb2MpIHtcbiAgICBzZWxmLmVtaXQoJ2RlbmllZCcsIHtcbiAgICAgIGRpcmVjdGlvbjogJ3B1c2gnLFxuICAgICAgZG9jOiBkb2NcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBwdWxsRGVuaWVkKGRvYykge1xuICAgIHNlbGYuZW1pdCgnZGVuaWVkJywge1xuICAgICAgZGlyZWN0aW9uOiAncHVsbCcsXG4gICAgICBkb2M6IGRvY1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hQYXVzZWQoKSB7XG4gICAgc2VsZi5wdXNoUGF1c2VkID0gdHJ1ZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5wdWxsUGF1c2VkKSB7XG4gICAgICBzZWxmLmVtaXQoJ3BhdXNlZCcpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwdWxsUGF1c2VkKCkge1xuICAgIHNlbGYucHVsbFBhdXNlZCA9IHRydWU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHNlbGYucHVzaFBhdXNlZCkge1xuICAgICAgc2VsZi5lbWl0KCdwYXVzZWQnKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHVzaEFjdGl2ZSgpIHtcbiAgICBzZWxmLnB1c2hQYXVzZWQgPSBmYWxzZTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoc2VsZi5wdWxsUGF1c2VkKSB7XG4gICAgICBzZWxmLmVtaXQoJ2FjdGl2ZScsIHtcbiAgICAgICAgZGlyZWN0aW9uOiAncHVzaCdcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwdWxsQWN0aXZlKCkge1xuICAgIHNlbGYucHVsbFBhdXNlZCA9IGZhbHNlO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChzZWxmLnB1c2hQYXVzZWQpIHtcbiAgICAgIHNlbGYuZW1pdCgnYWN0aXZlJywge1xuICAgICAgICBkaXJlY3Rpb246ICdwdWxsJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbW92ZWQgPSB7fTtcblxuICBmdW5jdGlvbiByZW1vdmVBbGwodHlwZSkgeyAvLyB0eXBlIGlzICdwdXNoJyBvciAncHVsbCdcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBmdW5jKSB7XG4gICAgICB2YXIgaXNDaGFuZ2UgPSBldmVudCA9PT0gJ2NoYW5nZScgJiZcbiAgICAgICAgKGZ1bmMgPT09IHB1bGxDaGFuZ2UgfHwgZnVuYyA9PT0gcHVzaENoYW5nZSk7XG4gICAgICB2YXIgaXNEZW5pZWQgPSBldmVudCA9PT0gJ2RlbmllZCcgJiZcbiAgICAgICAgKGZ1bmMgPT09IHB1bGxEZW5pZWQgfHwgZnVuYyA9PT0gcHVzaERlbmllZCk7XG4gICAgICB2YXIgaXNQYXVzZWQgPSBldmVudCA9PT0gJ3BhdXNlZCcgJiZcbiAgICAgICAgKGZ1bmMgPT09IHB1bGxQYXVzZWQgfHwgZnVuYyA9PT0gcHVzaFBhdXNlZCk7XG4gICAgICB2YXIgaXNBY3RpdmUgPSBldmVudCA9PT0gJ2FjdGl2ZScgJiZcbiAgICAgICAgKGZ1bmMgPT09IHB1bGxBY3RpdmUgfHwgZnVuYyA9PT0gcHVzaEFjdGl2ZSk7XG5cbiAgICAgIGlmIChpc0NoYW5nZSB8fCBpc0RlbmllZCB8fCBpc1BhdXNlZCB8fCBpc0FjdGl2ZSkge1xuICAgICAgICBpZiAoIShldmVudCBpbiByZW1vdmVkKSkge1xuICAgICAgICAgIHJlbW92ZWRbZXZlbnRdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlZFtldmVudF1bdHlwZV0gPSB0cnVlO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVtb3ZlZFtldmVudF0pLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIC8vIGJvdGggcHVzaCBhbmQgcHVsbCBoYXZlIGFza2VkIHRvIGJlIHJlbW92ZWRcbiAgICAgICAgICBzZWxmLnJlbW92ZUFsbExpc3RlbmVycyhldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgaWYgKG9wdHMubGl2ZSkge1xuICAgIHRoaXMucHVzaC5vbignY29tcGxldGUnLCBzZWxmLnB1bGwuY2FuY2VsLmJpbmQoc2VsZi5wdWxsKSk7XG4gICAgdGhpcy5wdWxsLm9uKCdjb21wbGV0ZScsIHNlbGYucHVzaC5jYW5jZWwuYmluZChzZWxmLnB1c2gpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZE9uZUxpc3RlbmVyKGVlLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgICBpZiAoZWUubGlzdGVuZXJzKGV2ZW50KS5pbmRleE9mKGxpc3RlbmVyKSA9PSAtMSkge1xuICAgICAgZWUub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLm9uKCduZXdMaXN0ZW5lcicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudCA9PT0gJ2NoYW5nZScpIHtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVsbCwgJ2NoYW5nZScsIHB1bGxDaGFuZ2UpO1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdXNoLCAnY2hhbmdlJywgcHVzaENoYW5nZSk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2RlbmllZCcpIHtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVsbCwgJ2RlbmllZCcsIHB1bGxEZW5pZWQpO1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdXNoLCAnZGVuaWVkJywgcHVzaERlbmllZCk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVsbCwgJ2FjdGl2ZScsIHB1bGxBY3RpdmUpO1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdXNoLCAnYWN0aXZlJywgcHVzaEFjdGl2ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgIGFkZE9uZUxpc3RlbmVyKHNlbGYucHVsbCwgJ3BhdXNlZCcsIHB1bGxQYXVzZWQpO1xuICAgICAgYWRkT25lTGlzdGVuZXIoc2VsZi5wdXNoLCAncGF1c2VkJywgcHVzaFBhdXNlZCk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLm9uKCdyZW1vdmVMaXN0ZW5lcicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudCA9PT0gJ2NoYW5nZScpIHtcbiAgICAgIHNlbGYucHVsbC5yZW1vdmVMaXN0ZW5lcignY2hhbmdlJywgcHVsbENoYW5nZSk7XG4gICAgICBzZWxmLnB1c2gucmVtb3ZlTGlzdGVuZXIoJ2NoYW5nZScsIHB1c2hDaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdkZW5pZWQnKSB7XG4gICAgICBzZWxmLnB1bGwucmVtb3ZlTGlzdGVuZXIoJ2RlbmllZCcsIHB1bGxEZW5pZWQpO1xuICAgICAgc2VsZi5wdXNoLnJlbW92ZUxpc3RlbmVyKCdkZW5pZWQnLCBwdXNoRGVuaWVkKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnYWN0aXZlJykge1xuICAgICAgc2VsZi5wdWxsLnJlbW92ZUxpc3RlbmVyKCdhY3RpdmUnLCBwdWxsQWN0aXZlKTtcbiAgICAgIHNlbGYucHVzaC5yZW1vdmVMaXN0ZW5lcignYWN0aXZlJywgcHVzaEFjdGl2ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgIHNlbGYucHVsbC5yZW1vdmVMaXN0ZW5lcigncGF1c2VkJywgcHVsbFBhdXNlZCk7XG4gICAgICBzZWxmLnB1c2gucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlZCcsIHB1c2hQYXVzZWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5wdWxsLm9uKCdyZW1vdmVMaXN0ZW5lcicsIHJlbW92ZUFsbCgncHVsbCcpKTtcbiAgdGhpcy5wdXNoLm9uKCdyZW1vdmVMaXN0ZW5lcicsIHJlbW92ZUFsbCgncHVzaCcpKTtcblxuICB2YXIgcHJvbWlzZSA9IFByb21pc2UuYWxsKFtcbiAgICB0aGlzLnB1c2gsXG4gICAgdGhpcy5wdWxsXG4gIF0pLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHtcbiAgICB2YXIgb3V0ID0ge1xuICAgICAgcHVzaDogcmVzcFswXSxcbiAgICAgIHB1bGw6IHJlc3BbMV1cbiAgICB9O1xuICAgIHNlbGYuZW1pdCgnY29tcGxldGUnLCBvdXQpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sobnVsbCwgb3V0KTtcbiAgICB9XG4gICAgc2VsZi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gb3V0O1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgc2VsZi5jYW5jZWwoKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIC8vIGlmIHRoZXJlJ3MgYSBjYWxsYmFjaywgdGhlbiB0aGUgY2FsbGJhY2sgY2FuIHJlY2VpdmVcbiAgICAgIC8vIHRoZSBlcnJvciBldmVudFxuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgdGhlcmUncyBubyBjYWxsYmFjaywgdGhlbiB3ZSdyZSBzYWZlIHRvIGVtaXQgYW4gZXJyb3JcbiAgICAgIC8vIGV2ZW50LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgdGhyb3cgYW4gdW5oYW5kbGVkIGVycm9yXG4gICAgICAvLyBkdWUgdG8gJ2Vycm9yJyBiZWluZyBhIHNwZWNpYWwgZXZlbnQgaW4gRXZlbnRFbWl0dGVyc1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgfVxuICAgIHNlbGYucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAvLyBubyBzZW5zZSB0aHJvd2luZyBpZiB3ZSdyZSBhbHJlYWR5IGVtaXR0aW5nIGFuICdlcnJvcicgZXZlbnRcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMudGhlbiA9IGZ1bmN0aW9uIChzdWNjZXNzLCBlcnIpIHtcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKHN1Y2Nlc3MsIGVycik7XG4gIH07XG5cbiAgdGhpcy5jYXRjaCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICByZXR1cm4gcHJvbWlzZS5jYXRjaChlcnIpO1xuICB9O1xufVxuXG5TeW5jLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jYW5jZWxlZCkge1xuICAgIHRoaXMuY2FuY2VsZWQgPSB0cnVlO1xuICAgIHRoaXMucHVzaC5jYW5jZWwoKTtcbiAgICB0aGlzLnB1bGwuY2FuY2VsKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlcGxpY2F0aW9uKFBvdWNoREIpIHtcbiAgUG91Y2hEQi5yZXBsaWNhdGUgPSByZXBsaWNhdGVXcmFwcGVyO1xuICBQb3VjaERCLnN5bmMgPSBzeW5jO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQb3VjaERCLnByb3RvdHlwZSwgJ3JlcGxpY2F0ZScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5yZXBsaWNhdGVNZXRob2RzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLnJlcGxpY2F0ZU1ldGhvZHMgPSB7XG4gICAgICAgICAgZnJvbTogZnVuY3Rpb24gKG90aGVyLCBvcHRzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uc3RydWN0b3IucmVwbGljYXRlKG90aGVyLCBzZWxmLCBvcHRzLCBjYWxsYmFjayk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogZnVuY3Rpb24gKG90aGVyLCBvcHRzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uc3RydWN0b3IucmVwbGljYXRlKHNlbGYsIG90aGVyLCBvcHRzLCBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVwbGljYXRlTWV0aG9kcztcbiAgICB9XG4gIH0pO1xuXG4gIFBvdWNoREIucHJvdG90eXBlLnN5bmMgPSBmdW5jdGlvbiAoZGJOYW1lLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnN5bmModGhpcywgZGJOYW1lLCBvcHRzLCBjYWxsYmFjayk7XG4gIH07XG59XG5cblBvdWNoREIucGx1Z2luKElEQlBvdWNoKVxuICAucGx1Z2luKEh0dHBQb3VjaCQxKVxuICAucGx1Z2luKG1hcHJlZHVjZSlcbiAgLnBsdWdpbihyZXBsaWNhdGlvbik7XG5cbi8vIFB1bGwgZnJvbSBzcmMgYmVjYXVzZSBwb3VjaGRiLW5vZGUvcG91Y2hkYi1icm93c2VyIHRoZW1zZWx2ZXNcblxuZXhwb3J0IGRlZmF1bHQgUG91Y2hEQjtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjIxJztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbicsXG4gICAgICBJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUID0gJ0ludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG4gIHZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG4gIHZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHZhbGlkYXRlIHRoZSBgdmFsaWRhdGVgIG9wdGlvbiBpbiBgXy50ZW1wbGF0ZWAgdmFyaWFibGUuXG4gICAqXG4gICAqIEZvcmJpZHMgY2hhcmFjdGVycyB3aGljaCBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGRlZmluaXRpb246XG4gICAqIC0gXCIoKSxcIiAobW9kaWZpY2F0aW9uIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMpXG4gICAqIC0gXCI9XCIgKGRlZmF1bHQgdmFsdWUpXG4gICAqIC0gXCJbXXt9XCIgKGRlc3RydWN0dXJpbmcgb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIi9cIiAoYmVnaW5uaW5nIG9mIGEgY29tbWVudClcbiAgICogLSB3aGl0ZXNwYWNlXG4gICAqL1xuICB2YXIgcmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMgPSAvWygpPSx7fVxcW1xcXVxcL1xcc10vO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZ1xuICAgICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICAgIDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gICAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgICAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF0sXG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHx8ICFwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kZWxheWAgYW5kIGBfLmRlZmVyYCB3aGljaCBhY2NlcHRzIGBhcmdzYFxuICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoUmlnaHQgPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IGxlbmd0aCkgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGFycmF5W3N0YXJ0KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvclJpZ2h0ID0gY3JlYXRlQmFzZUZvcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICAgICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoIShzZWVuXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZlcnRgIGFuZCBgXy5pbnZlcnRCeWAgd2hpY2ggaW52ZXJ0c1xuICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgaXRlcmF0ZWUodmFsdWUpLCBrZXksIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZva2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIG1ldGhvZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHZhciBmdW5jID0gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJyYXlCdWZmZXJgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJyYXlCdWZmZXJUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgICAgIG9iaklzT2JqID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgICAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICAgICAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgaWYgKGl0ZXJhdGVlcy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgIHZhciB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgICAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmRcbiAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1N0cmluZyhudWxsKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZygtMCk7XG4gICAgICogLy8gPT4gJy0wJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkge1xuICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGBwYXRoc2Agb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICdjb25zdHJ1Y3Rvcic6IENpcmNsZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPT0gbnVsbCA/IHJlc3VsdCA6IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICAgICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICAgICAgcmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyAncGViYmxlcycgYXNzdW1pbmcgYF8uZmluZEtleWAgcmV0dXJucyAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd25SaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kXG4gICAgICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAqIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYicgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICdhJyB0aGVuICdiJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gICAgICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob3RoZXIsICdhJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAqIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnQgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgfVxuICAgIH0sIGdldEl0ZXJhdGVlKTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlID0gYmFzZVJlc3QoYmFzZUludm9rZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy5rZXlzKCdoaScpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5c0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tYXBWYWx1ZXNgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAqIHNhbWUgdmFsdWVzIGFzIGBvYmplY3RgIGFuZCBrZXlzIGdlbmVyYXRlZCBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGVcbiAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBWYWx1ZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lcmdlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNpeCBhcmd1bWVudHM6XG4gICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFsxXSwgJ2InOiBbMl0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZVdpdGgob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZVdpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGVcbiAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBzbG93ZXIgdGhhbiBgXy5waWNrYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGlzRGVlcCA9IGZhbHNlO1xuICAgICAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgICAgaXNEZWVwIHx8IChpc0RlZXAgPSBwYXRoLmxlbmd0aCA+IDEpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH0pO1xuICAgICAgY29weU9iamVjdChvYmplY3QsIGdldEFsbEtleXNJbihvYmplY3QpLCByZXN1bHQpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGJhc2VVbnNldChyZXN1bHQsIHBhdGhzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXRcbiAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgYG9iamVjdGAgcHJvcGVydGllcyBgcHJlZGljYXRlYCByZXR1cm5zXG4gICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLCBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcHJlZGljYXRlKHZhbHVlLCBwYXRoWzBdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYVxuICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAqIGBwYXRoYCBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaXRoKG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzXG4gICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAqIG9yIHNldCwgaXRzIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlyc0luID0gY3JlYXRlVG9QYWlycyhrZXlzSW4pO1xuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAgICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDldXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHRydWUgOiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgYWNjZXB0cyBgdXBkYXRlcmAgdG8gcHJvZHVjZSB0aGVcbiAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICdhWzBdLmIuYycsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiBuOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlcikge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLnZhbHVlcygnaGknKTtcbiAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eVxuICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiAtNVxuICAgICAqXG4gICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICAgICAgdXBwZXIgPSB1cHBlciA9PT0gdXBwZXIgPyB1cHBlciA6IDA7XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTtcbiAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqIElmIGBzdGFydGAgaXMgZ3JlYXRlciB0aGFuIGBlbmRgIHRoZSBwYXJhbXMgYXJlIHN3YXBwZWQgdG8gc3VwcG9ydFxuICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjMuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgIH1cbiAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZVxuICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1KTtcbiAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7XG4gICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHVwcGVyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICAgICAgdXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA9PT0gdW5kZWZpbmVkICYmIHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB1cHBlciA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7XG4gICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdXBwZXI7XG4gICAgICAgIHVwcGVyID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBsb3dlciAlIDEgfHwgdXBwZXIgJSAxKSB7XG4gICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVNaW4obG93ZXIgKyAocmFuZCAqICh1cHBlciAtIGxvd2VyICsgZnJlZVBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKyAnJykubGVuZ3RoIC0gMSkpKSksIHVwcGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqL1xuICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXBpdGFsaXplKCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICogYW5kIFtMYXRpbiBFeHRlbmRlZC1BXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9FeHRlbmRlZC1BKVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVidXJyKCdkw6lqw6AgdnUnKTtcbiAgICAgKiAvLyA9PiAnZGVqYSB2dSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWJ1cnIoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIHN0cmluZyAmJiBzdHJpbmcucmVwbGFjZShyZUxhdGluLCBkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPXN0cmluZy5sZW5ndGhdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggdXAgdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCBgdGFyZ2V0YCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJywgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGxlbmd0aFxuICAgICAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBsZW5ndGgpO1xuXG4gICAgICB2YXIgZW5kID0gcG9zaXRpb247XG4gICAgICBwb3NpdGlvbiAtPSB0YXJnZXQubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBvc2l0aW9uID49IDAgJiYgc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBlbmQpID09IHRhcmdldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgY2hhcmFjdGVycyBcIiZcIiwgXCI8XCIsIFwiPlwiLCAnXCInLCBhbmQgXCInXCIgaW4gYHN0cmluZ2AgdG8gdGhlaXJcbiAgICAgKiBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgY2hhcmFjdGVycyBhcmUgZXNjYXBlZC4gVG8gZXNjYXBlIGFkZGl0aW9uYWxcbiAgICAgKiBjaGFyYWN0ZXJzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgKlxuICAgICAqIFRob3VnaCB0aGUgXCI+XCIgY2hhcmFjdGVyIGlzIGVzY2FwZWQgZm9yIHN5bW1ldHJ5LCBjaGFyYWN0ZXJzIGxpa2VcbiAgICAgKiBcIj5cIiBhbmQgXCIvXCIgZG9uJ3QgbmVlZCBlc2NhcGluZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZ1xuICAgICAqIHVubGVzcyB0aGV5J3JlIHBhcnQgb2YgYSB0YWcgb3IgdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLiBTZWVcbiAgICAgKiBbTWF0aGlhcyBCeW5lbnMncyBhcnRpY2xlXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvYW1iaWd1b3VzLWFtcGVyc2FuZHMpXG4gICAgICogKHVuZGVyIFwic2VtaS1yZWxhdGVkIGZ1biBmYWN0XCIpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBXaGVuIHdvcmtpbmcgd2l0aCBIVE1MIHlvdSBzaG91bGQgYWx3YXlzXG4gICAgICogW3F1b3RlIGF0dHJpYnV0ZSB2YWx1ZXNdKGh0dHA6Ly93b25rby5jb20vcG9zdC9odG1sLWVzY2FwaW5nKSB0byByZWR1Y2VcbiAgICAgKiBYU1MgdmVjdG9ycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLCBlc2NhcGVIdG1sQ2hhcilcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlcyB0aGUgYFJlZ0V4cGAgc3BlY2lhbCBjaGFyYWN0ZXJzIFwiXlwiLCBcIiRcIiwgXCJcXFwiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLFxuICAgICAqIFwiP1wiLCBcIihcIiwgXCIpXCIsIFwiW1wiLCBcIl1cIiwgXCJ7XCIsIFwifVwiLCBhbmQgXCJ8XCIgaW4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZVJlZ0V4cCgnW2xvZGFzaF0oaHR0cHM6Ly9sb2Rhc2guY29tLyknKTtcbiAgICAgKiAvLyA9PiAnXFxbbG9kYXNoXFxdXFwoaHR0cHM6Ly9sb2Rhc2hcXC5jb20vXFwpJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW2tlYmFiIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1NwZWNpYWxfY2FzZV9zdHlsZXMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUga2ViYWIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICovXG4gICAgdmFyIGtlYmFiQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICctJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICovXG4gICAgdmFyIGxvd2VyQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRnJlZCcpO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ2ZSRUQnXG4gICAgICovXG4gICAgdmFyIGxvd2VyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvTG93ZXJDYXNlJyk7XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC5cbiAgICAgKiBQYWRkaW5nIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGNhbid0IGJlIGV2ZW5seSBkaXZpZGVkIGJ5IGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4KTtcbiAgICAgKiAvLyA9PiAnICBhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tYWJjXy1fJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHN0ckxlbmd0aCA+PSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBtaWQgPSAobGVuZ3RoIC0gc3RyTGVuZ3RoKSAvIDI7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUZsb29yKG1pZCksIGNoYXJzKSArXG4gICAgICAgIHN0cmluZyArXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLCBjaGFycylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgcmlnaHQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJ2FiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjXy1fJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkRW5kKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoc3RyaW5nICsgY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSlcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICcgICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1fYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykgKyBzdHJpbmcpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4gSWYgYHJhZGl4YCBpc1xuICAgICAqIGB1bmRlZmluZWRgIG9yIGAwYCwgYSBgcmFkaXhgIG9mIGAxMGAgaXMgdXNlZCB1bmxlc3MgYHZhbHVlYCBpcyBhXG4gICAgICogaGV4YWRlY2ltYWwsIGluIHdoaWNoIGNhc2UgYSBgcmFkaXhgIG9mIGAxNmAgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBhbGlnbnMgd2l0aCB0aGVcbiAgICAgKiBbRVM1IGltcGxlbWVudGF0aW9uXShodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuMikgb2YgYHBhcnNlSW50YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4PTEwXSBUaGUgcmFkaXggdG8gaW50ZXJwcmV0IGB2YWx1ZWAgYnkuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYXJzZUludCgnMDgnKTtcbiAgICAgKiAvLyA9PiA4XG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnMDgnLCAnMTAnXSwgXy5wYXJzZUludCk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgsIGd1YXJkKSB7XG4gICAgICBpZiAoZ3VhcmQgfHwgcmFkaXggPT0gbnVsbCkge1xuICAgICAgICByYWRpeCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHJhZGl4KSB7XG4gICAgICAgIHJhZGl4ID0gK3JhZGl4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZVBhcnNlSW50KHRvU3RyaW5nKHN0cmluZykucmVwbGFjZShyZVRyaW1TdGFydCwgJycpLCByYWRpeCB8fCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBlYXRzIHRoZSBnaXZlbiBzdHJpbmcgYG5gIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBlYXQoJyonLCAzKTtcbiAgICAgKiAvLyA9PiAnKioqJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDIpO1xuICAgICAqIC8vID0+ICdhYmNhYmMnXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMCk7XG4gICAgICogLy8gPT4gJydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBlYXQoc3RyaW5nLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJlcGVhdCh0b1N0cmluZyhzdHJpbmcpLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBtYXRjaGVzIGZvciBgcGF0dGVybmAgaW4gYHN0cmluZ2Agd2l0aCBgcmVwbGFjZW1lbnRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BTdHJpbmcjcmVwbGFjZWBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9yZXBsYWNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IHJlcGxhY2VtZW50IFRoZSBtYXRjaCByZXBsYWNlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwbGFjZSgnSGkgRnJlZCcsICdGcmVkJywgJ0Jhcm5leScpO1xuICAgICAqIC8vID0+ICdIaSBCYXJuZXknXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZSgpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKGFyZ3NbMF0pO1xuXG4gICAgICByZXR1cm4gYXJncy5sZW5ndGggPCAzID8gc3RyaW5nIDogc3RyaW5nLnJlcGxhY2UoYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc25ha2UgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU25ha2VfY2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzbmFrZSBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnLS1GT08tQkFSLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKi9cbiAgICB2YXIgc25ha2VDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJ18nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BTdHJpbmcjc3BsaXRgXShodHRwczovL21kbi5pby9TdHJpbmcvc3BsaXQpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHNwbGl0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gc2VwYXJhdG9yIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byBzcGxpdCBieS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbWl0XSBUaGUgbGVuZ3RoIHRvIHRydW5jYXRlIHJlc3VsdHMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzdHJpbmcgc2VnbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3BsaXQoJ2EtYi1jJywgJy0nLCAyKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3BsaXQoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICBpZiAobGltaXQgJiYgdHlwZW9mIGxpbWl0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gbGltaXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBsaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfQVJSQVlfTEVOR1RIIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAoIWxpbWl0KSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChcbiAgICAgICAgICAgIHR5cGVvZiBzZXBhcmF0b3IgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIChzZXBhcmF0b3IgIT0gbnVsbCAmJiAhaXNSZWdFeHAoc2VwYXJhdG9yKSlcbiAgICAgICAgICApKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoIXNlcGFyYXRvciAmJiBoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgICByZXR1cm4gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkoc3RyaW5nKSwgMCwgbGltaXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3N0YXJ0IGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1N0eWxpc3RpY19vcl9zcGVjaWFsaXNlZF91c2FnZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdGFydCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICovXG4gICAgdmFyIHN0YXJ0Q2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHVwcGVyRmlyc3Qod29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249MF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCBgdGFyZ2V0YCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PSBudWxsXG4gICAgICAgID8gMFxuICAgICAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBzdHJpbmcubGVuZ3RoKTtcblxuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG4gICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIHRhcmdldC5sZW5ndGgpID09IHRhcmdldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBjYW4gaW50ZXJwb2xhdGUgZGF0YSBwcm9wZXJ0aWVzXG4gICAgICogaW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlcnMsIEhUTUwtZXNjYXBlIGludGVycG9sYXRlZCBkYXRhIHByb3BlcnRpZXMgaW5cbiAgICAgKiBcImVzY2FwZVwiIGRlbGltaXRlcnMsIGFuZCBleGVjdXRlIEphdmFTY3JpcHQgaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuIERhdGFcbiAgICAgKiBwcm9wZXJ0aWVzIG1heSBiZSBhY2Nlc3NlZCBhcyBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgdGVtcGxhdGUuIElmIGEgc2V0dGluZ1xuICAgICAqIG9iamVjdCBpcyBnaXZlbiwgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBfLnRlbXBsYXRlU2V0dGluZ3NgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJbiB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQgYF8udGVtcGxhdGVgIHV0aWxpemVzXG4gICAgICogW3NvdXJjZVVSTHNdKGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwpXG4gICAgICogZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwcmVjb21waWxpbmcgdGVtcGxhdGVzIHNlZVxuICAgICAqIFtsb2Rhc2gncyBjdXN0b20gYnVpbGRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbG9kYXNoLmNvbS9jdXN0b20tYnVpbGRzKS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZVxuICAgICAqIFtDaHJvbWUncyBleHRlbnNpb25zIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9zYW5kYm94aW5nRXZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSB0ZW1wbGF0ZSBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmVzY2FwZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXNjYXBlXVxuICAgICAqICBUaGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXZhbHVhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmV2YWx1YXRlXVxuICAgICAqICBUaGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaW1wb3J0cz1fLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c11cbiAgICAgKiAgQW4gb2JqZWN0IHRvIGltcG9ydCBpbnRvIHRoZSB0ZW1wbGF0ZSBhcyBmcmVlIHZhcmlhYmxlcy5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuaW50ZXJwb2xhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlXVxuICAgICAqICBUaGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc291cmNlVVJMPSdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzW25dJ11cbiAgICAgKiAgVGhlIHNvdXJjZVVSTCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnZhcmlhYmxlPSdvYmonXVxuICAgICAqICBUaGUgZGF0YSBvYmplY3QgdmFyaWFibGUgbmFtZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlciB0byBjcmVhdGUgYSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2ZyZWQnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlciB0byBlc2NhcGUgZGF0YSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPGI+PCUtIHZhbHVlICU+PC9iPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTtcbiAgICAgKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyIHRvIGV4ZWN1dGUgSmF2YVNjcmlwdCBhbmQgZ2VuZXJhdGUgSFRNTC5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBfLmZvckVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBpbnRlcm5hbCBgcHJpbnRgIGZ1bmN0aW9uIGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIHByaW50KFwiaGVsbG8gXCIgKyB1c2VyKTsgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdiYXJuZXknIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBiYXJuZXkhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBFUyB0ZW1wbGF0ZSBsaXRlcmFsIGRlbGltaXRlciBhcyBhbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIC8vIERpc2FibGUgc3VwcG9ydCBieSByZXBsYWNpbmcgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gJHsgdXNlciB9IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAncGViYmxlcycgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIHBlYmJsZXMhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIGJhY2tzbGFzaGVzIHRvIHRyZWF0IGRlbGltaXRlcnMgYXMgcGxhaW4gdGV4dC5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JT0gXCJcXFxcPCUtIHZhbHVlICVcXFxcPlwiICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnaWdub3JlZCcgfSk7XG4gICAgICogLy8gPT4gJzwlLSB2YWx1ZSAlPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYGltcG9ydHNgIG9wdGlvbiB0byBpbXBvcnQgYGpRdWVyeWAgYXMgYGpxYC5cbiAgICAgKiB2YXIgdGV4dCA9ICc8JSBqcS5lYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUodGV4dCwgeyAnaW1wb3J0cyc6IHsgJ2pxJzogalF1ZXJ5IH0gfSk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VVUkxgIG9wdGlvbiB0byBzcGVjaWZ5IGEgY3VzdG9tIHNvdXJjZVVSTCBmb3IgdGhlIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAgICAgKiBjb21waWxlZChkYXRhKTtcbiAgICAgKiAvLyA9PiBGaW5kIHRoZSBzb3VyY2Ugb2YgXCJncmVldGluZy5qc3RcIiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yLlxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgdmFyaWFibGVgIG9wdGlvbiB0byBlbnN1cmUgYSB3aXRoLXN0YXRlbWVudCBpc24ndCB1c2VkIGluIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS51c2VyICU+IScsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pO1xuICAgICAqIGNvbXBpbGVkLnNvdXJjZTtcbiAgICAgKiAvLyA9PiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICogLy8gICB2YXIgX190LCBfX3AgPSAnJztcbiAgICAgKiAvLyAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLnVzZXIgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJztcbiAgICAgKiAvLyAgIHJldHVybiBfX3A7XG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gVXNlIGN1c3RvbSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLlxuICAgICAqIF8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXFxzXFxTXSs/KX19L2c7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8ge3sgdXNlciB9fSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ211c3RhY2hlJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gbXVzdGFjaGUhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlYCBwcm9wZXJ0eSB0byBpbmxpbmUgY29tcGlsZWQgdGVtcGxhdGVzIGZvciBtZWFuaW5nZnVsXG4gICAgICogLy8gbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMuXG4gICAgICogZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2pzdC5qcycpLCAnXFxcbiAgICAgKiAgIHZhciBKU1QgPSB7XFxcbiAgICAgKiAgICAgXCJtYWluXCI6ICcgKyBfLnRlbXBsYXRlKG1haW5UZXh0KS5zb3VyY2UgKyAnXFxcbiAgICAgKiAgIH07XFxcbiAgICAgKiAnKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0ZW1wbGF0ZShzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSB7XG4gICAgICAvLyBCYXNlZCBvbiBKb2huIFJlc2lnJ3MgYHRtcGxgIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyAoaHR0cDovL2Vqb2huLm9yZy9ibG9nL2phdmFzY3JpcHQtbWljcm8tdGVtcGxhdGluZy8pXG4gICAgICAvLyBhbmQgTGF1cmEgRG9rdG9yb3ZhJ3MgZG9ULmpzIChodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UKS5cbiAgICAgIHZhciBzZXR0aW5ncyA9IGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzO1xuXG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBvcHRpb25zID0gYXNzaWduSW5XaXRoKHt9LCBvcHRpb25zLCBzZXR0aW5ncywgY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7XG5cbiAgICAgIHZhciBpbXBvcnRzID0gYXNzaWduSW5XaXRoKHt9LCBvcHRpb25zLmltcG9ydHMsIHNldHRpbmdzLmltcG9ydHMsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLFxuICAgICAgICAgIGltcG9ydHNLZXlzID0ga2V5cyhpbXBvcnRzKSxcbiAgICAgICAgICBpbXBvcnRzVmFsdWVzID0gYmFzZVZhbHVlcyhpbXBvcnRzLCBpbXBvcnRzS2V5cyk7XG5cbiAgICAgIHZhciBpc0VzY2FwaW5nLFxuICAgICAgICAgIGlzRXZhbHVhdGluZyxcbiAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCxcbiAgICAgICAgICBzb3VyY2UgPSBcIl9fcCArPSAnXCI7XG5cbiAgICAgIC8vIENvbXBpbGUgdGhlIHJlZ2V4cCB0byBtYXRjaCBlYWNoIGRlbGltaXRlci5cbiAgICAgIHZhciByZURlbGltaXRlcnMgPSBSZWdFeHAoXG4gICAgICAgIChvcHRpb25zLmVzY2FwZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArXG4gICAgICAgIChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgKG9wdGlvbnMuZXZhbHVhdGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCQnXG4gICAgICAsICdnJyk7XG5cbiAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgIC8vIFRoZSBzb3VyY2VVUkwgZ2V0cyBpbmplY3RlZCBpbnRvIHRoZSBzb3VyY2UgdGhhdCdzIGV2YWwtZWQsIHNvIGJlIGNhcmVmdWxcbiAgICAgIC8vIHRvIG5vcm1hbGl6ZSBhbGwga2luZHMgb2Ygd2hpdGVzcGFjZSwgc28gZS5nLiBuZXdsaW5lcyAoYW5kIHVuaWNvZGUgdmVyc2lvbnMgb2YgaXQpIGNhbid0IHNuZWFrIGluXG4gICAgICAvLyBhbmQgZXNjYXBlIHRoZSBjb21tZW50LCB0aHVzIGluamVjdGluZyBjb2RlIHRoYXQgZ2V0cyBldmFsZWQuXG4gICAgICB2YXIgc291cmNlVVJMID0gJy8vIyBzb3VyY2VVUkw9JyArXG4gICAgICAgIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdzb3VyY2VVUkwnKVxuICAgICAgICAgID8gKG9wdGlvbnMuc291cmNlVVJMICsgJycpLnJlcGxhY2UoL1xccy9nLCAnICcpXG4gICAgICAgICAgOiAoJ2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbJyArICgrK3RlbXBsYXRlQ291bnRlcikgKyAnXScpXG4gICAgICAgICkgKyAnXFxuJztcblxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFsdWUgPSBlc1RlbXBsYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgaW4gc3RyaW5nIGxpdGVyYWxzLlxuICAgICAgICBzb3VyY2UgKz0gc3RyaW5nLnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLlxuICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG5fX2UoXCIgKyBlc2NhcGVWYWx1ZSArIFwiKSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGVWYWx1ZSArIFwiO1xcbl9fcCArPSAnXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG4oKF9fdCA9IChcIiArIGludGVycG9sYXRlVmFsdWUgKyBcIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgICAgICAvLyBUaGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIHByb2R1Y3RzIG5lZWRzIGBtYXRjaGAgcmV0dXJuZWQgaW5cbiAgICAgICAgLy8gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBgb2Zmc2V0YCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWRcbiAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbi5cbiAgICAgIHZhciB2YXJpYWJsZSA9IGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3ZhcmlhYmxlJykgJiYgb3B0aW9ucy52YXJpYWJsZTtcbiAgICAgIGlmICghdmFyaWFibGUpIHtcbiAgICAgICAgc291cmNlID0gJ3dpdGggKG9iaikge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gICAgICB9XG4gICAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiBhIGZvcmJpZGRlbiBjaGFyYWN0ZXIgd2FzIGZvdW5kIGluIGB2YXJpYWJsZWAsIHRvIHByZXZlbnRcbiAgICAgIC8vIHBvdGVudGlhbCBjb21tYW5kIGluamVjdGlvbiBhdHRhY2tzLlxuICAgICAgZWxzZSBpZiAocmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMudGVzdCh2YXJpYWJsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKElOVkFMSURfVEVNUExfVkFSX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3MuXG4gICAgICBzb3VyY2UgPSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcnKSA6IHNvdXJjZSlcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJylcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7XG5cbiAgICAgIC8vIEZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkuXG4gICAgICBzb3VyY2UgPSAnZnVuY3Rpb24oJyArICh2YXJpYWJsZSB8fCAnb2JqJykgKyAnKSB7XFxuJyArXG4gICAgICAgICh2YXJpYWJsZVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6ICdvYmogfHwgKG9iaiA9IHt9KTtcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBcInZhciBfX3QsIF9fcCA9ICcnXCIgK1xuICAgICAgICAoaXNFc2NhcGluZ1xuICAgICAgICAgICA/ICcsIF9fZSA9IF8uZXNjYXBlJ1xuICAgICAgICAgICA6ICcnXG4gICAgICAgICkgK1xuICAgICAgICAoaXNFdmFsdWF0aW5nXG4gICAgICAgICAgPyAnLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcXG4nICtcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XFxuXCJcbiAgICAgICAgICA6ICc7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgc291cmNlICtcbiAgICAgICAgJ3JldHVybiBfX3BcXG59JztcblxuICAgICAgdmFyIHJlc3VsdCA9IGF0dGVtcHQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbihpbXBvcnRzS2V5cywgc291cmNlVVJMICsgJ3JldHVybiAnICsgc291cmNlKVxuICAgICAgICAgIC5hcHBseSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdgIG1ldGhvZCBvclxuICAgICAgLy8gdGhlIGBzb3VyY2VgIHByb3BlcnR5IGFzIGEgY29udmVuaWVuY2UgZm9yIGlubGluaW5nIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBpZiAoaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b0xvd2VyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9Mb3dlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tZm9vLWJhci0tJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vYmFyJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdfX2Zvb19iYXJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xvd2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIHVwcGVyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b1VwcGVyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9VcHBlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tRk9PLUJBUi0tJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PQkFSJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdfX0ZPT19CQVJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1VwcGVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8udHJpbSgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnICBmb28gICcsICcgIGJhciAgJ10sIF8udHJpbSk7XG4gICAgICogLy8gPT4gWydmb28nLCAnYmFyJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUcmltKHN0cmluZyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGNoclN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KGNoYXJzKSxcbiAgICAgICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW1FbmQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW1FbmQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICctXy1hYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBzdHJpbmdUb0FycmF5KGNoYXJzKSkgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMgICdcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjLV8tJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1TdGFydCwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBzdHJpbmdUb0FycmF5KGNoYXJzKSk7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlcyBgc3RyaW5nYCBpZiBpdCdzIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogVGhlIGxhc3QgY2hhcmFjdGVycyBvZiB0aGUgdHJ1bmNhdGVkIHN0cmluZyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb21pc3Npb25cbiAgICAgKiBzdHJpbmcgd2hpY2ggZGVmYXVsdHMgdG8gXCIuLi5cIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cnVuY2F0ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubGVuZ3RoPTMwXSBUaGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vbWlzc2lvbj0nLi4uJ10gVGhlIHN0cmluZyB0byBpbmRpY2F0ZSB0ZXh0IGlzIG9taXR0ZWQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbb3B0aW9ucy5zZXBhcmF0b3JdIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byB0cnVuY2F0ZSB0by5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cnVuY2F0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJyk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hiby4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogJyAnXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwuLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6IC8sPyArL1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUuLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ29taXNzaW9uJzogJyBbLi4uXSdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnIFsuLi5dJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgb3B0aW9ucykge1xuICAgICAgdmFyIGxlbmd0aCA9IERFRkFVTFRfVFJVTkNfTEVOR1RILFxuICAgICAgICAgIG9taXNzaW9uID0gREVGQVVMVF9UUlVOQ19PTUlTU0lPTjtcblxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyBpbiBvcHRpb25zID8gb3B0aW9ucy5zZXBhcmF0b3IgOiBzZXBhcmF0b3I7XG4gICAgICAgIGxlbmd0aCA9ICdsZW5ndGgnIGluIG9wdGlvbnMgPyB0b0ludGVnZXIob3B0aW9ucy5sZW5ndGgpIDogbGVuZ3RoO1xuICAgICAgICBvbWlzc2lvbiA9ICdvbWlzc2lvbicgaW4gb3B0aW9ucyA/IGJhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKSA6IG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBpZiAoaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpO1xuICAgICAgICBzdHJMZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChsZW5ndGggPj0gc3RyTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgZW5kID0gbGVuZ3RoIC0gc3RyaW5nU2l6ZShvbWlzc2lvbik7XG4gICAgICBpZiAoZW5kIDwgMSkge1xuICAgICAgICByZXR1cm4gb21pc3Npb247XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gc3RyU3ltYm9sc1xuICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpXG4gICAgICAgIDogc3RyaW5nLnNsaWNlKDAsIGVuZCk7XG5cbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgICB9XG4gICAgICBpZiAoc3RyU3ltYm9scykge1xuICAgICAgICBlbmQgKz0gKHJlc3VsdC5sZW5ndGggLSBlbmQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgaWYgKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKSB7XG4gICAgICAgICAgdmFyIG1hdGNoLFxuICAgICAgICAgICAgICBzdWJzdHJpbmcgPSByZXN1bHQ7XG5cbiAgICAgICAgICBpZiAoIXNlcGFyYXRvci5nbG9iYWwpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCB0b1N0cmluZyhyZUZsYWdzLmV4ZWMoc2VwYXJhdG9yKSkgKyAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXBhcmF0b3IubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gc2VwYXJhdG9yLmV4ZWMoc3Vic3RyaW5nKSkpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbmQgPSBtYXRjaC5pbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG5ld0VuZCA9PT0gdW5kZWZpbmVkID8gZW5kIDogbmV3RW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJpbmcuaW5kZXhPZihiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKSwgZW5kKSAhPSBlbmQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcmVzdWx0Lmxhc3RJbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLmVzY2FwZWA7IHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBIVE1MIGVudGl0aWVzXG4gICAgICogYCZhbXA7YCwgYCZsdDtgLCBgJmd0O2AsIGAmcXVvdDtgLCBhbmQgYCYjMzk7YCBpbiBgc3RyaW5nYCB0b1xuICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBIVE1MIGVudGl0aWVzIGFyZSB1bmVzY2FwZWQuIFRvIHVuZXNjYXBlIGFkZGl0aW9uYWxcbiAgICAgKiBIVE1MIGVudGl0aWVzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjYuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB1bmVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuZXNjYXBlKCdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNFc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVFc2NhcGVkSHRtbCwgdW5lc2NhcGVIdG1sQ2hhcilcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gdXBwZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJy0tZm9vLWJhcicpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqXG4gICAgICogXy51cHBlckNhc2UoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICovXG4gICAgdmFyIHVwcGVyQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnZnJlZCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZSRUQnXG4gICAgICovXG4gICAgdmFyIHVwcGVyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvVXBwZXJDYXNlJyk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtwYXR0ZXJuXSBUaGUgcGF0dGVybiB0byBtYXRjaCB3b3Jkcy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJywgL1teLCBdKy9nKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJyYnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gd29yZHMoc3RyaW5nLCBwYXR0ZXJuLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBhdHRlcm4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IHBhdHRlcm47XG5cbiAgICAgIGlmIChwYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZykgPyB1bmljb2RlV29yZHMoc3RyaW5nKSA6IGFzY2lpV29yZHMoc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybikgfHwgW107XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gaW52b2tlIGBmdW5jYCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgcmVzdWx0IG9yIHRoZSBjYXVnaHQgZXJyb3JcbiAgICAgKiBvYmplY3QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhdHRlbXB0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBgZnVuY2AgcmVzdWx0IG9yIGVycm9yIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgdGhyb3dpbmcgZXJyb3JzIGZvciBpbnZhbGlkIHNlbGVjdG9ycy5cbiAgICAgKiB2YXIgZWxlbWVudHMgPSBfLmF0dGVtcHQoZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICAgKiAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgKiB9LCAnPl8+Jyk7XG4gICAgICpcbiAgICAgKiBpZiAoXy5pc0Vycm9yKGVsZW1lbnRzKSkge1xuICAgICAqICAgZWxlbWVudHMgPSBbXTtcbiAgICAgKiB9XG4gICAgICovXG4gICAgdmFyIGF0dGVtcHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQmluZHMgbWV0aG9kcyBvZiBhbiBvYmplY3QgdG8gdGhlIG9iamVjdCBpdHNlbGYsIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZ1xuICAgICAqIG1ldGhvZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiaW5kIGFuZCBhc3NpZ24gdGhlIGJvdW5kIG1ldGhvZHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gbWV0aG9kTmFtZXMgVGhlIG9iamVjdCBtZXRob2QgbmFtZXMgdG8gYmluZC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdmlldyA9IHtcbiAgICAgKiAgICdsYWJlbCc6ICdkb2NzJyxcbiAgICAgKiAgICdjbGljayc6IGZ1bmN0aW9uKCkge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnY2xpY2tlZCAnICsgdGhpcy5sYWJlbCk7XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uYmluZEFsbCh2aWV3LCBbJ2NsaWNrJ10pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB2aWV3LmNsaWNrKTtcbiAgICAgKiAvLyA9PiBMb2dzICdjbGlja2VkIGRvY3MnIHdoZW4gY2xpY2tlZC5cbiAgICAgKi9cbiAgICB2YXIgYmluZEFsbCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgbWV0aG9kTmFtZXMpIHtcbiAgICAgIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGtleSA9IHRvS2V5KGtleSk7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgYmluZChvYmplY3Rba2V5XSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpdGVyYXRlcyBvdmVyIGBwYWlyc2AgYW5kIGludm9rZXMgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiBmdW5jdGlvbiBvZiB0aGUgZmlyc3QgcHJlZGljYXRlIHRvIHJldHVybiB0cnV0aHkuIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb25cbiAgICAgKiBwYWlycyBhcmUgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb24gcGFpcnMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8uY29uZChbXG4gICAgICogICBbXy5tYXRjaGVzKHsgJ2EnOiAxIH0pLCAgICAgICAgICAgXy5jb25zdGFudCgnbWF0Y2hlcyBBJyldLFxuICAgICAqICAgW18uY29uZm9ybXMoeyAnYic6IF8uaXNOdW1iZXIgfSksIF8uY29uc3RhbnQoJ21hdGNoZXMgQicpXSxcbiAgICAgKiAgIFtfLnN0dWJUcnVlLCAgICAgICAgICAgICAgICAgICAgICBfLmNvbnN0YW50KCdubyBtYXRjaCcpXVxuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEEnXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAwLCAnYic6IDEgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQidcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6ICcxJywgJ2InOiAnMicgfSk7XG4gICAgICogLy8gPT4gJ25vIG1hdGNoJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmQocGFpcnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYWlycyA9PSBudWxsID8gMCA6IHBhaXJzLmxlbmd0aCxcbiAgICAgICAgICB0b0l0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoKTtcblxuICAgICAgcGFpcnMgPSAhbGVuZ3RoID8gW10gOiBhcnJheU1hcChwYWlycywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICBpZiAodHlwZW9mIHBhaXJbMV0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RvSXRlcmF0ZWUocGFpclswXSksIHBhaXJbMV1dO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICAgIGlmIChhcHBseShwYWlyWzBdLCB0aGlzLCBhcmdzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHBhaXJbMV0sIHRoaXMsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgcHJlZGljYXRlIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aFxuICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBhIGdpdmVuIG9iamVjdCwgcmV0dXJuaW5nIGB0cnVlYCBpZlxuICAgICAqIGFsbCBwcmVkaWNhdGVzIHJldHVybiB0cnV0aHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zVG9gIHdpdGhcbiAgICAgKiBgc291cmNlYCBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAyLCAnYic6IDEgfSxcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLmNvbmZvcm1zKHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBgdmFsdWVgIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQgaW5cbiAgICAgKiBpdHMgcGxhY2UuIFRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBgbnVsbGAsXG4gICAgICogb3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKDEsIDEwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbyh1bmRlZmluZWQsIDEwKTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlZmF1bHRUbyh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb25zXG4gICAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICAgICAqIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1JpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvdyhbXy5hZGQsIHNxdWFyZV0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3cgPSBjcmVhdGVGbG93KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsb3dgIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0XG4gICAgICogaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvd1JpZ2h0KFtzcXVhcmUsIF8uYWRkXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvd1JpZ2h0ID0gY3JlYXRlRmxvdyh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi4gSWYgYGZ1bmNgIGlzIGEgcHJvcGVydHkgbmFtZSwgdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyB0aGVcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBnaXZlbiBlbGVtZW50LiBJZiBgZnVuY2AgaXMgYW4gYXJyYXkgb3Igb2JqZWN0LCB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gdGhlIGVxdWl2YWxlbnRcbiAgICAgKiBzb3VyY2UgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSBbZnVuYz1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2FsbGJhY2suXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKFsndXNlcicsICdmcmVkJ10pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgXy5pdGVyYXRlZSgndXNlcicpKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIENyZWF0ZSBjdXN0b20gaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKiBfLml0ZXJhdGVlID0gXy53cmFwKF8uaXRlcmF0ZWUsIGZ1bmN0aW9uKGl0ZXJhdGVlLCBmdW5jKSB7XG4gICAgICogICByZXR1cm4gIV8uaXNSZWdFeHAoZnVuYykgPyBpdGVyYXRlZShmdW5jKSA6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAqICAgICByZXR1cm4gZnVuYy50ZXN0KHN0cmluZyk7XG4gICAgICogICB9O1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIoWydhYmMnLCAnZGVmJ10sIC9lZi8pO1xuICAgICAqIC8vID0+IFsnZGVmJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpdGVyYXRlZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jID09ICdmdW5jdGlvbicgPyBmdW5jIDogYmFzZUNsb25lKGZ1bmMsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBhIGdpdmVuXG4gICAgICogb2JqZWN0IGFuZCBgc291cmNlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBlcXVpdmFsZW50XG4gICAgICogcHJvcGVydHkgdmFsdWVzLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5pc01hdGNoYCB3aXRoIGBzb3VyY2VgXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBjaGVja2VkIGJ5IGNvbWJpbmluZyBzZXZlcmFsIG1hdGNoZXJzXG4gICAgICogdXNpbmcgYF8ub3ZlclNvbWVgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ubWF0Y2hlcyh7ICdhJzogNCwgJ2MnOiA2IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksIF8ubWF0Y2hlcyh7ICdhJzogNCB9KV0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZVxuICAgICAqIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdCB0byBgc3JjVmFsdWVgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZVxuICAgICAqIG9iamVjdCB2YWx1ZSBpcyBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3RcbiAgICAgKiBgc3JjVmFsdWVgIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlXG4gICAgICogYF8uaXNFcXVhbGAgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBjaGVja2VkIGJ5IGNvbWJpbmluZyBzZXZlcmFsIG1hdGNoZXJzXG4gICAgICogdXNpbmcgYF8ub3ZlclNvbWVgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZChvYmplY3RzLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqXG4gICAgICogLy8gQ2hlY2tpbmcgZm9yIHNldmVyYWwgcG9zc2libGUgdmFsdWVzXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5vdmVyU29tZShbXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCAxKSwgXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCA0KV0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgYmFzZUNsb25lKHNyY1ZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMikgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDEpIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZCgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoWydhJywgJ2InXSkpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciBtZXRob2QgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1ldGhvZGA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiB0aGUgbWV0aG9kIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBfLnRpbWVzKDMsIF8uY29uc3RhbnQpLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZE9mID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYWxsIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBmdW5jdGlvbiBwcm9wZXJ0aWVzIG9mIGEgc291cmNlXG4gICAgICogb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24sIHRoZW4gbWV0aG9kc1xuICAgICAqIGFyZSBhZGRlZCB0byBpdHMgcHJvdG90eXBlIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVXNlIGBfLnJ1bkluQ29udGV4dGAgdG8gY3JlYXRlIGEgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdG9cbiAgICAgKiBhdm9pZCBjb25mbGljdHMgY2F1c2VkIGJ5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgZnVuY3Rpb25zIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoYWluPXRydWVdIFNwZWNpZnkgd2hldGhlciBtaXhpbnMgYXJlIGNoYWluYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB2b3dlbHMoc3RyaW5nKSB7XG4gICAgICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gICAgICogICAgIHJldHVybiAvW2FlaW91XS9pLnRlc3Qodik7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9KTtcbiAgICAgKiBfLnZvd2VscygnZnJlZCcpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpLFxuICAgICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIHByb3BzKTtcblxuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCAmJlxuICAgICAgICAgICEoaXNPYmplY3Qoc291cmNlKSAmJiAobWV0aG9kTmFtZXMubGVuZ3RoIHx8ICFwcm9wcy5sZW5ndGgpKSkge1xuICAgICAgICBvcHRpb25zID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSBvYmplY3Q7XG4gICAgICAgIG9iamVjdCA9IHRoaXM7XG4gICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2hhaW4gPSAhKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykgfHwgISFvcHRpb25zLmNoYWluLFxuICAgICAgICAgIGlzRnVuYyA9IGlzRnVuY3Rpb24ob2JqZWN0KTtcblxuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBmdW5jID0gc291cmNlW21ldGhvZE5hbWVdO1xuICAgICAgICBvYmplY3RbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICBpZiAoaXNGdW5jKSB7XG4gICAgICAgICAgb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX187XG4gICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHtcbiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbnMgPSByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG5cbiAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKHsgJ2Z1bmMnOiBmdW5jLCAnYXJncyc6IGFyZ3VtZW50cywgJ3RoaXNBcmcnOiBvYmplY3QgfSk7XG4gICAgICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KG9iamVjdCwgYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLCBhcmd1bWVudHMpKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvXG4gICAgICogdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbG9kYXNoID0gXy5ub0NvbmZsaWN0KCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgIGlmIChyb290Ll8gPT09IHRoaXMpIHtcbiAgICAgICAgcm9vdC5fID0gb2xkRGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGFyZ3VtZW50IGF0IGluZGV4IGBuYC4gSWYgYG5gIGlzIG5lZ2F0aXZlLFxuICAgICAqIHRoZSBudGggYXJndW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFzcy10aHJ1IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKDEpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoLTIpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGhBcmcobikge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHJldHVybiBiYXNlTnRoKGFyZ3MsIG4pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgaXRlcmF0ZWVzYCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXNcbiAgICAgKiBhbmQgcmV0dXJucyB0aGVpciByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlcihbTWF0aC5tYXgsIE1hdGgubWluXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDEsIDIsIDMsIDQpO1xuICAgICAqIC8vID0+IFs0LCAxXVxuICAgICAqL1xuICAgIHZhciBvdmVyID0gY3JlYXRlT3ZlcihhcnJheU1hcCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbGwqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogRm9sbG93aW5nIHNob3J0aGFuZHMgYXJlIHBvc3NpYmxlIGZvciBwcm92aWRpbmcgcHJlZGljYXRlcy5cbiAgICAgKiBQYXNzIGFuIGBPYmplY3RgIGFuZCBpdCB3aWxsIGJlIHVzZWQgYXMgYW4gcGFyYW1ldGVyIGZvciBgXy5tYXRjaGVzYCB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS5cbiAgICAgKiBQYXNzIGFuIGBBcnJheWAgb2YgcGFyYW1ldGVycyBmb3IgYF8ubWF0Y2hlc1Byb3BlcnR5YCBhbmQgdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtwcmVkaWNhdGVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyRXZlcnkoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIG92ZXJFdmVyeSA9IGNyZWF0ZU92ZXIoYXJyYXlFdmVyeSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbnkqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogRm9sbG93aW5nIHNob3J0aGFuZHMgYXJlIHBvc3NpYmxlIGZvciBwcm92aWRpbmcgcHJlZGljYXRlcy5cbiAgICAgKiBQYXNzIGFuIGBPYmplY3RgIGFuZCBpdCB3aWxsIGJlIHVzZWQgYXMgYW4gcGFyYW1ldGVyIGZvciBgXy5tYXRjaGVzYCB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS5cbiAgICAgKiBQYXNzIGFuIGBBcnJheWAgb2YgcGFyYW1ldGVycyBmb3IgYF8ubWF0Y2hlc1Byb3BlcnR5YCBhbmQgdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtwcmVkaWNhdGVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyU29tZShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIG1hdGNoZXNGdW5jID0gXy5vdmVyU29tZShbeyAnYSc6IDEgfSwgeyAnYSc6IDIgfV0pXG4gICAgICogdmFyIG1hdGNoZXNQcm9wZXJ0eUZ1bmMgPSBfLm92ZXJTb21lKFtbJ2EnLCAxXSwgWydhJywgMl1dKVxuICAgICAqL1xuICAgIHZhciBvdmVyU29tZSA9IGNyZWF0ZU92ZXIoYXJyYXlTb21lKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IDIgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgICAgIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5wcm9wZXJ0eWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnNcbiAgICAgKiB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFswLCAxLCAyXSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbVxuICAgICAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gICAgICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gICAgICogaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDQpO1xuICAgICAqIC8vID0+IFswLCAxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgtNCk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmFuZ2VgIGV4Y2VwdCB0aGF0IGl0IHBvcHVsYXRlcyB2YWx1ZXMgaW5cbiAgICAgKiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCg0KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgtNCk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNSk7XG4gICAgICogLy8gPT4gWzQsIDMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFsxNSwgMTAsIDUsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZVJpZ2h0ID0gY3JlYXRlUmFuZ2UodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5cyk7XG4gICAgICogLy8gPT4gW1tdLCBbXV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5c1swXSA9PT0gYXJyYXlzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJBcnJheSgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAgICAgKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLnN0dWJPYmplY3QpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3t9LCB7fV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1Yk9iamVjdCgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnJywgJyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlN0cmluZygpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJUcnVlKTtcbiAgICAgKiAvLyA9PiBbdHJ1ZSwgdHJ1ZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViVHJ1ZSgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIGl0ZXJhdGVlIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mXG4gICAgICogZWFjaCBpbnZvY2F0aW9uLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKGluZGV4KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMywgU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMScsICcyJ11cbiAgICAgKlxuICAgICAqICBfLnRpbWVzKDQsIF8uY29uc3RhbnQoMCkpO1xuICAgICAqIC8vID0+IFswLCAwLCAwLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgaWYgKG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IE1BWF9BUlJBWV9MRU5HVEgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtcbiAgICAgIG4gLT0gTUFYX0FSUkFZX0xFTkdUSDtcblxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VUaW1lcyhsZW5ndGgsIGl0ZXJhdGVlKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgICBpdGVyYXRlZShpbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJzAnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIHRvS2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N5bWJvbCh2YWx1ZSkgPyBbdmFsdWVdIDogY29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgnY29udGFjdF8nKTtcbiAgICAgKiAvLyA9PiAnY29udGFjdF8xMDQnXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCk7XG4gICAgICogLy8gPT4gJzEwNSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgICAgIHZhciBpZCA9ICsraWRDb3VudGVyO1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXVnZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFkZGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0b3RhbC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5hZGQoNiwgNCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICB2YXIgYWRkID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihhdWdlbmQsIGFkZGVuZCkge1xuICAgICAgcmV0dXJuIGF1Z2VuZCArIGFkZGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdXAgdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgdXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIHVwIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jZWlsKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiBfLmNlaWwoNi4wMDQsIDIpO1xuICAgICAqIC8vID0+IDYuMDFcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2MDQwLCAtMik7XG4gICAgICogLy8gPT4gNjEwMFxuICAgICAqL1xuICAgIHZhciBjZWlsID0gY3JlYXRlUm91bmQoJ2NlaWwnKTtcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlkZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aXNvciBUaGUgc2Vjb25kIG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHF1b3RpZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpdmlkZSg2LCA0KTtcbiAgICAgKiAvLyA9PiAxLjVcbiAgICAgKi9cbiAgICB2YXIgZGl2aWRlID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgcmV0dXJuIGRpdmlkZW5kIC8gZGl2aXNvcjtcbiAgICB9LCAxKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgZG93biB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCBkb3duLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgZG93biB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIGRvd24gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsb29yKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLmZsb29yKDAuMDQ2LCAyKTtcbiAgICAgKiAvLyA9PiAwLjA0XG4gICAgICpcbiAgICAgKiBfLmZsb29yKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MDAwXG4gICAgICovXG4gICAgdmFyIGZsb29yID0gY3JlYXRlUm91bmQoJ2Zsb29yJyk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA4XG4gICAgICpcbiAgICAgKiBfLm1heChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWF4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heEJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1lYW4gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWVhbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuKGFycmF5KSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGlkZW50aXR5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lYW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBhdmVyYWdlZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLm1pbihbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWVyIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGljYW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcHJvZHVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tdWx0aXBseSg2LCA0KTtcbiAgICAgKiAvLyA9PiAyNFxuICAgICAqL1xuICAgIHZhciBtdWx0aXBseSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllciwgbXVsdGlwbGljYW5kKSB7XG4gICAgICByZXR1cm4gbXVsdGlwbGllciAqIG11bHRpcGxpY2FuZDtcbiAgICB9LCAxKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNiwgMik7XG4gICAgICogLy8gPT4gNC4wMVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDEwMFxuICAgICAqL1xuICAgIHZhciByb3VuZCA9IGNyZWF0ZVJvdW5kKCdyb3VuZCcpO1xuXG4gICAgLyoqXG4gICAgICogU3VidHJhY3QgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW51ZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3VidHJhaGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGRpZmZlcmVuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VidHJhY3QoNiwgNCk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIHZhciBzdWJ0cmFjdCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obWludWVuZCwgc3VidHJhaGVuZCkge1xuICAgICAgcmV0dXJuIG1pbnVlbmQgLSBzdWJ0cmFoZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1bShbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBpZGVudGl0eSlcbiAgICAgICAgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc3VtYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgc3VtbWVkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5zdW1CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IDIwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsICduJyk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW1CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiAwO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHdyYXBwZWQgdmFsdWVzIGluIGNoYWluIHNlcXVlbmNlcy5cbiAgICBsb2Rhc2guYWZ0ZXIgPSBhZnRlcjtcbiAgICBsb2Rhc2guYXJ5ID0gYXJ5O1xuICAgIGxvZGFzaC5hc3NpZ24gPSBhc3NpZ247XG4gICAgbG9kYXNoLmFzc2lnbkluID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmFzc2lnbkluV2l0aCA9IGFzc2lnbkluV2l0aDtcbiAgICBsb2Rhc2guYXNzaWduV2l0aCA9IGFzc2lnbldpdGg7XG4gICAgbG9kYXNoLmF0ID0gYXQ7XG4gICAgbG9kYXNoLmJlZm9yZSA9IGJlZm9yZTtcbiAgICBsb2Rhc2guYmluZCA9IGJpbmQ7XG4gICAgbG9kYXNoLmJpbmRBbGwgPSBiaW5kQWxsO1xuICAgIGxvZGFzaC5iaW5kS2V5ID0gYmluZEtleTtcbiAgICBsb2Rhc2guY2FzdEFycmF5ID0gY2FzdEFycmF5O1xuICAgIGxvZGFzaC5jaGFpbiA9IGNoYWluO1xuICAgIGxvZGFzaC5jaHVuayA9IGNodW5rO1xuICAgIGxvZGFzaC5jb21wYWN0ID0gY29tcGFjdDtcbiAgICBsb2Rhc2guY29uY2F0ID0gY29uY2F0O1xuICAgIGxvZGFzaC5jb25kID0gY29uZDtcbiAgICBsb2Rhc2guY29uZm9ybXMgPSBjb25mb3JtcztcbiAgICBsb2Rhc2guY29uc3RhbnQgPSBjb25zdGFudDtcbiAgICBsb2Rhc2guY291bnRCeSA9IGNvdW50Qnk7XG4gICAgbG9kYXNoLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBsb2Rhc2guY3VycnkgPSBjdXJyeTtcbiAgICBsb2Rhc2guY3VycnlSaWdodCA9IGN1cnJ5UmlnaHQ7XG4gICAgbG9kYXNoLmRlYm91bmNlID0gZGVib3VuY2U7XG4gICAgbG9kYXNoLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4gICAgbG9kYXNoLmRlZmF1bHRzRGVlcCA9IGRlZmF1bHRzRGVlcDtcbiAgICBsb2Rhc2guZGVmZXIgPSBkZWZlcjtcbiAgICBsb2Rhc2guZGVsYXkgPSBkZWxheTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2U7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VCeSA9IGRpZmZlcmVuY2VCeTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZVdpdGggPSBkaWZmZXJlbmNlV2l0aDtcbiAgICBsb2Rhc2guZHJvcCA9IGRyb3A7XG4gICAgbG9kYXNoLmRyb3BSaWdodCA9IGRyb3BSaWdodDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0V2hpbGUgPSBkcm9wUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2guZHJvcFdoaWxlID0gZHJvcFdoaWxlO1xuICAgIGxvZGFzaC5maWxsID0gZmlsbDtcbiAgICBsb2Rhc2guZmlsdGVyID0gZmlsdGVyO1xuICAgIGxvZGFzaC5mbGF0TWFwID0gZmxhdE1hcDtcbiAgICBsb2Rhc2guZmxhdE1hcERlZXAgPSBmbGF0TWFwRGVlcDtcbiAgICBsb2Rhc2guZmxhdE1hcERlcHRoID0gZmxhdE1hcERlcHRoO1xuICAgIGxvZGFzaC5mbGF0dGVuID0gZmxhdHRlbjtcbiAgICBsb2Rhc2guZmxhdHRlbkRlZXAgPSBmbGF0dGVuRGVlcDtcbiAgICBsb2Rhc2guZmxhdHRlbkRlcHRoID0gZmxhdHRlbkRlcHRoO1xuICAgIGxvZGFzaC5mbGlwID0gZmxpcDtcbiAgICBsb2Rhc2guZmxvdyA9IGZsb3c7XG4gICAgbG9kYXNoLmZsb3dSaWdodCA9IGZsb3dSaWdodDtcbiAgICBsb2Rhc2guZnJvbVBhaXJzID0gZnJvbVBhaXJzO1xuICAgIGxvZGFzaC5mdW5jdGlvbnMgPSBmdW5jdGlvbnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9uc0luID0gZnVuY3Rpb25zSW47XG4gICAgbG9kYXNoLmdyb3VwQnkgPSBncm91cEJ5O1xuICAgIGxvZGFzaC5pbml0aWFsID0gaW5pdGlhbDtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb25CeSA9IGludGVyc2VjdGlvbkJ5O1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb25XaXRoID0gaW50ZXJzZWN0aW9uV2l0aDtcbiAgICBsb2Rhc2guaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIGxvZGFzaC5pbnZlcnRCeSA9IGludmVydEJ5O1xuICAgIGxvZGFzaC5pbnZva2VNYXAgPSBpbnZva2VNYXA7XG4gICAgbG9kYXNoLml0ZXJhdGVlID0gaXRlcmF0ZWU7XG4gICAgbG9kYXNoLmtleUJ5ID0ga2V5Qnk7XG4gICAgbG9kYXNoLmtleXMgPSBrZXlzO1xuICAgIGxvZGFzaC5rZXlzSW4gPSBrZXlzSW47XG4gICAgbG9kYXNoLm1hcCA9IG1hcDtcbiAgICBsb2Rhc2gubWFwS2V5cyA9IG1hcEtleXM7XG4gICAgbG9kYXNoLm1hcFZhbHVlcyA9IG1hcFZhbHVlcztcbiAgICBsb2Rhc2gubWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgbG9kYXNoLm1hdGNoZXNQcm9wZXJ0eSA9IG1hdGNoZXNQcm9wZXJ0eTtcbiAgICBsb2Rhc2gubWVtb2l6ZSA9IG1lbW9pemU7XG4gICAgbG9kYXNoLm1lcmdlID0gbWVyZ2U7XG4gICAgbG9kYXNoLm1lcmdlV2l0aCA9IG1lcmdlV2l0aDtcbiAgICBsb2Rhc2gubWV0aG9kID0gbWV0aG9kO1xuICAgIGxvZGFzaC5tZXRob2RPZiA9IG1ldGhvZE9mO1xuICAgIGxvZGFzaC5taXhpbiA9IG1peGluO1xuICAgIGxvZGFzaC5uZWdhdGUgPSBuZWdhdGU7XG4gICAgbG9kYXNoLm50aEFyZyA9IG50aEFyZztcbiAgICBsb2Rhc2gub21pdCA9IG9taXQ7XG4gICAgbG9kYXNoLm9taXRCeSA9IG9taXRCeTtcbiAgICBsb2Rhc2gub25jZSA9IG9uY2U7XG4gICAgbG9kYXNoLm9yZGVyQnkgPSBvcmRlckJ5O1xuICAgIGxvZGFzaC5vdmVyID0gb3ZlcjtcbiAgICBsb2Rhc2gub3ZlckFyZ3MgPSBvdmVyQXJncztcbiAgICBsb2Rhc2gub3ZlckV2ZXJ5ID0gb3ZlckV2ZXJ5O1xuICAgIGxvZGFzaC5vdmVyU29tZSA9IG92ZXJTb21lO1xuICAgIGxvZGFzaC5wYXJ0aWFsID0gcGFydGlhbDtcbiAgICBsb2Rhc2gucGFydGlhbFJpZ2h0ID0gcGFydGlhbFJpZ2h0O1xuICAgIGxvZGFzaC5wYXJ0aXRpb24gPSBwYXJ0aXRpb247XG4gICAgbG9kYXNoLnBpY2sgPSBwaWNrO1xuICAgIGxvZGFzaC5waWNrQnkgPSBwaWNrQnk7XG4gICAgbG9kYXNoLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgbG9kYXNoLnByb3BlcnR5T2YgPSBwcm9wZXJ0eU9mO1xuICAgIGxvZGFzaC5wdWxsID0gcHVsbDtcbiAgICBsb2Rhc2gucHVsbEFsbCA9IHB1bGxBbGw7XG4gICAgbG9kYXNoLnB1bGxBbGxCeSA9IHB1bGxBbGxCeTtcbiAgICBsb2Rhc2gucHVsbEFsbFdpdGggPSBwdWxsQWxsV2l0aDtcbiAgICBsb2Rhc2gucHVsbEF0ID0gcHVsbEF0O1xuICAgIGxvZGFzaC5yYW5nZSA9IHJhbmdlO1xuICAgIGxvZGFzaC5yYW5nZVJpZ2h0ID0gcmFuZ2VSaWdodDtcbiAgICBsb2Rhc2gucmVhcmcgPSByZWFyZztcbiAgICBsb2Rhc2gucmVqZWN0ID0gcmVqZWN0O1xuICAgIGxvZGFzaC5yZW1vdmUgPSByZW1vdmU7XG4gICAgbG9kYXNoLnJlc3QgPSByZXN0O1xuICAgIGxvZGFzaC5yZXZlcnNlID0gcmV2ZXJzZTtcbiAgICBsb2Rhc2guc2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7XG4gICAgbG9kYXNoLnNldCA9IHNldDtcbiAgICBsb2Rhc2guc2V0V2l0aCA9IHNldFdpdGg7XG4gICAgbG9kYXNoLnNodWZmbGUgPSBzaHVmZmxlO1xuICAgIGxvZGFzaC5zbGljZSA9IHNsaWNlO1xuICAgIGxvZGFzaC5zb3J0QnkgPSBzb3J0Qnk7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXEgPSBzb3J0ZWRVbmlxO1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxQnkgPSBzb3J0ZWRVbmlxQnk7XG4gICAgbG9kYXNoLnNwbGl0ID0gc3BsaXQ7XG4gICAgbG9kYXNoLnNwcmVhZCA9IHNwcmVhZDtcbiAgICBsb2Rhc2gudGFpbCA9IHRhaWw7XG4gICAgbG9kYXNoLnRha2UgPSB0YWtlO1xuICAgIGxvZGFzaC50YWtlUmlnaHQgPSB0YWtlUmlnaHQ7XG4gICAgbG9kYXNoLnRha2VSaWdodFdoaWxlID0gdGFrZVJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLnRha2VXaGlsZSA9IHRha2VXaGlsZTtcbiAgICBsb2Rhc2gudGFwID0gdGFwO1xuICAgIGxvZGFzaC50aHJvdHRsZSA9IHRocm90dGxlO1xuICAgIGxvZGFzaC50aHJ1ID0gdGhydTtcbiAgICBsb2Rhc2gudG9BcnJheSA9IHRvQXJyYXk7XG4gICAgbG9kYXNoLnRvUGFpcnMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC50b1BhaXJzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLnRvUGF0aCA9IHRvUGF0aDtcbiAgICBsb2Rhc2gudG9QbGFpbk9iamVjdCA9IHRvUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBsb2Rhc2gudW5hcnkgPSB1bmFyeTtcbiAgICBsb2Rhc2gudW5pb24gPSB1bmlvbjtcbiAgICBsb2Rhc2gudW5pb25CeSA9IHVuaW9uQnk7XG4gICAgbG9kYXNoLnVuaW9uV2l0aCA9IHVuaW9uV2l0aDtcbiAgICBsb2Rhc2gudW5pcSA9IHVuaXE7XG4gICAgbG9kYXNoLnVuaXFCeSA9IHVuaXFCeTtcbiAgICBsb2Rhc2gudW5pcVdpdGggPSB1bmlxV2l0aDtcbiAgICBsb2Rhc2gudW5zZXQgPSB1bnNldDtcbiAgICBsb2Rhc2gudW56aXAgPSB1bnppcDtcbiAgICBsb2Rhc2gudW56aXBXaXRoID0gdW56aXBXaXRoO1xuICAgIGxvZGFzaC51cGRhdGUgPSB1cGRhdGU7XG4gICAgbG9kYXNoLnVwZGF0ZVdpdGggPSB1cGRhdGVXaXRoO1xuICAgIGxvZGFzaC52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgbG9kYXNoLnZhbHVlc0luID0gdmFsdWVzSW47XG4gICAgbG9kYXNoLndpdGhvdXQgPSB3aXRob3V0O1xuICAgIGxvZGFzaC53b3JkcyA9IHdvcmRzO1xuICAgIGxvZGFzaC53cmFwID0gd3JhcDtcbiAgICBsb2Rhc2gueG9yID0geG9yO1xuICAgIGxvZGFzaC54b3JCeSA9IHhvckJ5O1xuICAgIGxvZGFzaC54b3JXaXRoID0geG9yV2l0aDtcbiAgICBsb2Rhc2guemlwID0gemlwO1xuICAgIGxvZGFzaC56aXBPYmplY3QgPSB6aXBPYmplY3Q7XG4gICAgbG9kYXNoLnppcE9iamVjdERlZXAgPSB6aXBPYmplY3REZWVwO1xuICAgIGxvZGFzaC56aXBXaXRoID0gemlwV2l0aDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lbnRyaWVzID0gdG9QYWlycztcbiAgICBsb2Rhc2guZW50cmllc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC5leHRlbmQgPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guZXh0ZW5kV2l0aCA9IGFzc2lnbkluV2l0aDtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBtaXhpbihsb2Rhc2gsIGxvZGFzaCk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzIGluIGNoYWluIHNlcXVlbmNlcy5cbiAgICBsb2Rhc2guYWRkID0gYWRkO1xuICAgIGxvZGFzaC5hdHRlbXB0ID0gYXR0ZW1wdDtcbiAgICBsb2Rhc2guY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xuICAgIGxvZGFzaC5jYXBpdGFsaXplID0gY2FwaXRhbGl6ZTtcbiAgICBsb2Rhc2guY2VpbCA9IGNlaWw7XG4gICAgbG9kYXNoLmNsYW1wID0gY2xhbXA7XG4gICAgbG9kYXNoLmNsb25lID0gY2xvbmU7XG4gICAgbG9kYXNoLmNsb25lRGVlcCA9IGNsb25lRGVlcDtcbiAgICBsb2Rhc2guY2xvbmVEZWVwV2l0aCA9IGNsb25lRGVlcFdpdGg7XG4gICAgbG9kYXNoLmNsb25lV2l0aCA9IGNsb25lV2l0aDtcbiAgICBsb2Rhc2guY29uZm9ybXNUbyA9IGNvbmZvcm1zVG87XG4gICAgbG9kYXNoLmRlYnVyciA9IGRlYnVycjtcbiAgICBsb2Rhc2guZGVmYXVsdFRvID0gZGVmYXVsdFRvO1xuICAgIGxvZGFzaC5kaXZpZGUgPSBkaXZpZGU7XG4gICAgbG9kYXNoLmVuZHNXaXRoID0gZW5kc1dpdGg7XG4gICAgbG9kYXNoLmVxID0gZXE7XG4gICAgbG9kYXNoLmVzY2FwZSA9IGVzY2FwZTtcbiAgICBsb2Rhc2guZXNjYXBlUmVnRXhwID0gZXNjYXBlUmVnRXhwO1xuICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5maW5kID0gZmluZDtcbiAgICBsb2Rhc2guZmluZEluZGV4ID0gZmluZEluZGV4O1xuICAgIGxvZGFzaC5maW5kS2V5ID0gZmluZEtleTtcbiAgICBsb2Rhc2guZmluZExhc3QgPSBmaW5kTGFzdDtcbiAgICBsb2Rhc2guZmluZExhc3RJbmRleCA9IGZpbmRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLmZpbmRMYXN0S2V5ID0gZmluZExhc3RLZXk7XG4gICAgbG9kYXNoLmZsb29yID0gZmxvb3I7XG4gICAgbG9kYXNoLmZvckVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5mb3JFYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZvckluID0gZm9ySW47XG4gICAgbG9kYXNoLmZvckluUmlnaHQgPSBmb3JJblJpZ2h0O1xuICAgIGxvZGFzaC5mb3JPd24gPSBmb3JPd247XG4gICAgbG9kYXNoLmZvck93blJpZ2h0ID0gZm9yT3duUmlnaHQ7XG4gICAgbG9kYXNoLmdldCA9IGdldDtcbiAgICBsb2Rhc2guZ3QgPSBndDtcbiAgICBsb2Rhc2guZ3RlID0gZ3RlO1xuICAgIGxvZGFzaC5oYXMgPSBoYXM7XG4gICAgbG9kYXNoLmhhc0luID0gaGFzSW47XG4gICAgbG9kYXNoLmhlYWQgPSBoZWFkO1xuICAgIGxvZGFzaC5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIGxvZGFzaC5pbmNsdWRlcyA9IGluY2x1ZGVzO1xuICAgIGxvZGFzaC5pbmRleE9mID0gaW5kZXhPZjtcbiAgICBsb2Rhc2guaW5SYW5nZSA9IGluUmFuZ2U7XG4gICAgbG9kYXNoLmludm9rZSA9IGludm9rZTtcbiAgICBsb2Rhc2guaXNBcmd1bWVudHMgPSBpc0FyZ3VtZW50cztcbiAgICBsb2Rhc2guaXNBcnJheSA9IGlzQXJyYXk7XG4gICAgbG9kYXNoLmlzQXJyYXlCdWZmZXIgPSBpc0FycmF5QnVmZmVyO1xuICAgIGxvZGFzaC5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuICAgIGxvZGFzaC5pc0FycmF5TGlrZU9iamVjdCA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuICAgIGxvZGFzaC5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG4gICAgbG9kYXNoLmlzQnVmZmVyID0gaXNCdWZmZXI7XG4gICAgbG9kYXNoLmlzRGF0ZSA9IGlzRGF0ZTtcbiAgICBsb2Rhc2guaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuICAgIGxvZGFzaC5pc0VtcHR5ID0gaXNFbXB0eTtcbiAgICBsb2Rhc2guaXNFcXVhbCA9IGlzRXF1YWw7XG4gICAgbG9kYXNoLmlzRXF1YWxXaXRoID0gaXNFcXVhbFdpdGg7XG4gICAgbG9kYXNoLmlzRXJyb3IgPSBpc0Vycm9yO1xuICAgIGxvZGFzaC5pc0Zpbml0ZSA9IGlzRmluaXRlO1xuICAgIGxvZGFzaC5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbiAgICBsb2Rhc2guaXNJbnRlZ2VyID0gaXNJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc0xlbmd0aCA9IGlzTGVuZ3RoO1xuICAgIGxvZGFzaC5pc01hcCA9IGlzTWFwO1xuICAgIGxvZGFzaC5pc01hdGNoID0gaXNNYXRjaDtcbiAgICBsb2Rhc2guaXNNYXRjaFdpdGggPSBpc01hdGNoV2l0aDtcbiAgICBsb2Rhc2guaXNOYU4gPSBpc05hTjtcbiAgICBsb2Rhc2guaXNOYXRpdmUgPSBpc05hdGl2ZTtcbiAgICBsb2Rhc2guaXNOaWwgPSBpc05pbDtcbiAgICBsb2Rhc2guaXNOdWxsID0gaXNOdWxsO1xuICAgIGxvZGFzaC5pc051bWJlciA9IGlzTnVtYmVyO1xuICAgIGxvZGFzaC5pc09iamVjdCA9IGlzT2JqZWN0O1xuICAgIGxvZGFzaC5pc09iamVjdExpa2UgPSBpc09iamVjdExpa2U7XG4gICAgbG9kYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuICAgIGxvZGFzaC5pc1NhZmVJbnRlZ2VyID0gaXNTYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNTZXQgPSBpc1NldDtcbiAgICBsb2Rhc2guaXNTdHJpbmcgPSBpc1N0cmluZztcbiAgICBsb2Rhc2guaXNTeW1ib2wgPSBpc1N5bWJvbDtcbiAgICBsb2Rhc2guaXNUeXBlZEFycmF5ID0gaXNUeXBlZEFycmF5O1xuICAgIGxvZGFzaC5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuICAgIGxvZGFzaC5pc1dlYWtNYXAgPSBpc1dlYWtNYXA7XG4gICAgbG9kYXNoLmlzV2Vha1NldCA9IGlzV2Vha1NldDtcbiAgICBsb2Rhc2guam9pbiA9IGpvaW47XG4gICAgbG9kYXNoLmtlYmFiQ2FzZSA9IGtlYmFiQ2FzZTtcbiAgICBsb2Rhc2gubGFzdCA9IGxhc3Q7XG4gICAgbG9kYXNoLmxhc3RJbmRleE9mID0gbGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLmxvd2VyQ2FzZSA9IGxvd2VyQ2FzZTtcbiAgICBsb2Rhc2gubG93ZXJGaXJzdCA9IGxvd2VyRmlyc3Q7XG4gICAgbG9kYXNoLmx0ID0gbHQ7XG4gICAgbG9kYXNoLmx0ZSA9IGx0ZTtcbiAgICBsb2Rhc2gubWF4ID0gbWF4O1xuICAgIGxvZGFzaC5tYXhCeSA9IG1heEJ5O1xuICAgIGxvZGFzaC5tZWFuID0gbWVhbjtcbiAgICBsb2Rhc2gubWVhbkJ5ID0gbWVhbkJ5O1xuICAgIGxvZGFzaC5taW4gPSBtaW47XG4gICAgbG9kYXNoLm1pbkJ5ID0gbWluQnk7XG4gICAgbG9kYXNoLnN0dWJBcnJheSA9IHN0dWJBcnJheTtcbiAgICBsb2Rhc2guc3R1YkZhbHNlID0gc3R1YkZhbHNlO1xuICAgIGxvZGFzaC5zdHViT2JqZWN0ID0gc3R1Yk9iamVjdDtcbiAgICBsb2Rhc2guc3R1YlN0cmluZyA9IHN0dWJTdHJpbmc7XG4gICAgbG9kYXNoLnN0dWJUcnVlID0gc3R1YlRydWU7XG4gICAgbG9kYXNoLm11bHRpcGx5ID0gbXVsdGlwbHk7XG4gICAgbG9kYXNoLm50aCA9IG50aDtcbiAgICBsb2Rhc2gubm9Db25mbGljdCA9IG5vQ29uZmxpY3Q7XG4gICAgbG9kYXNoLm5vb3AgPSBub29wO1xuICAgIGxvZGFzaC5ub3cgPSBub3c7XG4gICAgbG9kYXNoLnBhZCA9IHBhZDtcbiAgICBsb2Rhc2gucGFkRW5kID0gcGFkRW5kO1xuICAgIGxvZGFzaC5wYWRTdGFydCA9IHBhZFN0YXJ0O1xuICAgIGxvZGFzaC5wYXJzZUludCA9IHBhcnNlSW50O1xuICAgIGxvZGFzaC5yYW5kb20gPSByYW5kb207XG4gICAgbG9kYXNoLnJlZHVjZSA9IHJlZHVjZTtcbiAgICBsb2Rhc2gucmVkdWNlUmlnaHQgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2gucmVwZWF0ID0gcmVwZWF0O1xuICAgIGxvZGFzaC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICBsb2Rhc2gucmVzdWx0ID0gcmVzdWx0O1xuICAgIGxvZGFzaC5yb3VuZCA9IHJvdW5kO1xuICAgIGxvZGFzaC5ydW5JbkNvbnRleHQgPSBydW5JbkNvbnRleHQ7XG4gICAgbG9kYXNoLnNhbXBsZSA9IHNhbXBsZTtcbiAgICBsb2Rhc2guc2l6ZSA9IHNpemU7XG4gICAgbG9kYXNoLnNuYWtlQ2FzZSA9IHNuYWtlQ2FzZTtcbiAgICBsb2Rhc2guc29tZSA9IHNvbWU7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4ID0gc29ydGVkSW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4QnkgPSBzb3J0ZWRJbmRleEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleE9mID0gc29ydGVkSW5kZXhPZjtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4ID0gc29ydGVkTGFzdEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeSA9IHNvcnRlZExhc3RJbmRleEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXhPZiA9IHNvcnRlZExhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5zdGFydENhc2UgPSBzdGFydENhc2U7XG4gICAgbG9kYXNoLnN0YXJ0c1dpdGggPSBzdGFydHNXaXRoO1xuICAgIGxvZGFzaC5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuICAgIGxvZGFzaC5zdW0gPSBzdW07XG4gICAgbG9kYXNoLnN1bUJ5ID0gc3VtQnk7XG4gICAgbG9kYXNoLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgbG9kYXNoLnRpbWVzID0gdGltZXM7XG4gICAgbG9kYXNoLnRvRmluaXRlID0gdG9GaW5pdGU7XG4gICAgbG9kYXNoLnRvSW50ZWdlciA9IHRvSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9MZW5ndGggPSB0b0xlbmd0aDtcbiAgICBsb2Rhc2gudG9Mb3dlciA9IHRvTG93ZXI7XG4gICAgbG9kYXNoLnRvTnVtYmVyID0gdG9OdW1iZXI7XG4gICAgbG9kYXNoLnRvU2FmZUludGVnZXIgPSB0b1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIGxvZGFzaC50b1VwcGVyID0gdG9VcHBlcjtcbiAgICBsb2Rhc2gudHJpbSA9IHRyaW07XG4gICAgbG9kYXNoLnRyaW1FbmQgPSB0cmltRW5kO1xuICAgIGxvZGFzaC50cmltU3RhcnQgPSB0cmltU3RhcnQ7XG4gICAgbG9kYXNoLnRydW5jYXRlID0gdHJ1bmNhdGU7XG4gICAgbG9kYXNoLnVuZXNjYXBlID0gdW5lc2NhcGU7XG4gICAgbG9kYXNoLnVuaXF1ZUlkID0gdW5pcXVlSWQ7XG4gICAgbG9kYXNoLnVwcGVyQ2FzZSA9IHVwcGVyQ2FzZTtcbiAgICBsb2Rhc2gudXBwZXJGaXJzdCA9IHVwcGVyRmlyc3Q7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZmlyc3QgPSBoZWFkO1xuXG4gICAgbWl4aW4obG9kYXNoLCAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc291cmNlID0ge307XG4gICAgICBiYXNlRm9yT3duKGxvZGFzaCwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLnByb3RvdHlwZSwgbWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICBzb3VyY2VbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfSgpKSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgbG9kYXNoLlZFUlNJT04gPSBWRVJTSU9OO1xuXG4gICAgLy8gQXNzaWduIGRlZmF1bHQgcGxhY2Vob2xkZXJzLlxuICAgIGFycmF5RWFjaChbJ2JpbmQnLCAnYmluZEtleScsICdjdXJyeScsICdjdXJyeVJpZ2h0JywgJ3BhcnRpYWwnLCAncGFydGlhbFJpZ2h0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIGxvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlciA9IGxvZGFzaDtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmRyb3BgIGFuZCBgXy50YWtlYCB2YXJpYW50cy5cbiAgICBhcnJheUVhY2goWydkcm9wJywgJ3Rha2UnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgbiA9IG4gPT09IHVuZGVmaW5lZCA/IDEgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLCAwKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gKHRoaXMuX19maWx0ZXJlZF9fICYmICFpbmRleClcbiAgICAgICAgICA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKVxuICAgICAgICAgIDogdGhpcy5jbG9uZSgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fKSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSBuYXRpdmVNaW4obiwgcmVzdWx0Ll9fdGFrZUNvdW50X18pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5fX3ZpZXdzX18ucHVzaCh7XG4gICAgICAgICAgICAnc2l6ZSc6IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKSxcbiAgICAgICAgICAgICd0eXBlJzogbWV0aG9kTmFtZSArIChyZXN1bHQuX19kaXJfXyA8IDAgPyAnUmlnaHQnIDogJycpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lICsgJ1JpZ2h0J10gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKVttZXRob2ROYW1lXShuKS5yZXZlcnNlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0aGF0IGFjY2VwdCBhbiBgaXRlcmF0ZWVgIHZhbHVlLlxuICAgIGFycmF5RWFjaChbJ2ZpbHRlcicsICdtYXAnLCAndGFrZVdoaWxlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdHlwZSA9IGluZGV4ICsgMSxcbiAgICAgICAgICBpc0ZpbHRlciA9IHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRyB8fCB0eXBlID09IExBWllfV0hJTEVfRkxBRztcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18ucHVzaCh7XG4gICAgICAgICAgJ2l0ZXJhdGVlJzogZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLFxuICAgICAgICAgICd0eXBlJzogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHJlc3VsdC5fX2ZpbHRlcmVkX18gfHwgaXNGaWx0ZXI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaGVhZGAgYW5kIGBfLmxhc3RgLlxuICAgIGFycmF5RWFjaChbJ2hlYWQnLCAnbGFzdCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHRha2VOYW1lID0gJ3Rha2UnICsgKGluZGV4ID8gJ1JpZ2h0JyA6ICcnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Rha2VOYW1lXSgxKS52YWx1ZSgpWzBdO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmluaXRpYWxgIGFuZCBgXy50YWlsYC5cbiAgICBhcnJheUVhY2goWydpbml0aWFsJywgJ3RhaWwnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciBkcm9wTmFtZSA9ICdkcm9wJyArIChpbmRleCA/ICcnIDogJ1JpZ2h0Jyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18gPyBuZXcgTGF6eVdyYXBwZXIodGhpcykgOiB0aGlzW2Ryb3BOYW1lXSgxKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29tcGFjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihwcmVkaWNhdGUpLmhlYWQoKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmRMYXN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG5cbiAgICAgIHZhciByZXN1bHQgPSB0aGlzO1xuICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18gJiYgKHN0YXJ0ID4gMCB8fCBlbmQgPCAwKSkge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmRyb3Aoc3RhcnQpO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHRvSW50ZWdlcihlbmQpO1xuICAgICAgICByZXN1bHQgPSBlbmQgPCAwID8gcmVzdWx0LmRyb3BSaWdodCgtZW5kKSA6IHJlc3VsdC50YWtlKGVuZCAtIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZSA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZShwcmVkaWNhdGUpLnJldmVyc2UoKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCk7XG4gICAgfTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgY2hlY2tJdGVyYXRlZSA9IC9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLFxuICAgICAgICAgIGlzVGFrZXIgPSAvXig/OmhlYWR8bGFzdCkkLy50ZXN0KG1ldGhvZE5hbWUpLFxuICAgICAgICAgIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbaXNUYWtlciA/ICgndGFrZScgKyAobWV0aG9kTmFtZSA9PSAnbGFzdCcgPyAnUmlnaHQnIDogJycpKSA6IG1ldGhvZE5hbWVdLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IGlzVGFrZXIgfHwgL15maW5kLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBpZiAoIWxvZGFzaEZ1bmMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgICAgYXJncyA9IGlzVGFrZXIgPyBbMV0gOiBhcmd1bWVudHMsXG4gICAgICAgICAgICBpc0xhenkgPSB2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyLFxuICAgICAgICAgICAgaXRlcmF0ZWUgPSBhcmdzWzBdLFxuICAgICAgICAgICAgdXNlTGF6eSA9IGlzTGF6eSB8fCBpc0FycmF5KHZhbHVlKTtcblxuICAgICAgICB2YXIgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2hGdW5jLmFwcGx5KGxvZGFzaCwgYXJyYXlQdXNoKFt2YWx1ZV0sIGFyZ3MpKTtcbiAgICAgICAgICByZXR1cm4gKGlzVGFrZXIgJiYgY2hhaW5BbGwpID8gcmVzdWx0WzBdIDogcmVzdWx0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh1c2VMYXp5ICYmIGNoZWNrSXRlcmF0ZWUgJiYgdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgJiYgaXRlcmF0ZWUubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICAvLyBBdm9pZCBsYXp5IHVzZSBpZiB0aGUgaXRlcmF0ZWUgaGFzIGEgXCJsZW5ndGhcIiB2YWx1ZSBvdGhlciB0aGFuIGAxYC5cbiAgICAgICAgICBpc0xhenkgPSB1c2VMYXp5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sXG4gICAgICAgICAgICBpc0h5YnJpZCA9ICEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsXG4gICAgICAgICAgICBpc1Vud3JhcHBlZCA9IHJldFVud3JhcHBlZCAmJiAhY2hhaW5BbGwsXG4gICAgICAgICAgICBvbmx5TGF6eSA9IGlzTGF6eSAmJiAhaXNIeWJyaWQ7XG5cbiAgICAgICAgaWYgKCFyZXRVbndyYXBwZWQgJiYgdXNlTGF6eSkge1xuICAgICAgICAgIHZhbHVlID0gb25seUxhenkgPyB2YWx1ZSA6IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh2YWx1ZSwgYXJncyk7XG4gICAgICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fLnB1c2goeyAnZnVuYyc6IHRocnUsICdhcmdzJzogW2ludGVyY2VwdG9yXSwgJ3RoaXNBcmcnOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCwgY2hhaW5BbGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Vud3JhcHBlZCAmJiBvbmx5TGF6eSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICAgIHJldHVybiBpc1Vud3JhcHBlZCA/IChpc1Rha2VyID8gcmVzdWx0LnZhbHVlKClbMF0gOiByZXN1bHQudmFsdWUoKSkgOiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBBcnJheWAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYXJyYXlFYWNoKFsncG9wJywgJ3B1c2gnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IGFycmF5UHJvdG9bbWV0aG9kTmFtZV0sXG4gICAgICAgICAgY2hhaW5OYW1lID0gL14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpID8gJ3RhcCcgOiAndGhydScsXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gL14oPzpwb3B8c2hpZnQpJC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgaWYgKHJldFVud3JhcHBlZCAmJiAhdGhpcy5fX2NoYWluX18pIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1tjaGFpbk5hbWVdKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gTWFwIG1pbmlmaWVkIG1ldGhvZCBuYW1lcyB0byB0aGVpciByZWFsIG5hbWVzLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgbG9kYXNoRnVuYyA9IGxvZGFzaFttZXRob2ROYW1lXTtcbiAgICAgIGlmIChsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHZhciBrZXkgPSBsb2Rhc2hGdW5jLm5hbWUgKyAnJztcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcywga2V5KSkge1xuICAgICAgICAgIHJlYWxOYW1lc1trZXldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmVhbE5hbWVzW2tleV0ucHVzaCh7ICduYW1lJzogbWV0aG9kTmFtZSwgJ2Z1bmMnOiBsb2Rhc2hGdW5jIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVhbE5hbWVzW2NyZWF0ZUh5YnJpZCh1bmRlZmluZWQsIFdSQVBfQklORF9LRVlfRkxBRykubmFtZV0gPSBbe1xuICAgICAgJ25hbWUnOiAnd3JhcHBlcicsXG4gICAgICAnZnVuYyc6IHVuZGVmaW5lZFxuICAgIH1dO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYExhenlXcmFwcGVyYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY2xvbmUgPSBsYXp5Q2xvbmU7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2UgPSBsYXp5UmV2ZXJzZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudmFsdWUgPSBsYXp5VmFsdWU7XG5cbiAgICAvLyBBZGQgY2hhaW4gc2VxdWVuY2UgbWV0aG9kcyB0byB0aGUgYGxvZGFzaGAgd3JhcHBlci5cbiAgICBsb2Rhc2gucHJvdG90eXBlLmF0ID0gd3JhcHBlckF0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY2hhaW4gPSB3cmFwcGVyQ2hhaW47XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb21taXQgPSB3cmFwcGVyQ29tbWl0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUubmV4dCA9IHdyYXBwZXJOZXh0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucGxhbnQgPSB3cmFwcGVyUGxhbnQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5yZXZlcnNlID0gd3JhcHBlclJldmVyc2U7XG4gICAgbG9kYXNoLnByb3RvdHlwZS50b0pTT04gPSBsb2Rhc2gucHJvdG90eXBlLnZhbHVlT2YgPSBsb2Rhc2gucHJvdG90eXBlLnZhbHVlID0gd3JhcHBlclZhbHVlO1xuXG4gICAgLy8gQWRkIGxhenkgYWxpYXNlcy5cbiAgICBsb2Rhc2gucHJvdG90eXBlLmZpcnN0ID0gbG9kYXNoLnByb3RvdHlwZS5oZWFkO1xuXG4gICAgaWYgKHN5bUl0ZXJhdG9yKSB7XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW3N5bUl0ZXJhdG9yXSA9IHdyYXBwZXJUb0l0ZXJhdG9yO1xuICAgIH1cbiAgICByZXR1cm4gbG9kYXNoO1xuICB9KTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvLyBFeHBvcnQgbG9kYXNoLlxuICB2YXIgXyA9IHJ1bkluQ29udGV4dCgpO1xuXG4gIC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIGNvbmRpdGlvbiBwYXR0ZXJucyBsaWtlOlxuICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcbiAgICAvLyBFeHBvc2UgTG9kYXNoIG9uIHRoZSBnbG9iYWwgb2JqZWN0IHRvIHByZXZlbnQgZXJyb3JzIHdoZW4gTG9kYXNoIGlzXG4gICAgLy8gbG9hZGVkIGJ5IGEgc2NyaXB0IHRhZyBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQU1EIGxvYWRlci5cbiAgICAvLyBTZWUgaHR0cDovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCNtaXNtYXRjaCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIC8vIFVzZSBgXy5ub0NvbmZsaWN0YCB0byByZW1vdmUgTG9kYXNoIGZyb20gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcblxuICAgIC8vIERlZmluZSBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlIHNvLCB0aHJvdWdoIHBhdGggbWFwcGluZywgaXQgY2FuIGJlXG4gICAgLy8gcmVmZXJlbmNlZCBhcyB0aGUgXCJ1bmRlcnNjb3JlXCIgbW9kdWxlLlxuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfO1xuICAgIH0pO1xuICB9XG4gIC8vIENoZWNrIGZvciBgZXhwb3J0c2AgYWZ0ZXIgYGRlZmluZWAgaW4gY2FzZSBhIGJ1aWxkIG9wdGltaXplciBhZGRzIGl0LlxuICBlbHNlIGlmIChmcmVlTW9kdWxlKSB7XG4gICAgLy8gRXhwb3J0IGZvciBOb2RlLmpzLlxuICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBfKS5fID0gXztcbiAgICAvLyBFeHBvcnQgZm9yIENvbW1vbkpTIHN1cHBvcnQuXG4gICAgZnJlZUV4cG9ydHMuXyA9IF87XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gRXhwb3J0IHRvIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG4gIH1cbn0uY2FsbCh0aGlzKSk7XG4iLCIvKipcclxuKiB2a0JlYXV0aWZ5IC0gamF2YXNjcmlwdCBwbHVnaW4gdG8gcHJldHR5LXByaW50IG9yIG1pbmlmeSB0ZXh0IGluIFhNTCwgSlNPTiwgQ1NTIGFuZCBTUUwgZm9ybWF0cy5cclxuKlxyXG4qIENvcHlyaWdodCAoYykgMjAxMiBWYWRpbSBLaXJ5dWtoaW5cclxuKiB2a2lyeXVraGluIEAgZ21haWwuY29tXHJcbiogaHR0cDovL3d3dy5lc2xpbnN0cnVjdG9yLm5ldC92a2JlYXV0aWZ5L1xyXG4qXHJcbiogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6XHJcbiogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG4qICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sXHJcbipcclxuKiAgIFByZXR0eSBwcmludFxyXG4qXHJcbiogICAgICAgIHZrYmVhdXRpZnkueG1sKHRleHQgWyxpbmRlbnRfcGF0dGVybl0pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5Lmpzb24odGV4dCBbLGluZGVudF9wYXR0ZXJuXSk7XHJcbiogICAgICAgIHZrYmVhdXRpZnkuY3NzKHRleHQgWyxpbmRlbnRfcGF0dGVybl0pO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbCh0ZXh0IFssaW5kZW50X3BhdHRlcm5dKTtcclxuKlxyXG4qICAgICAgICBAdGV4dCAtIFN0cmluZzsgdGV4dCB0byBiZWF0dWZ5O1xyXG4qICAgICAgICBAaW5kZW50X3BhdHRlcm4gLSBJbnRlZ2VyIHwgU3RyaW5nO1xyXG4qICAgICAgICAgICAgICAgIEludGVnZXI6ICBudW1iZXIgb2Ygd2hpdGUgc3BhY2VzO1xyXG4qICAgICAgICAgICAgICAgIFN0cmluZzogICBjaGFyYWN0ZXIgc3RyaW5nIHRvIHZpc3VhbGl6ZSBpbmRlbnRhdGlvbiAoIGNhbiBhbHNvIGJlIGEgc2V0IG9mIHdoaXRlIHNwYWNlcyApXHJcbiogICBNaW5pZnlcclxuKlxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnhtbG1pbih0ZXh0IFsscHJlc2VydmVfY29tbWVudHNdKTtcclxuKiAgICAgICAgdmtiZWF1dGlmeS5qc29ubWluKHRleHQpO1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LmNzc21pbih0ZXh0IFsscHJlc2VydmVfY29tbWVudHNdKTtcclxuKiAgICAgICAgdmtiZWF1dGlmeS5zcWxtaW4odGV4dCk7XHJcbipcclxuKiAgICAgICAgQHRleHQgLSBTdHJpbmc7IHRleHQgdG8gbWluaWZ5O1xyXG4qICAgICAgICBAcHJlc2VydmVfY29tbWVudHMgLSBCb29sOyBbb3B0aW9uYWxdO1xyXG4qICAgICAgICAgICAgICAgIFNldCB0aGlzIGZsYWcgdG8gdHJ1ZSB0byBwcmV2ZW50IHJlbW92aW5nIGNvbW1lbnRzIGZyb20gQHRleHQgKCBtaW54bWwgYW5kIG1pbmNzcyBmdW5jdGlvbnMgb25seS4gKVxyXG4qXHJcbiogICBFeGFtcGxlczpcclxuKiAgICAgICAgdmtiZWF1dGlmeS54bWwodGV4dCk7IC8vIHByZXR0eSBwcmludCBYTUxcclxuKiAgICAgICAgdmtiZWF1dGlmeS5qc29uKHRleHQsIDQgKTsgLy8gcHJldHR5IHByaW50IEpTT05cclxuKiAgICAgICAgdmtiZWF1dGlmeS5jc3ModGV4dCwgJy4gLiAuIC4nKTsgLy8gcHJldHR5IHByaW50IENTU1xyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbCh0ZXh0LCAnLS0tLScpOyAvLyBwcmV0dHkgcHJpbnQgU1FMXHJcbipcclxuKiAgICAgICAgdmtiZWF1dGlmeS54bWxtaW4odGV4dCwgdHJ1ZSk7Ly8gbWluaWZ5IFhNTCwgcHJlc2VydmUgY29tbWVudHNcclxuKiAgICAgICAgdmtiZWF1dGlmeS5qc29ubWluKHRleHQpOy8vIG1pbmlmeSBKU09OXHJcbiogICAgICAgIHZrYmVhdXRpZnkuY3NzbWluKHRleHQpOy8vIG1pbmlmeSBDU1MsIHJlbW92ZSBjb21tZW50cyAoIGRlZmF1bHQgKVxyXG4qICAgICAgICB2a2JlYXV0aWZ5LnNxbG1pbih0ZXh0KTsvLyBtaW5pZnkgU1FMXHJcbipcclxuKi9cclxuZnVuY3Rpb24gY3JlYXRlU2hpZnRBcnIoc3RlcCkge1xyXG5cclxuXHR2YXIgc3BhY2UgPSAnICAgICc7XHJcblxyXG5cdGlmICggaXNOYU4ocGFyc2VJbnQoc3RlcCkpICkgeyAgLy8gYXJndW1lbnQgaXMgc3RyaW5nXHJcblx0XHRzcGFjZSA9IHN0ZXA7XHJcblx0fSBlbHNlIHsgLy8gYXJndW1lbnQgaXMgaW50ZWdlclxyXG5cdFx0c3dpdGNoKHN0ZXApIHtcclxuXHRcdFx0Y2FzZSAxOiBzcGFjZSA9ICcgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMjogc3BhY2UgPSAnICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSAzOiBzcGFjZSA9ICcgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA0OiBzcGFjZSA9ICcgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgNTogc3BhY2UgPSAnICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA2OiBzcGFjZSA9ICcgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA3OiBzcGFjZSA9ICcgICAgICAgJzsgYnJlYWs7XHJcblx0XHRcdGNhc2UgODogc3BhY2UgPSAnICAgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSA5OiBzcGFjZSA9ICcgICAgICAgICAnOyBicmVhaztcclxuXHRcdFx0Y2FzZSAxMDogc3BhY2UgPSAnICAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDExOiBzcGFjZSA9ICcgICAgICAgICAgICc7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDEyOiBzcGFjZSA9ICcgICAgICAgICAgICAnOyBicmVhaztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHZhciBzaGlmdCA9IFsnXFxuJ107IC8vIGFycmF5IG9mIHNoaWZ0c1xyXG5cdGZvcih2YXIgaXg9MDtpeDwxMDA7aXgrKykge1xyXG5cdFx0c2hpZnQucHVzaChzaGlmdFtpeF0rc3BhY2UpO1xyXG5cdH1cclxuXHRyZXR1cm4gc2hpZnQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZrYmVhdXRpZnkoKXtcclxuXHR0aGlzLnN0ZXAgPSAnICAgICc7IC8vIDQgc3BhY2VzXHJcblx0dGhpcy5zaGlmdCA9IGNyZWF0ZVNoaWZ0QXJyKHRoaXMuc3RlcCk7XHJcbn07XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS54bWwgPSBmdW5jdGlvbih0ZXh0LHN0ZXApIHtcclxuXHJcblx0dmFyIGFyID0gdGV4dC5yZXBsYWNlKC8+XFxzezAsfTwvZyxcIj48XCIpXHJcblx0XHRcdFx0IC5yZXBsYWNlKC88L2csXCJ+Ojp+PFwiKVxyXG5cdFx0XHRcdCAucmVwbGFjZSgvXFxzKnhtbG5zXFw6L2csXCJ+Ojp+eG1sbnM6XCIpXHJcblx0XHRcdFx0IC5yZXBsYWNlKC9cXHMqeG1sbnNcXD0vZyxcIn46On54bWxucz1cIilcclxuXHRcdFx0XHQgLnNwbGl0KCd+Ojp+JyksXHJcblx0XHRsZW4gPSBhci5sZW5ndGgsXHJcblx0XHRpbkNvbW1lbnQgPSBmYWxzZSxcclxuXHRcdGRlZXAgPSAwLFxyXG5cdFx0c3RyID0gJycsXHJcblx0XHRpeCA9IDAsXHJcblx0XHRzaGlmdCA9IHN0ZXAgPyBjcmVhdGVTaGlmdEFycihzdGVwKSA6IHRoaXMuc2hpZnQ7XHJcblxyXG5cdFx0Zm9yKGl4PTA7aXg8bGVuO2l4KyspIHtcclxuXHRcdFx0Ly8gc3RhcnQgY29tbWVudCBvciA8IVtDREFUQVsuLi5dXT4gb3IgPCFET0NUWVBFIC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLzwhLykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdFx0aW5Db21tZW50ID0gdHJ1ZTtcclxuXHRcdFx0XHQvLyBlbmQgY29tbWVudCAgb3IgPCFbQ0RBVEFbLi4uXV0+IC8vXHJcblx0XHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC8hRE9DVFlQRS8pID4gLTEgKSB7XHJcblx0XHRcdFx0XHRpbkNvbW1lbnQgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQvLyBlbmQgY29tbWVudCAgb3IgPCFbQ0RBVEFbLi4uXV0+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goLy0tPi8pID4gLTEgfHwgYXJbaXhdLnNlYXJjaCgvXFxdPi8pID4gLTEpIHtcclxuXHRcdFx0XHRzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPGVsbT48L2VsbT4gLy9cclxuXHRcdFx0aWYoIC9ePFxcdy8uZXhlYyhhcltpeC0xXSkgJiYgL148XFwvXFx3Ly5leGVjKGFyW2l4XSkgJiZcclxuXHRcdFx0XHQvXjxbXFx3OlxcLVxcLlxcLF0rLy5leGVjKGFyW2l4LTFdKSA9PSAvXjxcXC9bXFx3OlxcLVxcLlxcLF0rLy5leGVjKGFyW2l4XSlbMF0ucmVwbGFjZSgnLycsJycpKSB7XHJcblx0XHRcdFx0c3RyICs9IGFyW2l4XTtcclxuXHRcdFx0XHRpZighaW5Db21tZW50KSBkZWVwLS07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHQgLy8gPGVsbT4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPFxcdy8pID4gLTEgJiYgYXJbaXhdLnNlYXJjaCgvPFxcLy8pID09IC0xICYmIGFyW2l4XS5zZWFyY2goL1xcLz4vKSA9PSAtMSApIHtcclxuXHRcdFx0XHRzdHIgPSAhaW5Db21tZW50ID8gc3RyICs9IHNoaWZ0W2RlZXArK10rYXJbaXhdIDogc3RyICs9IGFyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdCAvLyA8ZWxtPi4uLjwvZWxtPiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdIDogc3RyICs9IGFyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdC8vIDwvZWxtPiAvL1xyXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFwvLykgPiAtMSkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbLS1kZWVwXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8gPGVsbS8+IC8vXHJcblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goL1xcLz4vKSA+IC0xICkge1xyXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdIDogc3RyICs9IGFyW2l4XTtcclxuXHRcdFx0fSBlbHNlXHJcblx0XHRcdC8vIDw/IHhtbCAuLi4gPz4gLy9cclxuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPFxcPy8pID4gLTEpIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0Ly8geG1sbnMgLy9cclxuXHRcdFx0aWYoIGFyW2l4XS5zZWFyY2goL3htbG5zXFw6LykgPiAtMSAgfHwgYXJbaXhdLnNlYXJjaCgveG1sbnNcXD0vKSA+IC0xKSB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c3RyICs9IGFyW2l4XTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRyZXR1cm4gIChzdHJbMF0gPT0gJ1xcbicpID8gc3RyLnNsaWNlKDEpIDogc3RyO1xyXG59XHJcblxyXG52a2JlYXV0aWZ5LnByb3RvdHlwZS5qc29uID0gZnVuY3Rpb24odGV4dCxzdGVwKSB7XHJcblxyXG5cdHZhciBzdGVwID0gc3RlcCA/IHN0ZXAgOiB0aGlzLnN0ZXA7XHJcblxyXG5cdGlmICh0eXBlb2YgSlNPTiA9PT0gJ3VuZGVmaW5lZCcgKSByZXR1cm4gdGV4dDtcclxuXHJcblx0aWYgKCB0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIiApIHJldHVybiBKU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKHRleHQpLCBudWxsLCBzdGVwKTtcclxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcIm9iamVjdFwiICkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRleHQsIG51bGwsIHN0ZXApO1xyXG5cclxuXHRyZXR1cm4gdGV4dDsgLy8gdGV4dCBpcyBub3Qgc3RyaW5nIG5vciBvYmplY3RcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuY3NzID0gZnVuY3Rpb24odGV4dCwgc3RlcCkge1xyXG5cclxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcey9nLFwie346On5cIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFx9L2csXCJ+Ojp+fX46On5cIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFw7L2csXCI7fjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXC9cXCovZyxcIn46On4vKlwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXCpcXC8vZyxcIiovfjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9+Ojp+XFxzezAsfX46On4vZyxcIn46On5cIilcclxuXHRcdFx0XHQuc3BsaXQoJ346On4nKSxcclxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcclxuXHRcdGRlZXAgPSAwLFxyXG5cdFx0c3RyID0gJycsXHJcblx0XHRpeCA9IDAsXHJcblx0XHRzaGlmdCA9IHN0ZXAgPyBjcmVhdGVTaGlmdEFycihzdGVwKSA6IHRoaXMuc2hpZnQ7XHJcblxyXG5cdFx0Zm9yKGl4PTA7aXg8bGVuO2l4KyspIHtcclxuXHJcblx0XHRcdGlmKCAvXFx7Ly5leGVjKGFyW2l4XSkpICB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXArK10rYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0aWYoIC9cXH0vLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbLS1kZWVwXSthcltpeF07XHJcblx0XHRcdH0gZWxzZVxyXG5cdFx0XHRpZiggL1xcKlxcXFwvLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdHN0ciArPSBzaGlmdFtkZWVwXSthcltpeF07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBzdHIucmVwbGFjZSgvXlxcbnsxLH0vLCcnKTtcclxufVxyXG5cclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5mdW5jdGlvbiBpc1N1YnF1ZXJ5KHN0ciwgcGFyZW50aGVzaXNMZXZlbCkge1xyXG5cdHJldHVybiAgcGFyZW50aGVzaXNMZXZlbCAtIChzdHIucmVwbGFjZSgvXFwoL2csJycpLmxlbmd0aCAtIHN0ci5yZXBsYWNlKC9cXCkvZywnJykubGVuZ3RoIClcclxufVxyXG5cclxuZnVuY3Rpb24gc3BsaXRfc3FsKHN0ciwgdGFiKSB7XHJcblxyXG5cdHJldHVybiBzdHIucmVwbGFjZSgvXFxzezEsfS9nLFwiIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvIEFORCAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIkFORCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIEJFVFdFRU4gL2lnLFwifjo6flwiK3RhYitcIkJFVFdFRU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBDQVNFIC9pZyxcIn46On5cIit0YWIrXCJDQVNFIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRUxTRSAvaWcsXCJ+Ojp+XCIrdGFiK1wiRUxTRSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIEVORCAvaWcsXCJ+Ojp+XCIrdGFiK1wiRU5EIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRlJPTSAvaWcsXCJ+Ojp+RlJPTSBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIEdST1VQXFxzezEsfUJZL2lnLFwifjo6fkdST1VQIEJZIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSEFWSU5HIC9pZyxcIn46On5IQVZJTkcgXCIpXHJcblx0XHRcdFx0Ly8ucmVwbGFjZSgvIFNFVCAvaWcsXCIgU0VUfjo6flwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gSU4gL2lnLFwiIElOIFwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvIEpPSU4gL2lnLFwifjo6fkpPSU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBDUk9TU346On57MSx9Sk9JTiAvaWcsXCJ+Ojp+Q1JPU1MgSk9JTiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIElOTkVSfjo6fnsxLH1KT0lOIC9pZyxcIn46On5JTk5FUiBKT0lOIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gTEVGVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+TEVGVCBKT0lOIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gUklHSFR+Ojp+ezEsfUpPSU4gL2lnLFwifjo6flJJR0hUIEpPSU4gXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT04gL2lnLFwifjo6flwiK3RhYitcIk9OIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT1IgL2lnLFwifjo6flwiK3RhYit0YWIrXCJPUiBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIE9SREVSXFxzezEsfUJZL2lnLFwifjo6fk9SREVSIEJZIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gT1ZFUiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT1ZFUiBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcKFxcc3swLH1TRUxFQ1QgL2lnLFwifjo6fihTRUxFQ1QgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoL1xcKVxcc3swLH1TRUxFQ1QgL2lnLFwiKX46On5TRUxFQ1QgXCIpXHJcblxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gVEhFTiAvaWcsXCIgVEhFTn46On5cIit0YWIrXCJcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFVOSU9OIC9pZyxcIn46On5VTklPTn46On5cIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFVTSU5HIC9pZyxcIn46On5VU0lORyBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIFdIRU4gL2lnLFwifjo6flwiK3RhYitcIldIRU4gXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBXSEVSRSAvaWcsXCJ+Ojp+V0hFUkUgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBXSVRIIC9pZyxcIn46On5XSVRIIFwiKVxyXG5cclxuXHRcdFx0XHQvLy5yZXBsYWNlKC9cXCxcXHN7MCx9XFwoL2lnLFwiLH46On4oIFwiKVxyXG5cdFx0XHRcdC8vLnJlcGxhY2UoL1xcLC9pZyxcIix+Ojp+XCIrdGFiK3RhYitcIlwiKVxyXG5cclxuXHRcdFx0XHQucmVwbGFjZSgvIEFMTCAvaWcsXCIgQUxMIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQVMgL2lnLFwiIEFTIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gQVNDIC9pZyxcIiBBU0MgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBERVNDIC9pZyxcIiBERVNDIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRElTVElOQ1QgL2lnLFwiIERJU1RJTkNUIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC8gRVhJU1RTIC9pZyxcIiBFWElTVFMgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBOT1QgL2lnLFwiIE5PVCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvIE5VTEwgL2lnLFwiIE5VTEwgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBMSUtFIC9pZyxcIiBMSUtFIFwiKVxyXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHN7MCx9U0VMRUNUIC9pZyxcIlNFTEVDVCBcIilcclxuXHRcdFx0XHQucmVwbGFjZSgvXFxzezAsfVVQREFURSAvaWcsXCJVUERBVEUgXCIpXHJcblx0XHRcdFx0LnJlcGxhY2UoLyBTRVQgL2lnLFwiIFNFVCBcIilcclxuXHJcblx0XHRcdFx0LnJlcGxhY2UoL346On57MSx9L2csXCJ+Ojp+XCIpXHJcblx0XHRcdFx0LnNwbGl0KCd+Ojp+Jyk7XHJcbn1cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLnNxbCA9IGZ1bmN0aW9uKHRleHQsc3RlcCkge1xyXG5cclxuXHR2YXIgYXJfYnlfcXVvdGUgPSB0ZXh0LnJlcGxhY2UoL1xcc3sxLH0vZyxcIiBcIilcclxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXFwnL2lnLFwifjo6flxcJ1wiKVxyXG5cdFx0XHRcdFx0XHRcdC5zcGxpdCgnfjo6ficpLFxyXG5cdFx0bGVuID0gYXJfYnlfcXVvdGUubGVuZ3RoLFxyXG5cdFx0YXIgPSBbXSxcclxuXHRcdGRlZXAgPSAwLFxyXG5cdFx0dGFiID0gdGhpcy5zdGVwLC8vK3RoaXMuc3RlcCxcclxuXHRcdGluQ29tbWVudCA9IHRydWUsXHJcblx0XHRpblF1b3RlID0gZmFsc2UsXHJcblx0XHRwYXJlbnRoZXNpc0xldmVsID0gMCxcclxuXHRcdHN0ciA9ICcnLFxyXG5cdFx0aXggPSAwLFxyXG5cdFx0c2hpZnQgPSBzdGVwID8gY3JlYXRlU2hpZnRBcnIoc3RlcCkgOiB0aGlzLnNoaWZ0OztcclxuXHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cdFx0XHRpZihpeCUyKSB7XHJcblx0XHRcdFx0YXIgPSBhci5jb25jYXQoYXJfYnlfcXVvdGVbaXhdKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhciA9IGFyLmNvbmNhdChzcGxpdF9zcWwoYXJfYnlfcXVvdGVbaXhdLCB0YWIpICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRsZW4gPSBhci5sZW5ndGg7XHJcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xyXG5cclxuXHRcdFx0cGFyZW50aGVzaXNMZXZlbCA9IGlzU3VicXVlcnkoYXJbaXhdLCBwYXJlbnRoZXNpc0xldmVsKTtcclxuXHJcblx0XHRcdGlmKCAvXFxzezAsfVxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7XHJcblx0XHRcdFx0YXJbaXhdID0gYXJbaXhdLnJlcGxhY2UoL1xcLC9nLFwiLFxcblwiK3RhYit0YWIrXCJcIilcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoIC9cXHN7MCx9XFxzezAsfVNFVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHtcclxuXHRcdFx0XHRhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggL1xcc3swLH1cXChcXHN7MCx9U0VMRUNUXFxzezAsfS8uZXhlYyhhcltpeF0pKSAge1xyXG5cdFx0XHRcdGRlZXArKztcclxuXHRcdFx0XHRzdHIgKz0gc2hpZnRbZGVlcF0rYXJbaXhdO1xyXG5cdFx0XHR9IGVsc2VcclxuXHRcdFx0aWYoIC9cXCcvLmV4ZWMoYXJbaXhdKSApICB7XHJcblx0XHRcdFx0aWYocGFyZW50aGVzaXNMZXZlbDwxICYmIGRlZXApIHtcclxuXHRcdFx0XHRcdGRlZXAtLTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0c3RyICs9IGFyW2l4XTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlICB7XHJcblx0XHRcdFx0c3RyICs9IHNoaWZ0W2RlZXBdK2FyW2l4XTtcclxuXHRcdFx0XHRpZihwYXJlbnRoZXNpc0xldmVsPDEgJiYgZGVlcCkge1xyXG5cdFx0XHRcdFx0ZGVlcC0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR2YXIganVuayA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RyID0gc3RyLnJlcGxhY2UoL15cXG57MSx9LywnJykucmVwbGFjZSgvXFxuezEsfS9nLFwiXFxuXCIpO1xyXG5cdFx0cmV0dXJuIHN0cjtcclxufVxyXG5cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLnhtbG1pbiA9IGZ1bmN0aW9uKHRleHQsIHByZXNlcnZlQ29tbWVudHMpIHtcclxuXHJcblx0dmFyIHN0ciA9IHByZXNlcnZlQ29tbWVudHMgPyB0ZXh0XHJcblx0XHRcdFx0XHRcdFx0ICAgOiB0ZXh0LnJlcGxhY2UoL1xcPCFbIFxcclxcblxcdF0qKC0tKFteXFwtXXxbXFxyXFxuXXwtW15cXC1dKSotLVsgXFxyXFxuXFx0XSopXFw+L2csXCJcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0IC5yZXBsYWNlKC9bIFxcclxcblxcdF17MSx9eG1sbnMvZywgJyB4bWxucycpO1xyXG5cdHJldHVybiAgc3RyLnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIik7XHJcbn1cclxuXHJcbnZrYmVhdXRpZnkucHJvdG90eXBlLmpzb25taW4gPSBmdW5jdGlvbih0ZXh0KSB7XHJcblxyXG5cdGlmICh0eXBlb2YgSlNPTiA9PT0gJ3VuZGVmaW5lZCcgKSByZXR1cm4gdGV4dDtcclxuXHJcblx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UodGV4dCksIG51bGwsIDApO1xyXG5cclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuY3NzbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xyXG5cclxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcclxuXHRcdFx0XHRcdFx0XHQgICA6IHRleHQucmVwbGFjZSgvXFwvXFwqKFteKl18W1xcclxcbl18KFxcKisoW14qL118W1xcclxcbl0pKSkqXFwqK1xcLy9nLFwiXCIpIDtcclxuXHJcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHN7MSx9L2csJyAnKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXHtcXHN7MSx9L2csXCJ7XCIpXHJcblx0XHRcdCAgLnJlcGxhY2UoL1xcfVxcc3sxLH0vZyxcIn1cIilcclxuXHRcdFx0ICAucmVwbGFjZSgvXFw7XFxzezEsfS9nLFwiO1wiKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXC9cXCpcXHN7MSx9L2csXCIvKlwiKVxyXG5cdFx0XHQgIC5yZXBsYWNlKC9cXCpcXC9cXHN7MSx9L2csXCIqL1wiKTtcclxufVxyXG5cclxudmtiZWF1dGlmeS5wcm90b3R5cGUuc3FsbWluID0gZnVuY3Rpb24odGV4dCkge1xyXG5cdHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcc3sxLH0vZyxcIiBcIikucmVwbGFjZSgvXFxzezEsfVxcKC8sXCIoXCIpLnJlcGxhY2UoL1xcc3sxLH1cXCkvLFwiKVwiKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBuZXcgdmtiZWF1dGlmeSgpO1xyXG4iLCJleHBvcnQgY29uc3QgdXBsb2FkQXJlYUhUTUwgPSBcbiAgYDxkaXYgaWQ9XCJkb2N1bWVudC11cGxvYWQtY29udGFpbmVyXCI+XG5cbiAgICA8ZGl2IGlkPVwiaW5pdGlhbF91cGxvYWRfY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGlkPVwiaW5pdGlhbF91cGxvYWRfYXJlYVwiPlxuICAgICAgICA8ZGl2IGlkPVwiaW5pdGlhbF91cGxvYWRfbWVzc2FnZVwiPlVwbG9hZCBGaWxlczwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGRpdiBpZD1cInVwbG9hZGluZ19jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2NvbnRhaW5lclwiIGlkPVwidW5wYWlyZWRfY29udGFpbmVyXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyLXRpdGxlXCI+VW5wYWlyZWQgRG9jdW1lbnRzPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImZpbGVzX2NvbnRhaW5lclwiPlxuXG4gICAgICAgICAgPGRpdiBpZD1cIm1laV9jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2hlYWRpbmdcIj5NRUk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX3NvcnRfbmFtZVwiPlxuICAgICAgICAgICAgICA8ZGl2Pk5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvcnRfbmFtZSBhcnJvd19idG5cIj4mI3gyMkMwOzwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9saXN0XCIgaWQ9XCJtZWlfbGlzdFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidW5wYWlyZWRfaXRlbV9jb250YWluZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kOiAjREFFQUYxOyBib3JkZXItcmFkaXVzOiA1cHg7XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidW5wYWlyZWRfaXRlbV9sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwidW5wYWlyZWRfaXRlbV9yYWRpb1wiIG5hbWU9XCJtZWlfcmFkaW9fZ3JvdXBcIiB2YWx1ZT1cImNyZWF0ZV9tZWlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tdG9wOiBhdXRvO21hcmdpbi1sZWZ0OiAzcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIG5ldyBNRUkgZmlsZVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJpbWFnZV9jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX2hlYWRpbmdcIj5JbWFnZXM8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlX3NvcnRfbmFtZVwiPlxuICAgICAgICAgICAgICA8ZGl2Pk5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvcnRfbmFtZSBhcnJvd19idG5cIj4mI3gyMkMwOzwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9saXN0XCIgaWQ9XCJpbWFnZV9saXN0XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImdlbmVyYXRlLXBhaXItYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25fYnV0dG9uXCIgaWQ9XCJtYWtlX3BhaXJcIj5NYWtlIFBhaXI8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZpbGVfY29udGFpbmVyXCIgaWQ9XCJwYWlyZWRfY29udGFpbmVyXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyLXRpdGxlXCI+UGFpcmVkIEZvbGlvczwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9zb3J0X25hbWVcIj5cbiAgICAgICAgICA8ZGl2Pk5hbWU8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic29ydF9uYW1lIGFycm93X2J0blwiPiYjeDIyQzA7PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9saW9fbGlzdFwiIGlkPVwicGFpcmVkX2xpc3RcIj48L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwidXBsb2FkX2J1dHRvbl9jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uX2J1dHRvblwiIGlkPVwidXBsb2FkX2J1dHRvblwiPlxuICAgICAgICAgICAgVXBsb2FkXG4gICAgICAgICAgICA8ZGl2IGlkPVwidXBsb2FkaW5nX3NwaW5uZXJcIj7ihrs8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZV9jb250YWluZXJcIiBpZD1cIm1hbnVzY3JpcHRzX2NvbnRhaW5lclwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJmaWxlX2hlYWRpbmdcIj5NYW51c2NyaXB0czwvaDI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb2xpb19saXN0XCIgaWQ9XCJtYW51c2NyaXB0X2xpc3RcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgLS0+XG5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YDtcblxuZXhwb3J0IGNvbnN0IG5ld0ZvbGRlckhUTUwgPSBgXG4gICAgPGRpdiBpZD1cInJlbmFtZV9jb250YWluZXJcIj5cbiAgICAgIDxkaXYgaWQ9XCJkYXNoYm9hcmRfaW5wdXRfY29udGFpbmVyXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJyZW5hbWVfYnV0dG9uc19jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNhbmNlbF9kYXNoYm9hcmRcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNvbmZpcm1fZGFzaGJvYXJkXCI+Q3JlYXRlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcblxuZXhwb3J0IGNvbnN0IHJlbmFtZUhUTUwgPSBgXG4gICAgPGRpdiBpZD1cInJlbmFtZV9jb250YWluZXJcIj5cbiAgICAgIDxkaXYgaWQ9XCJkYXNoYm9hcmRfaW5wdXRfY29udGFpbmVyXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJyZW5hbWVfYnV0dG9uc19jb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNhbmNlbF9kYXNoYm9hcmRcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNvbmZpcm1fZGFzaGJvYXJkXCI+Q29uZmlybTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7IiwiLyoqIEBtb2R1bGUgV2FybmluZ3MgKi9cblxuLyoqXG4gKiBXYXJuIHdoZW4gZ3JvdXBlZCBuZXVtZSBjb21wb25lbnRzIGZvcm0gYW4gdW5yZWNvZ25pemVkIG5ldW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBpbmdOb3RSZWNvZ25pemVkICgpOiB2b2lkIHtcbiAgaWYgKCEod2luZG93LmNvbmZpcm0oJ05lb24gZG9lcyBub3QgcmVjb2duaXplIHRoaXMgbmV1bWUgZ3JvdXBpbmcuIFdvdWxkIHlvdSBsaWtlIHRvIGNyZWF0ZSBhIGNvbXBvdW5kIG5ldW1lPycpKSkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmRvJykuY2xpY2soKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgTm90aWZpY2F0aW9uIGZyb20gJy4uL3V0aWxzL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgU3BsaXRBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5pbXBvcnQgeyBzZWxlY3RBbGwgfSBmcm9tICcuLi91dGlscy9TZWxlY3RUb29scyc7XG5pbXBvcnQgRHJhZ0hhbmRsZXIgZnJvbSAnLi4vdXRpbHMvRHJhZ0hhbmRsZXInO1xuaW1wb3J0IHsgZ2V0U1ZHUmVsQ29vcmRzIH0gZnJvbSAnLi4vdXRpbHMvQ29vcmRpbmF0ZXMnO1xuXG4vKiogSGFuZGxlIHNwbGl0dGluZyBhIHN0YWZmIGludG8gdHdvIHN0YXZlcyB0aHJvdWdoIFZlcm92aW8uICovXG5leHBvcnQgY2xhc3MgU3BsaXRTdGFmZkhhbmRsZXIge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHJlYWRvbmx5IHN0YWZmOiBTVkdHRWxlbWVudDtcblxuICAvKipcbiAgICogQHBhcmFtIHN0YWZmIC0gVGhlIHN0YWZmIHRoYXQgd2lsbCBiZSBtb2RpZmllZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIHN0YWZmOiBTVkdHRWxlbWVudCkge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLnN0YWZmID0gc3RhZmY7XG4gIH1cblxuICAvKipcbiAgICogRmlyc3QgcGFydCBvZiB0aGUgc3BsaXQgYWN0aW9uLlxuICAgKi9cbiAgc3RhcnRTcGxpdCAoKTogdm9pZCB7XG4gICAgdGhpcy5zcGxpdERpc2FibGUoKTtcblxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcblxuICAgIC8vIEhhbmRsZSBrZXlwcmVzc2VzXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG5cbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0NsaWNrIFdoZXJlIHRvIFNwbGl0Jyk7XG4gIH1cblxuICBzcGxpdERpc2FibGUgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5yZXNldEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrYXdheUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgaW5wdXQgdG8gc3BsaXQgYSBzdGFmZi4gKi9cbiAgaGFuZGxlciA9ICgoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gRmluZCBzdGFmZiBwb2ludCBjb3JyZXNwb25kcyB0byBpZiBvbmUgZXhpc3RzXG4gICAgLy8gVE9ET1xuICAgIGNvbnN0IGlkID0gdGhpcy5zdGFmZi5pZDtcbiAgICBjb25zdCBjdXJzb3IgPSBnZXRTVkdSZWxDb29yZHMoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IFNwbGl0QWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAnc3BsaXQnLFxuICAgICAgcGFyYW06IHtcbiAgICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgICAgeDogY3Vyc29yLnhcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5uZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBhd2FpdCB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU3BsaXQgYWN0aW9uIHN1Y2Nlc3NmdWwnLCAnc3VjY2VzcycpO1xuICAgICAgfVxuICAgICAgY29uc3QgZHJhZ0hhbmRsZXIgPSBuZXcgRHJhZ0hhbmRsZXIodGhpcy5uZW9uVmlldywgJy5zdGFmZicpO1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIHNlbGVjdEFsbChbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9YCldLCB0aGlzLm5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG5cbiAgICAgIGNvbnN0IG1vcmVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0Jyk7XG4gICAgICBpZiAobW9yZUVkaXQpIHtcbiAgICAgICAgbW9yZUVkaXQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIG1vcmVFZGl0LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIEV4aXRzIHNwbGl0IG9uIEVzY2FwZSBwcmVzcywgZGlzYWJsZXMgb24gU2hpZnQuICovXG4gIGtleWRvd25MaXN0ZW5lciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnNwbGl0RGlzYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmtleSA9PT0gJ1NoaWZ0Jykge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKiogRXhpdCBzcGxpdCBpZiB1c2VyIGNsaWNrcyBvZmYgb2YgYWN0aXZlIHBhZ2UuICovXG4gIGNsaWNrYXdheUhhbmRsZXIgPSAoKGV2dDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYWN0aXZlLXBhZ2UnKSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIENhbGxlZCB0byByZWFwcGx5IHRoZSBldmVudCBsaXN0ZW5lciBpZiBuZWNlc3NhcnkuICovXG4gIHJlc2V0SGFuZGxlciA9ICgoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG59XG4iLCJpbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBTcGxpdE5ldW1lQWN0aW9uIH0gZnJvbSAnLi4vVHlwZXMnO1xuXG4vKiogSGFuZGxlIHNwbGl0dGluZyBhIG5ldW1lIGludG8gdHdvIG5ldW1lcyB0aHJvdWdoIFZlcm92aW8uICovXG5leHBvcnQgY2xhc3MgU3BsaXROZXVtZUhhbmRsZXIge1xuICByZWFkb25seSBuZW9uVmlldzogTmVvblZpZXc7XG4gIHJlYWRvbmx5IG5ldW1lOiBTVkdHRWxlbWVudDtcblxuICAvKipcbiAgICogQHBhcmFtIG5ldW1lIC0gVGhlIG5ldW1lIHRoYXQgd2lsbCBiZSBtb2RpZmllZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIG5ldW1lOiBTVkdHRWxlbWVudCkge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLm5ldW1lID0gbmV1bWU7XG4gIH1cblxuICAvKipcbiAgICogRmlyc3QgcGFydCBvZiB0aGUgc3BsaXQgYWN0aW9uLlxuICAgKi9cbiAgc3RhcnRTcGxpdCAoKTogdm9pZCB7XG4gICAgdGhpcy5zcGxpdERpc2FibGUoKTtcblxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcblxuICAgIC8vIEhhbmRsZSBrZXlwcmVzc2VzXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG5cbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0NsaWNrIFRoZSBCZWdpbm5pbmcgb2YgVGhlIFNlY29uZCBOZXVtZScpO1xuICB9XG5cbiAgc3BsaXREaXNhYmxlICgpOiB2b2lkIHtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICAvKiogSGFuZGxlIGlucHV0IHRvIHNwbGl0IGEgbmV1bWUuICovXG4gIGhhbmRsZXIgPSAoKGV2dDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5uZXVtZS5pZDtcblxuICAgIC8vIHVuc2VsZWN0KCk7XG4gICAgXG4gICAgY29uc3QgbmMgPSAoZXZ0LnRhcmdldCBhcyBTVkdHRWxlbWVudCkucGFyZW50RWxlbWVudDtcbiAgICBjb25zdCBuY0lkID0gbmMuaWQ7XG5cbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IFNwbGl0TmV1bWVBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICdzcGxpdE5ldW1lJyxcbiAgICAgIHBhcmFtOiB7XG4gICAgICAgIGVsZW1lbnRJZDogaWQsXG4gICAgICAgIG5jSWQ6IG5jSWRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5uZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBhd2FpdCB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU3BsaXQgYWN0aW9uIHN1Y2Nlc3NmdWwnLCAnc3VjY2VzcycpO1xuICAgICAgfSBcbiAgICAgIGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLm5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU3BsaXQgYWN0aW9uIGZhaWxlZCcsICdlcnJvcicpO1xuICAgICAgfVxuICAgICAgLy8gdGhpcy5uZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgLy8gY29uc3QgZHJhZ0hhbmRsZXIgPSBuZXcgRHJhZ0hhbmRsZXIodGhpcy5uZW9uVmlldywgJy5uZXVtZScpO1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICAgIC8vIHNlbGVjdEFsbChbZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZCkgYXMgU1ZHR0VsZW1lbnRdLCB0aGlzLm5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gICAgICAvLyB0cnkge1xuICAgICAgLy8gICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgICAgIC8vICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykuY2xhc3NMaXN0LmFkZCgnaXMtaGlkZGVuJyk7XG4gICAgICAvLyB9IGNhdGNoIChlKSB7fVxuICAgIH0pO1xuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKiBFeGl0cyBzcGxpdCBvbiBFc2NhcGUgcHJlc3MsIGRpc2FibGVzIG9uIFNoaWZ0LiAqL1xuICBrZXlkb3duTGlzdGVuZXIgPSAoKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmIChldnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgdGhpcy5zcGxpdERpc2FibGUoKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgLyoqIEV4aXQgc3BsaXQgaWYgdXNlciBjbGlja3Mgb2ZmIG9mIGFjdGl2ZSBwYWdlLiAqL1xuICBjbGlja2F3YXlIYW5kbGVyID0gKChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmFjdGl2ZS1wYWdlJykgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3BsaXREaXNhYmxlKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKiBDYWxsZWQgdG8gcmVhcHBseSB0aGUgZXZlbnQgbGlzdGVuZXIgaWYgbmVjZXNzYXJ5LiAqL1xuICByZXNldEhhbmRsZXIgPSAoKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmIChldnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9KS5iaW5kKHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy50ZXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIGdsb2JhbC5xdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZ2xvYmFsLnF1ZXVlTWljcm90YXNrKGZ1bmMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vYmFzZWQgb2ZmIHJzdnAgaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qc1xuLy9saWNlbnNlIGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9tYXN0ZXIvTElDRU5TRVxuLy9odHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzL2Jsb2IvbWFzdGVyL2xpYi9yc3ZwL2FzYXAuanNcblxudmFyIE11dGF0aW9uID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE11dGF0aW9uO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uKGhhbmRsZSk7XG4gIHZhciBlbGVtZW50ID0gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7XG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBlbGVtZW50LmRhdGEgPSAoY2FsbGVkID0gKytjYWxsZWQgJSAyKTtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgLy8gd2UgY2FuIG9ubHkgZ2V0IGhlcmUgaW4gSUUxMFxuICAgIC8vIHdoaWNoIGRvZXNuJ3QgaGFuZGVsIHBvc3RNZXNzYWdlIHdlbGxcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBnbG9iYWwuTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnO1xufTtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgdmFyIGNoYW5uZWwgPSBuZXcgZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKCk7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuYztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdkb2N1bWVudCcgaW4gZ2xvYmFsICYmICdvbnJlYWR5c3RhdGVjaGFuZ2UnIGluIGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbn07XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgdmFyIHNjcmlwdEVsID0gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGhhbmRsZSgpO1xuXG4gICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICBzY3JpcHRFbCA9IG51bGw7XG4gICAgfTtcbiAgICBnbG9iYWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcmlwdEVsKTtcblxuICAgIHJldHVybiBoYW5kbGU7XG4gIH07XG59OyIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydHMudGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiAodCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQodCwgMCk7XG4gIH07XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5leHBvcnRzLnBhcnNlID0gdXJsUGFyc2U7XG5leHBvcnRzLnJlc29sdmUgPSB1cmxSZXNvbHZlO1xuZXhwb3J0cy5yZXNvbHZlT2JqZWN0ID0gdXJsUmVzb2x2ZU9iamVjdDtcbmV4cG9ydHMuZm9ybWF0ID0gdXJsRm9ybWF0O1xuXG5leHBvcnRzLlVybCA9IFVybDtcblxuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxudmFyIHByb3RvY29sUGF0dGVybiA9IC9eKFthLXowLTkuKy1dKzopL2ksXG4gICAgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvLFxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICAgIHNpbXBsZVBhdGhQYXR0ZXJuID0gL14oXFwvXFwvPyg/IVxcLylbXlxcP1xcc10qKShcXD9bXlxcc10qKT8kLyxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAgLy8gV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgICBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXSxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGZvciB2YXJpb3VzIHJlYXNvbnMuXG4gICAgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpLFxuXG4gICAgLy8gQWxsb3dlZCBieSBSRkNzLCBidXQgY2F1c2Ugb2YgWFNTIGF0dGFja3MuICBBbHdheXMgZXNjYXBlIHRoZXNlLlxuICAgIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gICAgLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuICAgIC8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgIC8vIHRoZW0uXG4gICAgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gICAgaG9zdEVuZGluZ0NoYXJzID0gWycvJywgJz8nLCAnIyddLFxuICAgIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICAgIGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC8sXG4gICAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbK2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4gICAgdW5zYWZlUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG4gICAgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuICAgIHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgICAgICdodHRwJzogdHJ1ZSxcbiAgICAgICdodHRwcyc6IHRydWUsXG4gICAgICAnZnRwJzogdHJ1ZSxcbiAgICAgICdnb3BoZXInOiB0cnVlLFxuICAgICAgJ2ZpbGUnOiB0cnVlLFxuICAgICAgJ2h0dHA6JzogdHJ1ZSxcbiAgICAgICdodHRwczonOiB0cnVlLFxuICAgICAgJ2Z0cDonOiB0cnVlLFxuICAgICAgJ2dvcGhlcjonOiB0cnVlLFxuICAgICAgJ2ZpbGU6JzogdHJ1ZVxuICAgIH0sXG4gICAgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgJiYgdXRpbC5pc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24odXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIXV0aWwuaXNTdHJpbmcodXJsKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHVybCk7XG4gIH1cblxuICAvLyBDb3B5IGNocm9tZSwgSUUsIG9wZXJhIGJhY2tzbGFzaC1oYW5kbGluZyBiZWhhdmlvci5cbiAgLy8gQmFjayBzbGFzaGVzIGJlZm9yZSB0aGUgcXVlcnkgc3RyaW5nIGdldCBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICAgIHNwbGl0dGVyID1cbiAgICAgICAgICAocXVlcnlJbmRleCAhPT0gLTEgJiYgcXVlcnlJbmRleCA8IHVybC5pbmRleE9mKCcjJykpID8gJz8nIDogJyMnLFxuICAgICAgdVNwbGl0ID0gdXJsLnNwbGl0KHNwbGl0dGVyKSxcbiAgICAgIHNsYXNoUmVnZXggPSAvXFxcXC9nO1xuICB1U3BsaXRbMF0gPSB1U3BsaXRbMF0ucmVwbGFjZShzbGFzaFJlZ2V4LCAnLycpO1xuICB1cmwgPSB1U3BsaXQuam9pbihzcGxpdHRlcik7XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgdGhpcy5wYXRoID0gcmVzdDtcbiAgICAgIHRoaXMuaHJlZiA9IHJlc3Q7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnljb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgLy8gSXQgb25seSBjb252ZXJ0cyBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgLy8gaGF2ZSBub24tQVNDSUkgY2hhcmFjdGVycywgaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZlxuICAgICAgLy8geW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0IGFscmVhZHkgaXMgQVNDSUktb25seS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHRoaXMuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zdWJzdHIoMSwgdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIGlmIChyZXN0WzBdICE9PSAnLycpIHtcbiAgICAgICAgcmVzdCA9ICcvJyArIHJlc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJlc3QgaXMgc2V0IHRvIHRoZSBwb3N0LWhvc3Qgc3R1ZmYuXG4gIC8vIGNob3Agb2ZmIGFueSBkZWxpbSBjaGFycy5cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLy8gRmlyc3QsIG1ha2UgMTAwJSBzdXJlIHRoYXQgYW55IFwiYXV0b0VzY2FwZVwiIGNoYXJzIGdldFxuICAgIC8vIGVzY2FwZWQsIGV2ZW4gaWYgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgdGhpbmsgdGhleVxuICAgIC8vIG5lZWQgdG8gYmUuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIGlmIChyZXN0LmluZGV4T2YoYWUpID09PSAtMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgdmFyIGhhc2ggPSByZXN0LmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpO1xuICB9XG4gIHZhciBxbSA9IHJlc3QuaW5kZXhPZignPycpO1xuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSk7XG4gICAgdGhpcy5xdWVyeSA9IHJlc3Quc3Vic3RyKHFtICsgMSk7XG4gICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgcW0pO1xuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG4gIGlmIChyZXN0KSB0aGlzLnBhdGhuYW1lID0gcmVzdDtcbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgICAgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gIGlmICh0aGlzLnBhdGhuYW1lIHx8IHRoaXMuc2VhcmNoKSB7XG4gICAgdmFyIHAgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICAgIHZhciBzID0gdGhpcy5zZWFyY2ggfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gcCArIHM7XG4gIH1cblxuICAvLyBmaW5hbGx5LCByZWNvbnN0cnVjdCB0aGUgaHJlZiBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgdGhpcy5ocmVmID0gdGhpcy5mb3JtYXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBmb3JtYXQgYSBwYXJzZWQgb2JqZWN0IGludG8gYSB1cmwgc3RyaW5nXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKHV0aWwuaXNTdHJpbmcob2JqKSkgb2JqID0gdXJsUGFyc2Uob2JqKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJycsXG4gICAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgICAgaG9zdCA9IGZhbHNlLFxuICAgICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgOlxuICAgICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJlxuICAgICAgdXRpbC5pc09iamVjdCh0aGlzLnF1ZXJ5KSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6JztcblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHRoaXMuc2xhc2hlcyB8fFxuICAgICAgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTtcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckF0KDApICE9PSAnIycpIGhhc2ggPSAnIycgKyBoYXNoO1xuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/Jykgc2VhcmNoID0gJz8nICsgc2VhcmNoO1xuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQobWF0Y2gpO1xuICB9KTtcbiAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoJyMnLCAnJTIzJyk7XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmUoc291cmNlLCByZWxhdGl2ZSkge1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZShyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiByZWxhdGl2ZTtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmVPYmplY3QocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICBpZiAodXRpbC5pc1N0cmluZyhyZWxhdGl2ZSkpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJylcbiAgICAgICAgcmVzdWx0W3JrZXldID0gcmVsYXRpdmVbcmtleV07XG4gICAgfVxuXG4gICAgLy91cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiZcbiAgICAgICAgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lID0gJy8nO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8vIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAvLyB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAvLyBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAvLyBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgIC8vIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAvLyBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgIC8vIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSk7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHJlbGF0aXZlLmhvc3QgPSAnJztcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7XG4gICAgICBpZiAocmVsUGF0aFswXSAhPT0gJycpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSAocmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyksXG4gICAgICBpc1JlbEFicyA9IChcbiAgICAgICAgICByZWxhdGl2ZS5ob3N0IHx8XG4gICAgICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICAgICksXG4gICAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHNyY1BhdGggPSBbXTtcbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKCF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKHJlbGF0aXZlLnNlYXJjaCkpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIC8vIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAvLyB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQuc2VhcmNoKSB7XG4gICAgICByZXN1bHQucGF0aCA9ICcvJyArIHJlc3VsdC5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGlmIGEgdXJsIEVORHMgaW4gLiBvciAuLiwgdGhlbiBpdCBtdXN0IGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICAvLyBob3dldmVyLCBpZiBpdCBlbmRzIGluIGFueXRoaW5nIGVsc2Ugbm9uLXNsYXNoeSxcbiAgLy8gdGhlbiBpdCBtdXN0IE5PVCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgdmFyIGxhc3QgPSBzcmNQYXRoLnNsaWNlKC0xKVswXTtcbiAgdmFyIGhhc1RyYWlsaW5nU2xhc2ggPSAoXG4gICAgICAocmVzdWx0Lmhvc3QgfHwgcmVsYXRpdmUuaG9zdCB8fCBzcmNQYXRoLmxlbmd0aCA+IDEpICYmXG4gICAgICAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgdGhpcy5ob3N0bmFtZSA9IGhvc3Q7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB1cmlsaWIgPSByZXF1aXJlKCd1cmwnKTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbm1vZHVsZS5leHBvcnRzLlNjaGVtYVNjYW5SZXN1bHQgPSBTY2hlbWFTY2FuUmVzdWx0O1xuZnVuY3Rpb24gU2NoZW1hU2NhblJlc3VsdChmb3VuZCwgcmVmKXtcbiAgdGhpcy5pZCA9IGZvdW5kO1xuICB0aGlzLnJlZiA9IHJlZjtcbn1cblxuLyoqXG4gKiBBZGRzIGEgc2NoZW1hIHdpdGggYSBjZXJ0YWluIHVybiB0byB0aGUgVmFsaWRhdG9yIGluc3RhbmNlLlxuICogQHBhcmFtIHN0cmluZyB1cmlcbiAqIEBwYXJhbSBvYmplY3Qgc2NoZW1hXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbm1vZHVsZS5leHBvcnRzLnNjYW4gPSBmdW5jdGlvbiBzY2FuKGJhc2UsIHNjaGVtYSl7XG4gIGZ1bmN0aW9uIHNjYW5TY2hlbWEoYmFzZXVyaSwgc2NoZW1hKXtcbiAgICBpZighc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEhPSdvYmplY3QnKSByZXR1cm47XG4gICAgLy8gTWFyayBhbGwgcmVmZXJlbmNlZCBzY2hlbWFzIHNvIHdlIGNhbiB0ZWxsIGxhdGVyIHdoaWNoIHNjaGVtYXMgYXJlIHJlZmVycmVkIHRvLCBidXQgbmV2ZXIgZGVmaW5lZFxuICAgIGlmKHNjaGVtYS4kcmVmKXtcbiAgICAgIHZhciByZXNvbHZlZFVyaSA9IHVyaWxpYi5yZXNvbHZlKGJhc2V1cmksIHNjaGVtYS4kcmVmKTtcbiAgICAgIHJlZltyZXNvbHZlZFVyaV0gPSByZWZbcmVzb2x2ZWRVcmldID8gcmVmW3Jlc29sdmVkVXJpXSsxIDogMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGlkID0gc2NoZW1hLiRpZCB8fCBzY2hlbWEuaWQ7XG4gICAgdmFyIG91ckJhc2UgPSBpZCA/IHVyaWxpYi5yZXNvbHZlKGJhc2V1cmksIGlkKSA6IGJhc2V1cmk7XG4gICAgaWYgKG91ckJhc2UpIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gZnJhZ21lbnQsIGFwcGVuZCBhbiBlbXB0eSBvbmVcbiAgICAgIGlmKG91ckJhc2UuaW5kZXhPZignIycpPDApIG91ckJhc2UgKz0gJyMnO1xuICAgICAgaWYoZm91bmRbb3VyQmFzZV0pe1xuICAgICAgICBpZighaGVscGVycy5kZWVwQ29tcGFyZVN0cmljdChmb3VuZFtvdXJCYXNlXSwgc2NoZW1hKSl7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY2hlbWEgPCcrb3VyQmFzZSsnPiBhbHJlYWR5IGV4aXN0cyB3aXRoIGRpZmZlcmVudCBkZWZpbml0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kW291ckJhc2VdO1xuICAgICAgfVxuICAgICAgZm91bmRbb3VyQmFzZV0gPSBzY2hlbWE7XG4gICAgICAvLyBzdHJpcCB0cmFpbGluZyBmcmFnbWVudFxuICAgICAgaWYob3VyQmFzZVtvdXJCYXNlLmxlbmd0aC0xXT09JyMnKXtcbiAgICAgICAgZm91bmRbb3VyQmFzZS5zdWJzdHJpbmcoMCwgb3VyQmFzZS5sZW5ndGgtMSldID0gc2NoZW1hO1xuICAgICAgfVxuICAgIH1cbiAgICBzY2FuQXJyYXkob3VyQmFzZSsnL2l0ZW1zJywgKEFycmF5LmlzQXJyYXkoc2NoZW1hLml0ZW1zKT9zY2hlbWEuaXRlbXM6W3NjaGVtYS5pdGVtc10pKTtcbiAgICBzY2FuQXJyYXkob3VyQmFzZSsnL2V4dGVuZHMnLCAoQXJyYXkuaXNBcnJheShzY2hlbWEuZXh0ZW5kcyk/c2NoZW1hLmV4dGVuZHM6W3NjaGVtYS5leHRlbmRzXSkpO1xuICAgIHNjYW5TY2hlbWEob3VyQmFzZSsnL2FkZGl0aW9uYWxJdGVtcycsIHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpO1xuICAgIHNjYW5PYmplY3Qob3VyQmFzZSsnL3Byb3BlcnRpZXMnLCBzY2hlbWEucHJvcGVydGllcyk7XG4gICAgc2NhblNjaGVtYShvdXJCYXNlKycvYWRkaXRpb25hbFByb3BlcnRpZXMnLCBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuICAgIHNjYW5PYmplY3Qob3VyQmFzZSsnL2RlZmluaXRpb25zJywgc2NoZW1hLmRlZmluaXRpb25zKTtcbiAgICBzY2FuT2JqZWN0KG91ckJhc2UrJy9wYXR0ZXJuUHJvcGVydGllcycsIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gICAgc2Nhbk9iamVjdChvdXJCYXNlKycvZGVwZW5kZW5jaWVzJywgc2NoZW1hLmRlcGVuZGVuY2llcyk7XG4gICAgc2NhbkFycmF5KG91ckJhc2UrJy9kaXNhbGxvdycsIHNjaGVtYS5kaXNhbGxvdyk7XG4gICAgc2NhbkFycmF5KG91ckJhc2UrJy9hbGxPZicsIHNjaGVtYS5hbGxPZik7XG4gICAgc2NhbkFycmF5KG91ckJhc2UrJy9hbnlPZicsIHNjaGVtYS5hbnlPZik7XG4gICAgc2NhbkFycmF5KG91ckJhc2UrJy9vbmVPZicsIHNjaGVtYS5vbmVPZik7XG4gICAgc2NhblNjaGVtYShvdXJCYXNlKycvbm90Jywgc2NoZW1hLm5vdCk7XG4gIH1cbiAgZnVuY3Rpb24gc2NhbkFycmF5KGJhc2V1cmksIHNjaGVtYXMpe1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSByZXR1cm47XG4gICAgZm9yKHZhciBpPTA7IGk8c2NoZW1hcy5sZW5ndGg7IGkrKyl7XG4gICAgICBzY2FuU2NoZW1hKGJhc2V1cmkrJy8nK2ksIHNjaGVtYXNbaV0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzY2FuT2JqZWN0KGJhc2V1cmksIHNjaGVtYXMpe1xuICAgIGlmKCFzY2hlbWFzIHx8IHR5cGVvZiBzY2hlbWFzIT0nb2JqZWN0JykgcmV0dXJuO1xuICAgIGZvcih2YXIgcCBpbiBzY2hlbWFzKXtcbiAgICAgIHNjYW5TY2hlbWEoYmFzZXVyaSsnLycrcCwgc2NoZW1hc1twXSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZvdW5kID0ge307XG4gIHZhciByZWYgPSB7fTtcbiAgc2NhblNjaGVtYShiYXNlLCBzY2hlbWEpO1xuICByZXR1cm4gbmV3IFNjaGVtYVNjYW5SZXN1bHQoZm91bmQsIHJlZik7XG59O1xuIiwiLyoqIEBtb2R1bGUgdXRpbHMvU2VsZWN0ICovXG5cbmltcG9ydCB7IHVuc2VsZWN0LCBnZXRTdGFmZkJCb3gsIHNlbGVjdFN0YWZmLCBzZWxlY3RBbGwsIGdldFNlbGVjdGlvblR5cGUgfSBmcm9tICcuL1NlbGVjdFRvb2xzJztcbmltcG9ydCB7IHJlc2l6ZSB9IGZyb20gJy4vUmVzaXplJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgRHJhZ0hhbmRsZXIgZnJvbSAnLi9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBJbmZvSW50ZXJmYWNlIH0gZnJvbSAnLi4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgWm9vbUhhbmRsZXIgZnJvbSAnLi4vU2luZ2xlVmlldy9ab29tJztcblxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQkJveCwgZ2V0U3RhZmZCeUNvb3JkcywgUG9pbnQgfSBmcm9tICcuL0Nvb3JkaW5hdGVzJztcblxubGV0IGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlciwgbmVvblZpZXc6IE5lb25WaWV3LCBpbmZvOiBJbmZvSW50ZXJmYWNlLCB6b29tSGFuZGxlcjogWm9vbUhhbmRsZXI7XG5sZXQgc3Ryb2tlV2lkdGggPSA3O1xuXG4vKipcbiAqIFNldCBzdHJva2Ugd2lkdGggb24gZHJhZyBzZWxlY3QgYm94LlxuICogQHBhcmFtIHdpZHRoIC0gU3Ryb2tlIHdpZHRoIGluIHBpeGVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdFN0cm9rZVdpZHRoICh3aWR0aDogbnVtYmVyKTogdm9pZCB7XG4gIHN0cm9rZVdpZHRoID0gd2lkdGg7XG59XG5cbi8qKlxuICogU2V0IHRoZSBvYmplY3RzIGZvciB0aGlzIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdEhlbHBlck9iamVjdHMgKG52OiBOZW9uVmlldywgZGg6IERyYWdIYW5kbGVyKTogdm9pZCB7XG4gIGRyYWdIYW5kbGVyID0gZGg7XG4gIG5lb25WaWV3ID0gbnY7XG4gIGluZm8gPSBuZW9uVmlldy5pbmZvO1xuICB6b29tSGFuZGxlciA9IG5lb25WaWV3LnZpZXcuem9vbUhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUtleUxpc3RlbmVyIChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgaWYgKGV2dC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykubGVuZ3RoID4gMCkge1xuICAgICAgaW5mby5pbmZvTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHVuc2VsZWN0KCk7XG4gIH1cbn1cblxuLy8gRU5URVIgS0VZOiB3aGVuIGEgQkJveCBpcyBzZWxlY3RlZCwgcHJlc3NpbmcgZW50ZXIgd2lsbFxuLy8gICB0cmlnZ2VyIHRoZSBlZGl0IHN5bGxhYmxlIHRleHQgZnVuY3Rpb24uXG5mdW5jdGlvbiBlbnRlcktleUxpc3RlbmVyIChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgLy8gY2hlY2sgaWYgJ2VudGVyJyBpcyBwcmVzc2VkIHdpdGggdGhlIGNvcnJlY3QgY29uZGl0aW9uc1xuICBpZiAoZ2V0U2VsZWN0aW9uVHlwZSgpICE9PSAnc2VsQnlCQm94J1xuICAgIHx8ICEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlUZXh0JykgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZFxuICAgIHx8IGV2dC5rZXkgIT09ICdFbnRlcidcbiAgKVxuICAgIHJldHVybjtcblxuICBjb25zdCBzZWxlY3RlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zeWxsYWJsZS1oaWdobGlnaHRlZCcpO1xuXG4gIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgc3lsbGFibGUgc2VsZWN0ZWRcbiAgaWYgKHNlbGVjdGVkKSB7XG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4uJyArIHNlbGVjdGVkLmlkKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIC8vIHdlIHNpbXVsYXRlIGEgY2xpY2sgYmVjYXVzZSB0aGUgbWV0aG9kIGB1cGRhdGVTeWxUZXh0KClgIGlzIG9ubHlcbiAgICAvLyBhY2Nlc3NpYmxlIGluc2lkZSBUZXh0RWRpdE1vZGU7IHRoZSBzcGFuIGhhcyBhbiBldmVudCBsaXN0ZW5lciBmb3JcbiAgICAvLyBjbGlja3MuXG4gICAgc3Bhbi5jbGljaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFycm93S2V5TGlzdGVuZXIgKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICBpZiAoZ2V0U2VsZWN0aW9uVHlwZSgpICE9PSAnc2VsQnlCQm94JyB8fCAoZXZ0LmtleSAhPT0gJ0Fycm93TGVmdCcgJiYgZXZ0LmtleSAhPT0gJ0Fycm93UmlnaHQnICYmIGV2dC5rZXkgIT09ICdUYWInICYmIGV2dC5zaGlmdEtleSkpXG4gICAgcmV0dXJuO1xuICBldnQucHJldmVudERlZmF1bHQoKTsgLy8gcHJldmVudCBkZWZhdWx0IGZvciB0YWIga2V5XG4gIFxuICBjb25zdCBzZWxlY3RlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zeWxsYWJsZS1oaWdobGlnaHRlZCcpO1xuICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zeWxsYWJsZScpKTtcblxuICAvLyBub3QgYWxsIHN5bGxhYmxlcyBoYXZlIEJCb3hlczsgd2UgbXVzdCBmaWx0ZXIgdGhlbSBvdXRcbiAgY29uc3QgYmJveFN5bGxhYmxlcyA9IHN5bGxhYmxlcy5maWx0ZXIoc3lsID0+IHN5bC5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpICE9PSBudWxsKTtcbiAgY29uc3QgaW5kID0gYmJveFN5bGxhYmxlcy5pbmRleE9mKHNlbGVjdGVkKTtcblxuICBpZiAoKGV2dC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IChldnQua2V5ID09PSAnVGFiJyAmJiBldnQuc2hpZnRLZXkpKSAmJiBpbmQgPiAwKSB7XG4gICAgdW5zZWxlY3QoKTtcblxuICAgIGNvbnN0IGJib3ggPSBiYm94U3lsbGFibGVzW2luZCAtIDFdLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgc2VsZWN0QWxsKFtiYm94IGFzIFNWR0dyYXBoaWNzRWxlbWVudF0sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG4gIH0gZWxzZSBpZiAoKGV2dC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCAoZXZ0LmtleSA9PT0gJ1RhYicgJiYgIWV2dC5zaGlmdEtleSkpICYmIGluZCA8IGJib3hTeWxsYWJsZXMubGVuZ3RoIC0gMSkge1xuICAgIHVuc2VsZWN0KCk7XG5cbiAgICBjb25zdCBiYm94ID0gYmJveFN5bGxhYmxlc1tpbmQgKyAxXS5xdWVyeVNlbGVjdG9yKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpO1xuICAgIHNlbGVjdEFsbChbYmJveCBhcyBTVkdHcmFwaGljc0VsZW1lbnRdLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICB9XG4gIFxuICAvLyBBdXRvIHNjcm9sbCB0byBoaWdobGlnaHRlZCB0ZXh0XG4gIGNvbnN0IHNlbGVjdGVkU3lsVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50ZXh0LXNlbGVjdCcpO1xuICBpZiAoc2VsZWN0ZWRTeWxUZXh0KSB7XG4gICAgc2VsZWN0ZWRTeWxUZXh0LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2VsQnlCQm94ICgpOiBib29sZWFuIHtcbiAgY29uc3Qgc2VsQnlCQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpO1xuICBpZiAoc2VsQnlCQm94KSB7XG4gICAgcmV0dXJuIHNlbEJ5QkJveC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb3BIYW5kbGVyIChldnQ6IEV2ZW50KTogdm9pZCB7IGV2dC5zdG9wUHJvcGFnYXRpb24oKTsgfVxuXG4vKipcbiAqIEdldCBib3VuZGluZyBib3ggb2YgYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBnZXRCQm94Q29vcmRzIChlbDogU1ZHR3JhcGhpY3NFbGVtZW50KTogQkJveCB7XG4gIGlmIChpc1NlbEJ5QkJveCgpKSB7XG4gICAgY29uc3QgdWx4ID0gTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgneCcpKSwgdWx5ID0gTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgneScpKTtcbiAgICAvLyBXaGF0IGlzIHRoZSBtYXRoIGhlcmU/Pz9cbiAgICBjb25zdCBscnggPSB1bHggKyBOdW1iZXIoKGVsLmdldEF0dHJpYnV0ZSgnd2lkdGgnKS5zbGljZSgwLCAtMikpKTtcbiAgICBjb25zdCBscnkgPSB1bHkgKyBOdW1iZXIoKGVsLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jykuc2xpY2UoMCwgLTIpKSk7XG5cbiAgICByZXR1cm4geyB1bHgsIHVseSwgbHJ4LCBscnkgfTtcbiAgfVxuXG4gIGlmIChlbC50YWdOYW1lID09PSAndXNlJykge1xuICAgIGNvbnN0IHJlY3QgPSAoZWwucGFyZW50Tm9kZSBhcyBTVkdHRWxlbWVudCkuZ2V0QkJveCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVseDogcmVjdC54LFxuICAgICAgdWx5OiByZWN0LnksXG4gICAgICBscng6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgICBscnk6IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBnZXRTdGFmZkJCb3goZWwpO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyB3aXRoaW4gdGhlIGRyYWcgc2VsZWN0aW9uIHJlY3RhbmdsZS5cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiBgdWxgICh1cHBlciBsZWZ0KSBhbmQgYGxyYCAobG93ZXIgcmlnaHQpXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudEluUmVjdChlbDogU1ZHR3JhcGhpY3NFbGVtZW50LCB1bDogUG9pbnQsIGxyOiBQb2ludCk6IGJvb2xlYW4ge1xuICBpZiAoaXNTZWxCeUJCb3goKSB8fCBlbC50YWdOYW1lID09PSAndXNlJykge1xuICAgIGNvbnN0IGJib3ggPSBnZXRCQm94Q29vcmRzKGVsKTtcbiAgICBcbiAgICAvLyBXZSB3YW50IHRvIGZpbmQgd2hldGhlciB0aGUgYm91bmRpbmcgYm94IG92ZXJsYXBzIHdpdGggdGhlIHJlY3RhbmdsZVxuICAgIC8vIGRlZmluZWQgYnkgYHVsYCBhbmQgYGxyYC4gVGhlIGVhc2llc3Qgc29sdXRpb24gaXMgdG8gbmVnYXRlIGEgc3VtLW9mLXByb2R1Y3RzIGVxdWF0aW9uOlxuICAgIC8vIGkuZS4sIHRoZXJlIGFyZSA0IHBvc3NpYmlsaXRpZXMgaW4gd2hpY2ggdGhlIHR3byAqZG9uJ3QqIG92ZXJsYXBcbiAgICByZXR1cm4gIShsci54IDwgYmJveC51bHggfHwgdWwueCA+IGJib3gubHJ4IHx8IGxyLnkgPCBiYm94LnVseSB8fCB1bC55ID4gYmJveC5scnkpO1xuICB9XG5cbiAgLy8gVE9ETzogU2ltcGxpZnlcbiAgY29uc3QgYm94ID0gZ2V0U3RhZmZCQm94KGVsKTtcbiAgcmV0dXJuICEoKHVsLnggPCBib3gudWx4ICYmIGxyLnggPCBib3gudWx4KSB8fCAodWwueCA+IGJveC5scnggJiYgbHIueCA+IGJveC5scngpIHx8XG4gICAgICAgICAgKHVsLnkgPCAoYm94LnVseSArIE1hdGguYWJzKGJveC51bHggLSB1bC54KSAqIE1hdGgudGFuKGJveC5yb3RhdGUpKSAmJlxuICAgICAgICAgICAgbHIueSA8IChib3gudWx5ICsgTWF0aC5hYnMoYm94LnVseCAtIHVsLngpICogTWF0aC50YW4oYm94LnJvdGF0ZSkpKSB8fFxuICAgICAgICAgICh1bC55ID4gKGJveC5scnkgKyBNYXRoLmFicyhib3gubHJ5IC0gbHIueSkgKiBNYXRoLnRhbihib3gucm90YXRlKSkgJiZcbiAgICAgICAgICAgIGxyLnkgPiAoYm94LmxyeSArIE1hdGguYWJzKGJveC5scnkgLSBsci55KSAqIE1hdGgudGFuKGJveC5yb3RhdGUpKSkpO1xufVxuXG4vKipcbiAqIEFwcGx5IGxpc3RlbmVycyBmb3IgY2xpY2sgc2VsZWN0aW9uLlxuICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciB1c2VkIHRvIGNob29zZSB3aGVyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGlja1NlbGVjdCAoc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKS5mb3JFYWNoKHNlbCA9PiB7XG4gICAgc2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNsaWNrSGFuZGxlcik7XG4gICAgc2VsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNsaWNrSGFuZGxlcik7XG4gIH0pO1xuXG4gIC8vIENsaWNrIGF3YXkgbGlzdGVuZXJzXG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVzY2FwZUtleUxpc3RlbmVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjYXBlS2V5TGlzdGVuZXIpO1xuXG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVudGVyS2V5TGlzdGVuZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlbnRlcktleUxpc3RlbmVyKTtcblxuICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBhcnJvd0tleUxpc3RlbmVyKTtcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYXJyb3dLZXlMaXN0ZW5lcik7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGV2dCkgPT4geyBldnQucHJldmVudERlZmF1bHQoKTsgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndXNlLHJlY3QsI21vcmVFZGl0JykuZm9yRWFjaChzZWwgPT4ge1xuICAgIHNlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN0b3BQcm9wSGFuZGxlcik7XG4gICAgc2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3RvcFByb3BIYW5kbGVyKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGFuZGxlIGNsaWNrIGV2ZW50cyByZWxhdGVkIHRvIGVsZW1lbnQgc2VsZWN0aW9uLlxuICovXG5cbi8vIFRoZSBgdGhpc2Aga2V5d29yZCBjYW4gYmUgXCJwYXNzZWRcIiBhcyBhIGZha2UgcGFyYW1ldGVyIHNvIHRoYXQgd2UgY2FuIHR5cGUgaXQgY29ycmVjdGx5XG4vLyBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2Z1bmN0aW9ucy5odG1sI2RlY2xhcmluZy10aGlzLWluLWEtZnVuY3Rpb25cbmZ1bmN0aW9uIGNsaWNrSGFuZGxlciAodGhpczogU1ZHR3JhcGhpY3NFbGVtZW50LCBldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgLy8gUmV0dXJuIGlmIHVzZXIgaXMgaW4gaW5zZXJ0IG1vZGUgb3IgcGFubmluZyBpcyBhY3RpdmUgZnJvbSBzaGlmdCBrZXlcbiAgaWYgKCFuZW9uVmlldyB8fCBuZW9uVmlldy5nZXRVc2VyTW9kZSgpID09PSAnaW5zZXJ0JyB8fCBldnQuc2hpZnRLZXkpXG4gICAgcmV0dXJuO1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgY3RybC9jbWQga2V5IGhhcyBiZWVuIHNlbGVjdGVkXG4gIGZ1bmN0aW9uIGlzTXVsdGlTZWxlY3QgKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTWFjLykgPyBldnQubWV0YUtleSA6IGV2dC5jdHJsS2V5O1xuICB9XG5cbiAgLy8gSWYgdXNlciBoYXMgY2xpY2tlZCBhIGxheWVyIGVsZW1lbnRcbiAgaWYgKHRoaXMudGFnTmFtZSA9PT0gJ3VzZScgJiYgZ2V0U2VsZWN0aW9uVHlwZSgpICE9PSAnc2VsQnlCQm94Jykge1xuICAgIGlmICh0aGlzLmNsb3Nlc3QoJy5zZWxlY3RlZCcpID09PSBudWxsKSB7XG4gICAgICBsZXQgc2VsZWN0aW9uOiBTVkdHcmFwaGljc0VsZW1lbnRbXSA9IFt0aGlzXTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBwYXJ0IG9mIGEgbGlnYXR1cmUgYW5kLCBpZiBzbywgYWRkIGFsbCBvZiBpdCB0byB0aGUgc2VsZWN0aW9uLlxuICAgICAgY29uc3QgZmlyc3RMaWdhdHVyZUhhbGYgPSAvRTlCWzQ1Njc4XS87XG4gICAgICBjb25zdCBzZWNvbmRMaWdhdHVyZUhhbGYgPSAvRTlCWzlBQkNdLztcbiAgICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgneGxpbms6aHJlZicpLm1hdGNoKHNlY29uZExpZ2F0dXJlSGFsZikpIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHBhcnQgb2YgYSBsaWdhdHVyZVxuICAgICAgICBjb25zdCBuYyA9IHRoaXMuY2xvc2VzdCgnLm5jJyk7XG4gICAgICAgIGNvbnN0IG5ldW1lID0gdGhpcy5jbG9zZXN0KCcubmV1bWUnKTtcbiAgICAgICAgY29uc3QgbmNJbmRleCA9IEFycmF5LmZyb20obmV1bWUuY2hpbGRyZW4pLmluZGV4T2YobmMpO1xuICAgICAgICBjb25zdCBmaXJzdFVzZSA9IG5ldW1lLmNoaWxkcmVuW25jSW5kZXggLSAxXS5jaGlsZHJlblswXSBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIGNvbnNvbGUuYXNzZXJ0KGZpcnN0VXNlLmdldEF0dHJpYnV0ZSgneGxpbms6aHJlZicpLm1hdGNoKGZpcnN0TGlnYXR1cmVIYWxmKSwgJ0ZpcnN0IGdseXBoIG9mIGxpZ2F0dXJlIHVuZXhwZWN0ZWQhJyk7XG5cbiAgICAgICAgaWYgKGZpcnN0VXNlLmNsb3Nlc3QoJy5zZWxlY3RlZCcpID09PSBudWxsKSB7XG4gICAgICAgICAgc2VsZWN0aW9uLnVuc2hpZnQoZmlyc3RVc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykubWF0Y2goZmlyc3RMaWdhdHVyZUhhbGYpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHBhcnQgb2YgYSBsaWdhdHVyZVxuICAgICAgICBjb25zdCBuYyA9IHRoaXMuY2xvc2VzdCgnLm5jJyk7XG4gICAgICAgIGNvbnN0IG5ldW1lID0gdGhpcy5jbG9zZXN0KCcubmV1bWUnKTtcbiAgICAgICAgY29uc3QgbmNJbmRleCA9IEFycmF5LmZyb20obmV1bWUuY2hpbGRyZW4pLmluZGV4T2YobmMpO1xuICAgICAgICBjb25zdCBzZWNvbmRVc2UgPSBuZXVtZS5jaGlsZHJlbltuY0luZGV4ICsgMV0uY2hpbGRyZW5bMF0gYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgICBjb25zb2xlLmFzc2VydChzZWNvbmRVc2UuZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykubWF0Y2goc2Vjb25kTGlnYXR1cmVIYWxmKSwgJ1NlY29uZCBnbHlwaCBvZiBsaWdhdHVyZSB1bmV4cGVjdGVkIScpO1xuXG4gICAgICAgIGlmIChzZWNvbmRVc2UuY2xvc2VzdCgnLnNlbGVjdGVkJykgPT09IG51bGwpIHtcbiAgICAgICAgICBzZWxlY3Rpb24ucHVzaChzZWNvbmRVc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc011bHRpU2VsZWN0KCkpIHtcbiAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvbmNhdChBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpKSk7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdEFsbChzZWxlY3Rpb24sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG5cbiAgICAgIGlmIChkcmFnSGFuZGxlcikge1xuICAgICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChpc011bHRpU2VsZWN0KCkpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uTW9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWwtYnkgLmlzLWFjdGl2ZScpLmlkO1xuICAgICAgICBjb25zdCBtb2RlVG9DbGFzcyA9IHtcbiAgICAgICAgICBzZWxCeVN0YWZmOiAnLnN0YWZmJyxcbiAgICAgICAgICBzZWxCeU5ldW1lOiAnLm5ldW1lJyxcbiAgICAgICAgICBzZWxCeU5jOiAnLm5jJyxcbiAgICAgICAgICBzZWxCeUxheWVyRWxlbWVudDogJy5hY2NpZCcsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2xhc3MgPSBtb2RlVG9DbGFzc1tzZWxlY3Rpb25Nb2RlXSB8fCAnLnN5bGxhYmxlJztcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gW3RoaXMuY2xvc2VzdChzZWxlY3RlZENsYXNzKV07XG5cbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IFtdO1xuICAgICAgICBzZWxlY3Rpb24gPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb24uZmlsdGVyKChlbCkgPT4gIXJlbW92ZS5pbmNsdWRlcyhlbCkpO1xuXG4gICAgICAgIHNlbGVjdEFsbChzZWxlY3Rpb24sIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG5cbiAgICAgICAgaWYgKGRyYWdIYW5kbGVyKSB7XG4gICAgICAgICAgZHJhZ0hhbmRsZXIuZHJhZ0luaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICgoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkudGFnTmFtZSA9PT0gJ3JlY3QnICYmIGdldFNlbGVjdGlvblR5cGUoKSA9PT0gJ3NlbEJ5QkJveCcpIHtcbiAgICBpZiAodGhpcy5jbG9zZXN0KCcuc2VsZWN0ZWQnKSA9PT0gbnVsbCkge1xuICAgICAgbGV0IHNlbGVjdGlvbiA9IFtldnQudGFyZ2V0XSBhcyBTVkdHRWxlbWVudFtdO1xuICAgICAgaWYgKGlzTXVsdGlTZWxlY3QoKSkge1xuICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb24uY29uY2F0KEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKSkgYXMgU1ZHR0VsZW1lbnRbXSk7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5tYXAoIChlbCkgPT4ge1xuICAgICAgICAgIGlmIChlbC50YWdOYW1lID09ICdyZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvcignLnN5bFRleHRSZWN0LURpc3BsYXknKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzZWxlY3RBbGwoc2VsZWN0aW9uLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgaWYgKGRyYWdIYW5kbGVyKSB7XG4gICAgICAgIGRyYWdIYW5kbGVyLmRyYWdJbml0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBzZWxlY3Rpb24gPSBbXTtcbiAgICAgIGlmIChpc011bHRpU2VsZWN0KCkpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gW3RoaXNdO1xuICAgICAgICBzZWxlY3Rpb24gPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NlbGVjdGVkJykpO1xuICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb24ubWFwKCAoZWwpID0+IHtcbiAgICAgICAgICBpZiAoZWwudGFnTmFtZSA9PSAncmVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3IoJy5zeWxUZXh0UmVjdC1EaXNwbGF5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb24uZmlsdGVyKCAoZWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gIXJlbW92ZS5pbmNsdWRlcyhlbCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxlY3RBbGwoc2VsZWN0aW9uLCBuZW9uVmlldywgZHJhZ0hhbmRsZXIpO1xuICAgICAgICBpZiAoZHJhZ0hhbmRsZXIpIHtcbiAgICAgICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChnZXRTZWxlY3Rpb25UeXBlKCkgIT09ICdzZWxCeVN0YWZmJykge1xuICAgICAgaW5mby5pbmZvTGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50IGlzIGluIGEgc3RhZmYuXG4gICAgaWYgKCFpc011bHRpU2VsZWN0KCkpXG4gICAgICB1bnNlbGVjdCgpO1xuXG4gICAgLy8gU2VsZWN0IGEgc3RhZmZcbiAgICBjb25zdCBzdGFmZiA9IGdldFN0YWZmQnlDb29yZHMoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcbiAgICBcbiAgICBpZiAoIXN0YWZmKSByZXR1cm47XG5cbiAgICBpZiAoIXN0YWZmLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgLy8gU2VsZWN0IHByZXZpb3VzbHkgdW5zZWxlY3RlZCBzdGFmZlxuICAgICAgc2VsZWN0U3RhZmYoc3RhZmYsIGRyYWdIYW5kbGVyKTtcbiAgICAgIHJlc2l6ZShzdGFmZiwgbmVvblZpZXcsIGRyYWdIYW5kbGVyKTtcbiAgICAgIGlmIChkcmFnSGFuZGxlcikge1xuICAgICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBUcmlnZ2VyIG1vdXNlZG93biBldmVudCBvbiB0aGUgc3RhZmZcbiAgICBzdGFmZi5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nLCB7XG4gICAgICBzY3JlZW5YOiBldnQuc2NyZWVuWCxcbiAgICAgIHNjcmVlblk6IGV2dC5zY3JlZW5ZLFxuICAgICAgY2xpZW50WDogZXZ0LmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBldnQuY2xpZW50WSxcbiAgICAgIGN0cmxLZXk6IGV2dC5jdHJsS2V5LFxuICAgICAgc2hpZnRLZXk6IGV2dC5zaGlmdEtleSxcbiAgICAgIGFsdEtleTogZXZ0LmFsdEtleSxcbiAgICAgIG1ldGFLZXk6IGV2dC5tZXRhS2V5LFxuICAgICAgdmlldzogZXZ0LnZpZXdcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSBsaXN0ZW5lcnMgZm9yIGRyYWcgc2VsZWN0aW9uLlxuICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciB1c2VkIHRvIGNob29zZSB3aGVyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmFnU2VsZWN0IChzZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBpbml0aWFsWCA9IDA7XG4gIGxldCBpbml0aWFsWSA9IDA7XG4gIGxldCBwYW5uaW5nID0gZmFsc2U7XG4gIGxldCBkcmFnU2VsZWN0aW5nID0gZmFsc2U7XG4gIC8vIHZhciBjYW52YXMgPSBkMy5zZWxlY3QoJyNzdmdfZ3JvdXAnKTtcblxuICBjb25zdCBjYW52YXMgPSBkMy5zZWxlY3Qoc2VsZWN0b3IpO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHBvaW50IGlzIGluIHRoZSBib3VuZHMgb2YgYSBzdGFmZiBlbGVtZW50LlxuICAgKiBSb3RhdGUgaXMgbm90IHRha2VuIGludG8gYWNjb3VudC5cbiAgICovXG4gIGZ1bmN0aW9uIHBvaW50Tm90SW5TdGFmZiAocHQ6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhdmVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzdGFmZicpKTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHN0YXZlcy5maWx0ZXIoKHN0YWZmOiBTVkdHRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgYmJveCA9IGdldFN0YWZmQkJveChzdGFmZik7XG4gICAgICBjb25zdCB1bHggPSBiYm94LnVseDtcbiAgICAgIGNvbnN0IHVseSA9IGJib3gudWx5O1xuICAgICAgY29uc3QgbHJ4ID0gYmJveC5scng7XG4gICAgICBjb25zdCBscnkgPSBiYm94LmxyeTtcbiAgICAgIGNvbnN0IHJvdGF0ZSA9IGJib3gucm90YXRlO1xuXG4gICAgICByZXR1cm4gKHB0WzBdID4gdWx4ICYmIHB0WzBdIDwgbHJ4KSAmJlxuICAgICAgICAocHRbMV0gPiAodWx5ICsgKHB0WzBdIC0gdWx4KSAqIE1hdGgudGFuKHJvdGF0ZSkpKSAmJlxuICAgICAgICAocHRbMV0gPCAobHJ5IC0gKGxyeCAtIHB0WzBdKSAqIE1hdGgudGFuKHJvdGF0ZSkpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICAvKipcbiAgICAgKiBDcmVhdGUgYW4gaW5pdGlhbCBkcmFnZ2luZyByZWN0YW5nbGUuXG4gICAgICogQHBhcmFtIHVseCAtIFRoZSB1cHBlciBsZWZ0IHgtcG9zaXRpb24gb2YgdGhlIG5ldyByZWN0YW5nbGUuXG4gICAgICogQHBhcmFtIHVseSAtIFRoZSB1cHBlciBsZWZ0IHktcG9zaXRpb24gb2YgdGhlIG5ldyByZWN0YW5nbGUuXG4gICAgICovXG4gIGZ1bmN0aW9uIGluaXRSZWN0ICh1bHg6IG51bWJlciwgdWx5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjYW52YXMuYXBwZW5kKCdyZWN0JylcbiAgICAgIC5hdHRyKCd4JywgdWx4KVxuICAgICAgLmF0dHIoJ3knLCB1bHkpXG4gICAgICAuYXR0cignd2lkdGgnLCAwKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDApXG4gICAgICAuYXR0cignaWQnLCAnc2VsZWN0UmVjdCcpXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBzdHJva2VXaWR0aClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbFN0YXJ0ICgpOiB2b2lkIHtcbiAgICBpZiAoIW5lb25WaWV3KSByZXR1cm47XG4gICAgY29uc3QgdXNlck1vZGUgPSBuZW9uVmlldy5nZXRVc2VyTW9kZSgpO1xuICAgIGlmIChkMy5ldmVudC5zb3VyY2VFdmVudC50YXJnZXQubm9kZU5hbWUgIT09ICd1c2UnICYmIHVzZXJNb2RlICE9PSAnaW5zZXJ0JyAmJiBkMy5ldmVudC5zb3VyY2VFdmVudC50YXJnZXQubm9kZU5hbWUgIT09ICdyZWN0Jykge1xuICAgICAgaWYgKCFkMy5ldmVudC5zb3VyY2VFdmVudC5zaGlmdEtleSkgeyAvLyBJZiBub3QgaG9sZGluZyBkb3duIHNoaWZ0IGtleSB0byBwYW5cbiAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykgfHxcbiAgICAgICAgICBwb2ludE5vdEluU3RhZmYoZDMubW91c2UodGhpcykpKSB7XG4gICAgICAgICAgdW5zZWxlY3QoKTtcbiAgICAgICAgICBkcmFnU2VsZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBpbml0aWFsUCA9IGQzLm1vdXNlKHRoaXMpO1xuICAgICAgICAgIGluaXRpYWxYID0gaW5pdGlhbFBbMF07XG4gICAgICAgICAgaW5pdGlhbFkgPSBpbml0aWFsUFsxXTtcbiAgICAgICAgICBpbml0UmVjdChpbml0aWFsWCwgaW5pdGlhbFkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKHpvb21IYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB6b29tSGFuZGxlci5zdGFydERyYWcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZDMuZXZlbnQuc291cmNlRXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHBhbm5pbmcgPSB0cnVlO1xuICAgICAgaWYgKHpvb21IYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgem9vbUhhbmRsZXIuc3RhcnREcmFnKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBkcmFnZ2luZyByZWN0YW5nbGUuXG4gICAgICogQHBhcmFtIG5ld1ggLSBUaGUgbmV3IHVseC5cbiAgICAgKiBAcGFyYW0gbmV3WSAtIFRoZSBuZXcgdWx5LlxuICAgICAqIEBwYXJhbSBjdXJyZW50V2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIGN1cnJlbnRIZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICBmdW5jdGlvbiB1cGRhdGVSZWN0IChuZXdYOiBudW1iZXIsIG5ld1k6IG51bWJlciwgY3VycmVudFdpZHRoOiBudW1iZXIsIGN1cnJlbnRIZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGQzLnNlbGVjdCgnI3NlbGVjdFJlY3QnKVxuICAgICAgLmF0dHIoJ3gnLCBuZXdYKVxuICAgICAgLmF0dHIoJ3knLCBuZXdZKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgY3VycmVudFdpZHRoKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGN1cnJlbnRIZWlnaHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RWxlbWVudHNCeVNlbGVjdG9yIChzZWxlY3Rvcjogc3RyaW5nKTogU1ZHR3JhcGhpY3NFbGVtZW50W10ge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yICsgJyB1c2UsICcgKyBzZWxlY3RvciArICcgLnN0YWZmJykpO1xuXG4gICAgaWYgKGlzU2VsQnlCQm94KCkpXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yICsgJyAuc3lsVGV4dFJlY3QtZGlzcGxheScpKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IgKyAnIHVzZScpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGluZyAoKTogdm9pZCB7XG4gICAgaWYgKCFwYW5uaW5nICYmIGRyYWdTZWxlY3RpbmcpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQdCA9IGQzLm1vdXNlKHRoaXMpO1xuICAgICAgY29uc3QgY3VyWCA9IGN1cnJlbnRQdFswXTtcbiAgICAgIGNvbnN0IGN1clkgPSBjdXJyZW50UHRbMV07XG5cbiAgICAgIGNvbnN0IG5ld1ggPSBjdXJYIDwgaW5pdGlhbFggPyBjdXJYIDogaW5pdGlhbFg7XG4gICAgICBjb25zdCBuZXdZID0gY3VyWSA8IGluaXRpYWxZID8gY3VyWSA6IGluaXRpYWxZO1xuICAgICAgY29uc3Qgd2lkdGggPSBjdXJYIDwgaW5pdGlhbFggPyBpbml0aWFsWCAtIGN1clggOiBjdXJYIC0gaW5pdGlhbFg7XG4gICAgICBjb25zdCBoZWlnaHQgPSBjdXJZIDwgaW5pdGlhbFkgPyBpbml0aWFsWSAtIGN1clkgOiBjdXJZIC0gaW5pdGlhbFk7XG5cbiAgICAgIHVwZGF0ZVJlY3QobmV3WCwgbmV3WSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSBlbHNlIGlmIChwYW5uaW5nKSB7XG4gICAgICBpZiAoem9vbUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB6b29tSGFuZGxlci5kcmFnZ2luZygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbEVuZCAoKTogdm9pZCB7XG4gICAgaWYgKCFwYW5uaW5nICYmIGRyYWdTZWxlY3RpbmcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdFJlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0UmVjdCcpO1xuICAgICAgY29uc3QgcnggPSBwYXJzZUludChzZWxlY3RSZWN0LmdldEF0dHJpYnV0ZSgneCcpKTtcbiAgICAgIGNvbnN0IHJ5ID0gcGFyc2VJbnQoc2VsZWN0UmVjdC5nZXRBdHRyaWJ1dGUoJ3knKSk7XG4gICAgICBjb25zdCBseCA9IHJ4ICsgcGFyc2VJbnQoc2VsZWN0UmVjdC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpO1xuICAgICAgY29uc3QgbHkgPSByeSArIHBhcnNlSW50KHNlbGVjdFJlY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSB0byB0aGUgY29ycmVjdCBjb29yZGluYXRlIHN5c3RlbVxuICAgICAgY29uc3Qgbm9kZSA9IGNhbnZhcy5ub2RlKCkgYXMgU1ZHU1ZHRWxlbWVudDtcbiAgICAgIGxldCB1bCA9IG5ldyBET01Qb2ludChyeCwgcnkpLCBsciA9IG5ldyBET01Qb2ludChseCwgbHkpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gbm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKClcbiAgICAgICAgLm11bHRpcGx5KChjYW52YXMuc2VsZWN0KCcuc3lzdGVtJykubm9kZSgpIGFzIFNWR0dyYXBoaWNzRWxlbWVudCkuZ2V0U2NyZWVuQ1RNKCkpXG4gICAgICAgIC5pbnZlcnNlKCk7XG4gICAgICB1bCA9IHVsLm1hdHJpeFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgbHIgPSBsci5tYXRyaXhUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgLy8gR2V0IGFsbCBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RvclxuICAgICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgLy8gR2V0IHRoZSBlbGVtZW50cyB3aXRoaW4gdGhlIHNlbGVjdGlvbiByZWN0YW5nbGVcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoZWwgPT4gaXNFbGVtZW50SW5SZWN0KGVsLCB1bCwgbHIpKTtcblxuICAgICAgLy8gR2V0IG90aGVyIGhhbHZlcyBvZiBsaWdhdHVyZXMgaWYgb25seSBvbmUgaXMgc2VsZWN0ZWRcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogU1ZHRWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAndXNlJyAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgneGxpbms6aHJlZicpLm1hdGNoKC9FOUJbNDU2Nzg5QUJDXS8pKSB7XG4gICAgICAgICAgY29uc3QgbmV1bWUgPSBlbGVtZW50LmNsb3Nlc3QoJy5uZXVtZScpO1xuICAgICAgICAgIGNvbnN0IG5jSW5kZXggPSBBcnJheS5mcm9tKG5ldW1lLmNoaWxkcmVuKS5pbmRleE9mKGVsZW1lbnQuY2xvc2VzdCgnLm5jJykpO1xuICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgneGxpbms6aHJlZicpLm1hdGNoKC9FOUJbNDU2NzhdLykpIHtcbiAgICAgICAgICAgIC8vIEFkZCBzZWNvbmQgaGFsZiBvZiBsaWdhdHVyZSB0byBzZWxlY3RlZCBsaXN0IGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZE5jID0gbmV1bWUuY2hpbGRyZW5bbmNJbmRleCArIDFdO1xuICAgICAgICAgICAgY29uc3Qgc2Vjb25kVXNlID0gc2Vjb25kTmMucXVlcnlTZWxlY3RvcigndXNlJyk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5pbmRleE9mKHNlY29uZFVzZSkgPCAwKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMucHVzaChzZWNvbmRVc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZGQgZmlyc3QgaGFsZiBvZiBsaWdhdHVyZSB0byBzZWxlY3RlZCBsaXN0IGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0TmMgPSBuZXVtZS5jaGlsZHJlbltuY0luZGV4IC0gMV07XG4gICAgICAgICAgICBjb25zdCBmaXJzdFVzZSA9IGZpcnN0TmMucXVlcnlTZWxlY3RvcigndXNlJyk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5pbmRleE9mKGZpcnN0VXNlKSA8IDApIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5wdXNoKGZpcnN0VXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgc2VsZWN0QWxsKHNlbGVjdGVkRWxlbWVudHMsIG5lb25WaWV3LCBkcmFnSGFuZGxlcik7XG5cbiAgICAgIGlmIChkcmFnSGFuZGxlcikge1xuICAgICAgICBkcmFnSGFuZGxlci5kcmFnSW5pdCgpO1xuICAgICAgfVxuICAgICAgZDMuc2VsZWN0QWxsKCcjc2VsZWN0UmVjdCcpLnJlbW92ZSgpO1xuICAgICAgZHJhZ1NlbGVjdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBwYW5uaW5nID0gZmFsc2U7XG4gIH1cblxuICBkMy5zZWxlY3RBbGwoc2VsZWN0b3IucmVwbGFjZSgnLmFjdGl2ZS1wYWdlJywgJycpLnRyaW0oKSlcbiAgICAub24oJy5kcmFnJywgbnVsbCk7XG4gIGNvbnN0IGRyYWdTZWxlY3RBY3Rpb24gPSBkMy5kcmFnKClcbiAgICAub24oJ3N0YXJ0Jywgc2VsU3RhcnQpXG4gICAgLm9uKCdkcmFnJywgc2VsZWN0aW5nKVxuICAgIC5vbignZW5kJywgc2VsRW5kKTtcbiAgY2FudmFzLmNhbGwoZHJhZ1NlbGVjdEFjdGlvbik7XG4gIGlmIChkcmFnSGFuZGxlcikge1xuICAgIGRyYWdIYW5kbGVyLnJlc2V0VG8oZHJhZ1NlbGVjdEFjdGlvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7IHV1aWR2NCB9IGZyb20gJy4vcmFuZG9tJztcbmltcG9ydCAqIGFzIHZrYmVhdXRpZnkgZnJvbSAndmtiZWF1dGlmeSc7XG5pbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi4vdXRpbHMvTm90aWZpY2F0aW9uJztcblxuLy8gRm9yIGRldGFpbHMgYWJvdXQgdGhlIGZpbGUgY29udmVyc2lvbixcbi8vIHJlZmVyIHRvIHRoaXMgbGluazpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ERE1BTC9OZW9uL3dpa2kvTmVvbiVFMiU4MCU5MFZlcm92aW8tRmlsZS1Db252ZXJzaW9uXG5cbmV4cG9ydCBmdW5jdGlvbiB6aXA8VD4oYXJyYXkxOiBBcnJheTxUPiwgYXJyYXkyOiBBcnJheTxUPik6IEFycmF5PFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoXG4gICAgbGV0IGkgPSAwO1xuICAgIGkgPCAoYXJyYXkxLmxlbmd0aCA+IGFycmF5Mi5sZW5ndGggPyBhcnJheTIubGVuZ3RoIDogYXJyYXkxLmxlbmd0aCk7XG4gICAgaSsrXG4gICkge1xuICAgIHJlc3VsdC5wdXNoKFthcnJheTFbaV0sIGFycmF5MltpXV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvcHlBdHRyaWJ1dGVzKHNyYzogRWxlbWVudCwgZHN0OiBFbGVtZW50KTogdm9pZCB7XG4gIGZvciAoY29uc3QgYXR0ciBvZiBzcmMuYXR0cmlidXRlcykge1xuICAgIGRzdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvTmVvbihzdGFmZkJhc2VkTWVpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpO1xuICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHN0YWZmQmFzZWRNZWksICd0ZXh0L3htbCcpO1xuICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuICBsZXQgbkNvbCA9IDA7XG5cbiAgY29uc3Qgc2VjdGlvbnMgPSBBcnJheS5mcm9tKFxuICAgIG1laS5xdWVyeVNlbGVjdG9yQWxsKCdzZWN0aW9uOm5vdChbdHlwZT1cIm5lb24tbmV1bWUtbGluZVwiXSknKSxcbiAgKTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgLy8gUmVtb3ZlIGRpcmVjdCBjaGlsZHJlbiBwYiAmIHNiIGVsZW1lbnRzIHdpdGhpbiBzZWN0aW9uXG4gICAgY29uc3QgcGJzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCdwYicpO1xuICAgIHBicy5mb3JFYWNoKChwYikgPT4gcGIucmVtb3ZlKCkpO1xuICAgIGNvbnN0IHNicyA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnc2InKTtcbiAgICBzYnMuZm9yRWFjaCgoc2IpID0+IHNiLnJlbW92ZSgpKTtcblxuICAgIGNvbnN0IG5ld1N0YWZmID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgJ3N0YWZmJyxcbiAgICApO1xuICAgIGNvbnN0IG5ld0xheWVyID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgJ2xheWVyJyxcbiAgICApO1xuICAgIG5ld1N0YWZmLnNldEF0dHJpYnV0ZSgnbicsICcxJyk7XG4gICAgbmV3TGF5ZXIuc2V0QXR0cmlidXRlKCduJywgJzEnKTtcbiAgICBuZXdTdGFmZi5hcHBlbmRDaGlsZChuZXdMYXllcik7XG5cbiAgICAvLyBBZGQgPHBiPlxuICAgIGNvbnN0IHN1cmZhY2UgPSBtZWkucXVlcnlTZWxlY3Rvcignc3VyZmFjZScpO1xuICAgIGNvbnN0IHN1cmZhY2VJZCA9IHN1cmZhY2UuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKTtcbiAgICBjb25zdCBwYiA9IG1laURvYy5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICdwYicsXG4gICAgKTtcbiAgICBwYi5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgcGIuc2V0QXR0cmlidXRlKCdmYWNzJywgJyMnICsgc3VyZmFjZUlkKTtcbiAgICBuZXdMYXllci5hcHBlbmRDaGlsZChwYik7XG5cbiAgICBjb25zdCBuZW9uTmV1bWVMaW5lU2VjdGlvbnMgPSBBcnJheS5mcm9tKFxuICAgICAgc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCdzZWN0aW9uW3R5cGU9XCJuZW9uLW5ldW1lLWxpbmVcIl0nKSxcbiAgICApO1xuICAgIGxldCBuU3RhZmYgPSAwO1xuICAgIGxldCBsYXN0Q2I6IEVsZW1lbnQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBuZW9uTmV1bWVMaW5lU2VjdGlvbiBvZiBuZW9uTmV1bWVMaW5lU2VjdGlvbnMpIHtcbiAgICAgIG5TdGFmZiArPSAxO1xuICAgICAgY29uc3Qgc3RhZmYgPSBuZW9uTmV1bWVMaW5lU2VjdGlvbi5xdWVyeVNlbGVjdG9yKCdzdGFmZicpO1xuICAgICAgaWYgKCFzdGFmZikge1xuICAgICAgICBuZW9uTmV1bWVMaW5lU2VjdGlvbi5yZW1vdmUoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXllciA9IHN0YWZmLnF1ZXJ5U2VsZWN0b3IoJ2xheWVyJyk7XG5cbiAgICAgIC8vIGlmIHN0YWZmIGhhcyBhIG5ldyB0eXBlIHZhbHVlLFxuICAgICAgLy8gYWRkIGNiIGJlZm9yZSBzYlxuICAgICAgaWYgKFxuICAgICAgICBzdGFmZi5oYXNBdHRyaWJ1dGUoJ3R5cGUnKSAmJlxuICAgICAgICBzdGFmZi5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSAhPSAnY29sdW1uJyArIG5Db2wudG9TdHJpbmcoKVxuICAgICAgKSB7XG4gICAgICAgIG5Db2wgKz0gMTtcbiAgICAgICAgY29uc3QgY2IgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgICAgICdjYicsXG4gICAgICAgICk7XG4gICAgICAgIGNiLnNldEF0dHJpYnV0ZSgnbicsIG5Db2wudG9TdHJpbmcoKSk7XG4gICAgICAgIGNiLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgICAgY2Iuc2V0QXR0cmlidXRlKCdmYWNzJywgJyNtLScgKyB1dWlkdjQoKSk7XG4gICAgICAgIG5ld0xheWVyLmFwcGVuZENoaWxkKGNiKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgem9uZSBmb3IgcHJldmlvdXMgY2JcbiAgICAgICAgaWYgKGxhc3RDYikge1xuICAgICAgICAgIGNhbGN1bGF0ZUFuZEFkZFpvbmUobGFzdENiLCBjYiwgc3VyZmFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdENiID0gY2I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNiID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAgICdzYicsXG4gICAgICApO1xuICAgICAgc2Iuc2V0QXR0cmlidXRlKCduJywgblN0YWZmLnRvU3RyaW5nKCkpO1xuICAgICAgc2Iuc2V0QXR0cmlidXRlKCdmYWNzJywgc3RhZmYuZ2V0QXR0cmlidXRlKCdmYWNzJykpO1xuICAgICAgc2Iuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCBzdGFmZi5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpKTtcblxuICAgICAgLy8gSGFuZGxlIGN1c3Rvc1xuICAgICAgbGV0IGN1c3RvczogRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChcbiAgICAgICAgbmV3TGF5ZXIubGFzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJlxuICAgICAgICBuZXdMYXllci5sYXN0RWxlbWVudENoaWxkLnRhZ05hbWUgPT09ICdjdXN0b3MnXG4gICAgICApIHtcbiAgICAgICAgY3VzdG9zID0gbmV3TGF5ZXIucmVtb3ZlQ2hpbGQobmV3TGF5ZXIubGFzdEVsZW1lbnRDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXN0b3MgIT09IHVuZGVmaW5lZCkgbmV3TGF5ZXIuYXBwZW5kQ2hpbGQoY3VzdG9zKTtcbiAgICAgIG5ld0xheWVyLmFwcGVuZENoaWxkKHNiKTtcblxuICAgICAgLy8gQWRkIHJlbWFpbmluZyBlbGVtZW50cyBvZiBsYXllciB0byBuZXdMYXllclxuICAgICAgd2hpbGUgKGxheWVyLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0xheWVyLmFwcGVuZENoaWxkKGxheWVyLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgIH1cbiAgICAgIG5lb25OZXVtZUxpbmVTZWN0aW9uLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgYWRkIHpvbmUgZm9yIHRoZSBsYXN0IGNiIGluIHRoZSBzZWN0aW9uXG4gICAgaWYgKGxhc3RDYikge1xuICAgICAgY2FsY3VsYXRlQW5kQWRkWm9uZShsYXN0Q2IsIG51bGwsIHN1cmZhY2UpO1xuICAgIH1cbiAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG5ld1N0YWZmKTtcbiAgfVxuXG4gIC8vIEFkZCA8Y29sTGF5b3V0PlxuICBpZiAobkNvbCkge1xuICAgIGNvbnN0IHNjb3JlRGVmID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3Njb3JlRGVmJyk7XG4gICAgY29uc3QgY29sTGF5b3V0ID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgJ2NvbExheW91dCcsXG4gICAgKTtcbiAgICBjb2xMYXlvdXQuc2V0QXR0cmlidXRlKCd4bWw6aWQnLCAnbS0nICsgdXVpZHY0KCkpO1xuICAgIGNvbExheW91dC5zZXRBdHRyaWJ1dGUoJ24nLCBuQ29sLnRvU3RyaW5nKCkpO1xuICAgIHNjb3JlRGVmLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBjb2xMYXlvdXQpO1xuICB9XG5cbiAgcmV0dXJuIHZrYmVhdXRpZnkueG1sKHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobWVpRG9jKSk7XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlQW5kQWRkWm9uZShcbiAgICBzdGFydEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgZW5kRWxlbWVudDogRWxlbWVudCB8IG51bGwsXG4gICAgc3VyZmFjZTogRWxlbWVudCxcbiAgKSB7XG4gICAgLy8gQ29sbGVjdCBlbGVtZW50cyBiZXR3ZWVuIHN0YXJ0Q2IgYW5kIGVuZENiXG4gICAgY29uc3QgZWxlbWVudHNCZXR3ZWVuID0gY29sbGVjdEFsbEVsZW1lbnRzV2l0aEZhY3MoXG4gICAgICBzdGFydEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgZW5kRWxlbWVudCxcbiAgICApO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHpvbmUgYXR0cmlidXRlc1xuICAgIGNvbnN0IHpvbmUgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAnem9uZScsXG4gICAgKTtcbiAgICBjb25zdCBCQm94ID0gY2FsY3VsYXRlQkJveChlbGVtZW50c0JldHdlZW4sIHN1cmZhY2UpO1xuICAgIHpvbmUuc2V0QXR0cmlidXRlKCdscngnLCBCQm94LmxyeC50b1N0cmluZygpKTtcbiAgICB6b25lLnNldEF0dHJpYnV0ZSgnbHJ5JywgQkJveC5scnkudG9TdHJpbmcoKSk7XG4gICAgem9uZS5zZXRBdHRyaWJ1dGUoJ3VseCcsIEJCb3gudWx4LnRvU3RyaW5nKCkpO1xuICAgIHpvbmUuc2V0QXR0cmlidXRlKCd1bHknLCBCQm94LnVseS50b1N0cmluZygpKTtcbiAgICB6b25lLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZmFjcycpLnNsaWNlKDEpKTtcblxuICAgIC8vIEFkZCB6b25lIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc3VyZmFjZSBjaGlsZHJlblxuICAgIHN1cmZhY2UuaW5zZXJ0QmVmb3JlKHpvbmUsIHN1cmZhY2UuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdEFsbEVsZW1lbnRzV2l0aEZhY3MoXG4gICAgZWxlbWVudDogRWxlbWVudCxcbiAgICBlbmRFbGVtZW50OiBFbGVtZW50LFxuICAgIGVsZW1lbnRzQmV0d2VlbiA9IFtdLFxuICApIHtcbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50ICE9PSBlbmRFbGVtZW50KSB7XG4gICAgICAvLyBQdXNoIGVsZW1lbnRzIG9ubHkgaWYgaXQgaGFzIGZhY3NcbiAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZmFjcycpKSBlbGVtZW50c0JldHdlZW4ucHVzaChlbGVtZW50KTtcblxuICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb2xsZWN0QWxsRWxlbWVudHNXaXRoRmFjcyhjaGlsZCwgZW5kRWxlbWVudCwgZWxlbWVudHNCZXR3ZWVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgY29sbGVjdEFsbEVsZW1lbnRzV2l0aEZhY3MoXG4gICAgICAgICAgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcsXG4gICAgICAgICAgZW5kRWxlbWVudCxcbiAgICAgICAgICBlbGVtZW50c0JldHdlZW4sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzQmV0d2VlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUJCb3goZWxlbWVudHM6IEVsZW1lbnRbXSwgc3VyZmFjZTogRWxlbWVudCkge1xuICAgIGxldCBscnggPSBJbmZpbml0eTtcbiAgICBsZXQgbHJ5ID0gMDtcbiAgICBsZXQgdWx4ID0gMDtcbiAgICBsZXQgdWx5ID0gSW5maW5pdHk7XG5cbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCB6b25lID0gQXJyYXkuZnJvbShzdXJmYWNlLmNoaWxkcmVuKS5maW5kKFxuICAgICAgICAoem9uZSkgPT5cbiAgICAgICAgICB6b25lLmdldEF0dHJpYnV0ZSgneG1sOmlkJykgPT09IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdmYWNzJykuc2xpY2UoMSksXG4gICAgICApO1xuICAgICAgbHJ4ID0gTWF0aC5taW4obHJ4LCBwYXJzZUludCh6b25lLmdldEF0dHJpYnV0ZSgnbHJ4JykpKTtcbiAgICAgIGxyeSA9IE1hdGgubWF4KGxyeSwgcGFyc2VJbnQoem9uZS5nZXRBdHRyaWJ1dGUoJ2xyeScpKSk7XG4gICAgICB1bHggPSBNYXRoLm1heCh1bHgsIHBhcnNlSW50KHpvbmUuZ2V0QXR0cmlidXRlKCd1bHgnKSkpO1xuICAgICAgdWx5ID0gTWF0aC5taW4odWx5LCBwYXJzZUludCh6b25lLmdldEF0dHJpYnV0ZSgndWx5JykpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGxyeCwgbHJ5LCB1bHgsIHVseSB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTeWxsYWJsZVRleHQoc3lsbGFibGU6IEVsZW1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBzeWwgPSBzeWxsYWJsZS5xdWVyeVNlbGVjdG9yKCdzeWwnKT8uY2hpbGROb2Rlc1swXTtcbiAgbGV0IHN5bFRleHQ6IHN0cmluZztcbiAgaWYgKHN5bCkge1xuICAgIHN5bFRleHQgPSBzeWwubm9kZVZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHN5bFRleHQgPSAn4peKJztcbiAgfVxuXG4gIHJldHVybiBzeWxUZXh0O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHpvbmUgaXMgYWxsLXplcm8sIGhhcyBuZWdhdGl2ZSBjb29yZGluYXRlcywgb3Igbm90IGxpbmtlZCB3aXRoIGdseXBoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnZhbGlkQkJveChcbiAgbWVpOiBIVE1MRWxlbWVudCxcbiAgem9uZTogRWxlbWVudCxcbik6IFtib29sZWFuLCBFbGVtZW50P10ge1xuICBjb25zdCBscnggPSBwYXJzZUludCh6b25lLmdldEF0dHJpYnV0ZSgnbHJ4JykpO1xuICBjb25zdCBscnkgPSBwYXJzZUludCh6b25lLmdldEF0dHJpYnV0ZSgnbHJ5JykpO1xuICBjb25zdCB1bHggPSBwYXJzZUludCh6b25lLmdldEF0dHJpYnV0ZSgndWx4JykpO1xuICBjb25zdCB1bHkgPSBwYXJzZUludCh6b25lLmdldEF0dHJpYnV0ZSgndWx5JykpO1xuXG4gIGNvbnN0IGlzQWxsWmVybyA9IGxyeCA9PT0gMCAmJiBscnkgPT09IDAgJiYgdWx4ID09PSAwICYmIHVseSA9PT0gMDtcbiAgY29uc3QgaGFzTmVnYXRpdmVDb29yZGluYXRlcyA9IGxyeCA8IDAgfHwgbHJ5IDwgMCB8fCB1bHggPCAwIHx8IHVseSA8IDA7XG5cbiAgY29uc3QgZWxlbWVudCA9IG1laS5xdWVyeVNlbGVjdG9yKFxuICAgIGAqW2ZhY3M9XCIkeycjJyArIHpvbmUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKX1cIl1gLFxuICApO1xuICBpZiAoaXNBbGxaZXJvIHx8IGhhc05lZ2F0aXZlQ29vcmRpbmF0ZXMgfHwgIWVsZW1lbnQpIHJldHVybiBbdHJ1ZSwgZWxlbWVudF07XG4gIHJldHVybiBbZmFsc2VdO1xufVxuXG4vKipcbiAqIENvbnZlcnQgc2IgdG8gc3RhZmYgZm9yIHZlcm92aW9cbiAqIEFsc28gZG8gaGV1cmlzdGljIGNoZWNrczpcbiAqICAgIDEuIGludmFsaWQgem9uZXNcbiAqICAgIDIuIG5ldW1lIHdpdGhvdXQgbmV1bWUgY29tcG9uZW50XG4gKiAgICAzLiBzeWxsYWJsZSB3aXRob3V0IG5ldW1lXG4gKiAgICA0LiBsaW5rZWQgc3lsbGFibGVzIG5vdCBsaW5rZWRcbiAqICAgIDUuIGluY29tcGxldGUgbGlua2VkIHN5bGxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9WZXJvdmlvKHNiQmFzZWRNZWk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgbWVpRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhzYkJhc2VkTWVpLCAndGV4dC94bWwnKTtcbiAgY29uc3QgbWVpID0gbWVpRG9jLmRvY3VtZW50RWxlbWVudDtcbiAgbGV0IGhhc0NvbHMgPSBmYWxzZTtcblxuICBjb25zdCBmYWNzaW1pbGUgPSBtZWkucXVlcnlTZWxlY3RvcignZmFjc2ltaWxlJyk7XG4gIGZhY3NpbWlsZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndHJhbnNjcmlwdGlvbicpO1xuXG4gIC8vIFJlbW92ZSBhbGwtemVybyB6b25lc1xuICAvLyBSZW1vdmUgem9uZXMgbm90IGxpbmtlZCB3aXRoIGdseXBoc1xuICBjb25zdCBzdXJmYWNlID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N1cmZhY2UnKTtcbiAgbGV0IGhhc0ludmFsaWRCQm94ID0gZmFsc2U7XG4gIGNvbnN0IHpvbmVzID0gQXJyYXkuZnJvbShzdXJmYWNlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd6b25lJykpO1xuICBsZXQgaW52YWxpZFpvbmVzSW5mbyA9ICdUaGUgZm9sbG93aW5nIHpvbmVzIGFyZSBpbnZhbGlkOiBcXG5cXG4nO1xuICBmb3IgKGNvbnN0IHpvbmUgb2Ygem9uZXMpIHtcbiAgICBjb25zdCBbaXNJbnZhbGlkLCBlbGVtZW50XSA9IGlzSW52YWxpZEJCb3gobWVpLCB6b25lKTtcbiAgICBpZiAoaXNJbnZhbGlkKSB7XG4gICAgICBoYXNJbnZhbGlkQkJveCA9IHRydWU7XG4gICAgICBpbnZhbGlkWm9uZXNJbmZvICs9IGAtIFpvbmUgd2l0aCB4bWw6aWQ6ICR7em9uZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpfSBgO1xuXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBpbnZhbGlkWm9uZXNJbmZvICs9IGBmb3IgJmx0OyR7XG4gICAgICAgICAgZWxlbWVudC50YWdOYW1lXG4gICAgICAgIH0mZ3Q7IHdpdGggeG1sOmlkOiAke2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKX1cXG5gO1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnZhbGlkWm9uZXNJbmZvICs9ICdpcyBub3QgbGlua2VkIHdpdGggYW55IGdseXBoc1xcbic7XG4gICAgICB9XG4gICAgICB6b25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoem9uZSk7XG4gICAgfVxuICB9XG4gIGlmIChoYXNJbnZhbGlkQkJveCkge1xuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICdSZW1vdmVkIGludmFsaWQgem9uZXMgY29udGFpbmVkIGluIHRoaXMgZmlsZScsXG4gICAgICAnd2FybmluZycsXG4gICAgICBpbnZhbGlkWm9uZXNJbmZvLFxuICAgICk7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGVyZSBpcyA8Y29sTGF5b3V0PiBlbGVtZW50IGFuZCByZW1vdmUgdGhlbVxuICAvLyBUaGVyZSB3aWxsIG9ubHkgYmUgb25lIDxjb2xMYXlvdXQ+IGVsZW1lbnRcbiAgY29uc3QgY29sTGF5b3V0ID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ2NvbExheW91dCcpO1xuICBpZiAoY29sTGF5b3V0KSB7XG4gICAgaGFzQ29scyA9IHRydWU7XG4gICAgY29sTGF5b3V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29sTGF5b3V0KTtcbiAgfVxuXG4gIC8vIENoZWNrIHN5bGxhYmxlIHdpdGhvdXQgbmV1bWVcbiAgLy8gQ2hlY2sgZGl2TGluZSBpbnNpZGUgZW1wdHkgc3lsbGFibGVcbiAgLy8gQ2hlY2sgYWNjaWQgaW5zaWRlIGVtcHR5IHN5bGxhYmxlXG4gIGNvbnN0IHN5bGxhYmxlcyA9IEFycmF5LmZyb20obWVpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzeWxsYWJsZScpKTtcbiAgbGV0IGhhc0VtcHR5U3lsbGFibGUgPSBmYWxzZTtcbiAgbGV0IGhhc0VtcHR5TmV1bWUgPSBmYWxzZTtcbiAgbGV0IGhhc0ludmFsaWREaXZMaW5lID0gZmFsc2U7XG4gIGxldCBpbnZhbGlkRGl2TGluZUluZm8gPVxuICAgICdUaGUgZm9sbG93aW5nIGRpdkxpbmUocykgYXJlIHRoZSBvbmx5IGVsZW1lbnQgaW5zaWRlIHRoZSBzeWxsYWJsZShzKTogXFxuXFxuJztcbiAgbGV0IGhhc0ludmFsaWRBY2NpZCA9IGZhbHNlO1xuICBsZXQgaW52YWxpZEFjY2lkSW5mbyA9XG4gICAgJ1RoZSBmb2xsb3dpbmcgYWNjaWQocykgYXJlIHRoZSBvbmx5IGVsZW1lbnQgaW5zaWRlIHRoZSBzeWxsYWJsZShzKTogXFxuXFxuJztcbiAgbGV0IGVtcHR5U3lsbGFibGVJbmZvID0gJ1RoZSBmb2xsb3dpbmcgc3lsbGFibGUocykgaGF2ZSBubyBuZXVtZXM6IFxcblxcbic7XG4gIGxldCBlbXB0eU5ldW1lSW5mbyA9ICdUaGUgZm9sbG93aW5nIG5ldW1lKHMpIGhhdmUgbm8gbmV1bWUgY29tcG9uZW50czogXFxuXFxuJztcbiAgZm9yIChjb25zdCBzeWxsYWJsZSBvZiBzeWxsYWJsZXMpIHtcbiAgICBpZiAoc3lsbGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ25ldW1lJykubGVuZ3RoID09PSAwKSB7XG4gICAgICBoYXNFbXB0eVN5bGxhYmxlID0gdHJ1ZTtcbiAgICAgIGVtcHR5U3lsbGFibGVJbmZvICs9IGAtICZsdDske1xuICAgICAgICBzeWxsYWJsZS50YWdOYW1lXG4gICAgICB9Jmd0OyB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpfVxcbmA7XG4gICAgICBpZiAoc3lsbGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdkxpbmUnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGhhc0ludmFsaWREaXZMaW5lID0gdHJ1ZTtcbiAgICAgICAgaW52YWxpZERpdkxpbmVJbmZvICs9IGAtICZsdDtkaXZMaW5lJmd0OyBpbnNpZGUgJmx0O3N5bGxhYmxlJmd0OyB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ3htbDppZCcsXG4gICAgICAgICl9XFxuYDtcbiAgICAgIH1cbiAgICAgIGlmIChzeWxsYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYWNjaWQnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGhhc0ludmFsaWRBY2NpZCA9IHRydWU7XG4gICAgICAgIGludmFsaWRBY2NpZEluZm8gKz0gYC0gJmx0O2FjY2lkJmd0OyBpbnNpZGUgJmx0O3N5bGxhYmxlJmd0OyB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ3htbDppZCcsXG4gICAgICAgICl9XFxuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBuZXVtZSB3aXRob3V0IG5ldW1lIGNvbXBvbmVudFxuICAgIGNvbnN0IG5ldW1lcyA9IHN5bGxhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCduZXVtZScpO1xuICAgIGZvciAoY29uc3QgbmV1bWUgb2YgbmV1bWVzKSB7XG4gICAgICBjb25zdCBuY3MgPSBBcnJheS5mcm9tKG5ldW1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCduYycpKTtcbiAgICAgIGlmIChuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGhhc0VtcHR5TmV1bWUgPSB0cnVlO1xuICAgICAgICBlbXB0eU5ldW1lSW5mbyArPSBgLSAmbHQ7JHtcbiAgICAgICAgICBuZXVtZS50YWdOYW1lXG4gICAgICAgIH0mZ3Q7IHdpdGggeG1sOmlkOiAke25ldW1lLmdldEF0dHJpYnV0ZSgneG1sOmlkJyl9XFxuYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRvIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZTpcbiAgICAgICAgLy8gSWYgbmMgaGFzIGEgQGN1cnZlIHZhbHVlLCBhZGQgYSA8bGlxdWVzY2VudD4gZWxlbWVudFxuICAgICAgICBmb3IgKGNvbnN0IG5jIG9mIG5jcykge1xuICAgICAgICAgIGlmIChuYy5oYXNBdHRyaWJ1dGUoJ2N1cnZlJykgJiYgbmMuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBsaXEgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICAgICAgICAgJ2xpcXVlc2NlbnQnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxpcS5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICAgICAgICBuYy5hcHBlbmRDaGlsZChsaXEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNFbXB0eVN5bGxhYmxlKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoaXMgZmlsZSBjb250YWlucyBzeWxsYWJsZShzKSB3aXRob3V0IG5ldW1lIScsXG4gICAgICAnd2FybmluZycsXG4gICAgICBlbXB0eVN5bGxhYmxlSW5mbyxcbiAgICApO1xuICB9XG4gIGlmIChoYXNFbXB0eU5ldW1lKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoaXMgZmlsZSBjb250YWlucyBuZXVtZShzKSB3aXRob3V0IG5ldW1lIGNvbXBvbmVudCEnLFxuICAgICAgJ3dhcm5pbmcnLFxuICAgICAgZW1wdHlOZXVtZUluZm8sXG4gICAgKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZERpdkxpbmUpIHtcbiAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAnVGhpcyBmaWxlIGNvbnRhaW5zIGRpdkxpbmUocykgaW5zaWRlIGVtcHR5IHN5bGxhYmxlKHMpIScsXG4gICAgICAnd2FybmluZycsXG4gICAgICBpbnZhbGlkRGl2TGluZUluZm8sXG4gICAgKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZEFjY2lkKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoaXMgZmlsZSBjb250YWlucyBhY2NpZChzKSBpbnNpZGUgZW1wdHkgc3lsbGFibGUocykhJyxcbiAgICAgICd3YXJuaW5nJyxcbiAgICAgIGludmFsaWRBY2NpZEluZm8sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEdvIHNlY3Rpb24gYnkgc2VjdGlvbiBqdXN0IGluIGNhc2VcbiAgY29uc3Qgc2VjdGlvbnMgPSBBcnJheS5mcm9tKG1laS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2VjdGlvbicpKTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgLy8gSW4gY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgc3RhdmVzIGhlcmUgd2Ugd2FudCB0byBwcmVzZXJ2ZSB0aG9zZVxuICAgIC8vIEEgc2VwYXJhdGUgYXJyYXkgaXMgbmVjZXNzYXJ5IGFzIHRoZSBIVE1MQ29sbGVjdGlvbiB3aWxsIHVwZGF0ZSFcbiAgICBjb25zdCBvcmlnaW5hbFN0YXZlcyA9IEFycmF5LmZyb20oc2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3RhZmYnKSk7XG4gICAgZm9yIChjb25zdCBzdGFmZiBvZiBvcmlnaW5hbFN0YXZlcykge1xuICAgICAgLy8gQWRkIGEgcGIgd2l0aCBhIGZhY3MgcG9pbnRpbmcgdG8gdGhlIHN1cmZhY2VcbiAgICAgIGNvbnN0IG5ld1BiID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgJ2h0dHA6Ly93d3cubXVzaWMtZW5jb2Rpbmcub3JnL25zL21laScsXG4gICAgICAgICdwYicsXG4gICAgICApO1xuICAgICAgbmV3UGIuc2V0QXR0cmlidXRlKCdmYWNzJywgJyMnICsgc3VyZmFjZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpKTtcbiAgICAgIHNlY3Rpb24uaW5zZXJ0QmVmb3JlKG5ld1BiLCBzdGFmZik7XG5cbiAgICAgIGNvbnN0IGxheWVyID0gc3RhZmYucXVlcnlTZWxlY3RvcignbGF5ZXInKTtcbiAgICAgIC8vIEZpcnN0IHBhc3M6IGdldCBhbGwgc2IgZWxlbWVudHMgYXMgZGlyZWN0IGNoaWxkcmVuIG9mIGxheWVyXG4gICAgICBjb25zdCBzYkFycmF5ID0gQXJyYXkuZnJvbShsYXllci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2InKSk7XG4gICAgICAvLyBDaGVjayBpZiBhbnkgc3lsbGFibGVzIGhhdmUgc2IgaW5zaWRlIChsaW5rZWQgc3lsbGFibGVzKVxuICAgICAgLy8gS2VlcCB0aGlzIGNoZWNrIGZvciBmaWxlcyBub3QgcHJvZHVjZWQgYnkgUm9kYW5cbiAgICAgIGZvciAoY29uc3Qgc2Igb2Ygc2JBcnJheSkge1xuICAgICAgICBpZiAoc2IucGFyZW50RWxlbWVudC50YWdOYW1lICE9PSAnbGF5ZXInKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ1N5bGxhYmxlOiBFbGVtZW50ID0gc2IucGFyZW50RWxlbWVudDtcbiAgICAgICAgICBsZXQgbmV1bWVCZWhpbmQgPSBmYWxzZSxcbiAgICAgICAgICAgIG5ldW1lQWhlYWQgPSBmYWxzZTtcbiAgICAgICAgICBjb25zdCBjaGlsZEFycmF5ID0gQXJyYXkuZnJvbShvcmlnU3lsbGFibGUuY2hpbGRyZW4pO1xuICAgICAgICAgIGNvbnN0IHNiSW5kZXggPSBjaGlsZEFycmF5LmluZGV4T2Yoc2IpO1xuICAgICAgICAgIGZvciAoY29uc3QgbmV1bWUgb2Ygb3JpZ1N5bGxhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCduZXVtZScpKSB7XG4gICAgICAgICAgICBjb25zdCBpbmQgPSBjaGlsZEFycmF5LmluZGV4T2YobmV1bWUpO1xuICAgICAgICAgICAgaWYgKGluZCA8IHNiSW5kZXgpIHtcbiAgICAgICAgICAgICAgbmV1bWVCZWhpbmQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbmQgPiBzYkluZGV4KSB7XG4gICAgICAgICAgICAgIG5ldW1lQWhlYWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgaWYgYSBuZXcgc3RhZmYgYmVnaW5zIGJlZm9yZSB0aGUgY3VycmVudCBzeWxsYWJsZSwgYWZ0ZXIgaXQsIG9yIGluIHRoZSBtaWRkbGUgb2YgaXRcbiAgICAgICAgICAvLyBJZiBpbiB0aGUgbWlkZGxlLCBsaW5rIHN5bGxhYmxlc1xuICAgICAgICAgIGlmICghbmV1bWVCZWhpbmQgJiYgbmV1bWVBaGVhZCkge1xuICAgICAgICAgICAgb3JpZ1N5bGxhYmxlLmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBzYik7XG4gICAgICAgICAgfSBlbHNlIGlmIChuZXVtZUJlaGluZCAmJiAhbmV1bWVBaGVhZCkge1xuICAgICAgICAgICAgb3JpZ1N5bGxhYmxlLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBzYik7XG4gICAgICAgICAgfSBlbHNlIGlmIChuZXVtZUJlaGluZCAmJiBuZXVtZUFoZWFkKSB7XG4gICAgICAgICAgICAvLyBXZSBtYXkgbmVlZCB0byBzcGxpdCB0aGUgc3lsbGFibGUgaGVyZVxuICAgICAgICAgICAgY29uc3QgbmV3U3lsbGFibGUgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICAgICAgICAgJ3N5bGxhYmxlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBuZXdTeWxsYWJsZS5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICAgICAgICBuZXdTeWxsYWJsZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICdmb2xsb3dzJyxcbiAgICAgICAgICAgICAgJyMnICsgb3JpZ1N5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb3JpZ1N5bGxhYmxlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ3ByZWNlZGVzJyxcbiAgICAgICAgICAgICAgJyMnICsgbmV3U3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNiSW5kZXggPSBjaGlsZEFycmF5LmluZGV4T2Yoc2IpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkQXJyYXkpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjaGlsZEFycmF5LmluZGV4T2YoY2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPiBzYkluZGV4KSB7XG4gICAgICAgICAgICAgICAgbmV3U3lsbGFibGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9yaWdTeWxsYWJsZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc2IpO1xuICAgICAgICAgICAgc2IuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld1N5bGxhYmxlKTtcblxuICAgICAgICAgICAgLy8gTW92ZSBhbnkgY3VzdG9zIGluIG9yaWdTeWxsYWJsZSBvdXQgb2YgaXRcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3VzdG9zIG9mIG9yaWdTeWxsYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY3VzdG9zJykpIHtcbiAgICAgICAgICAgICAgb3JpZ1N5bGxhYmxlLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBjdXN0b3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNb3ZlIGFueSBjbGVmIGluIG5ld1N5bGxhYmxlIG91dCBvZiBpdFxuICAgICAgICAgICAgZm9yIChjb25zdCBjbGVmIG9mIG5ld1N5bGxhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjbGVmJykpIHtcbiAgICAgICAgICAgICAgbmV3U3lsbGFibGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGNsZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05PTkUgQkVISU5EIE5PTkUgQUhFQUQnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob3JpZ1N5bGxhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2JzID0gQXJyYXkuZnJvbShsYXllci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2InKSk7XG4gICAgICBjb25zdCBsYXllckNoaWxkcmVuID0gQXJyYXkuZnJvbShsYXllci5jaGlsZHJlbik7XG4gICAgICBsZXQgbkNvbCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNicy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50U2IgPSBzYnNbaV07XG4gICAgICAgIGNvbnN0IG5leHRTYiA9IHNicy5sZW5ndGggPiBpICsgMSA/IHNic1tpICsgMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgbmV3U2IgPSBtZWlEb2MuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3Lm11c2ljLWVuY29kaW5nLm9yZy9ucy9tZWknLFxuICAgICAgICAgICdzYicsXG4gICAgICAgICk7XG4gICAgICAgIG5ld1NiLnNldEF0dHJpYnV0ZSgneG1sOmlkJywgJ20tJyArIHV1aWR2NCgpKTtcbiAgICAgICAgbmV3U2Iuc2V0QXR0cmlidXRlKCdmYWNzJywgY3VycmVudFNiLmdldEF0dHJpYnV0ZSgnZmFjcycpKTtcblxuICAgICAgICBjb25zdCBuZXdTZWN0aW9uID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICAgICAnc2VjdGlvbicsXG4gICAgICAgICk7XG4gICAgICAgIG5ld1NlY3Rpb24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ25lb24tbmV1bWUtbGluZScpO1xuXG4gICAgICAgIGNvbnN0IG5ld1N0YWZmID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICAgICAnc3RhZmYnLFxuICAgICAgICApO1xuICAgICAgICBjb3B5QXR0cmlidXRlcyhjdXJyZW50U2IsIG5ld1N0YWZmKTtcbiAgICAgICAgbmV3U3RhZmYuc2V0QXR0cmlidXRlKCduJywgJzEnKTtcbiAgICAgICAgY29uc3QgY3VycmVudElkeCA9IGxheWVyQ2hpbGRyZW4uaW5kZXhPZihjdXJyZW50U2IpO1xuICAgICAgICBpZiAoaGFzQ29scykge1xuICAgICAgICAgIGlmIChsYXllckNoaWxkcmVuLmF0KGN1cnJlbnRJZHggLSAxKS50YWdOYW1lID09PSAnY2InKSB7XG4gICAgICAgICAgICBuQ29sICs9IDE7XG4gICAgICAgICAgICAvLyBSZW1vdmUgY2IgZWxlbWVudCBhbmQgaXRzIHpvbmVcbiAgICAgICAgICAgIGNvbnN0IGNiID0gbGF5ZXJDaGlsZHJlbi5hdChjdXJyZW50SWR4IC0gMSk7XG4gICAgICAgICAgICBjb25zdCBjYkZhY3MgPSBjYi5nZXRBdHRyaWJ1dGUoJ2ZhY3MnKTtcbiAgICAgICAgICAgIGNvbnN0IGNiWm9uZSA9IEFycmF5LmZyb20oc3VyZmFjZS5xdWVyeVNlbGVjdG9yQWxsKCd6b25lJykpLmZpbmQoXG4gICAgICAgICAgICAgICh6b25lKSA9PiB6b25lLmdldEF0dHJpYnV0ZSgneG1sOmlkJykgPT09IGNiRmFjcy5zbGljZSgxKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNiKTtcbiAgICAgICAgICAgIGNiWm9uZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNiWm9uZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld1N0YWZmLnNldEF0dHJpYnV0ZSgndHlwZScsICdjb2x1bW4nICsgbkNvbC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0xheWVyID0gbWVpRG9jLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAnaHR0cDovL3d3dy5tdXNpYy1lbmNvZGluZy5vcmcvbnMvbWVpJyxcbiAgICAgICAgICAnbGF5ZXInLFxuICAgICAgICApO1xuICAgICAgICBuZXdMYXllci5zZXRBdHRyaWJ1dGUoJ24nLCAnMScpO1xuICAgICAgICBuZXdMYXllci5zZXRBdHRyaWJ1dGUoJ3htbDppZCcsICdtLScgKyB1dWlkdjQoKSk7XG4gICAgICAgIG5ld1NlY3Rpb24uYXBwZW5kQ2hpbGQobmV3U3RhZmYpO1xuICAgICAgICBuZXdTdGFmZi5hcHBlbmRDaGlsZChuZXdMYXllcik7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW5BcnJheSA9IEFycmF5LmZyb20obGF5ZXIuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBjb3B5QXJyYXkgPSBjaGlsZHJlbkFycmF5LnNsaWNlKFxuICAgICAgICAgIGNoaWxkcmVuQXJyYXkuaW5kZXhPZihjdXJyZW50U2IpICsgMSxcbiAgICAgICAgICBjaGlsZHJlbkFycmF5LmluZGV4T2YobmV4dFNiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNvcHlBcnJheSkge1xuICAgICAgICAgIG5ld0xheWVyLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgem9uZXMgZm9yIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIGZpbGVcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgbGFzdCBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZFxuICAgICAgICBpZiAoIW5leHRTYikge1xuICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gY2hpbGRyZW5BcnJheS5hdCgtMSk7XG4gICAgICAgICAgY29uc3QgZmFjc0NoaWxkcmVuID0gY29sbGVjdEZhY3NDaGlsZHJlbihsYXN0RWxlbWVudCwgW10pO1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZmFjc0NoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCB6b25lID0gem9uZXMuZmluZChcbiAgICAgICAgICAgICAgKHopID0+XG4gICAgICAgICAgICAgICAgei5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09IGNoaWxkLmdldEF0dHJpYnV0ZSgnZmFjcycpLnNsaWNlKDEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh6b25lICYmIHpvbmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgem9uZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHpvbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNlY3Rpb24uaW5zZXJ0QmVmb3JlKG5ld1NiLCBzdGFmZik7XG4gICAgICAgIHNlY3Rpb24uaW5zZXJ0QmVmb3JlKG5ld1NlY3Rpb24sIHN0YWZmKTtcbiAgICAgIH1cbiAgICAgIHN0YWZmLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzIG9uIGFsbCBzeWxsYWJsZXMgdG8gaGFuZGxlIGNsZWZzIGFuZCBjdXN0b3MgdGhhdCBtaWdodCByZW1haW5cbiAgY29uc3QgbmV3U3lsbGFibGVzID0gQXJyYXkuZnJvbShtZWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N5bGxhYmxlJykpO1xuICBsZXQgaW52YWxpZExpbmtlZCA9IGZhbHNlO1xuICBsZXQgaW52YWxpZExpbmtlZEluZm8gPVxuICAgICdUaGUgZm9sbG93aW5nIGxpbmtlZCBzeWxsYWJsZXMgYXJlIG5vdCBlbmNvZGVkIGNvcnJlY3RseTogXFxuXFxuJztcbiAgbGV0IGludmFsaWRPYmxpcXVlID0gZmFsc2U7XG4gIGxldCBpbnZhbGlkT2JsaXF1ZUluZm8gPSAnVGhlIGZvbGxvd2luZyBvYmxpcXVlcyBhcmUgaW5jb21wbGV0ZTogXFxuXFxuJztcbiAgZm9yIChjb25zdCBzeWxsYWJsZSBvZiBtZWkucXVlcnlTZWxlY3RvckFsbCgnc3lsbGFibGUnKSkge1xuICAgIGZvciAoY29uc3QgY2xlZiBvZiBzeWxsYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdjbGVmJykpIHtcbiAgICAgIHN5bGxhYmxlLmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBjbGVmKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjdXN0b3Mgb2Ygc3lsbGFibGUucXVlcnlTZWxlY3RvckFsbCgnY3VzdG9zJykpIHtcbiAgICAgIHN5bGxhYmxlLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBjdXN0b3MpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGluY29tcGxldGUgb2JsaXF1ZXNcbiAgICAvLyBPYmxpcXVlcyBhbHdheXMgY29tZSBhcyBhIHBhaXJcbiAgICBjb25zdCBvYmxpcXVlSW5mbyA9IGNoZWNrT2JsaXF1ZShzeWxsYWJsZSk7XG4gICAgaWYgKG9ibGlxdWVJbmZvKSB7XG4gICAgICBpbnZhbGlkT2JsaXF1ZSA9IHRydWU7XG4gICAgICBpbnZhbGlkT2JsaXF1ZUluZm8gKz0gb2JsaXF1ZUluZm87XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3lsbGFibGVzIHRoYXQgY29udGFpbnMgQHByZWNlZGVzIG9yIEBmb2xsb3dzXG4gICAgLy8gVXBkYXRlIHN5bGxhYmxlIGFycmF5cyBmb3IgZWFjaCBzeWxsYWJsZVxuICAgIGNvbnN0IHN5bGxhYmxlSWR4ID0gbmV3U3lsbGFibGVzLmluZGV4T2Yoc3lsbGFibGUpO1xuXG4gICAgLy8gVmFsaWRhdGUgdG9nZ2xlLWxpbmtlZCBzeWxsYWJsZVxuICAgIC8vIENoZWNrIHRoZSBwcmVjZWRlcyBzeWxsYWJsZVxuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ3ByZWNlZGVzJykpIHtcbiAgICAgIGNvbnN0IGluZm8gPSBjaGVja1ByZWNlZGVzU3lsbGFibGUoc3lsbGFibGUsIHN5bGxhYmxlSWR4LCBuZXdTeWxsYWJsZXMpO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaW52YWxpZExpbmtlZCA9IHRydWU7XG4gICAgICAgIGludmFsaWRMaW5rZWRJbmZvICs9IGluZm87XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENoZWNrIHRoZSBmb2xsb3dzIHN5bGxhYmxlXG4gICAgaWYgKHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgnZm9sbG93cycpKSB7XG4gICAgICBjb25zdCBpbmZvID0gY2hlY2tGb2xsb3dzU3lsbGFibGUoc3lsbGFibGUsIG5ld1N5bGxhYmxlcyk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbnZhbGlkTGlua2VkID0gdHJ1ZTtcbiAgICAgICAgaW52YWxpZExpbmtlZEluZm8gKz0gaW5mbztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGludmFsaWRPYmxpcXVlKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoaXMgZmlsZSBjb250YWlucyBpbmNvbXBsZXRlIG9ibGlxdWUocyknLFxuICAgICAgJ2Vycm9yJyxcbiAgICAgIGludmFsaWRPYmxpcXVlSW5mbyxcbiAgICApO1xuICB9XG4gIGlmIChpbnZhbGlkTGlua2VkKSB7XG4gICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgJ1RoaXMgZmlsZSBjb250YWlucyBpbnZhbGlkIGxpbmtlZCBzeWxsYWJsZShzKScsXG4gICAgICAnZXJyb3InLFxuICAgICAgaW52YWxpZExpbmtlZEluZm8sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpO1xuICByZXR1cm4gdmtiZWF1dGlmeS54bWwoc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhtZWlEb2MpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrT3V0T2ZCb3VuZHNHbHlwaHMobWVpU3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1laVN0cmluZywgJ3RleHQveG1sJyk7XG4gIGNvbnN0IG1laSA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgLy8gQ2hlY2sgZm9yIG91dC1vZi1ib3VuZCBnbHlwaHNcbiAgY29uc3Qgem9uZXMgPSBBcnJheS5mcm9tKG1laS5xdWVyeVNlbGVjdG9yQWxsKCd6b25lJykpO1xuICBjb25zdCBkaW1lbnNpb25zID0gbWVpLnF1ZXJ5U2VsZWN0b3IoJ3N1cmZhY2UnKTtcbiAgY29uc3QgbWVpTHJ4ID0gTnVtYmVyKGRpbWVuc2lvbnMuZ2V0QXR0cmlidXRlKCdscngnKSksXG4gICAgbWVpTHJ5ID0gTnVtYmVyKGRpbWVuc2lvbnMuZ2V0QXR0cmlidXRlKCdscnknKSk7XG5cbiAgZnVuY3Rpb24gaXNBdHRyT3V0T2ZCb3VuZHMoem9uZTogRWxlbWVudCwgYXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29vcmQgPSBOdW1iZXIoem9uZS5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgIGNvbnN0IGNvbXAgPSBhdHRyID09ICdscngnIHx8IGF0dHIgPT0gJ3VseCcgPyBtZWlMcnggOiBtZWlMcnk7XG4gICAgcmV0dXJuIGNvb3JkIDwgMCB8fCBjb29yZCA+IGNvbXA7XG4gIH1cblxuICBsZXQgaW5mbyA9ICdUaGUgZm9sbG93aW5nIGdseXBocyBhcmUgb3V0IG9mIGJvdW5kczogXFxuXFxuJztcblxuICBjb25zdCBoYXNPdXRPZkJvdW5kcyA9IHpvbmVzLnNvbWUoKHpvbmUpID0+IHtcbiAgICBjb25zdCBpc091dE9mQm91bmRzID0gWyd1bHgnLCAndWx5JywgJ2xyeCcsICdscnknXS5zb21lKChhdHRyKSA9PlxuICAgICAgaXNBdHRyT3V0T2ZCb3VuZHMoem9uZSwgYXR0ciksXG4gICAgKTtcbiAgICBpZiAoaXNPdXRPZkJvdW5kcykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IG1laS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgKltmYWNzPVwiJHsnIycgKyB6b25lLmdldEF0dHJpYnV0ZSgneG1sOmlkJyl9XCJdYCxcbiAgICAgICk7XG4gICAgICBpbmZvICs9IGAtICZsdDske2VsZW1lbnQudGFnTmFtZX0mZ3Q7IHdpdGggeG1sOmlkOiAke2VsZW1lbnQuZ2V0QXR0cmlidXRlKFxuICAgICAgICAneG1sOmlkJyxcbiAgICAgICl9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIGlzT3V0T2ZCb3VuZHM7XG4gIH0pO1xuXG4gIGlmIChoYXNPdXRPZkJvdW5kcykge1xuICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICdUaGlzIGZvbGlvIGNvbnRhaW5zIGdseXBoKHMpIHBsYWNlZCBvdXQtb2YtYm91bmRzIScsXG4gICAgICAnd2FybmluZycsXG4gICAgICBpbmZvLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcmVjZWRlc1N5bGxhYmxlKFxuICBzeWxsYWJsZTogRWxlbWVudCxcbiAgaWR4OiBudW1iZXIsXG4gIHN5bGxhYmxlczogRWxlbWVudFtdLFxuKTogc3RyaW5nIHtcbiAgLy8gR2V0IHhtbDppZCBvZiB0aGUgbmV4dCBzeWxsYWJsZSAod2l0aG91dCB0aGUgIywgaWYgaXQgZXhpc3RzKVxuICBjb25zdCBuZXh0U3lsbGFibGVJZCA9IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgncHJlY2VkZXMnKS5yZXBsYWNlKCcjJywgJycpO1xuXG4gIC8vIEZpbmQgdGhlIG5leHQgc3lsbGFibGUgYW5kIGl0cyBpbmRleCBpbiB0aGUgYXJyYXlcbiAgbGV0IG5leHRTeWxsYWJsZUlkeDogbnVtYmVyO1xuICBjb25zdCBuZXh0U3lsbGFibGUgPSBzeWxsYWJsZXMuZmluZCgoZWxlbWVudCwgaWR4KSA9PiB7XG4gICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSA9PT0gbmV4dFN5bGxhYmxlSWQpIHtcbiAgICAgIG5leHRTeWxsYWJsZUlkeCA9IGlkeDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gQ29uZGl0aW9uIDE6IFRoZSBuZXh0IChmb2xsb3dpbmcpIHN5bGxhYmxlIGNhbm5vdCBiZSBmb3VuZFxuICBpZiAoIW5leHRTeWxsYWJsZSkge1xuICAgIHJldHVybiBgLSAmbHQ7JHtzeWxsYWJsZS50YWdOYW1lfSZndDsgKCR7Z2V0U3lsbGFibGVUZXh0KFxuICAgICAgc3lsbGFibGUsXG4gICAgKX0pIHdpdGggeG1sOmlkOiAke3N5bGxhYmxlLmdldEF0dHJpYnV0ZShcbiAgICAgICd4bWw6aWQnLFxuICAgICl9IGlzIG1pc3NpbmcgdGhlIGZvbGxvd2luZyBwYXJ0XFxuYDtcbiAgfVxuXG4gIC8vIENvbmRpdGlvbiAyOiBUaGUgbmV4dCBzeWxsYWJsZSBoYXMgYmVlbiBmb3VuZCwgYnV0IHRoZSBAZm9sbG93cyBhdHRyaWJ1dGUgZG9lcyBOT1QgRVhJU1RcbiAgaWYgKCFuZXh0U3lsbGFibGUuaGFzQXR0cmlidXRlKCdmb2xsb3dzJykpIHtcbiAgICByZXR1cm4gYC0gVGhlIGZvbGxvd2luZyBzeWxsYWJsZSBvZiAmbHQ7JHtcbiAgICAgIHN5bGxhYmxlLnRhZ05hbWVcbiAgICB9Jmd0OyAoJHtnZXRTeWxsYWJsZVRleHQoc3lsbGFibGUpfSkgd2l0aCB4bWw6aWQ6ICR7c3lsbGFibGUuZ2V0QXR0cmlidXRlKFxuICAgICAgJ3htbDppZCcsXG4gICAgKX0gaXMgbm90IGxpbmtlZCB0byBhbnkgc3lsbGFibGVcXG5gO1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uIDM6IFRoZSBuZXh0IHN5bGxhYmxlJ3MgQGZvbGxvd3MgYXR0cmlidXRlIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQgI2lkXG4gIGlmIChcbiAgICBuZXh0U3lsbGFibGUuZ2V0QXR0cmlidXRlKCdmb2xsb3dzJykgIT1cbiAgICAnIycgKyBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpXG4gICkge1xuICAgIHJldHVybiBgLSBUaGUgZm9sbG93aW5nIHN5bGxhYmxlIG9mICZsdDske1xuICAgICAgc3lsbGFibGUudGFnTmFtZVxuICAgIH0mZ3Q7ICgke2dldFN5bGxhYmxlVGV4dChzeWxsYWJsZSl9KSB3aXRoIHhtbDppZDogJHtzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoXG4gICAgICAneG1sOmlkJyxcbiAgICApfSBpcyBsaW5rZWQgdG8gdGhlIHdyb25nIHN5bGxhYmxlXFxuYDtcbiAgfVxuXG4gIC8vIENvbmRpdGlvbiA0OlxuICAvLyBTaW5jZSB0aGUgQGZvbGxvd3MgdmFsdWUgaXMgY29ycmVjdCwgYSBwYWlyIG9mIHN5bGxhYmxlcyBleGlzdCBmb3IgdGhlIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUuXG4gIC8vIENoZWNrIGlmIHRoZSBAZm9sbG93cyBzeWxsYWJsZSBpcyB0aGUgbmV4dCBzeWxsYWJsZSAoaW5kZXgtd2lzZSkgaW4gdGhlIGFycmF5OlxuICBpZiAobmV4dFN5bGxhYmxlSWR4ICE9PSBpZHggKyAxKSB7XG4gICAgY29uc3Qgc3lsVGV4dCA9IGdldFN5bGxhYmxlVGV4dChzeWxsYWJsZSk7XG4gICAgY29uc3QgdW5leHBlY3RlZFN5bHNUZXh0ID0gc3lsbGFibGVzXG4gICAgICAuc2xpY2UoaWR4ICsgMSwgbmV4dFN5bGxhYmxlSWR4KVxuICAgICAgLm1hcCgoc3lsbGFibGUpID0+IGdldFN5bGxhYmxlVGV4dChzeWxsYWJsZSkpO1xuXG4gICAgY29uc3Qgc3lsc1RleHQgPSBbc3lsVGV4dCwgLi4udW5leHBlY3RlZFN5bHNUZXh0XS5qb2luKCcgLSAnKTtcbiAgICByZXR1cm4gYC0gVW5leHBlY3RlZCBzeWxsYWJsZShzKSBpbnNpZGUgdG9nZ2xlLWxpbmtlZCAmbHQ7JHtcbiAgICAgIHN5bGxhYmxlLnRhZ05hbWVcbiAgICB9Jmd0OyAoJHtzeWxzVGV4dH0pIHdpdGggeG1sOmlkOiAke3N5bGxhYmxlLmdldEF0dHJpYnV0ZShcbiAgICAgICd4bWw6aWQnLFxuICAgICl9IGlzIGxpbmtlZCB0byB0aGUgd3Jvbmcgc3lsbGFibGVcXG5gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9sbG93c1N5bGxhYmxlKHN5bGxhYmxlOiBFbGVtZW50LCBzeWxsYWJsZXM6IEVsZW1lbnRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHByZXZTeWxsYWJsZUlkID0gc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdmb2xsb3dzJykucmVwbGFjZSgnIycsICcnKTtcbiAgY29uc3QgcHJldlN5bGxhYmxlID0gc3lsbGFibGVzLmZpbmQoXG4gICAgKHN5bGxhYmxlKSA9PiBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PSBwcmV2U3lsbGFibGVJZCxcbiAgKTtcblxuICAvLyBDb25kaXRpb24gMTogVGhlIHByZXZpb3VzIHN5bGxhYmxlIGRvZXMgbm90IGV4aXN0XG4gIGlmICghcHJldlN5bGxhYmxlKSB7XG4gICAgcmV0dXJuIGAtICZsdDske3N5bGxhYmxlLnRhZ05hbWV9Jmd0OyAoJHtnZXRTeWxsYWJsZVRleHQoXG4gICAgICBzeWxsYWJsZSxcbiAgICApfSkgd2l0aCB4bWw6aWQ6ICR7c3lsbGFibGUuZ2V0QXR0cmlidXRlKFxuICAgICAgJ3htbDppZCcsXG4gICAgKX0gaXMgbWlzc2luZyB0aGUgcHJlY2VkaW5nIHBhcnRcXG5gO1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uIDI6IFRoZSBwcmV2aW91cyBzeWxsYWJsZSBleGlzdHMsIGJ1dCB0aGUgQHByZWNlZGVzIGF0dHJpYnV0ZSBkb2VzIE5PVCBFWElTVFxuICBpZiAoIXByZXZTeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ3ByZWNlZGVzJykpIHtcbiAgICByZXR1cm4gYC0gVGhlIHByZWNlZGluZyBzeWxsYWJsZSBvZiAmbHQ7JHtcbiAgICAgIHN5bGxhYmxlLnRhZ05hbWVcbiAgICB9Jmd0OyAoJHtnZXRTeWxsYWJsZVRleHQoc3lsbGFibGUpfSkgd2l0aCB4bWw6aWQ6ICR7c3lsbGFibGUuZ2V0QXR0cmlidXRlKFxuICAgICAgJ3htbDppZCcsXG4gICAgKX0gaXMgbm90IGxpbmtlZCB0byBhbnkgc3lsbGFibGVcXG5gO1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uIDM6IFRoZSBwcmV2aW91cyBzeWxsYWJsZSdzIEBwcmVjZWRlcyBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgaXQgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdCAjaWRcbiAgaWYgKFxuICAgIHByZXZTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3ByZWNlZGVzJykgIT1cbiAgICAnIycgKyBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpXG4gICkge1xuICAgIHJldHVybiBgLSBUaGUgcHJlY2VkaW5nIHN5bGxhYmxlIG9mICZsdDske1xuICAgICAgc3lsbGFibGUudGFnTmFtZVxuICAgIH0mZ3Q7ICgke2dldFN5bGxhYmxlVGV4dChcbiAgICAgIHByZXZTeWxsYWJsZSxcbiAgICApfSkgd2l0aCB4bWw6aWQ6ICR7c3lsbGFibGUuZ2V0QXR0cmlidXRlKFxuICAgICAgJ3htbDppZCcsXG4gICAgKX0gaXMgbGlua2VkIHRvIHRoZSB3cm9uZyBzeWxsYWJsZVxcbmA7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tPYmxpcXVlKHN5bGxhYmxlOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgY29uc3QgbmNzID0gc3lsbGFibGUucXVlcnlTZWxlY3RvckFsbCgnbmMnKTtcbiAgbGV0IG5jSWR4ID0gMDtcbiAgbGV0IGluZm8gPSAnJztcbiAgd2hpbGUgKG5jSWR4IDwgbmNzLmxlbmd0aCkge1xuICAgIGlmIChuY3NbbmNJZHhdLmdldEF0dHJpYnV0ZSgnbGlnYXRlZCcpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChuY0lkeCA8IG5jcy5sZW5ndGggLSAxICYmICFuY3NbbmNJZHggKyAxXS5nZXRBdHRyaWJ1dGUoJ2xpZ2F0ZWQnKSkgfHxcbiAgICAgICAgbmNJZHggPT0gbmNzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICAvLyBJZiBuYyBpcyBsaWdhdGVkLCBhbmQgdGhlIG5leHQgbmMgaXMgbm90XG4gICAgICAgIC8vIE9yLCBuYyBpcyBsaWdhdGVkLCBidXQgYWxyZWFkeSBhdCB0aGUgZW5kICh0aGVyZSBpcyBubyBuZXh0KVxuICAgICAgICBpbmZvICs9IGAtIFRoZSBvYmxpcXVlIGluIHN5bGxhYmxlICgke2dldFN5bGxhYmxlVGV4dChcbiAgICAgICAgICBzeWxsYWJsZSxcbiAgICAgICAgKX0pIHdpdGggeG1sOmlkOiAke3N5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyl9XFxuYDtcbiAgICAgIH1cbiAgICAgIG5jSWR4ICs9IDI7XG4gICAgfVxuICAgIG5jSWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNvbHVtbkxhYmVsKG1laTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1laSwgJ3RleHQveG1sJyk7XG4gIGNvbnN0IG1laUZvclZhbGlkYXRpb24gPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gIGZvciAoY29uc3Qgc3RhZmYgb2YgQXJyYXkuZnJvbShcbiAgICBtZWlGb3JWYWxpZGF0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdGFmZicpLFxuICApKSB7XG4gICAgaWYgKHN0YWZmLmhhc0F0dHJpYnV0ZSgndHlwZScpKSB7XG4gICAgICBzdGFmZi5yZW1vdmVBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcbiAgcmV0dXJuIHZrYmVhdXRpZnkueG1sKHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobWVpRm9yVmFsaWRhdGlvbikpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RmFjc0NoaWxkcmVuKGVsZW1lbnQ6IEVsZW1lbnQsIGFycmF5OiBFbGVtZW50W10pOiBFbGVtZW50W10ge1xuICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2ZhY3MnKSkgYXJyYXkucHVzaChlbGVtZW50KTtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBlbGVtZW50LmNoaWxkcmVuKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY2FsbCB0aGUgZnVuY3Rpb24gZm9yIGNoaWxkJ3MgY2hpbGRyZW5cbiAgICBjb2xsZWN0RmFjc0NoaWxkcmVuKGNoaWxkLCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuIiwiaW1wb3J0IE5lb25WaWV3IGZyb20gJy4vTmVvblZpZXcnO1xuaW1wb3J0IHsgTW9kYWxXaW5kb3dWaWV3IH0gZnJvbSAnLi91dGlscy9Nb2RhbFdpbmRvdyc7XG5cbmNvbnN0IHNjaGVtYVJlc3BvbnNlID0gZmV0Y2goX19BU1NFVF9QUkVGSVhfXyArICdhc3NldHMvbWVpLWFsbC5ybmcnKTtcbmxldCB3b3JrZXI6IFdvcmtlciwgc2NoZW1hOiBzdHJpbmcsIHZlcnNpb25GaWVsZDogSFRNTFNwYW5FbGVtZW50LCBzdGF0dXNGaWVsZDogSFRNTFNwYW5FbGVtZW50O1xuXG4vKipcbiAqIFVwZGF0ZSB0aGUgVUkgd2l0aCB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLiBDYWxsZWQgd2hlbiB0aGUgV2ViV29ya2VyIGZpbmlzaGVzIHZhbGlkYXRpbmcuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVN0YXR1c1VJIChtZXNzYWdlOiB7IGRhdGE6IHN0cmluZ1tdIH0pOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JzID0gbWVzc2FnZS5kYXRhO1xuICBpZiAoZXJyb3JzID09PSBudWxsKSB7XG4gICAgc3RhdHVzRmllbGQudGV4dENvbnRlbnQgPSAnVkFMSUQnO1xuICAgIHN0YXR1c0ZpZWxkLnN0eWxlLmNvbG9yID0gJyM0YmMxNGInO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhdHVzRmllbGQuY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgbG9nID0gJyc7XG4gICAgZXJyb3JzLmZvckVhY2gobGluZSA9PiB7XG4gICAgICBsb2cgKz0gbGluZSArICdcXG4nO1xuICAgIH0pO1xuICAgIHN0YXR1c0ZpZWxkLnRleHRDb250ZW50ID0gJyc7XG4gICAgc3RhdHVzRmllbGQuc3R5bGUuY29sb3IgPSAncmVkJztcbiAgICAvLyBDcmVhdGUgYSBuZXcgZGl2IGZvciBlYXNpZXIgbG9nIGltcGxlbWVudGF0aW9uXG4gICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgLy9saW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGBkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCwke2VuY29kZVVSSUNvbXBvbmVudChsb2cpfWApO1xuICAgIC8vbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ3ZhbGlkYXRpb24ubG9nJyk7XG4gICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0lOVkFMSUQnO1xuICAgIHN0YXR1cy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgc3RhdHVzRmllbGQuYXBwZW5kQ2hpbGQoc3RhdHVzKTtcblxuICAgIHN0YXR1cy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN0YXR1c09uQ2xpY2suYmluZCh0aGlzLCBsb2cpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uVUkgKHZlcnNpb246IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXZlcnNpb24pIHtcbiAgICByZXR1cm47XG4gIH0gXG5cbiAgc3dpdGNoICh2ZXJzaW9uKSB7XG4gICAgY2FzZSAndW5rbm93bic6XG4gICAgICB2ZXJzaW9uRmllbGQudGV4dENvbnRlbnQgPSB2ZXJzaW9uO1xuICAgICAgdmVyc2lvbkZpZWxkLnN0eWxlLmNvbG9yID0gJ2dyYXknO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdmVyc2lvbkZpZWxkLnRleHRDb250ZW50ID0gdmVyc2lvbjtcbiAgICAgIHZlcnNpb25GaWVsZC5zdHlsZS5jb2xvciA9ICcjNjhBN0FEJztcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGF0dXNPbkNsaWNrKGxvZzogc3RyaW5nKSB7XG4gIHRoaXMubW9kYWwuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5FUlJPUl9MT0csIGxvZyk7XG4gIHRoaXMubW9kYWwub3Blbk1vZGFsV2luZG93KCk7XG59XG5cbi8qKlxuICogQWRkIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIHRvIHRoZSBkaXNwbGF5IGFuZCBjcmVhdGUgdGhlIFdlYldvcmtlclxuICogZm9yIHZhbGlkYXRpb24gTUVJLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdCAobmVvblZpZXc6IE5lb25WaWV3KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVTdGF0dXNEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1zdGF0dXMnKTtcbiAgaWYgKGZpbGVTdGF0dXNEaXYgIT09IG51bGwpIHtcbiAgICBjb25zdCBtZWlWZXJzaW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21laV92ZXJzaW9uJyk7XG4gICAgbWVpVmVyc2lvbi50ZXh0Q29udGVudCA9ICd1bmtub3duJztcbiAgICB2ZXJzaW9uRmllbGQgPSBtZWlWZXJzaW9uO1xuXG4gICAgY29uc3QgbWVpU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbGlkYXRpb25fc3RhdHVzJyk7XG4gICAgbWVpU3RhdHVzLnRleHRDb250ZW50ID0gJ3Vua25vd24nO1xuICAgIHN0YXR1c0ZpZWxkID0gbWVpU3RhdHVzO1xuICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoX19BU1NFVF9QUkVGSVhfXyArICd3b3JrZXJzL1dvcmtlci5qcycpO1xuICAgIHdvcmtlci5vbm1lc3NhZ2UgPSB1cGRhdGVTdGF0dXNVSS5iaW5kKG5lb25WaWV3KTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbmQgdGhlIGNvbnRlbnRzIG9mIGFuIE1FSSBmaWxlIHRvIHRoZSBXZWJXb3JrZXIgZm9yIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVpRGF0YVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEZvclZhbGlkYXRpb24gKG1laURhdGE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhdHVzRmllbGQgPT09IHVuZGVmaW5lZCB8fCB2ZXJzaW9uRmllbGQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNjaGVtYVJlc3BvbnNlO1xuICAgIHNjaGVtYSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgfVxuICBzdGF0dXNGaWVsZC50ZXh0Q29udGVudCA9ICdjaGVja2luZy4uLic7XG4gIHN0YXR1c0ZpZWxkLnN0eWxlLmNvbG9yID0gJ2dyYXknO1xuICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgIG1laTogbWVpRGF0YSxcbiAgICBzY2hlbWE6IHNjaGVtYVxuICB9KTtcblxuICB2ZXJzaW9uRmllbGQudGV4dENvbnRlbnQgPSAnY2hlY2tpbmcuLi4nO1xuICB2ZXJzaW9uRmllbGQuc3R5bGUuY29sb3IgPSAnZ3JheSc7XG4gIGNvbnN0IG1laVZlcnNpb24gPSBhd2FpdCBnZXRNZWlWZXJzaW9uKG1laURhdGEpO1xuICB1cGRhdGVWZXJzaW9uVUkobWVpVmVyc2lvbik7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBtZXNzYWdlIG9uIGEgYmxhbmsgcGFnZSB3aGVuIHRoZXJlIGlzIG5vIE1FSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJsYW5rUGFnZSAoKTogdm9pZCB7XG4gIGlmIChzdGF0dXNGaWVsZCA9PT0gdW5kZWZpbmVkIHx8IHZlcnNpb25GaWVsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXR1c0ZpZWxkLmNoaWxkcmVuKSB7XG4gICAgY2hpbGQucmVtb3ZlKCk7XG4gIH1cbiAgc3RhdHVzRmllbGQudGV4dENvbnRlbnQgPSAnTm8gTUVJJztcbiAgc3RhdHVzRmllbGQuc3R5bGUuY29sb3IgPSAnY29sb3I6Z3JheSc7XG5cbiAgdmVyc2lvbkZpZWxkLnRleHRDb250ZW50ID0gJ05vIE1FSSc7XG4gIHZlcnNpb25GaWVsZC5zdHlsZS5jb2xvciA9ICdjb2xvcjpncmF5Jztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWVpVmVyc2lvbihtZWlEYXRhOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobWVpRGF0YSwgJ3RleHQveG1sJyk7XG4gIGNvbnN0IG1laSA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG4gIFxuICBjb25zdCBtZWlWZXJzaW9uID0gbWVpLmdldEF0dHJpYnV0ZSgnbWVpdmVyc2lvbicpO1xuICBpZiAobWVpVmVyc2lvbikge1xuICAgIHJldHVybiBtZWlWZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAndW5rbm93bic7XG4gIH1cbn0iLCJcbi8vIEluaXRpYWwgc2F2ZWQgc3RhdHVzXG5sZXQgc2F2ZWQgPSB0cnVlO1xuXG5cbi8qKlxuICogVXBkYXRlIHN0YXR1cyBvZiBzYXZlZCBzdGF0dXMgaW5kaWNhdG9yXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUluZGljYXRvciAoKTogdm9pZCB7XG4gIGNvbnN0IGluZGljYXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KCcjZmlsZS1zYXZlZCcpO1xuICBjb25zdCBwYXRoID0gc2F2ZWQ/IGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9zYXZlZC1pY29uLnN2Z2AgOiBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvdW5zYXZlZC1pY29uLnN2Z2A7XG4gIGluZGljYXRvci5zZXRBdHRyaWJ1dGUoJ3NyYycsIHBhdGgpO1xuICAvLyBzZXQgdGhlIGFsdCBhdHRyaWJ1dGUgbWVzc2FnZSBkZXBlbmRpbmcgb24gd2hldGhlciBsYXRlc3QgY2hhbmdlcyBhcmUgc2F2ZSBvciBub3RcbiAgY29uc3QgYWx0TWVzc2FnZSA9IHNhdmVkPyBcIllvdXIgd29yayBpcyBzYXZlZFwiIDogXCJZb3UgaGF2ZSB1bnNhdmVkIHdvcmtcIjtcbiAgaW5kaWNhdG9yLnNldEF0dHJpYnV0ZSgnYWx0JywgYWx0TWVzc2FnZSk7XG59XG5cblxuLyoqXG4gKiBTZXQgdGhlIHNhdmVkIHN0YXR1cyBvZiB0aGUgZm9saW9cbiAqIFxuICogQHBhcmFtIHN0YXR1cyBib29sZWFuIHZhbHVlLiB0cnVlIGlmIHN0YXR1cyBpcyBcInNhdmVkXCIsIGZhbHNlIGlmIFwibm90IHNhdmVkXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNhdmVkU3RhdHVzIChzdGF0dXM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICBzYXZlZCA9IHN0YXR1cztcbiAgdXBkYXRlSW5kaWNhdG9yKCk7XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGRlZmluZXMgZXZlbnQgbGlzdGVuZXIgdGhhdCBjaGVja3MgZm9yIHVuc2F2ZWQgY2hhbmdlcyBvbiBwYWdlIHJlbG9hZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuVW5zYXZlZENoYW5nZXMgKCk6IHZvaWQge1xuICB3aW5kb3cub25iZWZvcmV1bmxvYWQgPSAoZTogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHtcbiAgICBpZiAoIXNhdmVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyEnO1xuICAgIH1cbiAgfTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG5cdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHR0aGlzLm5hbWVzcGFjZSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyAlYycgOiAnICcpICtcblx0XHRhcmdzWzBdICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnJWMgJyA6ICcgJykgK1xuXHRcdCcrJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cblx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKTtcblxuXHQvLyBUaGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuXHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuXHRsZXQgaW5kZXggPSAwO1xuXHRsZXQgbGFzdEMgPSAwO1xuXHRhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgbWF0Y2ggPT4ge1xuXHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpbmRleCsrO1xuXHRcdGlmIChtYXRjaCA9PT0gJyVjJykge1xuXHRcdFx0Ly8gV2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG5cdFx0XHQvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuXHRcdFx0bGFzdEMgPSBpbmRleDtcblx0XHR9XG5cdH0pO1xuXG5cdGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmRlYnVnKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICogSWYgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2tcbiAqIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5sb2cgPSBjb25zb2xlLmRlYnVnIHx8IGNvbnNvbGUubG9nIHx8ICgoKSA9PiB7fSk7XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0dHJ5IHtcblx0XHRpZiAobmFtZXNwYWNlcykge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnNldEl0ZW0oJ2RlYnVnJywgbmFtZXNwYWNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9hZCgpIHtcblx0bGV0IHI7XG5cdHRyeSB7XG5cdFx0ciA9IGV4cG9ydHMuc3RvcmFnZS5nZXRJdGVtKCdkZWJ1ZycpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxuXG5cdC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcblx0aWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG5cblx0cmV0dXJuIHI7XG59XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuXHR0cnkge1xuXHRcdC8vIFRWTUxLaXQgKEFwcGxlIFRWIEpTIFJ1bnRpbWUpIGRvZXMgbm90IGhhdmUgYSB3aW5kb3cgb2JqZWN0LCBqdXN0IGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHRcblx0XHQvLyBUaGUgQnJvd3NlciBhbHNvIGhhcyBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuXHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uICh2KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnJvci5tZXNzYWdlO1xuXHR9XG59O1xuIiwiLyoqIEBtb2R1bGUgU3F1YXJlRWRpdC9Db250cm9scyAqL1xuXG5pbXBvcnQgKiBhcyBDb250ZW50cyBmcm9tICcuL0NvbnRlbnRzJztcbmltcG9ydCB7IHNldEdyb3VwaW5nSGlnaGxpZ2h0IH0gZnJvbSAnLi4vdXRpbHMvQ29sb3InO1xuaW1wb3J0IHsgdW5zZWxlY3QgfSBmcm9tICcuLi91dGlscy9TZWxlY3RUb29scyc7XG5pbXBvcnQgSW5zZXJ0SGFuZGxlciBmcm9tICcuL0luc2VydEhhbmRsZXInO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MsIHNldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5pbXBvcnQgeyBJbnNlcnRUYWJUeXBlLCBJbnNlcnRUeXBlIH0gZnJvbSAnLi4vVHlwZXMnO1xuXG4vKipcbiAqIEJpbmQgbGlzdGVuZXJzIHRvIGluc2VydCB0YWJzLidcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRJbnNlcnRUYWJzIChpbnNlcnRIYW5kbGVyOiBJbnNlcnRIYW5kbGVyKTogdm9pZCB7XG4gIGNvbnN0IGluc2VydFRhYnM6IEVsZW1lbnRbXSA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5zZXJ0VGFiJykpO1xuICBjb25zdCB0YWJJZHM6IHN0cmluZ1tdID0gaW5zZXJ0VGFicy5tYXAoKHRhYikgPT4geyByZXR1cm4gdGFiLmlkOyB9KTtcblxuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2dC5jb2RlLm1hdGNoKC9eRGlnaXRcXGQkLykgJiYgZXZ0LnNoaWZ0S2V5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihldnQuY29kZVtldnQuY29kZS5sZW5ndGggLSAxXSkgLSAxO1xuICAgICAgICBjb25zdCBpbnNlcnRPcHRpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5zZXJ0ZWwnKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBpbnNlcnRPcHRpb25zW2luZGV4XTtcbiAgICAgICAgKDxIVE1MQnV0dG9uRWxlbWVudD4gc2VsZWN0ZWRPcHRpb24pLmNsaWNrKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB0YWJJZHMuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFiKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGRlYWN0aXZhdGUoJy5pbnNlcnRUYWInKTtcbiAgICAgIGFjdGl2YXRlKHRhYiwgaW5zZXJ0SGFuZGxlcik7XG4gICAgICBzZXRTZXR0aW5ncyh7IGluc2VydFRhYjogdGFiIGFzIEluc2VydFRhYlR5cGUgfSk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zZXJ0X2RhdGEnKS5pbm5lckhUTUwgPSBDb250ZW50cy5pbnNlcnRUYWJIdG1sW3RhYl07XG4gICAgICBiaW5kRWxlbWVudHMoaW5zZXJ0SGFuZGxlcik7XG4gICAgICBkZWFjdGl2YXRlKCcuaW5zZXJ0ZWwnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgaW5zZXJ0TW9kZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgYWN0aXZhdGUoaW5zZXJ0TW9kZSwgaW5zZXJ0SGFuZGxlcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0T3B0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5zZXJ0ZWwnKVswXTtcbiAgICAgICAgYWN0aXZhdGUoZmlyc3RPcHRpb24uaWQsIGluc2VydEhhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIEVkaXQgYW5kIEluc2VydCBjb250cm9sIHBhbmVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnNlcnRFZGl0Q29udHJvbHMgKCk6IHZvaWQge1xuXG4gIGNvbnN0IGluc2VydFBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydF9jb250cm9scycpO1xuICBjb25zdCBpbnNlcnRIZWFkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydE1lbnUnKTtcbiAgY29uc3QgaW5zZXJ0SGVhZGluZ1RpdGxlID0gaW5zZXJ0SGVhZGluZy5xdWVyeVNlbGVjdG9yKCcucGFuZWwtaGVhZGluZy10aXRsZScpO1xuICBjb25zdCBpbnNlcnRDb250ZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnNlcnRDb250ZW50cycpO1xuICBjb25zdCBpbnNlcnREcm9wZG93bkljb24gPSBpbnNlcnRIZWFkaW5nLnF1ZXJ5U2VsZWN0b3IoJ3N2ZyA+IHVzZScpO1xuXG4gIGNvbnN0IGVkaXRQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0X2NvbnRyb2xzJyk7XG4gIGNvbnN0IGVkaXRIZWFkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRNZW51Jyk7XG4gIGNvbnN0IGRpc3BsYXlIZWFkaW5nVGl0bGUgPSBlZGl0SGVhZGluZy5xdWVyeVNlbGVjdG9yKCcucGFuZWwtaGVhZGluZy10aXRsZScpO1xuICBjb25zdCBlZGl0Q29udGVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdENvbnRlbnRzJyk7XG4gIGNvbnN0IGVkaXREcm9wZG93bkljb24gPSBlZGl0SGVhZGluZy5xdWVyeVNlbGVjdG9yKCdzdmcgPiB1c2UnKTtcblxuXG4gIC8vIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIHVzZXIgY2xpY2tzIGluc2lkZSBJbnNlcnQgcGFuZWxcbiAgLy8gaW5zZXJ0IG1vZGUgaXMgYWN0aXZhdGVkXG4gIGluc2VydFBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRpc3BsYXlIZWFkaW5nVGl0bGUuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXNlZCcpO1xuICAgIGluc2VydEhlYWRpbmdUaXRsZS5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG5cbiAgICBzZXRTZXR0aW5ncyh7IHVzZXJNb2RlOiAnaW5zZXJ0JyB9KTtcblxuICAgICg8SFRNTEJ1dHRvbkVsZW1lbnQ+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnNlcnRlbC5pcy1hY3RpdmUnKSkuY2xpY2soKTtcbiAgICBlZGl0UGFuZWwucXVlcnlTZWxlY3RvcignLnNpZGUtcGFuZWwtYnRuLnNlbC1ieS5pcy1hY3RpdmUnKS5jbGFzc0xpc3QuYWRkKCd1bmZvY3VzZWQnKTtcbiAgICBpbnNlcnRQYW5lbC5xdWVyeVNlbGVjdG9yKCcuc2lkZS1wYW5lbC1idG4uaW5zZXJ0ZWwuaXMtYWN0aXZlJykuY2xhc3NMaXN0LnJlbW92ZSgndW5mb2N1c2VkJyk7XG4gIH0pO1xuXG4gIC8vIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIHVzZXIgY2xpY2tzIGluc2lkZSBFZGl0IHBhbmVsXG4gIC8vIGVkaXQgbW9kZSBpcyBhY3RpdmF0ZWRcbiAgZWRpdFBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGluc2VydEhlYWRpbmdUaXRsZS5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gICAgZGlzcGxheUhlYWRpbmdUaXRsZS5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gICAgXG4gICAgc2V0U2V0dGluZ3MoeyB1c2VyTW9kZTogJ2VkaXQnIH0pO1xuXG4gICAgaW5zZXJ0UGFuZWwucXVlcnlTZWxlY3RvcignLnNpZGUtcGFuZWwtYnRuLmluc2VydGVsLmlzLWFjdGl2ZScpLmNsYXNzTGlzdC5hZGQoJ3VuZm9jdXNlZCcpO1xuICAgIGVkaXRQYW5lbC5xdWVyeVNlbGVjdG9yKCcuc2lkZS1wYW5lbC1idG4uc2VsLWJ5LmlzLWFjdGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ3VuZm9jdXNlZCcpO1xuICB9KTtcblxuXG4gIGluc2VydEhlYWRpbmcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gaWYgaW5zZXJ0IHBhbmVsIGlzIGNsb3NlZCwgb3BlbiBpdFxuICAgIGlmIChpbnNlcnRDb250ZW50cy5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb3NlZCcpKSB7XG4gICAgICAvLyBzZXQgY2xhc3NlcyBhbmQgc3R5bGVzIGZvciBhbiBvcGVuIHBhbmVsXG4gICAgICBpbnNlcnRDb250ZW50cy5jbGFzc0xpc3QucmVtb3ZlKCdjbG9zZWQnKTtcbiAgICAgIGluc2VydENvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMC41ZW0gMC43NWVtJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpbnNlcnRDb250ZW50cy5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIH0sIDIwMCk7XG4gICAgICBpbnNlcnREcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duYCk7XG4gICAgfSBcbiAgICAvLyBpZiBpbnNlcnQgcGFuZWwgaXMgb3BlbiwgY2xvc2UgaXRcbiAgICBlbHNlIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGEgY2xvc2VkIHBhbmVsXG4gICAgICBpbnNlcnRDb250ZW50cy5jbGFzc0xpc3QuYWRkKCdjbG9zZWQnKTtcbiAgICAgIGluc2VydENvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaW5zZXJ0Q29udGVudHMuc3R5bGUucGFkZGluZyA9ICcwcHgnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGluc2VydERyb3Bkb3duSWNvbi5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvaWNvbnMuc3ZnI2Ryb3Bkb3duLXNpZGVgKTtcbiAgICB9XG4gIH0pO1xuXG4gIGVkaXRIZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIC8vIGlmIGVkaXQgcGFuZWwgaXMgb3BlbiwgY2xvc2UgaXRcbiAgICBpZiAoZWRpdENvbnRlbnRzLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykpIHtcbiAgICAgIC8vIHNldCBjbGFzc2VzIGFuZCBzdHlsZXMgZm9yIGFuIG9wZW4gcGFuZWxcbiAgICAgIGVkaXRDb250ZW50cy5jbGFzc0xpc3QucmVtb3ZlKCdjbG9zZWQnKTtcbiAgICAgIGVkaXRDb250ZW50cy5zdHlsZS5wYWRkaW5nID0gJzAuNWVtIDAuNzVlbSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWRpdENvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGVkaXREcm9wZG93bkljb24uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duYCk7XG4gICAgfVxuICAgIC8vIGlmIGVkaXQgcGFuZWwgaXMgY2xvc2VkLCBvcGVuIGl0XG4gICAgZWxzZSB7XG4gICAgICAvLyBzZXQgY2xhc3NlcyBhbmQgc3R5bGVzIGZvciBhIGNsb3NlZCBwYW5lbFxuICAgICAgZWRpdENvbnRlbnRzLmNsYXNzTGlzdC5hZGQoJ2Nsb3NlZCcpO1xuICAgICAgZWRpdENvbnRlbnRzLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWRpdENvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSAnMHB4JztcbiAgICAgIH0sIDIwMCk7XG4gICAgICBlZGl0RHJvcGRvd25JY29uLnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tc2lkZWApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQWN0aXZhdGUgYSBjZXJ0YWluIGluc2VydCBhY3Rpb24uXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGFjdGl2YXRpbmcgaW5zZXJ0IFBBTkVMU1xuICogYW5kIGluc2VydCBJQ09OUyAod2h5eXkpLlxuICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSBpbnNlcnQgYWN0aW9uIHRhYi5cbiAqL1xuZnVuY3Rpb24gYWN0aXZhdGUgKGlkOiBzdHJpbmcsIGluc2VydEhhbmRsZXI6IEluc2VydEhhbmRsZXIpOiB2b2lkIHtcbiAgY29uc3Qgc2VsZWN0ZWRUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIHNlbGVjdGVkVGFiLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmNsYXNzTGlzdC5jb250YWlucygnaW5zZXJ0ZWwnKSkge1xuICAgIGluc2VydEhhbmRsZXIuaW5zZXJ0QWN0aXZlKGlkKTtcbiAgICBzZXRTZXR0aW5ncyh7IGluc2VydE1vZGU6IGlkIGFzIEluc2VydFR5cGUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWFjdGl2YXRlIGEgY2VydGFpbiBpbnNlcnQgYWN0aW9uLlxuICogQHBhcmFtIHR5cGUgLSBBIENTUyBzZWxlY3RvciBmb3IgdGhlIGFjdGlvbiB0YWIuXG4gKi9cbmZ1bmN0aW9uIGRlYWN0aXZhdGUgKHR5cGU6IHN0cmluZykge1xuICBjb25zdCBlbExpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHR5cGUpO1xuICBlbExpc3QuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgndW5mb2N1c2VkJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEJpbmQgbGlzdGVuZXJzIHRvIGluc2VydCB0YWIgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGJpbmRFbGVtZW50cyAoaW5zZXJ0SGFuZGxlcjogSW5zZXJ0SGFuZGxlcikge1xuICBjb25zdCBpbnNlcnRFbGVtZW50cyA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5zZXJ0ZWwnKSk7XG4gIGNvbnN0IGVsZW1lbnRJZHMgPSBpbnNlcnRFbGVtZW50cy5tYXAoZWwgPT4gZWwuaWQpO1xuICBlbGVtZW50SWRzLmZvckVhY2goZWwgPT4ge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGRlYWN0aXZhdGUoJy5pbnNlcnRlbCcpO1xuICAgICAgYWN0aXZhdGUoZWwsIGluc2VydEhhbmRsZXIpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTZXQgbGlzdGVuZXJzIG9uIHRoZSBidXR0b25zIHRvIGNoYW5nZSBzZWxlY3Rpb24gbW9kZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2VsZWN0aW9uQnV0dG9ucyAoKTogdm9pZCB7XG4gIGNvbnN0IHNlbEJ5U3lsbGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTeWxsYWJsZScpO1xuICBjb25zdCBzZWxCeU5ldW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5TmV1bWUnKTtcbiAgY29uc3Qgc2VsQnlOYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeU5jJyk7XG4gIGNvbnN0IHNlbEJ5U3RhZmYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpO1xuICBjb25zdCBzZWxCeUxheWVyRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUxheWVyRWxlbWVudCcpO1xuXG4gIHNlbEJ5U3lsbGFibGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxlY3RCeVN5bGxhYmxlSGFuZGxlcik7XG4gIHNlbEJ5TmV1bWUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxlY3RCeU5ldW1lSGFuZGxlcik7XG4gIHNlbEJ5TmMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxlY3RCeU5jSGFuZGxlcik7XG4gIHNlbEJ5U3RhZmYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxlY3RCeVN0YWZmSGFuZGxlcik7XG4gIHNlbEJ5TGF5ZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VsQnlMYXllckVsZW1lbnRIYW5kbGVyKTtcblxuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZ0KSA9PiB7XG4gICAgaWYgKGV2dC5rZXkgPT09ICcxJykgc2VsQnlTeWxsYWJsZS5jbGljaygpO1xuICAgIGlmIChldnQua2V5ID09PSAnMicpIHNlbEJ5TmV1bWUuY2xpY2soKTtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJzMnKSBzZWxCeU5jLmNsaWNrKCk7XG4gICAgaWYgKGV2dC5rZXkgPT09ICc0Jykgc2VsQnlTdGFmZi5jbGljaygpO1xuICAgIGlmIChldnQua2V5ID09PSAnNScpIHNlbEJ5TGF5ZXJFbGVtZW50LmNsaWNrKCk7XG4gIH0pO1xuXG5cbiAgZnVuY3Rpb24gc2VsZWN0QnlTeWxsYWJsZUhhbmRsZXIgKCkge1xuICAgIGlmICghc2VsQnlTeWxsYWJsZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICBzZXRTZXR0aW5ncyh7IHNlbGVjdGlvbk1vZGU6ICdzZWxCeVN5bGxhYmxlJyB9KTtcblxuICAgICAgdW5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgc2VsQnlTeWxsYWJsZS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcblxuICAgICAgc2VsQnlOZXVtZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5TmMuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeVN0YWZmLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlMYXllckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94JykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5pZCA9PT0gJ2hpZ2hsaWdodC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N5bGxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0QnlOZXVtZUhhbmRsZXIgKCkge1xuICAgIGlmICghc2VsQnlOZXVtZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICBzZXRTZXR0aW5ncyh7IHNlbGVjdGlvbk1vZGU6ICdzZWxCeU5ldW1lJyB9KTtcblxuICAgICAgdW5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgc2VsQnlOZXVtZS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5TmMuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeVN5bGxhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlTdGFmZi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5TGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGlnaGxpZ2h0LXNlbGVjdGVkJykuaWQgPT09ICdoaWdobGlnaHQtc2VsZWN0aW9uJykge1xuICAgICAgICAgIHNldEdyb3VwaW5nSGlnaGxpZ2h0KCduZXVtZScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdEJ5TmNIYW5kbGVyICgpIHtcbiAgICBpZiAoIXNlbEJ5TmMuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgc2V0U2V0dGluZ3MoeyBzZWxlY3Rpb25Nb2RlOiAnc2VsQnlOYycgfSk7XG5cbiAgICAgIHVuc2VsZWN0KCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5pbm5lckhUTUwgPSAnJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIHNlbEJ5TmMuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeU5ldW1lLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlTeWxsYWJsZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5U3RhZmYuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeUxheWVyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpZ2hsaWdodC1zZWxlY3RlZCcpLmlkID09PSAnaGlnaGxpZ2h0LXNlbGVjdGlvbicpIHtcbiAgICAgICAgICBzZXRHcm91cGluZ0hpZ2hsaWdodCgnbmV1bWUnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3RCeVN0YWZmSGFuZGxlciAoKSB7XG4gICAgaWYgKCFzZWxCeVN0YWZmLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICAgIHNldFNldHRpbmdzKHsgc2VsZWN0aW9uTW9kZTogJ3NlbEJ5U3RhZmYnIH0pO1xuXG4gICAgICB1bnNlbGVjdCgpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBzZWxCeVN0YWZmLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlOZXVtZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5TmMuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeVN5bGxhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlMYXllckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94JykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaWdobGlnaHQtc2VsZWN0ZWQnKS5pZCA9PT0gJ2hpZ2hsaWdodC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgc2V0R3JvdXBpbmdIaWdobGlnaHQoJ3N0YWZmJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2VsQnlMYXllckVsZW1lbnRIYW5kbGVyICgpIHtcbiAgICBpZiAoIXNlbEJ5TGF5ZXJFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHtcbiAgICAgIHNldFNldHRpbmdzKHsgc2VsZWN0aW9uTW9kZTogJ3NlbEJ5TGF5ZXJFbGVtZW50JyB9KTtcblxuICAgICAgdW5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb3JlRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dHJhRWRpdCcpLmlubmVySFRNTCA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgc2VsQnlMYXllckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeU5ldW1lLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgc2VsQnlOYy5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIHNlbEJ5U3RhZmYuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBzZWxCeVN5bGxhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGlnaGxpZ2h0LXNlbGVjdGVkJykuaWQgPT09ICdoaWdobGlnaHQtc2VsZWN0aW9uJykge1xuICAgICAgICAgIHNldEdyb3VwaW5nSGlnaGxpZ2h0KCdsYXllckVsZW1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24sIEluc2VydEFjdGlvbiB9IGZyb20gJy4uL1R5cGVzJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IGdldFNWR1JlbENvb3JkcywgaXNPdXRPZlNWR0JvdW5kcywgUG9pbnQgfSBmcm9tICcuLi91dGlscy9Db29yZGluYXRlcyc7XG5pbXBvcnQgeyBxdWV1ZU5vdGlmaWNhdGlvbiB9IGZyb20gJy4uL3V0aWxzL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBzZXRTZXR0aW5ncyB9IGZyb20gJy4uL3V0aWxzL0xvY2FsU2V0dGluZ3MnO1xuXG4vKipcbiAqIENsYXNzIHRoYXQgaGFuZGxlcyBpbnNlcnQgbW9kZSwgZXZlbnRzLCBhbmQgYWN0aW9ucy5cbiAqL1xuY2xhc3MgSW5zZXJ0SGFuZGxlciB7XG4gIHR5cGU6IHN0cmluZztcbiAgZmlyc3RDbGljayA9IHRydWU7XG4gIGNvb3JkOiBQb2ludDtcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc2VsZWN0b3I6IHN0cmluZztcbiAgbmVvblZpZXc6IE5lb25WaWV3O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmVvblZpZXcgLSBOZW9uVmlldyBwYXJlbnQuXG4gICAqIEBwYXJhbSBzZWwgLSBUaGUgQ1NTIHNlbGVjdG9yIHRvIGFwcGx5IGluc2VydCBsaXN0ZW5lcnMgdG8uXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobmVvblZpZXc6IE5lb25WaWV3LCBzZWw6IHN0cmluZykge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIGluc2VydCBidXR0b24gaXMgY2xpY2tlZC5cbiAgICogVHJpZ2dlcnMgdGhlIHN0YXJ0IG9mIGluc2VydCBtb2RlLlxuICAgKiBAcGFyYW0gYnV0dG9uSWQgLSBUaGUgSUQgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBjbGlja2VkLlxuICAgKi9cbiAgaW5zZXJ0QWN0aXZlIChidXR0b25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWxyZWFkeUluSW5zZXJ0TW9kZSA9IHRoaXMuaXNJbnNlcnRNb2RlKCk7XG4gICAgc3dpdGNoIChidXR0b25JZCkge1xuICAgICAgY2FzZSAncHVuY3R1bSc6XG4gICAgICAgIHRoaXMudHlwZSA9ICduYyc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGlhbW9uZCc6XG4gICAgICAgIHRoaXMudHlwZSA9ICduYyc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgdGlsdDogJ3NlJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZpcmdhJzpcbiAgICAgICAgdGhpcy50eXBlID0gJ25jJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0geyB0aWx0OiAncycgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvL3RoZXJlIGFyZSBtdWx0aXBsZSBwb3NzaWJsZSBsaXF1ZXNjZW50IGNvbWJpbmF0aW9uc1xuICAgICAgY2FzZSAnbGlxdWVzY2VudEEnOlxuICAgICAgICB0aGlzLnR5cGUgPSAnbmMnO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7IGN1cnZlOiAnYScgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsaXF1ZXNjZW50Qyc6XG4gICAgICAgIHRoaXMudHlwZSA9ICduYyc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgY3VydmU6ICdjJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZpcmdhUmV2ZXJzZWQnOlxuICAgICAgICB0aGlzLnR5cGUgPSAnbmMnO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7IHRpbHQ6ICduJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Blcyc6XG4gICAgICBjYXNlICdjbGl2aXMnOlxuICAgICAgY2FzZSAnc2NhbmRpY3VzJzpcbiAgICAgIGNhc2UgJ2NsaW1hY3VzJzpcbiAgICAgIGNhc2UgJ3RvcmN1bHVzJzpcbiAgICAgIGNhc2UgJ3BvcnJlY3R1cyc6XG4gICAgICBjYXNlICdwcmVzc3VzJzpcbiAgICAgICAgY29uc3QgY29udG91ciA9IHRoaXMubmVvblZpZXcuaW5mby5nZXRDb250b3VyQnlWYWx1ZShcbiAgICAgICAgICBidXR0b25JZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGJ1dHRvbklkLnNsaWNlKDEpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdncm91cGluZyc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgY29udG91cjogY29udG91ciB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NDbGVmJzpcbiAgICAgIGNhc2UgJ2ZDbGVmJzpcbiAgICAgICAgdGhpcy50eXBlID0gJ2NsZWYnO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7IHNoYXBlOiBidXR0b25JZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2N1c3Rvcyc6XG4gICAgICAgIHRoaXMudHlwZSA9ICdjdXN0b3MnO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RpdkxpbmVNYXhpbWEnOlxuICAgICAgICB0aGlzLnR5cGUgPSAnZGl2TGluZSc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgZm9ybTogJ21heGltYScgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGFmZic6XG4gICAgICAgIHRoaXMudHlwZSA9ICdzdGFmZic7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmxhdCc6XG4gICAgICAgIHRoaXMudHlwZSA9ICdhY2NpZCc7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHsgYWNjaWQ6ICdmJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25hdHVyYWwnOlxuICAgICAgICB0aGlzLnR5cGUgPSAnYWNjaWQnO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7IGFjY2lkOiAnbicgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnR5cGUgPSAnJztcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbnVsbDtcbiAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBidXR0b24gZm9yIGluc2VydGlvbjogJyArIGJ1dHRvbklkICsgJy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlSW5zZXJ0Q2xpY2tIYW5kbGVycygpO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSAnc3RhZmYnKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zZWxlY3RvcilcbiAgICAgICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnN0YWZmSGFuZGxlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuc2VsZWN0b3IpXG4gICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgLy8gRGlzYWJsZSBlZGl0IG1vZGUgbGlzdGVuZXJzXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnJlc2V0SW5zZXJ0SGFuZGxlcik7XG5cbiAgICAvLyBBZGQgJ3JldHVybiB0byBlZGl0IG1vZGUnIGJ1dHRvblxuICAgIGlmICghYWxyZWFkeUluSW5zZXJ0TW9kZSkge1xuICAgICAgY29uc3QgZWRpdE1vZGVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGVkaXRNb2RlQnV0dG9uLmlkID0gJ3JldHVyblRvRWRpdE1vZGUnO1xuICAgICAgZWRpdE1vZGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnc2lkZS1wYW5lbC1idG4nKTtcbiAgICAgIGVkaXRNb2RlQnV0dG9uLmlubmVySFRNTCA9ICdSZXR1cm4gdG8gRWRpdCBNb2RlJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWRvJykucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlZGl0TW9kZUJ1dHRvbik7XG4gICAgICBlZGl0TW9kZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaW5zZXJ0RGlzYWJsZWQpO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0Q29udGVudHMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2thd2F5SGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBpbnNlcnQgbW9kZSBhbmQgcmVtb3ZlIGV2ZW50IGxpc3RlbmVycy5cbiAgICovXG4gIGluc2VydERpc2FibGVkID0gKGZ1bmN0aW9uIGluc2VydERpc2FibGVkICgpOiB2b2lkIHtcbiAgICB0aGlzLnR5cGUgPSAnJztcbiAgICB0aGlzLnJlbW92ZUluc2VydENsaWNrSGFuZGxlcnMoKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMucmVzZXRJbnNlcnRIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja2F3YXlIYW5kbGVyKTtcblxuICAgIHRoaXMuZmlyc3RDbGljayA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXR1cm5Ub0VkaXRNb2RlJykucmVtb3ZlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gY29uc29sZS5kZWJ1ZyhlKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnNlcnRQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnNlcnRfY29udHJvbHMnKTtcbiAgICBjb25zdCBpbnNlcnRIZWFkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc2VydE1lbnUnKTtcbiAgICBjb25zdCBpbnNlcnRIZWFkaW5nVGl0bGUgPSBpbnNlcnRIZWFkaW5nLnF1ZXJ5U2VsZWN0b3IoJy5wYW5lbC1oZWFkaW5nLXRpdGxlJyk7XG5cbiAgICBjb25zdCBlZGl0UGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdF9jb250cm9scycpO1xuICAgIGNvbnN0IGVkaXRIZWFkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRNZW51Jyk7XG4gICAgY29uc3QgZGlzcGxheUhlYWRpbmdUaXRsZSA9IGVkaXRIZWFkaW5nLnF1ZXJ5U2VsZWN0b3IoJy5wYW5lbC1oZWFkaW5nLXRpdGxlJyk7XG5cbiAgICBpbnNlcnRIZWFkaW5nVGl0bGUuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXNlZCcpO1xuICAgIGRpc3BsYXlIZWFkaW5nVGl0bGUuY2xhc3NMaXN0LmFkZCgnZm9jdXNlZCcpO1xuXG4gICAgaW5zZXJ0UGFuZWwucXVlcnlTZWxlY3RvcignLnNpZGUtcGFuZWwtYnRuLmluc2VydGVsLmlzLWFjdGl2ZScpLmNsYXNzTGlzdC5hZGQoJ3VuZm9jdXNlZCcpO1xuICAgIGVkaXRQYW5lbC5xdWVyeVNlbGVjdG9yKCcuc2lkZS1wYW5lbC1idG4uc2VsLWJ5LmlzLWFjdGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ3VuZm9jdXNlZCcpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyB1c2VyTW9kZTogJ2VkaXQnIH0pO1xuICAgIFxuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBoYW5kbGVyIHRvIGhhbmRsZSBhIHVzZXIgY2xpY2tpbmcgYXdheSBmcm9tIHRoZSBhY3RpdmUgcGFnZVxuICAgKiBjYXVzaW5nIGluc2VydCBtb2RlIHRvIGVuZC5cbiAgICovXG4gIGNsaWNrYXdheUhhbmRsZXIgPSAoZnVuY3Rpb24gY2xpY2thd2F5SGFuZGxlciAoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5hY3RpdmUtcGFnZScpID09PSBudWxsICYmXG4gICAgICB0YXJnZXQuY2xvc2VzdCgnI2luc2VydF9jb250cm9scycpID09PSBudWxsICYmXG4gICAgICB0YXJnZXQuY2xvc2VzdCgnI3N2Z19ncm91cCcpID09PSBudWxsKSB7XG4gICAgICB0aGlzLmluc2VydERpc2FibGVkKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLFxuICAgICAgICB0aGlzLnN0YWZmSGFuZGxlcik7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLFxuICAgICAgICB0aGlzLmhhbmRsZXIpO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKipcbiAgICogUmVzZXRzIGFuIGluc2VydCBldmVudCBsaXN0ZW5lciBhZnRlciB0ZW1wb3JhcmlseSByZW1vdmluZyBpdC5cbiAgICovXG4gIHJlc2V0SW5zZXJ0SGFuZGxlciA9IChmdW5jdGlvbiByZXNldEluc2VydEhhbmRsZXIgKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuc2VsZWN0b3IpXG4gICAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudHlwZSA9PT0gJ3N0YWZmJyA/XG4gICAgICAgICAgdGhpcy5zdGFmZkhhbmRsZXIgOiB0aGlzLmhhbmRsZXIpO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKipcbiAgICogTGlzdGVucyB0byBrZXkgcHJlc3NlcyB0byBlaXRoZXIgZXhpdCBlZGl0IG1vZGUgKGlmIEVzY2FwZSkgb3JcbiAgICogdGVtcG9yYXJpbHkgcmVtb3ZlIGluc2VydCBldmVudCBsaXN0ZW5lcnMgKGlmIFNoaWZ0KS5cbiAgICovXG4gIGtleWRvd25MaXN0ZW5lciA9IChmdW5jdGlvbiBrZXlkb3duTGlzdGVuZXIgKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgdGhpcy5pbnNlcnREaXNhYmxlZCgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5zdGFmZkhhbmRsZXIpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVyKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgIHRoaXMucmVtb3ZlSW5zZXJ0Q2xpY2tIYW5kbGVycygpO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKipcbiAgICogRXZlbnQgaGFuZGxlciBmb3IgY2xpY2tpbmcgdG8gaW5zZXJ0IGFueSBlbGVtZW50IGV4Y2VwdCBhIHN0YWZmLlxuICAgKi9cbiAgaGFuZGxlciA9IChmdW5jdGlvbiBoYW5kbGVyIChldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIG91dCBvZiBib3VuZHMsIG5vdGhpbmcgc2hvdWxkIGJlIGluc2VydGVkLlxuICAgIGNvbnN0IGN1cnNvciA9IGdldFNWR1JlbENvb3JkcyhldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIGlmIChpc091dE9mU1ZHQm91bmRzKGN1cnNvci54LCBjdXJzb3IueSkpXG4gICAgICByZXR1cm4gcXVldWVOb3RpZmljYXRpb24oJ1tGQUlMXSBHbHlwaCB3YXMgcGxhY2VkIG91dCBvZiBib3VuZHMhIEluc2VydGlvbiBmYWlsZWQuJywgJ2Vycm9yJyk7XG5cbiAgICBjb25zdCBlZGl0b3JBY3Rpb246IEluc2VydEFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogJ2luc2VydCcsXG4gICAgICBwYXJhbToge1xuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy50eXBlLFxuICAgICAgICBzdGFmZklkOiAnYXV0bycsXG4gICAgICAgIHVseDogY3Vyc29yLngsXG4gICAgICAgIHVseTogY3Vyc29yLnksXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICAgIGVkaXRvckFjdGlvbi5wYXJhbS5hdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgICAgaWYgKHRoaXMuYXR0cmlidXRlc1snc2hhcGUnXSA9PT0gJ0YnKSB7XG4gICAgICAgIGVkaXRvckFjdGlvblsncGFyYW0nXVsndWx4J10gLT0gNTA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5uZW9uVmlldy5lZGl0KGVkaXRvckFjdGlvbiwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zZWxlY3RvcikuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIpO1xuICAgIH0pO1xuICB9KS5iaW5kKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBoYW5kbGVyIHRvIGluc2VydCBhIHN0YWZmLlxuICAgKi9cbiAgc3RhZmZIYW5kbGVyID0gKGZ1bmN0aW9uIHN0YWZmSGFuZGxlciAoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3Vyc29yID0gZ2V0U1ZHUmVsQ29vcmRzKGV2dC5jbGllbnRYLCBldnQuY2xpZW50WSk7XG5cbiAgICBpZiAoaXNPdXRPZlNWR0JvdW5kcyhjdXJzb3IueCwgY3Vyc29yLnkpKSB7XG4gICAgICByZXR1cm4gcXVldWVOb3RpZmljYXRpb24oJ1N0YWZmIGNhbm5vdCBiZSBwbGFjZWQgb3V0IG9mIGJvdW5kcyEnLCAnZXJyb3InKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWN0aXZlLXBhZ2UgPiAuZGVmaW5pdGlvbi1zY2FsZScpO1xuXG4gICAgaWYgKHRoaXMuZmlyc3RDbGljaykge1xuICAgICAgdGhpcy5jb29yZCA9IGN1cnNvcjtcbiAgICAgIGQzLnNlbGVjdChjb250YWluZXIpLmFwcGVuZCgnY2lyY2xlJykuYXR0cignY3gnLCBjdXJzb3IueClcbiAgICAgICAgLmF0dHIoJ2N5JywgY3Vyc29yLnkpXG4gICAgICAgIC5hdHRyKCdyJywgMTApXG4gICAgICAgIC5hdHRyKCdpZCcsICdzdGFmZi1jaXJjbGUnKVxuICAgICAgICAuYXR0cignZmlsbCcsICdncmVlbicpO1xuICAgICAgdGhpcy5maXJzdENsaWNrID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1bDogUG9pbnQsIGxyOiBQb2ludDtcbiAgICAgIGlmIChjdXJzb3IueCA8IHRoaXMuY29vcmQueCB8fCBjdXJzb3IueSA8IHRoaXMuY29vcmQueSkgeyAvLyBzZWNvbmQgcG9pbnQgaXMgbm90IGxyXG4gICAgICAgIHVsID0gY3Vyc29yO1xuICAgICAgICBsciA9IHRoaXMuY29vcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bCA9IHRoaXMuY29vcmQ7XG4gICAgICAgIGxyID0gY3Vyc29yO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YWZmLWNpcmNsZScpLnJlbW92ZSgpO1xuICAgICAgY29uc3QgYWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogJ2luc2VydCcsXG4gICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgZWxlbWVudFR5cGU6ICdzdGFmZicsXG4gICAgICAgICAgc3RhZmZJZDogJ2F1dG8nLFxuICAgICAgICAgIHVseDogdWwueCxcbiAgICAgICAgICB1bHk6IHVsLnksXG4gICAgICAgICAgbHJ4OiBsci54LFxuICAgICAgICAgIGxyeTogbHIueVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm5lb25WaWV3LmVkaXQoYWN0aW9uLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMubmVvblZpZXcudXBkYXRlRm9yQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgdGhpcy5maXJzdENsaWNrID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSkuYmluZCh0aGlzKTtcblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBpbnNlcnQgbGlzdGVuZXJzIHdoaWxlIG5vdCBsZWF2aW5nIGluc2VydCBtb2RlIGVudGlyZWx5LlxuICAgKi9cbiAgcmVtb3ZlSW5zZXJ0Q2xpY2tIYW5kbGVycyA9IChmdW5jdGlvbiByZW1vdmVJbnNlcnRDbGlja0hhbmRsZXJzICgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9yKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3RhZmZIYW5kbGVyKTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zZWxlY3RvcikucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH0pLmJpbmQodGhpcyk7XG5cbiAgaXNJbnNlcnRNb2RlICgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMudHlwZSAhPT0gJycpO1xuICB9XG59XG5cbmV4cG9ydCB7IEluc2VydEhhbmRsZXIgYXMgZGVmYXVsdCB9O1xuIiwiLyoqXG4gKiBDb250ZW50cyBvZiBuYXZiYXIgbWVudSBhZnRlciBzd2l0Y2hpbmcgdG8gZWRpdCBtb2RlLlxuICovXG5cbi8vIFwiRmlsZVwiIERyb3Bkb3duXG5leHBvcnQgY29uc3QgbmF2YmFyRHJvcGRvd25GaWxlTWVudTogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbm5hdmJhckRyb3Bkb3duRmlsZU1lbnUuY2xhc3NMaXN0LmFkZCgnbmF2YmFyLWl0ZW0nLCAnaGFzLWRyb3Bkb3duJywgJ2lzLWhvdmVyYWJsZScpO1xuY29uc3QgZmlsZURyb3Bkb3duQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5maWxlRHJvcGRvd25CdG4uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLWJ0bicpO1xuZmlsZURyb3Bkb3duQnRuLmlubmVySFRNTCA9ICc8ZGl2PkZpbGU8L2Rpdj4nO1xuY29uc3QgZmlsZU5hdmJhckNvbnRlbnRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5maWxlTmF2YmFyQ29udGVudHMuY2xhc3NMaXN0LmFkZCgnbmF2YmFyLWRyb3Bkb3duJyk7XG5maWxlTmF2YmFyQ29udGVudHMuaWQgPSAnbmF2YmFyLWRyb3Bkb3duLW9wdGlvbnMnO1xuXG5jb25zdCBmaWxlRHJvcGRvd25Db250ZW50cyA9IFtcbiAgWydzYXZlJywgJ1NhdmUnXSxcbiAgWydleHBvcnQnLCAnU2F2ZSBhbmQgRXhwb3J0IHRvIEZpbGUnXSxcbiAgWydnZXRtZWknLCAnRG93bmxvYWQgTUVJJ11cbl07XG5cbmZpbGVEcm9wZG93bkNvbnRlbnRzLmZvckVhY2goY29udGVudCA9PiB7XG4gIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaXRlbS5pZCA9IGNvbnRlbnRbMF07XG4gIGl0ZW0uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLWRyb3Bkb3duLWl0ZW0nKTtcbiAgaXRlbS50ZXh0Q29udGVudCA9IGNvbnRlbnRbMV07XG4gIGZpbGVOYXZiYXJDb250ZW50cy5hcHBlbmRDaGlsZChpdGVtKTtcbn0pO1xuXG5uYXZiYXJEcm9wZG93bkZpbGVNZW51LmFwcGVuZENoaWxkKGZpbGVEcm9wZG93bkJ0bik7XG5uYXZiYXJEcm9wZG93bkZpbGVNZW51LmFwcGVuZENoaWxkKGZpbGVOYXZiYXJDb250ZW50cyk7XG5cbi8vIFwiTUVJIEFjdGlvbnNcIiBEcm9wZG93blxuZXhwb3J0IGNvbnN0IG5hdmJhckRyb3Bkb3duTUVJQWN0aW9uc01lbnU6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5uYXZiYXJEcm9wZG93bk1FSUFjdGlvbnNNZW51LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1pdGVtJywgJ2hhcy1kcm9wZG93bicsICdpcy1ob3ZlcmFibGUnKTtcbmNvbnN0IG1laUFjdGlvbnNEcm9wZG93bkJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xubWVpQWN0aW9uc0Ryb3Bkb3duQnRuLmNsYXNzTGlzdC5hZGQoJ25hdmJhci1idG4nKTtcbm1laUFjdGlvbnNEcm9wZG93bkJ0bi5pbm5lckhUTUwgPSAnPGRpdj5NRUkgQWN0aW9uczwvZGl2Pic7XG5jb25zdCBtZWlBY3Rpb25zTmF2YmFyQ29udGVudHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbm1laUFjdGlvbnNOYXZiYXJDb250ZW50cy5jbGFzc0xpc3QuYWRkKCduYXZiYXItZHJvcGRvd24nKTtcbm1laUFjdGlvbnNOYXZiYXJDb250ZW50cy5pZCA9ICduYXZiYXItZHJvcGRvd24tb3B0aW9ucyc7XG5jb25zdCBtZWlBY3Rpb25zRHJvcGRvd25Db250ZW50cyA9IFtcbiAgWydyZW1vdmUtZW1wdHktc3lscycsICdSZW1vdmUgRW1wdHkgU3lsbGFibGVzJ10sXG4gIFsncmVtb3ZlLWVtcHR5LW5ldW1lcycsICdSZW1vdmUgRW1wdHkgTmV1bWVzJ10sXG4gIFsncmV2ZXJ0JywgJ1JldmVydCddXG5dO1xuXG5tZWlBY3Rpb25zRHJvcGRvd25Db250ZW50cy5mb3JFYWNoKGNvbnRlbnQgPT4ge1xuICBjb25zdCBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGl0ZW0uaWQgPSBjb250ZW50WzBdO1xuICBpdGVtLmNsYXNzTGlzdC5hZGQoJ25hdmJhci1kcm9wZG93bi1pdGVtJyk7XG4gIGl0ZW0udGV4dENvbnRlbnQgPSBjb250ZW50WzFdO1xuICBtZWlBY3Rpb25zTmF2YmFyQ29udGVudHMuYXBwZW5kQ2hpbGQoaXRlbSk7XG59KTtcblxubmF2YmFyRHJvcGRvd25NRUlBY3Rpb25zTWVudS5hcHBlbmRDaGlsZChtZWlBY3Rpb25zRHJvcGRvd25CdG4pO1xubmF2YmFyRHJvcGRvd25NRUlBY3Rpb25zTWVudS5hcHBlbmRDaGlsZChtZWlBY3Rpb25zTmF2YmFyQ29udGVudHMpO1xuXG4vKipcbiAqIEZpbmFsaXplIG9wdGlvbiBpbiB0aGUgbmF2YmFyIGZvciByb2RhblxuICovXG5leHBvcnQgY29uc3QgbmF2YmFyRmluYWxpemUgPVxuICAgICc8YSBpZD1cImZpbmFsaXplXCIgY2xhc3M9XCJuYXZiYXItaXRlbVwiPiBGaW5hbGl6ZSBNRUkgPC9hPic7XG5cbi8qKlxuICogQ29udGVudHMgb2YgdGhlIHVuZG8vcmVkbyBwYW5lbCB3aXRoIGJ1dHRvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IHVuZG9SZWRvUGFuZWwgPVxuICBgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJ1bmRvXCI+VW5kbzwvYnV0dG9uPlxuICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG5cIiBpZD1cInJlZG9cIj5SZWRvPC9idXR0b24+YDtcbiIsImltcG9ydCAqIGFzIE5vdGlmaWNhdGlvbiBmcm9tICcuL05vdGlmaWNhdGlvbic7XG5pbXBvcnQgTmVvblZpZXcgZnJvbSAnLi4vTmVvblZpZXcnO1xuaW1wb3J0IHsgY29udmVydFRvTmVvbiB9IGZyb20gJy4vQ29udmVydE1laSc7XG5pbXBvcnQgeyBFZGl0b3JBY3Rpb24gfSBmcm9tICcuLi9UeXBlcyc7XG5cbi8qKlxuICogU2V0IHRvcCBuYXZiYXIgZXZlbnQgbGlzdGVuZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdE5hdmJhcihuZW9uVmlldzogTmVvblZpZXcpOiB2b2lkIHtcbiAgLy8gc2V0dXAgbmF2YmFyIGxpc3RlbmVyc1xuICBjb25zdCBuYXZiYXJEcm9wZG93bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICcubmF2YmFyLWl0ZW0uaGFzLWRyb3Bkb3duLmlzLWhvdmVyYWJsZScsXG4gICk7XG4gIEFycmF5LmZyb20obmF2YmFyRHJvcGRvd25zKS5mb3JFYWNoKChkcm9wRG93bikgPT4ge1xuICAgIGRyb3BEb3duLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgIC8vXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8qIFwiRklMRVwiIG1lbnUgKi9cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBuZW9uVmlldy5zYXZlKCkudGhlbigoKSA9PiB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1NhdmVkJywgJ3N1Y2Nlc3MnKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ3MnKSB7XG4gICAgICBuZW9uVmlldy5zYXZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2F2ZWQnLCAnc3VjY2VzcycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwb3J0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbmVvblZpZXcuZXhwb3J0KCkudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICAgIGNvbnN0IGxpbms6IEhUTUxBbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgbGluay5ocmVmID0gbWFuaWZlc3QgYXMgc3RyaW5nO1xuICAgICAgbGluay5kb3dubG9hZCA9IG5lb25WaWV3Lm5hbWUgKyAnLmpzb25sZCc7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgbGluay5jbGljaygpO1xuICAgICAgbGluay5yZW1vdmUoKTtcbiAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignU2F2ZWQnLCAnc3VjY2VzcycpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBEb3dubG9hZCBsaW5rIGZvciBNRUlcbiAgLy8gSXMgYW4gYWN0dWFsIGZpbGUgd2l0aCBhIHZhbGlkIFVSSSBleGNlcHQgaW4gbG9jYWwgbW9kZSB3aGVyZSBpdCBtdXN0IGJlIGdlbmVyYXRlZC5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dldG1laScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHVyaSA9IG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKTtcbiAgICBuZW9uVmlldy5nZXRQYWdlTUVJKHVyaSkudGhlbigobWVpKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgJ2RhdGE6YXBwbGljYXRpb24vbWVpK3htbDtiYXNlNjQsJyArIHdpbmRvdy5idG9hKGNvbnZlcnRUb05lb24obWVpKSk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2V0bWVpJykuc2V0QXR0cmlidXRlKCdocmVmJywgZGF0YSk7XG4gICAgICBkb2N1bWVudFxuICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoJ2dldG1laScpXG4gICAgICAgIC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgbmVvblZpZXcudmlldy5nZXRQYWdlTmFtZSgpICsgJy5tZWknKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLyogXCJNRUkgQUNUSU9OU1wiIG1lbnUgKi9cbiAgLy8gRXZlbnQgbGlzdGVuZXIgZm9yIFwiUmVtb3ZlIEVtcHR5IFN5bGxhYmxlc1wiIGJ1dHRvbiBpbnNpZGUgXCJNRUkgQWN0aW9uc1wiIGRyb3Bkb3duXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdyZW1vdmUtZW1wdHktc3lscycpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXJpID0gbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpO1xuXG4gICAgICBuZW9uVmlldy5nZXRQYWdlTUVJKHVyaSkudGhlbigobWVpU3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgbWVpRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhtZWlTdHJpbmcsICd0ZXh0L3htbCcpO1xuICAgICAgICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBzeWxsYWJsZXMgPSBBcnJheS5mcm9tKG1laS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3lsbGFibGUnKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIHN5bGxhYmxlcyB3aXRob3V0IG5ldW1lc1xuICAgICAgICBsZXQgaGFzRW1wdHlTeWxsYWJsZXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVtb3ZlU3lsbGFibGVBY3Rpb25zID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3lsbGFibGUgb2Ygc3lsbGFibGVzKSB7XG4gICAgICAgICAgLy8gaWYgZW1wdHkgc3lsbGFibGUgZm91bmQsIGNyZWF0ZSBhY3Rpb24gb2JqZWN0IGZvciByZW1vdmluZyBpdFxuICAgICAgICAgIGlmIChzeWxsYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbmV1bWUnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGFjdGlvbjogJ3JlbW92ZScsXG4gICAgICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudElkOiBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGFkZCBhY3Rpb24gb2JqZWN0IHRvIGFycmF5IChjaGFpbikgb2YgYWN0aW9uIG9iamVjdHNcbiAgICAgICAgICAgIHJlbW92ZVN5bGxhYmxlQWN0aW9ucy5wdXNoKHRvUmVtb3ZlKTtcbiAgICAgICAgICAgIGhhc0VtcHR5U3lsbGFibGVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBlbXB0eSBzeWxsYWJsZXMgd2VyZSBmb3VuZFxuICAgICAgICBpZiAoIWhhc0VtcHR5U3lsbGFibGVzKSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdObyBlbXB0eSBzeWxsYWJsZXMgZm91bmQnLCAnd2FybmluZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNyZWF0ZSBcImNoYWluIGFjdGlvblwiIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNoYWluUmVtb3ZlQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgICAgICAgICBwYXJhbTogcmVtb3ZlU3lsbGFibGVBY3Rpb25zLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBleGVjdXRlIGFjdGlvbiB0aGF0IHJlbW92ZXMgYWxsIGVtcHR5IHN5bGxhYmxlc1xuICAgICAgICAgIC8vIFwicmVzdWx0XCIgdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZSAodHJ1ZSBpZiBjaGFpbiBvZiBhY3Rpb25zIHdhcyBzdWNjZXNzZnVsKVxuICAgICAgICAgIG5lb25WaWV3LmVkaXQoY2hhaW5SZW1vdmVBY3Rpb24sIHVyaSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICAnUmVtb3ZlZCBlbXB0eSBTeWxsYWJsZXMnLFxuICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHJlbW92ZSBlbXB0eSBTeWxsYWJsZXMnLFxuICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBcIlJlbW92ZSBFbXB0eSBOZXVtZXNcIiBidXR0b24gaW5zaWRlIFwiTUVJIEFjdGlvbnNcIiBkcm9wZG93blxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZCgncmVtb3ZlLWVtcHR5LW5ldW1lcycpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXJpID0gbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpO1xuXG4gICAgICBuZW9uVmlldy5nZXRQYWdlTUVJKHVyaSkudGhlbigobWVpU3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgbWVpRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhtZWlTdHJpbmcsICd0ZXh0L3htbCcpO1xuICAgICAgICBjb25zdCBtZWkgPSBtZWlEb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBuZXVtZXMgPSBBcnJheS5mcm9tKG1laS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbmV1bWUnKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIG5ldW1lcyB3aXRob3V0IG5ldW1lIGNvbXBvbmVudHNcbiAgICAgICAgbGV0IGhhc0VtcHR5TmV1bWVzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZU5ldW1lQWN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG5ldW1lIG9mIG5ldW1lcykge1xuICAgICAgICAgIC8vIGlmIGVtcHR5IG5ldW1lIGZvdW5kLCBjcmVhdGUgYWN0aW9uIG9iamVjdCBmb3IgcmVtb3ZpbmcgaXRcbiAgICAgICAgICBpZiAobmV1bWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ25jJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCB0b1JlbW92ZTogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogbmV1bWUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBhZGQgYWN0aW9uIG9iamVjdCB0byBhcnJheSAoY2hhaW4pIG9mIGFjdGlvbiBvYmplY3RzXG4gICAgICAgICAgICByZW1vdmVOZXVtZUFjdGlvbnMucHVzaCh0b1JlbW92ZSk7XG4gICAgICAgICAgICBoYXNFbXB0eU5ldW1lcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgZW1wdHkgbmV1bWVzIHdlcmUgZm91bmRcbiAgICAgICAgaWYgKCFoYXNFbXB0eU5ldW1lcykge1xuICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbignTm8gZW1wdHkgTmV1bWVzIGZvdW5kJywgJ3dhcm5pbmcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjcmVhdGUgXCJjaGFpbiBhY3Rpb25cIiBvYmplY3RcbiAgICAgICAgICBjb25zdCBjaGFpblJlbW92ZUFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICAgICAgYWN0aW9uOiAnY2hhaW4nLFxuICAgICAgICAgICAgcGFyYW06IHJlbW92ZU5ldW1lQWN0aW9ucyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gZXhlY3V0ZSBhY3Rpb24gdGhhdCByZW1vdmVzIGFsbCBlbXB0eSBuZXVtZXNcbiAgICAgICAgICAvLyBcInJlc3VsdFwiIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UgKHRydWUgaWYgY2hhaW4gb2YgYWN0aW9ucyB3YXMgc3VjY2Vzc2Z1bClcbiAgICAgICAgICBuZW9uVmlldy5lZGl0KGNoYWluUmVtb3ZlQWN0aW9uLCB1cmkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ1JlbW92ZWQgZW1wdHkgTmV1bWVzJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHJlbW92ZSBlbXB0eSBOZXVtZXMnLFxuICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCdyZW1vdmUtb3V0LW9mLWJvdW5kcy1nbHlwaHMnKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVyaSA9IG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKTtcbiAgICAgIG5lb25WaWV3LmdldFBhZ2VNRUkodXJpKS50aGVuKChtZWlTdHJpbmcpID0+IHtcbiAgICAgICAgLy8gTG9hZCBNRUkgZG9jdW1lbnQgaW50byBwYXJzZXJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1laVN0cmluZywgJ3RleHQveG1sJyk7XG4gICAgICAgIGNvbnN0IG1laSA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gR2V0IGJvdW5kcyBvZiB0aGUgTUVJXG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBtZWkucXVlcnlTZWxlY3Rvcignc3VyZmFjZScpO1xuICAgICAgICBjb25zdCBtZWlMcnggPSBOdW1iZXIoZGltZW5zaW9ucy5nZXRBdHRyaWJ1dGUoJ2xyeCcpKSxcbiAgICAgICAgICBtZWlMcnkgPSBOdW1iZXIoZGltZW5zaW9ucy5nZXRBdHRyaWJ1dGUoJ2xyeScpKTtcblxuICAgICAgICBmdW5jdGlvbiBpc0F0dHJPdXRPZkJvdW5kcyh6b25lOiBFbGVtZW50LCBhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICBjb25zdCBjb29yZCA9IE51bWJlcih6b25lLmdldEF0dHJpYnV0ZShhdHRyKSk7XG4gICAgICAgICAgY29uc3QgY29tcCA9IGF0dHIgPT0gJ2xyeCcgfHwgYXR0ciA9PSAndWx4JyA/IG1laUxyeCA6IG1laUxyeTtcbiAgICAgICAgICByZXR1cm4gY29vcmQgPCAwIHx8IGNvb3JkID4gY29tcDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhcnJheSBvZiB6b25lcyB0aGF0IGFyZSBvdXQgb2YgYm91bmQsIGFuZCBjcmVhdGUgYSBoYXNoIG1hcFxuICAgICAgICAvLyBmb3IgZmFzdCByZXRyaWV2YWxcbiAgICAgICAgY29uc3Qgem9uZXMgPSBBcnJheS5mcm9tKG1laS5xdWVyeVNlbGVjdG9yQWxsKCd6b25lJykpO1xuICAgICAgICBjb25zdCBvdXRPZkJvdW5kWm9uZXMgPSB6b25lcy5maWx0ZXIoKHpvbmUpID0+XG4gICAgICAgICAgWyd1bHgnLCAndWx5JywgJ2xyeCcsICdscnknXS5zb21lKChhdHRyKSA9PlxuICAgICAgICAgICAgaXNBdHRyT3V0T2ZCb3VuZHMoem9uZSwgYXR0ciksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgem9uZU1hcCA9IG5ldyBNYXAoXG4gICAgICAgICAgb3V0T2ZCb3VuZFpvbmVzLm1hcCgoem9uZSkgPT4gW3pvbmUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSwgem9uZV0pLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEZpbHRlciBvdXQgdGhlIG5ldW1lIGNvbXBvbmVudHMgYW5kIGRpdmxpbmVzIHRoYXQgaGF2ZSBhIHpvbmUgb3V0IG9mIGJvdW5kc1xuICAgICAgICBjb25zdCBnbHlwaHMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgIG1laS5xdWVyeVNlbGVjdG9yQWxsKCduYywgZGl2TGluZSwgY2xlZiwgYWNjaWQnKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgb3V0T2ZCb3VuZEdseXBocyA9IGdseXBocy5maWx0ZXIoKGdseXBoKSA9PiB7XG4gICAgICAgICAgaWYgKGdseXBoLmhhc0F0dHJpYnV0ZSgnZmFjcycpKSB7XG4gICAgICAgICAgICBjb25zdCBmYWNzSWQgPSBnbHlwaC5nZXRBdHRyaWJ1dGUoJ2ZhY3MnKS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiB6b25lTWFwLmhhcyhmYWNzSWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIG5vIG91dC1vZi1ib3VuZCBnbHlwaHMsIGFuZFxuICAgICAgICAvLyBleGl0LCBzaW5jZSBubyBlZGl0IG5lZWRzIHRvIGJlIG1hZGUuXG4gICAgICAgIGlmIChvdXRPZkJvdW5kR2x5cGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAnVGhlcmUgYXJlIG5vIG91dC1vZi1ib3VuZCBnbHlwaHMgdG8gcmVtb3ZlLicsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSByZW1vdmUgYWN0aW9ucyBhbmQgY2hhaW4gYWN0aW9uIHRvIHNlbmQgdG8gVmVyb3Zpb1xuICAgICAgICBjb25zdCByZW1vdmVBY3Rpb25zOiBFZGl0b3JBY3Rpb25bXSA9IG91dE9mQm91bmRHbHlwaHMubWFwKChnbHlwaCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgZWxlbWVudElkOiBnbHlwaC5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjaGFpbkFjdGlvbjogRWRpdG9yQWN0aW9uID0ge1xuICAgICAgICAgIGFjdGlvbjogJ2NoYWluJyxcbiAgICAgICAgICBwYXJhbTogcmVtb3ZlQWN0aW9ucyxcbiAgICAgICAgfTtcblxuICAgICAgICBuZW9uVmlldy5lZGl0KGNoYWluQWN0aW9uLCB1cmkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAgICdTdWNjZXNzZnVsbHkgcmVtb3ZlZCBvdXQtb2YtYm91bmRzIHN5bGxhYmxlcy4nLFxuICAgICAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAgICdGYWlsZWQgdG8gcmVtb3ZlIG91dC1vZi1ib3VuZCBzeWxsYWJsZXMuJyxcbiAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGRvY3VtZW50XG4gICAgLmdldEVsZW1lbnRCeUlkKCd1bnRvZ2dsZS1pbnZhbGlkLW9ibGlxdWUnKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVyaSA9IG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKTtcbiAgICAgIG5lb25WaWV3LmdldFBhZ2VNRUkodXJpKS50aGVuKChtZWlTdHJpbmcpID0+IHtcbiAgICAgICAgLy8gTG9hZCBNRUkgZG9jdW1lbnQgaW50byBwYXJzZXJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBtZWlEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKG1laVN0cmluZywgJ3RleHQveG1sJyk7XG4gICAgICAgIGNvbnN0IG1laSA9IG1laURvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG5jcyA9IEFycmF5LmZyb20obWVpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCduYycpKTtcblxuICAgICAgICBsZXQgaGFzSW52YWxpZE9ibGlxdWUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY2hhaW5BY3Rpb246IEVkaXRvckFjdGlvbiA9IHtcbiAgICAgICAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgICAgICAgcGFyYW06IFtdLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG4gICAgICAgIGxldCBuY0lkeCA9IDA7XG4gICAgICAgIHdoaWxlIChuY0lkeCA8IG5jcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAobmNzW25jSWR4XS5nZXRBdHRyaWJ1dGUoJ2xpZ2F0ZWQnKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAobmNJZHggPCBuY3MubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgICFuY3NbbmNJZHggKyAxXS5nZXRBdHRyaWJ1dGUoJ2xpZ2F0ZWQnKSkgfHxcbiAgICAgICAgICAgICAgbmNJZHggPT0gbmNzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBJZiBuYyBpcyBsaWdhdGVkLCBhbmQgdGhlIG5leHQgbmMgaXMgbm90XG4gICAgICAgICAgICAgIC8vIE9yLCBuYyBpcyBsaWdhdGVkLCBidXQgYWxyZWFkeSBhdCB0aGUgZW5kICh0aGVyZSBpcyBubyBuZXh0KVxcXG4gICAgICAgICAgICAgIGhhc0ludmFsaWRPYmxpcXVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiBuY3NbbmNJZHhdLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICAgICAgICBhdHRyVHlwZTogJ2xpZ2F0ZWQnLFxuICAgICAgICAgICAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5jSWR4ICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5jSWR4ICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhc0ludmFsaWRPYmxpcXVlKSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ05vIGludmFsaWQgb2JsaXF1ZXMgZm91bmQnLFxuICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhaW5BY3Rpb24ucGFyYW0gPSBwYXJhbTtcbiAgICAgICAgICBuZW9uVmlld1xuICAgICAgICAgICAgLmVkaXQoY2hhaW5BY3Rpb24sIG5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSlcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5xdWV1ZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICAgICdVbnRvZ2dsZWQgaW52YWxpZCBvYmxpcXVlcycsXG4gICAgICAgICAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHVudG9nZ2xlIGludmFsaWQgb2JsaXF1ZXMnLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5lb25WaWV3LnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnRcbiAgICAuZ2V0RWxlbWVudEJ5SWQoJ3VudG9nZ2xlLWludmFsaWQtc3lscycpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXJpID0gbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpO1xuICAgICAgbmVvblZpZXcuZ2V0UGFnZU1FSSh1cmkpLnRoZW4oKG1laVN0cmluZykgPT4ge1xuICAgICAgICAvLyBMb2FkIE1FSSBkb2N1bWVudCBpbnRvIHBhcnNlclxuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIGNvbnN0IG1laURvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobWVpU3RyaW5nLCAndGV4dC94bWwnKTtcbiAgICAgICAgY29uc3QgbWVpID0gbWVpRG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgY29uc3Qgc3lsbGFibGVzID0gQXJyYXkuZnJvbShtZWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N5bGxhYmxlJykpO1xuXG4gICAgICAgIGNvbnN0IGludmFsaWRTeWxsYWJsZXMgPSBnZXRJbnZhbGlkU3lsbGFibGVzKHN5bGxhYmxlcyk7XG5cbiAgICAgICAgaWYgKGludmFsaWRTeWxsYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgJ05vIGludmFsaWQgc3lsbGFibGVzIGZvdW5kJyxcbiAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNoYWluQWN0aW9uOiBFZGl0b3JBY3Rpb24gPSB7XG4gICAgICAgICAgICBhY3Rpb246ICdjaGFpbicsXG4gICAgICAgICAgICBwYXJhbTogW10sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBzeWxsYWJsZSBvZiBpbnZhbGlkU3lsbGFibGVzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgncHJlY2VkZXMnKSAmJlxuICAgICAgICAgICAgICBzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ2ZvbGxvd3MnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZWNlZGVzU3lsbGFibGUgPSBzeWxsYWJsZXMuZmluZChcbiAgICAgICAgICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSA9PT1cbiAgICAgICAgICAgICAgICAgIHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgncHJlY2VkZXMnKS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvbGxvd3NTeWxsYWJsZSA9IHN5bGxhYmxlcy5maW5kKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PVxuICAgICAgICAgICAgICAgICAgc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdmb2xsb3dzJykuc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogc3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICAgICAgIGF0dHJUeXBlOiAncHJlY2VkZXMnLFxuICAgICAgICAgICAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICAgICAgYXR0clR5cGU6ICdmb2xsb3dzJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogcHJlY2VkZXNTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICAgICAgYXR0clR5cGU6ICdmb2xsb3dzJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogZm9sbG93c1N5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgICAgICAgICBhdHRyVHlwZTogJ3ByZWNlZGVzJyxcbiAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcGFyYW0ucHVzaChcbiAgICAgICAgICAgICAgICAuLi5hZGRTeWxBY3Rpb24oW3N5bGxhYmxlLCBwcmVjZWRlc1N5bGxhYmxlLCBmb2xsb3dzU3lsbGFibGVdKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3lsbGFibGUuaGFzQXR0cmlidXRlKCdwcmVjZWRlcycpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZWNlZGVzU3lsbGFibGUgPSBzeWxsYWJsZXMuZmluZChcbiAgICAgICAgICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSA9PT1cbiAgICAgICAgICAgICAgICAgIHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgncHJlY2VkZXMnKS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgcGFyYW0ucHVzaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2V0JyxcbiAgICAgICAgICAgICAgICBwYXJhbToge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICAgICAgYXR0clR5cGU6ICdwcmVjZWRlcycsXG4gICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwYXJhbS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHByZWNlZGVzU3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICAgICAgIGF0dHJUeXBlOiAnZm9sbG93cycsXG4gICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwYXJhbS5wdXNoKC4uLmFkZFN5bEFjdGlvbihbc3lsbGFibGUsIHByZWNlZGVzU3lsbGFibGVdKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgnZm9sbG93cycpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvbGxvd3NTeWxsYWJsZSA9IHN5bGxhYmxlcy5maW5kKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PVxuICAgICAgICAgICAgICAgICAgc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdmb2xsb3dzJykuc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NldCcsXG4gICAgICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogc3lsbGFibGUuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSxcbiAgICAgICAgICAgICAgICAgIGF0dHJUeXBlOiAnZm9sbG93cycsXG4gICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwYXJhbS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdzZXQnLFxuICAgICAgICAgICAgICAgIHBhcmFtOiB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IGZvbGxvd3NTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpLFxuICAgICAgICAgICAgICAgICAgYXR0clR5cGU6ICdwcmVjZWRlcycsXG4gICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwYXJhbS5wdXNoKC4uLmFkZFN5bEFjdGlvbihbc3lsbGFibGUsIGZvbGxvd3NTeWxsYWJsZV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGFpbkFjdGlvbi5wYXJhbSA9IHBhcmFtO1xuICAgICAgICAgIG5lb25WaWV3XG4gICAgICAgICAgICAuZWRpdChjaGFpbkFjdGlvbiwgbmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAgICAgJ1VudG9nZ2xlZCBpbnZhbGlkIHN5bGxhYmxlcycsXG4gICAgICAgICAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oXG4gICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHVudG9nZ2xlIGludmFsaWQgc3lsbGFibGVzJyxcbiAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBcIlJldmVydFwiIGJ1dHRvbiBpbnNpZGUgXCJNRUkgQWN0aW9uc1wiIGRyb3Bkb3duXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZlcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoXG4gICAgICB3aW5kb3cuY29uZmlybShcbiAgICAgICAgJ1JldmVydGluZyB3aWxsIGNhdXNlIGFsbCBjaGFuZ2VzIHRvIGJlIGxvc3QuIFByZXNzIE9LIHRvIGNvbnRpbnVlLicsXG4gICAgICApXG4gICAgKSB7XG4gICAgICBuZW9uVmlldy5kZWxldGVEYigpLnRoZW4oKCkgPT4ge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qIFwiVklFV1wiIG1lbnUgKi9cblxuICAvKlxuXG4gIC8vIEV2ZW50IGxpc3RlbmVycyBmb3Igc2V0dGluZyBkZWZhdWx0IHpvb20gc2V0dGluZ3MgaW5zaWRlIFwiVmlld1wiIGRyb3Bkb3duXG4gIGNvbnN0IGZpdENvbnRlbnRCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjem9vbS1maXQtY29udGVudCcpO1xuICBjb25zdCBmaXRDb250ZW50Q2hlY2ttYXJrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pvb20tZml0LWNvbnRlbnQtaWNvbicpO1xuICBjb25zdCBlYXN5RWRpdEJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6b29tLWVhc3ktZWRpdCcpO1xuICBjb25zdCBlYXN5RWRpdENoZWNrbWFyayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6b29tLWVhc3ktZWRpdC1pY29uJyk7XG5cbiAgLy8gZml0IGNvbnRlbnQgbGlzdGVuZXJcbiAgZml0Q29udGVudEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBlYXN5RWRpdEJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJyk7XG4gICAgZml0Q29udGVudEJ0bi5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG5cbiAgICBlYXN5RWRpdENoZWNrbWFyay5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIGZpdENvbnRlbnRDaGVja21hcmsuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcblxuICAgIC8vIFRPRE86IFNhdmUgZGVmYXVsdCB6b29tIHNldHRpbmdzIGluIGxvY2FsIHN0b3JhZ2VcblxuICB9KTtcbiAgLy8gZWFzeSBlZGl0IGxpc3RlbmVyXG4gIGVhc3lFZGl0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGZpdENvbnRlbnRCdG4uY2xhc3NMaXN0LnJlbW92ZSgnY2hlY2tlZCcpO1xuICAgIGVhc3lFZGl0QnRuLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcblxuICAgIGZpdENvbnRlbnRDaGVja21hcmsuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICBlYXN5RWRpdENoZWNrbWFyay5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuXG4gICAgLy8gVE9ETzogU2F2ZSBkZWZhdWx0IHpvb20gc2V0dGluZ3MgaW4gbG9jYWwgc3RvcmFnZVxuXG4gIH0pO1xuICAqL1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHVuZG8vcmVkbyBwYW5lbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFVuZG9SZWRvUGFuZWwobmVvblZpZXc6IE5lb25WaWV3KTogdm9pZCB7XG4gIC8qKlxuICAgKiBUcmllcyB0byB1bmRvIGFuIGFjdGlvbiBhbmQgdXBkYXRlIHRoZSBwYWdlIGlmIGl0IHN1Y2NlZWRzLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5kb0hhbmRsZXIoKTogdm9pZCB7XG4gICAgbmVvblZpZXcudW5kbygpLnRoZW4oKHJlc3VsdDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdUaGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gdW5kby4nKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gdW5kbyBhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byByZWRvIGFuIGFjdGlvbiBhbmQgdXBkYXRlIHRoZSBwYWdlIGlmIGl0IHN1Y2NlZWRzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVkb0hhbmRsZXIoKTogdm9pZCB7XG4gICAgbmVvblZpZXcucmVkbygpLnRoZW4oKHJlc3VsdDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBuZW9uVmlldy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdUaGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVkby4nKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVkbyBhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bmRvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmRvSGFuZGxlcik7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICBpZiAoZXZ0LmtleSA9PT0gJ3onICYmIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSkpIHtcbiAgICAgIHVuZG9IYW5kbGVyKCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVkbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVkb0hhbmRsZXIpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZ0KSA9PiB7XG4gICAgaWYgKFxuICAgICAgKGV2dC5rZXkgPT09ICdaJyB8fCAoZXZ0LmtleSA9PT0gJ3onICYmIGV2dC5zaGlmdEtleSkpICYmXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gICAgKSB7XG4gICAgICByZWRvSGFuZGxlcigpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFN5bEFjdGlvbihzeWxsYWJsZXM6IEVsZW1lbnRbXSk6IEFycmF5PEVkaXRvckFjdGlvbj4ge1xuICBjb25zdCBwYXJhbSA9IG5ldyBBcnJheTxFZGl0b3JBY3Rpb24+KCk7XG5cbiAgZm9yIChjb25zdCBzeWxsYWJsZSBvZiBzeWxsYWJsZXMpIHtcbiAgICBpZiAoc3lsbGFibGUgJiYgIXN5bGxhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzeWwnKS5sZW5ndGgpIHtcbiAgICAgIHBhcmFtLnB1c2goe1xuICAgICAgICBhY3Rpb246ICdzZXRUZXh0JyxcbiAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICBlbGVtZW50SWQ6IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJyksXG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyYW07XG59XG5cbmZ1bmN0aW9uIGdldEludmFsaWRTeWxsYWJsZXMoc3lsbGFibGVzOiBFbGVtZW50W10pOiBFbGVtZW50W10ge1xuICBjb25zdCBpbnZhbGlkU3lsbGFibGVzOiBFbGVtZW50W10gPSBbXTtcbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgc3lsbGFibGVzLmxlbmd0aDsgaWR4KyspIHtcbiAgICBjb25zdCBzeWxsYWJsZSA9IHN5bGxhYmxlcy5hdChpZHgpO1xuICAgIGlmIChzeWxsYWJsZS5oYXNBdHRyaWJ1dGUoJ3ByZWNlZGVzJykpIHtcbiAgICAgIC8vIEdldCB4bWw6aWQgb2YgdGhlIG5leHQgc3lsbGFibGUgKHdpdGhvdXQgdGhlICMsIGlmIGl0IGV4aXN0cylcbiAgICAgIGNvbnN0IG5leHRTeWxsYWJsZUlkID0gc3lsbGFibGUuZ2V0QXR0cmlidXRlKCdwcmVjZWRlcycpLnJlcGxhY2UoJyMnLCAnJyk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIG5leHQgc3lsbGFibGUgYW5kIGl0cyBpbmRleCBpbiB0aGUgYXJyYXlcbiAgICAgIGxldCBuZXh0U3lsbGFibGVJZHg6IG51bWJlcjtcbiAgICAgIGNvbnN0IG5leHRTeWxsYWJsZSA9IHN5bGxhYmxlcy5maW5kKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4bWw6aWQnKSA9PT0gbmV4dFN5bGxhYmxlSWQpIHtcbiAgICAgICAgICBuZXh0U3lsbGFibGVJZHggPSBpZHg7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ29uZGl0aW9uIDE6IFRoZSBuZXh0IChmb2xsb3dpbmcpIHN5bGxhYmxlIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgaWYgKCFuZXh0U3lsbGFibGUpIHtcbiAgICAgICAgaW52YWxpZFN5bGxhYmxlcy5wdXNoKHN5bGxhYmxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uZGl0aW9uIDI6IFRoZSBuZXh0IHN5bGxhYmxlIGhhcyBiZWVuIGZvdW5kLCBidXQgdGhlIEBmb2xsb3dzIGF0dHJpYnV0ZSBkb2VzIE5PVCBFWElTVFxuICAgICAgaWYgKCFuZXh0U3lsbGFibGUuaGFzQXR0cmlidXRlKCdmb2xsb3dzJykpIHtcbiAgICAgICAgaW52YWxpZFN5bGxhYmxlcy5wdXNoKHN5bGxhYmxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uZGl0aW9uIDM6IFRoZSBuZXh0IHN5bGxhYmxlJ3MgQGZvbGxvd3MgYXR0cmlidXRlIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQgI2lkXG4gICAgICBpZiAoXG4gICAgICAgIG5leHRTeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ2ZvbGxvd3MnKSAhPVxuICAgICAgICAnIycgKyBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpXG4gICAgICApIHtcbiAgICAgICAgaW52YWxpZFN5bGxhYmxlcy5wdXNoKHN5bGxhYmxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uZGl0aW9uIDQ6XG4gICAgICAvLyBTaW5jZSB0aGUgQGZvbGxvd3MgdmFsdWUgaXMgY29ycmVjdCwgYSBwYWlyIG9mIHN5bGxhYmxlcyBleGlzdCBmb3IgdGhlIHRvZ2dsZS1saW5rZWQgc3lsbGFibGUuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgQGZvbGxvd3Mgc3lsbGFibGUgaXMgdGhlIG5leHQgc3lsbGFibGUgKGluZGV4LXdpc2UpIGluIHRoZSBhcnJheTpcbiAgICAgIGlmIChuZXh0U3lsbGFibGVJZHggIT09IGlkeCArIDEpIHtcbiAgICAgICAgaW52YWxpZFN5bGxhYmxlcy5wdXNoKHN5bGxhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgnZm9sbG93cycpKSB7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGVJZCA9IHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgnZm9sbG93cycpLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICBjb25zdCBwcmV2U3lsbGFibGUgPSBzeWxsYWJsZXMuZmluZChcbiAgICAgICAgKHN5bGxhYmxlKSA9PiBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ3htbDppZCcpID09PSBwcmV2U3lsbGFibGVJZCxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbmRpdGlvbiAxOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlKSB7XG4gICAgICAgIGludmFsaWRTeWxsYWJsZXMucHVzaChzeWxsYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbmRpdGlvbiAyOiBUaGUgcHJldmlvdXMgc3lsbGFibGUgZXhpc3RzLCBidXQgdGhlIEBwcmVjZWRlcyBhdHRyaWJ1dGUgZG9lcyBOT1QgRVhJU1RcbiAgICAgIGlmICghcHJldlN5bGxhYmxlLmhhc0F0dHJpYnV0ZSgncHJlY2VkZXMnKSkge1xuICAgICAgICBpbnZhbGlkU3lsbGFibGVzLnB1c2goc3lsbGFibGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25kaXRpb24gMzogVGhlIHByZXZpb3VzIHN5bGxhYmxlJ3MgQHByZWNlZGVzIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCBpdCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0ICNpZFxuICAgICAgaWYgKFxuICAgICAgICBwcmV2U3lsbGFibGUuZ2V0QXR0cmlidXRlKCdwcmVjZWRlcycpICE9XG4gICAgICAgICcjJyArIHN5bGxhYmxlLmdldEF0dHJpYnV0ZSgneG1sOmlkJylcbiAgICAgICkge1xuICAgICAgICBpbnZhbGlkU3lsbGFibGVzLnB1c2goc3lsbGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW52YWxpZFN5bGxhYmxlcztcbn1cbiIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi8uLi9zcmMvTmVvblZpZXcnO1xuaW1wb3J0IERpc3BsYXlQYW5lbCBmcm9tICcuLi8uLi9zcmMvRGlzcGxheVBhbmVsL0Rpc3BsYXlQYW5lbCc7XG5pbXBvcnQgRGl2YVZpZXcgZnJvbSAnLi4vLi4vc3JjL0RpdmFWaWV3JztcbmltcG9ydCBTaW5nbGVWaWV3IGZyb20gJy4uLy4uL3NyYy9TaW5nbGVWaWV3L1NpbmdsZVZpZXcnO1xuaW1wb3J0IERpdmFFZGl0IGZyb20gJy4uLy4uL3NyYy9TcXVhcmVFZGl0L0RpdmFFZGl0TW9kZSc7XG5pbXBvcnQgU2luZ2xlRWRpdE1vZGUgZnJvbSAnLi4vLi4vc3JjL1NxdWFyZUVkaXQvU2luZ2xlRWRpdE1vZGUnO1xuaW1wb3J0IEluZm9Nb2R1bGUgZnJvbSAnLi4vLi4vc3JjL0luZm9Nb2R1bGUnO1xuaW1wb3J0IFRleHRWaWV3IGZyb20gJy4uLy4uL3NyYy9UZXh0Vmlldyc7XG5pbXBvcnQgVGV4dEVkaXRNb2RlIGZyb20gJy4uLy4uL3NyYy9UZXh0RWRpdE1vZGUnO1xuaW1wb3J0IHsgTmVvblZpZXdQYXJhbXMgfSBmcm9tICcuLi8uLi9zcmMvSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBOZW9uTWFuaWZlc3QgfSBmcm9tICcuLi8uLi9zcmMvVHlwZXMnO1xuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XG5cbmNvbnN0IG5hbWUgPSBnZXRHZXRQYXJhbSgnbWFuaWZlc3QnKTtcbmNvbnN0IHN0b3JhZ2UgPSBnZXRHZXRQYXJhbSgnc3RvcmFnZScpO1xuXG5pZiAobmFtZSkge1xuICBjb25zdCBtYW5pZmVzdExvY2F0aW9uID0gYC4vc2FtcGxlcy9tYW5pZmVzdHMvJHtuYW1lfS5qc29ubGRgO1xuICB3aW5kb3cuZmV0Y2gobWFuaWZlc3RMb2NhdGlvbikudGhlbihyZXNwb25zZSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxuICB9KS50aGVuKGFzeW5jIHRleHQgPT4ge1xuICAgIGxldCBtYW5pZmVzdDogTmVvbk1hbmlmZXN0O1xuICAgIHRyeSB7XG4gICAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGNvbnNvbGUuZGVidWcodGV4dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIERldGVybWluZSBpZiBpdCBpcyBhIHNpbmdsZSBwYWdlIG9yIG11bHRpcGxlIGJ5IG1lZGlhIHR5cGVcbiAgICBjb25zdCBtZWRpYVR5cGU6IHN0cmluZyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdpbmRvdy5mZXRjaChtYW5pZmVzdC5pbWFnZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHJlc29sdmUoPHN0cmluZz5yZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxldCBwYXJhbXM6IE5lb25WaWV3UGFyYW1zO1xuICAgIGlmIChtZWRpYVR5cGUubWF0Y2goL2ltYWdlXFwvKi8pKSB7XG4gICAgICBwYXJhbXMgPSB7XG4gICAgICAgIG1hbmlmZXN0OiBtYW5pZmVzdCxcbiAgICAgICAgRGlzcGxheTogRGlzcGxheVBhbmVsLFxuICAgICAgICBJbmZvOiBJbmZvTW9kdWxlLFxuICAgICAgICBUZXh0VmlldzogVGV4dFZpZXcsXG4gICAgICAgIFRleHRFZGl0OiBUZXh0RWRpdE1vZGUsXG4gICAgICAgIFZpZXc6IFNpbmdsZVZpZXcsXG4gICAgICAgIE5ldW1lRWRpdDogU2luZ2xlRWRpdE1vZGVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgbWFuaWZlc3Q6IG1hbmlmZXN0LFxuICAgICAgICBEaXNwbGF5OiBEaXNwbGF5UGFuZWwsXG4gICAgICAgIEluZm86IEluZm9Nb2R1bGUsXG4gICAgICAgIFRleHRWaWV3OiBUZXh0VmlldyxcbiAgICAgICAgVGV4dEVkaXQ6IFRleHRFZGl0TW9kZSxcbiAgICAgICAgVmlldzogRGl2YVZpZXcsXG4gICAgICAgIE5ldW1lRWRpdDogRGl2YUVkaXRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmlldyA9IG5ldyBOZW9uVmlldyhwYXJhbXMpO1xuICAgIHZpZXcuc3RhcnQoKTtcbiAgfSk7XG59IGVsc2Uge1xuICBjb25zdCBkYiA9IG5ldyBQb3VjaERCKCdOZW9uLVVzZXItU3RvcmFnZScpO1xuICBkYi5nZXRBdHRhY2htZW50KHN0b3JhZ2UsICdtYW5pZmVzdCcpLnRoZW4oYmxvYiA9PiB7XG4gICAgcmV0dXJuIG5ldyB3aW5kb3cuUmVzcG9uc2UoYmxvYikuanNvbigpO1xuICB9KS50aGVuKGFzeW5jIG1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZWRpYVR5cGU6IHN0cmluZyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdpbmRvdy5mZXRjaChtYW5pZmVzdC5pbWFnZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHJlc29sdmUoPHN0cmluZz5yZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxldCBwYXJhbXM6IE5lb25WaWV3UGFyYW1zO1xuICAgIGlmIChtZWRpYVR5cGUubWF0Y2goL2ltYWdlXFwvKi8pKSB7XG4gICAgICBwYXJhbXMgPSB7XG4gICAgICAgIG1hbmlmZXN0OiBtYW5pZmVzdCxcbiAgICAgICAgRGlzcGxheTogRGlzcGxheVBhbmVsLFxuICAgICAgICBJbmZvOiBJbmZvTW9kdWxlLFxuICAgICAgICBUZXh0VmlldzogVGV4dFZpZXcsXG4gICAgICAgIFRleHRFZGl0OiBUZXh0RWRpdE1vZGUsXG4gICAgICAgIFZpZXc6IFNpbmdsZVZpZXcsXG4gICAgICAgIE5ldW1lRWRpdDogU2luZ2xlRWRpdE1vZGVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgbWFuaWZlc3Q6IG1hbmlmZXN0LFxuICAgICAgICBEaXNwbGF5OiBEaXNwbGF5UGFuZWwsXG4gICAgICAgIEluZm86IEluZm9Nb2R1bGUsXG4gICAgICAgIFRleHRWaWV3OiBUZXh0VmlldyxcbiAgICAgICAgVGV4dEVkaXQ6IFRleHRFZGl0TW9kZSxcbiAgICAgICAgVmlldzogRGl2YVZpZXcsXG4gICAgICAgIE5ldW1lRWRpdDogRGl2YUVkaXRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmlldyA9IG5ldyBOZW9uVmlldyhwYXJhbXMpO1xuICAgIHZpZXcuc3RhcnQoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEdldFBhcmFtKHBhcmFtTmFtZSk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQ7XG5cbiAgd2luZG93LmxvY2F0aW9uLnNlYXJjaFxuICAgIC5zdWJzdHIoMSlcbiAgICAuc3BsaXQoJyYnKVxuICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB0bXAgPSBpdGVtLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAodG1wWzBdID09PSBwYXJhbU5hbWUpIHtcbiAgICAgICAgcmVzdWx0ID0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcFsxXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgTmVvbkNvcmUgZnJvbSAnLi9OZW9uQ29yZSc7XG5pbXBvcnQgKiBhcyBWYWxpZGF0aW9uIGZyb20gJy4vVmFsaWRhdGlvbic7XG5pbXBvcnQgeyBwYXJzZU1hbmlmZXN0IH0gZnJvbSAnLi91dGlscy9OZW9uTWFuaWZlc3QnO1xuaW1wb3J0IHNldEJvZHkgZnJvbSAnLi91dGlscy90ZW1wbGF0ZS9UZW1wbGF0ZSc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvdyB9IGZyb20gJy4vdXRpbHMvTW9kYWxXaW5kb3cnO1xuaW1wb3J0IHsgTmVvbk1hbmlmZXN0LCBFZGl0b3JBY3Rpb24sIEF0dHJpYnV0ZXMsIFVzZXJUeXBlIH0gZnJvbSAnLi9UeXBlcyc7XG5pbXBvcnQge1xuICBJbmZvSW50ZXJmYWNlLFxuICBNb2RhbFdpbmRvd0ludGVyZmFjZSxcbiAgTmVvblZpZXdQYXJhbXMsXG4gIE5ldW1lRWRpdEludGVyZmFjZSxcbiAgVGV4dEVkaXRJbnRlcmZhY2UsXG4gIFRleHRWaWV3SW50ZXJmYWNlLFxuICBWaWV3SW50ZXJmYWNlXG59IGZyb20gJy4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBzZXREZWJ1Z01vZGUgfSBmcm9tICcuL3V0aWxzL0RlYnVnTW9kZSc7XG5pbXBvcnQgeyBzZXRTYXZlZFN0YXR1cywgbGlzdGVuVW5zYXZlZENoYW5nZXMgfSBmcm9tICcuL3V0aWxzL1Vuc2F2ZWQnO1xuaW1wb3J0IExvY2FsU2V0dGluZ3MsIHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3V0aWxzL0xvY2FsU2V0dGluZ3MnO1xuXG5cbi8qKlxuICogTmVvblZpZXcgY2xhc3MuIE1hbmFnZXMgdGhlIG90aGVyIG1vZHVsZXMgb2YgTmVvbiBhbmQgY29tbXVuaWNhdGVzIHdpdGhcbiAqIE5lb25Db3JlLlxuICovXG5jbGFzcyBOZW9uVmlldyB7XG4gIC8qKiBUaGUgbWFuaWZlc3QgZGVzY3JpYmluZyB3aGF0IHRvIGxvYWQgYW5kIHdoZXJlIHRvIGZpbmQgaXQuICovXG4gIG1hbmlmZXN0OiBOZW9uTWFuaWZlc3Q7XG4gIC8qKiBNb2R1bGUgdGhhdCBkaXNwbGF5cyByZW5kZXJlZCBNRUkuICovXG4gIHZpZXc6IFZpZXdJbnRlcmZhY2U7XG4gIC8qKiBOYW1lIG9mIHRoZSBkb2N1bWVudCBsb2FkZWQuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIE1vZHVsZSB0aGF0IGhhbmRsZXMgbWFuYWdpbmcgcmVzb3VyY2VzLCByZW5kZXJpbmcgU1ZHcy4gKi9cbiAgY29yZTogTmVvbkNvcmU7XG4gIC8qKiBNb2R1bGUgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIG11c2ljYWwgZWxlbWVudHMuICovXG4gIGluZm86IEluZm9JbnRlcmZhY2U7XG4gIC8qKiBNb2R1bGUgdGhhdCBhbGxvd3MgZWRpdGluZyBvZiBtdXNpY2FsIGVsZW1lbnRzLiAqL1xuICBOZXVtZUVkaXQ6IE5ldW1lRWRpdEludGVyZmFjZTtcbiAgLyoqIE1vZHVsZSB0aGF0IGFsbG93cyB2aWV3aW5nIG9mIHN5bGxhYmxlIHRleHQuICovXG4gIHRleHRWaWV3OiBUZXh0Vmlld0ludGVyZmFjZTtcbiAgLyoqIE1vZHVsZSB0aGF0IGFsbG93cyBlZGl0aW5nIG9mIHN5bGxhYmxlIHRleHQuICovXG4gIFRleHRFZGl0OiBUZXh0RWRpdEludGVyZmFjZTtcbiAgLyoqIE1vZHVsZSB0aGF0IGNvbnRyb2xzIHN0YXRlIGFuZCBjb250ZW50IG9mIE5lb24gbW9kYWwgd2luZG93cyAqL1xuICBtb2RhbDogTW9kYWxXaW5kb3dJbnRlcmZhY2U7XG4gIC8qKiBNb2R1bGUgdGhhdCBoYW5kbGVzIHVzZXIncyBzZXR0aW5ncyBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlICovXG4gIGxvY2FsU2V0dGluZ3M6IExvY2FsU2V0dGluZ3M7XG5cbiAgcGFyYW1zOiBOZW9uVmlld1BhcmFtcztcblxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgTmVvblZpZXcuIFNldHMgbW9kZSBhbmQgcGFzc2VzIGNvbnN0cnVjdG9ycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChwYXJhbXM6IE5lb25WaWV3UGFyYW1zKSB7XG4gICAgaWYgKCFwYXJzZU1hbmlmZXN0KHBhcmFtcy5tYW5pZmVzdCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBwYXJzZSB0aGUgbWFuaWZlc3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLm1hbmlmZXN0ID0gcGFyYW1zLm1hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBOZW9uIGZvciBhbnkgcHJvdmlkZWQgZWRpdGluZyBtb2R1bGVzLlxuICAgKi9cbiAgc2V0dXBFZGl0KHBhcmFtczogTmVvblZpZXdQYXJhbXMpOiB2b2lkIHtcbiAgICAvLyBTZXQgdXAgYW5kIHN0YXJ0IHRoZSBjb3JyZWN0IGVkaXRpbmcgbW9kZVxuICAgIGlmIChwYXJhbXMuVGV4dFZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50ZXh0VmlldyA9IG5ldyBwYXJhbXMuVGV4dFZpZXcodGhpcyk7XG4gICAgICBpZiAocGFyYW1zLlRleHRFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5UZXh0RWRpdCA9IG5ldyBwYXJhbXMuVGV4dEVkaXQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMuTmV1bWVFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuTmV1bWVFZGl0ID0gbmV3IHBhcmFtcy5OZXVtZUVkaXQodGhpcyk7XG4gICAgICB0aGlzLnRleHRWaWV3LnVwZGF0ZUJCb3hWaXNpYmlsaXR5KCk7XG4gICAgICBjb25zdCB7IHVzZXJNb2RlLCBpbnNlcnRNb2RlLCBzZWxlY3Rpb25Nb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5zZXJ0TW9kZSkuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxlY3Rpb25Nb2RlKS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIHN3aXRjaCAodXNlck1vZGUpIHtcbiAgICAgICAgY2FzZSAnaW5zZXJ0JzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnNlcnRNb2RlKS5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxlY3Rpb25Nb2RlKS5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBOZW9uXG4gICAqL1xuICBzdGFydCAoKTogdm9pZCB7XG4gICAgLyogdGhpcy5jb3JlLmRiLmluZm8oKS50aGVuKChpbmZvKSA9PiB7XG4gICAgICBpZiAoaW5mby5kb2NfY291bnQgPT09IDApIHtcbiAgICAgICAgdGhpcy5jb3JlLmluaXREYigpLnRoZW4oKCkgPT4geyB0aGlzLnVwZGF0ZUZvckN1cnJlbnRQYWdlKCk7IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTm90aWZpY2F0aW9uLnF1ZXVlTm90aWZpY2F0aW9uKCdFeGlzdGluZyBkYXRhYmFzZSBmb3VuZC4gUmV2ZXJ0IHRvIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZy4nKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JDdXJyZW50UGFnZSgpO1xuICAgICAgfVxuICAgIH0pOyAqL1xuICAgIHNldEJvZHkodGhpcykudGhlbigoKSA9PiB7XG4gICAgICAvLyBsb2FkIHRoZSBjb21wb25lbnRzXG4gICAgICB0aGlzLmxvY2FsU2V0dGluZ3MgPSBuZXcgTG9jYWxTZXR0aW5ncyh0aGlzLm1hbmlmZXN0WydAaWQnXSk7XG4gICAgICB0aGlzLnZpZXcgPSBuZXcgdGhpcy5wYXJhbXMuVmlldyh0aGlzLCB0aGlzLnBhcmFtcy5EaXNwbGF5LCB0aGlzLm1hbmlmZXN0LmltYWdlKTtcbiAgICAgIHRoaXMubmFtZSA9IHRoaXMubWFuaWZlc3QudGl0bGU7XG4gICAgICB0aGlzLmNvcmUgPSBuZXcgTmVvbkNvcmUodGhpcy5tYW5pZmVzdCk7XG4gICAgICB0aGlzLmluZm8gPSBuZXcgdGhpcy5wYXJhbXMuSW5mbyh0aGlzKTtcbiAgICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWxXaW5kb3codGhpcyk7XG4gICAgICBWYWxpZGF0aW9uLmluaXQodGhpcyk7IC8vIGluaXRpYWxpemUgdmFsaWRhdGlvblxuICAgICAgc2V0RGVidWdNb2RlKCk7IFxuICAgICAgbGlzdGVuVW5zYXZlZENoYW5nZXMoKTtcblxuICAgICAgdGhpcy5zZXR1cEVkaXQodGhpcy5wYXJhbXMpO1xuICAgICAgcmV0dXJuIHRoaXMuY29yZS5pbml0RGIoKTtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGxvYWQgdGhlIFNWR1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRm9yQ3VycmVudFBhZ2UodHJ1ZSk7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAvLyBhZGQgdGhlIGV2ZW50IGxpc3RlbmVycyBkZXBlbmRlbnQgb24gdGhlIFNWR1xuICAgICAgdGhpcy52aWV3Lm9uU1ZHTG9hZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlIGZyb20gdGhlIGxvYWRlZCB2aWV3IGFuZCB0aGVuIGRpc3BsYXkgdGhlXG4gICAqIG1vc3QgdXAgdG8gZGF0ZSBTVkcuXG4gICAqL1xuICB1cGRhdGVGb3JDdXJyZW50UGFnZSAoZGVsYXkgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhZ2VObyA9IHRoaXMudmlldy5nZXRDdXJyZW50UGFnZSgpO1xuICAgIHJldHVybiB0aGlzLnZpZXcuY2hhbmdlUGFnZShwYWdlTm8sIGRlbGF5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRvIGFuIGFjdGlvbiBwZXJmb3JtZWQgb24gdGhlIGN1cnJlbnQgcGFnZSAoaWYgdGhlcmUgaXMgb25lKS5cbiAgICovXG4gIHJlZG8gKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHNldFNhdmVkU3RhdHVzKGZhbHNlKTtcbiAgICByZXR1cm4gdGhpcy5jb3JlLnJlZG8odGhpcy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZG8gdGhlIGxhc3QgYWN0aW9uIHBlcmZvcm1lZCBvbiB0aGUgY3VycmVudCBwYWdlIChpZiB0aGVyZSBpcyBvbmUpLlxuICAgKi9cbiAgdW5kbyAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgc2V0U2F2ZWRTdGF0dXMoZmFsc2UpO1xuICAgIHJldHVybiB0aGlzLmNvcmUudW5kbyh0aGlzLnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb2RlIE5lb24gaXMgaW4uXG4gICAqIEByZXR1cm5zIFZhbHVlIGlzIFwidmlld2VyXCIsIFwiaW5zZXJ0XCIsIG9yIFwiZWRpdFwiLlxuICAgKi9cbiAgZ2V0VXNlck1vZGUgKCk6IFVzZXJUeXBlIHtcbiAgICBjb25zdCB7IHVzZXJNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgIHJldHVybiB1c2VyTW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHBlcmZvcm0gYW4gZWRpdG9yIGFjdGlvbi5cbiAgICogQHBhcmFtIGFjdGlvbiAtIFRoZSBlZGl0b3IgdG9vbGtpdCBhY3Rpb24gb2JqZWN0LlxuICAgKiBAcGFyYW0gcGFnZVVSSSAtIFRoZSBVUkkgb2YgdGhlIHBhZ2UgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9uXG4gICAqL1xuICBlZGl0IChhY3Rpb246IEVkaXRvckFjdGlvbiwgcGFnZVVSSTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5lZGl0KGFjdGlvbiwgcGFnZVVSSSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIG11c2ljYWwgZWxlbWVudC5cbiAgICogQHBhcmFtIGVsZW1lbnRJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG11c2ljYWwgZWxlbWVudC5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBwYWdlIHRoZSBlbGVtZW50IGlzIGZvdW5kIG9uLlxuICAgKi9cbiAgZ2V0RWxlbWVudEF0dHIgKGVsZW1lbnRJRDogc3RyaW5nLCBwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPEF0dHJpYnV0ZXM+IHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmdldEVsZW1lbnRBdHRyKGVsZW1lbnRJRCwgcGFnZVVSSSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBicm93c2VyIGRhdGFiYXNlIGFuZCBjcmVhdGVzIEpTT04tTEQgc2F2ZSBmaWxlLlxuICAgKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlLlxuICAgKi9cbiAgZXhwb3J0ICgpOiBQcm9taXNlPHN0cmluZyB8IEFycmF5QnVmZmVyPiB7XG4gICAgcmV0dXJuIChuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmNvcmUudXBkYXRlRGF0YWJhc2UoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5tYW5pZmVzdFsnbWVpX2Fubm90YXRpb25zJ10gPSB0aGlzLmNvcmUuZ2V0QW5ub3RhdGlvbnMoKTtcbiAgICAgICAgdGhpcy5tYW5pZmVzdC50aW1lc3RhbXAgPSAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyB3aW5kb3cuQmxvYihbSlNPTi5zdHJpbmdpZnkodGhpcy5tYW5pZmVzdCwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9sZCtqc29uJyB9KTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KGVycik7IH0pO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjdXJyZW50IHN0YXRlIHRvIHRoZSBicm93c2VyIGRhdGFiYXNlLlxuICAgKi9cbiAgc2F2ZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc2V0U2F2ZWRTdGF0dXModHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMuY29yZS51cGRhdGVEYXRhYmFzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGxvY2FsIGRhdGFiYXNlIG9mIHRoZSBsb2FkZWQgTUVJIGZpbGUocykuXG4gICAqL1xuICBkZWxldGVEYiAoKTogUHJvbWlzZTx2b2lkW10+IHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmRlbGV0ZURiKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwYWdlJ3MgTUVJIGZpbGUgZW5jb2RlZCBhcyBhIGRhdGEgVVJJLlxuICAgKiBAcGFyYW0gcGFnZU5vIC0gVGhlIFVSSSBzcGVjaWZ5aW5nIHRoZSBwYWdlLlxuICAgKiBAcmV0dXJucyBBIFtEYXRhIFVSSV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0YV9VUklfc2NoZW1lKS5cbiAgICovXG4gIGdldFBhZ2VVUkkgKHBhZ2VObz86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHBhZ2VObyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlTm8gPSB0aGlzLnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmNvcmUuZ2V0TUVJKHBhZ2VObykudGhlbigobWVpKSA9PiB7XG4gICAgICAgIHJlc29sdmUoJ2RhdGE6YXBwbGljYXRpb24vbWVpK3htbDtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQobWVpKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBhZ2UncyBNRUkgZmlsZSBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIHBhZ2VObyAtIFRoZSBpZGVudGlmeWluZyBVUkkgb2YgdGhlIHBhZ2UuXG4gICAqL1xuICBnZXRQYWdlTUVJIChwYWdlTm86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRNRUkocGFnZU5vKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBhZ2UncyBTVkcuXG4gICAqIEBwYXJhbSBwYWdlTm8gLSBUaGUgaWRlbnRpZnlpbmcgVVJJIG9mIHRoZSBwYWdlLlxuICAgKi9cbiAgZ2V0UGFnZVNWRyAocGFnZU5vOiBzdHJpbmcpOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmdldFNWRyhwYWdlTm8pO1xuICB9XG59XG5cbmV4cG9ydCB7IE5lb25WaWV3IGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IGNoZWNrT3V0T2ZCb3VuZHNHbHlwaHMsIGNvbnZlcnRUb1Zlcm92aW8sIHJlbW92ZUNvbHVtbkxhYmVsIH0gZnJvbSAnLi91dGlscy9Db252ZXJ0TWVpJztcbmltcG9ydCAqIGFzIFZhbGlkYXRpb24gZnJvbSAnLi9WYWxpZGF0aW9uJztcbmltcG9ydCBWZXJvdmlvV3JhcHBlciBmcm9tICcuL1Zlcm92aW9XcmFwcGVyJztcbmltcG9ydCB7IFdlYkFubm90YXRpb24sIEF0dHJpYnV0ZXMsIEVkaXRvckFjdGlvbiwgTmVvbk1hbmlmZXN0LCBWZXJvdmlvTWVzc2FnZSB9IGZyb20gJy4vVHlwZXMnO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSAnLi91dGlscy9yYW5kb20nO1xuXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcbmltcG9ydCB7IHNldFNhdmVkU3RhdHVzIH0gZnJvbSAnLi91dGlscy9VbnNhdmVkJztcblxuLyoqXG4gKiBBIGNhY2hlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGhhcyBoYXBwZW5lZFxuICogYWNyb3NzIG11bHRpcGxlIHBhZ2VzIGluIGEgbWFudXNjcmlwdCB3aXRob3V0IGhhdmluZ1xuICogdG8gbWFrZSBtYW55IGNhbGxzIHRvIHRoZSBQb3VjaGhEYiBkYXRhYmFzZS5cbiAqL1xuaW50ZXJmYWNlIENhY2hlRW50cnkge1xuICBkaXJ0eTogYm9vbGVhbjtcbiAgbWVpOiBzdHJpbmc7XG4gIHN2ZzogU1ZHU1ZHRWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGUgY29yZSBjb21wb25lbnQgb2YgTmVvbi4gVGhpcyBtYW5hZ2VzIHRoZSBkYXRhYmFzZSxcbiAqIHRoZSB2ZXJvdmlvIHRvb2xraXQsIHRoZSBjYWNoZSwgYW5kIHVuZG8vcmVkbyBzdGFja3MuXG4gKi9cbmNsYXNzIE5lb25Db3JlIHtcbiAgLyoqIFdyYXBwZXIgZm9yIHRoZSBWZXJvdmlvIFdlYldvcmtlci4gKi9cbiAgcHJpdmF0ZSB2ZXJvdmlvV3JhcHBlcjogVmVyb3Zpb1dyYXBwZXI7XG4gIC8qKiBTdGFja3Mgb2YgYWN0aW9ucyB0aGF0IGNhbiBiZSB1bmRvbmUgcGVyIHBhZ2UuICovXG4gIHByaXZhdGUgdW5kb1N0YWNrczogTWFwPHN0cmluZywgc3RyaW5nW10+O1xuICAvKiogU3RhY2tzIG9mIGFjdGlvbnMgdGhhdCBjYW4gYmUgcmVkb25lIHBlciBwYWdlLiAqL1xuICBwcml2YXRlIHJlZG9TdGFja3M6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIENhY2hlIGNvbnRhaW5pbmcgZW50cmllcyBmb3IgZWFjaCBwYWdlLiAqL1xuICBwcml2YXRlIG5lb25DYWNoZTogTWFwPHN0cmluZywgQ2FjaGVFbnRyeT47XG4gIHByaXZhdGUgZGI6IFBvdWNoREIuRGF0YWJhc2U7XG4gIHByaXZhdGUgcGFyc2VyOiBET01QYXJzZXI7XG4gIC8qKiBQYWdlcyBrbm93biBub3QgdG8gaGF2ZSBhbnkgYXNzb2NpYXRlZCBNRUkuICovXG4gIHByaXZhdGUgYmxhbmtQYWdlczogQXJyYXk8c3RyaW5nPjtcbiAgLyoqIEEgY29sbGVjdGlvbiBvZiBXMyBXZWIgQW5ub3RhdGlvbnMuICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbnM6IFdlYkFubm90YXRpb25bXTtcbiAgcHJpdmF0ZSBtYW5pZmVzdDogTmVvbk1hbmlmZXN0O1xuICBwcml2YXRlIGxhc3RQYWdlTG9hZGVkOiBzdHJpbmc7XG5cbiAgZ2V0QW5ub3RhdGlvbnMgKCk6IFdlYkFubm90YXRpb25bXSB7IHJldHVybiB0aGlzLmFubm90YXRpb25zOyB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBOZW9uQ29yZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKG1hbmlmZXN0OiBOZW9uTWFuaWZlc3QpIHtcbiAgICB0aGlzLnZlcm92aW9XcmFwcGVyID0gbmV3IFZlcm92aW9XcmFwcGVyKCk7XG4gICAgLy9WYWxpZGF0aW9uLmluaXQoKTtcblxuICAgIC8qKlxuICAgICAqIFN0YWNrcyBvZiBwcmV2aW91cyBNRUkgZmlsZXMgcmVwcmVzZW50aW5nIGFjdGlvbnMgdGhhdCBjYW4gYmUgdW5kb25lIGZvciBlYWNoIHBhZ2UuXG4gICAgICogQHR5cGUge01hcC48c3RyaW5nLCBBcnJheS48c3RyaW5nPj59XG4gICAgICovXG4gICAgdGhpcy51bmRvU3RhY2tzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG4gICAgLyoqXG4gICAgICogU3RhY2tzIG9mIHByZXZpb3VzIE1FSSBmaWxlcyByZXByZXNlbnRpbmcgYWN0aW9ucyB0aGF0IGNhbiBiZSByZWRvbmUgZm9yIGVhY2ggcGFnZS5cbiAgICAgKiBAdHlwZSB7TWFwLjxzdHJpbmcsIEFycmF5LjxzdHJpbmc+Pn1cbiAgICAgKi9cbiAgICB0aGlzLnJlZG9TdGFja3MgPSBuZXcgTWFwKCk7XG5cbiAgICB0aGlzLm5lb25DYWNoZSA9IG5ldyBNYXAoKTtcblxuICAgIHRoaXMucGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXG4gICAgdGhpcy5kYiA9IG5ldyBQb3VjaERCKCdOZW9uJyk7XG5cbiAgICB0aGlzLmJsYW5rUGFnZXMgPSBbXTtcblxuICAgIC8vIEFkZCBlYWNoIE1FSSB0byB0aGUgZGF0YWJhc2VcbiAgICB0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgdGhpcy5hbm5vdGF0aW9ucyA9IG1hbmlmZXN0Lm1laV9hbm5vdGF0aW9ucztcbiAgICB0aGlzLmxhc3RQYWdlTG9hZGVkID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgUG91Y2hEYiBkYXRhYmFzZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbWFuaWZlc3QuXG4gICAqIElmIGEgbmV3ZXIgdmVyc2lvbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UsIHRoaXMgd2lsbFxuICAgKiBub3QgdXBkYXRlIHRoZSBkYXRhYmFzZSB1bmxlc3MgZm9yY2VkLlxuICAgKiBAcGFyYW0gZm9yY2UgLSBJZiBhIGRhdGFiYXNlIHVwZGF0ZSBzaG91bGQgYmUgZm9yY2VkLlxuICAgKi9cbiAgYXN5bmMgaW5pdERiIChmb3JjZSA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIG1hbmlmZXN0XG4gICAgdHlwZSBEYkFubm90YXRpb24gPSBQb3VjaERCLkNvcmUuSWRNZXRhICYgUG91Y2hEQi5Db3JlLkdldE1ldGEgJiBXZWJBbm5vdGF0aW9uO1xuICAgIHR5cGUgRG9jID0gUG91Y2hEQi5Db3JlLklkTWV0YSAmIFBvdWNoREIuQ29yZS5HZXRNZXRhICYgeyB0aW1lc3RhbXA6IHN0cmluZzsgYW5ub3RhdGlvbnM6IHN0cmluZ1tdfTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuZGIuZ2V0KHRoaXMubWFuaWZlc3RbJ0BpZCddKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdub3RfZm91bmQnKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBkb2N1bWVudC5cbiAgICAgICAgICBjb25zdCBkb2MgPSB7XG4gICAgICAgICAgICBfaWQ6IHRoaXMubWFuaWZlc3RbJ0BpZCddLFxuICAgICAgICAgICAgdGltZXN0YW1wOiB0aGlzLm1hbmlmZXN0LnRpbWVzdGFtcCxcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLm1hbmlmZXN0LmltYWdlLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMubWFuaWZlc3QudGl0bGUsXG4gICAgICAgICAgICBhbm5vdGF0aW9uczogW11cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMuZm9yRWFjaChhbm5vdGF0aW9uID0+IHtcbiAgICAgICAgICAgIGRvYy5hbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24uaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBkb2M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSkudGhlbihhc3luYyAoZG9jOiBEb2MpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZG9jIHRpbWVzdGFtcCBpcyBuZXdlciB0aGFuIG1hbmlmZXN0XG4gICAgICAgIGNvbnN0IGRvY1RpbWUgPSAobmV3IERhdGUoZG9jLnRpbWVzdGFtcCkpLmdldFRpbWUoKTtcbiAgICAgICAgLy8gRm9ybWF0IHRpbWVzdGFtcCB0byBzcGVjaWZpYyBJU08gODYwMSB2YXJpYW50IGJlY2F1c2VcbiAgICAgICAgLy8gU2FmYXJpIHJlcXVpcmVzIHRpbWV6b25lIG9mZnNldHMgdG8gYmUgKy8tSEg6TU0gYW5kIGZhaWxzIG9uXG4gICAgICAgIC8vIHRoZSBlcXVhbGx5IHZhbGlkICsvLUhITU0uIFRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIGFwcGxpZWQgdG9cbiAgICAgICAgLy8gdGhlIGJyb3dzZXIgZ2VuZXJhdGVkIHRpbWVzdGFtcCBzaW5jZSB0aGF0IGFsd2F5cyBnZW5lcmF0ZXMgYVxuICAgICAgICAvLyB0aW1lc3RhbXAgaW4gVVRDIHdpdGggdGhlIFogZW5kaW5nLlxuICAgICAgICBjb25zdCB0aW1lWm9uZVJlZ2V4cCA9IC8oLitbLStcXHUyMjEyXVxcZFxcZCkoXFxkXFxkKSQvO1xuICAgICAgICBjb25zdCBtYW5UaW1lID0gKHRpbWVab25lUmVnZXhwLnRlc3QodGhpcy5tYW5pZmVzdC50aW1lc3RhbXApKSA/XG4gICAgICAgICAgKG5ldyBEYXRlKHRoaXMubWFuaWZlc3QudGltZXN0YW1wLnJlcGxhY2UodGltZVpvbmVSZWdleHAsICckMTokMicpKSkuZ2V0VGltZSgpXG4gICAgICAgICAgOiAobmV3IERhdGUodGhpcy5tYW5pZmVzdC50aW1lc3RhbXApKS5nZXRUaW1lKCk7XG4gICAgICAgIGlmIChkb2NUaW1lID4gbWFuVGltZSkge1xuICAgICAgICAgIGlmICghZm9yY2UpIHtcbiAgICAgICAgICAgIC8vIEZpbGwgYW5ub3RhdGlvbnMgbGlzdCB3aXRoIGRiIGFubm90YXRpb25zXG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25zID0gW107XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IGRvYy5hbm5vdGF0aW9ucy5tYXAoKGlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRiLmdldChpZCkudGhlbigoYW5ub3RhdGlvbjogRGJBbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpZDogYW5ub3RhdGlvbi5faWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYW5ub3RhdGlvbi5ib2R5LFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGFubm90YXRpb24udGFyZ2V0XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHJlcygnJyk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgIHJlcygnJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiB0aGlzLmFubm90YXRpb25zKSB7XG4gICAgICAgICAgLy8gQWRkIGFubm90YXRpb25zIHRvIGRhdGFiYXNlXG4gICAgICAgICAgYXdhaXQgdGhpcy5kYi5nZXQoYW5ub3RhdGlvbi5pZCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ25vdF9mb3VuZCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfaWQ6IGFubm90YXRpb24uaWRcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLnRoZW4oKG5ld0Fubm90YXRpb246IERiQW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgbmV3QW5ub3RhdGlvbi5ib2R5ID0gYW5ub3RhdGlvbi5ib2R5O1xuICAgICAgICAgICAgbmV3QW5ub3RhdGlvbi50YXJnZXQgPSBhbm5vdGF0aW9uLnRhcmdldDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRiLnB1dChuZXdBbm5vdGF0aW9uKTtcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGIucHV0KGRvYyk7XG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHBhZ2UgaW50byB0aGUgdmVyb3ZpbyB0b29sa2l0LiBUaGlzIHdpbGwgZmV0Y2ggdGhlXG4gICAqIHBhZ2UgZnJvbSB0aGUgY2FjaGUgb3IgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBwYWdlVVJJIC0gVGhlIFVSSSBvZiB0aGUgc2VsZWN0ZWQgcGFnZS5cbiAgICovXG4gIGxvYWRQYWdlIChwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlRW50cnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgLy8gV2FzIHRoaXMgYWxyZWFkeSB0aGUgbG9hZGVkIHBhZ2U/XG4gICAgICBpZiAodGhpcy5sYXN0UGFnZUxvYWRlZCA9PT0gcGFnZVVSSSAmJiB0aGlzLm5lb25DYWNoZS5oYXMocGFnZVVSSSkpIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLm5lb25DYWNoZS5nZXQocGFnZVVSSSkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm5lb25DYWNoZS5oYXMocGFnZVVSSSkpIHtcbiAgICAgICAgdGhpcy5sb2FkRGF0YShwYWdlVVJJLCB0aGlzLm5lb25DYWNoZS5nZXQocGFnZVVSSSkubWVpKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMubmVvbkNhY2hlLmdldChwYWdlVVJJKSk7XG4gICAgICAgIH0pO1xuICAgICAgLy8gRG8gd2Uga25vdyB0aGlzIHBhZ2UgaGFzIG5vIE1FSSBjb250ZW50P1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmJsYW5rUGFnZXMuaW5jbHVkZXMocGFnZVVSSSkpIHtcbiAgICAgICAgVmFsaWRhdGlvbi5ibGFua1BhZ2UoKTtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBFcnJvcignTm8gTUVJIGZpbGUgZm9yIHBhZ2UgJyArIHBhZ2VVUkkpO1xuICAgICAgICBlLm5hbWUgPSAnbWlzc2luZ19tZWknO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGaW5kIGFubm90YXRpb25cbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IHRoaXMuYW5ub3RhdGlvbnMuZmluZChlbGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gZWxlbS50YXJnZXQgPT09IHBhZ2VVUkk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbikge1xuICAgICAgICAgIHdpbmRvdy5mZXRjaChhbm5vdGF0aW9uLmJvZHkpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBNRUkgZmlsZSBpcyBzYi1iYXNlZC4gSWYgc28sIGNvbnZlcnQgdG8gc3RhZmYtYmFzZWQuXG4gICAgICAgICAgICBpZiAoIS88c2VjdGlvblxcYltePl0qXFxidHlwZT1cIm5lb24tbmV1bWUtbGluZVwiW14+XSo+Ly50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBjb252ZXJ0VG9WZXJvdmlvKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGVja091dE9mQm91bmRzR2x5cGhzKGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5sb2FkRGF0YShwYWdlVVJJLCBkYXRhKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLm5lb25DYWNoZS5nZXQocGFnZVVSSSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vIGFubm90YXRpb24gd2FzIGZvdW5kIHRyZWF0IHRoZSBwYWdlIGFzXG4gICAgICAgICAgLy8gYmVpbmcgYmxhbmtcbiAgICAgICAgICBWYWxpZGF0aW9uLmJsYW5rUGFnZSgpO1xuICAgICAgICAgIHRoaXMuYmxhbmtQYWdlcy5wdXNoKHBhZ2VVUkkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBkYXRhIGludG8gdGhlIHZlcm92aW8gdG9vbGtpdCBhbmQgdXBkYXRlIHRoZSBjYWNoZS5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBwYWdlLlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBNRUkgb2YgdGhlIHBhZ2UgYXMgYSBzdHJpbmcuXG4gICAqIEBwYXJhbSBkaXJ0eSAtIElmIHRoZSBjYWNoZSBlbnRyeSBzaG91bGQgYmUgbWFya2VkIGFzIGRpcnR5LlxuICAgKi9cbiAgbG9hZERhdGEgKHBhZ2VVUkk6IHN0cmluZywgZGF0YTogc3RyaW5nLCBkaXJ0eSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgVmFsaWRhdGlvbi5zZW5kRm9yVmFsaWRhdGlvbihyZW1vdmVDb2x1bW5MYWJlbChkYXRhKSk7XG4gICAgdGhpcy5sYXN0UGFnZUxvYWRlZCA9IHBhZ2VVUkk7XG4gICAgLyogQSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCByZXNvbHZlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvbi5cbiAgICAgKiBIb3dldmVyIHRoZSB2YWx1ZSB0aGF0IGlzIG11c3QgcmV0dXJuIGNvbWVzIGZyb20gdGhlIFdlYiBXb3JrZXIgYW5kXG4gICAgICogaW5mb3JtYXRpb24gcGFzc2VkIGJldHdlZW4gdGhlIHdvcmtlciBhbmQgbWFpbiBjb250ZXh0IG11Y2ggYmUgaW4gYVxuICAgICAqIG1lc3NhZ2UuIFNvIGFuIGV2ZW50IGhhbmRsZXIgaXMgcHV0IG9uIHZlcm92aW9XcmFwcGVyIGZvciB3aGVuIGEgbWVzc2FnZVxuICAgICAqIGlzIHJlY2VpZXZlZCBmcm9tIHRoZSB3b3JrZXIuIFRoZW4gYSBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlIHdvcmtlciB0b1xuICAgICAqIHRha2UgYW4gYWN0aW9uLiBBIHJlc3BvbnNlIGlzIHNlbnQgYmFjayBhbmQgdGhlIHByZXZpb3VzbHkgbWVudGlvbmVkXG4gICAgICogZXZlbnQgaGFuZGxlciBoYW5kbGVzIHRoZSByZXNwb25zZS4gU2luY2UgaXQgaXMgZGVmaW5lZCB3aXRoaW4gdGhlXG4gICAgICogcHJvbWlzZSBpdCBoYXMgYWNjZXNzIHRvIHRoZSBuZWNlc3NhcnkgcmVzb2x2ZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2U6IFZlcm92aW9NZXNzYWdlID0ge1xuICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgIGFjdGlvbjogJ3JlbmRlckRhdGEnLFxuICAgICAgICBtZWk6IGRhdGFcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBoYW5kbGUgKGV2dDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldnQuZGF0YS5pZCA9PT0gbWVzc2FnZS5pZCkge1xuICAgICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMucGFyc2VyLnBhcnNlRnJvbVN0cmluZyhcbiAgICAgICAgICAgIGV2dC5kYXRhLnN2ZyxcbiAgICAgICAgICAgICdpbWFnZS9zdmcreG1sJ1xuICAgICAgICAgICkuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgIHRoaXMubmVvbkNhY2hlLnNldChwYWdlVVJJLCB7XG4gICAgICAgICAgICBzdmc6IHN2ZyxcbiAgICAgICAgICAgIG1laTogZGF0YSxcbiAgICAgICAgICAgIGRpcnR5OiBkaXJ0eVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2dC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZSk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgU1ZHIGZvciBhIHNwZWNpZmljIHBhZ2UuXG4gICAqIEBwYXJhbSBwYWdlVVJJIC0gVGhlIFVSSSBvZiB0aGUgc2VsZWN0ZWQgcGFnZS5cbiAgICovXG4gIGdldFNWRyAocGFnZVVSSTogc3RyaW5nKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMubG9hZFBhZ2UocGFnZVVSSSkudGhlbigoZW50cnkpID0+IHtcbiAgICAgICAgcmVzb2x2ZShlbnRyeS5zdmcpO1xuICAgICAgfSkuY2F0Y2goKGVycikgPT4geyByZWplY3QoZXJyKTsgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBNRUkgZm9yIGEgc3BlY2lmaWMgcGFnZS5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBwYWdlLlxuICAgKi9cbiAgZ2V0TUVJIChwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmxvYWRQYWdlKHBhZ2VVUkkpLnRoZW4oKGVudHJ5KSA9PiB7XG4gICAgICAgIHJlc29sdmUoZW50cnkubWVpKTtcbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsgcmVqZWN0KGVycik7IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdXNpY2FsIGVsZW1lbnQgYXR0cmlidXRlcyBmcm9tIHRoZSB2ZXJvdmlvIHRvb2xraXQuXG4gICAqIEBwYXJhbSBlbGVtZW50SWQgLSBUaGUgdW5pcXVlIElEIG9mIHRoZSBtdXNpY2FsIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBwYWdlVVJJIC0gVGhlIFVSSSBvZiB0aGUgc2VsZWN0ZWQgcGFnZS5cbiAgICovXG4gIGdldEVsZW1lbnRBdHRyIChlbGVtZW50SWQ6IHN0cmluZywgcGFnZVVSSTogc3RyaW5nKTogUHJvbWlzZTxBdHRyaWJ1dGVzPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmxvYWRQYWdlKHBhZ2VVUkkpLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBWZXJvdmlvTWVzc2FnZSA9IHtcbiAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgYWN0aW9uOiAnZ2V0RWxlbWVudEF0dHInLFxuICAgICAgICAgIGVsZW1lbnRJZDogZWxlbWVudElkXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIGhhbmRsZSAoZXZ0OiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZ0LmRhdGEuaWQgPT09IG1lc3NhZ2UuaWQpIHtcbiAgICAgICAgICAgIGV2dC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZSk7XG4gICAgICAgICAgICByZXNvbHZlKGV2dC5kYXRhLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGFuIGVkaXRvciBhY3Rpb24gb24gYSBzcGVjaWZpYyBwYWdlLlxuICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGVkaXRvciB0b29sa2l0IGFjdGlvbiBvYmplY3QuXG4gICAqIEBwYXJhbSBwYWdlVVJJIC0gVGhlIFVSSSBvZiB0aGUgc2VsZWN0ZWQgcGFnZS5cbiAgICovXG4gIGVkaXQgKGVkaXRvckFjdGlvbjogRWRpdG9yQWN0aW9uLCBwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgcHJvbWlzZTogUHJvbWlzZTxDYWNoZUVudHJ5PjtcbiAgICBpZiAodGhpcy5sYXN0UGFnZUxvYWRlZCA9PT0gcGFnZVVSSSkge1xuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh0aGlzLm5lb25DYWNoZS5nZXQocGFnZVVSSSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlID0gdGhpcy5sb2FkUGFnZShwYWdlVVJJKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKTogdm9pZCA9PiB7XG4gICAgICBwcm9taXNlLnRoZW4oZW50cnkgPT4ge1xuICAgICAgICAvLyBkZWxldGUgdW5uZWNlc3NhcnkgU1ZHIG9iamVjdCByZWZlcmVuY2U7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgdGhpcyBpcyBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQhXG4gICAgICAgIGVudHJ5LnN2ZyA9IG51bGw7XG5cbiAgICAgICAgY29uc3QgY3VycmVudE1FSSA9IGVudHJ5Lm1laTtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogVmVyb3Zpb01lc3NhZ2UgPSB7XG4gICAgICAgICAgaWQ6IHV1aWR2NCgpLFxuICAgICAgICAgIGFjdGlvbjogJ2VkaXQnLFxuICAgICAgICAgIGVkaXRvckFjdGlvbjogZWRpdG9yQWN0aW9uXG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZSAodGhpczogTmVvbkNvcmUsIGV2dDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG4gICAgICAgICAgaWYgKGV2dC5kYXRhLmlkID09PSBtZXNzYWdlLmlkKSB7XG4gICAgICAgICAgICBpZiAoZXZ0LmRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy51bmRvU3RhY2tzLmhhcyhwYWdlVVJJKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5kb1N0YWNrcy5zZXQocGFnZVVSSSwgW10pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQWRkIHRvIHVuZG8gc3RhY2s6XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYm90dG9tbW9zdCBNRUkgc3RyaW5nIG9uIHRoZSBzdGFja1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgc3RhY2sgaXMgPiAxMCBzdHJpbmdzXG4gICAgICAgICAgICAgIGNvbnN0IHVuZG9TdGFjayA9IHRoaXMudW5kb1N0YWNrcy5nZXQocGFnZVVSSSk7XG4gICAgICAgICAgICAgIGNvbnN0IGxlbiA9IHVuZG9TdGFjay5wdXNoKGN1cnJlbnRNRUkpO1xuXG4gICAgICAgICAgICAgIGlmIChsZW4gPiAxMClcbiAgICAgICAgICAgICAgICB0aGlzLnVuZG9TdGFja3Muc2V0KHBhZ2VVUkksIHVuZG9TdGFjay5zbGljZSgxKSk7XG5cbiAgICAgICAgICAgICAgLy8gQ2xlYXIgcmVkbyBzdGFjazpcbiAgICAgICAgICAgICAgdGhpcy5yZWRvU3RhY2tzLnNldChwYWdlVVJJLCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldnQudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShwYWdlVVJJLCB0cnVlKS50aGVuKCgpID0+IHsgcmVzb2x2ZShldnQuZGF0YS5yZXN1bHQpOyB9KTtcbiAgICAgICAgICAgIHNldFNhdmVkU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52ZXJvdmlvV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNvbnRlbnRzIG9mIHRoZSBjYWNoZSB1c2luZyBpbmZvcm1hdGlvbiBpbiB2ZXJvdmlvIHRvb2xraXQuXG4gICAqIEBwYXJhbSBwYWdlVVJJIC0gUGFnZSB0byBiZSB1cGRhdGVkIGluIGNhY2hlLlxuICAgKiBAcGFyYW0gZGlydHkgLSBJZiB0aGUgZW50cnkgc2hvdWxkIGJlIG1hcmtlZCBhcyBkaXJ0eVxuICAgKi9cbiAgdXBkYXRlQ2FjaGUgKHBhZ2VVUkk6IHN0cmluZywgZGlydHk6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICAgIC8vIE11c3QgZ2V0IE1FSSBhbmQgdGhlbiBnZXQgU1ZHIHRoZW4gZmluaXNoLlxuICAgICAgbGV0IG1laTogc3RyaW5nLCBzdmdUZXh0OiBzdHJpbmc7XG4gICAgICBjb25zdCBtZWlQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogVmVyb3Zpb01lc3NhZ2UgPSB7XG4gICAgICAgICAgaWQ6IHV1aWR2NCgpLFxuICAgICAgICAgIGFjdGlvbjogJ2dldE1FSSdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy52ZXJvdmlvV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gaGFuZGxlIChldnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgICAgIGlmIChldnQuZGF0YS5pZCA9PT0gbWVzc2FnZS5pZCkge1xuICAgICAgICAgICAgbWVpID0gZXZ0LmRhdGEubWVpO1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlKTtcbiAgICAgICAgICAgIFZhbGlkYXRpb24uc2VuZEZvclZhbGlkYXRpb24ocmVtb3ZlQ29sdW1uTGFiZWwobWVpKSk7XG4gICAgICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzdmdQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogVmVyb3Zpb01lc3NhZ2UgPSB7XG4gICAgICAgICAgaWQ6IHV1aWR2NCgpLFxuICAgICAgICAgIGFjdGlvbjogJ3JlbmRlclRvU1ZHJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBoYW5kbGUgKGV2dDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgICAgaWYgKGV2dC5kYXRhLmlkID09PSBtZXNzYWdlLmlkKSB7XG4gICAgICAgICAgICBzdmdUZXh0ID0gZXZ0LmRhdGEuc3ZnO1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlKTtcbiAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmVyb3Zpb1dyYXBwZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9KTtcblxuICAgICAgbWVpUHJvbWlzZS50aGVuKCgpID0+IHsgcmV0dXJuIHN2Z1Byb21pc2U7IH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLnBhcnNlci5wYXJzZUZyb21TdHJpbmcoXG4gICAgICAgICAgc3ZnVGV4dCxcbiAgICAgICAgICAnaW1hZ2Uvc3ZnK3htbCdcbiAgICAgICAgKS5kb2N1bWVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgJiBTVkdTVkdFbGVtZW50O1xuICAgICAgICB0aGlzLm5lb25DYWNoZS5zZXQocGFnZVVSSSwge1xuICAgICAgICAgIG1laTogbWVpLFxuICAgICAgICAgIHN2Zzogc3ZnLFxuICAgICAgICAgIGRpcnR5OiBkaXJ0eVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlZGl0IGluZm8gc3RyaW5nIGZyb20gdGhlIHZlcm92aW8gdG9vbGtpdC5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBwYWdlIHRvIGdldCB0aGUgZWRpdCBpbmZvIHN0cmluZyBmcm9tLlxuICAgKi9cbiAgaW5mbyAocGFnZVVSSTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcHJvbWlzZTogUHJvbWlzZTxDYWNoZUVudHJ5IHwgdm9pZD47XG4gICAgaWYgKHRoaXMubGFzdFBhZ2VMb2FkZWQgPT09IHBhZ2VVUkkpIHtcbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZSA9IHRoaXMubG9hZFBhZ2UocGFnZVVSSSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogVmVyb3Zpb01lc3NhZ2UgPSB7XG4gICAgICAgICAgaWQ6IHV1aWR2NCgpLFxuICAgICAgICAgIGFjdGlvbjogJ2VkaXRJbmZvJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBoYW5kbGUgKGV2dDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgICAgaWYgKGV2dC5kYXRhLmlkID09PSBtZXNzYWdlLmlkKSB7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGUpO1xuICAgICAgICAgICAgcmVzb2x2ZShldnQuZGF0YS5pbmZvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZlcm92aW9XcmFwcGVyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5kbyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc3BlY2lmaWMgcGFnZS5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBwYWdlLlxuICAgKiBAcmV0dXJucyBJZiB0aGUgYWN0aW9uIHdhcyB1bmRvbmUuXG4gICAqL1xuICB1bmRvIChwYWdlVVJJOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICghdGhpcy51bmRvU3RhY2tzLmhhcyhwYWdlVVJJKSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMudW5kb1N0YWNrcy5nZXQocGFnZVVSSSkucG9wKCk7XG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1laSA9IGF3YWl0IHRoaXMuZ2V0TUVJKHBhZ2VVUkkpO1xuICAgICAgdGhpcy5yZWRvU3RhY2tzLmdldChwYWdlVVJJKS5wdXNoKG1laSk7XG4gICAgICBhd2FpdCB0aGlzLmxvYWREYXRhKHBhZ2VVUkksIHN0YXRlLCB0cnVlKTtcblxuICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVkbyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgcGFnZS5cbiAgICogQHBhcmFtIHBhZ2VVUkkgLSBUaGUgcGFnZSBVUkkuXG4gICAqIEByZXR1cm5zIElmIHRoZSBhY3Rpb24gd2FzIHJlZG9uZS5cbiAgICovXG4gIHJlZG8gKHBhZ2VVUkk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnJlZG9TdGFja3MuaGFzKHBhZ2VVUkkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5yZWRvU3RhY2tzLmdldChwYWdlVVJJKS5wb3AoKTtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybiByZXNvbHZlKGZhbHNlKTtcblxuICAgICAgY29uc3QgbWVpID0gYXdhaXQgdGhpcy5nZXRNRUkocGFnZVVSSSk7XG4gICAgICB0aGlzLnVuZG9TdGFja3MuZ2V0KHBhZ2VVUkkpLnB1c2gobWVpKTtcbiAgICAgIGF3YWl0IHRoaXMubG9hZERhdGEocGFnZVVSSSwgc3RhdGUsIHRydWUpO1xuXG4gICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIFBvdWNoRGIgZGF0YWJhc2Ugc3RvcmVkIGluIHRoZSBicm93c2VyLlxuICAgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgY2FjaGUuIFRvIHNhdmUgdGltZSxcbiAgICogb25seSBlbnRyaWVzIG1hcmtlZCBhcyBkaXJ0eSB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqL1xuICBhc3luYyB1cGRhdGVEYXRhYmFzZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHlwZSBEb2MgPSBQb3VjaERCLkNvcmUuR2V0TWV0YSAmIFBvdWNoREIuQ29yZS5JZE1ldGEgJiB7IGJvZHk6IHN0cmluZzsgdGltZXN0YW1wOiBzdHJpbmcgfTtcbiAgICBsZXQgdXBkYXRlVGltZXN0YW1wID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwYWlyIG9mIHRoaXMubmVvbkNhY2hlKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYWlyWzBdO1xuICAgICAgY29uc3QgdmFsdWUgPSBwYWlyWzFdO1xuICAgICAgaWYgKHZhbHVlLmRpcnR5KSB7XG4gICAgICAgIHVwZGF0ZVRpbWVzdGFtcCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5hbm5vdGF0aW9ucy5maW5kSW5kZXgoZWxlbSA9PiB7IHJldHVybiBlbGVtLnRhcmdldCA9PT0ga2V5OyB9KTtcbiAgICAgICAgLy8gdHJ5IHRvIHVwZGF0ZSBzZXJ2ZXIgd2l0aCBQVVQgcmVxdWVzdCAoaWYgYXBwbGljYWJsZSlcbiAgICAgICAgLy8gdGhpcyBpcyBzaW1wbGVyIHRoYW4gZXhwZWN0aW5nIGEgc3BlY2lmaWMgQVBJIG9uIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gYW5kIHVzaW5nIFBPU1QgcmVxdWVzdHMsIGFsdGhvdWdoIHRoYXQgd291bGQgYmUgYmV0dGVyIGlmIHRoZXJlXG4gICAgICAgIC8vIGlzIGV2ZXIgYSBkZWRpY2F0ZWQgcHVibGljIHNlcnZlciBmb3IgTmVvbiEgQXQgdGltZSBvZiB3cml0aW5nLFxuICAgICAgICAvLyBvbmx5IGRldi90ZXN0aW5nIHNlcnZlciBhY2NlcHRzIFBVVCByZXF1ZXN0cy5cbiAgICAgICAgLy8gb25seSBhdHRlbXB0IGlmIG5vdCBhIGRhdGEgVVJJXG4gICAgICAgIGxldCB1cmk6IHN0cmluZztcbiAgICAgICAgaWYgKCF0aGlzLmFubm90YXRpb25zW2luZGV4XS5ib2R5Lm1hdGNoKC9eZGF0YTovKSkge1xuICAgICAgICAgIGF3YWl0IHdpbmRvdy5mZXRjaCh0aGlzLmFubm90YXRpb25zW2luZGV4XS5ib2R5LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vbWVpK3htbCcgfSxcbiAgICAgICAgICAgICAgYm9keTogdmFsdWUubWVpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICB1cmkgPSB0aGlzLmFubm90YXRpb25zW2luZGV4XS5ib2R5O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdXJpID0gJ2RhdGE6YXBwbGljYXRpb24vbWVpK3htbDtiYXNlNjQsJyArIHdpbmRvdy5idG9hKHZhbHVlLm1laSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFsbGluZyBiYWNrIHRvIGRhdGEgVVJJJyk7XG4gICAgICAgICAgICB1cmkgPSAnZGF0YTphcHBsaWNhdGlvbi9tZWkreG1sO2Jhc2U2NCwnICsgd2luZG93LmJ0b2EodmFsdWUubWVpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmkgPSAnZGF0YTphcHBsaWNhdGlvbi9tZWkreG1sO2Jhc2U2NCwnICsgd2luZG93LmJ0b2EodmFsdWUubWVpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgVVJJIGluIGFubm90YXRpb25zLCBkYXRhYmFzZVxuICAgICAgICB0aGlzLmFubm90YXRpb25zW2luZGV4XS5ib2R5ID0gdXJpO1xuICAgICAgICBhd2FpdCB0aGlzLmRiLmdldCh0aGlzLmFubm90YXRpb25zW2luZGV4XS5pZCkudGhlbigoZG9jOiBEb2MpID0+IHtcbiAgICAgICAgICBkb2MuYm9keSA9IHVyaTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYi5wdXQoZG9jKTtcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdmFsdWUuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1cGRhdGVUaW1lc3RhbXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZGIuZ2V0KHRoaXMubWFuaWZlc3RbJ0BpZCddKS50aGVuKChkb2M6IERvYykgPT4ge1xuICAgICAgICBkb2MudGltZXN0YW1wID0gKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLnB1dChkb2MpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENvbXBsZXRlbHkgcmVtb3ZlIHRoZSBkYXRhYmFzZS4gKi9cbiAgYXN5bmMgZGVsZXRlRGIgKCk6IFByb21pc2U8dm9pZFtdPiB7XG4gICAgdHlwZSBEb2MgPSBQb3VjaERCLkNvcmUuSWRNZXRhICYgUG91Y2hEQi5Db3JlLkdldE1ldGEgJiB7IHRpbWVzdGFtcDogc3RyaW5nOyBhbm5vdGF0aW9uczogc3RyaW5nW119O1xuICAgIGNvbnN0IGFubm90YXRpb25zID0gYXdhaXQgdGhpcy5kYi5nZXQodGhpcy5tYW5pZmVzdFsnQGlkJ10pXG4gICAgICAudGhlbigoZG9jOiBEb2MpID0+IHsgcmV0dXJuIGRvYy5hbm5vdGF0aW9uczsgfSApO1xuICAgIGFubm90YXRpb25zLnB1c2godGhpcy5tYW5pZmVzdFsnQGlkJ10pO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBhbm5vdGF0aW9ucy5tYXAoKGlkKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzID0+IHtcbiAgICAgICAgdGhpcy5kYi5nZXQoaWQpXG4gICAgICAgICAgLnRoZW4oZG9jID0+IHsgcmV0dXJuIHRoaXMuZGIucmVtb3ZlKGRvYyk7IH0pXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzKCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBOZW9uQ29yZSBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgeyBWZXJvdmlvTWVzc2FnZSB9IGZyb20gJy4vVHlwZXMnO1xuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIHZlcm92aW8gd2ViIHdvcmtlciB0byBwZXJtaXQgbW9ja2luZyBpbiB0ZXN0cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVyb3Zpb1dyYXBwZXIge1xuICB2ZXJvdmlvV29ya2VyOiBXb3JrZXI7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0aGlzLnZlcm92aW9Xb3JrZXIgPSBuZXcgV29ya2VyKFxuICAgICAgICBfX0FTU0VUX1BSRUZJWF9fICsgJ3dvcmtlcnMvVmVyb3Zpb1dvcmtlci5qcydcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmVyb3Zpb1dvcmtlciA9IG5ldyBXb3JrZXIoXG4gICAgICAgIF9fQVNTRVRfUFJFRklYX18gKyAnd29ya2Vycy9WZXJvdmlvV29ya2VyLWRldi5qcydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBldmVudCBsaXN0ZW5lciBvbnRvIHRoZSBhY3R1YWwgd2ViIHdvcmtlci5cbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3RcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMudmVyb3Zpb1dvcmtlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBhY3R1YWwgd2ViIHdvcmtlci5cbiAgICovXG4gIHBvc3RNZXNzYWdlKG1lc3NhZ2U6IFZlcm92aW9NZXNzYWdlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMudmVyb3Zpb1dvcmtlci5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyAqL1xuaW1wb3J0IHsgTmVvbk1hbmlmZXN0IH0gZnJvbSAnLi4vVHlwZXMnO1xuY29uc3QgTmVvblNjaGVtYSA9IHJlcXVpcmUoJy4vbWFuaWZlc3QvTmVvblNjaGVtYS5qc29uJyk7XG5jb25zdCBOZW9uQ29udGV4dCA9IHJlcXVpcmUoJy4vbWFuaWZlc3QvY29udGV4dC5qc29uJyk7XG5pbXBvcnQgeyB2YWxpZGF0ZSB9IGZyb20gJ2pzb25zY2hlbWEnO1xuXG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIE5lb24gbWFuaWZlc3QgaXMgcGFyc2VhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IG1hbmlmZXN0U3RyaW5nIC0gVGhlIE5lb24gbWFuaWZlc3QgYXMgYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1hbmlmZXN0IChtYW5pZmVzdFN0cmluZzogTmVvbk1hbmlmZXN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc3VsdHMgPSB2YWxpZGF0ZShtYW5pZmVzdFN0cmluZywgTmVvblNjaGVtYSk7XG4gIGNvbnN0IGluc3RhbmNlID0gcmVzdWx0cy5pbnN0YW5jZTtcbiAgaWYgKHJlc3VsdHMuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmVycm9yKHJlc3VsdHMuZXJyb3JzKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY29udGV4dCA9IGluc3RhbmNlWydAY29udGV4dCddO1xuICBpZiAoY29udGV4dCA9PT0gJ2h0dHBzOi8vZGRtYWwubXVzaWMubWNnaWxsLmNhL05lb24vY29udGV4dHMvMS9tYW5pZmVzdC5qc29ubGQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKChjb250ZXh0WzBdID09PSBOZW9uQ29udGV4dFswXSkgJiZcbiAgICAgIChjb250ZXh0WzFdWydzY2hlbWEnXSA9PT0gTmVvbkNvbnRleHRbMV1bJ3NjaGVtYSddKSAmJlxuICAgICAgKGNvbnRleHRbMV1bJ3RpdGxlJ10gPT09IE5lb25Db250ZXh0WzFdWyd0aXRsZSddKSAmJlxuICAgICAgKGNvbnRleHRbMV1bJ3RpbWVzdGFtcCddID09PSBOZW9uQ29udGV4dFsxXVsndGltZXN0YW1wJ10pICYmXG4gICAgICAoY29udGV4dFsxXVsnaW1hZ2UnXVsnQGlkJ10gPT09IE5lb25Db250ZXh0WzFdWydpbWFnZSddWydAaWQnXSkgJiZcbiAgICAgIChjb250ZXh0WzFdWydpbWFnZSddWydAdHlwZSddID09PSBOZW9uQ29udGV4dFsxXVsnaW1hZ2UnXVsnQHR5cGUnXSkgJiZcbiAgICAgIChjb250ZXh0WzFdWydtZWlfYW5ub3RhdGlvbnMnXVsnQGlkJ10gPT09IE5lb25Db250ZXh0WzFdWydtZWlfYW5ub3RhdGlvbnMnXVsnQGlkJ10pICYmXG4gICAgICAoY29udGV4dFsxXVsnbWVpX2Fubm90YXRpb25zJ11bJ0B0eXBlJ10gPT09IE5lb25Db250ZXh0WzFdWydtZWlfYW5ub3RhdGlvbnMnXVsnQHR5cGUnXSkgJiZcbiAgICAgIChjb250ZXh0WzFdWydtZWlfYW5ub3RhdGlvbnMnXVsnQGNvbnRhaW5lciddID09PSBOZW9uQ29udGV4dFsxXVsnbWVpX2Fubm90YXRpb25zJ11bJ0Bjb250YWluZXInXSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKCdDb250ZXh0IG1pc21hdGNoJyk7XG4gICAgY29uc29sZS5lcnJvcihjb250ZXh0KTtcbiAgICBjb25zb2xlLmVycm9yKE5lb25Db250ZXh0KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZhbGlkYXRvciA9IG1vZHVsZS5leHBvcnRzLlZhbGlkYXRvciA9IHJlcXVpcmUoJy4vdmFsaWRhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzLlZhbGlkYXRvclJlc3VsdCA9IHJlcXVpcmUoJy4vaGVscGVycycpLlZhbGlkYXRvclJlc3VsdDtcbm1vZHVsZS5leHBvcnRzLlZhbGlkYXRvclJlc3VsdEVycm9yID0gcmVxdWlyZSgnLi9oZWxwZXJzJykuVmFsaWRhdG9yUmVzdWx0RXJyb3I7XG5tb2R1bGUuZXhwb3J0cy5WYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuL2hlbHBlcnMnKS5WYWxpZGF0aW9uRXJyb3I7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWFFcnJvciA9IHJlcXVpcmUoJy4vaGVscGVycycpLlNjaGVtYUVycm9yO1xubW9kdWxlLmV4cG9ydHMuU2NoZW1hU2NhblJlc3VsdCA9IHJlcXVpcmUoJy4vc2NhbicpLlNjaGVtYVNjYW5SZXN1bHQ7XG5tb2R1bGUuZXhwb3J0cy5zY2FuID0gcmVxdWlyZSgnLi9zY2FuJykuc2NhbjtcblxubW9kdWxlLmV4cG9ydHMudmFsaWRhdGUgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucykge1xuICB2YXIgdiA9IG5ldyBWYWxpZGF0b3IoKTtcbiAgcmV0dXJuIHYudmFsaWRhdGUoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXJpbGliID0gcmVxdWlyZSgndXJsJyk7XG5cbnZhciBhdHRyaWJ1dGUgPSByZXF1aXJlKCcuL2F0dHJpYnV0ZScpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcbnZhciBzY2FuU2NoZW1hID0gcmVxdWlyZSgnLi9zY2FuJykuc2NhbjtcbnZhciBWYWxpZGF0b3JSZXN1bHQgPSBoZWxwZXJzLlZhbGlkYXRvclJlc3VsdDtcbnZhciBWYWxpZGF0b3JSZXN1bHRFcnJvciA9IGhlbHBlcnMuVmFsaWRhdG9yUmVzdWx0RXJyb3I7XG52YXIgU2NoZW1hRXJyb3IgPSBoZWxwZXJzLlNjaGVtYUVycm9yO1xudmFyIFNjaGVtYUNvbnRleHQgPSBoZWxwZXJzLlNjaGVtYUNvbnRleHQ7XG4vL3ZhciBhbm9ueW1vdXNCYXNlID0gJ3ZuZC5qc29uc2NoZW1hOi8vLyc7XG52YXIgYW5vbnltb3VzQmFzZSA9ICcvJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZhbGlkYXRvciBvYmplY3RcbiAqIEBuYW1lIFZhbGlkYXRvclxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnZhciBWYWxpZGF0b3IgPSBmdW5jdGlvbiBWYWxpZGF0b3IgKCkge1xuICAvLyBBbGxvdyBhIHZhbGlkYXRvciBpbnN0YW5jZSB0byBvdmVycmlkZSBnbG9iYWwgY3VzdG9tIGZvcm1hdHMgb3IgdG8gaGF2ZSB0aGVpclxuICAvLyBvd24gY3VzdG9tIGZvcm1hdHMuXG4gIHRoaXMuY3VzdG9tRm9ybWF0cyA9IE9iamVjdC5jcmVhdGUoVmFsaWRhdG9yLnByb3RvdHlwZS5jdXN0b21Gb3JtYXRzKTtcbiAgdGhpcy5zY2hlbWFzID0ge307XG4gIHRoaXMudW5yZXNvbHZlZFJlZnMgPSBbXTtcblxuICAvLyBVc2UgT2JqZWN0LmNyZWF0ZSB0byBtYWtlIHRoaXMgZXh0ZW5zaWJsZSB3aXRob3V0IFZhbGlkYXRvciBpbnN0YW5jZXMgc3RlcHBpbmcgb24gZWFjaCBvdGhlcidzIHRvZXMuXG4gIHRoaXMudHlwZXMgPSBPYmplY3QuY3JlYXRlKHR5cGVzKTtcbiAgdGhpcy5hdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShhdHRyaWJ1dGUudmFsaWRhdG9ycyk7XG59O1xuXG4vLyBBbGxvdyBmb3JtYXRzIHRvIGJlIHJlZ2lzdGVyZWQgZ2xvYmFsbHkuXG5WYWxpZGF0b3IucHJvdG90eXBlLmN1c3RvbUZvcm1hdHMgPSB7fTtcblxuLy8gSGludCBhdCB0aGUgcHJlc2VuY2Ugb2YgYSBwcm9wZXJ0eVxuVmFsaWRhdG9yLnByb3RvdHlwZS5zY2hlbWFzID0gbnVsbDtcblZhbGlkYXRvci5wcm90b3R5cGUudHlwZXMgPSBudWxsO1xuVmFsaWRhdG9yLnByb3RvdHlwZS5hdHRyaWJ1dGVzID0gbnVsbDtcblZhbGlkYXRvci5wcm90b3R5cGUudW5yZXNvbHZlZFJlZnMgPSBudWxsO1xuXG4vKipcbiAqIEFkZHMgYSBzY2hlbWEgd2l0aCBhIGNlcnRhaW4gdXJuIHRvIHRoZSBWYWxpZGF0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gdXJuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblZhbGlkYXRvci5wcm90b3R5cGUuYWRkU2NoZW1hID0gZnVuY3Rpb24gYWRkU2NoZW1hIChzY2hlbWEsIGJhc2UpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoIXNjaGVtYSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBzY2FuID0gc2NhblNjaGVtYShiYXNlfHxhbm9ueW1vdXNCYXNlLCBzY2hlbWEpO1xuICB2YXIgb3VyVXJpID0gYmFzZSB8fCBzY2hlbWEuJGlkIHx8IHNjaGVtYS5pZDtcbiAgZm9yKHZhciB1cmkgaW4gc2Nhbi5pZCl7XG4gICAgdGhpcy5zY2hlbWFzW3VyaV0gPSBzY2FuLmlkW3VyaV07XG4gIH1cbiAgZm9yKHZhciB1cmkgaW4gc2Nhbi5yZWYpe1xuICAgIC8vIElmIHRoaXMgc2NoZW1hIGlzIGFscmVhZHkgZGVmaW5lZCwgaXQgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgYnkgdGhlIG5leHQgc3RlcFxuICAgIHRoaXMudW5yZXNvbHZlZFJlZnMucHVzaCh1cmkpO1xuICB9XG4gIC8vIFJlbW92ZSBuZXdseSBkZWZpbmVkIHNjaGVtYXMgZnJvbSB1bnJlc29sdmVkUmVmc1xuICB0aGlzLnVucmVzb2x2ZWRSZWZzID0gdGhpcy51bnJlc29sdmVkUmVmcy5maWx0ZXIoZnVuY3Rpb24odXJpKXtcbiAgICByZXR1cm4gdHlwZW9mIHNlbGYuc2NoZW1hc1t1cmldPT09J3VuZGVmaW5lZCc7XG4gIH0pO1xuICByZXR1cm4gdGhpcy5zY2hlbWFzW291clVyaV07XG59O1xuXG5WYWxpZGF0b3IucHJvdG90eXBlLmFkZFN1YlNjaGVtYUFycmF5ID0gZnVuY3Rpb24gYWRkU3ViU2NoZW1hQXJyYXkoYmFzZXVyaSwgc2NoZW1hcykge1xuICBpZighQXJyYXkuaXNBcnJheShzY2hlbWFzKSkgcmV0dXJuO1xuICBmb3IodmFyIGk9MDsgaTxzY2hlbWFzLmxlbmd0aDsgaSsrKXtcbiAgICB0aGlzLmFkZFN1YlNjaGVtYShiYXNldXJpLCBzY2hlbWFzW2ldKTtcbiAgfVxufTtcblxuVmFsaWRhdG9yLnByb3RvdHlwZS5hZGRTdWJTY2hlbWFPYmplY3QgPSBmdW5jdGlvbiBhZGRTdWJTY2hlbWFBcnJheShiYXNldXJpLCBzY2hlbWFzKSB7XG4gIGlmKCFzY2hlbWFzIHx8IHR5cGVvZiBzY2hlbWFzIT0nb2JqZWN0JykgcmV0dXJuO1xuICBmb3IodmFyIHAgaW4gc2NoZW1hcyl7XG4gICAgdGhpcy5hZGRTdWJTY2hlbWEoYmFzZXVyaSwgc2NoZW1hc1twXSk7XG4gIH1cbn07XG5cblxuXG4vKipcbiAqIFNldHMgYWxsIHRoZSBzY2hlbWFzIG9mIHRoZSBWYWxpZGF0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2NoZW1hc1xuICovXG5WYWxpZGF0b3IucHJvdG90eXBlLnNldFNjaGVtYXMgPSBmdW5jdGlvbiBzZXRTY2hlbWFzIChzY2hlbWFzKSB7XG4gIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHNjaGVtYSBvZiBhIGNlcnRhaW4gdXJuXG4gKiBAcGFyYW0gdXJuXG4gKi9cblZhbGlkYXRvci5wcm90b3R5cGUuZ2V0U2NoZW1hID0gZnVuY3Rpb24gZ2V0U2NoZW1hICh1cm4pIHtcbiAgcmV0dXJuIHRoaXMuc2NoZW1hc1t1cm5dO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgaW5zdGFuY2UgYWdhaW5zdCB0aGUgcHJvdmlkZWQgc2NoZW1hXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBbb3B0aW9uc11cbiAqIEBwYXJhbSBbY3R4XVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cblZhbGlkYXRvci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmKCh0eXBlb2Ygc2NoZW1hICE9PSAnYm9vbGVhbicgJiYgdHlwZW9mIHNjaGVtYSAhPT0gJ29iamVjdCcpIHx8IHNjaGVtYSA9PT0gbnVsbCl7XG4gICAgdGhyb3cgbmV3IFNjaGVtYUVycm9yKCdFeHBlY3RlZCBgc2NoZW1hYCB0byBiZSBhbiBvYmplY3Qgb3IgYm9vbGVhbicpO1xuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICAvLyBUaGlzIHNlY3Rpb24gaW5kZXhlcyBzdWJzY2hlbWFzIGluIHRoZSBwcm92aWRlZCBzY2hlbWEsIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBhZGRlZCB3aXRoIFZhbGlkYXRvciNhZGRTY2hlbWFcbiAgLy8gVGhpcyB3aWxsIHdvcmsgc28gbG9uZyBhcyB0aGUgZnVuY3Rpb24gYXQgdXJpLnJlc29sdmUoKSB3aWxsIHJlc29sdmUgYSByZWxhdGl2ZSBVUkkgdG8gYSByZWxhdGl2ZSBVUklcbiAgdmFyIGlkID0gc2NoZW1hLiRpZCB8fCBzY2hlbWEuaWQ7XG4gIHZhciBiYXNlID0gdXJpbGliLnJlc29sdmUob3B0aW9ucy5iYXNlfHxhbm9ueW1vdXNCYXNlLCBpZHx8JycpO1xuICBpZighY3R4KXtcbiAgICBjdHggPSBuZXcgU2NoZW1hQ29udGV4dChzY2hlbWEsIG9wdGlvbnMsIFtdLCBiYXNlLCBPYmplY3QuY3JlYXRlKHRoaXMuc2NoZW1hcykpO1xuICAgIGlmICghY3R4LnNjaGVtYXNbYmFzZV0pIHtcbiAgICAgIGN0eC5zY2hlbWFzW2Jhc2VdID0gc2NoZW1hO1xuICAgIH1cbiAgICB2YXIgZm91bmQgPSBzY2FuU2NoZW1hKGJhc2UsIHNjaGVtYSk7XG4gICAgZm9yKHZhciBuIGluIGZvdW5kLmlkKXtcbiAgICAgIHZhciBzY2ggPSBmb3VuZC5pZFtuXTtcbiAgICAgIGN0eC5zY2hlbWFzW25dID0gc2NoO1xuICAgIH1cbiAgfVxuICBpZihvcHRpb25zLnJlcXVpcmVkICYmIGluc3RhbmNlPT09dW5kZWZpbmVkKXtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICAgIHJlc3VsdC5hZGRFcnJvcignaXMgcmVxdWlyZWQsIGJ1dCBpcyB1bmRlZmluZWQnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHZhciByZXN1bHQgPSB0aGlzLnZhbGlkYXRlU2NoZW1hKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXN1bHQgdW5kZWZpbmVkJyk7XG4gIH1lbHNlIGlmKG9wdGlvbnMudGhyb3dBbGwgJiYgcmVzdWx0LmVycm9ycy5sZW5ndGgpe1xuICAgIHRocm93IG5ldyBWYWxpZGF0b3JSZXN1bHRFcnJvcihyZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiogQHBhcmFtIE9iamVjdCBzY2hlbWFcbiogQHJldHVybiBtaXhlZCBzY2hlbWEgdXJpIG9yIGZhbHNlXG4qL1xuZnVuY3Rpb24gc2hvdWxkUmVzb2x2ZShzY2hlbWEpIHtcbiAgdmFyIHJlZiA9ICh0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJykgPyBzY2hlbWEgOiBzY2hlbWEuJHJlZjtcbiAgaWYgKHR5cGVvZiByZWY9PSdzdHJpbmcnKSByZXR1cm4gcmVmO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFuIGluc3RhbmNlIGFnYWluc3QgdGhlIHNjaGVtYSAodGhlIGFjdHVhbCB3b3JrIGhvcnNlKVxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGN0eFxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1ZhbGlkYXRvclJlc3VsdH1cbiAqL1xuVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZVNjaGVtYSA9IGZ1bmN0aW9uIHZhbGlkYXRlU2NoZW1hIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcblxuICAvLyBTdXBwb3J0IGZvciB0aGUgdHJ1ZS9mYWxzZSBzY2hlbWFzXG4gIGlmKHR5cGVvZiBzY2hlbWE9PT0nYm9vbGVhbicpIHtcbiAgICBpZihzY2hlbWE9PT10cnVlKXtcbiAgICAgIC8vIGB0cnVlYCBpcyBhbHdheXMgdmFsaWRcbiAgICAgIHNjaGVtYSA9IHt9O1xuICAgIH1lbHNlIGlmKHNjaGVtYT09PWZhbHNlKXtcbiAgICAgIC8vIGBmYWxzZWAgaXMgYWx3YXlzIGludmFsaWRcbiAgICAgIHNjaGVtYSA9IHt0eXBlOiBbXX07XG4gICAgfVxuICB9ZWxzZSBpZighc2NoZW1hKXtcbiAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgc3RyaW5nXG4gICAgdGhyb3cgbmV3IEVycm9yKFwic2NoZW1hIGlzIHVuZGVmaW5lZFwiKTtcbiAgfVxuXG4gIGlmIChzY2hlbWFbJ2V4dGVuZHMnXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYVsnZXh0ZW5kcyddKSkge1xuICAgICAgdmFyIHNjaGVtYW9iaiA9IHtzY2hlbWE6IHNjaGVtYSwgY3R4OiBjdHh9O1xuICAgICAgc2NoZW1hWydleHRlbmRzJ10uZm9yRWFjaCh0aGlzLnNjaGVtYVRyYXZlcnNlci5iaW5kKHRoaXMsIHNjaGVtYW9iaikpO1xuICAgICAgc2NoZW1hID0gc2NoZW1hb2JqLnNjaGVtYTtcbiAgICAgIHNjaGVtYW9iai5zY2hlbWEgPSBudWxsO1xuICAgICAgc2NoZW1hb2JqLmN0eCA9IG51bGw7XG4gICAgICBzY2hlbWFvYmogPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlbWEgPSBoZWxwZXJzLmRlZXBNZXJnZShzY2hlbWEsIHRoaXMuc3VwZXJSZXNvbHZlKHNjaGVtYVsnZXh0ZW5kcyddLCBjdHgpKTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiBwYXNzZWQgYSBzdHJpbmcgYXJndW1lbnQsIGxvYWQgdGhhdCBzY2hlbWEgVVJJXG4gIHZhciBzd2l0Y2hTY2hlbWEgPSBzaG91bGRSZXNvbHZlKHNjaGVtYSk7XG4gIGlmIChzd2l0Y2hTY2hlbWEpIHtcbiAgICB2YXIgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmUoc2NoZW1hLCBzd2l0Y2hTY2hlbWEsIGN0eCk7XG4gICAgdmFyIHN1YmN0eCA9IG5ldyBTY2hlbWFDb250ZXh0KHJlc29sdmVkLnN1YnNjaGVtYSwgb3B0aW9ucywgY3R4LnBhdGgsIHJlc29sdmVkLnN3aXRjaFNjaGVtYSwgY3R4LnNjaGVtYXMpO1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2NoZW1hKGluc3RhbmNlLCByZXNvbHZlZC5zdWJzY2hlbWEsIG9wdGlvbnMsIHN1YmN0eCk7XG4gIH1cblxuICB2YXIgc2tpcEF0dHJpYnV0ZXMgPSBvcHRpb25zICYmIG9wdGlvbnMuc2tpcEF0dHJpYnV0ZXMgfHwgW107XG4gIC8vIFZhbGlkYXRlIGVhY2ggc2NoZW1hIGF0dHJpYnV0ZSBhZ2FpbnN0IHRoZSBpbnN0YW5jZVxuICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGUuaWdub3JlUHJvcGVydGllc1trZXldICYmIHNraXBBdHRyaWJ1dGVzLmluZGV4T2Yoa2V5KSA8IDApIHtcbiAgICAgIHZhciB2YWxpZGF0b3JFcnIgPSBudWxsO1xuICAgICAgdmFyIHZhbGlkYXRvciA9IHRoaXMuYXR0cmlidXRlc1trZXldO1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICB2YWxpZGF0b3JFcnIgPSB2YWxpZGF0b3IuY2FsbCh0aGlzLCBpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmFsbG93VW5rbm93bkF0dHJpYnV0ZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIFRoaXMgcmVwcmVzZW50cyBhbiBlcnJvciB3aXRoIHRoZSBzY2hlbWEgaXRzZWxmLCBub3QgYW4gaW52YWxpZCBpbnN0YW5jZVxuICAgICAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IoXCJVbnN1cHBvcnRlZCBhdHRyaWJ1dGU6IFwiICsga2V5LCBzY2hlbWEpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkYXRvckVycikge1xuICAgICAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHZhbGlkYXRvckVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLnJld3JpdGUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciB2YWx1ZSA9IG9wdGlvbnMucmV3cml0ZS5jYWxsKHRoaXMsIGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gICAgcmVzdWx0Lmluc3RhbmNlID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuKiBAcHJpdmF0ZVxuKiBAcGFyYW0gT2JqZWN0IHNjaGVtYVxuKiBAcGFyYW0gU2NoZW1hQ29udGV4dCBjdHhcbiogQHJldHVybnMgT2JqZWN0IHNjaGVtYSBvciByZXNvbHZlZCBzY2hlbWFcbiovXG5WYWxpZGF0b3IucHJvdG90eXBlLnNjaGVtYVRyYXZlcnNlciA9IGZ1bmN0aW9uIHNjaGVtYVRyYXZlcnNlciAoc2NoZW1hb2JqLCBzKSB7XG4gIHNjaGVtYW9iai5zY2hlbWEgPSBoZWxwZXJzLmRlZXBNZXJnZShzY2hlbWFvYmouc2NoZW1hLCB0aGlzLnN1cGVyUmVzb2x2ZShzLCBzY2hlbWFvYmouY3R4KSk7XG59O1xuXG4vKipcbiogQHByaXZhdGVcbiogQHBhcmFtIE9iamVjdCBzY2hlbWFcbiogQHBhcmFtIFNjaGVtYUNvbnRleHQgY3R4XG4qIEByZXR1cm5zIE9iamVjdCBzY2hlbWEgb3IgcmVzb2x2ZWQgc2NoZW1hXG4qL1xuVmFsaWRhdG9yLnByb3RvdHlwZS5zdXBlclJlc29sdmUgPSBmdW5jdGlvbiBzdXBlclJlc29sdmUgKHNjaGVtYSwgY3R4KSB7XG4gIHZhciByZWYgPSBzaG91bGRSZXNvbHZlKHNjaGVtYSk7XG4gIGlmKHJlZikge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmUoc2NoZW1hLCByZWYsIGN0eCkuc3Vic2NoZW1hO1xuICB9XG4gIHJldHVybiBzY2hlbWE7XG59O1xuXG4vKipcbiogQHByaXZhdGVcbiogQHBhcmFtIE9iamVjdCBzY2hlbWFcbiogQHBhcmFtIE9iamVjdCBzd2l0Y2hTY2hlbWFcbiogQHBhcmFtIFNjaGVtYUNvbnRleHQgY3R4XG4qIEByZXR1cm4gT2JqZWN0IHJlc29sdmVkIHNjaGVtYXMge3N1YnNjaGVtYTpTdHJpbmcsIHN3aXRjaFNjaGVtYTogU3RyaW5nfVxuKiBAdGhyb3dzIFNjaGVtYUVycm9yXG4qL1xuVmFsaWRhdG9yLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZSAoc2NoZW1hLCBzd2l0Y2hTY2hlbWEsIGN0eCkge1xuICBzd2l0Y2hTY2hlbWEgPSBjdHgucmVzb2x2ZShzd2l0Y2hTY2hlbWEpO1xuICAvLyBGaXJzdCBzZWUgaWYgdGhlIHNjaGVtYSBleGlzdHMgdW5kZXIgdGhlIHByb3ZpZGVkIFVSSVxuICBpZiAoY3R4LnNjaGVtYXNbc3dpdGNoU2NoZW1hXSkge1xuICAgIHJldHVybiB7c3Vic2NoZW1hOiBjdHguc2NoZW1hc1tzd2l0Y2hTY2hlbWFdLCBzd2l0Y2hTY2hlbWE6IHN3aXRjaFNjaGVtYX07XG4gIH1cbiAgLy8gRWxzZSB0cnkgd2Fsa2luZyB0aGUgcHJvcGVydHkgcG9pbnRlclxuICB2YXIgcGFyc2VkID0gdXJpbGliLnBhcnNlKHN3aXRjaFNjaGVtYSk7XG4gIHZhciBmcmFnbWVudCA9IHBhcnNlZCAmJiBwYXJzZWQuaGFzaDtcbiAgdmFyIGRvY3VtZW50ID0gZnJhZ21lbnQgJiYgZnJhZ21lbnQubGVuZ3RoICYmIHN3aXRjaFNjaGVtYS5zdWJzdHIoMCwgc3dpdGNoU2NoZW1hLmxlbmd0aCAtIGZyYWdtZW50Lmxlbmd0aCk7XG4gIGlmICghZG9jdW1lbnQgfHwgIWN0eC5zY2hlbWFzW2RvY3VtZW50XSkge1xuICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcihcIm5vIHN1Y2ggc2NoZW1hIDxcIiArIHN3aXRjaFNjaGVtYSArIFwiPlwiLCBzY2hlbWEpO1xuICB9XG4gIHZhciBzdWJzY2hlbWEgPSBoZWxwZXJzLm9iamVjdEdldFBhdGgoY3R4LnNjaGVtYXNbZG9jdW1lbnRdLCBmcmFnbWVudC5zdWJzdHIoMSkpO1xuICBpZihzdWJzY2hlbWE9PT11bmRlZmluZWQpe1xuICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcihcIm5vIHN1Y2ggc2NoZW1hIFwiICsgZnJhZ21lbnQgKyBcIiBsb2NhdGVkIGluIDxcIiArIGRvY3VtZW50ICsgXCI+XCIsIHNjaGVtYSk7XG4gIH1cbiAgcmV0dXJuIHtzdWJzY2hlbWE6IHN1YnNjaGVtYSwgc3dpdGNoU2NoZW1hOiBzd2l0Y2hTY2hlbWF9O1xufTtcblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBpZiBvZiBhIGNlcnRhaW4gdHlwZS5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcGFyYW0gdHlwZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuVmFsaWRhdG9yLnByb3RvdHlwZS50ZXN0VHlwZSA9IGZ1bmN0aW9uIHZhbGlkYXRlVHlwZSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4LCB0eXBlKSB7XG4gIGlmKHR5cGU9PT11bmRlZmluZWQpe1xuICAgIHJldHVybjtcbiAgfWVsc2UgaWYodHlwZT09PW51bGwpe1xuICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcignVW5leHBlY3RlZCBudWxsIGluIFwidHlwZVwiIGtleXdvcmQnKTtcbiAgfVxuICBpZiAodHlwZW9mIHRoaXMudHlwZXNbdHlwZV0gPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGlzLnR5cGVzW3R5cGVdLmNhbGwodGhpcywgaW5zdGFuY2UpO1xuICB9XG4gIGlmICh0eXBlICYmIHR5cGVvZiB0eXBlID09ICdvYmplY3QnKSB7XG4gICAgdmFyIHJlcyA9IHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2UsIHR5cGUsIG9wdGlvbnMsIGN0eCk7XG4gICAgcmV0dXJuIHJlcyA9PT0gdW5kZWZpbmVkIHx8ICEocmVzICYmIHJlcy5lcnJvcnMubGVuZ3RoKTtcbiAgfVxuICAvLyBVbmRlZmluZWQgb3IgcHJvcGVydGllcyBub3Qgb24gdGhlIGxpc3QgYXJlIGFjY2VwdGFibGUsIHNhbWUgYXMgbm90IGJlaW5nIGRlZmluZWRcbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgdHlwZXMgPSBWYWxpZGF0b3IucHJvdG90eXBlLnR5cGVzID0ge307XG50eXBlcy5zdHJpbmcgPSBmdW5jdGlvbiB0ZXN0U3RyaW5nIChpbnN0YW5jZSkge1xuICByZXR1cm4gdHlwZW9mIGluc3RhbmNlID09ICdzdHJpbmcnO1xufTtcbnR5cGVzLm51bWJlciA9IGZ1bmN0aW9uIHRlc3ROdW1iZXIgKGluc3RhbmNlKSB7XG4gIC8vIGlzRmluaXRlIHJldHVybnMgZmFsc2UgZm9yIE5hTiwgSW5maW5pdHksIGFuZCAtSW5maW5pdHlcbiAgcmV0dXJuIHR5cGVvZiBpbnN0YW5jZSA9PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShpbnN0YW5jZSk7XG59O1xudHlwZXMuaW50ZWdlciA9IGZ1bmN0aW9uIHRlc3RJbnRlZ2VyIChpbnN0YW5jZSkge1xuICByZXR1cm4gKHR5cGVvZiBpbnN0YW5jZSA9PSAnbnVtYmVyJykgJiYgaW5zdGFuY2UgJSAxID09PSAwO1xufTtcbnR5cGVzLmJvb2xlYW4gPSBmdW5jdGlvbiB0ZXN0Qm9vbGVhbiAoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIHR5cGVvZiBpbnN0YW5jZSA9PSAnYm9vbGVhbic7XG59O1xudHlwZXMuYXJyYXkgPSBmdW5jdGlvbiB0ZXN0QXJyYXkgKGluc3RhbmNlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGluc3RhbmNlKTtcbn07XG50eXBlc1snbnVsbCddID0gZnVuY3Rpb24gdGVzdE51bGwgKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZSA9PT0gbnVsbDtcbn07XG50eXBlcy5kYXRlID0gZnVuY3Rpb24gdGVzdERhdGUgKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZSBpbnN0YW5jZW9mIERhdGU7XG59O1xudHlwZXMuYW55ID0gZnVuY3Rpb24gdGVzdEFueSAoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudHlwZXMub2JqZWN0ID0gZnVuY3Rpb24gdGVzdE9iamVjdCAoaW5zdGFuY2UpIHtcbiAgLy8gVE9ETzogZml4IHRoaXMgLSBzZWUgIzE1XG4gIHJldHVybiBpbnN0YW5jZSAmJiAodHlwZW9mIGluc3RhbmNlID09PSAnb2JqZWN0JykgJiYgIShBcnJheS5pc0FycmF5KGluc3RhbmNlKSkgJiYgIShpbnN0YW5jZSBpbnN0YW5jZW9mIERhdGUpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBWYWxpZGF0b3I7XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGlzT2JqZWN0OiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09PSBudWxsO1xuICB9LFxuICBpc051bGxPclVuZGVmaW5lZDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PSBudWxsO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBJZiBvYmouaGFzT3duUHJvcGVydHkgaGFzIGJlZW4gb3ZlcnJpZGRlbiwgdGhlbiBjYWxsaW5nXG4vLyBvYmouaGFzT3duUHJvcGVydHkocHJvcCkgd2lsbCBicmVhay5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzA3XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG1hcChvYmplY3RLZXlzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBtYXAob2JqW2tdLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5mdW5jdGlvbiBtYXAgKHhzLCBmKSB7XG4gIGlmICh4cy5tYXApIHJldHVybiB4cy5tYXAoZik7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5wdXNoKGYoeHNbaV0sIGkpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHJlcy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbi8qKiBAdHlwZSBWYWxpZGF0b3JSZXN1bHQgKi9cbnZhciBWYWxpZGF0b3JSZXN1bHQgPSBoZWxwZXJzLlZhbGlkYXRvclJlc3VsdDtcbi8qKiBAdHlwZSBTY2hlbWFFcnJvciAqL1xudmFyIFNjaGVtYUVycm9yID0gaGVscGVycy5TY2hlbWFFcnJvcjtcblxudmFyIGF0dHJpYnV0ZSA9IHt9O1xuXG5hdHRyaWJ1dGUuaWdub3JlUHJvcGVydGllcyA9IHtcbiAgLy8gaW5mb3JtYXRpdmUgcHJvcGVydGllc1xuICAnaWQnOiB0cnVlLFxuICAnZGVmYXVsdCc6IHRydWUsXG4gICdkZXNjcmlwdGlvbic6IHRydWUsXG4gICd0aXRsZSc6IHRydWUsXG4gIC8vIGFyZ3VtZW50cyB0byBvdGhlciBwcm9wZXJ0aWVzXG4gICdhZGRpdGlvbmFsSXRlbXMnOiB0cnVlLFxuICAndGhlbic6IHRydWUsXG4gICdlbHNlJzogdHJ1ZSxcbiAgLy8gc3BlY2lhbC1oYW5kbGVkIHByb3BlcnRpZXNcbiAgJyRzY2hlbWEnOiB0cnVlLFxuICAnJHJlZic6IHRydWUsXG4gICdleHRlbmRzJzogdHJ1ZSxcbn07XG5cbi8qKlxuICogQG5hbWUgdmFsaWRhdG9yc1xuICovXG52YXIgdmFsaWRhdG9ycyA9IGF0dHJpYnV0ZS52YWxpZGF0b3JzID0ge307XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIGluc3RhbmNlIGlmIG9mIGEgY2VydGFpbiB0eXBlXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtWYWxpZGF0b3JSZXN1bHR8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy50eXBlID0gZnVuY3Rpb24gdmFsaWRhdGVUeXBlIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgLy8gSWdub3JlIHVuZGVmaW5lZCBpbnN0YW5jZXNcbiAgaWYgKGluc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKSA/IHNjaGVtYS50eXBlIDogW3NjaGVtYS50eXBlXTtcbiAgaWYgKCF0eXBlcy5zb21lKHRoaXMudGVzdFR5cGUuYmluZCh0aGlzLCBpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpKSkge1xuICAgIHZhciBsaXN0ID0gdHlwZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICBpZighdikgcmV0dXJuO1xuICAgICAgdmFyIGlkID0gdi4kaWQgfHwgdi5pZDtcbiAgICAgIHJldHVybiBpZCA/ICgnPCcgKyBpZCArICc+JykgOiAodisnJyk7XG4gICAgfSk7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICd0eXBlJyxcbiAgICAgIGFyZ3VtZW50OiBsaXN0LFxuICAgICAgbWVzc2FnZTogXCJpcyBub3Qgb2YgYSB0eXBlKHMpIFwiICsgbGlzdCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZnVuY3Rpb24gdGVzdFNjaGVtYU5vVGhyb3coaW5zdGFuY2UsIG9wdGlvbnMsIGN0eCwgY2FsbGJhY2ssIHNjaGVtYSl7XG4gIHZhciB0aHJvd0Vycm9yID0gb3B0aW9ucy50aHJvd0Vycm9yO1xuICB2YXIgdGhyb3dBbGwgPSBvcHRpb25zLnRocm93QWxsO1xuICBvcHRpb25zLnRocm93RXJyb3IgPSBmYWxzZTtcbiAgb3B0aW9ucy50aHJvd0FsbCA9IGZhbHNlO1xuICB2YXIgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBvcHRpb25zLnRocm93RXJyb3IgPSB0aHJvd0Vycm9yO1xuICBvcHRpb25zLnRocm93QWxsID0gdGhyb3dBbGw7XG5cbiAgaWYgKCFyZXMudmFsaWQgJiYgY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNhbGxiYWNrKHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlcy52YWxpZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgbWF0Y2hlcyBzb21lIG9mIHRoZSBnaXZlbiBzY2hlbWFzXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtWYWxpZGF0b3JSZXN1bHR8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5hbnlPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlQW55T2YgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICAvLyBJZ25vcmUgdW5kZWZpbmVkIGluc3RhbmNlc1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBpbm5lciA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYS5hbnlPZikpe1xuICAgIHRocm93IG5ldyBTY2hlbWFFcnJvcihcImFueU9mIG11c3QgYmUgYW4gYXJyYXlcIik7XG4gIH1cbiAgaWYgKCFzY2hlbWEuYW55T2Yuc29tZShcbiAgICB0ZXN0U2NoZW1hTm9UaHJvdy5iaW5kKFxuICAgICAgdGhpcywgaW5zdGFuY2UsIG9wdGlvbnMsIGN0eCwgZnVuY3Rpb24ocmVzKXtpbm5lci5pbXBvcnRFcnJvcnMocmVzKTt9XG4gICAgKSkpIHtcbiAgICB2YXIgbGlzdCA9IHNjaGVtYS5hbnlPZi5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgIHZhciBpZCA9IHYuJGlkIHx8IHYuaWQ7XG4gICAgICBpZihpZCkgcmV0dXJuICc8JyArIGlkICsgJz4nO1xuICAgICAgcmV0dXJuKHYudGl0bGUgJiYgSlNPTi5zdHJpbmdpZnkodi50aXRsZSkpIHx8ICh2WyckcmVmJ10gJiYgKCc8JyArIHZbJyRyZWYnXSArICc+JykpIHx8ICdbc3Vic2NoZW1hICcraSsnXSc7XG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMubmVzdGVkRXJyb3JzKSB7XG4gICAgICByZXN1bHQuaW1wb3J0RXJyb3JzKGlubmVyKTtcbiAgICB9XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdhbnlPZicsXG4gICAgICBhcmd1bWVudDogbGlzdCxcbiAgICAgIG1lc3NhZ2U6IFwiaXMgbm90IGFueSBvZiBcIiArIGxpc3Quam9pbignLCcpLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBtYXRjaGVzIGV2ZXJ5IGdpdmVuIHNjaGVtYVxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGN0eFxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMuYWxsT2YgPSBmdW5jdGlvbiB2YWxpZGF0ZUFsbE9mIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgLy8gSWdub3JlIHVuZGVmaW5lZCBpbnN0YW5jZXNcbiAgaWYgKGluc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hLmFsbE9mKSl7XG4gICAgdGhyb3cgbmV3IFNjaGVtYUVycm9yKFwiYWxsT2YgbXVzdCBiZSBhbiBhcnJheVwiKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNjaGVtYS5hbGxPZi5mb3JFYWNoKGZ1bmN0aW9uKHYsIGkpe1xuICAgIHZhciB2YWxpZCA9IHNlbGYudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2UsIHYsIG9wdGlvbnMsIGN0eCk7XG4gICAgaWYoIXZhbGlkLnZhbGlkKXtcbiAgICAgIHZhciBpZCA9IHYuJGlkIHx8IHYuaWQ7XG4gICAgICB2YXIgbXNnID0gaWQgfHwgKHYudGl0bGUgJiYgSlNPTi5zdHJpbmdpZnkodi50aXRsZSkpIHx8ICh2WyckcmVmJ10gJiYgKCc8JyArIHZbJyRyZWYnXSArICc+JykpIHx8ICdbc3Vic2NoZW1hICcraSsnXSc7XG4gICAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgICBuYW1lOiAnYWxsT2YnLFxuICAgICAgICBhcmd1bWVudDogeyBpZDogbXNnLCBsZW5ndGg6IHZhbGlkLmVycm9ycy5sZW5ndGgsIHZhbGlkOiB2YWxpZCB9LFxuICAgICAgICBtZXNzYWdlOiAnZG9lcyBub3QgbWF0Y2ggYWxsT2Ygc2NoZW1hICcgKyBtc2cgKyAnIHdpdGggJyArIHZhbGlkLmVycm9ycy5sZW5ndGggKyAnIGVycm9yW3NdOicsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5pbXBvcnRFcnJvcnModmFsaWQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBtYXRjaGVzIGV4YWN0bHkgb25lIG9mIHRoZSBnaXZlbiBzY2hlbWFzXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5vbmVPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlT25lT2YgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICAvLyBJZ25vcmUgdW5kZWZpbmVkIGluc3RhbmNlc1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKXtcbiAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IoXCJvbmVPZiBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBpbm5lciA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIGNvdW50ID0gc2NoZW1hLm9uZU9mLmZpbHRlcihcbiAgICB0ZXN0U2NoZW1hTm9UaHJvdy5iaW5kKFxuICAgICAgdGhpcywgaW5zdGFuY2UsIG9wdGlvbnMsIGN0eCwgZnVuY3Rpb24ocmVzKSB7aW5uZXIuaW1wb3J0RXJyb3JzKHJlcyk7fVxuICAgICkgKS5sZW5ndGg7XG4gIHZhciBsaXN0ID0gc2NoZW1hLm9uZU9mLm1hcChmdW5jdGlvbiAodiwgaSkge1xuICAgIHZhciBpZCA9IHYuJGlkIHx8IHYuaWQ7XG4gICAgcmV0dXJuIGlkIHx8ICh2LnRpdGxlICYmIEpTT04uc3RyaW5naWZ5KHYudGl0bGUpKSB8fCAodlsnJHJlZiddICYmICgnPCcgKyB2WyckcmVmJ10gKyAnPicpKSB8fCAnW3N1YnNjaGVtYSAnK2krJ10nO1xuICB9KTtcbiAgaWYgKGNvdW50IT09MSkge1xuICAgIGlmIChvcHRpb25zLm5lc3RlZEVycm9ycykge1xuICAgICAgcmVzdWx0LmltcG9ydEVycm9ycyhpbm5lcik7XG4gICAgfVxuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnb25lT2YnLFxuICAgICAgYXJndW1lbnQ6IGxpc3QsXG4gICAgICBtZXNzYWdlOiBcImlzIG5vdCBleGFjdGx5IG9uZSBmcm9tIFwiICsgbGlzdC5qb2luKCcsJyksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIFwidGhlblwiIG9yIFwiZWxzZVwiIGRlcGVuZGluZyBvbiB0aGUgcmVzdWx0IG9mIHZhbGlkYXRpbmcgXCJpZlwiXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5pZiA9IGZ1bmN0aW9uIHZhbGlkYXRlSWYgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICAvLyBJZ25vcmUgdW5kZWZpbmVkIGluc3RhbmNlc1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGlmICghaGVscGVycy5pc1NjaGVtYShzY2hlbWEuaWYpKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFwiaWZcIiBrZXl3b3JkIHRvIGJlIGEgc2NoZW1hJyk7XG4gIHZhciBpZlZhbGlkID0gdGVzdFNjaGVtYU5vVGhyb3cuY2FsbCh0aGlzLCBpbnN0YW5jZSwgb3B0aW9ucywgY3R4LCBudWxsLCBzY2hlbWEuaWYpO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgcmVzO1xuICBpZihpZlZhbGlkKXtcbiAgICBpZiAoc2NoZW1hLnRoZW4gPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGlmICghaGVscGVycy5pc1NjaGVtYShzY2hlbWEudGhlbikpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCJ0aGVuXCIga2V5d29yZCB0byBiZSBhIHNjaGVtYScpO1xuICAgIHJlcyA9IHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2UsIHNjaGVtYS50aGVuLCBvcHRpb25zLCBjdHgubWFrZUNoaWxkKHNjaGVtYS50aGVuKSk7XG4gICAgcmVzdWx0LmltcG9ydEVycm9ycyhyZXMpO1xuICB9ZWxzZXtcbiAgICBpZiAoc2NoZW1hLmVsc2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGlmICghaGVscGVycy5pc1NjaGVtYShzY2hlbWEuZWxzZSkpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCJlbHNlXCIga2V5d29yZCB0byBiZSBhIHNjaGVtYScpO1xuICAgIHJlcyA9IHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2UsIHNjaGVtYS5lbHNlLCBvcHRpb25zLCBjdHgubWFrZUNoaWxkKHNjaGVtYS5lbHNlKSk7XG4gICAgcmVzdWx0LmltcG9ydEVycm9ycyhyZXMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlUHJvcGVydHkob2JqZWN0LCBrZXkpe1xuICAvLyBEZXRlcm1pbmUgaWYgYGtleWAgc2hvd3MgdXAgaW4gYGZvcih2YXIga2V5IGluIG9iamVjdClgXG4gIC8vIEZpcnN0IHRlc3QgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwgYXMgYW4gb3B0aW1pemF0aW9uOiB0aGF0IGd1YXJhbnRlZXMgaXQgZG9lc1xuICBpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHJldHVybiBvYmplY3Rba2V5XTtcbiAgLy8gVGVzdCBga2V5IGluIG9iamVjdGAgYXMgYW4gb3B0aW1pemF0aW9uOyBmYWxzZSBtZWFucyBpdCB3b24ndFxuICBpZighKGtleSBpbiBvYmplY3QpKSByZXR1cm47XG4gIHdoaWxlKCAob2JqZWN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCkpICl7XG4gICAgaWYoT2JqZWN0LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBrZXkpKSByZXR1cm4gb2JqZWN0W2tleV07XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgcHJvcGVydHlOYW1lc1xuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGN0eFxuICogQHJldHVybiB7U3RyaW5nfG51bGx8VmFsaWRhdG9yUmVzdWx0fVxuICovXG52YWxpZGF0b3JzLnByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5TmFtZXMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZighdGhpcy50eXBlcy5vYmplY3QoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBzdWJzY2hlbWEgPSBzY2hlbWEucHJvcGVydHlOYW1lcyE9PXVuZGVmaW5lZCA/IHNjaGVtYS5wcm9wZXJ0eU5hbWVzIDoge307XG4gIGlmKCFoZWxwZXJzLmlzU2NoZW1hKHN1YnNjaGVtYSkpIHRocm93IG5ldyBTY2hlbWFFcnJvcignRXhwZWN0ZWQgXCJwcm9wZXJ0eU5hbWVzXCIgdG8gYmUgYSBzY2hlbWEgKG9iamVjdCBvciBib29sZWFuKScpO1xuXG4gIGZvciAodmFyIHByb3BlcnR5IGluIGluc3RhbmNlKSB7XG4gICAgaWYoZ2V0RW51bWVyYWJsZVByb3BlcnR5KGluc3RhbmNlLCBwcm9wZXJ0eSkgIT09IHVuZGVmaW5lZCl7XG4gICAgICB2YXIgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShwcm9wZXJ0eSwgc3Vic2NoZW1hLCBvcHRpb25zLCBjdHgubWFrZUNoaWxkKHN1YnNjaGVtYSkpO1xuICAgICAgcmVzdWx0LmltcG9ydEVycm9ycyhyZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMucHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmKCF0aGlzLnR5cGVzLm9iamVjdChpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIHByb3BlcnRpZXMgPSBzY2hlbWEucHJvcGVydGllcyB8fCB7fTtcbiAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgIHZhciBzdWJzY2hlbWEgPSBwcm9wZXJ0aWVzW3Byb3BlcnR5XTtcbiAgICBpZihzdWJzY2hlbWE9PT11bmRlZmluZWQpe1xuICAgICAgY29udGludWU7XG4gICAgfWVsc2UgaWYoc3Vic2NoZW1hPT09bnVsbCl7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IoJ1VuZXhwZWN0ZWQgbnVsbCwgZXhwZWN0ZWQgc2NoZW1hIGluIFwicHJvcGVydGllc1wiJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wcmVWYWxpZGF0ZVByb3BlcnR5ID09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbnMucHJlVmFsaWRhdGVQcm9wZXJ0eShpbnN0YW5jZSwgcHJvcGVydHksIHN1YnNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgICB9XG4gICAgdmFyIHByb3AgPSBnZXRFbnVtZXJhYmxlUHJvcGVydHkoaW5zdGFuY2UsIHByb3BlcnR5KTtcbiAgICB2YXIgcmVzID0gdGhpcy52YWxpZGF0ZVNjaGVtYShwcm9wLCBzdWJzY2hlbWEsIG9wdGlvbnMsIGN0eC5tYWtlQ2hpbGQoc3Vic2NoZW1hLCBwcm9wZXJ0eSkpO1xuICAgIGlmKHJlcy5pbnN0YW5jZSAhPT0gcmVzdWx0Lmluc3RhbmNlW3Byb3BlcnR5XSkgcmVzdWx0Lmluc3RhbmNlW3Byb3BlcnR5XSA9IHJlcy5pbnN0YW5jZTtcbiAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVGVzdCBhIHNwZWNpZmljIHByb3BlcnR5IHdpdGhpbiBpbiBpbnN0YW5jZSBhZ2FpbnN0IHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBzY2hlbWEgYXR0cmlidXRlXG4gKiBUaGlzIGlnbm9yZXMgcHJvcGVydGllcyB3aXRoIGRlZmluaXRpb25zIGluIHRoZSBwcm9wZXJ0aWVzIHNjaGVtYSBhdHRyaWJ1dGUsIGJ1dCBubyBvdGhlciBhdHRyaWJ1dGVzLlxuICogSWYgdG9vIG1hbnkgbW9yZSB0eXBlcyBvZiBwcm9wZXJ0eS1leGlzdGVuY2UgdGVzdHMgcG9wIHVwIHRoZXkgbWF5IG5lZWQgdGhlaXIgb3duIGNsYXNzIG9mIHRlc3RzIChsaWtlIGB0eXBlYCBoYXMpXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdGVzdEFkZGl0aW9uYWxQcm9wZXJ0eSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4LCBwcm9wZXJ0eSwgcmVzdWx0KSB7XG4gIGlmKCF0aGlzLnR5cGVzLm9iamVjdChpbnN0YW5jZSkpIHJldHVybjtcbiAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdhZGRpdGlvbmFsUHJvcGVydGllcycsXG4gICAgICBhcmd1bWVudDogcHJvcGVydHksXG4gICAgICBtZXNzYWdlOiBcImlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgdGhlIGFkZGl0aW9uYWwgcHJvcGVydHkgXCIgKyBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSksXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzIHx8IHt9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnByZVZhbGlkYXRlUHJvcGVydHkgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucy5wcmVWYWxpZGF0ZVByb3BlcnR5KGluc3RhbmNlLCBwcm9wZXJ0eSwgYWRkaXRpb25hbFByb3BlcnRpZXMsIG9wdGlvbnMsIGN0eCk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2VbcHJvcGVydHldLCBhZGRpdGlvbmFsUHJvcGVydGllcywgb3B0aW9ucywgY3R4Lm1ha2VDaGlsZChhZGRpdGlvbmFsUHJvcGVydGllcywgcHJvcGVydHkpKTtcbiAgICBpZihyZXMuaW5zdGFuY2UgIT09IHJlc3VsdC5pbnN0YW5jZVtwcm9wZXJ0eV0pIHJlc3VsdC5pbnN0YW5jZVtwcm9wZXJ0eV0gPSByZXMuaW5zdGFuY2U7XG4gICAgcmVzdWx0LmltcG9ydEVycm9ycyhyZXMpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHBhdHRlcm5Qcm9wZXJ0aWVzXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMucGF0dGVyblByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVBhdHRlcm5Qcm9wZXJ0aWVzIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYoIXRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgcGF0dGVyblByb3BlcnRpZXMgPSBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMgfHwge307XG5cbiAgZm9yICh2YXIgcHJvcGVydHkgaW4gaW5zdGFuY2UpIHtcbiAgICB2YXIgdGVzdCA9IHRydWU7XG4gICAgZm9yICh2YXIgcGF0dGVybiBpbiBwYXR0ZXJuUHJvcGVydGllcykge1xuICAgICAgdmFyIHN1YnNjaGVtYSA9IHBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5dO1xuICAgICAgaWYoc3Vic2NoZW1hPT09dW5kZWZpbmVkKXtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9ZWxzZSBpZihzdWJzY2hlbWE9PT1udWxsKXtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUVycm9yKCdVbmV4cGVjdGVkIG51bGwsIGV4cGVjdGVkIHNjaGVtYSBpbiBcInBhdHRlcm5Qcm9wZXJ0aWVzXCInKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sICd1Jyk7XG4gICAgICB9IGNhdGNoKF9lKSB7XG4gICAgICAgIC8vIEluIHRoZSBldmVudCB0aGUgc3RyaWN0ZXIgaGFuZGxpbmcgY2F1c2VzIGFuIGVycm9yLCBmYWxsIGJhY2sgb24gdGhlIGZvcmdpdmluZyBoYW5kbGluZ1xuICAgICAgICAvLyBERVBSRUNBVEVEXG4gICAgICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAocGF0dGVybik7XG4gICAgICB9XG4gICAgICBpZiAoIXJlZ2V4cC50ZXN0KHByb3BlcnR5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRlc3QgPSBmYWxzZTtcblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnByZVZhbGlkYXRlUHJvcGVydHkgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25zLnByZVZhbGlkYXRlUHJvcGVydHkoaW5zdGFuY2UsIHByb3BlcnR5LCBzdWJzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXMgPSB0aGlzLnZhbGlkYXRlU2NoZW1hKGluc3RhbmNlW3Byb3BlcnR5XSwgc3Vic2NoZW1hLCBvcHRpb25zLCBjdHgubWFrZUNoaWxkKHN1YnNjaGVtYSwgcHJvcGVydHkpKTtcbiAgICAgIGlmKHJlcy5pbnN0YW5jZSAhPT0gcmVzdWx0Lmluc3RhbmNlW3Byb3BlcnR5XSkgcmVzdWx0Lmluc3RhbmNlW3Byb3BlcnR5XSA9IHJlcy5pbnN0YW5jZTtcbiAgICAgIHJlc3VsdC5pbXBvcnRFcnJvcnMocmVzKTtcbiAgICB9XG4gICAgaWYgKHRlc3QpIHtcbiAgICAgIHRlc3RBZGRpdGlvbmFsUHJvcGVydHkuY2FsbCh0aGlzLCBpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgsIHByb3BlcnR5LCByZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhZGRpdGlvbmFsUHJvcGVydGllc1xuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGN0eFxuICogQHJldHVybiB7U3RyaW5nfG51bGx8VmFsaWRhdG9yUmVzdWx0fVxuICovXG52YWxpZGF0b3JzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZnVuY3Rpb24gdmFsaWRhdGVBZGRpdGlvbmFsUHJvcGVydGllcyAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmKCF0aGlzLnR5cGVzLm9iamVjdChpbnN0YW5jZSkpIHJldHVybjtcbiAgLy8gaWYgcGF0dGVyblByb3BlcnRpZXMgaXMgZGVmaW5lZCB0aGVuIHdlJ2xsIHRlc3Qgd2hlbiB0aGF0IG9uZSBpcyBjYWxsZWQgaW5zdGVhZFxuICBpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgZm9yICh2YXIgcHJvcGVydHkgaW4gaW5zdGFuY2UpIHtcbiAgICB0ZXN0QWRkaXRpb25hbFByb3BlcnR5LmNhbGwodGhpcywgaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4LCBwcm9wZXJ0eSwgcmVzdWx0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYXQgbGVhc3Qgb2YgYSBjZXJ0YWluIGxlbmd0aCwgd2hlbiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBzdHJpbmcuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLm1pblByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU1pblByb3BlcnRpZXMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGluc3RhbmNlKTtcbiAgaWYgKCEoa2V5cy5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdtaW5Qcm9wZXJ0aWVzJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEubWluUHJvcGVydGllcyxcbiAgICAgIG1lc3NhZ2U6IFwiZG9lcyBub3QgbWVldCBtaW5pbXVtIHByb3BlcnR5IGxlbmd0aCBvZiBcIiArIHNjaGVtYS5taW5Qcm9wZXJ0aWVzLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhdCBtb3N0IG9mIGEgY2VydGFpbiBsZW5ndGgsIHdoZW4gdGhlIGluc3RhbmNlIHZhbHVlIGlzIGEgc3RyaW5nLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5tYXhQcm9wZXJ0aWVzID0gZnVuY3Rpb24gdmFsaWRhdGVNYXhQcm9wZXJ0aWVzIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKCF0aGlzLnR5cGVzLm9iamVjdChpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhpbnN0YW5jZSk7XG4gIGlmICghKGtleXMubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnbWF4UHJvcGVydGllcycsXG4gICAgICBhcmd1bWVudDogc2NoZW1hLm1heFByb3BlcnRpZXMsXG4gICAgICBtZXNzYWdlOiBcImRvZXMgbm90IG1lZXQgbWF4aW11bSBwcm9wZXJ0eSBsZW5ndGggb2YgXCIgKyBzY2hlbWEubWF4UHJvcGVydGllcyxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgaXRlbXMgd2hlbiBpbnN0YW5jZSBpcyBhbiBhcnJheVxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGN0eFxuICogQHJldHVybiB7U3RyaW5nfG51bGx8VmFsaWRhdG9yUmVzdWx0fVxuICovXG52YWxpZGF0b3JzLml0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVJdGVtcyAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKCF0aGlzLnR5cGVzLmFycmF5KGluc3RhbmNlKSkgcmV0dXJuO1xuICBpZiAoc2NoZW1hLml0ZW1zPT09dW5kZWZpbmVkKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGluc3RhbmNlLmV2ZXJ5KGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoc2NoZW1hLml0ZW1zKSl7XG4gICAgICB2YXIgaXRlbXMgPSAgc2NoZW1hLml0ZW1zW2ldPT09dW5kZWZpbmVkID8gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA6IHNjaGVtYS5pdGVtc1tpXTtcbiAgICB9ZWxzZXtcbiAgICAgIHZhciBpdGVtcyA9IHNjaGVtYS5pdGVtcztcbiAgICB9XG4gICAgaWYgKGl0ZW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgICBuYW1lOiAnaXRlbXMnLFxuICAgICAgICBtZXNzYWdlOiBcImFkZGl0aW9uYWxJdGVtcyBub3QgcGVybWl0dGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHJlcyA9IHNlbGYudmFsaWRhdGVTY2hlbWEodmFsdWUsIGl0ZW1zLCBvcHRpb25zLCBjdHgubWFrZUNoaWxkKGl0ZW1zLCBpKSk7XG4gICAgaWYocmVzLmluc3RhbmNlICE9PSByZXN1bHQuaW5zdGFuY2VbaV0pIHJlc3VsdC5pbnN0YW5jZVtpXSA9IHJlcy5pbnN0YW5jZTtcbiAgICByZXN1bHQuaW1wb3J0RXJyb3JzKHJlcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIFwiY29udGFpbnNcIiBrZXl3b3JkXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gY3R4XG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbHxWYWxpZGF0b3JSZXN1bHR9XG4gKi9cbnZhbGlkYXRvcnMuY29udGFpbnMgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbnRhaW5zIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoIXRoaXMudHlwZXMuYXJyYXkoaW5zdGFuY2UpKSByZXR1cm47XG4gIGlmIChzY2hlbWEuY29udGFpbnM9PT11bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKCFoZWxwZXJzLmlzU2NoZW1hKHNjaGVtYS5jb250YWlucykpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCJjb250YWluc1wiIGtleXdvcmQgdG8gYmUgYSBzY2hlbWEnKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIGNvdW50ID0gaW5zdGFuY2Uuc29tZShmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICB2YXIgcmVzID0gc2VsZi52YWxpZGF0ZVNjaGVtYSh2YWx1ZSwgc2NoZW1hLmNvbnRhaW5zLCBvcHRpb25zLCBjdHgubWFrZUNoaWxkKHNjaGVtYS5jb250YWlucywgaSkpO1xuICAgIHJldHVybiByZXMuZXJyb3JzLmxlbmd0aD09PTA7XG4gIH0pO1xuICBpZihjb3VudD09PWZhbHNlKXtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ2NvbnRhaW5zJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEuY29udGFpbnMsXG4gICAgICBtZXNzYWdlOiBcIm11c3QgY29udGFpbiBhbiBpdGVtIG1hdGNoaW5nIGdpdmVuIHNjaGVtYVwiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBtaW5pbXVtIGFuZCBleGNsdXNpdmVNaW5pbXVtIHdoZW4gdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5taW5pbXVtID0gZnVuY3Rpb24gdmFsaWRhdGVNaW5pbXVtIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKCF0aGlzLnR5cGVzLm51bWJlcihpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICYmIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgaWYoIShpbnN0YW5jZSA+IHNjaGVtYS5taW5pbXVtKSl7XG4gICAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgICBuYW1lOiAnbWluaW11bScsXG4gICAgICAgIGFyZ3VtZW50OiBzY2hlbWEubWluaW11bSxcbiAgICAgICAgbWVzc2FnZTogXCJtdXN0IGJlIGdyZWF0ZXIgdGhhbiBcIiArIHNjaGVtYS5taW5pbXVtLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmKCEoaW5zdGFuY2UgPj0gc2NoZW1hLm1pbmltdW0pKXtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICAgIG5hbWU6ICdtaW5pbXVtJyxcbiAgICAgICAgYXJndW1lbnQ6IHNjaGVtYS5taW5pbXVtLFxuICAgICAgICBtZXNzYWdlOiBcIm11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFwiICsgc2NoZW1hLm1pbmltdW0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIG1heGltdW0gYW5kIGV4Y2x1c2l2ZU1heGltdW0gd2hlbiB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLm1heGltdW0gPSBmdW5jdGlvbiB2YWxpZGF0ZU1heGltdW0gKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMubnVtYmVyKGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gJiYgc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IHRydWUpIHtcbiAgICBpZighKGluc3RhbmNlIDwgc2NoZW1hLm1heGltdW0pKXtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICAgIG5hbWU6ICdtYXhpbXVtJyxcbiAgICAgICAgYXJndW1lbnQ6IHNjaGVtYS5tYXhpbXVtLFxuICAgICAgICBtZXNzYWdlOiBcIm11c3QgYmUgbGVzcyB0aGFuIFwiICsgc2NoZW1hLm1heGltdW0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYoIShpbnN0YW5jZSA8PSBzY2hlbWEubWF4aW11bSkpe1xuICAgICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgICAgbmFtZTogJ21heGltdW0nLFxuICAgICAgICBhcmd1bWVudDogc2NoZW1hLm1heGltdW0sXG4gICAgICAgIG1lc3NhZ2U6IFwibXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXCIgKyBzY2hlbWEubWF4aW11bSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIG51bWJlciBmb3JtIG9mIGV4Y2x1c2l2ZU1pbmltdW0gd2hlbiB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLmV4Y2x1c2l2ZU1pbmltdW0gPSBmdW5jdGlvbiB2YWxpZGF0ZUV4Y2x1c2l2ZU1pbmltdW0gKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICAvLyBTdXBwb3J0IHRoZSBib29sZWFuIGZvcm0gb2YgZXhjbHVzaXZlTWluaW11bSwgd2hpY2ggaXMgaGFuZGxlZCBieSB0aGUgXCJtaW5pbXVtXCIga2V5d29yZC5cbiAgaWYodHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSAnYm9vbGVhbicpIHJldHVybjtcbiAgaWYgKCF0aGlzLnR5cGVzLm51bWJlcihpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIHZhbGlkID0gaW5zdGFuY2UgPiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bTtcbiAgaWYgKCF2YWxpZCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnZXhjbHVzaXZlTWluaW11bScsXG4gICAgICBhcmd1bWVudDogc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0sXG4gICAgICBtZXNzYWdlOiBcIm11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIFwiICsgc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBudW1iZXIgZm9ybSBvZiBleGNsdXNpdmVNYXhpbXVtIHdoZW4gdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy5leGNsdXNpdmVNYXhpbXVtID0gZnVuY3Rpb24gdmFsaWRhdGVFeGNsdXNpdmVNYXhpbXVtIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgLy8gU3VwcG9ydCB0aGUgYm9vbGVhbiBmb3JtIG9mIGV4Y2x1c2l2ZU1heGltdW0sIHdoaWNoIGlzIGhhbmRsZWQgYnkgdGhlIFwibWF4aW11bVwiIGtleXdvcmQuXG4gIGlmKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm47XG4gIGlmICghdGhpcy50eXBlcy5udW1iZXIoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciB2YWxpZCA9IGluc3RhbmNlIDwgc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW07XG4gIGlmICghdmFsaWQpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ2V4Y2x1c2l2ZU1heGltdW0nLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtLFxuICAgICAgbWVzc2FnZTogXCJtdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiBcIiArIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gdmFsaWRhdGlvbiBmb3IgbXVsdGlwbGVPZiBhbmQgZGl2aXNpYmxlQnksIHdoaWNoIGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZS5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIHZhbGlkYXRpb25UeXBlXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlXG4gKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9XG4gKi9cbnZhciB2YWxpZGF0ZU11bHRpcGxlT2ZPckRpdmlzYmxlQnkgPSBmdW5jdGlvbiB2YWxpZGF0ZU11bHRpcGxlT2ZPckRpdmlzYmxlQnkgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCwgdmFsaWRhdGlvblR5cGUsIGVycm9yTWVzc2FnZSkge1xuICBpZiAoIXRoaXMudHlwZXMubnVtYmVyKGluc3RhbmNlKSkgcmV0dXJuO1xuXG4gIHZhciB2YWxpZGF0aW9uQXJndW1lbnQgPSBzY2hlbWFbdmFsaWRhdGlvblR5cGVdO1xuICBpZiAodmFsaWRhdGlvbkFyZ3VtZW50ID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IodmFsaWRhdGlvblR5cGUgKyBcIiBjYW5ub3QgYmUgemVyb1wiKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG5cbiAgdmFyIGluc3RhbmNlRGVjaW1hbHMgPSBoZWxwZXJzLmdldERlY2ltYWxQbGFjZXMoaW5zdGFuY2UpO1xuICB2YXIgZGl2aXNvckRlY2ltYWxzID0gaGVscGVycy5nZXREZWNpbWFsUGxhY2VzKHZhbGlkYXRpb25Bcmd1bWVudCk7XG5cbiAgdmFyIG1heERlY2ltYWxzID0gTWF0aC5tYXgoaW5zdGFuY2VEZWNpbWFscyAsIGRpdmlzb3JEZWNpbWFscyk7XG4gIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIG1heERlY2ltYWxzKTtcblxuICBpZiAoTWF0aC5yb3VuZChpbnN0YW5jZSAqIG11bHRpcGxpZXIpICUgTWF0aC5yb3VuZCh2YWxpZGF0aW9uQXJndW1lbnQgKiBtdWx0aXBsaWVyKSAhPT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiB2YWxpZGF0aW9uVHlwZSxcbiAgICAgIGFyZ3VtZW50OiAgdmFsaWRhdGlvbkFyZ3VtZW50LFxuICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlICsgSlNPTi5zdHJpbmdpZnkodmFsaWRhdGlvbkFyZ3VtZW50KSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBkaXZpc2libGVCeSB3aGVuIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMubXVsdGlwbGVPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlTXVsdGlwbGVPZiAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIHJldHVybiB2YWxpZGF0ZU11bHRpcGxlT2ZPckRpdmlzYmxlQnkuY2FsbCh0aGlzLCBpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgsIFwibXVsdGlwbGVPZlwiLCBcImlzIG5vdCBhIG11bHRpcGxlIG9mIChkaXZpc2libGUgYnkpIFwiKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIG11bHRpcGxlT2Ygd2hlbiB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLmRpdmlzaWJsZUJ5ID0gZnVuY3Rpb24gdmFsaWRhdGVEaXZpc2libGVCeSAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIHJldHVybiB2YWxpZGF0ZU11bHRpcGxlT2ZPckRpdmlzYmxlQnkuY2FsbCh0aGlzLCBpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgsIFwiZGl2aXNpYmxlQnlcIiwgXCJpcyBub3QgZGl2aXNpYmxlIGJ5IChtdWx0aXBsZSBvZikgXCIpO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgcHJlc2VudC5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMucmVxdWlyZWQgPSBmdW5jdGlvbiB2YWxpZGF0ZVJlcXVpcmVkIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaWYgKGluc3RhbmNlID09PSB1bmRlZmluZWQgJiYgc2NoZW1hLnJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgLy8gQSBib29sZWFuIGZvcm0gaXMgaW1wbGVtZW50ZWQgZm9yIHJldmVyc2UtY29tcGF0aWJpbGl0eSB3aXRoIHNjaGVtYXMgd3JpdHRlbiBhZ2FpbnN0IG9sZGVyIGRyYWZ0c1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAncmVxdWlyZWQnLFxuICAgICAgbWVzc2FnZTogXCJpcyByZXF1aXJlZFwiLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHRoaXMudHlwZXMub2JqZWN0KGluc3RhbmNlKSAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkpIHtcbiAgICBzY2hlbWEucmVxdWlyZWQuZm9yRWFjaChmdW5jdGlvbihuKXtcbiAgICAgIGlmKGdldEVudW1lcmFibGVQcm9wZXJ0eShpbnN0YW5jZSwgbik9PT11bmRlZmluZWQpe1xuICAgICAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgICAgIG5hbWU6ICdyZXF1aXJlZCcsXG4gICAgICAgICAgYXJndW1lbnQ6IG4sXG4gICAgICAgICAgbWVzc2FnZTogXCJyZXF1aXJlcyBwcm9wZXJ0eSBcIiArIEpTT04uc3RyaW5naWZ5KG4pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgdmFsdWUgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLCB3aGVuIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMucGF0dGVybiA9IGZ1bmN0aW9uIHZhbGlkYXRlUGF0dGVybiAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmICghdGhpcy50eXBlcy5zdHJpbmcoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIHZhciBwYXR0ZXJuID0gc2NoZW1hLnBhdHRlcm47XG4gIHRyeSB7XG4gICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ3UnKTtcbiAgfSBjYXRjaChfZSkge1xuICAgIC8vIEluIHRoZSBldmVudCB0aGUgc3RyaWN0ZXIgaGFuZGxpbmcgY2F1c2VzIGFuIGVycm9yLCBmYWxsIGJhY2sgb24gdGhlIGZvcmdpdmluZyBoYW5kbGluZ1xuICAgIC8vIERFUFJFQ0FURURcbiAgICByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICB9XG4gIGlmICghaW5zdGFuY2UubWF0Y2gocmVnZXhwKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAncGF0dGVybicsXG4gICAgICBhcmd1bWVudDogc2NoZW1hLnBhdHRlcm4sXG4gICAgICBtZXNzYWdlOiBcImRvZXMgbm90IG1hdGNoIHBhdHRlcm4gXCIgKyBKU09OLnN0cmluZ2lmeShzY2hlbWEucGF0dGVybi50b1N0cmluZygpKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgb2YgYSBjZXJ0YWluIGRlZmluZWQgZm9ybWF0IG9yIGEgY3VzdG9tXG4gKiBmb3JtYXQuXG4gKiBUaGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCBmb3Igc3RyaW5nIHR5cGVzOlxuICogICAtIGRhdGUtdGltZVxuICogICAtIGRhdGVcbiAqICAgLSB0aW1lXG4gKiAgIC0gaXAtYWRkcmVzc1xuICogICAtIGlwdjZcbiAqICAgLSB1cmlcbiAqICAgLSBjb2xvclxuICogICAtIGhvc3QtbmFtZVxuICogICAtIGFscGhhXG4gKiAgIC0gYWxwaGEtbnVtZXJpY1xuICogICAtIHV0Yy1taWxsaXNlY1xuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gW29wdGlvbnNdXG4gKiBAcGFyYW0gW2N0eF1cbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLmZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0IChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKGluc3RhbmNlPT09dW5kZWZpbmVkKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGlmICghcmVzdWx0LmRpc2FibGVGb3JtYXQgJiYgIWhlbHBlcnMuaXNGb3JtYXQoaW5zdGFuY2UsIHNjaGVtYS5mb3JtYXQsIHRoaXMpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgIG5hbWU6ICdmb3JtYXQnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5mb3JtYXQsXG4gICAgICBtZXNzYWdlOiBcImRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIFwiICsgSlNPTi5zdHJpbmdpZnkoc2NoZW1hLmZvcm1hdCkgKyBcIiBmb3JtYXRcIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYXQgbGVhc3Qgb2YgYSBjZXJ0YWluIGxlbmd0aCwgd2hlbiB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYSBzdHJpbmcuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLm1pbkxlbmd0aCA9IGZ1bmN0aW9uIHZhbGlkYXRlTWluTGVuZ3RoIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKCF0aGlzLnR5cGVzLnN0cmluZyhpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgdmFyIGhzcCA9IGluc3RhbmNlLm1hdGNoKC9bXFx1REMwMC1cXHVERkZGXS9nKTtcbiAgdmFyIGxlbmd0aCA9IGluc3RhbmNlLmxlbmd0aCAtIChoc3AgPyBoc3AubGVuZ3RoIDogMCk7XG4gIGlmICghKGxlbmd0aCA+PSBzY2hlbWEubWluTGVuZ3RoKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnbWluTGVuZ3RoJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEubWluTGVuZ3RoLFxuICAgICAgbWVzc2FnZTogXCJkb2VzIG5vdCBtZWV0IG1pbmltdW0gbGVuZ3RoIG9mIFwiICsgc2NoZW1hLm1pbkxlbmd0aCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgYXQgbW9zdCBvZiBhIGNlcnRhaW4gbGVuZ3RoLCB3aGVuIHRoZSBpbnN0YW5jZSB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMubWF4TGVuZ3RoID0gZnVuY3Rpb24gdmFsaWRhdGVNYXhMZW5ndGggKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoIXRoaXMudHlwZXMuc3RyaW5nKGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICAvLyBUT0RPIGlmIHRoaXMgd2FzIGFscmVhZHkgY29tcHV0ZWQgaW4gXCJtaW5MZW5ndGhcIiwgdXNlIHRoYXQgdmFsdWUgaW5zdGVhZCBvZiByZS1jb21wdXRpbmdcbiAgdmFyIGhzcCA9IGluc3RhbmNlLm1hdGNoKC9bXFx1REMwMC1cXHVERkZGXS9nKTtcbiAgdmFyIGxlbmd0aCA9IGluc3RhbmNlLmxlbmd0aCAtIChoc3AgPyBoc3AubGVuZ3RoIDogMCk7XG4gIGlmICghKGxlbmd0aCA8PSBzY2hlbWEubWF4TGVuZ3RoKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnbWF4TGVuZ3RoJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEubWF4TGVuZ3RoLFxuICAgICAgbWVzc2FnZTogXCJkb2VzIG5vdCBtZWV0IG1heGltdW0gbGVuZ3RoIG9mIFwiICsgc2NoZW1hLm1heExlbmd0aCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciBpbnN0YW5jZSBjb250YWlucyBhdCBsZWFzdCBhIG1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zLCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhbiBBcnJheS5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHJldHVybiB7U3RyaW5nfG51bGx9XG4gKi9cbnZhbGlkYXRvcnMubWluSXRlbXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU1pbkl0ZW1zIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKCF0aGlzLnR5cGVzLmFycmF5KGluc3RhbmNlKSkgcmV0dXJuO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoIShpbnN0YW5jZS5sZW5ndGggPj0gc2NoZW1hLm1pbkl0ZW1zKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICBuYW1lOiAnbWluSXRlbXMnLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYS5taW5JdGVtcyxcbiAgICAgIG1lc3NhZ2U6IFwiZG9lcyBub3QgbWVldCBtaW5pbXVtIGxlbmd0aCBvZiBcIiArIHNjaGVtYS5taW5JdGVtcyxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciBpbnN0YW5jZSBjb250YWlucyBubyBtb3JlIHRoYW4gYSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcywgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYW4gQXJyYXkuXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1N0cmluZ3xudWxsfVxuICovXG52YWxpZGF0b3JzLm1heEl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVNYXhJdGVtcyAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIGlmICghdGhpcy50eXBlcy5hcnJheShpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgaWYgKCEoaW5zdGFuY2UubGVuZ3RoIDw9IHNjaGVtYS5tYXhJdGVtcykpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ21heEl0ZW1zJyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWEubWF4SXRlbXMsXG4gICAgICBtZXNzYWdlOiBcImRvZXMgbm90IG1lZXQgbWF4aW11bSBsZW5ndGggb2YgXCIgKyBzY2hlbWEubWF4SXRlbXMsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogRGVlcCBjb21wYXJlcyBhcnJheXMgZm9yIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB2XG4gKiBAcGFyYW0gaVxuICogQHBhcmFtIGFcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0ZXN0QXJyYXlzICh2LCBpLCBhKSB7XG4gIHZhciBqLCBsZW4gPSBhLmxlbmd0aDtcbiAgZm9yIChqID0gaSArIDEsIGxlbjsgaiA8IGxlbjsgaisrKSB7XG4gICAgaWYgKGhlbHBlcnMuZGVlcENvbXBhcmVTdHJpY3QodiwgYVtqXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZXMsIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFuIEFycmF5LlxuICogQHBhcmFtIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtTdHJpbmd8bnVsbH1cbiAqL1xudmFsaWRhdG9ycy51bmlxdWVJdGVtcyA9IGZ1bmN0aW9uIHZhbGlkYXRlVW5pcXVlSXRlbXMgKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoc2NoZW1hLnVuaXF1ZUl0ZW1zIT09dHJ1ZSkgcmV0dXJuO1xuICBpZiAoIXRoaXMudHlwZXMuYXJyYXkoaW5zdGFuY2UpKSByZXR1cm47XG4gIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCk7XG4gIGlmICghaW5zdGFuY2UuZXZlcnkodGVzdEFycmF5cykpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ3VuaXF1ZUl0ZW1zJyxcbiAgICAgIG1lc3NhZ2U6IFwiY29udGFpbnMgZHVwbGljYXRlIGl0ZW1cIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBmb3IgdGhlIHByZXNlbmNlIG9mIGRlcGVuZGVuY3kgcHJvcGVydGllcywgaWYgdGhlIGluc3RhbmNlIGlzIGFuIG9iamVjdC5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge251bGx8VmFsaWRhdG9yUmVzdWx0fVxuICovXG52YWxpZGF0b3JzLmRlcGVuZGVuY2llcyA9IGZ1bmN0aW9uIHZhbGlkYXRlRGVwZW5kZW5jaWVzIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKCF0aGlzLnR5cGVzLm9iamVjdChpbnN0YW5jZSkpIHJldHVybjtcbiAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KTtcbiAgZm9yICh2YXIgcHJvcGVydHkgaW4gc2NoZW1hLmRlcGVuZGVuY2llcykge1xuICAgIGlmIChpbnN0YW5jZVtwcm9wZXJ0eV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBkZXAgPSBzY2hlbWEuZGVwZW5kZW5jaWVzW3Byb3BlcnR5XTtcbiAgICB2YXIgY2hpbGRDb250ZXh0ID0gY3R4Lm1ha2VDaGlsZChkZXAsIHByb3BlcnR5KTtcbiAgICBpZiAodHlwZW9mIGRlcCA9PSAnc3RyaW5nJykge1xuICAgICAgZGVwID0gW2RlcF07XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGRlcCkpIHtcbiAgICAgIGRlcC5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZVtwcm9wXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgICAgICAgIC8vIEZJWE1FIHRoZXJlJ3MgdHdvIGRpZmZlcmVudCBcImRlcGVuZGVuY2llc1wiIGVycm9ycyBoZXJlIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IG91dHB1dHNcbiAgICAgICAgICAgIC8vIENhbiB3ZSBtYWtlIHRoZXNlIHRoZSBzYW1lPyBPciBzaG91bGQgd2UgY3JlYXRlIGRpZmZlcmVudCBlcnJvciB0eXBlcz9cbiAgICAgICAgICAgIG5hbWU6ICdkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgYXJndW1lbnQ6IGNoaWxkQ29udGV4dC5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICBtZXNzYWdlOiBcInByb3BlcnR5IFwiICsgcHJvcCArIFwiIG5vdCBmb3VuZCwgcmVxdWlyZWQgYnkgXCIgKyBjaGlsZENvbnRleHQucHJvcGVydHlQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlcyA9IHRoaXMudmFsaWRhdGVTY2hlbWEoaW5zdGFuY2UsIGRlcCwgb3B0aW9ucywgY2hpbGRDb250ZXh0KTtcbiAgICAgIGlmKHJlc3VsdC5pbnN0YW5jZSAhPT0gcmVzLmluc3RhbmNlKSByZXN1bHQuaW5zdGFuY2UgPSByZXMuaW5zdGFuY2U7XG4gICAgICBpZiAocmVzICYmIHJlcy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcih7XG4gICAgICAgICAgbmFtZTogJ2RlcGVuZGVuY2llcycsXG4gICAgICAgICAgYXJndW1lbnQ6IGNoaWxkQ29udGV4dC5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgbWVzc2FnZTogXCJkb2VzIG5vdCBtZWV0IGRlcGVuZGVuY3kgcmVxdWlyZWQgYnkgXCIgKyBjaGlsZENvbnRleHQucHJvcGVydHlQYXRoLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LmltcG9ydEVycm9ycyhyZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgdmFsdWUgaXMgb25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1ZhbGlkYXRvclJlc3VsdHxudWxsfVxuICovXG52YWxpZGF0b3JzWydlbnVtJ10gPSBmdW5jdGlvbiB2YWxpZGF0ZUVudW0gKGluc3RhbmNlLCBzY2hlbWEsIG9wdGlvbnMsIGN0eCkge1xuICBpZiAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWFbJ2VudW0nXSkpIHtcbiAgICB0aHJvdyBuZXcgU2NoZW1hRXJyb3IoXCJlbnVtIGV4cGVjdHMgYW4gYXJyYXlcIiwgc2NoZW1hKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoIXNjaGVtYVsnZW51bSddLnNvbWUoaGVscGVycy5kZWVwQ29tcGFyZVN0cmljdC5iaW5kKG51bGwsIGluc3RhbmNlKSkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ2VudW0nLFxuICAgICAgYXJndW1lbnQ6IHNjaGVtYVsnZW51bSddLFxuICAgICAgbWVzc2FnZTogXCJpcyBub3Qgb25lIG9mIGVudW0gdmFsdWVzOiBcIiArIHNjaGVtYVsnZW51bSddLm1hcChTdHJpbmcpLmpvaW4oJywnKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgZXhhY3RseSBtYXRjaGVzIGEgZ2l2ZW4gdmFsdWVcbiAqXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBzY2hlbWFcbiAqIEByZXR1cm4ge1ZhbGlkYXRvclJlc3VsdHxudWxsfVxuICovXG52YWxpZGF0b3JzWydjb25zdCddID0gZnVuY3Rpb24gdmFsaWRhdGVFbnVtIChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpIHtcbiAgaWYgKGluc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICBpZiAoIWhlbHBlcnMuZGVlcENvbXBhcmVTdHJpY3Qoc2NoZW1hWydjb25zdCddLCBpbnN0YW5jZSkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3Ioe1xuICAgICAgbmFtZTogJ2NvbnN0JyxcbiAgICAgIGFyZ3VtZW50OiBzY2hlbWFbJ2NvbnN0J10sXG4gICAgICBtZXNzYWdlOiBcImRvZXMgbm90IGV4YWN0bHkgbWF0Y2ggZXhwZWN0ZWQgY29uc3RhbnQ6IFwiICsgc2NoZW1hWydjb25zdCddLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBpZiBvZiBhIHByb2hpYml0ZWQgdHlwZS5cbiAqIEBwYXJhbSBpbnN0YW5jZVxuICogQHBhcmFtIHNjaGVtYVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjdHhcbiAqIEByZXR1cm4ge251bGx8VmFsaWRhdG9yUmVzdWx0fVxuICovXG52YWxpZGF0b3JzLm5vdCA9IHZhbGlkYXRvcnMuZGlzYWxsb3cgPSBmdW5jdGlvbiB2YWxpZGF0ZU5vdCAoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYoaW5zdGFuY2U9PT11bmRlZmluZWQpIHJldHVybiBudWxsO1xuICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChpbnN0YW5jZSwgc2NoZW1hLCBvcHRpb25zLCBjdHgpO1xuICB2YXIgbm90VHlwZXMgPSBzY2hlbWEubm90IHx8IHNjaGVtYS5kaXNhbGxvdztcbiAgaWYoIW5vdFR5cGVzKSByZXR1cm4gbnVsbDtcbiAgaWYoIUFycmF5LmlzQXJyYXkobm90VHlwZXMpKSBub3RUeXBlcz1bbm90VHlwZXNdO1xuICBub3RUeXBlcy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHNlbGYudGVzdFR5cGUoaW5zdGFuY2UsIHNjaGVtYSwgb3B0aW9ucywgY3R4LCB0eXBlKSkge1xuICAgICAgdmFyIGlkID0gdHlwZSAmJiAodHlwZS4kaWQgfHwgdHlwZS5pZCk7XG4gICAgICB2YXIgc2NoZW1hSWQgPSBpZCB8fCB0eXBlO1xuICAgICAgcmVzdWx0LmFkZEVycm9yKHtcbiAgICAgICAgbmFtZTogJ25vdCcsXG4gICAgICAgIGFyZ3VtZW50OiBzY2hlbWFJZCxcbiAgICAgICAgbWVzc2FnZTogXCJpcyBvZiBwcm9oaWJpdGVkIHR5cGUgXCIgKyBzY2hlbWFJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF0dHJpYnV0ZTtcbiIsImltcG9ydCBOZW9uVmlldyBmcm9tICcuLi8uLi9OZW9uVmlldyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuLi9Nb2RhbFdpbmRvdyc7XG5cbmFzeW5jIGZ1bmN0aW9uIHNldEJvZHkgKG5lb25WaWV3OiBOZW9uVmlldyk6IFByb21pc2U8dm9pZD4ge1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvdGVtcGxhdGUuaHRtbGApO1xuICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdob21lLWxpbmsnKSBhcyBIVE1MQW5jaG9yRWxlbWVudCkuaHJlZiA9IF9fTElOS19MT0NBVElPTl9fO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVvbi12ZXJzaW9uJykudGV4dENvbnRlbnQgPSBfX05FT05fVkVSU0lPTl9fO1xuICAoPEhUTUxJbWFnZUVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZW9uLW1haW4taWNvbicpKS5zcmMgPSBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvTmVvbl9JY29uXzMuc3ZnYDtcbiAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdleHRlcm5hbC1saW5rLWljb24nKSkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAoPEhUTUxJbWFnZUVsZW1lbnQ+IGVsKS5zcmMgPSBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvZXh0ZXJuYWwtbGluay5zdmdgO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZW5hbWUnKS5pbm5lclRleHQgPSBuZW9uVmlldy5tYW5pZmVzdC50aXRsZTtcbiAgZG9jdW1lbnQudGl0bGUgPSBuZW9uVmlldy5tYW5pZmVzdC50aXRsZTtcbiAgXG4gIC8vIGhvdGtleSBidG4gb25jbGljayBldmVudCBsaXN0ZW5lclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2YmFyLWl0ZW0taG90a2V5cycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgbmVvblZpZXcubW9kYWwuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5IT1RLRVlTKTtcbiAgICBuZW9uVmlldy5tb2RhbC5vcGVuTW9kYWxXaW5kb3coKTtcbiAgfSk7XG5cbiAgLy8gc2V0IFxuICBjb25zdCBkZWJ1Z01vZGVUb29sdGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJyNkZWJ1Zy1tb2RlLXRvb2x0aXAtaWNvbicpO1xuICBkZWJ1Z01vZGVUb29sdGlwLnNldEF0dHJpYnV0ZSgnc3JjJywgYCR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2RlYnVnLXRvb2x0aXAtbGlnaHQuc3ZnYCk7XG5cbiAgLy8gc2V0IGluaXRpYWwgc2F2ZWQgc3RhdHVzXG4gIGNvbnN0IGluZGljYXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KCcjZmlsZS1zYXZlZCcpO1xuICBpbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdzcmMnLCBgJHtfX0FTU0VUX1BSRUZJWF9ffWFzc2V0cy9pbWcvc2F2ZWQtaWNvbi5zdmdgKTtcbiAgaW5kaWNhdG9yLnNldEF0dHJpYnV0ZSgnYWx0JywgJ1lvdXIgd29yayBpcyBzYXZlZCcpO1xufVxuXG5leHBvcnQgeyBzZXRCb2R5IGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IGluaXRFcnJvckxvZywgdXBkYXRlRXJyb3JMb2dWaXNpYmlsaXR5IH0gZnJvbSAnLi9FcnJvckxvZyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncywgc2V0U2V0dGluZ3MgfSBmcm9tICcuL0xvY2FsU2V0dGluZ3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVidWdNb2RlKCk6IHZvaWQge1xuICBjb25zdCBkZWJ1Z01vZGVDaGVja2JveCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNkZWJ1Zy1tb2RlLWNoZWNrYm94Jyk7XG5cbiAgY29uc3QgeyBkZWJ1Z01vZGUgfSA9IGdldFNldHRpbmdzKCk7XG5cbiAgZGVidWdNb2RlQ2hlY2tib3guY2hlY2tlZCA9IGRlYnVnTW9kZTtcblxuICBpbml0RXJyb3JMb2coKTtcblxuICB1cGRhdGVEZWJ1Z01vZGVTdGF0dXMoKTtcblxuICBkZWJ1Z01vZGVDaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB1cGRhdGVEZWJ1Z01vZGVTdGF0dXMoKTtcbiAgfSk7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURlYnVnTW9kZVN0YXR1cygpOiB2b2lkIHtcbiAgY29uc3QgZGVidWdNb2RlQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVidWctbW9kZS1jaGVja2JveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIHNldFNldHRpbmdzKHsgZGVidWdNb2RlOiBkZWJ1Z01vZGVDaGVja2JveC5jaGVja2VkIH0pO1xuXG4gIGNvbnN0IGVycm9yTG9nTGFiZWwgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktZXJyb3JzJykucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgY29uc3Qgbm90aWZQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlcnJvcl9sb2cnKTtcbiAgaWYgKGRlYnVnTW9kZUNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICBlcnJvckxvZ0xhYmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuICBlbHNlIHtcbiAgICBlcnJvckxvZ0xhYmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgbm90aWZQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gIH1cblxuICB1cGRhdGVFcnJvckxvZ1Zpc2liaWxpdHkoKTtcbn0iLCJpbXBvcnQgKiBhcyBEaXNwbGF5Q29udHJvbHMgZnJvbSAnLi9EaXNwbGF5Q29udHJvbHMnO1xuaW1wb3J0IFpvb21IYW5kbGVyIGZyb20gJy4uL1NpbmdsZVZpZXcvWm9vbSc7XG5pbXBvcnQgeyBEaXNwbGF5SW50ZXJmYWNlLCBWaWV3SW50ZXJmYWNlIH0gZnJvbSAnLi4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4uL3V0aWxzL0xvY2FsU2V0dGluZ3MnO1xuXG4vKipcbiAqIFJldHVybiB0aGUgSFRNTCBmb3IgdGhlIGRpc3BsYXkgcGFuZWwuXG4gKiBAcGFyYW0ge1pvb21IYW5kbGVyfSBoYW5kbGVab29tIC0gSW5jbHVkZXMgem9vbSBjb250cm9scyBpZiBkZWZpbmVkLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZGlzcGxheUNvbnRyb2xzUGFuZWwgKGhhbmRsZVpvb206IFpvb21IYW5kbGVyKTogc3RyaW5nIHtcbiAgbGV0IGNvbnRlbnRzID0gYFxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgaWQ9XCJkaXNwbGF5SGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZy10aXRsZVwiPkRJU1BMQVk8L2Rpdj5cbiAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGlzLXB1bGxlZC1yaWdodFwiPlxuICAgICAgICA8dXNlIGlkPVwidG9nZ2xlRGlzcGxheVwiIGNsYXNzPVwicGFuZWwtZHJvcGRvd24taWNvblwiIHhsaW5rOmhyZWY9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9pY29ucy5zdmcjZHJvcGRvd24tZG93blwiPjwvdXNlPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cImRpc3BsYXlDb250ZW50c1wiIGNsYXNzPVwicGFuZWwtY29udGVudHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1jb250ZW50LXN1YnNlY3Rpb24gZmlyc3Qtc3Vic2VjdGlvblwiIGlkPVwiZGlzcGxheS1zbGlkZXItc2VjdGlvblwiPlxuICBgO1xuXG4gIGlmIChoYW5kbGVab29tICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb250ZW50cyArPSBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYW5kLXNsaWRlci1hY3Rpb25zLWNvbnRhaW5lciBkaXNwbGF5LXBhbmVsXCIgc3R5bGU9XCJjdXJzb3I6IGRlZmF1bHRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1zbGlkZXItdGl0bGVcIj5ab29tPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2xpZGVyLWJ0blwiIGlkPVwicmVzZXQtem9vbVwiIHRpdGxlPVwiUmVzZXQgem9vbSBzZXR0aW5nXCI+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzbGlkZXItYnRuLWltZ1wiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2Fycm93LXJvdGF0ZS1sZWZ0LXNvbGlkLnN2Z1wiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2xpZGVyLWJ0blwiIGlkPVwic2V0LXpvb20tZWFzeS1lZGl0XCIgdGl0bGU9XCJGaXQgdG8gcGFnZVwiPlxuICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwic2xpZGVyLWJ0bi1pbWdcIiBzcmM9XCIke19fQVNTRVRfUFJFRklYX199YXNzZXRzL2ltZy9leHBhbmQtaWNvbi5zdmdcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjVcIiBtaW49XCIyNVwiIG1heD1cIjQwMFwiIHZhbHVlPVwiMTAwXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwicmVzZXQtem9vbVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2xpZGVyIGlzLWZ1bGx3aWR0aCBpcy1sYXJnZVwiXG4gICAgICAgICAgICAgIGlkPVwiem9vbVNsaWRlclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxcmVtOyBwYWRkaW5nLXJpZ2h0OiAxcmVtO1wiXG4gICAgICAgICAgICAgIGRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxvdXRwdXQgaWQ9XCJ6b29tT3V0cHV0XCIgZm9yPVwiem9vbVNsaWRlclwiPjEwMDwvb3V0cHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gO1xuICB9XG4gIGNvbnRlbnRzICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1hbmQtc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyIGRpc3BsYXktcGFuZWxcIiBzdHlsZT1cImN1cnNvcjogZGVmYXVsdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1zbGlkZXItdGl0bGVcIj5HbHlwaCBPcGFjaXR5PC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2lkZS1wYW5lbC1idG4gc2xpZGVyLWJ0blwiIGlkPVwidG9nZ2xlLWdseXBoLW9wYWNpdHlcIj5cbiAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInNsaWRlci1idG4taW1nXCIgc3JjPVwiJHtfX0FTU0VUX1BSRUZJWF9ffS9hc3NldHMvaW1nL2hpZGUtaWNvbi5zdmdcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPiAgIFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjVcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgdmFsdWU9XCIxMDBcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJ0b2dnbGUtZ2x5cGgtb3BhY2l0eVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2xpZGVyIGlzLWZ1bGx3aWR0aCBpcy1sYXJnZVwiXG4gICAgICAgICAgICAgIGlkPVwib3BhY2l0eVNsaWRlclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxcmVtOyBwYWRkaW5nLXJpZ2h0OiAxcmVtO1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG91dHB1dCBpZD1cIm9wYWNpdHlPdXRwdXRcIiBmb3I9XCJvcGFjaXR5U2xpZGVyXCI+MTAwPC9vdXRwdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1hbmQtc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyIGRpc3BsYXktcGFuZWxcIiBzdHlsZT1cImN1cnNvcjogZGVmYXVsdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1zbGlkZXItdGl0bGVcIj5JbWFnZSBPcGFjaXR5PC9kaXY+IFxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuIHNsaWRlci1idG5cIiBpZD1cInRvZ2dsZS1iZy1vcGFjaXR5XCI+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzbGlkZXItYnRuLWltZ1wiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX30vYXNzZXRzL2ltZy9oaWRlLWljb24uc3ZnXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj4gICBcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIHN0ZXA9XCI1XCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHZhbHVlPVwiMTAwXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwidG9nZ2xlLWJnLW9wYWNpdHlcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNsaWRlciBpcy1mdWxsd2lkdGggaXMtbGFyZ2VcIlxuICAgICAgICAgICAgICBpZD1cImJnT3BhY2l0eVNsaWRlclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxcmVtOyBwYWRkaW5nLXJpZ2h0OiAxcmVtO1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG91dHB1dCBpZD1cImJnT3BhY2l0eU91dHB1dFwiIGZvcj1cImJnT3BhY2l0eVNsaWRlclwiPjEwMDwvb3V0cHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtY29udGVudC1zdWJzZWN0aW9uXCI+XG5cbiAgICAgICAgPGRpdiBpZD1cImhpZ2hsaWdodC1vcHRpb25zLXRpdGxlXCIgY2xhc3M9XCJwYW5lbC1zdWItdGl0bGVcIj5IaWdobGlnaHQgT3B0aW9uczo8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgaWQ9XCJoaWdobGlnaHQtZHJvcGRvd25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJoaWdobGlnaHQtYnV0dG9uXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWNvbnRyb2xzPVwiaGlnaGxpZ2h0LW1lbnVcIiBzdHlsZT1cIndpZHRoOiBhdXRvXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkhpZ2hsaWdodDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJoaWdobGlnaHQtdHlwZVwiPiZuYnNwOy0gT2ZmPC9zcGFuPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgIDx1c2UgaWQ9XCJ0b2dnbGVEaXNwbGF5XCIgeGxpbms6aHJlZj1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2ljb25zLnN2ZyNkcm9wZG93bi1kb3duXCI+PC91c2U+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cImhpZ2hsaWdodC1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxhIGFyaWEtcm9sZT1cIm1lbnVpdGVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaWQ9XCJoaWdobGlnaHQtc2VsZWN0aW9uXCI+QnkgU2VsZWN0aW9uIE1vZGU8L2E+XG4gICAgICAgICAgICAgIDxociBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIi8+XG4gICAgICAgICAgICAgIDxhIGFyaWEtcm9sZT1cIm1lbnVpdGVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaWQ9XCJoaWdobGlnaHQtY29sdW1uXCI+Q29sdW1uPC9hPlxuICAgICAgICAgICAgICA8YSBhcmlhLXJvbGU9XCJtZW51aXRlbVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGlkPVwiaGlnaGxpZ2h0LXN0YWZmXCI+U3RhZmY8L2E+XG4gICAgICAgICAgICAgIDxhIGFyaWEtcm9sZT1cIm1lbnVpdGVtXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaWQ9XCJoaWdobGlnaHQtc3lsbGFibGVcIj5TeWxsYWJsZTwvYT5cbiAgICAgICAgICAgICAgPGEgYXJpYS1yb2xlPVwibWVudWl0ZW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBpZD1cImhpZ2hsaWdodC1uZXVtZVwiPk5ldW1lPC9hPlxuICAgICAgICAgICAgICA8YSBhcmlhLXJvbGU9XCJtZW51aXRlbVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGlkPVwiaGlnaGxpZ2h0LWxheWVyRWxlbWVudFwiPkxheWVyRWxlbWVudDwvYT5cbiAgICAgICAgICAgICAgPGhyIGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiLz5cbiAgICAgICAgICAgICAgPGEgYXJpYS1yb2xlPVwibWVudWl0ZW1cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBpZD1cImhpZ2hsaWdodC1ub25lXCI+Tm9uZTwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtY29udGVudC1zdWJzZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkaXNwbGF5LW9wdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktb3B0aW9ucy10aXRsZVwiIGNsYXNzPVwicGFuZWwtc3ViLXRpdGxlXCI+RGlzcGxheSBPcHRpb25zOjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktb3B0aW9ucy1pdGVtc1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwiY2hlY2tib3gtZGlzcGxheS1vcHRpb25zXCI+XG5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktYWxsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJkaXNwbGF5LW9wdGlvbnMtc2VwYXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZGUtcGFuZWwtYnRuXCIgaWQ9XCJkaXNwbGF5LWFsbC1idG5cIj5EaXNwbGF5IEFsbDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cImRpc3BsYXktc2luZ2xlLWNvbnRhaW5lclwiPjwvZGl2PlxuXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgPC9kaXY+YDtcblxuICByZXR1cm4gY29udGVudHM7XG59XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IHNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGRpc3BsYXkgcGFuZWwgdG8gdGhlIHJpZ2h0IGFuZFxuICogbWFuYWdlcyBjb250cm9scyBmb3Igdmlld2luZy5cbiAqL1xuY2xhc3MgRGlzcGxheVBhbmVsIGltcGxlbWVudHMgRGlzcGxheUludGVyZmFjZSB7XG4gIHZpZXc6IFZpZXdJbnRlcmZhY2U7XG4gIG1laUNsYXNzOiBzdHJpbmc7XG4gIGJhY2tncm91bmQ6IHN0cmluZztcbiAgem9vbUhhbmRsZXI6IFpvb21IYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgRGlzcGxheVBhbmVsLlxuICAgKiBAcGFyYW0ge1NpbmdsZVZpZXcgfCBEaXZhVmlld30gdmlldyAtIFRoZSBWaWV3IHBhcmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1laSAtIFRoZSBjbGFzcyBuYW1lIGZvciB0aGUgU1ZHLXJlbmRlcmVkIE1FSS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhY2tncm91bmQgLSBUaGUgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhY2tncm91bmQuXG4gICAqIEBwYXJhbSB7Wm9vbUhhbmRsZXJ9IFt6b29tSGFuZGxlcl0gLSBUaGUgWm9vbUhhbmRsZXIgb2JqZWN0LCBpZiBTaW5nbGVWaWV3LlxuICAgKi9cbiAgY29uc3RydWN0b3IgKHZpZXc6IFZpZXdJbnRlcmZhY2UsIG1laTogc3RyaW5nLFxuICAgIGJhY2tncm91bmQ6IHN0cmluZywgem9vbUhhbmRsZXI6IFpvb21IYW5kbGVyID0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLm1laUNsYXNzID0gbWVpO1xuICAgIHRoaXMuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XG4gICAgdGhpcy56b29tSGFuZGxlciA9IHpvb21IYW5kbGVyO1xuXG4gICAgY29uc3QgZGlzcGxheVBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlfY29udHJvbHMnKTtcbiAgICBkaXNwbGF5UGFuZWwuaW5uZXJIVE1MID0gZGlzcGxheUNvbnRyb2xzUGFuZWwodGhpcy56b29tSGFuZGxlcik7XG5cbiAgICB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgdGhpcy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMudXBkYXRlVmlzdWFsaXphdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBldmVudCBsaXN0ZW5lcnMgcmVsYXRlZCB0byB0aGUgRGlzcGxheVBhbmVsLlxuICAgKi9cbiAgc2V0RGlzcGxheUxpc3RlbmVycyAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuem9vbUhhbmRsZXIpIHtcbiAgICAgIC8vIFpvb20gaGFuZGxlciBzdHVmZlxuICAgICAgRGlzcGxheUNvbnRyb2xzLnNldFpvb21Db250cm9scyh0aGlzLnpvb21IYW5kbGVyKTtcbiAgICB9XG4gICAgRGlzcGxheUNvbnRyb2xzLmluaXREaXNwbGF5Q29udHJvbHModGhpcy5tZWlDbGFzcywgdGhpcy5iYWNrZ3JvdW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxvY2FsU3RvcmFnZSB2YWx1ZXMgYmVmb3JlIFNWRyBpcyBsb2FkZWRcbiAgICogXG4gICAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gb25seSBjYXVzZXMgdmlzdWFsIGNoYW5nZXMsIG5vdCBmdW5jdGlvbmFsIGNoYW5nZXMuXG4gICAqICAgIEZ1bmN0aW9uYWwgY2hhbmdlcyBhcmUgZG9uZSBpbiBzZXBhcmF0ZSBtb2R1bGVzIHdoaWNoIGRlcGVuZCBvbiBzcGVjaWZpYyBjb25kaXRpb25zLlxuICAgKi9cbiAgbG9hZFNldHRpbmdzICgpOiB2b2lkIHtcbiAgICBjb25zdCB7IHpvb20sIGdseXBoT3BhY2l0eSwgaW1hZ2VPcGFjaXR5LCBoaWdobGlnaHRNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgIFxuICAgIC8vIFpvb21cbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI3pvb21PdXRwdXQnKSkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI3pvb21PdXRwdXQnKS52YWx1ZSA9IFN0cmluZyh6b29tKTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyN6b29tU2xpZGVyJykudmFsdWUgPSBTdHJpbmcoem9vbSk7XG4gICAgfSAgICBcblxuICAgIC8vIEltYWdlIG9wYWNpdHlcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjYmdPcGFjaXR5T3V0cHV0JykudmFsdWUgPSBTdHJpbmcoaW1hZ2VPcGFjaXR5KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjYmdPcGFjaXR5U2xpZGVyJykudmFsdWUgPSBTdHJpbmcoaW1hZ2VPcGFjaXR5KTtcblxuICAgIC8vIEdseXBoIG9wYWNpdHlcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjb3BhY2l0eU91dHB1dCcpLnZhbHVlID0gU3RyaW5nKGdseXBoT3BhY2l0eSk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI29wYWNpdHlTbGlkZXInKS52YWx1ZSA9IFN0cmluZyhnbHlwaE9wYWNpdHkpO1xuXG4gICAgLy8gSGlnaGxpZ2h0IG1vZGU6XG4gICAgLy8gVGV4dCA9IGNhcGl0YWxpemVkIHZlcnNpb24gb2YgaGlnaGxpZ2h0LSR7aWR9XG4gICAgY29uc3QgdGV4dCA9IGhpZ2hsaWdodE1vZGUgPT09ICdub25lJyA/ICdPZmYnIDogaGlnaGxpZ2h0TW9kZVswXS50b1VwcGVyQ2FzZSgpICsgaGlnaGxpZ2h0TW9kZS5zbGljZSgxKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaGlnaGxpZ2h0LXR5cGUnKS50ZXh0Q29udGVudCA9IGBcXHhBMC0gJHt0ZXh0fWA7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIFNWRyBiYXNlZCBvbiB2aXN1YWxpemF0aW9uIHNldHRpbmdzXG4gICAqL1xuICB1cGRhdGVWaXN1YWxpemF0aW9uICgpOiB2b2lkIHtcbiAgICBEaXNwbGF5Q29udHJvbHMuc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlcih0aGlzLm1laUNsYXNzKTtcbiAgICBEaXNwbGF5Q29udHJvbHMuc2V0QmdPcGFjaXR5RnJvbVNsaWRlcih0aGlzLmJhY2tncm91bmQpO1xuICAgIERpc3BsYXlDb250cm9scy51cGRhdGVIaWdobGlnaHQoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBEaXNwbGF5UGFuZWwgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IE5lb25WaWV3IGZyb20gJy4vTmVvblZpZXcnO1xuaW1wb3J0IERpc3BsYXlQYW5lbCBmcm9tICcuL0Rpc3BsYXlQYW5lbC9EaXNwbGF5UGFuZWwnO1xuaW1wb3J0IHsgRGlzcGxheUNvbnN0cnVjdGFibGUsIFZpZXdJbnRlcmZhY2UgfSBmcm9tICcuL0ludGVyZmFjZXMnO1xuaW1wb3J0IFpvb21IYW5kbGVyIGZyb20gJy4vU2luZ2xlVmlldy9ab29tJztcblxuaW1wb3J0IERpdmEgZnJvbSAnZGl2YS5qcyc7XG5cbi8qKlxuICogVmlldyBtb2R1bGUgdGhhdCB1c2VzIHRoZSBkaXZhLmpzIHZpZXdlciB0byByZW5kZXIgdGhlIHBhZ2VzIG9mIGEgSUlJRiBtYW5pZmVzdHNcbiAqIGFuZCB0aGVuIGRpc3BsYXkgdGhlIHJlbmRlcmVkIE1FSSBmaWxlcyBvdmVyIHRoZSBwcm9wZXIgcGFnZXMuXG4gKi9cbmNsYXNzIERpdmFWaWV3IGltcGxlbWVudHMgVmlld0ludGVyZmFjZSB7XG4gIHJlYWRvbmx5IG5lb25WaWV3OiBOZW9uVmlldztcbiAgLyoqIENhbGxiYWNrcyB0aGF0IHJ1biB3aGVuZXZlciB0aGUgZGlzcGxheSB1cGRhdGVzLiAqL1xuICBwcml2YXRlIHVwZGF0ZUNhbGxiYWNrczogQXJyYXk8KCkgPT4gdm9pZD47XG4gIGRpdmFSZWFkeTogYm9vbGVhbjtcbiAgLyoqIFRoZSBkaXZhLmpzIGluc3RhbmNlLiAqL1xuICBwcml2YXRlIGRpdmE6IERpdmE7XG4gIC8qKiBNYXAgemVyby1pbmRleCBwYWdlIG51bWJlcnMgdG8gdGhlIGFjdHVhbCBVUkkvSVJJIGlkZW50aWZpZXIuICovXG4gIHByaXZhdGUgaW5kZXhNYXA6IE1hcDxudW1iZXIsIHN0cmluZz47XG4gIHByaXZhdGUgZGlzcGxheVBhbmVsOiBEaXNwbGF5UGFuZWw7XG4gIC8qKiBUaW1lIHRvIHdhaXQgYWZ0ZXIgYSBwYWdlIGJlY29tZXMgYWN0aXZlIGJlZm9yZSBsb2FkaW5nIGl0LiBJbiBtaWxsaXNlY29uZHMuICovXG4gIHByaXZhdGUgbG9hZERlbGF5OiBudW1iZXI7XG4gIHpvb21IYW5kbGVyOiBab29tSGFuZGxlcjtcblxuICAvKipcbiAgICogQHBhcmFtIG1hbmlmZXN0IC0gVVJJL0lSSSB0byB0aGUgSUlJRiBtYW5pZmVzdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcsIERpc3BsYXk6IERpc3BsYXlDb25zdHJ1Y3RhYmxlLCBtYW5pZmVzdDogc3RyaW5nKSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2tzID0gW107XG4gICAgdGhpcy5kaXZhUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmRpdmEgPSBuZXcgRGl2YSgnY29udGFpbmVyJywge1xuICAgICAgb2JqZWN0RGF0YTogbWFuaWZlc3RcbiAgICB9KTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuc3R5bGUubWluSGVpZ2h0ID0gJzEwMCUnO1xuICAgIHRoaXMuaW5kZXhNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kaXZhLmRpc2FibGVEcmFnU2Nyb2xsYWJsZSgpO1xuICAgIHRoaXMuZGlzcGxheVBhbmVsID0gbmV3IERpc3BsYXkodGhpcywgJ25lb24tY29udGFpbmVyJywgJ2RpdmEtdmlld2VyLWNhbnZhcycpO1xuICAgIHRoaXMubG9hZERlbGF5ID0gNTAwOyAvLyBpbiBtaWxsaXNlY29uZHNcbiAgICB0aGlzLmluaXREaXZhRXZlbnRzKCk7XG4gICAgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kaXZhLWlubmVyJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmN1cnNvciA9ICdhdXRvJztcblxuICAgIHdpbmRvdy5vbnJlc2l6ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKChoZWlnaHQgPT09IHdpbmRvdy5pbm5lckhlaWdodCkgJiYgKHdpZHRoID09PSB3aW5kb3cuaW5uZXJXaWR0aCkpIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZVBhZ2UodGhpcy5nZXRDdXJyZW50UGFnZSgpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMubG9hZERlbGF5KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbGlzdGVuZXJzIGZvciBjZXJ0YWluIGV2ZW50cyBpbnRlcm5hbCB0byBkaXZhLmpzXG4gICAqL1xuICBpbml0RGl2YUV2ZW50cyAoKTogdm9pZCB7XG4gICAgRGl2YS5FdmVudHMuc3Vic2NyaWJlKCdNYW5pZmVzdERpZExvYWQnLCB0aGlzLnBhcnNlTWFuaWZlc3QuYmluZCh0aGlzKSwgdGhpcy5kaXZhLnNldHRpbmdzLklEKTtcbiAgICBEaXZhLkV2ZW50cy5zdWJzY3JpYmUoJ09iamVjdERpZExvYWQnLCB0aGlzLmRpZExvYWQuYmluZCh0aGlzKSwgdGhpcy5kaXZhLnNldHRpbmdzLklEKTtcbiAgICBEaXZhLkV2ZW50cy5zdWJzY3JpYmUoJ0FjdGl2ZVBhZ2VEaWRDaGFuZ2UnLCB0aGlzLmNoYW5nZVBhZ2UuYmluZCh0aGlzKSwgdGhpcy5kaXZhLnNldHRpbmdzLklEKTtcbiAgICBEaXZhLkV2ZW50cy5zdWJzY3JpYmUoJ1pvb21MZXZlbERpZENoYW5nZScsIHRoaXMuYWRqdXN0Wm9vbS5iaW5kKHRoaXMpLCB0aGlzLmRpdmEuc2V0dGluZ3MuSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB2aXNpYmxlIHBhZ2UgY2hhbmdlcyBpbiB0aGUgZGl2YS5qcyB2aWV3ZXIuXG4gICAqIEBwYXJhbSBwYWdlSW5kZXggLSBUaGUgemVyby1pbmRleGVkIHBhZ2UgdGhhdCBpcyBtb3N0IHZpc2libGUuXG4gICAqIEBwYXJhbSBkZWxheSAtIFdoZXRoZXIgdG8gZGVsYXkgdGhlIGxvYWRpbmcgb2YgdGhlIHBhZ2Ugc28gdGhhdCBuZW9uIGRvZXNuJ3QgbGFnIHdoaWxlIHNjcm9sbGluZy5cbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhZ2UgKHBhZ2VJbmRleDogbnVtYmVyLCBkZWxheSA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmdW5jdGlvbiBjaGVja0FuZExvYWQgKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgICAgaWYgKHBhZ2UgPT09IHRoaXMuZ2V0Q3VycmVudFBhZ2UoKSkge1xuICAgICAgICBjb25zdCBwYWdlVVJJID0gdGhpcy5pbmRleE1hcC5nZXQocGFnZSk7XG4gICAgICAgIHRoaXMubmVvblZpZXcuZ2V0UGFnZVNWRyhwYWdlVVJJKS50aGVuKChzdmc6IFNWR1NWR0VsZW1lbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNWRyhzdmcsIHBhZ2UpO1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcklkID0gJ25lb24tY29udGFpbmVyLScgKyBwYWdlO1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcklkKTtcbiAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlLXBhZ2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiBjYWxsYmFjaygpKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycjogeyBuYW1lOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIubmFtZSAhPT0gJ25vdF9mb3VuZCcgJiYgZXJyLm5hbWUgIT09ICdtaXNzaW5nX21laScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJbmRleGVzID0gW3BhZ2VJbmRleF07XG4gICAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhY3RpdmUtcGFnZScpKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUtcGFnZScpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlSW5kZXhlcykge1xuICAgICAgaWYgKGRlbGF5KSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrQW5kTG9hZC5iaW5kKHRoaXMpLCAodGhpcy5sb2FkRGVsYXkpLCBwYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrQW5kTG9hZC5iaW5kKHRoaXMpKHBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBY3RpdmUgemVyby1pbmRleGVkIHBhZ2UgaW4gdGhlIGRpdmEuanMgdmlld2VyLlxuICAgKi9cbiAgZ2V0Q3VycmVudFBhZ2UgKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGl2YS5nZXRBY3RpdmVQYWdlSW5kZXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgYWN0aXZlIHBhZ2UgVVJJIGluIHRoZSBkaXZhLmpzIHZpZXdlci5cbiAgICovXG4gIGdldEN1cnJlbnRQYWdlVVJJICgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluZGV4TWFwLmdldCh0aGlzLmdldEN1cnJlbnRQYWdlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkanVzdCB0aGUgcmVuZGVyZWQgU1ZHKHMpIHRvIGJlIHRoZSBjb3JyZWN0IHNpemUgYWZ0ZXIgem9vbWluZy5cbiAgICovXG4gIGFkanVzdFpvb20gKCk6IHZvaWQge1xuICAgIChuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZW9uLWNvbnRhaW5lcicpKVxuICAgICAgICAuZm9yRWFjaCgoZWxlbTogSFRNTEVsZW1lbnQpID0+IHsgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyB9KTtcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy5kaXZhLnNldHRpbmdzLnpvb21EdXJhdGlvbiArIDEwMCk7XG4gICAgfSkpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5jaGFuZ2VQYWdlKHRoaXMuZGl2YS5nZXRBY3RpdmVQYWdlSW5kZXgoKSwgdHJ1ZSk7XG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tY29udGFpbmVyJykpXG4gICAgICAgIC5mb3JFYWNoKChlbGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN2ZyA9IGVsZW0uZmlyc3RDaGlsZCBhcyBTVkdTVkdFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHBhZ2VObyA9IHBhcnNlSW50KGVsZW0uaWQubWF0Y2goL1xcZCsvKVswXSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVTVkcoc3ZnLCBwYWdlTm8pO1xuICAgICAgICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU1ZHTG9hZCAoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRWaWV3RXZlbnRIYW5kbGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgU1ZHIGJlaW5nIGRpc3BsYXllZCBmb3IgdGhlIHNwZWNpZmllZCBwYWdlLlxuICAgKiBAcGFyYW0gc3ZnIC0gVGhlIFNWRyBvZiB0aGUgcGFnZSB0byB1cGRhdGUgdG8uXG4gICAqIEBwYXJhbSBwYWdlTm8gLSBUaGUgemVyby1pbmRleGVkIHBhZ2UgbnVtYmVyLlxuICAgKi9cbiAgdXBkYXRlU1ZHIChzdmc6IFNWR1NWR0VsZW1lbnQsIHBhZ2VObzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGl2YS0xLWlubmVyJyk7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMuZGl2YS5nZXRQYWdlRGltZW5zaW9uc0F0Q3VycmVudFpvb21MZXZlbChwYWdlTm8pO1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZGl2YS5zZXR0aW5ncy52aWV3SGFuZGxlci5fdmlld2VyQ29yZS5nZXRQYWdlUmVnaW9uKHBhZ2VObywge1xuICAgICAgaW5jbHVkZVBhZGRpbmc6IHRydWUsXG4gICAgICBpbmNvcnBvcmF0ZVZpZXdwb3J0OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgbWFyZ2luTGVmdCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGlubmVyLCBudWxsKVxuICAgICAgLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1sZWZ0Jyk7XG5cbiAgICBjb25zdCBjb250YWluZXJJZCA9ICduZW9uLWNvbnRhaW5lci0nICsgcGFnZU5vLnRvU3RyaW5nKCk7XG4gICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcklkKTtcbiAgICBpZiAoY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRhaW5lci5pZCA9IGNvbnRhaW5lcklkO1xuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ25lb24tY29udGFpbmVyJyk7XG4gICAgICBpbm5lci5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgIH1cblxuICAgIHdoaWxlIChjb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBzdmcuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGRpbWVuc2lvbnMud2lkdGgudG9TdHJpbmcoKSk7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgZGltZW5zaW9ucy5oZWlnaHQudG9TdHJpbmcoKSk7XG4gICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7b2Zmc2V0LnRvcH1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtvZmZzZXQubGVmdCAtIHBhcnNlSW50KG1hcmdpbkxlZnQpfXB4YDtcblxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIGRpdmEuanMgZmluaXNoZXMgbG9hZGluZy5cbiAgICovXG4gIGRpZExvYWQgKCk6IHZvaWQge1xuICAgIHRoaXMuZGl2YVJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLmRpc3BsYXlQYW5lbC5zZXREaXNwbGF5TGlzdGVuZXJzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gd2hlbmV2ZXIgYW4gU1ZHIGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSBjYiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICovXG4gIGFkZFVwZGF0ZUNhbGxiYWNrIChjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2tzLnB1c2goY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGNhbGwuXG4gICAqIEBwYXJhbSBjYiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICovXG4gIHJlbW92ZVVwZGF0ZUNhbGxiYWNrIChjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy51cGRhdGVDYWxsYmFja3MuZmluZEluZGV4KChlbGVtKSA9PiB7XG4gICAgICByZXR1cm4gZWxlbSA9PT0gY2I7XG4gICAgfSk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy51cGRhdGVDYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGxpc3RlbmVycyBvbiB0aGUgYm9keSBlbGVtZW50IGZvciBnbG9iYWwgZXZlbnRzLlxuICAgKi9cbiAgc2V0Vmlld0V2ZW50SGFuZGxlcnMgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduZW9uLWNvbnRhaW5lcicpIGFzIEhUTUxDb2xsZWN0aW9uT2Y8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2dCkgPT4ge1xuICAgICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25lb24tY29udGFpbmVyJykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD4pIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIElJSUYgbWFuaWZlc3QgdG8gY3JlYXRlIGEgbWFwIGJldHdlZW4gSUlJRiBjYW52YXNlcyBhbmQgcGFnZSBpbmRleGVzLlxuICAgKiBAcGFyYW0gbWFuaWZlc3QgLSBUaGUgSUlJRiBtYW5pZmVzdCBvYmplY3QuXG4gICAqL1xuICBwYXJzZU1hbmlmZXN0IChtYW5pZmVzdDogeyBzZXF1ZW5jZXM6IHsgY2FudmFzZXM6IG9iamVjdFtdIH1bXSB9KTogdm9pZCB7XG4gICAgdGhpcy5pbmRleE1hcC5jbGVhcigpO1xuICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2YgbWFuaWZlc3Quc2VxdWVuY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhbnZhcyBvZiBzZXF1ZW5jZS5jYW52YXNlcykge1xuICAgICAgICB0aGlzLmluZGV4TWFwLnNldChzZXF1ZW5jZS5jYW52YXNlcy5pbmRleE9mKGNhbnZhcyksIGNhbnZhc1snQGlkJ10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aXZlIHBhZ2UvY2FudmFzIGNvbWJpbmVkIHdpdGggdGhlIG1hbnVzY3JpcHQgbmFtZS5cbiAgICovXG4gIGdldFBhZ2VOYW1lICgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1hbnVzY3JpcHROYW1lID0gdGhpcy5kaXZhLnNldHRpbmdzLm1hbmlmZXN0Lml0ZW1UaXRsZTtcbiAgICBjb25zdCBwYWdlTmFtZSA9IHRoaXMuZGl2YS5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlc1t0aGlzLmdldEN1cnJlbnRQYWdlKCldLmw7XG4gICAgcmV0dXJuIG1hbnVzY3JpcHROYW1lICsgJyBcXHUyMDE0ICcgKyBwYWdlTmFtZTtcbiAgfVxufVxuXG5leHBvcnQgeyBEaXZhVmlldyBhcyBkZWZhdWx0IH07XG4iLCIvKlxuIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuIENvcHlyaWdodCAoYykgPDIwMTE+IDxEYXZlIFRheWxvciBodHRwOi8vdGhlLXRheWxvcnMub3JnPlxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWRcbiB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTXG4gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSXG4gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4gUG9ydCB0byB2YW5pbGxhIEphdmFzY3JpcHQgYnkgSmFjZWsgTm93YWNraSBodHRwOi8vamFjZWstbm93YWNraS5uZXQvXG4qKi9cblxuKGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuICAgIHZhciBfaXNUb3VjaCA9ICdvbnRvdWNoZW5kJyBpbiBkb2N1bWVudDtcblxuICAgIC8vIHRoaXMgaXMgc2ltcGxlLCBubyBcImRlZXBcIiBzdXBwb3J0XG4gICAgdmFyIF9leHRlbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgaT0xOyBpPGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNbMF1ba2V5XSA9IGFyZ3VtZW50c1tpXVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgIH07XG5cbiAgICB2YXIgVmFuaWxsYUtpbmV0aWMgPSBmdW5jdGlvbihlbGVtZW50LCBzZXR0aW5ncykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gX2V4dGVuZCh7fSwgVmFuaWxsYUtpbmV0aWMuREVGQVVMVFMsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5lbCAgICAgICA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuQUNUSVZFX0NMQVNTID0gXCJraW5ldGljLWFjdGl2ZVwiO1xuXG4gICAgICAgIHRoaXMuX2luaXRFbGVtZW50cygpO1xuXG4gICAgICAgIHRoaXMuZWwuX1ZhbmlsbGFLaW5ldGljID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLkRFRkFVTFRTID0ge1xuICAgICAgICBjdXJzb3I6ICdtb3ZlJyxcbiAgICAgICAgZGVjZWxlcmF0ZTogdHJ1ZSxcbiAgICAgICAgdHJpZ2dlckhhcmR3YXJlOiBmYWxzZSxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICB5OiB0cnVlLFxuICAgICAgICB4OiB0cnVlLFxuICAgICAgICBzbG93ZG93bjogMC45LFxuICAgICAgICBtYXh2ZWxvY2l0eTogNDAsXG4gICAgICAgIHRocm90dGxlRlBTOiA2MCxcbiAgICAgICAgaW52ZXJ0OiBmYWxzZSxcbiAgICAgICAgbW92aW5nQ2xhc3M6IHtcbiAgICAgICAgICAgIHVwOiAna2luZXRpYy1tb3ZpbmctdXAnLFxuICAgICAgICAgICAgZG93bjogJ2tpbmV0aWMtbW92aW5nLWRvd24nLFxuICAgICAgICAgICAgbGVmdDogJ2tpbmV0aWMtbW92aW5nLWxlZnQnLFxuICAgICAgICAgICAgcmlnaHQ6ICdraW5ldGljLW1vdmluZy1yaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgZGVjZWxlcmF0aW5nQ2xhc3M6IHtcbiAgICAgICAgICAgIHVwOiAna2luZXRpYy1kZWNlbGVyYXRpbmctdXAnLFxuICAgICAgICAgICAgZG93bjogJ2tpbmV0aWMtZGVjZWxlcmF0aW5nLWRvd24nLFxuICAgICAgICAgICAgbGVmdDogJ2tpbmV0aWMtZGVjZWxlcmF0aW5nLWxlZnQnLFxuICAgICAgICAgICAgcmlnaHQ6ICdraW5ldGljLWRlY2VsZXJhdGluZy1yaWdodCdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBQdWJsaWMgZnVuY3Rpb25zXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gX2V4dGVuZCh0aGlzLnNldHRpbmdzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy52ZWxvY2l0eSA9IG9wdGlvbnMudmVsb2NpdHkgfHwgdGhpcy52ZWxvY2l0eTtcbiAgICAgICAgdGhpcy52ZWxvY2l0eVkgPSBvcHRpb25zLnZlbG9jaXR5WSB8fCB0aGlzLnZlbG9jaXR5WTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5kZWNlbGVyYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21vdmUoKTtcbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzLmRlY2VsZXJhdGUgPSB0cnVlO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgICAgICAgdGhpcy52ZWxvY2l0eVkgPSAwO1xuICAgICAgICB0aGlzLnNldHRpbmdzLmRlY2VsZXJhdGUgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3Muc3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5zdG9wcGVkLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLmRldGFjaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kZXRhY2hMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuQUNUSVZFX0NMQVNTKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5jdXJzb3IgPSAnJztcbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnModGhpcy5BQ1RJVkVfQ0xBU1MpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXR0YWNoTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLkFDVElWRV9DTEFTUyk7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUuY3Vyc29yID0gdGhpcy5zZXR0aW5ncy5jdXJzb3I7XG4gICAgfTtcblxuICAgIC8vIEludGVybmFsIGZ1bmN0aW9uc1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9pbml0RWxlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKHRoaXMuQUNUSVZFX0NMQVNTKTtcblxuICAgICAgICBfZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgICAgIHhwb3M6IG51bGwsXG4gICAgICAgICAgICBwcmV2WFBvczogZmFsc2UsXG4gICAgICAgICAgICB5cG9zOiBudWxsLFxuICAgICAgICAgICAgcHJldllQb3M6IGZhbHNlLFxuICAgICAgICAgICAgbW91c2VEb3duOiBmYWxzZSxcbiAgICAgICAgICAgIHRocm90dGxlVGltZW91dDogMTAwMCAvIHRoaXMuc2V0dGluZ3MudGhyb3R0bGVGUFMsXG4gICAgICAgICAgICBsYXN0TW92ZTogbnVsbCxcbiAgICAgICAgICAgIGVsZW1lbnRGb2N1c2VkOiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgICAgICB0aGlzLnZlbG9jaXR5WSA9IDA7XG5cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB0aGlzLmRvY3VtZW50UmVzZXRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGF0Ll9yZXNldE1vdXNlLmFwcGx5KHRoYXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZJWE1FIG1ha2Ugc3VyZSB0byByZW1vdmUgdGhpc1xuICAgICAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLmRvY3VtZW50UmVzZXRIYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuZG9jdW1lbnRSZXNldEhhbmRsZXIsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9pbml0RXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5lbC5zdHlsZS5jdXJzb3IgPSB0aGlzLnNldHRpbmdzLmN1cnNvcjtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy50cmlnZ2VySGFyZHdhcmUpIHtcbiAgICAgICAgICAgIHZhciBwcmVmaXhlcyA9IFsnJywgJy1tcy0nLCAnLXdlYmtpdC0nLCAnLW1vei0nXTtcbiAgICAgICAgICAgIHZhciBzdHlsZXMgPSB7XG4gICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCgwLDAsMCknLFxuICAgICAgICAgICAgICAgICdwZXJzcGVjdGl2ZSc6ICcxMDAwJywgLy8gVE9ETyBpcyB0aGlzIGV2ZW4gdmFsaWQ/IGlzIHRoaXMgZXZlbiBuZWVkZWQ/XG4gICAgICAgICAgICAgICAgJ2JhY2tmYWNlLXZpc2liaWxpdHknOiAnaGlkZGVuJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcmVmaXggPSBwcmVmaXhlc1tpXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZXMuaGFzT3duUHJvcGVydHkoa2V5KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLnN0eWxlW3ByZWZpeCtrZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9pbml0RXZlbnRzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5ldmVudHMgPSB7XG4gICAgICAgICAgICB0b3VjaFN0YXJ0OiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvdWNoO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl91c2VUYXJnZXQoZS50YXJnZXQsIGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdWNoID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHNlbGYudGhyZXNob2xkID0gc2VsZi5fdGhyZXNob2xkKGUudGFyZ2V0LCBlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhcnQodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvdWNoTW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciB0b3VjaDtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5tb3VzZURvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgdG91Y2ggPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5wdXRtb3ZlKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0RG93bjogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl91c2VUYXJnZXQoZS50YXJnZXQsIGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYudGhyZXNob2xkID0gc2VsZi5fdGhyZXNob2xkKGUudGFyZ2V0LCBlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnRGb2N1c2VkID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC5ub2RlTmFtZSA9PT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0RW5kOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuX3VzZVRhcmdldChlLnRhcmdldCwgZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudEZvY3VzZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0TW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm1vdXNlRG93bikge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dG1vdmUoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNjcm9sbDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5zZXR0aW5ncy5tb3ZlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldHRpbmdzLm1vdmVkLmNhbGwoc2VsZiwgc2VsZi5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRDbGljazogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhzZWxmLnZlbG9jaXR5KSA+IDAgfHwgTWF0aC5hYnMoc2VsZi52ZWxvY2l0eVkpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRyYWdTdGFydDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl91c2VUYXJnZXQoZS50YXJnZXQsIGUpICYmIHNlbGYuZWxlbWVudEZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWxlY3RTdGFydDogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5zZXR0aW5ncy5zZWxlY3RTdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zZXR0aW5ncy5zZWxlY3RTdGFydC5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxmLl91c2VUYXJnZXQoZS50YXJnZXQsIGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fYXR0YWNoTGlzdGVuZXJzKCk7XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5faW5wdXRtb3ZlID0gZnVuY3Rpb24oY2xpZW50WCwgY2xpZW50WSkge1xuICAgICAgICBpZiAoIXRoaXMubGFzdE1vdmUgfHwgbmV3IERhdGUoKSA+IG5ldyBEYXRlKHRoaXMubGFzdE1vdmUuZ2V0VGltZSgpICsgdGhpcy50aHJvdHRsZVRpbWVvdXQpKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RNb3ZlID0gbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMubW91c2VEb3duICYmICh0aGlzLnhwb3MgfHwgdGhpcy55cG9zKSkge1xuICAgICAgICAgICAgICAgIHZhciBtb3ZlZFggPSAoY2xpZW50WCAtIHRoaXMueHBvcyk7XG4gICAgICAgICAgICAgICAgdmFyIG1vdmVkWSA9IChjbGllbnRZIC0gdGhpcy55cG9zKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbnZlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZWRYICo9IC0xO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlZFkgKj0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRocmVzaG9sZD4wKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3ZlZCA9IE1hdGguc3FydChtb3ZlZFgqbW92ZWRYICsgbW92ZWRZKm1vdmVkWSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRocmVzaG9sZD5tb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJlc2hvbGQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnRGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEZvY3VzZWQuYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRGb2N1c2VkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZGVjZWxlcmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5WSA9IDA7XG5cbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxMZWZ0KHRoaXMuc2V0dGluZ3MueCA/IHNjcm9sbExlZnQgLSBtb3ZlZFggOiBzY3JvbGxMZWZ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCh0aGlzLnNldHRpbmdzLnkgPyBzY3JvbGxUb3AgLSBtb3ZlZFkgOiBzY3JvbGxUb3ApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2WFBvcyA9IHRoaXMueHBvcztcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZZUG9zID0gdGhpcy55cG9zO1xuICAgICAgICAgICAgICAgIHRoaXMueHBvcyA9IGNsaWVudFg7XG4gICAgICAgICAgICAgICAgdGhpcy55cG9zID0gY2xpZW50WTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZVZlbG9jaXRpZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRNb3ZlQ2xhc3Nlcyh0aGlzLnNldHRpbmdzLm1vdmluZ0NsYXNzKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXR0aW5ncy5tb3ZlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLm1vdmVkLmNhbGwodGhpcywgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fY2FsY3VsYXRlVmVsb2NpdGllcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnZlbG9jaXR5ID0gdGhpcy5fY2FwVmVsb2NpdHkodGhpcy5wcmV2WFBvcyAtIHRoaXMueHBvcywgdGhpcy5zZXR0aW5ncy5tYXh2ZWxvY2l0eSk7XG4gICAgICAgIHRoaXMudmVsb2NpdHlZID0gdGhpcy5fY2FwVmVsb2NpdHkodGhpcy5wcmV2WVBvcyAtIHRoaXMueXBvcywgdGhpcy5zZXR0aW5ncy5tYXh2ZWxvY2l0eSk7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmludmVydCkge1xuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eSAqPSAtMTtcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHlZICo9IC0xO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnhwb3MgJiYgdGhpcy5wcmV2WFBvcyAmJiB0aGlzLnNldHRpbmdzLmRlY2VsZXJhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmRlY2VsZXJhdGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlVmVsb2NpdGllcygpO1xuICAgICAgICAgICAgdGhpcy54cG9zID0gdGhpcy5wcmV2WFBvcyA9IHRoaXMubW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9tb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl91c2VUYXJnZXQgPSBmdW5jdGlvbih0YXJnZXQsIGV2ZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXR0aW5ncy5maWx0ZXJUYXJnZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmZpbHRlclRhcmdldC5jYWxsKHRoaXMsIHRhcmdldCwgZXZlbnQpICE9PSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX3RocmVzaG9sZCA9IGZ1bmN0aW9uKHRhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzLnRocmVzaG9sZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudGhyZXNob2xkLmNhbGwodGhpcywgdGFyZ2V0LCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudGhyZXNob2xkO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24oY2xpZW50WCwgY2xpZW50WSkge1xuICAgICAgICB0aGlzLm1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIHRoaXMudmVsb2NpdHkgPSB0aGlzLnByZXZYUG9zID0gMDtcbiAgICAgICAgdGhpcy52ZWxvY2l0eVkgPSB0aGlzLnByZXZZUG9zID0gMDtcbiAgICAgICAgdGhpcy54cG9zID0gY2xpZW50WDtcbiAgICAgICAgdGhpcy55cG9zID0gY2xpZW50WTtcbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9yZXNldE1vdXNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueHBvcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnlwb3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3VzZURvd24gPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLl9kZWNlbGVyYXRlVmVsb2NpdHkgPSBmdW5jdGlvbih2ZWxvY2l0eSwgc2xvd2Rvd24pIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5hYnModmVsb2NpdHkpKSA9PT0gMCA/IDAgLy8gaXMgdmVsb2NpdHkgbGVzcyB0aGFuIDE/XG4gICAgICAgICAgICA6IHZlbG9jaXR5ICogc2xvd2Rvd247IC8vIHJlZHVjZSBzbG93ZG93blxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX2NhcFZlbG9jaXR5ID0gZnVuY3Rpb24odmVsb2NpdHksIG1heCkge1xuICAgICAgICB2YXIgbmV3VmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICAgICAgaWYgKHZlbG9jaXR5ID4gMCl7XG4gICAgICAgICAgICBpZiAodmVsb2NpdHkgPiBtYXgpe1xuICAgICAgICAgICAgICAgIG5ld1ZlbG9jaXR5ID0gbWF4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZlbG9jaXR5IDwgKDAgLSBtYXgpKXtcbiAgICAgICAgICAgICAgICBuZXdWZWxvY2l0eSA9ICgwIC0gbWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmVsb2NpdHk7XG4gICAgfTtcblxuICAgIFZhbmlsbGFLaW5ldGljLnByb3RvdHlwZS5fc2V0TW92ZUNsYXNzZXMgPSBmdW5jdGlvbihjbGFzc2VzKSB7XG4gICAgICAgIC8vIFRoZSBmaXgtbWUgY29tbWVudCBiZWxvdyBpcyBmcm9tIG9yaWdpbmFsIGpRdWVyeS5raW5ldGljIHByb2plY3RcbiAgICAgICAgLy8gRklYTUU6IGNvbnNpZGVyIGlmIHdlIHdhbnQgdG8gYXBwbHkgUEwgIzQ0LCB0aGlzIHNob3VsZCBub3QgcmVtb3ZlXG4gICAgICAgIC8vIGNsYXNzZXMgd2UgaGF2ZSBub3QgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCFcbiAgICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcbiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDtcblxuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKHNldHRpbmdzLm1vdmluZ0NsYXNzLnVwKTtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShzZXR0aW5ncy5tb3ZpbmdDbGFzcy5kb3duKTtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShzZXR0aW5ncy5tb3ZpbmdDbGFzcy5sZWZ0KTtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShzZXR0aW5ncy5tb3ZpbmdDbGFzcy5yaWdodCk7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoc2V0dGluZ3MuZGVjZWxlcmF0aW5nQ2xhc3MudXApO1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKHNldHRpbmdzLmRlY2VsZXJhdGluZ0NsYXNzLmRvd24pO1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKHNldHRpbmdzLmRlY2VsZXJhdGluZ0NsYXNzLmxlZnQpO1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKHNldHRpbmdzLmRlY2VsZXJhdGluZ0NsYXNzLnJpZ2h0KTtcblxuICAgICAgICBpZiAodGhpcy52ZWxvY2l0eSA+IDApe1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc2VzLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52ZWxvY2l0eSA8IDApe1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc2VzLmxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5WSA+IDApe1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc2VzLmRvd24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5WSA8IDApe1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc2VzLnVwKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX21vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNjcm9sbGVyID0gdGhpcy5fZ2V0U2Nyb2xsZXIoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy54ICYmIHNjcm9sbGVyLnNjcm9sbFdpZHRoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxMZWZ0KHRoaXMuc2Nyb2xsTGVmdCgpICsgdGhpcy52ZWxvY2l0eSk7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy52ZWxvY2l0eSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZWxvY2l0eSA9IHNldHRpbmdzLmRlY2VsZXJhdGUgP1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZWNlbGVyYXRlVmVsb2NpdHkodGhpcy52ZWxvY2l0eSwgc2V0dGluZ3Muc2xvd2Rvd24pIDogdGhpcy52ZWxvY2l0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLnkgJiYgc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0ID4gMCl7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCh0aGlzLnNjcm9sbFRvcCgpICsgdGhpcy52ZWxvY2l0eVkpO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMudmVsb2NpdHlZKSA+IDApe1xuICAgICAgICAgICAgICAgIHRoaXMudmVsb2NpdHlZID0gc2V0dGluZ3MuZGVjZWxlcmF0ZSA/XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RlY2VsZXJhdGVWZWxvY2l0eSh0aGlzLnZlbG9jaXR5WSwgc2V0dGluZ3Muc2xvd2Rvd24pIDogdGhpcy52ZWxvY2l0eVk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5WSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLl9zZXRNb3ZlQ2xhc3NlcyhzZXR0aW5ncy5kZWNlbGVyYXRpbmdDbGFzcyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5tb3ZlZCA9PT0gJ2Z1bmN0aW9uJyl7XG4gICAgICAgICAgICBzZXR0aW5ncy5tb3ZlZC5jYWxsKHRoaXMsIHNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnZlbG9jaXR5KSA+IDAgfHwgTWF0aC5hYnModGhpcy52ZWxvY2l0eVkpID4gMCl7XG4gICAgICAgICAgICBpZiAoIXRoaXMubW92aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIHRpY2sgZm9yIG5leHQgbW92ZW1lbnRcbiAgICAgICAgICAgICAgICBfcmFmKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9tb3ZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnN0b3AoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX2dldFNjcm9sbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIEZJWE1FIHdlIG1heSB3YW50IHRvIG5vcm1hbGl6ZSBiZWhhdmlvdXIgYWNyb3NzIGJyb3dzZXJzIGFzIGluIG9yaWdpbmFsIGpRdWVyeS5raW5ldGljXG4gICAgICAgIC8vIGN1cnJlbnRseSB0aGlzIHdvbid0IHdvcmsgY29ycmVjdGx5IG9uIGFsbCBicndvc2VycyB3aGVuIGF0dGFjaGVkIHRvIGh0bWwgb3IgYm9keSBlbGVtZW50XG4gICAgICAgIHJldHVybiB0aGlzLmVsO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuc2Nyb2xsTGVmdCA9IGZ1bmN0aW9uKGxlZnQpIHtcbiAgICAgICAgdmFyIHNjcm9sbGVyID0gdGhpcy5fZ2V0U2Nyb2xsZXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNjcm9sbGVyLnNjcm9sbExlZnQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVmFuaWxsYUtpbmV0aWMucHJvdG90eXBlLnNjcm9sbFRvcCA9IGZ1bmN0aW9uKHRvcCkge1xuICAgICAgICB2YXIgc2Nyb2xsZXIgPSB0aGlzLl9nZXRTY3JvbGxlcigpO1xuICAgICAgICBpZiAodHlwZW9mIHRvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHNjcm9sbGVyLnNjcm9sbFRvcCA9IHRvcDtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNjcm9sbGVyLnNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX2F0dGFjaExpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsO1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzO1xuXG4gICAgICAgIGlmIChfaXNUb3VjaCkge1xuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNldHRpbmdzLmV2ZW50cy50b3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHNldHRpbmdzLmV2ZW50cy5pbnB1dEVuZCwgZmFsc2UpO1xuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgc2V0dGluZ3MuZXZlbnRzLnRvdWNoTW92ZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0RG93biwgZmFsc2UpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0RW5kLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHNldHRpbmdzLmV2ZW50cy5pbnB1dE1vdmUsIGZhbHNlKTtcblxuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNldHRpbmdzLmV2ZW50cy5pbnB1dENsaWNrLCBmYWxzZSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNldHRpbmdzLmV2ZW50cy5zY3JvbGwsIGZhbHNlKTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBzZXR0aW5ncy5ldmVudHMuc2VsZWN0U3RhcnQsIGZhbHNlKTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0Jywgc2V0dGluZ3MuZXZlbnRzLmRyYWdTdGFydCwgZmFsc2UpO1xuICAgIH07XG5cbiAgICBWYW5pbGxhS2luZXRpYy5wcm90b3R5cGUuX2RldGFjaExpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsO1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzO1xuXG4gICAgICAgIGlmIChfaXNUb3VjaCkge1xuICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNldHRpbmdzLmV2ZW50cy50b3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHNldHRpbmdzLmV2ZW50cy5pbnB1dEVuZCwgZmFsc2UpO1xuICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgc2V0dGluZ3MuZXZlbnRzLnRvdWNoTW92ZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0RG93biwgZmFsc2UpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc2V0dGluZ3MuZXZlbnRzLmlucHV0RW5kLCBmYWxzZSk7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHNldHRpbmdzLmV2ZW50cy5pbnB1dE1vdmUsIGZhbHNlKTtcblxuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHNldHRpbmdzLmV2ZW50cy5pbnB1dENsaWNrLCBmYWxzZSk7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNldHRpbmdzLmV2ZW50cy5zY3JvbGwsIGZhbHNlKTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBzZXR0aW5ncy5ldmVudHMuc2VsZWN0U3RhcnQsIGZhbHNlKTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0Jywgc2V0dGluZ3MuZXZlbnRzLmRyYWdTdGFydCwgZmFsc2UpO1xuICAgIH07XG5cblxuICAgIHdpbmRvdy5WYW5pbGxhS2luZXRpYyA9IFZhbmlsbGFLaW5ldGljO1xufSkoKTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBkcmFnc2Nyb2xsIC0gc2Nyb2xsIGFyZWEgYnkgZHJhZ2dpbmdcbiAqIEB2ZXJzaW9uIDAuMC44XG4gKlxuICogQGxpY2Vuc2UgTUlULCBzZWUgaHR0cDovL2dpdGh1Yi5jb20vYXN2ZC9kcmFnc2Nyb2xsXG4gKiBAY29weXJpZ2h0IDIwMTUgYXN2ZCA8aGVsaW9zZnJhbWV3b3JrQGdtYWlsLmNvbT5cbiAqL1xuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KVxue1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG4gICAge1xuICAgICAgICBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpXG4gICAge1xuICAgICAgICBmYWN0b3J5KGV4cG9ydHMpO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBmYWN0b3J5KChyb290LmRyYWdzY3JvbGwgPSB7fSkpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpXG57XG4gICAgdmFyIF93aW5kb3cgPSB3aW5kb3c7XG4gICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHZhciBtb3VzZW1vdmUgPSAnbW91c2Vtb3ZlJztcbiAgICB2YXIgbW91c2V1cCA9ICdtb3VzZXVwJztcbiAgICB2YXIgbW91c2Vkb3duID0gJ21vdXNlZG93bic7XG4gICAgdmFyIEV2ZW50TGlzdGVuZXIgPSAnRXZlbnRMaXN0ZW5lcic7XG4gICAgdmFyIGFkZEV2ZW50TGlzdGVuZXIgPSAnYWRkJyArIEV2ZW50TGlzdGVuZXI7XG4gICAgdmFyIHJlbW92ZUV2ZW50TGlzdGVuZXIgPSAncmVtb3ZlJyArIEV2ZW50TGlzdGVuZXI7XG4gICAgdmFyIG5ld1Njcm9sbFgsIG5ld1Njcm9sbFk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG4gICAgdmFyIGRyYWdnZWQgPSBbXTtcblxuICAgIHZhciByZXNldCA9IGZ1bmN0aW9uIChpLCBlbClcbiAgICB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcmFnZ2VkLmxlbmd0aDspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGVsID0gZHJhZ2dlZFtpKytdO1xuICAgICAgICAgICAgZWwgPSBlbC5jb250YWluZXIgfHwgZWw7XG4gICAgICAgICAgICBlbFtyZW1vdmVFdmVudExpc3RlbmVyXShtb3VzZWRvd24sIGVsLm1kLCAwKTtcbiAgICAgICAgICAgIF93aW5kb3dbcmVtb3ZlRXZlbnRMaXN0ZW5lcl0obW91c2V1cCwgZWwubXUsIDApO1xuICAgICAgICAgICAgX3dpbmRvd1tyZW1vdmVFdmVudExpc3RlbmVyXShtb3VzZW1vdmUsIGVsLm1tLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN1cHByZXNzIHdhcm5pbmcgYWJvdXQgZnVuY3Rpb25zIGluIGxvb3BzLlxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIC8vIGNsb25pbmcgaW50byBhcnJheSBzaW5jZSBIVE1MQ29sbGVjdGlvbiBpcyB1cGRhdGVkIGR5bmFtaWNhbGx5XG4gICAgICAgIGRyYWdnZWQgPSBbXS5zbGljZS5jYWxsKF9kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkcmFnc2Nyb2xsJykpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHJhZ2dlZC5sZW5ndGg7KVxuICAgICAgICB7XG4gICAgICAgICAgICAoZnVuY3Rpb24gKGVsLCBsYXN0Q2xpZW50WCwgbGFzdENsaWVudFksIHB1c2hlZCwgc2Nyb2xsZXIsIGNvbnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgKGNvbnQgPSBlbC5jb250YWluZXIgfHwgZWwpW2FkZEV2ZW50TGlzdGVuZXJdKFxuICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd24sXG4gICAgICAgICAgICAgICAgICAgIGNvbnQubWQgPSBmdW5jdGlvbiAoZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbC5oYXNBdHRyaWJ1dGUoJ25vY2hpbGRkcmFnJykgfHwgX2RvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5wYWdlWCwgZS5wYWdlWSkgPT09IGNvbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaGVkID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2xpZW50WCA9IGUuY2xpZW50WDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2xpZW50WSA9IGUuY2xpZW50WTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgMFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBfd2luZG93W2FkZEV2ZW50TGlzdGVuZXJdKG1vdXNldXAsIGNvbnQubXUgPSBmdW5jdGlvbiAoKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcblxuICAgICAgICAgICAgICAgIF93aW5kb3dbYWRkRXZlbnRMaXN0ZW5lcl0obW91c2Vtb3ZlLCBjb250Lm1tID0gZnVuY3Rpb24gKGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdXNoZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGVyID0gZWwuc2Nyb2xsZXIgfHwgZWwpLnNjcm9sbExlZnQgLT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2Nyb2xsWCA9ICgtbGFzdENsaWVudFggKyAobGFzdENsaWVudFggPSBlLmNsaWVudFgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgLT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2Nyb2xsWSA9ICgtbGFzdENsaWVudFkgKyAobGFzdENsaWVudFkgPSBlLmNsaWVudFkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgPT09IF9kb2N1bWVudC5ib2R5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGVyID0gX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsTGVmdCAtPSBuZXdTY3JvbGxYO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgLT0gbmV3U2Nyb2xsWTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSkoZHJhZ2dlZFtpKytdKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH07XG5cbiAgICBpZiAoX2RvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpXG4gICAge1xuICAgICAgICByZXNldCgpO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBfd2luZG93W2FkZEV2ZW50TGlzdGVuZXJdKCdsb2FkJywgcmVzZXQsIDApO1xuICAgIH1cblxuICAgIGV4cG9ydHMucmVzZXQgPSByZXNldDtcbiAgICB3aW5kb3cucmVzZXREcmFnc2Nyb2xsID0gcmVzZXQ7XG59KSk7XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCJpbXBvcnQgeyB1cGRhdGVIaWdobGlnaHQsIHNldEdseXBoT3BhY2l0eUZyb21TbGlkZXIsIHNldEJnT3BhY2l0eUZyb21TbGlkZXIgfSBmcm9tICcuLi9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgRGlzcGxheVBhbmVsIGZyb20gJy4uL0Rpc3BsYXlQYW5lbC9EaXNwbGF5UGFuZWwnO1xuaW1wb3J0IFpvb21IYW5kbGVyIGZyb20gJy4vWm9vbSc7XG5pbXBvcnQgeyBWaWV3SW50ZXJmYWNlLCBEaXNwbGF5Q29uc3RydWN0YWJsZSB9IGZyb20gJy4uL0ludGVyZmFjZXMnO1xuXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4uL3V0aWxzL0xvY2FsU2V0dGluZ3MnO1xuXG4vKipcbiAqIEEgdmlldyBtb2R1bGUgZm9yIGRpc3BsYXlpbmcgYSBzaW5nbGUgcGFnZSBvZiBhIG1hbnVzY3JpcHQuXG4gKi9cbmNsYXNzIFNpbmdsZVZpZXcgaW1wbGVtZW50cyBWaWV3SW50ZXJmYWNlIHtcbiAgcmVhZG9ubHkgbmVvblZpZXc6IE5lb25WaWV3O1xuICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgdXBkYXRlQ2FsbGJhY2tzOiBBcnJheTwoKSA9PiB2b2lkPjtcbiAgcHJpdmF0ZSBncm91cDogU1ZHU1ZHRWxlbWVudDtcbiAgcHJpdmF0ZSBiZzogU1ZHSW1hZ2VFbGVtZW50O1xuICBwcml2YXRlIHN2ZzogU1ZHU1ZHRWxlbWVudDtcbiAgem9vbUhhbmRsZXI6IFpvb21IYW5kbGVyO1xuICBwcml2YXRlIGRpc3BsYXlQYW5lbDogRGlzcGxheVBhbmVsO1xuICByZWFkb25seSBwYWdlVVJJOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgU2luZ2xlVmlldy5cbiAgICogQHBhcmFtIGltYWdlIC0gVGhlIFVSSSB0byB0aGUgYmFja2dyb3VuZCBpbWFnZSBmb3IgdGhlIHBhZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobmVvblZpZXc6IE5lb25WaWV3LCBwYW5lbDogRGlzcGxheUNvbnN0cnVjdGFibGUsIGltYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJyk7XG4gICAgdGhpcy51cGRhdGVDYWxsYmFja3MgPSBuZXcgQXJyYXkoMCk7XG4gICAgLy8gR3JvdXAgd2lsbCBjb250YWluIHRoZSBpbWFnZSBhbmQgdGhlIHJlbmRlcmVkIFNWR1xuICAgIHRoaXMuZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgIHRoaXMuZ3JvdXAuaWQgPSAnc3ZnX2dyb3VwJztcbiAgICB0aGlzLmdyb3VwLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgd2luZG93LmlubmVySGVpZ2h0LnRvU3RyaW5nKCkpO1xuICAgIHRoaXMuZ3JvdXAuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxMDAlJyk7XG5cbiAgICB0aGlzLmJnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdpbWFnZScpO1xuICAgIHRoaXMuYmcuaWQgPSAnYmdpbWcnO1xuICAgIHRoaXMuYmcuY2xhc3NMaXN0LmFkZCgnYmFja2dyb3VuZCcpO1xuICAgIHRoaXMuYmcuc2V0QXR0cmlidXRlKCd4JywgJzAnKTtcbiAgICB0aGlzLmJnLnNldEF0dHJpYnV0ZSgneScsICcwJyk7XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIGZldGNoKGltYWdlKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0Lm9rKSB7XG4gICAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYmcuc2V0QXR0cmlidXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnaHJlZicsIHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgY29uc3QgYmJveCA9IHRoaXMuYmcuZ2V0QkJveCgpO1xuICAgICAgICAgIGlmICghdGhpcy5ncm91cC5oYXNBdHRyaWJ1dGUoJ3ZpZXdCb3gnKSkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgSWYgdGhlIFNWRyBkb2VzIG5vdCBoYXZlIGEgdmlld0JveCwgbG9hZCB0aGUgcHJldmlvdXMgdmlld0JveFxuICAgICAgICAgICAgICB2YWx1ZSBmcm9tIGxvY2FsU3RvcmFnZS4gSWYgbm9uZSBoYXMgYmVlbiBzdG9yZWQgKHZpZXdCb3ggaXMgbnVsbCksXG4gICAgICAgICAgICAgIHNldCBpdCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYmFja2dyb3VuZCBpbWFnZVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgTm90ZTogYW4gU1ZHJ3Mgdmlld0JveCBnaXZlcyB0aGUgXCJib3hcIiB0aGF0IHRoZSB1c2VyIGNhbiBzZWUgdGhlIFNWRyB0aHJvdWdoLlxuICAgICAgICAgICAgICBUaGUgdXNlciBtYXkgYmUgem9vbWVkIGludG8gYSB2ZXJ5IHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIFNWRywgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICAgICAgICAgICAgdmlld0JveCBzaG91bGQgZ2l2ZSBjb29yZGluYXRlcyBvZiB0aGF0IHNwZWNpZmljIGJveC5cblxuICAgICAgICAgICAgICBTZWUgbW9yZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0F0dHJpYnV0ZS92aWV3Qm94XG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGV0IHsgdmlld0JveCB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgIGlmICghdmlld0JveClcbiAgICAgICAgICAgICAgdmlld0JveCA9ICcwIDAgJyArIGJib3gud2lkdGgudG9TdHJpbmcoKSArICcgJyArIGJib3guaGVpZ2h0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JvdXAuc2V0QXR0cmlidXRlKCd2aWV3Qm94Jywgdmlld0JveCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5ibG9iKCk7XG4gICAgICB9XG4gICAgfSkudGhlbihibG9iID0+IHtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgIH0pO1xuXG4gICAgLy8gSXQgaXMgYmV0dGVyIG5hbWVkIHN2ZywgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggdGhlIGFjdHVhbCBNRUkgZmlsZS5cbiAgICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvc3ZnJywgJ3N2ZycpIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgdGhpcy5zdmcuaWQgPSAnbWVpX291dHB1dCc7XG4gICAgdGhpcy5zdmcuY2xhc3NMaXN0LmFkZCgnbmVvbi1jb250YWluZXInLCAnYWN0aXZlLXBhZ2UnKTtcblxuICAgIHRoaXMuZ3JvdXAuYXBwZW5kQ2hpbGQodGhpcy5iZyk7XG4gICAgdGhpcy5ncm91cC5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5ncm91cCk7XG5cbiAgICB0aGlzLnpvb21IYW5kbGVyID0gbmV3IFpvb21IYW5kbGVyKCk7XG4gICAgdGhpcy5kaXNwbGF5UGFuZWwgPSBuZXcgcGFuZWwodGhpcywgJ25lb24tY29udGFpbmVyJywgJ2JhY2tncm91bmQnLCB0aGlzLnpvb21IYW5kbGVyKTtcblxuICAgIHRoaXMucGFnZVVSSSA9IGltYWdlO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgb25TVkdMb2FkICgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZpZXdFdmVudEhhbmRsZXJzKCk7XG4gICAgdGhpcy5kaXNwbGF5UGFuZWwuc2V0RGlzcGxheUxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgU1ZHIGJlaW5nIGRpc3BsYXllZC5cbiAgICogQHBhcmFtIHN2ZyAtIE5ldyByZW5kZXJlZCBTVkcgdG8gdXNlLlxuICAgKi9cbiAgdXBkYXRlU1ZHIChzdmc6IFNWR1NWR0VsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmdyb3VwLnJlcGxhY2VDaGlsZChzdmcsIHRoaXMuc3ZnKTtcbiAgICB0aGlzLnN2ZyA9IHN2ZztcbiAgICB0aGlzLnN2Zy5pZCA9ICdtZWlfb3V0cHV0JztcbiAgICB0aGlzLnN2Zy5jbGFzc0xpc3QuYWRkKCduZW9uLWNvbnRhaW5lcicsICdhY3RpdmUtcGFnZScpO1xuICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHRoaXMuc3ZnLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpO1xuICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQodGhpcy5zdmcuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcblxuICAgIHRoaXMuYmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQudG9TdHJpbmcoKSk7XG4gICAgdGhpcy5iZy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCB7IHZpZXdCb3ggfSA9IGdldFNldHRpbmdzKCk7XG4gICAgaWYgKCF2aWV3Qm94KVxuICAgICAgdGhpcy5ncm91cC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCAnMCAwICcgKyB3aWR0aCArICcgJyArIGhlaWdodCk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5ncm91cC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCB2aWV3Qm94KTtcblxuICAgIHVwZGF0ZUhpZ2hsaWdodCgpO1xuICAgIHRoaXMucmVzZXRUcmFuc2Zvcm1hdGlvbnMoKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0byBhIGNlcnRhaW4gcGFnZVxuICAgKiBTaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBwYWdlLCB0aGlzIGlzIGVzc2VudGlhbGx5IGEgd3JhcHBlciBmb3IgdXBkYXRlU1ZHXG4gICAqL1xuICBhc3luYyBjaGFuZ2VQYWdlIChfcGFnZTogbnVtYmVyLCBfZGVsYXk6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdmcgPSBhd2FpdCB0aGlzLm5lb25WaWV3LmdldFBhZ2VTVkcodGhpcy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICB0aGlzLnVwZGF0ZVNWRyhzdmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNhbGxiYWNrIHRvIHRoZSBsaXN0IG9mIHRob3NlIGJlIGNhbGxlZCB3aGVuIHRoZSBwYWdlIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSBjYiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICovXG4gIGFkZFVwZGF0ZUNhbGxiYWNrIChjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2tzLnB1c2goY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Qgb2YgY2FsbGJhY2tzIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGxpc3QuXG4gICAqIEBwYXJhbSBjYiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICovXG4gIHJlbW92ZVVwZGF0ZUNhbGxiYWNrIChjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy51cGRhdGVDYWxsYmFja3MuZmluZEluZGV4KChlbGVtKSA9PiB7XG4gICAgICByZXR1cm4gZWxlbSA9PT0gY2I7XG4gICAgfSk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy51cGRhdGVDYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHRyYW5zZm9ybWF0aW9ucyB0aGF0IGhhdmUgYmVlbiBhcHBsaWVkIHRvIHRoZSBTVkcgdXBvbiB1cGRhdGUuXG4gICAqL1xuICByZXNldFRyYW5zZm9ybWF0aW9ucyAoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5UGFuZWwuem9vbUhhbmRsZXIucmVzdG9yZVRyYW5zZm9ybWF0aW9uKCk7XG4gICAgc2V0R2x5cGhPcGFjaXR5RnJvbVNsaWRlcigpO1xuICAgIHNldEJnT3BhY2l0eUZyb21TbGlkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgemVyby1pbmRleGVkIG51bWJlciBvZiB0aGUgY3VycmVudCBwYWdlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIHplcm8uXG4gICAqL1xuICBnZXRDdXJyZW50UGFnZSAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgVVJJIG9mIHRoZSBwYWdlLlxuICAgKi9cbiAgZ2V0Q3VycmVudFBhZ2VVUkkgKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFnZVVSSTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSB2aWV3IGFuZCBkaXNwbGF5IHBhbmVsLlxuICAgKi9cbiAgc2V0Vmlld0V2ZW50SGFuZGxlcnMgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgICBjYXNlICdTaGlmdCc6XG4gICAgICAgICAgZDMuc2VsZWN0KCcjc3ZnX2dyb3VwJykub24oJy5kcmFnJywgbnVsbCk7XG4gICAgICAgICAgZDMuc2VsZWN0KCcjc3ZnX2dyb3VwJykuY2FsbChcbiAgICAgICAgICAgIGQzLmRyYWcoKS5vbignc3RhcnQnLCB0aGlzLmRpc3BsYXlQYW5lbC56b29tSGFuZGxlci5zdGFydERyYWcuYmluZCh0aGlzLmRpc3BsYXlQYW5lbC56b29tSGFuZGxlcikpXG4gICAgICAgICAgICAgIC5vbignZHJhZycsIHRoaXMuZGlzcGxheVBhbmVsLnpvb21IYW5kbGVyLmRyYWdnaW5nLmJpbmQodGhpcy5kaXNwbGF5UGFuZWwuem9vbUhhbmRsZXIpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWlfb3V0cHV0Jykuc2V0QXR0cmlidXRlKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2dCkgPT4ge1xuICAgICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ1NoaWZ0JzpcbiAgICAgICAgICBkMy5zZWxlY3QoJyNzdmdfZ3JvdXAnKS5vbignLmRyYWcnLCBudWxsKTtcbiAgICAgICAgICBpZiAodGhpcy5uZW9uVmlldy5nZXRVc2VyTW9kZSgpICE9PSAndmlld2VyJykge1xuICAgICAgICAgICAgdGhpcy5uZW9uVmlldy5OZXVtZUVkaXQuc2V0U2VsZWN0TGlzdGVuZXJzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVpX291dHB1dCcpLnNldEF0dHJpYnV0ZSgndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZDMuc2VsZWN0KCcjY29udGFpbmVyJykub24oJ3RvdWNoc3RhcnQnLCAoKSA9PiB7XG4gICAgICBpZiAoZDMuZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5UGFuZWwuem9vbUhhbmRsZXIuc3RhcnREcmFnKCk7XG4gICAgICAgIGQzLnNlbGVjdCgnI2NvbnRhaW5lcicpLm9uKCd0b3VjaG1vdmUnLCB0aGlzLmRpc3BsYXlQYW5lbC56b29tSGFuZGxlci5kcmFnZ2luZy5iaW5kKHRoaXMuZGlzcGxheVBhbmVsLnpvb21IYW5kbGVyKSk7XG4gICAgICAgIGQzLnNlbGVjdCgnI2NvbnRhaW5lcicpLm9uKCd0b3VjaGVuZCcsICgpID0+IHtcbiAgICAgICAgICBkMy5zZWxlY3QoJyNjb250YWluZXInKS5vbigndG91Y2htb3ZlJywgbnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGQzLnNlbGVjdCgnI2NvbnRhaW5lcicpLm9uKCd3aGVlbCcsIHRoaXMuZGlzcGxheVBhbmVsLnpvb21IYW5kbGVyLnNjcm9sbFpvb20uYmluZCh0aGlzLmRpc3BsYXlQYW5lbC56b29tSGFuZGxlciksIGZhbHNlKTtcbiAgICAvLyBVcGRhdGUgaGVpZ2h0IG9mIGNvbnRhaW5lciBiYXNlZCBvbiB3aW5kb3dcbiAgICB3aW5kb3cub25yZXNpemUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuZXdIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJyk7XG4gICAgICBpZiAobmV3SGVpZ2h0ID4gTnVtYmVyKGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKSkge1xuICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBuZXdIZWlnaHQudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHRoZSBwYWdlLiBVc2VkIGZvciBkb3dubG9hZHMuXG4gICAqL1xuICBnZXRQYWdlTmFtZSAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uZW9uVmlldy5uYW1lO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpbmdsZVZpZXcgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgc2V0U2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9Mb2NhbFNldHRpbmdzJztcblxuZXhwb3J0IGNsYXNzIFZpZXdCb3gge1xuICAvLyB2aWVCb3ggYXR0cmlidXRlIG9mIGFuIFNWRyB2aWV3cG9ydDpcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0F0dHJpYnV0ZS92aWV3Qm94XG4gIG1pblg6IG51bWJlcjtcbiAgbWluWTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcblxuICBpbWFnZUhlaWdodDogbnVtYmVyO1xuICBpbWFnZVdpZHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbWFnZVdpZHRoIC0gV2lkdGggb2YgdGhlIGNvbnRhaW5lZCBpbWFnZS5cbiAgICogQHBhcmFtIGltYWdlSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjb250YWluZWQgaW1hZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoaW1hZ2VXaWR0aDogbnVtYmVyLCBpbWFnZUhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy5taW5YID0gMDtcbiAgICB0aGlzLm1pblkgPSAwO1xuICAgIHRoaXMud2lkdGggPSBpbWFnZVdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaW1hZ2VIZWlnaHQ7XG5cbiAgICB0aGlzLmltYWdlV2lkdGggPSBpbWFnZVdpZHRoO1xuICAgIHRoaXMuaW1hZ2VIZWlnaHQgPSBpbWFnZUhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsdWVzIG9mIHRoZSB2aWV3Qm94IG1hbnVhbGx5LlxuICAgKiBAcGFyYW0gbWluWCAtIHRvcCBsZWZ0IHgtY29vcmRpbmF0ZSBvZiBTVkdcbiAgICogQHBhcmFtIG1pblkgLSB0b3AgbGVmdCB5LWNvb3JkaW5hdGUgb2YgU1ZHXG4gICAqIEBwYXJhbSB3aWR0aCAtIHdpZHRoIG9mIFNWR1xuICAgKiBAcGFyYW0gaGVpZ2h0IC0gaGVpZ2h0IG9mIFNWR1xuICAgKi9cbiAgc2V0IChtaW5YOiBudW1iZXIsIG1pblk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1pblggPSBtaW5YO1xuICAgIHRoaXMubWluWSA9IG1pblk7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIFZhbHVlIGZvciB0aGUgdmlld0JveCBwYXJhbWV0ZXIuICovXG4gIGdldCAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5taW5YLnRvU3RyaW5nKCkgKyAnICcgKyB0aGlzLm1pblkudG9TdHJpbmcoKSArICcgJyArXG4gICAgICB0aGlzLndpZHRoICsgJyAnICsgdGhpcy5oZWlnaHQ7XG4gIH1cblxuICAvKiogQHBhcmFtIGsgLSBGYWN0b3IgdG8gem9vbSB0by4gKi9cbiAgem9vbVRvIChrOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6b29tSGVpZ2h0ID0gKHRoaXMuaW1hZ2VIZWlnaHQgLyBrKTtcbiAgICBjb25zdCB6b29tV2lkdGggPSAodGhpcy5pbWFnZVdpZHRoIC8gayk7XG5cbiAgICB0aGlzLndpZHRoID0gem9vbVdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gem9vbUhlaWdodDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyBDdXJyZW50IHpvb20gZmFjdG9yLiAqL1xuICBnZXRab29tICgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmltYWdlV2lkdGggLyB0aGlzLndpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZSB2aWV3cG9ydC5cbiAgICogQHBhcmFtIHhEaWZmIC0gQW1vdW50IHRvIHNoaWZ0IG9uIHgtYXhpcy5cbiAgICogQHBhcmFtIHlEaWZmIC0gQW1vdW50IHRvIHNoaWZ0IG9uIHktYXhpcy5cbiAgICovXG4gIHRyYW5zbGF0ZSAoeERpZmY6IG51bWJlciwgeURpZmY6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWluWCArPSB4RGlmZjtcbiAgICB0aGlzLm1pblkgKz0geURpZmY7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFpvb21IYW5kbGVyIHtcbiAgZHJhZ0Nvb3JkaW5hdGVzOiBET01Qb2ludDtcbiAgdmlld0JveDogVmlld0JveDtcbiAgbWF0cml4OiBET01NYXRyaXg7XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSB6b29tIGFuZCBwYW4gb2YgdGhlIFNWRyB2aWV3Ym94XG4gICAqL1xuICByZXNldFpvb21BbmRQYW4gKHJlc2V0U2V0dGluZ3MgPSB0cnVlKTogdm9pZCB7XG4gICAgY29uc3QgYmdpbWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIHRoaXMudmlld0JveCA9IG5ldyBWaWV3Qm94KHBhcnNlSW50KGJnaW1nLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSksIHBhcnNlSW50KGJnaW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpKTtcblxuICAgIGlmIChyZXNldFNldHRpbmdzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNWR1ZpZXdCb3goKTtcbiAgICAgIHNldFNldHRpbmdzKHsgem9vbTogMTAwIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gayAtIEZhY3RvciB0byB6b29tIHRvLlxuICAgKi9cbiAgem9vbVRvIChrOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZpZXdCb3goKTtcbiAgICB0aGlzLnZpZXdCb3guem9vbVRvKGspO1xuICAgIHRoaXMudXBkYXRlU1ZHVmlld0JveCgpO1xuXG4gICAgc2V0U2V0dGluZ3MoeyB6b29tOiBNYXRoLmZsb29yKGsgKiAxMDApIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZSB0aGUgdmlldyBib3ggYnkgcmVsYXRpdmUgY29vcmRpbmF0ZXMuXG4gICogQHBhcmFtIHhEaWZmIC0gQW1vdW50IHRvIHNoaWZ0IG9uIHgtYXhpcy5cbiAgKiBAcGFyYW0geURpZmYgLSBBbW91bnQgdG8gc2hpZnQgb24geS1heGlzLlxuICAqL1xuICB0cmFuc2xhdGUgKHhEaWZmOiBudW1iZXIsIHlEaWZmOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZpZXdCb3goKTtcbiAgICB0aGlzLnZpZXdCb3gudHJhbnNsYXRlKHhEaWZmLCB5RGlmZik7XG4gICAgdGhpcy51cGRhdGVTVkdWaWV3Qm94KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSB0aGUgdmlldyBib3ggdG8gaXRzIHBvc2l0aW9uIGJlZm9yZSB0aGUgZWRpdG9yIGFjdGlvbi5cbiAgICovXG4gIHJlc3RvcmVUcmFuc2Zvcm1hdGlvbiAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld0JveCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlc2V0Wm9vbUFuZFBhbihmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlU1ZHVmlld0JveCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZpZXcgYm94IG9mIHRoZSBTVkcuXG4gICAqL1xuICBzZXRWaWV3Qm94ICgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3Qm94ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJnaW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JnaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICAgIHRoaXMudmlld0JveCA9IG5ldyBWaWV3Qm94KHBhcnNlSW50KGJnaW1nLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSksIHBhcnNlSW50KGJnaW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpKTtcbiAgICB9XG4gICAgY29uc3QgcmF3Vmlld0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmdfZ3JvdXAnKVxuICAgICAgLmdldEF0dHJpYnV0ZSgndmlld0JveCcpXG4gICAgICAuc3BsaXQoJyAnKTtcbiAgICB0aGlzLnZpZXdCb3guc2V0KFxuICAgICAgcGFyc2VJbnQocmF3Vmlld0JveFswXSksXG4gICAgICBwYXJzZUludChyYXdWaWV3Qm94WzFdKSxcbiAgICAgIHBhcnNlSW50KHJhd1ZpZXdCb3hbMl0pLFxuICAgICAgcGFyc2VJbnQocmF3Vmlld0JveFszXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlld0JveCBhdHRyaWJ1dGUgb2Ygc3ZnX2dyb3VwXG4gICAqL1xuICB1cGRhdGVTVkdWaWV3Qm94ICgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3Qm94U3RyaW5nID0gdGhpcy52aWV3Qm94LmdldCgpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmdfZ3JvdXAnKS5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCB2aWV3Qm94U3RyaW5nKTtcbiAgICBzZXRTZXR0aW5ncyh7IHZpZXdCb3g6IHZpZXdCb3hTdHJpbmcgfSk7XG4gIH1cblxuICBzdGFydERyYWcgKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Z19ncm91cCcpIGFzIHVua25vd24gYXMgU1ZHU1ZHRWxlbWVudDtcbiAgICB0aGlzLmRyYWdDb29yZGluYXRlcyA9IGdyb3VwLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgaWYgKGQzLmV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgLy8gSWYgZHJhZyBpcyB0cmlnZ2VyZWQgYnkgYSB0b3VjaCBldmVudFxuICAgICAgdGhpcy5kcmFnQ29vcmRpbmF0ZXMueCA9IGQzLmV2ZW50LnRvdWNoZXNbMF0uc2NyZWVuWDtcbiAgICAgIHRoaXMuZHJhZ0Nvb3JkaW5hdGVzLnkgPSBkMy5ldmVudC50b3VjaGVzWzBdLnNjcmVlblk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZSB0cmlnZ2VyZWQgYnkgYSBtb3VzZSBjbGlja1xuICAgICAgdGhpcy5kcmFnQ29vcmRpbmF0ZXMueCA9IGQzLmV2ZW50Lng7XG4gICAgICB0aGlzLmRyYWdDb29yZGluYXRlcy55ID0gZDMuZXZlbnQueTtcbiAgICB9XG5cbiAgICB0aGlzLm1hdHJpeCA9IGdyb3VwLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKTtcbiAgfVxuXG4gIGRyYWdnaW5nICgpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmdfZ3JvdXAnKSBhcyB1bmtub3duIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgY29uc3QgbmV3Q29vcmRpbmF0ZXMgPSBncm91cC5jcmVhdGVTVkdQb2ludCgpO1xuICAgIC8vIFNhbWUga2luZCBvZiBjaGVja2luZyBhcyBpbiBzdGFydERyYWdcbiAgICBpZiAoZDMuZXZlbnQudHlwZSA9PT0gJ3RvdWNobW92ZScpIHtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnggPSBkMy5ldmVudC50b3VjaGVzWzBdLnNjcmVlblg7XG4gICAgICBuZXdDb29yZGluYXRlcy55ID0gZDMuZXZlbnQudG91Y2hlc1swXS5zY3JlZW5ZO1xuICAgIH0gZWxzZSBpZiAoZDMuZXZlbnQudHlwZSA9PT0gJ3doZWVsJyAmJiBkMy5ldmVudC5zaGlmdEtleSA9PT0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubWF0cml4ID0gZ3JvdXAuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHJhZ0Nvb3JkaW5hdGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5kcmFnQ29vcmRpbmF0ZXMgPSBncm91cC5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5kcmFnQ29vcmRpbmF0ZXMueCA9IGQzLmV2ZW50Lng7XG4gICAgICB0aGlzLmRyYWdDb29yZGluYXRlcy55ID0gZDMuZXZlbnQueTtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnggPSB0aGlzLmRyYWdDb29yZGluYXRlcy54IC0gZDMuZXZlbnQuZGVsdGFYO1xuICAgICAgbmV3Q29vcmRpbmF0ZXMueSA9IHRoaXMuZHJhZ0Nvb3JkaW5hdGVzLnkgLSBkMy5ldmVudC5kZWx0YVk7XG4gICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDb29yZGluYXRlcy54ID0gZDMuZXZlbnQueDtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnkgPSBkMy5ldmVudC55O1xuICAgIH1cbiAgICBjb25zdCBuZXdUcmFuc2Zvcm0gPSBuZXdDb29yZGluYXRlcy5tYXRyaXhUcmFuc2Zvcm0odGhpcy5tYXRyaXgpO1xuICAgIGNvbnN0IGRyYWdUcmFuc2Zvcm0gPSB0aGlzLmRyYWdDb29yZGluYXRlcy5tYXRyaXhUcmFuc2Zvcm0odGhpcy5tYXRyaXgpO1xuICAgIHRoaXMudHJhbnNsYXRlKC1uZXdUcmFuc2Zvcm0ueCArIGRyYWdUcmFuc2Zvcm0ueCwgLW5ld1RyYW5zZm9ybS55ICsgZHJhZ1RyYW5zZm9ybS55KTtcbiAgICB0aGlzLmRyYWdDb29yZGluYXRlcyA9IG5ld0Nvb3JkaW5hdGVzO1xuICB9XG5cbiAgc2Nyb2xsWm9vbSAoKTogdm9pZCB7XG4gICAgaWYgKGQzLmV2ZW50LnR5cGUgIT09ICd3aGVlbCcpIHJldHVybjtcbiAgICBpZiAoIWQzLmV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICB0aGlzLmRyYWdnaW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6b29tU2xpZGVyJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldFZpZXdCb3goKTtcbiAgICBjb25zdCBrID0gdGhpcy52aWV3Qm94LmdldFpvb20oKTtcbiAgICBsZXQgbmV3SyA9IGsgLSBkMy5ldmVudC5kZWx0YVggLyAxMDA7XG4gICAgaWYgKG5ld0sgPCBwYXJzZUludChzbGlkZXIuZ2V0QXR0cmlidXRlKCdtaW4nKSkgLyAxMDApIG5ld0sgPSAwLjI1O1xuICAgIGlmIChuZXdLID4gcGFyc2VJbnQoc2xpZGVyLmdldEF0dHJpYnV0ZSgnbWF4JykpIC8gMTAwKSBuZXdLID0gNDtcbiAgICB0aGlzLnpvb21UbyhuZXdLKTtcblxuICAgIC8vIFVwZGF0ZSB6b29tIHNsaWRlclxuICAgIHNsaWRlci52YWx1ZSA9IChuZXdLICogMTAwKS50b1N0cmluZygpO1xuICAgIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnem9vbU91dHB1dCcpIGFzIEhUTUxPdXRwdXRFbGVtZW50KS52YWx1ZSA9IFN0cmluZyhNYXRoLnJvdW5kKG5ld0sgKiAxMDApKTtcbiAgfVxufVxuXG5leHBvcnQgeyBab29tSGFuZGxlciBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgeyBiaW5kSW5zZXJ0VGFicywgaW5pdEluc2VydEVkaXRDb250cm9scywgaW5pdFNlbGVjdGlvbkJ1dHRvbnMgfSBmcm9tICcuL0NvbnRyb2xzJztcbmltcG9ydCAqIGFzIFNlbGVjdCBmcm9tICcuLi91dGlscy9TZWxlY3QnO1xuaW1wb3J0IEluc2VydEhhbmRsZXIgZnJvbSAnLi9JbnNlcnRIYW5kbGVyJztcbmltcG9ydCBOZW9uVmlldyBmcm9tICcuLi9OZW9uVmlldyc7XG5pbXBvcnQgKiBhcyBTZWxlY3RPcHRpb25zIGZyb20gJy4vU2VsZWN0T3B0aW9ucyc7XG5pbXBvcnQgeyBzZXRIaWdobGlnaHRTZWxlY3Rpb25Db250cm9scyB9IGZyb20gJy4uL0Rpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4uL3V0aWxzL0RyYWdIYW5kbGVyJztcbmltcG9ydCB7IE5ldW1lRWRpdEludGVyZmFjZSB9IGZyb20gJy4uL0ludGVyZmFjZXMnO1xuaW1wb3J0ICogYXMgQ29udGVudHMgZnJvbSAnLi9Db250ZW50cyc7XG5pbXBvcnQgeyB1bmRvUmVkb1BhbmVsIH0gZnJvbSAnLi4vdXRpbHMvRWRpdENvbnRlbnRzJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5pbXBvcnQgeyBVc2VyVHlwZSB9IGZyb20gJy4uL1R5cGVzJztcblxuY2xhc3MgRGl2YUVkaXQgaW1wbGVtZW50cyBOZXVtZUVkaXRJbnRlcmZhY2Uge1xuICBuZW9uVmlldzogTmVvblZpZXc7XG4gIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcjtcbiAgaW5zZXJ0SGFuZGxlcjogSW5zZXJ0SGFuZGxlcjtcbiAgY29uc3RydWN0b3IgKG5lb25WaWV3OiBOZW9uVmlldykge1xuICAgIHRoaXMubmVvblZpZXcgPSBuZW9uVmlldztcbiAgICB0aGlzLmluaXRFZGl0TW9kZSgpO1xuICB9XG5cbiAgaW5pdEVkaXRNb2RlICgpOiB2b2lkIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zZXJ0X2NvbnRyb2xzJykuaW5uZXJIVE1MICs9IENvbnRlbnRzLmluc2VydENvbnRyb2xzUGFuZWw7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRfY29udHJvbHMnKS5pbm5lckhUTUwgKz0gQ29udGVudHMuZWRpdENvbnRyb2xzUGFuZWw7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG9SZWRvX2NvbnRyb2xzJykuaW5uZXJIVE1MID0gdW5kb1JlZG9QYW5lbDtcblxuICAgIHRoaXMuZHJhZ0hhbmRsZXIgPSBuZXcgRHJhZ0hhbmRsZXIodGhpcy5uZW9uVmlldywgJy5hY3RpdmUtcGFnZSA+IHN2ZycpO1xuICAgIHRoaXMuaW5zZXJ0SGFuZGxlciA9IG5ldyBJbnNlcnRIYW5kbGVyKHRoaXMubmVvblZpZXcsICcuYWN0aXZlLXBhZ2UgPiBzdmcnKTtcbiAgICBiaW5kSW5zZXJ0VGFicyh0aGlzLmluc2VydEhhbmRsZXIpO1xuICAgIGNvbnN0IHsgaW5zZXJ0VGFiIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGluc2VydFRhYikuY2xpY2soKTtcbiAgICBTZWxlY3Quc2V0U2VsZWN0SGVscGVyT2JqZWN0cyh0aGlzLm5lb25WaWV3LCB0aGlzLmRyYWdIYW5kbGVyKTtcbiAgICB0aGlzLnNldFNlbGVjdExpc3RlbmVycygpO1xuICAgIFNlbGVjdE9wdGlvbnMuaW5pdE5lb25WaWV3KHRoaXMubmVvblZpZXcpO1xuICAgIGluaXRJbnNlcnRFZGl0Q29udHJvbHMoKTtcbiAgICBTZWxlY3Quc2V0U2VsZWN0U3Ryb2tlV2lkdGgoMSk7XG4gICAgaW5pdFNlbGVjdGlvbkJ1dHRvbnMoKTtcbiAgICBzZXRIaWdobGlnaHRTZWxlY3Rpb25Db250cm9scygpO1xuICAgIHRoaXMubmVvblZpZXcudmlldy5hZGRVcGRhdGVDYWxsYmFjayh0aGlzLnNldFNlbGVjdExpc3RlbmVycy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIgbW9kZSB0aGF0IE5lb24gaXMgaW4uIEVpdGhlciBpbnNlcnQsIGVkaXQsIG9yIHZpZXdlci5cbiAgICogQHJldHVybnMge1VzZXJUeXBlfVxuICAgKi9cbiAgZ2V0VXNlck1vZGUgKCk6IFVzZXJUeXBlIHtcbiAgICBjb25zdCB7IHVzZXJNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgIHJldHVybiB1c2VyTW9kZTtcbiAgfVxuXG4gIHNldFNlbGVjdExpc3RlbmVycyAoKTogdm9pZCB7XG4gICAgU2VsZWN0LmNsaWNrU2VsZWN0KCcuYWN0aXZlLXBhZ2UgPiBzdmcgPiBzdmcsIC5hY3RpdmUtcGFnZSA+IHN2ZyA+IHN2ZyB1c2UsIC5hY3RpdmUtcGFnZSA+IHN2ZyA+IHN2ZyByZWN0Jyk7XG4gICAgU2VsZWN0LmRyYWdTZWxlY3QoJy5hY3RpdmUtcGFnZSBzdmcnKTtcbiAgfVxufVxuXG5leHBvcnQgeyBEaXZhRWRpdCBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgeyBiaW5kSW5zZXJ0VGFicywgaW5pdEluc2VydEVkaXRDb250cm9scywgaW5pdFNlbGVjdGlvbkJ1dHRvbnMgfSBmcm9tICcuL0NvbnRyb2xzJztcbmltcG9ydCB7IHNldEhpZ2hsaWdodE9wdGlvbiB9IGZyb20gJy4uL0Rpc3BsYXlQYW5lbC9EaXNwbGF5Q29udHJvbHMnO1xuaW1wb3J0IHsgaW5pdFVuZG9SZWRvUGFuZWwgfSBmcm9tICcuLi91dGlscy9FZGl0Q29udHJvbHMnO1xuaW1wb3J0ICogYXMgU2VsZWN0IGZyb20gJy4uL3V0aWxzL1NlbGVjdCc7XG5pbXBvcnQgSW5zZXJ0SGFuZGxlciBmcm9tICcuL0luc2VydEhhbmRsZXInO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4uL05lb25WaWV3JztcbmltcG9ydCAqIGFzIFNlbGVjdE9wdGlvbnMgZnJvbSAnLi9TZWxlY3RPcHRpb25zJztcbmltcG9ydCBEcmFnSGFuZGxlciBmcm9tICcuLi91dGlscy9EcmFnSGFuZGxlcic7XG5pbXBvcnQgeyBOZXVtZUVkaXRJbnRlcmZhY2UgfSBmcm9tICcuLi9JbnRlcmZhY2VzJztcbmltcG9ydCAqIGFzIENvbnRlbnRzIGZyb20gJy4vQ29udGVudHMnO1xuaW1wb3J0IHsgdW5kb1JlZG9QYW5lbCB9IGZyb20gJy4uL3V0aWxzL0VkaXRDb250ZW50cyc7XG5pbXBvcnQgeyBpbml0TmF2YmFyIH0gZnJvbSAnLi4vdXRpbHMvRWRpdENvbnRyb2xzJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5pbXBvcnQgeyBVc2VyVHlwZSB9IGZyb20gJy4uL1R5cGVzJztcblxuLyoqXG4gKiBBbiBFZGl0IE1vZHVsZSBmb3IgYSBzaW5nbGUgcGFnZSBvZiBhIG1hbnVzY3JpcHQuXG4gKiBXb3JrcyB3aXRoIHRoZSBTaW5nbGVWaWV3IG1vZHVsZS5cbiAqL1xuY2xhc3MgU2luZ2xlRWRpdE1vZGUgaW1wbGVtZW50cyBOZXVtZUVkaXRJbnRlcmZhY2Uge1xuICBuZW9uVmlldzogTmVvblZpZXc7XG4gIGRyYWdIYW5kbGVyOiBEcmFnSGFuZGxlcjtcbiAgaW5zZXJ0SGFuZGxlcjogSW5zZXJ0SGFuZGxlcjtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBFZGl0TW9kZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7TmVvblZpZXd9IG5lb25WaWV3IC0gVGhlIE5lb25WaWV3IHBhcmVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChuZW9uVmlldzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5pbml0RWRpdE1vZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIEVkaXQgbW9kZSAoZGVmYXVsdCkuXG4gICAqL1xuICBpbml0RWRpdE1vZGUgKCk6IHZvaWQge1xuXG4gICAgaW5pdE5hdmJhcih0aGlzLm5lb25WaWV3KTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5zZXJ0X2NvbnRyb2xzJykuaW5uZXJIVE1MICs9IENvbnRlbnRzLmluc2VydENvbnRyb2xzUGFuZWw7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRfY29udHJvbHMnKS5pbm5lckhUTUwgKz0gQ29udGVudHMuZWRpdENvbnRyb2xzUGFuZWw7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuZG9SZWRvX2NvbnRyb2xzJykuaW5uZXJIVE1MID0gdW5kb1JlZG9QYW5lbDtcblxuICAgIHRoaXMuZHJhZ0hhbmRsZXIgPSBuZXcgRHJhZ0hhbmRsZXIodGhpcy5uZW9uVmlldywgJyNzdmdfZ3JvdXAnKTtcbiAgICB0aGlzLmluc2VydEhhbmRsZXIgPSBuZXcgSW5zZXJ0SGFuZGxlcih0aGlzLm5lb25WaWV3LCAnI3N2Z19ncm91cCcpO1xuICAgIGJpbmRJbnNlcnRUYWJzKHRoaXMuaW5zZXJ0SGFuZGxlcik7XG4gICAgY29uc3QgeyBpbnNlcnRUYWIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5zZXJ0VGFiKS5jbGljaygpO1xuICAgIFNlbGVjdC5zZXRTZWxlY3RIZWxwZXJPYmplY3RzKHRoaXMubmVvblZpZXcsIHRoaXMuZHJhZ0hhbmRsZXIpO1xuICAgIHRoaXMuc2V0U2VsZWN0TGlzdGVuZXJzKCk7XG5cbiAgICBTZWxlY3RPcHRpb25zLmluaXROZW9uVmlldyh0aGlzLm5lb25WaWV3KTtcbiAgICBpbml0SW5zZXJ0RWRpdENvbnRyb2xzKCk7XG4gICAgaW5pdFNlbGVjdGlvbkJ1dHRvbnMoKTtcbiAgICBpbml0VW5kb1JlZG9QYW5lbCh0aGlzLm5lb25WaWV3KTtcbiAgICBzZXRIaWdobGlnaHRPcHRpb24oJ3NlbGVjdGlvbicpO1xuICAgIHRoaXMubmVvblZpZXcudmlldy5hZGRVcGRhdGVDYWxsYmFjayh0aGlzLnNldFNlbGVjdExpc3RlbmVycy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIgbW9kZSB0aGF0IE5lb24gaXMgaW4uIEVpdGhlciBpbnNlcnQsIGVkaXQsIG9yIHZpZXdlci5cbiAgICogQHJldHVybnMge1VzZXJUeXBlfVxuICAgKi9cbiAgZ2V0VXNlck1vZGUgKCk6IFVzZXJUeXBlIHtcbiAgICBjb25zdCB7IHVzZXJNb2RlIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgIHJldHVybiB1c2VyTW9kZTtcbiAgfVxuXG4gIHNldFNlbGVjdExpc3RlbmVycyAoKTogdm9pZCB7XG4gICAgU2VsZWN0LmNsaWNrU2VsZWN0KCcjc3ZnX2dyb3VwLCAjc3ZnX2dyb3VwIHVzZSwgI3N2Z19ncm91cCByZWN0Jyk7XG4gICAgU2VsZWN0LmRyYWdTZWxlY3QoJyNzdmdfZ3JvdXAnKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTaW5nbGVFZGl0TW9kZSBhcyBkZWZhdWx0IH07XG4iLCIvKiogQG1vZHVsZSBJbmZvTW9kdWxlICovXG5cbmltcG9ydCBOZW9uVmlldyBmcm9tICcuL05lb25WaWV3JztcbmltcG9ydCB7IEluZm9JbnRlcmZhY2UgfSBmcm9tICcuL0ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgQ2xlZkF0dHJpYnV0ZXMgfSBmcm9tICcuL1R5cGVzJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCBzZXRTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMvTG9jYWxTZXR0aW5ncyc7XG5pbXBvcnQgeyB1cGRhdGVEaXNwbGF5QWxsQnRuIH0gZnJvbSAnLi9EaXNwbGF5UGFuZWwvRGlzcGxheUNvbnRyb2xzJztcblxuLyoqXG4gKiBNYXAgb2YgY29udG91cnMgdG8gbmV1bWUgbmFtZXMuXG4gKi9cbmNvbnN0IG5ldW1lR3JvdXBzID0gbmV3IE1hcChcbiAgW1snJywgJ1B1bmN0dW0nXSwgWyd1JywgJ1BlcyddLCBbJ2QnLCAnQ2xpdmlzJ10sIFsndXUnLCAnU2NhbmRpY3VzJ10sIFsndWQnLCAnVG9yY3VsdXMnXSwgWydkdScsICdQb3JyZWN0dXMnXSwgWydzJywgJ0Rpc3Ryb3BoYSddLCBbJ3NzJywgJ1RyaXN0b3BoYSddLFxuICAgIFsnc2QnLCAnUHJlc3N1cyddLCBbJ2RkJywgJ0NsaW1hY3VzJ10sIFsnZGR1JywgJ0NsaW1hY3VzUmVzdXBpbnVzJ10sIFsndWR1JywgJ1RvcmN1bHVzUmVzdXBpbnVzJ10sIFsnZHVkJywgJ1BvcnJlY3R1c0ZsZXh1cyddLFxuICAgIFsndWRkJywgJ1Blc1N1YnB1bmN0aXMnXSwgWyd1dWQnLCAnU2NhbmRpY3VzRmxleHVzJ10sIFsndXVkZCcsICdTY2FuZGljdXNTdWJwdW5jdGlzJ10sIFsnZHVkZCcsICdQb3JyZWN0dXNTdWJwdW5jdGlzJ11dXG4pO1xuXG5mdW5jdGlvbiBzdGFydEluZm9WaXNpYmlsaXR5ICgpOiB2b2lkIHtcbiAgY29uc3QgZWxlbWVudEluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWxlbWVudF9pbmZvJyk7XG4gIGVsZW1lbnRJbmZvLmlubmVySFRNTCA9XG4gICAgYDxkaXYgY2xhc3M9XCJpbmZvLWJ1YmJsZS1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJ1YmJsZS1oZWFkZXJcIj5FbGVtZW50IEluZm88L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJ1YmJsZS1ib2R5XCI+PGk+SG92ZXIgb3ZlciBhbnkgZWxlbWVudCB0byBzZWUgaXRzIG1ldGFkYXRhPC9pPjwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbGVtZW50X2luZm8nKS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUnKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgaW5mb0JveFxuICovXG5mdW5jdGlvbiB1cGRhdGVJbmZvVmlzaWJpbGl0eSAoKTogdm9pZCB7XG4gIGNvbnN0IGVsZW1lbnRJbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VsZW1lbnRfaW5mbycpO1xuICBjb25zdCBkaXNwbGF5SW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5SW5mbycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIFxuICAvLyBzYXZlIHNldHRpbmcgdG8gbG9jYWxTdG9yYWdlXG4gIHNldFNldHRpbmdzKHsgZGlzcGxheUluZm86IGRpc3BsYXlJbmZvLmNoZWNrZWQgfSk7XG5cbiAgaWYgKGRpc3BsYXlJbmZvLmNoZWNrZWQpIHtcbiAgICBlbGVtZW50SW5mby5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgIC8vIHNjcm9sbCBuZXVtZSBpbmZvIGludG8gdmlld1xuICAgIC8vZWxlbWVudEluZm8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudEluZm8uc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lJyk7XG4gIH1cbiAgdXBkYXRlRGlzcGxheUFsbEJ0bigpO1xufVxuXG4vKipcbiAqIExvYWQgZGlzcGxheUluZm8gc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2VcbiAqL1xuZnVuY3Rpb24gbG9hZFNldHRpbmdzICgpOiB2b2lkIHtcbiAgY29uc3QgeyBkaXNwbGF5SW5mbyB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI2Rpc3BsYXlJbmZvJykuY2hlY2tlZCA9IGRpc3BsYXlJbmZvO1xufVxuXG4vKipcbiAqIFNldCBsaXN0ZW5lciBvbiBpbmZvIHZpc2liaWxpdHkgY2hlY2tib3guXG4gKi9cbmZ1bmN0aW9uIHNldEluZm9Db250cm9scyAoKTogdm9pZCB7XG4gIHN0YXJ0SW5mb1Zpc2liaWxpdHkoKTtcbiAgbG9hZFNldHRpbmdzKCk7XG4gIHVwZGF0ZUluZm9WaXNpYmlsaXR5KCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5SW5mbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdXBkYXRlSW5mb1Zpc2liaWxpdHkpO1xufVxuXG4vKipcbiAqIENsYXNzIHRoYXQgbWFuYWdlcyBnZXR0aW5nIGluZm9ybWF0aW9uIGZvciBlbGVtZW50cyBpbiBOZW9uIGZyb20gVmVyb3Zpby5cbiAqL1xuY2xhc3MgSW5mb01vZHVsZSBpbXBsZW1lbnRzIEluZm9JbnRlcmZhY2Uge1xuICBwcml2YXRlIG5lb25WaWV3OiBOZW9uVmlldztcbiAgaXNIb3ZlcmluZ0NoaWxkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGNvbnN0cnVjdG9yIGZvciBhbiBJbmZvTW9kdWxlLlxuICAgKiBAcGFyYW0ge05lb25WaWV3fSBuZW9uVmlldyAtIFRoZSBOZW9uVmlldyBwYXJlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobmVvblZpZXc6IE5lb25WaWV3KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIC8vIEFkZCBpbmZvIGJveCBlbmFibGUvZGlzYWJsZSBjaGVjayBib3hcbiAgICBjb25zdCBjaGVja2JveGVzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXktc2luZ2xlLWNvbnRhaW5lcicpO1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKCdjaGVja2JveC1jb250YWluZXInLCAnc2lkZS1wYW5lbC1idG4nKTtcbiAgICBsYWJlbC50ZXh0Q29udGVudCA9ICdJbmZvJztcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQuaWQgPSAnZGlzcGxheUluZm8nO1xuICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoJ2NoZWNrYm94Jyk7XG4gICAgaW5wdXQudHlwZSA9ICdjaGVja2JveCc7XG4gICAgaW5wdXQuY2hlY2tlZCA9IGZhbHNlO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICBjaGVja2JveGVzQ29udGFpbmVyLnByZXBlbmQobGFiZWwpO1xuXG4gICAgdGhpcy5uZW9uVmlldy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMucmVzZXRJbmZvTGlzdGVuZXJzLmJpbmQodGhpcykpO1xuICAgIHNldEluZm9Db250cm9scygpO1xuICAgIHRoaXMucmVzZXRJbmZvTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGxpc3RlbmVycyBmb3IgdGhlIEluZm9Nb2R1bGUuXG4gICAqIFRyaWdnZXIgYWN0aW9uIG9uIG1vdXNlb3ZlciBvZiBzcGVjaWZpYyBtdXNpY2FsIGVsZW1lbnQgY2xhc3Nlcy5cbiAgICovXG4gIGluZm9MaXN0ZW5lcnMgKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhY3RpdmUtcGFnZScpWzBdXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUsLmN1c3RvcywuY2xlZiwuYWNjaWQsLmRpdkxpbmUsLnN0YWZmJylcbiAgICAgICAgLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YWZmJykpIHRoaXMuaXNIb3ZlcmluZ0NoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5mbyhldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhY3RpdmUtcGFnZScpWzBdXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUsLmN1c3RvcywuY2xlZiwuYWNjaWQsLmRpdkxpbmUnKVxuICAgICAgICAuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzSG92ZXJpbmdDaGlsZCA9IGZhbHNlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgbGlzdGVuZXJzIGZvciB0aGUgSW5mb01vZHVsZS5cbiAgICovXG4gIHN0b3BMaXN0ZW5lcnMgKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXVtZSwuY3VzdG9zLC5jbGVmLC5hY2NpZCwuZGl2TGluZSwuc3RhZmYnKS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLnVwZGF0ZUluZm8uYmluZCh0aGlzKSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5ldW1lLCAuY3VzdG9zLCAuY2xlZiwgLmFjY2lkLCAuZGl2TGluZScpLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNIb3ZlcmluZ0NoaWxkID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0YXJ0IGxpc3RlbmVycyBmb3IgdGhlIEluZm9Nb2R1bGUuXG4gICAqL1xuICByZXNldEluZm9MaXN0ZW5lcnMgKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcExpc3RlbmVycygpO1xuICAgIHRoaXMuaW5mb0xpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGVkIGluZm8gZm9yIHRoZSBjYWxsaW5nIGVsZW1lbnQgYmFzZWQgb24gaXRzIGVsZW1lbnQgdHlwZS5cbiAgICogTWFrZXMgY2FsbHMgdG8gTmVvbkNvcmUgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkuXG4gICAqL1xuICBhc3luYyB1cGRhdGVJbmZvIChldmVudDogTW91c2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBGb3Igbm93LCBzaW5jZSBDbGVmcyBkbyBub3QgaGF2ZSB0aGVpciBvd24gZWxlbWVudCB0YWcgaW4gbWVpNCwgdGhlcmUgaXMgbm90IGEgd2F5IHRvIHNlbGVjdCB0aGUgPGc+IGVsZW1lbnRcbiAgLy8gU28gd2Ugd2lsbCBzaW1wbHkgcmV0dXJuIGlmIElEIGRvZXMgbm90IGV4aXN0IGZvciBub3dcbiAgICBjb25zdCBpZCA9IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5pZDtcbiAgICBpZiAoaWQgPT09ICcnKSB7XG4gICAgICBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbGVtZW50X2luZm8nKS5jaGlsZHJlbikuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZygnTm8gaWQhJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBjb25zdCBjbGFzc1JlID0gL25ldW1lfGNsZWZ8Y3VzdG9zfHN0YWZmfGFjY2lkfGRpdkxpbmUvO1xuICAgIGNvbnN0IGVsZW1lbnRDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpLm1hdGNoKGNsYXNzUmUpWzBdO1xuICAgIGxldCBib2R5ID0gJyc7XG4gICAgbGV0IGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZXM7XG5cbiAgICAvLyBHZXRzIHRoZSBwaXRjaGVzIGRlcGVuZGluZyBvbiBlbGVtZW50IHR5cGUgYW5kXG4gICAgc3dpdGNoIChlbGVtZW50Q2xhc3MpIHtcbiAgICAgIGNhc2UgJ25ldW1lJzoge1xuICAgICAgICAvLyBTZWxlY3QgbmV1bWUgY29tcG9uZW50cyBvZiBzZWxlY3RlZCBuZXVtZVxuICAgICAgICBjb25zdCBuY3MgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYycpIGFzIE5vZGVMaXN0T2Y8U1ZHR3JhcGhpY3NFbGVtZW50PjtcbiAgICAgICAgaWYgKG5jcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBhdHRyOiBBdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5uZW9uVmlldy5nZXRFbGVtZW50QXR0cihuY3NbMF0uaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICAgICAgICBpZiAoYXR0ci5jdXJ2ZSA9PT0gJ2EnIHx8IGF0dHIuY3VydmUgPT09ICdjJykge1xuICAgICAgICAgICAgbGV0IHBpdGNoZXMgPSBhd2FpdCB0aGlzLmdldFBpdGNoZXMobmNzKTtcblxuICAgICAgICAgICAgcGl0Y2hlcyA9IHBpdGNoZXMudHJpbSgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBib2R5ID0gJ1NoYXBlOiBMaXF1ZXNjZW50JyArICdcXHJcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1BpdGNoKGVzKTogJyArIHBpdGNoZXM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29udG91ciA9IGF3YWl0IHRoaXMuZ2V0Q29udG91cihuY3MpO1xuICAgICAgICBpZiAobmNzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGF0dHI6IEF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLm5lb25WaWV3LmdldEVsZW1lbnRBdHRyKG5jc1swXS5pZCwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgICAgICAgIGlmKGF0dHIudGlsdCA9PT0gJ3MnKSB7XG4gICAgICAgICAgICBsZXQgcGl0Y2hlcyA9IGF3YWl0IHRoaXMuZ2V0UGl0Y2hlcyhuY3MpO1xuXG4gICAgICAgICAgICBwaXRjaGVzID0gcGl0Y2hlcy50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGJvZHkgPSAnU2hhcGU6IFZpcmdhIFxcclxcbicgICtcbiAgICAgICAgICAgICAgICAgICAgJ1BpdGNoKGVzKTogJyArIHBpdGNoZXM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZihhdHRyLnRpbHQgPT09ICduJyl7XG4gICAgICAgICAgICBsZXQgcGl0Y2hlcyA9IGF3YWl0IHRoaXMuZ2V0UGl0Y2hlcyhuY3MpO1xuXG4gICAgICAgICAgICBwaXRjaGVzID0gcGl0Y2hlcy50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGJvZHkgPSAnU2hhcGU6IFJldmVyc2VkIFZpcmdhIFxcclxcbicgICtcbiAgICAgICAgICAgICAgICAgICAgJ1BpdGNoKGVzKTogJyArIHBpdGNoZXM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRvdXIgPT09ICdDbGl2aXMnKSB7XG4gICAgICAgICAgY29uc3QgYXR0cjogQXR0cmlidXRlcyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIobmNzWzBdLmlkLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSk7XG4gICAgICAgICAgaWYgKGF0dHIubGlnYXRlZCkge1xuICAgICAgICAgICAgY29udG91ciA9ICdMaWdhdHVyZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwaXRjaGVzID0gYXdhaXQgdGhpcy5nZXRQaXRjaGVzKG5jcyk7XG5cbiAgICAgICAgcGl0Y2hlcyA9IHBpdGNoZXMudHJpbSgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGJvZHkgPSAnU2hhcGU6ICcgKyAoY29udG91ciA9PT0gdW5kZWZpbmVkID8gJ0NvbXBvdW5kJyA6IGNvbnRvdXIpICsgJ1xcclxcbicgK1xuICAgICAgICAgICAgICAgICdQaXRjaChlcyk6ICcgKyBwaXRjaGVzO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2N1c3Rvcyc6IHtcbiAgICAgICAgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICAgICAgYm9keSArPSAnUGl0Y2g6ICcgKyAoYXR0cmlidXRlc1sncG5hbWUnXSkudG9VcHBlckNhc2UoKSArIGF0dHJpYnV0ZXNbJ29jdCddO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2FjY2lkJzoge1xuICAgICAgICBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5uZW9uVmlldy5nZXRFbGVtZW50QXR0cihpZCwgdGhpcy5uZW9uVmlldy52aWV3LmdldEN1cnJlbnRQYWdlVVJJKCkpO1xuICAgICAgICBsZXQgdHlwZSA9ICcnO1xuICAgICAgICBpZiAoKGF0dHJpYnV0ZXNbJ2FjY2lkJ10pLnRvVXBwZXJDYXNlKCkgPT0gJ0YnKXtcbiAgICAgICAgICB0eXBlID0gJ0ZsYXQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoKGF0dHJpYnV0ZXNbJ2FjY2lkJ10pLnRvVXBwZXJDYXNlKCkgPT0gJ04nKXtcbiAgICAgICAgICB0eXBlID0gJ05hdHVyYWwnO1xuICAgICAgICB9XG4gICAgICAgIGJvZHkgKz0gJ0FjY2lkIFR5cGU6ICcgKyB0eXBlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NsZWYnOiB7XG4gICAgICAgIGNvbnN0IGF0dHIgPSBhd2FpdCB0aGlzLm5lb25WaWV3LmdldEVsZW1lbnRBdHRyKGlkLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSkgYXMgQ2xlZkF0dHJpYnV0ZXM7XG5cbiAgICAgICAgLy8gSWYgY2xlZiBoYXMgYmVlbiBkaXNwbGFjZWQsIGZvcm1hdCBhbmQgc2hvdyB0aGUgZGlzcGxhY2VtZW50IGFzXG4gICAgICAgIC8vIG51bWJlciBvZiBvY3RhdmVzIG5vdCBudW1iZXIgb2YgZnVsbCBzdGVwc1xuICAgICAgICBpZiAoYXR0clsnZGlzLnBsYWNlJ10gJiYgYXR0ci5kaXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIENvbWJpbmUgYW5kIGZvcm1hdCBgZGlzLnBsYWNlYCBhbmQgYGRpc2A6XG4gICAgICAgICAgLy8gRS5nLiwgZm9ybWF0KCdhYm92ZScsIDgpID0+ICcrMSdcbiAgICAgICAgICAvLyBFLmcuLCBmb3JtYXQoJ2JlbG93JywgMjIpID0+ICctMjInXG4gICAgICAgICAgY29uc3QgZm9ybWF0ID0gKGRpc3BsYWNlOiBzdHJpbmcsIGRpczogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBkaXNwbGFjZSA9PT0gJ2Fib3ZlJyA/ICcrJyA6ICctJztcbiAgICAgICAgICAgIGNvbnN0IG9jdGF2ZSA9IFN0cmluZyhNYXRoLmZsb29yKE51bWJlcihkaXMpIC8gNykpO1xuICAgICAgICAgICAgcmV0dXJuIGRpciArIG9jdGF2ZTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYm9keSArPSAnT2N0YXZlIERpc3BsYWNlbWVudDogJyArIGZvcm1hdChhdHRyWydkaXMucGxhY2UnXSwgYXR0ci5kaXMpICsgJ1xcclxcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYm9keSArPSAnT2N0YXZlIERpc3BsYWNlbWVudDogTm9uZVxcclxcbic7XG4gICAgICAgIH1cblxuICAgICAgICBib2R5ICs9ICdTaGFwZTogJyArIGF0dHIuc2hhcGUgKyAnXFxyXFxuJyArICdMaW5lOiAnICsgYXR0ci5saW5lO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZGl2TGluZSc6IHtcbiAgICAgICAgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICAgICAgYm9keSArPSAnRGl2TGluZSBUeXBlOiAnICsgYXR0cmlidXRlc1snZm9ybSddO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0YWZmJzoge1xuICAgICAgICBpZiAodGhpcy5pc0hvdmVyaW5nQ2hpbGQpIHJldHVybjtcbiAgICAgICAgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIoaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNbJ3R5cGUnXSkgYm9keSArPSAnQ29sdW1uOiAnICsgYXR0cmlidXRlc1sndHlwZSddLnJlcGxhY2UoL15jb2x1bW4vLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBib2R5ICs9ICdub3RoaW5nJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGJvZHkgPSBgRWxlbWVudCBUeXBlOiAke2VsZW1lbnRDbGFzcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGVsZW1lbnRDbGFzcy5zbGljZSgxKX1cXG4ke2JvZHl9YDtcbiAgICB0aGlzLnVwZGF0ZUluZm9Nb2R1bGUoYm9keSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpbmRpdmlkdWFsIHBpdGNoZXMgb2YgYSBuZXVtZS5cbiAgICogQHBhcmFtIG5jcyAtIE5ldW1lIGNvbXBvbmVudHMgaW4gdGhlIG5ldW1lLlxuICAgKiBAcmV0dXJucyBTcGFjZSBzZXBhcmF0ZWQgcGl0Y2hlcyBvZiB0aGUgbmV1bWUgY29tcG9uZW50cyBpbiBvcmRlci5cbiAgICovXG4gIGFzeW5jIGdldFBpdGNoZXMgKG5jczogSXRlcmFibGU8U1ZHR3JhcGhpY3NFbGVtZW50Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHBpdGNoZXMgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5jIG9mIG5jcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlczogQXR0cmlidXRlcyA9IGF3YWl0IHRoaXMubmVvblZpZXcuZ2V0RWxlbWVudEF0dHIobmMuaWQsIHRoaXMubmVvblZpZXcudmlldy5nZXRDdXJyZW50UGFnZVVSSSgpKTtcbiAgICAgIHBpdGNoZXMgKz0gYXR0cmlidXRlc1sncG5hbWUnXSArIGF0dHJpYnV0ZXNbJ29jdCddICsgJyAnO1xuICAgIH1cbiAgICByZXR1cm4gcGl0Y2hlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRvdXIgb2YgYSBuZXVtZS5cbiAgICogQHBhcmFtIG5jcyAtIE5ldW1lIGNvbXBvbmVudHMgaW4gdGhlIG5ldW1lLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29udG91ciAobmNzOiBJdGVyYWJsZTxTVkdHcmFwaGljc0VsZW1lbnQ+KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgY29udG91ciA9ICcnO1xuICAgIGxldCBwcmV2aW91czogQXR0cmlidXRlcyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBuYyBvZiBuY3MpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLm5lb25WaWV3LmdldEVsZW1lbnRBdHRyKG5jLmlkLCB0aGlzLm5lb25WaWV3LnZpZXcuZ2V0Q3VycmVudFBhZ2VVUkkoKSk7XG4gICAgICBpZiAocHJldmlvdXMgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHByZXZpb3VzWydvY3QnXSA+IGF0dHJpYnV0ZXNbJ29jdCddKSB7XG4gICAgICAgICAgY29udG91ciArPSAnZCc7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNbJ29jdCddIDwgYXR0cmlidXRlc1snb2N0J10pIHtcbiAgICAgICAgICBjb250b3VyICs9ICd1JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5waXRjaE5hbWVUb051bShwcmV2aW91c1sncG5hbWUnXSkgPCB0aGlzLnBpdGNoTmFtZVRvTnVtKGF0dHJpYnV0ZXNbJ3BuYW1lJ10pKSB7XG4gICAgICAgICAgICBjb250b3VyICs9ICd1JztcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGl0Y2hOYW1lVG9OdW0ocHJldmlvdXNbJ3BuYW1lJ10pID4gdGhpcy5waXRjaE5hbWVUb051bShhdHRyaWJ1dGVzWydwbmFtZSddKSkge1xuICAgICAgICAgICAgY29udG91ciArPSAnZCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRvdXIgKz0gJ3MnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJldmlvdXMgPSBhdHRyaWJ1dGVzO1xuICAgIH1cbiAgICBpZiAobmV1bWVHcm91cHMuZ2V0KGNvbnRvdXIpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignVW5rbm93biBjb250b3VyOiAnICsgY29udG91cik7XG4gICAgfVxuICAgIHJldHVybiBuZXVtZUdyb3Vwcy5nZXQoY29udG91cik7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBhbmQgdXBkYXRlIHRoZSBpbmZvIGJveC5cbiAgICogQHBhcmFtIGJvZHkgLSBUaGUgaW5mbyBib3ggY29udGVudHMuXG4gICAqL1xuICB1cGRhdGVJbmZvTW9kdWxlIChib2R5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAoPEhUTUxFbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbmZvLWJ1YmJsZS1ib2R5JylbMF0pLmlubmVyVGV4dCA9IGJvZHk7XG5cbiAgICBpZiAoKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5SW5mbycpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQpIHtcbiAgICAgIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbmZvLWJ1YmJsZS1jb250YWluZXInKVswXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgcGl0Y2ggbmFtZSAoYS1nKSB0byBhIG51bWJlciAod2hlcmUgYyBpcyAxLCBkIGlzIDIsIC4uLmFuZCBiIGlzIDcpLlxuICAgKiBAcGFyYW0gcG5hbWUgLSBUaGUgcGl0Y2ggbmFtZS5cbiAgICogQHJldHVybnMgRXF1aXZhbGVudCBwaXRjaCBuYW1lIGFzIGEgbnVtYmVyIGZyb20gMSB0byA3LlxuICAgKi9cbiAgcGl0Y2hOYW1lVG9OdW0gKHBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHN3aXRjaCAocG5hbWUpIHtcbiAgICAgIGNhc2UgJ2MnOlxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgICByZXR1cm4gMjtcbiAgICAgIGNhc2UgJ2UnOlxuICAgICAgICByZXR1cm4gMztcbiAgICAgIGNhc2UgJ2YnOlxuICAgICAgICByZXR1cm4gNDtcbiAgICAgIGNhc2UgJ2cnOlxuICAgICAgICByZXR1cm4gNTtcbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICByZXR1cm4gNjtcbiAgICAgIGNhc2UgJ2InOlxuICAgICAgICByZXR1cm4gNztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUubG9nKCdVbmtub3duIHBpdGNoIG5hbWUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgY29udG91ciBvZiBhbiBuZXVtZSBncm91cGluZyBiYXNlZCBvbiB0aGUgZ3JvdXBpbmcgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGNvbnRvdXIgbmFtZS5cbiAgICogQHJldHVybnMgQmVzdCBndWVzcyBuYW1lIG9mIHRoZSBuZXVtZSBzaGFwZS5cbiAgICovXG4gIGdldENvbnRvdXJCeVZhbHVlICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtjb250LCB2XSBvZiBuZXVtZUdyb3Vwcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmICh2ID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY29udDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgSW5mb01vZHVsZSBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgKiBhcyBOb3RpZmljYXRpb24gZnJvbSAnLi91dGlscy9Ob3RpZmljYXRpb24nO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4vTmVvblZpZXcnO1xuaW1wb3J0IHsgdW5zZWxlY3QgfSBmcm9tICcuL3V0aWxzL1NlbGVjdFRvb2xzJztcbmltcG9ydCB7IHVwZGF0ZURpc3BsYXlBbGxCdG4sIHVwZGF0ZUhpZ2hsaWdodCB9IGZyb20gJy4vRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scyc7XG5pbXBvcnQgeyBUZXh0Vmlld0ludGVyZmFjZSB9IGZyb20gJy4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncywgc2V0U2V0dGluZ3MgfSBmcm9tICcuL3V0aWxzL0xvY2FsU2V0dGluZ3MnO1xuXG4vKlxuICogQ2xhc3MgdGhhdCBtYW5hZ2VzIGdldHRpbmcgdGhlIHRleHQgZm9yIHN5bGxhYmxlcyBpbiBOZW9uIGZyb20gdGhlIG1laSBmaWxlXG4gKi9cbmNsYXNzIFRleHRWaWV3IGltcGxlbWVudHMgVGV4dFZpZXdJbnRlcmZhY2Uge1xuICBwcml2YXRlIG5lb25WaWV3OiBOZW9uVmlldztcbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGhhcyBiZWVuIG5vdGlmaWVkIGFib3V0IGJsYW5rIHN5bGxhYmxlcy4gKi9cbiAgcHJpdmF0ZSBub3RpZmljYXRpb25TZW50OiBib29sZWFuO1xuICAvKipcbiAgICogQSBjb25zdHJ1Y3RvciBmb3IgYSBUZXh0Vmlldy5cbiAgICogQHBhcmFtIG5lb25WaWV3IC0gVGhlIGNhbGxpbmcgW1tOZW9uVmlld11dIGZvciB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAobmVvblZpZXc6IE5lb25WaWV3KSB7XG4gICAgdGhpcy5uZW9uVmlldyA9IG5lb25WaWV3O1xuICAgIHRoaXMubm90aWZpY2F0aW9uU2VudCA9IGZhbHNlO1xuXG4gICAgLy8gYWRkIGNoZWNrYm94IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSB2aWV3XG4gICAgY29uc3QgY2hlY2tib3hlc0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5LXNpbmdsZS1jb250YWluZXInKTtcbiAgICBjb25zdCB0ZXh0TGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGNvbnN0IGJib3hMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgY29uc3QgdGV4dEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgY29uc3QgYmJveEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgdGV4dEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdjaGVja2JveCcpO1xuICAgIGJib3hCdXR0b24uY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTtcbiAgICB0ZXh0TGFiZWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtY29udGFpbmVyJywgJ3NpZGUtcGFuZWwtYnRuJyk7XG4gICAgYmJveExhYmVsLmNsYXNzTGlzdC5hZGQoJ2NoZWNrYm94LWNvbnRhaW5lcicsICdzaWRlLXBhbmVsLWJ0bicpO1xuICAgIHRleHRMYWJlbC50ZXh0Q29udGVudCA9ICdUZXh0JztcbiAgICBiYm94TGFiZWwudGV4dENvbnRlbnQgPSAnQkJveGVzJztcbiAgICB0ZXh0QnV0dG9uLmlkID0gJ2Rpc3BsYXlUZXh0JztcbiAgICB0ZXh0QnV0dG9uLnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGJib3hCdXR0b24uaWQgPSAnZGlzcGxheUJCb3gnO1xuICAgIGJib3hCdXR0b24udHlwZSA9ICdjaGVja2JveCc7XG4gICAgdGV4dEJ1dHRvbi5jaGVja2VkID0gZmFsc2U7XG4gICAgYmJveEJ1dHRvbi5jaGVja2VkID0gZmFsc2U7XG4gICAgdGV4dExhYmVsLmFwcGVuZENoaWxkKHRleHRCdXR0b24pO1xuICAgIGJib3hMYWJlbC5hcHBlbmRDaGlsZChiYm94QnV0dG9uKTtcbiAgICBjaGVja2JveGVzQ29udGFpbmVyLnByZXBlbmQoYmJveExhYmVsKTtcbiAgICBjaGVja2JveGVzQ29udGFpbmVyLnByZXBlbmQodGV4dExhYmVsKTtcblxuICAgIHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgdGhpcy5zZXRUZXh0Vmlld0NvbnRyb2xzKCk7XG4gICAgdGhpcy5uZW9uVmlldy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMudXBkYXRlVGV4dFZpZXdWaXNpYmlsaXR5LmJpbmQodGhpcykpO1xuICAgIHRoaXMubmVvblZpZXcudmlldy5hZGRVcGRhdGVDYWxsYmFjayh0aGlzLnVwZGF0ZUJCb3hWaXNpYmlsaXR5LmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICogU2V0IGxpc3RlbmVycyBvbiB0ZXh0dmlldyB2aXNpYmlsaXR5IGNoZWNrYm94XG4gICovXG4gIHNldFRleHRWaWV3Q29udHJvbHMgKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlVGV4dFZpZXdWaXNpYmlsaXR5KCk7XG4gICAgdGhpcy51cGRhdGVCQm94VmlzaWJpbGl0eSgpO1xuICBcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheVRleHQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVGV4dFZpZXdWaXNpYmlsaXR5KCk7XG4gICAgICB1cGRhdGVEaXNwbGF5QWxsQnRuKCk7XG4gICAgfSk7XG4gIFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5QkJveCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVCQm94VmlzaWJpbGl0eSgpO1xuICAgICAgdXBkYXRlRGlzcGxheUFsbEJ0bigpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFNldHRpbmdzICgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGRpc3BsYXlUZXh0LCBkaXNwbGF5QkJveCB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjZGlzcGxheVRleHQnKS5jaGVja2VkID0gZGlzcGxheVRleHQ7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI2Rpc3BsYXlCQm94JykuY2hlY2tlZCA9IGRpc3BsYXlCQm94O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB2aXNpYmlsaXR5IG9mIHRleHQgYm91bmRpbmcgYm94ZXNcbiAgICovXG4gIHVwZGF0ZUJCb3hWaXNpYmlsaXR5ICgpOiB2b2lkIHtcblxuICAgIGNvbnN0IGRpc3BsYXlCQm94ZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJCb3gnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIFxuICAgIC8vIHNhdmUgdG8gbG9jYWxTdG9yYWdlXG4gICAgc2V0U2V0dGluZ3MoeyBkaXNwbGF5QkJveDogZGlzcGxheUJCb3hlcy5jaGVja2VkIH0pO1xuXG4gICAgaWYgKGRpc3BsYXlCQm94ZXMuY2hlY2tlZCkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN5bFRleHRSZWN0JykuZm9yRWFjaChyZWN0ID0+IHtcbiAgICAgICAgcmVjdC5jbGFzc0xpc3QuYWRkKCdzeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICAgIHJlY3QuY2xhc3NMaXN0LnJlbW92ZSgnc3lsVGV4dFJlY3QnKTtcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN5bC5zZWxlY3RlZCAuc3lsVGV4dFJlY3QtZGlzcGxheScpXG4gICAgICAgIC5mb3JFYWNoKChyZWN0OiBIVE1MRWxlbWVudCkgPT4geyByZWN0LnN0eWxlLmZpbGwgPSAncmVkJzsgfSk7XG5cbiAgICAgIGlmICh0aGlzLm5lb25WaWV3LmdldFVzZXJNb2RlKCkgIT09ICd2aWV3ZXInICYmIHRoaXMubmVvblZpZXcuVGV4dEVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5lb25WaWV3LlRleHRFZGl0LmluaXRTZWxlY3RCeUJCb3hCdXR0b24oKTtcbiAgICAgICAgdGhpcy5uZW9uVmlldy5UZXh0RWRpdC5pbml0QkJveENpcmNsZVNsaWRlcigpO1xuICAgICAgICBjb25zdCB7IGNpcmNsZVNpemUgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJyNjaXJjbGVPdXRwdXQnKS52YWx1ZSA9IFN0cmluZyhjaXJjbGVTaXplKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI2NpcmNsZVNsaWRlcicpLnZhbHVlID0gU3RyaW5nKGNpcmNsZVNpemUpO1xuICAgICAgfVxuICAgIH0gXG4gICAgZWxzZSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpPy5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKSB7XG4gICAgICAgIHVuc2VsZWN0KCk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5U3lsbGFibGUnKS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgc2V0U2V0dGluZ3MoeyBzZWxlY3Rpb25Nb2RlOiAgJ3NlbEJ5U3lsbGFibGUnIH0pO1xuICAgICAgfVxuXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3lsVGV4dFJlY3QtZGlzcGxheScpLmZvckVhY2gocmVjdCA9PiB7XG4gICAgICAgIHJlY3QuY2xhc3NMaXN0LmFkZCgnc3lsVGV4dFJlY3QnKTtcbiAgICAgICAgcmVjdC5jbGFzc0xpc3QucmVtb3ZlKCdzeWxUZXh0UmVjdC1kaXNwbGF5Jyk7XG4gICAgICB9KTtcblxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN5bC5zZWxlY3RlZCAuc3lsVGV4dFJlY3QnKS5mb3JFYWNoKChyZWN0OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSAnbm9uZSc7XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5QkJveCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9IFxuICAgICAgY2F0Y2ggKGUpIHt9XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmJveC1jaXJjbGUtc2xpZGVyJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH0gXG4gICAgICBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICB1cGRhdGVIaWdobGlnaHQoKTtcbiAgfVxuXG4gIC8qKlxuICAqIFVwZGF0ZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgdGV4dHZpZXcgYm94XG4gICogYW5kIGFkZCB0aGUgZXZlbnQgbGlzdGVuZXJzIHRvIG1ha2Ugc3VyZSB0aGUgc3lsIGhpZ2hsaWdodHMgd2hlbiBtb3VzZWQgb3ZlclxuICAqL1xuICB1cGRhdGVUZXh0Vmlld1Zpc2liaWxpdHkgKCk6IHZvaWQge1xuXG4gICAgY29uc3QgZGlzcGxheVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheVRleHQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIFxuICAgIC8vIHNhdmUgdG8gbG9jYWxTdG9yYWdlXG4gICAgc2V0U2V0dGluZ3MoeyBkaXNwbGF5VGV4dDogZGlzcGxheVRleHQuY2hlY2tlZCB9KTtcblxuICAgIGlmIChkaXNwbGF5VGV4dC5jaGVja2VkKSB7XG4gICAgICBjb25zdCBzeWxUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0Jyk7XG4gICAgICBzeWxUZXh0LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHN5bFRleHQuaW5uZXJIVE1MID0gXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwiaW5mby1idWJibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tYnViYmxlLWhlYWRlclwiPlN5bGxhYmxlcyBvbiB0aGlzIHBhZ2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1idWJibGUtYm9keVwiPiR7dGhpcy5nZXRTeWxUZXh0KCl9PC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICBjb25zdCBzcGFucyA9IHN5bFRleHQucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuICAgICAgc3BhbnMuZm9yRWFjaChzcGFuID0+IHtcbiAgICAgICAgY29uc3Qgc3lsbGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzcGFuLmNsYXNzTGlzdFswXSk7XG4gICAgICAgIGNvbnN0IHN5bCA9IHN5bGxhYmxlLnF1ZXJ5U2VsZWN0b3IoJy5zeWwnKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHN5bC5xdWVyeVNlbGVjdG9yKCd0ZXh0Jyk7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBzeWwucXVlcnlTZWxlY3RvcigncmVjdCcpO1xuICAgICAgICBpZiAodGV4dC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGV4dC5jbGFzc0xpc3QuYWRkKCd0ZXh0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzcGFuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgICAgICBpZiAoc3lsbGFibGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZS1oaWdobGlnaHRlZCcpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgc3lsbGFibGUuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICBzeWxsYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKS5mb3JFYWNoKG5ldW1lID0+IHtcbiAgICAgICAgICAgIG5ldW1lLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICcjZDAwJztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc3lsLmF0dHIoJ2ZpbGwnLCAnI2ZmYzdjNycpO1xuICAgICAgICAgIC8vIHRoaXMuaGlnaGxpZ2h0Qm91bmRpbmdCb3goc3Bhbik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwYW4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICBpZiAoc3lsbGFibGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdzeWxsYWJsZS1oaWdobGlnaHRlZCcpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgc3lsbGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICBzeWxsYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCcubmV1bWUnKS5mb3JFYWNoKG5ldW1lID0+IHtcbiAgICAgICAgICAgIG5ldW1lLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChzeWxsYWJsZS5zdHlsZS5maWxsICE9PSAncmdiKDAsIDAsIDApJykgeyAvLyBzeWxsYWJsZS5nZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9TVkcnLCAnZmlsbCcpO1xuICAgICAgICAgICAgICByZWN0LnN0eWxlLmZpbGwgPSBzeWxsYWJsZS5nZXRBdHRyaWJ1dGUoJ2ZpbGwnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlY3Quc3R5bGUuZmlsbCA9ICdibHVlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc3lsLmF0dHIoJ2ZpbGwnLCBudWxsKTtcbiAgICAgICAgICAvLyB0aGlzLnJlbW92ZUJvdW5kaW5nQm94KHNwYW4pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5uZW9uVmlldy5nZXRVc2VyTW9kZSgpICE9PSAndmlld2VyJyAmJiB0aGlzLm5lb25WaWV3LlRleHRFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5uZW9uVmlldy5UZXh0RWRpdC5pbml0VGV4dEVkaXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2Nyb2xsIHRoZSBzeWxsYWJsZSB0ZXh0IGJ1YmJsZSBpbnRvIHZpZXdcbiAgICAgIC8vc3lsVGV4dC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IFxuICAgIGVsc2Uge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N5bF90ZXh0Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzeWxsYWJsZSB0ZXh0IG9mIHRoZSBsb2FkZWQgZmlsZVxuICAgKi9cbiAgZ2V0U3lsVGV4dCAoKTogc3RyaW5nIHtcbiAgICBsZXQgbHlyaWNzID0gJyc7XG4gICAgY29uc3QgdW5pVG9EYXNoID0gL1xcdWU1NTEvZztcbiAgICBjb25zdCBzeWxsYWJsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWN0aXZlLXBhZ2UgLnN5bGxhYmxlJyk7XG4gICAgc3lsbGFibGVzLmZvckVhY2goc3lsbGFibGUgPT4ge1xuICAgICAgaWYgKHN5bGxhYmxlLnF1ZXJ5U2VsZWN0b3IoJy5zeWwnKSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzeWwgPSBzeWxsYWJsZS5xdWVyeVNlbGVjdG9yKCcuc3lsJyk7XG4gICAgICAgIGx5cmljcyArPSBgPHNwYW4gY2xhc3M9XCIke3N5bGxhYmxlLmlkfSBzeWwtdGV4dC1zaWRlLXBhbmVsXCI+YDtcbiAgICAgICAgaWYgKHN5bC50ZXh0Q29udGVudC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgbHlyaWNzICs9ICcmI3gyNUNBOyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEFycmF5LmZyb20oc3lsLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuKS5mb3JFYWNoKHRleHQgPT4ge1xuICAgICAgICAgICAgbHlyaWNzICs9IHRleHQudGV4dENvbnRlbnQgIT09ICcnID8gdGV4dC50ZXh0Q29udGVudCA6ICcmI3gyNUNBOyAnO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGx5cmljcyArPSAnIDwvc3Bhbj4nO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghdGhpcy5ub3RpZmljYXRpb25TZW50KSB7XG4gICAgICBOb3RpZmljYXRpb24ucXVldWVOb3RpZmljYXRpb24oJ0JsYW5rIHN5bGxhYmxlcyBhcmUgcmVwcmVzZW50ZWQgYnkg4peKIScpO1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGx5cmljcy5yZXBsYWNlKHVuaVRvRGFzaCwgJy0nKTtcbiAgfVxufVxuXG5leHBvcnQgeyBUZXh0VmlldyBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgeyB1bnNlbGVjdCB9IGZyb20gJy4vdXRpbHMvU2VsZWN0VG9vbHMnO1xuaW1wb3J0IERyYWdIYW5kbGVyIGZyb20gJy4vdXRpbHMvRHJhZ0hhbmRsZXInO1xuaW1wb3J0IE5lb25WaWV3IGZyb20gJy4vTmVvblZpZXcnO1xuaW1wb3J0IHtcbiAgc2V0U2VsZWN0SGVscGVyT2JqZWN0cyxcbiAgZHJhZ1NlbGVjdCxcbiAgY2xpY2tTZWxlY3QsXG59IGZyb20gJy4vdXRpbHMvU2VsZWN0JztcbmltcG9ydCB7IHNldEdyb3VwaW5nSGlnaGxpZ2h0IH0gZnJvbSAnLi91dGlscy9Db2xvcic7XG5pbXBvcnQgeyBUZXh0RWRpdEludGVyZmFjZSB9IGZyb20gJy4vSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb2RhbFdpbmRvd1ZpZXcgfSBmcm9tICcuL3V0aWxzL01vZGFsV2luZG93JztcbmltcG9ydCB7IHNldFNldHRpbmdzIH0gZnJvbSAnLi91dGlscy9Mb2NhbFNldHRpbmdzJztcbmltcG9ydCB7IHNldENpcmNsZVNpemVDb250cm9scyB9IGZyb20gJy4vRGlzcGxheVBhbmVsL0Rpc3BsYXlDb250cm9scyc7XG5cbi8qKlxuICogRm9ybWF0IGEgc3RyaW5nIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIuXG4gKiBAcGFyYW0gcmF3U3RyaW5nIC0gVGhlIHVuZm9ybWF0dGVkIHN0cmluZy5cbiAqL1xuLypcbmZ1bmN0aW9uIGZvcm1hdFJhdyAocmF3U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZW1vdmVTeW1ib2wgPSAvXFx1ezI1Q0F9L3U7XG4gIHJldHVybiByYXdTdHJpbmcucmVwbGFjZShyZW1vdmVTeW1ib2wsICcnKS50cmltKCk7XG59XG4qL1xuXG5mdW5jdGlvbiBzZWxCeUJCb3hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94JykuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgIHVuc2VsZWN0KCk7XG4gICAgc2V0U2V0dGluZ3MoeyBzZWxlY3Rpb25Nb2RlOiAnc2VsQnlCQm94JyB9KTtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vcmVFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0cmFFZGl0JykuaW5uZXJIVE1MID0gJyc7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9yZUVkaXQnKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgZG9jdW1lbnRcbiAgICAgICAgLmdldEVsZW1lbnRCeUlkKCdleHRyYUVkaXQnKVxuICAgICAgICAucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5TmMnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeU5ldW1lJykuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlTdGFmZicpLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbEJ5U3lsbGFibGUnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50XG4gICAgICAgIC5nZXRFbGVtZW50QnlJZCgnc2VsQnlMYXllckVsZW1lbnQnKVxuICAgICAgICAuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGlnaGxpZ2h0LXNlbGVjdGVkJykuaWQgPT09XG4gICAgICAgICdoaWdobGlnaHQtc2VsZWN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIHNldEdyb3VwaW5nSGlnaGxpZ2h0KCdzeWxsYWJsZScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgdGhpcy5hZGRCQm94TGlzdGVuZXJzKCk7XG59XG5cbi8qKlxuICogQSBUZXh0IGVkaXRpbmcgbW9kdWxlIHRoYXQgd29ya3Mgd2l0aCB0aGUgU2luZ2xlVmlldyBhbmQgRGl2YVZpZXcgbW9kdWxlc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0RWRpdE1vZGUgaW1wbGVtZW50cyBUZXh0RWRpdEludGVyZmFjZSB7XG4gIHByaXZhdGUgZHJhZ0hhbmRsZXI6IERyYWdIYW5kbGVyO1xuICBwcml2YXRlIG5lb25WaWV3OiBOZW9uVmlldztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGEgVGV4dEVkaXRcbiAgICogQHBhcmFtIG5lb25WaWV3IC0gVGhlIGNhbGxpbmcgW1tOZW9uVmlld11dIGZvciB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuZW9uVmlldzogTmVvblZpZXcpIHtcbiAgICB0aGlzLm5lb25WaWV3ID0gbmVvblZpZXc7XG4gICAgdGhpcy5pbml0VGV4dEVkaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGV4dCB0byBlZGl0IG1vZGVcbiAgICovXG4gIGluaXRUZXh0RWRpdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzcGFucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzeWxfdGV4dCcpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW4nKTtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMubmVvblZpZXcubW9kYWw7XG4gICAgc3BhbnMuZm9yRWFjaCgoc3BhbjogSFRNTFNwYW5FbGVtZW50KSA9PiB7XG4gICAgICBmdW5jdGlvbiBzZWxlY3RTeWxUZXh0KCk6IHZvaWQge1xuICAgICAgICBzcGFuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkLXRvLWVkaXQnKTtcbiAgICAgICAgbW9kYWwuc2V0TW9kYWxXaW5kb3dWaWV3KE1vZGFsV2luZG93Vmlldy5FRElUX1RFWFQpO1xuICAgICAgICBtb2RhbC5vcGVuTW9kYWxXaW5kb3coKTtcbiAgICAgIH1cblxuICAgICAgc3Bhbi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGVjdFN5bFRleHQpO1xuICAgICAgc3Bhbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGVjdFN5bFRleHQpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gJ1QnKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3lsVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50ZXh0LXNlbGVjdCcpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRTeWxUZXh0KSB7XG4gICAgICAgICAgc2VsZWN0ZWRTeWxUZXh0LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBzZWxlY3RCeUJCb3ggYnV0dG9uLlxuICAgKiBJZiBuZXVtZSBlZGl0IG1vZGUgaXMgdGhlcmUsIGFkZCBpdCB0byB0aGUgYmFyIHdpdGggdGhlIG90aGVyIHNlbGVjdCBieSBidXR0b25zLlxuICAgKiBPdGhlcndpc2UgYWRkIGFuIGludmlzaWJsZSBidXR0b25cbiAgICogc2luY2UgdGhlIG9ubHkgZWRpdCBtb2RlIGlzIHNlbGVjdEJ5UmVjdCBpbiB0aGF0IGNhc2VcbiAgICovXG4gIGluaXRTZWxlY3RCeUJCb3hCdXR0b24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubmVvblZpZXcuTmV1bWVFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNlbEJ5QkJveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxCeUJCb3gnKTtcbiAgICAgIGlmIChzZWxCeUJCb3gpIHtcbiAgICAgICAgc2VsQnlCQm94LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBibG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxlY3Rpb24tbW9kZS1idG5zLWNvbnRhaW5lcicpO1xuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnc2lkZS1wYW5lbC1idG4nLCAnc2VsLWJ5Jyk7XG4gICAgICBidXR0b24uaWQgPSAnc2VsQnlCQm94JztcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdCQm94JztcbiAgICAgIGJsb2NrLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxCeUJCb3hMaXN0ZW5lci5iaW5kKHRoaXMpKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQpID0+IHtcbiAgICAgICAgaWYgKGV2dC5rZXkgPT09ICc2Jykge1xuICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94Jykuc3R5bGUuZGlzcGxheSA9PT0gJycpIHtcbiAgICAgICAgICAgIHNlbEJ5QkJveExpc3RlbmVyLmJpbmQodGhpcykoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5uZW9uVmlldy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMuYWRkQkJveExpc3RlbmVycy5iaW5kKHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndW5kbycpLmNsb3Nlc3QoJy5jb250cm9sJyk7XG4gICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgcC5jbGFzc0xpc3QuYWRkKCdjb250cm9sJyk7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzaWRlLXBhbmVsLWJ0bicsICdzZWwtYnknKTtcbiAgICAgIGJ1dHRvbi5pZCA9ICdzZWxCeUJCb3gnO1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0JCb3gnO1xuICAgICAgcC5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgICAgYmxvY2suYXBwZW5kQ2hpbGQocCk7XG4gICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuYWRkQkJveExpc3RlbmVycygpO1xuICAgICAgdGhpcy5uZW9uVmlldy52aWV3LmFkZFVwZGF0ZUNhbGxiYWNrKHRoaXMuYWRkQkJveExpc3RlbmVycy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBzZWxlY3QgYnkgYmJveCBtb2RlXG4gICAqL1xuICBhZGRCQm94TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsQnlCQm94JykuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkge1xuICAgICAgdW5zZWxlY3QoKTtcbiAgICAgIGlmICh0aGlzLm5lb25WaWV3Lk5ldW1lRWRpdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZVxuICAgICAgICB0aGlzLmRyYWdIYW5kbGVyID0gbmV3IERyYWdIYW5kbGVyKFxuICAgICAgICAgIHRoaXMubmVvblZpZXcsXG4gICAgICAgICAgJy5zeWxUZXh0UmVjdC1kaXNwbGF5JyxcbiAgICAgICAgKTtcbiAgICAgICAgc2V0U2VsZWN0SGVscGVyT2JqZWN0cyh0aGlzLm5lb25WaWV3LCB0aGlzLmRyYWdIYW5kbGVyKTtcbiAgICAgICAgaWYgKHRoaXMubmVvblZpZXcudmlldy5jb25zdHJ1Y3Rvci5uYW1lID09PSAnU2luZ2xlVmlldycpIHtcbiAgICAgICAgICBjbGlja1NlbGVjdCgnI21laV9vdXRwdXQsICNtZWlfb3V0cHV0IHJlY3QnKTtcbiAgICAgICAgICBkcmFnU2VsZWN0KCcjc3ZnX2dyb3VwJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xpY2tTZWxlY3QoXG4gICAgICAgICAgICAnLmFjdGl2ZS1wYWdlID4gc3ZnID4gc3ZnLCAuYWN0aXZlLXBhZ2UgPiBzdmcgPiBzdmcgcmVjdCcsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkcmFnU2VsZWN0KCcuYWN0aXZlLXBhZ2Ugc3ZnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBiYm94IGNpcmNsZSBzaXplIHNsaWRlci5cbiAgICovXG4gIGluaXRCQm94Q2lyY2xlU2xpZGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNpcmNsZVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYm94LWNpcmNsZS1zbGlkZXInKTtcbiAgICBpZiAoY2lyY2xlU2xpZGVyKSB7XG4gICAgICBjaXJjbGVTbGlkZXIuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWRlclNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheS1zbGlkZXItc2VjdGlvbicpO1xuICAgIGNvbnN0IGNpcmNsZVNsaWRlckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNpcmNsZVNsaWRlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFxuICAgICAgJ3NsaWRlci1hbmQtc2xpZGVyLWFjdGlvbnMtY29udGFpbmVyJyxcbiAgICAgICdkaXNwbGF5LXBhbmVsJyxcbiAgICApO1xuICAgIGNpcmNsZVNsaWRlckNvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgY2lyY2xlU2xpZGVyQ29udGFpbmVyLmlkID0gJ2Jib3gtY2lyY2xlLXNsaWRlcic7XG4gICAgY2lyY2xlU2xpZGVyQ29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LXNsaWRlci10aXRsZVwiPkJCb3ggQ2lyY2xlPC9kaXY+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzaWRlLXBhbmVsLWJ0biBzbGlkZXItYnRuXCIgaWQ9XCJyZXNldC1jaXJjbGUtc2l6ZVwiIHRpdGxlPVwiUmVzZXQgY2lyY2xlIHNpemVcIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzbGlkZXItYnRuLWltZ1wiIHNyYz1cIiR7X19BU1NFVF9QUkVGSVhfX31hc3NldHMvaW1nL2Fycm93LXJvdGF0ZS1sZWZ0LXNvbGlkLnN2Z1wiPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWNvbnRhaW5lclwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgIHN0ZXA9XCIxXCIgbWluPVwiMFwiIG1heD1cIjUwXCIgdmFsdWU9XCIyNVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJyZXNldC1jaXJjbGUtc2l6ZVwiXG4gICAgICAgICAgICBjbGFzcz1cInNsaWRlciBpcy1mdWxsd2lkdGggaXMtbGFyZ2VcIlxuICAgICAgICAgICAgaWQ9XCJjaXJjbGVTbGlkZXJcIlxuICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDFyZW07IHBhZGRpbmctcmlnaHQ6IDFyZW07XCJcbiAgICAgICAgICAgIGRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAvPlxuICAgICAgICA8b3V0cHV0IGlkPVwiY2lyY2xlT3V0cHV0XCIgZm9yPVwiY2lyY2xlU2xpZGVyXCI+MjU8L291dHB1dD5cbiAgICA8L2Rpdj5gO1xuICAgIHNsaWRlclNlY3Rpb24uYXBwZW5kQ2hpbGQoY2lyY2xlU2xpZGVyQ29udGFpbmVyKTtcblxuICAgIGlmICh0aGlzLm5lb25WaWV3Lk5ldW1lRWRpdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaXJjbGVTbGlkZXJDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBzZXRDaXJjbGVTaXplQ29udHJvbHMoKTtcbiAgfVxufVxuIiwiZXhwb3J0IHsgc2V0RE9NQXR0cmlidXRlcyBhcyBzZXRBdHRyaWJ1dGVzIH07XG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgRE9NIGVsZW1lbnQsIHNldCBhdHRyaWJ1dGVzIG9uIGl0LCBhbmRcbiAqIGFwcGVuZCBjaGlsZHJlbi4gQWxsIGFyZ3VtZW50cyB3aGljaCBhcmUgbm90IG9mIHByaW1pdGl2ZSB0eXBlLCBhcmUgbm90XG4gKiBhcnJheXMsIGFuZCBhcmUgbm90IERPTSBub2RlcyBhcmUgdHJlYXRlZCBhcyBhdHRyaWJ1dGUgaGFzaGVzIGFuZCBhcmVcbiAqIGhhbmRsZWQgYXMgZGVzY3JpYmVkIGZvciBzZXRET01BdHRyaWJ1dGVzLiBDaGlsZHJlbiBjYW4gZWl0aGVyIGJlIGEgRE9NXG4gKiBub2RlIG9yIGEgcHJpbWl0aXZlIHZhbHVlLCB3aGljaCBpcyBjb252ZXJ0ZWQgdG8gYSB0ZXh0IG5vZGUuIEFycmF5cyBhcmVcbiAqIGhhbmRsZWQgcmVjdXJzaXZlbHkuIE51bGwgYW5kIHVuZGVmaW5lZCB2YWx1ZXMgYXJlIGlnbm9yZWQuXG4gKlxuICogSW5zcGlyZWQgYnkgdGhlIFByb3NlTWlycm9yIGhlbHBlciBvZiB0aGUgc2FtZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWx0ICh0YWcpXG57XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgICB3aGlsZSAoYXJncy5sZW5ndGgpXG4gICAge1xuICAgICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGhhbmRsZUVsdENvbnN0cnVjdG9yQXJnKGVsLCBhcmcpO1xuICAgIH1cblxuICAgIHJldHVybiBlbDtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRWx0Q29uc3RydWN0b3JBcmcgKGVsLCBhcmcpXG57XG4gICAgaWYgKGFyZyA9PSBudWxsKSAgLy8gTkI6ID09IGlzIGNvcnJlY3Q7XG4gICAgICAgIHJldHVybjtcblxuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYXJnICE9PSAnZnVuY3Rpb24nKVxuICAgIHtcbiAgICAgICAgLy8gQ29lcmNlIHRvIHN0cmluZ1xuICAgICAgICBlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhcmcpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJnIGluc3RhbmNlb2Ygd2luZG93Lk5vZGUpXG4gICAge1xuICAgICAgICBlbC5hcHBlbmRDaGlsZChhcmcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBhcmcubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgICAgIGhhbmRsZUVsdENvbnN0cnVjdG9yQXJnKGVsLCBhcmdbaV0pO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBzZXRET01BdHRyaWJ1dGVzKGVsLCBhcmcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBTZXQgYXR0cmlidXRlcyBvZiBhIERPTSBlbGVtZW50LiBUaGUgYHN0eWxlYCBwcm9wZXJ0eSBpcyBzcGVjaWFsLWNhc2VkIHRvXG4gKiBhY2NlcHQgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aG9zZSBvd24gYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgdG9cbiAqIGVsLnN0eWxlLlxuICovXG5mdW5jdGlvbiBzZXRET01BdHRyaWJ1dGVzIChlbCwgYXR0cmlidXRlcylcbntcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gYXR0cmlidXRlcylcbiAgICB7XG4gICAgICAgIGlmICghYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChwcm9wID09PSAnc3R5bGUnKVxuICAgICAgICB7XG4gICAgICAgICAgICBzZXRTdHlsZShlbCwgYXR0cmlidXRlcy5zdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUocHJvcCwgYXR0cmlidXRlc1twcm9wXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFN0eWxlIChlbCwgc3R5bGUpXG57XG4gICAgaWYgKCFzdHlsZSlcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgaWYgKHR5cGVvZiBzdHlsZSAhPT0gJ29iamVjdCcpXG4gICAge1xuICAgICAgICBlbC5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNzc1Byb3AgaW4gc3R5bGUpXG4gICAge1xuICAgICAgICBpZiAoIXN0eWxlLmhhc093blByb3BlcnR5KGNzc1Byb3ApKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgZWwuc3R5bGVbY3NzUHJvcF0gPSBzdHlsZVtjc3NQcm9wXTtcbiAgICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gRGl2YVBhcmVudEVsZW1lbnROb3RGb3VuZEV4Y2VwdGlvbiAobWVzc2FnZSlcbntcbiAgICB0aGlzLm5hbWUgPSBcIkRpdmFQYXJlbnRFbGVtZW50Tm90Rm91bmRFeGNlcHRpb25cIjtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xufVxuXG5EaXZhUGFyZW50RWxlbWVudE5vdEZvdW5kRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnQgZnVuY3Rpb24gTm90QW5JSUlGTWFuaWZlc3RFeGNlcHRpb24gKG1lc3NhZ2UpXG57XG4gICAgdGhpcy5uYW1lID0gXCJOb3RBbklJSUZNYW5pZmVzdEV4Y2VwdGlvblwiO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG59XG5cbk5vdEFuSUlJRk1hbmlmZXN0RXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnQgZnVuY3Rpb24gT2JqZWN0RGF0YU5vdFN1cHBsaWVkRXhjZXB0aW9uIChtZXNzYWdlKVxue1xuICAgIHRoaXMubmFtZSA9IFwiT2JqZWN0RGF0YU5vdFN1cHBsaWVkRXhjZXB0aW9uXCI7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbn1cblxuT2JqZWN0RGF0YU5vdFN1cHBsaWVkRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuIiwiaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi91dGlscy9ldmVudHMnO1xuXG5jb25zdCBkaXZhID0ge1xuICAgIEV2ZW50czogRXZlbnRzLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZGl2YTtcbiIsIi8qKlxuICogRXZlbnRzLiBQdWIvU3ViIHN5c3RlbSBmb3IgTG9vc2VseSBDb3VwbGVkIGxvZ2ljLlxuICogQmFzZWQgb24gUGV0ZXIgSGlnZ2lucycgcG9ydCBmcm9tIERvam8gdG8galF1ZXJ5XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGhpZ2dpbnM0Mi9ibG9vZHktanF1ZXJ5LXBsdWdpbnMvYmxvYi9tYXN0ZXIvcHVic3ViLmpzXG4gKlxuICogUmUtYWRhcHRlZCB0byB2YW5pbGxhIEphdmFzY3JpcHRcbiAqXG4gKiBAY2xhc3MgRXZlbnRzXG4gKi9cblxuY2xhc3MgRGl2YUV2ZW50c1xue1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGl2YS5FdmVudHMucHVibGlzaFxuICAgICAqIGUuZy46IGRpdmEuRXZlbnRzLnB1Ymxpc2goXCJQYWdlRGlkTG9hZFwiLCBbcGFnZUluZGV4LCBmaWxlbmFtZSwgcGFnZVNlbGVjdG9yXSwgdGhpcyk7XG4gICAgICpcbiAgICAgKiBAY2xhc3MgRXZlbnRzXG4gICAgICogQG1ldGhvZCBwdWJsaXNoXG4gICAgICogQHBhcmFtIHRvcGljIHtTdHJpbmd9XG4gICAgICogQHBhcmFtIGFyZ3MgIHtBcnJheX1cbiAgICAgKiBAcGFyYW0gc2NvcGUge09iamVjdD19IE9wdGlvbmFsIC0gU3Vic2NyaWJlZCBmdW5jdGlvbnMgd2lsbCBiZSBleGVjdXRlZCB3aXRoIHRoZSBzdXBwbGllZCBvYmplY3QgYXMgYHRoaXNgLlxuICAgICAqICAgICBJdCBpcyBuZWNlc3NhcnkgdG8gc3VwcGx5IHRoaXMgYXJndW1lbnQgd2l0aCB0aGUgc2VsZiB2YXJpYWJsZSB3aGVuIHdpdGhpbiBhIERpdmEgaW5zdGFuY2UuXG4gICAgICogICAgIFRoZSBzY29wZSBhcmd1bWVudCBpcyBtYXRjaGVkIHdpdGggdGhlIGluc3RhbmNlIElEIG9mIHN1YnNjcmliZXJzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXlcbiAgICAgKiAgICAgICAgIHNob3VsZCBiZSBleGVjdXRlZC4gKFNlZSBpbnN0YW5jZUlEIGFyZ3VtZW50IG9mIHN1YnNjcmliZS4pXG4gICAgICovXG4gICAgcHVibGlzaCh0b3BpYywgYXJncywgc2NvcGUpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVbdG9waWNdKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB0aGlzVG9waWMgPSB0aGlzLl9jYWNoZVt0b3BpY107XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1RvcGljLmdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGhpc1RvcGljR2xvYmFsID0gdGhpc1RvcGljLmdsb2JhbDtcbiAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxDb3VudCA9IHRoaXNUb3BpY0dsb2JhbC5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBnbG9iYWxDb3VudDsgaSsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1RvcGljR2xvYmFsW2ldLmFwcGx5KHNjb3BlIHx8IG51bGwsIGFyZ3MgfHwgW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNjb3BlICYmIHR5cGVvZiBzY29wZS5nZXRJbnN0YW5jZUlkICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgcHVibGlzaGVyIGluc3RhbmNlIElEIGZyb20gc2NvcGUgYXJnLCBjb21wYXJlLCBhbmQgZXhlY3V0ZSBpZiBtYXRjaFxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlSUQgPSBzY29wZS5nZXRJbnN0YW5jZUlkKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVbdG9waWNdW2luc3RhbmNlSURdKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhpc1RvcGljSW5zdGFuY2UgPSB0aGlzLl9jYWNoZVt0b3BpY11baW5zdGFuY2VJRF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZENvdW50ID0gdGhpc1RvcGljSW5zdGFuY2UubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IHNjb3BlZENvdW50OyBqKyspXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNUb3BpY0luc3RhbmNlW2pdLmFwcGx5KHNjb3BlLCBhcmdzIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRpdmEuRXZlbnRzLnN1YnNjcmliZVxuICAgICAqIGUuZy46IGRpdmEuRXZlbnRzLnN1YnNjcmliZShcIlBhZ2VEaWRMb2FkXCIsIGhpZ2hsaWdodCwgc2V0dGluZ3MuSUQpXG4gICAgICpcbiAgICAgKiBAY2xhc3MgRXZlbnRzXG4gICAgICogQG1ldGhvZCBzdWJzY3JpYmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gaW5zdGFuY2VJRCAgT3B0aW9uYWwgLSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBJRCBvZiBhIERpdmEgaW5zdGFuY2U7IGlmIHByb3ZpZGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgb25seSBmaXJlcyBmb3IgZXZlbnRzIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaW5zdGFuY2UuXG4gICAgICogQHJldHVybiBFdmVudCBoYW5kbGVyIHtBcnJheX1cbiAgICAgKi9cbiAgICBzdWJzY3JpYmUodG9waWMsIGNhbGxiYWNrLCBpbnN0YW5jZUlEKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZVt0b3BpY10pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlW3RvcGljXSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZUlEID09PSAnc3RyaW5nJylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jYWNoZVt0b3BpY11baW5zdGFuY2VJRF0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVbdG9waWNdW2luc3RhbmNlSURdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2NhY2hlW3RvcGljXVtpbnN0YW5jZUlEXS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2FjaGVbdG9waWNdLmdsb2JhbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZVt0b3BpY10uZ2xvYmFsID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2NhY2hlW3RvcGljXS5nbG9iYWwucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5zdGFuY2VJRCA/IFt0b3BpYywgY2FsbGJhY2ssIGluc3RhbmNlSURdIDogW3RvcGljLCBjYWxsYmFja107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGl2YS5FdmVudHMudW5zdWJzY3JpYmVcbiAgICAgKiBlLmcuOiB2YXIgaGFuZGxlID0gRXZlbnRzLnN1YnNjcmliZShcIlBhZ2VEaWRMb2FkXCIsIGhpZ2hsaWdodCk7XG4gICAgICogICAgICAgICBFdmVudHMudW5zdWJzY3JpYmUoaGFuZGxlKTtcbiAgICAgKlxuICAgICAqIEBjbGFzcyBFdmVudHNcbiAgICAgKiBAbWV0aG9kIHVuc3Vic2NyaWJlXG4gICAgICogQHBhcmFtIHthcnJheX0gaGFuZGxlXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gY29tcGxldGVseSAtIFVuc3Vic2NyaWJlIGFsbCBldmVudHMgZm9yIGEgZ2l2ZW4gdG9waWMuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gc3VjY2Vzc1xuICAgICAqL1xuICAgIHVuc3Vic2NyaWJlKGhhbmRsZSwgY29tcGxldGVseSlcbiAgICB7XG4gICAgICAgIGNvbnN0IHQgPSBoYW5kbGVbMF07XG5cbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlW3RdKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgdG9waWNBcnJheTtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlSUQgPSBoYW5kbGUubGVuZ3RoID09PSAzID8gaGFuZGxlWzJdIDogJ2dsb2JhbCc7XG5cbiAgICAgICAgICAgIHRvcGljQXJyYXkgPSB0aGlzLl9jYWNoZVt0XVtpbnN0YW5jZUlEXTtcblxuICAgICAgICAgICAgaWYgKCF0b3BpY0FycmF5KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBsZXRlbHkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlW3RdW2luc3RhbmNlSURdO1xuICAgICAgICAgICAgICAgIHJldHVybiB0b3BpY0FycmF5Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBpID0gdG9waWNBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlIChpLS0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcGljQXJyYXlbaV0gPT09IGhhbmRsZVsxXSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlW3RdW2luc3RhbmNlSURdLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRpdmEuRXZlbnRzLnVuc3Vic2NyaWJlQWxsXG4gICAgICogZS5nLjogZGl2YS5FdmVudHMudW5zdWJzY3JpYmVBbGwoJ2dsb2JhbCcpO1xuICAgICAqXG4gICAgICogQGNsYXNzIEV2ZW50c1xuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gaW5zdGFuY2VJRCBPcHRpb25hbCAtIGluc3RhbmNlIElEIHRvIHJlbW92ZSBzdWJzY3JpYmVycyBmcm9tIG9yICdnbG9iYWwnIChpZiBvbWl0dGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcnMgaW4gYWxsIHNjb3BlcyByZW1vdmVkKVxuICAgICAqIEBtZXRob2QgdW5zdWJzY3JpYmVBbGxcbiAgICAgKi9cbiAgICB1bnN1YnNjcmliZUFsbChpbnN0YW5jZUlEKVxuICAgIHtcbiAgICAgICAgaWYgKGluc3RhbmNlSUQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHRvcGljcyA9IE9iamVjdC5rZXlzKHRoaXMuX2NhY2hlKTtcbiAgICAgICAgICAgIGxldCBpID0gdG9waWNzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0b3BpYztcblxuICAgICAgICAgICAgd2hpbGUgKGktLSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0b3BpYyA9IHRvcGljc1tpXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY2FjaGVbdG9waWNdW2luc3RhbmNlSURdICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVt0b3BpY11baW5zdGFuY2VJRF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGxldCBFdmVudHMgPSBuZXcgRGl2YUV2ZW50cygpO1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIG9uRG91YmxlQ2xpY2ssXG4gICAgb25QaW5jaCxcbiAgICBvbkRvdWJsZVRhcFxufTtcblxuY29uc3QgRE9VQkxFX0NMSUNLX1RJTUVPVVQgPSA1MDA7XG5jb25zdCBET1VCTEVfVEFQX0RJU1RBTkNFX1RIUkVTSE9MRCA9IDUwO1xuY29uc3QgRE9VQkxFX1RBUF9USU1FT1VUID0gMjUwO1xuXG5mdW5jdGlvbiBvbkRvdWJsZUNsaWNrKGVsZW0sIGNhbGxiYWNrKVxue1xuICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpXG4gICAge1xuICAgICAgICBpZiAoIWV2ZW50LmN0cmxLZXkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBnZXRSZWxhdGl2ZU9mZnNldChldmVudC5jdXJyZW50VGFyZ2V0LCBldmVudCkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgdGhlIGNvbnRyb2wga2V5IGZvciBtYWNzIChpbiBjb25qdW5jdGlvbiB3aXRoIGRvdWJsZS1jbGlja2luZylcbiAgICAvLyBGSVhNRTogRG9lcyBhIGNsaWNrIGdldCBoYW5kbGVkIHdpdGggY3RybCBwcmVzc2VkIG9uIG5vbi1NYWNzP1xuICAgIGNvbnN0IHRyYWNrZXIgPSBjcmVhdGVEb3VibGVFdmVudFRyYWNrZXIoRE9VQkxFX0NMSUNLX1RJTUVPVVQpO1xuXG4gICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uIChldmVudClcbiAgICB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0cmFja2VyLmlzVHJpZ2dlcmVkKCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHJhY2tlci5yZXNldCgpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBnZXRSZWxhdGl2ZU9mZnNldChldmVudC5jdXJyZW50VGFyZ2V0LCBldmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyYWNrZXIudHJpZ2dlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUGluY2goZWxlbSwgY2FsbGJhY2spXG57XG4gICAgbGV0IHN0YXJ0RGlzdGFuY2UgPSAwO1xuXG4gICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50KVxuICAgIHtcbiAgICAgICAgLy8gUHJldmVudCBtb3VzZSBldmVudCBmcm9tIGZpcmluZ1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKVxuICAgICAgICB7XG4gICAgICAgICAgICBzdGFydERpc3RhbmNlID0gZGlzdGFuY2UoXG4gICAgICAgICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFksXG4gICAgICAgICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzFdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzFdLmNsaWVudFlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgZnVuY3Rpb24oZXZlbnQpXG4gICAge1xuICAgICAgICAvLyBQcmV2ZW50IG1vdXNlIGV2ZW50IGZyb20gZmlyaW5nXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdWNoZXMgPSBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vdmVEaXN0YW5jZSA9IGRpc3RhbmNlKFxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgICAgICAgICB0b3VjaGVzWzBdLmNsaWVudFksXG4gICAgICAgICAgICAgICAgdG91Y2hlc1sxXS5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMV0uY2xpZW50WVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgem9vbURlbHRhID0gbW92ZURpc3RhbmNlIC0gc3RhcnREaXN0YW5jZTtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHpvb21EZWx0YSkgPiAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdWNoQ2VudGVyID0ge1xuICAgICAgICAgICAgICAgICAgICBwYWdlWDogKHRvdWNoZXNbMF0uY2xpZW50WCArIHRvdWNoZXNbMV0uY2xpZW50WCkgLyAyLFxuICAgICAgICAgICAgICAgICAgICBwYWdlWTogKHRvdWNoZXNbMF0uY2xpZW50WSArIHRvdWNoZXNbMV0uY2xpZW50WSkgLyAyXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBnZXRSZWxhdGl2ZU9mZnNldChldmVudC5jdXJyZW50VGFyZ2V0LCB0b3VjaENlbnRlciksIHN0YXJ0RGlzdGFuY2UsIG1vdmVEaXN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb25Eb3VibGVUYXAoZWxlbSwgY2FsbGJhY2spXG57XG4gICAgY29uc3QgdHJhY2tlciA9IGNyZWF0ZURvdWJsZUV2ZW50VHJhY2tlcihET1VCTEVfVEFQX1RJTUVPVVQpO1xuICAgIGxldCBmaXJzdFRhcCA9IG51bGw7XG5cbiAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgKGV2ZW50KSA9PlxuICAgIHtcbiAgICAgICAgLy8gUHJldmVudCBtb3VzZSBldmVudCBmcm9tIGZpcmluZ1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0cmFja2VyLmlzVHJpZ2dlcmVkKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRyYWNrZXIucmVzZXQoKTtcblxuICAgICAgICAgICAgLy8gRG91YmxldGFwIGhhcyBvY2N1cnJlZFxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kVGFwID0ge1xuICAgICAgICAgICAgICAgIHBhZ2VYOiBldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgcGFnZVk6IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gSWYgZmlyc3QgdGFwIGlzIGNsb3NlIHRvIHNlY29uZCB0YXAgKHByZXZlbnRzIGludGVyZmVyZW5jZSB3aXRoIHNjYWxlIGV2ZW50KVxuICAgICAgICAgICAgY29uc3QgdGFwRGlzdGFuY2UgPSBkaXN0YW5jZShmaXJzdFRhcC5wYWdlWCwgZmlyc3RUYXAucGFnZVksIHNlY29uZFRhcC5wYWdlWCwgc2Vjb25kVGFwLnBhZ2VZKTtcblxuICAgICAgICAgICAgLy8gVE9ETzogQ291bGQgZ2l2ZSBzb21ldGhpbmcgaGlnaGVyLWxldmVsIHRoYW4gc2Vjb25kVGFwIHRvIGNhbGxiYWNrXG4gICAgICAgICAgICBpZiAodGFwRGlzdGFuY2UgPCBET1VCTEVfVEFQX0RJU1RBTkNFX1RIUkVTSE9MRClcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCwgZ2V0UmVsYXRpdmVPZmZzZXQoZXZlbnQuY3VycmVudFRhcmdldCwgc2Vjb25kVGFwKSk7XG5cbiAgICAgICAgICAgIGZpcnN0VGFwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZpcnN0VGFwID0ge1xuICAgICAgICAgICAgICAgIHBhZ2VYOiBldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgcGFnZVk6IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdHJhY2tlci50cmlnZ2VyKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLy8gUHl0aGFnb3JlYW4gdGhlb3JlbSB0byBnZXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyAodXNlZCBmb3Jcbi8vIGNhbGN1bGF0aW5nIGZpbmdlciBkaXN0YW5jZSBmb3IgZG91YmxlLXRhcCBhbmQgcGluY2gtem9vbSlcbmZ1bmN0aW9uIGRpc3RhbmNlKHgxLCB5MSwgeDIsIHkyKVxue1xuICAgIHJldHVybiBNYXRoLnNxcnQoKHgyIC0geDEpICogKHgyIC0geDEpICsgKHkyIC0geTEpICogKHkyIC0geTEpKTtcbn1cblxuLy8gVXRpbGl0eSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgYW4gZXZlbnQgaGFzIGJlZW4gdHJpZ2dlcmVkIHR3aWNlXG4vLyBkdXJpbmcgYSBhIGdpdmVuIGR1cmF0aW9uXG5mdW5jdGlvbiBjcmVhdGVEb3VibGVFdmVudFRyYWNrZXIodGltZW91dER1cmF0aW9uKVxue1xuICAgIGxldCB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICBsZXQgdGltZW91dElkID0gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHRyaWdnZXIoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVzZXRUaW1lb3V0KCk7XG4gICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGltZW91dElkID0gbnVsbDtcbiAgICAgICAgICAgIH0sIHRpbWVvdXREdXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGlzVHJpZ2dlcmVkKClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRyaWdnZXJlZDtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc2V0VGltZW91dCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlc2V0VGltZW91dCgpXG4gICAge1xuICAgICAgICBpZiAodGltZW91dElkICE9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgIHRpbWVvdXRJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlbGF0aXZlT2Zmc2V0KGVsZW0sIHBhZ2VDb29yZHMpXG57XG4gICAgY29uc3QgYm91bmRzID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IHBhZ2VDb29yZHMucGFnZVggLSBib3VuZHMubGVmdCxcbiAgICAgICAgdG9wOiBwYWdlQ29vcmRzLnBhZ2VZIC0gYm91bmRzLnRvcFxuICAgIH07XG59XG4iLCJpbXBvcnQgeyBlbHQgfSBmcm9tICcuL3V0aWxzL2VsdCc7XG4vKipcbipcbipcbioqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZVRvb2xzT3ZlcmxheVxue1xuICAgIGNvbnN0cnVjdG9yIChwYWdlSW5kZXgsIHZpZXdlckNvcmUpXG4gICAge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlSW5kZXg7XG5cbiAgICAgICAgdGhpcy5fdmlld2VyQ29yZSA9IHZpZXdlckNvcmU7XG5cbiAgICAgICAgdGhpcy5faW5uZXJFbGVtZW50ID0gdGhpcy5fdmlld2VyQ29yZS5nZXRTZXR0aW5ncygpLmlubmVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5fcGFnZVRvb2xzRWxlbSA9IG51bGw7XG4gICAgICAgIHRoaXMubGFiZWxXaWR0aCA9IDA7XG4gICAgfVxuXG4gICAgbW91bnQgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLl9wYWdlVG9vbHNFbGVtID09PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9idXR0b25zID0gdGhpcy5faW5pdGlhbGl6ZVBhZ2VUb29sQnV0dG9ucygpO1xuXG4gICAgICAgICAgICB0aGlzLl9wYWdlVG9vbHNFbGVtID0gZWx0KCdkaXYnLCB7IGNsYXNzOiAnZGl2YS1wYWdlLXRvb2xzLXdyYXBwZXInIH0sXG4gICAgICAgICAgICAgICAgZWx0KCdkaXYnLCB7IGNsYXNzOiAnZGl2YS1wYWdlLXRvb2xzJyB9LCB0aGlzLl9idXR0b25zKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5fcGFnZUxhYmVsc0VsZW0gPSBlbHQoJ2RpdicsIHsgY2xhc3M6ICdkaXZhLXBhZ2UtbGFiZWxzLXdyYXBwZXInfSxcbiAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdkaXZhLXBhZ2UtbGFiZWxzJyB9LCB0aGlzLl92aWV3ZXJDb3JlLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3RoaXMucGFnZV0ubClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgdGhpcy5faW5uZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3BhZ2VUb29sc0VsZW0pO1xuICAgICAgICB0aGlzLl9pbm5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcGFnZUxhYmVsc0VsZW0pO1xuICAgIH1cblxuICAgIF9pbml0aWFsaXplUGFnZVRvb2xCdXR0b25zICgpXG4gICAge1xuICAgICAgICAvLyBDYWxsYmFjayBwYXJhbWV0ZXJzXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5fdmlld2VyQ29yZS5nZXRTZXR0aW5ncygpO1xuICAgICAgICBjb25zdCBwdWJsaWNJbnN0YW5jZSA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy5wYWdlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3ZXJDb3JlLmdldFBhZ2VUb29scygpLm1hcCggKHBsdWdpbikgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgLy8gISEhIFRoZSBub2RlIG5lZWRzIHRvIGJlIGNsb25lZCBvdGhlcndpc2UgaXQgaXMgZGV0YWNoZWQgZnJvbVxuICAgICAgICAgICAgLy8gIG9uZSBhbmQgcmVhdHRhY2hlZCB0byB0aGUgb3RoZXIuXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSBwbHVnaW4ucGFnZVRvb2xzSWNvbi5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgcGx1Z2luIGluc3RhbmNlIGlzIGhhbmRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gY2FsbDtcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBzZXQgdGhlIGNvbnRleHQgKGkuZS4sIGB0aGlzYCkgb2YgdGhlIGhhbmRsZUNsaWNrIGNhbGwgdG8gdGhlIHBsdWdpbiBpbnN0YW5jZVxuICAgICAgICAgICAgLy8gaXRzZWxmLlxuICAgICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5oYW5kbGVDbGljay5jYWxsKHBsdWdpbiwgZXZlbnQsIHNldHRpbmdzLCBwdWJsaWNJbnN0YW5jZSwgcGFnZUluZGV4KTtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgKGV2ZW50KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgZmlyaW5nIG9mIGVtdWxhdGVkIG1vdXNlIGV2ZW50c1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICBwbHVnaW4uaGFuZGxlQ2xpY2suY2FsbChwbHVnaW4sIGV2ZW50LCBzZXR0aW5ncywgcHVibGljSW5zdGFuY2UsIHBhZ2VJbmRleCk7XG4gICAgICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBidXR0b247XG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5tb3VudCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5faW5uZXJFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuX3BhZ2VUb29sc0VsZW0pO1xuICAgICAgICB0aGlzLl9pbm5lckVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fcGFnZUxhYmVsc0VsZW0pO1xuICAgIH1cblxuICAgIHJlZnJlc2ggKClcbiAgICB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0UGFnZVJlZ2lvbih0aGlzLnBhZ2UsIHtcbiAgICAgICAgICAgIGluY2x1ZGVQYWRkaW5nOiB0cnVlLFxuICAgICAgICAgICAgaW5jb3Jwb3JhdGVWaWV3cG9ydDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpZiB3aW5kb3cgaXMgcmVzaXplZCBsYXJnZXIsIGEgbWFyZ2luIGlzIGNyZWF0ZWQgLSBuZWVkIHRvIHN1YnRyYWN0IHRoaXMgZnJvbSBvZmZzZXRzXG4gICAgICAgIGxldCBtYXJnaW5MZWZ0ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5faW5uZXJFbGVtZW50LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdtYXJnaW4tbGVmdCcpO1xuXG4gICAgICAgIHRoaXMuX3BhZ2VUb29sc0VsZW0uc3R5bGUudG9wID0gYCR7cG9zLnRvcH1weGA7XG4gICAgICAgIHRoaXMuX3BhZ2VUb29sc0VsZW0uc3R5bGUubGVmdCA9IGAke3Bvcy5sZWZ0IC0gcGFyc2VJbnQobWFyZ2luTGVmdCl9cHhgO1xuXG4gICAgICAgIHRoaXMuX3BhZ2VMYWJlbHNFbGVtLnN0eWxlLnRvcCA9IGAke3Bvcy50b3B9cHhgO1xuICAgICAgICB0aGlzLl9wYWdlTGFiZWxzRWxlbS5zdHlsZS5sZWZ0ID0gYCR7cG9zLnJpZ2h0IC0gcGFyc2VJbnQobWFyZ2luTGVmdCkgLSB0aGlzLmxhYmVsV2lkdGggLSA1fXB4YDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBtYXhCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUGFnZVRvb2xzT3ZlcmxheSBmcm9tICcuL3BhZ2UtdG9vbHMtb3ZlcmxheSc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9jdW1lbnRIYW5kbGVyXG57XG4gICAgY29uc3RydWN0b3IgKHZpZXdlckNvcmUpXG4gICAge1xuICAgICAgICB0aGlzLl92aWV3ZXJDb3JlID0gdmlld2VyQ29yZTtcbiAgICAgICAgdGhpcy5fdmlld2VyU3RhdGUgPSB2aWV3ZXJDb3JlLmdldEludGVybmFsU3RhdGUoKTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheXMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5fdmlld2VyQ29yZS5nZXRQYWdlVG9vbHMoKS5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG51bVBhZ2VzID0gdmlld2VyQ29yZS5nZXRTZXR0aW5ncygpLm51bVBhZ2VzO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVBhZ2VzOyBpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IG5ldyBQYWdlVG9vbHNPdmVybGF5KGksIHZpZXdlckNvcmUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlzLnB1c2gob3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5hZGRQYWdlT3ZlcmxheShvdmVybGF5KTtcblxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBkdW1teSBsYWJlbCBmb3Igd2lkdGggY2FsY3VsYXRpb25cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBfcGFnZVRvb2xzRWxlbSBpcyBvbmx5IGNyZWF0ZWQgb24gbW91bnRcbiAgICAgICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG90aGVyIHdheSB0byBnZXQgaXRzIHdpZHRoIGJlZm9yZSB0aGUgcGFnZXMgYXJlIGxvYWRlZFxuICAgICAgICAgICAgICAgIC8vICh3aGljaCB3ZSBuZWVkIHRvIGF2b2lkIHRoZWlyIHdpZHRoIHRlbXBvcmFyaWx5IGJlaW5nIDAgd2hpbGUgbG9hZGluZylcbiAgICAgICAgICAgICAgICBsZXQgZHVtbXlMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgICAgICBkdW1teUxhYmVsLmlubmVySFRNTCA9IHZpZXdlckNvcmUuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbaV0ubDtcbiAgICAgICAgICAgICAgICBkdW1teUxhYmVsLmNsYXNzTGlzdC5hZGQoJ2RpdmEtcGFnZS1sYWJlbHMnKTtcbiAgICAgICAgICAgICAgICBkdW1teUxhYmVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogaW5saW5lLWJsb2NrOycpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHVtbXlMYWJlbCk7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsV2lkdGggPSBkdW1teUxhYmVsLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZHVtbXlMYWJlbCk7XG5cbiAgICAgICAgICAgICAgICBvdmVybGF5LmxhYmVsV2lkdGggPSBsYWJlbFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVVNFUiBFVkVOVFNcbiAgICBvbkRvdWJsZUNsaWNrIChldmVudCwgY29vcmRzKVxuICAgIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLl92aWV3ZXJDb3JlLmdldFNldHRpbmdzKCk7XG4gICAgICAgIGNvbnN0IG5ld1pvb21MZXZlbCA9IGV2ZW50LmN0cmxLZXkgPyBzZXR0aW5ncy56b29tTGV2ZWwgLSAxIDogc2V0dGluZ3Muem9vbUxldmVsICsgMTtcblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0UGFnZVBvc2l0aW9uQXRWaWV3cG9ydE9mZnNldChjb29yZHMpO1xuICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnpvb20obmV3Wm9vbUxldmVsLCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgb25QaW5jaCAoZXZlbnQsIGNvb3Jkcywgc3RhcnREaXN0YW5jZSwgZW5kRGlzdGFuY2UpXG4gICAge1xuICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyBjaGVjayBpbiBhIHdheSB3aGljaCBpcyBsZXNzIHNwYWdoZXR0aSBjb2RlLXlcbiAgICAgICAgY29uc3Qgdmlld2VyU3RhdGUgPSB0aGlzLl92aWV3ZXJDb3JlLmdldEludGVybmFsU3RhdGUoKTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLl92aWV3ZXJDb3JlLmdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgbGV0IG5ld1pvb21MZXZlbCA9IE1hdGgubG9nKE1hdGgucG93KDIsIHNldHRpbmdzLnpvb21MZXZlbCkgKiBlbmREaXN0YW5jZSAvIChzdGFydERpc3RhbmNlICogTWF0aC5sb2coMikpKSAvIE1hdGgubG9nKDIpO1xuICAgICAgICBuZXdab29tTGV2ZWwgPSBNYXRoLm1heChzZXR0aW5ncy5taW5ab29tTGV2ZWwsIG5ld1pvb21MZXZlbCk7XG4gICAgICAgIG5ld1pvb21MZXZlbCA9IE1hdGgubWluKHNldHRpbmdzLm1heFpvb21MZXZlbCwgbmV3Wm9vbUxldmVsKTtcblxuICAgICAgICBpZiAobmV3Wm9vbUxldmVsID09PSBzZXR0aW5ncy56b29tTGV2ZWwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fdmlld2VyQ29yZS5nZXRQYWdlUG9zaXRpb25BdFZpZXdwb3J0T2Zmc2V0KGNvb3Jkcyk7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5fdmlld2VyQ29yZS5nZXRDdXJyZW50TGF5b3V0KCk7XG4gICAgICAgIGNvbnN0IGNlbnRlck9mZnNldCA9IGxheW91dC5nZXRQYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldChwb3NpdGlvbi5hbmNob3JQYWdlLCB2aWV3ZXJTdGF0ZS52aWV3cG9ydCk7XG4gICAgICAgIGNvbnN0IHNjYWxlUmF0aW8gPSAxIC8gTWF0aC5wb3coMiwgc2V0dGluZ3Muem9vbUxldmVsIC0gbmV3Wm9vbUxldmVsKTtcblxuICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnJlbG9hZCh7XG4gICAgICAgICAgICB6b29tTGV2ZWw6IG5ld1pvb21MZXZlbCxcbiAgICAgICAgICAgIGdvRGlyZWN0bHlUbzogcG9zaXRpb24uYW5jaG9yUGFnZSxcbiAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IChjZW50ZXJPZmZzZXQueCAtIHBvc2l0aW9uLm9mZnNldC5sZWZ0KSArIHBvc2l0aW9uLm9mZnNldC5sZWZ0ICogc2NhbGVSYXRpbyxcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiAoY2VudGVyT2Zmc2V0LnkgLSBwb3NpdGlvbi5vZmZzZXQudG9wKSArIHBvc2l0aW9uLm9mZnNldC50b3AgKiBzY2FsZVJhdGlvXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFZJRVcgRVZFTlRTXG4gICAgb25WaWV3V2lsbExvYWQgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucHVibGlzaCgnRG9jdW1lbnRXaWxsTG9hZCcsIHRoaXMuX3ZpZXdlckNvcmUuZ2V0U2V0dGluZ3MoKSk7XG4gICAgfVxuXG4gICAgb25WaWV3RGlkTG9hZCAoKVxuICAgIHtcbiAgICAgICAgLy8gVE9ETzogU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IHRvIGhhbmRsZSBjaGFuZ2VzIG9uIHZpZXcgdXBkYXRlLCBub3RcbiAgICAgICAgLy8gaW5pdGlhbCBsb2FkXG4gICAgICAgIHRoaXMuX2hhbmRsZVpvb21MZXZlbENoYW5nZSgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLl92aWV3ZXJDb3JlLmdldFNldHRpbmdzKCkuYWN0aXZlUGFnZUluZGV4O1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0UGFnZU5hbWUoY3VycmVudFBhZ2VJbmRleCk7XG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucHVibGlzaChcIkRvY3VtZW50RGlkTG9hZFwiLCBjdXJyZW50UGFnZUluZGV4LCBmaWxlTmFtZSk7XG4gICAgfVxuXG4gICAgb25WaWV3RGlkVXBkYXRlIChyZW5kZXJlZFBhZ2VzLCB0YXJnZXRQYWdlKVxuICAgIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSAodGFyZ2V0UGFnZSAhPT0gbnVsbCkgP1xuICAgICAgICAgICAgdGFyZ2V0UGFnZSA6XG4gICAgICAgICAgICBnZXRDZW50ZXJtb3N0UGFnZShyZW5kZXJlZFBhZ2VzLCB0aGlzLl92aWV3ZXJDb3JlLmdldEN1cnJlbnRMYXlvdXQoKSwgdGhpcy5fdmlld2VyQ29yZS5nZXRWaWV3cG9ydCgpKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHZpc2libGUgcGFnZXMgZnJvbSB0aGUgcmVuZGVyZWQgcGFnZXNcbiAgICAgICAgbGV0IHRlbXAgPSB0aGlzLl92aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnRlcnNlY3Rpb25Ub2xlcmFuY2U7XG4gICAgICAgIC8vIHdpdGhvdXQgc2V0dGluZyB0byAwLCBpc1BhZ2VWaXNpYmxlIHJldHVybnMgdHJ1ZSBmb3IgcGFnZXMgb3V0IG9mIHZpZXdwb3J0IGJ5IGludGVyc2VjdGlvblRvbGVyYW5jZVxuICAgICAgICB0aGlzLl92aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnRlcnNlY3Rpb25Ub2xlcmFuY2UgPSAwO1xuICAgICAgICBsZXQgdmlzaWJsZVBhZ2VzID0gcmVuZGVyZWRQYWdlcy5maWx0ZXIoaW5kZXggPT4gdGhpcy5fdmlld2VyU3RhdGUucmVuZGVyZXIuaXNQYWdlVmlzaWJsZShpbmRleCkpO1xuICAgICAgICAvLyByZXNldCBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlIGFmdGVyIGdldHRpbmcgdHJ1ZSB2aXNpYmxlIHBhZ2VzXG4gICAgICAgIHRoaXMuX3ZpZXdlclN0YXRlLnZpZXdwb3J0LmludGVyc2VjdGlvblRvbGVyYW5jZSA9IHRlbXA7XG5cbiAgICAgICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgaXMgbm8gcGFnZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAgLy8gRklYTUU6IFdvdWxkIGJlIGJldHRlciB0byBmYWxsIGJhY2sgdG8gdGhlIHBhZ2UgY2xvc2VzdCB0byB0aGUgdmlld3BvcnRcbiAgICAgICAgaWYgKGN1cnJlbnRQYWdlICE9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnNldEN1cnJlbnRQYWdlcyhjdXJyZW50UGFnZSwgdmlzaWJsZVBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlICE9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl92aWV3ZXJDb3JlLnB1Ymxpc2goXCJWaWV3ZXJEaWRKdW1wXCIsIHRhcmdldFBhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faGFuZGxlWm9vbUxldmVsQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVpvb21MZXZlbENoYW5nZSAoKVxuICAgIHtcbiAgICAgICAgY29uc3Qgdmlld2VyU3RhdGUgPSB0aGlzLl92aWV3ZXJTdGF0ZTtcbiAgICAgICAgY29uc3Qgem9vbUxldmVsID0gdmlld2VyU3RhdGUub3B0aW9ucy56b29tTGV2ZWw7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGluaXRpYWwgbG9hZCwgdHJpZ2dlciB0aGUgem9vbSBldmVudHNcbiAgICAgICAgaWYgKHZpZXdlclN0YXRlLm9sZFpvb21MZXZlbCAhPT0gem9vbUxldmVsICYmIHZpZXdlclN0YXRlLm9sZFpvb21MZXZlbCA+PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodmlld2VyU3RhdGUub2xkWm9vbUxldmVsIDwgem9vbUxldmVsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucHVibGlzaChcIlZpZXdlckRpZFpvb21JblwiLCB6b29tTGV2ZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucHVibGlzaChcIlZpZXdlckRpZFpvb21PdXRcIiwgem9vbUxldmVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5wdWJsaXNoKFwiVmlld2VyRGlkWm9vbVwiLCB6b29tTGV2ZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld2VyU3RhdGUub2xkWm9vbUxldmVsID0gem9vbUxldmVsO1xuICAgIH1cblxuICAgIGRlc3Ryb3kgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlzLmZvckVhY2goKG92ZXJsYXkpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucmVtb3ZlUGFnZU92ZXJsYXkob3ZlcmxheSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2VudGVybW9zdFBhZ2UgKHJlbmRlcmVkUGFnZXMsIGxheW91dCwgdmlld3BvcnQpXG57XG4gICAgY29uc3QgY2VudGVyWSA9IHZpZXdwb3J0LnRvcCArICh2aWV3cG9ydC5oZWlnaHQgLyAyKTtcbiAgICBjb25zdCBjZW50ZXJYID0gdmlld3BvcnQubGVmdCArICh2aWV3cG9ydC53aWR0aCAvIDIpO1xuXG4gICAgLy8gRmluZCB0aGUgbWluaW11bSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCBjZW50ZXIgdG8gYSBwYWdlLlxuICAgIC8vIENvbXB1dGUgbWludXMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgZnJvbSB2aWV3cG9ydCBjZW50ZXIgdG8gdGhlIHBhZ2UncyBib3JkZXIuXG4gICAgLy8gaHR0cDovL2dhbWVkZXYuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzQ0NDgzL2hvdy1kby1pLWNhbGN1bGF0ZS1kaXN0YW5jZS1iZXR3ZWVuLWEtcG9pbnQtYW5kLWFuLWF4aXMtYWxpZ25lZC1yZWN0YW5nbGVcbiAgICBjb25zdCBjZW50ZXJQYWdlID0gbWF4QnkocmVuZGVyZWRQYWdlcywgcGFnZUluZGV4ID0+XG4gICAge1xuICAgICAgICBjb25zdCBkaW1zID0gbGF5b3V0LmdldFBhZ2VEaW1lbnNpb25zKHBhZ2VJbmRleCk7XG4gICAgICAgIGNvbnN0IGltYWdlT2Zmc2V0ID0gbGF5b3V0LmdldFBhZ2VPZmZzZXQocGFnZUluZGV4LCB7aW5jbHVkZVBhZGRpbmc6IHRydWV9KTtcblxuICAgICAgICBjb25zdCBtaWRYID0gaW1hZ2VPZmZzZXQubGVmdCArIChkaW1zLndpZHRoIC8gMik7XG4gICAgICAgIGNvbnN0IG1pZFkgPSBpbWFnZU9mZnNldC50b3AgKyAoZGltcy5oZWlnaHQgLyAyKTtcblxuICAgICAgICBjb25zdCBkeCA9IE1hdGgubWF4KE1hdGguYWJzKGNlbnRlclggLSBtaWRYKSAtIChkaW1zLndpZHRoIC8gMiksIDApO1xuICAgICAgICBjb25zdCBkeSA9IE1hdGgubWF4KE1hdGguYWJzKGNlbnRlclkgLSBtaWRZKSAtIChkaW1zLmhlaWdodCAvIDIpLCAwKTtcblxuICAgICAgICByZXR1cm4gLShkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2VudGVyUGFnZSAhPSBudWxsID8gY2VudGVyUGFnZSA6IG51bGw7XG59XG4iLCJpbXBvcnQgeyBtYXhCeSB9IGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWRIYW5kbGVyXG57XG4gICAgY29uc3RydWN0b3IgKHZpZXdlckNvcmUpXG4gICAge1xuICAgICAgICB0aGlzLl92aWV3ZXJDb3JlID0gdmlld2VyQ29yZTtcbiAgICB9XG5cbiAgICAvLyBVU0VSIEVWRU5UU1xuICAgIG9uRG91YmxlQ2xpY2sgKGV2ZW50LCBjb29yZHMpXG4gICAge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0UGFnZVBvc2l0aW9uQXRWaWV3cG9ydE9mZnNldChjb29yZHMpO1xuXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0Q3VycmVudExheW91dCgpO1xuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuX3ZpZXdlckNvcmUuZ2V0Vmlld3BvcnQoKTtcbiAgICAgICAgY29uc3QgcGFnZVRvVmlld3BvcnRDZW50ZXJPZmZzZXQgPSBsYXlvdXQuZ2V0UGFnZVRvVmlld3BvcnRDZW50ZXJPZmZzZXQocG9zaXRpb24uYW5jaG9yUGFnZSwgdmlld3BvcnQpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUucmVsb2FkKHtcbiAgICAgICAgICAgIGluR3JpZDogZmFsc2UsXG4gICAgICAgICAgICBnb0RpcmVjdGx5VG86IHBvc2l0aW9uLmFuY2hvclBhZ2UsXG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiBwYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldC54ICsgcG9zaXRpb24ub2Zmc2V0LmxlZnQsXG4gICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogcGFnZVRvVmlld3BvcnRDZW50ZXJPZmZzZXQueSArIHBvc2l0aW9uLm9mZnNldC50b3BcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25QaW5jaCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5yZWxvYWQoe2luR3JpZDogZmFsc2V9KTtcbiAgICB9XG5cbiAgICAvLyBWSUVXIEVWRU5UU1xuICAgIG9uVmlld1dpbGxMb2FkICgpXG4gICAge1xuICAgICAgICAvLyBGSVhNRSh3YWJhaW4pOiBTaG91bGQgc29tZXRoaW5nIGhhcHBlbiBoZXJlP1xuICAgICAgICAvKiBOby1vcCAqL1xuICAgIH1cblxuICAgIG9uVmlld0RpZExvYWQgKClcbiAgICB7XG4gICAgICAgIC8vIEZJWE1FKHdhYmFpbik6IFNob3VsZCBzb21ldGhpbmcgaGFwcGVuIGhlcmU/XG4gICAgICAgIC8qIE5vLW9wICovXG4gICAgfVxuXG4gICAgb25WaWV3RGlkVXBkYXRlIChyZW5kZXJlZFBhZ2VzLCB0YXJnZXRQYWdlKVxuICAgIHtcbiAgICAgICAgLy8gcmV0dXJuIGVhcmx5IGlmIHRoZXJlIGFyZSBubyByZW5kZXJlZCBwYWdlcyBpbiB2aWV3LlxuICAgICAgICBpZiAocmVuZGVyZWRQYWdlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHZpc2libGUgcGFnZXMgZnJvbSB0aGUgcmVuZGVyZWQgcGFnZXNcbiAgICAgICAgbGV0IHRlbXAgPSB0aGlzLl92aWV3ZXJDb3JlLnZpZXdlclN0YXRlLnZpZXdwb3J0LmludGVyc2VjdGlvblRvbGVyYW5jZTtcbiAgICAgICAgLy8gd2l0aG91dCBzZXR0aW5nIHRvIDAsIGlzUGFnZVZpc2libGUgcmV0dXJucyB0cnVlIGZvciBwYWdlcyBvdXQgb2Ygdmlld3BvcnQgYnkgaW50ZXJzZWN0aW9uVG9sZXJhbmNlXG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUudmlld2VyU3RhdGUudmlld3BvcnQuaW50ZXJzZWN0aW9uVG9sZXJhbmNlID0gMDtcbiAgICAgICAgbGV0IHZpc2libGVQYWdlcyA9IHJlbmRlcmVkUGFnZXMuZmlsdGVyKGluZGV4ID0+IHRoaXMuX3ZpZXdlckNvcmUudmlld2VyU3RhdGUucmVuZGVyZXIuaXNQYWdlVmlzaWJsZShpbmRleCkpO1xuICAgICAgICAvLyByZXNldCBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlIGFmdGVyIGdldHRpbmcgdHJ1ZSB2aXNpYmxlIHBhZ2VzXG4gICAgICAgIHRoaXMuX3ZpZXdlckNvcmUudmlld2VyU3RhdGUudmlld3BvcnQuaW50ZXJzZWN0aW9uVG9sZXJhbmNlID0gdGVtcDtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZSAhPT0gbnVsbClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5zZXRDdXJyZW50UGFnZXModGFyZ2V0UGFnZSwgdmlzaWJsZVBhZ2VzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlbGVjdCB0aGUgY3VycmVudCBwYWdlIGZyb20gdGhlIGZpcnN0IHJvdyBpZiBpdCBpcyBmdWxseSB2aXNpYmxlLCBvciBmcm9tXG4gICAgICAgIC8vIHRoZSBzZWNvbmQgcm93IGlmIGl0IGlzIGZ1bGx5IHZpc2libGUsIG9yIGZyb20gdGhlIGNlbnRlcm1vc3Qgcm93IG90aGVyd2lzZS5cbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcGFnZSBpcyBpbiB0aGF0IGdyb3VwIHRoZW4gZG9uJ3QgY2hhbmdlIGl0LiBPdGhlcndpc2UsIHNldFxuICAgICAgICAvLyB0aGUgY3VycmVudCBwYWdlIHRvIHRoZSBncm91cCdzIGZpcnN0IHBhZ2UuXG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5fdmlld2VyQ29yZS5nZXRDdXJyZW50TGF5b3V0KCk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IFtdO1xuXG4gICAgICAgIHJlbmRlcmVkUGFnZXMuZm9yRWFjaChwYWdlSW5kZXggPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBsYXlvdXQuZ2V0UGFnZUluZm8ocGFnZUluZGV4KS5ncm91cDtcbiAgICAgICAgICAgIGlmIChncm91cHMubGVuZ3RoID09PSAwIHx8IGdyb3VwICE9PSBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3ZXJDb3JlLmdldFZpZXdwb3J0KCk7XG4gICAgICAgIGxldCBjaG9zZW5Hcm91cDtcblxuICAgICAgICBpZiAoZ3JvdXBzLmxlbmd0aCA9PT0gMSB8fCBncm91cHNbMF0ucmVnaW9uLnRvcCA+PSB2aWV3cG9ydC50b3ApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNob3Nlbkdyb3VwID0gZ3JvdXBzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdyb3Vwc1sxXS5yZWdpb24uYm90dG9tIDw9IHZpZXdwb3J0LmJvdHRvbSlcbiAgICAgICAge1xuICAgICAgICAgICAgY2hvc2VuR3JvdXAgPSBncm91cHNbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjaG9zZW5Hcm91cCA9IGdldENlbnRlcm1vc3RHcm91cChncm91cHMsIHZpZXdwb3J0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5fdmlld2VyQ29yZS5nZXRTZXR0aW5ncygpLmFjdGl2ZVBhZ2VJbmRleDtcblxuICAgICAgICBjb25zdCBoYXNDdXJyZW50UGFnZSA9IGNob3Nlbkdyb3VwLnBhZ2VzLnNvbWUocGFnZSA9PiBwYWdlLmluZGV4ID09PSBjdXJyZW50UGFnZSk7XG5cbiAgICAgICAgaWYgKCFoYXNDdXJyZW50UGFnZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdmlld2VyQ29yZS5zZXRDdXJyZW50UGFnZXMoY2hvc2VuR3JvdXAucGFnZXNbMF0uaW5kZXgsIHZpc2libGVQYWdlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95ICgpXG4gICAge1xuICAgICAgICAvLyBOby1vcFxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2VudGVybW9zdEdyb3VwIChncm91cHMsIHZpZXdwb3J0KVxue1xuICAgIGNvbnN0IHZpZXdwb3J0TWlkZGxlID0gdmlld3BvcnQudG9wICsgdmlld3BvcnQuaGVpZ2h0IC8gMjtcblxuICAgIHJldHVybiBtYXhCeShncm91cHMsIGdyb3VwID0+XG4gICAge1xuICAgICAgICBjb25zdCBncm91cE1pZGRsZSA9IGdyb3VwLnJlZ2lvbi50b3AgKyBncm91cC5kaW1lbnNpb25zLmhlaWdodCAvIDI7XG4gICAgICAgIHJldHVybiAtTWF0aC5hYnModmlld3BvcnRNaWRkbGUgLSBncm91cE1pZGRsZSk7XG4gICAgfSk7XG59XG4iLCIvKipcbiAqIE1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIHBhZ2Ugb3ZlcmxheXMsIHdoaWNoIGltcGxlbWVudCBhIGxvdy1sZXZlbFxuICogQVBJIGZvciBzeW5jaHJvbml6aW5nIEhUTUwgcGFnZXMgdG8gdGhlIGNhbnZhcy4gRWFjaCBvdmVybGF5IG5lZWRzXG4gKiB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBwcm90b2NvbDpcbiAqXG4gKiAgIG1vdW50KCk6IENhbGxlZCB3aGVuIGEgcGFnZSBpcyBmaXJzdCByZW5kZXJlZFxuICogICByZWZyZXNoKCk6IENhbGxlZCB3aGVuIGEgcGFnZSBpcyBtb3ZlZFxuICogICB1bm1vdW50KCk6IENhbGxlZCB3aGVuIGEgcHJldmlvdXNseSByZW5kZXJlZCBwYWdlIGhhcyBzdG9wcGVkIGJlaW5nIHJlbmRlcmVkXG4gKlxuICogQGNsYXNzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZU92ZXJsYXlNYW5hZ2VyXG57XG4gICAgY29uc3RydWN0b3IgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3BhZ2VzID0ge307XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkUGFnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWRQYWdlTWFwID0ge307XG4gICAgfVxuXG4gICAgYWRkT3ZlcmxheSAob3ZlcmxheSlcbiAgICB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlzQnlQYWdlID0gdGhpcy5fcGFnZXNbb3ZlcmxheS5wYWdlXSB8fCAodGhpcy5fcGFnZXNbb3ZlcmxheS5wYWdlXSA9IFtdKTtcblxuICAgICAgICBvdmVybGF5c0J5UGFnZS5wdXNoKG92ZXJsYXkpO1xuXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZFBhZ2VNYXBbb3ZlcmxheS5wYWdlXSlcbiAgICAgICAgICAgIG92ZXJsYXkubW91bnQoKTtcbiAgICB9XG5cbiAgICByZW1vdmVPdmVybGF5IChvdmVybGF5KVxuICAgIHtcbiAgICAgICAgY29uc3QgcGFnZSA9IG92ZXJsYXkucGFnZTtcbiAgICAgICAgY29uc3Qgb3ZlcmxheXNCeVBhZ2UgPSB0aGlzLl9wYWdlc1twYWdlXTtcblxuICAgICAgICBpZiAoIW92ZXJsYXlzQnlQYWdlKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlJbmRleCA9IG92ZXJsYXlzQnlQYWdlLmluZGV4T2Yob3ZlcmxheSk7XG5cbiAgICAgICAgaWYgKG92ZXJsYXlJbmRleCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkUGFnZU1hcFtwYWdlXSlcbiAgICAgICAgICAgIG92ZXJsYXlzQnlQYWdlW292ZXJsYXlJbmRleF0udW5tb3VudCgpO1xuXG4gICAgICAgIG92ZXJsYXlzQnlQYWdlLnNwbGljZShvdmVybGF5SW5kZXgsIDEpO1xuXG4gICAgICAgIGlmIChvdmVybGF5c0J5UGFnZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcGFnZXNbcGFnZV07XG4gICAgfVxuXG4gICAgdXBkYXRlT3ZlcmxheXMgKHJlbmRlcmVkUGFnZXMpXG4gICAge1xuICAgICAgICBjb25zdCBwcmV2aW91c2x5UmVuZGVyZWQgPSB0aGlzLl9yZW5kZXJlZFBhZ2VzO1xuICAgICAgICBjb25zdCBuZXdSZW5kZXJlZE1hcCA9IHt9O1xuXG4gICAgICAgIHJlbmRlcmVkUGFnZXMubWFwKCAocGFnZUluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBuZXdSZW5kZXJlZE1hcFtwYWdlSW5kZXhdID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9yZW5kZXJlZFBhZ2VNYXBbcGFnZUluZGV4XSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlZFBhZ2VNYXBbcGFnZUluZGV4XSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VPbk92ZXJsYXlzKHBhZ2VJbmRleCwgb3ZlcmxheSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5tb3VudCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBwcmV2aW91c2x5UmVuZGVyZWQubWFwKCAocGFnZUluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3UmVuZGVyZWRNYXBbcGFnZUluZGV4XSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VPbk92ZXJsYXlzKHBhZ2VJbmRleCwgKG92ZXJsYXkpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcmVuZGVyZWRQYWdlTWFwW3BhZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5faW52b2tlT25PdmVybGF5cyhwYWdlSW5kZXgsIG92ZXJsYXkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkudW5tb3VudCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJlZFBhZ2VzID0gcmVuZGVyZWRQYWdlcztcbiAgICB9XG5cbiAgICBfaW52b2tlT25PdmVybGF5cyAocGFnZUluZGV4LCBmdW5jKVxuICAgIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheXMgPSB0aGlzLl9wYWdlc1twYWdlSW5kZXhdO1xuICAgICAgICBpZiAob3ZlcmxheXMpXG4gICAgICAgICAgICBvdmVybGF5cy5tYXAoIChvKSA9PiBmdW5jKG8pICk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZUNvdmVyYWdlTWFwXG57XG4gICAgY29uc3RydWN0b3IgKHJvd3MsIGNvbHMpXG4gICAge1xuICAgICAgICB0aGlzLl9yb3dzID0gcm93cztcbiAgICAgICAgdGhpcy5fY29scyA9IGNvbHM7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBBcnJheShyb3dzKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXkoY29scykuZmlsbChmYWxzZSkpO1xuICAgIH1cblxuICAgIGlzTG9hZGVkIChyb3csIGNvbClcbiAgICB7XG4gICAgICAgIC8vIFJldHVybiB0cnVlIGZvciBvdXQgb2YgYm91bmRzIHRpbGVzIGJlY2F1c2UgdGhleVxuICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGxvYWQuIChVbmZvcnR1bmF0ZWx5IHRoaXMgd2lsbCBhbHNvXG4gICAgICAgIC8vIG1hc2sgbG9naWNhbCBlcnJvcnMuKVxuICAgICAgICBpZiAocm93ID49IHRoaXMuX3Jvd3MgfHwgY29sID49IHRoaXMuX2NvbHMpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbWFwW3Jvd11bY29sXTtcbiAgICB9XG5cbiAgICBzZXQocm93LCBjb2wsIHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fbWFwW3Jvd11bY29sXSA9IHZhbHVlO1xuICAgIH1cbn0iLCJpbXBvcnQgVGlsZUNvdmVyYWdlTWFwIGZyb20gXCIuL3RpbGUtY292ZXJhZ2UtbWFwXCI7XG5cbi8qKlxuICogQGNsYXNzIENvbXBvc2l0ZUltYWdlXG4gKiBAcHJpdmF0ZVxuICpcbiAqIFV0aWxpdHkgY2xhc3MgdG8gY29tcG9zaXRlIHRpbGVzIGludG8gYSBjb21wbGV0ZSBpbWFnZVxuICogYW5kIHRyYWNrIHRoZSByZW5kZXJlZCBzdGF0ZSBvZiBhbiBpbWFnZSBhcyBuZXcgdGlsZXNcbiAqIGxvYWQuXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0gbGV2ZWxzIHtBcnJheS48QXJyYXkuPFRpbGU+Pn1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21wb3NpdGVJbWFnZVxue1xuICAgIGNvbnN0cnVjdG9yKGxldmVscylcbiAgICB7XG4gICAgICAgIHRoaXMuX2xldmVscyA9IGxldmVsczsgIC8vIEFzc3VtZSBsZXZlbHMgc29ydGVkIGhpZ2gtcmVzIGZpcnN0XG4gICAgICAgIGNvbnN0IHVybHNUb1RpbGVzID0gdGhpcy5fdXJsc1RvVGlsZXMgPSB7fTtcblxuICAgICAgICBsZXZlbHMuZm9yRWFjaChsZXZlbCA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBsZXZlbC50aWxlcy5mb3JFYWNoKHRpbGUgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1cmxzVG9UaWxlc1t0aWxlLnVybF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHpvb21MZXZlbDogbGV2ZWwuem9vbUxldmVsLFxuICAgICAgICAgICAgICAgICAgICByb3c6IHRpbGUucm93LFxuICAgICAgICAgICAgICAgICAgICBjb2w6IHRpbGUuY29sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgY2xlYXIgKClcbiAgICB7XG4gICAgICAgIGNvbnN0IGxvYWRlZEJ5TGV2ZWwgPSB0aGlzLl9sb2FkZWRCeUxldmVsID0ge307XG5cbiAgICAgICAgdGhpcy5fbGV2ZWxzLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgICAgICAgICAgbG9hZGVkQnlMZXZlbFtsZXZlbC56b29tTGV2ZWxdID0gbmV3IFRpbGVDb3ZlcmFnZU1hcChsZXZlbC5yb3dzLCBsZXZlbC5jb2xzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0VGlsZXMgKGJhc2Vab29tTGV2ZWwpXG4gICAge1xuICAgICAgICBjb25zdCB0b1JlbmRlckJ5TGV2ZWwgPSBbXTtcbiAgICAgICAgY29uc3QgaGlnaGVzdFpvb21MZXZlbCA9IHRoaXMuX2xldmVsc1swXS56b29tTGV2ZWw7XG4gICAgICAgIGNvbnN0IGNvdmVyZWQgPSBuZXcgVGlsZUNvdmVyYWdlTWFwKHRoaXMuX2xldmVsc1swXS5yb3dzLCB0aGlzLl9sZXZlbHNbMF0uY29scyk7XG5cbiAgICAgICAgbGV0IGJlc3RMZXZlbEluZGV4O1xuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gdGhlIGxvd2VzdCB6b29tIGxldmVsXG4gICAgICAgIGlmIChiYXNlWm9vbUxldmVsID09PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICBiZXN0TGV2ZWxJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBjZWlsTGV2ZWwgPSBNYXRoLmNlaWwoYmFzZVpvb21MZXZlbCk7XG4gICAgICAgICAgICBiZXN0TGV2ZWxJbmRleCA9IGZpbmRJbmRleCh0aGlzLl9sZXZlbHMsIGxldmVsID0+IGxldmVsLnpvb21MZXZlbCA8PSBjZWlsTGV2ZWwpO1xuICAgICAgICAgICAgLy8gYmVzdExldmVsSW5kZXggPSB0aGlzLl9sZXZlbHMuZmluZEluZGV4KChsZXZlbCkgPT4gbGV2ZWwuem9vbUxldmVsIDw9IGNlaWxMZXZlbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIFRoZSBiZXN0IGxldmVsLCBmb2xsb3dlZCBieSBoaWdoZXItcmVzIGxldmVscyBpbiBhc2NlbmRpbmcgb3JkZXIgb2YgcmVzb2x1dGlvbixcbiAgICAgICAgLy8gZm9sbG93ZWQgYnkgbG93ZXItcmVzIGxldmVscyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgbGV2ZWxzQnlQcmVmZXJlbmNlID0gdGhpcy5fbGV2ZWxzLnNsaWNlKDAsIGJlc3RMZXZlbEluZGV4ICsgMSkucmV2ZXJzZSgpXG4gICAgICAgICAgICAuY29uY2F0KHRoaXMuX2xldmVscy5zbGljZShiZXN0TGV2ZWxJbmRleCArIDEpKTtcblxuICAgICAgICBsZXZlbHNCeVByZWZlcmVuY2UuZm9yRWFjaCggKGxldmVsKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLl9sb2FkZWRCeUxldmVsW2xldmVsLnpvb21MZXZlbF07XG5cbiAgICAgICAgICAgIGxldCBhZGRpdGlvbmFsVGlsZXMgPSBsZXZlbC50aWxlcy5maWx0ZXIodGlsZSA9PiBsb2FkZWQuaXNMb2FkZWQodGlsZS5yb3csIHRpbGUuY29sKSk7XG5cbiAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgZW50aXJlbHkgY292ZXJlZCB0aWxlc1xuXG4gICAgICAgICAgICAvLyBGSVhNRTogSXMgaXQgYmV0dGVyIHRvIGRyYXcgYWxsIG9mIGEgcGFydGlhbGx5IGNvdmVyZWQgdGlsZSxcbiAgICAgICAgICAgIC8vIHdpdGggc29tZSBvZiBpdCB1bHRpbWF0ZWx5IGNvdmVyZWQsIG9yIHRvIHBpY2sgb3V0IHRoZSByZWdpb25cbiAgICAgICAgICAgIC8vIHdoaWNoIG5lZWRzIHRvIGJlIGRyYXduP1xuICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ERE1BTC9kaXZhLmpzL2lzc3Vlcy8zNThcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlUmF0aW8gPSBNYXRoLnBvdygyLCBoaWdoZXN0Wm9vbUxldmVsIC0gbGV2ZWwuem9vbUxldmVsKTtcblxuICAgICAgICAgICAgYWRkaXRpb25hbFRpbGVzID0gYWRkaXRpb25hbFRpbGVzLmZpbHRlcih0aWxlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNOZWVkZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hSZXNSb3cgPSB0aWxlLnJvdyAqIHNjYWxlUmF0aW87XG4gICAgICAgICAgICAgICAgY29uc3QgaGlnaFJlc0NvbCA9IHRpbGUuY29sICogc2NhbGVSYXRpbztcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHNjYWxlUmF0aW87IGkrKylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IHNjYWxlUmF0aW87IGorKylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb3ZlcmVkLmlzTG9hZGVkKGhpZ2hSZXNSb3cgKyBpLCBoaWdoUmVzQ29sICsgaikpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZWVkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQuc2V0KGhpZ2hSZXNSb3cgKyBpLCBoaWdoUmVzQ29sICsgaiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOZWVkZWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdG9SZW5kZXJCeUxldmVsLnB1c2goYWRkaXRpb25hbFRpbGVzKTtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgLy8gTGVzcy1wcmVmZXJyZWQgdGlsZXMgc2hvdWxkIGNvbWUgZmlyc3RcbiAgICAgICAgdG9SZW5kZXJCeUxldmVsLnJldmVyc2UoKTtcblxuICAgICAgICBjb25zdCB0aWxlcyA9IFtdO1xuXG4gICAgICAgIHRvUmVuZGVyQnlMZXZlbC5mb3JFYWNoKGJ5TGV2ZWwgPT4ge1xuICAgICAgICAgICAgdGlsZXMucHVzaC5hcHBseSh0aWxlcywgYnlMZXZlbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGNvbXBvc2l0ZSBpbWFnZSB0byB0YWtlIGludG8gYWNjb3VudCBhbGwgdGhlIFVSTHNcbiAgICAgKiBsb2FkZWQgaW4gYW4gaW1hZ2UgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FjaGUge0ltYWdlQ2FjaGV9XG4gICAgICovXG4gICAgdXBkYXRlRnJvbUNhY2hlIChjYWNoZSlcbiAgICB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcblxuICAgICAgICB0aGlzLl9sZXZlbHMuZm9yRWFjaCggKGxldmVsKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLl9sb2FkZWRCeUxldmVsW2xldmVsLnpvb21MZXZlbF07XG5cbiAgICAgICAgICAgIGxldmVsLnRpbGVzLmZvckVhY2godGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLmhhcyh0aWxlLnVybCkpXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZC5zZXQodGlsZS5yb3csIHRpbGUuY29sLCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICB9XG5cbiAgICB1cGRhdGVXaXRoTG9hZGVkVXJscyAodXJscylcbiAgICB7XG4gICAgICAgIHVybHMuZm9yRWFjaCggKHVybCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl91cmxzVG9UaWxlc1t1cmxdO1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkQnlMZXZlbFtlbnRyeS56b29tTGV2ZWxdLnNldChlbnRyeS5yb3csIGVudHJ5LmNvbCwgdHJ1ZSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuLy8gZnVuY3Rpb24gZmlsbCAoY291bnQsIHZhbHVlKVxuLy8ge1xuLy8gICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShjb3VudCk7XG4vL1xuLy8gICAgIGZvciAobGV0IGk9MDsgaSA8IGNvdW50OyBpKyspXG4vLyAgICAgICAgIGFycltpXSA9IHZhbHVlO1xuLy9cbi8vICAgICByZXR1cm4gYXJyO1xuLy8gfVxuXG5mdW5jdGlvbiBmaW5kSW5kZXggKGFycmF5LCBwcmVkaWNhdGUpXG57XG4gICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2ldLCBpKSlcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn1cbiIsIi8qKlxuICogVHJhbnNsYXRlIHBhZ2UgbGF5b3V0cywgYXMgZ2VuZXJhdGVkIGJ5IHBhZ2UtbGF5b3V0cywgaW50byBhblxuICogb2JqZWN0IHdoaWNoIGNvbXB1dGVzIGxheW91dCBpbmZvcm1hdGlvbiBmb3IgdGhlIGRvY3VtZW50IGFzXG4gKiBhIHdob2xlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb2N1bWVudExheW91dFxue1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHpvb21MZXZlbClcbiAgICB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkTGF5b3V0ID0gZ2V0Q29tcHV0ZWRMYXlvdXQoY29uZmlnLCB6b29tTGV2ZWwpO1xuXG4gICAgICAgIHRoaXMuZGltZW5zaW9ucyA9IGNvbXB1dGVkTGF5b3V0LmRpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMucGFnZUdyb3VwcyA9IGNvbXB1dGVkTGF5b3V0LnBhZ2VHcm91cHM7XG4gICAgICAgIHRoaXMuX3BhZ2VMb29rdXAgPSBnZXRQYWdlTG9va3VwKGNvbXB1dGVkTGF5b3V0LnBhZ2VHcm91cHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFBhZ2VJbmZvXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4XG4gICAgICogQHByb3BlcnR5IHt7aW5kZXgsIGRpbWVuc2lvbnMsIHBhZ2VzLCByZWdpb24sIHBhZGRpbmd9fSBncm91cFxuICAgICAqIEBwcm9wZXJ0eSB7e2hlaWdodDogbnVtYmVyLCB3aWR0aDogbnVtYmVyfX0gZGltZW5zaW9uc1xuICAgICAqIEBwcm9wZXJ0eSB7e3RvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXJ9fSBncm91cE9mZnNldFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHBhZ2VJbmRleFxuICAgICAqIEByZXR1cm5zIHtQYWdlSW5mb3xudWxsfVxuICAgICAqL1xuICAgIGdldFBhZ2VJbmZvIChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZUxvb2t1cFtwYWdlSW5kZXhdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkaW1lbnNpb25zIG9mIGEgcGFnZVxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2VJbmRleFxuICAgICAqIEByZXR1cm5zIHt7aGVpZ2h0OiBudW1iZXIsIHdpZHRoOiBudW1iZXJ9fVxuICAgICAqL1xuICAgIGdldFBhZ2VEaW1lbnNpb25zIChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuX3BhZ2VMb29rdXAgfHwgIXRoaXMuX3BhZ2VMb29rdXBbcGFnZUluZGV4XSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IGdldFBhZ2VSZWdpb25Gcm9tUGFnZUluZm8odGhpcy5fcGFnZUxvb2t1cFtwYWdlSW5kZXhdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVpZ2h0OiByZWdpb24uYm90dG9tIC0gcmVnaW9uLnRvcCxcbiAgICAgICAgICAgIHdpZHRoOiByZWdpb24ucmlnaHQgLSByZWdpb24ubGVmdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFRPRE8od2FiYWluKTogR2V0IHJpZCBvZiB0aGlzOyBpdCdzIGEgc3Vic2V0IG9mIHRoZSBwYWdlIHJlZ2lvbiwgc29cbiAgICAvLyBnaXZlIHRoYXQgaW5zdGVhZFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdG9wLWxlZnQgY29vcmRpbmF0ZXMgb2YgYSBwYWdlLCBpbmNsdWRpbmcqKiogcGFkZGluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2VJbmRleFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHJldHVybnMge3t0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSB8IG51bGx9XG4gICAgICovXG4gICAgZ2V0UGFnZU9mZnNldCAocGFnZUluZGV4LCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gdGhpcy5nZXRQYWdlUmVnaW9uKHBhZ2VJbmRleCwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCFyZWdpb24pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiByZWdpb24udG9wLFxuICAgICAgICAgICAgbGVmdDogcmVnaW9uLmxlZnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRQYWdlUmVnaW9uIChwYWdlSW5kZXgsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBjb25zdCBwYWdlSW5mbyA9IHRoaXMuX3BhZ2VMb29rdXBbcGFnZUluZGV4XTtcblxuICAgICAgICBpZiAoIXBhZ2VJbmZvKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgcmVnaW9uID0gZ2V0UGFnZVJlZ2lvbkZyb21QYWdlSW5mbyhwYWdlSW5mbyk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBwYWdlSW5mby5ncm91cC5wYWRkaW5nO1xuXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZVBhZGRpbmcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9wOiByZWdpb24udG9wICsgcGFkZGluZy50b3AsXG4gICAgICAgICAgICAgICAgbGVmdDogcmVnaW9uLmxlZnQgKyBwYWRkaW5nLmxlZnQsXG4gICAgICAgICAgICAgICAgYm90dG9tOiByZWdpb24uYm90dG9tLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiByZWdpb24ucmlnaHRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiByZWdpb24udG9wLFxuICAgICAgICAgICAgbGVmdDogcmVnaW9uLmxlZnQsXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGFjY291bnQgZm9yIHBsdWdpbiBpY29ucyBiZWxvdyB0aGUgcGFnZSwgc2VlIFxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0RETUFML2RpdmEuanMvaXNzdWVzLzQzNlxuICAgICAgICAgICAgYm90dG9tOiByZWdpb24uYm90dG9tICsgcGFkZGluZy50b3AsIFxuICAgICAgICAgICAgcmlnaHQ6IHJlZ2lvbi5yaWdodFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgdG9wLXJpZ2h0IG9mIHRoZSBwYWdlIHRvIHRoZSBjZW50ZXIgb2YgdGhlXG4gICAgICogc3BlY2lmaWVkIHZpZXdwb3J0IHJlZ2lvblxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2VJbmRleFxuICAgICAqIEBwYXJhbSB2aWV3cG9ydCB7e3RvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCByaWdodDogbnVtYmVyfX1cbiAgICAgKiBAcmV0dXJucyB7e3g6IG51bWJlciwgeTogbnVtYmVyfX1cbiAgICAgKi9cbiAgICBnZXRQYWdlVG9WaWV3cG9ydENlbnRlck9mZnNldCAocGFnZUluZGV4LCB2aWV3cG9ydClcbiAgICB7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB2aWV3cG9ydC5sZWZ0O1xuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB2aWV3cG9ydC5yaWdodCAtIHZpZXdwb3J0LmxlZnQ7XG5cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5nZXRQYWdlT2Zmc2V0KHBhZ2VJbmRleCk7XG5cbiAgICAgICAgY29uc3QgeCA9IHNjcm9sbExlZnQgLSBvZmZzZXQubGVmdCArIHBhcnNlSW50KGVsZW1lbnRXaWR0aCAvIDIsIDEwKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB2aWV3cG9ydC50b3A7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB2aWV3cG9ydC5ib3R0b20gLSB2aWV3cG9ydC50b3A7XG5cbiAgICAgICAgY29uc3QgeSA9IHNjcm9sbFRvcCAtIG9mZnNldC50b3AgKyBwYXJzZUludChlbGVtZW50SGVpZ2h0IC8gMiwgMTApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGFnZVJlZ2lvbkZyb21QYWdlSW5mbyAocGFnZSlcbntcbiAgICBjb25zdCB0b3AgICAgPSBwYWdlLmdyb3VwT2Zmc2V0LnRvcCAgKyBwYWdlLmdyb3VwLnJlZ2lvbi50b3A7XG4gICAgY29uc3QgYm90dG9tID0gdG9wICsgcGFnZS5kaW1lbnNpb25zLmhlaWdodDtcbiAgICBjb25zdCBsZWZ0ICAgPSBwYWdlLmdyb3VwT2Zmc2V0LmxlZnQgKyBwYWdlLmdyb3VwLnJlZ2lvbi5sZWZ0O1xuICAgIGNvbnN0IHJpZ2h0ICA9IGxlZnQgKyBwYWdlLmRpbWVuc2lvbnMud2lkdGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgYm90dG9tOiBib3R0b20sXG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhZ2VMb29rdXAgKHBhZ2VHcm91cHMpXG57XG4gICAgY29uc3QgcGFnZUxvb2t1cCA9IHt9O1xuXG4gICAgcGFnZUdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgZ3JvdXAucGFnZXMuZm9yRWFjaChwYWdlID0+IHtcbiAgICAgICAgICAgIHBhZ2VMb29rdXBbcGFnZS5pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHBhZ2UuaW5kZXgsXG4gICAgICAgICAgICAgICAgZ3JvdXA6IGdyb3VwLFxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IHBhZ2UuZGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICBncm91cE9mZnNldDogcGFnZS5ncm91cE9mZnNldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFnZUxvb2t1cDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRMYXlvdXQgKGNvbmZpZywgem9vbUxldmVsKVxue1xuICAgIGNvbnN0IHNjYWxlZExheW91dHMgPSB6b29tTGV2ZWwgPT09IG51bGwgPyBjb25maWcucGFnZUxheW91dHMgOiBnZXRTY2FsZWRQYWdlTGF5b3V0cyhjb25maWcsIHpvb21MZXZlbCk7XG5cbiAgICBjb25zdCBkb2N1bWVudFNlY29uZGFyeUV4dGVudCA9IGdldEV4dGVudEFsb25nU2Vjb25kYXJ5QXhpcyhjb25maWcsIHNjYWxlZExheW91dHMpO1xuXG4gICAgLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IGFsb25nIHRoZSBwcmltYXJ5IGF4aXNcbiAgICBsZXQgcHJpbWFyeURvY1Bvc2l0aW9uID0gY29uZmlnLnZlcnRpY2FsbHlPcmllbnRlZCA/XG4gICAgICAgIGNvbmZpZy5wYWRkaW5nLmRvY3VtZW50LnRvcCA6XG4gICAgICAgIGNvbmZpZy5wYWRkaW5nLmRvY3VtZW50LmxlZnQ7XG5cbiAgICBjb25zdCBwYWdlR3JvdXBzID0gW107XG5cbiAgICAvLyBUT0RPOiBVc2UgYm90dG9tLCByaWdodCBhcyB3ZWxsXG4gICAgY29uc3QgcGFnZVBhZGRpbmcgPSB7XG4gICAgICAgIHRvcDogY29uZmlnLnBhZGRpbmcucGFnZS50b3AsXG4gICAgICAgIGxlZnQ6IGNvbmZpZy5wYWRkaW5nLnBhZ2UubGVmdFxuICAgIH07XG5cbiAgICBzY2FsZWRMYXlvdXRzLmZvckVhY2goKGxheW91dCwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHRvcCwgbGVmdDtcblxuICAgICAgICBpZiAoY29uZmlnLnZlcnRpY2FsbHlPcmllbnRlZClcbiAgICAgICAge1xuICAgICAgICAgICAgdG9wID0gcHJpbWFyeURvY1Bvc2l0aW9uO1xuICAgICAgICAgICAgbGVmdCA9IChkb2N1bWVudFNlY29uZGFyeUV4dGVudCAtIGxheW91dC5kaW1lbnNpb25zLndpZHRoKSAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0b3AgPSAoZG9jdW1lbnRTZWNvbmRhcnlFeHRlbnQgLSBsYXlvdXQuZGltZW5zaW9ucy5oZWlnaHQpIC8gMjtcbiAgICAgICAgICAgIGxlZnQgPSBwcmltYXJ5RG9jUG9zaXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWdpb24gPSB7XG4gICAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogdG9wICsgcGFnZVBhZGRpbmcudG9wICsgbGF5b3V0LmRpbWVuc2lvbnMuaGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiBsZWZ0ICsgcGFnZVBhZGRpbmcubGVmdCArIGxheW91dC5kaW1lbnNpb25zLndpZHRoXG4gICAgICAgIH07XG5cbiAgICAgICAgcGFnZUdyb3Vwcy5wdXNoKHtcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGxheW91dC5kaW1lbnNpb25zLFxuICAgICAgICAgICAgcGFnZXM6IGxheW91dC5wYWdlcyxcbiAgICAgICAgICAgIHJlZ2lvbjogcmVnaW9uLFxuICAgICAgICAgICAgcGFkZGluZzogcGFnZVBhZGRpbmdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJpbWFyeURvY1Bvc2l0aW9uID0gY29uZmlnLnZlcnRpY2FsbHlPcmllbnRlZCA/IHJlZ2lvbi5ib3R0b20gOiByZWdpb24ucmlnaHQ7XG4gICAgfSk7XG5cbiAgICBsZXQgaGVpZ2h0LCB3aWR0aDtcblxuICAgIGlmIChjb25maWcudmVydGljYWxseU9yaWVudGVkKVxuICAgIHtcbiAgICAgICAgaGVpZ2h0ID0gcHJpbWFyeURvY1Bvc2l0aW9uICsgcGFnZVBhZGRpbmcudG9wO1xuICAgICAgICB3aWR0aCA9IGRvY3VtZW50U2Vjb25kYXJ5RXh0ZW50O1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBoZWlnaHQgPSBkb2N1bWVudFNlY29uZGFyeUV4dGVudDtcbiAgICAgICAgd2lkdGggPSBwcmltYXJ5RG9jUG9zaXRpb24gKyBwYWdlUGFkZGluZy5sZWZ0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICAgIH0sXG4gICAgICAgIHBhZ2VHcm91cHM6IHBhZ2VHcm91cHNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZWRQYWdlTGF5b3V0cyAoY29uZmlnLCB6b29tTGV2ZWwpXG57XG4gICAgY29uc3Qgc2NhbGVSYXRpbyA9IE1hdGgucG93KDIsIHpvb21MZXZlbCAtIGNvbmZpZy5tYXhab29tTGV2ZWwpO1xuXG4gICAgcmV0dXJuIGNvbmZpZy5wYWdlTGF5b3V0cy5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgICAgZGltZW5zaW9uczogc2NhbGVEaW1lbnNpb25zKGdyb3VwLmRpbWVuc2lvbnMsIHNjYWxlUmF0aW8pLFxuXG4gICAgICAgIHBhZ2VzOiBncm91cC5wYWdlcy5tYXAocGFnZSA9PiAoe1xuICAgICAgICAgICAgaW5kZXg6IHBhZ2UuaW5kZXgsXG5cbiAgICAgICAgICAgIGdyb3VwT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgdG9wOiBNYXRoLmZsb29yKHBhZ2UuZ3JvdXBPZmZzZXQudG9wICogc2NhbGVSYXRpbyksXG4gICAgICAgICAgICAgICAgbGVmdDogTWF0aC5mbG9vcihwYWdlLmdyb3VwT2Zmc2V0LmxlZnQgKiBzY2FsZVJhdGlvKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZGltZW5zaW9uczogc2NhbGVEaW1lbnNpb25zKHBhZ2UuZGltZW5zaW9ucywgc2NhbGVSYXRpbylcbiAgICAgICAgfSkpXG4gICAgfSkpO1xufVxuXG5mdW5jdGlvbiBzY2FsZURpbWVuc2lvbnMgKGRpbWVuc2lvbnMsIHNjYWxlUmF0aW8pXG57XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmZsb29yKGRpbWVuc2lvbnMuaGVpZ2h0ICogc2NhbGVSYXRpbyksXG4gICAgICAgIHdpZHRoOiBNYXRoLmZsb29yKGRpbWVuc2lvbnMud2lkdGggKiBzY2FsZVJhdGlvKVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4dGVudEFsb25nU2Vjb25kYXJ5QXhpcyAoY29uZmlnLCBzY2FsZWRMYXlvdXRzKVxue1xuICAgIC8vIEdldCB0aGUgZXh0ZW50IG9mIHRoZSBkb2N1bWVudCBhbG9uZyB0aGUgc2Vjb25kYXJ5IGF4aXNcbiAgICBsZXQgc2Vjb25kYXJ5RGltLCBzZWNvbmRhcnlQYWRkaW5nO1xuICAgIGNvbnN0IGRvY1BhZGRpbmcgPSBjb25maWcucGFkZGluZy5kb2N1bWVudDtcblxuICAgIGlmIChjb25maWcudmVydGljYWxseU9yaWVudGVkKVxuICAgIHtcbiAgICAgICAgc2Vjb25kYXJ5RGltID0gJ3dpZHRoJztcbiAgICAgICAgc2Vjb25kYXJ5UGFkZGluZyA9IGRvY1BhZGRpbmcubGVmdCArIGRvY1BhZGRpbmcucmlnaHQ7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHNlY29uZGFyeURpbSA9ICdoZWlnaHQnO1xuICAgICAgICBzZWNvbmRhcnlQYWRkaW5nID0gZG9jUGFkZGluZy50b3AgKyBkb2NQYWRkaW5nLmJvdHRvbTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2Vjb25kYXJ5UGFkZGluZyArIHNjYWxlZExheW91dHMucmVkdWNlKChtYXhEaW0sIGxheW91dCkgPT4gTWF0aC5tYXgobGF5b3V0LmRpbWVuc2lvbnNbc2Vjb25kYXJ5RGltXSwgbWF4RGltKSwgMCk7XG59XG4iLCJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2RpdmE6SW1hZ2VDYWNoZScpO1xuXG4vKiBGSVhNRSh3YWJhaW4pOiBUaGUgY2FjaGluZyBzdHJhdGVneSBoZXJlIGlzIGNvbXBsZXRlbHlcbiAqIGFyYml0cmFyeSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGlzbid0IGVzcGVjaWFsbHkgZWZmaWNpZW50LlxuICovXG5jb25zdCBERUZBVUxUX01BWF9LRVlTID0gMTAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUNhY2hlXG57XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnMpXG4gICAge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7IG1heEtleXM6IERFRkFVTFRfTUFYX0tFWVMgfTtcbiAgICAgICAgdGhpcy5tYXhLZXlzID0gb3B0aW9ucy5tYXhLZXlzIHx8IERFRkFVTFRfTUFYX0tFWVM7XG5cbiAgICAgICAgdGhpcy5faGVsZCA9IHt9O1xuICAgICAgICB0aGlzLl91cmxzID0ge307XG4gICAgICAgIHRoaXMuX2xydSA9IFtdO1xuICAgIH1cblxuICAgIGdldCAodXJsKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5fdXJsc1t1cmxdO1xuICAgICAgICByZXR1cm4gcmVjb3JkID8gcmVjb3JkLmltZyA6IG51bGw7XG4gICAgfVxuXG4gICAgaGFzICh1cmwpXG4gICAge1xuICAgICAgICByZXR1cm4gISF0aGlzLl91cmxzW3VybF07XG4gICAgfVxuXG4gICAgcHV0ICh1cmwsIGltZylcbiAgICB7XG4gICAgICAgIGxldCByZWNvcmQgPSB0aGlzLl91cmxzW3VybF07XG4gICAgICAgIGlmIChyZWNvcmQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBEb2VzIHRoaXMgbWFrZSBzZW5zZSBmb3IgdGhpcyB1c2UgY2FzZT9cbiAgICAgICAgICAgIHJlY29yZC5pbWcgPSBpbWc7XG4gICAgICAgICAgICB0aGlzLl9wcm9tb3RlKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICByZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgaW1nOiBpbWcsXG4gICAgICAgICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuX3VybHNbdXJsXSA9IHJlY29yZDtcbiAgICAgICAgICAgIHRoaXMuX3RyeUV2aWN0KDEpO1xuICAgICAgICAgICAgdGhpcy5fbHJ1LnVuc2hpZnQocmVjb3JkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9wcm9tb3RlIChyZWNvcmQpXG4gICAge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xydS5pbmRleE9mKHJlY29yZCk7XG4gICAgICAgIHRoaXMuX2xydS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLl9scnUudW5zaGlmdChyZWNvcmQpO1xuICAgIH1cblxuICAgIF90cnlFdmljdCAoZXh0cmFDYXBhY2l0eSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRFbnRyeUNvdW50ID0gdGhpcy5tYXhLZXlzIC0gZXh0cmFDYXBhY2l0eTtcblxuICAgICAgICBpZiAodGhpcy5fbHJ1Lmxlbmd0aCA8PSBhbGxvd2VkRW50cnlDb3VudClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBsZXQgZXZpY3Rpb25JbmRleCA9IHRoaXMuX2xydS5sZW5ndGggLSAxO1xuXG4gICAgICAgIGZvciAoOzspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuX2xydVtldmljdGlvbkluZGV4XTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9oZWxkW3RhcmdldC51cmxdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdFdmljdGluZyBpbWFnZSAlcycsIHRhcmdldC51cmwpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xydS5zcGxpY2UoZXZpY3Rpb25JbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3VybHNbdGFyZ2V0LnVybF07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbHJ1Lmxlbmd0aCA8PSBhbGxvd2VkRW50cnlDb3VudClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmljdGlvbkluZGV4ID09PSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICAgICAgZGVidWcuZW5hYmxlZCAmJiBkZWJ1ZygnQ2FjaGUgb3ZlcmZ1bGwgYnkgJXMgKGFsbCBlbnRyaWVzIGFyZSBiZWluZyBoZWxkKScsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xydS5sZW5ndGggLSBhbGxvd2VkRW50cnlDb3VudCk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXZpY3Rpb25JbmRleC0tO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWNxdWlyZSAodXJsKVxuICAgIHtcbiAgICAgICAgdGhpcy5faGVsZFt1cmxdID0gKHRoaXMuX2hlbGRbdXJsXSB8fCAwKSArIDE7XG4gICAgICAgIHRoaXMuX3Byb21vdGUodGhpcy5fdXJsc1t1cmxdKTtcbiAgICB9XG5cbiAgICByZWxlYXNlICh1cmwpXG4gICAge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuX2hlbGRbdXJsXTtcblxuICAgICAgICBpZiAoY291bnQgPiAxKVxuICAgICAgICAgICAgdGhpcy5faGVsZFt1cmxdLS07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9oZWxkW3VybF07XG5cbiAgICAgICAgdGhpcy5fdHJ5RXZpY3QoMCk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBIYW5kbGVyIGZvciB0aGUgcmVxdWVzdCBmb3IgYW4gaW1hZ2UgdGlsZVxuICpcbiAqIEBwYXJhbSB1cmxcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlUmVxdWVzdEhhbmRsZXJcbntcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIHRoaXMuX3VybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IG9wdGlvbnMubG9hZDtcbiAgICAgICAgdGhpcy5fZXJyb3JDYWxsYmFjayA9IG9wdGlvbnMuZXJyb3I7XG4gICAgICAgIHRoaXMudGltZW91dFRpbWUgPSBvcHRpb25zLnRpbWVvdXRUaW1lIHx8IDA7XG4gICAgICAgIHRoaXMuX2Fib3J0ZWQgPSB0aGlzLl9jb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jcm9zc09yaWdpbiA9IG9wdGlvbnMuc2V0dGluZ3MuaW1hZ2VDcm9zc09yaWdpbjtcblxuICAgICAgICAvL1VzZSBhIHRpbWVvdXQgdG8gYWxsb3cgdGhlIHJlcXVlc3RzIHRvIGJlIGRlYm91bmNlZCAoYXMgdGhleSBhcmUgaW4gcmVuZGVyZXIpXG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gSW5pdGlhdGUgdGhlIHJlcXVlc3RcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICB0aGlzLl9pbWFnZS5jcm9zc09yaWdpbiA9IHRoaXMuX2Nyb3NzT3JpZ2luO1xuICAgICAgICAgICAgdGhpcy5faW1hZ2Uub25sb2FkID0gdGhpcy5faGFuZGxlTG9hZC5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5faW1hZ2Uub25lcnJvciA9IHRoaXMuX2hhbmRsZUVycm9yLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbWFnZS5zcmMgPSBvcHRpb25zLnVybDtcblxuICAgICAgICB9LCB0aGlzLnRpbWVvdXRUaW1lKTtcbiAgICB9XG5cbiAgICBhYm9ydCAoKVxuICAgIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICAgICAgLy8gRklYTUVcbiAgICAgICAgLy8gUGVvcGxlIG9uIHRoZSBJbnRlcm5ldCBzYXkgdGhhdCBkb2luZyB0aGlzIHt7c2hvdWxkL3Nob3VsZCBub3R9fSBhYm9ydCB0aGUgcmVxdWVzdC4gSSBiZWxpZXZlXG4gICAgICAgIC8vIGl0IGNvcnJlc3BvbmRzIHRvIHdoYXQgdGhlIFdIQVRXRyBIVE1MIHNwZWMgc2F5cyBzaG91bGQgaGFwcGVuIHdoZW4gdGhlIFVBXG4gICAgICAgIC8vIHVwZGF0ZXMgdGhlIGltYWdlIGRhdGEgaWYgc2VsZWN0ZWQgc291cmNlIGlzIG51bGwuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNvdXJjZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0aGUtaW1nLWVsZW1lbnRcbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83MzkwODg4L2RvZXMtY2hhbmdpbmctdGhlLXNyYy1hdHRyaWJ1dGUtb2YtYW4taW1hZ2Utc3RvcC10aGUtaW1hZ2UtZnJvbS1kb3dubG9hZGluZ1xuICAgICAgICBpZiAodGhpcy5faW1hZ2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2ltYWdlLm9ubG9hZCA9IHRoaXMuX2ltYWdlLm9uZXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLl9pbWFnZS5zcmMgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Fib3J0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIF9oYW5kbGVMb2FkICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fYWJvcnRlZClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW1hZ2VSZXF1ZXN0SGFuZGxlciBpbnZva2VkIG9uIGNhbmNlbGxlZCByZXF1ZXN0IGZvciAnICsgdGhpcy5fdXJsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb21wbGV0ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW1hZ2VSZXF1ZXN0SGFuZGxlciBpbnZva2VkIG9uIGNvbXBsZXRlZCByZXF1ZXN0IGZvciAnICsgdGhpcy5fdXJsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbXBsZXRlID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9jYWxsYmFjayh0aGlzLl9pbWFnZSk7XG4gICAgfVxuXG4gICAgX2hhbmRsZUVycm9yICgpXG4gICAge1xuICAgICAgICB0aGlzLl9lcnJvckNhbGxiYWNrKHRoaXMuX2ltYWdlKTtcbiAgICB9XG59XG4iLCIvLyBUT0RPOiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZmFsbGJhY2tcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGFuaW1hdGUsXG4gICAgZWFzaW5nOiB7XG4gICAgICAgIGxpbmVhcjogbGluZWFyRWFzaW5nLFxuICAgICAgICBjdWJpYzogaW5PdXRDdWJpY0Vhc2luZ1xuICAgIH1cbn07XG5cbmxldCBub3c7XG5cbmlmICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHBlcmZvcm1hbmNlLm5vdylcbntcbiAgICBub3cgPSAoKSA9PiB7IHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsgfTtcbn1cbmVsc2VcbntcbiAgICBub3cgPSAoKSA9PiB7IHJldHVybiBEYXRlLm5vdygpOyB9O1xufVxuXG5cbmZ1bmN0aW9uIGFuaW1hdGUgKG9wdGlvbnMpXG57XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IG9wdGlvbnMuZHVyYXRpb247XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycztcbiAgICBjb25zdCBvblVwZGF0ZSA9IG9wdGlvbnMub25VcGRhdGU7XG4gICAgY29uc3Qgb25FbmQgPSBvcHRpb25zLm9uRW5kO1xuXG4gICAgLy8gU2V0dXBcbiAgICAvLyBUaW1lcyBhcmUgaW4gbWlsbGlzZWNvbmRzIGZyb20gYSBiYXNpY2FsbHkgYXJiaXRyYXJ5IHN0YXJ0XG4gICAgY29uc3Qgc3RhcnQgPSBub3coKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGR1cmF0aW9uTXM7XG5cbiAgICBjb25zdCB0d2VlbkZucyA9IHt9O1xuICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgIGNvbnN0IHBhcmFtS2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpO1xuXG4gICAgcGFyYW1LZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gcGFyYW1ldGVyc1trZXldO1xuICAgICAgICB0d2VlbkZuc1trZXldID0gaW50ZXJwb2xhdGUoY29uZmlnLmZyb20sIGNvbmZpZy50bywgY29uZmlnLmVhc2luZyB8fCBpbk91dEN1YmljRWFzaW5nKTtcbiAgICB9KTtcblxuICAgIC8vIFJ1biBpdCFcbiAgICBsZXQgcmVxdWVzdElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWwoKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdElkICE9PSBudWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgaGFuZGxlQW5pbWF0aW9uQ29tcGxldGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGludGVycnVwdGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlKClcbiAgICB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBub3coKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IE1hdGgubWluKChjdXJyZW50IC0gc3RhcnQpIC8gZHVyYXRpb25NcywgMSk7XG5cbiAgICAgICAgdXBkYXRlVmFsdWVzKGVsYXBzZWQpO1xuICAgICAgICBvblVwZGF0ZSh2YWx1ZXMpO1xuXG4gICAgICAgIGlmIChjdXJyZW50IDwgZW5kKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZUFuaW1hdGlvbkNvbXBsZXRpb24oe1xuICAgICAgICAgICAgICAgIGludGVycnVwdGVkOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVWYWx1ZXMoZWxhcHNlZClcbiAgICB7XG4gICAgICAgIHBhcmFtS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHR3ZWVuRm5zW2tleV0oZWxhcHNlZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUFuaW1hdGlvbkNvbXBsZXRpb24oaW5mbylcbiAgICB7XG4gICAgICAgIHJlcXVlc3RJZCA9IG51bGw7XG5cbiAgICAgICAgaWYgKG9uRW5kKVxuICAgICAgICAgICAgb25FbmQoaW5mbyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZShzdGFydCwgZW5kLCBlYXNpbmcpXG57XG4gICAgcmV0dXJuIChlbGFwc2VkKSA9PiB7IHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiBlYXNpbmcoZWxhcHNlZCk7IH07XG59XG5cbi8qKlxuICogRWFzaW5nIGZ1bmN0aW9ucy4gaW5PdXRDdWJpY0Vhc2luZyBpcyB0aGUgZGVmYXVsdCwgYnV0XG4gKiBvdGhlcnMgYXJlIGdpdmVuIGZvciBjb252ZW5pZW5jZS5cbiAqXG4gKiovXG5mdW5jdGlvbiBsaW5lYXJFYXNpbmcoZSlcbntcbiAgICByZXR1cm4gZTtcbn1cblxuLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuZnVuY3Rpb24gaW5PdXRRdWFkRWFzaW5nIChlKVxue1xuICAgIHJldHVybiBlIDwgLjUgPyAyICogZSAqIGUgOiAtMSsoNC0yICogZSkgKiBlXG59XG4vKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cbmZ1bmN0aW9uIGluT3V0Q3ViaWNFYXNpbmcgKHQpXG57XG4gICAgcmV0dXJuIHQgPCAwLjUgPyA0ICogdCAqIHQgKiB0IDogKCB0IC0gMSApICogKCAyICogdCAtIDIgKSAqICggMiAqIHQgLSAyICkgKyAxO1xufVxuIiwiaW1wb3J0IHsgZWx0LCBzZXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi91dGlscy9lbHQnO1xuaW1wb3J0IENvbXBvc2l0ZUltYWdlIGZyb20gJy4vY29tcG9zaXRlLWltYWdlJztcbmltcG9ydCBEb2N1bWVudExheW91dCBmcm9tICcuL2RvY3VtZW50LWxheW91dCc7XG5pbXBvcnQgSW1hZ2VDYWNoZSBmcm9tICcuL2ltYWdlLWNhY2hlJztcbmltcG9ydCBJbWFnZVJlcXVlc3RIYW5kbGVyIGZyb20gJy4vaW1hZ2UtcmVxdWVzdC1oYW5kbGVyJztcbmltcG9ydCBJbnRlcnBvbGF0ZUFuaW1hdGlvbiBmcm9tICcuL2ludGVycG9sYXRlLWFuaW1hdGlvbic7XG5cbmNvbnN0IFJFUVVFU1RfREVCT1VOQ0VfSU5URVJWQUwgPSAyNTA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbmRlcmVyXG57XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnMsIGhvb2tzKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdmlld3BvcnQgPSBvcHRpb25zLnZpZXdwb3J0O1xuICAgICAgICB0aGlzLl9vdXRlckVsZW1lbnQgPSBvcHRpb25zLm91dGVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRFbGVtZW50ID0gb3B0aW9ucy5pbm5lckVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gb3B0aW9ucy5zZXR0aW5ncztcblxuICAgICAgICB0aGlzLl9ob29rcyA9IGhvb2tzIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuX2NhbnZhcyA9IGVsdCgnY2FudmFzJywgeyBjbGFzczogJ2RpdmEtdmlld2VyLWNhbnZhcycgfSk7XG4gICAgICAgIHRoaXMuX2N0eCA9IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICAgIHRoaXMubGF5b3V0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9zb3VyY2VSZXNvbHZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkUGFnZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLl96b29tTGV2ZWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9jb21wb3NpdGVJbWFnZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZFRpbGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uID0gbnVsbDtcblxuICAgICAgICAvLyBGSVhNRSh3YWJhaW4pOiBXaGF0IGxldmVsIHNob3VsZCB0aGlzIGJlIG1haW50YWluZWQgYXQ/XG4gICAgICAgIC8vIERpdmEgZ2xvYmFsP1xuICAgICAgICB0aGlzLl9jYWNoZSA9IG5ldyBJbWFnZUNhY2hlKCk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdSZXF1ZXN0cyA9IHt9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRDb21wYXRpYmlsaXR5RXJyb3JzICgpXG4gICAge1xuICAgICAgICBpZiAodHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ1lvdXIgYnJvd3NlciBsYWNrcyBzdXBwb3J0IGZvciB0aGUgJywgZWx0KCdwcmUnLCAnY2FudmFzJyksXG4gICAgICAgICAgICAnIGVsZW1lbnQuIFBsZWFzZSB1cGdyYWRlIHlvdXIgYnJvd3Nlci4nXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgbG9hZCAoY29uZmlnLCB2aWV3cG9ydFBvc2l0aW9uLCBzb3VyY2VSZXNvbHZlcilcbiAgICB7XG4gICAgICAgIHRoaXMuX2NsZWFyQW5pbWF0aW9uKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2hvb2tzLm9uVmlld1dpbGxMb2FkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9ob29rcy5vblZpZXdXaWxsTG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc291cmNlUmVzb2x2ZXIgPSBzb3VyY2VSZXNvbHZlcjtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLl9jb21wb3NpdGVJbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fc2V0TGF5b3V0VG9ab29tTGV2ZWwodmlld3BvcnRQb3NpdGlvbi56b29tTGV2ZWwpO1xuXG4gICAgICAgIC8vIEZJWE1FKHdhYmFpbik6IFJlbW92ZSB0aGlzIHdoZW4gdGhlcmUncyBtb3JlIGNvbmZpZGVuY2UgdGhlIGNoZWNrIHNob3VsZG4ndCBiZSBuZWVkZWRcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dC5nZXRQYWdlSW5mbyh2aWV3cG9ydFBvc2l0aW9uLmFuY2hvclBhZ2UpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGFnZTogJyArIHZpZXdwb3J0UG9zaXRpb24uYW5jaG9yUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY2FudmFzLndpZHRoICE9PSB0aGlzLl92aWV3cG9ydC53aWR0aCB8fCB0aGlzLl9jYW52YXMuaGVpZ2h0ICE9PSB0aGlzLl92aWV3cG9ydC5oZWlnaHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IHRoaXMuX3ZpZXdwb3J0LndpZHRoO1xuICAgICAgICAgICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IHRoaXMuX3ZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJWE1FOiBXaGF0IGhvb2tzIHNob3VsZCBiZSBjYWxsZWQgaGVyZT9cbiAgICAgICAgdGhpcy5nb3RvKHZpZXdwb3J0UG9zaXRpb24uYW5jaG9yUGFnZSwgdmlld3BvcnRQb3NpdGlvbi52ZXJ0aWNhbE9mZnNldCwgdmlld3BvcnRQb3NpdGlvbi5ob3Jpem9udGFsT2Zmc2V0KTtcblxuICAgICAgICBpZiAodGhpcy5fY2FudmFzLnBhcmVudE5vZGUgIT09IHRoaXMuX291dGVyRWxlbWVudClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fb3V0ZXJFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9jYW52YXMsIHRoaXMuX291dGVyRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9ob29rcy5vblZpZXdEaWRMb2FkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9ob29rcy5vblZpZXdEaWRMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2V0Vmlld3BvcnRQb3NpdGlvbiAodmlld3BvcnRQb3NpdGlvbilcbiAgICB7XG4gICAgICAgIGlmICh2aWV3cG9ydFBvc2l0aW9uLnpvb21MZXZlbCAhPT0gdGhpcy5fem9vbUxldmVsKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy5fem9vbUxldmVsID09PSBudWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjdXJyZW50IHZpZXcgaXMgbm90IHpvb21hYmxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2aWV3cG9ydFBvc2l0aW9uLnpvb21MZXZlbCA9PT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY3VycmVudCB2aWV3IHJlcXVpcmVzIGEgem9vbSBsZXZlbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zZXRMYXlvdXRUb1pvb21MZXZlbCh2aWV3cG9ydFBvc2l0aW9uLnpvb21MZXZlbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9nb3RvKHZpZXdwb3J0UG9zaXRpb24uYW5jaG9yUGFnZSwgdmlld3BvcnRQb3NpdGlvbi52ZXJ0aWNhbE9mZnNldCwgdmlld3BvcnRQb3NpdGlvbi5ob3Jpem9udGFsT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBfc2V0TGF5b3V0VG9ab29tTGV2ZWwgKHpvb21MZXZlbClcbiAgICB7XG4gICAgICAgIHRoaXMubGF5b3V0ID0gbmV3IERvY3VtZW50TGF5b3V0KHRoaXMuX2NvbmZpZywgem9vbUxldmVsKTtcbiAgICAgICAgdGhpcy5fem9vbUxldmVsID0gem9vbUxldmVsO1xuXG4gICAgICAgIHNldEF0dHJpYnV0ZXModGhpcy5fZG9jdW1lbnRFbGVtZW50LCB7XG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5sYXlvdXQuZGltZW5zaW9ucy5oZWlnaHQgKyAncHgnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmxheW91dC5kaW1lbnNpb25zLndpZHRoICsgJ3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl92aWV3cG9ydC5zZXRJbm5lckRpbWVuc2lvbnModGhpcy5sYXlvdXQuZGltZW5zaW9ucyk7XG4gICAgfVxuXG4gICAgYWRqdXN0ICgpXG4gICAge1xuICAgICAgICB0aGlzLl9jbGVhckFuaW1hdGlvbigpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLl9ob29rcy5vblZpZXdEaWRVcGRhdGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2hvb2tzLm9uVmlld0RpZFVwZGF0ZSh0aGlzLl9yZW5kZXJlZFBhZ2VzLnNsaWNlKCksIG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlbmRlciAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRQYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmxheW91dC5wYWdlR3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0LmludGVyc2VjdHNSZWdpb24oZ3JvdXAucmVnaW9uKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVQYWdlcyA9IGdyb3VwLnBhZ2VzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAocGFnZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzUGFnZVZpc2libGUocGFnZS5pbmRleCk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgICAgICAgICAubWFwKHBhZ2UgPT4gcGFnZS5pbmRleCk7XG5cbiAgICAgICAgICAgIG5ld1JlbmRlcmVkUGFnZXMucHVzaC5hcHBseShuZXdSZW5kZXJlZFBhZ2VzLCB2aXNpYmxlUGFnZXMpO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICB0aGlzLl9jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuX2NhbnZhcy53aWR0aCwgdGhpcy5fY2FudmFzLmhlaWdodCk7XG4gICAgICAgIHRoaXMuX3BhaW50T3V0bGluZShuZXdSZW5kZXJlZFBhZ2VzKTtcblxuICAgICAgICBuZXdSZW5kZXJlZFBhZ2VzLmZvckVhY2goKHBhZ2VJbmRleCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jb21wb3NpdGVJbWFnZXNbcGFnZUluZGV4XSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5sYXlvdXQuZ2V0UGFnZUluZm8ocGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tTGV2ZWxzID0gdGhpcy5fc291cmNlUmVzb2x2ZXIuZ2V0QWxsWm9vbUxldmVsc0ZvclBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUltYWdlKHpvb21MZXZlbHMpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS51cGRhdGVGcm9tQ2FjaGUodGhpcy5fY2FjaGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0ZUltYWdlc1twYWdlSW5kZXhdID0gY29tcG9zaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICB0aGlzLl9pbml0aWF0ZVRpbGVSZXF1ZXN0cyhuZXdSZW5kZXJlZFBhZ2VzKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gZmluZENoYW5nZXModGhpcy5fcmVuZGVyZWRQYWdlcyB8fCBbXSwgbmV3UmVuZGVyZWRQYWdlcyk7XG5cbiAgICAgICAgY2hhbmdlcy5yZW1vdmVkLmZvckVhY2goKHBhZ2VJbmRleCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBvc2l0ZUltYWdlc1twYWdlSW5kZXhdO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJlZFBhZ2VzID0gbmV3UmVuZGVyZWRQYWdlcztcbiAgICAgICAgdGhpcy5fcGFpbnQoKTtcblxuICAgICAgICBpZiAodGhpcy5faG9va3Mub25QYWdlV2lsbExvYWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNoYW5nZXMuYWRkZWQuZm9yRWFjaCgocGFnZUluZGV4KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvb2tzLm9uUGFnZVdpbGxMb2FkKHBhZ2VJbmRleCk7XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9wYWludCAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZWRUaWxlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcmVkUGFnZXMuZm9yRWFjaCggKHBhZ2VJbmRleCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRlSW1hZ2VzW3BhZ2VJbmRleF0uZ2V0VGlsZXModGhpcy5fem9vbUxldmVsKS5mb3JFYWNoKChzb3VyY2UpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVkID0gZ2V0U2NhbGVkVGlsZVJlY29yZChzb3VyY2UsIHRoaXMuX3pvb21MZXZlbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNUaWxlVmlzaWJsZShwYWdlSW5kZXgsIHNjYWxlZCkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZFRpbGVzLnB1c2goc291cmNlLnVybCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdUaWxlKHBhZ2VJbmRleCwgc2NhbGVkLCB0aGlzLl9jYWNoZS5nZXQoc291cmNlLnVybCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlO1xuXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBmaW5kQ2hhbmdlcyh0aGlzLl9yZW5kZXJlZFRpbGVzIHx8IFtdLCByZW5kZXJlZFRpbGVzKTtcblxuICAgICAgICBjaGFuZ2VzLmFkZGVkLmZvckVhY2godXJsID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhY2hlLmFjcXVpcmUodXJsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2hhbmdlcy5yZW1vdmVkLmZvckVhY2godXJsID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhY2hlLnJlbGVhc2UodXJsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNoYW5nZXMucmVtb3ZlZClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gRklYTUU6IFNob3VsZCBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBjb21wb3NpdGUgaW1hZ2VzXG4gICAgICAgICAgICAvLyBmb3Igd2hpY2ggdGlsZXMgd2VyZSByZW1vdmVkXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlZFBhZ2VzLmZvckVhY2goKHBhZ2VJbmRleCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdGVJbWFnZXNbcGFnZUluZGV4XS51cGRhdGVGcm9tQ2FjaGUodGhpcy5fY2FjaGUpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW5kZXJlZFRpbGVzID0gcmVuZGVyZWRUaWxlcztcbiAgICB9XG5cbiAgICAvLyBQYWludCBhIHBhZ2Ugb3V0bGluZSB3aGlsZSB0aGUgdGlsZXMgYXJlIGxvYWRpbmcuXG4gICAgX3BhaW50T3V0bGluZSAocGFnZXMpXG4gICAge1xuICAgICAgICBwYWdlcy5mb3JFYWNoKCAocGFnZUluZGV4KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcGFnZUluZm8gPSB0aGlzLmxheW91dC5nZXRQYWdlSW5mbyhwYWdlSW5kZXgpO1xuICAgICAgICAgICAgbGV0IHBhZ2VPZmZzZXQgPSB0aGlzLl9nZXRJbWFnZU9mZnNldChwYWdlSW5kZXgpO1xuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGRvY3VtZW50IGlzIGRyYXduIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgICAgICBsZXQgdmlld3BvcnRQYWRkaW5nWCA9IE1hdGgubWF4KDAsICh0aGlzLl92aWV3cG9ydC53aWR0aCAtIHRoaXMubGF5b3V0LmRpbWVuc2lvbnMud2lkdGgpIC8gMik7XG4gICAgICAgICAgICBsZXQgdmlld3BvcnRQYWRkaW5nWSA9IE1hdGgubWF4KDAsICh0aGlzLl92aWV3cG9ydC5oZWlnaHQgLSB0aGlzLmxheW91dC5kaW1lbnNpb25zLmhlaWdodCkgLyAyKTtcblxuICAgICAgICAgICAgbGV0IHZpZXdwb3J0T2Zmc2V0WCA9IHBhZ2VPZmZzZXQubGVmdCAtIHRoaXMuX3ZpZXdwb3J0LmxlZnQgKyB2aWV3cG9ydFBhZGRpbmdYO1xuICAgICAgICAgICAgbGV0IHZpZXdwb3J0T2Zmc2V0WSA9IHBhZ2VPZmZzZXQudG9wIC0gdGhpcy5fdmlld3BvcnQudG9wICsgdmlld3BvcnRQYWRkaW5nWTtcblxuICAgICAgICAgICAgbGV0IGRlc3RYT2Zmc2V0ID0gdmlld3BvcnRPZmZzZXRYIDwgMCA/IC12aWV3cG9ydE9mZnNldFggOiAwO1xuICAgICAgICAgICAgbGV0IGRlc3RZT2Zmc2V0ID0gdmlld3BvcnRPZmZzZXRZIDwgMCA/IC12aWV3cG9ydE9mZnNldFkgOiAwO1xuXG4gICAgICAgICAgICBsZXQgY2FudmFzWCA9IE1hdGgubWF4KDAsIHZpZXdwb3J0T2Zmc2V0WCk7XG4gICAgICAgICAgICBsZXQgY2FudmFzWSA9IE1hdGgubWF4KDAsIHZpZXdwb3J0T2Zmc2V0WSk7XG5cbiAgICAgICAgICAgIGxldCBkZXN0V2lkdGggPSBwYWdlSW5mby5kaW1lbnNpb25zLndpZHRoIC0gZGVzdFhPZmZzZXQ7XG4gICAgICAgICAgICBsZXQgZGVzdEhlaWdodCA9IHBhZ2VJbmZvLmRpbWVuc2lvbnMuaGVpZ2h0IC0gZGVzdFlPZmZzZXQ7XG5cbiAgICAgICAgICAgIHRoaXMuX2N0eC5zdHJva2VTdHlsZSA9ICcjQUFBJztcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGdldCBhIDFweCB3aWRlIGxpbmUgdXNpbmcgc3Ryb2tlcywgd2UgbmVlZCB0byBzdGFydCBhdCBhICdoYWxmIHBpeGVsJ1xuICAgICAgICAgICAgdGhpcy5fY3R4LnN0cm9rZVJlY3QoY2FudmFzWCArIDAuNSwgY2FudmFzWSArIDAuNSwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNlbnQgYWxsIHZpc2libGUgcGFnZXMgYXQgb25jZSBiZWNhdXNlIGl0IHdpbGwgaW5pdGlhdGVcbiAgICAvLyBhbGwgaW1hZ2UgcmVxdWVzdHMgYW5kIGNhbmNlbCBhbnkgcmVtYWluaW5nIGltYWdlIHJlcXVlc3RzLiBJbiB0aGUgY2FzZSB0aGF0XG4gICAgLy8gYSByZXF1ZXN0IGlzIG9uZ29pbmcgYW5kIHRoZSB0aWxlIGlzIHN0aWxsIHZpc2libGUgaW4gdGhlIHZpZXdwb3J0LCB0aGUgb2xkIHJlcXVlc3RcbiAgICAvLyBpcyBrZXB0IGFjdGl2ZSBpbnN0ZWFkIG9mIHJlc3RhcnRpbmcgaXQuIFRoZSBpbWFnZSByZXF1ZXN0cyBhcmUgZ2l2ZW4gYSB0aW1lb3V0XG4gICAgLy8gYmVmb3JlIGxvYWRpbmcgaW4gb3JkZXIgdG8gZGVib3VuY2UgdGhlbSBhbmQgaGF2ZSBhIHNtYWxsIHJlYWN0aW9uIHRpbWVcbiAgICAvLyB0byBjYW5jZWwgdGhlbSBhbmQgYXZvaWQgdXNlbGVzcyByZXF1ZXN0cy5cbiAgICBfaW5pdGlhdGVUaWxlUmVxdWVzdHMgKHBhZ2VzKVxuICAgIHtcbiAgICAgICAgLy8gT25seSByZXF1ZXN0cyBpbiB0aGlzIG9iamVjdCBhcmUga2VwdCBhbGl2ZSwgc2luY2UgYWxsIG90aGVycyBhcmUgbm90IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IG5ld1BlbmRpbmdSZXF1ZXN0cyA9IHt9O1xuXG4gICAgICAgIC8vIFVzZWQgbGF0ZXIgYXMgYSBjbG9zdXJlIHRvIGluaXRpYXRlIHRoZSBpbWFnZSByZXF1ZXN0cyB3aXRoIHRoZSByaWdodCBzb3VyY2UgYW5kIHBhZ2VJbmRleFxuICAgICAgICBjb25zdCBpbml0aWF0ZVJlcXVlc3QgPSAoc291cmNlLCBwYWdlSW5kZXgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZSA9IHRoaXMuX2NvbXBvc2l0ZUltYWdlc1twYWdlSW5kZXhdO1xuXG4gICAgICAgICAgICBuZXdQZW5kaW5nUmVxdWVzdHNbc291cmNlLnVybF0gPSBuZXcgSW1hZ2VSZXF1ZXN0SGFuZGxlcih7XG4gICAgICAgICAgICAgICAgdXJsOiBzb3VyY2UudXJsLFxuICAgICAgICAgICAgICAgIHRpbWVvdXRUaW1lOiBSRVFVRVNUX0RFQk9VTkNFX0lOVEVSVkFMLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLl9zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBsb2FkOiBpbWcgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbc291cmNlLnVybF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLnB1dChzb3VyY2UudXJsLCBpbWcpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEF3a3dhcmQgd2F5IHRvIGNoZWNrIGZvciB1cGRhdGVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUgPT09IHRoaXMuX2NvbXBvc2l0ZUltYWdlc1twYWdlSW5kZXhdKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUudXBkYXRlV2l0aExvYWRlZFVybHMoW3NvdXJjZS51cmxdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzVGlsZUZvclNvdXJjZVZpc2libGUocGFnZUluZGV4LCBzb3VyY2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNUaWxlRm9yU291cmNlVmlzaWJsZShwYWdlSW5kZXgsIHNvdXJjZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFpbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDb3VsZCBtYWtlIGEgbGltaXRlZCBudW1iZXIgb2YgcmV0cmllcywgZXRjLlxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1JlcXVlc3RzW3NvdXJjZS51cmxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IHBhZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgdGlsZXMgPSB0aGlzLl9zb3VyY2VSZXNvbHZlci5nZXRCZXN0Wm9vbUxldmVsRm9yUGFnZSh0aGlzLmxheW91dC5nZXRQYWdlSW5mbyhwYWdlSW5kZXgpKS50aWxlcztcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aWxlcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0aWxlc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGUuaGFzKHNvdXJjZS51cmwpIHx8ICF0aGlzLl9pc1RpbGVGb3JTb3VyY2VWaXNpYmxlKHBhZ2VJbmRleCwgc291cmNlKSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIERvbid0IGNyZWF0ZSBhIG5ldyByZXF1ZXN0IGlmIHRoZSB0aWxlIGlzIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tzb3VyY2UudXJsXSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BlbmRpbmdSZXF1ZXN0c1tzb3VyY2UudXJsXSA9IHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tzb3VyY2UudXJsXTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tzb3VyY2UudXJsXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGEgY2xvc3VyZSBzaW5jZSB0aGUgbG9hZCBhbmQgZXJyb3IgbWV0aG9kcyBhcmUgZ29pbmcgdG8gYmUgY2FsbGVkIGxhdGVyIGFuZFxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgcmlnaHQgcmVmZXJlbmNlIHRvIHRoZSBzb3VyY2UgYW5kIHRoZSBwYWdlIGluZGV4XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVSZXF1ZXN0KHNvdXJjZSwgcGFnZUluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdXJsIGluIHRoaXMuX3BlbmRpbmdSZXF1ZXN0cylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlcXVlc3RzW3VybF0uYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVxdWVzdHMgPSBuZXdQZW5kaW5nUmVxdWVzdHM7XG4gICAgfVxuXG4gICAgX2RyYXdUaWxlIChwYWdlSW5kZXgsIHNjYWxlZFRpbGUsIGltZylcbiAgICB7XG4gICAgICAgIGxldCB0aWxlT2Zmc2V0ID0gdGhpcy5fZ2V0VGlsZVRvRG9jdW1lbnRPZmZzZXQocGFnZUluZGV4LCBzY2FsZWRUaWxlKTtcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIGRvY3VtZW50IGlzIGRyYXduIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgIGxldCB2aWV3cG9ydFBhZGRpbmdYID0gTWF0aC5tYXgoMCwgKHRoaXMuX3ZpZXdwb3J0LndpZHRoIC0gdGhpcy5sYXlvdXQuZGltZW5zaW9ucy53aWR0aCkgLyAyKTtcbiAgICAgICAgbGV0IHZpZXdwb3J0UGFkZGluZ1kgPSBNYXRoLm1heCgwLCAodGhpcy5fdmlld3BvcnQuaGVpZ2h0IC0gdGhpcy5sYXlvdXQuZGltZW5zaW9ucy5oZWlnaHQpIC8gMik7XG5cbiAgICAgICAgbGV0IHZpZXdwb3J0T2Zmc2V0WCA9IHRpbGVPZmZzZXQubGVmdCAtIHRoaXMuX3ZpZXdwb3J0LmxlZnQgKyB2aWV3cG9ydFBhZGRpbmdYO1xuICAgICAgICBsZXQgdmlld3BvcnRPZmZzZXRZID0gdGlsZU9mZnNldC50b3AgLSB0aGlzLl92aWV3cG9ydC50b3AgKyB2aWV3cG9ydFBhZGRpbmdZO1xuXG4gICAgICAgIGxldCBkZXN0WE9mZnNldCA9IHZpZXdwb3J0T2Zmc2V0WCA8IDAgPyAtdmlld3BvcnRPZmZzZXRYIDogMDtcbiAgICAgICAgbGV0IGRlc3RZT2Zmc2V0ID0gdmlld3BvcnRPZmZzZXRZIDwgMCA/IC12aWV3cG9ydE9mZnNldFkgOiAwO1xuXG4gICAgICAgIGxldCBjYW52YXNYID0gTWF0aC5tYXgoMCwgdmlld3BvcnRPZmZzZXRYKTtcbiAgICAgICAgbGV0IGNhbnZhc1kgPSBNYXRoLm1heCgwLCB2aWV3cG9ydE9mZnNldFkpO1xuXG4gICAgICAgIGxldCBzb3VyY2VYT2Zmc2V0ID0gZGVzdFhPZmZzZXQgLyBzY2FsZWRUaWxlLnNjYWxlUmF0aW87XG4gICAgICAgIGxldCBzb3VyY2VZT2Zmc2V0ID0gZGVzdFlPZmZzZXQgLyBzY2FsZWRUaWxlLnNjYWxlUmF0aW87XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zIGFyZSBubyBncmVhdGVyIHRoYW4gdGhlIGFjdHVhbFxuICAgICAgICAvLyBzaXplIG9mIHRoZSBpbWFnZS4gU2FmYXJpIHdvbid0IGRpc3BsYXkgdGhlIHRpbGUgaWYgdGhleSBhcmUuXG4gICAgICAgIGxldCBkZXN0SW1nV2lkdGggPSBNYXRoLm1pbihzY2FsZWRUaWxlLmRpbWVuc2lvbnMud2lkdGgsIGltZy53aWR0aCAqIHNjYWxlZFRpbGUuc2NhbGVSYXRpbykgLSBkZXN0WE9mZnNldDtcbiAgICAgICAgbGV0IGRlc3RJbWdIZWlnaHQgPSBNYXRoLm1pbihzY2FsZWRUaWxlLmRpbWVuc2lvbnMuaGVpZ2h0LCBpbWcuaGVpZ2h0ICogc2NhbGVkVGlsZS5zY2FsZVJhdGlvKSAtIGRlc3RZT2Zmc2V0O1xuXG4gICAgICAgIGxldCBkZXN0V2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGRlc3RJbWdXaWR0aCkpO1xuICAgICAgICBsZXQgZGVzdEhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZGVzdEltZ0hlaWdodCkpO1xuXG4gICAgICAgIGxldCBzb3VyY2VXaWR0aCA9IGRlc3RXaWR0aCAvIHNjYWxlZFRpbGUuc2NhbGVSYXRpbztcbiAgICAgICAgbGV0IHNvdXJjZUhlaWdodCA9IGRlc3RIZWlnaHQgLyBzY2FsZWRUaWxlLnNjYWxlUmF0aW87XG5cbiAgICAgICAgdGhpcy5fY3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgIGltZyxcbiAgICAgICAgICAgIHNvdXJjZVhPZmZzZXQsIHNvdXJjZVlPZmZzZXQsXG4gICAgICAgICAgICBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LFxuICAgICAgICAgICAgY2FudmFzWCwgY2FudmFzWSxcbiAgICAgICAgICAgIGRlc3RXaWR0aCwgZGVzdEhlaWdodCk7XG4gICAgfVxuXG4gICAgX2lzVGlsZUZvclNvdXJjZVZpc2libGUgKHBhZ2VJbmRleCwgdGlsZVNvdXJjZSlcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1RpbGVWaXNpYmxlKHBhZ2VJbmRleCwgZ2V0U2NhbGVkVGlsZVJlY29yZCh0aWxlU291cmNlLCB0aGlzLl96b29tTGV2ZWwpKTtcbiAgICB9XG5cbiAgICBfaXNUaWxlVmlzaWJsZSAocGFnZUluZGV4LCBzY2FsZWRUaWxlKVxuICAgIHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMuX2dldFRpbGVUb0RvY3VtZW50T2Zmc2V0KHBhZ2VJbmRleCwgc2NhbGVkVGlsZSk7XG5cbiAgICAgICAgLy8gRklYTUUod2FiYWluKTogVGhpcyBjaGVjayBpcyBpbnN1ZmZpY2llbnQgZHVyaW5nIGEgem9vbSB0cmFuc2l0aW9uXG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3cG9ydC5pbnRlcnNlY3RzUmVnaW9uKHtcbiAgICAgICAgICAgIHRvcDogdGlsZU9mZnNldC50b3AsXG4gICAgICAgICAgICBib3R0b206IHRpbGVPZmZzZXQudG9wICsgc2NhbGVkVGlsZS5kaW1lbnNpb25zLmhlaWdodCxcbiAgICAgICAgICAgIGxlZnQ6IHRpbGVPZmZzZXQubGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiB0aWxlT2Zmc2V0LmxlZnQgKyBzY2FsZWRUaWxlLmRpbWVuc2lvbnMud2lkdGhcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2dldFRpbGVUb0RvY3VtZW50T2Zmc2V0IChwYWdlSW5kZXgsIHNjYWxlZFRpbGUpXG4gICAge1xuICAgICAgICBjb25zdCBpbWFnZU9mZnNldCA9IHRoaXMuX2dldEltYWdlT2Zmc2V0KHBhZ2VJbmRleCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogaW1hZ2VPZmZzZXQudG9wICsgc2NhbGVkVGlsZS5vZmZzZXQudG9wLFxuICAgICAgICAgICAgbGVmdDogaW1hZ2VPZmZzZXQubGVmdCArIHNjYWxlZFRpbGUub2Zmc2V0LmxlZnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfZ2V0SW1hZ2VPZmZzZXQgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dC5nZXRQYWdlT2Zmc2V0KHBhZ2VJbmRleCwge2luY2x1ZGVQYWRkaW5nOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXBkYXRlIHNpZ25hdHVyZVxuICAgIGdvdG8gKHBhZ2VJbmRleCwgdmVydGljYWxPZmZzZXQsIGhvcml6b250YWxPZmZzZXQpXG4gICAge1xuICAgICAgICB0aGlzLl9jbGVhckFuaW1hdGlvbigpO1xuICAgICAgICB0aGlzLl9nb3RvKHBhZ2VJbmRleCwgdmVydGljYWxPZmZzZXQsIGhvcml6b250YWxPZmZzZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9ob29rcy5vblZpZXdEaWRVcGRhdGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2hvb2tzLm9uVmlld0RpZFVwZGF0ZSh0aGlzLl9yZW5kZXJlZFBhZ2VzLnNsaWNlKCksIHBhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZ290byAocGFnZUluZGV4LCB2ZXJ0aWNhbE9mZnNldCwgaG9yaXpvbnRhbE9mZnNldClcbiAgICB7XG4gICAgICAgIC8vIEZJWE1FKHdhYmFpbik6IE1vdmUgdGhpcyBsb2dpYyB0byB0aGUgdmlld2VyXG4gICAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSB0aGlzLmxheW91dC5nZXRQYWdlT2Zmc2V0KHBhZ2VJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZGVzaXJlZFZlcnRpY2FsQ2VudGVyID0gcGFnZU9mZnNldC50b3AgKyB2ZXJ0aWNhbE9mZnNldDtcbiAgICAgICAgY29uc3QgdG9wID0gZGVzaXJlZFZlcnRpY2FsQ2VudGVyIC0gTWF0aC5yb3VuZCh0aGlzLl92aWV3cG9ydC5oZWlnaHQgLyAyKTtcblxuICAgICAgICBjb25zdCBkZXNpcmVkSG9yaXpvbnRhbENlbnRlciA9IHBhZ2VPZmZzZXQubGVmdCArIGhvcml6b250YWxPZmZzZXQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkZXNpcmVkSG9yaXpvbnRhbENlbnRlciAtIE1hdGgucm91bmQodGhpcy5fdmlld3BvcnQud2lkdGggLyAyKTtcblxuICAgICAgICB0aGlzLl92aWV3cG9ydC50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0LmxlZnQgPSBsZWZ0O1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIHRyYW5zaXRpb25WaWV3cG9ydFBvc2l0aW9uIChvcHRpb25zKVxuICAgIHtcbiAgICAgICAgdGhpcy5fY2xlYXJBbmltYXRpb24oKTtcblxuICAgICAgICBjb25zdCBnZXRQb3NpdGlvbiA9IG9wdGlvbnMuZ2V0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IG9uVmlld0RpZFRyYW5zaXRpb24gPSB0aGlzLl9ob29rcy5vblZpZXdEaWRUcmFuc2l0aW9uO1xuXG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbiA9IEludGVycG9sYXRlQW5pbWF0aW9uLmFuaW1hdGUoe1xuICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBvcHRpb25zLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBvblVwZGF0ZTogKHZhbHVlcykgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRWaWV3cG9ydFBvc2l0aW9uKGdldFBvc2l0aW9uKHZhbHVlcykpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvb2tzLm9uWm9vbUxldmVsV2lsbENoYW5nZSh2YWx1ZXMuem9vbUxldmVsKTtcblxuICAgICAgICAgICAgICAgIGlmIChvblZpZXdEaWRUcmFuc2l0aW9uKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb25WaWV3RGlkVHJhbnNpdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkVuZDogKGluZm8pID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub25FbmQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uRW5kKGluZm8pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ob29rcy5vblZpZXdEaWRVcGRhdGUgJiYgIWluZm8uaW50ZXJydXB0ZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ob29rcy5vblZpZXdEaWRVcGRhdGUodGhpcy5fcmVuZGVyZWRQYWdlcy5zbGljZSgpLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jbGVhckFuaW1hdGlvbiAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvbilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzUGFnZVZpc2libGUgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmxheW91dC5nZXRQYWdlSW5mbyhwYWdlSW5kZXgpO1xuXG4gICAgICAgIGlmICghcGFnZSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0LmludGVyc2VjdHNSZWdpb24odGhpcy5sYXlvdXQuZ2V0UGFnZVJlZ2lvbihwYWdlSW5kZXgpKTtcbiAgICB9XG5cbiAgICBnZXRSZW5kZXJlZFBhZ2VzICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZWRQYWdlcy5zbGljZSgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3kgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2NsZWFyQW5pbWF0aW9uKCk7XG5cbiAgICAgICAgLy8gRklYTUUod2FiYWluKTogSSBkb24ndCBrbm93IGlmIHdlIHNob3VsZCBhY3R1YWxseSBkbyB0aGlzXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdSZXF1ZXN0cykuZm9yRWFjaCgocmVxKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5fcGVuZGluZ1JlcXVlc3RzW3JlcV07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1JlcXVlc3RzW3JlcV07XG5cbiAgICAgICAgICAgIGhhbmRsZXIuYWJvcnQoKTtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5fY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY2FudmFzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFNjYWxlZFRpbGVSZWNvcmQgKHNvdXJjZSwgc2NhbGVGYWN0b3IpXG57XG4gICAgbGV0IHNjYWxlUmF0aW87XG5cbiAgICBpZiAoc2NhbGVGYWN0b3IgPT09IG51bGwpXG4gICAge1xuICAgICAgICBzY2FsZVJhdGlvID0gMTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgc2NhbGVSYXRpbyA9IE1hdGgucG93KDIsIHNjYWxlRmFjdG9yIC0gc291cmNlLnpvb21MZXZlbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlWm9vbUxldmVsOiBzb3VyY2Uuem9vbUxldmVsLFxuICAgICAgICBzY2FsZVJhdGlvOiBzY2FsZVJhdGlvLFxuICAgICAgICByb3c6IHNvdXJjZS5yb3csXG4gICAgICAgIGNvbDogc291cmNlLmNvbCxcbiAgICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAgICAgd2lkdGg6IHNvdXJjZS5kaW1lbnNpb25zLndpZHRoICogc2NhbGVSYXRpbyxcbiAgICAgICAgICAgIGhlaWdodDogc291cmNlLmRpbWVuc2lvbnMuaGVpZ2h0ICogc2NhbGVSYXRpb1xuICAgICAgICB9LFxuICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICAgIGxlZnQ6IHNvdXJjZS5vZmZzZXQubGVmdCAqIHNjYWxlUmF0aW8sXG4gICAgICAgICAgICB0b3A6IHNvdXJjZS5vZmZzZXQudG9wICogc2NhbGVSYXRpb1xuICAgICAgICB9LFxuICAgICAgICB1cmw6IHNvdXJjZS51cmxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kQ2hhbmdlcyAob2xkQXJyYXksIG5ld0FycmF5KVxue1xuICAgIGlmIChvbGRBcnJheSA9PT0gbmV3QXJyYXkpXG4gICAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWRkZWQ6IFtdLFxuICAgICAgICAgICAgcmVtb3ZlZDogW11cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdmVkID0gb2xkQXJyYXkuZmlsdGVyKG9sZEVudHJ5ID0+IG5ld0FycmF5LmluZGV4T2Yob2xkRW50cnkpID09PSAtMSk7XG5cbiAgICBjb25zdCBhZGRlZCA9IG5ld0FycmF5LmZpbHRlcihuZXdFbnRyeSA9PiBvbGRBcnJheS5pbmRleE9mKG5ld0VudHJ5KSA9PT0gLTEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkZWQ6IGFkZGVkLFxuICAgICAgICByZW1vdmVkOiByZW1vdmVkXG4gICAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBhZ2VEaW1lbnNpb25zIChwYWdlSW5kZXgsIG1hbmlmZXN0KVxue1xuICAgIGNvbnN0IGRpbXMgPSBtYW5pZmVzdC5nZXRNYXhQYWdlRGltZW5zaW9ucyhwYWdlSW5kZXgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IE1hdGguZmxvb3IoZGltcy53aWR0aCksXG4gICAgICAgIGhlaWdodDogTWF0aC5mbG9vcihkaW1zLmhlaWdodClcbiAgICB9O1xufVxuIiwiaW1wb3J0IGdldFBhZ2VEaW1lbnNpb25zIGZyb20gJy4vcGFnZS1kaW1lbnNpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm9va0xheW91dEdyb3VwcyAodmlld2VyQ29uZmlnKVxue1xuICAgIGNvbnN0IGdyb3VwaW5ncyA9IGdldEdyb3VwaW5ncyh2aWV3ZXJDb25maWcpO1xuXG4gICAgcmV0dXJuIGdyb3VwaW5ncy5tYXAoZ3JvdXBpbmcgPT4gZ2V0R3JvdXBMYXlvdXRzRnJvbVBhZ2VHcm91cGluZyh2aWV3ZXJDb25maWcsIGdyb3VwaW5nKSk7XG59XG5cbmZ1bmN0aW9uIGdldEdyb3VwaW5ncyh2aWV3ZXJDb25maWcpXG57XG4gICAgY29uc3QgbWFuaWZlc3QgPSB2aWV3ZXJDb25maWcubWFuaWZlc3Q7XG5cbiAgICBjb25zdCBwYWdlc0J5R3JvdXAgPSBbXTtcbiAgICBsZXQgbGVmdFBhZ2UgPSBudWxsO1xuICAgIGxldCBub25QYWdlZFBhZ2VzID0gW107IC8vIFBhZ2VzIHRvIGRpc3BsYXkgYmVsb3cgdGhlIGN1cnJlbnQgZ3JvdXBcblxuICAgIGNvbnN0IF9hZGROb25QYWdlZFBhZ2VzID0gKCkgPT5cbiAgICB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBubGVuID0gbm9uUGFnZWRQYWdlcy5sZW5ndGg7IGkgPCBubGVuOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBhZ2VzQnlHcm91cC5wdXNoKFsgbm9uUGFnZWRQYWdlc1tpXSBdKTtcbiAgICAgICAgfVxuICAgICAgICBub25QYWdlZFBhZ2VzID0gW107XG4gICAgfTtcblxuICAgIG1hbmlmZXN0LnBhZ2VzLmZvckVhY2goIChwYWdlLCBpbmRleCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHBhZ2VSZWNvcmQgPSB7XG4gICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBnZXRQYWdlRGltZW5zaW9ucyhpbmRleCwgbWFuaWZlc3QpLFxuICAgICAgICAgICAgcGFnZWQ6ICghbWFuaWZlc3QucGFnZWQgfHwgcGFnZS5wYWdlZClcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPbmx5IGRpc3BsYXkgbm9uLXBhZ2VkIHBhZ2VzIGlmIHNwZWNpZmllZCBpbiB0aGUgc2V0dGluZ3NcbiAgICAgICAgaWYgKCF2aWV3ZXJDb25maWcuc2hvd05vblBhZ2VkUGFnZXMgJiYgIXBhZ2VSZWNvcmQucGFnZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKCFwYWdlUmVjb3JkLnBhZ2VkKVxuICAgICAgICB7XG4gICAgICAgICAgICBub25QYWdlZFBhZ2VzLnB1c2gocGFnZVJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IDAgfHwgcGFnZS5mYWNpbmdQYWdlcylcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHBhZ2UgaXMgcGxhY2VkIG9uIGl0cyBvd25cbiAgICAgICAgICAgIHBhZ2VzQnlHcm91cC5wdXNoKFtwYWdlUmVjb3JkXSk7XG4gICAgICAgICAgICBfYWRkTm9uUGFnZWRQYWdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlZnRQYWdlID09PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZWZ0UGFnZSA9IHBhZ2VSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBwYWdlc0J5R3JvdXAucHVzaChbbGVmdFBhZ2UsIHBhZ2VSZWNvcmRdKTtcbiAgICAgICAgICAgIGxlZnRQYWdlID0gbnVsbDtcbiAgICAgICAgICAgIF9hZGROb25QYWdlZFBhZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEZsdXNoIGEgZmluYWwgbGVmdCBwYWdlXG4gICAgaWYgKGxlZnRQYWdlICE9PSBudWxsKVxuICAgIHtcbiAgICAgICAgcGFnZXNCeUdyb3VwLnB1c2goW2xlZnRQYWdlXSk7XG4gICAgICAgIF9hZGROb25QYWdlZFBhZ2VzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhZ2VzQnlHcm91cDtcbn1cblxuZnVuY3Rpb24gZ2V0R3JvdXBMYXlvdXRzRnJvbVBhZ2VHcm91cGluZyh2aWV3ZXJDb25maWcsIGdyb3VwaW5nKVxue1xuICAgIGNvbnN0IHZlcnRpY2FsbHlPcmllbnRlZCA9IHZpZXdlckNvbmZpZy52ZXJ0aWNhbGx5T3JpZW50ZWQ7XG5cbiAgICBpZiAoZ3JvdXBpbmcubGVuZ3RoID09PSAyKVxuICAgICAgICByZXR1cm4gZ2V0RmFjaW5nUGFnZUdyb3VwKGdyb3VwaW5nWzBdLCBncm91cGluZ1sxXSwgdmVydGljYWxseU9yaWVudGVkKTtcblxuICAgIGNvbnN0IHBhZ2UgPSBncm91cGluZ1swXTtcbiAgICBjb25zdCBwYWdlRGltcyA9IHBhZ2UuZGltZW5zaW9ucztcblxuICAgIC8vIFRoZSBmaXJzdCBwYWdlIGlzIHBsYWNlZCBvbiBpdHMgb3duIHRvIHRoZSByaWdodCBpbiB2ZXJ0aWNhbCBvcmllbnRhdGlvbi5cbiAgICAvLyBOQiB0aGF0IHRoaXMgbmVlZHMgdG8gYmUgdGhlIHBhZ2Ugd2l0aCBpbmRleCAwOyBpZiB0aGUgZmlyc3QgcGFnZSBpcyBleGNsdWRlZFxuICAgIC8vIGZyb20gdGhlIGxheW91dCB0aGVuIHRoaXMgc3BlY2lhbCBjYXNlIHNob3VsZG4ndCBhcHBseS5cbiAgICAvLyBJZiB0aGUgcGFnZSBpcyB0YWdnZWQgYXMgJ25vbi1wYWdlZCcsIGNlbnRlciBpdCBob3Jpem9udGFsbHlcbiAgICBsZXQgbGVmdE9mZnNldDtcbiAgICBpZiAocGFnZS5wYWdlZClcbiAgICAgICAgbGVmdE9mZnNldCA9IChwYWdlLmluZGV4ID09PSAwICYmIHZlcnRpY2FsbHlPcmllbnRlZCkgPyBwYWdlRGltcy53aWR0aCA6IDA7XG4gICAgZWxzZVxuICAgICAgICBsZWZ0T2Zmc2V0ID0gKHZlcnRpY2FsbHlPcmllbnRlZCkgPyBwYWdlRGltcy53aWR0aCAvIDIgOiAwO1xuXG4gICAgY29uc3Qgc2hvdWxkQmVIb3Jpem9udGFsbHlBZGp1c3RlZCA9XG4gICAgICAgIHZlcnRpY2FsbHlPcmllbnRlZCAmJiAhdmlld2VyQ29uZmlnLm1hbmlmZXN0LnBhZ2VzW3BhZ2UuaW5kZXhdLmZhY2luZ1BhZ2VzO1xuXG4gICAgLy8gV2UgbmVlZCB0byBsZWZ0LWFsaWduIHRoZSBwYWdlIGluIHZlcnRpY2FsIG9yaWVudGF0aW9uLCBzbyB3ZSBkb3VibGVcbiAgICAvLyB0aGUgZ3JvdXAgd2lkdGhcbiAgICByZXR1cm4ge1xuICAgICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgICAgICBoZWlnaHQ6IHBhZ2VEaW1zLmhlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiBzaG91bGRCZUhvcml6b250YWxseUFkanVzdGVkID8gcGFnZURpbXMud2lkdGggKiAyIDogcGFnZURpbXMud2lkdGhcbiAgICAgICAgfSxcbiAgICAgICAgcGFnZXM6IFt7XG4gICAgICAgICAgICBpbmRleDogcGFnZS5pbmRleCxcbiAgICAgICAgICAgIGdyb3VwT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnRPZmZzZXRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBwYWdlRGltc1xuICAgICAgICB9XVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEZhY2luZ1BhZ2VHcm91cChsZWZ0UGFnZSwgcmlnaHRQYWdlLCB2ZXJ0aWNhbGx5T3JpZW50ZWQpXG57XG4gICAgY29uc3QgbGVmdERpbXMgPSBsZWZ0UGFnZS5kaW1lbnNpb25zO1xuICAgIGNvbnN0IHJpZ2h0RGltcyA9IHJpZ2h0UGFnZS5kaW1lbnNpb25zO1xuXG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgobGVmdERpbXMuaGVpZ2h0LCByaWdodERpbXMuaGVpZ2h0KTtcblxuICAgIGxldCB3aWR0aCwgZmlyc3RMZWZ0T2Zmc2V0LCBzZWNvbmRMZWZ0T2Zmc2V0O1xuXG4gICAgaWYgKHZlcnRpY2FsbHlPcmllbnRlZClcbiAgICB7XG4gICAgICAgIGNvbnN0IG1pZFdpZHRoID0gTWF0aC5tYXgobGVmdERpbXMud2lkdGgsIHJpZ2h0RGltcy53aWR0aCk7XG5cbiAgICAgICAgd2lkdGggPSBtaWRXaWR0aCAqIDI7XG5cbiAgICAgICAgZmlyc3RMZWZ0T2Zmc2V0ID0gbWlkV2lkdGggLSBsZWZ0RGltcy53aWR0aDtcbiAgICAgICAgc2Vjb25kTGVmdE9mZnNldCA9IG1pZFdpZHRoO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICB3aWR0aCA9IGxlZnREaW1zLndpZHRoICsgcmlnaHREaW1zLndpZHRoO1xuICAgICAgICBmaXJzdExlZnRPZmZzZXQgPSAwO1xuICAgICAgICBzZWNvbmRMZWZ0T2Zmc2V0ID0gbGVmdERpbXMud2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGhcbiAgICAgICAgfSxcbiAgICAgICAgcGFnZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbmRleDogbGVmdFBhZ2UuaW5kZXgsXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogbGVmdERpbXMsXG4gICAgICAgICAgICAgICAgZ3JvdXBPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBmaXJzdExlZnRPZmZzZXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluZGV4OiByaWdodFBhZ2UuaW5kZXgsXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogcmlnaHREaW1zLFxuICAgICAgICAgICAgICAgIGdyb3VwT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogc2Vjb25kTGVmdE9mZnNldFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH07XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEdyaWRMYXlvdXRHcm91cHMgKHZpZXdlckNvbmZpZylcbntcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gdmlld2VyQ29uZmlnLnZpZXdwb3J0LndpZHRoO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdmlld2VyQ29uZmlnLm1hbmlmZXN0O1xuICAgIGNvbnN0IHBhZ2VzUGVyUm93ID0gdmlld2VyQ29uZmlnLnBhZ2VzUGVyUm93O1xuICAgIGNvbnN0IGZpeGVkSGVpZ2h0R3JpZCA9IHZpZXdlckNvbmZpZy5maXhlZEhlaWdodEdyaWQ7XG4gICAgY29uc3QgZml4ZWRQYWRkaW5nID0gdmlld2VyQ29uZmlnLmZpeGVkUGFkZGluZztcbiAgICBjb25zdCBzaG93Tm9uUGFnZWRQYWdlcyA9IHZpZXdlckNvbmZpZy5zaG93Tm9uUGFnZWRQYWdlcztcblxuICAgIGNvbnN0IGhvcml6b250YWxQYWRkaW5nID0gZml4ZWRQYWRkaW5nICogKHBhZ2VzUGVyUm93ICsgMSk7XG4gICAgY29uc3QgcGFnZVdpZHRoID0gKHZpZXdwb3J0V2lkdGggLSBob3Jpem9udGFsUGFkZGluZykgLyBwYWdlc1BlclJvdztcbiAgICBjb25zdCBncmlkUGFnZVdpZHRoID0gcGFnZVdpZHRoO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByb3cgaGVpZ2h0IGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gZml4IHRoZSB3aWR0aCBvciB0aGUgaGVpZ2h0XG4gICAgY29uc3Qgcm93SGVpZ2h0ID0gKGZpeGVkSGVpZ2h0R3JpZCkgPyBmaXhlZFBhZGRpbmcgKyBtYW5pZmVzdC5taW5SYXRpbyAqIHBhZ2VXaWR0aCA6IGZpeGVkUGFkZGluZyArIG1hbmlmZXN0Lm1heFJhdGlvICogcGFnZVdpZHRoO1xuXG4gICAgY29uc3QgZ3JvdXBzID0gW107XG4gICAgbGV0IGN1cnJlbnRQYWdlcyA9IFtdO1xuXG4gICAgY29uc3QgZ2V0R3JpZFBhZ2VEaW1lbnNpb25zID0gcGFnZURhdGEgPT5cbiAgICB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgd2lkdGgsIGhlaWdodCBhbmQgaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGhpcyBwYWdlXG4gICAgICAgIC8vIEdldCBkaW1lbnNpb25zIGF0IG1heCB6b29tIGxldmVsLCBhbHRob3VnaCBhbnkgbGV2ZWwgc2hvdWxkIGJlIGZpbmVcbiAgICAgICAgY29uc3QgcGFnZURpbWVuRGF0YSA9IHBhZ2VEYXRhLmRbcGFnZURhdGEuZC5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0VG9XaWR0aFJhdGlvID0gcGFnZURpbWVuRGF0YS5oIC8gcGFnZURpbWVuRGF0YS53O1xuXG4gICAgICAgIGxldCBwYWdlV2lkdGgsIHBhZ2VIZWlnaHQ7XG5cbiAgICAgICAgaWYgKGZpeGVkSGVpZ2h0R3JpZClcbiAgICAgICAge1xuICAgICAgICAgICAgcGFnZVdpZHRoID0gKHJvd0hlaWdodCAtIGZpeGVkUGFkZGluZykgLyBoZWlnaHRUb1dpZHRoUmF0aW87XG4gICAgICAgICAgICBwYWdlSGVpZ2h0ID0gcm93SGVpZ2h0IC0gZml4ZWRQYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcGFnZVdpZHRoID0gZ3JpZFBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQgPSBwYWdlV2lkdGggKiBoZWlnaHRUb1dpZHRoUmF0aW87XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQocGFnZVdpZHRoKSxcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZChwYWdlSGVpZ2h0KVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCByb3dEaW1lbnNpb25zID0ge1xuICAgICAgICBoZWlnaHQ6IHJvd0hlaWdodCxcbiAgICAgICAgd2lkdGg6IHZpZXdwb3J0V2lkdGhcbiAgICB9O1xuXG4gICAgbWFuaWZlc3QucGFnZXMuZm9yRWFjaCggKHBhZ2UsIHBhZ2VJbmRleCkgPT5cbiAgICB7XG4gICAgICAgIGlmICghc2hvd05vblBhZ2VkUGFnZXMgJiYgbWFuaWZlc3QucGFnZWQgJiYgIXBhZ2UucGFnZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0aGlzIHBhZ2VcbiAgICAgICAgY29uc3QgcGFnZURpbWVucyA9IGdldEdyaWRQYWdlRGltZW5zaW9ucyhwYWdlKTtcbiAgICAgICAgbGV0IGxlZnRPZmZzZXQgPSBNYXRoLmZsb29yKGN1cnJlbnRQYWdlcy5sZW5ndGggKiAoZml4ZWRQYWRkaW5nICsgZ3JpZFBhZ2VXaWR0aCkgKyBmaXhlZFBhZGRpbmcpO1xuXG4gICAgICAgIC8vIENlbnRlciB0aGUgcGFnZSBpZiB0aGUgaGVpZ2h0IGlzIGZpeGVkIChvdGhlcndpc2UsIHRoZXJlIGlzIG5vIGhvcml6b250YWwgcGFkZGluZylcbiAgICAgICAgaWYgKGZpeGVkSGVpZ2h0R3JpZClcbiAgICAgICAge1xuICAgICAgICAgICAgbGVmdE9mZnNldCArPSAoZ3JpZFBhZ2VXaWR0aCAtIHBhZ2VEaW1lbnMud2lkdGgpIC8gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IFByZWNvbXB1dGUgcGFnZSBkaW1lbnNpb25zIGV2ZXJ5d2hlcmVcbiAgICAgICAgY3VycmVudFBhZ2VzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IHBhZ2VEaW1lbnMsXG4gICAgICAgICAgICBncm91cE9mZnNldDoge1xuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0T2Zmc2V0XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjdXJyZW50UGFnZXMubGVuZ3RoID09PSBwYWdlc1BlclJvdylcbiAgICAgICAge1xuICAgICAgICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IHJvd0RpbWVuc2lvbnMsXG4gICAgICAgICAgICAgICAgcGFnZXM6IGN1cnJlbnRQYWdlc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGN1cnJlbnRQYWdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoY3VycmVudFBhZ2VzLmxlbmd0aCA+IDApXG4gICAge1xuICAgICAgICBncm91cHMucHVzaCh7XG4gICAgICAgICAgICBkaW1lbnNpb25zOiByb3dEaW1lbnNpb25zLFxuICAgICAgICAgICAgcGFnZXM6IGN1cnJlbnRQYWdlc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzO1xufVxuIiwiaW1wb3J0IGdldEJvb2tMYXlvdXRHcm91cHMgZnJvbSAnLi9ib29rLWxheW91dCc7XG5pbXBvcnQgZ2V0U2luZ2xlc0xheW91dEdyb3VwcyBmcm9tICcuL3NpbmdsZXMtbGF5b3V0JztcbmltcG9ydCBnZXRHcmlkTGF5b3V0R3JvdXBzIGZyb20gJy4vZ3JpZC1sYXlvdXQnO1xuXG4vKiogR2V0IHRoZSByZWxhdGl2ZSBwb3NpdGlvbmluZyBvZiBwYWdlcyBmb3IgdGhlIGN1cnJlbnQgdmlldyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFnZUxheW91dHMgKHNldHRpbmdzKVxue1xuICAgIGlmIChzZXR0aW5ncy5pbkdyaWQpXG4gICAge1xuICAgICAgICByZXR1cm4gZ2V0R3JpZExheW91dEdyb3VwcyhwbHVjayhzZXR0aW5ncywgW1xuICAgICAgICAgICAgJ21hbmlmZXN0JyxcbiAgICAgICAgICAgICd2aWV3cG9ydCcsXG4gICAgICAgICAgICAncGFnZXNQZXJSb3cnLFxuICAgICAgICAgICAgJ2ZpeGVkSGVpZ2h0R3JpZCcsXG4gICAgICAgICAgICAnZml4ZWRQYWRkaW5nJyxcbiAgICAgICAgICAgICdzaG93Tm9uUGFnZWRQYWdlcydcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBjb25maWcgPSBwbHVjayhzZXR0aW5ncywgWydtYW5pZmVzdCcsICd2ZXJ0aWNhbGx5T3JpZW50ZWQnLCAnc2hvd05vblBhZ2VkUGFnZXMnXSk7XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmluQm9va0xheW91dClcbiAgICAgICAgICAgIHJldHVybiBnZXRCb29rTGF5b3V0R3JvdXBzKGNvbmZpZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBnZXRTaW5nbGVzTGF5b3V0R3JvdXBzKGNvbmZpZyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwbHVjayAob2JqLCBrZXlzKVxue1xuICAgIGNvbnN0IG91dCA9IHt9O1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KVxuICAgIHtcbiAgICAgICAgb3V0W2tleV0gPSBvYmpba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xufVxuIiwiaW1wb3J0IGdldFBhZ2VEaW1lbnNpb25zIGZyb20gJy4vcGFnZS1kaW1lbnNpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2luZ2xlc0xheW91dEdyb3VwcyAodmlld2VyQ29uZmlnKVxue1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdmlld2VyQ29uZmlnLm1hbmlmZXN0O1xuXG4gICAgLy8gUmVuZGVyIGVhY2ggcGFnZSBhbG9uZSBpbiBhIGdyb3VwXG4gICAgY29uc3QgcGFnZXMgPSBbXTtcbiAgICBtYW5pZmVzdC5wYWdlcy5mb3JFYWNoKCAocGFnZSwgaW5kZXgpID0+XG4gICAge1xuICAgICAgICBpZiAoIXZpZXdlckNvbmZpZy5zaG93Tm9uUGFnZWRQYWdlcyAmJiBtYW5pZmVzdC5wYWdlZCAmJiAhcGFnZS5wYWdlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBwYWdlRGltcyA9IGdldFBhZ2VEaW1lbnNpb25zKGluZGV4LCBtYW5pZmVzdCk7XG5cbiAgICAgICAgcGFnZXMucHVzaCh7XG4gICAgICAgICAgICBkaW1lbnNpb25zOiBwYWdlRGltcyxcbiAgICAgICAgICAgIHBhZ2VzOiBbe1xuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICBncm91cE9mZnNldDogeyB0b3A6IDAsIGxlZnQ6IDAgfSxcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBwYWdlRGltc1xuICAgICAgICAgICAgfV1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFnZXM7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVNldHRpbmdzVmlldyhzb3VyY2VzKVxue1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuXG4gICAgc291cmNlcy5mb3JFYWNoKCAoc291cmNlKSA9PlxuICAgIHtcbiAgICAgICAgcmVnaXN0ZXJNaXhpbihvYmosIHNvdXJjZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiByZWdpc3Rlck1peGluKG9iaiwgbWl4aW4pXG57XG4gICAgT2JqZWN0LmtleXMobWl4aW4pLmZvckVhY2goIChrZXkpID0+XG4gICAge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWl4aW5ba2V5XTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6ICgpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogTWFrZSBldmVyeXRoaW5nIHN0cmljdCBtb2RlIHNvIHRoaXMgaXNuJ3QgbmVlZGVkXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IHNldCBzZXR0aW5ncy4nICsga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0aW9uUnVubmVyXG57XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnMpXG4gICAge1xuICAgICAgICB0aGlzLndoaXRlbGlzdGVkS2V5cyA9IG9wdGlvbnMud2hpdGVsaXN0ZWRLZXlzIHx8IFtdO1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gb3B0aW9ucy5hZGRpdGlvbmFsUHJvcGVydGllcyB8fCBbXTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9ucyA9IG9wdGlvbnMudmFsaWRhdGlvbnM7XG4gICAgfVxuXG4gICAgaXNWYWxpZCAoa2V5LCB2YWx1ZSwgc2V0dGluZ3MpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbGlkYXRpb24gaW5kZXhcbiAgICAgICAgbGV0IHZhbGlkYXRpb25JbmRleCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52YWxpZGF0aW9ucy5zb21lKCh2YWxpZGF0aW9uLCBpbmRleCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24ua2V5ICE9PSBrZXkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWxpZGF0aW9uSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodmFsaWRhdGlvbkluZGV4ID09PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biB0aGUgdmFsaWRhdGlvblxuICAgICAgICBjb25zdCBkdW1teUNoYW5nZXMgPSB7fTtcbiAgICAgICAgZHVtbXlDaGFuZ2VzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgcHJveGllciA9IGNyZWF0ZVNldHRpbmdzUHJveGllcihzZXR0aW5ncywgZHVtbXlDaGFuZ2VzLCB0aGlzKTtcblxuICAgICAgICByZXR1cm4gIXRoaXMuX3J1blZhbGlkYXRpb24odmFsaWRhdGlvbkluZGV4LCB2YWx1ZSwgcHJveGllcik7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUgKHNldHRpbmdzKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVPcHRpb25zKHt9LCBzZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgZ2V0VmFsaWRhdGVkT3B0aW9ucyAoc2V0dGluZ3MsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBjb25zdCBjbG9uZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVPcHRpb25zKHNldHRpbmdzLCBjbG9uZWQpO1xuICAgICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZU9wdGlvbnMgKHNldHRpbmdzLCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NQcm94aWVyID0gY3JlYXRlU2V0dGluZ3NQcm94aWVyKHNldHRpbmdzLCBvcHRpb25zLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fYXBwbHlWYWxpZGF0aW9ucyhvcHRpb25zLCBzZXR0aW5nc1Byb3hpZXIpO1xuICAgIH1cblxuICAgIF9hcHBseVZhbGlkYXRpb25zIChvcHRpb25zLCBwcm94aWVyKVxuICAgIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZGF0aW9uLCBpbmRleCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmhhc093blByb3BlcnR5KHZhbGlkYXRpb24ua2V5KSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gb3B0aW9uc1t2YWxpZGF0aW9uLmtleV07XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0ZWQgPSB0aGlzLl9ydW5WYWxpZGF0aW9uKGluZGV4LCBpbnB1dCwgcHJveGllcik7XG5cbiAgICAgICAgICAgIGlmIChjb3JyZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3JyZWN0ZWQud2FybmluZ1N1cHByZXNzZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbWl0V2FybmluZyh2YWxpZGF0aW9uLmtleSwgaW5wdXQsIGNvcnJlY3RlZC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb3B0aW9uc1t2YWxpZGF0aW9uLmtleV0gPSBjb3JyZWN0ZWQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxuICAgIF9ydW5WYWxpZGF0aW9uIChpbmRleCwgaW5wdXQsIHByb3hpZXIpXG4gICAge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52YWxpZGF0aW9uc1tpbmRleF07XG5cbiAgICAgICAgcHJveGllci5pbmRleCA9IGluZGV4O1xuXG4gICAgICAgIGxldCB3YXJuaW5nU3VwcHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICBzdXBwcmVzc1dhcm5pbmc6ICgpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2FybmluZ1N1cHByZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG91dHB1dFZhbHVlID0gdmFsaWRhdGlvbi52YWxpZGF0ZShpbnB1dCwgcHJveGllci5wcm94eSwgY29uZmlnKTtcblxuICAgICAgICBpZiAob3V0cHV0VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvdXRwdXRWYWx1ZSA9PT0gaW5wdXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBvdXRwdXRWYWx1ZSxcbiAgICAgICAgICAgIHdhcm5pbmdTdXBwcmVzc2VkOiB3YXJuaW5nU3VwcHJlc3NlZFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgc2V0dGluZ3MgcHJveHkgd3JhcHMgdGhlIHNldHRpbmdzIG9iamVjdCBhbmQgZW5zdXJlcyB0aGF0XG4gKiBvbmx5IHZhbHVlcyB3aGljaCBoYXZlIHByZXZpb3VzbHkgYmVlbiB2YWxpZGF0ZWQgYXJlIGFjY2Vzc2VkLFxuICogdGhyb3dpbmcgYSBUeXBlRXJyb3Igb3RoZXJ3aXNlLlxuICpcbiAqIEZJWE1FKHdhYmFpbik6IElzIGl0IHdvcnRoIGtlZXBpbmcgdGhpcz8gV2hlbiBJIHdyb3RlIGl0IEkgaGFkXG4gKiBtdWx0aXBsZSB2YWxpZGF0aW9uIHN0YWdlcyBhbmQgaXQgd2FzIGEgbG90IGhhcmRlciB0byBrZWVwIHRyYWNrXG4gKiBvZiBldmVyeXRoaW5nLCBzbyB0aGlzIHdhcyBtb3JlIHZhbHVhYmxlLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTZXR0aW5nc1Byb3hpZXIgKHNldHRpbmdzLCBvcHRpb25zLCBydW5uZXIpXG57XG4gICAgY29uc3QgcHJveGllciA9IHtcbiAgICAgICAgcHJveHk6IHt9LFxuICAgICAgICBpbmRleDogbnVsbFxuICAgIH07XG5cbiAgICBjb25zdCBsb29rdXAgPSBsb29rdXBWYWx1ZS5iaW5kKG51bGwsIHNldHRpbmdzLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7fTtcblxuICAgIHJ1bm5lci53aGl0ZWxpc3RlZEtleXMuZm9yRWFjaCgod2hpdGVsaXN0ZWQpID0+XG4gICAge1xuICAgICAgICBwcm9wZXJ0aWVzW3doaXRlbGlzdGVkXSA9IHtcbiAgICAgICAgICAgIGdldDogbG9va3VwLmJpbmQobnVsbCwgd2hpdGVsaXN0ZWQpXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBydW5uZXIuYWRkaXRpb25hbFByb3BlcnRpZXMuZm9yRWFjaCgoYWRkaXRpb25hbCkgPT5cbiAgICB7XG4gICAgICAgIHByb3BlcnRpZXNbYWRkaXRpb25hbC5rZXldID0ge1xuICAgICAgICAgICAgZ2V0OiBhZGRpdGlvbmFsLmdldFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgcnVubmVyLnZhbGlkYXRpb25zLmZvckVhY2goICh2YWxpZGF0aW9uLCB2YWxpZGF0aW9uSW5kZXgpID0+XG4gICAge1xuICAgICAgICBwcm9wZXJ0aWVzW3ZhbGlkYXRpb24ua2V5XSA9IHtcbiAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbkluZGV4IDwgcHJveGllci5pbmRleClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXAodmFsaWRhdGlvbi5rZXkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSBydW5uZXIudmFsaWRhdGlvbnNbcHJveGllci5pbmRleF0ua2V5O1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBhY2Nlc3Mgc2V0dGluZyAnICsgdmFsaWRhdGlvbi5rZXkgKyAnIHdoaWxlIHZhbGlkYXRpbmcgJyArIGN1cnJlbnRLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJveGllci5wcm94eSwgcHJvcGVydGllcyk7XG5cbiAgICByZXR1cm4gcHJveGllcjtcbn1cblxuZnVuY3Rpb24gZW1pdFdhcm5pbmcgKGtleSwgb3JpZ2luYWwsIGNvcnJlY3RlZClcbntcbiAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgZm9yICcgKyBrZXkgKyAnOiAnICsgb3JpZ2luYWwgKyAnLiBVc2luZyAnICsgY29ycmVjdGVkICsgJyBpbnN0ZWFkLicpO1xufVxuXG5mdW5jdGlvbiBsb29rdXBWYWx1ZSAoYmFzZSwgZXh0ZW5zaW9uLCBrZXkpXG57XG4gICAgaWYgKGtleSBpbiBleHRlbnNpb24pXG4gICAge1xuICAgICAgICByZXR1cm4gZXh0ZW5zaW9uW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2Vba2V5XTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXdwb3J0XG57XG4gICAgY29uc3RydWN0b3IgKG91dGVyLCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25Ub2xlcmFuY2UgPSBvcHRpb25zLmludGVyc2VjdGlvblRvbGVyYW5jZSB8fCAwO1xuICAgICAgICB0aGlzLm91dGVyID0gb3V0ZXI7XG4gICAgICAgIHRoaXMuX3RvcCA9IHRoaXMuX2xlZnQgPSB0aGlzLl93aWR0aCA9IHRoaXMuX2hlaWdodCA9IHRoaXMuX2lubmVyRGltZW5zaW9ucyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0c1JlZ2lvbiAocmVnaW9uKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzSG9yaXpvbnRhbE92ZXJsYXAocmVnaW9uKSAmJiB0aGlzLmhhc1ZlcnRpY2FsT3ZlcmxhcChyZWdpb24pO1xuICAgIH1cblxuICAgIGhhc1ZlcnRpY2FsT3ZlcmxhcCAocmVnaW9uKVxuICAgIHtcbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy50b3AgLSB0aGlzLmludGVyc2VjdGlvblRvbGVyYW5jZTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gdGhpcy5ib3R0b20gKyB0aGlzLmludGVyc2VjdGlvblRvbGVyYW5jZTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZmFsbHNCZXR3ZWVuKHJlZ2lvbi50b3AsIHRvcCwgYm90dG9tKSB8fFxuICAgICAgICAgICAgZmFsbHNCZXR3ZWVuKHJlZ2lvbi5ib3R0b20sIHRvcCwgYm90dG9tKSB8fFxuICAgICAgICAgICAgKHJlZ2lvbi50b3AgPD0gdG9wICYmIHJlZ2lvbi5ib3R0b20gPj0gYm90dG9tKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGhhc0hvcml6b250YWxPdmVybGFwIChyZWdpb24pXG4gICAge1xuICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy5sZWZ0IC0gdGhpcy5pbnRlcnNlY3Rpb25Ub2xlcmFuY2U7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5yaWdodCArIHRoaXMuaW50ZXJzZWN0aW9uVG9sZXJhbmNlO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBmYWxsc0JldHdlZW4ocmVnaW9uLmxlZnQsIGxlZnQsIHJpZ2h0KSB8fFxuICAgICAgICAgICAgZmFsbHNCZXR3ZWVuKHJlZ2lvbi5yaWdodCwgbGVmdCwgcmlnaHQpIHx8XG4gICAgICAgICAgICAocmVnaW9uLmxlZnQgPD0gbGVmdCAmJiByZWdpb24ucmlnaHQgPj0gcmlnaHQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaW52YWxpZGF0ZSAoKVxuICAgIHtcbiAgICAgICAgLy8gRklYTUU6IFNob3VsZCB0aGlzIGNoZWNrIHRoZSBpbm5lciBkaW1lbnNpb25zIGFzIHdlbGw/XG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5vdXRlci5jbGllbnRXaWR0aDtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gdGhpcy5vdXRlci5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5fdG9wID0gdGhpcy5vdXRlci5zY3JvbGxUb3A7XG4gICAgICAgIHRoaXMuX2xlZnQgPSB0aGlzLm91dGVyLnNjcm9sbExlZnQ7XG4gICAgfVxuXG4gICAgc2V0SW5uZXJEaW1lbnNpb25zIChkaW1lbnNpb25zKVxuICAgIHtcbiAgICAgICAgdGhpcy5faW5uZXJEaW1lbnNpb25zID0gZGltZW5zaW9ucztcblxuICAgICAgICBpZiAoZGltZW5zaW9ucylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdG9wID0gY2xhbXAodGhpcy5fdG9wLCAwLCBkaW1lbnNpb25zLmhlaWdodCAtIHRoaXMuX2hlaWdodCk7XG4gICAgICAgICAgICB0aGlzLl9sZWZ0ID0gY2xhbXAodGhpcy5fbGVmdCwgMCwgZGltZW5zaW9ucy53aWR0aCAtIHRoaXMuX3dpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVmlld3BvcnQucHJvdG90eXBlLCB7XG4gICAgdG9wOiBnZXRDb29yZGluYXRlRGVzY3JpcHRvcigndG9wJywgJ2hlaWdodCcpLFxuICAgIGxlZnQ6IGdldENvb3JkaW5hdGVEZXNjcmlwdG9yKCdsZWZ0JywgJ3dpZHRoJyksXG5cbiAgICB3aWR0aDogZ2V0RGltZW5zaW9uRGVzY3JpcHRvcignd2lkdGgnKSxcbiAgICBoZWlnaHQ6IGdldERpbWVuc2lvbkRlc2NyaXB0b3IoJ2hlaWdodCcpLFxuXG4gICAgYm90dG9tOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvcCArIHRoaXMuX2hlaWdodDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGVmdCArIHRoaXMuX3dpZHRoO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIGdldENvb3JkaW5hdGVEZXNjcmlwdG9yIChjb29yZCwgYXNzb2NpYXRlZERpbWVuc2lvbilcbntcbiAgICBjb25zdCBwcml2YXRlUHJvcCA9ICdfJyArIGNvb3JkO1xuICAgIGNvbnN0IHNvdXJjZSA9ICdzY3JvbGwnICsgY29vcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjb29yZC5zbGljZSgxKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbcHJpdmF0ZVByb3BdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdWYWx1ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9pbm5lckRpbWVuc2lvbnMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4QWxsb3dlZCA9IHRoaXMuX2lubmVyRGltZW5zaW9uc1thc3NvY2lhdGVkRGltZW5zaW9uXSAtIHRoaXNbYXNzb2NpYXRlZERpbWVuc2lvbl07XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZCA9IGNsYW1wKG5ld1ZhbHVlLCAwLCBtYXhBbGxvd2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkID0gY2xhbXBNaW4obmV3VmFsdWUsIDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzW3ByaXZhdGVQcm9wXSA9IHRoaXMub3V0ZXJbc291cmNlXSA9IG5vcm1hbGl6ZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25EZXNjcmlwdG9yIChkaW1lbilcbntcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzWydfJyArIGRpbWVuXTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZhbGxzQmV0d2VlbiAocG9pbnQsIHN0YXJ0LCBlbmQpXG57XG4gICAgcmV0dXJuIHBvaW50ID49IHN0YXJ0ICYmIHBvaW50IDw9IGVuZDtcbn1cblxuZnVuY3Rpb24gY2xhbXAgKHZhbHVlLCBtaW4sIG1heClcbntcbiAgICByZXR1cm4gY2xhbXBNaW4oY2xhbXBNYXgodmFsdWUsIG1heCksIG1pbik7XG59XG5cbmZ1bmN0aW9uIGNsYW1wTWluICh2YWx1ZSwgbWluKVxue1xuICAgIHJldHVybiBNYXRoLm1heCh2YWx1ZSwgbWluKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBNYXggKHZhbHVlLCBtYXgpXG57XG4gICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCBtYXgpO1xufVxuIiwiaW1wb3J0IHsgZWx0IH0gZnJvbSAnLi91dGlscy9lbHQnO1xuaW1wb3J0IGdldFNjcm9sbGJhcldpZHRoIGZyb20gJy4vdXRpbHMvZ2V0LXNjcm9sbGJhci13aWR0aCc7XG5pbXBvcnQgZ2VzdHVyZUV2ZW50cyBmcm9tICcuL2dlc3R1cmUtZXZlbnRzJztcbmltcG9ydCBkaXZhIGZyb20gJy4vZGl2YS1nbG9iYWwnO1xuaW1wb3J0IERvY3VtZW50SGFuZGxlciBmcm9tICcuL2RvY3VtZW50LWhhbmRsZXInO1xuaW1wb3J0IEdyaWRIYW5kbGVyIGZyb20gJy4vZ3JpZC1oYW5kbGVyJztcbmltcG9ydCBQYWdlT3ZlcmxheU1hbmFnZXIgZnJvbSAnLi9wYWdlLW92ZXJsYXktbWFuYWdlcic7XG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9yZW5kZXJlcic7XG5pbXBvcnQgZ2V0UGFnZUxheW91dHMgZnJvbSAnLi9wYWdlLWxheW91dHMnO1xuaW1wb3J0IGNyZWF0ZVNldHRpbmdzVmlldyBmcm9tICcuL3NldHRpbmdzLXZpZXcnO1xuaW1wb3J0IFZhbGlkYXRpb25SdW5uZXIgZnJvbSAnLi92YWxpZGF0aW9uLXJ1bm5lcic7XG5pbXBvcnQgVmlld3BvcnQgZnJvbSAnLi92aWV3cG9ydCc7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZGl2YTpWaWV3ZXJDb3JlJyk7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlSWQoKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlSWQuY291bnRlcisrO1xufVxuZ2VuZXJhdGVJZC5jb3VudGVyID0gMTtcblxuXG4vLyBEZWZpbmUgdmFsaWRhdGlvbnNcbmNvbnN0IG9wdGlvbnNWYWxpZGF0aW9ucyA9IFtcbiAgICB7XG4gICAgICAgIGtleTogJ2dvRGlyZWN0bHlUbycsXG4gICAgICAgIHZhbGlkYXRlOiAodmFsdWUsIHNldHRpbmdzKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBrZXk6ICdtaW5QYWdlc1BlclJvdycsXG4gICAgICAgIHZhbGlkYXRlOiAodmFsdWUpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgyLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAga2V5OiAnbWF4UGFnZXNQZXJSb3cnLFxuICAgICAgICB2YWxpZGF0ZTogKHZhbHVlLCBzZXR0aW5ncykgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHZhbHVlLCBzZXR0aW5ncy5taW5QYWdlc1BlclJvdyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAga2V5OiAncGFnZXNQZXJSb3cnLFxuICAgICAgICB2YWxpZGF0ZTogKHZhbHVlLCBzZXR0aW5ncykgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byB0aGUgbWF4aW11bVxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgc2V0dGluZ3MubWluUGFnZXNQZXJSb3cgfHwgdmFsdWUgPiBzZXR0aW5ncy5tYXhQYWdlc1BlclJvdylcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3MubWF4UGFnZXNQZXJSb3c7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAga2V5OiAnbWF4Wm9vbUxldmVsJyxcbiAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSwgc2V0dGluZ3MsIGNvbmZpZykgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgLy8gQ2hhbmdpbmcgdGhpcyB2YWx1ZSBpc24ndCByZWFsbHkgYW4gZXJyb3IsIGl0IGp1c3QgZGVwZW5kcyBvbiB0aGVcbiAgICAgICAgICAgIC8vIHNvdXJjZSBtYW5pZmVzdFxuICAgICAgICAgICAgY29uZmlnLnN1cHByZXNzV2FybmluZygpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gc2V0dGluZ3MubWFuaWZlc3QubWF4Wm9vbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3MubWFuaWZlc3QubWF4Wm9vbTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBrZXk6ICdtaW5ab29tTGV2ZWwnLFxuICAgICAgICB2YWxpZGF0ZTogKHZhbHVlLCBzZXR0aW5ncywgY29uZmlnKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBDaGFuZ2VzIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCB2YWx1ZSBzaG91bGRuJ3QgdHJpZ2dlciBhXG4gICAgICAgICAgICAvLyB3YXJuaW5nXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBzZXR0aW5ncy5tYW5pZmVzdC5tYXhab29tKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5zdXBwcmVzc1dhcm5pbmcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IHNldHRpbmdzLm1heFpvb21MZXZlbClcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBrZXk6ICd6b29tTGV2ZWwnLFxuICAgICAgICB2YWxpZGF0ZTogKHZhbHVlLCBzZXR0aW5ncywgY29uZmlnKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPiBzZXR0aW5ncy5tYW5pZmVzdC5tYXhab29tKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5zdXBwcmVzc1dhcm5pbmcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgc2V0dGluZ3MubWluWm9vbUxldmVsIHx8IHZhbHVlID4gc2V0dGluZ3MubWF4Wm9vbUxldmVsKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5taW5ab29tTGV2ZWw7XG4gICAgICAgIH1cbiAgICB9XG5dO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3ZXJDb3JlXG57XG4gICAgY29uc3RydWN0b3IgKGVsZW1lbnQsIG9wdGlvbnMsIHB1YmxpY0luc3RhbmNlKVxuICAgIHtcbiAgICAgICAgdGhpcy5wYXJlbnRPYmplY3QgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnB1YmxpY0luc3RhbmNlID0gcHVibGljSW5zdGFuY2U7XG5cbiAgICAgICAgLy8gVGhpbmdzIHRoYXQgY2Fubm90IGJlIGNoYW5nZWQgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZXkgYXJlIHVzZWQgYnkgdGhlIHNjcmlwdFxuICAgICAgICAvLyBNYW55IG9mIHRoZXNlIGFyZSBkZWNsYXJlZCB3aXRoIGFyYml0cmFyeSB2YWx1ZXMgdGhhdCBhcmUgY2hhbmdlZCBsYXRlciBvblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlID0ge1xuICAgICAgICAgICAgY3VycmVudFBhZ2VJbmRpY2VzOiBbMF0sICAgIC8vIFRoZSB2aXNpYmxlIHBhZ2VzIGluIHRoZSB2aWV3cG9ydFxuICAgICAgICAgICAgYWN0aXZlUGFnZUluZGV4OiAwLCAgICAgICAgIC8vIFRoZSBjdXJyZW50ICdhY3RpdmUnIHBhZ2UgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiAwLCAgICAgICAgLy8gRGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBkaXZhIGVsZW1lbnQgdG8gdGhlIHRvcCBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgICAgICBob3Jpem9udGFsUGFkZGluZzogMCwgICAgICAgLy8gRWl0aGVyIHRoZSBmaXhlZCBwYWRkaW5nIG9yIGFkYXB0aXZlIHBhZGRpbmdcbiAgICAgICAgICAgIElEOiBudWxsLCAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJlZml4IG9mIHRoZSBJRHMgb2YgdGhlIGVsZW1lbnRzICh1c3VhbGx5IDEtZGl2YS0pXG4gICAgICAgICAgICBpbml0aWFsS2V5U2Nyb2xsOiBmYWxzZSwgICAgLy8gSG9sZHMgdGhlIGluaXRpYWwgc3RhdGUgb2YgZW5hYmxlS2V5U2Nyb2xsXG4gICAgICAgICAgICBpbml0aWFsU3BhY2VTY3JvbGw6IGZhbHNlLCAgLy8gSG9sZHMgdGhlIGluaXRpYWwgc3RhdGUgb2YgZW5hYmxlU3BhY2VTY3JvbGxcbiAgICAgICAgICAgIGlubmVyRWxlbWVudDogbnVsbCwgICAgICAgICAvLyBUaGUgbmF0aXZlIC5kaXZhLW91dGVyIERPTSBvYmplY3RcbiAgICAgICAgICAgIGlubmVyT2JqZWN0OiB7fSwgICAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZXR0aW5ncy5JRCArICdpbm5lcicpLCBmb3Igc2VsZWN0aW5nIHRoZSAuZGl2YS1pbm5lciBlbGVtZW50XG4gICAgICAgICAgICBpc0FjdGl2ZURpdmE6IHRydWUsICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBtdWx0aXBsZSBkaXZhIHBhbmVzIGV4aXN0IG9uIHRoZSBzYW1lIHBhZ2UsIHRoaXMgc2hvdWxkIGhhdmUgZXZlbnRzIGZ1bm5lbGVkIHRvIGl0LlxuICAgICAgICAgICAgaXNTY3JvbGxhYmxlOiB0cnVlLCAgICAgICAgIC8vIFVzZWQgaW4gZW5hYmxlL2Rpc2FibGVTY3JvbGxhYmxlIHB1YmxpYyBtZXRob2RzXG4gICAgICAgICAgICBpc1pvb21pbmc6IGZhbHNlLCAgICAgICAgICAgLy8gRmxhZyB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgem9vbWluZyBpcyBzdGlsbCBpbiBwcm9ncmVzcywgZm9yIGhhbmRsZVpvb21cbiAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsICAgICAgICAgICAgICAvLyBBIGZsYWcgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBsb2FkZWQgYW5kIHJlYWR5IHRvIGdvLlxuICAgICAgICAgICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgICAgICAgICBtb2JpbGVXZWJraXQ6IGZhbHNlLCAgICAgICAgLy8gQ2hlY2tzIGlmIHRoZSB1c2VyIGlzIG9uIGEgdG91Y2ggZGV2aWNlIChpUGFkL2lQb2QvaVBob25lL0FuZHJvaWQpXG4gICAgICAgICAgICBudW1QYWdlczogMCwgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBhcnJheVxuICAgICAgICAgICAgb2xkWm9vbUxldmVsOiAtMSwgICAgICAgICAgIC8vIEhvbGRzIHRoZSBwcmV2aW91cyB6b29tIGxldmVsIGFmdGVyIHpvb21pbmcgaW4gb3Igb3V0XG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgICAgb3V0ZXJFbGVtZW50OiBudWxsLCAgICAgICAgIC8vIFRoZSBuYXRpdmUgLmRpdmEtb3V0ZXIgRE9NIG9iamVjdFxuICAgICAgICAgICAgb3V0ZXJPYmplY3Q6IHt9LCAgICAgICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNldHRpbmdzLklEICsgJ291dGVyJyksIGZvciBzZWxlY3RpbmcgdGhlIC5kaXZhLW91dGVyIGVsZW1lbnRcbiAgICAgICAgICAgIHBhZ2VPdmVybGF5czogbmV3IFBhZ2VPdmVybGF5TWFuYWdlcigpLFxuICAgICAgICAgICAgcGFnZVRvb2xzOiBbXSwgICAgICAgICAgICAgIC8vIFRoZSBwbHVnaW5zIHdoaWNoIGFyZSBlbmFibGVkIGFzIHBhZ2UgdG9vbHNcbiAgICAgICAgICAgIHBhcmVudE9iamVjdDogdGhpcy5wYXJlbnRPYmplY3QsIC8vIEpRdWVyeSBvYmplY3QgcmVmZXJlbmNpbmcgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICAgICAgICBwZW5kaW5nTWFuaWZlc3RSZXF1ZXN0OiBudWxsLCAvLyBSZWZlcmVuY2UgdG8gdGhlIHhociByZXF1ZXN0IHJldHJpZXZpbmcgdGhlIG1hbmlmZXN0LiBVc2VkIHRvIGNhbmNlbCB0aGUgcmVxdWVzdCBvbiBkZXN0cm95KClcbiAgICAgICAgICAgIHBsdWdpbkluc3RhbmNlczogW10sICAgICAgICAgICAgICAgIC8vIEZpbGxlZCB3aXRoIHRoZSBlbmFibGVkIHBsdWdpbnMgZnJvbSB0aGUgcmVnaXN0cnlcbiAgICAgICAgICAgIHJlbmRlcmVyOiBudWxsLFxuICAgICAgICAgICAgcmVzaXplVGltZXI6IC0xLCAgICAgICAgICAgIC8vIEhvbGRzIHRoZSBJRCBvZiB0aGUgdGltZW91dCB1c2VkIHdoZW4gcmVzaXppbmcgdGhlIHdpbmRvdyAoZm9yIGNsZWFyaW5nKVxuICAgICAgICAgICAgc2Nyb2xsYmFyV2lkdGg6IDAsICAgICAgICAgIC8vIFNldCB0byB0aGUgYWN0dWFsIHNjcm9sbGJhciB3aWR0aCBpbiBpbml0KClcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnJywgICAgICAgICAgICAgICAvLyBVc2VzIHRoZSBnZW5lcmF0ZWQgSUQgcHJlZml4IHRvIGVhc2lseSBzZWxlY3QgZWxlbWVudHNcbiAgICAgICAgICAgIHRocm9iYmVyVGltZW91dElEOiAtMSwgICAgICAvLyBIb2xkcyB0aGUgSUQgb2YgdGhlIHRocm9iYmVyIGxvYWRpbmcgdGltZW91dFxuICAgICAgICAgICAgdG9vbGJhcjogbnVsbCwgICAgICAgICAgICAgIC8vIEhvbGRzIGFuIG9iamVjdCB3aXRoIHNvbWUgdG9vbGJhci1yZWxhdGVkIGZ1bmN0aW9uc1xuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IDAsICAgICAgICAgIC8vIERpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgZGl2YSBlbGVtZW50IHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgdmVydGljYWxQYWRkaW5nOiAwLCAgICAgICAgIC8vIEVpdGhlciB0aGUgZml4ZWQgcGFkZGluZyBvciBhZGFwdGl2ZSBwYWRkaW5nXG4gICAgICAgICAgICB2aWV3SGFuZGxlcjogbnVsbCxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBudWxsLCAgICAgICAgICAgICAvLyBPYmplY3QgY2FjaGluZyB0aGUgdmlld3BvcnQgZGltZW5zaW9uc1xuICAgICAgICAgICAgdmlld3BvcnRFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgdmlld3BvcnRPYmplY3Q6IG51bGwsXG4gICAgICAgICAgICB6b29tRHVyYXRpb246IDQwMFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBjcmVhdGVTZXR0aW5nc1ZpZXcoW29wdGlvbnMsIHRoaXMudmlld2VyU3RhdGVdKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSBhbiBJRCB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcHJlZml4IGZvciBhbGwgdGhlIG90aGVyIElEc1xuICAgICAgICBjb25zdCBpZE51bWJlciA9IGdlbmVyYXRlSWQoKTtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5JRCA9ICdkaXZhLScgKyBpZE51bWJlciArICctJztcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5zZWxlY3RvciA9IHRoaXMuc2V0dGluZ3MuSUQ7XG5cbiAgICAgICAgLy8gQWxpYXNlcyBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnNldHRpbmdzLCB7XG4gICAgICAgICAgICAvLyBIZWlnaHQgb2YgdGhlIGRvY3VtZW50IHZpZXdlciBwYW5lXG4gICAgICAgICAgICBwYW5lbEhlaWdodDoge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gV2lkdGggb2YgdGhlIGRvY3VtZW50IHZpZXdlciBwYW5lXG4gICAgICAgICAgICBwYW5lbFdpZHRoOiB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9wdGlvbnNWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdGlvblJ1bm5lcih7XG4gICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiAnbWFuaWZlc3QnLFxuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN0YXRlLm1hbmlmZXN0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcblxuICAgICAgICAgICAgdmFsaWRhdGlvbnM6IG9wdGlvbnNWYWxpZGF0aW9uc1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnNjcm9sbGJhcldpZHRoID0gZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcblxuICAgICAgICAvLyBJZiB3aW5kb3cub3JpZW50YXRpb24gaXMgZGVmaW5lZCwgdGhlbiBpdCdzIHByb2JhYmx5IG1vYmlsZVdlYmtpdFxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm1vYmlsZVdlYmtpdCA9IHdpbmRvdy5vcmllbnRhdGlvbiAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmhhc2hQYXJhbVN1ZmZpeCA9PT0gbnVsbClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gT21pdCB0aGUgc3VmZml4IGZyb20gdGhlIGZpcnN0IGluc3RhbmNlXG4gICAgICAgICAgICBpZiAoaWROdW1iZXIgPT09IDEpXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oYXNoUGFyYW1TdWZmaXggPSAnJztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhhc2hQYXJhbVN1ZmZpeCA9IGlkTnVtYmVyICsgJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGlubmVyIGFuZCBvdXRlciBwYW5lbHNcbiAgICAgICAgY29uc3QgaW5uZXJFbGVtID0gZWx0KCdkaXYnLCB0aGlzLmVsZW1BdHRycygnaW5uZXInLCB7IGNsYXNzOiAnZGl2YS1pbm5lcicgfSkpO1xuICAgICAgICBjb25zdCB2aWV3cG9ydEVsZW0gPSBlbHQoJ2RpdicsIHRoaXMuZWxlbUF0dHJzKCd2aWV3cG9ydCcpLCBpbm5lckVsZW0pO1xuICAgICAgICBjb25zdCBvdXRlckVsZW0gPSBlbHQoJ2RpdicsIHRoaXMuZWxlbUF0dHJzKCdvdXRlcicpLFxuICAgICAgICAgICAgdmlld3BvcnRFbGVtLFxuICAgICAgICAgICAgZWx0KCdkaXYnLCB0aGlzLmVsZW1BdHRycygndGhyb2JiZXInKSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgeyBjbGFzczogJ2N1YmUgY3ViZTEnIH0pLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdjdWJlIGN1YmUyJyB9KSxcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdkaXYnLCB7IGNsYXNzOiAnY3ViZSBjdWJlMycgfSksXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgeyBjbGFzczogJ2N1YmUgY3ViZTQnIH0pLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdjdWJlIGN1YmU1JyB9KSxcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdkaXYnLCB7IGNsYXNzOiAnY3ViZSBjdWJlNicgfSksXG4gICAgICAgICAgICAgICAgICAgIGVsdCgnZGl2JywgeyBjbGFzczogJ2N1YmUgY3ViZTcnIH0pLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHsgY2xhc3M6ICdjdWJlIGN1YmU4JyB9KSxcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdkaXYnLCB7IGNsYXNzOiAnY3ViZSBjdWJlOScgfSksXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pbm5lckVsZW1lbnQgPSBpbm5lckVsZW07XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm91dGVyRWxlbWVudCA9IG91dGVyRWxlbTtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmlubmVyT2JqZWN0ID0gaW5uZXJFbGVtO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0ID0gdmlld3BvcnRFbGVtO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm91dGVyT2JqZWN0ID0gb3V0ZXJFbGVtO1xuXG4gICAgICAgIHRoaXMuc2V0dGluZ3MucGFyZW50T2JqZWN0LmFwcGVuZChvdXRlckVsZW0pO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQgPSBuZXcgVmlld3BvcnQodGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGludGVyc2VjdGlvblRvbGVyYW5jZTogdGhpcy5zZXR0aW5ncy52aWV3cG9ydE1hcmdpblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJvdW5kU2Nyb2xsRnVuY3Rpb24gPSB0aGlzLnNjcm9sbEZ1bmN0aW9uLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYm91bmRFc2NhcGVMaXN0ZW5lciA9IHRoaXMuZXNjYXBlTGlzdGVuZXIuYmluZCh0aGlzKTtcblxuICAgICAgICAvLyBEbyBhbGwgdGhlIHBsdWdpbiBpbml0aWFsaXNhdGlvblxuICAgICAgICB0aGlzLmluaXRQbHVnaW5zKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlRXZlbnRzKCk7XG5cbiAgICAgICAgLy8gU2hvdyB0aGUgdGhyb2JiZXIgd2hpbGUgd2FpdGluZyBmb3IgdGhlIG1hbmlmZXN0IHRvIGxvYWRcbiAgICAgICAgdGhpcy5zaG93VGhyb2JiZXIoKTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkT3B0aW9uIChrZXksIHZhbHVlKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1ZhbGlkYXRvci5pc1ZhbGlkKGtleSwgdmFsdWUsIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucyk7XG4gICAgfVxuXG4gICAgZWxlbUF0dHJzIChpZGVudCwgYmFzZSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuSUQgKyBpZGVudCxcbiAgICAgICAgICAgIGNsYXNzOiAnZGl2YS0nICsgaWRlbnRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYmFzZSlcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF0dHJzLCBiYXNlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGF0dHJzO1xuICAgIH1cblxuICAgIGdldFBhZ2VEYXRhIChwYWdlSW5kZXgsIGF0dHJpYnV0ZSlcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3BhZ2VJbmRleF0uZFt0aGlzLnNldHRpbmdzLnpvb21MZXZlbF1bYXR0cmlidXRlXTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBzb21lIHNldHRpbmdzIGFuZCBlbXB0eSB0aGUgdmlld3BvcnRcbiAgICBjbGVhclZpZXdlciAoKVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3AgPSAwO1xuXG4gICAgICAgIC8vIENsZWFyIGFsbCB0aGUgdGltZW91dHMgdG8gcHJldmVudCB1bmRlc2lyZWQgcGFnZXMgZnJvbSBsb2FkaW5nXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdlclN0YXRlLnJlc2l6ZVRpbWVyKTtcbiAgICB9XG5cbiAgICBoYXNDaGFuZ2VkT3B0aW9uIChvcHRpb25zLCBrZXkpXG4gICAge1xuICAgICAgICByZXR1cm4ga2V5IGluIG9wdGlvbnMgJiYgb3B0aW9uc1trZXldICE9PSB0aGlzLnNldHRpbmdzW2tleV07XG4gICAgfVxuXG4gICAgLy9TaG9ydGN1dCBmb3IgY2xvc2luZyBmdWxsc2NyZWVuIHdpdGggdGhlIGVzY2FwZSBrZXlcbiAgICBlc2NhcGVMaXN0ZW5lciAoZSlcbiAgICB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDI3KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnB1YmxpY0luc3RhbmNlLmxlYXZlRnVsbHNjcmVlbk1vZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBzZXR0aW5ncyB0byBtYXRjaCB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuIExvYWQgdGhlIHZpZXdlcixcbiAgICAgKiBmaXJlIGFwcHJvcHJpYXRlIGV2ZW50cyBmb3IgY2hhbmdlZCBvcHRpb25zLlxuICAgICAqL1xuICAgIHJlbG9hZFZpZXdlciAobmV3T3B0aW9ucylcbiAgICB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IFtdO1xuXG4gICAgICAgIG5ld09wdGlvbnMgPSB0aGlzLm9wdGlvbnNWYWxpZGF0b3IuZ2V0VmFsaWRhdGVkT3B0aW9ucyh0aGlzLnNldHRpbmdzLCBuZXdPcHRpb25zKTtcblxuICAgICAgICAvLyBTZXQgdGhlIHpvb20gbGV2ZWwgaWYgdmFsaWQgYW5kIGZpcmUgYSBab29tTGV2ZWxEaWRDaGFuZ2UgZXZlbnRcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlZE9wdGlvbihuZXdPcHRpb25zLCAnem9vbUxldmVsJykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub2xkWm9vbUxldmVsID0gdGhpcy5zZXR0aW5ncy56b29tTGV2ZWw7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuem9vbUxldmVsID0gbmV3T3B0aW9ucy56b29tTGV2ZWw7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMucHVzaChbXCJab29tTGV2ZWxEaWRDaGFuZ2VcIiwgbmV3T3B0aW9ucy56b29tTGV2ZWxdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGFnZXMgcGVyIHJvdyBpZiB2YWxpZCBhbmQgZmlyZSBhbiBldmVudFxuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VkT3B0aW9uKG5ld09wdGlvbnMsICdwYWdlc1BlclJvdycpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMucGFnZXNQZXJSb3cgPSBuZXdPcHRpb25zLnBhZ2VzUGVyUm93O1xuICAgICAgICAgICAgcXVldWVkRXZlbnRzLnB1c2goW1wiR3JpZFJvd051bWJlckRpZENoYW5nZVwiLCBuZXdPcHRpb25zLnBhZ2VzUGVyUm93XSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdmVydGljYWxseU9yaWVudGVkIChubyBldmVudCBmaXJlZClcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlZE9wdGlvbihuZXdPcHRpb25zLCAndmVydGljYWxseU9yaWVudGVkJykpXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMudmVydGljYWxseU9yaWVudGVkID0gbmV3T3B0aW9ucy52ZXJ0aWNhbGx5T3JpZW50ZWQ7XG5cbiAgICAgICAgLy8gU2hvdy9IaWRlIG5vbi1wYWdlZCBwYWdlc1xuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VkT3B0aW9uKG5ld09wdGlvbnMsICdzaG93Tm9uUGFnZWRQYWdlcycpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuc2hvd05vblBhZ2VkUGFnZXMgPSBuZXdPcHRpb25zLnNob3dOb25QYWdlZFBhZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHBhZ2UgcG9zaXRpb24gKG5vIGV2ZW50IGZpcmVkIGhlcmUpXG4gICAgICAgIGlmICgnZ29EaXJlY3RseVRvJyBpbiBuZXdPcHRpb25zKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuZ29EaXJlY3RseVRvID0gbmV3T3B0aW9ucy5nb0RpcmVjdGx5VG87XG5cbiAgICAgICAgICAgIGlmICgndmVydGljYWxPZmZzZXQnIGluIG5ld09wdGlvbnMpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbE9mZnNldCA9IG5ld09wdGlvbnMudmVydGljYWxPZmZzZXQ7XG5cbiAgICAgICAgICAgIGlmICgnaG9yaXpvbnRhbE9mZnNldCcgaW4gbmV3T3B0aW9ucylcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxPZmZzZXQgPSBuZXdPcHRpb25zLmhvcml6b250YWxPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhlIGRlZmF1bHQgaXMgdG8gcmVtYWluIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5nb0RpcmVjdGx5VG8gPSB0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0NoYW5nZWRPcHRpb24obmV3T3B0aW9ucywgJ2luR3JpZCcpIHx8IHRoaXMuaGFzQ2hhbmdlZE9wdGlvbihuZXdPcHRpb25zLCAnaW5Cb29rTGF5b3V0JykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICgnaW5HcmlkJyBpbiBuZXdPcHRpb25zKVxuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5pbkdyaWQgPSBuZXdPcHRpb25zLmluR3JpZDtcblxuICAgICAgICAgICAgaWYgKCdpbkJvb2tMYXlvdXQnIGluIG5ld09wdGlvbnMpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zLmluQm9va0xheW91dCA9IG5ld09wdGlvbnMuaW5Cb29rTGF5b3V0O1xuXG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMucHVzaChbXCJWaWV3RGlkU3dpdGNoXCIsIHRoaXMuc2V0dGluZ3MuaW5HcmlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RlOiBwcmVwYXJlTW9kZUNoYW5nZSgpIGRlcGVuZHMgb24gaW5HcmlkIGFuZCB0aGUgdmVydGljYWwvaG9yaXpvbnRhbE9mZnNldCAoZm9yIG5vdylcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlZE9wdGlvbihuZXdPcHRpb25zLCAnaW5GdWxsc2NyZWVuJykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3B0aW9ucy5pbkZ1bGxzY3JlZW4gPSBuZXdPcHRpb25zLmluRnVsbHNjcmVlbjtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZU1vZGVDaGFuZ2UobmV3T3B0aW9ucyk7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMucHVzaChbXCJNb2RlRGlkU3dpdGNoXCIsIHRoaXMuc2V0dGluZ3MuaW5GdWxsc2NyZWVuXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyVmlld2VyKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld0hhbmRsZXJBbmRSZW5kZXJpbmcoKTtcblxuICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlcilcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gVE9ETzogVGhlIHVzYWdlIG9mIHBhZGRpbmcgdmFyaWFibGVzIGlzIHN0aWxsIHJlYWxseVxuICAgICAgICAgICAgLy8gbWVzc3kgYW5kIGluY29uc2lzdGVudFxuICAgICAgICAgICAgY29uc3QgcmVuZGVyZXJDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgcGFnZUxheW91dHM6IGdldFBhZ2VMYXlvdXRzKHRoaXMuc2V0dGluZ3MpLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMuZ2V0UGFkZGluZygpLFxuICAgICAgICAgICAgICAgIG1heFpvb21MZXZlbDogdGhpcy5zZXR0aW5ncy5pbkdyaWQgPyBudWxsIDogdGhpcy52aWV3ZXJTdGF0ZS5tYW5pZmVzdC5tYXhab29tLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsbHlPcmllbnRlZDogdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgfHwgdGhpcy5zZXR0aW5ncy5pbkdyaWQsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCB2aWV3cG9ydFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgIHpvb21MZXZlbDogdGhpcy5zZXR0aW5ncy5pbkdyaWQgPyBudWxsIDogdGhpcy5zZXR0aW5ncy56b29tTGV2ZWwsXG4gICAgICAgICAgICAgICAgYW5jaG9yUGFnZTogdGhpcy5zZXR0aW5ncy5nb0RpcmVjdGx5VG8sXG4gICAgICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IHRoaXMudmlld2VyU3RhdGUudmVydGljYWxPZmZzZXQsXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldDogdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsT2Zmc2V0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQcm92aWRlciA9IHRoaXMuZ2V0Q3VycmVudFNvdXJjZVByb3ZpZGVyKCk7XG5cbiAgICAgICAgICAgIGlmIChkZWJ1Zy5lbmFibGVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBPYmplY3Qua2V5cyhyZW5kZXJlckNvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5KVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb28gbG9uZ1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleSAhPT0gJ3BhZ2VMYXlvdXRzJyAmJiBrZXkgIT09ICdwYWRkaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5KVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlbmRlcmVyQ29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5ICsgJzogJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1ZygncmVsb2FkIHdpdGggJXMnLCBzZXJpYWxpemVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5sb2FkKHJlbmRlcmVyQ29uZmlnLCB2aWV3cG9ydFBvc2l0aW9uLCBzb3VyY2VQcm92aWRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZWRFdmVudHMuZm9yRWFjaCggKHBhcmFtcykgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wdWJsaXNoLmFwcGx5KHRoaXMsIHBhcmFtcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXMgc3dpdGNoaW5nIGluIGFuZCBvdXQgb2YgZnVsbHNjcmVlbiBtb2RlXG4gICAgcHJlcGFyZU1vZGVDaGFuZ2UgKG9wdGlvbnMpXG4gICAge1xuICAgICAgICAvLyBUb2dnbGUgdGhlIGNsYXNzZXNcbiAgICAgICAgY29uc3QgY2hhbmdlQ2xhc3MgPSBvcHRpb25zLmluRnVsbHNjcmVlbiA/ICdhZGQnIDogJ3JlbW92ZSc7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUub3V0ZXJPYmplY3QuY2xhc3NMaXN0W2NoYW5nZUNsYXNzXSgnZGl2YS1mdWxsc2NyZWVuJyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0W2NoYW5nZUNsYXNzXSgnZGl2YS1oaWRlLXNjcm9sbGJhcicpO1xuICAgICAgICB0aGlzLnNldHRpbmdzLnBhcmVudE9iamVjdC5jbGFzc0xpc3RbY2hhbmdlQ2xhc3NdKCdkaXZhLWZ1bGwtd2lkdGgnKTtcblxuICAgICAgICAvLyBBZGp1c3QgRGl2YSdzIGludGVybmFsIHBhbmVsIHNpemUsIGtlZXBpbmcgdGhlIG9sZCB2YWx1ZXNcbiAgICAgICAgY29uc3Qgc3RvcmVkSGVpZ2h0ID0gdGhpcy5zZXR0aW5ncy5wYW5lbEhlaWdodDtcbiAgICAgICAgY29uc3Qgc3RvcmVkV2lkdGggPSB0aGlzLnNldHRpbmdzLnBhbmVsV2lkdGg7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQuaW52YWxpZGF0ZSgpO1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgdGhlIG9yaWdpbmFsIGxvYWQsIHRoZSBvZmZzZXRzIG1hdHRlciwgYW5kIHRoZSBwb3NpdGlvbiBpc24ndCBiZWluZyBjaGFuZ2VkLi4uXG4gICAgICAgIGlmICghdGhpcy52aWV3ZXJTdGF0ZS5sb2FkZWQgJiYgIXRoaXMuc2V0dGluZ3MuaW5HcmlkICYmICEoJ3ZlcnRpY2FsT2Zmc2V0JyBpbiBvcHRpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy9nZXQgdGhlIHVwZGF0ZWQgcGFuZWwgc2l6ZVxuICAgICAgICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gdGhpcy5zZXR0aW5ncy5wYW5lbEhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoID0gdGhpcy5zZXR0aW5ncy5wYW5lbFdpZHRoO1xuXG4gICAgICAgICAgICAvL2FuZCByZS1jZW50ZXIgdGhlIG5ldyBwYW5lbCBvbiB0aGUgc2FtZSBwb2ludFxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbE9mZnNldCArPSAoKHN0b3JlZEhlaWdodCAtIG5ld0hlaWdodCkgLyAyKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbE9mZnNldCArPSAoKHN0b3JlZFdpZHRoIC0gbmV3V2lkdGgpIC8gMik7XG4gICAgICAgIH1cblxuICAgICAgICAvL3R1cm4gb24vb2ZmIGVzY2FwZSBrZXkgbGlzdGVuZXJcbiAgICAgICAgaWYgKG9wdGlvbnMuaW5GdWxsc2NyZWVuKVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmJvdW5kRXNjYXBlTGlzdGVuZXIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuYm91bmRFc2NhcGVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSB2aWV3IGhhbmRsZXIgYW5kIHRoZSB2aWV3IHJlbmRlcmluZyBmb3IgdGhlIGN1cnJlbnQgdmlld1xuICAgIHVwZGF0ZVZpZXdIYW5kbGVyQW5kUmVuZGVyaW5nICgpXG4gICAge1xuICAgICAgICBjb25zdCBIYW5kbGVyID0gdGhpcy5zZXR0aW5ncy5pbkdyaWQgPyBHcmlkSGFuZGxlciA6IERvY3VtZW50SGFuZGxlcjtcblxuICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlciAmJiAhKHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlcilcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIgPSBuZXcgSGFuZGxlcih0aGlzKTtcblxuICAgICAgICBpZiAoIXRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIpXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVSZW5kZXJlcigpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFRoaXMgY291bGQgcHJvYmFibHkgYmUgZG9uZSB1cG9uIFZpZXdlckNvcmUgaW5pdGlhbGl6YXRpb25cbiAgICBpbml0aWFsaXplUmVuZGVyZXIgKClcbiAgICB7XG4gICAgICAgIGNvbnN0IGNvbXBhdEVycm9ycyA9IFJlbmRlcmVyLmdldENvbXBhdGliaWxpdHlFcnJvcnMoKTtcblxuICAgICAgICBpZiAoY29tcGF0RXJyb3JzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcihjb21wYXRFcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydDogdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydCxcbiAgICAgICAgICAgICAgICBvdXRlckVsZW1lbnQ6IHRoaXMudmlld2VyU3RhdGUub3V0ZXJFbGVtZW50LFxuICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudDogdGhpcy52aWV3ZXJTdGF0ZS5pbm5lckVsZW1lbnQsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICAgICAgICAgIG9uVmlld1dpbGxMb2FkOiAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3SGFuZGxlci5vblZpZXdXaWxsTG9hZCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25WaWV3RGlkTG9hZDogKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnZU92ZXJsYXlzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIub25WaWV3RGlkTG9hZCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25WaWV3RGlkVXBkYXRlOiAocGFnZXMsIHRhcmdldFBhZ2UpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VPdmVybGF5cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdIYW5kbGVyLm9uVmlld0RpZFVwZGF0ZShwYWdlcywgdGFyZ2V0UGFnZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblZpZXdEaWRUcmFuc2l0aW9uOiAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYWdlT3ZlcmxheXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uUGFnZVdpbGxMb2FkOiAocGFnZUluZGV4KSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoKCdQYWdlV2lsbExvYWQnLCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25ab29tTGV2ZWxXaWxsQ2hhbmdlOiAoem9vbUxldmVsKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoKCdab29tTGV2ZWxXaWxsQ2hhbmdlJywgem9vbUxldmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG9wdGlvbnMsIGhvb2tzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEN1cnJlbnRTb3VyY2VQcm92aWRlciAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuaW5HcmlkKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBncmlkU291cmNlUHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgZ2V0QWxsWm9vbUxldmVsc0ZvclBhZ2U6IChwYWdlKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtncmlkU291cmNlUHJvdmlkZXIuZ2V0QmVzdFpvb21MZXZlbEZvclBhZ2UocGFnZSldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0QmVzdFpvb21MZXZlbEZvclBhZ2U6IChwYWdlKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5nZXRQYWdlSW1hZ2VVUkwocGFnZS5pbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHBhZ2UuZGltZW5zaW9ucy53aWR0aFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgem9vbUxldmVsOiAxLCAvLyBGSVhNRVxuICAgICAgICAgICAgICAgICAgICAgICAgcm93czogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tTGV2ZWw6IDEsIC8vIEZJWE1FXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBwYWdlLmRpbWVuc2lvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIGdyaWRTb3VyY2VQcm92aWRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbGVEaW1lbnNpb25zID0ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc2V0dGluZ3MudGlsZVdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnNldHRpbmdzLnRpbGVIZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0QmVzdFpvb21MZXZlbEZvclBhZ2U6IChwYWdlKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LmdldFBhZ2VJbWFnZVRpbGVzKHBhZ2UuaW5kZXgsIE1hdGguY2VpbCh0aGlzLnNldHRpbmdzLnpvb21MZXZlbCksIHRpbGVEaW1lbnNpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRBbGxab29tTGV2ZWxzRm9yUGFnZTogKHBhZ2UpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGV2ZWxzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgbGV2ZWxDb3VudCA9IHRoaXMudmlld2VyU3RhdGUubWFuaWZlc3QubWF4Wm9vbTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGxldmVsPTA7IGxldmVsIDw9IGxldmVsQ291bnQ7IGxldmVsKyspXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXZlbHMucHVzaCh0aGlzLnNldHRpbmdzLm1hbmlmZXN0LmdldFBhZ2VJbWFnZVRpbGVzKHBhZ2UuaW5kZXgsIGxldmVsLCB0aWxlRGltZW5zaW9ucykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldmVscy5yZXZlcnNlKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFBhZGRpbmcgKClcbiAgICB7XG4gICAgICAgIGxldCB0b3BQYWRkaW5nLCBsZWZ0UGFkZGluZztcbiAgICAgICAgbGV0IGRvY1ZQYWRkaW5nLCBkb2NIUGFkZGluZztcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRvY1ZQYWRkaW5nID0gdGhpcy5zZXR0aW5ncy5maXhlZFBhZGRpbmc7XG4gICAgICAgICAgICB0b3BQYWRkaW5nID0gbGVmdFBhZGRpbmcgPSBkb2NIUGFkZGluZyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0b3BQYWRkaW5nID0gdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgPyB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsUGFkZGluZyA6IDA7XG4gICAgICAgICAgICBsZWZ0UGFkZGluZyA9IHRoaXMuc2V0dGluZ3MudmVydGljYWxseU9yaWVudGVkID8gMCA6IHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgICAgICAgICAgIGRvY1ZQYWRkaW5nID0gdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgPyAwIDogdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbFBhZGRpbmc7XG4gICAgICAgICAgICBkb2NIUGFkZGluZyA9IHRoaXMuc2V0dGluZ3MudmVydGljYWxseU9yaWVudGVkID8gdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsUGFkZGluZyA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB0b3A6IGRvY1ZQYWRkaW5nLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogZG9jVlBhZGRpbmcsXG4gICAgICAgICAgICAgICAgbGVmdDogZG9jSFBhZGRpbmcsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IGRvY0hQYWRkaW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFnZToge1xuICAgICAgICAgICAgICAgIHRvcDogdG9wUGFkZGluZyxcbiAgICAgICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICAgICAgbGVmdDogbGVmdFBhZGRpbmcsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB1cGRhdGVQYWdlT3ZlcmxheXMgKClcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUucGFnZU92ZXJsYXlzLnVwZGF0ZU92ZXJsYXlzKFxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5nZXRSZW5kZXJlZFBhZ2VzKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gaGFuZGxlIGFueSB6b29tIGxldmVsXG4gICAgaGFuZGxlWm9vbSAobmV3Wm9vbUxldmVsLCBmb2NhbFBvaW50KVxuICAgIHtcbiAgICAgICAgLy8gSWYgdGhlIHpvb20gbGV2ZWwgcHJvdmlkZWQgaXMgaW52YWxpZCwgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkT3B0aW9uKCd6b29tTGV2ZWwnLCBuZXdab29tTGV2ZWwpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFdoaWxlIHpvb21pbmcsIGRvbid0IHVwZGF0ZSBzY3JvbGwgb2Zmc2V0cyBiYXNlZCBvbiB0aGUgc2NhbGVkIHZlcnNpb24gb2YgZGl2YS1pbm5lclxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuYm91bmRTY3JvbGxGdW5jdGlvbik7XG5cbiAgICAgICAgLy8gSWYgbm8gZm9jYWwgcG9pbnQgd2FzIGdpdmVuLCB6b29tIG9uIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgIGlmICghZm9jYWxQb2ludClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJlZ2lvbiA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIubGF5b3V0LmdldFBhZ2VSZWdpb24odGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgpO1xuXG4gICAgICAgICAgICBmb2NhbFBvaW50ID0ge1xuICAgICAgICAgICAgICAgIGFuY2hvclBhZ2U6IHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LFxuICAgICAgICAgICAgICAgIG9mZnNldDoge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAodmlld3BvcnQud2lkdGggLyAyKSAtIChjdXJyZW50UmVnaW9uLmxlZnQgLSB2aWV3cG9ydC5sZWZ0KSxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAodmlld3BvcnQuaGVpZ2h0IC8gMikgLSAoY3VycmVudFJlZ2lvbi50b3AgLSB2aWV3cG9ydC50b3ApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2VSZWdpb24gPSB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmxheW91dC5nZXRQYWdlUmVnaW9uKGZvY2FsUG9pbnQuYW5jaG9yUGFnZSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGRpc3RhbmNlIGZyb20gY3Vyc29yIGNvb3JkaW5hdGVzIHRvIGNlbnRlciBvZiB2aWV3cG9ydFxuICAgICAgICBjb25zdCBmb2NhbFhUb0NlbnRlciA9IChwYWdlUmVnaW9uLmxlZnQgKyBmb2NhbFBvaW50Lm9mZnNldC5sZWZ0KSAtXG4gICAgICAgICAgICAodGhpcy5zZXR0aW5ncy52aWV3cG9ydC5sZWZ0ICsgKHRoaXMuc2V0dGluZ3Mudmlld3BvcnQud2lkdGggLyAyKSk7XG4gICAgICAgIGNvbnN0IGZvY2FsWVRvQ2VudGVyID0gKHBhZ2VSZWdpb24udG9wICsgZm9jYWxQb2ludC5vZmZzZXQudG9wKSAtXG4gICAgICAgICAgICAodGhpcy5zZXR0aW5ncy52aWV3cG9ydC50b3AgKyAodGhpcy5zZXR0aW5ncy52aWV3cG9ydC5oZWlnaHQgLyAyKSk7XG5cbiAgICAgICAgY29uc3QgZ2V0UG9zaXRpb25Gb3Jab29tTGV2ZWwgPSAgKHpvb21MZXZlbCwgaW5pdFpvb20pID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHpvb21SYXRpbyA9IE1hdGgucG93KDIsIHpvb21MZXZlbCAtIGluaXRab29tKTtcblxuICAgICAgICAgICAgLy9UT0RPKGplcm9tZXBsKTogQ2FsY3VsYXRlIHBvc2l0aW9uIGZyb20gcGFnZSB0b3AgbGVmdCB0byB2aWV3cG9ydCB0b3AgbGVmdFxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGhvcml6b250YWwvdmVydGljYWxPZmZzZXQ6IGRpc3RhbmNlIGZyb20gdmlld3BvcnQgY2VudGVyIHRvIHBhZ2UgdXBwZXIgbGVmdCBjb3JuZXJcbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPSAoZm9jYWxQb2ludC5vZmZzZXQubGVmdCAqIHpvb21SYXRpbykgLSBmb2NhbFhUb0NlbnRlcjtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsT2Zmc2V0ID0gKGZvY2FsUG9pbnQub2Zmc2V0LnRvcCAqIHpvb21SYXRpbykgLSBmb2NhbFlUb0NlbnRlcjtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB6b29tTGV2ZWw6IHpvb21MZXZlbCxcbiAgICAgICAgICAgICAgICBhbmNob3JQYWdlOiBmb2NhbFBvaW50LmFuY2hvclBhZ2UsXG4gICAgICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IGhvcml6b250YWxPZmZzZXRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zLnpvb21MZXZlbCA9IG5ld1pvb21MZXZlbDtcbiAgICAgICAgbGV0IGluaXRpYWxab29tTGV2ZWwgPSB0aGlzLnZpZXdlclN0YXRlLm9sZFpvb21MZXZlbDtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vbGRab29tTGV2ZWwgPSB0aGlzLnNldHRpbmdzLnpvb21MZXZlbDtcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBnZXRQb3NpdGlvbkZvclpvb21MZXZlbChuZXdab29tTGV2ZWwsIGluaXRpYWxab29tTGV2ZWwpO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuZ29EaXJlY3RseVRvID0gZW5kUG9zaXRpb24uYW5jaG9yUGFnZTtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbE9mZnNldCA9IGVuZFBvc2l0aW9uLnZlcnRpY2FsT2Zmc2V0O1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxPZmZzZXQgPSBlbmRQb3NpdGlvbi5ob3Jpem9udGFsT2Zmc2V0O1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIudHJhbnNpdGlvblZpZXdwb3J0UG9zaXRpb24oe1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuc2V0dGluZ3Muem9vbUR1cmF0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgIHpvb21MZXZlbDoge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBpbml0aWFsWm9vbUxldmVsLFxuICAgICAgICAgICAgICAgICAgICB0bzogbmV3Wm9vbUxldmVsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFBvc2l0aW9uOiAocGFyYW1ldGVycykgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UG9zaXRpb25Gb3Jab29tTGV2ZWwocGFyYW1ldGVycy56b29tTGV2ZWwsIGluaXRpYWxab29tTGV2ZWwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRW5kOiAoaW5mbykgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuYm91bmRTY3JvbGxGdW5jdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5mby5pbnRlcnJ1cHRlZClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vbGRab29tTGV2ZWwgPSBuZXdab29tTGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlYWN0aXZhdGUgem9vbSBidXR0b25zIHdoaWxlIHpvb21pbmdcbiAgICAgICAgbGV0IHpvb21JbkJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2VsZWN0b3IgKyAnem9vbS1pbi1idXR0b24nKTtcbiAgICAgICAgbGV0IHpvb21PdXRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLnNlbGVjdG9yICsgJ3pvb20tb3V0LWJ1dHRvbicpO1xuICAgICAgICB6b29tSW5CdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB6b29tT3V0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB6b29tSW5CdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHpvb21PdXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy56b29tRHVyYXRpb24pO1xuXG4gICAgICAgIC8vIFNlbmQgb2ZmIHRoZSB6b29tIGxldmVsIGRpZCBjaGFuZ2UgZXZlbnQuXG4gICAgICAgIHRoaXMucHVibGlzaChcIlpvb21MZXZlbERpZENoYW5nZVwiLCBuZXdab29tTGV2ZWwpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgIEdldHMgdGhlIFktb2Zmc2V0IGZvciBhIHNwZWNpZmljIHBvaW50IG9uIGEgc3BlY2lmaWMgcGFnZVxuICAgICBBY2NlcHRhYmxlIHZhbHVlcyBmb3IgXCJhbmNob3JcIjpcbiAgICAgXCJ0b3BcIiAoZGVmYXVsdCkgLSB3aWxsIGFuY2hvciB0b3Agb2YgdGhlIHBhZ2UgdG8gdGhlIHRvcCBvZiB0aGUgZGl2YS1vdXRlciBlbGVtZW50XG4gICAgIFwiYm90dG9tXCIgLSB0b3AsIHMvdG9wL2JvdHRvbVxuICAgICBcImNlbnRlclwiIC0gd2lsbCBjZW50ZXIgdGhlIHBhZ2Ugb24gdGhlIGRpdmEgZWxlbWVudFxuICAgICBSZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGRpdmEtb3V0ZXIgZWxlbWVudCB0byB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IHBhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgYW5jaG9yXG4gICAgICovXG4gICAgZ2V0WU9mZnNldCAocGFnZUluZGV4LCBhbmNob3IpXG4gICAge1xuICAgICAgICBsZXQgcGlkeCA9ICh0eXBlb2YocGFnZUluZGV4KSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4IDogcGFnZUluZGV4KTtcblxuICAgICAgICBpZiAoYW5jaG9yID09PSBcImNlbnRlclwiIHx8IGFuY2hvciA9PT0gXCJjZW50cmVcIikgLy9ob3cgeW91IGNhbiB0ZWxsIGFuIEFtZXJpY2FuIGNvZGVkIHRoaXNcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0UGFnZURhdGEocGlkeCwgXCJoXCIpIC8gMiwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFuY2hvciA9PT0gXCJib3R0b21cIilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0UGFnZURhdGEocGlkeCwgXCJoXCIpIC0gdGhpcy5zZXR0aW5ncy5wYW5lbEhlaWdodCAvIDIsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnNldHRpbmdzLnBhbmVsSGVpZ2h0IC8gMiwgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9TYW1lIGFzIGdldFlPZmZzZXQgd2l0aCBcImxlZnRcIiBhbmQgXCJyaWdodFwiIGFzIGFjY2VwdGFibGUgdmFsdWVzIGluc3RlYWQgb2YgXCJ0b3BcIiBhbmQgXCJib3R0b21cIlxuICAgIGdldFhPZmZzZXQgKHBhZ2VJbmRleCwgYW5jaG9yKVxuICAgIHtcbiAgICAgICAgbGV0IHBpZHggPSAodHlwZW9mKHBhZ2VJbmRleCkgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCA6IHBhZ2VJbmRleCk7XG5cbiAgICAgICAgaWYgKGFuY2hvciA9PT0gXCJsZWZ0XCIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLnNldHRpbmdzLnBhbmVsV2lkdGggLyAyLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYW5jaG9yID09PSBcInJpZ2h0XCIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldFBhZ2VEYXRhKHBpZHgsIFwid1wiKSAtIHRoaXMuc2V0dGluZ3MucGFuZWxXaWR0aCAvIDIsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldFBhZ2VEYXRhKHBpZHgsIFwid1wiKSAvIDIsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHVwZGF0ZXMgcGFuZWxIZWlnaHQvcGFuZWxXaWR0aCBvbiByZXNpemVcbiAgICB1cGRhdGVQYW5lbFNpemUgKClcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQuaW52YWxpZGF0ZSgpO1xuXG4gICAgICAgIC8vIEZJWE1FKHdhYmFpbik6IFRoaXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIGNhbGxlZCBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0cygpO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5nb3RvKHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LCB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsT2Zmc2V0LCB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlT2Zmc2V0cyAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgcGFnZU9mZnNldCA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIubGF5b3V0LmdldFBhZ2VUb1ZpZXdwb3J0Q2VudGVyT2Zmc2V0KHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LCB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0KTtcblxuICAgICAgICBpZiAocGFnZU9mZnNldClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsT2Zmc2V0ID0gcGFnZU9mZnNldC54O1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbE9mZnNldCA9IHBhZ2VPZmZzZXQueTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJpbmQgbW91c2UgZXZlbnRzIChkcmFnIHRvIHNjcm9sbCwgZG91YmxlLWNsaWNrKVxuICAgIGJpbmRNb3VzZUV2ZW50cyAoKVxuICAgIHtcbiAgICAgICAgLy8gU2V0IGRyYWcgc2Nyb2xsIG9uIHRoZSB2aWV3cG9ydCBvYmplY3RcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydE9iamVjdC5jbGFzc0xpc3QuYWRkKCdkcmFnc2Nyb2xsJyk7XG5cbiAgICAgICAgZ2VzdHVyZUV2ZW50cy5vbkRvdWJsZUNsaWNrKHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3QsIChldmVudCwgY29vcmRzKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBkZWJ1ZygnRG91YmxlIGNsaWNrIGF0ICVzLCAlcycsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIub25Eb3VibGVDbGljayhldmVudCwgY29vcmRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25SZXNpemUgKClcbiAgICB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFuZWxTaXplKCk7XG4gICAgICAgIC8vIENhbmNlbCBhbnkgcHJldmlvdXNseS1zZXQgcmVzaXplIHRpbWVvdXRzXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdlclN0YXRlLnJlc2l6ZVRpbWVyKTtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlc2l6ZVRpbWVyID0gc2V0VGltZW91dCggKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcGFnZU9mZnNldCA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIubGF5b3V0LmdldFBhZ2VUb1ZpZXdwb3J0Q2VudGVyT2Zmc2V0KHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LCB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0KTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VPZmZzZXQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRWaWV3ZXIoe1xuICAgICAgICAgICAgICAgICAgICBnb0RpcmVjdGx5VG86IHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogcGFnZU9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiBwYWdlT2Zmc2V0LnhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICAgICAgICAgIGdvRGlyZWN0bHlUbzogdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIHRvdWNoIGFuZCBvcmllbnRhdGlvbiBjaGFuZ2UgZXZlbnRzXG4gICAgYmluZFRvdWNoRXZlbnRzICgpXG4gICAge1xuICAgICAgICAvLyBCbG9jayB0aGUgdXNlciBmcm9tIG1vdmluZyB0aGUgd2luZG93IG9ubHkgaWYgaXQncyBub3QgaW50ZWdyYXRlZFxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5ibG9ja01vYmlsZU1vdmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgKGV2ZW50KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBldmVudC5vcmlnaW5hbEV2ZW50O1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG91Y2ggZXZlbnRzIGZvciBzd2lwaW5nIGluIHRoZSB2aWV3cG9ydCB0byBzY3JvbGwgcGFnZXNcbiAgICAgICAgLy8gdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydE9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbEZ1bmN0aW9uLmJpbmQodGhpcykpO1xuXG4gICAgICAgIGdlc3R1cmVFdmVudHMub25QaW5jaCh0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LCBmdW5jdGlvbiAoZXZlbnQsIGNvb3Jkcywgc3RhcnQsIGVuZClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVidWcoJ1BpbmNoICVzIGF0ICVzLCAlcycsIGVuZCAtIHN0YXJ0LCBjb29yZHMubGVmdCwgY29vcmRzLnRvcCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdIYW5kbGVyLm9uUGluY2goZXZlbnQsIGNvb3Jkcywgc3RhcnQsIGVuZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGdlc3R1cmVFdmVudHMub25Eb3VibGVUYXAodGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydE9iamVjdCwgZnVuY3Rpb24gKGV2ZW50LCBjb29yZHMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlYnVnKCdEb3VibGUgdGFwIGF0ICVzLCAlcycsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld0hhbmRsZXIub25Eb3VibGVDbGljayhldmVudCwgY29vcmRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSBzY3JvbGxcbiAgICBzY3JvbGxGdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNUb3BTY3JvbGwgPSB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LnRvcDtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMZWZ0U2Nyb2xsID0gdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5sZWZ0O1xuXG4gICAgICAgIGxldCBkaXJlY3Rpb247XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5pbnZhbGlkYXRlKCk7XG5cbiAgICAgICAgY29uc3QgbmV3U2Nyb2xsVG9wID0gdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3A7XG4gICAgICAgIGNvbnN0IG5ld1Njcm9sbExlZnQgPSB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LmxlZnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MudmVydGljYWxseU9yaWVudGVkIHx8IHRoaXMuc2V0dGluZ3MuaW5HcmlkKVxuICAgICAgICAgICAgZGlyZWN0aW9uID0gbmV3U2Nyb2xsVG9wIC0gcHJldmlvdXNUb3BTY3JvbGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IG5ld1Njcm9sbExlZnQgLSBwcmV2aW91c0xlZnRTY3JvbGw7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5hZGp1c3QoKTtcblxuICAgICAgICBjb25zdCBwcmltYXJ5U2Nyb2xsID0gKHRoaXMuc2V0dGluZ3MudmVydGljYWxseU9yaWVudGVkIHx8IHRoaXMuc2V0dGluZ3MuaW5HcmlkKSA/IG5ld1Njcm9sbFRvcCA6IG5ld1Njcm9sbExlZnQ7XG5cbiAgICAgICAgdGhpcy5wdWJsaXNoKFwiVmlld2VyRGlkU2Nyb2xsXCIsIHByaW1hcnlTY3JvbGwpO1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2goXCJWaWV3ZXJEaWRTY3JvbGxEb3duXCIsIHByaW1hcnlTY3JvbGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA8IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucHVibGlzaChcIlZpZXdlckRpZFNjcm9sbFVwXCIsIHByaW1hcnlTY3JvbGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRzKCk7XG4gICAgfVxuXG4gICAgLy8gQmluZHMgbW9zdCBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgKHNvbWUgbW9yZSBpbiBjcmVhdGVUb29sYmFyKVxuICAgIGhhbmRsZUV2ZW50cyAoKVxuICAgIHtcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBjdXJzb3IgZm9yIGRyYWdnaW5nXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUuaW5uZXJPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pbm5lck9iamVjdC5jbGFzc0xpc3QuYWRkKCdkaXZhLWdyYWJiaW5nJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUuaW5uZXJPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaW5uZXJPYmplY3QuY2xhc3NMaXN0LnJlbW92ZSgnZGl2YS1ncmFiYmluZycpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJpbmRNb3VzZUV2ZW50cygpO1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuYm91bmRTY3JvbGxGdW5jdGlvbik7XG5cbiAgICAgICAgY29uc3QgdXBBcnJvd0tleSA9IDM4LCBkb3duQXJyb3dLZXkgPSA0MCwgbGVmdEFycm93S2V5ID0gMzcsIHJpZ2h0QXJyb3dLZXkgPSAzOSwgc3BhY2VLZXkgPSAzMiwgcGFnZVVwS2V5ID0gMzMsIHBhZ2VEb3duS2V5ID0gMzQsIGhvbWVLZXkgPSAzNiwgZW5kS2V5ID0gMzU7XG5cbiAgICAgICAgLy8gQ2F0Y2ggdGhlIGtleSBwcmVzc2VzIGluIGRvY3VtZW50XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24uZGl2YScsIChldmVudCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdlclN0YXRlLmlzQWN0aXZlRGl2YSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gU3BhY2Ugb3IgcGFnZSBkb3duIC0gZ28gdG8gdGhlIG5leHQgcGFnZVxuICAgICAgICAgICAgaWYgKCh0aGlzLnNldHRpbmdzLmVuYWJsZVNwYWNlU2Nyb2xsICYmICFldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXlDb2RlID09PSBzcGFjZUtleSkgfHwgKHRoaXMuc2V0dGluZ3MuZW5hYmxlS2V5U2Nyb2xsICYmIGV2ZW50LmtleUNvZGUgPT09IHBhZ2VEb3duS2V5KSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0LnRvcCArPSB0aGlzLnNldHRpbmdzLnBhbmVsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZVNwYWNlU2Nyb2xsICYmIGV2ZW50LmtleUNvZGUgPT09IHNwYWNlS2V5KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmVuYWJsZUtleVNjcm9sbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBzdGVhbCBrZXlib2FyZCBzaG9ydGN1dHMgKG1ldGFLZXkgPSBjb21tYW5kIFtPUyBYXSwgc3VwZXIgW1dpbi9MaW51eF0pXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHBhZ2VVcEtleTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhZ2UgdXAgLSBnbyB0byB0aGUgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3AgLT0gdGhpcy5zZXR0aW5ncy5wYW5lbEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIHVwQXJyb3dLZXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcCBhcnJvdyAtIHNjcm9sbCB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3AgLT0gdGhpcy5zZXR0aW5ncy5hcnJvd1Njcm9sbEFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIGRvd25BcnJvd0tleTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvd24gYXJyb3cgLSBzY3JvbGwgZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC50b3AgKz0gdGhpcy5zZXR0aW5ncy5hcnJvd1Njcm9sbEFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIGxlZnRBcnJvd0tleTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZnQgYXJyb3cgLSBzY3JvbGwgbGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5sZWZ0IC09IHRoaXMuc2V0dGluZ3MuYXJyb3dTY3JvbGxBbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSByaWdodEFycm93S2V5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmlnaHQgYXJyb3cgLSBzY3JvbGwgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQubGVmdCArPSB0aGlzLnNldHRpbmdzLmFycm93U2Nyb2xsQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgaG9tZUtleTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvbWUga2V5IC0gZ28gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQudG9wID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIGVuZEtleTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuZCBrZXkgLSBnbyB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb24gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGUgdmFsdWUgYmVpbmcgbm9ybWFsaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MudmVydGljYWxseU9yaWVudGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQudG9wID0gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydC5sZWZ0ID0gSW5maW5pdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRpdmEuRXZlbnRzLnN1YnNjcmliZSgnVmlld2VyRGlkVGVybWluYXRlJywgZnVuY3Rpb24oKVxuICAgICAgICB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duLmRpdmEnKTtcbiAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy5JRCk7XG5cbiAgICAgICAgLy8gdGhpcy5iaW5kVG91Y2hFdmVudHMoKTtcblxuICAgICAgICAvLyBIYW5kbGUgd2luZG93IHJlc2l6aW5nIGV2ZW50c1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICAgICAgZGl2YS5FdmVudHMuc3Vic2NyaWJlKCdWaWV3ZXJEaWRUZXJtaW5hdGUnLCBmdW5jdGlvbigpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG4gICAgICAgIH0sIHRoaXMuc2V0dGluZ3MuSUQpO1xuXG4gICAgICAgIC8vIEhhbmRsZSBvcmllbnRhdGlvbiBjaGFuZ2Ugc2VwYXJhdGVseVxuICAgICAgICBpZiAoJ29ub3JpZW50YXRpb25jaGFuZ2UnIGluIHdpbmRvdylcbiAgICAgICAge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICBkaXZhLkV2ZW50cy5zdWJzY3JpYmUoJ1ZpZXdlckRpZFRlcm1pbmF0ZScsIGZ1bmN0aW9uKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG4gICAgICAgICAgICB9LCB0aGlzLnNldHRpbmdzLklEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpdmEuRXZlbnRzLnN1YnNjcmliZSgnUGFuZWxTaXplRGlkQ2hhbmdlJywgdGhpcy51cGRhdGVQYW5lbFNpemUsIHRoaXMuc2V0dGluZ3MuSUQpO1xuXG4gICAgICAgIC8vIENsZWFyIHBhZ2UgYW5kIHJlc2l6ZSB0aW1lb3V0cyB3aGVuIHRoZSB2aWV3ZXIgaXMgZGVzdHJveWVkXG4gICAgICAgIGRpdmEuRXZlbnRzLnN1YnNjcmliZSgnVmlld2VyRGlkVGVybWluYXRlJywgKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5kZXN0cm95KCk7XG5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdlclN0YXRlLnJlc2l6ZVRpbWVyKTtcbiAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy5JRCk7XG4gICAgfVxuXG4gICAgaW5pdFBsdWdpbnMgKClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eSgncGx1Z2lucycpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5wbHVnaW5JbnN0YW5jZXMgPSB0aGlzLnNldHRpbmdzLnBsdWdpbnMubWFwKCAocGx1Z2luKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwID0gbmV3IHBsdWdpbih0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHAuaXNQYWdlVG9vbClcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnBhZ2VUb29scy5wdXNoKHApO1xuXG4gICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2hvd1Rocm9iYmVyICgpXG4gICAge1xuICAgICAgICB0aGlzLmhpZGVUaHJvYmJlcigpO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUudGhyb2JiZXJUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KCAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgdGhiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5zZWxlY3RvciArICd0aHJvYmJlcicpO1xuICAgICAgICAgICAgaWYgKHRoYikgdGhiLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9LCB0aGlzLnNldHRpbmdzLnRocm9iYmVyVGltZW91dCk7XG4gICAgfVxuXG4gICAgaGlkZVRocm9iYmVyICgpXG4gICAge1xuICAgICAgICAvLyBDbGVhciB0aGUgdGltZW91dCwgaWYgaXQgaGFzbid0IGV4ZWN1dGVkIHlldFxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3ZXJTdGF0ZS50aHJvYmJlclRpbWVvdXRJRCk7XG5cbiAgICAgICAgbGV0IHRoYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2VsZWN0b3IgKyAndGhyb2JiZXInKTtcbiAgICAgICAgLy8gSGlkZSB0aGUgdGhyb2JiZXIgaWYgaXQgaGFzIGFscmVhZHkgZXhlY3V0ZWRcbiAgICAgICAgaWYgKHRoYikgdGhiLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yIChtZXNzYWdlKVxuICAgIHtcbiAgICAgICAgY29uc3QgZXJyb3JFbGVtZW50ID0gZWx0KCdkaXYnLCB0aGlzLmVsZW1BdHRycygnZXJyb3InKSwgW1xuICAgICAgICAgICAgZWx0KCdidXR0b24nLCB0aGlzLmVsZW1BdHRycygnZXJyb3ItY2xvc2UnLCB7J2FyaWEtbGFiZWwnOiAnQ2xvc2UgZGlhbG9nJ30pKSxcbiAgICAgICAgICAgIGVsdCgncCcsXG4gICAgICAgICAgICAgICAgZWx0KCdzdHJvbmcnLCAnRXJyb3InKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGVsdCgnZGl2JywgbWVzc2FnZSlcbiAgICAgICAgXSk7XG5cbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vdXRlck9iamVjdC5hcHBlbmRDaGlsZChlcnJvckVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEJpbmQgZGlhbG9nIGNsb3NlIGJ1dHRvblxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLnNlbGVjdG9yICsgJ2Vycm9yLWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBlcnJvckVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlcnJvckVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRNYW5pZmVzdCAobWFuaWZlc3QsIGxvYWRPcHRpb25zKVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuXG4gICAgICAgIHRoaXMuaGlkZVRocm9iYmVyKCk7XG5cbiAgICAgICAgLy8gQ29udmVuaWVuY2UgdmFsdWVcbiAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5udW1QYWdlcyA9IHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXMubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMub3B0aW9uc1ZhbGlkYXRvci52YWxpZGF0ZSh0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMucHVibGlzaCgnTnVtYmVyT2ZQYWdlc0RpZENoYW5nZScsIHRoaXMuc2V0dGluZ3MubnVtUGFnZXMpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXItcGFnZSBwYWRkaW5nIGJhc2VkIG9uIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBhdmVyYWdlIHpvb20gbGV2ZWxcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuYWRhcHRpdmVQYWRkaW5nID4gMClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGguZmxvb3IoKHRoaXMuc2V0dGluZ3MubWluWm9vbUxldmVsICsgdGhpcy5zZXR0aW5ncy5tYXhab29tTGV2ZWwpIC8gMik7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxQYWRkaW5nID0gcGFyc2VJbnQodGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5nZXRBdmVyYWdlV2lkdGgoeikgKiB0aGlzLnNldHRpbmdzLmFkYXB0aXZlUGFkZGluZywgMTApO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbFBhZGRpbmcgPSBwYXJzZUludCh0aGlzLnNldHRpbmdzLm1hbmlmZXN0LmdldEF2ZXJhZ2VIZWlnaHQoeikgKiB0aGlzLnNldHRpbmdzLmFkYXB0aXZlUGFkZGluZywgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gSXQncyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMDsgdXNlIGZpeGVkUGFkZGluZyBpbnN0ZWFkXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmhvcml6b250YWxQYWRkaW5nID0gdGhpcy5zZXR0aW5ncy5maXhlZFBhZGRpbmc7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsUGFkZGluZyA9IHRoaXMuc2V0dGluZ3MuZml4ZWRQYWRkaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2ZXJ0aWNhbCBwYWRkaW5nIGlzIGF0IGxlYXN0IDQwLCBpZiBwbHVnaW4gaWNvbnMgYXJlIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUucGFnZVRvb2xzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbFBhZGRpbmcgPSBNYXRoLm1heCg0MCwgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbFBhZGRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgZGV0ZWN0IGEgdmlld2luZ0hpbnQgb2YgJ3BhZ2VkJyBpbiB0aGUgbWFuaWZlc3Qgb3Igc2VxdWVuY2UsIGVuYWJsZSBib29rIHZpZXcgYnkgZGVmYXVsdFxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zLmluQm9va0xheW91dCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQbHVnaW4gc2V0dXAgaG9va3Mgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBPYmplY3REaWRMb2FkIGV2ZW50XG4gICAgICAgIHRoaXMucHVibGlzaCgnT2JqZWN0RGlkTG9hZCcsIHRoaXMuc2V0dGluZ3MpO1xuXG4gICAgICAgIC8vIEFkanVzdCB0aGUgZG9jdW1lbnQgcGFuZWwgZGltZW5zaW9uc1xuICAgICAgICB0aGlzLnVwZGF0ZVBhbmVsU2l6ZSgpO1xuXG4gICAgICAgIGxldCBuZWVkc1hDb29yZCwgbmVlZHNZQ29vcmQ7XG5cbiAgICAgICAgbGV0IGFuY2hvcmVkVmVydGljYWxseSA9IGZhbHNlO1xuICAgICAgICBsZXQgYW5jaG9yZWRIb3Jpem9udGFsbHkgPSBmYWxzZTtcblxuICAgICAgICAvLyBOQjogYD09YCBoZXJlIHdpbGwgY2hlY2sgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgICAgaWYgKGxvYWRPcHRpb25zLmdvRGlyZWN0bHlUbyA9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICBsb2FkT3B0aW9ucy5nb0RpcmVjdGx5VG8gPSB0aGlzLnNldHRpbmdzLmdvRGlyZWN0bHlUbztcbiAgICAgICAgICAgIG5lZWRzWENvb3JkID0gbmVlZHNZQ29vcmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbmVlZHNYQ29vcmQgPSBsb2FkT3B0aW9ucy5ob3Jpem9udGFsT2Zmc2V0ID09IG51bGwgfHwgaXNOYU4obG9hZE9wdGlvbnMuaG9yaXpvbnRhbE9mZnNldCk7XG4gICAgICAgICAgICBuZWVkc1lDb29yZCA9IGxvYWRPcHRpb25zLnZlcnRpY2FsT2Zmc2V0ID09IG51bGwgfHwgaXNOYU4obG9hZE9wdGlvbnMudmVydGljYWxPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgb2Zmc2V0c1xuICAgICAgICBpZiAobmVlZHNYQ29vcmQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIGluQm9va0xheW91dC92ZXJ0aWNhbGx5T3JpZW50ZWQgaXMgY2hhbmdlZCBieSBsb2FkT3B0aW9ucz9cbiAgICAgICAgICAgIGlmIChsb2FkT3B0aW9ucy5nb0RpcmVjdGx5VG8gPT09IDAgJiYgdGhpcy5zZXR0aW5ncy5pbkJvb2tMYXlvdXQgJiYgdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaW4gYm9vayBsYXlvdXQsIGNlbnRlciB0aGUgZmlyc3Qgb3BlbmluZyBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMuaG9yaXpvbnRhbE9mZnNldCA9IHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbFBhZGRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYW5jaG9yZWRIb3Jpem9udGFsbHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxvYWRPcHRpb25zLmhvcml6b250YWxPZmZzZXQgPSB0aGlzLmdldFhPZmZzZXQobG9hZE9wdGlvbnMuZ29EaXJlY3RseVRvLCBcImNlbnRlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZWVkc1lDb29yZClcbiAgICAgICAge1xuICAgICAgICAgICAgYW5jaG9yZWRWZXJ0aWNhbGx5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGxvYWRPcHRpb25zLnZlcnRpY2FsT2Zmc2V0ID0gdGhpcy5nZXRZT2Zmc2V0KGxvYWRPcHRpb25zLmdvRGlyZWN0bHlUbywgXCJ0b3BcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbG9hZFZpZXdlcihsb2FkT3B0aW9ucyk7XG5cbiAgICAgICAgLy9wcmVwIGRpbWVuc2lvbnMgb25lIGxhc3QgdGltZSBub3cgdGhhdCBwYWdlcyBoYXZlIGxvYWRlZFxuICAgICAgICB0aGlzLnVwZGF0ZVBhbmVsU2l6ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmVuYWJsZUF1dG9UaXRsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5zZWxlY3RvciArICd0aXRsZScpO1xuXG4gICAgICAgICAgICBpZiAodGl0bGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGl0bGUuaW5uZXJIVE1MID0gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5pdGVtVGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5wYXJlbnRPYmplY3QuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHRoaXMuZWxlbUF0dHJzKCd0aXRsZScpLCBbdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5pdGVtVGl0bGVdKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5wYXJlbnRPYmplY3QuZmlyc3RDaGlsZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhhY2sgdG8gZW5zdXJlIHRoYXQgdGhlIG91dGVyRWxlbWVudCBzY3JvbGxiYXJzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MudmVydGljYWxseU9yaWVudGVkKVxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pbm5lckVsZW1lbnQuc3R5bGUubWluV2lkdGggPSB0aGlzLnNldHRpbmdzLnBhbmVsV2lkdGggKyAncHgnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmlubmVyRWxlbWVudC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLnNldHRpbmdzLnBhbmVsSGVpZ2h0ICsgJ3B4JztcblxuICAgICAgICAvLyBGSVhNRTogSWYgdGhlIHBhZ2Ugd2FzIHN1cHBvc2VkIHRvIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0IHdlIG5lZWQgdG9cbiAgICAgICAgLy8gcmVjYWxjdWxhdGUgaXQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHNjcm9sbGJhcnNcbiAgICAgICAgaWYgKGFuY2hvcmVkVmVydGljYWxseSB8fCBhbmNob3JlZEhvcml6b250YWxseSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGFuY2hvcmVkVmVydGljYWxseSlcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZlcnRpY2FsT2Zmc2V0ID0gdGhpcy5nZXRZT2Zmc2V0KHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4LCBcInRvcFwiKTtcblxuICAgICAgICAgICAgaWYgKGFuY2hvcmVkSG9yaXpvbnRhbGx5KVxuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaG9yaXpvbnRhbE9mZnNldCA9IHRoaXMuZ2V0WE9mZnNldCh0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCwgXCJjZW50ZXJcIik7XG5cbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIuZ290byh0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCwgdGhpcy52aWV3ZXJTdGF0ZS52ZXJ0aWNhbE9mZnNldCwgdGhpcy52aWV3ZXJTdGF0ZS5ob3Jpem9udGFsT2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNpZ25hbCB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIHNldCB1cCBhbmQgcmVhZHkgdG8gZ28uXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUubG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnB1Ymxpc2goXCJWaWV3ZXJEaWRMb2FkXCIsIHRoaXMuc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHB1Ymxpc2ggKGV2ZW50KVxuICAgIHtcbiAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGRpdmEuRXZlbnRzLnB1Ymxpc2goZXZlbnQsIGFyZ3MsIHRoaXMucHVibGljSW5zdGFuY2UpO1xuICAgIH1cblxuICAgIGdldFNldHRpbmdzICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncztcbiAgICB9XG5cbiAgICAvLyBUZW1wb3JhcnkgYWNjZXNzb3IgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgdmlld2VyIGNvcmVcbiAgICAvLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aCBhIG1vcmUgcmVzdHJpY3RlZCB2aWV3IG9mIHdoYXRldmVyIG5lZWRzXG4gICAgLy8gYmUgZXhwb3NlZCB0aHJvdWdoIHNldHRpbmdzIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgZ2V0SW50ZXJuYWxTdGF0ZSAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGU7XG4gICAgfVxuXG4gICAgZ2V0UHVibGljSW5zdGFuY2UgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnB1YmxpY0luc3RhbmNlO1xuICAgIH1cblxuICAgIGdldFBhZ2VUb29scyAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGUucGFnZVRvb2xzO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnRMYXlvdXQgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyID8gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5sYXlvdXQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBHZXQgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHZpZXdwb3J0IGRpbWVuc2lvbnMgKi9cbiAgICBnZXRWaWV3cG9ydCAoKVxuICAgIHtcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IHZpZXdwb3J0LnRvcCxcbiAgICAgICAgICAgIGxlZnQ6IHZpZXdwb3J0LmxlZnQsXG4gICAgICAgICAgICBib3R0b206IHZpZXdwb3J0LmJvdHRvbSxcbiAgICAgICAgICAgIHJpZ2h0OiB2aWV3cG9ydC5yaWdodCxcblxuICAgICAgICAgICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhZGRQYWdlT3ZlcmxheSAob3ZlcmxheSlcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUucGFnZU92ZXJsYXlzLmFkZE92ZXJsYXkob3ZlcmxheSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlUGFnZU92ZXJsYXkgKG92ZXJsYXkpXG4gICAge1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnBhZ2VPdmVybGF5cy5yZW1vdmVPdmVybGF5KG92ZXJsYXkpO1xuICAgIH1cblxuICAgIGdldFBhZ2VSZWdpb24gKHBhZ2VJbmRleCwgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIubGF5b3V0O1xuICAgICAgICBjb25zdCByZWdpb24gPSBsYXlvdXQuZ2V0UGFnZVJlZ2lvbihwYWdlSW5kZXgsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW5jb3Jwb3JhdGVWaWV3cG9ydClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgc2Vjb25kYXJ5RGltID0gdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0W3NlY29uZGFyeURpbV0gPiBsYXlvdXQuZGltZW5zaW9uc1tzZWNvbmRhcnlEaW1dKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvY09mZnNldCA9ICh0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0W3NlY29uZGFyeURpbV0gLSBsYXlvdXQuZGltZW5zaW9uc1tzZWNvbmRhcnlEaW1dKSAvIDI7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiByZWdpb24udG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiByZWdpb24uYm90dG9tLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZWdpb24ubGVmdCArIGRvY09mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByZWdpb24ucmlnaHQgKyBkb2NPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcmVnaW9uLnRvcCArIGRvY09mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcmVnaW9uLmJvdHRvbSArIGRvY09mZnNldCxcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVnaW9uLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcmVnaW9uLnJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZ2lvbjtcbiAgICB9XG5cbiAgICBnZXRQYWdlUG9zaXRpb25BdFZpZXdwb3J0T2Zmc2V0IChjb29yZHMpXG4gICAge1xuICAgICAgICBjb25zdCBkb2NDb29yZHMgPSB7XG4gICAgICAgICAgICBsZWZ0OiBjb29yZHMubGVmdCArIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQubGVmdCxcbiAgICAgICAgICAgIHRvcDogY29vcmRzLnRvcCArIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQudG9wXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVuZGVyZWRQYWdlcyA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIuZ2V0UmVuZGVyZWRQYWdlcygpO1xuICAgICAgICBjb25zdCBwYWdlQ291bnQgPSByZW5kZXJlZFBhZ2VzLmxlbmd0aDtcblxuICAgICAgICAvLyBGaW5kIHRoZSBwYWdlIG9uIHdoaWNoIHRoZSBjb29yZHMgb2NjdXJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcGFnZUNvdW50OyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IHJlbmRlcmVkUGFnZXNbaV07XG4gICAgICAgICAgICBjb25zdCByZWdpb24gPSB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmxheW91dC5nZXRQYWdlUmVnaW9uKHBhZ2VJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChyZWdpb24ubGVmdCA8PSBkb2NDb29yZHMubGVmdCAmJiByZWdpb24ucmlnaHQgPj0gZG9jQ29vcmRzLmxlZnQgJiZcbiAgICAgICAgICAgICAgICByZWdpb24udG9wIDw9IGRvY0Nvb3Jkcy50b3AgJiYgcmVnaW9uLmJvdHRvbSA+PSBkb2NDb29yZHMudG9wKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvclBhZ2U6IHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBkb2NDb29yZHMubGVmdCAtIHJlZ2lvbi5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBkb2NDb29yZHMudG9wIC0gcmVnaW9uLnRvcFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBjdXJyZW50IHBhZ2VcbiAgICAgICAgLy8gRklYTUU6IFdvdWxkIGJlIGJldHRlciB0byB1c2UgdGhlIGNsb3Nlc3QgcGFnZSBvciBzb21ldGhpbmdcbiAgICAgICAgY29uc3QgY3VycmVudFJlZ2lvbiA9IHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIubGF5b3V0LmdldFBhZ2VSZWdpb24odGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbmNob3JQYWdlOiB0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCxcbiAgICAgICAgICAgIG9mZnNldDoge1xuICAgICAgICAgICAgICAgIGxlZnQ6IGRvY0Nvb3Jkcy5sZWZ0IC0gY3VycmVudFJlZ2lvbi5sZWZ0LFxuICAgICAgICAgICAgICAgIHRvcDogZG9jQ29vcmRzLnRvcCAtIGN1cnJlbnRSZWdpb24udG9wXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gc2V0TWFuaWZlc3QgKG1hbmlmZXN0LCBsb2FkT3B0aW9ucylcbiAgICAvLyB7XG4gICAgLy8gICAgIHNldE1hbmlmZXN0KG1hbmlmZXN0LCBsb2FkT3B0aW9ucyB8fCB7fSk7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjdXJyZW50IHBhZ2UgdG8gdGhlIGdpdmVuIGluZGV4LCBmaXJpbmcgVmlzaWJsZVBhZ2VEaWRDaGFuZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlSW5kZXhcbiAgICAgKi9cbiAgICBzZXRDdXJyZW50UGFnZXMgKGFjdGl2ZVBhZ2UsIHZpc2libGVQYWdlcylcbiAgICB7XG4gICAgICAgIGlmICghYXJyYXlzRXF1YWwodGhpcy52aWV3ZXJTdGF0ZS5jdXJyZW50UGFnZUluZGljZXMsIHZpc2libGVQYWdlcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuY3VycmVudFBhZ2VJbmRpY2VzID0gdmlzaWJsZVBhZ2VzO1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUuYWN0aXZlUGFnZUluZGV4ICE9PSBhY3RpdmVQYWdlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuYWN0aXZlUGFnZUluZGV4ID0gYWN0aXZlUGFnZTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2goXCJBY3RpdmVQYWdlRGlkQ2hhbmdlXCIsIGFjdGl2ZVBhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdWJsaXNoKFwiVmlzaWJsZVBhZ2VEaWRDaGFuZ2VcIiwgdmlzaWJsZVBhZ2VzKTtcblxuICAgICAgICAgICAgLy8gUHVibGlzaCBhbiBldmVudCBpZiB0aGUgcGFnZSB3ZSdyZSBzd2l0Y2hpbmcgdG8gaGFzIG90aGVyIGltYWdlcy5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdlclN0YXRlLm1hbmlmZXN0LnBhZ2VzW2FjdGl2ZVBhZ2VdLm90aGVySW1hZ2VzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoKCdWaXNpYmxlUGFnZUhhc0FsdGVybmF0ZVZpZXdzJywgYWN0aXZlUGFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy52aWV3ZXJTdGF0ZS5hY3RpdmVQYWdlSW5kZXggIT09IGFjdGl2ZVBhZ2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuYWN0aXZlUGFnZUluZGV4ID0gYWN0aXZlUGFnZTtcbiAgICAgICAgICAgIHRoaXMucHVibGlzaChcIkFjdGl2ZVBhZ2VEaWRDaGFuZ2VcIiwgYWN0aXZlUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcnJheXNFcXVhbCAoYSwgYilcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChhW2ldICE9PSBiW2ldKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhZ2VOYW1lIChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3ZXJTdGF0ZS5tYW5pZmVzdC5wYWdlc1twYWdlSW5kZXhdLmY7XG4gICAgfVxuXG4gICAgcmVsb2FkIChuZXdPcHRpb25zKVxuICAgIHtcbiAgICAgICAgdGhpcy5yZWxvYWRWaWV3ZXIobmV3T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgem9vbSAoem9vbUxldmVsLCBmb2NhbFBvaW50KVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlWm9vbSh6b29tTGV2ZWwsIGZvY2FsUG9pbnQpO1xuICAgIH1cblxuICAgIGVuYWJsZVNjcm9sbGFibGUgKClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy52aWV3ZXJTdGF0ZS5pc1Njcm9sbGFibGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYmluZE1vdXNlRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZURyYWdTY3JvbGxhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuZW5hYmxlS2V5U2Nyb2xsID0gdGhpcy52aWV3ZXJTdGF0ZS5pbml0aWFsS2V5U2Nyb2xsO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vcHRpb25zLmVuYWJsZVNwYWNlU2Nyb2xsID0gdGhpcy52aWV3ZXJTdGF0ZS5pbml0aWFsU3BhY2VTY3JvbGw7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUuaXNTY3JvbGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuYWJsZURyYWdTY3JvbGxhYmxlICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy52aWV3ZXJTdGF0ZS52aWV3cG9ydE9iamVjdC5oYXNBdHRyaWJ1dGUoJ25vY2hpbGRkcmFnJykpXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0LnJlbW92ZUF0dHJpYnV0ZSgnbm9jaGlsZGRyYWcnKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlU2Nyb2xsYWJsZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUuaXNTY3JvbGxhYmxlKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBibG9jayBkcmFnZ2luZ1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlRHJhZ1Njcm9sbGFibGUoKTtcblxuICAgICAgICAgICAgLy8gYmxvY2sgZG91YmxlLWNsaWNrIHpvb21pbmdcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUub3V0ZXJPYmplY3QuZGJsY2xpY2sgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5vdXRlck9iamVjdC5jb250ZXh0bWVudSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIGRpc2FibGUgYWxsIG90aGVyIHNjcm9sbGluZyBhY3Rpb25zXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgICAgICAgICAvLyBibG9jayBzY3JvbGxpbmcga2V5cyBiZWhhdmlvciwgcmVzcGVjdGluZyBpbml0aWFsIHNjcm9sbCBzZXR0aW5nc1xuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pbml0aWFsS2V5U2Nyb2xsID0gdGhpcy5zZXR0aW5ncy5lbmFibGVLZXlTY3JvbGw7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmluaXRpYWxTcGFjZVNjcm9sbCA9IHRoaXMuc2V0dGluZ3MuZW5hYmxlU3BhY2VTY3JvbGw7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuZW5hYmxlS2V5U2Nyb2xsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMuZW5hYmxlU3BhY2VTY3JvbGwgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5pc1Njcm9sbGFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc2FibGVEcmFnU2Nyb2xsYWJsZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdlclN0YXRlLnZpZXdwb3J0T2JqZWN0Lmhhc0F0dHJpYnV0ZSgnbm9jaGlsZGRyYWcnKSlcbiAgICAgICAgICAgIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnRPYmplY3Quc2V0QXR0cmlidXRlKCdub2NoaWxkZHJhZycsIFwiXCIpO1xuICAgIH1cblxuICAgIC8vIGlzVmFsaWRPcHRpb24gKGtleSwgdmFsdWUpXG4gICAgLy8ge1xuICAgIC8vICAgICByZXR1cm4gaXNWYWxpZE9wdGlvbihrZXksIHZhbHVlKTtcbiAgICAvLyB9XG5cbiAgICAvLyBnZXRYT2Zmc2V0IChwYWdlSW5kZXgsIHhBbmNob3IpXG4gICAgLy8ge1xuICAgIC8vICAgICByZXR1cm4gZ2V0WE9mZnNldChwYWdlSW5kZXgsIHhBbmNob3IpO1xuICAgIC8vIH1cblxuICAgIC8vIGdldFlPZmZzZXQgKHBhZ2VJbmRleCwgeUFuY2hvcilcbiAgICAvLyB7XG4gICAgLy8gICAgIHJldHVybiBnZXRZT2Zmc2V0KHBhZ2VJbmRleCwgeUFuY2hvcik7XG4gICAgLy8gfVxuXG4gICAgLy8gdGhpcy5wdWJsaXNoID0gcHVibGlzaDtcblxuICAgIGNsZWFyICgpXG4gICAge1xuICAgICAgICB0aGlzLmNsZWFyVmlld2VyKCk7XG4gICAgfVxuXG4gICAgc2V0UGVuZGluZ01hbmlmZXN0UmVxdWVzdCAocGVuZGluZ01hbmlmZXN0UmVxdWVzdClcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUucGVuZGluZ01hbmlmZXN0UmVxdWVzdCA9IHBlbmRpbmdNYW5pZmVzdFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgLy8gVXNlZnVsIGV2ZW50IHRvIGFjY2VzcyBlbGVtZW50cyBpbiBkaXZhIGJlZm9yZSB0aGV5IGdldCBkZXN0cm95ZWQuIFVzZWQgYnkgdGhlIGhpZ2hsaWdodCBwbHVnaW4uXG4gICAgICAgIHRoaXMucHVibGlzaCgnVmlld2VyV2lsbFRlcm1pbmF0ZScsIHRoaXMuc2V0dGluZ3MpO1xuXG4gICAgICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyByZXF1ZXN0IHJldHJpZXZpbmcgYSBtYW5pZmVzdFxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5wZW5kaW5nTWFuaWZlc3RSZXF1ZXN0KVxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5wZW5kaW5nTWFuaWZlc3RSZXF1ZXN0LmFib3J0KCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlcyB0aGUgaGlkZS1zY3JvbGxiYXIgY2xhc3MgZnJvbSB0aGUgYm9keVxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNsYXNzKCdkaXZhLWhpZGUtc2Nyb2xsYmFyJyk7XG5cbiAgICAgICAgLy8gRW1wdHkgdGhlIHBhcmVudCBjb250YWluZXIgYW5kIHJlbW92ZSBhbnkgZGl2YS1yZWxhdGVkIGRhdGFcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5wYXJlbnRPYmplY3QucGFyZW50KCkuZW1wdHkoKS5yZW1vdmVEYXRhKCdkaXZhJyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGFueSBhZGRpdGlvbmFsIHN0eWxpbmcgb24gdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICAgIHRoaXMuc2V0dGluZ3MucGFyZW50T2JqZWN0LnBhcmVudCgpLnJlbW92ZUF0dHIoJ3N0eWxlJykucmVtb3ZlQXR0cignY2xhc3MnKTtcblxuICAgICAgICB0aGlzLnB1Ymxpc2goJ1ZpZXdlckRpZFRlcm1pbmF0ZScsIHRoaXMuc2V0dGluZ3MpO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBFdmVudHMgY2FjaGVcbiAgICAgICAgZGl2YS5FdmVudHMudW5zdWJzY3JpYmVBbGwodGhpcy5zZXR0aW5ncy5JRCk7XG4gICAgfVxufVxuIiwiLy8gRnJvbSBodHRwOi8vd3d3LmFsZXhhbmRyZS1nb21lcy5jb20vP3A9MTE1LCBtb2RpZmllZCBzbGlnaHRseVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyV2lkdGgoKVxue1xuICAgIGxldCBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgICBpbm5lci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBpbm5lci5zdHlsZS5oZWlnaHQgPSAnMjAwcHgnO1xuXG4gICAgbGV0IG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgb3V0ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIG91dGVyLnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIG91dGVyLnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICBvdXRlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgb3V0ZXIuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuICAgIG91dGVyLnN0eWxlLmhlaWdodCA9ICcxNTBweCc7XG4gICAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblxuICAgIGxldCB3MSA9IGlubmVyLm9mZnNldFdpZHRoO1xuICAgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gICAgbGV0IHcyID0gaW5uZXIub2Zmc2V0V2lkdGg7XG4gICAgaWYgKHcxID09PSB3Mikge1xuICAgICAgICB3MiA9IG91dGVyLmNsaWVudFdpZHRoOyAvLyBmb3IgSUUgaSB0aGlua1xuICAgIH1cblxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3V0ZXIpO1xuICAgIHJldHVybiB3MSAtIHcyO1xufVxuIiwiLyoqXG4gKiBQYXJzZXMgYSB2MyBtYW5pZmVzdCdzIGxhYmVsL3ZhbHVlIHBhaXIgZnJvbSBhbiBvYmplY3QgJiBhcnJheSB0byBhIHN0cmluZ1xuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbXMge3N0cmluZ30ga2V5IC0gVGhlIGtleSBmcm9tIHdoaWNoIGEgbGFiZWwvdmFsdWUgcGFpciBzaG91bGQgYmUgZXh0cmFjdGVkLlxuICogQHJldHVybnMge29iamVjdH0gLSBUaGUgbGFiZWwvdmFsdWUgcGFpciBhcyBzdHJpbmdzLlxuICogKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VMYWJlbFZhbHVlIChrZXkpXG57XG4gICAgbGV0IGwgPSBrZXkubGFiZWw7IFxuICAgIGxldCBsYWJlbCA9ICh0eXBlb2YgbCA9PT0gJ29iamVjdCcpID8gbFtPYmplY3Qua2V5cyhsKVswXV1bMF0gOiBsO1xuXG4gICAgbGV0IHYgPSBrZXkudmFsdWU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKVxuICAgIHsgLy8gaXMgYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgICB2YWx1ZSA9IHYubWFwKGUgPT4gZVtPYmplY3Qua2V5cyhlKVswXV0pO1xuICAgIH1cbiAgICBlbHNlXG4gICAgeyAvLyBpcyBvYmplY3Qgd2hlcmUgdmFsdWUgaXMgcG9zc2libHkgYW4gYXJyYXlcbiAgICAgICAgdmFsdWUgPSAodHlwZW9mIHYgPT09ICdvYmplY3QnKSA/IHZbT2JqZWN0LmtleXModilbMF1dIDogdjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICB9O1xufSIsImltcG9ydCBwYXJzZUxhYmVsVmFsdWUgZnJvbSAnLi91dGlscy9wYXJzZS1sYWJlbC12YWx1ZSc7XG5cbmNvbnN0IGdldE1heFpvb21MZXZlbCA9ICh3aWR0aCwgaGVpZ2h0KSA9Plxue1xuICAgIGNvbnN0IGxhcmdlc3REaW1lbnNpb24gPSBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAobGFyZ2VzdERpbWVuc2lvbiA8IDEyOCkgXG4gICAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2coKGxhcmdlc3REaW1lbnNpb24gKyAxKSAvICgyNTYgKyAxKSkgLyBNYXRoLmxvZygyKSk7XG59O1xuXG5jb25zdCBpbmNvcnBvcmF0ZVpvb20gPSAoaW1hZ2VEaW1lbnNpb24sIHpvb21EaWZmZXJlbmNlKSA9PiBpbWFnZURpbWVuc2lvbiAvIChNYXRoLnBvdygyLCB6b29tRGlmZmVyZW5jZSkpO1xuXG5jb25zdCBnZXRPdGhlckltYWdlRGF0YSA9IChvdGhlckltYWdlcywgbG93ZXN0TWF4Wm9vbSkgPT5cbntcbiAgICByZXR1cm4gb3RoZXJJbWFnZXMubWFwKCAoaXRtKSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdyA9IGl0bS53aWR0aDtcbiAgICAgICAgY29uc3QgaCA9IGl0bS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGluZm8gPSBwYXJzZUltYWdlSW5mbyhpdG0pO1xuICAgICAgICBjb25zdCB1cmwgPSBpbmZvLnVybC5zbGljZSgtMSkgIT09ICcvJyA/IGluZm8udXJsICsgJy8nIDogaW5mby51cmw7ICAvLyBhcHBlbmQgdHJhaWxpbmcgc2xhc2ggdG8gdXJsIGlmIGl0J3Mgbm90IHRoZXJlLlxuXG4gICAgICAgIGNvbnN0IGRpbXMgPSBuZXcgQXJyYXkobG93ZXN0TWF4Wm9vbSArIDEpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxvd2VzdE1heFpvb20gKyAxOyBqKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpbXNbal0gPSB7XG4gICAgICAgICAgICAgICAgaDogTWF0aC5mbG9vcihpbmNvcnBvcmF0ZVpvb20oaCwgbG93ZXN0TWF4Wm9vbSAtIGopKSxcbiAgICAgICAgICAgICAgICB3OiBNYXRoLmZsb29yKGluY29ycG9yYXRlWm9vbSh3LCBsb3dlc3RNYXhab29tIC0gaikpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGY6IGluZm8udXJsLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBpbDogaXRtLmxhYmVsIHx8IFwiXCIsXG4gICAgICAgICAgICBkOiBkaW1zXG4gICAgICAgIH07XG4gICAgfSk7XG59O1xuXG5jb25zdCBnZXRJSUlGUHJlc2VudGF0aW9uVmVyc2lvbiA9IChjb250ZXh0KSA9Plxue1xuICAgIGlmIChjb250ZXh0ID09PSBcImh0dHA6Ly9paWlmLmlvL2FwaS9wcmVzZW50YXRpb24vMi9jb250ZXh0Lmpzb25cIilcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSAmJiBjb250ZXh0LmluY2x1ZGVzKFwiaHR0cDovL2lpaWYuaW8vYXBpL3ByZXNlbnRhdGlvbi8yL2NvbnRleHQuanNvblwiKSlcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSAmJiBjb250ZXh0LmluY2x1ZGVzKFwiaHR0cDovL2lpaWYuaW8vYXBpL3ByZXNlbnRhdGlvbi8zL2NvbnRleHQuanNvblwiKSlcbiAgICAgICAgcmV0dXJuIDM7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gMjsgLy8gQXNzdW1lIGEgdjIgbWFuaWZlc3QuXG59O1xuXG4vKipcbiAqIFBhcnNlcyBhbiBJSUlGIFByZXNlbnRhdGlvbiBBUEkgTWFuaWZlc3QgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBEaXZhLmpzLWZvcm1hdCBvYmplY3RcbiAqIChTZWUgaHR0cHM6Ly9naXRodWIuY29tL0RETUFML2RpdmEuanMvd2lraS9EZXZlbG9wbWVudC1ub3RlcyNkYXRhLXJlY2VpdmVkLXRocm91Z2gtYWpheC1yZXF1ZXN0KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYW5pZmVzdCAtIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB2YWxpZCBJSUlGIG1hbmlmZXN0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBkaXZhU2VydmljZUJsb2NrIC0gdGhlIGRhdGEgbmVlZGVkIGJ5IERpdmEgdG8gc2hvdyBhIHZpZXcgb2YgYSBzaW5nbGUgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VJSUlGTWFuaWZlc3QgKG1hbmlmZXN0KVxue1xuICAgIGxldCBjdHggPSBtYW5pZmVzdFtcIkBjb250ZXh0XCJdO1xuXG4gICAgaWYgKCFjdHgpXG4gICAge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBJSUlGIE1hbmlmZXN0OyBObyBAY29udGV4dCBmb3VuZC5cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcnNpb24gPSBnZXRJSUlGUHJlc2VudGF0aW9uVmVyc2lvbihjdHgpO1xuICAgIGNvbnN0IHNlcXVlbmNlID0gbWFuaWZlc3Quc2VxdWVuY2VzID8gbWFuaWZlc3Quc2VxdWVuY2VzWzBdIDogbnVsbDtcbiAgICBjb25zdCBjYW52YXNlcyA9IHNlcXVlbmNlID8gc2VxdWVuY2UuY2FudmFzZXMgOiBtYW5pZmVzdC5pdGVtcztcbiAgICBjb25zdCBudW1DYW52YXNlcyA9IGNhbnZhc2VzLmxlbmd0aDtcblxuICAgIGNvbnN0IHBhZ2VzID0gbmV3IEFycmF5KGNhbnZhc2VzLmxlbmd0aCk7XG5cbiAgICBsZXQgdGhpc0NhbnZhcywgXG4gICAgICAgIHRoaXNSZXNvdXJjZSwgXG4gICAgICAgIHRoaXNJbWFnZSxcbiAgICAgICAgc2Vjb25kYXJ5SW1hZ2VzLFxuICAgICAgICBvdGhlckltYWdlcyA9IFtdLFxuICAgICAgICBjb250ZXh0LCBcbiAgICAgICAgdXJsLCBcbiAgICAgICAgaW5mbywgXG4gICAgICAgIGltYWdlQVBJVmVyc2lvbiwgXG4gICAgICAgIHdpZHRoLCBcbiAgICAgICAgaGVpZ2h0LCBcbiAgICAgICAgbWF4Wm9vbSwgXG4gICAgICAgIGNhbnZhcywgXG4gICAgICAgIGxhYmVsLCBcbiAgICAgICAgaW1hZ2VMYWJlbCwgXG4gICAgICAgIHpvb21EaW1lbnNpb25zLCBcbiAgICAgICAgd2lkdGhBdEN1cnJlbnRab29tTGV2ZWwsIFxuICAgICAgICBoZWlnaHRBdEN1cnJlbnRab29tTGV2ZWw7XG5cbiAgICBsZXQgbG93ZXN0TWF4Wm9vbSA9IDEwMDtcbiAgICBsZXQgbWF4UmF0aW8gPSAwO1xuICAgIGxldCBtaW5SYXRpbyA9IDEwMDtcblxuICAgIC8vIHF1aWNrbHkgZGV0ZXJtaW5lIHRoZSBsb3dlc3QgcG9zc2libGUgbWF4IHpvb20gbGV2ZWwgKGkuZS4sIHRoZSB1cHBlciBib3VuZCBmb3IgaW1hZ2VzKSBhY3Jvc3MgYWxsIGNhbnZhc2VzLlxuICAgIC8vIHdoaWxlIHdlJ3JlIGhlcmUsIGNvbXB1dGUgdGhlIGdsb2JhbCByYXRpb3MgYXMgd2VsbC5cbiAgICBmb3IgKGxldCB6ID0gMDsgeiA8IG51bUNhbnZhc2VzOyB6KyspXG4gICAge1xuICAgICAgICBjb25zdCBjID0gY2FudmFzZXNbel07XG4gICAgICAgIGNvbnN0IHcgPSBjLndpZHRoO1xuICAgICAgICBjb25zdCBoID0gYy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG16ID0gZ2V0TWF4Wm9vbUxldmVsKHcsIGgpO1xuICAgICAgICBjb25zdCByYXRpbyA9IGggLyB3O1xuICAgICAgICBtYXhSYXRpbyA9IE1hdGgubWF4KHJhdGlvLCBtYXhSYXRpbyk7XG4gICAgICAgIG1pblJhdGlvID0gTWF0aC5taW4ocmF0aW8sIG1pblJhdGlvKTtcblxuICAgICAgICBsb3dlc3RNYXhab29tID0gTWF0aC5taW4obG93ZXN0TWF4Wm9vbSwgbXopO1xuICAgIH1cblxuICAgIC8qXG4gICAgICAgIFRoZXNlIGFycmF5cyBuZWVkIHRvIGJlIHByZS1pbml0aWFsaXplZCBzaW5jZSB3ZSB3aWxsIGRvIGFyaXRobWV0aWMgYW5kIHZhbHVlIGNoZWNraW5nIG9uIHRoZW1cbiAgICAqL1xuICAgIGNvbnN0IHRvdGFsV2lkdGhzID0gbmV3IEFycmF5KGxvd2VzdE1heFpvb20gKyAxKS5maWxsKDApO1xuICAgIGNvbnN0IHRvdGFsSGVpZ2h0cyA9IG5ldyBBcnJheShsb3dlc3RNYXhab29tICsgMSkuZmlsbCgwKTtcbiAgICBjb25zdCBtYXhXaWR0aHMgPSBuZXcgQXJyYXkobG93ZXN0TWF4Wm9vbSArIDEpLmZpbGwoMCk7XG4gICAgY29uc3QgbWF4SGVpZ2h0cyA9IG5ldyBBcnJheShsb3dlc3RNYXhab29tICsgMSkuZmlsbCgwKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ2FudmFzZXM7IGkrKylcbiAgICB7XG4gICAgICAgIHRoaXNDYW52YXMgPSBjYW52YXNlc1tpXTtcbiAgICAgICAgY2FudmFzID0gdGhpc0NhbnZhc1snQGlkJ10gfHwgdGhpc0NhbnZhcy5pZDtcbiAgICAgICAgbGFiZWwgPSB0aGlzQ2FudmFzLmxhYmVsO1xuICAgICAgICB0aGlzUmVzb3VyY2UgPSB0aGlzQ2FudmFzLmltYWdlcyA/IHRoaXNDYW52YXMuaW1hZ2VzWzBdLnJlc291cmNlIDogdGhpc0NhbnZhcy5pdGVtc1swXS5pdGVtc1swXS5ib2R5O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIElmIGEgY2FudmFzIGhhcyBtdWx0aXBsZSBpbWFnZXMgaXQgd2lsbCBiZSBlbmNvZGVkXG4gICAgICAgICAqIHdpdGggYSByZXNvdXJjZSB0eXBlIG9mIFwib2E6Q2hvaWNlXCIgKHYyKSBvciBcIkNob2ljZVwiICh2MykuXG4gICAgICAgICAqKi9cbiAgICAgICAgb3RoZXJJbWFnZXMgPSBbXTsgLy8gcmVzZXQgYXJyYXlcbiAgICAgICAgaWYgKHRoaXNSZXNvdXJjZVsnQHR5cGUnXSA9PT0gXCJvYTpDaG9pY2VcIiB8fCB0aGlzUmVzb3VyY2UudHlwZSA9PT0gXCJDaG9pY2VcIilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpc0ltYWdlID0gdGhpc1Jlc291cmNlLmRlZmF1bHQgfHwgdGhpc1Jlc291cmNlLml0ZW1zWzBdO1xuICAgICAgICAgICAgc2Vjb25kYXJ5SW1hZ2VzID0gdGhpc1Jlc291cmNlLml0ZW0gfHwgdGhpc1Jlc291cmNlLml0ZW1zLnNsaWNlKDEpO1xuICAgICAgICAgICAgb3RoZXJJbWFnZXMgPSBnZXRPdGhlckltYWdlRGF0YShzZWNvbmRhcnlJbWFnZXMsIGxvd2VzdE1heFpvb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpc0ltYWdlID0gdGhpc1Jlc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpb3JpdGl6ZSB0aGUgY2FudmFzIGhlaWdodCAvIHdpZHRoIGZpcnN0LCBzaW5jZSBpbWFnZXMgbWF5IG5vdCBoYXZlIGgvd1xuICAgICAgICB3aWR0aCA9IHRoaXNDYW52YXMud2lkdGggfHwgdGhpc0ltYWdlLndpZHRoO1xuICAgICAgICBoZWlnaHQgPSB0aGlzQ2FudmFzLmhlaWdodCB8fCB0aGlzSW1hZ2UuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgd2lkdGggb3IgaGVpZ2h0IGZvciBjYW52YXMgJyArIGxhYmVsICsgJy4gU2tpcHBpbmcnKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF4Wm9vbSA9IGdldE1heFpvb21MZXZlbCh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBpbWFnZUxhYmVsID0gdGhpc0ltYWdlLmxhYmVsIHx8IG51bGw7XG5cbiAgICAgICAgaW5mbyA9IHBhcnNlSW1hZ2VJbmZvKHRoaXNJbWFnZSk7XG4gICAgICAgIHVybCA9IGluZm8udXJsLnNsaWNlKC0xKSAhPT0gJy8nID8gaW5mby51cmwgKyAnLycgOiBpbmZvLnVybDsgIC8vIGFwcGVuZCB0cmFpbGluZyBzbGFzaCB0byB1cmwgaWYgaXQncyBub3QgdGhlcmUuXG5cbiAgICAgICAgY29udGV4dCA9IHRoaXNJbWFnZS5zZXJ2aWNlWydAY29udGV4dCddIHx8IHRoaXNJbWFnZS5zZXJ2aWNlLnR5cGU7XG5cbiAgICAgICAgaWYgKGNvbnRleHQgPT09ICdodHRwOi8vaWlpZi5pby9hcGkvaW1hZ2UvMi9jb250ZXh0Lmpzb24nIHx8IGNvbnRleHQgPT09IFwiSW1hZ2VTZXJ2aWNlMlwiKVxuICAgICAgICB7XG4gICAgICAgICAgICBpbWFnZUFQSVZlcnNpb24gPSAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRleHQgPT09ICdodHRwOi8vbGlicmFyeS5zdGFuZm9yZC5lZHUvaWlpZi9pbWFnZS1hcGkvMS4xL2NvbnRleHQuanNvbicpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGltYWdlQVBJVmVyc2lvbiA9IDEuMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGltYWdlQVBJVmVyc2lvbiA9IDEuMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvb21EaW1lbnNpb25zID0gbmV3IEFycmF5KGxvd2VzdE1heFpvb20gKyAxKTtcblxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxvd2VzdE1heFpvb20gKyAxOyBrKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHdpZHRoQXRDdXJyZW50Wm9vbUxldmVsID0gTWF0aC5mbG9vcihpbmNvcnBvcmF0ZVpvb20od2lkdGgsIGxvd2VzdE1heFpvb20gLSBrKSk7XG4gICAgICAgICAgICBoZWlnaHRBdEN1cnJlbnRab29tTGV2ZWwgPSBNYXRoLmZsb29yKGluY29ycG9yYXRlWm9vbShoZWlnaHQsIGxvd2VzdE1heFpvb20gLSBrKSk7XG4gICAgICAgICAgICB6b29tRGltZW5zaW9uc1trXSA9IHtcbiAgICAgICAgICAgICAgICBoOiBoZWlnaHRBdEN1cnJlbnRab29tTGV2ZWwsXG4gICAgICAgICAgICAgICAgdzogd2lkdGhBdEN1cnJlbnRab29tTGV2ZWxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRvdGFsV2lkdGhzW2tdICs9IHdpZHRoQXRDdXJyZW50Wm9vbUxldmVsO1xuICAgICAgICAgICAgdG90YWxIZWlnaHRzW2tdICs9IGhlaWdodEF0Q3VycmVudFpvb21MZXZlbDtcbiAgICAgICAgICAgIG1heFdpZHRoc1trXSA9IE1hdGgubWF4KHdpZHRoQXRDdXJyZW50Wm9vbUxldmVsLCBtYXhXaWR0aHNba10pO1xuICAgICAgICAgICAgbWF4SGVpZ2h0c1trXSA9IE1hdGgubWF4KGhlaWdodEF0Q3VycmVudFpvb21MZXZlbCwgbWF4SGVpZ2h0c1trXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNQYWdlZCA9IHRoaXNDYW52YXMudmlld2luZ0hpbnQgIT09ICdub24tcGFnZWQnIHx8ICh0aGlzQ2FudmFzLmJlaGF2aW9yID8gdGhpc0NhbnZhcy5iZWhhdmlvclswXSAhPT0gJ25vbi1wYWdlZCcgOiBmYWxzZSk7XG4gICAgICAgIGxldCBpc0ZhY2luZyA9IHRoaXNDYW52YXMudmlld2luZ0hpbnQgPT09ICdmYWNpbmctcGFnZXMnIHx8ICh0aGlzQ2FudmFzLmJlaGF2aW9yID8gdGhpc0NhbnZhcy5iZWhhdmlvclswXSA9PT0gJ2ZhY2luZy1wYWdlcycgOiBmYWxzZSk7XG5cbiAgICAgICAgcGFnZXNbaV0gPSB7XG4gICAgICAgICAgICBkOiB6b29tRGltZW5zaW9ucyxcbiAgICAgICAgICAgIG06IG1heFpvb20sXG4gICAgICAgICAgICBsOiBsYWJlbCwgICAgICAgICAvLyBjYW52YXMgbGFiZWwgKCdwYWdlIDEsIHBhZ2UgMicsIGV0Yy4pXG4gICAgICAgICAgICBpbDogaW1hZ2VMYWJlbCwgICAvLyBkZWZhdWx0IGltYWdlIGxhYmVsICgncHJpbWFyeSBpbWFnZScsICdVViBsaWdodCcsIGV0Yy4pXG4gICAgICAgICAgICBmOiBpbmZvLnVybCxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgYXBpOiBpbWFnZUFQSVZlcnNpb24sXG4gICAgICAgICAgICBwYWdlZDogaXNQYWdlZCxcbiAgICAgICAgICAgIGZhY2luZ1BhZ2VzOiBpc0ZhY2luZyxcbiAgICAgICAgICAgIGNhbnZhczogY2FudmFzLFxuICAgICAgICAgICAgb3RoZXJJbWFnZXM6IG90aGVySW1hZ2VzLFxuICAgICAgICAgICAgeG9mZnNldDogaW5mby54IHx8IG51bGwsXG4gICAgICAgICAgICB5b2Zmc2V0OiBpbmZvLnkgfHwgbnVsbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGF2ZXJhZ2VXaWR0aHMgPSBuZXcgQXJyYXkobG93ZXN0TWF4Wm9vbSArIDEpO1xuICAgIGNvbnN0IGF2ZXJhZ2VIZWlnaHRzID0gbmV3IEFycmF5KGxvd2VzdE1heFpvb20gKyAxKTtcblxuICAgIGZvciAobGV0IGEgPSAwOyBhIDwgbG93ZXN0TWF4Wm9vbSArIDE7IGErKylcbiAgICB7XG4gICAgICAgIGF2ZXJhZ2VXaWR0aHNbYV0gPSB0b3RhbFdpZHRoc1thXSAvIG51bUNhbnZhc2VzO1xuICAgICAgICBhdmVyYWdlSGVpZ2h0c1thXSA9IHRvdGFsSGVpZ2h0c1thXSAvIG51bUNhbnZhc2VzO1xuICAgIH1cblxuICAgIGNvbnN0IGRpbXMgPSB7XG4gICAgICAgIGFfd2lkOiBhdmVyYWdlV2lkdGhzLFxuICAgICAgICBhX2hlaTogYXZlcmFnZUhlaWdodHMsXG4gICAgICAgIG1heF93OiBtYXhXaWR0aHMsXG4gICAgICAgIG1heF9oOiBtYXhIZWlnaHRzLFxuICAgICAgICBtYXhfcmF0aW86IG1heFJhdGlvLFxuICAgICAgICBtaW5fcmF0aW86IG1pblJhdGlvLFxuICAgICAgICB0X2hlaTogdG90YWxIZWlnaHRzLFxuICAgICAgICB0X3dpZDogdG90YWxXaWR0aHNcbiAgICB9O1xuXG4gICAgLy8gYXNzdW1lcyBwYWdlZCBpcyBmYWxzZSBmb3Igbm9uLXBhZ2VkIHZhbHVlc1xuICAgIHJldHVybiB7XG4gICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgIGl0ZW1fdGl0bGU6IHBhcnNlTGFiZWxWYWx1ZShtYW5pZmVzdCkubGFiZWwsXG4gICAgICAgIG1ldGFkYXRhOiBtYW5pZmVzdC5tZXRhZGF0YSB8fCBudWxsLFxuICAgICAgICBkaW1zOiBkaW1zLFxuICAgICAgICBtYXhfem9vbTogbG93ZXN0TWF4Wm9vbSxcbiAgICAgICAgcGdzOiBwYWdlcyxcbiAgICAgICAgcGFnZWQ6IG1hbmlmZXN0LnZpZXdpbmdIaW50ID09PSAncGFnZWQnIHx8IChtYW5pZmVzdC5iZWhhdmlvdXIgPyBtYW5pZmVzdC5iZWhhdmlvdXJbMF0gPT09ICdwYWdlZCcgOiBmYWxzZSkgfHwgKHNlcXVlbmNlID8gc2VxdWVuY2Uudmlld2luZ0hpbnQgPT09ICdwYWdlZCcgOiBmYWxzZSlcbiAgICB9O1xufVxuXG4vKipcbiAqIFRha2VzIGluIGEgcmVzb3VyY2UgYmxvY2sgZnJvbSBhIGNhbnZhcyBhbmQgb3V0cHV0cyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlc291cmNlOlxuICogLSBJbWFnZSBVUkxcbiAqIC0gSW1hZ2UgcmVnaW9uIHRvIGJlIGRpc3BsYXllZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNvdXJjZSAtIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlIGJsb2NrIG9mIGEgY2FudmFzIHNlY3Rpb24gaW4gYSBJSUlGIG1hbmlmZXN0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBpbWFnZUluZm8gLSBhbiBvYmplY3QgY29udGFpbmluZyBpbWFnZSBVUkwgYW5kIHJlZ2lvblxuICovXG5mdW5jdGlvbiBwYXJzZUltYWdlSW5mbyAocmVzb3VyY2UpXG57XG4gICAgbGV0IHVybCA9IHJlc291cmNlWydAaWQnXSB8fCByZXNvdXJjZS5pZDtcbiAgICBjb25zdCBmcmFnbWVudFJlZ2V4ID0gLyN4eXdoPShbMC05XSssWzAtOV0rLFswLTldKyxbMC05XSspLztcbiAgICBsZXQgeHl3aCA9ICcnO1xuICAgIGxldCBzdHJpcFVSTCA9IHRydWU7XG5cbiAgICBpZiAoL1xcLyhbMC05XSssWzAtOV0rLFswLTldKyxbMC05XSspXFwvLy50ZXN0KHVybCkpXG4gICAge1xuICAgICAgICAvLyBpZiByZXNvdXJjZSBpbiBpbWFnZSBBUEkgZm9ybWF0LCBleHRyYWN0IHJlZ2lvbiB4LHksdyxoIGZyb20gVVJMIChhZnRlciA0dGggc2xhc2ggZnJvbSBsYXN0KVxuICAgICAgICAvLyBtYXRjaGVzIGNvb3JkaW5hdGVzIGluIFVSTHMgb2YgdGhlIGZvcm0gaHR0cDovL3d3dy5leGFtcGxlLm9yZy9paWlmL2Jvb2sxLXBhZ2UxLzQwLDUwLDEyMDAsMTgwMC9mdWxsLzAvZGVmYXVsdC5qcGdcbiAgICAgICAgY29uc3QgdXJsQXJyYXkgPSB1cmwuc3BsaXQoJy8nKTtcbiAgICAgICAgeHl3aCA9IHVybEFycmF5W3VybEFycmF5Lmxlbmd0aCAtIDRdO1xuICAgIH1cbiAgICBlbHNlIGlmIChmcmFnbWVudFJlZ2V4LnRlc3QodXJsKSlcbiAgICB7XG4gICAgICAgIC8vIG1hdGNoZXMgY29vcmRpbmF0ZXMgb2YgdGhlIHN0eWxlIGh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvaWlpZi9ib29rMS9jYW52YXMvcDEjeHl3aD01MCw1MCwzMjAsMjQwXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZyYWdtZW50UmVnZXguZXhlYyh1cmwpO1xuICAgICAgICB4eXdoID0gcmVzdWx0WzFdO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXNvdXJjZS5zZXJ2aWNlICYmIChyZXNvdXJjZS5zZXJ2aWNlWydAaWQnXSB8fCByZXNvdXJjZS5zZXJ2aWNlLmlkKSlcbiAgICB7XG4gICAgICAgIC8vIHRoaXMgVVJMIGV4Y2x1ZGVzIHJlZ2lvbiBwYXJhbWV0ZXJzIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVtb3ZlIHRoZW1cbiAgICAgICAgdXJsID0gcmVzb3VyY2Uuc2VydmljZVsnQGlkJ10gfHwgcmVzb3VyY2Uuc2VydmljZS5pZDtcbiAgICAgICAgc3RyaXBVUkwgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RyaXBVUkwpXG4gICAge1xuICAgICAgICAvLyBleHRyYWN0IFVSTCB1cCB0byBpZGVudGlmaWVyICh3ZSBlbGltaW5hdGUgdGhlIGxhc3QgNSBwYXJhbWV0ZXJzOiAvcmVnaW9uL3NpemUvcm90YXRpb24vcXVhbGl0eS5mb3JtYXQpXG4gICAgICAgIHVybCA9IHVybC5zcGxpdCgnLycpLnNsaWNlKDAsIC00KS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VJbmZvID0ge1xuICAgICAgICB1cmw6IHVybFxuICAgIH07XG5cbiAgICBpZiAoeHl3aC5sZW5ndGgpXG4gICAge1xuICAgICAgICAvLyBwYXJzZSBpbnRvIHNlcGFyYXRlIGNvbXBvbmVudHNcbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHh5d2guc3BsaXQoJywnKTtcbiAgICAgICAgaW1hZ2VJbmZvLnggPSBwYXJzZUludChkaW1lbnNpb25zWzBdLCAxMCk7XG4gICAgICAgIGltYWdlSW5mby55ID0gcGFyc2VJbnQoZGltZW5zaW9uc1sxXSwgMTApO1xuICAgICAgICBpbWFnZUluZm8udyA9IHBhcnNlSW50KGRpbWVuc2lvbnNbMl0sIDEwKTtcbiAgICAgICAgaW1hZ2VJbmZvLmggPSBwYXJzZUludChkaW1lbnNpb25zWzNdLCAxMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGltYWdlSW5mbztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIElJSUZTb3VyY2VBZGFwdGVyXG57XG4gICAgZ2V0UGFnZUltYWdlVVJMIChtYW5pZmVzdCwgcGFnZUluZGV4LCBzaXplKVxuICAgIHtcbiAgICAgICAgbGV0IGRpbWVucztcblxuICAgICAgICBpZiAoIXNpemUgfHwgKHNpemUud2lkdGggPT0gbnVsbCAmJiBzaXplLmhlaWdodCA9PSBudWxsKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGltZW5zID0gJ2Z1bGwnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZGltZW5zID0gKHNpemUud2lkdGggPT0gbnVsbCA/ICcnIDogc2l6ZS53aWR0aCkgKyAnLCcgKyAoc2l6ZS5oZWlnaHQgPT0gbnVsbCA/ICcnIDogc2l6ZS5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZSA9IG1hbmlmZXN0LnBhZ2VzW3BhZ2VJbmRleF07XG4gICAgICAgIGNvbnN0IHF1YWxpdHkgPSAocGFnZS5hcGkgPiAxLjEpID8gJ2RlZmF1bHQnIDogJ25hdGl2ZSc7XG5cbiAgICAgICAgcmV0dXJuIGVuY29kZVVSSShwYWdlLnVybCArICdmdWxsLycgKyBkaW1lbnMgKyAnLzAvJyArIHF1YWxpdHkgKyAnLmpwZycpO1xuICAgIH1cblxuICAgIGdldFRpbGVJbWFnZVVSTCAobWFuaWZlc3QsIHBhZ2VJbmRleCwgcGFyYW1zKVxuICAgIHtcbiAgICAgICAgY29uc3QgcGFnZSA9IG1hbmlmZXN0LnBhZ2VzW3BhZ2VJbmRleF07XG5cbiAgICAgICAgbGV0IGhlaWdodCwgd2lkdGg7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5yb3cgPT09IHBhcmFtcy5yb3dDb3VudCAtIDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHBhZ2UuZFtwYXJhbXMuem9vbUxldmVsXS5oIC0gKHBhcmFtcy5yb3dDb3VudCAtIDEpICogcGFyYW1zLnRpbGVEaW1lbnNpb25zLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHBhcmFtcy50aWxlRGltZW5zaW9ucy5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyYW1zLmNvbCA9PT0gcGFyYW1zLmNvbENvdW50IC0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgd2lkdGggPSBwYWdlLmRbcGFyYW1zLnpvb21MZXZlbF0udyAtIChwYXJhbXMuY29sQ291bnQgLSAxKSAqIHBhcmFtcy50aWxlRGltZW5zaW9ucy53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHdpZHRoID0gcGFyYW1zLnRpbGVEaW1lbnNpb25zLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgem9vbURpZmZlcmVuY2UgPSBNYXRoLnBvdygyLCBtYW5pZmVzdC5tYXhab29tIC0gcGFyYW1zLnpvb21MZXZlbCk7XG5cbiAgICAgICAgbGV0IHggPSBwYXJhbXMuY29sICogcGFyYW1zLnRpbGVEaW1lbnNpb25zLndpZHRoICogem9vbURpZmZlcmVuY2U7XG4gICAgICAgIGxldCB5ID0gcGFyYW1zLnJvdyAqIHBhcmFtcy50aWxlRGltZW5zaW9ucy5oZWlnaHQgKiB6b29tRGlmZmVyZW5jZTtcblxuICAgICAgICBpZiAocGFnZS5oYXNPd25Qcm9wZXJ0eSgneG9mZnNldCcpKVxuICAgICAgICB7XG4gICAgICAgICAgICB4ICs9IHBhZ2UueG9mZnNldDtcbiAgICAgICAgICAgIHkgKz0gcGFnZS55b2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVnaW9uID0gW3gsIHksIHdpZHRoICogem9vbURpZmZlcmVuY2UsIGhlaWdodCAqIHpvb21EaWZmZXJlbmNlXS5qb2luKCcsJyk7XG5cbiAgICAgICAgY29uc3QgcXVhbGl0eSA9IChwYWdlLmFwaSA+IDEuMSkgPyAnZGVmYXVsdCcgOiAnbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gZW5jb2RlVVJJKHBhZ2UudXJsICsgcmVnaW9uICsgJy8nICsgd2lkdGggKyAnLCcgKyBoZWlnaHQgKyAnLzAvJyArIHF1YWxpdHkgKyAnLmpwZycpO1xuICAgIH1cbn1cbiIsImltcG9ydCBwYXJzZUlJSUZNYW5pZmVzdCBmcm9tICcuL3BhcnNlLWlpaWYtbWFuaWZlc3QnO1xuaW1wb3J0IElJSUZTb3VyY2VBZGFwdGVyIGZyb20gXCIuL2lpaWYtc291cmNlLWFkYXB0ZXJcIjtcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZU1hbmlmZXN0XG57XG4gICAgY29uc3RydWN0b3IgKGRhdGEsIHVybEFkYXB0ZXIpXG4gICAge1xuICAgICAgICAvLyBTYXZlIGFsbCB0aGUgZGF0YSB3ZSBuZWVkXG4gICAgICAgIHRoaXMucGFnZXMgPSBkYXRhLnBncztcbiAgICAgICAgdGhpcy5tYXhab29tID0gZGF0YS5tYXhfem9vbTtcbiAgICAgICAgdGhpcy5tYXhSYXRpbyA9IGRhdGEuZGltcy5tYXhfcmF0aW87XG4gICAgICAgIHRoaXMubWluUmF0aW8gPSBkYXRhLmRpbXMubWluX3JhdGlvO1xuICAgICAgICB0aGlzLml0ZW1UaXRsZSA9IGRhdGEuaXRlbV90aXRsZTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7XG5cbiAgICAgICAgLy8gT25seSBnaXZlbiBmb3IgSUlJRiBtYW5pZmVzdHNcbiAgICAgICAgdGhpcy5wYWdlZCA9ICEhZGF0YS5wYWdlZDtcblxuICAgICAgICAvLyBUaGVzZSBhcmUgYXJyYXlzLCB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgem9vbSBsZXZlbFxuICAgICAgICB0aGlzLl9tYXhXaWR0aHMgPSBkYXRhLmRpbXMubWF4X3c7XG4gICAgICAgIHRoaXMuX21heEhlaWdodHMgPSBkYXRhLmRpbXMubWF4X2g7XG4gICAgICAgIHRoaXMuX2F2ZXJhZ2VXaWR0aHMgPSBkYXRhLmRpbXMuYV93aWQ7XG4gICAgICAgIHRoaXMuX2F2ZXJhZ2VIZWlnaHRzID0gZGF0YS5kaW1zLmFfaGVpO1xuICAgICAgICB0aGlzLl90b3RhbEhlaWdodHMgPSBkYXRhLmRpbXMudF9oZWk7XG4gICAgICAgIHRoaXMuX3RvdGFsV2lkdGhzID0gZGF0YS5kaW1zLnRfd2lkO1xuXG4gICAgICAgIHRoaXMuX3VybEFkYXB0ZXIgPSB1cmxBZGFwdGVyO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSUlJRiAoaWlpZk1hbmlmZXN0KVxuICAgIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHBhcnNlSUlJRk1hbmlmZXN0KGlpaWZNYW5pZmVzdCk7XG4gICAgICAgIHJldHVybiBuZXcgSW1hZ2VNYW5pZmVzdChkYXRhLCBuZXcgSUlJRlNvdXJjZUFkYXB0ZXIoKSk7XG4gICAgfVxuXG4gICAgaXNQYWdlVmFsaWQgKHBhZ2VJbmRleCwgc2hvd05vblBhZ2VkUGFnZXMpXG4gICAge1xuICAgICAgICBpZiAoIXNob3dOb25QYWdlZFBhZ2VzICYmIHRoaXMucGFnZWQgJiYgIXRoaXMucGFnZXNbcGFnZUluZGV4XS5wYWdlZClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhZ2VJbmRleCA+PSAwICYmIHBhZ2VJbmRleCA8IHRoaXMucGFnZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldE1heFBhZ2VEaW1lbnNpb25zIChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICBjb25zdCBtYXhEaW1zID0gdGhpcy5wYWdlc1twYWdlSW5kZXhdLmRbdGhpcy5tYXhab29tXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVpZ2h0OiBtYXhEaW1zLmgsXG4gICAgICAgICAgICB3aWR0aDogbWF4RGltcy53XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0UGFnZURpbWVuc2lvbnNBdFpvb21MZXZlbCAocGFnZUluZGV4LCB6b29tTGV2ZWwpXG4gICAge1xuICAgICAgICBjb25zdCBtYXhEaW1zID0gdGhpcy5wYWdlc1twYWdlSW5kZXhdLmRbdGhpcy5tYXhab29tXTtcblxuICAgICAgICBjb25zdCBzY2FsZVJhdGlvID0gZ2V0U2NhbGVSYXRpbyh0aGlzLm1heFpvb20sIHpvb21MZXZlbCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlaWdodDogbWF4RGltcy5oICogc2NhbGVSYXRpbyxcbiAgICAgICAgICAgIHdpZHRoOiBtYXhEaW1zLncgKiBzY2FsZVJhdGlvXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFVSTCBmb3IgdGhlIGltYWdlIG9mIHRoZSBnaXZlbiBwYWdlLiBUaGUgb3B0aW9uYWwgc2l6ZVxuICAgICAqIHBhcmFtZXRlciBzdXBwb3J0cyBzZXR0aW5nIHRoZSBpbWFnZSB3aWR0aCBvciBoZWlnaHQgKGRlZmF1bHQgaXNcbiAgICAgKiBmdWxsLXNpemVkKS5cbiAgICAgKi9cbiAgICBnZXRQYWdlSW1hZ2VVUkwgKHBhZ2VJbmRleCwgc2l6ZSlcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmxBZGFwdGVyLmdldFBhZ2VJbWFnZVVSTCh0aGlzLCBwYWdlSW5kZXgsIHNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhcnJheSBvZiB0aWxlIG9iamVjdHMgZm9yIHRoZSBzcGVjaWZpZWQgcGFnZSBhbmQgaW50ZWdlciB6b29tIGxldmVsXG4gICAgICovXG4gICAgZ2V0UGFnZUltYWdlVGlsZXMgKHBhZ2VJbmRleCwgem9vbUxldmVsLCB0aWxlRGltZW5zaW9ucylcbiAgICB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VzW3BhZ2VJbmRleF07XG5cbiAgICAgICAgaWYgKCFpc0Zpbml0ZSh6b29tTGV2ZWwpIHx8IHpvb21MZXZlbCAlIDEgIT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1pvb20gbGV2ZWwgbXVzdCBiZSBhbiBpbnRlZ2VyOiAnICsgem9vbUxldmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLmNlaWwocGFnZS5kW3pvb21MZXZlbF0uaCAvIHRpbGVEaW1lbnNpb25zLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBNYXRoLmNlaWwocGFnZS5kW3pvb21MZXZlbF0udyAvIHRpbGVEaW1lbnNpb25zLndpZHRoKTtcblxuICAgICAgICBjb25zdCB0aWxlcyA9IFtdO1xuXG4gICAgICAgIGxldCByb3csIGNvbCwgdXJsO1xuXG4gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgcm93czsgcm93KyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgY29sczsgY29sKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdXJsID0gdGhpcy5fdXJsQWRhcHRlci5nZXRUaWxlSW1hZ2VVUkwodGhpcywgcGFnZUluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICBjb2w6IGNvbCxcbiAgICAgICAgICAgICAgICAgICAgcm93Q291bnQ6IHJvd3MsXG4gICAgICAgICAgICAgICAgICAgIGNvbENvdW50OiBjb2xzLFxuICAgICAgICAgICAgICAgICAgICB6b29tTGV2ZWw6IHpvb21MZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgdGlsZURpbWVuc2lvbnM6IHRpbGVEaW1lbnNpb25zXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogRGltZW5zaW9ucyBzaG91bGQgYWNjb3VudCBmb3IgcGFydGlhbCB0aWxlcyAoZS5nLiB0aGVcbiAgICAgICAgICAgICAgICAvLyBsYXN0IHJvdyBhbmQgY29sdW1uIGluIGEgdGlsZWQgaW1hZ2UpXG4gICAgICAgICAgICAgICAgdGlsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICBjb2w6IGNvbCxcbiAgICAgICAgICAgICAgICAgICAgem9vbUxldmVsOiB6b29tTGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGlsZURpbWVuc2lvbnMuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRpbGVEaW1lbnNpb25zLndpZHRoXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiByb3cgKiB0aWxlRGltZW5zaW9ucy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBjb2wgKiB0aWxlRGltZW5zaW9ucy53aWR0aFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHpvb21MZXZlbDogem9vbUxldmVsLFxuICAgICAgICAgICAgcm93czogcm93cyxcbiAgICAgICAgICAgIGNvbHM6IGNvbHMsXG4gICAgICAgICAgICB0aWxlczogdGlsZXNcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbkltYWdlTWFuaWZlc3QucHJvdG90eXBlLmdldE1heFdpZHRoID0gem9vbWVkUHJvcGVydHlHZXR0ZXIoJ19tYXhXaWR0aHMnKTtcbkltYWdlTWFuaWZlc3QucHJvdG90eXBlLmdldE1heEhlaWdodCA9IHpvb21lZFByb3BlcnR5R2V0dGVyKCdfbWF4SGVpZ2h0cycpO1xuSW1hZ2VNYW5pZmVzdC5wcm90b3R5cGUuZ2V0QXZlcmFnZVdpZHRoID0gem9vbWVkUHJvcGVydHlHZXR0ZXIoJ19hdmVyYWdlV2lkdGhzJyk7XG5JbWFnZU1hbmlmZXN0LnByb3RvdHlwZS5nZXRBdmVyYWdlSGVpZ2h0ID0gem9vbWVkUHJvcGVydHlHZXR0ZXIoJ19hdmVyYWdlSGVpZ2h0cycpO1xuSW1hZ2VNYW5pZmVzdC5wcm90b3R5cGUuZ2V0VG90YWxXaWR0aCA9IHpvb21lZFByb3BlcnR5R2V0dGVyKCdfdG90YWxXaWR0aHMnKTtcbkltYWdlTWFuaWZlc3QucHJvdG90eXBlLmdldFRvdGFsSGVpZ2h0ID0gem9vbWVkUHJvcGVydHlHZXR0ZXIoJ190b3RhbEhlaWdodHMnKTtcblxuZnVuY3Rpb24gem9vbWVkUHJvcGVydHlHZXR0ZXIgKHByaXZhdGVOYW1lKVxue1xuICAgIHJldHVybiBmdW5jdGlvbiAoem9vbUxldmVsKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbcHJpdmF0ZU5hbWVdW3pvb21MZXZlbF07XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U2NhbGVSYXRpbyAoc291cmNlWm9vbUxldmVsLCB0YXJnZXRab29tTGV2ZWwpXG57XG4gICAgcmV0dXJuIDEgLyBNYXRoLnBvdygyLCBzb3VyY2Vab29tTGV2ZWwgLSB0YXJnZXRab29tTGV2ZWwpO1xufVxuIiwiaW1wb3J0IGRpdmEgZnJvbSAnLi9kaXZhLWdsb2JhbCc7XG5pbXBvcnQgeyBlbHQgfSBmcm9tICcuL3V0aWxzL2VsdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvb2xiYXJcbntcbiAgICBjb25zdHJ1Y3RvciAodmlld2VyKVxuICAgIHtcbiAgICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB2aWV3ZXIuc2V0dGluZ3M7XG4gICAgfVxuXG4gICAgX2VsZW1BdHRycyAoaWRlbnQsIGJhc2UpXG4gICAge1xuICAgICAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNldHRpbmdzLklEICsgaWRlbnQsXG4gICAgICAgICAgICBjbGFzczogJ2RpdmEtJyArIGlkZW50XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGJhc2UpXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhdHRycywgYmFzZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBhdHRycztcbiAgICB9XG5cblxuICAgIC8qKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzdWJzY3JpYmUgdG8gYSBEaXZhIGV2ZW50ICovXG4gICAgX3N1YnNjcmliZSAoZXZlbnQsIGNhbGxiYWNrKVxuICAgIHtcbiAgICAgICAgZGl2YS5FdmVudHMuc3Vic2NyaWJlKGV2ZW50LCBjYWxsYmFjaywgdGhpcy5zZXR0aW5ncy5JRCk7XG4gICAgfVxuXG5cbiAgICBjcmVhdGVCdXR0b24gKG5hbWUsIGxhYmVsLCBjYWxsYmFjaywgaWNvbilcbiAgICB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IGVsdCgnYnV0dG9uJywge1xuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5JRCArIG5hbWUsXG4gICAgICAgICAgICBjbGFzczogJ2RpdmEtJyArIG5hbWUgKyAnIGRpdmEtYnV0dG9uJyxcbiAgICAgICAgICAgIHRpdGxlOiBsYWJlbCxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJzogbGFiZWxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGljb24pXG4gICAgICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoaWNvbik7XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsbGJhY2spO1xuXG4gICAgICAgIHJldHVybiBidXR0b247XG4gICAgfVxuXG4gICAgY3JlYXRlTGFiZWwgKG5hbWUsIGlkLCBsYWJlbCwgaW5uZXJOYW1lLCBpbm5lclZhbHVlKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGVsdCgnZGl2JywgeyBpZDogdGhpcy5zZXR0aW5ncy5JRCArIGlkLCBjbGFzczogbmFtZSArICcgZGl2YS1sYWJlbCd9LFxuICAgICAgICAgICAgICAgICAgICBbIGxhYmVsLCBlbHQoJ3NwYW4nLCB7IGlkOiB0aGlzLnNldHRpbmdzLklEICsgaW5uZXJOYW1lIH0sIGlubmVyVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgIH1cblxuICAgIGNyZWF0ZVpvb21CdXR0b25zICgpXG4gICAge1xuICAgICAgICBsZXQgem9vbU91dEljb24gPSB0aGlzLl9jcmVhdGVab29tT3V0SWNvbigpO1xuICAgICAgICBsZXQgem9vbUluSWNvbiA9IHRoaXMuX2NyZWF0ZVpvb21Jbkljb24oKTtcblxuICAgICAgICBsZXQgem9vbUJ1dHRvbnMgPSBbXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbignem9vbS1vdXQtYnV0dG9uJywgJ1pvb20gT3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld2VyLnNldFpvb21MZXZlbCh0aGlzLnNldHRpbmdzLnpvb21MZXZlbCAtIDEpO1xuICAgICAgICAgICAgfSwgem9vbU91dEljb24pLFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVCdXR0b24oJ3pvb20taW4tYnV0dG9uJywgJ1pvb20gSW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXIuc2V0Wm9vbUxldmVsKHRoaXMuc2V0dGluZ3Muem9vbUxldmVsICsgMSk7XG4gICAgICAgICAgICB9LCB6b29tSW5JY29uKSxcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTGFiZWwoJ2RpdmEtem9vbS1sYWJlbCcsICd6b29tLWxhYmVsJywgJ1pvb20gbGV2ZWw6ICcsICd6b29tLWxldmVsJywgdGhpcy5zZXR0aW5ncy56b29tTGV2ZWwgKyAxKVxuICAgICAgICBdO1xuXG4gICAgICAgIGxldCB6b29tSGFuZGxlciA9IGZ1bmN0aW9uICgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5JRCArICd6b29tLWxldmVsJyk7XG4gICAgICAgICAgICBsYWJlbEVsLnRleHRDb250ZW50ID0gdGhpcy5zZXR0aW5ncy56b29tTGV2ZWwgKyAxO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgnWm9vbUxldmVsRGlkQ2hhbmdlJywgem9vbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoJ1ZpZXdlckRpZExvYWQnLCB6b29tSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuIGVsdCgnZGl2JywgeyBpZDogdGhpcy5zZXR0aW5ncy5JRCArIFwiem9vbS1jb250cm9sc1wiLCBzdHlsZTogXCJkaXNwbGF5OiBub25lXCJ9LCB6b29tQnV0dG9ucyk7XG4gICAgfVxuXG4gICAgY3JlYXRlR3JpZENvbnRyb2xzICgpXG4gICAge1xuICAgICAgICBsZXQgZ3JpZE1vcmVJY29uID0gdGhpcy5fY3JlYXRlR3JpZE1vcmVJY29uKCk7XG4gICAgICAgIGxldCBncmlkRmV3ZXJJY29uID0gdGhpcy5fY3JlYXRlR3JpZEZld2VySWNvbigpO1xuXG4gICAgICAgIGxldCBncmlkQnV0dG9ucyA9IFtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQnV0dG9uKCdncmlkLW91dC1idXR0b24nLCAnRmV3ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXIuc2V0R3JpZFBhZ2VzUGVyUm93KHRoaXMuc2V0dGluZ3MucGFnZXNQZXJSb3cgLSAxKTtcbiAgICAgICAgICAgIH0sIGdyaWRGZXdlckljb24pLFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVCdXR0b24oJ2dyaWQtaW4tYnV0dG9uJywgJ01vcmUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXIuc2V0R3JpZFBhZ2VzUGVyUm93KHRoaXMuc2V0dGluZ3MucGFnZXNQZXJSb3cgKyAxKTtcbiAgICAgICAgICAgIH0sIGdyaWRNb3JlSWNvbiksXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKCdkaXZhLWdyaWQtbGFiZWwnLCAnZ3JpZC1sYWJlbCcsICdQYWdlcyBwZXIgcm93OiAnLCAncGFnZXMtcGVyLXJvdycsIHRoaXMuc2V0dGluZ3MucGFnZXNQZXJSb3cpXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGdyaWRDaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gKClcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGxhYmVsRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLklEICsgJ3BhZ2VzLXBlci1yb3cnKTtcbiAgICAgICAgICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSB0aGlzLnNldHRpbmdzLnBhZ2VzUGVyUm93O1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgnR3JpZFJvd051bWJlckRpZENoYW5nZScsIGdyaWRDaGFuZ2VIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gZWx0KCdkaXYnLCB7aWQ6IHRoaXMuc2V0dGluZ3MuSUQgKyBcImdyaWQtY29udHJvbHNcIiwgc3R5bGU6IFwiZGlzcGxheTpub25lXCIgfSwgZ3JpZEJ1dHRvbnMpO1xuICAgIH1cblxuICAgIGNyZWF0ZVBhZ2VMYWJlbCAoKVxuICAgIHtcbiAgICAgICAgLy8gQ3VycmVudCBwYWdlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gZWx0KCdzcGFuJywge1xuICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuSUQgKyAnY3VycmVudC1wYWdlJ1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB1cGRhdGVDdXJyZW50UGFnZSA9ICgpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGdldCBsYWJlbHMgZm9yIGluZGV4IHJhbmdlXG4gICAgICAgICAgICBsZXQgaW5kaWNlcyA9IHRoaXMudmlld2VyLmdldEN1cnJlbnRQYWdlSW5kaWNlcygpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBpbmRpY2VzWzBdO1xuICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgbGV0IHN0YXJ0TGFiZWwgPSB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3N0YXJ0SW5kZXhdLmw7XG4gICAgICAgICAgICBsZXQgZW5kTGFiZWwgPSB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW2VuZEluZGV4XS5sO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnRJbmRleCAhPT0gZW5kSW5kZXgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICBcdGlmICh0aGlzLnNldHRpbmdzLmVuYWJsZUluZGV4QXNMYWJlbClcbiAgICAgICAgICAgICAgICBcdGN1cnJlbnRQYWdlLnRleHRDb250ZW50ID0gc3RhcnRJbmRleCArIFwiIC0gXCIgKyBlbmRJbmRleDtcbiAgICAgICAgICAgIFx0ZWxzZVxuICAgICAgICAgICAgXHRcdGN1cnJlbnRQYWdlLnRleHRDb250ZW50ID0gc3RhcnRMYWJlbCArIFwiIC0gXCIgKyBlbmRMYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgXHR7XG4gICAgICAgICAgICBcdGlmICh0aGlzLnNldHRpbmdzLmVuYWJsZUluZGV4QXNMYWJlbClcbiAgICAgICAgICAgIFx0XHRjdXJyZW50UGFnZS50ZXh0Q29udGVudCA9IHN0YXJ0SW5kZXg7XG4gICAgICAgICAgICBcdGVsc2VcbiAgICAgICAgICAgIFx0XHRjdXJyZW50UGFnZS50ZXh0Q29udGVudCA9IHN0YXJ0TGFiZWw7XG4gICAgICAgIFx0fVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgnVmlzaWJsZVBhZ2VEaWRDaGFuZ2UnLCB1cGRhdGVDdXJyZW50UGFnZSk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgnVmlld2VyRGlkTG9hZCcsIHVwZGF0ZUN1cnJlbnRQYWdlKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCdWaWV3RGlkU3dpdGNoJywgdXBkYXRlQ3VycmVudFBhZ2UpO1xuXG4gICAgICAgIHJldHVybiBlbHQoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgY2xhc3M6ICdkaXZhLXBhZ2UtbGFiZWwgZGl2YS1sYWJlbCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXJyZW50UGFnZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNyZWF0ZUdvdG9QYWdlRm9ybSAoKVxuICAgIHtcbiAgICAgICAgY29uc3QgZ290b1BhZ2VJbnB1dCA9IGVsdCgnaW5wdXQnLCB7XG4gICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5JRCArICdnb3RvLXBhZ2UtaW5wdXQnLFxuICAgICAgICAgICAgY2xhc3M6ICdkaXZhLWlucHV0IGRpdmEtZ290by1wYWdlLWlucHV0JyxcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZTogJ29mZicsXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdQYWdlIElucHV0J1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBnb3RvUGFnZVN1Ym1pdCA9IGVsdCgnaW5wdXQnLCB7XG4gICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5JRCArICdnb3RvLXBhZ2Utc3VibWl0JyxcbiAgICAgICAgICAgIGNsYXNzOiAnZGl2YS1idXR0b24gZGl2YS1idXR0b24tdGV4dCcsXG4gICAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICAgIHZhbHVlOiAnR28nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlucHV0U3VnZ2VzdGlvbnMgPSBlbHQoJ2RpdicsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5JRCArICdpbnB1dC1zdWdnZXN0aW9ucycsXG4gICAgICAgICAgICAgICAgY2xhc3M6ICdkaXZhLWlucHV0LXN1Z2dlc3Rpb25zJ1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGdvdG9Gb3JtID0gZWx0KCdmb3JtJywge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNldHRpbmdzLklEICsgJ2dvdG8tcGFnZScsXG4gICAgICAgICAgICAgICAgY2xhc3M6ICdkaXZhLWdvdG8tZm9ybSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnb3RvUGFnZUlucHV0LFxuICAgICAgICAgICAgZ290b1BhZ2VTdWJtaXQsXG4gICAgICAgICAgICBpbnB1dFN1Z2dlc3Rpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgZ290b0Zvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGUpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgY29uc3QgZGVzaXJlZFBhZ2VMYWJlbCA9IGdvdG9QYWdlSW5wdXQudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm9uR290b1N1Ym1pdCAmJiB0eXBlb2YgdGhpcy5zZXR0aW5ncy5vbkdvdG9TdWJtaXQgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLnNldHRpbmdzLm9uR290b1N1Ym1pdChkZXNpcmVkUGFnZUxhYmVsKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmlld2VyLmdvdG9QYWdlQnlJbmRleChwYWdlSW5kZXgpKVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXCJObyBwYWdlIGNvdWxkIGJlIGZvdW5kIHdpdGggdGhhdCBsYWJlbCBvciBwYWdlIG51bWJlclwiKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSAvLyBEZWZhdWx0IGlmIG5vIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgc2V0dGluZ3NcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmlld2VyLmdvdG9QYWdlQnlMYWJlbChkZXNpcmVkUGFnZUxhYmVsKSlcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KFwiTm8gcGFnZSBjb3VsZCBiZSBmb3VuZCB3aXRoIHRoYXQgbGFiZWwgb3IgcGFnZSBudW1iZXJcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhpZGUgdGhlIHN1Z2dlc3Rpb25zXG4gICAgICAgICAgICBpbnB1dFN1Z2dlc3Rpb25zLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHJlbG9hZGluZyB0aGUgcGFnZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBbJ2lucHV0JywgJ2ZvY3VzJ10uZm9yRWFjaChldmVudCA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBnb3RvUGFnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpbnB1dFN1Z2dlc3Rpb25zLmlubmVySFRNTCA9ICcnOyAvLyBSZW1vdmUgYWxsIHByZXZpb3VzIHN1Z2dlc3Rpb25zXG5cbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdvdG9QYWdlSW5wdXQudmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IG51bVN1Z2dlc3Rpb25zID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVHb3RvU3VnZ2VzdGlvbnMgJiYgdmFsdWUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwYWdlcy5sZW5ndGg7IGkgPCBsZW4gJiYgbnVtU3VnZ2VzdGlvbnMgPCAxMDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXNbaV0ubC50b0xvd2VyQ2FzZSgpLmluZGV4T2YodmFsdWUudG9Mb3dlckNhc2UoKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdJbnB1dFN1Z2dlc3Rpb24gPSBlbHQoJ2RpdicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnZGl2YS1pbnB1dC1zdWdnZXN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlc1tpXS5sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3VnZ2VzdGlvbnMuYXBwZW5kQ2hpbGQobmV3SW5wdXRTdWdnZXN0aW9uKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1Z2dlc3Rpb25zKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBTaG93IGxhYmVsIHN1Z2dlc3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1TdWdnZXN0aW9ucyA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN1Z2dlc3Rpb25zLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGlucHV0U3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBnb3RvUGFnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICAgICAgICAgIGxldCBlbDtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSAvLyAnRW50ZXInIGtleVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FjdGl2ZScpWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aXZlICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICAgICAgZ290b1BhZ2VJbnB1dC52YWx1ZSA9IGFjdGl2ZS5pbm5lclRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAzOCkgLy8gVXAgYXJyb3cga2V5XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhY3RpdmUnKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2RWwgPSBlbCA/IGVsLnByZXZpb3VzU2libGluZyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByZXZFbCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZFbCAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZFbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkaXZhLWlucHV0LXN1Z2dlc3Rpb24nKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkaXZhLWlucHV0LXN1Z2dlc3Rpb24nKVtsYXN0XS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmtleUNvZGUgPT09IDQwKSAvLyBEb3duIGFycm93IGtleVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWN0aXZlJylbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsID0gZWwgPyBlbC5uZXh0U2libGluZyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5leHRFbCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFbCAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZGl2YS1pbnB1dC1zdWdnZXN0aW9uJylbMF0uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBvbkV2ZW50KGlucHV0U3VnZ2VzdGlvbnMsICdtb3VzZWRvd24nLCAnLmRpdmEtaW5wdXQtc3VnZ2VzdGlvbicsIGZ1bmN0aW9uICgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdvdG9QYWdlSW5wdXQudmFsdWUgPSB0aGlzLnRleHRDb250ZW50O1xuICAgICAgICAgICAgaW5wdXRTdWdnZXN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgbGV0IHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50KCdzdWJtaXQnLCB7XG4gICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBnb3RvRm9ybS5kaXNwYXRjaEV2ZW50KHN1Ym1pdEV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gamF2YXNjcmlwdCBlcXVpdmFsZW50IHRvIGpxdWVyeSAub24oZXZlbnQsIHNlbGVjdG9yLCBmdW5jdGlvbilcbiAgICAgICAgZnVuY3Rpb24gb25FdmVudCAoZWxlbSwgZXZ0LCBzZWwsIGhhbmRsZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZ1bmN0aW9uIChldmVudClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgICAgICB3aGlsZSAodCAmJiB0ICE9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQubWF0Y2hlcyhzZWwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdCA9IHQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdvdG9QYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgIC8vIEhpZGUgbGFiZWwgc3VnZ2VzdGlvbnNcbiAgICAgICAgICAgIGlucHV0U3VnZ2VzdGlvbnMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGdvdG9Gb3JtO1xuICAgIH1cblxuICAgIGNyZWF0ZVZpZXdNZW51ICgpXG4gICAge1xuICAgICAgICBjb25zdCB2aWV3T3B0aW9uc0xpc3QgPSBlbHQoJ2RpdicsIHRoaXMuX2VsZW1BdHRycygndmlldy1vcHRpb25zJykpO1xuICAgICAgICBjb25zdCBncmlkVmlld0ljb24gPSB0aGlzLl9jcmVhdGVHcmlkVmlld0ljb24oKTtcbiAgICAgICAgY29uc3QgYm9va1ZpZXdJY29uID0gdGhpcy5fY3JlYXRlQm9va1ZpZXdJY29uKCk7XG4gICAgICAgIGNvbnN0IHBhZ2VWaWV3SWNvbiA9IHRoaXMuX2NyZWF0ZVBhZ2VWaWV3SWNvbigpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdPcHRpb25zVG9nZ2xlID0gKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdmlld09wdGlvbnNMaXN0LnN0eWxlLmRpc3BsYXkgPSB2aWV3T3B0aW9uc0xpc3Quc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VWaWV3QnV0dG9uID0gdGhpcy5jcmVhdGVCdXR0b24oJ3ZpZXctaWNvbicsICdDaGFuZ2UgdmlldycsIHZpZXdPcHRpb25zVG9nZ2xlKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RWaWV3ID0gKHZpZXcpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyLmNoYW5nZVZpZXcodmlldyk7XG5cbiAgICAgICAgICAgIC8vaGlkZSB2aWV3IG1lbnVcbiAgICAgICAgICAgIHZpZXdPcHRpb25zTGlzdC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlVmlld01lbnUgPSAoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB2aWV3SWNvbkNsYXNzZXMgPSAnIGRpdmEtdmlldy1pY29uIGRpdmEtYnV0dG9uJztcblxuXG4gICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBpY29uIG9mIHRoZSBtb2RlIHdlJ3JlIGN1cnJlbnRseSBpbiAoPylcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmluR3JpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWV3QnV0dG9uLmFwcGVuZENoaWxkKGdyaWRWaWV3SWNvbik7XG4gICAgICAgICAgICAgICAgY2hhbmdlVmlld0J1dHRvbi5jbGFzc05hbWUgPSAnZGl2YS1ncmlkLWljb24nICsgdmlld0ljb25DbGFzc2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5pbkJvb2tMYXlvdXQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2hhbmdlVmlld0J1dHRvbi5hcHBlbmRDaGlsZChib29rVmlld0ljb24pO1xuICAgICAgICAgICAgICAgIGNoYW5nZVZpZXdCdXR0b24uY2xhc3NOYW1lID0gJ2RpdmEtYm9vay1pY29uJyArIHZpZXdJY29uQ2xhc3NlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWV3QnV0dG9uLmFwcGVuZENoaWxkKHBhZ2VWaWV3SWNvbik7XG4gICAgICAgICAgICAgICAgY2hhbmdlVmlld0J1dHRvbi5jbGFzc05hbWUgPSAnZGl2YS1kb2N1bWVudC1pY29uJyArIHZpZXdJY29uQ2xhc3NlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgdmlld09wdGlvbnMgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAgICAgICAgIC8vIHRoZW4gZGlzcGxheSBkb2N1bWVudCwgYm9vaywgYW5kIGdyaWQgYnV0dG9ucyBpbiB0aGF0IG9yZGVyLCBleGNsdWRpbmcgdGhlIGN1cnJlbnQgdmlld1xuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuaW5HcmlkIHx8IHRoaXMuc2V0dGluZ3MuaW5Cb29rTGF5b3V0KVxuICAgICAgICAgICAgICAgIHZpZXdPcHRpb25zLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlQnV0dG9uKCdkb2N1bWVudC1pY29uJywgJ0RvY3VtZW50IFZpZXcnLCBzZWxlY3RWaWV3LmJpbmQobnVsbCwgJ2RvY3VtZW50JyksIHBhZ2VWaWV3SWNvbikpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkdyaWQgfHwgIXRoaXMuc2V0dGluZ3MuaW5Cb29rTGF5b3V0KVxuICAgICAgICAgICAgICAgIHZpZXdPcHRpb25zLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlQnV0dG9uKCdib29rLWljb24nLCAnQm9vayBWaWV3Jywgc2VsZWN0Vmlldy5iaW5kKG51bGwsICdib29rJyksIGJvb2tWaWV3SWNvbikpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuaW5HcmlkKVxuICAgICAgICAgICAgICAgIHZpZXdPcHRpb25zLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlQnV0dG9uKCdncmlkLWljb24nLCAnR3JpZCBWaWV3Jywgc2VsZWN0Vmlldy5iaW5kKG51bGwsICdncmlkJyksIGdyaWRWaWV3SWNvbikpO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIG1lbnVcbiAgICAgICAgICAgIHdoaWxlICh2aWV3T3B0aW9uc0xpc3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2aWV3T3B0aW9uc0xpc3QucmVtb3ZlQ2hpbGQodmlld09wdGlvbnNMaXN0LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnNlcnQgbmV3IG1lbnVcbiAgICAgICAgICAgIHZpZXdPcHRpb25zTGlzdC5hcHBlbmRDaGlsZCh2aWV3T3B0aW9ucyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGV2ZW50ID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh2aWV3T3B0aW9uc0xpc3QgIT09IGV2ZW50LnRhcmdldClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2aWV3T3B0aW9uc0xpc3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCdWaWV3RGlkU3dpdGNoJywgdXBkYXRlVmlld01lbnUpO1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoJ09iamVjdERpZExvYWQnLCB1cGRhdGVWaWV3TWVudSk7XG5cbiAgICAgICAgcmV0dXJuIGVsdCgnZGl2JywgdGhpcy5fZWxlbUF0dHJzKCd2aWV3LW1lbnUnKSxcbiAgICAgICAgICAgIGNoYW5nZVZpZXdCdXR0b24sXG4gICAgICAgICAgICB2aWV3T3B0aW9uc0xpc3RcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjcmVhdGVGdWxsc2NyZWVuQnV0dG9uICgpXG4gICAge1xuICAgICAgICBsZXQgZnVsbHNjcmVlbkljb24gPSB0aGlzLl9jcmVhdGVGdWxsc2NyZWVuSWNvbigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbignZnVsbHNjcmVlbi1pY29uJywgJ1RvZ2dsZSBmdWxsc2NyZWVuIG1vZGUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlci50b2dnbGVGdWxsc2NyZWVuTW9kZSgpO1xuICAgICAgICB9LCBmdWxsc2NyZWVuSWNvbik7XG4gICAgfVxuXG4gICAgdG9nZ2xlWm9vbUdyaWRDb250cm9scyAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmluR3JpZClcbiAgICAgICAge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5JRCArIFwiem9vbS1jb250cm9sc1wiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5JRCArIFwiZ3JpZC1jb250cm9sc1wiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLklEICsgXCJ6b29tLWNvbnRyb2xzXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3MuSUQgKyBcImdyaWQtY29udHJvbHNcIikuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmVuZGVyICgpXG4gICAge1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoXCJWaWV3RGlkU3dpdGNoXCIsIHRoaXMudG9nZ2xlWm9vbUdyaWRDb250cm9scyk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZShcIk9iamVjdERpZExvYWRcIiwgdGhpcy50b2dnbGVab29tR3JpZENvbnRyb2xzKTtcblxuICAgICAgICBsZXQgbGVmdFRvb2xzID0gW1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVab29tQnV0dG9ucygpLFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcmlkQ29udHJvbHMoKVxuICAgICAgICBdO1xuICAgICAgICBsZXQgcmlnaHRUb29scyA9IFtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUGFnZUxhYmVsKCksXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVZpZXdNZW51KClcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlRnVsbHNjcmVlbilcbiAgICAgICAgICAgIHJpZ2h0VG9vbHMucHVzaCh0aGlzLmNyZWF0ZUZ1bGxzY3JlZW5CdXR0b24oKSk7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmVuYWJsZUdvdG9QYWdlKVxuICAgICAgICAgICAgcmlnaHRUb29scy5zcGxpY2UoMSwgMCwgdGhpcy5jcmVhdGVHb3RvUGFnZUZvcm0oKSk7XG5cbiAgICAgICAgLy8gYXNzaWduIHRvb2xiYXIgcGx1Z2lucyB0byBwcm9wZXIgc2lkZVxuICAgICAgICBsZXQgcGx1Z2lucyA9IHRoaXMudmlld2VyLnZpZXdlclN0YXRlLnBsdWdpbkluc3RhbmNlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBsdWdpbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5zW2ldO1xuXG4gICAgICAgICAgICBpZiAoIXBsdWdpbi50b29sYmFyU2lkZSkgLy8gbm90IGEgdG9vbGJhciB0b29sXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIHBsdWdpbi50b29sYmFySWNvbiA9IHBsdWdpbi5jcmVhdGVJY29uKCk7XG4gICAgICAgICAgICBpZiAoIXBsdWdpbi50b29sYmFySWNvbikgLy8gaWNvbiBjb3VsZG4ndCBiZSBjcmVhdGVkXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIGFkZCBwbHVnaW4gdG9vbHMgYWZ0ZXIgdGhlIGdvLXRvLXBhZ2UgYW5kIHBhZ2UtbGFiZWwgdG9vbHNcbiAgICAgICAgICAgIGlmIChwbHVnaW4udG9vbGJhclNpZGUgPT09ICdyaWdodCcpXG4gICAgICAgICAgICAgICAgcmlnaHRUb29scy5zcGxpY2UoMiwgMCwgcGx1Z2luLnRvb2xiYXJJY29uKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHBsdWdpbi50b29sYmFyU2lkZSA9PT0gJ2xlZnQnKVxuICAgICAgICAgICAgICAgIGxlZnRUb29scy5zcGxpY2UoMiwgMCwgcGx1Z2luLnRvb2xiYXJJY29uKTtcblxuICAgICAgICAgICAgcGx1Z2luLnRvb2xiYXJJY29uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlUGx1Z2luQ2xpY2suYmluZCh0aGlzLCBwbHVnaW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVBsdWdpbkNsaWNrIChwbHVnaW4pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBsdWdpbi5oYW5kbGVDbGljayh0aGlzLnZpZXdlcik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b29scyA9IGVsdCgnZGl2JywgdGhpcy5fZWxlbUF0dHJzKCd0b29scycpLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHRoaXMuX2VsZW1BdHRycygndG9vbHMtbGVmdCcpLCBsZWZ0VG9vbHMpLFxuICAgICAgICAgICAgICAgICAgICBlbHQoJ2RpdicsIHRoaXMuX2VsZW1BdHRycygndG9vbHMtcmlnaHQnKSwgcmlnaHRUb29scylcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2V0dGluZ3MudG9vbGJhclBhcmVudE9iamVjdC5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICB0b29scyxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MudG9vbGJhclBhcmVudE9iamVjdC5maXJzdENoaWxkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVRvb2xiYXJJY29uIChwYXRocylcbiAgICB7XG4gICAgICAgIGxldCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgICAgIGljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCBcIjAgMCAyNSAyNVwiKTtcbiAgICAgICAgaWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgaWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgaWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnc3R5bGUnLCBcImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDggNDg7XCIpO1xuXG4gICAgICAgIGxldCBnbHlwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICAgICAgZ2x5cGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgXCJtYXRyaXgoMSwgMCwgMCwgMSwgLTEyLCAtMTIpXCIpO1xuXG4gICAgICAgIHBhdGhzLmZvckVhY2goIChwYXRoKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgICAgICAgICAgcEVsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiLCBwYXRoKTtcbiAgICAgICAgICAgIGdseXBoLmFwcGVuZENoaWxkKHBFbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGljb24uYXBwZW5kQ2hpbGQoZ2x5cGgpO1xuICAgICAgICByZXR1cm4gaWNvbjtcbiAgICB9XG5cbiAgICBfY3JlYXRlWm9vbU91dEljb24gKClcbiAgICB7XG4gICAgICAgIGxldCBwYXRocyA9IFtcbiAgICAgICAgICAgIFwiTTE5LjUsMjNjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTFjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg3YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2MWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDE5LjV6XCIsXG4gICAgICAgICAgICBcIk0zNy4yMTksMzQuMjU3bC0yLjIxMywyLjIxMmMtMC4yMDIsMC4yMDItMC41MzQsMC4yMDItMC43MzYsMGwtNi4wOTgtNi4wOTljLTEuNTM3LDAuOTkzLTMuMzYyLDEuNTc3LTUuMzIzLDEuNTc3Yy01LjQzMSwwLTkuODQ5LTQuNDE4LTkuODQ5LTkuODQ5YzAtNS40MzEsNC40MTgtOS44NDksOS44NDktOS44NDljNS40MzEsMCw5Ljg0OSw0LjQxOCw5Ljg0OSw5Ljg0OWMwLDEuOTYxLTAuNTg0LDMuNzg2LTEuNTc2LDUuMzIzbDYuMDk4LDYuMDk4QzM3LjQyMiwzMy43MjIsMzcuNDIyLDM0LjA1NCwzNy4yMTksMzQuMjU3eiBNMjkuNTY4LDIyLjA5OWMwLTMuNzA2LTMuMDE0LTYuNzItNi43Mi02LjcyYy0zLjcwNiwwLTYuNzIsMy4wMTQtNi43Miw2LjcyYzAsMy43MDYsMy4wMTQsNi43Miw2LjcyLDYuNzJDMjYuNTU1LDI4LjgxOCwyOS41NjgsMjUuODA1LDI5LjU2OCwyMi4wOTl6XCJcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVG9vbGJhckljb24ocGF0aHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVab29tSW5JY29uICgpXG4gICAge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXG4gICAgICAgICAgICBcIk0zNy40NjksMzQuMjU3bC0yLjIxMywyLjIxMmMtMC4yMDIsMC4yMDItMC41MzQsMC4yMDItMC43MzYsMGwtNi4wOTgtNi4wOTljLTEuNTM3LDAuOTkzLTMuMzYyLDEuNTc3LTUuMzIzLDEuNTc3Yy01LjQzMSwwLTkuODQ5LTQuNDE4LTkuODQ5LTkuODQ5YzAtNS40MzEsNC40MTgtOS44NDksOS44NDktOS44NDljNS40MzEsMCw5Ljg0OSw0LjQxOCw5Ljg0OSw5Ljg0OWMwLDEuOTYxLTAuNTg0LDMuNzg2LTEuNTc2LDUuMzIzbDYuMDk4LDYuMDk4QzM3LjY3MiwzMy43MjIsMzcuNjcyLDM0LjA1NCwzNy40NjksMzQuMjU3eiBNMjkuODE4LDIyLjA5OWMwLTMuNzA2LTMuMDE0LTYuNzItNi43Mi02LjcyYy0zLjcwNiwwLTYuNzIsMy4wMTQtNi43Miw2LjcyYzAsMy43MDYsMy4wMTQsNi43Miw2LjcyLDYuNzJDMjYuODA1LDI4LjgxOCwyOS44MTgsMjUuODA1LDI5LjgxOCwyMi4wOTl6IE0yNi41LDIxSDI0di0yLjVjMC0wLjI3NS0wLjIyNS0wLjUtMC41LTAuNWgtMWMtMC4yNzUsMC0wLjUsMC4yMjUtMC41LDAuNVYyMWgtMi41Yy0wLjI3NSwwLTAuNSwwLjIyNS0wLjUsMC41djFjMCwwLjI3NSwwLjIyNSwwLjUsMC41LDAuNUgyMnYyLjVjMCwwLjI3NSwwLjIyNSwwLjUsMC41LDAuNWgxYzAuMjc1LDAsMC41LTAuMjI1LDAuNS0wLjVWMjNoMi41YzAuMjc1LDAsMC41LTAuMjI1LDAuNS0wLjV2LTFDMjcsMjEuMjI1LDI2Ljc3NSwyMSwyNi41LDIxelwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVUb29sYmFySWNvbihwYXRocyk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUdyaWRNb3JlSWNvbiAoKVxuICAgIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW1xuICAgICAgICAgICAgXCJNMjkuNSwzNWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjkuNXogTTIxLjUsMzVjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDIxLjV6IE0xMy41LDM1Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgxMy41eiBNMjkuNSwyN2MtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjkuNXogTTIxLjUsMjdjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDIxLjV6IE0xMy41LDI3Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgxMy41eiBNMjkuNSwxOWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjkuNXogTTIxLjUsMTljLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDIxLjV6IE0xMy41LDE5Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgxMy41elwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVUb29sYmFySWNvbihwYXRocyk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUdyaWRGZXdlckljb24gKClcbiAgICB7XG4gICAgICAgIGxldCBwYXRocyA9IFtcbiAgICAgICAgICAgIFwiTTI1LjUsMzVjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTljMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg5YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2OWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDI1LjV6IE0yMi41LDM1YzAuMjc1LDAsMC41LTAuMjI1LDAuNS0wLjV2LTljMC0wLjI3NS0wLjIyNS0wLjUtMC41LTAuNWgtOWMtMC4yNzUsMC0wLjUsMC4yMjUtMC41LDAuNXY5YzAsMC4yNzUsMC4yMjUsMC41LDAuNSwwLjVIMjIuNXogTTM0LjUsMjNjMC4yNzUsMCwwLjUtMC4yMjUsMC41LTAuNXYtOWMwLTAuMjc1LTAuMjI1LTAuNS0wLjUtMC41aC05Yy0wLjI3NSwwLTAuNSwwLjIyNS0wLjUsMC41djljMCwwLjI3NSwwLjIyNSwwLjUsMC41LDAuNUgzNC41eiBNMjIuNSwyM2MwLjI3NSwwLDAuNS0wLjIyNSwwLjUtMC41di05YzAtMC4yNzUtMC4yMjUtMC41LTAuNS0wLjVoLTljLTAuMjc1LDAtMC41LDAuMjI1LTAuNSwwLjV2OWMwLDAuMjc1LDAuMjI1LDAuNSwwLjUsMC41SDIyLjV6XCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVRvb2xiYXJJY29uKHBhdGhzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlR3JpZFZpZXdJY29uICgpXG4gICAge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXG4gICAgICAgICAgICBcIk0yOS41LDM1Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyOS41eiBNMjEuNSwzNWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjEuNXogTTEzLjUsMzVjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDEzLjV6IE0yOS41LDI3Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyOS41eiBNMjEuNSwyN2MtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjEuNXogTTEzLjUsMjdjLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDEzLjV6IE0yOS41LDE5Yy0wLjI3NSwwLTAuNS0wLjIyNS0wLjUtMC41di01YzAtMC4yNzUsMC4yMjUtMC41LDAuNS0wLjVoNWMwLjI3NSwwLDAuNSwwLjIyNSwwLjUsMC41djVjMCwwLjI3NS0wLjIyNSwwLjUtMC41LDAuNUgyOS41eiBNMjEuNSwxOWMtMC4yNzUsMC0wLjUtMC4yMjUtMC41LTAuNXYtNWMwLTAuMjc1LDAuMjI1LTAuNSwwLjUtMC41aDVjMC4yNzUsMCwwLjUsMC4yMjUsMC41LDAuNXY1YzAsMC4yNzUtMC4yMjUsMC41LTAuNSwwLjVIMjEuNXogTTEzLjUsMTljLTAuMjc1LDAtMC41LTAuMjI1LTAuNS0wLjV2LTVjMC0wLjI3NSwwLjIyNS0wLjUsMC41LTAuNWg1YzAuMjc1LDAsMC41LDAuMjI1LDAuNSwwLjV2NWMwLDAuMjc1LTAuMjI1LDAuNS0wLjUsMC41SDEzLjV6XCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVRvb2xiYXJJY29uKHBhdGhzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQm9va1ZpZXdJY29uICgpXG4gICAge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXG4gICAgICAgICAgICBcIk0zNSwxNi44di0xLjMyM2MwLDAtMi4yOTItMS4zMjgtNS43NC0xLjMyOGMtMy40NDgsMC01LjI2LDEuMjUtNS4yNiwxLjI1cy0xLjgxMy0xLjI1LTUuMjYtMS4yNWMtMy40NDgsMC01Ljc0LDEuMzI4LTUuNzQsMS4zMjhWMTYuOGwtMSwwLjUzMXYwLjAyMXYxNS42ODdjMCwwLDQuNTMxLTEuNTc4LDYuOTk5LTEuNTc4YzIuNDY4LDAsNS4wMDEsMC44ODUsNS4wMDEsMC44ODVzMi41MzItMC44ODUsNS0wLjg4NWMwLjMwNiwwLDAuNjQzLDAuMDI0LDEsMC4wNjZ2NC4zMjVsMS41MzEtMi4wMTZMMzMsMzUuODUydi0zLjcyYzIsMC40MywzLDAuOTA2LDMsMC45MDZWMTcuMzUydi0wLjAyMUwzNSwxNi44eiBNMjMsMjkuMDNjLTEtMC4yOTItMi41ODQtMC42NzktMy45ODEtMC42NzljLTIuMjQ2LDAtMy4wMTksMC40MDQtNC4wMTksMC42OTlWMTYuNjM0YzAsMCwxLjEyNS0wLjY5OSw0LjAxOS0wLjY5OWMxLjY5NCwwLDIuOTgxLDAuNDE3LDMuOTgxLDEuMTI2VjI5LjAzeiBNMzMsMjkuMDUxYy0xLTAuMjk1LTEuNzczLTAuNjk5LTQuMDItMC42OTljLTEuMzk2LDAtMi45ODEsMC4zODctMy45OCwwLjY3OVYxNy4wNmMxLTAuNzA5LDIuMjg2LTEuMTI2LDMuOTgtMS4xMjZjMi44OTUsMCw0LjAyLDAuNjk5LDQuMDIsMC42OTlWMjkuMDUxelwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVUb29sYmFySWNvbihwYXRocyk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVBhZ2VWaWV3SWNvbiAoKVxuICAgIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW1xuICAgICAgICAgICAgXCJNMjkuNDI1LDI5aDQuNDdMMjksMzMuOTM0di00LjQ3QzI5LDI5LjE5LDI5LjE1MSwyOSwyOS40MjUsMjl6IE0zNCwxNC41NjNWMjhoLTUuNTY5QzI4LjE1NywyOCwyOCwyOC4xOTYsMjgsMjguNDdWMzRIMTQuNDk3QzE0LjIyMywzNCwxNCwzMy43MSwxNCwzMy40MzdWMTQuNTYzQzE0LDE0LjI5LDE0LjIyMywxNCwxNC40OTcsMTRoMTguOUMzMy42NzIsMTQsMzQsMTQuMjksMzQsMTQuNTYzeiBNMjUuNDk3LDI2LjQ5N0MyNS40OTcsMjYuMjIzLDI1LjI3NSwyNiwyNSwyNmgtN2MtMC4yNzUsMC0wLjQ5NywwLjIyMy0wLjQ5NywwLjQ5N3YxLjAwNkMxNy41MDMsMjcuNzc3LDE3LjcyNSwyOCwxOCwyOGg3YzAuMjc1LDAsMC40OTctMC4yMjMsMC40OTctMC40OTdWMjYuNDk3eiBNMzAuNDk3LDIyLjQ5N0MzMC40OTcsMjIuMjIzLDMwLjI3NSwyMiwzMCwyMkgxOGMtMC4yNzUsMC0wLjQ5NywwLjIyMy0wLjQ5NywwLjQ5N3YxLjAwNkMxNy41MDMsMjMuNzc3LDE3LjcyNSwyNCwxOCwyNGgxMmMwLjI3NSwwLDAuNDk3LTAuMjIzLDAuNDk3LTAuNDk3VjIyLjQ5N3ogTTMwLjQ5NywxOC40OTdDMzAuNDk3LDE4LjIyMywzMC4yNzUsMTgsMzAsMThIMThjLTAuMjc1LDAtMC40OTcsMC4yMjMtMC40OTcsMC40OTd2MS4wMDZDMTcuNTAzLDE5Ljc3NywxNy43MjUsMjAsMTgsMjBoMTJjMC4yNzUsMCwwLjQ5Ny0wLjIyMywwLjQ5Ny0wLjQ5N1YxOC40OTd6XCJcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVG9vbGJhckljb24ocGF0aHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVGdWxsc2NyZWVuSWNvbiAoKVxuICAgIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW1xuICAgICAgICAgICAgXCJNMzUsMTJIMTNjLTAuNTUsMC0xLDAuNDUtMSwxdjIyYzAsMC41NSwwLjQ1LDEsMSwxaDIyYzAuNTUsMCwxLTAuNDUsMS0xVjEzQzM2LDEyLjQ1LDM1LjU1LDEyLDM1LDEyeiBNMzQsMzRIMTRWMTRoMjBWMzR6XCIsXG4gICAgICAgICAgICBcIk0xNywyMS43NXYtNC41YzAtMC4xMzgsMC4xMTItMC4yNSwwLjI1LTAuMjVoNC41YzAuMTM4LDAsMC4xNywwLjA4LDAuMDczLDAuMTc3bC0xLjYxNiwxLjYxNmwxLjgyMywxLjgyM2MwLjA5NywwLjA5NywwLjA5NywwLjI1NiwwLDAuMzU0bC0xLjA2MSwxLjA2Yy0wLjA5NywwLjA5Ny0wLjI1NiwwLjA5Ny0wLjM1NCwwbC0xLjgyMy0xLjgyM2wtMS42MTYsMS42MTZDMTcuMDgsMjEuOTIsMTcsMjEuODg4LDE3LDIxLjc1eiBNMjAuOTcsMjUuOTdjLTAuMDk3LTAuMDk3LTAuMjU2LTAuMDk3LTAuMzU0LDBsLTEuODIzLDEuODIzbC0xLjYxNi0xLjYxNkMxNy4wOCwyNi4wOCwxNywyNi4xMTIsMTcsMjYuMjV2NC41YzAsMC4xMzgsMC4xMTIsMC4yNSwwLjI1LDAuMjVoNC41YzAuMTM4LDAsMC4xNy0wLjA4LDAuMDczLTAuMTc3bC0xLjYxNi0xLjYxNmwxLjgyMy0xLjgyM2MwLjA5Ny0wLjA5NywwLjA5Ny0wLjI1NiwwLTAuMzU0TDIwLjk3LDI1Ljk3eiBNMzAuNzUsMTdoLTQuNWMtMC4xMzgsMC0wLjE3LDAuMDgtMC4wNzMsMC4xNzdsMS42MTYsMS42MTZsLTEuODIzLDEuODIzYy0wLjA5NywwLjA5Ny0wLjA5NywwLjI1NiwwLDAuMzU0bDEuMDYxLDEuMDZjMC4wOTcsMC4wOTcsMC4yNTYsMC4wOTcsMC4zNTQsMGwxLjgyMy0xLjgyM2wxLjYxNiwxLjYxNkMzMC45MiwyMS45MiwzMSwyMS44ODgsMzEsMjEuNzV2LTQuNUMzMSwxNy4xMTIsMzAuODg4LDE3LDMwLjc1LDE3eiBNMzAuODIzLDI2LjE3N2wtMS42MTYsMS42MTZsLTEuODIzLTEuODIzYy0wLjA5Ny0wLjA5Ny0wLjI1Ni0wLjA5Ny0wLjM1NCwwbC0xLjA2MSwxLjA2Yy0wLjA5NywwLjA5Ny0wLjA5NywwLjI1NiwwLDAuMzU0bDEuODIzLDEuODIzbC0xLjYxNiwxLjYxNkMyNi4wOCwzMC45MiwyNi4xMTIsMzEsMjYuMjUsMzFoNC41YzAuMTM4LDAsMC4yNS0wLjExMiwwLjI1LTAuMjV2LTQuNUMzMSwyNi4xMTIsMzAuOTIsMjYuMDgsMzAuODIzLDI2LjE3N3ogTTI2LDIyLjVjMC0wLjI3NS0wLjIyNS0wLjUtMC41LTAuNWgtM2MtMC4yNzUsMC0wLjUsMC4yMjUtMC41LDAuNXYzYzAsMC4yNzUsMC4yMjUsMC41LDAuNSwwLjVoM2MwLjI3NSwwLDAuNS0wLjIyNSwwLjUtMC41VjIyLjV6XCJcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVG9vbGJhckljb24ocGF0aHMpO1xuICAgIH1cbn1cbiIsImxldCBIYXNoUGFyYW1zID0ge1xuICAgIGdldDogZ2V0SGFzaFBhcmFtLFxuICAgIHVwZGF0ZTogdXBkYXRlSGFzaFBhcmFtXG59O1xuXG5leHBvcnQgZGVmYXVsdCBIYXNoUGFyYW1zO1xuXG5cbi8vIEZvciBnZXR0aW5nIHRoZSAja2V5IHZhbHVlcyBmcm9tIHRoZSBVUkwuIEZvciBzcGVjaWZ5aW5nIGEgcGFnZSBhbmQgem9vbSBsZXZlbFxuLy8gTG9vayBpbnRvIGNhY2hpbmcsIGJlY2F1c2Ugd2Ugb25seSBuZWVkIHRvIGdldCB0aGlzIGR1cmluZyB0aGUgaW5pdGlhbCBsb2FkXG4vLyBBbHRob3VnaCBmb3IgdGhlIHRlc3RzIEkgZ3Vlc3Mgd2Ugd291bGQgbmVlZCB0byBvdmVycmlkZSBjYWNoaW5nIHNvbWVob3dcbmZ1bmN0aW9uIGdldEhhc2hQYXJhbSAoa2V5KVxue1xuICAgIGNvbnN0IGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcblxuICAgIGlmIChoYXNoICE9PSAnJylcbiAgICB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgZWl0aGVyICZrZXk9IG9yICNrZXk9XG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gKGhhc2guaW5kZXhPZignJicgKyBrZXkgKyAnPScpID4gMCkgPyBoYXNoLmluZGV4T2YoJyYnICsga2V5ICsgJz0nKSA6IGhhc2guaW5kZXhPZignIycgKyBrZXkgKyAnPScpO1xuXG4gICAgICAgIC8vIElmIHN0YXJ0SW5kZXggaXMgc3RpbGwgLTEsIGl0IG1lYW5zIGl0IGNhbid0IGZpbmQgZWl0aGVyXG4gICAgICAgIGlmIChzdGFydEluZGV4ID49IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgcGx1cyB0aGUgJiBhbmQgPVxuICAgICAgICAgICAgc3RhcnRJbmRleCArPSBrZXkubGVuZ3RoICsgMjtcblxuICAgICAgICAgICAgLy8gRWl0aGVyIHRvIHRoZSBuZXh0IGFtcGVyc2FuZCBvciB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmdcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gaGFzaC5pbmRleE9mKCcmJywgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICBpZiAoZW5kSW5kZXggPiBzdGFydEluZGV4KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGFzaC5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVuZEluZGV4IDwgMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoaXMgaGFzaCBwYXJhbSBpcyB0aGUgbGFzdCBvbmVcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhhc2guc3Vic3RyaW5nKHN0YXJ0SW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZSBrZXkgZG9lc24ndCBoYXZlIGEgdmFsdWUgSSB0aGlua1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gSWYgaXQgY2FuJ3QgZmluZCB0aGUga2V5XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGhhc2ggcGFyYW1zIGp1c3QgcmV0dXJuIGZhbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhhc2hQYXJhbSAoa2V5LCB2YWx1ZSlcbntcbiAgICAvLyBGaXJzdCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHRvIGRvIGFueSB3b3JrIGF0IGFsbFxuICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBnZXRIYXNoUGFyYW0oa2V5KTtcbiAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cbiAgICBpZiAob3JpZ2luYWxWYWx1ZSAhPT0gdmFsdWUpXG4gICAge1xuICAgICAgICAvLyBJcyB0aGUga2V5IGFscmVhZHkgaW4gdGhlIFVSTD9cbiAgICAgICAgaWYgKHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBpbiB0aGUgVVJMLiBKdXN0IGdldCByaWQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gKGhhc2guaW5kZXhPZignJicgKyBrZXkgKyAnPScpID4gMCkgPyBoYXNoLmluZGV4T2YoJyYnICsga2V5ICsgJz0nKSA6IGhhc2guaW5kZXhPZignIycgKyBrZXkgKyAnPScpO1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBzdGFydEluZGV4ICsga2V5Lmxlbmd0aCArIDIgKyBvcmlnaW5hbFZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIC8vICMgaWYgaXQncyB0aGUgZmlyc3QsICYgb3RoZXJ3aXNlXG4gICAgICAgICAgICBjb25zdCBzdGFydFRoaW5nID0gKHN0YXJ0SW5kZXggPT09IDApID8gJyMnIDogJyYnO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaGFzaC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkgKyBzdGFydFRoaW5nICsga2V5ICsgJz0nICsgdmFsdWUgKyBoYXNoLnN1YnN0cmluZyhlbmRJbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gSXQncyBub3QgcHJlc2VudCAtIGFkZCBpdFxuICAgICAgICAgICAgaWYgKGhhc2gubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCcjJyArIGtleSArICc9JyArIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBBcHBlbmQgaXRcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShoYXNoICsgJyYnICsga2V5ICsgJz0nICsgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0ICcuL3V0aWxzL3ZhbmlsbGEua2luZXRpYyc7XG5pbXBvcnQgJy4vdXRpbHMvZHJhZ3Njcm9sbCc7XG5pbXBvcnQgeyBlbHQgfSBmcm9tIFwiLi91dGlscy9lbHRcIjtcbmltcG9ydCB7XG4gICAgRGl2YVBhcmVudEVsZW1lbnROb3RGb3VuZEV4Y2VwdGlvbixcbiAgICBOb3RBbklJSUZNYW5pZmVzdEV4Y2VwdGlvbixcbiAgICBPYmplY3REYXRhTm90U3VwcGxpZWRFeGNlcHRpb25cbn0gZnJvbSBcIi4vZXhjZXB0aW9uc1wiO1xuaW1wb3J0IGRpdmEgZnJvbSBcIi4vZGl2YS1nbG9iYWxcIjtcbmltcG9ydCBWaWV3ZXJDb3JlIGZyb20gXCIuL3ZpZXdlci1jb3JlXCI7XG5pbXBvcnQgSW1hZ2VNYW5pZmVzdCBmcm9tIFwiLi9pbWFnZS1tYW5pZmVzdFwiO1xuaW1wb3J0IFRvb2xiYXIgZnJvbSBcIi4vdG9vbGJhclwiO1xuaW1wb3J0IEhhc2hQYXJhbXMgZnJvbSBcIi4vdXRpbHMvaGFzaC1wYXJhbXNcIjtcblxuXG4vKipcbiAqIFRoZSB0b3AtbGV2ZWwgY2xhc3MgZm9yIERpdmEgb2JqZWN0cy4gVGhpcyBpcyBpbnN0YW50aWF0ZWQgYnkgcGFzc2luZyBpbiBhbiBIVE1MIGVsZW1lbnRcbiAqIElEIG9yIEhUTUwgRWxlbWVudCBub2RlIGFuZCBhbiBvYmplY3QgY29udGFpbmluZyBhIGxpc3Qgb2Ygb3B0aW9ucywgb2Ygd2hpY2ggdGhlICdvYmplY3REYXRhJ1xuICogb3B0aW9uIGlzIHJlcXVpcmVkIGFuZCB3aGljaCBtdXN0IHBvaW50IHRvIGEgSUlJRiBQcmVzZW50YXRpb24gQVBJIE1hbmlmZXN0OlxuICpcbiAqIHZhciBkaXZhID0gbmV3IERpdmEoJ2VsZW1lbnQtaWQnLCB7XG4gKiAgICAgb2JqZWN0RGF0YTogXCJodHRwOi8vZXhhbXBsZS5jb20vaWlpZi1tYW5pZmVzdC5qc29uXCJcbiAqIH0pO1xuICpcbiAqIFRoaXMgY2xhc3MgYWxzbyBzZXJ2ZXMgYXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgRXZlbnRzIHN5c3RlbSwgaW4gd2hpY2ggYXBwbGljYXRpb25zIGNhbiBzdWJzY3JpYmVcbiAqIHRvIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIERpdmEgaW5zdGFuY2VzOlxuICpcbiAqIERpdmEuRXZlbnRzLnN1YnNjcmliZSgnVmlzaWJsZVBhZ2VEaWRDaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGNvbnNvbGUubG9nKFwiVmlzaWJsZSBQYWdlIENoYW5nZWRcIik7IH0pO1xuICpcbiAqXG4gKlxuICoqL1xuY2xhc3MgRGl2YVxue1xuICAgIGNvbnN0cnVjdG9yIChlbGVtZW50LCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgLypcbiAgICAgICAgICogSWYgYSBzdHJpbmcgaXMgcGFzc2VkIGluLCBjb252ZXJ0IHRoYXQgdG8gYW4gZWxlbWVudC5cbiAgICAgICAgICogKi9cbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQgPT09IG51bGwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERpdmFQYXJlbnRFbGVtZW50Tm90Rm91bmRFeGNlcHRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5vYmplY3REYXRhKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGF0YU5vdFN1cHBsaWVkRXhjZXB0aW9uKCdZb3UgbXVzdCBzdXBwbHkgZWl0aGVyIGEgVVJMIG9yIGEgbGl0ZXJhbCBvYmplY3QgdG8gdGhlIGBvYmplY3REYXRhYCBrZXkuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGFkYXB0aXZlUGFkZGluZzogMC4wNSwgICAgICAvLyBUaGUgcmF0aW8gb2YgcGFkZGluZyB0byB0aGUgcGFnZSBkaW1lbnNpb25cbiAgICAgICAgICAgIGFycm93U2Nyb2xsQW1vdW50OiA0MCwgICAgICAvLyBUaGUgYW1vdW50IChpbiBwaXhlbHMpIHRvIHNjcm9sbCBieSB3aGVuIHVzaW5nIGFycm93IGtleXNcbiAgICAgICAgICAgIGJsb2NrTW9iaWxlTW92ZTogZmFsc2UsICAgICAvLyBQcmV2ZW50IG1vdmluZyBvciBzY3JvbGxpbmcgdGhlIHBhZ2Ugb24gbW9iaWxlIGRldmljZXNcbiAgICAgICAgICAgIG9iamVjdERhdGE6ICcnLCAgICAgICAgICAgICAvLyBBIElJSUYgTWFuaWZlc3Qgb3IgYSBKU09OIGZpbGUgZ2VuZXJhdGVkIGJ5IHByb2Nlc3MucHkgdGhhdCBwcm92aWRlcyB0aGUgb2JqZWN0IGRpbWVuc2lvbiBkYXRhLCBvciBhIFVSTCBwb2ludGluZyB0byBzdWNoIGRhdGEgLSAqUkVRVUlSRUQqXG4gICAgICAgICAgICBlbmFibGVBdXRvVGl0bGU6IHRydWUsICAgICAgLy8gU2hvd3MgdGhlIHRpdGxlIHdpdGhpbiBhIGRpdiBvZiBpZCBkaXZhLXRpdGxlXG4gICAgICAgICAgICBlbmFibGVGaWxlbmFtZTogdHJ1ZSwgICAgICAgLy8gVXNlcyBmaWxlbmFtZXMgYW5kIG5vdCBwYWdlIG51bWJlcnMgZm9yIGxpbmtzIChpPWJtXzAwMS50aWYsIG5vdCBwPTEpXG4gICAgICAgICAgICBlbmFibGVGdWxsc2NyZWVuOiB0cnVlLCAgICAgLy8gRW5hYmxlIG9yIGRpc2FibGUgZnVsbHNjcmVlbiBpY29uIChtb2RlIHN0aWxsIGF2YWlsYWJsZSlcbiAgICAgICAgICAgIGVuYWJsZUdvdG9QYWdlOiB0cnVlLCAgICAgICAvLyBBIFwiZ28gdG8gcGFnZVwiIGp1bXAgYm94XG4gICAgICAgICAgICBlbmFibGVHb3RvU3VnZ2VzdGlvbnM6IHRydWUsIC8vIENvbnRyb2xzIHdoZXRoZXIgc3VnZ2VzdGlvbnMgYXJlIHNob3duIHVuZGVyIHRoZSBpbnB1dCBmaWVsZCB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZyBpbiB0aGUgJ2dvIHRvIHBhZ2UnIGZvcm1cbiAgICAgICAgICAgIGVuYWJsZUdyaWRJY29uOiB0cnVlLCAgICAgICAvLyBBIGdyaWQgdmlldyBvZiBhbGwgdGhlIHBhZ2VzXG4gICAgICAgICAgICBlbmFibGVHcmlkQ29udHJvbHM6ICdidXR0b25zJywgIC8vIFNwZWNpZnkgY29udHJvbCBvZiBwYWdlcyBwZXIgZ3JpZCByb3cgaW4gR3JpZCB2aWV3LiBQb3NzaWJsZSB2YWx1ZXM6ICdidXR0b25zJyAoKy8tKSwgJ3NsaWRlcicuIEFueSBvdGhlciB2YWx1ZSBkaXNhYmxlcyB0aGUgY29udHJvbHMuXG4gICAgICAgICAgICBlbmFibGVJbWFnZVRpdGxlczogdHJ1ZSwgICAgLy8gQWRkcyBcIlBhZ2Uge259XCIgdGl0bGUgdG8gcGFnZSBpbWFnZXMgaWYgdHJ1ZVxuICAgICAgICAgICAgZW5hYmxlSW5kZXhBc0xhYmVsOiBmYWxzZSwgIC8vIFVzZSBpbmRleCBudW1iZXJzIGluc3RlYWQgb2YgcGFnZSBsYWJlbHMgaW4gdGhlIHBhZ2Ugbi1tIGRpc3BsYXkuXG4gICAgICAgICAgICBlbmFibGVLZXlTY3JvbGw6IHRydWUsICAgICAgLy8gQ2FwdHVyZXMgc2Nyb2xsaW5nIHVzaW5nIHRoZSBhcnJvdyBhbmQgcGFnZSB1cC9kb3duIGtleXMgcmVnYXJkbGVzcyBvZiBwYWdlIGZvY3VzLiBXaGVuIG9mZiwgZGVmZXJzIHRvIGRlZmF1bHQgYnJvd3NlciBzY3JvbGxpbmcgYmVoYXZpb3IuXG4gICAgICAgICAgICBlbmFibGVMaW5rSWNvbjogdHJ1ZSwgICAgICAgLy8gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGxpbmsgaWNvblxuICAgICAgICAgICAgZW5hYmxlTm9uUGFnZWRWaXNpYmlsaXR5SWNvbjogdHJ1ZSwgLy8gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGljb24gdG8gdG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIG5vbi1wYWdlZCBwYWdlcy4gKEF1dG9tYXRpY2FsbHkgaGlkZGVuIGlmIG5vICdub24tcGFnZWQnIHBhZ2VzKS5cbiAgICAgICAgICAgIGVuYWJsZVNwYWNlU2Nyb2xsOiBmYWxzZSwgICAvLyBTY3JvbGxpbmcgZG93biBieSBwcmVzc2luZyB0aGUgc3BhY2Uga2V5XG4gICAgICAgICAgICBlbmFibGVUb29sYmFyOiB0cnVlLCAgICAgICAgLy8gRW5hYmxlcyB0aGUgdG9vbGJhci4gTm90ZSB0aGF0IGRpc2FibGluZyB0aGlzIG1lYW5zIHlvdSBoYXZlIHRvIGhhbmRsZSBhbGwgY29udHJvbHMgeW91cnNlbGYuXG4gICAgICAgICAgICBlbmFibGVab29tQ29udHJvbHM6ICdidXR0b25zJywgLy8gU3BlY2lmeSBjb250cm9scyBmb3Igem9vbWluZyBpbiBhbmQgb3V0LiBQb3NzaWJsZSB2YWx1ZXM6ICdidXR0b25zJyAoKy8tKSwgJ3NsaWRlcicuIEFueSBvdGhlciB2YWx1ZSBkaXNhYmxlcyB0aGUgY29udHJvbHMuXG4gICAgICAgICAgICBmaWxsUGFyZW50SGVpZ2h0OiB0cnVlLCAgICAgLy8gVXNlIGEgZmxleGJveCBsYXlvdXQgdG8gYWxsb3cgRGl2YSB0byBmaWxsIGl0cyBwYXJlbnQncyBoZWlnaHRcbiAgICAgICAgICAgIGZpeGVkUGFkZGluZzogMTAsICAgICAgICAgICAvLyBGYWxsYmFjayBpZiBhZGFwdGl2ZSBwYWRkaW5nIGlzIHNldCB0byAwXG4gICAgICAgICAgICBmaXhlZEhlaWdodEdyaWQ6IHRydWUsICAgICAgLy8gU28gZWFjaCBwYWdlIGluIGdyaWQgdmlldyBoYXMgdGhlIHNhbWUgaGVpZ2h0IChvbmx5IHdpZHRocyBkaWZmZXIpXG4gICAgICAgICAgICBnb0RpcmVjdGx5VG86IDAsICAgICAgICAgICAgLy8gRGVmYXVsdCBpbml0aWFsIHBhZ2UgdG8gc2hvdyAoMC1pbmRleGVkKVxuICAgICAgICAgICAgaGFzaFBhcmFtU3VmZml4OiBudWxsLCAgICAgIC8vIFVzZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZG9jdW1lbnQgdmlld2VycyBvbiBhIHBhZ2VcbiAgICAgICAgICAgIGltYWdlQ3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLCAvLyBTZXQgY3Jvc3NPcmlnaW4gcHJvcGVydHkgZm9yIGltYWdlIHJlcXVlc3RzXG4gICAgICAgICAgICBpbkZ1bGxzY3JlZW46IGZhbHNlLCAgICAgICAgLy8gU2V0IHRvIHRydWUgdG8gbG9hZCBmdWxsc2NyZWVuIG1vZGUgaW5pdGlhbGx5XG4gICAgICAgICAgICBpbkJvb2tMYXlvdXQ6IGZhbHNlLCAgICAgICAvLyBTZXQgdG8gdHJ1ZSB0byB2aWV3IHRoZSBkb2N1bWVudCB3aXRoIGZhY2luZyBwYWdlcyBpbiBkb2N1bWVudCBtb2RlXG4gICAgICAgICAgICBpbkdyaWQ6IGZhbHNlLCAgICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgdG8gbG9hZCBncmlkIHZpZXcgaW5pdGlhbGx5XG4gICAgICAgICAgICBtYXhQYWdlc1BlclJvdzogOCwgICAgICAgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgcGFnZXMgcGVyIHJvdyBpbiBncmlkIHZpZXdcbiAgICAgICAgICAgIG1heFpvb21MZXZlbDogLTEsICAgICAgICAgICAvLyBPcHRpb25hbDsgZGVmYXVsdHMgdG8gdGhlIG1heCB6b29tIHJldHVybmVkIGluIHRoZSBKU09OIHJlc3BvbnNlXG4gICAgICAgICAgICBtaW5QYWdlc1BlclJvdzogMiwgICAgICAgICAgLy8gTWluaW11bSBwYWdlcyBwZXIgcm93IGluIGdyaWQgdmlldy4gUmVjb21tZW5kZWQgZGVmYXVsdC5cbiAgICAgICAgICAgIG1pblpvb21MZXZlbDogMCwgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byAwICh0aGUgbWluaW11bSB6b29tKVxuICAgICAgICAgICAgb25Hb3RvU3VibWl0OiBudWxsLCAgICAgICAgIC8vIFdoZW4gc2V0IHRvIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHBhZ2UgaW5kZXgsIHRoaXMgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgdGhlICdnbyB0byBwYWdlJyBmb3JtIHN1Ym1pc3Npb25cbiAgICAgICAgICAgIHBhZ2VBbGlhc2VzOiB7fSwgICAgICAgICAgICAvLyBBbiBvYmplY3QgbWFwcGluZyBzcGVjaWZpYyBwYWdlIGluZGljZXMgdG8gYWxpYXNlcyAoaGFzIHByaW9yaXR5IG92ZXIgJ3BhZ2VBbGlhc0Z1bmN0aW9uJ1xuICAgICAgICAgICAgcGFnZUFsaWFzRnVuY3Rpb246IGZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlO30sICAvLyBBIGZ1bmN0aW9uIG1hcHBpbmcgcGFnZSBpbmRpY2VzIHRvIGFuIGFsaWFzLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgZGVmYXVsdCBwYWdlIG51bWJlciBpcyBkaXNwbGF5ZWRcbiAgICAgICAgICAgIHBhZ2VMb2FkVGltZW91dDogMjAwLCAgICAgICAvLyBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGxvYWRpbmcgcGFnZXNcbiAgICAgICAgICAgIHBhZ2VzUGVyUm93OiA1LCAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBudW1iZXIgb2YgcGFnZXMgcGVyIHJvdyBpbiBncmlkIHZpZXdcbiAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiB7XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJ9LCAvLyBEZWZhdWx0IGhlYWRlciBzZW50IG9mZiB0byB0aGUgc2VydmVyIGluIGNvbnRlbnQgbmVnb3RpYXRpb25cbiAgICAgICAgICAgIHNob3dOb25QYWdlZFBhZ2VzOiBmYWxzZSwgICAvLyBXaGV0aGVyIHBhZ2VzIHRhZ2dlZCBhcyAnbm9uLXBhZ2VkJyAoaW4gSUlJRiBtYW5pZmVzdHMgb25seSkgc2hvdWxkIGJlIHZpc2libGUgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICAgICAgICB0aHJvYmJlclRpbWVvdXQ6IDEwMCwgICAgICAgLy8gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzaG93aW5nIHRocm9iYmVyXG4gICAgICAgICAgICB0aWxlSGVpZ2h0OiAyNTYsICAgICAgICAgICAgLy8gVGhlIGhlaWdodCBvZiBlYWNoIHRpbGUsIGluIHBpeGVsczsgdXN1YWxseSAyNTZcbiAgICAgICAgICAgIHRpbGVXaWR0aDogMjU2LCAgICAgICAgICAgICAvLyBUaGUgd2lkdGggb2YgZWFjaCB0aWxlLCBpbiBwaXhlbHM7IHVzdWFsbHkgMjU2XG4gICAgICAgICAgICB0b29sYmFyUGFyZW50T2JqZWN0OiBudWxsLCAgLy8gVGhlIHRvb2xiYXIgcGFyZW50IG9iamVjdC5cbiAgICAgICAgICAgIHZlcnRpY2FsbHlPcmllbnRlZDogdHJ1ZSwgICAvLyBEZXRlcm1pbmVzIHZlcnRpY2FsIHZzLiBob3Jpem9udGFsIG9yaWVudGF0aW9uXG4gICAgICAgICAgICB2aWV3cG9ydE1hcmdpbjogMjAwLCAgICAgICAgLy8gUHJldGVuZCB0aWxlcyArLy0gMjAwcHggYXdheSBmcm9tIHZpZXdwb3J0IGFyZSBpblxuICAgICAgICAgICAgem9vbUxldmVsOiAyICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsIHpvb20gbGV2ZWwgKHVzZWQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgem9vbSBsZXZlbClcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gZmlsbCB0aGUgaGVpZ2h0LCB1c2UgYSB3cmFwcGVyIGRpdiBkaXNwbGF5ZWQgdXNpbmcgYSBmbGV4Ym94IGxheW91dFxuICAgICAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IGVsdCgnZGl2Jywge1xuICAgICAgICAgICAgY2xhc3M6IGBkaXZhLXdyYXBwZXIke3RoaXMub3B0aW9ucy5maWxsUGFyZW50SGVpZ2h0ID8gXCIgZGl2YS13cmFwcGVyLWZsZXhib3hcIiA6IFwiXCJ9YFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcHBlckVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy50b29sYmFyUGFyZW50T2JqZWN0ID0gdGhpcy5vcHRpb25zLnRvb2xiYXJQYXJlbnRPYmplY3QgfHwgd3JhcHBlckVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3Qgdmlld2VyQ29yZSA9IG5ldyBWaWV3ZXJDb3JlKHdyYXBwZXJFbGVtZW50LCB0aGlzLm9wdGlvbnMsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUgPSB2aWV3ZXJDb3JlLmdldEludGVybmFsU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHZpZXdlckNvcmUuZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy50b29sYmFyID0gdGhpcy5zZXR0aW5ncy5lbmFibGVUb29sYmFyID8gbmV3IFRvb2xiYXIodGhpcykgOiBudWxsO1xuXG4gICAgICAgIHdyYXBwZXJFbGVtZW50LmlkID0gdGhpcy5zZXR0aW5ncy5JRCArICd3cmFwcGVyJztcblxuICAgICAgICB0aGlzLmRpdmFTdGF0ZSA9IHtcbiAgICAgICAgICAgIHZpZXdlckNvcmU6IHZpZXdlckNvcmUsXG4gICAgICAgICAgICB0b29sYmFyOiB0aGlzLnRvb2xiYXJcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBvbmx5IHJlbmRlciB0aGUgdG9vbGJhciBhZnRlciB0aGUgb2JqZWN0IGhhcyBiZWVuIGxvYWRlZFxuICAgICAgICBsZXQgaGFuZGxlID0gZGl2YS5FdmVudHMuc3Vic2NyaWJlKCdPYmplY3REaWRMb2FkJywgKCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMudG9vbGJhciAhPT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xiYXIucmVuZGVyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpdmEuRXZlbnRzLnVuc3Vic2NyaWJlKGhhbmRsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaGFzaFN0YXRlID0gdGhpcy5fZ2V0SGFzaFBhcmFtU3RhdGUoKTtcblxuICAgICAgICB0aGlzLl9sb2FkT3JGZXRjaE9iamVjdERhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqKi9cbiAgICBfbG9hZE9yRmV0Y2hPYmplY3REYXRhICgpXG4gICAge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3Mub2JqZWN0RGF0YSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIERlZmVyIGV4ZWN1dGlvbiB1bnRpbCBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZE9iamVjdERhdGEodGhpcy5zZXR0aW5ncy5vYmplY3REYXRhLCB0aGlzLmhhc2hTdGF0ZSk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdNYW5pZmVzdFJlcXVlc3QgPSBmZXRjaCh0aGlzLnNldHRpbmdzLm9iamVjdERhdGEsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLnNldHRpbmdzLnJlcXVlc3RIZWFkZXJzXG4gICAgICAgICAgICB9KS50aGVuKCAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgbWFuaWZlc3QgbG9hZCBlcnJvciBldmVudFxuICAgICAgICAgICAgICAgICAgICBkaXZhLkV2ZW50cy5wdWJsaXNoKCdNYW5pZmVzdEZldGNoRXJyb3InLCBbcmVzcG9uc2VdLCB0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hamF4RXJyb3IocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgICAgIH0pLnRoZW4oIChkYXRhKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRPYmplY3REYXRhKGRhdGEsIHRoaXMuaGFzaFN0YXRlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgcGVuZGluZyByZXF1ZXN0IHNvIHRoYXQgaXQgY2FuIGJlIGNhbmNlbGxlZCBpbiB0aGUgZXZlbnQgdGhhdCBEaXZhIG5lZWRzIHRvIGJlIGRlc3Ryb3llZFxuICAgICAgICAgICAgdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5zZXRQZW5kaW5nTWFuaWZlc3RSZXF1ZXN0KHBlbmRpbmdNYW5pZmVzdFJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiovXG4gICAgX3Nob3dFcnJvciAobWVzc2FnZSlcbiAgICB7XG4gICAgICAgIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuc2hvd0Vycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogKi9cbiAgICBfYWpheEVycm9yIChyZXNwb25zZSlcbiAgICB7XG4gICAgICAgIC8vIFNob3cgYSBiYXNpYyBlcnJvciBtZXNzYWdlIHdpdGhpbiB0aGUgZG9jdW1lbnQgdmlld2VyIHBhbmVcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gWydJbnZhbGlkIG9iamVjdERhdGEgc2V0dGluZy4gRXJyb3IgY29kZTogJyArIHJlc3BvbnNlLnN0YXR1cyArICcgJyArIHJlc3BvbnNlLnN0YXR1c1RleHRdO1xuXG4gICAgICAgIC8vIERldGVjdCBhbmQgaGFuZGxlIENPUlMgZXJyb3JzXG4gICAgICAgIGNvbnN0IGRhdGFIYXNBYnNvbHV0ZVBhdGggPSB0aGlzLnNldHRpbmdzLm9iamVjdERhdGEubGFzdEluZGV4T2YoJ2h0dHAnLCAwKSA9PT0gMDtcblxuICAgICAgICBpZiAoZGF0YUhhc0Fic29sdXRlUGF0aClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QganNvbkhvc3QgPSB0aGlzLnNldHRpbmdzLm9iamVjdERhdGEucmVwbGFjZSgvaHR0cHM/OlxcL1xcLy9pLCBcIlwiKS5zcGxpdCgvWy8/I10vKVswXTtcblxuICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSAhPT0ganNvbkhvc3QpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGVsdCgncCcsICdBdHRlbXB0ZWQgdG8gYWNjZXNzIGNyb3NzLW9yaWdpbiBkYXRhIHdpdGhvdXQgQ09SUy4nKSxcbiAgICAgICAgICAgICAgICAgICAgZWx0KCdwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdZb3UgbWF5IG5lZWQgdG8gdXBkYXRlIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gdG8gc3VwcG9ydCBDT1JTLiBGb3IgaGVscCwgc2VlIHRoZSAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWx0KCdhJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6ICdodHRwczovL2dpdGh1Yi5jb20vRERNQUwvZGl2YS5qcy93aWtpL0luc3RhbGxhdGlvbiNhLW5vdGUtYWJvdXQtY3Jvc3Mtc2l0ZS1yZXF1ZXN0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnX2JsYW5rJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2Nyb3NzLXNpdGUgcmVxdWVzdCBkb2N1bWVudGF0aW9uLicpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hvd0Vycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiovXG4gICAgX2xvYWRPYmplY3REYXRhIChyZXNwb25zZURhdGEsIGhhc2hTdGF0ZSlcbiAgICB7XG4gICAgICAgIGxldCBtYW5pZmVzdDtcblxuICAgICAgICAvLyBUT0RPIGltcHJvdmUgSUlJRiBkZXRlY3Rpb24gbWV0aG9kXG4gICAgICAgIGlmICghcmVzcG9uc2VEYXRhLmhhc093blByb3BlcnR5KCdAY29udGV4dCcpICYmIChyZXNwb25zZURhdGFbJ0Bjb250ZXh0J10uaW5kZXhPZignaWlpZicpID09PSAtMSB8fCByZXNwb25zZURhdGFbJ0Bjb250ZXh0J10uaW5kZXhPZignc2hhcmVkLWNhbnZhcycpID09PSAtMSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RBbklJSUZNYW5pZmVzdEV4Y2VwdGlvbignVGhpcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBJSUlGIE1hbmlmZXN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJpZ2dlciBNYW5pZmVzdERpZExvYWQgZXZlbnRcbiAgICAgICAgZGl2YS5FdmVudHMucHVibGlzaCgnTWFuaWZlc3REaWRMb2FkJywgW3Jlc3BvbnNlRGF0YV0sIHRoaXMpO1xuICAgICAgICBtYW5pZmVzdCA9IEltYWdlTWFuaWZlc3QuZnJvbUlJSUYocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgY29uc3QgbG9hZE9wdGlvbnMgPSBoYXNoU3RhdGUgPyB0aGlzLl9nZXRMb2FkT3B0aW9uc0ZvclN0YXRlKGhhc2hTdGF0ZSwgbWFuaWZlc3QpIDoge307XG5cbiAgICAgICAgdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5zZXRNYW5pZmVzdChtYW5pZmVzdCwgbG9hZE9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBoYXNoIHBhcmFtZXRlcnMgaW50byB0aGUgZm9ybWF0IHVzZWQgYnkgZ2V0U3RhdGUgYW5kIHNldFN0YXRlXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqKi9cbiAgICBfZ2V0SGFzaFBhcmFtU3RhdGUgKClcbiAgICB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0ge307XG5cbiAgICAgICAgWydmJywgJ3YnLCAneicsICduJywgJ2knLCAncCcsICd5JywgJ3gnXS5mb3JFYWNoKCAocGFyYW0pID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gSGFzaFBhcmFtcy5nZXQocGFyYW0gKyB0aGlzLnNldHRpbmdzLmhhc2hQYXJhbVN1ZmZpeCk7XG5cbiAgICAgICAgICAgIC8vIGBmYWxzZWAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIG1pc3NpbmdcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgc3RhdGVbcGFyYW1dID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERvIHNvbWUgYXdrd2FyZCBzcGVjaWFsLWNhc2luZywgc2luY2UgdGhpcyBmb3JtYXQgaXMga2luZCBvZiB3ZWlyZC5cblxuICAgICAgICAvLyBGb3IgaW5GdWxsc2NyZWVuIChmKSwgdHJ1ZSBhbmQgZmFsc2Ugc3RyaW5ncyBzaG91bGQgYmUgaW50ZXJwcmV0ZWRcbiAgICAgICAgLy8gYXMgYm9vbGVhbnMuXG4gICAgICAgIGlmIChzdGF0ZS5mID09PSAndHJ1ZScpXG4gICAgICAgICAgICBzdGF0ZS5mID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuZiA9PT0gJ2ZhbHNlJylcbiAgICAgICAgICAgIHN0YXRlLmYgPSBmYWxzZTtcblxuICAgICAgICAvLyBDb252ZXJ0IG51bWVyaWNhbCB2YWx1ZXMgdG8gaW50ZWdlcnMsIGlmIHByb3ZpZGVkXG4gICAgICAgIFsneicsICduJywgJ3AnLCAneCcsICd5J10uZm9yRWFjaCggKHBhcmFtKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAocGFyYW0gaW4gc3RhdGUpXG4gICAgICAgICAgICAgICAgc3RhdGVbcGFyYW1dID0gcGFyc2VJbnQoc3RhdGVbcGFyYW1dLCAxMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqKi9cbiAgICBfZ2V0TG9hZE9wdGlvbnNGb3JTdGF0ZSAoc3RhdGUsIG1hbmlmZXN0KVxuICAgIHtcbiAgICAgICAgbWFuaWZlc3QgPSBtYW5pZmVzdCB8fCB0aGlzLnNldHRpbmdzLm1hbmlmZXN0O1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoJ3YnIGluIHN0YXRlKSA/IHRoaXMuX2dldFZpZXdTdGF0ZShzdGF0ZS52KSA6IHt9O1xuXG4gICAgICAgIGlmICgnZicgaW4gc3RhdGUpXG4gICAgICAgICAgICBvcHRpb25zLmluRnVsbHNjcmVlbiA9IHN0YXRlLmY7XG5cbiAgICAgICAgaWYgKCd6JyBpbiBzdGF0ZSlcbiAgICAgICAgICAgIG9wdGlvbnMuem9vbUxldmVsID0gc3RhdGUuejtcblxuICAgICAgICBpZiAoJ24nIGluIHN0YXRlKVxuICAgICAgICAgICAgb3B0aW9ucy5wYWdlc1BlclJvdyA9IHN0YXRlLm47XG5cbiAgICAgICAgLy8gT25seSBjaGFuZ2Ugc3BlY2lmeSB0aGUgcGFnZSBpZiBzdGF0ZS5pIG9yIHN0YXRlLnAgaXMgdmFsaWRcbiAgICAgICAgbGV0IHBhZ2VJbmRleCA9IHRoaXMuX2dldFBhZ2VJbmRleEZvck1hbmlmZXN0KG1hbmlmZXN0LCBzdGF0ZS5pKTtcblxuICAgICAgICBpZiAoIShwYWdlSW5kZXggPj0gMCAmJiBwYWdlSW5kZXggPCBtYW5pZmVzdC5wYWdlcy5sZW5ndGgpKVxuICAgICAgICB7XG4gICAgICAgICAgICBwYWdlSW5kZXggPSBzdGF0ZS5wIC0gMTtcblxuICAgICAgICAgICAgLy8gUG9zc2libHkgTmFOXG4gICAgICAgICAgICBpZiAoIShwYWdlSW5kZXggPj0gMCAmJiBwYWdlSW5kZXggPCBtYW5pZmVzdC5wYWdlcy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgIHBhZ2VJbmRleCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZUluZGV4ICE9PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsT2Zmc2V0ID0gcGFyc2VJbnQoc3RhdGUueCwgMTApO1xuICAgICAgICAgICAgY29uc3QgdmVydGljYWxPZmZzZXQgPSBwYXJzZUludChzdGF0ZS55LCAxMCk7XG5cbiAgICAgICAgICAgIG9wdGlvbnMuZ29EaXJlY3RseVRvID0gcGFnZUluZGV4O1xuICAgICAgICAgICAgb3B0aW9ucy5ob3Jpem9udGFsT2Zmc2V0ID0gaG9yaXpvbnRhbE9mZnNldDtcbiAgICAgICAgICAgIG9wdGlvbnMudmVydGljYWxPZmZzZXQgPSB2ZXJ0aWNhbE9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogKi9cbiAgICBfZ2V0Vmlld1N0YXRlICh2aWV3KVxuICAgIHtcbiAgICAgICAgc3dpdGNoICh2aWV3KVxuICAgICAgICB7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpbkdyaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbkJvb2tMYXlvdXQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaW5HcmlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaW5Cb29rTGF5b3V0OiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY2FzZSAnZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaW5HcmlkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpbkJvb2tMYXlvdXQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqICovXG4gICAgX2dldFBhZ2VJbmRleEZvck1hbmlmZXN0IChtYW5pZmVzdCwgZmlsZW5hbWUpXG4gICAge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3QgbnAgPSBtYW5pZmVzdC5wYWdlcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChtYW5pZmVzdC5wYWdlc1tpXS5mID09PSBmaWxlbmFtZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqICovXG4gICAgX2dldFN0YXRlICgpXG4gICAge1xuICAgICAgICBsZXQgdmlldztcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZpZXcgPSAnZyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5pbkJvb2tMYXlvdXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZpZXcgPSAnYic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB2aWV3ID0gJ2QnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5nZXRDdXJyZW50TGF5b3V0KCk7XG4gICAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSBsYXlvdXQuZ2V0UGFnZVRvVmlld3BvcnRDZW50ZXJPZmZzZXQodGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnZic6IHRoaXMuc2V0dGluZ3MuaW5GdWxsc2NyZWVuLFxuICAgICAgICAgICAgJ3YnOiB2aWV3LFxuICAgICAgICAgICAgJ3onOiB0aGlzLnNldHRpbmdzLnpvb21MZXZlbCxcbiAgICAgICAgICAgICduJzogdGhpcy5zZXR0aW5ncy5wYWdlc1BlclJvdyxcbiAgICAgICAgICAgICdpJzogdGhpcy5zZXR0aW5ncy5lbmFibGVGaWxlbmFtZSA/IHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXhdLmYgOiBmYWxzZSxcbiAgICAgICAgICAgICdwJzogdGhpcy5zZXR0aW5ncy5lbmFibGVGaWxlbmFtZSA/IGZhbHNlIDogdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXggKyAxLFxuICAgICAgICAgICAgJ3knOiBwYWdlT2Zmc2V0ID8gcGFnZU9mZnNldC55IDogZmFsc2UsXG4gICAgICAgICAgICAneCc6IHBhZ2VPZmZzZXQgPyBwYWdlT2Zmc2V0LnggOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF9nZXRVUkxIYXNoICgpXG4gICAge1xuICAgICAgICBjb25zdCBoYXNoUGFyYW1zID0gdGhpcy5fZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgaGFzaFN0cmluZ0J1aWxkZXIgPSBbXTtcbiAgICAgICAgbGV0IHBhcmFtO1xuXG4gICAgICAgIGZvciAocGFyYW0gaW4gaGFzaFBhcmFtcylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGhhc2hQYXJhbXNbcGFyYW1dICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICBoYXNoU3RyaW5nQnVpbGRlci5wdXNoKHBhcmFtICsgdGhpcy5zZXR0aW5ncy5oYXNoUGFyYW1TdWZmaXggKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoaGFzaFBhcmFtc1twYXJhbV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoU3RyaW5nQnVpbGRlci5qb2luKCcmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFnZSBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGVuYW1lOyBtdXN0IGNhbGxlZCBhZnRlciBzZXR0aW5nIHNldHRpbmdzLm1hbmlmZXN0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqKi9cbiAgICBfZ2V0UGFnZUluZGV4IChmaWxlbmFtZSlcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQYWdlSW5kZXhGb3JNYW5pZmVzdCh0aGlzLnNldHRpbmdzLm1hbmlmZXN0LCBmaWxlbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiAqL1xuICAgIF9jaGVja0xvYWRlZCAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdlclN0YXRlLmxvYWRlZClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIHZpZXdlciBpcyBub3QgY29tcGxldGVseSBpbml0aWFsaXplZC4gVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSBpdCBpcyBzdGlsbCBkb3dubG9hZGluZyBkYXRhLiBUbyBmaXggdGhpcywgb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgdGhlIGlzUmVhZHkoKSBtZXRob2QgcmV0dXJucyB0cnVlLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnVsbHNjcmVlbiBpY29uIGlzIGNsaWNrZWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF90b2dnbGVGdWxsc2NyZWVuICgpXG4gICAge1xuICAgICAgICB0aGlzLl9yZWxvYWRWaWV3ZXIoe1xuICAgICAgICAgICAgaW5GdWxsc2NyZWVuOiAhdGhpcy5zZXR0aW5ncy5pbkZ1bGxzY3JlZW5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaGFuZGxlIHRvb2xiYXIgb3BhY2l0eSBpbiBmdWxsc2NyZWVuXG4gICAgICAgIGxldCB0O1xuICAgICAgICBsZXQgaG92ZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IHRvb2xzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5zZWxlY3RvciArICd0b29scycpO1xuICAgICAgICBjb25zdCBUSU1FT1VUID0gMjAwMDtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkZ1bGxzY3JlZW4pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRvb2xzLmNsYXNzTGlzdC5hZGQoXCJkaXZhLWZ1bGxzY3JlZW4tdG9vbHNcIik7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRvZ2dsZU9wYWNpdHkuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkaXZhLXZpZXdwb3J0JylbMF0uYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdG9nZ2xlT3BhY2l0eS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRvb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0b29scy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRvb2xzLmNsYXNzTGlzdC5yZW1vdmUoXCJkaXZhLWZ1bGxzY3JlZW4tdG9vbHNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB0b2dnbGVPcGFjaXR5ICgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRvb2xzLnN0eWxlLm9wYWNpdHkgPSAxO1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHQpO1xuICAgICAgICAgICAgaWYgKCFob3ZlciAmJiB0aGlzLnNldHRpbmdzLmluRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIHQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0b29scy5zdHlsZS5vcGFjaXR5ID0gMDtcbiAgICAgICAgICAgICAgICB9LCBUSU1FT1VUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgYmV0d2VlbiBvcmllbnRhdGlvbnNcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogKi9cbiAgICBfdG9nZ2xlUGFnZUxheW91dE9yaWVudGF0aW9uICgpXG4gICAge1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbGx5T3JpZW50ZWQgPSAhdGhpcy5zZXR0aW5ncy52ZXJ0aWNhbGx5T3JpZW50ZWQ7XG5cbiAgICAgICAgLy9pZiBpbiBncmlkLCBzd2l0Y2ggb3V0IG9mIGdyaWRcbiAgICAgICAgdGhpcy5fcmVsb2FkVmlld2VyKHtcbiAgICAgICAgICAgIGluR3JpZDogZmFsc2UsXG4gICAgICAgICAgICB2ZXJ0aWNhbGx5T3JpZW50ZWQ6IHZlcnRpY2FsbHlPcmllbnRlZCxcbiAgICAgICAgICAgIGdvRGlyZWN0bHlUbzogdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXgsXG4gICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5nZXRZT2Zmc2V0KCksXG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldFhPZmZzZXQoKVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmVydGljYWxseU9yaWVudGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaGFuZ2UgdmlldyBpY29uIGlzIGNsaWNrZWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICoqL1xuICAgIF9jaGFuZ2VWaWV3IChkZXN0aW5hdGlvblZpZXcpXG4gICAge1xuICAgICAgICBzd2l0Y2ggKGRlc3RpbmF0aW9uVmlldylcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWxvYWRWaWV3ZXIoe1xuICAgICAgICAgICAgICAgICAgICBpbkdyaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbkJvb2tMYXlvdXQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNhc2UgJ2Jvb2snOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWxvYWRWaWV3ZXIoe1xuICAgICAgICAgICAgICAgICAgICBpbkdyaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbkJvb2tMYXlvdXQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2FzZSAnZ3JpZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICAgICAgICAgIGluR3JpZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcGFnZUluZGV4IC0gMC1iYXNlZCBwYWdlIGluZGV4LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4QW5jaG9yIC0geCBjb29yZGluYXRlIHRvIGp1bXAgdG8gb24gcmVzdWx0aW5nIHBhZ2UuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlBbmNob3IgLSB5IGNvb3JkaW5hdGUgdG8ganVtcCB0byBvbiByZXN1bHRpbmcgcGFnZS5cbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSBXaGV0aGVyIHRoZSBqdW1wIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqKi9cbiAgICBfZ290b1BhZ2VCeUluZGV4IChwYWdlSW5kZXgsIHhBbmNob3IsIHlBbmNob3IpXG4gICAge1xuICAgICAgICBsZXQgcGlkeCA9IHBhcnNlSW50KHBhZ2VJbmRleCwgMTApO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc1BhZ2VJbmRleFZhbGlkKHBpZHgpKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0ID0gdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5nZXRYT2Zmc2V0KHBpZHgsIHhBbmNob3IpO1xuICAgICAgICAgICAgY29uc3QgeU9mZnNldCA9IHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZ2V0WU9mZnNldChwaWR4LCB5QW5jaG9yKTtcblxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5nb3RvKHBpZHgsIHlPZmZzZXQsIHhPZmZzZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBwYWdlIGluZGV4IGlzIHZhbGlkXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwYWdlSW5kZXggLSBOdW1lcmljICgwLWJhc2VkKSBwYWdlIGluZGV4XG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGUgcGFnZSBpbmRleCBpcyB2YWxpZCBvciBub3QuXG4gICAgICovXG4gICAgX2lzUGFnZUluZGV4VmFsaWQgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LmlzUGFnZVZhbGlkKHBhZ2VJbmRleCwgdGhpcy5zZXR0aW5ncy5zaG93Tm9uUGFnZWRQYWdlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBwYWdlWCBhbmQgcGFnZVkgdmFsdWUsIHJldHVybnMgZWl0aGVyIHRoZSBwYWdlIHZpc2libGUgYXQgdGhhdCAoeCx5KVxuICAgICAqIHBvc2l0aW9uIG9yIC0xIGlmIG5vIHBhZ2UgaXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRQYWdlSW5kZXhGb3JQYWdlWFlWYWx1ZXMgKHBhZ2VYLCBwYWdlWSlcbiAgICB7XG4gICAgICAgIC8vZ2V0IHRoZSBmb3VyIGVkZ2VzIG9mIHRoZSBvdXRlciBlbGVtZW50XG4gICAgICAgIGNvbnN0IG91dGVyT2Zmc2V0ID0gdGhpcy52aWV3ZXJTdGF0ZS5vdXRlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IG91dGVyVG9wID0gb3V0ZXJPZmZzZXQudG9wO1xuICAgICAgICBjb25zdCBvdXRlckxlZnQgPSBvdXRlck9mZnNldC5sZWZ0O1xuICAgICAgICBjb25zdCBvdXRlckJvdHRvbSA9IG91dGVyT2Zmc2V0LmJvdHRvbTtcbiAgICAgICAgY29uc3Qgb3V0ZXJSaWdodCA9IG91dGVyT2Zmc2V0LnJpZ2h0O1xuXG4gICAgICAgIC8vaWYgdGhlIGNsaWNrZWQgcG9zaXRpb24gd2FzIG91dHNpZGUgdGhlIGRpdmEtb3V0ZXIgb2JqZWN0LCBpdCB3YXMgbm90IG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIGEgcGFnZVxuICAgICAgICBpZiAocGFnZVggPCBvdXRlckxlZnQgfHwgcGFnZVggPiBvdXRlclJpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuXG4gICAgICAgIGlmIChwYWdlWSA8IG91dGVyVG9wIHx8IHBhZ2VZID4gb3V0ZXJCb3R0b20pXG4gICAgICAgICAgICByZXR1cm4gLTE7XG5cbiAgICAgICAgLy9uYXZpZ2F0ZSB0aHJvdWdoIGFsbCBkaXZhIHBhZ2Ugb2JqZWN0c1xuICAgICAgICBjb25zdCBwYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RpdmEtcGFnZScpO1xuICAgICAgICBsZXQgY3VyUGFnZUlkeCA9IHBhZ2VzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGN1clBhZ2VJZHgtLSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy9nZXQgdGhlIG9mZnNldCBmb3IgZWFjaCBwYWdlXG4gICAgICAgICAgICBjb25zdCBjdXJQYWdlID0gcGFnZXNbY3VyUGFnZUlkeF07XG4gICAgICAgICAgICBjb25zdCBjdXJPZmZzZXQgPSBjdXJQYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAvL2lmIHRoaXMgcG9pbnQgaXMgb3V0c2lkZSB0aGUgaG9yaXpvbnRhbCBib3VuZGFyaWVzIG9mIHRoZSBwYWdlLCBjb250aW51ZVxuICAgICAgICAgICAgaWYgKHBhZ2VYIDwgY3VyT2Zmc2V0LmxlZnQgfHwgcGFnZVggPiBjdXJPZmZzZXQucmlnaHQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vc2FtZSB3aXRoIHZlcnRpY2FsIGJvdW5kYXJpZXNcbiAgICAgICAgICAgIGlmIChwYWdlWSA8IGN1ck9mZnNldC50b3AgfHwgcGFnZVkgPiBjdXJPZmZzZXQuYm90dG9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvL2lmIHdlIG1hZGUgaXQgdGhyb3VnaCB0aGUgYWJvdmUgdHdvLCB3ZSBmb3VuZCB0aGUgcGFnZSB3ZSdyZSBsb29raW5nIGZvclxuICAgICAgICAgICAgcmV0dXJuIGN1clBhZ2UuZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV4Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHdlIG1hZGUgaXQgdGhyb3VnaCB0aGF0IGVudGlyZSB3aGlsZSBsb29wLCB3ZSBkaWRuJ3QgY2xpY2sgb24gYSBwYWdlXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqKi9cbiAgICBfcmVsb2FkVmlld2VyIChuZXdPcHRpb25zKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUucmVsb2FkKG5ld09wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldEN1cnJlbnRVUkwgKClcbiAgICB7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0ICsgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2ggKyAnIycgKyB0aGlzLl9nZXRVUkxIYXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgKiAgICAgICAgICAgICAgICBQVUJMSUMgRlVOQ1RJT05TXG4gICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgKiovXG5cbiAgICAvKipcbiAgICAgKiAgQWN0aXZhdGUgdGhpcyBpbnN0YW5jZSBvZiBkaXZhIHZpYSB0aGUgYWN0aXZlIERpdmEgY29udHJvbGxlci5cbiAgICAgKlxuICAgICAqICBAcHVibGljXG4gICAgICovXG4gICAgYWN0aXZhdGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMudmlld2VyU3RhdGUuaXNBY3RpdmVEaXZhID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG9iamVjdCAob2JqZWN0RGF0YSkgcGFyYW1ldGVyIGN1cnJlbnRseSBiZWluZyByZW5kZXJlZCBieSBEaXZhLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge29iamVjdH0gb2JqZWN0RGF0YSAtIEFuIElJSUYgTWFuaWZlc3Qgb2JqZWN0IE9SIGEgVVJMIHRvIGEgSUlJRiBtYW5pZmVzdC5cbiAgICAgKi9cbiAgICBjaGFuZ2VPYmplY3QgKG9iamVjdERhdGEpXG4gICAge1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudmlld2VyU3RhdGUucmVuZGVyZXIpXG4gICAgICAgICAgICB0aGlzLnZpZXdlclN0YXRlLnJlbmRlcmVyLmRlc3Ryb3koKTtcblxuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLm9wdGlvbnMub2JqZWN0RGF0YSA9IG9iamVjdERhdGE7XG5cbiAgICAgICAgdGhpcy5fbG9hZE9yRmV0Y2hPYmplY3REYXRhKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHZpZXdzLiBUYWtlcyAnZG9jdW1lbnQnLCAnYm9vaycsIG9yICdncmlkJyB0byBzcGVjaWZ5IHdoaWNoIHZpZXcgdG8gc3dpdGNoIGludG9cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtzdHJpbmd9IGRlc3RpbmF0aW9uVmlldyAtIHRoZSBkZXN0aW5hdGlvbiB2aWV3IHRvIGNoYW5nZSB0by5cbiAgICAgKi9cbiAgICBjaGFuZ2VWaWV3IChkZXN0aW5hdGlvblZpZXcpXG4gICAge1xuICAgICAgICB0aGlzLl9jaGFuZ2VWaWV3KGRlc3RpbmF0aW9uVmlldyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIERlYWN0aXZhdGUgdGhpcyBkaXZhIGluc3RhbmNlIHRocm91Z2ggdGhlIGFjdGl2ZSBEaXZhIGNvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiAgQHB1YmxpY1xuICAgICAqKi9cbiAgICBkZWFjdGl2YXRlICgpXG4gICAge1xuICAgICAgICB0aGlzLnZpZXdlclN0YXRlLmlzQWN0aXZlRGl2YSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgaW5zdGFuY2UsIHRlbGxzIHBsdWdpbnMgdG8gZG8gdGhlIHNhbWVcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiovXG4gICAgZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgZG9jdW1lbnQgZHJhZ2dpbmcsIHNjcm9sbGluZyAoYnkga2V5Ym9hcmQgaWYgc2V0KSwgYW5kIHpvb21pbmcgYnkgZG91YmxlLWNsaWNraW5nXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICoqL1xuICAgIGRpc2FibGVTY3JvbGxhYmxlICgpXG4gICAge1xuICAgICAgICB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmRpc2FibGVTY3JvbGxhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZW5hYmxlcyBkb2N1bWVudCBkcmFnZ2luZywgc2Nyb2xsaW5nIChieSBrZXlib2FyZCBpZiBzZXQpLCBhbmQgem9vbWluZyBieSBkb3VibGUtY2xpY2tpbmdcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiovXG4gICAgZW5hYmxlU2Nyb2xsYWJsZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5lbmFibGVTY3JvbGxhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgZG9jdW1lbnQgZHJhZyBzY3JvbGxpbmdcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBkaXNhYmxlRHJhZ1Njcm9sbGFibGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuZGlzYWJsZURyYWdTY3JvbGxhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBkb2N1bWVudCBkcmFnIHNjcm9sbGluZ1xuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGVuYWJsZURyYWdTY3JvbGxhYmxlICgpXG4gICAge1xuICAgICAgICB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmVuYWJsZURyYWdTY3JvbGxhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW50ZXIgZnVsbHNjcmVlbiBtb2RlIGlmIGN1cnJlbnRseSBub3QgaW4gZnVsbHNjcmVlbiBtb2RlLiBJZiBjdXJyZW50bHkgaW4gZnVsbHNjcmVlblxuICAgICAqIG1vZGUgdGhpcyB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIHdvcmsgZXZlbiBpZiBlbmFibGVGdWxsc2NyZWVuIGlzIHNldCB0byBmYWxzZSBpbiB0aGUgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBzd2l0Y2ggdG8gZnVsbHNjcmVlbiB3YXMgc3VjY2Vzc2Z1bCBvciBub3QuXG4gICAgICoqL1xuICAgIGVudGVyRnVsbHNjcmVlbk1vZGUgKClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5pbkZ1bGxzY3JlZW4pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVudGVyIGdyaWQgdmlldyBpZiBjdXJyZW50bHkgbm90IGluIGdyaWQgdmlldy4gSWYgY3VycmVudGx5IGluIGdyaWQgdmlldyBtb2RlXG4gICAgICogdGhpcyB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHN3aXRjaCB0byBncmlkIHZpZXcgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxuICAgICAqKi9cbiAgICBlbnRlckdyaWRWaWV3ICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuaW5HcmlkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VWaWV3KCdncmlkJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBwYWdlIGltYWdlIFVSSXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtBcnJheX0gLSBBbiBhcnJheSBvZiBhbGwgdGhlIFVSSXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqICovXG4gICAgZ2V0QWxsUGFnZVVSSXMgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzLm1hcCggKHBnKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gcGcuZjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjYW52YXMgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHBhZ2UuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgVVJJIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBjYW52YXMuXG4gICAgICoqL1xuICAgIGdldEN1cnJlbnRDYW52YXMgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3RoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4XS5jYW52YXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY3VycmVudCBwYWdlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuIEFsc28gd29ya3MgaW5cbiAgICAgKiBncmlkIHZpZXcuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBwYWdlIGRpbWVuc2lvbnMgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKiovXG4gICAgZ2V0Q3VycmVudFBhZ2VEaW1lbnNpb25zQXRDdXJyZW50Wm9vbUxldmVsICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYWdlRGltZW5zaW9uc0F0Q3VycmVudFpvb21MZXZlbCh0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBmaWxlbmFtZSAoZGVwcmVjYXRlZCkuIFJldHVybnMgdGhlIFVSSSBmb3IgY3VycmVudCBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgVVJJIGZvciB0aGUgY3VycmVudCBwYWdlIGltYWdlLlxuICAgICAqKi9cbiAgICBnZXRDdXJyZW50UGFnZUZpbGVuYW1lICgpXG4gICAge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoaXMgbWV0aG9kIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIERpdmEuIFBsZWFzZSB1c2UgZ2V0Q3VycmVudFBhZ2VVUkkgaW5zdGVhZC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbdGhpcy5zZXR0aW5ncy5hY3RpdmVQYWdlSW5kZXhdLmY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBwYWdlIGluZGljZXMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2FycmF5fSAtIFRoZSAwLWJhc2VkIGluZGljZXMgYXJyYXkgZm9yIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBwYWdlcy5cbiAgICAgKiovXG4gICAgZ2V0Q3VycmVudFBhZ2VJbmRpY2VzICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5jdXJyZW50UGFnZUluZGljZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgMC1iYXNlZCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSAwLWJhc2VkIGluZGV4IGZvciB0aGUgY3VycmVudGx5IHZpc2libGUgcGFnZS5cbiAgICAgKiovXG4gICAgIGdldEFjdGl2ZVBhZ2VJbmRleCAoKVxuICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleDtcbiAgICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvcnRjdXQgdG8gZ2V0UGFnZU9mZnNldCBmb3IgY3VycmVudCBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHt9IC1cbiAgICAgKiAqL1xuICAgIGdldEN1cnJlbnRQYWdlT2Zmc2V0ICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYWdlT2Zmc2V0KHRoaXMuc2V0dGluZ3MuYWN0aXZlUGFnZUluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFVSSSBmb3IgdGhlIHZpc2libGUgcGFnZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBVUkkgZm9yIHRoZSBjdXJyZW50IHBhZ2UgaW1hZ2UuXG4gICAgICoqL1xuICAgIGdldEN1cnJlbnRQYWdlVVJJICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlc1t0aGlzLnNldHRpbmdzLmFjdGl2ZVBhZ2VJbmRleF0uZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgVVJMIGZvciB0aGUgdmlld2VyLCBpbmNsdWRpbmcgdGhlIGhhc2ggcGFyYW1ldGVycyByZWZsZWN0aW5nXG4gICAgICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpZXdlci5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBVUkwgZm9yIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUuXG4gICAgICogKi9cbiAgICBnZXRDdXJyZW50VVJMICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q3VycmVudFVSTCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGZpbGVuYW1lcyBpbiB0aGUgZG9jdW1lbnQuIERlcHJlY2F0ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gQW4gYXJyYXkgb2YgYWxsIHRoZSBVUklzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKiAqL1xuICAgIGdldEZpbGVuYW1lcyAoKVxuICAgIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIERpdmEuIFVzZSBnZXRBbGxQYWdlVVJJcyBpbnN0ZWFkLicpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzLm1hcCggKHBnKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gcGcuZjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2YgZ3JpZCBwYWdlcyBwZXIgcm93LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIG51bWJlciBvZiBncmlkIHBhZ2VzIHBlciByb3cuXG4gICAgICoqL1xuICAgIGdldEdyaWRQYWdlc1BlclJvdyAoKVxuICAgIHtcbiAgICAgICAgLy8gVE9ETyh3YWJhaW4pOiBBZGQgdGVzdCBjYXNlXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnBhZ2VzUGVyUm93O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaW5zdGFuY2UgSUQgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIGluc3RhbmNlIElELlxuICAgICAqICovXG4gICAgLy9cbiAgICBnZXRJbnN0YW5jZUlkICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5JRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGluc3RhbmNlIHNlbGVjdG9yIGZvciB0aGlzIGluc3RhbmNlLiBUaGlzIGlzIHRoZSBzZWxlY3RvciBmb3IgdGhlIHBhcmVudFxuICAgICAqIGRpdi5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB2aWV3cG9ydCBzZWxlY3Rvci5cbiAgICAgKiAqL1xuICAgIGdldEluc3RhbmNlU2VsZWN0b3IgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCwgYmFzZWQgb24gdGhlIGxhYmVsIGluIHRoZSBJSUlGIG1hbmlmZXN0LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGN1cnJlbnQgdGl0bGUgb2YgdGhlIG9iamVjdCBmcm9tIHRoZSBsYWJlbCBrZXkgaW4gdGhlIElJSUYgTWFuaWZlc3QuXG4gICAgICoqL1xuICAgIGdldEl0ZW1UaXRsZSAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QuaXRlbVRpdGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltdW0gem9vbSBsZXZlbCBmb3IgdGhlIGVudGlyZSBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgZm9yIHRoZSBkb2N1bWVudFxuICAgICAqICovXG4gICAgZ2V0TWF4Wm9vbUxldmVsICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tYXhab29tTGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWF4IHpvb20gbGV2ZWwgZm9yIGEgZ2l2ZW4gcGFnZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZUlkeCAtIFRoZSAwLWJhc2VkIGluZGV4IG51bWJlciBmb3IgdGhlIHBhZ2UuXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgbWF4aW11bSB6b29tIGxldmVsIGZvciB0aGF0IHBhZ2UuXG4gICAgICogKi9cbiAgICBnZXRNYXhab29tTGV2ZWxGb3JQYWdlIChwYWdlSWR4KVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja0xvYWRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3BhZ2VJZHhdLm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWluaW11bSB6b29tIGxldmVsIGZvciB0aGUgZW50aXJlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIG1pbmltdW0gem9vbSBsZXZlbCBmb3IgdGhlIGRvY3VtZW50XG4gICAgICogKi9cbiAgICBnZXRNaW5ab29tTGV2ZWwgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1pblpvb21MZXZlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICogKi9cbiAgICBnZXROdW1iZXJPZlBhZ2VzICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrTG9hZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubnVtUGFnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgYSBjYW52YXMgaGFzIG11bHRpcGxlIGltYWdlcyBkZWZpbmVkLCByZXR1cm5zIHRoZSBub24tcHJpbWFyeSBpbWFnZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIFRoZSBwYWdlIGluZGV4IGZvciB3aGljaCB0byByZXR1cm4gdGhlIG90aGVyIGltYWdlcy5cbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3RoZXIgaW1hZ2VzLlxuICAgICAqKi9cbiAgICBnZXRPdGhlckltYWdlcyAocGFnZUluZGV4KVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXNbcGFnZUluZGV4XS5vdGhlckltYWdlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcGFnZSBkaW1lbnNpb25zIGluIHRoZSBjdXJyZW50IHZpZXcgYW5kIHpvb20gbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIEEgdmFsaWQgMC1iYXNlZCBwYWdlIGluZGV4XG4gICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcGFnZVxuICAgICAqICovXG4gICAgZ2V0UGFnZURpbWVuc2lvbnMgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tMb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldEN1cnJlbnRMYXlvdXQoKS5nZXRQYWdlRGltZW5zaW9ucyhwYWdlSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpbWVuc2lvbnMgb2YgYSBnaXZlbiBwYWdlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICogQWxzbyB3b3JrcyBpbiBHcmlkIHZpZXdcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZUluZGV4IC0gVGhlIDAtYmFzZWQgcGFnZSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhZ2UgZGltZW5zaW9ucyBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqICovXG4gICAgZ2V0UGFnZURpbWVuc2lvbnNBdEN1cnJlbnRab29tTGV2ZWwgKHBhZ2VJbmRleClcbiAgICB7XG4gICAgICAgIGxldCBwaWR4ID0gcGFyc2VJbnQocGFnZUluZGV4LCAxMCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pc1BhZ2VJbmRleFZhbGlkKHBpZHgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBhZ2UgSW5kZXgnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS5nZXRDdXJyZW50TGF5b3V0KCkuZ2V0UGFnZURpbWVuc2lvbnMocGlkeCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHBhZ2UgZGltZW5zaW9ucyBhdCBhIGdpdmVuIHpvb20gbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJZHggLSBBIHZhbGlkIDAtYmFzZWQgcGFnZSBpbmRleFxuICAgICAqIEBwYXJhbXMge251bWJlcn0gem9vbUxldmVsIC0gQSBjYW5kaWRhdGUgem9vbSBsZXZlbC5cbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwYWdlIGF0IHRoZSBnaXZlbiB6b29tIGxldmVsLlxuICAgICAqKi9cbiAgICBnZXRQYWdlRGltZW5zaW9uc0F0Wm9vbUxldmVsIChwYWdlSWR4LCB6b29tTGV2ZWwpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrTG9hZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHpvb21MZXZlbCA+IHRoaXMuc2V0dGluZ3MubWF4Wm9vbUxldmVsKVxuICAgICAgICAgICAgem9vbUxldmVsID0gdGhpcy5zZXR0aW5ncy5tYXhab29tTGV2ZWw7XG5cbiAgICAgICAgY29uc3QgcGcgPSB0aGlzLnNldHRpbmdzLm1hbmlmZXN0LnBhZ2VzW3BhcnNlSW50KHBhZ2VJZHgsIDEwKV07XG4gICAgICAgIGNvbnN0IHBnQXRab29tID0gcGcuZFtwYXJzZUludCh6b29tTGV2ZWwsIDEwKV07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiBwZ0F0Wm9vbS53LFxuICAgICAgICAgICAgaGVpZ2h0OiBwZ0F0Wm9vbS5oXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFVSTCBmb3IgdGhlIGltYWdlIG9mIHRoZSBwYWdlIGF0IHRoZSBnaXZlbiBpbmRleC4gVGhlXG4gICAgICogb3B0aW9uYWwgc2l6ZSBwYXJhbWV0ZXIgc3VwcG9ydHMgc2V0dGluZyB0aGUgaW1hZ2Ugd2lkdGggb3IgaGVpZ2h0XG4gICAgICogKGRlZmF1bHQgaXMgZnVsbC1zaXplZCkuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBwYWdlSW5kZXggLSAwLWJhc2VkIHBhZ2UgaW5kZXhcbiAgICAgKiBAcGFyYW1zIHs/b2JqZWN0fSBzaXplIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgd2lkdGggYW5kIGhlaWdodCBpbmZvcm1hdGlvblxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIElJSUYgVVJMIGZvciBhIGdpdmVuIHBhZ2UgYXQgYW4gb3B0aW9uYWwgc2l6ZVxuICAgICAqL1xuICAgIGdldFBhZ2VJbWFnZVVSTCAocGFnZUluZGV4LCBzaXplKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWFuaWZlc3QuZ2V0UGFnZUltYWdlVVJMKHBhZ2VJbmRleCwgc2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBzZXQgb2YgY28tb3JkaW5hdGVzIChlLmcuLCBmcm9tIGEgbW91c2UgY2xpY2spLCByZXR1cm4gdGhlIDAtYmFzZWQgcGFnZSBpbmRleFxuICAgICAqIGZvciB3aGljaCBpdCBtYXRjaGVzLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge251bWJlcn0gcGFnZVggLSBUaGUgeCBjby1vcmRpbmF0ZVxuICAgICAqIEBwYXJhbXMge251bWJlcn0gcGFnZVkgLSBUaGUgeSBjby1vcmRpbmF0ZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHBhZ2UgaW5kZXggbWF0Y2hpbmcgdGhlIGNvLW9yZGluYXRlcy5cbiAgICAgKiAqL1xuICAgIGdldFBhZ2VJbmRleEZvclBhZ2VYWVZhbHVlcyAocGFnZVgsIHBhZ2VZKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFBhZ2VJbmRleEZvclBhZ2VYWVZhbHVlcyhwYWdlWCwgcGFnZVkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgbm9ydGh3ZXN0IGNvcm5lcnMgb2YgZGl2YS1pbm5lciBhbmQgcGFnZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIFRoZSAwLWJhc2VkIHBhZ2UgaW5kZXhcbiAgICAgKiBAcGFyYW1zIHs/b3B0aW9uc30gb3B0aW9ucyAtIEEgc2V0IG9mIG9wdGlvbnMgdG8gcGFzcyBpbi5cbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgYW5kIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogKi9cbiAgICBnZXRQYWdlT2Zmc2V0IChwYWdlSW5kZXgsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBjb25zdCByZWdpb24gPSB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldFBhZ2VSZWdpb24ocGFnZUluZGV4LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiByZWdpb24udG9wLFxuICAgICAgICAgICAgbGVmdDogcmVnaW9uLmxlZnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGluc3RhbmNlIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIGN1cnJlbnQgaW5zdGFuY2Ugc2V0dGluZ3MuXG4gICAgICogKi9cbiAgICBnZXRTZXR0aW5ncyAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXRlIHN0YXRlIG9mIHRoZSB2aWV3ZXIuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge29iamVjdH0gLSBUaGUgY3VycmVudCBpbnN0YW5jZSBzdGF0ZS5cbiAgICAgKiAqL1xuICAgIGdldFN0YXRlICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U3RhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICogKi9cbiAgICBnZXRab29tTGV2ZWwgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnpvb21MZXZlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgR28gdG8gYSBwYXJ0aWN1bGFyIHBhZ2UgKHdpdGggaW5kZXhpbmcgc3RhcnRpbmcgYXQgMCkuXG4gICAgICogIFRoZSAoeEFuY2hvcikgc2lkZSBvZiB0aGUgcGFnZSB3aWxsIGJlIGFuY2hvcmVkIHRvIHRoZSAoeEFuY2hvcikgc2lkZSBvZiB0aGUgZGl2YS1vdXRlciBlbGVtZW50XG4gICAgICpcbiAgICAgKiAgQHB1YmxpY1xuICAgICAqICBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIDAtYmFzZWQgcGFnZSBpbmRleC5cbiAgICAgKiAgQHBhcmFtcyB7P3N0cmluZ30geEFuY2hvciAtIG1heSBlaXRoZXIgYmUgXCJsZWZ0XCIsIFwicmlnaHRcIiwgb3IgZGVmYXVsdCBcImNlbnRlclwiXG4gICAgICogIEBwYXJhbXMgez9zdHJpbmd9IHlBbmNob3IgLSBtYXkgZWl0aGVyIGJlIFwidG9wXCIsIFwiYm90dG9tXCIsIG9yIGRlZmF1bHQgXCJjZW50ZXJcIjsgc2FtZSBwcm9jZXNzIGFzIHhBbmNob3IuXG4gICAgICogIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIHBhZ2UgaW5kZXggaXMgdmFsaWQ7IGZhbHNlIGlmIGl0IGlzIG5vdC5cbiAgICAgKiAqL1xuICAgIGdvdG9QYWdlQnlJbmRleCAocGFnZUluZGV4LCB4QW5jaG9yLCB5QW5jaG9yKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dvdG9QYWdlQnlJbmRleChwYWdlSW5kZXgsIHhBbmNob3IsIHlBbmNob3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgY2FudmFzIGxhYmVsLCBhdHRlbXB0IHRvIGdvIHRvIHRoYXQgcGFnZS4gSWYgbm8gbGFiZWwgd2FzIGZvdW5kLlxuICAgICAqIHRoZSBsYWJlbCB3aWxsIGJlIGF0dGVtcHRlZCB0byBtYXRjaCBhZ2FpbnN0IHRoZSBwYWdlIGluZGV4LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge3N0cmluZ30gbGFiZWwgLSBUaGUgbGFiZWwgdG8gc2VhcmNoIG9uLlxuICAgICAqIEBwYXJhbXMgez9zdHJpbmd9IHhBbmNob3IgLSBtYXkgZWl0aGVyIGJlIFwibGVmdFwiLCBcInJpZ2h0XCIsIG9yIGRlZmF1bHQgXCJjZW50ZXJcIlxuICAgICAqIEBwYXJhbXMgez9zdHJpbmd9IHlBbmNob3IgLSBtYXkgZWl0aGVyIGJlIFwidG9wXCIsIFwiYm90dG9tXCIsIG9yIGRlZmF1bHQgXCJjZW50ZXJcIlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIHBhZ2UgaW5kZXggaXMgdmFsaWQ7IGZhbHNlIGlmIGl0IGlzIG5vdC5cbiAgICAgKiAqL1xuICAgIGdvdG9QYWdlQnlMYWJlbCAobGFiZWwsIHhBbmNob3IsIHlBbmNob3IpXG4gICAge1xuICAgICAgICBjb25zdCBwYWdlcyA9IHRoaXMuc2V0dGluZ3MubWFuaWZlc3QucGFnZXM7XG4gICAgICAgIGxldCBsbGMgPSBsYWJlbC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwYWdlcy5sZW5ndGg7IGkgPCBsZW47IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHBhZ2VzW2ldLmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGxsYykgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ290b1BhZ2VCeUluZGV4KGksIHhBbmNob3IsIHlBbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gcGFyc2VJbnQobGFiZWwsIDEwKSAtIDE7XG4gICAgICAgIHJldHVybiB0aGlzLl9nb3RvUGFnZUJ5SW5kZXgocGFnZUluZGV4LCB4QW5jaG9yLCB5QW5jaG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIGEgcGFnZSBiYXNlZCBvbiBpdHMgZmlsZW5hbWUuIERlcHJlY2F0ZWQuIFVzZSBnb3RvUGFnZUJ5VVJJIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7c3RyaW5nfSBmaWxlbmFtZSAtIFRoZSBmaWxlbmFtZSBvZiB0aGUgaW1hZ2UgdG8ganVtcCB0by5cbiAgICAgKiBAcGFyYW1zIHs/c3RyaW5nfSB4QW5jaG9yIC0gbWF5IGVpdGhlciBiZSBcImxlZnRcIiwgXCJyaWdodFwiLCBvciBkZWZhdWx0IFwiY2VudGVyXCJcbiAgICAgKiBAcGFyYW1zIHs/c3RyaW5nfSB5QW5jaG9yIC0gbWF5IGVpdGhlciBiZSBcInRvcFwiLCBcImJvdHRvbVwiLCBvciBkZWZhdWx0IFwiY2VudGVyXCJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBzdWNjZXNzZnVsIGFuZCBmYWxzZSBpZiB0aGUgZmlsZW5hbWUgaXMgbm90IGZvdW5kLlxuICAgICovXG4gICAgZ290b1BhZ2VCeU5hbWUgKGZpbGVuYW1lLCB4QW5jaG9yLCB5QW5jaG9yKVxuICAgIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgdmVyc2lvbiBvZiBEaXZhLmpzLiBVc2UgZ290b1BhZ2VCeVVSSSBpbnN0ZWFkLicpO1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLl9nZXRQYWdlSW5kZXgoZmlsZW5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ290b1BhZ2VCeUluZGV4KHBhZ2VJbmRleCwgeEFuY2hvciwgeUFuY2hvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVtcCB0byBhIHBhZ2UgYmFzZWQgb24gaXRzIFVSSS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtzdHJpbmd9IHVyaSAtIFRoZSBVUkkgb2YgdGhlIGltYWdlIHRvIGp1bXAgdG8uXG4gICAgICogQHBhcmFtcyB7P3N0cmluZ30geEFuY2hvciAtIG1heSBlaXRoZXIgYmUgXCJsZWZ0XCIsIFwicmlnaHRcIiwgb3IgZGVmYXVsdCBcImNlbnRlclwiXG4gICAgICogQHBhcmFtcyB7P3N0cmluZ30geUFuY2hvciAtIG1heSBlaXRoZXIgYmUgXCJ0b3BcIiwgXCJib3R0b21cIiwgb3IgZGVmYXVsdCBcImNlbnRlclwiXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgc3VjY2Vzc2Z1bCBhbmQgZmFsc2UgaWYgdGhlIFVSSSBpcyBub3QgZm91bmQuXG4gICAgICovXG4gICAgZ290b1BhZ2VCeVVSSSAodXJpLCB4QW5jaG9yLCB5QW5jaG9yKVxuICAgIHtcbiAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy5fZ2V0UGFnZUluZGV4KHVyaSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nb3RvUGFnZUJ5SW5kZXgocGFnZUluZGV4LCB4QW5jaG9yLCB5QW5jaG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBwYWdlIGhhcyBvdGhlciBpbWFnZXMgdG8gZGlzcGxheS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBhZ2VJbmRleCAtIFRoZSAwLWJhc2VkIHBhZ2UgaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGFnZSBoYXMgb3RoZXIgaW1hZ2VzIHRvIGRpc3BsYXkuXG4gICAgICoqL1xuICAgIGhhc090aGVySW1hZ2VzIChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5tYW5pZmVzdC5wYWdlc1twYWdlSW5kZXhdLm90aGVySW1hZ2VzID09PSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGVzIHRoZSBwYWdlcyB0aGF0IGFyZSBtYXJrZWQgXCJub24tcGFnZWRcIiBpbiB0aGUgSUlJRiBtYW5pZmVzdC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiovXG4gICAgaGlkZU5vblBhZ2VkUGFnZXMgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3JlbG9hZFZpZXdlcih7IHNob3dOb25QYWdlZFBhZ2VzOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgdmlld2VyIGN1cnJlbnRseSBpbiBmdWxsLXNjcmVlbiBtb2RlP1xuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHZpZXdlciBpcyBpbiBmdWxsc2NyZWVuIG1vZGUuXG4gICAgICoqL1xuICAgIGlzSW5GdWxsc2NyZWVuICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pbkZ1bGxzY3JlZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBwYWdlIGluZGV4IGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcGFnZSBpbmRleCBpcyB2YWxpZC5cbiAgICAgKiovXG4gICAgaXNQYWdlSW5kZXhWYWxpZCAocGFnZUluZGV4KVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUGFnZUluZGV4VmFsaWQocGFnZUluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgcGFnZSBpcyBjdXJyZW50bHkgaW4gdGhlIHZpZXdwb3J0XG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBwYWdlSW5kZXggLSBUaGUgMC1iYXNlZCBwYWdlIGluZGV4XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcGFnZSBpcyBjdXJyZW50bHkgaW4gdGhlIHZpZXdwb3J0LlxuICAgICAqKi9cbiAgICBpc1BhZ2VJblZpZXdwb3J0IChwYWdlSW5kZXgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3ZXJTdGF0ZS5yZW5kZXJlci5pc1BhZ2VWaXNpYmxlKHBhZ2VJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgRGl2YSB2aWV3ZXIgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgdmlld2VyIGlzIGluaXRpYWxpemVkOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICoqL1xuICAgIGlzUmVhZHkgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN0YXRlLmxvYWRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBzb21ldGhpbmcgKGUuZy4gYSBoaWdobGlnaHQgYm94IG9uIGEgcGFydGljdWxhciBwYWdlKSBpcyB2aXNpYmxlXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBwYWdlSW5kZXggLSBUaGUgMC1iYXNlZCBwYWdlIGluZGV4XG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBsZWZ0T2Zmc2V0IC0gVGhlIGRpc3RhbmNlIG9mIHRoZSByZWdpb24gZnJvbSB0aGUgbGVmdCBvZiB0aGUgdmlld3BvcnRcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHRvcE9mZnNldCAtIFRoZSBkaXN0YW5jZSBvZiB0aGUgcmVnaW9uIGZyb20gdGhlIHRvcCBvZiB0aGUgdmlld3BvcnRcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSByZWdpb25cbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlZ2lvbiBpcyBpbiB0aGUgdmlld3BvcnQuXG4gICAgICoqL1xuICAgIGlzUmVnaW9uSW5WaWV3cG9ydCAocGFnZUluZGV4LCBsZWZ0T2Zmc2V0LCB0b3BPZmZzZXQsIHdpZHRoLCBoZWlnaHQpXG4gICAge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmRpdmFTdGF0ZS52aWV3ZXJDb3JlLmdldEN1cnJlbnRMYXlvdXQoKTtcblxuICAgICAgICBpZiAoIWxheW91dClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBvZmZzZXQgPSBsYXlvdXQuZ2V0UGFnZU9mZnNldChwYWdlSW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IHRvcCA9IG9mZnNldC50b3AgKyB0b3BPZmZzZXQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBvZmZzZXQubGVmdCArIGxlZnRPZmZzZXQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3RhdGUudmlld3BvcnQuaW50ZXJzZWN0c1JlZ2lvbih7XG4gICAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogdG9wICsgaGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiBsZWZ0ICsgd2lkdGhcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgcGFnZSBsYXlvdXQgaXMgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgb3JpZW50ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB2ZXJ0aWNhbDsgZmFsc2UgaWYgaG9yaXpvbnRhbC5cbiAgICAgKiovXG4gICAgaXNWZXJ0aWNhbGx5T3JpZW50ZWQgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnZlcnRpY2FsbHlPcmllbnRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWF2ZSBmdWxsc2NyZWVuIG1vZGUgaWYgY3VycmVudGx5IGluIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGlmIGluIGZ1bGxzY3JlZW4gbW9kZSBpbnRpdGlhbGx5LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiovXG4gICAgbGVhdmVGdWxsc2NyZWVuTW9kZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuaW5GdWxsc2NyZWVuKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWF2ZSBncmlkIHZpZXcgaWYgY3VycmVudGx5IGluIGdyaWQgdmlldy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGlmIGluIGdyaWQgdmlldyBpbml0aWFsbHksIGZhbHNlIG90aGVyd2lzZVxuICAgICAqKi9cbiAgICBsZWF2ZUdyaWRWaWV3ICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFZpZXdlcih7IGluR3JpZDogZmFsc2UgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBncmlkIHBhZ2VzIHBlciByb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBwYWdlc1BlclJvdyAtIFRoZSBudW1iZXIgb2YgcGFnZXMgcGVyIHJvd1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiovXG4gICAgc2V0R3JpZFBhZ2VzUGVyUm93IChwYWdlc1BlclJvdylcbiAgICB7XG4gICAgICAgIC8vIFRPRE8od2FiYWluKTogQWRkIHRlc3QgY2FzZVxuICAgICAgICBpZiAoIXRoaXMuZGl2YVN0YXRlLnZpZXdlckNvcmUuaXNWYWxpZE9wdGlvbigncGFnZXNQZXJSb3cnLCBwYWdlc1BlclJvdykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICBpbkdyaWQ6IHRydWUsXG4gICAgICAgICAgICBwYWdlc1BlclJvdzogcGFnZXNQZXJSb3dcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpZ24gdGhpcyBkaXZhIGluc3RhbmNlIHdpdGggYSBzdGF0ZSBvYmplY3QgKGFzIHJldHVybmVkIGJ5IGdldFN0YXRlKVxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbXMge29iamVjdH0gc3RhdGUgLSBBIERpdmEgc3RhdGUgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiovXG4gICAgc2V0U3RhdGUgKHN0YXRlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcmVsb2FkVmlld2VyKHRoaXMuX2dldExvYWRPcHRpb25zRm9yU3RhdGUoc3RhdGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiovXG4gICAgc2V0Wm9vbUxldmVsICh6b29tTGV2ZWwpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5pbkdyaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICAgICAgaW5HcmlkOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kaXZhU3RhdGUudmlld2VyQ29yZS56b29tKHpvb21MZXZlbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBub24tcGFnZWQgcGFnZXMuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqKi9cbiAgICBzaG93Tm9uUGFnZWRQYWdlcyAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcmVsb2FkVmlld2VyKHsgc2hvd05vblBhZ2VkUGFnZXM6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICoqL1xuICAgIHRvZ2dsZUZ1bGxzY3JlZW5Nb2RlICgpXG4gICAge1xuICAgICAgICB0aGlzLl90b2dnbGVGdWxsc2NyZWVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdy9IaWRlIG5vbi1wYWdlZCBwYWdlc1xuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiovXG4gICAgdG9nZ2xlTm9uUGFnZWRQYWdlc1Zpc2liaWxpdHkgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3JlbG9hZFZpZXdlcih7XG4gICAgICAgICAgICBzaG93Tm9uUGFnZWRQYWdlczogIXRoaXMuc2V0dGluZ3Muc2hvd05vblBhZ2VkUGFnZXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy9DaGFuZ2VzIGJldHdlZW4gaG9yaXpvbnRhbCBsYXlvdXQgYW5kIHZlcnRpY2FsIGxheW91dC4gUmV0dXJucyB0cnVlIGlmIGRvY3VtZW50IGlzIG5vdyB2ZXJ0aWNhbGx5IG9yaWVudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgdG9nZ2xlT3JpZW50YXRpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b2dnbGVQYWdlTGF5b3V0T3JpZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGVzIGEgbWVhc3VyZW1lbnQgZnJvbSB0aGUgem9vbSBsZXZlbCBvbiB0aGUgbGFyZ2VzdCBzaXplXG4gICAgICogdG8gb25lIG9uIHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgYSBwb2ludCAxMDAwIG9uIGFuIGltYWdlIHRoYXQgaXMgb24gem9vbSBsZXZlbCAyIG9mIDVcbiAgICAgKiB0cmFuc2xhdGVzIHRvIGEgcG9zaXRpb24gb2YgMTExLjExMS4uLiAoMTAwMCAvICg1IC0gMileMikuXG4gICAgICpcbiAgICAgKiBXb3JrcyBmb3IgYSBzaW5nbGUgcGl4ZWwgY28tb3JkaW5hdGUgb3IgYSBkaW1lbnNpb24gKGUuZy4sIHRyYW5zbGF0ZXMgYSBib3hcbiAgICAgKiB0aGF0IGlzIDEwMDAgcGl4ZWxzIHdpZGUgb24gdGhlIG9yaWdpbmFsIHRvIG9uZSB0aGF0IGlzIDExMS4xMTEgcGl4ZWxzIHdpZGVcbiAgICAgKiBvbiB0aGUgY3VycmVudCB6b29tIGxldmVsKS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW1zIHtudW1iZXJ9IHBvc2l0aW9uIC0gQSBwb2ludCBvbiB0aGUgbWF4IHpvb20gbGV2ZWxcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBzYW1lIHBvaW50IG9uIHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgKi9cbiAgICB0cmFuc2xhdGVGcm9tTWF4Wm9vbUxldmVsIChwb3NpdGlvbilcbiAgICB7XG4gICAgICAgIGNvbnN0IHpvb21EaWZmZXJlbmNlID0gdGhpcy5zZXR0aW5ncy5tYXhab29tTGV2ZWwgLSB0aGlzLnNldHRpbmdzLnpvb21MZXZlbDtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uIC8gTWF0aC5wb3coMiwgem9vbURpZmZlcmVuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZXMgYSBtZWFzdXJlbWVudCBmcm9tIHRoZSBjdXJyZW50IHpvb20gbGV2ZWwgdG8gdGhlIHBvc2l0aW9uIG9uIHRoZVxuICAgICAqIGxhcmdlc3Qgem9vbSBsZXZlbC5cbiAgICAgKlxuICAgICAqIFdvcmtzIGZvciBhIHNpbmdsZSBwaXhlbCBjby1vcmRpbmF0ZSBvciBhIGRpbWVuc2lvbiAoZS5nLiwgdHJhbnNsYXRlcyBhIGJveFxuICAgICAqIHRoYXQgaXMgMTExLjExMSBwaXhlbHMgd2lkZSBvbiB0aGUgY3VycmVudCBpbWFnZSB0byBvbmUgdGhhdCBpcyAxMDAwIHBpeGVscyB3aWRlXG4gICAgICogb24gdGhlIGN1cnJlbnQgem9vbSBsZXZlbCkuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtcyB7bnVtYmVyfSBwb3NpdGlvbiAtIEEgcG9pbnQgb24gdGhlIGN1cnJlbnQgem9vbSBsZXZlbFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHNhbWUgcG9pbnQgb24gdGhlIG1heCB6b29tIGxldmVsLlxuICAgICovXG4gICAgdHJhbnNsYXRlVG9NYXhab29tTGV2ZWwgKHBvc2l0aW9uKVxuICAgIHtcbiAgICAgICAgY29uc3Qgem9vbURpZmZlcmVuY2UgPSB0aGlzLnNldHRpbmdzLm1heFpvb21MZXZlbCAtIHRoaXMuc2V0dGluZ3Muem9vbUxldmVsO1xuXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UsIGl0J3MgYSBib3ggb24gdGhlIG1heCB6b29tIGxldmVsIGFuZFxuICAgICAgICAvLyB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIHBvc2l0aW9uLlxuICAgICAgICBpZiAoem9vbURpZmZlcmVuY2UgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uICogTWF0aC5wb3coMiwgem9vbURpZmZlcmVuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb20gaW4uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gZmFsc2UgaWYgaXQncyBhdCB0aGUgbWF4aW11bSB6b29tXG4gICAgICoqL1xuICAgIHpvb21JbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Wm9vbUxldmVsKHRoaXMuc2V0dGluZ3Muem9vbUxldmVsICsgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbSBvdXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gZmFsc2UgaWYgaXQncyBhdCB0aGUgbWluaW11bSB6b29tXG4gICAgICoqL1xuICAgIHpvb21PdXQgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFpvb21MZXZlbCh0aGlzLnNldHRpbmdzLnpvb21MZXZlbCAtIDEpO1xuICAgIH1cbn1cblxuRGl2YS5FdmVudHMgPSBkaXZhLkV2ZW50cztcblxuZXhwb3J0IGRlZmF1bHQgRGl2YTtcblxuLyoqXG4gKiBNYWtlIGBEaXZhYCBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuICogKi9cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIChmdW5jdGlvbiAoZ2xvYmFsKVxuICAgIHtcbiAgICAgICAgZ2xvYmFsLkRpdmEgPSBnbG9iYWwuRGl2YSB8fCBEaXZhO1xuICAgIH0pKHdpbmRvdyk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file